From 1aa33085c17e1af6fcc2918fbfd8c24c402af91b Mon Sep 17 00:00:00 2001 From: Mihai CAZACU Date: Thu, 6 Aug 2020 16:15:59 +0300 Subject: [PATCH 001/525] add CSS class name support for zoom buttons --- src/ol/control/Zoom.js | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/ol/control/Zoom.js b/src/ol/control/Zoom.js index b2ac5dae04..cfc3e16414 100644 --- a/src/ol/control/Zoom.js +++ b/src/ol/control/Zoom.js @@ -10,6 +10,8 @@ import {easeOut} from '../easing.js'; * @typedef {Object} Options * @property {number} [duration=250] Animation duration in milliseconds. * @property {string} [className='ol-zoom'] CSS class name. + * @property {string} [zoomInClassName=className + '-in'] CSS class name for the zoom-in button. + * @property {string} [zoomOutClassName=className + '-out'] CSS class name for the zoom-out button. * @property {string|HTMLElement} [zoomInLabel='+'] Text label to use for the zoom-in * button. Instead of text, also an element (e.g. a `span` element) can be used. * @property {string|HTMLElement} [zoomOutLabel='-'] Text label to use for the zoom-out button. @@ -46,6 +48,11 @@ class Zoom extends Control { const delta = options.delta !== undefined ? options.delta : 1; + const zoomInClassName = + options.zoomInClassName !== undefined ? options.zoomInClassName : className + '-in'; + const zoomOutClassName = + options.zoomOutClassName !== undefined ? options.zoomOutClassName : className + '-out'; + const zoomInLabel = options.zoomInLabel !== undefined ? options.zoomInLabel : '+'; const zoomOutLabel = @@ -59,7 +66,7 @@ class Zoom extends Control { : 'Zoom out'; const inElement = document.createElement('button'); - inElement.className = className + '-in'; + inElement.className = zoomInClassName; inElement.setAttribute('type', 'button'); inElement.title = zoomInTipLabel; inElement.appendChild( @@ -75,7 +82,7 @@ class Zoom extends Control { ); const outElement = document.createElement('button'); - outElement.className = className + '-out'; + outElement.className = zoomOutClassName; outElement.setAttribute('type', 'button'); outElement.title = zoomOutTipLabel; outElement.appendChild( From 763629382ee809f24ecf6aca44b426650284c807 Mon Sep 17 00:00:00 2001 From: Mihai CAZACU Date: Thu, 6 Aug 2020 16:36:08 +0300 Subject: [PATCH 002/525] format code --- src/ol/control/Zoom.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/ol/control/Zoom.js b/src/ol/control/Zoom.js index cfc3e16414..b420508daa 100644 --- a/src/ol/control/Zoom.js +++ b/src/ol/control/Zoom.js @@ -49,9 +49,13 @@ class Zoom extends Control { const delta = options.delta !== undefined ? options.delta : 1; const zoomInClassName = - options.zoomInClassName !== undefined ? options.zoomInClassName : className + '-in'; + options.zoomInClassName !== undefined + ? options.zoomInClassName + : className + '-in'; const zoomOutClassName = - options.zoomOutClassName !== undefined ? options.zoomOutClassName : className + '-out'; + options.zoomOutClassName !== undefined + ? options.zoomOutClassName + : className + '-out'; const zoomInLabel = options.zoomInLabel !== undefined ? options.zoomInLabel : '+'; From fe3295b46940d0aae9066f245c2ae5126f7c9aaa Mon Sep 17 00:00:00 2001 From: Mihai CAZACU Date: Thu, 6 Aug 2020 16:40:45 +0300 Subject: [PATCH 003/525] format code --- src/ol/control/Zoom.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/ol/control/Zoom.js b/src/ol/control/Zoom.js index b420508daa..27a37db573 100644 --- a/src/ol/control/Zoom.js +++ b/src/ol/control/Zoom.js @@ -50,11 +50,11 @@ class Zoom extends Control { const zoomInClassName = options.zoomInClassName !== undefined - ? options.zoomInClassName + ? options.zoomInClassName : className + '-in'; const zoomOutClassName = - options.zoomOutClassName !== undefined - ? options.zoomOutClassName + options.zoomOutClassName !== undefined + ? options.zoomOutClassName : className + '-out'; const zoomInLabel = From ebf0d87aa8661155fcc5c5e398dc5a223f744e0f Mon Sep 17 00:00:00 2001 From: Mihai CAZACU Date: Thu, 6 Aug 2020 20:06:28 +0300 Subject: [PATCH 004/525] add CSS class name support for attribution button --- src/ol/control/Attribution.js | 16 ++++++++++++++++ src/ol/control/Zoom.js | 4 ++-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/ol/control/Attribution.js b/src/ol/control/Attribution.js index 12eb3c570d..9405c58193 100644 --- a/src/ol/control/Attribution.js +++ b/src/ol/control/Attribution.js @@ -23,9 +23,13 @@ import {removeChildren, replaceNode} from '../dom.js'; * @property {string} [label='i'] Text label to use for the * collapsed attributions button. * Instead of text, also an element (e.g. a `span` element) can be used. + * @property {string} [expandClassName==className + '-expand'] CSS class name for the + * collapsed attributions button. * @property {string|HTMLElement} [collapseLabel='»'] Text label to use * for the expanded attributions button. * Instead of text, also an element (e.g. a `span` element) can be used. + * @property {string} [collapseClassName==className + '-collapse'] CSS class name for the + * expanded attributions button. * @property {function(import("../MapEvent.js").default):void} [render] Function called when * the control should be re-rendered. This is called in a `requestAnimationFrame` * callback. @@ -89,9 +93,19 @@ class Attribution extends Control { const tipLabel = options.tipLabel !== undefined ? options.tipLabel : 'Attributions'; + const expandClassName = + options.expandClassName !== undefined + ? options.expandClassName + : (className + '-expand'); + const collapseLabel = options.collapseLabel !== undefined ? options.collapseLabel : '\u00BB'; + const collapseClassName = + options.collapseClassName !== undefined + ? options.collapseClassName + : (className + '-collpase'); + if (typeof collapseLabel === 'string') { /** * @private @@ -99,6 +113,7 @@ class Attribution extends Control { */ this.collapseLabel_ = document.createElement('span'); this.collapseLabel_.textContent = collapseLabel; + this.collapseLabel_.className = collapseClassName; } else { this.collapseLabel_ = collapseLabel; } @@ -112,6 +127,7 @@ class Attribution extends Control { */ this.label_ = document.createElement('span'); this.label_.textContent = label; + this.label_.className = expandClassName; } else { this.label_ = label; } diff --git a/src/ol/control/Zoom.js b/src/ol/control/Zoom.js index 27a37db573..886dca9e86 100644 --- a/src/ol/control/Zoom.js +++ b/src/ol/control/Zoom.js @@ -51,11 +51,11 @@ class Zoom extends Control { const zoomInClassName = options.zoomInClassName !== undefined ? options.zoomInClassName - : className + '-in'; + : (className + '-in'); const zoomOutClassName = options.zoomOutClassName !== undefined ? options.zoomOutClassName - : className + '-out'; + : (className + '-out'); const zoomInLabel = options.zoomInLabel !== undefined ? options.zoomInLabel : '+'; From ec1a87443d99c8f7ed71b433d3438437f40bc825 Mon Sep 17 00:00:00 2001 From: Mihai CAZACU Date: Thu, 6 Aug 2020 20:09:27 +0300 Subject: [PATCH 005/525] format code --- src/ol/control/Attribution.js | 4 ++-- src/ol/control/Zoom.js | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/ol/control/Attribution.js b/src/ol/control/Attribution.js index 9405c58193..ddc6146f76 100644 --- a/src/ol/control/Attribution.js +++ b/src/ol/control/Attribution.js @@ -96,7 +96,7 @@ class Attribution extends Control { const expandClassName = options.expandClassName !== undefined ? options.expandClassName - : (className + '-expand'); + : className + '-expand'; const collapseLabel = options.collapseLabel !== undefined ? options.collapseLabel : '\u00BB'; @@ -104,7 +104,7 @@ class Attribution extends Control { const collapseClassName = options.collapseClassName !== undefined ? options.collapseClassName - : (className + '-collpase'); + : className + '-collpase'; if (typeof collapseLabel === 'string') { /** diff --git a/src/ol/control/Zoom.js b/src/ol/control/Zoom.js index 886dca9e86..27a37db573 100644 --- a/src/ol/control/Zoom.js +++ b/src/ol/control/Zoom.js @@ -51,11 +51,11 @@ class Zoom extends Control { const zoomInClassName = options.zoomInClassName !== undefined ? options.zoomInClassName - : (className + '-in'); + : className + '-in'; const zoomOutClassName = options.zoomOutClassName !== undefined ? options.zoomOutClassName - : (className + '-out'); + : className + '-out'; const zoomInLabel = options.zoomInLabel !== undefined ? options.zoomInLabel : '+'; From fd264f86a6cf5a47951a99ede38b8db84962074a Mon Sep 17 00:00:00 2001 From: Mihai CAZACU Date: Thu, 6 Aug 2020 20:11:37 +0300 Subject: [PATCH 006/525] format code --- src/ol/control/Attribution.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/ol/control/Attribution.js b/src/ol/control/Attribution.js index ddc6146f76..d87707e81b 100644 --- a/src/ol/control/Attribution.js +++ b/src/ol/control/Attribution.js @@ -95,16 +95,16 @@ class Attribution extends Control { const expandClassName = options.expandClassName !== undefined - ? options.expandClassName - : className + '-expand'; + ? options.expandClassName + : className + '-expand'; const collapseLabel = options.collapseLabel !== undefined ? options.collapseLabel : '\u00BB'; const collapseClassName = options.collapseClassName !== undefined - ? options.collapseClassName - : className + '-collpase'; + ? options.collapseClassName + : className + '-collpase'; if (typeof collapseLabel === 'string') { /** From 97568b21cd2776a6f16b37cb94fca2ca41bb2f37 Mon Sep 17 00:00:00 2001 From: Mihai CAZACU Date: Thu, 6 Aug 2020 20:14:16 +0300 Subject: [PATCH 007/525] remove typos --- src/ol/control/Attribution.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ol/control/Attribution.js b/src/ol/control/Attribution.js index d87707e81b..49cb323246 100644 --- a/src/ol/control/Attribution.js +++ b/src/ol/control/Attribution.js @@ -23,12 +23,12 @@ import {removeChildren, replaceNode} from '../dom.js'; * @property {string} [label='i'] Text label to use for the * collapsed attributions button. * Instead of text, also an element (e.g. a `span` element) can be used. - * @property {string} [expandClassName==className + '-expand'] CSS class name for the + * @property {string} [expandClassName=className + '-expand'] CSS class name for the * collapsed attributions button. * @property {string|HTMLElement} [collapseLabel='»'] Text label to use * for the expanded attributions button. * Instead of text, also an element (e.g. a `span` element) can be used. - * @property {string} [collapseClassName==className + '-collapse'] CSS class name for the + * @property {string} [collapseClassName=className + '-collapse'] CSS class name for the * expanded attributions button. * @property {function(import("../MapEvent.js").default):void} [render] Function called when * the control should be re-rendered. This is called in a `requestAnimationFrame` From c53ff622f2c92a655b8e455a01cababf09a34099 Mon Sep 17 00:00:00 2001 From: Mihai CAZACU Date: Thu, 6 Aug 2020 20:32:26 +0300 Subject: [PATCH 008/525] add CSS class name support for rotate button --- src/ol/control/Rotate.js | 10 ++++++++-- src/ol/control/Zoom.js | 1 + 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/ol/control/Rotate.js b/src/ol/control/Rotate.js index 3c4043451a..b1a3a0161b 100644 --- a/src/ol/control/Rotate.js +++ b/src/ol/control/Rotate.js @@ -12,6 +12,7 @@ import {easeOut} from '../easing.js'; * @property {string|HTMLElement} [label='⇧'] Text label to use for the rotate button. * Instead of text, also an element (e.g. a `span` element) can be used. * @property {string} [tipLabel='Reset rotation'] Text label to use for the rotate tip. + * @property {string} [compassClassName='ol-compass'] CSS class name for the compass. * @property {number} [duration=250] Animation duration in milliseconds. * @property {boolean} [autoHide=true] Hide the control when rotation is 0. * @property {function(import("../MapEvent.js").default):void} [render] Function called when the control should @@ -48,6 +49,11 @@ class Rotate extends Control { const label = options.label !== undefined ? options.label : '\u21E7'; + const compassClassName = + options.compassClassName !== undefined + ? options.compassClassName + : 'ol-comapss'; + /** * @type {HTMLElement} * @private @@ -56,11 +62,11 @@ class Rotate extends Control { if (typeof label === 'string') { this.label_ = document.createElement('span'); - this.label_.className = 'ol-compass'; + this.label_.className = compassClassName; this.label_.textContent = label; } else { this.label_ = label; - this.label_.classList.add('ol-compass'); + this.label_.classList.add(compassClassName); } const tipLabel = options.tipLabel ? options.tipLabel : 'Reset rotation'; diff --git a/src/ol/control/Zoom.js b/src/ol/control/Zoom.js index 27a37db573..f386f3b9b6 100644 --- a/src/ol/control/Zoom.js +++ b/src/ol/control/Zoom.js @@ -52,6 +52,7 @@ class Zoom extends Control { options.zoomInClassName !== undefined ? options.zoomInClassName : className + '-in'; + const zoomOutClassName = options.zoomOutClassName !== undefined ? options.zoomOutClassName From 7cbdf16a6437af24e0e83fa6d1bbbc0582515f11 Mon Sep 17 00:00:00 2001 From: Mihai CAZACU Date: Thu, 6 Aug 2020 20:34:54 +0300 Subject: [PATCH 009/525] format code --- src/ol/control/Zoom.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ol/control/Zoom.js b/src/ol/control/Zoom.js index f386f3b9b6..268c293c14 100644 --- a/src/ol/control/Zoom.js +++ b/src/ol/control/Zoom.js @@ -52,7 +52,7 @@ class Zoom extends Control { options.zoomInClassName !== undefined ? options.zoomInClassName : className + '-in'; - + const zoomOutClassName = options.zoomOutClassName !== undefined ? options.zoomOutClassName From bd22d427ab3596c979c518d64e7b350067612eb9 Mon Sep 17 00:00:00 2001 From: Mihai CAZACU Date: Thu, 6 Aug 2020 21:23:16 +0300 Subject: [PATCH 010/525] add CSS class name support for full-screen button --- src/ol/control/FullScreen.js | 32 +++++++++++++++++++++++++++----- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/src/ol/control/FullScreen.js b/src/ol/control/FullScreen.js index 0cd11711e2..eb915f40d6 100644 --- a/src/ol/control/FullScreen.js +++ b/src/ol/control/FullScreen.js @@ -39,6 +39,10 @@ const FullScreenEventType = { * Instead of text, also an element (e.g. a `span` element) can be used. * @property {string|Text} [labelActive='\u00d7'] Text label to use for the * button when full-screen is active. + * @property {string} [activeClassName=className + '-true'] CSS class name for the button + * when full-screen is active. + * @property {string} [inactiveClassName=className + '-false'] CSS class name for the button + * when full-screen is inactive. * Instead of text, also an element (e.g. a `span` element) can be used. * @property {string} [tipLabel='Toggle full-screen'] Text label to use for the button tip. * @property {boolean} [keys=false] Full keyboard access. @@ -83,6 +87,24 @@ class FullScreen extends Control { this.cssClassName_ = options.className !== undefined ? options.className : 'ol-full-screen'; + /** + * @private + * @type {string} + */ + this.activeClassName_ = + options.activeClassName !== undefined + ? options.activeClassName.split(' ') + : [this.cssClassName_ + '-true']; + + /** + * @private + * @type {string} + */ + this.inactiveClassName_ = + options.inactiveClassName !== undefined + ? options.inactiveClassName.split(' ') + : [this.cssClassName_ + '-false']; + const label = options.label !== undefined ? options.label : '\u2922'; /** @@ -212,12 +234,12 @@ class FullScreen extends Control { * @private */ setClassName_(element, fullscreen) { - const activeClassName = this.cssClassName_ + '-true'; - const inactiveClassName = this.cssClassName_ + '-false'; + const activeClassName = this.activeClassName_; + const inactiveClassName = this.inactiveClassName_; const nextClassName = fullscreen ? activeClassName : inactiveClassName; - element.classList.remove(activeClassName); - element.classList.remove(inactiveClassName); - element.classList.add(nextClassName); + element.classList.remove(...activeClassName); + element.classList.remove(...inactiveClassName); + element.classList.add(...nextClassName); } /** From 2a683a26729611c5dfd5ce4f2f6d35a390e7512a Mon Sep 17 00:00:00 2001 From: Mihai CAZACU Date: Thu, 6 Aug 2020 21:27:13 +0300 Subject: [PATCH 011/525] format code --- src/ol/control/FullScreen.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ol/control/FullScreen.js b/src/ol/control/FullScreen.js index eb915f40d6..ad84c83168 100644 --- a/src/ol/control/FullScreen.js +++ b/src/ol/control/FullScreen.js @@ -102,8 +102,8 @@ class FullScreen extends Control { */ this.inactiveClassName_ = options.inactiveClassName !== undefined - ? options.inactiveClassName.split(' ') - : [this.cssClassName_ + '-false']; + ? options.inactiveClassName.split(' ') + : [this.cssClassName_ + '-false']; const label = options.label !== undefined ? options.label : '\u2922'; From 49f883664ae6677e2dd3a49eec47d0688ccf7c84 Mon Sep 17 00:00:00 2001 From: Mihai CAZACU Date: Thu, 6 Aug 2020 21:30:10 +0300 Subject: [PATCH 012/525] fix comments --- src/ol/control/FullScreen.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ol/control/FullScreen.js b/src/ol/control/FullScreen.js index ad84c83168..05002b01a4 100644 --- a/src/ol/control/FullScreen.js +++ b/src/ol/control/FullScreen.js @@ -89,7 +89,7 @@ class FullScreen extends Control { /** * @private - * @type {string} + * @type {Array} */ this.activeClassName_ = options.activeClassName !== undefined @@ -98,7 +98,7 @@ class FullScreen extends Control { /** * @private - * @type {string} + * @type {Array} */ this.inactiveClassName_ = options.inactiveClassName !== undefined From dbc7b8b6026c40695c028f1d9459b4c3f5a2f890 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Harrtell?= Date: Fri, 7 Aug 2020 03:02:25 +0200 Subject: [PATCH 013/525] Support deprecated coordinates element for GML3+ formats --- src/ol/format/GML3.js | 2 ++ src/ol/format/GML32.js | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/ol/format/GML3.js b/src/ol/format/GML3.js index fb67e703ee..294e492aea 100644 --- a/src/ol/format/GML3.js +++ b/src/ol/format/GML3.js @@ -1,6 +1,7 @@ /** * @module ol/format/GML3 */ +import GML2 from './GML2.js'; import GMLBase, {GMLNS} from './GMLBase.js'; import GeometryLayout from '../geom/GeometryLayout.js'; import LineString from '../geom/LineString.js'; @@ -1032,6 +1033,7 @@ GML3.prototype.GEOMETRY_FLAT_COORDINATES_PARSERS = { 'http://www.opengis.net/gml': { 'pos': makeReplacer(GML3.prototype.readFlatPos), 'posList': makeReplacer(GML3.prototype.readFlatPosList), + 'coordinates': makeReplacer(GML2.prototype.readFlatCoordinates), }, }; diff --git a/src/ol/format/GML32.js b/src/ol/format/GML32.js index 25cd9babb3..64ddb58578 100644 --- a/src/ol/format/GML32.js +++ b/src/ol/format/GML32.js @@ -1,6 +1,7 @@ /** * @module ol/format/GML32 */ +import GML2 from './GML2.js'; import GML3 from './GML3.js'; import GMLBase from './GMLBase.js'; import {makeArrayPusher, makeChildAppender, makeReplacer} from '../xml.js'; @@ -41,6 +42,7 @@ GML32.prototype.GEOMETRY_FLAT_COORDINATES_PARSERS = { 'http://www.opengis.net/gml/3.2': { 'pos': makeReplacer(GML3.prototype.readFlatPos), 'posList': makeReplacer(GML3.prototype.readFlatPosList), + 'coordinates': makeReplacer(GML2.prototype.readFlatCoordinates), }, }; From 9468a088c0b0d510c8ab382717a5267ca46bc9b3 Mon Sep 17 00:00:00 2001 From: mike-000 <49240900+mike-000@users.noreply.github.com> Date: Thu, 6 Aug 2020 10:15:09 +0100 Subject: [PATCH 014/525] ensure extent is valid when scale is negative test large flipped icon in buffer zone test hit detection for negative image scale --- rendering/cases/icon-scale/expected.png | Bin 15318 -> 17007 bytes rendering/cases/icon-scale/main.js | 10 ++++++++- src/ol/render/canvas/Executor.js | 8 +++++++- test/spec/ol/renderer/map.test.js | 26 ++++++++++++++++-------- 4 files changed, 33 insertions(+), 11 deletions(-) diff --git a/rendering/cases/icon-scale/expected.png b/rendering/cases/icon-scale/expected.png index a3ef37e19c390e8ccd24ca78fc00ef23a1d5be6d..bc25213de8fcc2cb617cc8a6a94702f02a1eec76 100644 GIT binary patch literal 17007 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 Ang9R* literal 15318 zcmeIZA>Aq6(kLMyNOvQRG~CViH=gml zxqrfa#Tkq__MU65wbz=TSdpsAvY2ROXaE3U%F9Wq0{{g42?0=$z(0DF4DV6v&UV*VNFNRb@o{cY6gBBMxjg9RTk4|AkyC}qz zMI+3Vig(=QY22gU@Tz0!Zqa2->}t^^r+#MV+;@3Rs8`(P_+i1upj_X5&MbvcvL|pA z$|Y3u0f2Jth=~ge#tY&AIOw#36DC*)z=h}8##Aso1gJ#{f*0F{0?;^S330LK5F48R z7XkrZ8o)n2UUfxNKV1)oO342DUFF`ej`XTo(kYZ(@8bY{XYF~?y#f!rRi~g+>>G3S3i@@iwR`ztJsq@nL z__6Ehu4~=BsZIZMS5~6c^L8r7K<_+#*4EGW^t-le z=U<|xX6e%&Z2uZ=<2 ze${m|y6zBgr<=aQsU`<#j16!F-27NKe7e^_};@g z;s>w3p}w71r^WV?bLzTV;_^bOaxG+65^8PkK&Q9{3!~M3 zx30tx1B?^|s9h%{txO~iKVq{BtoWY)5c@kG@aW>yhbv1EPUUTR8W(VHa=7sJ`m!2K z+IzOmpmvxkgJ9fe`8-N@<#tBn6Q_O7D`b*DiSxAaf*U=X%7&2gF1By0}<}7mbZ96V!`kxmN17iCcri0wN zNY_(oadtY>sfEOyPH7VkE-Atbvh}BOgUhmYR29$HPQS|y8m1qd)S3jl4@|HkpMrV> zmRzUSPkOPr{`km5URQZN92n*>$V{%gWS?iI1w(=E&o*I0?r}bg`OUj|(USwkc!%}l z;{7&;ck}Du47#26Qa^GBz99|zr+g3A^`JlJ@uJxHZ^JC-`wH!ZZ0c{?6h_3iL$czD z0#AFzIoU`K`V_t=Jyuy5NmEZ6Ik%dpC*cz9*Eizy2oaF`?oinJoEgr;+2f<4#t(6XLFGXj-1OjtZ zI0&${<93*Q(F%_xXvAo}a-My~A$~VE{@(j6*1>mU9sDNsoKE|RnKyDYsB!dmglFYt z3ThBFjdvC~8*9e}H)7U5YbdiSi=Or+Zx}5So+&llfom;GRA%uz@Wd=}BcF&zl0=Fb zz89s{ZhShT)mit)?`kP2>JI}Vz}KxLBc4Yd^k=qtfImv&@iZs(~9lIww2oe5Me zTVHgEs2@+li@kgoMc!cHEO51-d|w9(U~=}4dz)Xr0NENKe?5h?2EdTaqYh+Vt9$`+ zg;8@W9*@O`9=~Gyv558hiK4qoO9>mPpzKp2!}v}!ZwEXN2(IXhdd(ZWy8bm(|E3a* zbiVwprP3Gze!ykTXUWxicRKm@7=R@#i_800bmFB1e7Ca5U(NO%vExz%fDY1+H$;jf za2v|yOB)#)5i1GEt6m8Lsaf}V54$JO1<~bgfhN`?$8eE?6MMQRK87sO@JN;OOaNBY zavEQ+eEScK?W^bg^RK_wNX?Pu@_6dsCWY)3o z4rz=y)f@t{_Im_g?fsXFT2c^Fy0H_q!>g^TOt#T#LuidWljP zR^Y?cN>`n5>I(c@5^M-Sn8aRdg$A%h71aNJvC!`ao)tm(2QMzPDm*^znG=3FFeC&x z3^Gq-Z|@_#s^CfX=cJ5j|FLFrcp!?- zZl=|&Epx2wLECb{u1P;?Wd}(r`v+xTGqdUS^X4T*Q*#O#>Hur9o)G72>eSS>RCy|I zIEH<{bnKsU$mRcYke=!^!Zd zG25WYmiUQd16zyoG(c0~M62^G*_8G1dQc*J8WL^7J+Fw>?N;rx#87vJt@|zSyE*OI zJN<}gcQO6NOzw8I9xAYapGM1GBIjKq96Q$XE6pLDfLl$&MSdm3fWc(sS5Vzs`9y}d zPP9tuKzBfk4*0r*>Ue!zpS)Jv?T?9g9JF%oxhRr(Yd1SNU1z*uQ~<)-vFD%&lUm$? z1rf7GQgm_jIG&xyPo6=Bc(Kj+H&Gq`=51_Gex`KYZxQr(^&k=xjQeiC)RJ)#IMo-z zOhq%QDvd~zBia>Mu+>-u_a&upM3s0;)xEVd1(MW^A^`T}{4KUlUlVSfCg;e;;5@y+4t7}GfH*SPefDPmX>XMw{l%ZfCdr+XI3mh<9@ba%D|PDAym+|jPkxi zk)e2#8fi^lfX0nhJ|3<+-eL8Tarhc35GsnUqyY|9Xx@B|(_TzyC1Rx8?s~ddykW29 z@9*<5@BqB zq$|33AefvVpJdGl;MZY8jfG6ijl{r2L!G{m{vWA2%^wV=e=*AjA!?p__I;+N!4BXi z+h03Km7&Qssui*Mcn@y-@iFxR1Pd{k0&>u9s~>)^Ug&tlbjwn@X`hemomWv!%;k$$bS~VM^Sy-CGUqA<_<)Qtljn>`#9kA`ob`JF) zt#@GQ;$yth>X<`0E4ia16f&|a`&aCEGh8NcGLHGN3&O#zzrWu+!%pD$&fH0X7?h#a zg}^JvNuJ(9Zu{!WzUr+>0TCJtz74NJa+)=)`>alWWcZuIZuf&e+d}A)o)1w$jD$>i z(Tg@pqno$k&~J@iSrs|=o6ONF0k>1-?Qxi))?44k`*N+{piSzO3FNOVTnDx6Zn>e? zCko2BcSqV8;~0fCWhP}24++!6evQ;2CeW&}n4^3pdG<6X4xxel2_v^p z&4U(?^6BsU_&@-)#`1flgR^7-k;up+&dz1jW78c0LIKRTTkAU|~jy{RD5rL|I^L?l-n`DR2~IyYt6u+9y`XnU)#KBb~0$0@ohHCX)qx~*2t(35%^ zxNtC%Awxid(OHDvy39|qhCLOm#`UbV1@yrOWUlnr%L@s|0$vU43$cE#`J=K#=*xbrudzW2j& zN{LqN9&L}1{4Kb9q#06nNrF5$3JlqCK#H;dm+2^%g)t{})09@{Es?Hm?WW>c>C(Mi z6anA)cjC?(XGW&UH(wZH;(C-fmy*DBF@Wwkw%%6kXa3(yl-e}kcdVGNjZL3_BFt!0 z(A;Qtd?zDf&ogtYQ_wKkL<(Vq!)!%LxwWS2y!L+Q6$o1;7Z#ye^Ujav^4LcNCh+rZ zwayjiwu$|J&@e9vrN~fUGMUvQh@aZw{~o*?EEiEA@&IVAkx1UsU6MqX+W%B+9%<{Brls#2bVSnVP{m zeao*z@TVl~J_1JRt$u2aHn*XPIo-%ykZ`4bbE3_>7p(|HGoFt&3HGjjd4fD2+~{$= zgKKZHXZcWSplNF#|yh_gq-Om2T4R9+h zb+Rn{{uv~6P*Jb$_omoZe3-E!qK-h2KDWQiPTZ;?#zx((1ywd{NLia)?N3EthLyZ$ zWi4jY7MU+6FyW&nS0yKs<{lG3=8DFWC&LXi5=OlI`%1;<={wNP=XM7cc!X-etMIzW^X9x3Y zkv@5ohtvj(g7?cCY%xB06u+;b5CC7j$=)z|IHpejX@lrg+loz6(<0kzn@#K(seI=B z+VP3i&w1sn5?!2rnfLOt3MbOU`rpn@Ve;lH^ETD`zIO{N%9HZoInHmO9{BnNTI9b- zA~ayWWFdvQ>)5P~WUzUNp=@I1oK>Oe%7gz30r(x;HfZq={#ccu(7uJevcZc6!P^Xn zM*!Ea&v$&(9sL;Lq#J;$g2)5UO|QDZN1xSHP158mkUQGy=f|~h31UWxyDf4WF5kw zhsUDR;AgK_(cV{XgTI^Zgy8}G@`c%^P}P6nUh9z?%T8CrhUtwxqhpb^30HuIFd7aI zj-zDZRSu%+PGteTG?(;ZGGptjTEq7=$w5?{o^mLs&#*9pGWSq>z4gf{_a$H?r`A+` zrb&6yDsx~Q5P2ZA zcM~L&mGTq!61!vg6VaG|9Q~L?o%=|IgR6_fM~&r*2ISeV_!3F}Zh`|Op~}uWt{eL& z@BpPl=sw!u?=r#{mFS(hyH;%a)0FK+;c0I~|`#VXTTM;#XipXw!tK#M` zM_sn;laIfBLU#8z%hffO{^`06P+nDx1S&(I(|>hiwye$-u|_JJW4$$<BKc9XijKNr8w~zjJ*Qvt`aLfrIn)qX)scmTS}1$Rig_M;w#tp|DXdy+3XY zkTL*J4R#QUdaUR0Gcf;DX7Idh6qm%&L$o<&4JbqvZ|Uq1?CKd&tW3-n$%3w_j>Pxo z>yQ{xw=iDMc`(2y2Pdx@qiDu@2sKI}yS9^E=dJG2se;Q$#qI7hi^y6C{^adMpiFX> zG+rp-xa<1Vjyxn-?ASLv(MS}rTX`VM*$_t4^xCjWSmMNFHvaYKLM_TtD7e1-$`*?A zIMsxcf{2U{Qt*W^10|LF^_5oyj&wKWSY9dP;jK!2KWKHG1@nEgB!0Oc`khVW@8=-~ z87d$mQj6iuqVI&U)9QLOm-2eoYgSvz=O#XVr)rjb7X#2tI|9G4jSZ&TNJso5Ve9V= zeZtqP!AbU_db!TmZGZnOFt;UA3MRj-6-_&$gt$SZf_H^|xbz+;QnoXabtqXJ&? zu3znQ{4exA$W25Wlajrq)#r2acZA~K*=wJEO3X5(cH?I`CmNP`ri4S>wchT^L-iY8GAO0c@B zhoI3pdQjpx4NKJ5q#rNwQ;HFolRq`fyh}+${)&;7BiV+sx+>|_4Nt|Lf~}_w?5Zz` zx14$NzE9UfE{LrG-Plx)l z>1TT+CG`=|gjpe|K%Q(~*$-zn2IU4NbWA|MbYX`;b;X{n?k2f<`$N5@=IUt6KQs#* z{@~Vrh!{SJd*q|CQ)Pd%huxtX1Iq}uPXb)|_6I%0{IzFp&h(X~?mKO5pnJ7y`Y-*F z%E5UDNVVk<1+xetzWTT5GVaPoQ-%=jJTXb(h}H%2V)CdmaB=f=!kyhrM&0K0D#mzw zA8FnP7040i%>=+5Ic)b}pf7^*sRYQdt&_()C{z6cM8x$CaX>7MAiMkS zW2L-d(p~?8&^hH2l9hFk)*JO50n42%4`rE^G6oIj6~8MxF&;J`cmHi{vjNBbGo-m7 z7tRVHrF1|D)~tmGAl8^2lfzI7*YtR-Af}v0IH$}VrT4)+(a@qg3+v};{v z@^vx19}cS8?B{g7{j!i4>u_>FwzAkDEU5Gwzlp8QLdiCCH5*Cp-O#octxl&@hPooq zovLHa`%#v0iGNn_r8LGT`eGvPUrw@N`l>=$5$#F-KN(Ye2MLV!qyLuegQNQBWVkP{V_v7&iCG2<; z(uK*&Wov%F*DdU(Y;D9W*XjZ3kIylVZjpl)8Fr2G_8q(o=1>&`DtI1-&Tz6`o1U=T z56-&N=s>E)_fJ#MrM4c`U!pC_^h!L<70y+@y7*nY$Bcex@~Pgk;dMNnIx=a zT&d;h@s7EPc5g%M*h@v7e7*|v7dj9Tk|oe+k`UwcAxz##{jS>1InSjBa~^&mHV{ks zN=6}_hwO~(tqqJF9&XWpU|4C-F;V+-bZHdru%wyYNi{J5OGv1Bxv;f)A-q?R6a|uX zG<$Oj?M;lRn_Tpd<=-`!2t4A+^EeTYZCm$>V!2UKO7@_OJD9oI@v3s{b7CyJ=mEP= zdi`^%Z+YXjCf|?tEdx-7L%zDkLGeD+0k;t{`!{~OZ>SYoPNuR;-pP!T4Ar>LTNPJ| zE-^1TBw1^88uv#TKU~h{xO(laB!!)9CMt4*m_1BlA1U~&yLD7VjaZH0#FZCapC5|R z$R&e9mu(cf4?F;7-OrZh$gaOwx^saS@ushEY8eFV=}U^TqND&xaE{a85gE)O`JW!+ z+K1olqcU&XaWydm5|IG9UdHU3CTf5NQ*SvuN1*i8^Q6@4yvJ}H38^>OIqdgY+@NAj zOrY+3LHGLZV}N7SdqyFWyz6;UKggFpF23sZ(hdkr?oVke#O)gVWT+w`J4;sp*KS1NF3X|bPRAkpnMcgUf;ZVH>` zFEsC;c^M!j7iRa9AiFxVzEa1)BVgdnRauH6CIaX_7LU1GZBsFKrMhMLKU{kpx$}{n ze1>-u)7|tsM4txF#t;W?k5q~sDV^7+R!C==5?0xPe)a;4Hq7dFVjL6n)#2u= zj$^Sso*&y+=;(ksnB{g8R&s3~lB3C%IFcw}3yCqzA1YPc)LK#fQ$8Q=dsRnWidPWa zs!4dtqX!5?WMU>dEpr{S_a0w*93 z?rg?0RhLf?^aFb(1d$45s9N=1B*S{2#k7gjc$g%){t@DAhWQKMvzSOt_(T-KLau4B z`w7YFH*{`?@E%NyrGCcB=$eVN?M(#I*)~xTT#fT)pFkbrZ5g6NNbs9+qyae?lyaE$ z`-t;iAA?a$N8bPc1W`D;Q)RKsX$9*1w5ShJQ)NIfS3}PnD=!WN5I|>aD}=l>pld`? z|2{zOkZFqxDj@F*Yq@Uw!DdbFkIqG*W?-cs8kX{=us^3<`&sjac=7O z0jO#JUOYRm%C)1a2*obgMSoWoNfIw_`V4`TR@YtbKG30r;+_LF^FQdOwWUwTa@_?d z{;R(`lkbcJ1n%rKJQgN&H&)d2i*Xs}ZUt0o3hzDL0ZNzBK;JXTzm8z%k3;D`pLQa! zOjr2tVoF7&Ux@K~=wic0tILoZ3y00V1$O{&Ie@TKQsf z?D80Z)kVk*V3Ytr5PG}^jq;(6JM#C?t&2!M`rray}`#zoFHcwF~1pN2Q zxGmgcy(0>358>m{l$Iptm(1k()^=F#Vn$dBT0mi@I4EiKjW^@AIw|teOB(4r&ClsXo_zW zWU11md}GB4ZYFqrOV5mqp9%w!QGPnG{xAAz`&oPPoX)3ucMpnHZ)2hS=zdEF1}Oz_ zg-!gAKZ_rm<1lejk9q&UOuX+{HyGPg#JjM%?+)u#tO@-=yh&(_kTmaV0^kUq|9t85 zJE52zpBk7*PSfso`g0u>KmiK7Ru@oM!uXR5`X?K_bcuH#asB~IfwKlaf2UtG$2HvS z2wg&e^UcRH_F^^wAWwMq0`Ph^DWM~LMy`G>idbIV>CFZ=qF?fYm>UHs`QE=*jR~Y? zhj;h~(NViTPAQ92@>25!sVRd9z4RXTw49q)^9L?D%sCe~p8@tYXmdvvXL3u30#Nn% z-R~C(p9hQ!A5={L-YYkJu(qmVf&cf@LcHE{`8+$t8exVJX(&HVytNrT{nXo>0=xxO zLhO5Qv9Iw_JmV~-`z%Q{30xqsX9>I?96|DZcf3z3N$7R_P1Hgz$+)Xt=gD_;jpUVR z&eoF8zs46LZprPwsaa#FH=&&zgLA!ZrQ-9!TApcg0yU>6Csvn(6%EGLdX%4~0qEjwuzn_Lx{GA~vW%2gy z4xqwqlQU3;C2{*Jjx&Uwo^}xItaQ-i#W!MJCK7*#Y+Mk3O~uZjD80U&?Gle|8=n>i zpa#hw2NRYLl}+(ykorA~cIq@1%U{$-Ob*Dj_gaTypC5IJ~=axOj%w)fo-^f&&^B zKlC4|jGJJ&S?=?t*Zo}n3BET_y@!CcZbdiL&TancG)+MG)+oci@cR#(Zm&ZVYTZn~ ze{-lnGkxSWS#ly06wyp3!GFT0H-%XC+Bv$m}#_kWaYSV!Jf53^Qrlx@YZJy zG<@>}AgPRCqjaQpcsBZB#cL;PDpYyXu5pfubn}zYcIx!C1~$+t6xTx&NlH^S^{XE% zoQ*=OdAC$3$BG+I3V@eH7zwxn)Z3J)s|284^jvC z&bxYM#@f5uCC+$so@ZU`JZtC(aEB5xt{^j?^WF8e(pR;y^5AjDa021@Jrbk%tSy@QRVRfcK7wJBrBA>Y^ z&E>bJI8}L2-Q|zRRjwLSjMlWTe?YL)LTc9amFi@;ekS19XGM_{3X7MQ&0Sb|{KuMc z@};TW3@(AU4}O(uV6kvIR&AX3{nsB@tljXi5*WzK#UA!lRK$HYbN`sci6wfJ?4!O-^jt$X z)NbFE<|-5QJpLW?xqugw6y7SNZ|#`Dpvv|jOLNjJ9Thyx@<`Qjg2p(tGIOq3RlG(N znw0bhw4rz^BkD259L44Vl#!}rwL%}iY7t1WoNi}0h)-_6w2}fsP309n`|E|e|M?hh zDma~9!FhwUj1+6rEGaL%P6hy_uNyZjkEZ-#qVG`S$Nh+LX3?oFrPHiAUGW0UDH6}1ygcZUX zK+E4R!w8wKeA~y_uRWS9pFZ4zAq1beHg&6Y4AX}L9QB<8ZY6U09l)_wXxGy1y-TB6 zLn60Tm7}g~y-}J@%DyNFnbsLJx$qiRG*D0X;K`n>u-Hn>qjtw@_<@!Q_Qpl$AL~jE-Wt5_Y@q|)C>+k5uOE|| z*e%p&yaMpAej)%EKbb~jN<~!d>BOUHrWmBhOkkt=n07 zNI-nC_+=?8-mft8SsZdTCQ$^puL3=SPjppQ(Zm(f>)TpJjZ*# zw6x-zxAQyJ0gYsnrLJuBctNFxc=FXvMsIW+JS!ICiFwjS?1>+x5ISO=)4d~d`{s|& zeiou}&w-Z;euBVSD9!rHvr0Okgm=Jhcr)@%IZ%NVk7H1KSzwd`I79v@P7Win!yx~L zXj?bT6zSwzT(>LoA|KqaoojTjl9)1^pKTh^l}*dSS+_C4kA_)5MgoESUmEEsh*2#y zgT06W+CTOgpYUJmpK~1kdNb*-y!0e&cbN>_nG?cGoL$}G3h=TEHeH&t!~~F#Q2;FQ z>(%5Z#&ztV@n~bw^L5|)V@l$PP1hp4KQ+z-w!XCt&M3U4a#ECYpj@JX#$#fT_L?y$ z?GN>{w94qBC*xO20^ui&6I_o#plZhh3Y5}8+>H}6_FmU(?zQ}mG*7mdlfU?JGIkxv zV-!6iM&KrnaWZ&<_^6bR#X8vSr}?{q6TxdoX?bz*>?v}#obr@p!}Q!;ZvkLDI1Rfx z*57%$p zldD_nbjOr{rkS%IHHBpmJOKN{iKeRfG9&KvZI?Cb4w;YOf`g0uHI%$^n zcu*atez%^$BB5^lJ|xB}sUXs;B|hdFMG zfc!a&-v791#eevY4-<%ZgHy>ykjA#B1LeyM?e-!chBj>9e5tBtn*iUDb<+_^IjBdnjLKy!X=ROmO`rVb%tn$L})&iV4?w* z!9PwvnTT1Q`U$xWLA8E}weXZQVZ(S|b6FZW{E21MVi3E1$_;zay6%fFdS8#qi<$F0C01Sd0ccTd%u`v_*wGp4IgEdwaJu7hx5Ay zwe|9UM|Fq0jWD{BjAv-E-Tu=}6Ik8Nk5le{@w2flk==znIVRw{*KJipmgnH~%DWkBR%uB% zQK=K5P1`~YAj*;5k?rNo_0RtD!HpG~%ej-@#RcSgWpf@dmsPRb>yuWNVH)z9$RR;# zu8=dsKH@rXV_rqk0Y<`)mq+$_^Yab?CIIog2!x&l8x$7Emb!V zvS{w;93RJH*Nltb5rD#>xg9I)mns|vP3c1Rouc8bI;ah|)5l82b`2?&bn?LiW#<)F z9)BD;?q6$fHP6!8_r(g#vmjEQl1;PzkcRt}sqqUlP#*5nynTh*&O)233II(pHwhfb zYiO!~CIt72U5)sMJ;nuvYIc>TW90j1(`8nJzC`tw7fbmKG1a;YU5BYD3n0z$!%jx` zo+?a~xn@*5IrAFL8E>iKcU2+={UEfYZo8)J4o!q8frU?}H!k-KoOYJ+@@D4P(Uqc3RrRK{av z8-0HVz@)P~gyOQ$l?QT*NLr8IGgh`-?rKokfKD=MpEk?yNh;z(dsi3%)&u}-abY|b zBa-c)q)23pWXPr)RvPOu5%6qMX8*{BC3h!wHbkGqqjG($F7=a{RWQz=#jlU?g~I-H}@Gr6hK~)&Qmp65u7M#z5U=`FI4kt7lmM&8%Wip&1KT;$B(8T z48(r9z)<4dx)w%WWN^6P(B=2qK1sx8WJC0*c_Wdw{7`T&B}U0E7N5FxM1y=zPm#o# z><1M?dYlGg#O^cCBD{CmC$f|2qAng7d$9SQ(t=eOG-yYIM$WlVnM~zVHGK~TItYQ^ z;~(M~ZIf662ct@_xOSx99^W=*MrXq? zn(IeCY1AVtk;hC$n$b2%>u<0c6}#ks=wTR}>&~IH)3eXxokKDq@~wm4fo{^g<60;& zQR}8~T5`WZl%7rJXXY!9+&n4L;qN&^E1(mSyf{i`#4e4?>W3ym;iwnd^eZXNxX$42 zw*cTmYNILsu(%_hqWnkRbjkr_VE3|lWxmRfv)|o`jy+qIoJsBTvl9mQ5UkoJq-Q-9 zkY8y@9XKT#Y}58;IT)B#*i3E=Zu0+Ar;5U<`3t) zr;i;VbS@+VVH+sADV3R!if>;Bkk6-o_4fQUAKGi$`SWGNi&=ih6`D&@1SU9OU>iSE z&dlYkL3+dp-%Wbz7CoU-wv4`QWVm_eJB_tSC(}&4cN|z7&lX3aMr%7N z=2N%+C_;_6q-?LNwiU71Bx|FuT+-3sr|Mh^Wx7E#TTY)dk@qC*4`9S?SxWq<_)1G% zPx>QisFY*j;54bGd!{${SnMl%QCm1olq+n9qq>y|Eu2&oAm~MemVbOKi(@atd~OR{ z#eOZ5?oIJC|6iy)#hbKoBPCvpc$y&iO5rV^^7_)V&x=a2S~JtwGgH|&jD5ouua@JL zq*vyJcIU3s#zmF%niXNE;HjNnMw;C53am#m7n5k>@=a)7PC3hAU*pHQNI6Y`+RfZD zwZN9&UzC3S*5YUC@kp1rDt8yfOkk+gLhhlPkOEF{pXC{+X*F3!^a|8^h@ITb9j3q^ znykEI5NK-f>u6fQ@z#?>i{`Lcx=bEt9_|*s>acQ}kVIw#jMb=^Xc)CF7S|EH$1(_^^>@<2TO!q8l3`AkY|V0?&${tm20Us~g~$ zHoLelOifq{0)5#YV5NKtiXtE5)qhnmR{TYhAyZ@pe{c&VAP&ZhCxhL2xnP6N~GGvTJ)N6F~Jts zZK&0~hICMn-(%9HgSt5h2oZ`CE@2YOA6-d-1CDr&>m#_tS9IcylP+HSyN7jyp8|W< zg)+k1-|vOG7LIuYk^MGL1?|Q_4(I&XXOh0b1P%&v<6D2$Ky4qh zJeGw@k%LV$W0WR*JTt2Tu6wDo2joTZLuUpAV=pDKy(hNBJ=8oucw}#TQFE&`>Otp9 z9M|Mc@OvFW|8Y^3j3RDIaqqCa$`*~^Nzj%yf)m!WTI_Va7S24o&BEF(PWxN9A4x1O_YYHqu^P>1&wfi+KaCC3o7r2hMZpdmFgbTzx4*(ivIfZe(06s& zq;RATbB;0zO4u}Vy)#~4{O9+OU-%c0qYec5qRMgW-GmEe^~+c<2C zCDi;fyNGysBXGjC+x9%>u=UJei>6#73Xz&*<_S-5{FeG9cmw-d<}@Ecclm{^7Z4yW^Te~| zTjkyr_$E*KgT%nryVH$)xOC|~1bHKHb-*fSKv+~ck1X2lpJq+KH!;-DprI-R$rlhqCJ+B)sic#LvwFH~ij|wREILvGb!oii{o!?*Aey!AUq7|C$ z4r}b3Bcga~t9C|nZ-7TpN(jVDCCi9BTukXA2ByJx)13P1`fgdy z86`ZsaLoj6&5QntFaSzCu(v=ITI{y{bxaJSd$Cs8)%#X`833T(_#Uq(87kp0XMEKu zQVK*93fm#wL6C{SHT^>sXb9PN#w=E32{rUS5=ZRYHmaD{lcens?FE_%HUP&-dyfaH zKH?^?kObeZqKr1zjYuxd2S$MF?3r2dBSul5)PjhdII!64dby8ZfPpgG&q93z?_5r5 zr;PqAX*=`Jg->y_Km25POJ<7m))pPJvfGuD2D=fRxBF+>#Ls|Hh;ou>;O|xK1%$vE z07&Zdu8*qgcA<4na%w8soKIFV%cN_ON+xAah{Y|o+4!adj!?<=kZqjX0k589S1w(E zlxGo%a?w(N|8zy(0kdu${cv4=eVlk3i^6t@ZIhA#t_AT>!L8&44#)uPbJHH7Voh&B zkM!f=KRHX&g8gvu)`%j%-J)IS z(Ry+UKZ3sYBedu{;c>`%Q|#D6FYJf@&M^R;Byq;X$^A6%NQWPYJWl9Q@97_?_wF2@ z#5!=0Hk=|cCdv)P(#em#OPrOZbnJWyA5cwkaa#HAOj8`9D4HKvzimM&F-w=5@VYtlCYxpMa9&E z=kUKoNs_+8QU_3Bfwi1~;LRK!fs`GcrnhGW1emJGYxYAnYv&{c3MnJl3Eco_Q-uh_`6|Yn%qi9joXQ`w;~X7g_=o00!{45`<7Al4_Xq zhFc`TDnbggMzJ~4LNJ@g>(Ca~jQ8+x!2X!+Vw0^96mAvb7&I$%gG|~xRPqnrWZCi7 zn-s}84&AC)hQ(!;54_#H0;yFIjly?}F;HB;Ey z6U@Ul82*JL)IE0ydI@i5VBCRYD*R|fDc`lh6CblpHCJqmcQ20yFacj#J&XV-dJ=Ut z3f3xY(vVo+RjrIpYLVC`R~zd$jmInZtdXIpuo4ZLU^R?DteJgE1vMnV%$w!Qnl}I? z_|iZ-R`|Sh4mNKRE;*D9ZfVEG9UCfE;mE zho|#E$onpnq4*`XxZ&4$`cHy%gws~vv2cKizQg{PLGYN4FjFX_>X7D7m_#6?m&Or? zKG(A99--h^OF`K;fGXhrl>JWc?cFi}vl1e? zLPjS(TBiG zl8Bk#NSqyWS-}Xt{$WpLM`#n%r;{BH(1Xg~pz$Z^tm2xPZFoHs$h zydl&Rh`0#~m~hG;FoXmr2*8N+byHDh!5SC{NVU7=qiK;3EtNQ Date: Tue, 4 Aug 2020 11:31:02 +0100 Subject: [PATCH 015/525] use precise international inchesPerMeter test scalebar text --- src/ol/control/ScaleLine.js | 2 +- test/spec/ol/control/scaleline.test.js | 49 ++++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 1 deletion(-) diff --git a/src/ol/control/ScaleLine.js b/src/ol/control/ScaleLine.js index 00d8974bde..a54a1712ec 100644 --- a/src/ol/control/ScaleLine.js +++ b/src/ol/control/ScaleLine.js @@ -468,7 +468,7 @@ class ScaleLine extends Control { ); const dpi = this.dpi_ || DEFAULT_DPI; const mpu = this.viewState_.projection.getMetersPerUnit(); - const inchesPerMeter = 39.37; + const inchesPerMeter = 1000 / 25.4; return parseFloat(resolution.toString()) * mpu * inchesPerMeter * dpi; } diff --git a/test/spec/ol/control/scaleline.test.js b/test/spec/ol/control/scaleline.test.js index dc8a3e5030..7c2e18c0e7 100644 --- a/test/spec/ol/control/scaleline.test.js +++ b/test/spec/ol/control/scaleline.test.js @@ -596,4 +596,53 @@ describe('ol.control.ScaleLine', function () { } }); }); + + describe('scalebar text', function () { + it('it corresponds to the resolution', function () { + const ctrl = new ScaleLine({ + bar: true, + text: true, + }); + ctrl.setMap(map); + map.setView( + new View({ + center: [0, 0], + zoom: 2, + multiWorld: true, + }) + ); + map.renderSync(); + const element = document.querySelector('.ol-scale-text', map.getTarget()); + expect(element).to.not.be(null); + expect(element).to.be.a(HTMLDivElement); + const text = element.innerText; + expect(text.slice(0, 4)).to.be('1 : '); + expect(text.replace(/^1|\D/g, '')).to.eql( + Math.round(map.getView().getResolution() / 0.00028) + ); + }); + it('it changes with latitude', function () { + const ctrl = new ScaleLine({ + bar: true, + text: true, + }); + ctrl.setMap(map); + map.setView( + new View({ + center: fromLonLat([0, 60]), + zoom: 2, + multiWorld: true, + }) + ); + map.renderSync(); + const element = document.querySelector('.ol-scale-text', map.getTarget()); + expect(element).to.not.be(null); + expect(element).to.be.a(HTMLDivElement); + const text = element.innerText; + expect(text.slice(0, 4)).to.be('1 : '); + expect(text.replace(/^1|\D/g, '')).to.eql( + Math.round((map.getView().getResolution() * 0.5) / 0.00028) + ); + }); + }); }); From 588e3b91d8c7d004ed11b7ca271724f3b88d2e03 Mon Sep 17 00:00:00 2001 From: mike-000 <49240900+mike-000@users.noreply.github.com> Date: Sat, 8 Aug 2020 13:01:04 +0100 Subject: [PATCH 016/525] use numbers for expected values --- test/spec/ol/control/scaleline.test.js | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/test/spec/ol/control/scaleline.test.js b/test/spec/ol/control/scaleline.test.js index 7c2e18c0e7..ba74835c76 100644 --- a/test/spec/ol/control/scaleline.test.js +++ b/test/spec/ol/control/scaleline.test.js @@ -617,9 +617,7 @@ describe('ol.control.ScaleLine', function () { expect(element).to.be.a(HTMLDivElement); const text = element.innerText; expect(text.slice(0, 4)).to.be('1 : '); - expect(text.replace(/^1|\D/g, '')).to.eql( - Math.round(map.getView().getResolution() / 0.00028) - ); + expect(text.replace(/^1|\D/g, '')).to.eql(139770566); }); it('it changes with latitude', function () { const ctrl = new ScaleLine({ @@ -640,9 +638,7 @@ describe('ol.control.ScaleLine', function () { expect(element).to.be.a(HTMLDivElement); const text = element.innerText; expect(text.slice(0, 4)).to.be('1 : '); - expect(text.replace(/^1|\D/g, '')).to.eql( - Math.round((map.getView().getResolution() * 0.5) / 0.00028) - ); + expect(text.replace(/^1|\D/g, '')).to.eql(69885283); }); }); }); From 722e0c5b69284a922448a2355e08097d16c44775 Mon Sep 17 00:00:00 2001 From: mike-000 <49240900+mike-000@users.noreply.github.com> Date: Sat, 8 Aug 2020 17:06:13 +0100 Subject: [PATCH 017/525] Include scale in options Add rectangle to example Add ellipse and rectangle to rendering tests --- examples/regularshape.html | 3 ++- examples/regularshape.js | 25 ++++++++++++++++-- rendering/cases/circle-style/expected.png | Bin 4263 -> 6668 bytes rendering/cases/circle-style/main.js | 16 +++++++++++ .../cases/regularshape-style/expected.png | Bin 6292 -> 7613 bytes rendering/cases/regularshape-style/main.js | 19 +++++++++++++ src/ol/style/Circle.js | 6 ++++- src/ol/style/RegularShape.js | 7 +++-- 8 files changed, 70 insertions(+), 6 deletions(-) diff --git a/examples/regularshape.html b/examples/regularshape.html index 990a9ec148..59cbf4b762 100644 --- a/examples/regularshape.html +++ b/examples/regularshape.html @@ -6,8 +6,9 @@ docs: > This example shows how several regular shapes or symbols (representing `x`, `cross`, `star`, `triangle`, `square` and `stacked`) can be created. + A `rectangle` is produced by scaling a square created without rotation. Style `stacked` represents possility to stack multiple shapes with offset -tags: "vector, symbol, regularshape, style, square, cross, star, triangle, x" +tags: "vector, symbol, regularshape, style, square, rectangle, cross, star, triangle, x" ---

diff --git a/examples/regularshape.js b/examples/regularshape.js index 83eab335d1..91279aea76 100644 --- a/examples/regularshape.js +++ b/examples/regularshape.js @@ -19,6 +19,17 @@ const styles = { angle: Math.PI / 4, }), }), + 'rectangle': new Style({ + image: new RegularShape({ + fill: fill, + stroke: stroke, + radius: 10 / Math.SQRT2, + radius2: 10, + points: 4, + angle: 0, + scale: [1, 0.5], + }), + }), 'triangle': new Style({ image: new RegularShape({ fill: fill, @@ -82,14 +93,24 @@ const styles = { ], }; -const styleKeys = ['x', 'cross', 'star', 'triangle', 'square', 'stacked']; +const styleKeys = [ + 'x', + 'cross', + 'star', + 'triangle', + 'square', + 'rectangle', + '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() * 6)]]); + features[i].setStyle( + styles[styleKeys[Math.floor(Math.random() * styleKeys.length)]] + ); } const source = new VectorSource({ diff --git a/rendering/cases/circle-style/expected.png b/rendering/cases/circle-style/expected.png index 84eef2b6e8421a370246cdf7d2126acdd96abfd7..a72891b86e81ef2ae1046c9ed3bd838bbc746c82 100644 GIT binary patch literal 6668 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 literal 4263 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 W)iIw`f&AwIaI!!72l<%)wSNJFfcDt{ diff --git a/rendering/cases/circle-style/main.js b/rendering/cases/circle-style/main.js index 7f9ac70aa7..d3e54dce06 100644 --- a/rendering/cases/circle-style/main.js +++ b/rendering/cases/circle-style/main.js @@ -8,6 +8,21 @@ import VectorLayer from '../../../src/ol/layer/Vector.js'; import VectorSource from '../../../src/ol/source/Vector.js'; import View from '../../../src/ol/View.js'; +const ellipse = new Feature(new Point([-50, -50])); + +ellipse.setStyle( + new Style({ + image: new Circle({ + radius: 30, + scale: [1, 0.5], + stroke: new Stroke({ + color: '#00f', + width: 3, + }), + }), + }) +); + const vectorSource = new VectorSource(); vectorSource.addFeatures([ @@ -23,6 +38,7 @@ vectorSource.addFeatures([ geometry: new Point([50, 50]), radius: 30, }), + ellipse, ]); const style = new Style({ diff --git a/rendering/cases/regularshape-style/expected.png b/rendering/cases/regularshape-style/expected.png index b89511eef3baa284742094d4968fbe53f68db482..f9ec11d4993843a69a815830e0b8ab7fecca897d 100644 GIT binary patch literal 7613 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 diff --git a/rendering/cases/regularshape-style/main.js b/rendering/cases/regularshape-style/main.js index 6c201fb030..327e466db6 100644 --- a/rendering/cases/regularshape-style/main.js +++ b/rendering/cases/regularshape-style/main.js @@ -83,6 +83,25 @@ function createFeatures(stroke, fill, offSet = [0, 0]) { }) ); vectorSource.addFeature(feature); + + feature = new Feature({ + geometry: new Point([8 + offSet[0], 30 + offSet[1]]), + }); + // rectangle + feature.setStyle( + new Style({ + image: new RegularShape({ + fill: fill, + stroke: stroke, + radius: 10 / Math.SQRT2, + radius2: 10, + points: 4, + angle: 0, + scale: [1, 0.5], + }), + }) + ); + vectorSource.addFeature(feature); } createFeatures(new Stroke({width: 2}), new Fill({color: 'red'})); diff --git a/src/ol/style/Circle.js b/src/ol/style/Circle.js index f46d76ae90..3ff7a3285d 100644 --- a/src/ol/style/Circle.js +++ b/src/ol/style/Circle.js @@ -10,6 +10,8 @@ import RegularShape from './RegularShape.js'; * @property {number} radius Circle radius. * @property {import("./Stroke.js").default} [stroke] Stroke style. * @property {Array} [displacement=[0,0]] displacement + * @property {number|import("../size.js").Size} [scale=1] Scale. A two dimensional scale will produce an ellipse. + * Unless two dimensional scaling is required a better result may be obtained with an appropriate setting for `radius`. */ /** @@ -29,6 +31,7 @@ class CircleStyle extends RegularShape { fill: options.fill, radius: options.radius, stroke: options.stroke, + scale: options.scale !== undefined ? options.scale : 1, displacement: options.displacement !== undefined ? options.displacement : [0, 0], }); @@ -40,14 +43,15 @@ class CircleStyle extends RegularShape { * @api */ clone() { + const scale = this.getScale(); const style = new CircleStyle({ fill: this.getFill() ? this.getFill().clone() : undefined, stroke: this.getStroke() ? this.getStroke().clone() : undefined, radius: this.getRadius(), + scale: Array.isArray(scale) ? scale.slice() : scale, displacement: this.getDisplacement().slice(), }); style.setOpacity(this.getOpacity()); - style.setScale(this.getScale()); return style; } diff --git a/src/ol/style/RegularShape.js b/src/ol/style/RegularShape.js index c97e14f4b3..2bb56b2729 100644 --- a/src/ol/style/RegularShape.js +++ b/src/ol/style/RegularShape.js @@ -30,6 +30,8 @@ import { * @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. + * @property {number|import("../size.js").Size} [scale=1] Scale. Unless two dimensional scaling is required a better + * result may be obtained with appropriate settings for `radius`, `radius1` and `radius2. */ /** @@ -66,7 +68,7 @@ class RegularShape extends ImageStyle { opacity: 1, rotateWithView: rotateWithView, rotation: options.rotation !== undefined ? options.rotation : 0, - scale: 1, + scale: options.scale !== undefined ? options.scale : 1, displacement: options.displacement !== undefined ? options.displacement : [0, 0], }); @@ -159,6 +161,7 @@ class RegularShape extends ImageStyle { * @api */ clone() { + const scale = this.getScale(); const style = new RegularShape({ fill: this.getFill() ? this.getFill().clone() : undefined, points: this.getPoints(), @@ -168,10 +171,10 @@ class RegularShape extends ImageStyle { stroke: this.getStroke() ? this.getStroke().clone() : undefined, rotation: this.getRotation(), rotateWithView: this.getRotateWithView(), + scale: Array.isArray(scale) ? scale.slice() : scale, displacement: this.getDisplacement().slice(), }); style.setOpacity(this.getOpacity()); - style.setScale(this.getScale()); return style; } From 37e5529b22e3e80d1819bd69ea7ce56c6f28bf66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maximilian=20Kr=C3=B6g?= Date: Sat, 1 Aug 2020 11:47:26 +0200 Subject: [PATCH 018/525] Update some example styles / formatting --- examples/color-manipulation.css | 6 +++-- examples/color-manipulation.html | 6 ++--- examples/hit-tolerance.html | 9 ++++---- examples/hit-tolerance.js | 4 ++-- examples/layer-group.css | 5 ++++- examples/layer-group.html | 37 ++++++++++++++++++------------- examples/layer-group.js | 20 +++++++++-------- examples/moveend.html | 14 +++++++----- examples/region-growing.css | 8 ++++--- examples/region-growing.html | 15 +++++++------ examples/shaded-relief.css | 5 ++++- examples/shaded-relief.html | 9 +++++--- examples/vector-labels.css | 38 ++++++++------------------------ examples/vector-labels.html | 13 +++++------ 14 files changed, 97 insertions(+), 92 deletions(-) diff --git a/examples/color-manipulation.css b/examples/color-manipulation.css index 674b2a5b21..b12be180ba 100644 --- a/examples/color-manipulation.css +++ b/examples/color-manipulation.css @@ -1,5 +1,7 @@ table.controls td { - text-align: center; padding: 2px 5px; - min-width: 60px; +} +table.controls td:nth-child(3) { + text-align: right; + min-width: 4.5em; } diff --git a/examples/color-manipulation.html b/examples/color-manipulation.html index d857128525..8aa8c667af 100644 --- a/examples/color-manipulation.html +++ b/examples/color-manipulation.html @@ -10,17 +10,17 @@ tags: "color, hue, lightness, chroma" - + - + - +
hue° ° 
chroma % %
lightness % %
diff --git a/examples/hit-tolerance.html b/examples/hit-tolerance.html index dc55ff516c..9b7d8c78b5 100644 --- a/examples/hit-tolerance.html +++ b/examples/hit-tolerance.html @@ -11,15 +11,14 @@ docs: > tags: "hitTolerance" ---
+Try to click the line in the map.
-  No feature got hit. -
- + -
- Area:   +   Area:   + diff --git a/examples/hit-tolerance.js b/examples/hit-tolerance.js index 443abb7ee5..e3cd1c3cea 100644 --- a/examples/hit-tolerance.js +++ b/examples/hit-tolerance.js @@ -57,10 +57,10 @@ map.on('singleclick', function (e) { ); if (hit) { style.getStroke().setColor('green'); - statusElement.innerHTML = ' A feature got hit!'; + statusElement.innerHTML = 'A feature got hit!'; } else { style.getStroke().setColor('black'); - statusElement.innerHTML = ' No feature got hit.'; + statusElement.innerHTML = 'No feature got hit.'; } feature.changed(); }); diff --git a/examples/layer-group.css b/examples/layer-group.css index 31cb3e6cf1..7018b0e597 100644 --- a/examples/layer-group.css +++ b/examples/layer-group.css @@ -1,3 +1,6 @@ #layertree li > span { cursor: pointer; -} \ No newline at end of file +} +#layertree label { + display: block; +} diff --git a/examples/layer-group.html b/examples/layer-group.html index 405bea1737..2083f1eda7 100644 --- a/examples/layer-group.html +++ b/examples/layer-group.html @@ -18,37 +18,44 @@ cloak:
  • OSM layer
    + - -
  • -
  • Layer group +
  • + Layer group
    + - -
      -
    • Food insecurity layer +
    • + Food insecurity layer
      + - -
    • -
    • World borders layer +
    • + World borders layer
      + - -
    diff --git a/examples/layer-group.js b/examples/layer-group.js index c6fd6b524b..c85ad3f72d 100644 --- a/examples/layer-group.js +++ b/examples/layer-group.js @@ -49,19 +49,21 @@ function bindInputs(layerid, layer) { visibilityInput.prop('checked', layer.getVisible()); const opacityInput = $(layerid + ' input.opacity'); - opacityInput.on('input change', function () { + opacityInput.on('input', function () { layer.setOpacity(parseFloat(this.value)); }); opacityInput.val(String(layer.getOpacity())); } -map.getLayers().forEach(function (layer, i) { - bindInputs('#layer' + i, layer); - if (layer instanceof LayerGroup) { - layer.getLayers().forEach(function (sublayer, j) { - bindInputs('#layer' + i + j, sublayer); - }); - } -}); +function setup(id, group) { + group.getLayers().forEach(function (layer, i) { + const layerid = id + i; + bindInputs(layerid, layer); + if (layer instanceof LayerGroup) { + setup(layerid, layer); + } + }); +} +setup('#layer', map.getLayerGroup()); $('#layertree li > span') .click(function () { diff --git a/examples/moveend.html b/examples/moveend.html index 8ecf4c4a03..7b14c00e35 100644 --- a/examples/moveend.html +++ b/examples/moveend.html @@ -3,11 +3,15 @@ layout: example.html title: Moveend Event shortdesc: Use of the moveend event. docs: > -

    In this example, a listener is registered for the map's moveend event. Whenever this listener is called, it updates the inputs below with the map extent in decimal degrees.

    +

    + In this example, a listener is registered for the map's + moveend event. Whenever this listener is called, + it updates the inputs below with the map extent in decimal degrees. +

    tags: "moveend, map, event" ---
    - -
    - - + + + + diff --git a/examples/region-growing.css b/examples/region-growing.css index dd027637bb..fd66a76c65 100644 --- a/examples/region-growing.css +++ b/examples/region-growing.css @@ -1,4 +1,6 @@ -table.controls td { - min-width: 110px; - padding: 2px 5px; +.map { + cursor: pointer; +} +#threshold { + margin: 0 0.6em; } diff --git a/examples/region-growing.html b/examples/region-growing.html index 17e1aca740..b387575658 100644 --- a/examples/region-growing.html +++ b/examples/region-growing.html @@ -28,10 +28,11 @@ cloak: - key: get_your_own_D6rA4zTHduk6KOKTXzGB value: Get your own API key at https://www.maptiler.com/cloud/ --- -
    - - - - - -
    Threshold:
    +
    +
    + +
    diff --git a/examples/shaded-relief.css b/examples/shaded-relief.css index f829965da2..71748fd2dc 100644 --- a/examples/shaded-relief.css +++ b/examples/shaded-relief.css @@ -1,4 +1,7 @@ table.controls td { - text-align: center; padding: 2px 5px; } +table.controls td:nth-child(3) { + text-align: right; + min-width: 3em; +} diff --git a/examples/shaded-relief.html b/examples/shaded-relief.html index 116040ccb8..bf4be78789 100644 --- a/examples/shaded-relief.html +++ b/examples/shaded-relief.html @@ -28,15 +28,18 @@ tags: "raster, shaded relief"
    - + + - + + - + +
    vertical exaggeration: xvertical exaggeration: x
    sun elevation: °sun elevation: °
    sun azimuth: °sun azimuth: °
    diff --git a/examples/vector-labels.css b/examples/vector-labels.css index 55f55ee105..088402d239 100644 --- a/examples/vector-labels.css +++ b/examples/vector-labels.css @@ -1,21 +1,13 @@ -h2 { - font-size: 1.5em; - line-height: 15px; -} - -.scale-cnt { - margin: 5px; -} - -.edit-form-ctn { -} - .edit-form { - float: left; + display: inline-block; margin: 5px; - width: 230px; - padding: 4px; + padding: 10px; border: 1px solid black; + white-space: nowrap; +} + +.edit-form h2 { + font-size: 1.5em; } .edit-form input[type="button"] { @@ -23,23 +15,11 @@ h2 { } .edit-form-elem label { - display: block; - float: left; + display: inline-block; width: 85px; } -.edit-form-elem input[type="text"] { - width: 60px; -} - +.edit-form-elem input[type="text"], .edit-form-elem select { width: 130px; } - -.edit-form br { - clear: left; -} - -.clearall { - clear: both; -} diff --git a/examples/vector-labels.html b/examples/vector-labels.html index 687618a5ce..b57fe585dc 100644 --- a/examples/vector-labels.html +++ b/examples/vector-labels.html @@ -112,13 +112,13 @@ tags: "geojson, vector, openstreetmap, label"
    - +

    - + @@ -224,13 +224,13 @@ tags: "geojson, vector, openstreetmap, label"
    - +

    - + @@ -336,14 +336,13 @@ tags: "geojson, vector, openstreetmap, label"
    - +

    - + -
    From d2d10223592c99906dd25ed4c3fc62ee20b0d7db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maximilian=20Kr=C3=B6g?= Date: Sat, 1 Aug 2020 11:47:26 +0200 Subject: [PATCH 019/525] Link labels to input elements --- examples/cluster.html | 2 +- examples/color-manipulation.html | 6 +- examples/draw-and-modify-features.html | 2 +- examples/draw-features.html | 2 +- examples/draw-freehand.html | 2 +- examples/draw-shapes.html | 2 +- examples/export-pdf.html | 4 +- examples/filter-points-webgl.html | 4 +- examples/heatmap-earthquakes.html | 4 +- examples/icon-sprite-webgl.html | 2 +- examples/iiif.html | 2 +- examples/measure.html | 2 +- examples/mouse-position.html | 4 +- examples/moveend.html | 8 +- examples/overviewmap-custom.html | 2 +- examples/print-to-scale.html | 6 +- examples/reprojection-image.html | 5 +- examples/reprojection.html | 6 +- examples/scale-line.html | 2 +- examples/select-features.html | 16 ++-- examples/shaded-relief.html | 6 +- examples/snap.html | 2 +- examples/tracing.html | 2 +- examples/vector-esri-edit.html | 2 +- examples/vector-labels.html | 102 ++++++++++++------------- examples/vector-tile-selection.html | 2 +- examples/webgl-points-layer.html | 2 +- 27 files changed, 102 insertions(+), 99 deletions(-) diff --git a/examples/cluster.html b/examples/cluster.html index 65c39a2236..70c52312a8 100644 --- a/examples/cluster.html +++ b/examples/cluster.html @@ -8,6 +8,6 @@ tags: "cluster, vector" ---
    - +
    diff --git a/examples/color-manipulation.html b/examples/color-manipulation.html index 8aa8c667af..8b6fc98d13 100644 --- a/examples/color-manipulation.html +++ b/examples/color-manipulation.html @@ -9,17 +9,17 @@ tags: "color, hue, lightness, chroma"
    - + - + - + diff --git a/examples/draw-and-modify-features.html b/examples/draw-and-modify-features.html index bf3ff2e7a4..9be38fc551 100644 --- a/examples/draw-and-modify-features.html +++ b/examples/draw-and-modify-features.html @@ -8,7 +8,7 @@ tags: "draw, edit, modify, vector, featureoverlay" ---
    - + diff --git a/examples/draw-freehand.html b/examples/draw-freehand.html index 8f6767a8a8..d6d84ccc5c 100644 --- a/examples/draw-freehand.html +++ b/examples/draw-freehand.html @@ -12,7 +12,7 @@ tags: "draw, edit, freehand, vector" ---
    - + diff --git a/examples/export-pdf.html b/examples/export-pdf.html index fa20f86069..00f92fa728 100644 --- a/examples/export-pdf.html +++ b/examples/export-pdf.html @@ -14,7 +14,7 @@ resources: - + - + - + diff --git a/examples/heatmap-earthquakes.html b/examples/heatmap-earthquakes.html index e20d7f58b0..becc60145a 100644 --- a/examples/heatmap-earthquakes.html +++ b/examples/heatmap-earthquakes.html @@ -8,8 +8,8 @@ tags: "heatmap, kml, vector, style, webgl" ---
    - + - + diff --git a/examples/icon-sprite-webgl.html b/examples/icon-sprite-webgl.html index 66e83e231e..7930218863 100644 --- a/examples/icon-sprite-webgl.html +++ b/examples/icon-sprite-webgl.html @@ -21,6 +21,6 @@ cloak:
    Current sighting:
    - Filter by UFO shape: +
    diff --git a/examples/iiif.html b/examples/iiif.html index 8d8fadcad9..061c23309c 100644 --- a/examples/iiif.html +++ b/examples/iiif.html @@ -10,7 +10,7 @@ tags: "IIIF, IIIF Image API, tile source"
     
    - Enter info.json URL: +
    diff --git a/examples/measure.html b/examples/measure.html index b5a4f60a40..0cc627a964 100644 --- a/examples/measure.html +++ b/examples/measure.html @@ -16,7 +16,7 @@ tags: "draw, edit, measure, vector" ---
    - + - + diff --git a/examples/moveend.html b/examples/moveend.html index 7b14c00e35..ee2f9cee3d 100644 --- a/examples/moveend.html +++ b/examples/moveend.html @@ -11,7 +11,7 @@ docs: > tags: "moveend, map, event" ---
    - - - - + + + + diff --git a/examples/overviewmap-custom.html b/examples/overviewmap-custom.html index 8b06bd2132..4a4dba5c20 100644 --- a/examples/overviewmap-custom.html +++ b/examples/overviewmap-custom.html @@ -11,4 +11,4 @@ cloak: ---
    -
    Rotate with view
    +
    diff --git a/examples/print-to-scale.html b/examples/print-to-scale.html index 54d88db427..00875383f3 100644 --- a/examples/print-to-scale.html +++ b/examples/print-to-scale.html @@ -18,7 +18,7 @@ resources:
    - + - + - + Image smoothing +
    + + +
    diff --git a/examples/reprojection.html b/examples/reprojection.html index 5ad6a2da47..cf83a1eebc 100644 --- a/examples/reprojection.html +++ b/examples/reprojection.html @@ -9,14 +9,14 @@ tags: "reprojection, projection, proj4js, osm, wms, wmts, hidpi"
    - +
    - +
    - + diff --git a/examples/select-features.html b/examples/select-features.html index c7640d8514..9fd1180239 100644 --- a/examples/select-features.html +++ b/examples/select-features.html @@ -10,13 +10,13 @@ tags: "select, vector" ---
    - - + +  0 selected features diff --git a/examples/shaded-relief.html b/examples/shaded-relief.html index bf4be78789..4872f10e15 100644 --- a/examples/shaded-relief.html +++ b/examples/shaded-relief.html @@ -28,17 +28,17 @@ tags: "raster, shaded relief"
    hue ° 
    chroma %
    lightness %
    - + - + - + diff --git a/examples/snap.html b/examples/snap.html index 409f09491d..3827370d60 100644 --- a/examples/snap.html +++ b/examples/snap.html @@ -24,7 +24,7 @@ tags: "draw, edit, modify, vector, snap"
    - + diff --git a/examples/vector-esri-edit.html b/examples/vector-esri-edit.html index ac9ac5cad7..8856e8895b 100644 --- a/examples/vector-esri-edit.html +++ b/examples/vector-esri-edit.html @@ -10,7 +10,7 @@ resources: ---
    - +

    Points

    - +
    - +
    - +
    - +
    - +
    - +
    - +
    - +
    - +
    - +
    - +
    - +
    - +
    - +
    - +
    - +
    - +
    @@ -127,7 +127,7 @@ tags: "geojson, vector, openstreetmap, label"

    Lines

    - +
    - +
    - +
    - +
    - +
    - +
    - +
    - +
    - +
    - +
    - +
    - +
    - +
    - +
    - +
    - +
    - +
    @@ -239,7 +239,7 @@ tags: "geojson, vector, openstreetmap, label"

    Polygons

    - +
    - +
    - +
    - +
    - +
    - +
    - +
    - +
    - +
    - +
    - +
    - +
    - +
    - +
    - +
    - +
    - +
    diff --git a/examples/vector-tile-selection.html b/examples/vector-tile-selection.html index ba352f8c6d..4d5689c8a0 100644 --- a/examples/vector-tile-selection.html +++ b/examples/vector-tile-selection.html @@ -15,7 +15,7 @@ tags: "vector tiles, selection" ---
    - + From d9fb96976534bb2b0254bd7365959e7637c9076a Mon Sep 17 00:00:00 2001 From: Andreas Hocevar Date: Sun, 9 Aug 2020 21:23:13 +0200 Subject: [PATCH 020/525] Fix sort order of examples search results --- examples/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/index.js b/examples/index.js index 5392a59964..fcee11c512 100644 --- a/examples/index.js +++ b/examples/index.js @@ -72,7 +72,7 @@ // sort examples, first by number of words matched, then // by word frequency examples.sort(function (a, b) { - return a.score - b.score || a.words - b.words; + return b.score - a.score || b.words - a.words; }); return examples; } From 38ecaa9814408fdaf6d141bd147a200ca996659b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maximilian=20Kr=C3=B6g?= Date: Fri, 27 Mar 2020 20:38:53 +0100 Subject: [PATCH 021/525] Use compositing operation for icon colorization when possible. --- src/ol/style/IconImage.js | 40 +++++++++++++++++---------------------- 1 file changed, 17 insertions(+), 23 deletions(-) diff --git a/src/ol/style/IconImage.js b/src/ol/style/IconImage.js index e5a921c823..ba4f96f479 100644 --- a/src/ol/style/IconImage.js +++ b/src/ol/style/IconImage.js @@ -232,37 +232,31 @@ class IconImage extends EventTarget { ctx.scale(pixelRatio, pixelRatio); ctx.drawImage(this.image_, 0, 0); - if (this.isTainted_()) { - // If reading from the canvas throws a SecurityError the same effect can be - // achieved with globalCompositeOperation. - // This could be used as the default, but it is not fully supported by all - // browsers. E. g. Internet Explorer 11 does not support the multiply - // operation and the resulting image shape will be completelly filled with - // the provided color. - // So this is only used as a fallback. It is still better than having no icon - // at all. + ctx.globalCompositeOperation = 'multiply'; + // Internet Explorer 11 does not support the multiply operation. + // If the canvas is tainted in Internet Explorer this still produces + // a solid color image with the shape of the icon. + if (ctx.globalCompositeOperation === 'multiply' || this.isTainted_()) { const c = this.color_; - ctx.globalCompositeOperation = 'multiply'; ctx.fillStyle = 'rgb(' + c[0] + ',' + c[1] + ',' + c[2] + ')'; ctx.fillRect(0, 0, canvas.width, canvas.height); ctx.globalCompositeOperation = 'destination-in'; ctx.drawImage(this.image_, 0, 0); - return; - } + } else { + const imgData = ctx.getImageData(0, 0, canvas.width, canvas.height); + const data = imgData.data; + const r = this.color_[0] / 255.0; + const g = this.color_[1] / 255.0; + const b = this.color_[2] / 255.0; - const imgData = ctx.getImageData(0, 0, canvas.width, canvas.height); - const data = imgData.data; - const r = this.color_[0] / 255.0; - const g = this.color_[1] / 255.0; - const b = this.color_[2] / 255.0; - - for (let i = 0, ii = data.length; i < ii; i += 4) { - data[i] *= r; - data[i + 1] *= g; - data[i + 2] *= b; + for (let i = 0, ii = data.length; i < ii; i += 4) { + data[i] *= r; + data[i + 1] *= g; + data[i + 2] *= b; + } + ctx.putImageData(imgData, 0, 0); } - ctx.putImageData(imgData, 0, 0); } /** From 558b3a3ed2efe1c2c2a8110d037c0802759ab488 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maximilian=20Kr=C3=B6g?= Date: Sat, 28 Mar 2020 16:39:50 +0100 Subject: [PATCH 022/525] Support alpha channel for icon tinting --- examples/icon-color.js | 2 +- src/ol/style/IconImage.js | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/examples/icon-color.js b/examples/icon-color.js index e5c583097c..cfbb28d1dc 100644 --- a/examples/icon-color.js +++ b/examples/icon-color.js @@ -41,7 +41,7 @@ rome.setStyle( london.setStyle( new Style({ image: new Icon({ - color: '#4271AE', + color: 'rgba(255, 0, 0, .5)', crossOrigin: 'anonymous', src: 'data/bigdot.png', scale: 0.2, diff --git a/src/ol/style/IconImage.js b/src/ol/style/IconImage.js index ba4f96f479..932d3d9f4e 100644 --- a/src/ol/style/IconImage.js +++ b/src/ol/style/IconImage.js @@ -5,6 +5,7 @@ import EventTarget from '../events/Target.js'; import EventType from '../events/EventType.js'; import ImageState from '../ImageState.js'; +import {asString} from '../color.js'; import {createCanvasContext2D} from '../dom.js'; import {shared as iconImageCache} from './IconImageCache.js'; import {listenImage} from '../Image.js'; @@ -237,8 +238,7 @@ class IconImage extends EventTarget { // If the canvas is tainted in Internet Explorer this still produces // a solid color image with the shape of the icon. if (ctx.globalCompositeOperation === 'multiply' || this.isTainted_()) { - const c = this.color_; - ctx.fillStyle = 'rgb(' + c[0] + ',' + c[1] + ',' + c[2] + ')'; + ctx.fillStyle = asString(this.color_); ctx.fillRect(0, 0, canvas.width, canvas.height); ctx.globalCompositeOperation = 'destination-in'; @@ -249,11 +249,13 @@ class IconImage extends EventTarget { const r = this.color_[0] / 255.0; const g = this.color_[1] / 255.0; const b = this.color_[2] / 255.0; + const a = this.color_[3]; for (let i = 0, ii = data.length; i < ii; i += 4) { data[i] *= r; data[i + 1] *= g; data[i + 2] *= b; + data[i + 3] *= a; } ctx.putImageData(imgData, 0, 0); } From d3041295a1ec17cc05a9347875b86d8311edeb43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Harrtell?= Date: Sun, 9 Aug 2020 22:36:41 +0200 Subject: [PATCH 023/525] Initial spike on WFS 2.0 --- src/ol/format/WFS.js | 211 +++++++++++++++++++++++++------- test/spec/ol/format/wfs.test.js | 3 +- 2 files changed, 168 insertions(+), 46 deletions(-) diff --git a/src/ol/format/WFS.js b/src/ol/format/WFS.js index 3438edfe44..d8d277100b 100644 --- a/src/ol/format/WFS.js +++ b/src/ol/format/WFS.js @@ -51,6 +51,11 @@ const TRANSACTION_SUMMARY_PARSERS = { 'totalUpdated': makeObjectPropertySetter(readNonNegativeInteger), 'totalDeleted': makeObjectPropertySetter(readNonNegativeInteger), }, + 'http://www.opengis.net/wfs/2.0': { + 'totalInserted': makeObjectPropertySetter(readNonNegativeInteger), + 'totalUpdated': makeObjectPropertySetter(readNonNegativeInteger), + 'totalDeleted': makeObjectPropertySetter(readNonNegativeInteger), + }, }; /** @@ -65,6 +70,13 @@ const TRANSACTION_RESPONSE_PARSERS = { ), 'InsertResults': makeObjectPropertySetter(readInsertResults, 'insertIds'), }, + 'http://www.opengis.net/wfs/2.0': { + 'TransactionSummary': makeObjectPropertySetter( + readTransactionSummary, + 'transactionSummary' + ), + 'InsertResults': makeObjectPropertySetter(readInsertResults, 'insertIds'), + }, }; /** @@ -74,6 +86,9 @@ const QUERY_SERIALIZERS = { 'http://www.opengis.net/wfs': { 'PropertyName': makeChildAppender(writeStringTextNode), }, + 'http://www.opengis.net/wfs/2.0': { + 'PropertyName': makeChildAppender(writeStringTextNode), + }, }; /** @@ -87,6 +102,13 @@ const TRANSACTION_SERIALIZERS = { 'Property': makeChildAppender(writeProperty), 'Native': makeChildAppender(writeNative), }, + 'http://www.opengis.net/wfs/2.0': { + 'Insert': makeChildAppender(writeFeature), + 'Update': makeChildAppender(writeUpdate), + 'Delete': makeChildAppender(writeDelete), + 'Property': makeChildAppender(writeProperty), + 'Native': makeChildAppender(writeNative), + }, }; /** @@ -95,6 +117,7 @@ const TRANSACTION_SERIALIZERS = { * @property {Array|string} [featureType] The feature type to parse. Only used for read operations. * @property {GMLBase} [gmlFormat] The GML format to use to parse the response. Default is `ol/format/GML3`. * @property {string} [schemaLocation] Optional schemaLocation to use for serialization, this will override the default. + * @property {string} [version='1.1.0'] WFS version to use. Can be either `1.0.0`, `1.1.0` or `2.0.0`. */ /** @@ -164,14 +187,22 @@ const FEATURE_PREFIX = 'feature'; const XMLNS = 'http://www.w3.org/2000/xmlns/'; /** - * @type {string} + * @type {Object} */ -const OGCNS = 'http://www.opengis.net/ogc'; +const OGCNS = { + '2.0.0': 'http://www.opengis.net/ogc/1.1', + '1.1.0': 'http://www.opengis.net/ogc', + '1.0.0': 'http://www.opengis.net/ogc', +}; /** - * @type {string} + * @type {Object} */ -const WFSNS = 'http://www.opengis.net/wfs'; +const WFSNS = { + '2.0.0': 'http://www.opengis.net/wfs/2.0', + '1.1.0': 'http://www.opengis.net/wfs', + '1.0.0': 'http://www.opengis.net/wfs', +}; /** * @type {string} @@ -182,6 +213,8 @@ const FESNS = 'http://www.opengis.net/fes'; * @type {Object} */ const SCHEMA_LOCATIONS = { + '2.0.0': + 'http://www.opengis.net/wfs/2.0 http://schemas.opengis.net/wfs/2.0.0/wfs.xsd', '1.1.0': 'http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.1.0/wfs.xsd', '1.0.0': @@ -212,6 +245,12 @@ class WFS extends XMLFeature { const options = opt_options ? opt_options : {}; + /** + * @private + * @type {string} + */ + this.version_ = options.version ? options.version : DEFAULT_VERSION; + /** * @private * @type {Array|string|undefined} @@ -236,7 +275,7 @@ class WFS extends XMLFeature { */ this.schemaLocation_ = options.schemaLocation ? options.schemaLocation - : SCHEMA_LOCATIONS[DEFAULT_VERSION]; + : SCHEMA_LOCATIONS[this.version_]; } /** @@ -406,9 +445,9 @@ class WFS extends XMLFeature { * @api */ writeGetFeature(options) { - const node = createElementNS(WFSNS, 'GetFeature'); + const node = createElementNS(WFSNS[this.version_], 'GetFeature'); node.setAttribute('service', 'WFS'); - node.setAttribute('version', '1.1.0'); + node.setAttribute('version', this.version_); let filter; if (options) { if (options.handle) { @@ -458,6 +497,7 @@ class WFS extends XMLFeature { node: node, }; assign(context, { + 'version': this.version_, 'srsName': options.srsName, 'featureNS': options.featureNS ? options.featureNS : this.featureNS_, 'featurePrefix': options.featurePrefix, @@ -487,8 +527,8 @@ class WFS extends XMLFeature { */ writeTransaction(inserts, updates, deletes, options) { const objectStack = []; - const node = createElementNS(WFSNS, 'Transaction'); - const version = options.version ? options.version : DEFAULT_VERSION; + const version = options.version ? options.version : this.version_; + const node = createElementNS(WFSNS[version], 'Transaction'); const gmlVersion = version === '1.0.0' ? 2 : 3; node.setAttribute('service', 'WFS'); node.setAttribute('version', version); @@ -501,11 +541,10 @@ class WFS extends XMLFeature { node.setAttribute('handle', options.handle); } } - const schemaLocation = SCHEMA_LOCATIONS[version]; node.setAttributeNS( XML_SCHEMA_INSTANCE_URI, 'xsi:schemaLocation', - schemaLocation + SCHEMA_LOCATIONS[version] ); const featurePrefix = options.featurePrefix ? options.featurePrefix @@ -514,6 +553,7 @@ class WFS extends XMLFeature { obj = assign( {node: node}, { + version, 'featureNS': options.featureNS, 'featureType': options.featureType, 'featurePrefix': featurePrefix, @@ -535,6 +575,7 @@ class WFS extends XMLFeature { obj = assign( {node: node}, { + version, 'featureNS': options.featureNS, 'featureType': options.featureType, 'featurePrefix': featurePrefix, @@ -555,7 +596,8 @@ class WFS extends XMLFeature { if (deletes) { pushSerializeAndPop( { - node: node, + node, + version, 'featureNS': options.featureNS, 'featureType': options.featureType, 'featurePrefix': featurePrefix, @@ -571,7 +613,8 @@ class WFS extends XMLFeature { if (options.nativeElements) { pushSerializeAndPop( { - node: node, + node, + version, 'featureNS': options.featureNS, 'featureType': options.featureType, 'featurePrefix': featurePrefix, @@ -644,6 +687,11 @@ const OGC_FID_PARSERS = { return node.getAttribute('fid'); }), }, + 'http://www.opengis.net/ogc/1.1': { + 'FeatureId': makeArrayPusher(function (node, objectStack) { + return node.getAttribute('fid'); + }), + }, }; /** @@ -662,6 +710,9 @@ const INSERT_RESULTS_PARSERS = { 'http://www.opengis.net/wfs': { 'Feature': fidParser, }, + 'http://www.opengis.net/wfs/2.0': { + 'Feature': fidParser, + }, }; /** @@ -698,8 +749,11 @@ function writeFeature(node, feature, objectStack) { * @param {Array<*>} objectStack Node stack. */ function writeOgcFidFilter(node, fid, objectStack) { - const filter = createElementNS(OGCNS, 'Filter'); - const child = createElementNS(OGCNS, 'FeatureId'); + const context = objectStack[objectStack.length - 1]; + const version = context['version']; + const ns = OGCNS[version]; + const filter = createElementNS(ns, 'Filter'); + const child = createElementNS(ns, 'FeatureId'); filter.appendChild(child); child.setAttribute('fid', /** @type {string} */ (fid)); node.appendChild(filter); @@ -749,6 +803,7 @@ function writeDelete(node, feature, objectStack) { function writeUpdate(node, feature, objectStack) { const context = objectStack[objectStack.length - 1]; assert(feature.getId() !== undefined, 27); // Features must have an id set + const version = context['version']; const featureType = context['featureType']; const featurePrefix = context['featurePrefix']; const featureNS = context['featureNS']; @@ -775,6 +830,7 @@ function writeUpdate(node, feature, objectStack) { } pushSerializeAndPop( /** @type {import("../xml.js").NodeStackItem} */ ({ + version, 'gmlVersion': context['gmlVersion'], node: node, 'hasZ': context['hasZ'], @@ -795,13 +851,15 @@ function writeUpdate(node, feature, objectStack) { * @param {Array<*>} objectStack Node stack. */ function writeProperty(node, pair, objectStack) { - const name = createElementNS(WFSNS, 'Name'); const context = objectStack[objectStack.length - 1]; + const version = context['version']; + const ns = WFSNS[version]; + const name = createElementNS(ns, 'Name'); const gmlVersion = context['gmlVersion']; node.appendChild(name); writeStringTextNode(name, pair.name); if (pair.value !== undefined && pair.value !== null) { - const value = createElementNS(WFSNS, 'Value'); + const value = createElementNS(ns, 'Value'); node.appendChild(value); if ( pair.value && @@ -843,6 +901,9 @@ const GETFEATURE_SERIALIZERS = { 'http://www.opengis.net/wfs': { 'Query': makeChildAppender(writeQuery), }, + 'http://www.opengis.net/wfs/2.0': { + 'Query': makeChildAppender(writeQuery), + }, 'http://www.opengis.net/ogc': { 'During': makeChildAppender(writeDuringFilter), 'And': makeChildAppender(writeLogicalFilter), @@ -862,6 +923,25 @@ const GETFEATURE_SERIALIZERS = { 'PropertyIsBetween': makeChildAppender(writeIsBetweenFilter), 'PropertyIsLike': makeChildAppender(writeIsLikeFilter), }, + 'http://www.opengis.net/ogc/1.1': { + 'During': makeChildAppender(writeDuringFilter), + 'And': makeChildAppender(writeLogicalFilter), + 'Or': makeChildAppender(writeLogicalFilter), + 'Not': makeChildAppender(writeNotFilter), + 'BBOX': makeChildAppender(writeBboxFilter), + 'Contains': makeChildAppender(writeContainsFilter), + 'Intersects': makeChildAppender(writeIntersectsFilter), + 'Within': makeChildAppender(writeWithinFilter), + 'PropertyIsEqualTo': makeChildAppender(writeComparisonFilter), + 'PropertyIsNotEqualTo': makeChildAppender(writeComparisonFilter), + 'PropertyIsLessThan': makeChildAppender(writeComparisonFilter), + 'PropertyIsLessThanOrEqualTo': makeChildAppender(writeComparisonFilter), + 'PropertyIsGreaterThan': makeChildAppender(writeComparisonFilter), + 'PropertyIsGreaterThanOrEqualTo': makeChildAppender(writeComparisonFilter), + 'PropertyIsNull': makeChildAppender(writeIsNullFilter), + 'PropertyIsBetween': makeChildAppender(writeIsBetweenFilter), + 'PropertyIsLike': makeChildAppender(writeIsLikeFilter), + }, }; /** @@ -871,6 +951,7 @@ const GETFEATURE_SERIALIZERS = { */ function writeQuery(node, featureType, objectStack) { const context = /** @type {Object} */ (objectStack[objectStack.length - 1]); + const version = context['version']; const featurePrefix = context['featurePrefix']; const featureNS = context['featureNS']; const propertyNames = context['propertyNames']; @@ -903,7 +984,7 @@ function writeQuery(node, featureType, objectStack) { ); const filter = context['filter']; if (filter) { - const child = createElementNS(OGCNS, 'Filter'); + const child = createElementNS(OGCNS[version], 'Filter'); node.appendChild(child); writeFilterCondition(child, filter, objectStack); } @@ -915,8 +996,10 @@ function writeQuery(node, featureType, objectStack) { * @param {Array<*>} objectStack Node stack. */ function writeFilterCondition(node, filter, objectStack) { + const context = /** @type {Object} */ (objectStack[objectStack.length - 1]); /** @type {import("../xml.js").NodeStackItem} */ const item = {node: node}; + assign(item, {context: context}); pushSerializeAndPop( item, GETFEATURE_SERIALIZERS, @@ -932,10 +1015,12 @@ function writeFilterCondition(node, filter, objectStack) { * @param {Array<*>} objectStack Node stack. */ function writeBboxFilter(node, filter, objectStack) { - const context = objectStack[objectStack.length - 1]; + const parent = /** @type {Object} */ (objectStack[objectStack.length - 1]); + const context = parent['context']; context['srsName'] = filter.srsName; + const ns = OGCNS[context['version']]; - writeOgcPropertyName(node, filter.geometryName); + writeOgcPropertyName(ns, node, filter.geometryName); GML3.prototype.writeGeometryElement(node, filter.extent, objectStack); } @@ -945,10 +1030,12 @@ function writeBboxFilter(node, filter, objectStack) { * @param {Array<*>} objectStack Node stack. */ function writeContainsFilter(node, filter, objectStack) { - const context = objectStack[objectStack.length - 1]; + const parent = /** @type {Object} */ (objectStack[objectStack.length - 1]); + const context = parent['context']; context['srsName'] = filter.srsName; + const ns = OGCNS[context['version']]; - writeOgcPropertyName(node, filter.geometryName); + writeOgcPropertyName(ns, node, filter.geometryName); GML3.prototype.writeGeometryElement(node, filter.geometry, objectStack); } @@ -958,10 +1045,12 @@ function writeContainsFilter(node, filter, objectStack) { * @param {Array<*>} objectStack Node stack. */ function writeIntersectsFilter(node, filter, objectStack) { - const context = objectStack[objectStack.length - 1]; + const parent = /** @type {Object} */ (objectStack[objectStack.length - 1]); + const context = parent['context']; context['srsName'] = filter.srsName; + const ns = OGCNS[context['version']]; - writeOgcPropertyName(node, filter.geometryName); + writeOgcPropertyName(ns, node, filter.geometryName); GML3.prototype.writeGeometryElement(node, filter.geometry, objectStack); } @@ -971,10 +1060,12 @@ function writeIntersectsFilter(node, filter, objectStack) { * @param {Array<*>} objectStack Node stack. */ function writeWithinFilter(node, filter, objectStack) { - const context = objectStack[objectStack.length - 1]; + const parent = /** @type {Object} */ (objectStack[objectStack.length - 1]); + const context = parent['context']; context['srsName'] = filter.srsName; + const ns = OGCNS[context['version']]; - writeOgcPropertyName(node, filter.geometryName); + writeOgcPropertyName(ns, node, filter.geometryName); GML3.prototype.writeGeometryElement(node, filter.geometry, objectStack); } @@ -1007,8 +1098,11 @@ function writeDuringFilter(node, filter, objectStack) { * @param {Array<*>} objectStack Node stack. */ function writeLogicalFilter(node, filter, objectStack) { + const parent = /** @type {Object} */ (objectStack[objectStack.length - 1]); + const context = parent['context']; /** @type {import("../xml.js").NodeStackItem} */ const item = {node: node}; + assign(item, {context}); const conditions = filter.conditions; for (let i = 0, ii = conditions.length; i < ii; ++i) { const condition = conditions[i]; @@ -1028,8 +1122,11 @@ function writeLogicalFilter(node, filter, objectStack) { * @param {Array<*>} objectStack Node stack. */ function writeNotFilter(node, filter, objectStack) { + const parent = /** @type {Object} */ (objectStack[objectStack.length - 1]); + const context = parent['context']; /** @type {import("../xml.js").NodeStackItem} */ const item = {node: node}; + assign(item, {context}); const condition = filter.condition; pushSerializeAndPop( item, @@ -1046,11 +1143,14 @@ function writeNotFilter(node, filter, objectStack) { * @param {Array<*>} objectStack Node stack. */ function writeComparisonFilter(node, filter, objectStack) { + const parent = /** @type {Object} */ (objectStack[objectStack.length - 1]); + const context = parent['context']; + const ns = OGCNS[context['version']]; if (filter.matchCase !== undefined) { node.setAttribute('matchCase', filter.matchCase.toString()); } - writeOgcPropertyName(node, filter.propertyName); - writeOgcLiteral(node, '' + filter.expression); + writeOgcPropertyName(ns, node, filter.propertyName); + writeOgcLiteral(ns, node, '' + filter.expression); } /** @@ -1059,7 +1159,10 @@ function writeComparisonFilter(node, filter, objectStack) { * @param {Array<*>} objectStack Node stack. */ function writeIsNullFilter(node, filter, objectStack) { - writeOgcPropertyName(node, filter.propertyName); + const parent = /** @type {Object} */ (objectStack[objectStack.length - 1]); + const context = parent['context']; + const ns = OGCNS[context['version']]; + writeOgcPropertyName(ns, node, filter.propertyName); } /** @@ -1068,15 +1171,19 @@ function writeIsNullFilter(node, filter, objectStack) { * @param {Array<*>} objectStack Node stack. */ function writeIsBetweenFilter(node, filter, objectStack) { - writeOgcPropertyName(node, filter.propertyName); + const parent = /** @type {Object} */ (objectStack[objectStack.length - 1]); + const context = parent['context']; + const ns = OGCNS[context['version']]; - const lowerBoundary = createElementNS(OGCNS, 'LowerBoundary'); + writeOgcPropertyName(ns, node, filter.propertyName); + + const lowerBoundary = createElementNS(ns, 'LowerBoundary'); node.appendChild(lowerBoundary); - writeOgcLiteral(lowerBoundary, '' + filter.lowerBoundary); + writeOgcLiteral(ns, lowerBoundary, '' + filter.lowerBoundary); - const upperBoundary = createElementNS(OGCNS, 'UpperBoundary'); + const upperBoundary = createElementNS(ns, 'UpperBoundary'); node.appendChild(upperBoundary); - writeOgcLiteral(upperBoundary, '' + filter.upperBoundary); + writeOgcLiteral(ns, upperBoundary, '' + filter.upperBoundary); } /** @@ -1085,41 +1192,47 @@ function writeIsBetweenFilter(node, filter, objectStack) { * @param {Array<*>} objectStack Node stack. */ function writeIsLikeFilter(node, filter, objectStack) { + const parent = /** @type {Object} */ (objectStack[objectStack.length - 1]); + const context = parent['context']; + const ns = OGCNS[context['version']]; node.setAttribute('wildCard', filter.wildCard); node.setAttribute('singleChar', filter.singleChar); node.setAttribute('escapeChar', filter.escapeChar); if (filter.matchCase !== undefined) { node.setAttribute('matchCase', filter.matchCase.toString()); } - writeOgcPropertyName(node, filter.propertyName); - writeOgcLiteral(node, '' + filter.pattern); + writeOgcPropertyName(ns, node, filter.propertyName); + writeOgcLiteral(ns, node, '' + filter.pattern); } /** + * @param {string} ns Namespace. * @param {string} tagName Tag name. * @param {Node} node Node. * @param {string} value Value. */ -function writeOgcExpression(tagName, node, value) { - const property = createElementNS(OGCNS, tagName); +function writeOgcExpression(ns, tagName, node, value) { + const property = createElementNS(ns, tagName); writeStringTextNode(property, value); node.appendChild(property); } /** + * @param {string} ns Namespace. * @param {Node} node Node. * @param {string} value PropertyName value. */ -function writeOgcPropertyName(node, value) { - writeOgcExpression('PropertyName', node, value); +function writeOgcPropertyName(ns, node, value) { + writeOgcExpression(ns, 'PropertyName', node, value); } /** + * @param {string} ns Namespace. * @param {Node} node Node. * @param {string} value PropertyName value. */ -function writeOgcLiteral(node, value) { - writeOgcExpression('Literal', node, value); +function writeOgcLiteral(ns, node, value) { + writeOgcExpression(ns, 'Literal', node, value); } /** @@ -1139,12 +1252,20 @@ function writeTimeInstant(node, time) { * Encode filter as WFS `Filter` and return the Node. * * @param {import("./filter/Filter.js").default} filter Filter. + * @param {string} version Version. * @return {Node} Result. * @api */ -export function writeFilter(filter) { - const child = createElementNS(OGCNS, 'Filter'); - writeFilterCondition(child, filter, []); +export function writeFilter(filter, version) { + const child = createElementNS(OGCNS[version], 'Filter'); + const context = { + node: child, + }; + assign(context, { + 'version': version, + 'filter': filter, + }); + writeFilterCondition(child, filter, [context]); return child; } diff --git a/test/spec/ol/format/wfs.test.js b/test/spec/ol/format/wfs.test.js index 94fe9abe9e..058aab97af 100644 --- a/test/spec/ol/format/wfs.test.js +++ b/test/spec/ol/format/wfs.test.js @@ -1376,7 +1376,8 @@ describe('ol.format.WFS', function () { andFilter( likeFilter('name', 'Mississippi*'), equalToFilter('waterway', 'riverbank') - ) + ), + '1.1.0' ); expect(serialized).to.xmleql(parse(text)); }); From c675ce5217be4ac1efa37f0178404e0aa9ca7568 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Harrtell?= Date: Sun, 9 Aug 2020 22:47:03 +0200 Subject: [PATCH 024/525] Fix srsName wrong context --- src/ol/format/WFS.js | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/ol/format/WFS.js b/src/ol/format/WFS.js index d8d277100b..4d317203e6 100644 --- a/src/ol/format/WFS.js +++ b/src/ol/format/WFS.js @@ -301,7 +301,7 @@ class WFS extends XMLFeature { readFeaturesFromNode(node, opt_options) { /** @type {import("../xml.js").NodeStackItem} */ const context = { - node: node, + node, }; assign(context, { 'featureType': this.featureType_, @@ -494,7 +494,7 @@ class WFS extends XMLFeature { ); /** @type {import("../xml.js").NodeStackItem} */ const context = { - node: node, + node, }; assign(context, { 'version': this.version_, @@ -551,7 +551,7 @@ class WFS extends XMLFeature { : FEATURE_PREFIX; if (inserts) { obj = assign( - {node: node}, + {node}, { version, 'featureNS': options.featureNS, @@ -573,7 +573,7 @@ class WFS extends XMLFeature { } if (updates) { obj = assign( - {node: node}, + {node}, { version, 'featureNS': options.featureNS, @@ -832,7 +832,7 @@ function writeUpdate(node, feature, objectStack) { /** @type {import("../xml.js").NodeStackItem} */ ({ version, 'gmlVersion': context['gmlVersion'], - node: node, + node, 'hasZ': context['hasZ'], 'srsName': context['srsName'], }), @@ -998,8 +998,8 @@ function writeQuery(node, featureType, objectStack) { function writeFilterCondition(node, filter, objectStack) { const context = /** @type {Object} */ (objectStack[objectStack.length - 1]); /** @type {import("../xml.js").NodeStackItem} */ - const item = {node: node}; - assign(item, {context: context}); + const item = {node}; + assign(item, {context}); pushSerializeAndPop( item, GETFEATURE_SERIALIZERS, @@ -1017,7 +1017,7 @@ function writeFilterCondition(node, filter, objectStack) { function writeBboxFilter(node, filter, objectStack) { const parent = /** @type {Object} */ (objectStack[objectStack.length - 1]); const context = parent['context']; - context['srsName'] = filter.srsName; + parent['srsName'] = filter.srsName; const ns = OGCNS[context['version']]; writeOgcPropertyName(ns, node, filter.geometryName); @@ -1032,7 +1032,7 @@ function writeBboxFilter(node, filter, objectStack) { function writeContainsFilter(node, filter, objectStack) { const parent = /** @type {Object} */ (objectStack[objectStack.length - 1]); const context = parent['context']; - context['srsName'] = filter.srsName; + parent['srsName'] = filter.srsName; const ns = OGCNS[context['version']]; writeOgcPropertyName(ns, node, filter.geometryName); @@ -1047,7 +1047,7 @@ function writeContainsFilter(node, filter, objectStack) { function writeIntersectsFilter(node, filter, objectStack) { const parent = /** @type {Object} */ (objectStack[objectStack.length - 1]); const context = parent['context']; - context['srsName'] = filter.srsName; + parent['srsName'] = filter.srsName; const ns = OGCNS[context['version']]; writeOgcPropertyName(ns, node, filter.geometryName); @@ -1062,7 +1062,7 @@ function writeIntersectsFilter(node, filter, objectStack) { function writeWithinFilter(node, filter, objectStack) { const parent = /** @type {Object} */ (objectStack[objectStack.length - 1]); const context = parent['context']; - context['srsName'] = filter.srsName; + parent['srsName'] = filter.srsName; const ns = OGCNS[context['version']]; writeOgcPropertyName(ns, node, filter.geometryName); @@ -1101,7 +1101,7 @@ function writeLogicalFilter(node, filter, objectStack) { const parent = /** @type {Object} */ (objectStack[objectStack.length - 1]); const context = parent['context']; /** @type {import("../xml.js").NodeStackItem} */ - const item = {node: node}; + const item = {node}; assign(item, {context}); const conditions = filter.conditions; for (let i = 0, ii = conditions.length; i < ii; ++i) { @@ -1125,7 +1125,7 @@ function writeNotFilter(node, filter, objectStack) { const parent = /** @type {Object} */ (objectStack[objectStack.length - 1]); const context = parent['context']; /** @type {import("../xml.js").NodeStackItem} */ - const item = {node: node}; + const item = {node}; assign(item, {context}); const condition = filter.condition; pushSerializeAndPop( From daa0824b17c585d5b9b48c1693e4a1fb35c3797d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Harrtell?= Date: Sun, 9 Aug 2020 23:28:22 +0200 Subject: [PATCH 025/525] Refactor transaction serialization --- src/ol/format/WFS.js | 127 ++++++++++++++++++------------------------- 1 file changed, 54 insertions(+), 73 deletions(-) diff --git a/src/ol/format/WFS.js b/src/ol/format/WFS.js index 4d317203e6..bf7f73f2ad 100644 --- a/src/ol/format/WFS.js +++ b/src/ol/format/WFS.js @@ -529,12 +529,11 @@ class WFS extends XMLFeature { const objectStack = []; const version = options.version ? options.version : this.version_; const node = createElementNS(WFSNS[version], 'Transaction'); - const gmlVersion = version === '1.0.0' ? 2 : 3; + node.setAttribute('service', 'WFS'); node.setAttribute('version', version); let baseObj; /** @type {import("../xml.js").NodeStackItem} */ - let obj; if (options) { baseObj = options.gmlOptions ? options.gmlOptions : {}; if (options.handle) { @@ -546,85 +545,23 @@ class WFS extends XMLFeature { 'xsi:schemaLocation', SCHEMA_LOCATIONS[version] ); - const featurePrefix = options.featurePrefix - ? options.featurePrefix - : FEATURE_PREFIX; + + const request = createTransactionRequest(node, baseObj, version, options); if (inserts) { - obj = assign( - {node}, - { - version, - 'featureNS': options.featureNS, - 'featureType': options.featureType, - 'featurePrefix': featurePrefix, - 'gmlVersion': gmlVersion, - 'hasZ': options.hasZ, - 'srsName': options.srsName, - } - ); - assign(obj, baseObj); - pushSerializeAndPop( - obj, - TRANSACTION_SERIALIZERS, - makeSimpleNodeFactory('Insert'), - inserts, - objectStack - ); + serializeTransactionRequest('Insert', inserts, objectStack, request); } if (updates) { - obj = assign( - {node}, - { - version, - 'featureNS': options.featureNS, - 'featureType': options.featureType, - 'featurePrefix': featurePrefix, - 'gmlVersion': gmlVersion, - 'hasZ': options.hasZ, - 'srsName': options.srsName, - } - ); - assign(obj, baseObj); - pushSerializeAndPop( - obj, - TRANSACTION_SERIALIZERS, - makeSimpleNodeFactory('Update'), - updates, - objectStack - ); + serializeTransactionRequest('Update', updates, objectStack, request); } if (deletes) { - pushSerializeAndPop( - { - node, - version, - 'featureNS': options.featureNS, - 'featureType': options.featureType, - 'featurePrefix': featurePrefix, - 'gmlVersion': gmlVersion, - 'srsName': options.srsName, - }, - TRANSACTION_SERIALIZERS, - makeSimpleNodeFactory('Delete'), - deletes, - objectStack - ); + serializeTransactionRequest('Delete', deletes, objectStack, request); } if (options.nativeElements) { - pushSerializeAndPop( - { - node, - version, - 'featureNS': options.featureNS, - 'featureType': options.featureType, - 'featurePrefix': featurePrefix, - 'gmlVersion': gmlVersion, - 'srsName': options.srsName, - }, - TRANSACTION_SERIALIZERS, - makeSimpleNodeFactory('Native'), + serializeTransactionRequest( + 'Native', options.nativeElements, - objectStack + objectStack, + request ); } return node; @@ -668,6 +605,50 @@ class WFS extends XMLFeature { } } +/** + * @param {Element} node Node. + * @param {*} baseObj Base object. + * @param {string} version Version. + * @param {WriteTransactionOptions} options Options. + * @return {Object} Request object. + */ +function createTransactionRequest(node, baseObj, version, options) { + const featurePrefix = options.featurePrefix + ? options.featurePrefix + : FEATURE_PREFIX; + const gmlVersion = version === '1.0.0' ? 2 : 3; + const obj = assign( + {node}, + { + version, + 'featureNS': options.featureNS, + 'featureType': options.featureType, + 'featurePrefix': featurePrefix, + 'gmlVersion': gmlVersion, + 'hasZ': options.hasZ, + 'srsName': options.srsName, + }, + baseObj + ); + return obj; +} + +/** + * @param {string} type Request type. + * @param {Array} features Features. + * @param {Array<*>} objectStack Object stack. + * @param {Element} request Transaction Request. + */ +function serializeTransactionRequest(type, features, objectStack, request) { + pushSerializeAndPop( + request, + TRANSACTION_SERIALIZERS, + makeSimpleNodeFactory(type), + features, + objectStack + ); +} + /** * @param {Element} node Node. * @param {Array<*>} objectStack Object stack. From a58bff09810b1d64f2eaab107678c853222d7138 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Harrtell?= Date: Mon, 10 Aug 2020 03:50:39 +0200 Subject: [PATCH 026/525] Initial GetFeature verification --- src/ol/format/WFS.js | 48 +++++++++++++++++--- src/ol/format/filter.js | 5 ++ src/ol/format/filter/ResourceId.js | 25 ++++++++++ test/spec/ol/format/wfs.test.js | 25 ++++++++++ test/spec/ol/format/wfs/2.0.0/GetFeature.xml | 20 ++++++++ 5 files changed, 116 insertions(+), 7 deletions(-) create mode 100644 src/ol/format/filter/ResourceId.js create mode 100644 test/spec/ol/format/wfs/2.0.0/GetFeature.xml diff --git a/src/ol/format/WFS.js b/src/ol/format/WFS.js index bf7f73f2ad..0c94a31819 100644 --- a/src/ol/format/WFS.js +++ b/src/ol/format/WFS.js @@ -205,16 +205,20 @@ const WFSNS = { }; /** - * @type {string} + * @type {Object} */ -const FESNS = 'http://www.opengis.net/fes'; +const FESNS = { + '2.0.0': 'http://www.opengis.net/fes/2.0', + '1.1.0': 'http://www.opengis.net/fes', + '1.0.0': 'http://www.opengis.net/fes', +}; /** * @type {Object} */ const SCHEMA_LOCATIONS = { '2.0.0': - 'http://www.opengis.net/wfs/2.0 http://schemas.opengis.net/wfs/2.0.0/wfs.xsd', + 'http://www.opengis.net/wfs/2.0 http://schemas.opengis.net/wfs/2.0/wfs.xsd', '1.1.0': 'http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.1.0/wfs.xsd', '1.0.0': @@ -904,7 +908,7 @@ const GETFEATURE_SERIALIZERS = { 'PropertyIsBetween': makeChildAppender(writeIsBetweenFilter), 'PropertyIsLike': makeChildAppender(writeIsLikeFilter), }, - 'http://www.opengis.net/ogc/1.1': { + 'http://www.opengis.net/fes/2.0': { 'During': makeChildAppender(writeDuringFilter), 'And': makeChildAppender(writeLogicalFilter), 'Or': makeChildAppender(writeLogicalFilter), @@ -912,6 +916,7 @@ const GETFEATURE_SERIALIZERS = { 'BBOX': makeChildAppender(writeBboxFilter), 'Contains': makeChildAppender(writeContainsFilter), 'Intersects': makeChildAppender(writeIntersectsFilter), + 'ResourceId': makeChildAppender(writeResourceIdFilter), 'Within': makeChildAppender(writeWithinFilter), 'PropertyIsEqualTo': makeChildAppender(writeComparisonFilter), 'PropertyIsNotEqualTo': makeChildAppender(writeComparisonFilter), @@ -944,7 +949,13 @@ function writeQuery(node, featureType, objectStack) { } else { typeName = featureType; } - node.setAttribute('typeName', typeName); + let typeNameAttr; + if (version === '2.0.0') { + typeNameAttr = 'typeNames'; + } else { + typeNameAttr = 'typeName'; + } + node.setAttribute(typeNameAttr, typeName); if (srsName) { node.setAttribute('srsName', srsName); } @@ -965,7 +976,7 @@ function writeQuery(node, featureType, objectStack) { ); const filter = context['filter']; if (filter) { - const child = createElementNS(OGCNS[version], 'Filter'); + const child = createElementNS(getFilterNS(version), 'Filter'); node.appendChild(child); writeFilterCondition(child, filter, objectStack); } @@ -1035,6 +1046,15 @@ function writeIntersectsFilter(node, filter, objectStack) { GML3.prototype.writeGeometryElement(node, filter.geometry, objectStack); } +/** + * @param {Element} node Element. + * @param {import("./filter/ResourceId.js").default} filter Filter. + * @param {Array<*>} objectStack Node stack. + */ +function writeResourceIdFilter(node, filter, objectStack) { + node.setAttribute('rid', /** @type {string} */ (filter.rid)); +} + /** * @param {Node} node Node. * @param {import("./filter/Within.js").default} filter Filter. @@ -1056,7 +1076,11 @@ function writeWithinFilter(node, filter, objectStack) { * @param {Array<*>} objectStack Node stack. */ function writeDuringFilter(node, filter, objectStack) { - const valueReference = createElementNS(FESNS, 'ValueReference'); + const parent = /** @type {Object} */ (objectStack[objectStack.length - 1]); + const context = parent['context']; + const version = context['version']; + const ns = FESNS[version]; + const valueReference = createElementNS(ns, 'ValueReference'); writeStringTextNode(valueReference, filter.propertyName); node.appendChild(valueReference); @@ -1271,4 +1295,14 @@ function writeGetFeature(node, featureTypes, objectStack) { ); } +function getFilterNS(version) { + let ns; + if (version === '2.0.0') { + ns = FESNS[version]; + } else { + ns = OGCNS[version]; + } + return ns; +} + export default WFS; diff --git a/src/ol/format/filter.js b/src/ol/format/filter.js index c4d2c9615d..99490840f0 100644 --- a/src/ol/format/filter.js +++ b/src/ol/format/filter.js @@ -17,6 +17,7 @@ import LessThanOrEqualTo from './filter/LessThanOrEqualTo.js'; import Not from './filter/Not.js'; import NotEqualTo from './filter/NotEqualTo.js'; import Or from './filter/Or.js'; +import ResourceId from './filter/ResourceId.js'; import Within from './filter/Within.js'; /** @@ -260,3 +261,7 @@ export function like( export function during(propertyName, begin, end) { return new During(propertyName, begin, end); } + +export function resourceId(rid) { + return new ResourceId(rid); +} diff --git a/src/ol/format/filter/ResourceId.js b/src/ol/format/filter/ResourceId.js new file mode 100644 index 0000000000..d68a6bcf75 --- /dev/null +++ b/src/ol/format/filter/ResourceId.js @@ -0,0 +1,25 @@ +/** + * @module ol/format/filter/ResourceId + */ +import Filter from './Filter.js'; + +/** + * @classdesc + * + * @abstract + */ +class ResourceId extends Filter { + /** + * @param {!string} rid Resource ID. + */ + constructor(rid) { + super('ResourceId'); + + /** + * @type {!string} + */ + this.rid = rid; + } +} + +export default ResourceId; diff --git a/test/spec/ol/format/wfs.test.js b/test/spec/ol/format/wfs.test.js index 058aab97af..89f39d13cc 100644 --- a/test/spec/ol/format/wfs.test.js +++ b/test/spec/ol/format/wfs.test.js @@ -27,6 +27,7 @@ import { like as likeFilter, not as notFilter, or as orFilter, + resourceId as resourceIdFilter, within as withinFilter, } from '../../../../src/ol/format/filter.js'; import {parse} from '../../../../src/ol/xml.js'; @@ -1382,4 +1383,28 @@ describe('ol.format.WFS', function () { expect(serialized).to.xmleql(parse(text)); }); }); + + describe('WFS 2.0.0', function () { + let getFeatureXml; + before(function (done) { + afterLoadText('spec/ol/format/wfs/2.0.0/GetFeature.xml', function (xml) { + getFeatureXml = xml; + done(); + }); + }); + + it('GetFeature', function () { + const wfs = new WFS({ + version: '2.0.0', + }); + const filter = resourceIdFilter('bugsites.3'); + const serialized = wfs.writeGetFeature({ + featureNS: 'http://www.openplans.org/spearfish', + featureTypes: ['bugsites'], + featurePrefix: 'sf', + filter, + }); + expect(serialized).to.xmleql(parse(getFeatureXml)); + }); + }); }); diff --git a/test/spec/ol/format/wfs/2.0.0/GetFeature.xml b/test/spec/ol/format/wfs/2.0.0/GetFeature.xml new file mode 100644 index 0000000000..20e1b43f8c --- /dev/null +++ b/test/spec/ol/format/wfs/2.0.0/GetFeature.xml @@ -0,0 +1,20 @@ + + + + + + + + + From 6194611e5ab9c635a48fb8f7efb36cda02cb72d7 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 10 Aug 2020 09:00:53 +0000 Subject: [PATCH 027/525] Bump mocha from 8.1.0 to 8.1.1 Bumps [mocha](https://github.com/mochajs/mocha) from 8.1.0 to 8.1.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/v8.1.0...v8.1.1) 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 30c7d83bb5..f60a4b8f38 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9010,9 +9010,9 @@ "dev": true }, "mocha": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.1.0.tgz", - "integrity": "sha512-sI0gaI1I/jPVu3KFpnveWGadfe3JNBAENqgTUPgLZAUppu725zS2mrVztzAgIR8DUscuS4doEBTx9LATC+HSeA==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.1.1.tgz", + "integrity": "sha512-p7FuGlYH8t7gaiodlFreseLxEmxTgvyG9RgPHODFPySNhwUehu8NIb0vdSt3WFckSneswZ0Un5typYcWElk7HQ==", "dev": true, "requires": { "ansi-colors": "4.1.1", diff --git a/package.json b/package.json index c7ec01a591..5360e55b88 100644 --- a/package.json +++ b/package.json @@ -85,7 +85,7 @@ "karma-webpack": "^4.0.0-rc.2", "loglevelnext": "^4.0.1", "marked": "1.1.1", - "mocha": "8.1.0", + "mocha": "8.1.1", "pixelmatch": "^5.1.0", "pngjs": "^5.0.0", "proj4": "2.6.2", From dcc7dc5fd85b200734f5a8f15bdeaac980513940 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 10 Aug 2020 09:01:31 +0000 Subject: [PATCH 028/525] Bump terser-webpack-plugin from 3.0.8 to 4.0.0 Bumps [terser-webpack-plugin](https://github.com/webpack-contrib/terser-webpack-plugin) from 3.0.8 to 4.0.0. - [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/v3.0.8...v4.0.0) Signed-off-by: dependabot-preview[bot] --- package-lock.json | 21 ++++++++++++++++----- package.json | 2 +- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 30c7d83bb5..d8a85db421 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12154,19 +12154,19 @@ } }, "terser-webpack-plugin": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-3.0.8.tgz", - "integrity": "sha512-ygwK8TYMRTYtSyLB2Mhnt90guQh989CIq/mL/2apwi6rA15Xys4ydNUiH4ah6EZCfQxSk26ZFQilZ4IQ6IZw6A==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-4.0.0.tgz", + "integrity": "sha512-Gb/bmPMavJsDTYiIocakp9OJhrIBnYrWa5VM0Bb2RngWmszeQUN1xFNh2E8Re+9Cj3/sPrA50Jj/q0nzgLAUuw==", "dev": true, "requires": { "cacache": "^15.0.5", "find-cache-dir": "^3.3.1", - "jest-worker": "^26.1.0", + "jest-worker": "^26.2.1", "p-limit": "^3.0.2", "schema-utils": "^2.6.6", "serialize-javascript": "^4.0.0", "source-map": "^0.6.1", - "terser": "^4.8.0", + "terser": "^5.0.0", "webpack-sources": "^1.4.3" }, "dependencies": { @@ -12402,6 +12402,17 @@ "has-flag": "^4.0.0" } }, + "terser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.0.0.tgz", + "integrity": "sha512-olH2DwGINoSuEpSGd+BsPuAQaA3OrHnHnFL/rDB2TVNc3srUbz/rq/j2BlF4zDXI+JqAvGr86bIm1R2cJgZ3FA==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + } + }, "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", diff --git a/package.json b/package.json index c7ec01a591..82404ad9cb 100644 --- a/package.json +++ b/package.json @@ -98,7 +98,7 @@ "serve-static": "^1.14.0", "shx": "^0.3.2", "sinon": "^9.0.0", - "terser-webpack-plugin": "^3.0.0", + "terser-webpack-plugin": "^4.0.0", "typescript": "^3.8.3", "url-polyfill": "^1.1.5", "walk": "^2.3.9", From 6f1b327c1a9612ee17bcb0ecce7ccc3fafc18670 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 10 Aug 2020 09:02:08 +0000 Subject: [PATCH 029/525] Bump worker-loader from 3.0.0 to 3.0.1 Bumps [worker-loader](https://github.com/webpack-contrib/worker-loader) from 3.0.0 to 3.0.1. - [Release notes](https://github.com/webpack-contrib/worker-loader/releases) - [Changelog](https://github.com/webpack-contrib/worker-loader/blob/master/CHANGELOG.md) - [Commits](https://github.com/webpack-contrib/worker-loader/compare/v3.0.0...v3.0.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 30c7d83bb5..9a3b6626f7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13538,9 +13538,9 @@ } }, "worker-loader": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/worker-loader/-/worker-loader-3.0.0.tgz", - "integrity": "sha512-TNDhyNxUfOGkxNDH28bkrfS4d2BSKYtc3Jznkhhpra9q3p5Su9mRD9Rso5uUNCK6vsEdlceTCJ7aMcluJAotZw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/worker-loader/-/worker-loader-3.0.1.tgz", + "integrity": "sha512-rTDeHzZtzOnF18m4eH1DPj7IFfyjYXIew4kwipsKtozzXpctOQLowtsi8PwfDel5B9112tVtUAj444yeDMtetg==", "dev": true, "requires": { "loader-utils": "^2.0.0", From 6d04653077639b5ce6f58bfafca0824ff265d9dd Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 10 Aug 2020 09:02:52 +0000 Subject: [PATCH 030/525] Bump rollup-plugin-terser from 6.1.0 to 7.0.0 Bumps [rollup-plugin-terser](https://github.com/TrySound/rollup-plugin-terser) from 6.1.0 to 7.0.0. - [Release notes](https://github.com/TrySound/rollup-plugin-terser/releases) - [Commits](https://github.com/TrySound/rollup-plugin-terser/compare/v6.1.0...v7.0.0) Signed-off-by: dependabot-preview[bot] --- package-lock.json | 64 ++++++++++++++++++++++++++++++++++------------- package.json | 2 +- 2 files changed, 48 insertions(+), 18 deletions(-) diff --git a/package-lock.json b/package-lock.json index 30c7d83bb5..f146020c3a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7993,11 +7993,12 @@ } }, "jest-worker": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.0.0.tgz", - "integrity": "sha512-pPaYa2+JnwmiZjK9x7p9BoZht+47ecFCDFA/CJxspHzeDvQcfVBLWzCiWyo+EGrSiQMWZtCFo9iSvMZnAAo8vw==", + "version": "26.2.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.2.1.tgz", + "integrity": "sha512-+XcGMMJDTeEGncRb5M5Zq9P7K4sQ1sirhjdOxsN1462h6lFo9w59bl2LVQmdGEEeU3m+maZCkS2Tcc9SfCHO4A==", "dev": true, "requires": { + "@types/node": "*", "merge-stream": "^2.0.0", "supports-color": "^7.0.0" }, @@ -10839,27 +10840,56 @@ } }, "rollup-plugin-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-6.1.0.tgz", - "integrity": "sha512-4fB3M9nuoWxrwm39habpd4hvrbrde2W2GG4zEGPQg1YITNkM3Tqur5jSuXlWNzbv/2aMLJ+dZJaySc3GCD8oDw==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.0.tgz", + "integrity": "sha512-p/N3lLiFusCjYTLfVkoaiRTOGr5AESEaljMPH12MhOtoMkmTBhIAfuadrcWy4am1U0vU4WTxO9fi0K09O4CboQ==", "dev": true, "requires": { - "@babel/code-frame": "^7.8.3", - "jest-worker": "^26.0.0", - "serialize-javascript": "^3.0.0", - "terser": "^4.7.0" + "@babel/code-frame": "^7.10.4", + "jest-worker": "^26.2.1", + "serialize-javascript": "^4.0.0", + "terser": "^5.0.0" }, "dependencies": { - "serialize-javascript": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.0.0.tgz", - "integrity": "sha512-skZcHYw2vEX4bw90nAr2iTTsz6x2SrHEnfxgKYmZlvJYBEZrvbKtobJWlQ20zczKb3bsHHXXTYt48zBA7ni9cw==", + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", "dev": true }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, "terser": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.7.0.tgz", - "integrity": "sha512-Lfb0RiZcjRDXCC3OSHJpEkxJ9Qeqs6mp2v4jf2MHfy8vGERmVDuvjXdd/EnP5Deme5F2yBRBymKmKHCBg2echw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.0.0.tgz", + "integrity": "sha512-olH2DwGINoSuEpSGd+BsPuAQaA3OrHnHnFL/rDB2TVNc3srUbz/rq/j2BlF4zDXI+JqAvGr86bIm1R2cJgZ3FA==", "dev": true, "requires": { "commander": "^2.20.0", diff --git a/package.json b/package.json index c7ec01a591..6a6bc8e312 100644 --- a/package.json +++ b/package.json @@ -94,7 +94,7 @@ "rollup-plugin-babel": "^4.3.3", "rollup-plugin-commonjs": "^10.0.0", "rollup-plugin-node-resolve": "^5.2.0", - "rollup-plugin-terser": "^6.1.0", + "rollup-plugin-terser": "^7.0.0", "serve-static": "^1.14.0", "shx": "^0.3.2", "sinon": "^9.0.0", From 7bae616edb33e0d1aeaa3a820e101b929f4b6d8d Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 10 Aug 2020 09:03:40 +0000 Subject: [PATCH 031/525] Bump rollup from 2.23.0 to 2.23.1 Bumps [rollup](https://github.com/rollup/rollup) from 2.23.0 to 2.23.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/v2.23.0...v2.23.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 30c7d83bb5..291f8e9256 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10763,9 +10763,9 @@ } }, "rollup": { - "version": "2.23.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.23.0.tgz", - "integrity": "sha512-vLNmZFUGVwrnqNAJ/BvuLk1MtWzu4IuoqsH9UWK5AIdO3rt8/CSiJNvPvCIvfzrbNsqKbNzPAG1V2O4eTe2XZg==", + "version": "2.23.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.23.1.tgz", + "integrity": "sha512-Heyl885+lyN/giQwxA8AYT2GY3U+gOlTqVLrMQYno8Z1X9lAOpfXPiKiZCyPc25e9BLJM3Zlh957dpTlO4pa8A==", "dev": true, "requires": { "fsevents": "~2.1.2" From 5343b8c742808d9e52564b366584c7736efd47ee Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 10 Aug 2020 09:04:22 +0000 Subject: [PATCH 032/525] Bump @babel/core from 7.11.0 to 7.11.1 Bumps [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) from 7.11.0 to 7.11.1. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.11.1/packages/babel-core) Signed-off-by: dependabot-preview[bot] --- package-lock.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 30c7d83bb5..632edd7170 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,16 +25,16 @@ } }, "@babel/core": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.11.0.tgz", - "integrity": "sha512-mkLq8nwaXmDtFmRkQ8ED/eA2CnVw4zr7dCztKalZXBvdK5EeNUAesrrwUqjQEzFgomJssayzB0aqlOsP1vGLqg==", + "version": "7.11.1", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.11.1.tgz", + "integrity": "sha512-XqF7F6FWQdKGGWAzGELL+aCO1p+lRY5Tj5/tbT3St1G8NaH70jhhDIKknIZaDans0OQBG5wRAldROLHSt44BgQ==", "dev": true, "requires": { "@babel/code-frame": "^7.10.4", "@babel/generator": "^7.11.0", "@babel/helper-module-transforms": "^7.11.0", "@babel/helpers": "^7.10.4", - "@babel/parser": "^7.11.0", + "@babel/parser": "^7.11.1", "@babel/template": "^7.10.4", "@babel/traverse": "^7.11.0", "@babel/types": "^7.11.0", @@ -119,9 +119,9 @@ } }, "@babel/parser": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.0.tgz", - "integrity": "sha512-qvRvi4oI8xii8NllyEc4MDJjuZiNaRzyb7Y7lup1NqJV8TZHF4O27CcP+72WPn/k1zkgJ6WJfnIbk4jTsVAZHw==", + "version": "7.11.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.3.tgz", + "integrity": "sha512-REo8xv7+sDxkKvoxEywIdsNFiZLybwdI7hcT5uEPyQrSMB4YQ973BfC9OOrD/81MaIjh6UxdulIQXkjmiH3PcA==", "dev": true }, "@babel/traverse": { From d7a8e45294263e3a38e38796c9c98a815a86e810 Mon Sep 17 00:00:00 2001 From: Graeme Yeates Date: Tue, 21 Jul 2020 18:50:14 -0400 Subject: [PATCH 033/525] PluggableMap: avoid crash when multiple interactions are removed --- 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 da7380bfee..282662bb6a 100644 --- a/src/ol/PluggableMap.js +++ b/src/ol/PluggableMap.js @@ -1045,8 +1045,8 @@ class PluggableMap extends BaseObject { } } mapBrowserEvent.frameState = this.frameState_; - const interactionsArray = this.getInteractions().getArray(); if (this.dispatchEvent(mapBrowserEvent) !== false) { + const interactionsArray = this.getInteractions().getArray().slice(); for (let i = interactionsArray.length - 1; i >= 0; i--) { const interaction = interactionsArray[i]; if (!interaction.getActive()) { From 01f355c37f5e92649d9c752ed91a2043e8ba0620 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Harrtell?= Date: Mon, 10 Aug 2020 21:30:06 +0200 Subject: [PATCH 034/525] Verify GetFeature with more complex filter --- src/ol/format/WFS.js | 108 ++++++++++++++---- src/ol/format/filter.js | 16 +++ src/ol/format/filter/Disjoint.js | 24 ++++ test/spec/ol/format/wfs.test.js | 56 ++++++++- test/spec/ol/format/wfs/2.0.0/GetFeature2.xml | 41 +++++++ 5 files changed, 217 insertions(+), 28 deletions(-) create mode 100644 src/ol/format/filter/Disjoint.js create mode 100644 test/spec/ol/format/wfs/2.0.0/GetFeature2.xml diff --git a/src/ol/format/WFS.js b/src/ol/format/WFS.js index 0c94a31819..a2985a97dd 100644 --- a/src/ol/format/WFS.js +++ b/src/ol/format/WFS.js @@ -3,6 +3,7 @@ */ import GML2 from './GML2.js'; import GML3 from './GML3.js'; +import GML32 from './GML32.js'; import GMLBase, {GMLNS} from './GMLBase.js'; import XMLFeature from './XMLFeature.js'; import { @@ -225,6 +226,15 @@ const SCHEMA_LOCATIONS = { 'http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.0.0/wfs.xsd', }; +/** + * @type {Object} + */ +const GML_FORMATS = { + '2.0.0': GML32, + '1.1.0': GML3, + '1.0.0': GML2, +}; + /** * @const * @type {string} @@ -271,7 +281,9 @@ class WFS extends XMLFeature { * @private * @type {GMLBase} */ - this.gmlFormat_ = options.gmlFormat ? options.gmlFormat : new GML3(); + this.gmlFormat_ = options.gmlFormat + ? options.gmlFormat + : new GML_FORMATS[this.version_](); /** * @private @@ -620,7 +632,14 @@ function createTransactionRequest(node, baseObj, version, options) { const featurePrefix = options.featurePrefix ? options.featurePrefix : FEATURE_PREFIX; - const gmlVersion = version === '1.0.0' ? 2 : 3; + let gmlVersion; + if (version === '1.0.0') { + gmlVersion = 2; + } else if (version === '1.1.0') { + gmlVersion = 3; + } else if (version === '2.0.0') { + gmlVersion = 3.2; + } const obj = assign( {node}, { @@ -723,8 +742,10 @@ function writeFeature(node, feature, objectStack) { node.appendChild(child); if (gmlVersion === 2) { GML2.prototype.writeFeatureElement(child, feature, objectStack); - } else { + } else if (gmlVersion === 3) { GML3.prototype.writeFeatureElement(child, feature, objectStack); + } else { + GML32.prototype.writeFeatureElement(child, feature, objectStack); } } @@ -853,8 +874,10 @@ function writeProperty(node, pair, objectStack) { ) { if (gmlVersion === 2) { GML2.prototype.writeGeometryElement(value, pair.value, objectStack); - } else { + } else if (gmlVersion === 3) { GML3.prototype.writeGeometryElement(value, pair.value, objectStack); + } else { + GML32.prototype.writeGeometryElement(value, pair.value, objectStack); } } else { writeStringTextNode(value, pair.value); @@ -915,6 +938,7 @@ const GETFEATURE_SERIALIZERS = { 'Not': makeChildAppender(writeNotFilter), 'BBOX': makeChildAppender(writeBboxFilter), 'Contains': makeChildAppender(writeContainsFilter), + 'Disjoint': makeChildAppender(writeDisjointFilter), 'Intersects': makeChildAppender(writeIntersectsFilter), 'ResourceId': makeChildAppender(writeResourceIdFilter), 'Within': makeChildAppender(writeWithinFilter), @@ -1009,11 +1033,12 @@ function writeFilterCondition(node, filter, objectStack) { function writeBboxFilter(node, filter, objectStack) { const parent = /** @type {Object} */ (objectStack[objectStack.length - 1]); const context = parent['context']; + const version = context['version']; parent['srsName'] = filter.srsName; - const ns = OGCNS[context['version']]; + const format = GML_FORMATS[version]; - writeOgcPropertyName(ns, node, filter.geometryName); - GML3.prototype.writeGeometryElement(node, filter.extent, objectStack); + writePropertyName(version, node, filter.geometryName); + format.prototype.writeGeometryElement(node, filter.extent, objectStack); } /** @@ -1024,11 +1049,12 @@ function writeBboxFilter(node, filter, objectStack) { function writeContainsFilter(node, filter, objectStack) { const parent = /** @type {Object} */ (objectStack[objectStack.length - 1]); const context = parent['context']; + const version = context['version']; parent['srsName'] = filter.srsName; - const ns = OGCNS[context['version']]; + const format = GML_FORMATS[version]; - writeOgcPropertyName(ns, node, filter.geometryName); - GML3.prototype.writeGeometryElement(node, filter.geometry, objectStack); + writePropertyName(version, node, filter.geometryName); + format.prototype.writeGeometryElement(node, filter.geometry, objectStack); } /** @@ -1039,11 +1065,28 @@ function writeContainsFilter(node, filter, objectStack) { function writeIntersectsFilter(node, filter, objectStack) { const parent = /** @type {Object} */ (objectStack[objectStack.length - 1]); const context = parent['context']; + const version = context['version']; parent['srsName'] = filter.srsName; - const ns = OGCNS[context['version']]; + const format = GML_FORMATS[version]; - writeOgcPropertyName(ns, node, filter.geometryName); - GML3.prototype.writeGeometryElement(node, filter.geometry, objectStack); + writePropertyName(version, node, filter.geometryName); + format.prototype.writeGeometryElement(node, filter.geometry, objectStack); +} + +/** + * @param {Node} node Node. + * @param {import("./filter/Disjoint.js").default} filter Filter. + * @param {Array<*>} objectStack Node stack. + */ +function writeDisjointFilter(node, filter, objectStack) { + const parent = /** @type {Object} */ (objectStack[objectStack.length - 1]); + const context = parent['context']; + const version = context['version']; + parent['srsName'] = filter.srsName; + const format = GML_FORMATS[version]; + + writePropertyName(version, node, filter.geometryName); + format.prototype.writeGeometryElement(node, filter.geometry, objectStack); } /** @@ -1063,11 +1106,12 @@ function writeResourceIdFilter(node, filter, objectStack) { function writeWithinFilter(node, filter, objectStack) { const parent = /** @type {Object} */ (objectStack[objectStack.length - 1]); const context = parent['context']; + const version = context['version']; parent['srsName'] = filter.srsName; - const ns = OGCNS[context['version']]; + const format = GML_FORMATS[version]; - writeOgcPropertyName(ns, node, filter.geometryName); - GML3.prototype.writeGeometryElement(node, filter.geometry, objectStack); + writePropertyName(version, node, filter.geometryName); + format.prototype.writeGeometryElement(node, filter.geometry, objectStack); } /** @@ -1150,11 +1194,12 @@ function writeNotFilter(node, filter, objectStack) { function writeComparisonFilter(node, filter, objectStack) { const parent = /** @type {Object} */ (objectStack[objectStack.length - 1]); const context = parent['context']; + const version = context['version']; const ns = OGCNS[context['version']]; if (filter.matchCase !== undefined) { node.setAttribute('matchCase', filter.matchCase.toString()); } - writeOgcPropertyName(ns, node, filter.propertyName); + writePropertyName(version, node, filter.propertyName); writeOgcLiteral(ns, node, '' + filter.expression); } @@ -1166,8 +1211,8 @@ function writeComparisonFilter(node, filter, objectStack) { function writeIsNullFilter(node, filter, objectStack) { const parent = /** @type {Object} */ (objectStack[objectStack.length - 1]); const context = parent['context']; - const ns = OGCNS[context['version']]; - writeOgcPropertyName(ns, node, filter.propertyName); + const version = context['version']; + writePropertyName(version, node, filter.propertyName); } /** @@ -1178,9 +1223,10 @@ function writeIsNullFilter(node, filter, objectStack) { function writeIsBetweenFilter(node, filter, objectStack) { const parent = /** @type {Object} */ (objectStack[objectStack.length - 1]); const context = parent['context']; + const version = context['version']; const ns = OGCNS[context['version']]; - writeOgcPropertyName(ns, node, filter.propertyName); + writePropertyName(version, node, filter.propertyName); const lowerBoundary = createElementNS(ns, 'LowerBoundary'); node.appendChild(lowerBoundary); @@ -1199,14 +1245,15 @@ function writeIsBetweenFilter(node, filter, objectStack) { function writeIsLikeFilter(node, filter, objectStack) { const parent = /** @type {Object} */ (objectStack[objectStack.length - 1]); const context = parent['context']; - const ns = OGCNS[context['version']]; + const version = context['version']; + const ns = OGCNS[version]; node.setAttribute('wildCard', filter.wildCard); node.setAttribute('singleChar', filter.singleChar); node.setAttribute('escapeChar', filter.escapeChar); if (filter.matchCase !== undefined) { node.setAttribute('matchCase', filter.matchCase.toString()); } - writeOgcPropertyName(ns, node, filter.propertyName); + writePropertyName(version, node, filter.propertyName); writeOgcLiteral(ns, node, '' + filter.pattern); } @@ -1222,13 +1269,26 @@ function writeOgcExpression(ns, tagName, node, value) { node.appendChild(property); } +/** + * @param {string} version Version. + * @param {Node} node Node. + * @param {string} value PropertyName value. + */ +function writePropertyName(version, node, value) { + if (version === '2.0.0') { + writeFesValueReference(FESNS[version], node, value); + } else { + writeOgcExpression(OGCNS[version], 'PropertyName', node, value); + } +} + /** * @param {string} ns Namespace. * @param {Node} node Node. * @param {string} value PropertyName value. */ -function writeOgcPropertyName(ns, node, value) { - writeOgcExpression(ns, 'PropertyName', node, value); +function writeFesValueReference(ns, node, value) { + writeOgcExpression(ns, 'ValueReference', node, value); } /** diff --git a/src/ol/format/filter.js b/src/ol/format/filter.js index 99490840f0..05c8be7904 100644 --- a/src/ol/format/filter.js +++ b/src/ol/format/filter.js @@ -4,6 +4,7 @@ import And from './filter/And.js'; import Bbox from './filter/Bbox.js'; import Contains from './filter/Contains.js'; +import Disjoint from './filter/Disjoint.js'; import During from './filter/During.js'; import EqualTo from './filter/EqualTo.js'; import GreaterThan from './filter/GreaterThan.js'; @@ -100,6 +101,21 @@ export function intersects(geometryName, geometry, opt_srsName) { return new Intersects(geometryName, geometry, opt_srsName); } +/** + * Create a `` operator to test whether a geometry-valued property + * is disjoint to a given geometry. + * + * @param {!string} geometryName Geometry name to use. + * @param {!import("../geom/Geometry.js").default} geometry Geometry. + * @param {string=} opt_srsName SRS name. No srsName attribute will be + * set on geometries when this is not provided. + * @returns {!Disjoint} `` operator. + * @api + */ +export function disjoint(geometryName, geometry, opt_srsName) { + return new Disjoint(geometryName, geometry, opt_srsName); +} + /** * Create a `` operator to test whether a geometry-valued property * is within a given geometry. diff --git a/src/ol/format/filter/Disjoint.js b/src/ol/format/filter/Disjoint.js new file mode 100644 index 0000000000..a3601c55a2 --- /dev/null +++ b/src/ol/format/filter/Disjoint.js @@ -0,0 +1,24 @@ +/** + * @module ol/format/filter/Disjoint + */ +import Spatial from './Spatial.js'; + +/** + * @classdesc + * Represents a `` operator to test whether a geometry-valued property + * is disjoint to a given geometry. + * @api + */ +class Disjoint extends Spatial { + /** + * @param {!string} geometryName Geometry name to use. + * @param {!import("../../geom/Geometry.js").default} geometry Geometry. + * @param {string=} opt_srsName SRS name. No srsName attribute will be + * set on geometries when this is not provided. + */ + constructor(geometryName, geometry, opt_srsName) { + super('Disjoint', geometryName, geometry, opt_srsName); + } +} + +export default Disjoint; diff --git a/test/spec/ol/format/wfs.test.js b/test/spec/ol/format/wfs.test.js index 89f39d13cc..b8c5fd5e9b 100644 --- a/test/spec/ol/format/wfs.test.js +++ b/test/spec/ol/format/wfs.test.js @@ -1,5 +1,6 @@ import Feature from '../../../../src/ol/Feature.js'; import GML2 from '../../../../src/ol/format/GML2.js'; +import GML32 from '../../../../src/ol/format/GML32.js'; import LineString from '../../../../src/ol/geom/LineString.js'; import MultiLineString from '../../../../src/ol/geom/MultiLineString.js'; import MultiPoint from '../../../../src/ol/geom/MultiPoint.js'; @@ -16,6 +17,7 @@ import { bbox as bboxFilter, between as betweenFilter, contains as containsFilter, + disjoint as disjointFilter, during as duringFilter, equalTo as equalToFilter, greaterThan as greaterThanFilter, @@ -1386,14 +1388,32 @@ describe('ol.format.WFS', function () { describe('WFS 2.0.0', function () { let getFeatureXml; + let getFeatureXml2; + before(function (done) { - afterLoadText('spec/ol/format/wfs/2.0.0/GetFeature.xml', function (xml) { - getFeatureXml = xml; - done(); + proj4.defs( + 'http://www.opengis.net/def/crs/EPSG/0/26713', + '+proj=utm +zone=13 +ellps=clrk66 +datum=NAD27 +units=m +no_defs' + ); + register(proj4); + afterLoadText('spec/ol/format/wfs/2.0.0/GetFeature2.xml', function (xml) { + getFeatureXml2 = xml; + afterLoadText('spec/ol/format/wfs/2.0.0/GetFeature.xml', function ( + xml + ) { + getFeatureXml = xml; + done(); + }); }); }); - it('GetFeature', function () { + after(function () { + delete proj4.defs['http://www.opengis.net/def/crs/EPSG/0/26713']; + clearAllProjections(); + addCommon(); + }); + + it('can writeGetFeature query with simple resourceId filter', function () { const wfs = new WFS({ version: '2.0.0', }); @@ -1406,5 +1426,33 @@ describe('ol.format.WFS', function () { }); expect(serialized).to.xmleql(parse(getFeatureXml)); }); + + it('can writeGetFeature query with negated disjoint spatial filter', function () { + const wfs = new WFS({ + version: '2.0.0', + }); + const geometryNode = parse( + ` + + + + 590431 4915204 590430 + 4915205 590429 4915204 590430 + 4915203 590431 4915204 + + + ` + ); + const geometry = new GML32().readGeometryElement(geometryNode, [{}]); + const filter = notFilter(disjointFilter('sf:the_geom', geometry)); + const serialized = wfs.writeGetFeature({ + featureNS: 'http://www.openplans.org/spearfish', + featureTypes: ['bugsites'], + featurePrefix: 'sf', + filter, + }); + expect(serialized).to.xmleql(parse(getFeatureXml2)); + }); }); }); diff --git a/test/spec/ol/format/wfs/2.0.0/GetFeature2.xml b/test/spec/ol/format/wfs/2.0.0/GetFeature2.xml new file mode 100644 index 0000000000..2e7add1b68 --- /dev/null +++ b/test/spec/ol/format/wfs/2.0.0/GetFeature2.xml @@ -0,0 +1,41 @@ + + + + + + + + sf:the_geom + + + + + + 590431 4915204 590430 + 4915205 590429 4915204 590430 + 4915203 590431 4915204 + + + + + + + + From 0484e45c892423af5c9af31101b8b066584afe5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Harrtell?= Date: Tue, 11 Aug 2020 15:46:40 +0200 Subject: [PATCH 035/525] Fix WFS 2.0.0 GetFeature response parsing --- src/ol/format/WFS.js | 14 +- test/spec/ol/format/wfs.test.js | 133 ++++++++++++++---- test/spec/ol/format/wfs/2.0.0/GetFeature.xml | 20 --- test/spec/ol/format/wfs/2.0.0/GetFeature2.xml | 41 ------ 4 files changed, 117 insertions(+), 91 deletions(-) delete mode 100644 test/spec/ol/format/wfs/2.0.0/GetFeature.xml delete mode 100644 test/spec/ol/format/wfs/2.0.0/GetFeature2.xml diff --git a/src/ol/format/WFS.js b/src/ol/format/WFS.js index a2985a97dd..b31fb5b120 100644 --- a/src/ol/format/WFS.js +++ b/src/ol/format/WFS.js @@ -40,6 +40,9 @@ const FEATURE_COLLECTION_PARSERS = { 'bounds' ), }, + 'http://www.opengis.net/wfs/2.0': { + 'member': makeArrayPusher(GMLBase.prototype.readFeaturesInternal), + }, }; /** @@ -326,12 +329,15 @@ class WFS extends XMLFeature { assign(context, this.getReadOptions(node, opt_options ? opt_options : {})); const objectStack = [context]; - this.gmlFormat_.FEATURE_COLLECTION_PARSERS[GMLNS][ - 'featureMember' - ] = makeArrayPusher(GMLBase.prototype.readFeaturesInternal); + let featuresNS; + if (this.version_ === '2.0.0') { + featuresNS = FEATURE_COLLECTION_PARSERS; + } else { + featuresNS = this.gmlFormat_.FEATURE_COLLECTION_PARSERS; + } let features = pushParseAndPop( [], - this.gmlFormat_.FEATURE_COLLECTION_PARSERS, + featuresNS, node, objectStack, this.gmlFormat_ diff --git a/test/spec/ol/format/wfs.test.js b/test/spec/ol/format/wfs.test.js index b8c5fd5e9b..c7aaf5fe89 100644 --- a/test/spec/ol/format/wfs.test.js +++ b/test/spec/ol/format/wfs.test.js @@ -1387,28 +1387,113 @@ describe('ol.format.WFS', function () { }); describe('WFS 2.0.0', function () { - let getFeatureXml; - let getFeatureXml2; + const geometryXml = ` + + + + + 590431 4915204 590430 + 4915205 590429 4915204 590430 + 4915203 590431 4915204 + + + + `.trim(); + + const getFeatureSimpleXml = ` + + + + + + + + + + `.trim(); + + const getFeatureComplexXml = ` + + + + + + + + sf:the_geom + ${geometryXml} + + + + + + `.trim(); + + const getFeatureSimpleXmlResponse = ` + + + + + + + 590529 4914625 + + + 3 + Beetle site + + + + `.trim(); before(function (done) { proj4.defs( 'http://www.opengis.net/def/crs/EPSG/0/26713', '+proj=utm +zone=13 +ellps=clrk66 +datum=NAD27 +units=m +no_defs' ); + proj4.defs( + 'urn:ogc:def:crs:EPSG::26713', + '+proj=utm +zone=13 +ellps=clrk66 +datum=NAD27 +units=m +no_defs' + ); register(proj4); - afterLoadText('spec/ol/format/wfs/2.0.0/GetFeature2.xml', function (xml) { - getFeatureXml2 = xml; - afterLoadText('spec/ol/format/wfs/2.0.0/GetFeature.xml', function ( - xml - ) { - getFeatureXml = xml; - done(); - }); - }); + done(); }); after(function () { delete proj4.defs['http://www.opengis.net/def/crs/EPSG/0/26713']; + delete proj4.defs['urn:ogc:def:crs:EPSG::26713']; clearAllProjections(); addCommon(); }); @@ -1424,26 +1509,14 @@ describe('ol.format.WFS', function () { featurePrefix: 'sf', filter, }); - expect(serialized).to.xmleql(parse(getFeatureXml)); + expect(serialized).to.xmleql(parse(getFeatureSimpleXml)); }); it('can writeGetFeature query with negated disjoint spatial filter', function () { const wfs = new WFS({ version: '2.0.0', }); - const geometryNode = parse( - ` - - - - 590431 4915204 590430 - 4915205 590429 4915204 590430 - 4915203 590431 4915204 - - - ` - ); + const geometryNode = parse(geometryXml); const geometry = new GML32().readGeometryElement(geometryNode, [{}]); const filter = notFilter(disjointFilter('sf:the_geom', geometry)); const serialized = wfs.writeGetFeature({ @@ -1452,7 +1525,15 @@ describe('ol.format.WFS', function () { featurePrefix: 'sf', filter, }); - expect(serialized).to.xmleql(parse(getFeatureXml2)); + expect(serialized).to.xmleql(parse(getFeatureComplexXml)); + }); + + it('can parse a basic GetFeature response', function () { + const wfs = new WFS({ + version: '2.0.0', + }); + const features = wfs.readFeatures(parse(getFeatureSimpleXmlResponse)); + expect(features.length).to.be(1); }); }); }); diff --git a/test/spec/ol/format/wfs/2.0.0/GetFeature.xml b/test/spec/ol/format/wfs/2.0.0/GetFeature.xml deleted file mode 100644 index 20e1b43f8c..0000000000 --- a/test/spec/ol/format/wfs/2.0.0/GetFeature.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - diff --git a/test/spec/ol/format/wfs/2.0.0/GetFeature2.xml b/test/spec/ol/format/wfs/2.0.0/GetFeature2.xml deleted file mode 100644 index 2e7add1b68..0000000000 --- a/test/spec/ol/format/wfs/2.0.0/GetFeature2.xml +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - - sf:the_geom - - - - - - 590431 4915204 590430 - 4915205 590429 4915204 590430 - 4915203 590431 4915204 - - - - - - - - From 1335937ddd23c8be3ca040c94be751a149900e50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Harrtell?= Date: Tue, 11 Aug 2020 16:09:43 +0200 Subject: [PATCH 036/525] Verified fix --- src/ol/format/GMLBase.js | 8 ++++++-- test/spec/ol/format/wfs.test.js | 3 ++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/ol/format/GMLBase.js b/src/ol/format/GMLBase.js index 2c90cd2413..5ac3c3788e 100644 --- a/src/ol/format/GMLBase.js +++ b/src/ol/format/GMLBase.js @@ -150,7 +150,11 @@ class GMLBase extends XMLFeature { objectStack, this ); - } else if (localName == 'featureMembers' || localName == 'featureMember') { + } else if ( + localName == 'featureMembers' || + localName == 'featureMember' || + localName == 'member' + ) { const context = objectStack[0]; let featureType = context['featureType']; let featureNS = context['featureNS']; @@ -214,7 +218,7 @@ class GMLBase extends XMLFeature { } parsersNS[featureNS[p]] = parsers; } - if (localName == 'featureMember') { + if (localName == 'featureMember' || localName == 'member') { features = pushParseAndPop(undefined, parsersNS, node, objectStack); } else { features = pushParseAndPop([], parsersNS, node, objectStack); diff --git a/test/spec/ol/format/wfs.test.js b/test/spec/ol/format/wfs.test.js index c7aaf5fe89..fc589fc833 100644 --- a/test/spec/ol/format/wfs.test.js +++ b/test/spec/ol/format/wfs.test.js @@ -1528,12 +1528,13 @@ describe('ol.format.WFS', function () { expect(serialized).to.xmleql(parse(getFeatureComplexXml)); }); - it('can parse a basic GetFeature response', function () { + it('can parse basic GetFeature response', function () { const wfs = new WFS({ version: '2.0.0', }); const features = wfs.readFeatures(parse(getFeatureSimpleXmlResponse)); expect(features.length).to.be(1); + expect(features[0]).to.be.an(Feature); }); }); }); From 8cddfa0d2264b4244d14fc1f0a71c43d235e613c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Harrtell?= Date: Tue, 11 Aug 2020 16:14:39 +0200 Subject: [PATCH 037/525] Refactor tests --- test/spec/ol/format/wfs.test.js | 132 ++++++++++++++++---------------- 1 file changed, 64 insertions(+), 68 deletions(-) diff --git a/test/spec/ol/format/wfs.test.js b/test/spec/ol/format/wfs.test.js index fc589fc833..59a33946d8 100644 --- a/test/spec/ol/format/wfs.test.js +++ b/test/spec/ol/format/wfs.test.js @@ -1387,20 +1387,28 @@ describe('ol.format.WFS', function () { }); describe('WFS 2.0.0', function () { - const geometryXml = ` - - - - - 590431 4915204 590430 - 4915205 590429 4915204 590430 - 4915203 590431 4915204 - - - - `.trim(); + before(function (done) { + proj4.defs( + 'http://www.opengis.net/def/crs/EPSG/0/26713', + '+proj=utm +zone=13 +ellps=clrk66 +datum=NAD27 +units=m +no_defs' + ); + proj4.defs( + 'urn:ogc:def:crs:EPSG::26713', + '+proj=utm +zone=13 +ellps=clrk66 +datum=NAD27 +units=m +no_defs' + ); + register(proj4); + done(); + }); - const getFeatureSimpleXml = ` + after(function () { + delete proj4.defs['http://www.opengis.net/def/crs/EPSG/0/26713']; + delete proj4.defs['urn:ogc:def:crs:EPSG::26713']; + clearAllProjections(); + addCommon(); + }); + + it('can writeGetFeature query with simple resourceId filter', function () { + const getFeatureXml = ` + 590431 4915204 590430 + 4915205 590429 4915204 590430 + 4915203 590431 4915204 + + + + `.trim(); + const getFeatureXml = ` >eIJx zPfdh^oHzn34lDowK#-IWQ33!!6oB*?G#KzY&~f4k0Du7$WK=}O?PXqHU(3tOpP!$B zU2ku19v&X=@9*~Z_Q0!{m>95EL_`GG{=Wib1KxIbcT4?Wxx2elS64qjKYw|70W!$S z$^!X~jEsQv!@~oR1`=myXUE6KN=iy8DJl2&_y3c#v9WP;b0Z@o;kF~6&1C$wav-N0SYlOF_D*-|NZ+n5TUlVwu*`hP-9R~ zkg~Eeuw6?_D=aL`(9jTwFEIqJUu=2^z^i_ut-cy1agj!j@H!FEG;bojkUA01B(6k z@88bOPH=EA&{$xA;^N{|RaJojvbMGc;s-{DgoK2NiHVbgm5ZH~lbsbfkduQA=w~l4 zFHRQ5$jC^buV`s$adB~h?LY=#1p)w?29yRw4x}e1CnY5%|3`Orb^=Y~;9vpv0!;%d z-QC><1_;;-oB%*~0)qks1{@AVb#ih746&Y`9t#W0f7&@%>+9>CoSfw3z_^~cZ z#dk$B$c@Fo1rK-Vg~`bdg?dxbx$z21PK0hrxCP0?f&uZ8LB`0ojEh9 zp)i&tMdyJMF@db#me28|Hq~I7`W)9Xa}ntu%cr*mu5)GrLoi zuz$7?J<^6~>nL7hr_tknEOCAEAuDB7Bp{=?E0ovnbEIl4D^x3@Blh>VNbt6IlaVAe zLRZTN-w|&PVVeaU#D-rWkEnnecksIc<)1Y!zMMb<-H_fw!$Aozlc6JmrD2z;#}>83 zP{E`8+WO7vz8t;1ZlLin_7WOS00127e;<&!P2UdyfCwNd@=L{i?XnX}8&5KwB3)2b zR3jI*6cko|7xuana|`a84;s7=I+heXFz2_&HQ7Ot8pq|(qx1E|<<#ZW#8zb+TZ{*y({7RVhK?Q2Bj z57Q)#TbJhja=4^%zQa3(tn>8^U6JRy@UifF$CpJTB~k{@_l)x)$g5s2Fe8_}y@&XT zc;}4BAlUiL0BK2A5JmDxFAR$HPW+@Fcw9o?E#)JIqDrOIM841J$E(b|8+#VeJQfgh z0;8xCU4R=-o|zFI#vFa5mE%VI$yzFzajAsF;E^=g!_)RR(AjWH-Dl$WI@2{H?hdXaiAIDWJZx4X`$>Qh7iV! zYjus=+fa=#CB%dCXdB#?rgl`i;4)**K~bnRIQPvYyTlbF;Zx@bVhZo^xD}cqr?Kv+ zOvvbz(hIt;4ZY-F<|KkM)j7DVL-xn9!A4jGzBt2JCy_@GZ>hDxWBIfq;zp~mwas@C#;)OBwJB>Dl|A? z2PrpO`e>fs4_&Kc>>N9HV)g4f zQ`5CyC{QUEkCEC=9kgm=q%WRah$J`}CHqG}?TiYaDE1J!-75j;?;UyUdt|k=6r>R| z9)9}R*LH!NNG2jP1l_AaBjNcoj>+(&LHXNT1e4)VQbL3`i$EutqA!Pla)PlAez0m@ z3vIK-SYnm<*&DnLaizJ-I4*>#|8n<+EpYzI;i% zX40yg#*2QXVWkrG6;UG=SD?5L(eF+uL)C@>uvfdCFmDwXoNe1MVHz!H!MFVpnj%WJ&YRso7}p%D zZE>xvKb=#v;i?fW44eU1{Cz4RE4qh&%%p4Tc2fusLYw-a4B7}g@Cfb=VP{ny6`td& z?b$WpHnThg`7&p-dqC-Y+d*(3`8s=HHyq=2+{mPpBEN(c*K)XjJ@kAurD z9U1Mdli{V`#Ffq|1=sMdLNA`^?Mvoo5pByI)yr)Ywez9UyNLBmcjkri_tTgVqcAul zRHMwR`Zy?tMBP;cP<&Eqh$=F%FhOMsaxhe+#RE{~50h^Em3%QGr=X+rz;j(Q1pcI= z$VMSIW5C%!xH_fy5KB}Bd$Up5Q~r3O3zbl%u)_91mlb>&s=Px= zr2edNi@nlQ2}O&+eQr6FXwR@XMxws;hSUUP(=&wWiJdzXDOBy7xc*zp2qr-BH$_`t znCbn+nz4+4Jguu>YHf;4Mn=_M(IL!M-S|(g^$zij6_u$MzkW{Ss&4>vodCwa_?y#; zZrnIu;OYg7E-&~*D6PVvNoA`D6|pZ8Jh%Qrgri#M`o7De>y$V56k66!#d5%34A4oy zXo&U+MzD=TvWdCCQ6N_8isR1WQjHSGmpsTU+K$kcfvd?i_cy}q`65v4NBQh#Bslu` z68Ow31rvdfyQ{)v^<&R@@p-M8jhZg#Wh32eOi7M;p6$b6)b1KLw z)S$wD_Y#CaBgn}7?)Z7|i??$owyWe_M|-!>7DqozK8rsOUF=kg@Yi@Acof4MSpLd> zWIpHrdWSXU9Fm9G9fsE{EB09{`LB8!!NMYAQ*$Z>zwm&WeaF?z%cMB4F2cDNtugI( zu;n#rp-FomQ*|soO;DHV_n+^o{*TxH^G?VerG>h7^ko8`>s*B@2BRT43m zv~E!n(su8r*QZoNl1oNeBoiJqK*QiK^_fyO9?i(#m0|HrG{+_=7Dakf)L&Fl}~pR@_Np!l4zIa zJ+bqWAA9+ymsPlfOJTW(@ zQCg#xABEZo|6h|GM(N3dgmA$_s# zQh^eg@`h!>855*m!8M#5t-{H(!r*~U3{ez!OV`iO@TyC5EnK@2*6iq>waaqj7E;hh z;T4b?^TQ=&@8vJ>Vm&rcrc%sdj;i}`LmDjRF8&}E?vvMg35qS>DY3UZBCOS%DwN($a^Z^AQbW~ ziRGQqOaBPcfN!nHbf$L+b_9dk<4v;V#xWH}X75kH30MZ91T)_-n*CyJkmZbiYGSS1 zR}^1kREwxHdzlE&R$)d!mm%8f@=8DP?pSq$JNh)n7V|MB-+=f)UA#1R%c5W-8Q%-7 z{^kBi)?MaEdn$hUl)?#Wcz%98@4LC6U!PlZe#xI%C+?&c`(8GTrsjhSh%PO>)eBM+Fne_z1(IrTEaPKDGRB@>70&OsOM&&1=YtcCg&;x5ta=%xxJQ^8wz>xCIM6`3905bgF(Zx`|)708DNy+ z=N`5k))L+KUc889!*%*0HND49D5kx09z62qIGQ5$72ByOS=c=6_m8{3(H^d!IrOu4 z1oEMUYs?^DP?a;b_m!9JrMEJ-meZ8QxfA?BFGB|ne;I-J*qTT9YSzdn$?LT2Wsm*w z=a3-~?*3*Noxw$~V_0j;axZj!@^Np%4Vfy!Uhi}TPb>%AzzBqa8X~$}o7vEGXownc z^DD^R-}LySE9?sNMq;K$vWK&Q(7}3~wGX15@fv7A-voFF@L*LU@xQQuS21)gOxMGE z_SB1}(#CFfNueMv<|i!7AlR4vF&d#9s9tuH9|8`44W4BlRMwu`1&BpL98@TZ=@@DBj0hv zMe5u(-g5Zm1L+*%eGZj?mw+e~r{!~|;zG}1T9L+uKIdd^*YrK*|L=EfL4-vHBzj-^ zzFG>$z5*$e>q?9qDXb35qBf)|5@c1Xuy@s>M#bNserw+__v;ic?O^GSeo5`mvv3{s zCL7%cPmO`)?q{y2{987pseajm+NqCD4f=J^Z6lMMP_1m5N4OhNfXQ=hVd?Q5-n<>Y zpo23OWY$d!>yG}(R^PBRRRZRU4}AjV`P;RLx=9ZVA{>P$jA!kzN zs57b88k2{F-P_{CpUvzygYSf&%!PqakPJ?RI-Qr8pk&`1*@+K_}lx3fKbX|KEpmg`$CK+xh!jp}|HH|WTY`+**r23KxHEo5U*P6SBjg;9JQqnq9 z7A|77SkV8vYr<4ZkpW2b$|TBF0qszvZM;$De3IU`fv&_4*sxliiQy@NX;e-}c9nvD z*TfYxA!iM$wMv@yGL-E*sa@*q-qzuX`YduMf)Tu2n-PV?;)v;W!ieY--D(+2V=p%G zWcgba1C`jC(~WBr|2yZ5bJkXyU{X8jIAa0K04dq1KWgJrETd{k7y9~8TDLnzJU^B$ zw`+0DlJSnn@xr89#AY|ubA*$}iZ@Ye;y1hh+K-EU7m>7>94L`u4uXW!u-RTV!eCzo z7I&9YbT?fyr)R{2UbQnVbacTt+~b{hr_z?6UTek3l{TmwYR0Zn&W|?b&Eanaa)Tu{ ztk^MT|4bNPE z-Pf?Co@eA;fAur?{hDF;-sSm=x{I{^-R)P$^6B^e{oMVI)V-3V!1n#|{aLbEV{}6J zeIMHe1C4(1R{G+(we?JT@_9FY{W*6v5B&ZTtWu?W{H5Mu#ynv zL?FjPe;;bj5|o(OYzyJ9F?pbj{`! zZGglR-Q;E$f?te(?}$U!kP099slx^h1%fIpr08+u!$UE zt=$TQjAUKCn4631(;K_GZ)?C1bf(_T2@xXhX(pC6I@MgqCLftCe$1juIpR^AV?2*F zGP)rq1Y~Ch2Km&+8UiHbqbV=gmfXLal_+(#12SmCtnE?g-C3giZu^_AN*B(R96*Ns zngyCzeAGYIKWSK0_%m9~K|q2;he60A(v8vX%s~bhcB!Vf18G`ZcOD9<$RYd<>aWCaUE(<-cSAag?}HHG zASec;-i|e4X=y@yJiNWc63H;e-2LCHhp9_J2cZNrPG?hPv~mUv{cG*9-~Els+yYuW z5+7yTT!I;1iSnd)Qi@dOpUCYR?mI7>TT#)WOq_0m$JFi*isz7=SQF89!;Fn1l`fIc7@&=z5DP?hLnCf+He@4`bq|}MiD|-gV+OZ)V_&jocj!GauRDP3 zB$YQ7mI~pNM?t^h3slY^(fm_KXfMa%pB z;psfHnGKlM>kg2y8YCR)6Z;;V_!ivmnfuoH-JlBO10LTv7+H}<(=`B|yErDV0*J5@bz8bjhcGQo;>avHym zMdWD(5A!6;(8offT4uIYtef_x3P89U3)Ijp6fYzVG21X`iMOuj5p^T(Y}$%<3%-<4 zUKb{;Q0t6xdV%P|vL|$p_0b03zxF;~|Gsd0xdxX$07X?u%3j&F^7!!=td`<}#8qA^ z*tif0th9{GwCeb7e+h!vAQB#ri#Uds^djR5YCrs`h6O?ActPC`jB;L!EW;}N+TIq3$~if0cr~08r!PP(54Fl~Eoc z3AT^g8umW1OGuI>G5Uw0`Jk)@<(3V@R@Inxf#z}(QxFxnNoIBTysZvvr<$4l-Sc2m z$pI51%OM_FelNDrckOB98o}u{+J>9Duqy#8hTQCUp-3oHsTT){p84D$#!LL|T_k{Z zy>Xe($S-a8>k=!tYQVS+ELT>r=KGUTGa*{MYqPWk6rdsd6o!o6L6-~D77;1)uwrOv z8~9m#;JmX$k}LAvx^)sp*Pvj7z0?5VqEky)JL0v03q!4-qZ?2FPIX*#*XQ*ET zw?-01VBf!=5L43%@D5)2lLaCRHS-=OQ_fAGfE0fhXS5zZEEN1}e?PnhJn^q6XU8@S z&$e5sS8JWMHZB?^5aJ`W)nu9Il?^$oa@bj(jY(LVvt zIiE<#{2aSKV;i6oC`+`$`+`pG;3)Gy)N7G4;6Xo$L1||5RW###8?(<%ZGO>#(-79! zXVKzY{TJBbm0i;-1D?7+#|jU|Heze4x6C?M)1>Xoixz(-yo*2Cj3=3BbeU=vLa;c(iSdnLrdyp`kHq zsnd?R0WUL7^c}{6KW0N`BB{S^yobiRvD^42h)FB&+Nbj9fm?D2{LYi>3nXtb9xs1# zXBMgv&m8E;zj^hpFxiYIJhR&=^y)Z_x!e>Q?qw+{U}gHQFT3Br_9ZKIUBh?}DM;UW zC#;jVP-mjXhHESTGJaXmXZxpw)}5upnGgIll0d8~;)9i2yz697Oy=Xv3tg+gMWD^) zIpAu9a8>{<-Ha*^k@sH1^qxY)ZoF}ns|}LE)}-kJgG?oaih7El&#lO4IE-QG zoH8Ap-bQK!)Q28Uct<@N*8)YUhpm_*MYm_dhUm}?k%+&E%B%SPa^%ZzDMx<4eo^h? z?p=6xMRCD@O9v9I|4;fi=-I*7s>oBDw;3iTrkPnECQINb3Zgdg2>%$oUG5~b=j`_S z`Zuw}(031i$0qH*H!F7h-5~NOHm{3_PrgAyC)wT^#RS#O&<_*F$4Ml;71m`l=jmsBT3kTqxonV8q#)(h#X9T4 zbjm9yJDNMG1M$<@eqVsm@L<8rlU5 z*htEmlHRBosvGv+>!f_X(G(g!bEUbkOo0rvhga3VPg2UV8X8#^y_F zGR68uug0(W@e@)n{z?)TL;s0QDSSwTJ0hCqXE#y0rn$dDa13spFW_n53D{BEvO-@x zml}9%Kda9m-=xT>&q2Xmy%-q^(m8a~xu`3fxIe5)NBuZ=CRDZ}^yp9vWLb*lOt9UV zqS%2Uwj)G!$EQ!B8E4?pH%MWADUdA?_}1c9L?Jn)5~p9EK_v zw|8ZH!w-O}0?B{I5L{W-#?WV8t0V1q)t#?B-wj~?&L9IBx97?|DDFNHAy%6O51*G+ zSrU1L+=$yIZBPWCeJ^>oYrVkh?S5g^NoMEs&`i#&b3n2R1 zmm*7OP$U{)zEzo_TslC+d=IDUov)Sr zEPz}I|Mbw&O)`Ql=a$n)j_YCxCVP~cuVD5^AX>&$lu4FBQ=}4N5@2k_Am#YPsJL}K zV~ascyt^vJh1G$Bm7z=jK{eVhNeVjl$d*@B!Bf5W*`!ZzhoR$= zL^p+Tx5N@q<`o*$UBd6#Re?97pASN&rbL)>t+WJ2Z_a;l@2J`^id+Z()p?#3Xm>pp z(qg5h!c=X5=<W91qmU-&u)jkld_TY z?KDWNY0pFS-0##sHvLq-hPz2{Tx2>Sv?6}@%wP2KD{mYeta7igo$xWUuQWOT#Si^y zvvVg%(Liu7alv@t2C8yI!#zKh;>X}V;)Pt!IqCG}jXI~-E(A6c^olC&CK^VUOWnD3 zklM@-4YfQEPfo{UYk_#kdLOa%TlLI4@MI3g>;sEf&|)yp5x<(oqbLs_QPexilL2=5 zH7=XWkt^9nBNaAF6L6X1FTcV@Va%+Vvw@Hids09Vf=T6zoD#B(`1(ikX!^3h(wR}? zXEkIg>p&hqK;CUnwYnbeY&s!dd<7=M_hg}#x$YqD46MeXKO$TB`vEF{hX~uC+r;zV$|+0j;B*;$?v?+m@f%vQx^Jf$ z7NVIB!}Pv<$U`1lrRVz&H{WU8WD-7RQBQ_UO&B2Kgq=y@PU5X$;37VaLj<=_IPA_- z6!xGeMH5T%4cb8iO;WI5ZMTj5igmr%!#$R5Rt0bJRDWT~T%XM=W%+U>k3I5lzdM3G z?0g7U$RaBvq@-DfYPQnAJ9(do9&vpAY6*O1caIk`qj1*`#+->b^+{bhs2*5BiAy$q ztvxjE#lmSc5CwgzZfH`AS_oLPzY}an+{uh^qp$WbVQQxkg6lIEwVYsP7_%EQVru#B zM@POPnM!j!`9=Poy17W{#vsv=fr_o-w-}jSNlxUo9AR^YXyTPC#+2X}t zB)a?V*1=E4ty0F2@;p2&h(+Ae(#(gBTx3Wyk~_`-X_cy01Ws&Y7sFfR@j74;UKlcyKi02(zyL%ff`Y z&DMIZ7x7Q$^5ynAM8DoB7PO)t-Soiwy1wWkC@L=08dJ;8_1JL&L1n9@KHz`k zX!U$SxIMV$A1uGIvx9|mVYD^FEjo6CJ#Rxx6Hg)kxeW4fo;&}{k?X2&D+tGNb^m%B z(%C@?F0IJ5x>xOHmsW{xfl1AcaTQY&-|%O+`|JAaz5A8x?FEe3pXFc7J_{!i|inyiY!c3GIb z6eqYYPqy~>i69hI-oh<7f++$!)tq4Fz54{zzkhVPl^#4gH4qPu-fEN}P&2c|&V9BL zo(hCW_#cyt(4$qrw^_KBHnpAS|Iuw#qK%_r3&gzLZejS&a{f)jo|RJ|l(*Bn0^!S* z=PZ?G$H|5LF=`&;pi9gbPwFVA$h8>wZ-qI8?9%&ff)~O5=igb0*ztxUZci_I=B!zf z40hHzY307eIoW&!2(ncHtQn{9b#u0G7q(T6M&-8Pll%R`dxb-6#kqW2&;Ii3A>j(= zTchyi=I9lE4cP2T%Yq6(jZS_nd+UjqC3B=LW4sfGyOHqWVCqQ%l)Tum_JJm~?NcZQ z6x@UDQ8Q(IerANP)whV;Y>ci@eQQeNt5t&gO-v$4gP#b^d~!6l8dpT_mQ?B^eg6eb9Vo<{tSx3Y{JPyBRQ#?aM?7WA_l}7 zZLwMR)<_SxW#1*uzniy!1y}Pu4KX_n-XSE5pO+XO`7(4KELTe8xyZlF}ciaBfj`FV^i+DW-)l+fU> zis&VaI)YbZW8y>EGDyJn)W@rxm)-JSFU2!g>Oh6JwR8C$D{pEyaS55Pm*H6eGnI6_ zmc}5}MU?xUw;}8e@a1JV_Y;u|$_qg7GJB0?=fk+Bx1f$GMewAMJiJ5wYdF-yIB-)) z-FQa%9lj(v+5nX306Ng|37FuwXg@+Vk=2qtmxpJJ2bbTLLm}h&Df)y8_Sg$s|B_uG z7eFN(&AFD^oXYT&BYyX)SahNaf)Tb0&|*^}tA_mfeqCuoU90=YlJ^h)#W&Wn<{n8FX$4>?ksZ4cdigvud|fb9`MpB< zy*1z;D+p^%4n4_RvJbHx5bp@AQu)Ze^}gOGLJJ;GXYmNE`rO<=gHW=p{^5}xgrP^E zbC~lS^dDo5#3jPOtHCfFH7?UKKOCD{lNtOv zjrYeRQ2=|i2I;HD?@`_FUcI+wp01el<6wIE`-8%d62la9`~qO^ZlIG?e>C(zy!e?cEugG2EcLF`8NB;-Osw=Hn}vHg;yc`OF3@bgP2SA(67=Q z4#4MX;Se-w`$%&KBV(5A+zVB@f{LYjWb-USt&tXl=1{yJc4HQ!c<9y8{}e>WNt61G z@B#x-i|tXfJLM=$FrC+4eaG%k{(I;9YZ+et+FEt*;`>_qAd?Sl&Byku__P3wBx3KU zJhGe38<*?YTneQLDX9z& zbB@i-RBJb>PxF!mhKoefJpEl80Qg8i!|Nl@;~ZTp8UJ3gRw6eAOf07taBq;tEd6?> z)b`xzD7}ge<%LIG>v5s{=3GxUYp_c1uG6FI>2Dt$xJb6ZA*DC2n|;R#j!UXs>fEaE zG)OLmvUTv_q4%I*?ybz}*O7m6L3h{U{&vw7CVtr@tU|>tF!lDY?QA(2zG;a$!ggTF z{-+O%h?j>b)d;yrwKaYl3x%H(d_^dxl!%rykAKXcsn~Tkw1XP5AN-N)pTvC}`&Esy z=vB*>A1akxbs2BF9R6KpfQmT4Xhp5l$o7AakIQ*KufmmBryrESOpv<@GBq{#bnlEO zd!4Qti9xABOYM(-l8%_GU9~h$UJci^g1&+;b=#_{V^^ud(wv>ln>8;bZM#IINKU;KQDsZ zH9nxGi@7A=GLS&VWuZ=6!zqw*W$#d7kRfh2LgU^2Zxm58S6HhzS$#RqRI|JfM&b`F z`*MDxl*9W>MzR94I*c+Mhp&bsbu{`vCv+odJZuNLN{HZ9w9sUW=H94HA#>Z|ns8^y zai%!?|L&V`N9d>1E3XS2Ue^+t%0wb zS6X|d=S5xXfun4c6fM?1vu~w-sVk9If^2J^EoL!*I$I)MR#>%d(kJm3094&KLBT)8 zzXZkxT5BVCRJrEbG=Tj&xSI@VOVR5Nh|X8FsbuIoL68+G^hS>K*kzS^Vz`Bxn_be| z_8eKZe@xp~a@dkNg?zV_vf&U3Sn1BOxvzJ7EAaV1i!xVTbM4*KajQX z-+^Z{I0G(h2je$*9y5CQHb2U&vJw)qs9tgYdC9h}$0Ct?4MyiP=KN&*YxeJlMLAKA zy`JAmXo27gGECriWivG)K)#C*zEcOwmIy7YPFOl>K{IQ)PkS{ z#McE0YoS9h_ELQIeS#_d8+6VlaBvD-VPAfB_rqhShNiy4(Awj@nL`VQSb(ZzPDBdX z33?FuL#3-{;5-Ct682{GR#ik4o>5q3)VV|?G6d=_v77}NX*4N7waZU+yDvlr&FtAe zljt}0Z>>hSf)mq;=ro>6?9%9VXYRE@7?|9NIHXea(2khJbe7WWo?(~JJ4I3H){&iD z(2QEBhaOq~c`Y7mJ1}}iNNc$WY!qux>v~2V>vtRPm0WiSiba#)siT#!GXp@y&Vr7z~-$ST#3;CnROZ2x8=oJXq z?+EY(u``T4<9`P^1@Q8DRLh)tokR?gU(vkVWv=QFZ#8={%8|g}gW+iXk}9y}_hF_pwdoue(CA8VS7NYh2dV z4Y=pz&9r$N%nSW?#IUm9vn+U9(lhP*K6L~Mtv4-8C&?1i5hE*$gcTHV@dP;vry<`# zUBRGw4NakD{5GgpfcK1uML4&uqG|(DpYb&$wJW-Qo($Cq@i=@rdi!Bu*QE5QdRpW7~dbAav zUHXA(D6%m{lOcVwa-;9?aEOU~G7mSu0Cpx0(~jwKBF~(5Q@XgosGpxVAV}yEOe#b@ zIXJ)o;Jt%~O$V!QYWP}h`H>i0%&|I=@T&YI_S3X6ngOJ3XH^Ej8~Dm?+JRq{?V7MU z=g-V&rZHKLbT1+CJG+06Z2k5d*!O$LyI|z zeL5fh_pG&J^_idV=%mGil`mGnu{0Kd-6H=hhhc!IaJt5e=IVjouUKbLJ5oe<^5_=a zShl817^-&w=PkMmU1u>pXE?ab*~K-GsZ}Up|JqOZg&{BSA-tza?j%#=u6}Hm=fi76 z`&R{Qif}Cg+v%g@aG2Oitre`ZQ<=f1gNl;-cflWCm6Z!lg2!+k=VRwQ|FYc>MU5ki zg#9AoFG>c`P#K)2AxV(gT)-7o$Y;47!Nfh8oqUG!bVOey9zK28YADu~kPvSKk>>Y} zp5P0^*VpxT_ScgzssfF_V7)B6U5~E`+(W$aW@CmVsRi^>9PH5zJ2%$Id*q~3i|5o0 z4yKwawrr!*!=CY?5LapMqsNKma?SQxMtrTZ`(+TymdvK<#b@g><$;9MUQ9s%-|qtA zOT)P+oS})hUkFi9Ro&N1i4h#biZ1t_l(8Epc+Fze3kS;08K*R;*qGGKlg~xDNJtgw6W0662!&9 zQo^h>KKhp(+L#H|pIb{j84;lwC=ZHF4|B2uAG%xjC(Ru^7nl$YmhP z2t@#x-eb>3z1(kkoxnsM9g9Z@k7S;(oaNs#F?|pbgUIq8CWqXoj#cgbS~|$VPY>f{ zWnf*;neDcknwnzrzY8^E^}EwKm~6T|M9!DBZ`&zO2kUuF%j#59ZV%~?jM{YPu_2t< zCKhma)PSz$(nISIO#i*7Zk}=y_p?=~(YpPd!6KN{h1rwN3G=Ovp?hnd>as6{l|ufD zv5cC$J#QwjK)8~6F>-hVOvHjvCub;N5;1G<=zu?Yp?&nGzr75}2MeN2$|tqSE^%B# z#3y8hb?aX^r}OD9>S*3hd>s4~V%yY&ab0tMYF!$(;RuUAPEtD<>`wnF(Xzp;!qP!+ z1Z=q>=#j+;T#nKq)P$lHM5sbTPS{#e8- zqXCCZZ=A+ElA%TXnvtMpcvP*|>b0W_&z}6FS*Vp*q)goUOmq?g-t}#nMDYBR2MRlj zK3$kWFCPSA%n=GE43>s3ovV^KwD34R3q%y3O)j9T!bg8hLVH+N;XeeJWIVeFPcEL# zPLzkKGhrgKTNajU1k4m z^=(!9caukgZgzwbqGEu>5=uTv>`$_j+-k)|sN8puq;r=CUx5DONd z{xqWd0rD0^DEJfvNQ4ATiZXF4RzV?>(j<)T_t{$+M;N8j<&rtCO!Y!jABMgSz&u8y z@5+fF{atT!HEvTxK6{+$#Jz_7qlXaZq_TLi(Uv9{6(uetlG>$JKe~$UikF^``&}#gB{&kaVYjHa2Q;l?vAS zMPIv1gjb=p;=KaJ7ru$N+t>#Fy=KTvJkO&@kF71d2aR)_%&IGlX7e(znvt(DM|pY> z%!iOXtaKelq5VGEpYg$Aws2gmm!O)ANCL#0WGapL48>k0q}Wf>_eLOW5gohHsJIo3q|5W93a^Wa%)6ZN2iD!t)C}RkS&Y`bX+x2gJyK{9yX?=lE}EqFC74?evId-?7X7EOGx8`cMrRs zXenw`bdk8G2x$pw^k#2;nZN|{k^zx)Aj0uMy5qEN3ULI1h_zf5c z)QP(735RKAxl$Eg*zq9&5zIrO`O>Q zDYhr#bWZ8R2NZz{*mV3%+cS}sbXXmP=w`CN60FwVX{5mRPXlvqgcA%zJh)Jjs6+c# z^^=8kM`sfK-+#XbzCXA=OhvG46H#q(?iz-ac#B<8)mL2ntIcE|pDZZ~2}M@#ePtx{ zpXn6Yk580iKi|bw5W#;$6*V)C%J-Q$!8P_dI*=eHpbS?_dqG|5-kgHGX+X{pflA_C zEDQYOB9&C(>PXA&qj!qXNpg+$0=^aZhu@bgI6!VU&%(B@nbnFHe2N`iwq((l6{F`1 zqXGnh1}?fsm6#geNv;WPH!OpUjDGc!!~+B!3x=qMa!Z8gadHpes@5TY@8crkCW-Xu zgZ>wZW$VOmGKTeS?>P&cCH~T8#4YG z@kCp)+R6qQ_p-9Ev?zzQq5j{?N1E^Pb1RWPiEL8jro*4bFNNhdY2rQ|>OM@Eu9CSV zmTInkizkr)S(0}Ytx&+=)lu_s|2ie1#k?Sf(;bTZ?G8MsL>&4#QhNc;hWLeL$xlF+wNhSkB zcx=F!N)BnW0hPg+NoBT^0T@Dr@D=GKK?c+52_>_(y-Er${XcN6ncBxFhe--VUIWKB z;MFU2tiJd5?UxJswUEdH0-UURTiJxzL)nV1>E6 z3m3=UZK^sA@Ki%2k#69b0; z*%c}u(Z~~6m|QbFs$mxJ+=z&<-T)D=vWr%)`c=S)7Uu`2X#YXY{LQ$e{%V9l3xA6Z ziQHo-_32Biu={k~!>lzV11}?N&+yxn=u0`FErk944xVx6UHktF1qu50ISwtUIjcXb zL|@#PCjt$*O5*yV_Wa1!^1{JN{%k!MLuW&aAx`L1cTIJvMalcb9BRADyDT8|2rD_a z?Cg+-+LlAr!C7~~-K=1nRCd_KApAZ0B&|n6UU3Z<#L3%?bE3Fgwm98L3hMRpT_gJB zFxQ-oLDf57h2Gpe5>#>q^uPyO=Tw|*Aah<-qIalF<_;dD!gCHp2RH>BIh?~EOC|-> z;}GKUrRworHRzp`1_(C^4e>XgWa-RSjK%SB3;jKnQn*eZgBghx*rc zKe%Tdv)+5qUCZiw(a>T^a4RZC_-ha6la-LYbTqYd1??tB9`Tpx*OwUcXEF3ymPy^W zCh=OSIMxG?RORz4iVcTSl^?G-QH8g<;shwffEw;cW=)|X4<0U=n1w2QGz45bXoPP9 zXyAEo6ELj_fqey&%1MB}u!*N25w3%Em}oz;#-<6!z|qh9PV{{~8pugWyj6j)E-2C# zAx<@G3n-P1#l7quTG6mBZ4vRpw#Kov2WEw0YmdzwN(HPTIqh`!TEI?#BH^oQyX&gD zEX{<&m_b$)(J^eFz_tmSHOPTY#4DV%>B(2rTyxv$# z?8WSv=0#*9HpOb5X(V29ISp6HkR6*#@N~$$x*%G2mLoYR=g2qdsI~IrtAA0TlM(OOtDc9a62*ySmZzp8ujmgs#TI%=J z^82s@aatITW?EUEpabR|3x1PnUkSEP`}E%wF*EZU2fTjGB+Ydq%|&KN3PY;}k)wGU z{W>ix^!kc{m^p2dEa;EHoN^8vJ9kASCCNf^T=-?4u@*as*8KwdrR0hp4V-xO zUL2ull?6NyW$uZfWgJPwO-0?!k2w9P|9n+R>IaGBEoNoRd^#0YZN1CNboTVxV$HXm zf(Ut-UznWWupDeQ0c!vN1+ehJl7h({vt#M? zF1H3g6P8xLnj9m_H{q}d5BX66$!bnhYe%mw(R|w}Nb8IO7di+(6 zyyEPu>>U7eU@^~2w7Ze%5qxCgU5%2~p*}H57VgqD6U)v`6%z>12{20n8veOb4Pmc~ z7*HkFr_>+#7-&HM0j%XdU6~7DUoGGYBAlF@(k{S{HRwCb9LHQZwV8{MhsE_!u(AxO zc%Nn;@63ZUATBP9bG$Hs+E0M12e>}L<^H#$*OsMj!L1x(l0^ktq97s+oXVVuIR(Nn zkNR1>)fS_8IOaCESx=_fm3Sq)oU}#UiAClug&ARE4wdu%Nf>#TeM<%BpgTNACJvc) z0bR7pt1)K>4)p|CeF&YtEZ#?N^sX{E6J`c0&$9#Am(DpB12gH&W2`fwodoxkXUo!K z5S{ESV;gzm(|FmM92J#(h0#f8gpFyTTO#m*a2D{)BHeO?oYO+>CZX2|Ij7!M;{us) z=h)+i;9c}L?$1bJ+a|4daHfpGXqgDr<%hBvYGZ^(6>7kI7Ap8ZfVV10=p&u_lO^{b_Mhs~#G zQ4%1UIS=g8S66b#%sO< z%iJ5X!?PQ3fum-I_KqKz!Fn(B4gm2EfRTHatCvG|katCZ+RUMT2efe9oUUqXYUACr z*^E-edpFlK)1fAKj%MdA0*v~@T%8B_bgIF0XdL>&fF4_CE?7T?+Yke)KvP#k87ON2 z&a71~p`%f)yv|&~X8R0(tVcf|2cV{p8*eEXP;PA6Xuflzk|$_N<_iKJ-(x4di2~sr zyd>U%0~pAITS_;0SM2(_6QJBGAB#mxaJ zH`LXSHB)&wjz+r51EXbq4b3}i>!b)%+6RMATpQ+^)*wKSQUahh(}s=a+oqu4)5t(4J1Bol;O3 z)9o-UxYv7zxu{&iJo#C~&ob0jKotd?64n+-2dzChodQJNgLUu-4;>xWl zf3CLy)en0Lsic$Z+`{%YDUkAged7aN<<9(EZUcExd{TT7mEe@WqYi$zy}T_s&>eL6 zT9Yc(`%cpxG`RY{*;z)4h|$q{{#E*^KwAYBd;9iR(=qRpgcSQ~=HC$dFCQ{(elY)F QwEzGB07*qoM6N<$f?9ASJOBUy literal 0 HcmV?d00001 diff --git a/rendering/data/styles/bright-v9/sprite@2x.json b/rendering/data/styles/bright-v9/sprite@2x.json new file mode 100644 index 0000000000..24158e69f1 --- /dev/null +++ b/rendering/data/styles/bright-v9/sprite@2x.json @@ -0,0 +1 @@ +{"airfield-15":{"width":42,"height":42,"x":0,"y":0,"pixelRatio":2,"visible":true},"airport-15":{"width":42,"height":42,"x":42,"y":0,"pixelRatio":2,"visible":true},"alcohol-shop-15":{"width":42,"height":42,"x":0,"y":42,"pixelRatio":2,"visible":true},"amusement-park-15":{"width":42,"height":42,"x":42,"y":42,"pixelRatio":2,"visible":true},"aquarium-15":{"width":42,"height":42,"x":84,"y":0,"pixelRatio":2,"visible":true},"art-gallery-15":{"width":42,"height":42,"x":126,"y":0,"pixelRatio":2,"visible":true},"attraction-15":{"width":42,"height":42,"x":84,"y":42,"pixelRatio":2,"visible":true},"bakery-15":{"width":42,"height":42,"x":126,"y":42,"pixelRatio":2,"visible":true},"bank-15":{"width":42,"height":42,"x":0,"y":84,"pixelRatio":2,"visible":true},"bar-15":{"width":42,"height":42,"x":42,"y":84,"pixelRatio":2,"visible":true},"beer-15":{"width":42,"height":42,"x":84,"y":84,"pixelRatio":2,"visible":true},"bicycle-15":{"width":42,"height":42,"x":126,"y":84,"pixelRatio":2,"visible":true},"bicycle-share-15":{"width":42,"height":42,"x":0,"y":126,"pixelRatio":2,"visible":true},"bus-15":{"width":42,"height":42,"x":42,"y":126,"pixelRatio":2,"visible":true},"cafe-15":{"width":42,"height":42,"x":84,"y":126,"pixelRatio":2,"visible":true},"campsite-15":{"width":42,"height":42,"x":126,"y":126,"pixelRatio":2,"visible":true},"car-15":{"width":42,"height":42,"x":168,"y":0,"pixelRatio":2,"visible":true},"castle-15":{"width":42,"height":42,"x":210,"y":0,"pixelRatio":2,"visible":true},"cemetery-15":{"width":42,"height":42,"x":252,"y":0,"pixelRatio":2,"visible":true},"cinema-15":{"width":42,"height":42,"x":294,"y":0,"pixelRatio":2,"visible":true},"circle-15":{"width":42,"height":42,"x":168,"y":42,"pixelRatio":2,"visible":true},"circle-stroked-15":{"width":42,"height":42,"x":210,"y":42,"pixelRatio":2,"visible":true},"clothing-store-15":{"width":42,"height":42,"x":252,"y":42,"pixelRatio":2,"visible":true},"college-15":{"width":42,"height":42,"x":294,"y":42,"pixelRatio":2,"visible":true},"dentist-15":{"width":42,"height":42,"x":168,"y":84,"pixelRatio":2,"visible":true},"doctor-15":{"width":42,"height":42,"x":210,"y":84,"pixelRatio":2,"visible":true},"dog-park-15":{"width":42,"height":42,"x":252,"y":84,"pixelRatio":2,"visible":true},"drinking-water-15":{"width":42,"height":42,"x":294,"y":84,"pixelRatio":2,"visible":true},"embassy-15":{"width":42,"height":42,"x":168,"y":126,"pixelRatio":2,"visible":true},"entrance-15":{"width":42,"height":42,"x":210,"y":126,"pixelRatio":2,"visible":true},"fast-food-15":{"width":42,"height":42,"x":252,"y":126,"pixelRatio":2,"visible":true},"ferry-15":{"width":42,"height":42,"x":294,"y":126,"pixelRatio":2,"visible":true},"fire-station-15":{"width":42,"height":42,"x":0,"y":168,"pixelRatio":2,"visible":true},"fuel-15":{"width":42,"height":42,"x":42,"y":168,"pixelRatio":2,"visible":true},"garden-15":{"width":42,"height":42,"x":84,"y":168,"pixelRatio":2,"visible":true},"golf-15":{"width":42,"height":42,"x":126,"y":168,"pixelRatio":2,"visible":true},"grocery-15":{"width":42,"height":42,"x":168,"y":168,"pixelRatio":2,"visible":true},"harbor-15":{"width":42,"height":42,"x":210,"y":168,"pixelRatio":2,"visible":true},"heliport-15":{"width":42,"height":42,"x":252,"y":168,"pixelRatio":2,"visible":true},"hospital-15":{"width":42,"height":42,"x":294,"y":168,"pixelRatio":2,"visible":true},"ice-cream-15":{"width":42,"height":42,"x":0,"y":210,"pixelRatio":2,"visible":true},"information-15":{"width":42,"height":42,"x":42,"y":210,"pixelRatio":2,"visible":true},"laundry-15":{"width":42,"height":42,"x":84,"y":210,"pixelRatio":2,"visible":true},"library-15":{"width":42,"height":42,"x":126,"y":210,"pixelRatio":2,"visible":true},"lodging-15":{"width":42,"height":42,"x":168,"y":210,"pixelRatio":2,"visible":true},"marker-15":{"width":42,"height":42,"x":210,"y":210,"pixelRatio":2,"visible":true},"monument-15":{"width":42,"height":42,"x":252,"y":210,"pixelRatio":2,"visible":true},"mountain-15":{"width":42,"height":42,"x":294,"y":210,"pixelRatio":2,"visible":true},"museum-15":{"width":42,"height":42,"x":0,"y":252,"pixelRatio":2,"visible":true},"music-15":{"width":42,"height":42,"x":42,"y":252,"pixelRatio":2,"visible":true},"park-15":{"width":42,"height":42,"x":84,"y":252,"pixelRatio":2,"visible":true},"pharmacy-15":{"width":42,"height":42,"x":126,"y":252,"pixelRatio":2,"visible":true},"picnic-site-15":{"width":42,"height":42,"x":168,"y":252,"pixelRatio":2,"visible":true},"place-of-worship-15":{"width":42,"height":42,"x":210,"y":252,"pixelRatio":2,"visible":true},"playground-15":{"width":42,"height":42,"x":252,"y":252,"pixelRatio":2,"visible":true},"police-15":{"width":42,"height":42,"x":294,"y":252,"pixelRatio":2,"visible":true},"post-15":{"width":42,"height":42,"x":0,"y":294,"pixelRatio":2,"visible":true},"prison-15":{"width":42,"height":42,"x":42,"y":294,"pixelRatio":2,"visible":true},"rail-15":{"width":42,"height":42,"x":84,"y":294,"pixelRatio":2,"visible":true},"rail-light-15":{"width":42,"height":42,"x":126,"y":294,"pixelRatio":2,"visible":true},"rail-metro-15":{"width":42,"height":42,"x":168,"y":294,"pixelRatio":2,"visible":true},"religious-christian-15":{"width":42,"height":42,"x":210,"y":294,"pixelRatio":2,"visible":true},"religious-jewish-15":{"width":42,"height":42,"x":252,"y":294,"pixelRatio":2,"visible":true},"religious-muslim-15":{"width":42,"height":42,"x":294,"y":294,"pixelRatio":2,"visible":true},"restaurant-15":{"width":42,"height":42,"x":336,"y":0,"pixelRatio":2,"visible":true},"rocket-15":{"width":42,"height":42,"x":378,"y":0,"pixelRatio":2,"visible":true},"school-15":{"width":42,"height":42,"x":420,"y":0,"pixelRatio":2,"visible":true},"shop-15":{"width":42,"height":42,"x":462,"y":0,"pixelRatio":2,"visible":true},"stadium-15":{"width":42,"height":42,"x":504,"y":0,"pixelRatio":2,"visible":true},"star-15":{"width":42,"height":42,"x":546,"y":0,"pixelRatio":2,"visible":true},"suitcase-15":{"width":42,"height":42,"x":588,"y":0,"pixelRatio":2,"visible":true},"swimming-15":{"width":42,"height":42,"x":630,"y":0,"pixelRatio":2,"visible":true},"theatre-15":{"width":42,"height":42,"x":336,"y":42,"pixelRatio":2,"visible":true},"toilet-15":{"width":42,"height":42,"x":378,"y":42,"pixelRatio":2,"visible":true},"town-hall-15":{"width":42,"height":42,"x":420,"y":42,"pixelRatio":2,"visible":true},"triangle-15":{"width":42,"height":42,"x":462,"y":42,"pixelRatio":2,"visible":true},"triangle-stroked-15":{"width":42,"height":42,"x":504,"y":42,"pixelRatio":2,"visible":true},"veterinary-15":{"width":42,"height":42,"x":546,"y":42,"pixelRatio":2,"visible":true},"volcano-15":{"width":42,"height":42,"x":588,"y":42,"pixelRatio":2,"visible":true},"zoo-15":{"width":42,"height":42,"x":630,"y":42,"pixelRatio":2,"visible":true},"motorway_1":{"width":36,"height":36,"x":336,"y":84,"pixelRatio":2,"visible":true},"motorway_2":{"width":50,"height":36,"x":372,"y":84,"pixelRatio":2,"visible":true},"motorway_3":{"width":64,"height":36,"x":422,"y":84,"pixelRatio":2,"visible":true},"motorway_4":{"width":78,"height":36,"x":486,"y":84,"pixelRatio":2,"visible":true},"motorway_5":{"width":90,"height":36,"x":564,"y":84,"pixelRatio":2,"visible":true},"motorway_6":{"width":100,"height":36,"x":336,"y":126,"pixelRatio":2,"visible":true},"airfield-11":{"width":34,"height":34,"x":436,"y":126,"pixelRatio":2,"visible":true},"airport-11":{"width":34,"height":34,"x":470,"y":126,"pixelRatio":2,"visible":true},"alcohol-shop-11":{"width":34,"height":34,"x":504,"y":126,"pixelRatio":2,"visible":true},"amusement-park-11":{"width":34,"height":34,"x":538,"y":126,"pixelRatio":2,"visible":true},"aquarium-11":{"width":34,"height":34,"x":572,"y":126,"pixelRatio":2,"visible":true},"art-gallery-11":{"width":34,"height":34,"x":606,"y":126,"pixelRatio":2,"visible":true},"attraction-11":{"width":34,"height":34,"x":336,"y":168,"pixelRatio":2,"visible":true},"bakery-11":{"width":34,"height":34,"x":370,"y":168,"pixelRatio":2,"visible":true},"bank-11":{"width":34,"height":34,"x":404,"y":168,"pixelRatio":2,"visible":true},"bar-11":{"width":34,"height":34,"x":438,"y":168,"pixelRatio":2,"visible":true},"beer-11":{"width":34,"height":34,"x":472,"y":168,"pixelRatio":2,"visible":true},"bicycle-11":{"width":34,"height":34,"x":506,"y":168,"pixelRatio":2,"visible":true},"bicycle-share-11":{"width":34,"height":34,"x":540,"y":168,"pixelRatio":2,"visible":true},"bus-11":{"width":34,"height":34,"x":574,"y":168,"pixelRatio":2,"visible":true},"cafe-11":{"width":34,"height":34,"x":608,"y":168,"pixelRatio":2,"visible":true},"campsite-11":{"width":34,"height":34,"x":336,"y":210,"pixelRatio":2,"visible":true},"car-11":{"width":34,"height":34,"x":370,"y":210,"pixelRatio":2,"visible":true},"castle-11":{"width":34,"height":34,"x":404,"y":210,"pixelRatio":2,"visible":true},"cemetery-11":{"width":34,"height":34,"x":438,"y":210,"pixelRatio":2,"visible":true},"cinema-11":{"width":34,"height":34,"x":472,"y":210,"pixelRatio":2,"visible":true},"circle-11":{"width":34,"height":34,"x":506,"y":210,"pixelRatio":2,"visible":true},"circle-stroked-11":{"width":34,"height":34,"x":540,"y":210,"pixelRatio":2,"visible":true},"clothing-store-11":{"width":34,"height":34,"x":574,"y":210,"pixelRatio":2,"visible":true},"college-11":{"width":34,"height":34,"x":608,"y":210,"pixelRatio":2,"visible":true},"dentist-11":{"width":34,"height":34,"x":336,"y":252,"pixelRatio":2,"visible":true},"doctor-11":{"width":34,"height":34,"x":370,"y":252,"pixelRatio":2,"visible":true},"dog-park-11":{"width":34,"height":34,"x":404,"y":252,"pixelRatio":2,"visible":true},"drinking-water-11":{"width":34,"height":34,"x":438,"y":252,"pixelRatio":2,"visible":true},"embassy-11":{"width":34,"height":34,"x":472,"y":252,"pixelRatio":2,"visible":true},"entrance-11":{"width":34,"height":34,"x":506,"y":252,"pixelRatio":2,"visible":true},"fast-food-11":{"width":34,"height":34,"x":540,"y":252,"pixelRatio":2,"visible":true},"ferry-11":{"width":34,"height":34,"x":574,"y":252,"pixelRatio":2,"visible":true},"fire-station-11":{"width":34,"height":34,"x":608,"y":252,"pixelRatio":2,"visible":true},"fuel-11":{"width":34,"height":34,"x":336,"y":294,"pixelRatio":2,"visible":true},"garden-11":{"width":34,"height":34,"x":370,"y":294,"pixelRatio":2,"visible":true},"golf-11":{"width":34,"height":34,"x":404,"y":294,"pixelRatio":2,"visible":true},"grocery-11":{"width":34,"height":34,"x":438,"y":294,"pixelRatio":2,"visible":true},"harbor-11":{"width":34,"height":34,"x":472,"y":294,"pixelRatio":2,"visible":true},"heliport-11":{"width":34,"height":34,"x":506,"y":294,"pixelRatio":2,"visible":true},"hospital-11":{"width":34,"height":34,"x":540,"y":294,"pixelRatio":2,"visible":true},"ice-cream-11":{"width":34,"height":34,"x":574,"y":294,"pixelRatio":2,"visible":true},"information-11":{"width":34,"height":34,"x":608,"y":294,"pixelRatio":2,"visible":true},"laundry-11":{"width":34,"height":34,"x":0,"y":336,"pixelRatio":2,"visible":true},"library-11":{"width":34,"height":34,"x":34,"y":336,"pixelRatio":2,"visible":true},"lodging-11":{"width":34,"height":34,"x":68,"y":336,"pixelRatio":2,"visible":true},"marker-11":{"width":34,"height":34,"x":102,"y":336,"pixelRatio":2,"visible":true},"monument-11":{"width":34,"height":34,"x":136,"y":336,"pixelRatio":2,"visible":true},"mountain-11":{"width":34,"height":34,"x":170,"y":336,"pixelRatio":2,"visible":true},"museum-11":{"width":34,"height":34,"x":204,"y":336,"pixelRatio":2,"visible":true},"music-11":{"width":34,"height":34,"x":238,"y":336,"pixelRatio":2,"visible":true},"park-11":{"width":34,"height":34,"x":272,"y":336,"pixelRatio":2,"visible":true},"pharmacy-11":{"width":34,"height":34,"x":306,"y":336,"pixelRatio":2,"visible":true},"picnic-site-11":{"width":34,"height":34,"x":340,"y":336,"pixelRatio":2,"visible":true},"place-of-worship-11":{"width":34,"height":34,"x":374,"y":336,"pixelRatio":2,"visible":true},"playground-11":{"width":34,"height":34,"x":408,"y":336,"pixelRatio":2,"visible":true},"police-11":{"width":34,"height":34,"x":442,"y":336,"pixelRatio":2,"visible":true},"post-11":{"width":34,"height":34,"x":476,"y":336,"pixelRatio":2,"visible":true},"prison-11":{"width":34,"height":34,"x":510,"y":336,"pixelRatio":2,"visible":true},"rail-11":{"width":34,"height":34,"x":544,"y":336,"pixelRatio":2,"visible":true},"rail-light-11":{"width":34,"height":34,"x":578,"y":336,"pixelRatio":2,"visible":true},"rail-metro-11":{"width":34,"height":34,"x":612,"y":336,"pixelRatio":2,"visible":true},"religious-christian-11":{"width":34,"height":34,"x":0,"y":370,"pixelRatio":2,"visible":true},"religious-jewish-11":{"width":34,"height":34,"x":34,"y":370,"pixelRatio":2,"visible":true},"religious-muslim-11":{"width":34,"height":34,"x":68,"y":370,"pixelRatio":2,"visible":true},"restaurant-11":{"width":34,"height":34,"x":102,"y":370,"pixelRatio":2,"visible":true},"rocket-11":{"width":34,"height":34,"x":136,"y":370,"pixelRatio":2,"visible":true},"school-11":{"width":34,"height":34,"x":170,"y":370,"pixelRatio":2,"visible":true},"shop-11":{"width":34,"height":34,"x":204,"y":370,"pixelRatio":2,"visible":true},"stadium-11":{"width":34,"height":34,"x":238,"y":370,"pixelRatio":2,"visible":true},"star-11":{"width":34,"height":34,"x":272,"y":370,"pixelRatio":2,"visible":true},"suitcase-11":{"width":34,"height":34,"x":306,"y":370,"pixelRatio":2,"visible":true},"swimming-11":{"width":34,"height":34,"x":340,"y":370,"pixelRatio":2,"visible":true},"theatre-11":{"width":34,"height":34,"x":374,"y":370,"pixelRatio":2,"visible":true},"toilet-11":{"width":34,"height":34,"x":408,"y":370,"pixelRatio":2,"visible":true},"town-hall-11":{"width":34,"height":34,"x":442,"y":370,"pixelRatio":2,"visible":true},"triangle-11":{"width":34,"height":34,"x":476,"y":370,"pixelRatio":2,"visible":true},"triangle-stroked-11":{"width":34,"height":34,"x":510,"y":370,"pixelRatio":2,"visible":true},"veterinary-11":{"width":34,"height":34,"x":544,"y":370,"pixelRatio":2,"visible":true},"volcano-11":{"width":34,"height":34,"x":578,"y":370,"pixelRatio":2,"visible":true},"zoo-11":{"width":34,"height":34,"x":612,"y":370,"pixelRatio":2,"visible":true},"wave":{"width":32,"height":16,"x":640,"y":126,"pixelRatio":2,"visible":true}} \ No newline at end of file diff --git a/rendering/data/styles/bright-v9/sprite@2x.png b/rendering/data/styles/bright-v9/sprite@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..51d939aa336aaf6f85564b52d814012d6be2600d GIT binary patch literal 44976 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 U`Ol^I5Wwe=kx&$`7Bvd`FY$D%;{X5v literal 0 HcmV?d00001 diff --git a/rendering/data/styles/bright-v9/style.json b/rendering/data/styles/bright-v9/style.json new file mode 100644 index 0000000000..c6a6efb3ec --- /dev/null +++ b/rendering/data/styles/bright-v9/style.json @@ -0,0 +1,4035 @@ +{ + "version": 8, + "name": "Bright", + "metadata": { + "mapbox:autocomposite": true, + "mapbox:type": "template", + "mapbox:groups": { + "1444849364238.8171": { + "name": "Buildings", + "collapsed": true + }, + "1444849354174.1904": { + "name": "Tunnels", + "collapsed": true + }, + "1444849320558.5054": { + "name": "Water labels", + "collapsed": true + }, + "1444849371739.5945": { + "name": "Aeroways", + "collapsed": true + }, + "1444849258897.3083": { + "name": "Marine labels", + "collapsed": true + }, + "1444849388993.3071": { + "name": "Landuse", + "collapsed": true + }, + "1444849242106.713": { + "name": "Country labels", + "collapsed": true + }, + "1444849382550.77": { + "name": "Water", + "collapsed": true + }, + "1444849345966.4436": { + "name": "Roads", + "collapsed": true + }, + "1444849307123.581": { + "name": "Admin lines", + "collapsed": true + }, + "1456163609504.0715": { + "name": "Road labels", + "collapsed": true + }, + "1444849272561.29": { + "name": "Place labels", + "collapsed": true + }, + "1444849290021.1838": { + "name": "Road labels", + "collapsed": true + }, + "1444849334699.1902": { + "name": "Bridges", + "collapsed": true + }, + "1444849297111.495": { + "name": "POI labels", + "collapsed": true + } + } + }, + "sources": { + "mapbox": { + "url": "/data/styles/bright-v9/mapbox-streets-v7/{z}/{x}/{y}.vector.pbf", + "type": "vector" + } + }, + "center": [ + -118.2518, + 34.0442 + ], + "zoom": 15, + "sprite": "/data/styles/bright-v9/sprite", + "glyphs": "/data/styles/bright-v9/fonts/mapbox/{fontstack}/{range}.pbf", + "layers": [ + { + "id": "background", + "type": "background", + "paint": { + "background-color": "#f8f4f0" + }, + "interactive": true + }, + { + "id": "landuse_overlay_national_park", + "type": "fill", + "source": "mapbox", + "source-layer": "landuse_overlay", + "filter": [ + "==", + "class", + "national_park" + ], + "paint": { + "fill-color": "#d8e8c8", + "fill-opacity": 0.75 + }, + "metadata": { + "mapbox:group": "1444849388993.3071" + }, + "interactive": true + }, + { + "id": "landuse_park", + "type": "fill", + "source": "mapbox", + "source-layer": "landuse", + "filter": [ + "==", + "class", + "park" + ], + "paint": { + "fill-color": "#d8e8c8" + }, + "metadata": { + "mapbox:group": "1444849388993.3071" + }, + "interactive": true + }, + { + "id": "landuse_cemetery", + "type": "fill", + "source": "mapbox", + "source-layer": "landuse", + "filter": [ + "==", + "class", + "cemetery" + ], + "paint": { + "fill-color": "#e0e4dd" + }, + "metadata": { + "mapbox:group": "1444849388993.3071" + }, + "interactive": true + }, + { + "id": "landuse_hospital", + "type": "fill", + "source": "mapbox", + "source-layer": "landuse", + "filter": [ + "==", + "class", + "hospital" + ], + "paint": { + "fill-color": "#fde" + }, + "metadata": { + "mapbox:group": "1444849388993.3071" + }, + "interactive": true + }, + { + "id": "landuse_school", + "type": "fill", + "source": "mapbox", + "source-layer": "landuse", + "filter": [ + "==", + "class", + "school" + ], + "paint": { + "fill-color": "#f0e8f8" + }, + "metadata": { + "mapbox:group": "1444849388993.3071" + }, + "interactive": true + }, + { + "id": "landuse_wood", + "type": "fill", + "source": "mapbox", + "source-layer": "landuse", + "filter": [ + "==", + "class", + "wood" + ], + "paint": { + "fill-color": "#6a4", + "fill-opacity": 0.1 + }, + "metadata": { + "mapbox:group": "1444849388993.3071" + }, + "interactive": true + }, + { + "interactive": true, + "layout": { + "line-cap": "round" + }, + "metadata": { + "mapbox:group": "1444849382550.77" + }, + "filter": [ + "all", + [ + "!=", + "class", + "river" + ], + [ + "!=", + "class", + "stream" + ], + [ + "!=", + "class", + "canal" + ] + ], + "type": "line", + "source": "mapbox", + "id": "waterway", + "paint": { + "line-color": "#a0c8f0", + "line-width": { + "base": 1.3, + "stops": [ + [ + 13, + 0.5 + ], + [ + 20, + 2 + ] + ] + } + }, + "source-layer": "waterway" + }, + { + "interactive": true, + "layout": { + "line-cap": "round" + }, + "metadata": { + "mapbox:group": "1444849382550.77" + }, + "filter": [ + "==", + "class", + "river" + ], + "type": "line", + "source": "mapbox", + "id": "waterway_river", + "paint": { + "line-color": "#a0c8f0", + "line-width": { + "base": 1.2, + "stops": [ + [ + 11, + 0.5 + ], + [ + 20, + 6 + ] + ] + } + }, + "source-layer": "waterway" + }, + { + "interactive": true, + "layout": { + "line-cap": "round" + }, + "metadata": { + "mapbox:group": "1444849382550.77" + }, + "filter": [ + "in", + "class", + "stream", + "canal" + ], + "type": "line", + "source": "mapbox", + "id": "waterway_stream_canal", + "paint": { + "line-color": "#a0c8f0", + "line-width": { + "base": 1.3, + "stops": [ + [ + 13, + 0.5 + ], + [ + 20, + 6 + ] + ] + } + }, + "source-layer": "waterway" + }, + { + "id": "water", + "type": "fill", + "source": "mapbox", + "source-layer": "water", + "paint": { + "fill-color": "#a0c8f0" + }, + "metadata": { + "mapbox:group": "1444849382550.77" + }, + "interactive": true + }, + { + "id": "water_offset", + "paint": { + "fill-color": "white", + "fill-opacity": 0.3, + "fill-translate": [ + 0, + 2.5 + ] + }, + "metadata": { + "mapbox:group": "1444849382550.77" + }, + "interactive": true, + "ref": "water" + }, + { + "id": "water_pattern", + "paint": { + "fill-translate": [ + 0, + 2.5 + ], + "fill-pattern": "wave" + }, + "metadata": { + "mapbox:group": "1444849382550.77" + }, + "interactive": true, + "ref": "water" + }, + { + "interactive": true, + "minzoom": 11, + "metadata": { + "mapbox:group": "1444849371739.5945" + }, + "filter": [ + "==", + "$type", + "Polygon" + ], + "type": "fill", + "source": "mapbox", + "id": "aeroway_fill", + "paint": { + "fill-color": "#f0ede9", + "fill-opacity": 0.7 + }, + "source-layer": "aeroway" + }, + { + "interactive": true, + "minzoom": 11, + "metadata": { + "mapbox:group": "1444849371739.5945" + }, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "==", + "type", + "runway" + ] + ], + "type": "line", + "source": "mapbox", + "id": "aeroway_runway", + "paint": { + "line-color": "#f0ede9", + "line-width": { + "base": 1.2, + "stops": [ + [ + 11, + 3 + ], + [ + 20, + 16 + ] + ] + } + }, + "source-layer": "aeroway" + }, + { + "interactive": true, + "minzoom": 11, + "metadata": { + "mapbox:group": "1444849371739.5945" + }, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "==", + "type", + "taxiway" + ] + ], + "type": "line", + "source": "mapbox", + "id": "aeroway_taxiway", + "paint": { + "line-color": "#f0ede9", + "line-width": { + "base": 1.2, + "stops": [ + [ + 11, + 0.5 + ], + [ + 20, + 6 + ] + ] + } + }, + "source-layer": "aeroway" + }, + { + "id": "building", + "type": "fill", + "source": "mapbox", + "source-layer": "building", + "paint": { + "fill-color": { + "base": 1, + "stops": [ + [ + 15.5, + "#f2eae2" + ], + [ + 16, + "#dfdbd7" + ] + ] + } + }, + "metadata": { + "mapbox:group": "1444849364238.8171" + }, + "interactive": true + }, + { + "id": "building_top", + "paint": { + "fill-color": "#f2eae2", + "fill-opacity": { + "base": 1, + "stops": [ + [ + 15, + 0 + ], + [ + 16, + 1 + ] + ] + }, + "fill-translate": { + "stops": [ + [ + 15, + [ + 0, + 0 + ] + ], + [ + 16, + [ + -2, + -2 + ] + ] + ], + "base": 1 + }, + "fill-outline-color": "#dfdbd7" + }, + "metadata": { + "mapbox:group": "1444849364238.8171" + }, + "interactive": true, + "ref": "building" + }, + { + "interactive": true, + "layout": { + "line-join": "round", + "visibility": "visible" + }, + "metadata": { + "mapbox:group": "1444849354174.1904" + }, + "filter": [ + "all", + [ + "==", + "structure", + "tunnel" + ], + [ + "==", + "class", + "motorway_link" + ] + ], + "type": "line", + "source": "mapbox", + "id": "tunnel_motorway_link_casing", + "paint": { + "line-color": "#e9ac77", + "line-dasharray": [ + 0.5, + 0.25 + ], + "line-width": { + "base": 1.2, + "stops": [ + [ + 12, + 1 + ], + [ + 13, + 3 + ], + [ + 14, + 4 + ], + [ + 20, + 15 + ] + ] + }, + "line-opacity": 1 + }, + "source-layer": "road" + }, + { + "interactive": true, + "layout": { + "line-join": "round" + }, + "metadata": { + "mapbox:group": "1444849354174.1904" + }, + "filter": [ + "all", + [ + "==", + "structure", + "tunnel" + ], + [ + "in", + "class", + "service", + "track" + ] + ], + "type": "line", + "source": "mapbox", + "id": "tunnel_service_track_casing", + "paint": { + "line-color": "#cfcdca", + "line-dasharray": [ + 0.5, + 0.25 + ], + "line-width": { + "base": 1.2, + "stops": [ + [ + 15, + 1 + ], + [ + 16, + 4 + ], + [ + 20, + 11 + ] + ] + } + }, + "source-layer": "road" + }, + { + "interactive": true, + "layout": { + "line-join": "round" + }, + "metadata": { + "mapbox:group": "1444849354174.1904" + }, + "filter": [ + "all", + [ + "==", + "structure", + "tunnel" + ], + [ + "==", + "class", + "link" + ] + ], + "type": "line", + "source": "mapbox", + "id": "tunnel_link_casing", + "paint": { + "line-color": "#e9ac77", + "line-width": { + "base": 1.2, + "stops": [ + [ + 12, + 1 + ], + [ + 13, + 3 + ], + [ + 14, + 4 + ], + [ + 20, + 15 + ] + ] + }, + "line-opacity": 1 + }, + "source-layer": "road" + }, + { + "interactive": true, + "layout": { + "line-join": "round" + }, + "metadata": { + "mapbox:group": "1444849354174.1904" + }, + "filter": [ + "all", + [ + "==", + "structure", + "tunnel" + ], + [ + "in", + "class", + "street", + "street_limited" + ] + ], + "type": "line", + "source": "mapbox", + "id": "tunnel_street_casing", + "paint": { + "line-color": "#cfcdca", + "line-width": { + "base": 1.2, + "stops": [ + [ + 12, + 0.5 + ], + [ + 13, + 1 + ], + [ + 14, + 4 + ], + [ + 20, + 15 + ] + ] + }, + "line-opacity": { + "stops": [ + [ + 12, + 0 + ], + [ + 12.5, + 1 + ] + ] + } + }, + "source-layer": "road" + }, + { + "interactive": true, + "layout": { + "line-join": "round" + }, + "metadata": { + "mapbox:group": "1444849354174.1904" + }, + "filter": [ + "all", + [ + "==", + "structure", + "tunnel" + ], + [ + "in", + "class", + "secondary", + "tertiary" + ] + ], + "type": "line", + "source": "mapbox", + "id": "tunnel_secondary_tertiary_casing", + "paint": { + "line-color": "#e9ac77", + "line-width": { + "base": 1.2, + "stops": [ + [ + 8, + 1.5 + ], + [ + 20, + 17 + ] + ] + }, + "line-opacity": 1 + }, + "source-layer": "road" + }, + { + "interactive": true, + "layout": { + "line-join": "round" + }, + "metadata": { + "mapbox:group": "1444849354174.1904" + }, + "filter": [ + "all", + [ + "==", + "structure", + "tunnel" + ], + [ + "in", + "class", + "trunk", + "primary" + ] + ], + "type": "line", + "source": "mapbox", + "id": "tunnel_trunk_primary_casing", + "paint": { + "line-color": "#e9ac77", + "line-width": { + "base": 1.2, + "stops": [ + [ + 5, + 0.4 + ], + [ + 6, + 0.6 + ], + [ + 7, + 1.5 + ], + [ + 20, + 22 + ] + ] + } + }, + "source-layer": "road" + }, + { + "interactive": true, + "layout": { + "line-join": "round", + "visibility": "visible" + }, + "metadata": { + "mapbox:group": "1444849354174.1904" + }, + "filter": [ + "all", + [ + "==", + "structure", + "tunnel" + ], + [ + "==", + "class", + "motorway" + ] + ], + "type": "line", + "source": "mapbox", + "id": "tunnel_motorway_casing", + "paint": { + "line-color": "#e9ac77", + "line-dasharray": [ + 0.5, + 0.25 + ], + "line-width": { + "base": 1.2, + "stops": [ + [ + 5, + 0.4 + ], + [ + 6, + 0.6 + ], + [ + 7, + 1.5 + ], + [ + 20, + 22 + ] + ] + } + }, + "source-layer": "road" + }, + { + "id": "tunnel_path_pedestrian", + "type": "line", + "source": "mapbox", + "source-layer": "road", + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "structure", + "tunnel" + ], + [ + "in", + "class", + "path", + "pedestrian" + ] + ] + ], + "paint": { + "line-color": "#cba", + "line-dasharray": [ + 1.5, + 0.75 + ], + "line-width": { + "base": 1.2, + "stops": [ + [ + 15, + 1.2 + ], + [ + 20, + 4 + ] + ] + } + }, + "metadata": { + "mapbox:group": "1444849354174.1904" + }, + "interactive": true + }, + { + "interactive": true, + "metadata": { + "mapbox:group": "1444849354174.1904" + }, + "id": "tunnel_motorway_link", + "paint": { + "line-color": "#fc8", + "line-width": { + "base": 1.2, + "stops": [ + [ + 12.5, + 0 + ], + [ + 13, + 1.5 + ], + [ + 14, + 2.5 + ], + [ + 20, + 11.5 + ] + ] + } + }, + "ref": "tunnel_motorway_link_casing" + }, + { + "interactive": true, + "metadata": { + "mapbox:group": "1444849354174.1904" + }, + "id": "tunnel_service_track", + "paint": { + "line-color": "#fff", + "line-width": { + "base": 1.2, + "stops": [ + [ + 15.5, + 0 + ], + [ + 16, + 2 + ], + [ + 20, + 7.5 + ] + ] + } + }, + "ref": "tunnel_service_track_casing" + }, + { + "interactive": true, + "metadata": { + "mapbox:group": "1444849354174.1904" + }, + "id": "tunnel_link", + "paint": { + "line-color": "#fff4c6", + "line-width": { + "base": 1.2, + "stops": [ + [ + 12.5, + 0 + ], + [ + 13, + 1.5 + ], + [ + 14, + 2.5 + ], + [ + 20, + 11.5 + ] + ] + } + }, + "ref": "tunnel_link_casing" + }, + { + "interactive": true, + "metadata": { + "mapbox:group": "1444849354174.1904" + }, + "id": "tunnel_street", + "paint": { + "line-color": "#fff", + "line-width": { + "base": 1.2, + "stops": [ + [ + 13.5, + 0 + ], + [ + 14, + 2.5 + ], + [ + 20, + 11.5 + ] + ] + }, + "line-opacity": 1 + }, + "ref": "tunnel_street_casing" + }, + { + "interactive": true, + "metadata": { + "mapbox:group": "1444849354174.1904" + }, + "id": "tunnel_secondary_tertiary", + "paint": { + "line-color": "#fff4c6", + "line-width": { + "base": 1.2, + "stops": [ + [ + 6.5, + 0 + ], + [ + 7, + 0.5 + ], + [ + 20, + 10 + ] + ] + } + }, + "ref": "tunnel_secondary_tertiary_casing" + }, + { + "interactive": true, + "metadata": { + "mapbox:group": "1444849354174.1904" + }, + "id": "tunnel_trunk_primary", + "paint": { + "line-color": "#fff4c6", + "line-width": { + "base": 1.2, + "stops": [ + [ + 6.5, + 0 + ], + [ + 7, + 0.5 + ], + [ + 20, + 18 + ] + ] + } + }, + "ref": "tunnel_trunk_primary_casing" + }, + { + "interactive": true, + "metadata": { + "mapbox:group": "1444849354174.1904" + }, + "id": "tunnel_motorway", + "paint": { + "line-color": "#ffdaa6", + "line-width": { + "base": 1.2, + "stops": [ + [ + 6.5, + 0 + ], + [ + 7, + 0.5 + ], + [ + 20, + 18 + ] + ] + } + }, + "ref": "tunnel_motorway_casing" + }, + { + "id": "tunnel_major_rail", + "type": "line", + "source": "mapbox", + "source-layer": "road", + "filter": [ + "all", + [ + "==", + "structure", + "tunnel" + ], + [ + "in", + "class", + "major_rail", + "minor_rail" + ] + ], + "paint": { + "line-color": "#bbb", + "line-width": { + "base": 1.4, + "stops": [ + [ + 14, + 0.4 + ], + [ + 15, + 0.75 + ], + [ + 20, + 2 + ] + ] + } + }, + "metadata": { + "mapbox:group": "1444849354174.1904" + }, + "interactive": true + }, + { + "id": "tunnel_major_rail_hatching", + "paint": { + "line-color": "#bbb", + "line-dasharray": [ + 0.2, + 8 + ], + "line-width": { + "base": 1.4, + "stops": [ + [ + 14.5, + 0 + ], + [ + 15, + 3 + ], + [ + 20, + 8 + ] + ] + } + }, + "metadata": { + "mapbox:group": "1444849354174.1904" + }, + "interactive": true, + "ref": "tunnel_major_rail" + }, + { + "interactive": true, + "minzoom": 12, + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "metadata": { + "mapbox:group": "1444849345966.4436" + }, + "filter": [ + "all", + [ + "==", + "class", + "motorway_link" + ], + [ + "!in", + "structure", + "bridge", + "tunnel" + ] + ], + "type": "line", + "source": "mapbox", + "id": "road_motorway_link_casing", + "paint": { + "line-color": "#e9ac77", + "line-width": { + "base": 1.2, + "stops": [ + [ + 12, + 1 + ], + [ + 13, + 3 + ], + [ + 14, + 4 + ], + [ + 20, + 15 + ] + ] + }, + "line-opacity": 1 + }, + "source-layer": "road" + }, + { + "interactive": true, + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "metadata": { + "mapbox:group": "1444849345966.4436" + }, + "filter": [ + "all", + [ + "in", + "class", + "service", + "track" + ], + [ + "!in", + "structure", + "bridge", + "tunnel" + ] + ], + "type": "line", + "source": "mapbox", + "id": "road_service_track_casing", + "paint": { + "line-color": "#cfcdca", + "line-width": { + "base": 1.2, + "stops": [ + [ + 15, + 1 + ], + [ + 16, + 4 + ], + [ + 20, + 11 + ] + ] + } + }, + "source-layer": "road" + }, + { + "interactive": true, + "minzoom": 13, + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "metadata": { + "mapbox:group": "1444849345966.4436" + }, + "filter": [ + "all", + [ + "==", + "class", + "link" + ], + [ + "!in", + "structure", + "bridge", + "tunnel" + ] + ], + "type": "line", + "source": "mapbox", + "id": "road_link_casing", + "paint": { + "line-color": "#e9ac77", + "line-width": { + "base": 1.2, + "stops": [ + [ + 12, + 1 + ], + [ + 13, + 3 + ], + [ + 14, + 4 + ], + [ + 20, + 15 + ] + ] + }, + "line-opacity": 1 + }, + "source-layer": "road" + }, + { + "interactive": true, + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "metadata": { + "mapbox:group": "1444849345966.4436" + }, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "in", + "class", + "street", + "street_limited" + ], + [ + "!in", + "structure", + "bridge", + "tunnel" + ] + ] + ], + "type": "line", + "source": "mapbox", + "id": "road_street_casing", + "paint": { + "line-color": "#cfcdca", + "line-width": { + "base": 1.2, + "stops": [ + [ + 12, + 0.5 + ], + [ + 13, + 1 + ], + [ + 14, + 4 + ], + [ + 20, + 15 + ] + ] + }, + "line-opacity": { + "stops": [ + [ + 12, + 0 + ], + [ + 12.5, + 1 + ] + ] + } + }, + "source-layer": "road" + }, + { + "interactive": true, + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "metadata": { + "mapbox:group": "1444849345966.4436" + }, + "filter": [ + "all", + [ + "in", + "class", + "secondary", + "tertiary" + ], + [ + "!in", + "structure", + "bridge", + "tunnel" + ] + ], + "type": "line", + "source": "mapbox", + "id": "road_secondary_tertiary_casing", + "paint": { + "line-color": "#e9ac77", + "line-width": { + "base": 1.2, + "stops": [ + [ + 8, + 1.5 + ], + [ + 20, + 17 + ] + ] + }, + "line-opacity": 1 + }, + "source-layer": "road" + }, + { + "interactive": true, + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "metadata": { + "mapbox:group": "1444849345966.4436" + }, + "filter": [ + "all", + [ + "in", + "class", + "trunk", + "primary" + ], + [ + "!in", + "structure", + "bridge", + "tunnel" + ] + ], + "type": "line", + "source": "mapbox", + "id": "road_trunk_primary_casing", + "paint": { + "line-color": "#e9ac77", + "line-width": { + "base": 1.2, + "stops": [ + [ + 5, + 0.4 + ], + [ + 6, + 0.6 + ], + [ + 7, + 1.5 + ], + [ + 20, + 22 + ] + ] + }, + "line-opacity": 1 + }, + "source-layer": "road" + }, + { + "interactive": true, + "minzoom": 5, + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "metadata": { + "mapbox:group": "1444849345966.4436" + }, + "filter": [ + "all", + [ + "==", + "class", + "motorway" + ], + [ + "!in", + "structure", + "bridge", + "tunnel" + ] + ], + "type": "line", + "source": "mapbox", + "id": "road_motorway_casing", + "paint": { + "line-color": "#e9ac77", + "line-width": { + "base": 1.2, + "stops": [ + [ + 5, + 0.4 + ], + [ + 6, + 0.6 + ], + [ + 7, + 1.5 + ], + [ + 20, + 22 + ] + ] + } + }, + "source-layer": "road" + }, + { + "id": "road_path_pedestrian", + "type": "line", + "source": "mapbox", + "source-layer": "road", + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "in", + "class", + "path", + "pedestrian" + ], + [ + "!in", + "structure", + "bridge", + "tunnel" + ] + ] + ], + "paint": { + "line-color": "#cba", + "line-dasharray": [ + 1.5, + 0.75 + ], + "line-width": { + "base": 1.2, + "stops": [ + [ + 15, + 1.2 + ], + [ + 20, + 4 + ] + ] + } + }, + "metadata": { + "mapbox:group": "1444849345966.4436" + }, + "interactive": true + }, + { + "interactive": true, + "metadata": { + "mapbox:group": "1444849345966.4436" + }, + "id": "road_motorway_link", + "paint": { + "line-color": "#fc8", + "line-width": { + "base": 1.2, + "stops": [ + [ + 12.5, + 0 + ], + [ + 13, + 1.5 + ], + [ + 14, + 2.5 + ], + [ + 20, + 11.5 + ] + ] + } + }, + "ref": "road_motorway_link_casing" + }, + { + "interactive": true, + "metadata": { + "mapbox:group": "1444849345966.4436" + }, + "id": "road_service_track", + "paint": { + "line-color": "#fff", + "line-width": { + "base": 1.2, + "stops": [ + [ + 15.5, + 0 + ], + [ + 16, + 2 + ], + [ + 20, + 7.5 + ] + ] + } + }, + "ref": "road_service_track_casing" + }, + { + "interactive": true, + "metadata": { + "mapbox:group": "1444849345966.4436" + }, + "id": "road_link", + "paint": { + "line-color": "#fea", + "line-width": { + "base": 1.2, + "stops": [ + [ + 12.5, + 0 + ], + [ + 13, + 1.5 + ], + [ + 14, + 2.5 + ], + [ + 20, + 11.5 + ] + ] + } + }, + "ref": "road_link_casing" + }, + { + "interactive": true, + "metadata": { + "mapbox:group": "1444849345966.4436" + }, + "id": "road_street", + "paint": { + "line-color": "#fff", + "line-width": { + "base": 1.2, + "stops": [ + [ + 13.5, + 0 + ], + [ + 14, + 2.5 + ], + [ + 20, + 11.5 + ] + ] + }, + "line-opacity": 1 + }, + "ref": "road_street_casing" + }, + { + "interactive": true, + "metadata": { + "mapbox:group": "1444849345966.4436" + }, + "id": "road_secondary_tertiary", + "paint": { + "line-color": "#fea", + "line-width": { + "base": 1.2, + "stops": [ + [ + 6.5, + 0 + ], + [ + 8, + 0.5 + ], + [ + 20, + 13 + ] + ] + } + }, + "ref": "road_secondary_tertiary_casing" + }, + { + "interactive": true, + "metadata": { + "mapbox:group": "1444849345966.4436" + }, + "id": "road_trunk_primary", + "paint": { + "line-color": "#fea", + "line-width": { + "base": 1.2, + "stops": [ + [ + 6.5, + 0 + ], + [ + 7, + 0.5 + ], + [ + 20, + 18 + ] + ] + } + }, + "ref": "road_trunk_primary_casing" + }, + { + "interactive": true, + "metadata": { + "mapbox:group": "1444849345966.4436" + }, + "id": "road_motorway", + "paint": { + "line-color": "#fc8", + "line-width": { + "base": 1.2, + "stops": [ + [ + 6.5, + 0 + ], + [ + 7, + 0.5 + ], + [ + 20, + 18 + ] + ] + } + }, + "ref": "road_motorway_casing" + }, + { + "id": "road_major_rail", + "type": "line", + "source": "mapbox", + "source-layer": "road", + "filter": [ + "all", + [ + "==", + "class", + "major_rail" + ], + [ + "!in", + "structure", + "bridge", + "tunnel" + ] + ], + "paint": { + "line-color": "#bbb", + "line-width": { + "base": 1.4, + "stops": [ + [ + 14, + 0.4 + ], + [ + 15, + 0.75 + ], + [ + 20, + 2 + ] + ] + } + }, + "metadata": { + "mapbox:group": "1444849345966.4436" + }, + "interactive": true + }, + { + "id": "road_major_rail_hatching", + "paint": { + "line-color": "#bbb", + "line-dasharray": [ + 0.2, + 8 + ], + "line-width": { + "base": 1.4, + "stops": [ + [ + 14.5, + 0 + ], + [ + 15, + 3 + ], + [ + 20, + 8 + ] + ] + } + }, + "metadata": { + "mapbox:group": "1444849345966.4436" + }, + "interactive": true, + "ref": "road_major_rail" + }, + { + "interactive": true, + "layout": { + "line-join": "round" + }, + "metadata": { + "mapbox:group": "1444849334699.1902" + }, + "filter": [ + "all", + [ + "==", + "structure", + "bridge" + ], + [ + "==", + "class", + "motorway_link" + ] + ], + "type": "line", + "source": "mapbox", + "id": "bridge_motorway_link_casing", + "paint": { + "line-color": "#e9ac77", + "line-width": { + "base": 1.2, + "stops": [ + [ + 12, + 1 + ], + [ + 13, + 3 + ], + [ + 14, + 4 + ], + [ + 20, + 15 + ] + ] + }, + "line-opacity": 1 + }, + "source-layer": "road" + }, + { + "interactive": true, + "layout": { + "line-join": "round" + }, + "metadata": { + "mapbox:group": "1444849334699.1902" + }, + "filter": [ + "all", + [ + "==", + "structure", + "bridge" + ], + [ + "in", + "class", + "service", + "track" + ] + ], + "type": "line", + "source": "mapbox", + "id": "bridge_service_track_casing", + "paint": { + "line-color": "#cfcdca", + "line-width": { + "base": 1.2, + "stops": [ + [ + 15, + 1 + ], + [ + 16, + 4 + ], + [ + 20, + 11 + ] + ] + } + }, + "source-layer": "road" + }, + { + "interactive": true, + "layout": { + "line-join": "round" + }, + "metadata": { + "mapbox:group": "1444849334699.1902" + }, + "filter": [ + "all", + [ + "==", + "structure", + "bridge" + ], + [ + "==", + "class", + "link" + ] + ], + "type": "line", + "source": "mapbox", + "id": "bridge_link_casing", + "paint": { + "line-color": "#e9ac77", + "line-width": { + "base": 1.2, + "stops": [ + [ + 12, + 1 + ], + [ + 13, + 3 + ], + [ + 14, + 4 + ], + [ + 20, + 15 + ] + ] + }, + "line-opacity": 1 + }, + "source-layer": "road" + }, + { + "interactive": true, + "layout": { + "line-join": "round" + }, + "metadata": { + "mapbox:group": "1444849334699.1902" + }, + "filter": [ + "all", + [ + "==", + "structure", + "bridge" + ], + [ + "in", + "class", + "street", + "street_limited" + ] + ], + "type": "line", + "source": "mapbox", + "id": "bridge_street_casing", + "paint": { + "line-color": "#cfcdca", + "line-width": { + "base": 1.2, + "stops": [ + [ + 12, + 0.5 + ], + [ + 13, + 1 + ], + [ + 14, + 4 + ], + [ + 20, + 15 + ] + ] + }, + "line-opacity": { + "stops": [ + [ + 12, + 0 + ], + [ + 12.5, + 1 + ] + ] + } + }, + "source-layer": "road" + }, + { + "interactive": true, + "layout": { + "line-join": "round" + }, + "metadata": { + "mapbox:group": "1444849334699.1902" + }, + "filter": [ + "all", + [ + "==", + "structure", + "bridge" + ], + [ + "in", + "class", + "secondary", + "tertiary" + ] + ], + "type": "line", + "source": "mapbox", + "id": "bridge_secondary_tertiary_casing", + "paint": { + "line-color": "#e9ac77", + "line-width": { + "base": 1.2, + "stops": [ + [ + 8, + 1.5 + ], + [ + 20, + 17 + ] + ] + }, + "line-opacity": 1 + }, + "source-layer": "road" + }, + { + "interactive": true, + "layout": { + "line-join": "round" + }, + "metadata": { + "mapbox:group": "1444849334699.1902" + }, + "filter": [ + "all", + [ + "==", + "structure", + "bridge" + ], + [ + "in", + "class", + "trunk", + "primary" + ] + ], + "type": "line", + "source": "mapbox", + "id": "bridge_trunk_primary_casing", + "paint": { + "line-color": "#e9ac77", + "line-width": { + "base": 1.2, + "stops": [ + [ + 5, + 0.4 + ], + [ + 6, + 0.6 + ], + [ + 7, + 1.5 + ], + [ + 20, + 22 + ] + ] + } + }, + "source-layer": "road" + }, + { + "interactive": true, + "layout": { + "line-join": "round" + }, + "metadata": { + "mapbox:group": "1444849334699.1902" + }, + "filter": [ + "all", + [ + "==", + "structure", + "bridge" + ], + [ + "==", + "class", + "motorway" + ] + ], + "type": "line", + "source": "mapbox", + "id": "bridge_motorway_casing", + "paint": { + "line-color": "#e9ac77", + "line-width": { + "base": 1.2, + "stops": [ + [ + 5, + 0.4 + ], + [ + 6, + 0.6 + ], + [ + 7, + 1.5 + ], + [ + 20, + 22 + ] + ] + } + }, + "source-layer": "road" + }, + { + "id": "bridge_path_pedestrian", + "type": "line", + "source": "mapbox", + "source-layer": "road", + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "structure", + "bridge" + ], + [ + "in", + "class", + "path", + "pedestrian" + ] + ] + ], + "paint": { + "line-color": "#cba", + "line-dasharray": [ + 1.5, + 0.75 + ], + "line-width": { + "base": 1.2, + "stops": [ + [ + 15, + 1.2 + ], + [ + 20, + 4 + ] + ] + } + }, + "metadata": { + "mapbox:group": "1444849334699.1902" + }, + "interactive": true + }, + { + "interactive": true, + "metadata": { + "mapbox:group": "1444849334699.1902" + }, + "id": "bridge_motorway_link", + "paint": { + "line-color": "#fc8", + "line-width": { + "base": 1.2, + "stops": [ + [ + 12.5, + 0 + ], + [ + 13, + 1.5 + ], + [ + 14, + 2.5 + ], + [ + 20, + 11.5 + ] + ] + } + }, + "ref": "bridge_motorway_link_casing" + }, + { + "interactive": true, + "metadata": { + "mapbox:group": "1444849334699.1902" + }, + "id": "bridge_service_track", + "paint": { + "line-color": "#fff", + "line-width": { + "base": 1.2, + "stops": [ + [ + 15.5, + 0 + ], + [ + 16, + 2 + ], + [ + 20, + 7.5 + ] + ] + } + }, + "ref": "bridge_service_track_casing" + }, + { + "interactive": true, + "metadata": { + "mapbox:group": "1444849334699.1902" + }, + "id": "bridge_link", + "paint": { + "line-color": "#fea", + "line-width": { + "base": 1.2, + "stops": [ + [ + 12.5, + 0 + ], + [ + 13, + 1.5 + ], + [ + 14, + 2.5 + ], + [ + 20, + 11.5 + ] + ] + } + }, + "ref": "bridge_link_casing" + }, + { + "interactive": true, + "metadata": { + "mapbox:group": "1444849334699.1902" + }, + "id": "bridge_street", + "paint": { + "line-color": "#fff", + "line-width": { + "base": 1.2, + "stops": [ + [ + 13.5, + 0 + ], + [ + 14, + 2.5 + ], + [ + 20, + 11.5 + ] + ] + }, + "line-opacity": 1 + }, + "ref": "bridge_street_casing" + }, + { + "interactive": true, + "metadata": { + "mapbox:group": "1444849334699.1902" + }, + "id": "bridge_secondary_tertiary", + "paint": { + "line-color": "#fea", + "line-width": { + "base": 1.2, + "stops": [ + [ + 6.5, + 0 + ], + [ + 7, + 0.5 + ], + [ + 20, + 10 + ] + ] + } + }, + "ref": "bridge_secondary_tertiary_casing" + }, + { + "interactive": true, + "metadata": { + "mapbox:group": "1444849334699.1902" + }, + "id": "bridge_trunk_primary", + "paint": { + "line-color": "#fea", + "line-width": { + "base": 1.2, + "stops": [ + [ + 6.5, + 0 + ], + [ + 7, + 0.5 + ], + [ + 20, + 18 + ] + ] + } + }, + "ref": "bridge_trunk_primary_casing" + }, + { + "interactive": true, + "metadata": { + "mapbox:group": "1444849334699.1902" + }, + "id": "bridge_motorway", + "paint": { + "line-color": "#fc8", + "line-width": { + "base": 1.2, + "stops": [ + [ + 6.5, + 0 + ], + [ + 7, + 0.5 + ], + [ + 20, + 18 + ] + ] + } + }, + "ref": "bridge_motorway_casing" + }, + { + "id": "bridge_major_rail", + "type": "line", + "source": "mapbox", + "source-layer": "road", + "filter": [ + "all", + [ + "==", + "structure", + "bridge" + ], + [ + "==", + "class", + "major_rail" + ] + ], + "paint": { + "line-color": "#bbb", + "line-width": { + "base": 1.4, + "stops": [ + [ + 14, + 0.4 + ], + [ + 15, + 0.75 + ], + [ + 20, + 2 + ] + ] + } + }, + "metadata": { + "mapbox:group": "1444849334699.1902" + }, + "interactive": true + }, + { + "id": "bridge_major_rail_hatching", + "paint": { + "line-color": "#bbb", + "line-dasharray": [ + 0.2, + 8 + ], + "line-width": { + "base": 1.4, + "stops": [ + [ + 14.5, + 0 + ], + [ + 15, + 3 + ], + [ + 20, + 8 + ] + ] + } + }, + "metadata": { + "mapbox:group": "1444849334699.1902" + }, + "interactive": true, + "ref": "bridge_major_rail" + }, + { + "interactive": true, + "layout": { + "line-join": "round" + }, + "metadata": { + "mapbox:group": "1444849307123.581" + }, + "filter": [ + "all", + [ + ">=", + "admin_level", + 3 + ], + [ + "==", + "maritime", + 0 + ] + ], + "type": "line", + "source": "mapbox", + "id": "admin_level_3", + "paint": { + "line-color": "#9e9cab", + "line-dasharray": [ + 3, + 1, + 1, + 1 + ], + "line-width": { + "base": 1, + "stops": [ + [ + 4, + 0.4 + ], + [ + 5, + 1 + ], + [ + 12, + 3 + ] + ] + } + }, + "source-layer": "admin" + }, + { + "interactive": true, + "layout": { + "line-join": "round", + "line-cap": "round" + }, + "metadata": { + "mapbox:group": "1444849307123.581" + }, + "filter": [ + "all", + [ + "==", + "admin_level", + 2 + ], + [ + "==", + "disputed", + 0 + ], + [ + "==", + "maritime", + 0 + ] + ], + "type": "line", + "source": "mapbox", + "id": "admin_level_2", + "paint": { + "line-color": "#9e9cab", + "line-width": { + "base": 1, + "stops": [ + [ + 4, + 1.4 + ], + [ + 5, + 2 + ], + [ + 12, + 8 + ] + ] + } + }, + "source-layer": "admin" + }, + { + "interactive": true, + "layout": { + "line-cap": "round" + }, + "metadata": { + "mapbox:group": "1444849307123.581" + }, + "filter": [ + "all", + [ + "==", + "admin_level", + 2 + ], + [ + "==", + "disputed", + 1 + ], + [ + "==", + "maritime", + 0 + ] + ], + "type": "line", + "source": "mapbox", + "id": "admin_level_2_disputed", + "paint": { + "line-color": "#9e9cab", + "line-dasharray": [ + 2, + 2 + ], + "line-width": { + "base": 1, + "stops": [ + [ + 4, + 1.4 + ], + [ + 5, + 2 + ], + [ + 12, + 8 + ] + ] + } + }, + "source-layer": "admin" + }, + { + "interactive": true, + "layout": { + "line-join": "round" + }, + "metadata": { + "mapbox:group": "1444849307123.581" + }, + "filter": [ + "all", + [ + ">=", + "admin_level", + 3 + ], + [ + "==", + "maritime", + 1 + ] + ], + "type": "line", + "source": "mapbox", + "id": "admin_level_3_maritime", + "paint": { + "line-color": "#a0c8f0", + "line-opacity": 0.5, + "line-dasharray": [ + 3, + 1, + 1, + 1 + ], + "line-width": { + "base": 1, + "stops": [ + [ + 4, + 0.4 + ], + [ + 5, + 1 + ], + [ + 12, + 3 + ] + ] + } + }, + "source-layer": "admin" + }, + { + "interactive": true, + "layout": { + "line-cap": "round" + }, + "metadata": { + "mapbox:group": "1444849307123.581" + }, + "filter": [ + "all", + [ + "==", + "admin_level", + 2 + ], + [ + "==", + "maritime", + 1 + ] + ], + "type": "line", + "source": "mapbox", + "id": "admin_level_2_maritime", + "paint": { + "line-color": "#a0c8f0", + "line-opacity": 0.5, + "line-width": { + "base": 1, + "stops": [ + [ + 4, + 1.4 + ], + [ + 5, + 2 + ], + [ + 12, + 8 + ] + ] + } + }, + "source-layer": "admin" + }, + { + "interactive": true, + "layout": { + "text-font": [ + "Open Sans Italic", + "Arial Unicode MS Regular" + ], + "text-field": "{name_en}", + "text-max-width": 5, + "text-size": 12 + }, + "metadata": { + "mapbox:group": "1444849320558.5054" + }, + "filter": [ + "==", + "$type", + "Point" + ], + "type": "symbol", + "source": "mapbox", + "id": "water_label", + "paint": { + "text-color": "#74aee9", + "text-halo-width": 1.5, + "text-halo-color": "rgba(255,255,255,0.7)" + }, + "source-layer": "water_label" + }, + { + "interactive": true, + "minzoom": 16, + "layout": { + "icon-image": "{maki}-11", + "text-font": [ + "Open Sans Semibold", + "Arial Unicode MS Bold" + ], + "text-field": "{name_en}", + "text-max-width": 9, + "text-padding": 2, + "text-offset": [ + 0, + 0.6 + ], + "text-anchor": "top", + "text-size": 12 + }, + "metadata": { + "mapbox:group": "1444849297111.495" + }, + "filter": [ + "all", + [ + "==", + "$type", + "Point" + ], + [ + "==", + "scalerank", + 4 + ] + ], + "type": "symbol", + "source": "mapbox", + "id": "poi_label_4", + "paint": { + "text-color": "#666", + "text-halo-color": "#ffffff", + "text-halo-width": 1, + "text-halo-blur": 0.5 + }, + "source-layer": "poi_label" + }, + { + "interactive": true, + "minzoom": 15, + "layout": { + "icon-image": "{maki}-11", + "text-font": [ + "Open Sans Semibold", + "Arial Unicode MS Bold" + ], + "text-field": "{name_en}", + "text-max-width": 9, + "text-padding": 2, + "text-offset": [ + 0, + 0.6 + ], + "text-anchor": "top", + "text-size": 12 + }, + "metadata": { + "mapbox:group": "1444849297111.495" + }, + "filter": [ + "all", + [ + "==", + "$type", + "Point" + ], + [ + "==", + "scalerank", + 3 + ] + ], + "type": "symbol", + "source": "mapbox", + "id": "poi_label_3", + "paint": { + "text-color": "#666", + "text-halo-color": "#ffffff", + "text-halo-width": 1, + "text-halo-blur": 0.5 + }, + "source-layer": "poi_label" + }, + { + "interactive": true, + "minzoom": 14, + "layout": { + "icon-image": "{maki}-11", + "text-font": [ + "Open Sans Semibold", + "Arial Unicode MS Bold" + ], + "text-field": "{name_en}", + "text-max-width": 9, + "text-padding": 2, + "text-offset": [ + 0, + 0.6 + ], + "text-anchor": "top", + "text-size": 12 + }, + "metadata": { + "mapbox:group": "1444849297111.495" + }, + "filter": [ + "all", + [ + "==", + "$type", + "Point" + ], + [ + "==", + "scalerank", + 2 + ] + ], + "type": "symbol", + "source": "mapbox", + "id": "poi_label_2", + "paint": { + "text-color": "#666", + "text-halo-color": "#ffffff", + "text-halo-width": 1, + "text-halo-blur": 0.5 + }, + "source-layer": "poi_label" + }, + { + "layout": { + "text-size": 12, + "icon-image": "{maki}-11", + "text-font": [ + "Open Sans Semibold", + "Arial Unicode MS Bold" + ], + "text-padding": 2, + "visibility": "visible", + "text-offset": [ + 0, + 0.6 + ], + "text-anchor": "top", + "text-field": "{name_en}", + "text-max-width": 9 + }, + "metadata": { + "mapbox:group": "1444849297111.495" + }, + "type": "symbol", + "source": "mapbox", + "id": "rail_station_label", + "paint": { + "text-color": "#666", + "text-halo-color": "#ffffff", + "text-halo-width": 1, + "text-halo-blur": 0.5 + }, + "source-layer": "rail_station_label", + "interactive": true + }, + { + "interactive": true, + "minzoom": 13, + "layout": { + "icon-image": "{maki}-11", + "text-font": [ + "Open Sans Semibold", + "Arial Unicode MS Bold" + ], + "text-field": "{name_en}", + "text-max-width": 9, + "text-padding": 2, + "text-offset": [ + 0, + 0.6 + ], + "text-anchor": "top", + "text-size": 12 + }, + "metadata": { + "mapbox:group": "1444849297111.495" + }, + "filter": [ + "all", + [ + "==", + "$type", + "Point" + ], + [ + "==", + "scalerank", + 1 + ] + ], + "type": "symbol", + "source": "mapbox", + "id": "poi_label_1", + "paint": { + "text-color": "#666", + "text-halo-color": "#ffffff", + "text-halo-width": 1, + "text-halo-blur": 0.5 + }, + "source-layer": "poi_label" + }, + { + "interactive": true, + "minzoom": 11, + "layout": { + "icon-image": "{maki}-11", + "text-font": [ + "Open Sans Semibold", + "Arial Unicode MS Bold" + ], + "text-field": "{name_en}", + "text-max-width": 9, + "text-padding": 2, + "text-offset": [ + 0, + 0.6 + ], + "text-anchor": "top", + "text-size": 12 + }, + "metadata": { + "mapbox:group": "1444849297111.495" + }, + "filter": [ + "all", + [ + "==", + "$type", + "Point" + ], + [ + "in", + "scalerank", + 1, + 2, + 3 + ] + ], + "type": "symbol", + "source": "mapbox", + "id": "airport_label", + "paint": { + "text-color": "#666", + "text-halo-color": "#ffffff", + "text-halo-width": 1, + "text-halo-blur": 0.5 + }, + "source-layer": "airport_label" + }, + { + "interactive": true, + "layout": { + "text-field": "{name_en}", + "text-font": [ + "Open Sans Regular", + "Arial Unicode MS Regular" + ], + "text-size": { + "base": 1, + "stops": [ + [ + 13, + 12 + ], + [ + 14, + 13 + ] + ] + }, + "symbol-placement": "line" + }, + "metadata": { + "mapbox:group": "1456163609504.0715" + }, + "filter": [ + "!=", + "class", + "ferry" + ], + "type": "symbol", + "source": "mapbox", + "id": "road_label", + "paint": { + "text-color": "#765", + "text-halo-width": 1, + "text-halo-blur": 0.5 + }, + "source-layer": "road_label" + }, + { + "interactive": true, + "minzoom": 8, + "layout": { + "text-field": "{ref}", + "text-font": [ + "Open Sans Semibold", + "Arial Unicode MS Bold" + ], + "text-size": 11, + "icon-image": "motorway_{reflen}", + "symbol-placement": { + "base": 1, + "stops": [ + [ + 10, + "point" + ], + [ + 11, + "line" + ] + ] + }, + "symbol-spacing": 500, + "text-rotation-alignment": "viewport", + "icon-rotation-alignment": "viewport" + }, + "metadata": { + "mapbox:group": "1456163609504.0715" + }, + "filter": [ + "<=", + "reflen", + 6 + ], + "type": "symbol", + "source": "mapbox", + "id": "road_label_highway_shield", + "paint": {}, + "source-layer": "road_label" + }, + { + "interactive": true, + "layout": { + "text-font": [ + "Open Sans Bold", + "Arial Unicode MS Bold" + ], + "text-transform": "uppercase", + "text-letter-spacing": 0.1, + "text-field": "{name_en}", + "text-max-width": 9, + "text-size": { + "base": 1.2, + "stops": [ + [ + 12, + 10 + ], + [ + 15, + 14 + ] + ] + } + }, + "metadata": { + "mapbox:group": "1444849272561.29" + }, + "filter": [ + "in", + "type", + "hamlet", + "suburb", + "neighbourhood", + "island", + "islet" + ], + "type": "symbol", + "source": "mapbox", + "id": "place_label_other", + "paint": { + "text-color": "#633", + "text-halo-color": "rgba(255,255,255,0.8)", + "text-halo-width": 1.2 + }, + "source-layer": "place_label" + }, + { + "interactive": true, + "layout": { + "text-font": [ + "Open Sans Regular", + "Arial Unicode MS Regular" + ], + "text-field": "{name_en}", + "text-max-width": 8, + "text-size": { + "base": 1.2, + "stops": [ + [ + 10, + 12 + ], + [ + 15, + 22 + ] + ] + } + }, + "metadata": { + "mapbox:group": "1444849272561.29" + }, + "filter": [ + "==", + "type", + "village" + ], + "type": "symbol", + "source": "mapbox", + "id": "place_label_village", + "paint": { + "text-color": "#333", + "text-halo-color": "rgba(255,255,255,0.8)", + "text-halo-width": 1.2 + }, + "source-layer": "place_label" + }, + { + "interactive": true, + "layout": { + "text-font": [ + "Open Sans Regular", + "Arial Unicode MS Regular" + ], + "text-field": "{name_en}", + "text-max-width": 8, + "text-size": { + "base": 1.2, + "stops": [ + [ + 10, + 14 + ], + [ + 15, + 24 + ] + ] + } + }, + "metadata": { + "mapbox:group": "1444849272561.29" + }, + "filter": [ + "==", + "type", + "town" + ], + "type": "symbol", + "source": "mapbox", + "id": "place_label_town", + "paint": { + "text-color": "#333", + "text-halo-color": "rgba(255,255,255,0.8)", + "text-halo-width": 1.2 + }, + "source-layer": "place_label" + }, + { + "interactive": true, + "layout": { + "text-font": [ + "Open Sans Semibold", + "Arial Unicode MS Bold" + ], + "text-field": "{name_en}", + "text-max-width": 8, + "text-size": { + "base": 1.2, + "stops": [ + [ + 7, + 14 + ], + [ + 11, + 24 + ] + ] + } + }, + "metadata": { + "mapbox:group": "1444849272561.29" + }, + "filter": [ + "==", + "type", + "city" + ], + "type": "symbol", + "source": "mapbox", + "id": "place_label_city", + "paint": { + "text-color": "#333", + "text-halo-color": "rgba(255,255,255,0.8)", + "text-halo-width": 1.2 + }, + "source-layer": "place_label" + }, + { + "interactive": true, + "layout": { + "text-font": [ + "Open Sans Italic", + "Arial Unicode MS Regular" + ], + "text-field": "{name_en}", + "text-letter-spacing": 0.2, + "symbol-placement": "line", + "text-size": { + "stops": [ + [ + 3, + 11 + ], + [ + 4, + 12 + ] + ] + } + }, + "metadata": { + "mapbox:group": "1444849258897.3083" + }, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + ">=", + "labelrank", + 4 + ] + ], + "type": "symbol", + "source": "mapbox", + "id": "marine_label_line_4", + "paint": { + "text-color": "#74aee9", + "text-halo-color": "rgba(255,255,255,0.7)", + "text-halo-width": 0.75, + "text-halo-blur": 0.75 + }, + "source-layer": "marine_label" + }, + { + "interactive": true, + "layout": { + "text-font": [ + "Open Sans Italic", + "Arial Unicode MS Regular" + ], + "text-field": "{name_en}", + "text-max-width": 6, + "text-letter-spacing": 0.2, + "symbol-placement": "point", + "text-size": { + "stops": [ + [ + 3, + 11 + ], + [ + 4, + 12 + ] + ] + } + }, + "metadata": { + "mapbox:group": "1444849258897.3083" + }, + "filter": [ + "all", + [ + "==", + "$type", + "Point" + ], + [ + ">=", + "labelrank", + 4 + ] + ], + "type": "symbol", + "source": "mapbox", + "id": "marine_label_4", + "paint": { + "text-color": "#74aee9", + "text-halo-color": "rgba(255,255,255,0.7)", + "text-halo-width": 0.75, + "text-halo-blur": 0.75 + }, + "source-layer": "marine_label" + }, + { + "interactive": true, + "layout": { + "text-font": [ + "Open Sans Italic", + "Arial Unicode MS Regular" + ], + "text-field": "{name_en}", + "text-letter-spacing": 0.2, + "symbol-placement": "line", + "text-size": { + "stops": [ + [ + 3, + 11 + ], + [ + 4, + 14 + ] + ] + } + }, + "metadata": { + "mapbox:group": "1444849258897.3083" + }, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "==", + "labelrank", + 3 + ] + ], + "type": "symbol", + "source": "mapbox", + "id": "marine_label_line_3", + "paint": { + "text-color": "#74aee9", + "text-halo-color": "rgba(255,255,255,0.7)", + "text-halo-width": 0.75, + "text-halo-blur": 0.75 + }, + "source-layer": "marine_label" + }, + { + "interactive": true, + "layout": { + "text-font": [ + "Open Sans Italic", + "Arial Unicode MS Regular" + ], + "text-field": "{name_en}", + "text-max-width": 5, + "text-letter-spacing": 0.2, + "symbol-placement": "point", + "text-size": { + "stops": [ + [ + 3, + 11 + ], + [ + 4, + 14 + ] + ] + } + }, + "metadata": { + "mapbox:group": "1444849258897.3083" + }, + "filter": [ + "all", + [ + "==", + "$type", + "Point" + ], + [ + "==", + "labelrank", + 3 + ] + ], + "type": "symbol", + "source": "mapbox", + "id": "marine_label_point_3", + "paint": { + "text-color": "#74aee9", + "text-halo-color": "rgba(255,255,255,0.7)", + "text-halo-width": 0.75, + "text-halo-blur": 0.75 + }, + "source-layer": "marine_label" + }, + { + "interactive": true, + "layout": { + "text-font": [ + "Open Sans Italic", + "Arial Unicode MS Regular" + ], + "text-field": "{name_en}", + "text-letter-spacing": 0.2, + "symbol-placement": "line", + "text-size": { + "stops": [ + [ + 3, + 14 + ], + [ + 4, + 16 + ] + ] + } + }, + "metadata": { + "mapbox:group": "1444849258897.3083" + }, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "==", + "labelrank", + 2 + ] + ], + "type": "symbol", + "source": "mapbox", + "id": "marine_label_line_2", + "paint": { + "text-color": "#74aee9", + "text-halo-color": "rgba(255,255,255,0.7)", + "text-halo-width": 0.75, + "text-halo-blur": 0.75 + }, + "source-layer": "marine_label" + }, + { + "interactive": true, + "layout": { + "text-font": [ + "Open Sans Italic", + "Arial Unicode MS Regular" + ], + "text-field": "{name_en}", + "text-max-width": 5, + "text-letter-spacing": 0.2, + "symbol-placement": "point", + "text-size": { + "stops": [ + [ + 3, + 14 + ], + [ + 4, + 16 + ] + ] + } + }, + "metadata": { + "mapbox:group": "1444849258897.3083" + }, + "filter": [ + "all", + [ + "==", + "$type", + "Point" + ], + [ + "==", + "labelrank", + 2 + ] + ], + "type": "symbol", + "source": "mapbox", + "id": "marine_label_point_2", + "paint": { + "text-color": "#74aee9", + "text-halo-color": "rgba(255,255,255,0.7)", + "text-halo-width": 0.75, + "text-halo-blur": 0.75 + }, + "source-layer": "marine_label" + }, + { + "interactive": true, + "layout": { + "text-font": [ + "Open Sans Italic", + "Arial Unicode MS Regular" + ], + "text-field": "{name_en}", + "text-letter-spacing": 0.2, + "symbol-placement": "line", + "text-size": { + "stops": [ + [ + 3, + 18 + ], + [ + 4, + 22 + ] + ] + } + }, + "metadata": { + "mapbox:group": "1444849258897.3083" + }, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "==", + "labelrank", + 1 + ] + ], + "type": "symbol", + "source": "mapbox", + "id": "marine_label_line_1", + "paint": { + "text-color": "#74aee9", + "text-halo-color": "rgba(255,255,255,0.7)", + "text-halo-width": 0.75, + "text-halo-blur": 0.75 + }, + "source-layer": "marine_label" + }, + { + "interactive": true, + "layout": { + "text-font": [ + "Open Sans Italic", + "Arial Unicode MS Regular" + ], + "text-field": "{name_en}", + "text-max-width": 5, + "text-letter-spacing": 0.2, + "text-line-height": 1.6, + "symbol-placement": "point", + "text-offset": [ + 0, + 2.4 + ], + "text-size": { + "stops": [ + [ + 3, + 18 + ], + [ + 4, + 22 + ] + ] + } + }, + "metadata": { + "mapbox:group": "1444849258897.3083" + }, + "filter": [ + "all", + [ + "==", + "$type", + "Point" + ], + [ + "==", + "labelrank", + 1 + ] + ], + "type": "symbol", + "source": "mapbox", + "id": "marine_label_point_1", + "paint": { + "text-color": "#74aee9", + "text-halo-color": "rgba(255,255,255,0.7)", + "text-halo-width": 0.75, + "text-halo-blur": 0.75 + }, + "source-layer": "marine_label" + }, + { + "interactive": true, + "layout": { + "text-font": [ + "Open Sans Bold", + "Arial Unicode MS Bold" + ], + "text-field": "{name_en}", + "text-max-width": 6.25, + "text-transform": "uppercase", + "text-size": { + "stops": [ + [ + 4, + 11 + ], + [ + 6, + 15 + ] + ] + } + }, + "metadata": { + "mapbox:group": "1444849242106.713" + }, + "filter": [ + ">=", + "scalerank", + 4 + ], + "type": "symbol", + "source": "mapbox", + "id": "country_label_4", + "paint": { + "text-color": "#334", + "text-halo-color": "rgba(255,255,255,0.8)", + "text-halo-width": 2, + "text-halo-blur": 1 + }, + "source-layer": "country_label" + }, + { + "interactive": true, + "layout": { + "text-font": [ + "Open Sans Bold", + "Arial Unicode MS Bold" + ], + "text-field": "{name_en}", + "text-max-width": 6.25, + "text-transform": "uppercase", + "text-size": { + "stops": [ + [ + 3, + 11 + ], + [ + 7, + 17 + ] + ] + } + }, + "metadata": { + "mapbox:group": "1444849242106.713" + }, + "filter": [ + "==", + "scalerank", + 3 + ], + "type": "symbol", + "source": "mapbox", + "id": "country_label_3", + "paint": { + "text-color": "#334", + "text-halo-color": "rgba(255,255,255,0.8)", + "text-halo-width": 2, + "text-halo-blur": 1 + }, + "source-layer": "country_label" + }, + { + "interactive": true, + "layout": { + "text-font": [ + "Open Sans Bold", + "Arial Unicode MS Bold" + ], + "text-field": "{name_en}", + "text-max-width": 6.25, + "text-transform": "uppercase", + "text-size": { + "stops": [ + [ + 2, + 11 + ], + [ + 5, + 17 + ] + ] + } + }, + "metadata": { + "mapbox:group": "1444849242106.713" + }, + "filter": [ + "==", + "scalerank", + 2 + ], + "type": "symbol", + "source": "mapbox", + "id": "country_label_2", + "paint": { + "text-color": "#334", + "text-halo-color": "rgba(255,255,255,0.8)", + "text-halo-width": 2, + "text-halo-blur": 1 + }, + "source-layer": "country_label" + }, + { + "interactive": true, + "layout": { + "text-font": [ + "Open Sans Bold", + "Arial Unicode MS Bold" + ], + "text-field": "{name_en}", + "text-max-width": 6.25, + "text-transform": "uppercase", + "text-size": { + "stops": [ + [ + 1, + 11 + ], + [ + 4, + 17 + ] + ] + } + }, + "metadata": { + "mapbox:group": "1444849242106.713" + }, + "filter": [ + "==", + "scalerank", + 1 + ], + "type": "symbol", + "source": "mapbox", + "id": "country_label_1", + "paint": { + "text-color": "#334", + "text-halo-color": "rgba(255,255,255,0.8)", + "text-halo-width": 2, + "text-halo-blur": 1 + }, + "source-layer": "country_label" + } + ], + "created": "1970-01-01T00:00:00.000Z", + "modified": "1970-01-01T00:00:00.000Z", + "owner": "mapbox", + "id": "bright-v9", + "draft": false, + "visibility": "public" +} \ No newline at end of file diff --git a/src/ol/render/canvas/Executor.js b/src/ol/render/canvas/Executor.js index 38722993c0..e0a9a3df64 100644 --- a/src/ol/render/canvas/Executor.js +++ b/src/ol/render/canvas/Executor.js @@ -850,14 +850,15 @@ class Executor { let imageArgs; let imageDeclutterBox; if (opt_declutterTree && declutterImageWithText) { - if (!declutterImageWithText[d]) { + const index = dd - d; + if (!declutterImageWithText[index]) { // We now have the image for an image+text combination. - declutterImageWithText[d] = args; + declutterImageWithText[index] = args; // Don't render anything for now, wait for the text. continue; } - imageArgs = declutterImageWithText[d]; - delete declutterImageWithText[d]; + imageArgs = declutterImageWithText[index]; + delete declutterImageWithText[index]; imageDeclutterBox = getDeclutterBox(imageArgs); if (opt_declutterTree.collides(imageDeclutterBox)) { continue; From ab198cc27b998ad2cf94812176a7deed63fbf0ee Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 18 Jan 2021 07:59:11 +0000 Subject: [PATCH 411/525] Bump webpack-dev-middleware from 4.0.2 to 4.1.0 Bumps [webpack-dev-middleware](https://github.com/webpack/webpack-dev-middleware) from 4.0.2 to 4.1.0. - [Release notes](https://github.com/webpack/webpack-dev-middleware/releases) - [Changelog](https://github.com/webpack/webpack-dev-middleware/blob/master/CHANGELOG.md) - [Commits](https://github.com/webpack/webpack-dev-middleware/compare/v4.0.2...v4.1.0) Signed-off-by: dependabot-preview[bot] --- package-lock.json | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/package-lock.json b/package-lock.json index e883d34453..f18ab84724 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14131,14 +14131,15 @@ } }, "webpack-dev-middleware": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-4.0.2.tgz", - "integrity": "sha512-xyAICqIugWtT1RRH5aMMmZlPhDhEqPTDL0TWhmMZsuZ+cFlAvRxv4thCbuxdk9MW+OYK4c9BkfmgdQ1/7imkJA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-4.1.0.tgz", + "integrity": "sha512-mpa/FY+DiBu5+r5JUIyTCYWRfkWgyA3/OOE9lwfzV9S70A4vJYLsVRKj5rMFEsezBroy2FmPyQ8oBRVW8QmK1A==", "dev": true, "requires": { + "colorette": "^1.2.1", "mem": "^8.0.0", "memfs": "^3.2.0", - "mime-types": "^2.1.27", + "mime-types": "^2.1.28", "range-parser": "^1.2.1", "schema-utils": "^3.0.0" }, @@ -14168,18 +14169,18 @@ "dev": true }, "mime-db": { - "version": "1.44.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", - "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", + "version": "1.45.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz", + "integrity": "sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w==", "dev": true }, "mime-types": { - "version": "2.1.27", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", - "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "version": "2.1.28", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.28.tgz", + "integrity": "sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ==", "dev": true, "requires": { - "mime-db": "1.44.0" + "mime-db": "1.45.0" } }, "schema-utils": { From 804160fc0cabe32ef21bbb198873d2153824de71 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 18 Jan 2021 08:01:05 +0000 Subject: [PATCH 412/525] Bump ol-mapbox-style from 6.3.0 to 6.3.1 Bumps [ol-mapbox-style](https://github.com/openlayers/ol-mapbox-style) from 6.3.0 to 6.3.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.3.0...v6.3.1) Signed-off-by: dependabot-preview[bot] --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index e883d34453..199262f723 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1652,9 +1652,9 @@ "integrity": "sha1-zlblOfg1UrWNENZy6k1vya3HsjQ=" }, "@mapbox/mapbox-gl-style-spec": { - "version": "13.18.0", - "resolved": "https://registry.npmjs.org/@mapbox/mapbox-gl-style-spec/-/mapbox-gl-style-spec-13.18.0.tgz", - "integrity": "sha512-KwGBJfhxwCqImSZB2eiKZzTV2sRjkfGjn6gZen2jUlLfxJAAzSCaZP+37m+y3RcGTC+jPTADYkorhamwPuxaVw==", + "version": "13.18.1", + "resolved": "https://registry.npmjs.org/@mapbox/mapbox-gl-style-spec/-/mapbox-gl-style-spec-13.18.1.tgz", + "integrity": "sha512-By+CufXEpba7sIUfnpbtVzy5tqrCyFDNssq1k7psxzCL1Xr0y916OSkEH0j7fFilhalVExjoh/mYtxH32tOYqw==", "requires": { "@mapbox/jsonlint-lines-primitives": "~2.0.2", "@mapbox/point-geometry": "^0.1.0", @@ -10221,9 +10221,9 @@ "dev": true }, "ol-mapbox-style": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/ol-mapbox-style/-/ol-mapbox-style-6.3.0.tgz", - "integrity": "sha512-oRMP5nTEHvF8OoH0sofXElJGi1RV84H27M67nbb2AKcElGag/Z9a6FoI15+J/LSxsg5E1IOW4pIHi0w5ZOUIVg==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/ol-mapbox-style/-/ol-mapbox-style-6.3.1.tgz", + "integrity": "sha512-hZsvPVkk1Y+qmifxRX/gCaZJ5Mo04vWj6lbFhXpHDloQquHD3kTY0q8o3xbg4FehucuG7HyQteKWeFJRh3FMww==", "requires": { "@mapbox/mapbox-gl-style-spec": "^13.14.0", "mapbox-to-css-font": "^2.4.0", From dcf0e972b6ca158b3a53dba031b186e3b7618667 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 18 Jan 2021 08:08:52 +0000 Subject: [PATCH 413/525] Bump proj4 from 2.6.3 to 2.7.0 Bumps [proj4](https://github.com/proj4js/proj4js) from 2.6.3 to 2.7.0. - [Release notes](https://github.com/proj4js/proj4js/releases) - [Changelog](https://github.com/proj4js/proj4js/blob/master/changelog.md) - [Commits](https://github.com/proj4js/proj4js/compare/2.6.3...2.7.0) 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 e883d34453..607f541652 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10671,9 +10671,9 @@ "dev": true }, "proj4": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/proj4/-/proj4-2.6.3.tgz", - "integrity": "sha512-XRqnLmHWlvi7jqKNTqaOUrVy72JEtOUrnlLki99yZUOSvcSeBaZ1I/EGnQ2LzplSbjSrebGAdikqCLeCxC/YEg==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/proj4/-/proj4-2.7.0.tgz", + "integrity": "sha512-UVhulf8m70/dREOBrJagWq8cDYUgjQUWILRqys/gqo/+ZLeNB/04zbtPhJbz8+cCPzZNQMychfBaWUCP60U9mQ==", "dev": true, "requires": { "mgrs": "1.0.0", diff --git a/package.json b/package.json index 17e716f9dc..eab39ec2d8 100644 --- a/package.json +++ b/package.json @@ -89,7 +89,7 @@ "mocha": "8.2.1", "pixelmatch": "^5.1.0", "pngjs": "^6.0.0", - "proj4": "2.6.3", + "proj4": "2.7.0", "puppeteer": "5.5.0", "rollup": "^2.1.0", "rollup-plugin-babel": "^4.3.3", From 6b17edbaa62d3262d5c74f476f0ffe29e9c27b54 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 18 Jan 2021 09:16:18 +0000 Subject: [PATCH 414/525] Bump rollup from 2.36.1 to 2.36.2 Bumps [rollup](https://github.com/rollup/rollup) from 2.36.1 to 2.36.2. - [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.36.1...v2.36.2) 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 f933b25f19..515258af97 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11325,9 +11325,9 @@ } }, "rollup": { - "version": "2.36.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.36.1.tgz", - "integrity": "sha512-eAfqho8dyzuVvrGqpR0ITgEdq0zG2QJeWYh+HeuTbpcaXk8vNFc48B7bJa1xYosTCKx0CuW+447oQOW8HgBIZQ==", + "version": "2.36.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.36.2.tgz", + "integrity": "sha512-qjjiuJKb+/8n0EZyQYVW+gFU4bNRBcZaXVzUgSVrGw0HlQBlK2aWyaOMMs1Ufic1jV69b9kW3u3i9B+hISDm3A==", "dev": true, "requires": { "fsevents": "~2.1.2" From bc82a8ddefbfc6858e28b20dcc4c8e2c35bfe9db Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 18 Jan 2021 09:17:09 +0000 Subject: [PATCH 415/525] Bump webpack from 4.45.0 to 4.46.0 Bumps [webpack](https://github.com/webpack/webpack) from 4.45.0 to 4.46.0. - [Release notes](https://github.com/webpack/webpack/releases) - [Commits](https://github.com/webpack/webpack/compare/v4.45.0...v4.46.0) Signed-off-by: dependabot-preview[bot] --- package-lock.json | 20 ++++++++++---------- package.json | 2 +- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/package-lock.json b/package-lock.json index ab274f027a..d2201a84b7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4702,9 +4702,9 @@ } }, "enhanced-resolve": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz", - "integrity": "sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", + "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", "dev": true, "requires": { "graceful-fs": "^4.1.2", @@ -13723,9 +13723,9 @@ } }, "chokidar": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.0.tgz", - "integrity": "sha512-JgQM9JS92ZbFR4P90EvmzNpSGhpPBGBSj10PILeDyYFwp4h2/D9OM03wsJ4zW1fEp4ka2DGrnUeD7FuvQ2aZ2Q==", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", + "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", "dev": true, "optional": true, "requires": { @@ -13839,9 +13839,9 @@ "integrity": "sha1-mM6VCXsp4x++czBT4Q5XFkLRxsc=" }, "webpack": { - "version": "4.45.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.45.0.tgz", - "integrity": "sha512-JhDaVi4CbRcwLLAoqC7eugMSMJnZbIfE2AyjaZ19pnOIh/R2O/lXOiXA2tQFN0iXEcxgpPJsPJHW2wOWqiTLcw==", + "version": "4.46.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.46.0.tgz", + "integrity": "sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q==", "dev": true, "requires": { "@webassemblyjs/ast": "1.9.0", @@ -13852,7 +13852,7 @@ "ajv": "^6.10.2", "ajv-keywords": "^3.4.1", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^4.3.0", + "enhanced-resolve": "^4.5.0", "eslint-scope": "^4.0.3", "json-parse-better-errors": "^1.0.2", "loader-runner": "^2.4.0", diff --git a/package.json b/package.json index eab39ec2d8..45871a15ec 100644 --- a/package.json +++ b/package.json @@ -103,7 +103,7 @@ "typescript": "^4.0.2", "url-polyfill": "^1.1.5", "walk": "^2.3.9", - "webpack": "4.45.0", + "webpack": "4.46.0", "webpack-cli": "^4.0.0", "webpack-dev-middleware": "^4.0.0", "webpack-dev-server": "^3.3.1", From d054676dcc14c2b0c86eb18c731651ac76f72b59 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 18 Jan 2021 10:00:48 +0000 Subject: [PATCH 416/525] Bump eslint from 7.17.0 to 7.18.0 Bumps [eslint](https://github.com/eslint/eslint) from 7.17.0 to 7.18.0. - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/master/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/compare/v7.17.0...v7.18.0) Signed-off-by: dependabot-preview[bot] --- package-lock.json | 36 +++++++++++++++++++++--------------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/package-lock.json b/package-lock.json index d2201a84b7..b8ccc2d584 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1600,9 +1600,9 @@ "dev": true }, "@eslint/eslintrc": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.2.2.tgz", - "integrity": "sha512-EfB5OHNYp1F4px/LI/FEnGylop7nOqkQ1LRzCM0KccA2U8tvV8w01KBv37LbO7nW4H+YhKyo2LcJhRwjjV17QQ==", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.3.0.tgz", + "integrity": "sha512-1JTKgrOKAHVivSvOYw+sJOunkBjUOvjqWk1DPja7ZFhIS2mX/4EgTT8M7eTK9jrKhL/FvXXEbQwIs3pg1xp3dg==", "dev": true, "requires": { "ajv": "^6.12.4", @@ -1612,7 +1612,7 @@ "ignore": "^4.0.6", "import-fresh": "^3.2.1", "js-yaml": "^3.13.1", - "lodash": "^4.17.19", + "lodash": "^4.17.20", "minimatch": "^3.0.4", "strip-json-comments": "^3.1.1" }, @@ -1643,6 +1643,12 @@ "requires": { "type-fest": "^0.8.1" } + }, + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true } } }, @@ -4925,13 +4931,13 @@ } }, "eslint": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.17.0.tgz", - "integrity": "sha512-zJk08MiBgwuGoxes5sSQhOtibZ75pz0J35XTRlZOk9xMffhpA9BTbQZxoXZzOl5zMbleShbGwtw+1kGferfFwQ==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.18.0.tgz", + "integrity": "sha512-fbgTiE8BfUJZuBeq2Yi7J3RB3WGUQ9PNuNbmgi6jt9Iv8qrkxfy19Ds3OpL1Pm7zg3BtTVhvcUZbIRQ0wmSjAQ==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@eslint/eslintrc": "^0.2.2", + "@eslint/eslintrc": "^0.3.0", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -4955,7 +4961,7 @@ "js-yaml": "^3.13.1", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", - "lodash": "^4.17.19", + "lodash": "^4.17.20", "minimatch": "^3.0.4", "natural-compare": "^1.4.0", "optionator": "^0.9.1", @@ -5142,6 +5148,12 @@ "type-check": "~0.4.0" } }, + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true + }, "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -5273,12 +5285,6 @@ "require-from-string": "^2.0.2", "uri-js": "^4.2.2" } - }, - "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", - "dev": true } } }, From c149f52eaf876640a4d29b95b849351febd21c9d Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 18 Jan 2021 10:00:53 +0000 Subject: [PATCH 417/525] Bump webpack-dev-server from 3.11.1 to 3.11.2 Bumps [webpack-dev-server](https://github.com/webpack/webpack-dev-server) from 3.11.1 to 3.11.2. - [Release notes](https://github.com/webpack/webpack-dev-server/releases) - [Changelog](https://github.com/webpack/webpack-dev-server/blob/v3.11.2/CHANGELOG.md) - [Commits](https://github.com/webpack/webpack-dev-server/compare/v3.11.1...v3.11.2) Signed-off-by: dependabot-preview[bot] --- package-lock.json | 45 +++++++++++++++++++++++++++++++++++++-------- 1 file changed, 37 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index d2201a84b7..185cfe12ff 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11093,13 +11093,42 @@ } }, "regexp.prototype.flags": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", - "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", + "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", "dev": true, "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "dependencies": { + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "get-intrinsic": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.0.2.tgz", + "integrity": "sha512-aeX0vrFm21ILl3+JpFFRNe9aUvp6VFZb2/CTbgLb8j75kOhvoNYjt9d8KA/tJG4gSo8nzEDedRl0h7vDmBYRVg==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + } } }, "regexpp": { @@ -14197,9 +14226,9 @@ } }, "webpack-dev-server": { - "version": "3.11.1", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.1.tgz", - "integrity": "sha512-u4R3mRzZkbxQVa+MBWi2uVpB5W59H3ekZAJsQlKUTdl7Elcah2EhygTPLmeFXybQkf9i2+L0kn7ik9SnXa6ihQ==", + "version": "3.11.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.2.tgz", + "integrity": "sha512-A80BkuHRQfCiNtGBS1EMf2ChTUs0x+B3wGDFmOeT4rmJOHhHTCH2naNxIHhmkr0/UillP4U3yeIyv1pNp+QDLQ==", "dev": true, "requires": { "ansi-html": "0.0.7", From 25a374d698c42bd15e7f26c157b36994a2015558 Mon Sep 17 00:00:00 2001 From: Hannes Date: Tue, 19 Jan 2021 17:25:47 +0100 Subject: [PATCH 418/525] Mention unit of radius for Polygon.circular() Radius was using an unknown unit. This makes it clear that it will be interpreted as meters. --- src/ol/geom/Polygon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ol/geom/Polygon.js b/src/ol/geom/Polygon.js index 3b4aa7e94a..96b0eb5f1a 100644 --- a/src/ol/geom/Polygon.js +++ b/src/ol/geom/Polygon.js @@ -413,7 +413,7 @@ export default Polygon; * Create an approximation of a circle on the surface of a sphere. * @param {import("../coordinate.js").Coordinate} center Center (`[lon, lat]` in degrees). * @param {number} radius The great-circle distance from the center to - * the polygon vertices. + * the polygon vertices in meters. * @param {number=} opt_n Optional number of vertices for the resulting * polygon. Default is `32`. * @param {number=} opt_sphereRadius Optional radius for the sphere (defaults to From 9f228df0606c0d033c6bf7d433308b2654119e94 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 20 Jan 2021 21:35:57 +0000 Subject: [PATCH 419/525] [Security] Bump socket.io from 2.3.0 to 2.4.1 Bumps [socket.io](https://github.com/socketio/socket.io) from 2.3.0 to 2.4.1. **This update includes a security fix.** - [Release notes](https://github.com/socketio/socket.io/releases) - [Changelog](https://github.com/socketio/socket.io/blob/2.4.1/CHANGELOG.md) - [Commits](https://github.com/socketio/socket.io/compare/2.3.0...2.4.1) Signed-off-by: dependabot-preview[bot] --- package-lock.json | 234 ++++++++++++++++++++-------------------------- 1 file changed, 102 insertions(+), 132 deletions(-) diff --git a/package-lock.json b/package-lock.json index e73398c19b..2664f9c185 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2865,15 +2865,6 @@ "tweetnacl": "^0.14.3" } }, - "better-assert": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", - "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", - "dev": true, - "requires": { - "callsite": "1.0.0" - } - }, "big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", @@ -3315,12 +3306,6 @@ "get-intrinsic": "^1.0.0" } }, - "callsite": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", - "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", - "dev": true - }, "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -3771,12 +3756,6 @@ "safe-buffer": "~5.1.1" } }, - "cookie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", - "dev": true - }, "cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", @@ -4650,50 +4629,6 @@ "once": "^1.4.0" } }, - "engine.io": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.4.2.tgz", - "integrity": "sha512-b4Q85dFkGw+TqgytGPrGgACRUhsdKc9S9ErRAXpPGy/CXKs4tYoHDkvIRdsseAF7NjfVwjRFIn6KTnbw7LwJZg==", - "dev": true, - "requires": { - "accepts": "~1.3.4", - "base64id": "2.0.0", - "cookie": "0.3.1", - "debug": "~4.1.0", - "engine.io-parser": "~2.2.0", - "ws": "^7.1.2" - } - }, - "engine.io-client": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.4.3.tgz", - "integrity": "sha512-0NGY+9hioejTEJCaSJZfWZLk4FPI9dN+1H1C4+wj2iuFba47UgZbJzfWs4aNFajnX/qAaYKbe2lLTfEEWzCmcw==", - "dev": true, - "requires": { - "component-emitter": "~1.3.0", - "component-inherit": "0.0.3", - "debug": "~4.1.0", - "engine.io-parser": "~2.2.0", - "has-cors": "1.1.0", - "indexof": "0.0.1", - "parseqs": "0.0.5", - "parseuri": "0.0.5", - "ws": "~6.1.0", - "xmlhttprequest-ssl": "~1.5.4", - "yeast": "0.1.2" - }, - "dependencies": { - "ws": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.4.tgz", - "integrity": "sha512-eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0" - } - } - } - }, "engine.io-parser": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.0.tgz", @@ -10119,12 +10054,6 @@ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "dev": true }, - "object-component": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", - "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=", - "dev": true - }, "object-copy": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", @@ -10412,24 +10341,6 @@ "error-ex": "^1.2.0" } }, - "parseqs": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", - "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", - "dev": true, - "requires": { - "better-assert": "~1.0.0" - } - }, - "parseuri": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", - "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", - "dev": true, - "requires": { - "better-assert": "~1.0.0" - } - }, "parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -12127,53 +12038,69 @@ } }, "socket.io": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.3.0.tgz", - "integrity": "sha512-2A892lrj0GcgR/9Qk81EaY2gYhCBxurV0PfmmESO6p27QPrUK1J3zdns+5QPqvUYK2q657nSj0guoIil9+7eFg==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.4.1.tgz", + "integrity": "sha512-Si18v0mMXGAqLqCVpTxBa8MGqriHGQh8ccEOhmsmNS3thNCGBwO8WGrwMibANsWtQQ5NStdZwHqZR3naJVFc3w==", "dev": true, "requires": { "debug": "~4.1.0", - "engine.io": "~3.4.0", + "engine.io": "~3.5.0", "has-binary2": "~1.0.2", "socket.io-adapter": "~1.1.0", - "socket.io-client": "2.3.0", + "socket.io-client": "2.4.0", "socket.io-parser": "~3.4.0" - } - }, - "socket.io-adapter": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz", - "integrity": "sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g==", - "dev": true - }, - "socket.io-client": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.3.0.tgz", - "integrity": "sha512-cEQQf24gET3rfhxZ2jJ5xzAOo/xhZwK+mOqtGRg5IowZsMgwvHwnf/mCRapAAkadhM26y+iydgwsXGObBB5ZdA==", - "dev": true, - "requires": { - "backo2": "1.0.2", - "base64-arraybuffer": "0.1.5", - "component-bind": "1.0.0", - "component-emitter": "1.2.1", - "debug": "~4.1.0", - "engine.io-client": "~3.4.0", - "has-binary2": "~1.0.2", - "has-cors": "1.1.0", - "indexof": "0.0.1", - "object-component": "0.0.3", - "parseqs": "0.0.5", - "parseuri": "0.0.5", - "socket.io-parser": "~3.3.0", - "to-array": "0.1.4" }, "dependencies": { - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", "dev": true }, + "engine.io": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.5.0.tgz", + "integrity": "sha512-21HlvPUKaitDGE4GXNtQ7PLP0Sz4aWLddMPw2VTyFz1FVZqu/kZsJUO8WNpKuE/OCL7nkfRaOui2ZCJloGznGA==", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "debug": "~4.1.0", + "engine.io-parser": "~2.2.0", + "ws": "~7.4.2" + } + }, + "engine.io-client": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.5.0.tgz", + "integrity": "sha512-12wPRfMrugVw/DNyJk34GQ5vIVArEcVMXWugQGGuw2XxUSztFNmJggZmv8IZlLyEdnpO1QB9LkcjeWewO2vxtA==", + "dev": true, + "requires": { + "component-emitter": "~1.3.0", + "component-inherit": "0.0.3", + "debug": "~3.1.0", + "engine.io-parser": "~2.2.0", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "parseqs": "0.0.6", + "parseuri": "0.0.6", + "ws": "~7.4.2", + "xmlhttprequest-ssl": "~1.5.4", + "yeast": "0.1.2" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, "isarray": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", @@ -12186,15 +12113,35 @@ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, - "socket.io-parser": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.0.tgz", - "integrity": "sha512-hczmV6bDgdaEbVqhAeVMM/jfUfzuEZHsQg6eOmLgJht6G3mPKMxYm75w2+qhAQZ+4X+1+ATZ+QFKeOZD5riHng==", + "parseqs": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz", + "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==", + "dev": true + }, + "parseuri": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz", + "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==", + "dev": true + }, + "socket.io-client": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.4.0.tgz", + "integrity": "sha512-M6xhnKQHuuZd4Ba9vltCLT9oa+YvTsP8j9NcEiLElfIg8KeYPyhWOes6x4t+LTAC8enQbE/995AdTem2uNyKKQ==", "dev": true, "requires": { - "component-emitter": "1.2.1", + "backo2": "1.0.2", + "component-bind": "1.0.0", + "component-emitter": "~1.3.0", "debug": "~3.1.0", - "isarray": "2.0.1" + "engine.io-client": "~3.5.0", + "has-binary2": "~1.0.2", + "indexof": "0.0.1", + "parseqs": "0.0.6", + "parseuri": "0.0.6", + "socket.io-parser": "~3.3.0", + "to-array": "0.1.4" }, "dependencies": { "debug": { @@ -12205,11 +12152,34 @@ "requires": { "ms": "2.0.0" } + }, + "socket.io-parser": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.2.tgz", + "integrity": "sha512-FJvDBuOALxdCI9qwRrO/Rfp9yfndRtc1jSgVgV8FDraihmSP/MLGD5PEuJrNfjALvcQ+vMDM/33AWOYP/JSjDg==", + "dev": true, + "requires": { + "component-emitter": "~1.3.0", + "debug": "~3.1.0", + "isarray": "2.0.1" + } } } + }, + "ws": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.2.tgz", + "integrity": "sha512-T4tewALS3+qsrpGI/8dqNMLIVdq/g/85U98HPMa6F0m6xTbvhXU6RCQLqPH3+SlomNV/LdY6RXEbBpMH6EOJnA==", + "dev": true } } }, + "socket.io-adapter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz", + "integrity": "sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g==", + "dev": true + }, "socket.io-parser": { "version": "3.4.1", "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.4.1.tgz", From a93fe61c232eafa351c73cf9c6015eade74248f9 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 21 Jan 2021 02:11:20 +0000 Subject: [PATCH 420/525] Bump karma from 5.2.3 to 6.0.1 Bumps [karma](https://github.com/karma-runner/karma) from 5.2.3 to 6.0.1. - [Release notes](https://github.com/karma-runner/karma/releases) - [Changelog](https://github.com/karma-runner/karma/blob/master/CHANGELOG.md) - [Commits](https://github.com/karma-runner/karma/compare/v5.2.3...v6.0.1) Signed-off-by: dependabot-preview[bot] --- package-lock.json | 559 +++++++++++++--------------------------------- package.json | 2 +- 2 files changed, 152 insertions(+), 409 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2664f9c185..64ffe17c43 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1791,6 +1791,24 @@ "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", "dev": true }, + "@types/component-emitter": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.10.tgz", + "integrity": "sha512-bsjleuRKWmGqajMerkzox19aGbscQX5rmmvvXl3wlIp5gMG1HgkiwPxsN5p070fBDKTNSPgojVbuY1+HWMbFhg==", + "dev": true + }, + "@types/cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-y7mImlc/rNkvCRmg8gC3/lj87S7pTUIJ6QGjwHR9WQJcFs+ZMTOaoPrkdFA/YdbuqVEmEbb5RdhVxMkAcgOnpg==", + "dev": true + }, + "@types/cors": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.9.tgz", + "integrity": "sha512-zurD1ibz21BRlAOIKP8yhrxlqKx6L9VCwkB5kMiP6nZAhoF5MvC7qS1qPA7nRcr1GJolfkQC7/EAL4hdYejLtg==", + "dev": true + }, "@types/estree": { "version": "0.0.39", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", @@ -2107,12 +2125,6 @@ "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==", "dev": true }, - "after": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", - "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=", - "dev": true - }, "agent-base": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-5.1.1.tgz", @@ -2306,12 +2318,6 @@ "es-abstract": "^1.17.0-next.1" } }, - "arraybuffer.slice": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", - "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==", - "dev": true - }, "asn1": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", @@ -2765,12 +2771,6 @@ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", "dev": true }, - "backo2": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", - "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", - "dev": true - }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", @@ -2833,9 +2833,9 @@ } }, "base64-arraybuffer": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", - "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=", + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", + "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI=", "dev": true }, "base64-js": { @@ -2927,12 +2927,6 @@ } } }, - "blob": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", - "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==", - "dev": true - }, "bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", @@ -3588,24 +3582,12 @@ "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", "dev": true }, - "component-bind": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", - "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", - "dev": true - }, "component-emitter": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", "dev": true }, - "component-inherit": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", - "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", - "dev": true - }, "compressible": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", @@ -3756,6 +3738,12 @@ "safe-buffer": "~5.1.1" } }, + "cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", + "dev": true + }, "cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", @@ -4143,6 +4131,16 @@ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, "coveralls": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.1.0.tgz", @@ -4629,17 +4627,51 @@ "once": "^1.4.0" } }, - "engine.io-parser": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.0.tgz", - "integrity": "sha512-6I3qD9iUxotsC5HEMuuGsKA0cXerGz+4uGcXQEkfBidgKf0amsjrrtwcbwK/nzpZBxclXlV7gGl9dgWvu4LF6w==", + "engine.io": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-4.1.0.tgz", + "integrity": "sha512-vW7EAtn0HDQ4MtT5QbmCHF17TaYLONv2/JwdYsq9USPRZVM4zG7WB3k0Nc321z8EuSOlhGokrYlYx4176QhD0A==", "dev": true, "requires": { - "after": "0.8.2", - "arraybuffer.slice": "~0.0.7", - "base64-arraybuffer": "0.1.5", - "blob": "0.0.5", - "has-binary2": "~1.0.2" + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~4.0.0", + "ws": "~7.4.2" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "ws": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.2.tgz", + "integrity": "sha512-T4tewALS3+qsrpGI/8dqNMLIVdq/g/85U98HPMa6F0m6xTbvhXU6RCQLqPH3+SlomNV/LdY6RXEbBpMH6EOJnA==", + "dev": true + } + } + }, + "engine.io-parser": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-4.0.2.tgz", + "integrity": "sha512-sHfEQv6nmtJrq6TKuIz5kyEKH/qSdK56H/A+7DnAuUPWosnIZAS2NHNcPLmyjtY3cGS/MqJdZbUjW97JU72iYg==", + "dev": true, + "requires": { + "base64-arraybuffer": "0.1.4" } }, "enhanced-resolve": { @@ -7221,29 +7253,6 @@ } } }, - "has-binary2": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", - "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", - "dev": true, - "requires": { - "isarray": "2.0.1" - }, - "dependencies": { - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", - "dev": true - } - } - }, - "has-cors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", - "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", - "dev": true - }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -7528,12 +7537,6 @@ "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "dev": true }, - "indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", - "dev": true - }, "infer-owner": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", @@ -8461,9 +8464,9 @@ "dev": true }, "karma": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/karma/-/karma-5.2.3.tgz", - "integrity": "sha512-tHdyFADhVVPBorIKCX8A37iLHxc6RBRphkSoQ+MLKdAtFn1k97tD8WUGi1KlEtDZKL3hui0qhsY9HXUfSNDYPQ==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/karma/-/karma-6.0.1.tgz", + "integrity": "sha512-LHE8Ywfeji6Sk3jt072j7gUAYZrpw7tCzvQWpgJqwCC9inW4eA3g1yl6srTtC0xiOvZDqXIzx8tgBPm0qhfYkg==", "dev": true, "requires": { "body-parser": "^1.19.0", @@ -8484,29 +8487,13 @@ "qjobs": "^1.2.0", "range-parser": "^1.2.1", "rimraf": "^3.0.2", - "socket.io": "^2.3.0", + "socket.io": "^3.0.4", "source-map": "^0.6.1", "tmp": "0.2.1", - "ua-parser-js": "0.7.22", - "yargs": "^15.3.1" + "ua-parser-js": "^0.7.23", + "yargs": "^16.1.1" }, "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, "anymatch": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", @@ -8518,9 +8505,9 @@ } }, "binary-extensions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", - "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true }, "braces": { @@ -8533,53 +8520,21 @@ } }, "chokidar": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz", - "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", + "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", "dev": true, "requires": { "anymatch": "~3.1.1", "braces": "~3.0.2", - "fsevents": "~2.1.2", + "fsevents": "~2.3.1", "glob-parent": "~5.1.0", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", - "readdirp": "~3.4.0" + "readdirp": "~3.5.0" } }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -8589,20 +8544,10 @@ "to-regex-range": "^5.0.1" } }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.1.tgz", + "integrity": "sha512-YR47Eg4hChJGAB1O3yEAOkGO+rlzutoICGqGo9EZ4lKWokzZRSyIW1QmTzqjtw8MJdj9srP869CuWw/hyzSiBw==", "dev": true, "optional": true }, @@ -8630,46 +8575,16 @@ "binary-extensions": "^2.0.0" } }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, "readdirp": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", - "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", "dev": true, "requires": { "picomatch": "^2.2.1" @@ -8692,26 +8607,6 @@ "glob": "^7.1.3" } }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, "tmp": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", @@ -8729,46 +8624,6 @@ "requires": { "is-number": "^7.0.0" } - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - } - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } } } }, @@ -11246,9 +11101,9 @@ "dev": true }, "rfdc": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.1.4.tgz", - "integrity": "sha512-5C9HXdzK8EAqN7JDif30jqsBzavB7wLpaubisuQIGHWf2gUXSpzy6ArX/+Da8RjFpagWsCn+pIgxTMAmKw9Zug==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.2.0.tgz", + "integrity": "sha512-ijLyszTMmUrXvjSooucVQwimGUk84eRcmCuLV8Xghe3UO85mjUtRAHRyoMM6XtyqbECaXuBWx18La3523sXINA==", "dev": true }, "rimraf": { @@ -12038,169 +11893,75 @@ } }, "socket.io": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.4.1.tgz", - "integrity": "sha512-Si18v0mMXGAqLqCVpTxBa8MGqriHGQh8ccEOhmsmNS3thNCGBwO8WGrwMibANsWtQQ5NStdZwHqZR3naJVFc3w==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-3.1.0.tgz", + "integrity": "sha512-Aqg2dlRh6xSJvRYK31ksG65q4kmBOqU4g+1ukhPcoT6wNGYoIwSYPlCPuRwOO9pgLUajojGFztl6+V2opmKcww==", "dev": true, "requires": { - "debug": "~4.1.0", - "engine.io": "~3.5.0", - "has-binary2": "~1.0.2", - "socket.io-adapter": "~1.1.0", - "socket.io-client": "2.4.0", - "socket.io-parser": "~3.4.0" + "@types/cookie": "^0.4.0", + "@types/cors": "^2.8.8", + "@types/node": "^14.14.10", + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "debug": "~4.3.1", + "engine.io": "~4.1.0", + "socket.io-adapter": "~2.1.0", + "socket.io-parser": "~4.0.3" }, "dependencies": { - "cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", + "@types/node": { + "version": "14.14.22", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.22.tgz", + "integrity": "sha512-g+f/qj/cNcqKkc3tFqlXOYjrmZA+jNBiDzbP3kH+B+otKFqAdPgVTGP1IeKRdMml/aE69as5S4FqtxAbl+LaMw==", "dev": true }, - "engine.io": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.5.0.tgz", - "integrity": "sha512-21HlvPUKaitDGE4GXNtQ7PLP0Sz4aWLddMPw2VTyFz1FVZqu/kZsJUO8WNpKuE/OCL7nkfRaOui2ZCJloGznGA==", + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "dev": true, "requires": { - "accepts": "~1.3.4", - "base64id": "2.0.0", - "cookie": "~0.4.1", - "debug": "~4.1.0", - "engine.io-parser": "~2.2.0", - "ws": "~7.4.2" + "ms": "2.1.2" } }, - "engine.io-client": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.5.0.tgz", - "integrity": "sha512-12wPRfMrugVw/DNyJk34GQ5vIVArEcVMXWugQGGuw2XxUSztFNmJggZmv8IZlLyEdnpO1QB9LkcjeWewO2vxtA==", - "dev": true, - "requires": { - "component-emitter": "~1.3.0", - "component-inherit": "0.0.3", - "debug": "~3.1.0", - "engine.io-parser": "~2.2.0", - "has-cors": "1.1.0", - "indexof": "0.0.1", - "parseqs": "0.0.6", - "parseuri": "0.0.6", - "ws": "~7.4.2", - "xmlhttprequest-ssl": "~1.5.4", - "yeast": "0.1.2" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", - "dev": true - }, "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "parseqs": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz", - "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==", - "dev": true - }, - "parseuri": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz", - "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==", - "dev": true - }, - "socket.io-client": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.4.0.tgz", - "integrity": "sha512-M6xhnKQHuuZd4Ba9vltCLT9oa+YvTsP8j9NcEiLElfIg8KeYPyhWOes6x4t+LTAC8enQbE/995AdTem2uNyKKQ==", - "dev": true, - "requires": { - "backo2": "1.0.2", - "component-bind": "1.0.0", - "component-emitter": "~1.3.0", - "debug": "~3.1.0", - "engine.io-client": "~3.5.0", - "has-binary2": "~1.0.2", - "indexof": "0.0.1", - "parseqs": "0.0.6", - "parseuri": "0.0.6", - "socket.io-parser": "~3.3.0", - "to-array": "0.1.4" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "socket.io-parser": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.2.tgz", - "integrity": "sha512-FJvDBuOALxdCI9qwRrO/Rfp9yfndRtc1jSgVgV8FDraihmSP/MLGD5PEuJrNfjALvcQ+vMDM/33AWOYP/JSjDg==", - "dev": true, - "requires": { - "component-emitter": "~1.3.0", - "debug": "~3.1.0", - "isarray": "2.0.1" - } - } - } - }, - "ws": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.2.tgz", - "integrity": "sha512-T4tewALS3+qsrpGI/8dqNMLIVdq/g/85U98HPMa6F0m6xTbvhXU6RCQLqPH3+SlomNV/LdY6RXEbBpMH6EOJnA==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true } } }, "socket.io-adapter": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz", - "integrity": "sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.1.0.tgz", + "integrity": "sha512-+vDov/aTsLjViYTwS9fPy5pEtTkrbEKsw2M+oVSoFGw6OD1IpvlV1VPhUzNbofCQ8oyMbdYJqDtGdmHQK6TdPg==", "dev": true }, "socket.io-parser": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.4.1.tgz", - "integrity": "sha512-11hMgzL+WCLWf1uFtHSNvliI++tcRUWdoeYuwIl+Axvwy9z2gQM+7nJyN3STj1tLj5JyIUH8/gpDGxzAlDdi0A==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.4.tgz", + "integrity": "sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g==", "dev": true, "requires": { - "component-emitter": "1.2.1", - "debug": "~4.1.0", - "isarray": "2.0.1" + "@types/component-emitter": "^1.2.10", + "component-emitter": "~1.3.0", + "debug": "~4.3.1" }, "dependencies": { - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } }, - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true } } @@ -13217,12 +12978,6 @@ "os-tmpdir": "~1.0.2" } }, - "to-array": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", - "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", - "dev": true - }, "to-arraybuffer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", @@ -13370,9 +13125,9 @@ "dev": true }, "ua-parser-js": { - "version": "0.7.22", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.22.tgz", - "integrity": "sha512-YUxzMjJ5T71w6a8WWVcMGM6YWOTX27rCoIQgLXiWaxqXSx9D7DNjiGWn1aJIRSQ5qr0xuhra77bSIh6voR/46Q==", + "version": "0.7.23", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.23.tgz", + "integrity": "sha512-m4hvMLxgGHXG3O3fQVAyyAQpZzDOvwnhOTjYz5Xmr7r/+LpkNy3vJXdVRWgd1TkAb7NGROZuSy96CrlNVjA7KA==", "dev": true }, "uc.micro": { @@ -14584,12 +14339,6 @@ "integrity": "sha512-HgS+X6zAztGa9zIK3Y3LXuJes33Lz9x+YyTxgrkIdabu2vqcGOWwdfCpf1hWLRrd553wd4QCDf6BBO6FfdsRiQ==", "dev": true }, - "xmlhttprequest-ssl": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", - "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=", - "dev": true - }, "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", @@ -14767,12 +14516,6 @@ "fd-slicer": "~1.1.0" } }, - "yeast": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", - "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", - "dev": true - }, "yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/package.json b/package.json index 45871a15ec..35c48bec38 100644 --- a/package.json +++ b/package.json @@ -77,7 +77,7 @@ "jsdoc": "3.6.6", "jsdoc-plugin-typescript": "^2.0.5", "json-stringify-safe": "^5.0.1", - "karma": "^5.0.1", + "karma": "^6.0.1", "karma-chrome-launcher": "3.1.0", "karma-coverage-istanbul-reporter": "^3.0.0", "karma-firefox-launcher": "^2.0.0", From 900107df1d05e113e0146068718e686c8c0a8eee Mon Sep 17 00:00:00 2001 From: Andreas Hocevar Date: Fri, 22 Jan 2021 20:08:05 +0100 Subject: [PATCH 421/525] Take view padding into account for calculateExtent() --- src/ol/View.js | 2 +- test/spec/ol/view.test.js | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/ol/View.js b/src/ol/View.js index a870152ac3..5ee7b4d4a4 100644 --- a/src/ol/View.js +++ b/src/ol/View.js @@ -921,7 +921,7 @@ class View extends BaseObject { * @return {import("./extent.js").Extent} Extent. */ calculateExtentInternal(opt_size) { - const size = opt_size || this.getViewportSize_(); + const size = opt_size || this.getViewportSizeMinusPadding_(); const center = /** @type {!import("./coordinate.js").Coordinate} */ (this.getCenterInternal()); assert(center, 1); // The view center is not defined const resolution = /** @type {!number} */ (this.getResolution()); diff --git a/test/spec/ol/view.test.js b/test/spec/ol/view.test.js index ea8d2852ee..6ec77ea4a5 100644 --- a/test/spec/ol/view.test.js +++ b/test/spec/ol/view.test.js @@ -1622,6 +1622,21 @@ describe('ol.View', function () { expect(extent[2]).to.roughlyEqual(51200, 1e-9); expect(extent[3]).to.roughlyEqual(25600, 1e-9); }); + it('works with a view padding', function () { + const view = new View({ + resolutions: [1], + zoom: 0, + center: [0, 0], + padding: [10, 20, 30, 40], + }); + + let extent = view.calculateExtent(); + expect(extent).to.eql([-20, -30, 20, 30]); + view.padding = [0, 0, 0, 0]; + view.setCenter([0, 0]); + extent = view.calculateExtent(); + expect(extent).to.eql([-50, -50, 50, 50]); + }); }); describe('#getViewportSize_()', function () { From 4f2b2c5750f6bd95787341415711c4400cb5ef16 Mon Sep 17 00:00:00 2001 From: Andreas Hocevar Date: Sat, 23 Jan 2021 12:15:12 +0100 Subject: [PATCH 422/525] Fix loading flag for vector loading strategies --- src/ol/source/Vector.js | 13 +++++++++++-- test/spec/ol/map.test.js | 9 +++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/ol/source/Vector.js b/src/ol/source/Vector.js index 38ad4ab5c6..9c6e076c1f 100644 --- a/src/ol/source/Vector.js +++ b/src/ol/source/Vector.js @@ -234,6 +234,12 @@ class VectorSource extends Source { */ this.loadedExtentsRtree_ = new RBush(); + /** + * @type {number} + * @private + */ + this.loadingExtentsCount_ = 0; + /** * @private * @type {!Object>} @@ -901,7 +907,6 @@ class VectorSource extends Source { loadFeatures(extent, resolution, projection) { const loadedExtentsRtree = this.loadedExtentsRtree_; const extentsToLoad = this.strategy_(extent, resolution); - this.loading = false; for (let i = 0, ii = extentsToLoad.length; i < ii; ++i) { const extentToLoad = extentsToLoad[i]; const alreadyLoaded = loadedExtentsRtree.forEachInExtent( @@ -915,6 +920,7 @@ class VectorSource extends Source { } ); if (!alreadyLoaded) { + ++this.loadingExtentsCount_; this.dispatchEvent( new VectorSourceEvent(VectorEventType.FEATURESLOADSTART) ); @@ -924,6 +930,7 @@ class VectorSource extends Source { resolution, projection, function (features) { + --this.loadingExtentsCount_; this.dispatchEvent( new VectorSourceEvent( VectorEventType.FEATURESLOADEND, @@ -933,15 +940,17 @@ class VectorSource extends Source { ); }.bind(this), function () { + --this.loadingExtentsCount_; this.dispatchEvent( new VectorSourceEvent(VectorEventType.FEATURESLOADERROR) ); }.bind(this) ); loadedExtentsRtree.insert(extentToLoad, {extent: extentToLoad.slice()}); - this.loading = this.loader_ !== VOID; } } + this.loading = + this.loader_ === VOID ? false : this.loadingExtentsCount_ > 0; } refresh() { diff --git a/test/spec/ol/map.test.js b/test/spec/ol/map.test.js index 0f71bd84f1..4546c2f44d 100644 --- a/test/spec/ol/map.test.js +++ b/test/spec/ol/map.test.js @@ -28,7 +28,9 @@ import { transform, useGeographic, } from '../../../src/ol/proj.js'; +import {createXYZ} from '../../../src/ol/tilegrid.js'; import {defaults as defaultInteractions} from '../../../src/ol/interaction.js'; +import {tile as tileStrategy} from '../../../src/ol/loadingstrategy.js'; describe('ol.Map', function () { describe('constructor', function () { @@ -226,6 +228,13 @@ describe('ol.Map', function () { format: new GeoJSON(), }), }), + new VectorLayer({ + source: new VectorSource({ + url: 'spec/ol/data/point.json', + format: new GeoJSON(), + strategy: tileStrategy(createXYZ()), + }), + }), new VectorLayer({ source: new VectorSource({ features: [new Feature(new Point([0, 0]))], From aa2c301f3e70b918d68679df57e91a70fd44c8cb Mon Sep 17 00:00:00 2001 From: Andreas Hocevar Date: Sat, 23 Jan 2021 21:50:41 +0100 Subject: [PATCH 423/525] Do not change center when the padding changes --- src/ol/View.js | 45 ++++++++++++++++++++++++++++++--------- test/spec/ol/view.test.js | 8 +++---- 2 files changed, 38 insertions(+), 15 deletions(-) diff --git a/src/ol/View.js b/src/ol/View.js index 5ee7b4d4a4..5474d63603 100644 --- a/src/ol/View.js +++ b/src/ol/View.js @@ -399,15 +399,10 @@ class View extends BaseObject { this.resolutions_ = options.resolutions; /** - * Padding (in css pixels). - * If the map viewport is partially covered with other content (overlays) along - * its edges, this setting allows to shift the center of the viewport away from that - * content. The order of the values in the array is top, right, bottom, left. - * The default is no padding, which is equivalent to `[0, 0, 0, 0]`. * @type {Array|undefined} - * @api + * @private */ - this.padding = options.padding; + this.padding_ = options.padding; /** * @private @@ -448,6 +443,36 @@ class View extends BaseObject { this.options_ = options; } + /** + * Padding (in css pixels). + * If the map viewport is partially covered with other content (overlays) along + * its edges, this setting allows to shift the center of the viewport away from that + * content. The order of the values in the array is top, right, bottom, left. + * The default is no padding, which is equivalent to `[0, 0, 0, 0]`. + * @type {Array|undefined} + * @api + */ + get padding() { + return this.padding_; + } + set padding(padding) { + let oldPadding = this.padding_; + this.padding_ = padding; + const center = this.getCenter(); + if (center) { + const newPadding = padding || [0, 0, 0, 0]; + oldPadding = oldPadding || [0, 0, 0, 0]; + const resolution = this.getResolution(); + const offsetX = + (resolution / 2) * + (newPadding[3] - oldPadding[3] + oldPadding[1] - newPadding[1]); + const offsetY = + (resolution / 2) * + (newPadding[0] - oldPadding[0] + oldPadding[2] - newPadding[2]); + this.setCenterInternal([center[0] + offsetX, center[1] - offsetY]); + } + } + /** * Get an updated version of the view options used to construct the view. The * current resolution (or zoom), center, and rotation are applied to any stored @@ -1121,7 +1146,7 @@ class View extends BaseObject { */ getViewportSizeMinusPadding_(opt_rotation) { let size = this.getViewportSize_(opt_rotation); - const padding = this.padding; + const padding = this.padding_; if (padding) { size = [ size[0] - padding[1] - padding[3], @@ -1139,7 +1164,7 @@ class View extends BaseObject { const resolution = /** @type {number} */ (this.getResolution()); const rotation = this.getRotation(); let center = /** @type {import("./coordinate.js").Coordinate} */ (this.getCenterInternal()); - const padding = this.padding; + const padding = this.padding_; if (padding) { const reducedSize = this.getViewportSizeMinusPadding_(); center = calculateCenterOn( @@ -1395,7 +1420,7 @@ class View extends BaseObject { */ calculateCenterShift(center, resolution, rotation, size) { let centerShift; - const padding = this.padding; + const padding = this.padding_; if (padding && center) { const reducedSize = this.getViewportSizeMinusPadding_(-rotation); const shiftedCenter = calculateCenterOn( diff --git a/test/spec/ol/view.test.js b/test/spec/ol/view.test.js index 6ec77ea4a5..8376e2d98a 100644 --- a/test/spec/ol/view.test.js +++ b/test/spec/ol/view.test.js @@ -1633,9 +1633,8 @@ describe('ol.View', function () { let extent = view.calculateExtent(); expect(extent).to.eql([-20, -30, 20, 30]); view.padding = [0, 0, 0, 0]; - view.setCenter([0, 0]); extent = view.calculateExtent(); - expect(extent).to.eql([-50, -50, 50, 50]); + expect(extent).to.eql([-60, -60, 40, 40]); }); }); @@ -2207,7 +2206,7 @@ describe('ol.View', function () { }); }); - describe('#getState', function () { + describe('#getCenter', function () { let view; beforeEach(function () { view = new View({ @@ -2219,8 +2218,7 @@ describe('ol.View', function () { }); it('Correctly shifts the viewport center when a padding is set', function () { view.padding = [50, 0, 0, 50]; - const state = view.getState(); - expect(state.center).to.eql([-25, 25]); + expect(view.getCenter()).to.eql([25, -25]); }); }); }); From a39ee72a8a0e10dba38c373a27e4920dbe13b9ce Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 25 Jan 2021 07:08:50 +0000 Subject: [PATCH 424/525] Bump rollup from 2.36.2 to 2.38.0 Bumps [rollup](https://github.com/rollup/rollup) from 2.36.2 to 2.38.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.36.2...v2.38.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 64ffe17c43..48af2d0c8f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11126,9 +11126,9 @@ } }, "rollup": { - "version": "2.36.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.36.2.tgz", - "integrity": "sha512-qjjiuJKb+/8n0EZyQYVW+gFU4bNRBcZaXVzUgSVrGw0HlQBlK2aWyaOMMs1Ufic1jV69b9kW3u3i9B+hISDm3A==", + "version": "2.38.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.38.0.tgz", + "integrity": "sha512-ay9zDiNitZK/LNE/EM2+v5CZ7drkB2xyDljvb1fQJCGnq43ZWRkhxN145oV8GmoW1YNi4sA/1Jdkr2LfawJoXw==", "dev": true, "requires": { "fsevents": "~2.1.2" From dd8df684c6314b0bced8dcdf55b960fe282a87db Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 25 Jan 2021 07:09:41 +0000 Subject: [PATCH 425/525] Bump fs-extra from 9.0.1 to 9.1.0 Bumps [fs-extra](https://github.com/jprichardson/node-fs-extra) from 9.0.1 to 9.1.0. - [Release notes](https://github.com/jprichardson/node-fs-extra/releases) - [Changelog](https://github.com/jprichardson/node-fs-extra/blob/master/CHANGELOG.md) - [Commits](https://github.com/jprichardson/node-fs-extra/compare/9.0.1...9.1.0) Signed-off-by: dependabot-preview[bot] --- package-lock.json | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/package-lock.json b/package-lock.json index 64ffe17c43..b1d203a40f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6425,15 +6425,15 @@ "dev": true }, "fs-extra": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz", - "integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, "requires": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", - "universalify": "^1.0.0" + "universalify": "^2.0.0" }, "dependencies": { "graceful-fs": { @@ -6443,19 +6443,19 @@ "dev": true }, "jsonfile": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz", - "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, "requires": { "graceful-fs": "^4.1.6", - "universalify": "^1.0.0" + "universalify": "^2.0.0" } }, "universalify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", - "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", "dev": true } } From f5cfbf2854cbe75c91150cacc5a1b58162eb379b Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 25 Jan 2021 07:11:09 +0000 Subject: [PATCH 426/525] Bump webpack-cli from 4.3.1 to 4.4.0 Bumps [webpack-cli](https://github.com/webpack/webpack-cli) from 4.3.1 to 4.4.0. - [Release notes](https://github.com/webpack/webpack-cli/releases) - [Changelog](https://github.com/webpack/webpack-cli/blob/master/CHANGELOG.md) - [Commits](https://github.com/webpack/webpack-cli/compare/webpack-cli@4.3.1...webpack-cli@4.4.0) Signed-off-by: dependabot-preview[bot] --- package-lock.json | 38 ++++++++++++++++++++++++++------------ 1 file changed, 26 insertions(+), 12 deletions(-) diff --git a/package-lock.json b/package-lock.json index 64ffe17c43..953890bc46 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2064,6 +2064,12 @@ "@xtuc/long": "4.2.2" } }, + "@webpack-cli/configtest": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.0.0.tgz", + "integrity": "sha512-Un0SdBoN1h4ACnIO7EiCjWuyhNI0Jl96JC+63q6xi4HDUYRZn8Auluea9D+v9NWKc5J4sICVEltdBaVjLX39xw==", + "dev": true + }, "@webpack-cli/info": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.2.1.tgz", @@ -2074,9 +2080,9 @@ } }, "@webpack-cli/serve": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.2.1.tgz", - "integrity": "sha512-Zj1z6AyS+vqV6Hfi7ngCjFGdHV5EwZNIHo6QfFTNe9PyW+zBU1zJ9BiOW1pmUEq950RC4+Dym6flyA/61/vhyw==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.2.2.tgz", + "integrity": "sha512-03GkWxcgFfm8+WIwcsqJb9agrSDNDDoxaNnexPnCCexP5SCE4IgFd9lNpSy+K2nFqVMpgTFw6SwbmVAVTndVew==", "dev": true }, "@xtuc/ieee754": { @@ -13679,14 +13685,15 @@ } }, "webpack-cli": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.3.1.tgz", - "integrity": "sha512-/F4+9QNZM/qKzzL9/06Am8NXIkGV+/NqQ62Dx7DSqudxxpAgBqYn6V7+zp+0Y7JuWksKUbczRY3wMTd+7Uj6OA==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.4.0.tgz", + "integrity": "sha512-/Qh07CXfXEkMu5S8wEpjuaw2Zj/CC0hf/qbTDp6N8N7JjdGuaOjZ7kttz+zhuJO/J5m7alQEhNk9lsc4rC6xgQ==", "dev": true, "requires": { "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^1.0.0", "@webpack-cli/info": "^1.2.1", - "@webpack-cli/serve": "^1.2.1", + "@webpack-cli/serve": "^1.2.2", "colorette": "^1.2.1", "commander": "^6.2.0", "enquirer": "^2.3.6", @@ -13696,7 +13703,7 @@ "interpret": "^2.2.0", "rechoir": "^0.7.0", "v8-compile-cache": "^2.2.0", - "webpack-merge": "^4.2.2" + "webpack-merge": "^5.7.3" }, "dependencies": { "commander": { @@ -14108,12 +14115,13 @@ } }, "webpack-merge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz", - "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==", + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.7.3.tgz", + "integrity": "sha512-6/JUQv0ELQ1igjGDzHkXbVDRxkfA57Zw7PfiupdLFJYrgFqY5ZP8xxbpp2lU3EPwYx89ht5Z/aDkD40hFCm5AA==", "dev": true, "requires": { - "lodash": "^4.17.15" + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" } }, "webpack-sources": { @@ -14167,6 +14175,12 @@ "string-width": "^1.0.2 || 2" } }, + "wildcard": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", + "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", + "dev": true + }, "wkt-parser": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/wkt-parser/-/wkt-parser-1.2.4.tgz", From b2b2df872ae393d1f0d901ea475abc060b6fd734 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 25 Jan 2021 07:11:59 +0000 Subject: [PATCH 427/525] Bump sinon from 9.2.3 to 9.2.4 Bumps [sinon](https://github.com/sinonjs/sinon) from 9.2.3 to 9.2.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/v9.2.3...v9.2.4) Signed-off-by: dependabot-preview[bot] --- package-lock.json | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/package-lock.json b/package-lock.json index 64ffe17c43..921051ebe4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1745,9 +1745,9 @@ } }, "@sinonjs/commons": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.1.tgz", - "integrity": "sha512-892K+kWUUi3cl+LlqEWIDrhvLgdL79tECi8JZUyq6IviKy/DNhuzCRlbHUjxK89f4ypPMMaFnFuR9Ie6DoIMsw==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.2.tgz", + "integrity": "sha512-sruwd86RJHdsVf/AtBoijDmUqJp3B6hF/DGC23C+JaegnDHaZyewCjoVGTdg3J0uz3Zs7NnIT05OBOmML72lQw==", "dev": true, "requires": { "type-detect": "4.0.8" @@ -1763,9 +1763,9 @@ } }, "@sinonjs/samsam": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-5.3.0.tgz", - "integrity": "sha512-hXpcfx3aq+ETVBwPlRFICld5EnrkexXuXDwqUNhDdr5L8VjvMeSRwyOa0qL7XFmR+jVWR4rUZtnxlG7RX72sBg==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-5.3.1.tgz", + "integrity": "sha512-1Hc0b1TtyfBu8ixF/tpfSHTVWKwCBLY4QJbkgnE7HcwyvT2xArDxb4K7dMgqRm3szI+LJbzmW/s4xxEhv6hwDg==", "dev": true, "requires": { "@sinonjs/commons": "^1.6.0", @@ -11717,14 +11717,14 @@ "dev": true }, "sinon": { - "version": "9.2.3", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-9.2.3.tgz", - "integrity": "sha512-m+DyAWvqVHZtjnjX/nuShasykFeiZ+nPuEfD4G3gpvKGkXRhkF/6NSt2qN2FjZhfrcHXFzUzI+NLnk+42fnLEw==", + "version": "9.2.4", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-9.2.4.tgz", + "integrity": "sha512-zljcULZQsJxVra28qIAL6ow1Z9tpattkCTEJR4RBP3TGc00FcttsP5pK284Nas5WjMZU5Yzy3kAIp3B3KRf5Yg==", "dev": true, "requires": { "@sinonjs/commons": "^1.8.1", "@sinonjs/fake-timers": "^6.0.1", - "@sinonjs/samsam": "^5.3.0", + "@sinonjs/samsam": "^5.3.1", "diff": "^4.0.2", "nise": "^4.0.4", "supports-color": "^7.1.0" From 988f3fa502e9e22adb477a9024f51a8a4ce1b7bf Mon Sep 17 00:00:00 2001 From: yukihiratype2 Date: Mon, 25 Jan 2021 18:10:01 +0800 Subject: [PATCH 428/525] Demonstrates how to get the coordinates been clustered. --- examples/cluster.js | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/examples/cluster.js b/examples/cluster.js index 944e1116b2..48e1d0493c 100644 --- a/examples/cluster.js +++ b/examples/cluster.js @@ -11,6 +11,7 @@ import { } from '../src/ol/style.js'; import {Cluster, OSM, Vector as VectorSource} from '../src/ol/source.js'; import {Tile as TileLayer, Vector as VectorLayer} from '../src/ol/layer.js'; +import {boundingExtent} from '../src/ol/extent.js'; const distance = document.getElementById('distance'); @@ -77,3 +78,18 @@ const map = new Map({ distance.addEventListener('input', function () { clusterSource.setDistance(parseInt(distance.value, 10)); }); + +map.on('click', (e) => { + clusters.getFeatures(e.pixel).then((clickedFeatures) => { + if (clickedFeatures.length) { + // Get clustered Coordinates + const features = clickedFeatures[0].get('features'); + if (features.length > 1) { + const extent = boundingExtent( + features.map((r) => r.getGeometry().getCoordinates()) + ); + map.getView().fit(extent, {duration: 1000, padding: [50, 50, 50, 50]}); + } + } + }); +}); From 419578a96c41ce3985ee7027435460e5599d3326 Mon Sep 17 00:00:00 2001 From: Simon Seyock Date: Tue, 26 Jan 2021 15:49:39 +0100 Subject: [PATCH 429/525] Improve layer typings --- src/ol/layer/BaseImage.js | 3 ++- src/ol/layer/BaseTile.js | 3 ++- src/ol/layer/Graticule.js | 1 + src/ol/layer/Heatmap.js | 1 + src/ol/layer/Image.js | 2 ++ src/ol/layer/Tile.js | 2 ++ src/ol/layer/Vector.js | 3 ++- src/ol/layer/VectorImage.js | 2 ++ src/ol/layer/WebGLPoints.js | 2 ++ 9 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/ol/layer/BaseImage.js b/src/ol/layer/BaseImage.js index 91307b138e..1d240b1242 100644 --- a/src/ol/layer/BaseImage.js +++ b/src/ol/layer/BaseImage.js @@ -37,7 +37,8 @@ import Layer from './Layer.js'; * property on the layer object; for example, setting `title: 'My Title'` in the * options means that `title` is observable, and has get/set accessors. * - * @extends {Layer} + * @template {import("../source/Image.js").default} ImageSourceType + * @extends {Layer} * @api */ class BaseImageLayer extends Layer { diff --git a/src/ol/layer/BaseTile.js b/src/ol/layer/BaseTile.js index 24a41c6022..de5fa0f4cf 100644 --- a/src/ol/layer/BaseTile.js +++ b/src/ol/layer/BaseTile.js @@ -42,7 +42,8 @@ import {assign} from '../obj.js'; * property on the layer object; for example, setting `title: 'My Title'` in the * options means that `title` is observable, and has get/set accessors. * - * @extends {Layer} + * @template {import("../source/Tile.js").default} TileSourceType + * @extends {Layer} * @api */ class BaseTileLayer extends Layer { diff --git a/src/ol/layer/Graticule.js b/src/ol/layer/Graticule.js index 51586eae17..249bc1e724 100644 --- a/src/ol/layer/Graticule.js +++ b/src/ol/layer/Graticule.js @@ -172,6 +172,7 @@ const INTERVALS = [ * Note that the view projection must define both extent and worldExtent. * * @fires import("../render/Event.js").RenderEvent + * @extends {VectorLayer} * @api */ class Graticule extends VectorLayer { diff --git a/src/ol/layer/Heatmap.js b/src/ol/layer/Heatmap.js index fca3dae345..9bfc2c9d59 100644 --- a/src/ol/layer/Heatmap.js +++ b/src/ol/layer/Heatmap.js @@ -61,6 +61,7 @@ const DEFAULT_GRADIENT = ['#00f', '#0ff', '#0f0', '#ff0', '#f00']; * options means that `title` is observable, and has get/set accessors. * * @fires import("../render/Event.js").RenderEvent + * @extends {VectorLayer} * @api */ class Heatmap extends VectorLayer { diff --git a/src/ol/layer/Image.js b/src/ol/layer/Image.js index dae27d2a55..5d0f86738b 100644 --- a/src/ol/layer/Image.js +++ b/src/ol/layer/Image.js @@ -12,6 +12,8 @@ import CanvasImageLayerRenderer from '../renderer/canvas/ImageLayer.js'; * property on the layer object; for example, setting `title: 'My Title'` in the * options means that `title` is observable, and has get/set accessors. * + * @template {import("../source/Image.js").default} ImageSourceType + * @extends {BaseImageLayer} * @api */ class ImageLayer extends BaseImageLayer { diff --git a/src/ol/layer/Tile.js b/src/ol/layer/Tile.js index 565b07f80e..01aca6aa49 100644 --- a/src/ol/layer/Tile.js +++ b/src/ol/layer/Tile.js @@ -12,6 +12,8 @@ import CanvasTileLayerRenderer from '../renderer/canvas/TileLayer.js'; * property on the layer object; for example, setting `title: 'My Title'` in the * options means that `title` is observable, and has get/set accessors. * + * @template {import("../source/Tile.js").default} TileSourceType + * @extends {BaseTileLayer} * @api */ class TileLayer extends BaseTileLayer { diff --git a/src/ol/layer/Vector.js b/src/ol/layer/Vector.js index 6092ac9b63..cd9843ab8b 100644 --- a/src/ol/layer/Vector.js +++ b/src/ol/layer/Vector.js @@ -11,7 +11,8 @@ import CanvasVectorLayerRenderer from '../renderer/canvas/VectorLayer.js'; * property on the layer object; for example, setting `title: 'My Title'` in the * options means that `title` is observable, and has get/set accessors. * - * @extends {BaseVectorLayer} + * @template {import("../source/Vector.js").default} VectorSourceType + * @extends {BaseVectorLayer} * @api */ class VectorLayer extends BaseVectorLayer { diff --git a/src/ol/layer/VectorImage.js b/src/ol/layer/VectorImage.js index 77c786265a..3e59628873 100644 --- a/src/ol/layer/VectorImage.js +++ b/src/ol/layer/VectorImage.js @@ -51,6 +51,8 @@ import {assign} from '../obj.js'; * property on the layer object; for example, setting `title: 'My Title'` in the * options means that `title` is observable, and has get/set accessors. * + * @template {import("../source/Vector.js").default} VectorSourceType + * @extends {BaseVectorLayer} * @api */ class VectorImageLayer extends BaseVectorLayer { diff --git a/src/ol/layer/WebGLPoints.js b/src/ol/layer/WebGLPoints.js index 68c6d42327..22a31a11a7 100644 --- a/src/ol/layer/WebGLPoints.js +++ b/src/ol/layer/WebGLPoints.js @@ -66,6 +66,8 @@ import {parseLiteralStyle} from '../webgl/ShaderBuilder.js'; * property on the layer object; for example, setting `title: 'My Title'` in the * options means that `title` is observable, and has get/set accessors. * + * @template {import("../source/Vector.js").default} VectorSourceType + * @extends {Layer} * @fires import("../render/Event.js").RenderEvent */ class WebGLPointsLayer extends Layer { From a63d3bf1ffcdffe7604af06b242f20829f8dbe64 Mon Sep 17 00:00:00 2001 From: mike-000 <49240900+mike-000@users.noreply.github.com> Date: Tue, 26 Jan 2021 18:48:14 +0000 Subject: [PATCH 430/525] Make polygons GeoJSON specification compliant --- examples/geojson.js | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/examples/geojson.js b/examples/geojson.js index 19d4b46f87..e0bed90d11 100644 --- a/examples/geojson.js +++ b/examples/geojson.js @@ -125,8 +125,9 @@ const geojsonObject = { 'coordinates': [ [ [-5e6, -1e6], - [-4e6, 1e6], [-3e6, -1e6], + [-4e6, 1e6], + [-5e6, -1e6], ], ], }, @@ -163,25 +164,28 @@ const geojsonObject = { [ [ [-5e6, 6e6], - [-5e6, 8e6], - [-3e6, 8e6], [-3e6, 6e6], + [-3e6, 8e6], + [-5e6, 8e6], + [-5e6, 6e6], ], ], [ [ [-2e6, 6e6], - [-2e6, 8e6], - [0, 8e6], [0, 6e6], + [0, 8e6], + [-2e6, 8e6], + [-2e6, 6e6], ], ], [ [ [1e6, 6e6], - [1e6, 8e6], - [3e6, 8e6], [3e6, 6e6], + [3e6, 8e6], + [1e6, 8e6], + [1e6, 6e6], ], ], ], @@ -208,8 +212,9 @@ const geojsonObject = { 'coordinates': [ [ [1e6, -6e6], - [2e6, -4e6], [3e6, -6e6], + [2e6, -4e6], + [1e6, -6e6], ], ], }, From bd93ef204f6599dc5d3fbafb21b4637456c3f0f9 Mon Sep 17 00:00:00 2001 From: Andreas Hocevar Date: Wed, 27 Jan 2021 12:23:02 +0100 Subject: [PATCH 431/525] Simplify icon example --- examples/icon.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/examples/icon.js b/examples/icon.js index 62e8a40e67..4d980a606c 100644 --- a/examples/icon.js +++ b/examples/icon.js @@ -56,7 +56,6 @@ const popup = new Overlay({ element: element, positioning: 'bottom-center', stopEvent: false, - offset: [0, -50], }); map.addOverlay(popup); @@ -66,8 +65,7 @@ map.on('click', function (evt) { return feature; }); if (feature) { - const coordinates = feature.getGeometry().getCoordinates(); - popup.setPosition(coordinates); + popup.setPosition(evt.coordinate); $(element).popover({ placement: 'top', html: true, From f500c354ee1a33ef75d2fec36e4ee34cd2cd07fd Mon Sep 17 00:00:00 2001 From: Andreas Hocevar Date: Wed, 27 Jan 2021 13:49:34 +0100 Subject: [PATCH 432/525] Close popup when map is moved --- examples/icon.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/icon.js b/examples/icon.js index 4d980a606c..123049ed8a 100644 --- a/examples/icon.js +++ b/examples/icon.js @@ -79,11 +79,11 @@ map.on('click', function (evt) { // change mouse cursor when over marker map.on('pointermove', function (e) { - if (e.dragging) { - $(element).popover('dispose'); - return; - } const pixel = map.getEventPixel(e.originalEvent); const hit = map.hasFeatureAtPixel(pixel); map.getTarget().style.cursor = hit ? 'pointer' : ''; }); +// Close the popup when the map is moved +map.on('movestart', function () { + $(element).popover('dispose'); +}); From fd04cd7a414e20fe6b67554de2b6e5f080345858 Mon Sep 17 00:00:00 2001 From: geraldo Date: Wed, 27 Jan 2021 17:15:27 +0100 Subject: [PATCH 433/525] Fix URLs in ol/source/CartoDB pointing to CartoDB API docs --- src/ol/source/CartoDB.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/ol/source/CartoDB.js b/src/ol/source/CartoDB.js index 5518536ea8..6f727da5ff 100644 --- a/src/ol/source/CartoDB.js +++ b/src/ol/source/CartoDB.js @@ -18,13 +18,13 @@ import {assign} from '../obj.js'; * @property {number} [minZoom] Minimum zoom. * @property {boolean} [wrapX=true] Whether to wrap the world horizontally. * @property {Object} [config] If using anonymous maps, the CartoDB config to use. See - * http://docs.cartodb.com/cartodb-platform/maps-api/anonymous-maps/ + * https://carto.com/developers/maps-api/guides/anonymous-maps/ * for more detail. * If using named maps, a key-value lookup with the template parameters. - * See http://docs.cartodb.com/cartodb-platform/maps-api/named-maps/ + * See https://carto.com/developers/maps-api/guides/named-maps/ * for more detail. * @property {string} [map] If using named maps, this will be the name of the template to load. - * See http://docs.cartodb.com/cartodb-platform/maps-api/named-maps/ + * See https://carto.com/developers/maps-api/guides/named-maps/ * for more detail. * @property {string} account If using named maps, this will be the name of the template to load. * @property {number} [transition=250] Duration of the opacity transition for rendering. From 0f03a5e70ee2f1ea69bc827bc48d2c821879b7b0 Mon Sep 17 00:00:00 2001 From: mike-000 <49240900+mike-000@users.noreply.github.com> Date: Sat, 30 Jan 2021 19:28:03 +0000 Subject: [PATCH 434/525] handle view rotation --- examples/d3.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/examples/d3.js b/examples/d3.js index ae6b352f71..921409c77d 100644 --- a/examples/d3.js +++ b/examples/d3.js @@ -50,10 +50,13 @@ class CanvasLayer extends Layer { const scale = r / frameState.viewState.resolution; const center = toLonLat(getCenter(frameState.extent), projection); + const angle = (-frameState.viewState.rotation * 180) / Math.PI; + d3Projection .scale(scale) .center(center) - .translate([width / 2, height / 2]); + .translate([width / 2, height / 2]) + .angle(angle); d3Path = d3Path.projection(d3Projection); d3Path(this.features); From d85da12782ac1516d00d779b0f1c21a65f82e756 Mon Sep 17 00:00:00 2001 From: mike-000 <49240900+mike-000@users.noreply.github.com> Date: Sun, 31 Jan 2021 23:11:22 +0000 Subject: [PATCH 435/525] simplify popup positioning --- examples/icon-scale.js | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/examples/icon-scale.js b/examples/icon-scale.js index d783b300b7..3d079fc0ba 100644 --- a/examples/icon-scale.js +++ b/examples/icon-scale.js @@ -98,7 +98,6 @@ const popup = new Overlay({ element: element, positioning: 'bottom-center', stopEvent: false, - offset: [0, -50], }); map.addOverlay(popup); @@ -109,8 +108,7 @@ map.on('click', function (evt) { }); $(element).popover('dispose'); if (feature) { - const coordinates = feature.getGeometry().getCoordinates(); - popup.setPosition(coordinates); + popup.setPosition(evt.coordinate); $(element).popover({ placement: 'top', html: true, @@ -123,11 +121,11 @@ map.on('click', function (evt) { // change mouse cursor when over marker map.on('pointermove', function (e) { - if (e.dragging) { - $(element).popover('dispose'); - return; - } const pixel = map.getEventPixel(e.originalEvent); const hit = map.hasFeatureAtPixel(pixel); map.getTarget().style.cursor = hit ? 'pointer' : ''; }); +// Close the popup when the map is moved +map.on('movestart', function () { + $(element).popover('dispose'); +}); From 282e0cabdbee39b0efbbc57f2d23f6634eb33d87 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 1 Feb 2021 07:37:16 +0000 Subject: [PATCH 436/525] Bump karma from 6.0.1 to 6.0.3 Bumps [karma](https://github.com/karma-runner/karma) from 6.0.1 to 6.0.3. - [Release notes](https://github.com/karma-runner/karma/releases) - [Changelog](https://github.com/karma-runner/karma/blob/master/CHANGELOG.md) - [Commits](https://github.com/karma-runner/karma/compare/v6.0.1...v6.0.3) 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 e0a70065fd..74f4ca75f4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8470,9 +8470,9 @@ "dev": true }, "karma": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/karma/-/karma-6.0.1.tgz", - "integrity": "sha512-LHE8Ywfeji6Sk3jt072j7gUAYZrpw7tCzvQWpgJqwCC9inW4eA3g1yl6srTtC0xiOvZDqXIzx8tgBPm0qhfYkg==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/karma/-/karma-6.0.3.tgz", + "integrity": "sha512-dmiLQdsNAvnbV1G6VvUK7Cl5xpwiMisZNT8MjBtOo49jKlnZSWLxQIemuLT8sGSzvx5IGgMfMQEtf/CALiUEVQ==", "dev": true, "requires": { "body-parser": "^1.19.0", From 517593efac23e4bae8ecd1d3f4b0badda9ca212d Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 1 Feb 2021 07:38:09 +0000 Subject: [PATCH 437/525] Bump rollup from 2.38.0 to 2.38.3 Bumps [rollup](https://github.com/rollup/rollup) from 2.38.0 to 2.38.3. - [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.38.0...v2.38.3) Signed-off-by: dependabot-preview[bot] --- package-lock.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index e0a70065fd..001655f953 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11132,18 +11132,18 @@ } }, "rollup": { - "version": "2.38.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.38.0.tgz", - "integrity": "sha512-ay9zDiNitZK/LNE/EM2+v5CZ7drkB2xyDljvb1fQJCGnq43ZWRkhxN145oV8GmoW1YNi4sA/1Jdkr2LfawJoXw==", + "version": "2.38.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.38.3.tgz", + "integrity": "sha512-FVx/XzR2DtCozKNDBjHJCHIgkC12rNg/ruAeoYWjLeeKfSKgwhh+lDLDhuCkuRG/fsup8py8dKBTlHdvUFX32A==", "dev": true, "requires": { - "fsevents": "~2.1.2" + "fsevents": "~2.3.1" }, "dependencies": { "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.1.tgz", + "integrity": "sha512-YR47Eg4hChJGAB1O3yEAOkGO+rlzutoICGqGo9EZ4lKWokzZRSyIW1QmTzqjtw8MJdj9srP869CuWw/hyzSiBw==", "dev": true, "optional": true } From b618d67f1f28219414cb3ed232a8c760dd2ce610 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 1 Feb 2021 07:39:23 +0000 Subject: [PATCH 438/525] Bump eslint from 7.18.0 to 7.19.0 Bumps [eslint](https://github.com/eslint/eslint) from 7.18.0 to 7.19.0. - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/master/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/compare/v7.18.0...v7.19.0) Signed-off-by: dependabot-preview[bot] --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index e0a70065fd..bb99150c40 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4904,9 +4904,9 @@ } }, "eslint": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.18.0.tgz", - "integrity": "sha512-fbgTiE8BfUJZuBeq2Yi7J3RB3WGUQ9PNuNbmgi6jt9Iv8qrkxfy19Ds3OpL1Pm7zg3BtTVhvcUZbIRQ0wmSjAQ==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.19.0.tgz", + "integrity": "sha512-CGlMgJY56JZ9ZSYhJuhow61lMPPjUzWmChFya71Z/jilVos7mR/jPgaEfVGgMBY5DshbKdG8Ezb8FDCHcoMEMg==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", @@ -5070,9 +5070,9 @@ } }, "flatted": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.0.tgz", - "integrity": "sha512-tW+UkmtNg/jv9CSofAKvgVcO7c2URjhTdW1ZTkcAritblu8tajiYy7YisnIflEwtKssCtOxpnBRoCB7iap0/TA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", + "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", "dev": true }, "glob-parent": { From 457081de2fb1f6e432eefced1855d204f105a147 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 1 Feb 2021 07:41:45 +0000 Subject: [PATCH 439/525] Bump marked from 1.2.7 to 1.2.8 Bumps [marked](https://github.com/markedjs/marked) from 1.2.7 to 1.2.8. - [Release notes](https://github.com/markedjs/marked/releases) - [Changelog](https://github.com/markedjs/marked/blob/master/release.config.js) - [Commits](https://github.com/markedjs/marked/compare/v1.2.7...v1.2.8) 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 e0a70065fd..561f0ab630 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9046,9 +9046,9 @@ "dev": true }, "marked": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/marked/-/marked-1.2.7.tgz", - "integrity": "sha512-No11hFYcXr/zkBvL6qFmAp1z6BKY3zqLMHny/JN/ey+al7qwCM2+CMBL9BOgqMxZU36fz4cCWfn2poWIf7QRXA==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/marked/-/marked-1.2.8.tgz", + "integrity": "sha512-lzmFjGnzWHkmbk85q/ILZjFoHHJIQGF+SxGEfIdGk/XhiTPhqGs37gbru6Kkd48diJnEyYwnG67nru0Z2gQtuQ==", "dev": true }, "md5.js": { diff --git a/package.json b/package.json index 35c48bec38..fe32827ef6 100644 --- a/package.json +++ b/package.json @@ -85,7 +85,7 @@ "karma-sourcemap-loader": "^0.3.7", "karma-webpack": "^4.0.0-rc.2", "loglevelnext": "^4.0.1", - "marked": "1.2.7", + "marked": "1.2.8", "mocha": "8.2.1", "pixelmatch": "^5.1.0", "pngjs": "^6.0.0", From f590cb34730f9a7d0ba4957151d7eb3190a177ba Mon Sep 17 00:00:00 2001 From: Simon Seyock Date: Tue, 2 Feb 2021 11:44:44 +0100 Subject: [PATCH 440/525] Harmonize jsdoc --- examples/image-load-events.js | 2 +- examples/tile-load-events.js | 2 +- src/ol/control/ScaleLine.js | 20 +++++++------- src/ol/dom.js | 2 +- src/ol/format/GML2.js | 2 +- src/ol/format/IIIFInfo.js | 10 +++---- src/ol/format/WFS.js | 2 +- src/ol/format/filter.js | 38 +++++++++++++-------------- src/ol/format/filter/Filter.js | 2 +- src/ol/functions.js | 4 +-- src/ol/interaction/Extent.js | 12 ++++----- src/ol/interaction/Select.js | 2 +- src/ol/interaction/Translate.js | 2 +- src/ol/proj.js | 10 +++---- src/ol/render.js | 4 +-- src/ol/render/canvas.js | 2 +- src/ol/render/canvas/ExecutorGroup.js | 2 +- src/ol/string.js | 4 +-- src/ol/style/Image.js | 4 +-- src/ol/style/RegularShape.js | 6 ++--- src/ol/style/expressions.js | 14 +++++----- src/ol/webgl/Buffer.js | 2 +- src/ol/webgl/Helper.js | 4 +-- src/ol/webgl/PostProcessingPass.js | 2 +- src/ol/webgl/RenderTarget.js | 2 +- src/ol/webgl/ShaderBuilder.js | 16 +++++------ 26 files changed, 86 insertions(+), 86 deletions(-) diff --git a/examples/image-load-events.js b/examples/image-load-events.js index 7bc8725591..cdfa74eda2 100644 --- a/examples/image-load-events.js +++ b/examples/image-load-events.js @@ -6,7 +6,7 @@ import View from '../src/ol/View.js'; /** * Renders a progress bar. * @param {HTMLElement} el The target element. - * @constructor + * @class */ function Progress(el) { this.el = el; diff --git a/examples/tile-load-events.js b/examples/tile-load-events.js index 1c00e14feb..b7c29233bb 100644 --- a/examples/tile-load-events.js +++ b/examples/tile-load-events.js @@ -6,7 +6,7 @@ import XYZ from '../src/ol/source/XYZ.js'; /** * Renders a progress bar. * @param {HTMLElement} el The target element. - * @constructor + * @class */ function Progress(el) { this.el = el; diff --git a/src/ol/control/ScaleLine.js b/src/ol/control/ScaleLine.js index a54a1712ec..0975354574 100644 --- a/src/ol/control/ScaleLine.js +++ b/src/ol/control/ScaleLine.js @@ -329,7 +329,7 @@ class ScaleLine extends Control { * @param {number} width The current width of the scalebar. * @param {number} scale The current scale. * @param {string} suffix The suffix to append to the scale text. - * @returns {string} The stringified HTML of the scalebar. + * @return {string} The stringified HTML of the scalebar. */ createScaleBar(width, scale, suffix) { const mapScale = @@ -400,9 +400,9 @@ class ScaleLine extends Control { /** * Creates a marker at given position - * @param {string} position - The position, absolute or relative - * @param {number} i - The iterator - * @returns {string} The stringified div containing the marker + * @param {string} position The position, absolute or relative + * @param {number} i The iterator + * @return {string} The stringified div containing the marker */ createMarker(position, i) { const top = position === 'absolute' ? 3 : -10; @@ -421,12 +421,12 @@ class ScaleLine extends Control { /** * Creates the label for a marker marker at given position - * @param {number} i - The iterator - * @param {number} width - The width the scalebar will currently use - * @param {boolean} isLast - Flag indicating if we add the last step text - * @param {number} scale - The current scale for the whole scalebar - * @param {string} suffix - The suffix for the scale - * @returns {string} The stringified div containing the step text + * @param {number} i The iterator + * @param {number} width The width the scalebar will currently use + * @param {boolean} isLast Flag indicating if we add the last step text + * @param {number} scale The current scale for the whole scalebar + * @param {string} suffix The suffix for the scale + * @return {string} The stringified div containing the step text */ createStepText(i, width, isLast, scale, suffix) { const length = diff --git a/src/ol/dom.js b/src/ol/dom.js index 1c392cce21..bc8516cf99 100644 --- a/src/ol/dom.js +++ b/src/ol/dom.js @@ -72,7 +72,7 @@ export function replaceNode(newNode, oldNode) { /** * @param {Node} node The node to remove. - * @returns {Node} The node that was removed or null. + * @return {Node} The node that was removed or null. */ export function removeNode(node) { return node && node.parentNode ? node.parentNode.removeChild(node) : null; diff --git a/src/ol/format/GML2.js b/src/ol/format/GML2.js index 0d2cb67be8..654a08126b 100644 --- a/src/ol/format/GML2.js +++ b/src/ol/format/GML2.js @@ -356,7 +356,7 @@ class GML2 extends GMLBase { /** * @param {string} namespaceURI XML namespace. - * @returns {Element} coordinates node. + * @return {Element} coordinates node. * @private */ createCoordinatesNode_(namespaceURI) { diff --git a/src/ol/format/IIIFInfo.js b/src/ol/format/IIIFInfo.js index db38db397a..a7a930dcc7 100644 --- a/src/ol/format/IIIFInfo.js +++ b/src/ol/format/IIIFInfo.js @@ -327,7 +327,7 @@ class IIIFInfo { } /** - * @returns {Versions} Major IIIF version. + * @return {Versions} Major IIIF version. * @api */ getImageApiVersion() { @@ -364,7 +364,7 @@ class IIIFInfo { /** * @param {Versions} version Optional IIIF image API version - * @returns {string} Compliance level as it appears in the IIIF image information + * @return {string} Compliance level as it appears in the IIIF image information * response. */ getComplianceLevelEntryFromProfile(version) { @@ -407,7 +407,7 @@ class IIIFInfo { /** * @param {Versions} version Optional IIIF image API version - * @returns {string} Compliance level, on of 'level0', 'level1' or 'level2' or undefined + * @return {string} Compliance level, on of 'level0', 'level1' or 'level2' or undefined */ getComplianceLevelFromProfile(version) { const complianceLevel = this.getComplianceLevelEntryFromProfile(version); @@ -419,7 +419,7 @@ class IIIFInfo { } /** - * @returns {SupportedFeatures} Image formats, qualities and region / size calculation + * @return {SupportedFeatures} Image formats, qualities and region / size calculation * methods that are supported by the IIIF service. */ getComplianceLevelSupportedFeatures() { @@ -436,7 +436,7 @@ class IIIFInfo { /** * @param {PreferredOptions=} opt_preferredOptions Optional options for preferred format and quality. - * @returns {import("../source/IIIF.js").Options} IIIF tile source ready constructor options. + * @return {import("../source/IIIF.js").Options} IIIF tile source ready constructor options. * @api */ getTileSourceOptions(opt_preferredOptions) { diff --git a/src/ol/format/WFS.js b/src/ol/format/WFS.js index 7517a120ac..e089dcedce 100644 --- a/src/ol/format/WFS.js +++ b/src/ol/format/WFS.js @@ -814,7 +814,7 @@ function writeOgcFidFilter(node, fid, objectStack) { /** * @param {string|undefined} featurePrefix The prefix of the feature. * @param {string} featureType The type of the feature. - * @returns {string} The value of the typeName property. + * @return {string} The value of the typeName property. */ function getTypeName(featurePrefix, featureType) { featurePrefix = featurePrefix ? featurePrefix : FEATURE_PREFIX; diff --git a/src/ol/format/filter.js b/src/ol/format/filter.js index 9abdd6e667..d7ba483c5a 100644 --- a/src/ol/format/filter.js +++ b/src/ol/format/filter.js @@ -26,7 +26,7 @@ import Within from './filter/Within.js'; * Create a logical `` operator between two or more filter conditions. * * @param {...import("./filter/Filter.js").default} conditions Filter conditions. - * @returns {!And} `` operator. + * @return {!And} `` operator. * @api */ export function and(conditions) { @@ -38,7 +38,7 @@ export function and(conditions) { * Create a logical `` operator between two or more filter conditions. * * @param {...import("./filter/Filter.js").default} conditions Filter conditions. - * @returns {!Or} `` operator. + * @return {!Or} `` operator. * @api */ export function or(conditions) { @@ -50,7 +50,7 @@ export function or(conditions) { * Represents a logical `` operator for a filter condition. * * @param {!import("./filter/Filter.js").default} condition Filter condition. - * @returns {!Not} `` operator. + * @return {!Not} `` operator. * @api */ export function not(condition) { @@ -65,7 +65,7 @@ export function not(condition) { * @param {!import("../extent.js").Extent} extent Extent. * @param {string=} opt_srsName SRS name. No srsName attribute will be * set on geometries when this is not provided. - * @returns {!Bbox} `` operator. + * @return {!Bbox} `` operator. * @api */ export function bbox(geometryName, extent, opt_srsName) { @@ -80,7 +80,7 @@ export function bbox(geometryName, extent, opt_srsName) { * @param {!import("../geom/Geometry.js").default} geometry Geometry. * @param {string=} opt_srsName SRS name. No srsName attribute will be * set on geometries when this is not provided. - * @returns {!Contains} `` operator. + * @return {!Contains} `` operator. * @api */ export function contains(geometryName, geometry, opt_srsName) { @@ -95,7 +95,7 @@ export function contains(geometryName, geometry, opt_srsName) { * @param {!import("../geom/Geometry.js").default} geometry Geometry. * @param {string=} opt_srsName SRS name. No srsName attribute will be * set on geometries when this is not provided. - * @returns {!Intersects} `` operator. + * @return {!Intersects} `` operator. * @api */ export function intersects(geometryName, geometry, opt_srsName) { @@ -110,7 +110,7 @@ export function intersects(geometryName, geometry, opt_srsName) { * @param {!import("../geom/Geometry.js").default} geometry Geometry. * @param {string=} opt_srsName SRS name. No srsName attribute will be * set on geometries when this is not provided. - * @returns {!Disjoint} `` operator. + * @return {!Disjoint} `` operator. * @api */ export function disjoint(geometryName, geometry, opt_srsName) { @@ -125,7 +125,7 @@ export function disjoint(geometryName, geometry, opt_srsName) { * @param {!import("../geom/Geometry.js").default} geometry Geometry. * @param {string=} opt_srsName SRS name. No srsName attribute will be * set on geometries when this is not provided. - * @returns {!Within} `` operator. + * @return {!Within} `` operator. * @api */ export function within(geometryName, geometry, opt_srsName) { @@ -142,7 +142,7 @@ export function within(geometryName, geometry, opt_srsName) { * @param {!string} unit Unit. * @param {string=} opt_srsName SRS name. No srsName attribute will be * set on geometries when this is not provided. - * @returns {!DWithin} `` operator. + * @return {!DWithin} `` operator. * @api */ export function dwithin(geometryName, geometry, distance, unit, opt_srsName) { @@ -155,7 +155,7 @@ export function dwithin(geometryName, geometry, distance, unit, opt_srsName) { * @param {!string} propertyName Name of the context property to compare. * @param {!(string|number)} expression The value to compare. * @param {boolean=} opt_matchCase Case-sensitive? - * @returns {!EqualTo} `` operator. + * @return {!EqualTo} `` operator. * @api */ export function equalTo(propertyName, expression, opt_matchCase) { @@ -168,7 +168,7 @@ export function equalTo(propertyName, expression, opt_matchCase) { * @param {!string} propertyName Name of the context property to compare. * @param {!(string|number)} expression The value to compare. * @param {boolean=} opt_matchCase Case-sensitive? - * @returns {!NotEqualTo} `` operator. + * @return {!NotEqualTo} `` operator. * @api */ export function notEqualTo(propertyName, expression, opt_matchCase) { @@ -180,7 +180,7 @@ export function notEqualTo(propertyName, expression, opt_matchCase) { * * @param {!string} propertyName Name of the context property to compare. * @param {!number} expression The value to compare. - * @returns {!LessThan} `` operator. + * @return {!LessThan} `` operator. * @api */ export function lessThan(propertyName, expression) { @@ -192,7 +192,7 @@ export function lessThan(propertyName, expression) { * * @param {!string} propertyName Name of the context property to compare. * @param {!number} expression The value to compare. - * @returns {!LessThanOrEqualTo} `` operator. + * @return {!LessThanOrEqualTo} `` operator. * @api */ export function lessThanOrEqualTo(propertyName, expression) { @@ -204,7 +204,7 @@ export function lessThanOrEqualTo(propertyName, expression) { * * @param {!string} propertyName Name of the context property to compare. * @param {!number} expression The value to compare. - * @returns {!GreaterThan} `` operator. + * @return {!GreaterThan} `` operator. * @api */ export function greaterThan(propertyName, expression) { @@ -216,7 +216,7 @@ export function greaterThan(propertyName, expression) { * * @param {!string} propertyName Name of the context property to compare. * @param {!number} expression The value to compare. - * @returns {!GreaterThanOrEqualTo} `` operator. + * @return {!GreaterThanOrEqualTo} `` operator. * @api */ export function greaterThanOrEqualTo(propertyName, expression) { @@ -228,7 +228,7 @@ export function greaterThanOrEqualTo(propertyName, expression) { * is null. * * @param {!string} propertyName Name of the context property to compare. - * @returns {!IsNull} `` operator. + * @return {!IsNull} `` operator. * @api */ export function isNull(propertyName) { @@ -242,7 +242,7 @@ export function isNull(propertyName) { * @param {!string} propertyName Name of the context property to compare. * @param {!number} lowerBoundary The lower bound of the range. * @param {!number} upperBoundary The upper bound of the range. - * @returns {!IsBetween} `` operator. + * @return {!IsBetween} `` operator. * @api */ export function between(propertyName, lowerBoundary, upperBoundary) { @@ -262,7 +262,7 @@ export function between(propertyName, lowerBoundary, upperBoundary) { * @param {string=} opt_escapeChar Escape character which can be used to escape * the pattern characters. Default is '!'. * @param {boolean=} opt_matchCase Case-sensitive? - * @returns {!IsLike} `` operator. + * @return {!IsLike} `` operator. * @api */ export function like( @@ -289,7 +289,7 @@ export function like( * @param {!string} propertyName Name of the context property to compare. * @param {!string} begin The begin date in ISO-8601 format. * @param {!string} end The end date in ISO-8601 format. - * @returns {!During} `` operator. + * @return {!During} `` operator. * @api */ export function during(propertyName, begin, end) { diff --git a/src/ol/format/filter/Filter.js b/src/ol/format/filter/Filter.js index ef493c4c76..d75588ac9c 100644 --- a/src/ol/format/filter/Filter.js +++ b/src/ol/format/filter/Filter.js @@ -23,7 +23,7 @@ class Filter { /** * The XML tag name for a filter. - * @returns {!string} Name. + * @return {!string} Name. */ getTagName() { return this.tagName_; diff --git a/src/ol/functions.js b/src/ol/functions.js index 0e8d8086b2..87fa024d5e 100644 --- a/src/ol/functions.js +++ b/src/ol/functions.js @@ -6,7 +6,7 @@ import {equals as arrayEquals} from './array.js'; /** * Always returns true. - * @returns {boolean} true. + * @return {boolean} true. */ export function TRUE() { return true; @@ -14,7 +14,7 @@ export function TRUE() { /** * Always returns false. - * @returns {boolean} false. + * @return {boolean} false. */ export function FALSE() { return false; diff --git a/src/ol/interaction/Extent.js b/src/ol/interaction/Extent.js index 2a71e07ecd..edda36d2b1 100644 --- a/src/ol/interaction/Extent.js +++ b/src/ol/interaction/Extent.js @@ -188,7 +188,7 @@ class Extent extends PointerInteraction { /** * @param {import("../pixel.js").Pixel} pixel cursor location * @param {import("../PluggableMap.js").default} map map - * @returns {import("../coordinate.js").Coordinate|null} snapped vertex on extent + * @return {import("../coordinate.js").Coordinate|null} snapped vertex on extent * @private */ snapToVertex_(pixel, map) { @@ -245,7 +245,7 @@ class Extent extends PointerInteraction { /** * @param {import("../extent.js").Extent} extent extent - * @returns {Feature} extent as featrue + * @return {Feature} extent as featrue * @private */ createOrUpdateExtentFeature_(extent) { @@ -271,7 +271,7 @@ class Extent extends PointerInteraction { /** * @param {import("../coordinate.js").Coordinate} vertex location of feature - * @returns {Feature} vertex as feature + * @return {Feature} vertex as feature * @private */ createOrUpdatePointerFeature_(vertex) { @@ -471,7 +471,7 @@ function getDefaultPointerStyleFunction() { /** * @param {import("../coordinate.js").Coordinate} fixedPoint corner that will be unchanged in the new extent - * @returns {function (import("../coordinate.js").Coordinate): import("../extent.js").Extent} event handler + * @return {function (import("../coordinate.js").Coordinate): import("../extent.js").Extent} event handler */ function getPointHandler(fixedPoint) { return function (point) { @@ -482,7 +482,7 @@ function getPointHandler(fixedPoint) { /** * @param {import("../coordinate.js").Coordinate} fixedP1 first corner that will be unchanged in the new extent * @param {import("../coordinate.js").Coordinate} fixedP2 second corner that will be unchanged in the new extent - * @returns {function (import("../coordinate.js").Coordinate): import("../extent.js").Extent|null} event handler + * @return {function (import("../coordinate.js").Coordinate): import("../extent.js").Extent|null} event handler */ function getEdgeHandler(fixedP1, fixedP2) { if (fixedP1[0] == fixedP2[0]) { @@ -500,7 +500,7 @@ function getEdgeHandler(fixedP1, fixedP2) { /** * @param {import("../extent.js").Extent} extent extent - * @returns {Array>} extent line segments + * @return {Array>} extent line segments */ function getSegments(extent) { return [ diff --git a/src/ol/interaction/Select.js b/src/ol/interaction/Select.js index 425ba7e379..7430b7de85 100644 --- a/src/ol/interaction/Select.js +++ b/src/ol/interaction/Select.js @@ -277,7 +277,7 @@ class Select extends Interaction { /** * Returns the Hit-detection tolerance. - * @returns {number} Hit tolerance in pixels. + * @return {number} Hit tolerance in pixels. * @api */ getHitTolerance() { diff --git a/src/ol/interaction/Translate.js b/src/ol/interaction/Translate.js index b205a0fd96..9d8f54d2e1 100644 --- a/src/ol/interaction/Translate.js +++ b/src/ol/interaction/Translate.js @@ -320,7 +320,7 @@ class Translate extends PointerInteraction { /** * Returns the Hit-detection tolerance. - * @returns {number} Hit tolerance in pixels. + * @return {number} Hit tolerance in pixels. * @api */ getHitTolerance() { diff --git a/src/ol/proj.js b/src/ol/proj.js index c508ef754e..4f10fc02f8 100644 --- a/src/ol/proj.js +++ b/src/ol/proj.js @@ -560,7 +560,7 @@ export function clearUserProjection() { * Get the projection for coordinates supplied from and returned by API methods. * Note that this method is not yet a part of the stable API. Support for user * projections is not yet complete and should be considered experimental. - * @returns {?Projection} The user projection (or null if not set). + * @return {?Projection} The user projection (or null if not set). */ export function getUserProjection() { return userProjection; @@ -580,7 +580,7 @@ export function useGeographic() { * is set, the original coordinate is returned. * @param {Array} coordinate Input coordinate. * @param {ProjectionLike} sourceProjection The input coordinate projection. - * @returns {Array} The input coordinate in the user projection. + * @return {Array} The input coordinate in the user projection. */ export function toUserCoordinate(coordinate, sourceProjection) { if (!userProjection) { @@ -594,7 +594,7 @@ export function toUserCoordinate(coordinate, sourceProjection) { * is set, the original coordinate is returned. * @param {Array} coordinate Input coordinate. * @param {ProjectionLike} destProjection The destination projection. - * @returns {Array} The input coordinate transformed. + * @return {Array} The input coordinate transformed. */ export function fromUserCoordinate(coordinate, destProjection) { if (!userProjection) { @@ -608,7 +608,7 @@ export function fromUserCoordinate(coordinate, destProjection) { * is set, the original extent is returned. * @param {import("./extent.js").Extent} extent Input extent. * @param {ProjectionLike} sourceProjection The input extent projection. - * @returns {import("./extent.js").Extent} The input extent in the user projection. + * @return {import("./extent.js").Extent} The input extent in the user projection. */ export function toUserExtent(extent, sourceProjection) { if (!userProjection) { @@ -622,7 +622,7 @@ export function toUserExtent(extent, sourceProjection) { * is set, the original extent is returned. * @param {import("./extent.js").Extent} extent Input extent. * @param {ProjectionLike} destProjection The destination projection. - * @returns {import("./extent.js").Extent} The input extent transformed. + * @return {import("./extent.js").Extent} The input extent transformed. */ export function fromUserExtent(extent, destProjection) { if (!userProjection) { diff --git a/src/ol/render.js b/src/ol/render.js index 22ecd658ae..60d8d6689d 100644 --- a/src/ol/render.js +++ b/src/ol/render.js @@ -84,7 +84,7 @@ export function toContext(context, opt_options) { /** * Gets a vector context for drawing to the event's canvas. * @param {import("./render/Event.js").default} event Render event. - * @returns {CanvasImmediateRenderer} Vector context. + * @return {CanvasImmediateRenderer} Vector context. * @api */ export function getVectorContext(event) { @@ -121,7 +121,7 @@ export function getVectorContext(event) { * @param {import("./render/Event.js").default} event Render event. * @param {import("./pixel.js").Pixel} pixel CSS pixel relative to the top-left * corner of the map viewport. - * @returns {import("./pixel.js").Pixel} Pixel on the event's canvas context. + * @return {import("./pixel.js").Pixel} Pixel on the event's canvas context. * @api */ export function getRenderPixel(event, pixel) { diff --git a/src/ol/render/canvas.js b/src/ol/render/canvas.js index 783b8aa05f..b5ff8eb574 100644 --- a/src/ol/render/canvas.js +++ b/src/ol/render/canvas.js @@ -352,7 +352,7 @@ export function measureTextWidth(font, text) { * @param {string} font The font. * @param {string} text The text to measure. * @param {Object} cache A lookup of cached widths by text. - * @returns {number} The text width. + * @return {number} The text width. */ export function measureAndCacheTextWidth(font, text, cache) { if (text in cache) { diff --git a/src/ol/render/canvas/ExecutorGroup.js b/src/ol/render/canvas/ExecutorGroup.js index 540dc828d4..f957766a82 100644 --- a/src/ol/render/canvas/ExecutorGroup.js +++ b/src/ol/render/canvas/ExecutorGroup.js @@ -379,7 +379,7 @@ const circlePixelIndexArrayCache = {}; * ordered by how close they are to the center. * A cache is used to increase performance. * @param {number} radius Radius. - * @returns {Array} An array with indexes within a circle. + * @return {Array} An array with indexes within a circle. */ export function getPixelIndexArray(radius) { if (circlePixelIndexArrayCache[radius] !== undefined) { diff --git a/src/ol/string.js b/src/ol/string.js index d966e794e5..8c8289e82b 100644 --- a/src/ol/string.js +++ b/src/ol/string.js @@ -6,7 +6,7 @@ * @param {number} number Number to be formatted * @param {number} width The desired width * @param {number=} opt_precision Precision of the output string (i.e. number of decimal places) - * @returns {string} Formatted string + * @return {string} Formatted string */ export function padNumber(number, width, opt_precision) { const numberString = @@ -22,7 +22,7 @@ export function padNumber(number, width, opt_precision) { * Adapted from https://github.com/omichelsen/compare-versions/blob/master/index.js * @param {string|number} v1 First version * @param {string|number} v2 Second version - * @returns {number} Value + * @return {number} Value */ export function compareVersions(v1, v2) { const s1 = ('' + v1).split('.'); diff --git a/src/ol/style/Image.js b/src/ol/style/Image.js index 6874bd65a0..604c3c58fb 100644 --- a/src/ol/style/Image.js +++ b/src/ol/style/Image.js @@ -160,10 +160,10 @@ class ImageStyle { return abstract(); } - /* + /** * Get the image pixel ratio. * @param {number} pixelRatio Pixel ratio. - * */ + */ getPixelRatio(pixelRatio) { return 1; } diff --git a/src/ol/style/RegularShape.js b/src/ol/style/RegularShape.js index dfc480bc32..ebe7aaf29a 100644 --- a/src/ol/style/RegularShape.js +++ b/src/ol/style/RegularShape.js @@ -240,10 +240,10 @@ class RegularShape extends ImageStyle { return this.canvas_[pixelRatio || 1]; } - /* + /** * Get the image pixel ratio. * @param {number} pixelRatio Pixel ratio. - * */ + */ getPixelRatio(pixelRatio) { return pixelRatio; } @@ -339,7 +339,7 @@ class RegularShape extends ImageStyle { unlistenImageChange(listener) {} /** - * @returns {RenderOptions} The render options + * @return {RenderOptions} The render options * @protected */ createRenderOptions() { diff --git a/src/ol/style/expressions.js b/src/ol/style/expressions.js index a35e9f05e9..a51e97ed9a 100644 --- a/src/ol/style/expressions.js +++ b/src/ol/style/expressions.js @@ -110,7 +110,7 @@ export const Operators = {}; * Returns the possible types for a given value (each type being a binary flag) * To test a value use e.g. `getValueType(v) & ValueTypes.BOOLEAN` * @param {ExpressionValue} value Value - * @returns {ValueTypes|number} Type or types inferred from the value + * @return {ValueTypes|number} Type or types inferred from the value */ export function getValueType(value) { if (typeof value === 'number') { @@ -175,7 +175,7 @@ export function isTypeUnique(valueType) { /** * Will return the number as a float with a dot separator, which is required by GLSL. * @param {number} v Numerical value. - * @returns {string} The value as string. + * @return {string} The value as string. */ export function numberToGlsl(v) { const s = v.toString(); @@ -185,7 +185,7 @@ export function numberToGlsl(v) { /** * Will return the number array as a float with a dot separator, concatenated with ', '. * @param {Array} array Numerical values array. - * @returns {string} The array as a vector, e. g.: `vec3(1.0, 2.0, 3.0)`. + * @return {string} The array as a vector, e. g.: `vec3(1.0, 2.0, 3.0)`. */ export function arrayToGlsl(array) { if (array.length < 2 || array.length > 4) { @@ -201,7 +201,7 @@ export function arrayToGlsl(array) { * @param {string|import("../color.js").Color} color Color either in string format or [r, g, b, a] array format, * with RGB components in the 0..255 range and the alpha component in the 0..1 range. * Note that the final array will always have 4 components. - * @returns {string} The color expressed in the `vec4(1.0, 1.0, 1.0, 1.0)` form. + * @return {string} The color expressed in the `vec4(1.0, 1.0, 1.0, 1.0)` form. */ export function colorToGlsl(color) { const array = asArray(color).slice(); @@ -219,7 +219,7 @@ export function colorToGlsl(color) { * Returns a stable equivalent number for the string literal. * @param {ParsingContext} context Parsing context * @param {string} string String literal value - * @returns {number} Number equivalent + * @return {number} Number equivalent */ export function getStringNumberEquivalent(context, string) { if (context.stringLiteralsMap[string] === undefined) { @@ -235,7 +235,7 @@ export function getStringNumberEquivalent(context, string) { * converted to be a GLSL-compatible string. * @param {ParsingContext} context Parsing context * @param {string} string String literal value - * @returns {string} GLSL-compatible string containing a number + * @return {string} GLSL-compatible string containing a number */ export function stringToGlsl(context, string) { return numberToGlsl(getStringNumberEquivalent(context, string)); @@ -247,7 +247,7 @@ export function stringToGlsl(context, string) { * @param {ParsingContext} context Parsing context * @param {ExpressionValue} value Value * @param {ValueTypes|number} [typeHint] Hint for the expected final type (can be several types combined) - * @returns {string} GLSL-compatible output + * @return {string} GLSL-compatible output */ export function expressionToGlsl(context, value, typeHint) { // operator diff --git a/src/ol/webgl/Buffer.js b/src/ol/webgl/Buffer.js index de1961a851..7a09f74a6a 100644 --- a/src/ol/webgl/Buffer.js +++ b/src/ol/webgl/Buffer.js @@ -119,7 +119,7 @@ class WebGLArrayBuffer { /** * Returns a typed array constructor based on the given buffer type * @param {number} type Buffer type, either ARRAY_BUFFER or ELEMENT_ARRAY_BUFFER. - * @returns {Float32ArrayConstructor|Uint32ArrayConstructor} The typed array class to use for this buffer. + * @return {Float32ArrayConstructor|Uint32ArrayConstructor} The typed array class to use for this buffer. */ export function getArrayClassForType(type) { switch (type) { diff --git a/src/ol/webgl/Helper.js b/src/ol/webgl/Helper.js index 76c9d80929..fdf441e1b8 100644 --- a/src/ol/webgl/Helper.js +++ b/src/ol/webgl/Helper.js @@ -963,7 +963,7 @@ class WebGLHelper extends Disposable { /** * Compute a stride in bytes based on a list of attributes * @param {Array} attributes Ordered list of attributes - * @returns {number} Stride, ie amount of values for each vertex in the vertex buffer + * @return {number} Stride, ie amount of values for each vertex in the vertex buffer * @api */ export function computeAttributesStride(attributes) { @@ -978,7 +978,7 @@ export function computeAttributesStride(attributes) { /** * Computes the size in byte of an attribute type. * @param {AttributeType} type Attribute type - * @returns {number} The size in bytes + * @return {number} The size in bytes */ function getByteSizeFromType(type) { switch (type) { diff --git a/src/ol/webgl/PostProcessingPass.js b/src/ol/webgl/PostProcessingPass.js index a8d8ade443..a334823bc3 100644 --- a/src/ol/webgl/PostProcessingPass.js +++ b/src/ol/webgl/PostProcessingPass.js @@ -285,7 +285,7 @@ class WebGLPostProcessingPass { } /** - * @returns {WebGLFramebuffer} Frame buffer + * @return {WebGLFramebuffer} Frame buffer * @api */ getFrameBuffer() { diff --git a/src/ol/webgl/RenderTarget.js b/src/ol/webgl/RenderTarget.js index 4b683341ba..d4d8292238 100644 --- a/src/ol/webgl/RenderTarget.js +++ b/src/ol/webgl/RenderTarget.js @@ -125,7 +125,7 @@ class WebGLRenderTarget { * If x and/or y are outside of existing data, an array filled with 0 is returned. * @param {number} x Pixel coordinate * @param {number} y Pixel coordinate - * @returns {Uint8Array} Integer array with one color value (4 components) + * @return {Uint8Array} Integer array with one color value (4 components) * @api */ readPixel(x, y) { diff --git a/src/ol/webgl/ShaderBuilder.js b/src/ol/webgl/ShaderBuilder.js index 5fe51ec42f..ab9a3957f9 100644 --- a/src/ol/webgl/ShaderBuilder.js +++ b/src/ol/webgl/ShaderBuilder.js @@ -223,35 +223,35 @@ export class ShaderBuilder { } /** - * @returns {string} Previously set size expression + * @return {string} Previously set size expression */ getSizeExpression() { return this.sizeExpression; } /** - * @returns {string} Previously set symbol offset expression + * @return {string} Previously set symbol offset expression */ getOffsetExpression() { return this.offsetExpression; } /** - * @returns {string} Previously set color expression + * @return {string} Previously set color expression */ getColorExpression() { return this.colorExpression; } /** - * @returns {string} Previously set texture coordinate expression + * @return {string} Previously set texture coordinate expression */ getTextureCoordinateExpression() { return this.texCoordExpression; } /** - * @returns {string} Previously set fragment discard expression + * @return {string} Previously set fragment discard expression */ getFragmentDiscardExpression() { return this.discardExpression; @@ -272,7 +272,7 @@ export class ShaderBuilder { * * @param {boolean} [forHitDetection] If true, the shader will be modified to include hit detection variables * (namely, hit color with encoded feature id). - * @returns {string} The full shader as a string. + * @return {string} The full shader as a string. */ getSymbolVertexShader(forHitDetection) { const offsetMatrix = this.rotateWithView @@ -363,7 +363,7 @@ ${varyings * * @param {boolean} [forHitDetection] If true, the shader will be modified to include hit detection variables * (namely, hit color with encoded feature id). - * @returns {string} The full shader as a string. + * @return {string} The full shader as a string. */ getSymbolFragmentShader(forHitDetection) { const hitDetectionBypass = forHitDetection @@ -421,7 +421,7 @@ ${hitDetectionBypass} * {@link module:ol/renderer/webgl/PointsLayer~WebGLPointsLayerRenderer}. * * @param {import("../style/LiteralStyle").LiteralStyle} style Literal style. - * @returns {StyleParseResult} Result containing shader params, attributes and uniforms. + * @return {StyleParseResult} Result containing shader params, attributes and uniforms. */ export function parseLiteralStyle(style) { const symbStyle = style.symbol; From 808868ad1f7146dc1caa943f920e85ab02168062 Mon Sep 17 00:00:00 2001 From: Simon Seyock Date: Tue, 2 Feb 2021 12:08:33 +0100 Subject: [PATCH 441/525] Fixed some jsdoc issues. --- config/jsdoc/api/plugins/inline-options.js | 2 +- config/jsdoc/api/template/publish.js | 4 ++-- src/ol/layer/Group.js | 4 ---- src/ol/style/Image.js | 1 + src/ol/style/RegularShape.js | 1 + tasks/generate-index.js | 2 -- 6 files changed, 5 insertions(+), 9 deletions(-) diff --git a/config/jsdoc/api/plugins/inline-options.js b/config/jsdoc/api/plugins/inline-options.js index b3ea474cae..72511a7d18 100644 --- a/config/jsdoc/api/plugins/inline-options.js +++ b/config/jsdoc/api/plugins/inline-options.js @@ -1,5 +1,5 @@ /** - * @filedesc + * @fileoverview * Inlines option params from typedefs */ diff --git a/config/jsdoc/api/template/publish.js b/config/jsdoc/api/template/publish.js index ec79c81a88..936d7463bd 100644 --- a/config/jsdoc/api/template/publish.js +++ b/config/jsdoc/api/template/publish.js @@ -190,9 +190,9 @@ function generateSourceFiles(sourceFiles) { * for display purposes. This function mutates the original arrays. * * @private - * @param {Array} doclets - The array of classes and functions to + * @param {Array} doclets The array of classes and functions to * check. - * @param {Array} modules - The array of module doclets to search. + * @param {Array} modules The array of module doclets to search. */ function attachModuleSymbols(doclets, modules) { const symbols = {}; diff --git a/src/ol/layer/Group.js b/src/ol/layer/Group.js index f877ddc284..8738391f87 100644 --- a/src/ol/layer/Group.js +++ b/src/ol/layer/Group.js @@ -32,10 +32,6 @@ import {listen, unlistenByKey} from '../events.js'; * visible. * @property {number} [maxZoom] The maximum view zoom level (inclusive) at which this layer will * be visible. - * @property {number} [minZoom] The minimum view zoom level (exclusive) above which this layer will be - * visible. - * @property {number} [maxZoom] The maximum view zoom level (inclusive) at which this layer will - * be visible. * @property {Array|import("../Collection.js").default} [layers] Child layers. */ diff --git a/src/ol/style/Image.js b/src/ol/style/Image.js index 604c3c58fb..32e8810574 100644 --- a/src/ol/style/Image.js +++ b/src/ol/style/Image.js @@ -163,6 +163,7 @@ class ImageStyle { /** * Get the image pixel ratio. * @param {number} pixelRatio Pixel ratio. + * @return {number} Pixel ratio. */ getPixelRatio(pixelRatio) { return 1; diff --git a/src/ol/style/RegularShape.js b/src/ol/style/RegularShape.js index ebe7aaf29a..6522fdb0d3 100644 --- a/src/ol/style/RegularShape.js +++ b/src/ol/style/RegularShape.js @@ -243,6 +243,7 @@ class RegularShape extends ImageStyle { /** * Get the image pixel ratio. * @param {number} pixelRatio Pixel ratio. + * @return {number} Pixel ratio. */ getPixelRatio(pixelRatio) { return pixelRatio; diff --git a/tasks/generate-index.js b/tasks/generate-index.js index 2b8ab72fe1..37537fcf20 100644 --- a/tasks/generate-index.js +++ b/tasks/generate-index.js @@ -64,8 +64,6 @@ function formatSymbolExport(symbol, namespaces, imports) { /** * Generate export code given a list symbol names. * @param {Array} symbols List of symbols. - * @param {Object} namespaces Already defined namespaces. - * @param {Array} imports List of all imports. * @return {string} Export code. */ function generateExports(symbols) { From c546751989d95cc32cac206fa45cc8ad13476897 Mon Sep 17 00:00:00 2001 From: mike-000 <49240900+mike-000@users.noreply.github.com> Date: Tue, 2 Feb 2021 12:50:12 +0000 Subject: [PATCH 442/525] Remove obsolete ol-mapbox-style polyfills --- examples/vector-tiles-4326.html | 2 -- 1 file changed, 2 deletions(-) diff --git a/examples/vector-tiles-4326.html b/examples/vector-tiles-4326.html index 8599afee6b..fb93133566 100644 --- a/examples/vector-tiles-4326.html +++ b/examples/vector-tiles-4326.html @@ -6,8 +6,6 @@ docs: > Example showing vector tiles in EPSG:4326 (styled using `ol-mapbox-style`) loaded from maptiler.com. **Note**: Make sure to get your own API key at https://www.maptiler.com/cloud/ when using this example. No map will be visible when the API key has expired. tags: "vector tiles, epsg4326, mapbox style, ol-mapbox-style, maptiler" -resources: - - https://cdn.polyfill.io/v2/polyfill.min.js?features=String.prototype.startsWith,Object.assign" cloak: - key: get_your_own_D6rA4zTHduk6KOKTXzGB value: Get your own API key at https://www.maptiler.com/cloud/ From 63612bd2f28c45ff268584746ab614ebd1dabfb1 Mon Sep 17 00:00:00 2001 From: mike-000 <49240900+mike-000@users.noreply.github.com> Date: Tue, 2 Feb 2021 12:55:36 +0000 Subject: [PATCH 443/525] Add Number.isInteger polyfill to displayed html --- examples/templates/example.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/templates/example.html b/examples/templates/example.html index 4562431e01..b6f7598625 100644 --- a/examples/templates/example.html +++ b/examples/templates/example.html @@ -192,9 +192,9 @@ <meta charset="UTF-8"> <title>{{ title }}</title> <!-- Pointer events polyfill for old browsers, see https://caniuse.com/#feat=pointer --> - <script src="https://unpkg.com/elm-pep"></script>{{#if extraHead.remote}} + <script src="https://unpkg.com/elm-pep"></script> <!-- The line below is only needed for old environments like Internet Explorer and Android 4.x --> - <script src="https://cdn.polyfill.io/v3/polyfill.min.js?features=fetch,requestAnimationFrame,Element.prototype.classList,URL,TextDecoder"></script> + <script src="https://cdn.polyfill.io/v3/polyfill.min.js?features=fetch,requestAnimationFrame,Element.prototype.classList,URL,TextDecoder,Number.isInteger"></script>{{#if extraHead.remote}} {{ indent extraHead.remote spaces=4 }}{{/if}} <style> .map { From c324baf07426dbf20f30ec9319a7e4b2f9c4f4cb Mon Sep 17 00:00:00 2001 From: mike-000 <49240900+mike-000@users.noreply.github.com> Date: Tue, 2 Feb 2021 13:01:18 +0000 Subject: [PATCH 444/525] Add Number.isInteger to polyfills --- doc/tutorials/background.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/tutorials/background.md b/doc/tutorials/background.md index 61896c758a..cf0d96a4bf 100644 --- a/doc/tutorials/background.md +++ b/doc/tutorials/background.md @@ -19,7 +19,7 @@ OpenLayers is available as [`ol` npm package](https://npmjs.com/package/ol), whi By default, OpenLayers uses a performance optimized Canvas renderer. -OpenLayers runs on all modern browsers that support [HTML5](https://html.spec.whatwg.org/multipage/) and [ECMAScript 5](http://www.ecma-international.org/ecma-262/5.1/). This includes Chrome, Firefox, Safari and Edge. For older browsers and platforms like Internet Explorer (down to version 9) and Android 4.x, [polyfills](http://polyfill.io), the application bundle needs to be transpiled (e.g. using [Babel](https://babeljs.io)) and bundled with polyfills for `fetch`, `requestAnimationFrame`, `Element.prototype.classList`, `URL` and `TextDecoder`. +OpenLayers runs on all modern browsers that support [HTML5](https://html.spec.whatwg.org/multipage/) and [ECMAScript 5](http://www.ecma-international.org/ecma-262/5.1/). This includes Chrome, Firefox, Safari and Edge. For older browsers and platforms like Internet Explorer (down to version 9) and Android 4.x, [polyfills](http://polyfill.io), the application bundle needs to be transpiled (e.g. using [Babel](https://babeljs.io)) and bundled with polyfills for `fetch`, `requestAnimationFrame`, `Element.prototype.classList`, `URL`, `TextDecoder` and `Number.isInteger`. The library is intended for use on both desktop/laptop and mobile devices, and supports pointer and touch interactions. From 7a155a00e71e01ed9dcb73d7b9253402a4e5e11c Mon Sep 17 00:00:00 2001 From: Simon Seyock Date: Tue, 2 Feb 2021 18:03:12 +0100 Subject: [PATCH 445/525] Replace nested types by typedefs --- src/ol/reproj.js | 13 ++++++++----- test/test-extensions.js | 9 +++++++-- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/ol/reproj.js b/src/ol/reproj.js index bedaa3d148..5bdefac6bc 100644 --- a/src/ol/reproj.js +++ b/src/ol/reproj.js @@ -178,6 +178,12 @@ export function calculateSourceExtentResolution( return sourceResolution; } +/** + * @typedef {Object} ImageExtent + * @property {import("./extent.js").Extent} extent + * @property {HTMLCanvasElement|HTMLImageElement|HTMLVideoElement} image + */ + /** * Renders the source data into new canvas based on the triangulation. * @@ -188,11 +194,8 @@ export function calculateSourceExtentResolution( * @param {import("./extent.js").Extent} sourceExtent Extent of the data source. * @param {number} targetResolution Target resolution. * @param {import("./extent.js").Extent} targetExtent Target extent. - * @param {import("./reproj/Triangulation.js").default} triangulation - * Calculated triangulation. - * @param {Array<{extent: import("./extent.js").Extent, - * image: (HTMLCanvasElement|HTMLImageElement|HTMLVideoElement)}>} sources - * Array of sources. + * @param {import("./reproj/Triangulation.js").default} triangulation Calculated triangulation. + * @param {Array} sources Array of sources. * @param {number} gutter Gutter of the sources. * @param {boolean=} opt_renderEdges Render reprojection edges. * @param {object=} opt_contextOptions Properties to set on the canvas context. diff --git a/test/test-extensions.js b/test/test-extensions.js index 764baa8744..e521b011f6 100644 --- a/test/test-extensions.js +++ b/test/test-extensions.js @@ -331,11 +331,16 @@ } } + /** + * @typedef {Object} xmleqlOptions + * @property {boolean} [includeWhiteSpace] + * @property {boolean} [ignoreElementOrder] + */ + /** * Checks if the XML document sort of equals another XML document. * @param {Object} obj The other object. - * @param {{includeWhiteSpace: (boolean|undefined), - * ignoreElementOrder: (boolean|undefined)}=} options The options. + * @param {xmleqlOptions} [options] The options. * @return {expect.Assertion} The assertion. */ expect.Assertion.prototype.xmleql = function (obj, options) { From 19bb3f8c88cb024c314128f03dd09241d2b51e42 Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Tue, 2 Feb 2021 13:53:10 -0700 Subject: [PATCH 446/525] Consistent use of Array and Object types --- src/ol/control/ZoomSlider.js | 2 +- src/ol/interaction/Select.js | 4 ++-- src/ol/renderer/webgl/Layer.js | 4 ++-- src/ol/renderer/webgl/PointsLayer.js | 2 +- src/ol/source/Raster.js | 2 +- src/ol/webgl/Helper.js | 8 ++++---- src/ol/webgl/PostProcessingPass.js | 2 +- src/ol/webgl/ShaderBuilder.js | 4 ++-- 8 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/ol/control/ZoomSlider.js b/src/ol/control/ZoomSlider.js index 6e24cc0c2f..0f5f886af5 100644 --- a/src/ol/control/ZoomSlider.js +++ b/src/ol/control/ZoomSlider.js @@ -52,7 +52,7 @@ class ZoomSlider extends Control { }); /** - * @type {!Array.} + * @type {!Array} * @private */ this.dragListenerKeys_ = []; diff --git a/src/ol/interaction/Select.js b/src/ol/interaction/Select.js index 7430b7de85..3769125606 100644 --- a/src/ol/interaction/Select.js +++ b/src/ol/interaction/Select.js @@ -130,7 +130,7 @@ export class SelectEvent extends Event { /** * Original feature styles to reset to when features are no longer selected. - * @type {Object.|import("../style/Style.js").StyleFunction>} + * @type {Object|import("../style/Style.js").StyleFunction>} */ const originalFeatureStyles = {}; @@ -216,7 +216,7 @@ class Select extends Interaction { /** * @private - * @type {import("../style/Style.js").default|Array.|import("../style/Style.js").StyleFunction|null} + * @type {import("../style/Style.js").default|Array|import("../style/Style.js").StyleFunction|null} */ this.style_ = options.style !== undefined ? options.style : getDefaultStyleFunction(); diff --git a/src/ol/renderer/webgl/Layer.js b/src/ol/renderer/webgl/Layer.js index 24398625c2..8c178a6da9 100644 --- a/src/ol/renderer/webgl/Layer.js +++ b/src/ol/renderer/webgl/Layer.js @@ -32,13 +32,13 @@ export const WebGLWorkerMessageType = { * the main canvas that will then be sampled up (useful for saving resource on blur steps). * @property {string} [vertexShader] Vertex shader source * @property {string} [fragmentShader] Fragment shader source - * @property {Object.} [uniforms] Uniform definitions for the post process step + * @property {Object} [uniforms] Uniform definitions for the post process step */ /** * @typedef {Object} Options * @property {string} [className='ol-layer'] A CSS class name to set to the canvas element. - * @property {Object.} [uniforms] Uniform definitions for the post process steps + * @property {Object} [uniforms] Uniform definitions for the post process steps * @property {Array} [postProcesses] Post-processes definitions */ diff --git a/src/ol/renderer/webgl/PointsLayer.js b/src/ol/renderer/webgl/PointsLayer.js index 8a01e04d19..a97c36cf0c 100644 --- a/src/ol/renderer/webgl/PointsLayer.js +++ b/src/ol/renderer/webgl/PointsLayer.js @@ -54,7 +54,7 @@ import {listen, unlistenByKey} from '../../events.js'; * @property {string} fragmentShader Fragment shader source, mandatory. * @property {string} [hitVertexShader] Vertex shader source for hit detection rendering. * @property {string} [hitFragmentShader] Fragment shader source for hit detection rendering. - * @property {Object.} [uniforms] Uniform definitions for the post process steps + * @property {Object} [uniforms] Uniform definitions for the post process steps * Please note that `u_texture` is reserved for the main texture slot. * @property {Array} [postProcesses] Post-processes definitions */ diff --git a/src/ol/source/Raster.js b/src/ol/source/Raster.js index 8f6ea35d7f..0d0ee5bb26 100644 --- a/src/ol/source/Raster.js +++ b/src/ol/source/Raster.js @@ -223,7 +223,7 @@ export class Processor extends Disposable { /** * Run operation on input data. - * @param {Array.} inputs Array of pixels or image data + * @param {Array} inputs Array of pixels or image data * (depending on the operation type). * @param {Object} meta A user data object. This is passed to all operations * and must be serializable. diff --git a/src/ol/webgl/Helper.js b/src/ol/webgl/Helper.js index fdf441e1b8..ec1aafa9c5 100644 --- a/src/ol/webgl/Helper.js +++ b/src/ol/webgl/Helper.js @@ -92,12 +92,12 @@ export const AttributeType = { * the main canvas which will then be sampled up (useful for saving resource on blur steps). * @property {string} [vertexShader] Vertex shader source * @property {string} [fragmentShader] Fragment shader source - * @property {Object.} [uniforms] Uniform definitions for the post process step + * @property {Object} [uniforms] Uniform definitions for the post process step */ /** * @typedef {Object} Options - * @property {Object.} [uniforms] Uniform definitions; property names must match the uniform + * @property {Object} [uniforms] Uniform definitions; property names must match the uniform * names in the provided or default shaders. * @property {Array} [postProcesses] Post-processes definitions */ @@ -311,13 +311,13 @@ class WebGLHelper extends Disposable { /** * @private - * @type {Object.} + * @type {Object} */ this.uniformLocations_ = {}; /** * @private - * @type {Object.} + * @type {Object} */ this.attribLocations_ = {}; diff --git a/src/ol/webgl/PostProcessingPass.js b/src/ol/webgl/PostProcessingPass.js index a334823bc3..ca15518c7f 100644 --- a/src/ol/webgl/PostProcessingPass.js +++ b/src/ol/webgl/PostProcessingPass.js @@ -37,7 +37,7 @@ const DEFAULT_FRAGMENT_SHADER = ` * the main canvas that will then be sampled up (useful for saving resource on blur steps). * @property {string} [vertexShader] Vertex shader source * @property {string} [fragmentShader] Fragment shader source - * @property {Object.} [uniforms] Uniform definitions for the post process step + * @property {Object} [uniforms] Uniform definitions for the post process step */ /** diff --git a/src/ol/webgl/ShaderBuilder.js b/src/ol/webgl/ShaderBuilder.js index ab9a3957f9..7f27246416 100644 --- a/src/ol/webgl/ShaderBuilder.js +++ b/src/ol/webgl/ShaderBuilder.js @@ -408,7 +408,7 @@ ${hitDetectionBypass} /** * @typedef {Object} StyleParseResult * @property {ShaderBuilder} builder Shader builder pre-configured according to a given style - * @property {Object.} uniforms Uniform definitions. + * @property {Object} uniforms Uniform definitions. * @property {Array} attributes Attribute descriptions. */ @@ -522,7 +522,7 @@ export function parseLiteralStyle(style) { builder.setFragmentDiscardExpression(`!${parsedFilter}`); } - /** @type {Object.} */ + /** @type {Object} */ const uniforms = {}; // define one uniform per variable From 57e7be0a00e34cd1c0264df7bfa4ef4130c40f16 Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Tue, 2 Feb 2021 13:53:24 -0700 Subject: [PATCH 447/525] Upper case type --- test/test-extensions.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/test-extensions.js b/test/test-extensions.js index e521b011f6..e5751b4ba0 100644 --- a/test/test-extensions.js +++ b/test/test-extensions.js @@ -332,7 +332,7 @@ } /** - * @typedef {Object} xmleqlOptions + * @typedef {Object} XMLEqlOptions * @property {boolean} [includeWhiteSpace] * @property {boolean} [ignoreElementOrder] */ @@ -340,7 +340,7 @@ /** * Checks if the XML document sort of equals another XML document. * @param {Object} obj The other object. - * @param {xmleqlOptions} [options] The options. + * @param {XMLEqlOptions} [options] The options. * @return {expect.Assertion} The assertion. */ expect.Assertion.prototype.xmleql = function (obj, options) { From bf90ce278986378b141682d3749f331cf0d793c0 Mon Sep 17 00:00:00 2001 From: Andreas Hocevar Date: Wed, 3 Feb 2021 08:56:33 +0100 Subject: [PATCH 448/525] Add snapToPointer option --- src/ol/interaction/Modify.js | 14 ++++++++-- test/spec/ol/interaction/modify.test.js | 36 +++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 2 deletions(-) diff --git a/src/ol/interaction/Modify.js b/src/ol/interaction/Modify.js index 58b6178553..4a20d3665f 100644 --- a/src/ol/interaction/Modify.js +++ b/src/ol/interaction/Modify.js @@ -128,6 +128,9 @@ const ModifyEventType = { * provided, a vector source must be provided with the `source` option. * @property {boolean} [wrapX=false] Wrap the world horizontally on the sketch * overlay. + * @property {boolean} [snapToPointer=false] The vertex, point or segment being modified snaps to the + * pointer coordinate when clicked within the `pixelTolerance`. Setting this to `true` is recommended + * when the `Snap` interaction is used and the source geometry is not a snap target. */ /** @@ -386,6 +389,11 @@ class Modify extends PointerInteraction { * @type {Array} */ this.delta_ = [0, 0]; + + /** + * @private + */ + this.snapToPointer_ = options.snapToPointer || false; } /** @@ -1163,8 +1171,10 @@ class Modify extends PointerInteraction { const vertexSegments = {}; vertexSegments[getUid(closestSegment)] = true; - this.delta_[0] = vertex[0] - pixelCoordinate[0]; - this.delta_[1] = vertex[1] - pixelCoordinate[1]; + if (!this.snapToPointer_) { + this.delta_[0] = vertex[0] - pixelCoordinate[0]; + this.delta_[1] = vertex[1] - pixelCoordinate[1]; + } if ( node.geometry.getType() === GeometryType.CIRCLE && node.index === CIRCLE_CIRCUMFERENCE_INDEX diff --git a/test/spec/ol/interaction/modify.test.js b/test/spec/ol/interaction/modify.test.js index f6387f5b57..e25e8b5c67 100644 --- a/test/spec/ol/interaction/modify.test.js +++ b/test/spec/ol/interaction/modify.test.js @@ -208,6 +208,11 @@ describe('ol.interaction.Modify', function () { expect(rbushEntries[0].feature).to.be(feature); expect(modify.hitDetection_).to.be(layer); }); + + it('accepts a snapToPointer option', function () { + const modify = new Modify({source: source, snapToPointer: true}); + expect(modify.snapToPointer_).to.be(true); + }); }); describe('vertex deletion', function () { @@ -1039,6 +1044,37 @@ describe('ol.interaction.Modify', function () { pointFeature.getGeometry() ); }); + + it('snaps to pointer when snapToPointer is true', function () { + const modify = new Modify({ + snapToPointer: true, + source: source, + }); + map.addInteraction(modify); + source.clear(); + const pointFeature = new Feature(new Point([0, 0])); + source.addFeature(pointFeature); + map.renderSync(); + simulateEvent('pointerdown', 2, 2, null, 0); + simulateEvent('pointerdrag', 2, 2, null, 0); + simulateEvent('pointerup', 2, 2, null, 0); + expect(pointFeature.getGeometry().getCoordinates()).to.eql([2, -2]); + }); + + it('does not snap to pointer by default', function () { + const modify = new Modify({ + source: source, + }); + map.addInteraction(modify); + source.clear(); + const pointFeature = new Feature(new Point([0, 0])); + source.addFeature(pointFeature); + map.renderSync(); + simulateEvent('pointerdown', 2, 2, null, 0); + simulateEvent('pointerdrag', 2, 2, null, 0); + simulateEvent('pointerup', 2, 2, null, 0); + expect(pointFeature.getGeometry().getCoordinates()).to.eql([0, 0]); + }); }); describe('#getOverlay', function () { From c15faa19fc7337115e946f8df7fb0eabee479d53 Mon Sep 17 00:00:00 2001 From: Simon Seyock Date: Wed, 3 Feb 2021 13:32:13 +0100 Subject: [PATCH 449/525] enable check-types --- config/jsdoc/info/publish.js | 2 +- src/ol/style/expressions.js | 6 +++--- test/test-extensions.js | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/config/jsdoc/info/publish.js b/config/jsdoc/info/publish.js index 24ab362fa9..188ddf4ad2 100644 --- a/config/jsdoc/info/publish.js +++ b/config/jsdoc/info/publish.js @@ -6,7 +6,7 @@ const path = require('path'); /** * Publish hook for the JSDoc template. Writes to JSON stdout. - * @param {function} data The root of the Taffy DB containing doclet records. + * @param {Function} data The root of the Taffy DB containing doclet records. * @param {Object} opts Options. * @return {Promise} A promise that resolves when writing is complete. */ diff --git a/src/ol/style/expressions.js b/src/ol/style/expressions.js index a51e97ed9a..f1eb483bd7 100644 --- a/src/ol/style/expressions.js +++ b/src/ol/style/expressions.js @@ -274,9 +274,9 @@ export function expressionToGlsl(context, value, typeHint) { (valueType & ValueTypes.COLOR) > 0 && (typeHint === undefined || typeHint == ValueTypes.COLOR) ) { - return colorToGlsl(/** @type {number[]|string} */ (value)); + return colorToGlsl(/** @type {Array | string} */ (value)); } else if ((valueType & ValueTypes.NUMBER_ARRAY) > 0) { - return arrayToGlsl(/** @type {number[]} */ (value)); + return arrayToGlsl(/** @type {Array} */ (value)); } } @@ -652,7 +652,7 @@ Operators['color'] = { assertArgsMinCount(args, 3); assertArgsMaxCount(args, 4); assertNumbers(args); - const array = /** @type {number[]} */ (args); + const array = /** @type {Array} */ (args); if (args.length === 3) { array.push(1); } diff --git a/test/test-extensions.js b/test/test-extensions.js index e5751b4ba0..5120a28f36 100644 --- a/test/test-extensions.js +++ b/test/test-extensions.js @@ -63,8 +63,8 @@ /** * Assert value is within some tolerance of a number. - * @param {Number} n Number. - * @param {Number} tol Tolerance. + * @param {number} n Number. + * @param {number} tol Tolerance. * @return {expect.Assertion} The assertion. */ expect.Assertion.prototype.roughlyEqual = function (n, tol) { @@ -455,7 +455,7 @@ * @param {ol.PluggableMap} map A map using the canvas renderer. * @param {string} referenceImage Path to the reference image. * @param {number} tolerance The accepted mismatch tolerance. - * @param {function} done A callback to indicate that the test is done. + * @param {Function} done A callback to indicate that the test is done. */ global.expectResemble = function (map, referenceImage, tolerance, done) { map.render(); From 8facb252f14fd3616c81e4583f69dc9f00a70d32 Mon Sep 17 00:00:00 2001 From: Simon Seyock Date: Wed, 3 Feb 2021 14:06:02 +0100 Subject: [PATCH 450/525] Replace google closure syntax `=` with brackets around name --- examples/custom-controls.js | 2 +- src/ol/Collection.js | 10 +-- src/ol/Feature.js | 4 +- src/ol/Geolocation.js | 2 +- src/ol/ImageCanvas.js | 4 +- src/ol/ImageTile.js | 2 +- src/ol/MapBrowserEvent.js | 4 +- src/ol/MapBrowserEventHandler.js | 2 +- src/ol/MapEvent.js | 2 +- src/ol/Object.js | 8 +-- src/ol/Overlay.js | 2 +- src/ol/PluggableMap.js | 10 +-- src/ol/Tile.js | 2 +- src/ol/TileRange.js | 2 +- src/ol/VectorTile.js | 2 +- src/ol/View.js | 64 ++++++++++---------- src/ol/array.js | 6 +- src/ol/centerconstraint.js | 6 +- src/ol/control.js | 2 +- src/ol/control/Attribution.js | 2 +- src/ol/control/FullScreen.js | 2 +- src/ol/control/MousePosition.js | 2 +- src/ol/control/OverviewMap.js | 2 +- src/ol/control/Rotate.js | 2 +- src/ol/control/ScaleLine.js | 2 +- src/ol/control/Zoom.js | 2 +- src/ol/control/ZoomSlider.js | 2 +- src/ol/control/ZoomToExtent.js | 2 +- src/ol/coordinate.js | 12 ++-- src/ol/dom.js | 6 +- src/ol/events.js | 6 +- src/ol/events/Target.js | 4 +- src/ol/extent.js | 28 ++++----- src/ol/featureloader.js | 4 +- src/ol/format/EsriJSON.js | 32 +++++----- src/ol/format/Feature.js | 18 +++--- src/ol/format/GML.js | 6 +- src/ol/format/GML2.js | 12 ++-- src/ol/format/GML3.js | 18 +++--- src/ol/format/GML32.js | 2 +- src/ol/format/GMLBase.js | 6 +- src/ol/format/GPX.js | 12 ++-- src/ol/format/GeoJSON.js | 34 +++++------ src/ol/format/IGC.js | 6 +- src/ol/format/IIIFInfo.js | 2 +- src/ol/format/JSONFeature.js | 24 ++++---- src/ol/format/KML.js | 14 ++--- src/ol/format/MVT.js | 6 +- src/ol/format/OSMXML.js | 2 +- src/ol/format/Polyline.js | 22 +++---- src/ol/format/TextFeature.js | 24 ++++---- src/ol/format/TopoJSON.js | 8 +-- src/ol/format/WFS.js | 8 +-- src/ol/format/WKT.js | 16 ++--- src/ol/format/WMSGetFeatureInfo.js | 4 +- src/ol/format/XMLFeature.js | 30 ++++----- src/ol/format/filter.js | 24 ++++---- src/ol/format/filter/Bbox.js | 2 +- src/ol/format/filter/ComparisonBinary.js | 2 +- src/ol/format/filter/Contains.js | 2 +- src/ol/format/filter/DWithin.js | 2 +- src/ol/format/filter/Disjoint.js | 2 +- src/ol/format/filter/EqualTo.js | 2 +- src/ol/format/filter/Intersects.js | 2 +- src/ol/format/filter/IsLike.js | 8 +-- src/ol/format/filter/NotEqualTo.js | 2 +- src/ol/format/filter/Spatial.js | 2 +- src/ol/format/filter/Within.js | 2 +- src/ol/geom/Circle.js | 6 +- src/ol/geom/Geometry.js | 8 +-- src/ol/geom/GeometryCollection.js | 6 +- src/ol/geom/LineString.js | 8 +-- src/ol/geom/LinearRing.js | 4 +- src/ol/geom/MultiLineString.js | 10 +-- src/ol/geom/MultiPoint.js | 4 +- src/ol/geom/MultiPolygon.js | 8 +-- src/ol/geom/Point.js | 4 +- src/ol/geom/Polygon.js | 18 +++--- src/ol/geom/SimpleGeometry.js | 8 +-- src/ol/geom/flat/closest.js | 6 +- src/ol/geom/flat/deflate.js | 4 +- src/ol/geom/flat/flip.js | 4 +- src/ol/geom/flat/inflate.js | 6 +- src/ol/geom/flat/interiorpoint.js | 2 +- src/ol/geom/flat/interpolate.js | 4 +- src/ol/geom/flat/orient.js | 8 +-- src/ol/geom/flat/simplify.js | 2 +- src/ol/geom/flat/transform.js | 8 +-- src/ol/interaction.js | 2 +- src/ol/interaction/DoubleClickZoom.js | 2 +- src/ol/interaction/DragAndDrop.js | 6 +- src/ol/interaction/DragBox.js | 2 +- src/ol/interaction/DragPan.js | 2 +- src/ol/interaction/DragRotate.js | 2 +- src/ol/interaction/DragRotateAndZoom.js | 2 +- src/ol/interaction/DragZoom.js | 2 +- src/ol/interaction/Draw.js | 4 +- src/ol/interaction/Extent.js | 2 +- src/ol/interaction/Interaction.js | 8 +-- src/ol/interaction/KeyboardPan.js | 2 +- src/ol/interaction/KeyboardZoom.js | 2 +- src/ol/interaction/Modify.js | 2 +- src/ol/interaction/MouseWheelZoom.js | 2 +- src/ol/interaction/PinchRotate.js | 2 +- src/ol/interaction/PinchZoom.js | 2 +- src/ol/interaction/Pointer.js | 2 +- src/ol/interaction/Select.js | 2 +- src/ol/interaction/Snap.js | 6 +- src/ol/interaction/Translate.js | 2 +- src/ol/layer/Base.js | 6 +- src/ol/layer/BaseImage.js | 2 +- src/ol/layer/BaseTile.js | 2 +- src/ol/layer/BaseVector.js | 4 +- src/ol/layer/Graticule.js | 2 +- src/ol/layer/Group.js | 6 +- src/ol/layer/Heatmap.js | 2 +- src/ol/layer/Image.js | 2 +- src/ol/layer/Layer.js | 4 +- src/ol/layer/Tile.js | 2 +- src/ol/layer/Vector.js | 2 +- src/ol/layer/VectorImage.js | 2 +- src/ol/layer/VectorTile.js | 4 +- src/ol/net.js | 4 +- src/ol/proj.js | 20 +++--- src/ol/proj/epsg3857.js | 8 +-- src/ol/proj/epsg4326.js | 2 +- src/ol/render.js | 2 +- src/ol/render/Event.js | 6 +- src/ol/render/VectorContext.js | 4 +- src/ol/render/canvas/Executor.js | 12 ++-- src/ol/render/canvas/ExecutorGroup.js | 6 +- src/ol/render/canvas/ImageBuilder.js | 2 +- src/ol/render/canvas/Immediate.js | 4 +- src/ol/render/canvas/TextBuilder.js | 2 +- src/ol/renderer/canvas/TileLayer.js | 2 +- src/ol/renderer/canvas/VectorLayer.js | 6 +- src/ol/renderer/canvas/VectorTileLayer.js | 2 +- src/ol/renderer/vector.js | 20 +++--- src/ol/renderer/webgl/Layer.js | 2 +- src/ol/reproj.js | 4 +- src/ol/reproj/Image.js | 2 +- src/ol/reproj/Tile.js | 6 +- src/ol/resolutionconstraint.js | 26 ++++---- src/ol/rotationconstraint.js | 6 +- src/ol/size.js | 6 +- src/ol/source/Cluster.js | 2 +- src/ol/source/IIIF.js | 2 +- src/ol/source/ImageArcGISRest.js | 2 +- src/ol/source/ImageCanvas.js | 2 +- src/ol/source/ImageWMS.js | 2 +- src/ol/source/OSM.js | 2 +- src/ol/source/Raster.js | 2 +- src/ol/source/Tile.js | 2 +- src/ol/source/TileArcGISRest.js | 2 +- src/ol/source/TileDebug.js | 2 +- src/ol/source/TileWMS.js | 2 +- src/ol/source/UTFGrid.js | 4 +- src/ol/source/UrlTile.js | 2 +- src/ol/source/Vector.js | 12 ++-- src/ol/source/XYZ.js | 2 +- src/ol/source/Zoomify.js | 2 +- src/ol/sphere.js | 8 +-- src/ol/string.js | 2 +- src/ol/structs/LRUCache.js | 4 +- src/ol/structs/LinkedList.js | 2 +- src/ol/structs/RBush.js | 4 +- src/ol/style/Circle.js | 2 +- src/ol/style/Fill.js | 2 +- src/ol/style/Icon.js | 2 +- src/ol/style/Stroke.js | 2 +- src/ol/style/Style.js | 2 +- src/ol/style/Text.js | 2 +- src/ol/tilecoord.js | 2 +- src/ol/tilegrid.js | 20 +++--- src/ol/tilegrid/TileGrid.js | 24 ++++---- src/ol/tilegrid/WMTS.js | 4 +- src/ol/webgl.js | 2 +- src/ol/webgl/Buffer.js | 2 +- src/ol/webgl/Helper.js | 4 +- src/ol/xml.js | 38 ++++++------ test/spec/ol/interaction/draw.test.js | 4 +- test/spec/ol/interaction/extent.test.js | 2 +- test/spec/ol/interaction/select.test.js | 2 +- test/spec/ol/interaction/translate.test.js | 2 +- test/spec/ol/renderer/canvas/builder.test.js | 4 +- 185 files changed, 569 insertions(+), 569 deletions(-) diff --git a/examples/custom-controls.js b/examples/custom-controls.js index 10c578229f..79daa0d4a6 100644 --- a/examples/custom-controls.js +++ b/examples/custom-controls.js @@ -10,7 +10,7 @@ import {Control, defaults as defaultControls} from '../src/ol/control.js'; class RotateNorthControl extends Control { /** - * @param {Object=} opt_options Control options. + * @param {Object} [opt_options] Control options. */ constructor(opt_options) { const options = opt_options || {}; diff --git a/src/ol/Collection.js b/src/ol/Collection.js index ab11627c3b..401e19d256 100644 --- a/src/ol/Collection.js +++ b/src/ol/Collection.js @@ -22,8 +22,8 @@ const Property = { export class CollectionEvent extends Event { /** * @param {import("./CollectionEventType.js").default} type Type. - * @param {*=} opt_element Element. - * @param {number=} opt_index The index of the added or removed element. + * @param {*} [opt_element] Element. + * @param {number} [opt_index] The index of the added or removed element. */ constructor(type, opt_element, opt_index) { super(type); @@ -65,8 +65,8 @@ export class CollectionEvent extends Event { */ class Collection extends BaseObject { /** - * @param {Array=} opt_array Array. - * @param {Options=} opt_options Collection options. + * @param {Array} [opt_array] Array. + * @param {Options} [opt_options] Collection options. */ constructor(opt_array, opt_options) { super(); @@ -277,7 +277,7 @@ class Collection extends BaseObject { /** * @private * @param {T} elem Element. - * @param {number=} opt_except Optional index to ignore. + * @param {number} [opt_except] Optional index to ignore. */ assertUnique_(elem, opt_except) { for (let i = 0, ii = this.array_.length; i < ii; ++i) { diff --git a/src/ol/Feature.js b/src/ol/Feature.js index 9ae3b94303..502c623e20 100644 --- a/src/ol/Feature.js +++ b/src/ol/Feature.js @@ -61,7 +61,7 @@ import {listen, unlistenByKey} from './events.js'; */ class Feature extends BaseObject { /** - * @param {Geometry|Object=} opt_geometryOrProperties + * @param {Geometry|Object} [opt_geometryOrProperties] * You may pass a Geometry object directly, or an object literal containing * properties. If you pass an object literal, you may include a Geometry * associated with a `geometry` key. @@ -240,7 +240,7 @@ class Feature extends BaseObject { * single style object, an array of styles, or a function that takes a * resolution and returns an array of styles. To unset the feature style, call * `setStyle()` without arguments or a falsey value. - * @param {import("./style/Style.js").StyleLike=} opt_style Style for this feature. + * @param {import("./style/Style.js").StyleLike} [opt_style] Style for this feature. * @api * @fires module:ol/events/Event~BaseEvent#event:change */ diff --git a/src/ol/Geolocation.js b/src/ol/Geolocation.js index 7bfbbfe14f..a6a3cdc63d 100644 --- a/src/ol/Geolocation.js +++ b/src/ol/Geolocation.js @@ -86,7 +86,7 @@ class GeolocationError extends BaseEvent { */ class Geolocation extends BaseObject { /** - * @param {Options=} opt_options Options. + * @param {Options} [opt_options] Options. */ constructor(opt_options) { super(); diff --git a/src/ol/ImageCanvas.js b/src/ol/ImageCanvas.js index d6893b9ac2..8e6a541f12 100644 --- a/src/ol/ImageCanvas.js +++ b/src/ol/ImageCanvas.js @@ -19,7 +19,7 @@ class ImageCanvas extends ImageBase { * @param {number} resolution Resolution. * @param {number} pixelRatio Pixel ratio. * @param {HTMLCanvasElement} canvas Canvas. - * @param {Loader=} opt_loader Optional loader function to + * @param {Loader} [opt_loader] Optional loader function to * support asynchronous canvas drawing. */ constructor(extent, resolution, pixelRatio, canvas, opt_loader) { @@ -58,7 +58,7 @@ class ImageCanvas extends ImageBase { /** * Handle async drawing complete. - * @param {Error=} err Any error during drawing. + * @param {Error} [err] Any error during drawing. * @private */ handleLoad_(err) { diff --git a/src/ol/ImageTile.js b/src/ol/ImageTile.js index 9efc2ccb74..f6367490ac 100644 --- a/src/ol/ImageTile.js +++ b/src/ol/ImageTile.js @@ -13,7 +13,7 @@ class ImageTile extends Tile { * @param {string} src Image source URI. * @param {?string} crossOrigin Cross origin. * @param {import("./Tile.js").LoadFunction} tileLoadFunction Tile load function. - * @param {import("./Tile.js").Options=} opt_options Tile options. + * @param {import("./Tile.js").Options} [opt_options] Tile options. */ constructor( tileCoord, diff --git a/src/ol/MapBrowserEvent.js b/src/ol/MapBrowserEvent.js index 3fbbb76593..9265ebc708 100644 --- a/src/ol/MapBrowserEvent.js +++ b/src/ol/MapBrowserEvent.js @@ -14,8 +14,8 @@ class MapBrowserEvent extends MapEvent { * @param {string} type Event type. * @param {import("./PluggableMap.js").default} map Map. * @param {EVENT} originalEvent Original event. - * @param {boolean=} opt_dragging Is the map currently being dragged? - * @param {?import("./PluggableMap.js").FrameState=} opt_frameState Frame state. + * @param {boolean} [opt_dragging] Is the map currently being dragged? + * @param {?import("./PluggableMap.js").FrameState} [opt_frameState] Frame state. */ constructor(type, map, originalEvent, opt_dragging, opt_frameState) { super(type, map, opt_frameState); diff --git a/src/ol/MapBrowserEventHandler.js b/src/ol/MapBrowserEventHandler.js index d345c24999..8a312921cd 100644 --- a/src/ol/MapBrowserEventHandler.js +++ b/src/ol/MapBrowserEventHandler.js @@ -13,7 +13,7 @@ import {listen, unlistenByKey} from './events.js'; class MapBrowserEventHandler extends EventTarget { /** * @param {import("./PluggableMap.js").default} map The map with the viewport to listen to events on. - * @param {number=} moveTolerance The minimal distance the pointer must travel to trigger a move. + * @param {number} [moveTolerance] The minimal distance the pointer must travel to trigger a move. */ constructor(map, moveTolerance) { super(map); diff --git a/src/ol/MapEvent.js b/src/ol/MapEvent.js index 5722b3f681..9c0ec07041 100644 --- a/src/ol/MapEvent.js +++ b/src/ol/MapEvent.js @@ -12,7 +12,7 @@ class MapEvent extends Event { /** * @param {string} type Event type. * @param {import("./PluggableMap.js").default} map Map. - * @param {?import("./PluggableMap.js").FrameState=} opt_frameState Frame state. + * @param {?import("./PluggableMap.js").FrameState} [opt_frameState] Frame state. */ constructor(type, map, opt_frameState) { super(type); diff --git a/src/ol/Object.js b/src/ol/Object.js index d15567aaf8..3343b6521f 100644 --- a/src/ol/Object.js +++ b/src/ol/Object.js @@ -82,7 +82,7 @@ export class ObjectEvent extends Event { */ class BaseObject extends Observable { /** - * @param {Object=} opt_values An object with key-value pairs. + * @param {Object} [opt_values] An object with key-value pairs. */ constructor(opt_values) { super(); @@ -159,7 +159,7 @@ class BaseObject extends Observable { * Sets a value. * @param {string} key Key name. * @param {*} value Value. - * @param {boolean=} opt_silent Update without triggering an event. + * @param {boolean} [opt_silent] Update without triggering an event. * @api */ set(key, value, opt_silent) { @@ -179,7 +179,7 @@ class BaseObject extends Observable { * Sets a collection of key-value pairs. Note that this changes any existing * properties and adds new ones (it does not remove any existing properties). * @param {Object} values Values. - * @param {boolean=} opt_silent Update without triggering an event. + * @param {boolean} [opt_silent] Update without triggering an event. * @api */ setProperties(values, opt_silent) { @@ -203,7 +203,7 @@ class BaseObject extends Observable { /** * Unsets a property. * @param {string} key Key name. - * @param {boolean=} opt_silent Unset without triggering an event. + * @param {boolean} [opt_silent] Unset without triggering an event. * @api */ unset(key, opt_silent) { diff --git a/src/ol/Overlay.js b/src/ol/Overlay.js index 242aaad17f..38db2ea02b 100644 --- a/src/ol/Overlay.js +++ b/src/ol/Overlay.js @@ -409,7 +409,7 @@ class Overlay extends BaseObject { /** * Pan the map so that the overlay is entirely visible in the current viewport * (if necessary). - * @param {PanIntoViewOptions=} opt_panIntoViewOptions Options for the pan action + * @param {PanIntoViewOptions} [opt_panIntoViewOptions] Options for the pan action * @api */ panIntoView(opt_panIntoViewOptions) { diff --git a/src/ol/PluggableMap.js b/src/ol/PluggableMap.js index 204b348099..a7441f9502 100644 --- a/src/ol/PluggableMap.js +++ b/src/ol/PluggableMap.js @@ -545,7 +545,7 @@ class PluggableMap extends BaseObject { * the {@link module:ol/layer/Layer layer} of the feature and will be null for * unmanaged layers. To stop detection, callback functions can return a * truthy value. - * @param {AtPixelOptions=} opt_options Optional options. + * @param {AtPixelOptions} [opt_options] Optional options. * @return {T|undefined} Callback result, i.e. the return value of last * callback execution, or the first truthy callback return value. * @template S,T @@ -577,7 +577,7 @@ class PluggableMap extends BaseObject { /** * Get all features that intersect a pixel on the viewport. * @param {import("./pixel.js").Pixel} pixel Pixel. - * @param {AtPixelOptions=} opt_options Optional options. + * @param {AtPixelOptions} [opt_options] Optional options. * @return {Array} The detected features or * an empty array if none were found. * @api @@ -609,7 +609,7 @@ class PluggableMap extends BaseObject { * [R, G, B, A] pixel values (0 - 255) and will be `null` for layer types * that do not currently support this argument. To stop detection, callback * functions can return a truthy value. - * @param {AtPixelOptions=} opt_options Configuration options. + * @param {AtPixelOptions} [opt_options] Configuration options. * @return {T|undefined} Callback result, i.e. the return value of last * callback execution, or the first truthy callback return value. * @template S,T @@ -636,7 +636,7 @@ class PluggableMap extends BaseObject { * Detect if features intersect a pixel on the viewport. Layers included in the * detection can be configured through `opt_layerFilter`. * @param {import("./pixel.js").Pixel} pixel Pixel. - * @param {AtPixelOptions=} opt_options Optional options. + * @param {AtPixelOptions} [opt_options] Optional options. * @return {boolean} Is there a feature at the given pixel? * @api */ @@ -968,7 +968,7 @@ class PluggableMap extends BaseObject { /** * @param {UIEvent} browserEvent Browser event. - * @param {string=} opt_type Type. + * @param {string} [opt_type] Type. */ handleBrowserEvent(browserEvent, opt_type) { const type = opt_type || browserEvent.type; diff --git a/src/ol/Tile.js b/src/ol/Tile.js index e1fb33d809..cbdfb70703 100644 --- a/src/ol/Tile.js +++ b/src/ol/Tile.js @@ -76,7 +76,7 @@ class Tile extends EventTarget { /** * @param {import("./tilecoord.js").TileCoord} tileCoord Tile coordinate. * @param {import("./TileState.js").default} state State. - * @param {Options=} opt_options Tile options. + * @param {Options} [opt_options] Tile options. */ constructor(tileCoord, state, opt_options) { super(); diff --git a/src/ol/TileRange.js b/src/ol/TileRange.js index 35e5781515..319e8d554e 100644 --- a/src/ol/TileRange.js +++ b/src/ol/TileRange.js @@ -136,7 +136,7 @@ class TileRange { * @param {number} maxX Maximum X. * @param {number} minY Minimum Y. * @param {number} maxY Maximum Y. - * @param {TileRange=} tileRange TileRange. + * @param {TileRange} [tileRange] TileRange. * @return {TileRange} Tile range. */ export function createOrUpdate(minX, maxX, minY, maxY, tileRange) { diff --git a/src/ol/VectorTile.js b/src/ol/VectorTile.js index 8f7b359aa8..5f909344c8 100644 --- a/src/ol/VectorTile.js +++ b/src/ol/VectorTile.js @@ -11,7 +11,7 @@ class VectorTile extends Tile { * @param {string} src Data source url. * @param {import("./format/Feature.js").default} format Feature format. * @param {import("./Tile.js").LoadFunction} tileLoadFunction Tile load function. - * @param {import("./Tile.js").Options=} opt_options Tile options. + * @param {import("./Tile.js").Options} [opt_options] Tile options. */ constructor(tileCoord, state, src, format, tileLoadFunction, opt_options) { super(tileCoord, state, opt_options); diff --git a/src/ol/View.js b/src/ol/View.js index 5474d63603..127a256241 100644 --- a/src/ol/View.js +++ b/src/ol/View.js @@ -290,7 +290,7 @@ const DEFAULT_MIN_ZOOM = 0; */ class View extends BaseObject { /** - * @param {ViewOptions=} opt_options View options. + * @param {ViewOptions} [opt_options] View options. */ constructor(opt_options) { super(); @@ -838,7 +838,7 @@ class View extends BaseObject { /** * Returns the current viewport size. * @private - * @param {number=} opt_rotation Take into account the rotation of the viewport when giving the size + * @param {number} [opt_rotation] Take into account the rotation of the viewport when giving the size * @return {import("./size.js").Size} Viewport size or `[100, 100]` when no viewport is found. */ getViewportSize_(opt_rotation) { @@ -862,7 +862,7 @@ class View extends BaseObject { * to avoid performance hit and layout reflow. * This should be done on map size change. * Note: the constraints are not resolved during an animation to avoid stopping it - * @param {import("./size.js").Size=} opt_size Viewport size; if undefined, [100, 100] is assumed + * @param {import("./size.js").Size} [opt_size] Viewport size; if undefined, [100, 100] is assumed */ setViewportSize(opt_size) { this.viewportSize_ = Array.isArray(opt_size) @@ -912,7 +912,7 @@ class View extends BaseObject { } /** - * @param {Array=} opt_hints Destination array. + * @param {Array} [opt_hints] Destination array. * @return {Array} Hint. */ getHints(opt_hints) { @@ -930,7 +930,7 @@ class View extends BaseObject { * The size is the pixel dimensions of the box into which the calculated extent * should fit. In most cases you want to get the extent of the entire map, * that is `map.getSize()`. - * @param {import("./size.js").Size=} opt_size Box pixel size. If not provided, the size + * @param {import("./size.js").Size} [opt_size] Box pixel size. If not provided, the size * of the map that uses this view will be used. * @return {import("./extent.js").Extent} Extent. * @api @@ -941,7 +941,7 @@ class View extends BaseObject { } /** - * @param {import("./size.js").Size=} opt_size Box pixel size. If not provided, + * @param {import("./size.js").Size} [opt_size] Box pixel size. If not provided, * the map's last known viewport size will be used. * @return {import("./extent.js").Extent} Extent. */ @@ -1056,7 +1056,7 @@ class View extends BaseObject { /** * Get the resolution for a provided extent (in map units) and size (in pixels). * @param {import("./extent.js").Extent} extent Extent. - * @param {import("./size.js").Size=} opt_size Box pixel size. + * @param {import("./size.js").Size} [opt_size] Box pixel size. * @return {number} The resolution at which the provided extent will render at * the given size. * @api @@ -1071,7 +1071,7 @@ class View extends BaseObject { /** * Get the resolution for a provided extent (in map units) and size (in pixels). * @param {import("./extent.js").Extent} extent Extent. - * @param {import("./size.js").Size=} opt_size Box pixel size. + * @param {import("./size.js").Size} [opt_size] Box pixel size. * @return {number} The resolution at which the provided extent will render at * the given size. */ @@ -1085,7 +1085,7 @@ class View extends BaseObject { /** * Return a function that returns a value between 0 and 1 for a * resolution. Exponential scaling is assumed. - * @param {number=} opt_power Power. + * @param {number} [opt_power] Power. * @return {function(number): number} Resolution for value function. */ getResolutionForValueFunction(opt_power) { @@ -1118,7 +1118,7 @@ class View extends BaseObject { /** * Return a function that returns a resolution for a value between * 0 and 1. Exponential scaling is assumed. - * @param {number=} opt_power Power. + * @param {number} [opt_power] Power. * @return {function(number): number} Value for resolution function. */ getValueForResolutionFunction(opt_power) { @@ -1141,7 +1141,7 @@ class View extends BaseObject { /** * Returns the size of the viewport minus padding. * @private - * @param {number=} opt_rotation Take into account the rotation of the viewport when giving the size + * @param {number} [opt_rotation] Take into account the rotation of the viewport when giving the size * @return {import("./size.js").Size} Viewport size reduced by the padding. */ getViewportSizeMinusPadding_(opt_rotation) { @@ -1261,7 +1261,7 @@ class View extends BaseObject { * Takes care of the map angle. * @param {import("./geom/SimpleGeometry.js").default|import("./extent.js").Extent} geometryOrExtent The geometry or * extent to fit the view to. - * @param {FitOptions=} opt_options Options. + * @param {FitOptions} [opt_options] Options. * @api */ fit(geometryOrExtent, opt_options) { @@ -1300,7 +1300,7 @@ class View extends BaseObject { /** * @param {import("./geom/SimpleGeometry.js").default} geometry The geometry. - * @param {FitOptions=} opt_options Options. + * @param {FitOptions} [opt_options] Options. */ fitInternal(geometry, opt_options) { const options = opt_options || {}; @@ -1474,7 +1474,7 @@ class View extends BaseObject { * Multiply the view resolution by a ratio, optionally using an anchor. Any resolution * constraint will apply. * @param {number} ratio The ratio to apply on the view resolution. - * @param {import("./coordinate.js").Coordinate=} opt_anchor The origin of the transformation. + * @param {import("./coordinate.js").Coordinate} [opt_anchor] The origin of the transformation. * @api */ adjustResolution(ratio, opt_anchor) { @@ -1487,7 +1487,7 @@ class View extends BaseObject { * Multiply the view resolution by a ratio, optionally using an anchor. Any resolution * constraint will apply. * @param {number} ratio The ratio to apply on the view resolution. - * @param {import("./coordinate.js").Coordinate=} opt_anchor The origin of the transformation. + * @param {import("./coordinate.js").Coordinate} [opt_anchor] The origin of the transformation. */ adjustResolutionInternal(ratio, opt_anchor) { const isMoving = this.getAnimating() || this.getInteracting(); @@ -1511,7 +1511,7 @@ class View extends BaseObject { * Adds a value to the view zoom level, optionally using an anchor. Any resolution * constraint will apply. * @param {number} delta Relative value to add to the zoom level. - * @param {import("./coordinate.js").Coordinate=} opt_anchor The origin of the transformation. + * @param {import("./coordinate.js").Coordinate} [opt_anchor] The origin of the transformation. * @api */ adjustZoom(delta, opt_anchor) { @@ -1522,7 +1522,7 @@ class View extends BaseObject { * Adds a value to the view rotation, optionally using an anchor. Any rotation * constraint will apply. * @param {number} delta Relative value to add to the zoom rotation, in radians. - * @param {import("./coordinate.js").Coordinate=} opt_anchor The rotation center. + * @param {import("./coordinate.js").Coordinate} [opt_anchor] The rotation center. * @api */ adjustRotation(delta, opt_anchor) { @@ -1534,7 +1534,7 @@ class View extends BaseObject { /** * @param {number} delta Relative value to add to the zoom rotation, in radians. - * @param {import("./coordinate.js").Coordinate=} opt_anchor The rotation center. + * @param {import("./coordinate.js").Coordinate} [opt_anchor] The rotation center. */ adjustRotationInternal(delta, opt_anchor) { const isMoving = this.getAnimating() || this.getInteracting(); @@ -1614,8 +1614,8 @@ class View extends BaseObject { * Recompute rotation/resolution/center based on target values. * Note: we have to compute rotation first, then resolution and center considering that * parameters can influence one another in case a view extent constraint is present. - * @param {boolean=} opt_doNotCancelAnims Do not cancel animations. - * @param {boolean=} opt_forceMoving Apply constraints as if the view is moving. + * @param {boolean} [opt_doNotCancelAnims] Do not cancel animations. + * @param {boolean} [opt_forceMoving] Apply constraints as if the view is moving. * @private */ applyTargetState_(opt_doNotCancelAnims, opt_forceMoving) { @@ -1671,9 +1671,9 @@ class View extends BaseObject { * This is typically done on interaction end. * Note: calling this with a duration of 0 will apply the constrained values straight away, * without animation. - * @param {number=} opt_duration The animation duration in ms. - * @param {number=} opt_resolutionDirection Which direction to zoom. - * @param {import("./coordinate.js").Coordinate=} opt_anchor The origin of the transformation. + * @param {number} [opt_duration] The animation duration in ms. + * @param {number} [opt_resolutionDirection] Which direction to zoom. + * @param {import("./coordinate.js").Coordinate} [opt_anchor] The origin of the transformation. */ resolveConstraints(opt_duration, opt_resolutionDirection, opt_anchor) { const duration = opt_duration !== undefined ? opt_duration : 200; @@ -1747,9 +1747,9 @@ class View extends BaseObject { /** * Notify the View that an interaction has ended. The view state will be resolved * to a stable one if needed (depending on its constraints). - * @param {number=} opt_duration Animation duration in ms. - * @param {number=} opt_resolutionDirection Which direction to zoom. - * @param {import("./coordinate.js").Coordinate=} opt_anchor The origin of the transformation. + * @param {number} [opt_duration] Animation duration in ms. + * @param {number} [opt_resolutionDirection] Which direction to zoom. + * @param {import("./coordinate.js").Coordinate} [opt_anchor] The origin of the transformation. * @api */ endInteraction(opt_duration, opt_resolutionDirection, opt_anchor) { @@ -1761,9 +1761,9 @@ class View extends BaseObject { /** * Notify the View that an interaction has ended. The view state will be resolved * to a stable one if needed (depending on its constraints). - * @param {number=} opt_duration Animation duration in ms. - * @param {number=} opt_resolutionDirection Which direction to zoom. - * @param {import("./coordinate.js").Coordinate=} opt_anchor The origin of the transformation. + * @param {number} [opt_duration] Animation duration in ms. + * @param {number} [opt_resolutionDirection] Which direction to zoom. + * @param {import("./coordinate.js").Coordinate} [opt_anchor] The origin of the transformation. */ endInteractionInternal(opt_duration, opt_resolutionDirection, opt_anchor) { this.setHint(ViewHint.INTERACTING, -1); @@ -1774,7 +1774,7 @@ class View extends BaseObject { /** * Get a valid position for the view center according to the current constraints. * @param {import("./coordinate.js").Coordinate|undefined} targetCenter Target center position. - * @param {number=} opt_targetResolution Target resolution. If not supplied, the current one will be used. + * @param {number} [opt_targetResolution] Target resolution. If not supplied, the current one will be used. * This is useful to guess a valid center position at a different zoom level. * @return {import("./coordinate.js").Coordinate|undefined} Valid center position. */ @@ -1790,7 +1790,7 @@ class View extends BaseObject { /** * Get a valid zoom level according to the current view constraints. * @param {number|undefined} targetZoom Target zoom. - * @param {number=} [opt_direction=0] Indicate which resolution should be used + * @param {number} [opt_direction=0] Indicate which resolution should be used * by a renderer if the view 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. @@ -1806,7 +1806,7 @@ class View extends BaseObject { /** * Get a valid resolution according to the current view constraints. * @param {number|undefined} targetResolution Target resolution. - * @param {number=} [opt_direction=0] Indicate which resolution should be used + * @param {number} [opt_direction=0] Indicate which resolution should be used * by a renderer if the view 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. diff --git a/src/ol/array.js b/src/ol/array.js index 578c096cc1..7f7090e509 100644 --- a/src/ol/array.js +++ b/src/ol/array.js @@ -8,7 +8,7 @@ * * @param {Array<*>} haystack Items to search through. * @param {*} needle The item to look for. - * @param {Function=} opt_comparator Comparator function. + * @param {Function} [opt_comparator] Comparator function. * @return {number} The index of the item if found, -1 if not. */ export function binarySearch(haystack, needle, opt_comparator) { @@ -222,8 +222,8 @@ export function findIndex(arr, func) { /** * @param {Array<*>} arr The array to test. - * @param {Function=} opt_func Comparison function. - * @param {boolean=} opt_strict Strictly sorted (default false). + * @param {Function} [opt_func] Comparison function. + * @param {boolean} [opt_strict] Strictly sorted (default false). * @return {boolean} Return index. */ export function isSorted(arr, opt_func, opt_strict) { diff --git a/src/ol/centerconstraint.js b/src/ol/centerconstraint.js index 1131fc9c27..56f6307a36 100644 --- a/src/ol/centerconstraint.js +++ b/src/ol/centerconstraint.js @@ -20,8 +20,8 @@ export function createExtent(extent, onlyCenter, smooth) { * @param {import("./coordinate.js").Coordinate|undefined} center Center. * @param {number} resolution Resolution. * @param {import("./size.js").Size} size Viewport size; unused if `onlyCenter` was specified. - * @param {boolean=} opt_isMoving True if an interaction or animation is in progress. - * @param {Array=} opt_centerShift Shift between map center and viewport center. + * @param {boolean} [opt_isMoving] True if an interaction or animation is in progress. + * @param {Array} [opt_centerShift] Shift between map center and viewport center. * @return {import("./coordinate.js").Coordinate|undefined} Center. */ function (center, resolution, size, opt_isMoving, opt_centerShift) { @@ -69,7 +69,7 @@ export function createExtent(extent, onlyCenter, smooth) { } /** - * @param {import("./coordinate.js").Coordinate=} center Center. + * @param {import("./coordinate.js").Coordinate} [center] Center. * @return {import("./coordinate.js").Coordinate|undefined} Center. */ export function none(center) { diff --git a/src/ol/control.js b/src/ol/control.js index 73ea893dd7..358083e6e4 100644 --- a/src/ol/control.js +++ b/src/ol/control.js @@ -41,7 +41,7 @@ export {default as ZoomToExtent} from './control/ZoomToExtent.js'; * * {@link module:ol/control/Rotate~Rotate} * * {@link module:ol/control/Attribution~Attribution} * - * @param {DefaultsOptions=} opt_options + * @param {DefaultsOptions} [opt_options] * Defaults options. * @return {Collection} * Controls. diff --git a/src/ol/control/Attribution.js b/src/ol/control/Attribution.js index 123d0efd3e..b8ccc8f1ee 100644 --- a/src/ol/control/Attribution.js +++ b/src/ol/control/Attribution.js @@ -46,7 +46,7 @@ import {removeChildren, replaceNode} from '../dom.js'; */ class Attribution extends Control { /** - * @param {Options=} opt_options Attribution options. + * @param {Options} [opt_options] Attribution options. */ constructor(opt_options) { const options = opt_options ? opt_options : {}; diff --git a/src/ol/control/FullScreen.js b/src/ol/control/FullScreen.js index 05002b01a4..43eb18a907 100644 --- a/src/ol/control/FullScreen.js +++ b/src/ol/control/FullScreen.js @@ -70,7 +70,7 @@ const FullScreenEventType = { */ class FullScreen extends Control { /** - * @param {Options=} opt_options Options. + * @param {Options} [opt_options] Options. */ constructor(opt_options) { const options = opt_options ? opt_options : {}; diff --git a/src/ol/control/MousePosition.js b/src/ol/control/MousePosition.js index 10dae0d11d..be69cad9cb 100644 --- a/src/ol/control/MousePosition.js +++ b/src/ol/control/MousePosition.js @@ -54,7 +54,7 @@ const COORDINATE_FORMAT = 'coordinateFormat'; */ class MousePosition extends Control { /** - * @param {Options=} opt_options Mouse position options. + * @param {Options} [opt_options] Mouse position options. */ constructor(opt_options) { const options = opt_options ? opt_options : {}; diff --git a/src/ol/control/OverviewMap.js b/src/ol/control/OverviewMap.js index 6258005646..aab527e568 100644 --- a/src/ol/control/OverviewMap.js +++ b/src/ol/control/OverviewMap.js @@ -74,7 +74,7 @@ class ControlledMap extends PluggableMap { */ class OverviewMap extends Control { /** - * @param {Options=} opt_options OverviewMap options. + * @param {Options} [opt_options] OverviewMap options. */ constructor(opt_options) { const options = opt_options ? opt_options : {}; diff --git a/src/ol/control/Rotate.js b/src/ol/control/Rotate.js index bab56c6eb6..0005b7aabf 100644 --- a/src/ol/control/Rotate.js +++ b/src/ol/control/Rotate.js @@ -33,7 +33,7 @@ import {easeOut} from '../easing.js'; */ class Rotate extends Control { /** - * @param {Options=} opt_options Rotate options. + * @param {Options} [opt_options] Rotate options. */ constructor(opt_options) { const options = opt_options ? opt_options : {}; diff --git a/src/ol/control/ScaleLine.js b/src/ol/control/ScaleLine.js index 0975354574..10af5361ab 100644 --- a/src/ol/control/ScaleLine.js +++ b/src/ol/control/ScaleLine.js @@ -73,7 +73,7 @@ const DEFAULT_DPI = 25.4 / 0.28; */ class ScaleLine extends Control { /** - * @param {Options=} opt_options Scale line options. + * @param {Options} [opt_options] Scale line options. */ constructor(opt_options) { const options = opt_options ? opt_options : {}; diff --git a/src/ol/control/Zoom.js b/src/ol/control/Zoom.js index 268c293c14..a8dff2825b 100644 --- a/src/ol/control/Zoom.js +++ b/src/ol/control/Zoom.js @@ -33,7 +33,7 @@ import {easeOut} from '../easing.js'; */ class Zoom extends Control { /** - * @param {Options=} opt_options Zoom options. + * @param {Options} [opt_options] Zoom options. */ constructor(opt_options) { const options = opt_options ? opt_options : {}; diff --git a/src/ol/control/ZoomSlider.js b/src/ol/control/ZoomSlider.js index 0f5f886af5..2d4e7724cc 100644 --- a/src/ol/control/ZoomSlider.js +++ b/src/ol/control/ZoomSlider.js @@ -41,7 +41,7 @@ const Direction = { */ class ZoomSlider extends Control { /** - * @param {Options=} opt_options Zoom slider options. + * @param {Options} [opt_options] Zoom slider options. */ constructor(opt_options) { const options = opt_options ? opt_options : {}; diff --git a/src/ol/control/ZoomToExtent.js b/src/ol/control/ZoomToExtent.js index 68ddcc3c88..d883244cd6 100644 --- a/src/ol/control/ZoomToExtent.js +++ b/src/ol/control/ZoomToExtent.js @@ -27,7 +27,7 @@ import {fromExtent as polygonFromExtent} from '../geom/Polygon.js'; */ class ZoomToExtent extends Control { /** - * @param {Options=} opt_options Options. + * @param {Options} [opt_options] Options. */ constructor(opt_options) { const options = opt_options ? opt_options : {}; diff --git a/src/ol/coordinate.js b/src/ol/coordinate.js index d34e8cecf9..4be1010142 100644 --- a/src/ol/coordinate.js +++ b/src/ol/coordinate.js @@ -135,7 +135,7 @@ export function closestOnSegment(coordinate, segment) { * var out = stringifyFunc(coord); * // out is now '7.85, 47.98' * - * @param {number=} opt_fractionDigits The number of digits to include + * @param {number} [opt_fractionDigits] The number of digits to include * after the decimal point. Default is `0`. * @return {CoordinateFormat} Coordinate format. * @api @@ -155,7 +155,7 @@ export function createStringXY(opt_fractionDigits) { /** * @param {string} hemispheres Hemispheres. * @param {number} degrees Degrees. - * @param {number=} opt_fractionDigits The number of digits to include + * @param {number} [opt_fractionDigits] The number of digits to include * after the decimal point. Default is `0`. * @return {string} String. */ @@ -219,7 +219,7 @@ export function degreesToStringHDMS(hemispheres, degrees, opt_fractionDigits) { * @param {Coordinate} coordinate Coordinate. * @param {string} template A template string with `{x}` and `{y}` placeholders * that will be replaced by first and second coordinate values. - * @param {number=} opt_fractionDigits The number of digits to include + * @param {number} [opt_fractionDigits] The number of digits to include * after the decimal point. Default is `0`. * @return {string} Formatted coordinate. * @api @@ -354,7 +354,7 @@ export function squaredDistanceToSegment(coordinate, segment) { * // out is now '47° 58′ 60.0″ N 7° 50′ 60.0″ E' * * @param {Coordinate} coordinate Coordinate. - * @param {number=} opt_fractionDigits The number of digits to include + * @param {number} [opt_fractionDigits] The number of digits to include * after the decimal point. Default is `0`. * @return {string} Hemisphere, degrees, minutes and seconds. * @api @@ -391,7 +391,7 @@ export function toStringHDMS(coordinate, opt_fractionDigits) { * // out is now '7.8, 48.0' * * @param {Coordinate} coordinate Coordinate. - * @param {number=} opt_fractionDigits The number of digits to include + * @param {number} [opt_fractionDigits] The number of digits to include * after the decimal point. Default is `0`. * @return {string} XY. * @api @@ -422,7 +422,7 @@ export function wrapX(coordinate, projection) { /** * @param {Coordinate} coordinate Coordinate. * @param {import("./proj/Projection.js").default} projection Projection. - * @param {number=} opt_sourceExtentWidth Width of the source extent. + * @param {number} [opt_sourceExtentWidth] Width of the source extent. * @return {number} Offset in world widths. */ export function getWorldsAway(coordinate, projection, opt_sourceExtentWidth) { diff --git a/src/ol/dom.js b/src/ol/dom.js index bc8516cf99..3b251301a7 100644 --- a/src/ol/dom.js +++ b/src/ol/dom.js @@ -7,9 +7,9 @@ import {WORKER_OFFSCREEN_CANVAS} from './has.js'; //FIXME Move this function to the canvas module /** * Create an html canvas element and returns its 2d context. - * @param {number=} opt_width Canvas width. - * @param {number=} opt_height Canvas height. - * @param {Array=} opt_canvasPool Canvas pool to take existing canvas from. + * @param {number} [opt_width] Canvas width. + * @param {number} [opt_height] Canvas height. + * @param {Array} [opt_canvasPool] Canvas pool to take existing canvas from. * @return {CanvasRenderingContext2D} The context. */ export function createCanvasContext2D(opt_width, opt_height, opt_canvasPool) { diff --git a/src/ol/events.js b/src/ol/events.js index 8bd12b7b6e..7a150b78ba 100644 --- a/src/ol/events.js +++ b/src/ol/events.js @@ -39,9 +39,9 @@ import {clear} from './obj.js'; * @param {import("./events/Target.js").EventTargetLike} target Event target. * @param {string} type Event type. * @param {ListenerFunction} listener Listener. - * @param {Object=} opt_this Object referenced by the `this` keyword in the + * @param {Object} [opt_this] Object referenced by the `this` keyword in the * listener. Default is the `target`. - * @param {boolean=} opt_once If true, add the listener as one-off listener. + * @param {boolean} [opt_once] If true, add the listener as one-off listener. * @return {EventsKey} Unique key for the listener. */ export function listen(target, type, listener, opt_this, opt_once) { @@ -80,7 +80,7 @@ export function listen(target, type, listener, opt_this, opt_once) { * @param {import("./events/Target.js").EventTargetLike} target Event target. * @param {string} type Event type. * @param {ListenerFunction} listener Listener. - * @param {Object=} opt_this Object referenced by the `this` keyword in the + * @param {Object} [opt_this] Object referenced by the `this` keyword in the * listener. Default is the `target`. * @return {EventsKey} Key for unlistenByKey. */ diff --git a/src/ol/events/Target.js b/src/ol/events/Target.js index e8e4967acd..4a2299de9e 100644 --- a/src/ol/events/Target.js +++ b/src/ol/events/Target.js @@ -27,7 +27,7 @@ import {clear} from '../obj.js'; */ class Target extends Disposable { /** - * @param {*=} opt_target Default event target for dispatched events. + * @param {*} [opt_target] Default event target for dispatched events. */ constructor(opt_target) { super(); @@ -147,7 +147,7 @@ class Target extends Disposable { } /** - * @param {string=} opt_type Type. If not provided, + * @param {string} [opt_type] Type. If not provided, * `true` will be returned if this event target has any listeners. * @return {boolean} Has listeners. */ diff --git a/src/ol/extent.js b/src/ol/extent.js index 0a8f5225e2..a9c20bc445 100644 --- a/src/ol/extent.js +++ b/src/ol/extent.js @@ -29,7 +29,7 @@ export function boundingExtent(coordinates) { /** * @param {Array} xs Xs. * @param {Array} ys Ys. - * @param {Extent=} opt_extent Destination extent. + * @param {Extent} [opt_extent] Destination extent. * @private * @return {Extent} Extent. */ @@ -45,7 +45,7 @@ function _boundingExtentXYs(xs, ys, opt_extent) { * Return extent increased by the provided value. * @param {Extent} extent Extent. * @param {number} value The amount by which the extent should be buffered. - * @param {Extent=} opt_extent Extent. + * @param {Extent} [opt_extent] Extent. * @return {Extent} Extent. * @api */ @@ -70,7 +70,7 @@ export function buffer(extent, value, opt_extent) { * Creates a clone of an extent. * * @param {Extent} extent Extent to clone. - * @param {Extent=} opt_extent Extent. + * @param {Extent} [opt_extent] Extent. * @return {Extent} The clone. */ export function clone(extent, opt_extent) { @@ -202,7 +202,7 @@ export function createEmpty() { * @param {number} minY Minimum Y. * @param {number} maxX Maximum X. * @param {number} maxY Maximum Y. - * @param {Extent=} opt_extent Destination extent. + * @param {Extent} [opt_extent] Destination extent. * @return {Extent} Extent. */ export function createOrUpdate(minX, minY, maxX, maxY, opt_extent) { @@ -219,7 +219,7 @@ export function createOrUpdate(minX, minY, maxX, maxY, opt_extent) { /** * Create a new empty extent or make the provided one empty. - * @param {Extent=} opt_extent Extent. + * @param {Extent} [opt_extent] Extent. * @return {Extent} Extent. */ export function createOrUpdateEmpty(opt_extent) { @@ -228,7 +228,7 @@ export function createOrUpdateEmpty(opt_extent) { /** * @param {import("./coordinate.js").Coordinate} coordinate Coordinate. - * @param {Extent=} opt_extent Extent. + * @param {Extent} [opt_extent] Extent. * @return {Extent} Extent. */ export function createOrUpdateFromCoordinate(coordinate, opt_extent) { @@ -239,7 +239,7 @@ export function createOrUpdateFromCoordinate(coordinate, opt_extent) { /** * @param {Array} coordinates Coordinates. - * @param {Extent=} opt_extent Extent. + * @param {Extent} [opt_extent] Extent. * @return {Extent} Extent. */ export function createOrUpdateFromCoordinates(coordinates, opt_extent) { @@ -252,7 +252,7 @@ export function createOrUpdateFromCoordinates(coordinates, opt_extent) { * @param {number} offset Offset. * @param {number} end End. * @param {number} stride Stride. - * @param {Extent=} opt_extent Extent. + * @param {Extent} [opt_extent] Extent. * @return {Extent} Extent. */ export function createOrUpdateFromFlatCoordinates( @@ -268,7 +268,7 @@ export function createOrUpdateFromFlatCoordinates( /** * @param {Array>} rings Rings. - * @param {Extent=} opt_extent Extent. + * @param {Extent} [opt_extent] Extent. * @return {Extent} Extent. */ export function createOrUpdateFromRings(rings, opt_extent) { @@ -521,7 +521,7 @@ export function getEnlargedArea(extent1, extent2) { * @param {number} resolution Resolution. * @param {number} rotation Rotation. * @param {import("./size.js").Size} size Size. - * @param {Extent=} opt_extent Destination extent. + * @param {Extent} [opt_extent] Destination extent. * @return {Extent} Extent. */ export function getForViewAndSize( @@ -582,7 +582,7 @@ export function getIntersectionArea(extent1, extent2) { * Get the intersection of two extents. * @param {Extent} extent1 Extent 1. * @param {Extent} extent2 Extent 2. - * @param {Extent=} opt_extent Optional extent to populate with intersection. + * @param {Extent} [opt_extent] Optional extent to populate with intersection. * @return {Extent} Intersecting extent. * @api */ @@ -691,7 +691,7 @@ export function isEmpty(extent) { /** * @param {Extent} extent Extent. - * @param {Extent=} opt_extent Extent. + * @param {Extent} [opt_extent] Extent. * @return {Extent} Extent. */ export function returnOrUpdate(extent, opt_extent) { @@ -788,8 +788,8 @@ export function intersectsSegment(extent, start, end) { * @param {Extent} extent Extent. * @param {import("./proj.js").TransformFunction} transformFn Transform function. * Called with `[minX, minY, maxX, maxY]` extent coordinates. - * @param {Extent=} opt_extent Destination extent. - * @param {number=} opt_stops Number of stops per side used for the transform. + * @param {Extent} [opt_extent] Destination extent. + * @param {number} [opt_stops] Number of stops per side used for the transform. * By default only the corners are used. * @return {Extent} Extent. * @api diff --git a/src/ol/featureloader.js b/src/ol/featureloader.js index dbe2ae092f..6c146b1b63 100644 --- a/src/ol/featureloader.js +++ b/src/ol/featureloader.js @@ -136,9 +136,9 @@ export function xhr(url, format) { * @param {import("./extent.js").Extent} extent Extent. * @param {number} resolution Resolution. * @param {import("./proj/Projection.js").default} projection Projection. - * @param {function(): void=} success Success + * @param {function(): void} [success] Success * Function called when loading succeeded. - * @param {function(): void=} failure Failure + * @param {function(): void} [failure] Failure * Function called when loading failed. * @this {import("./source/Vector").default} */ diff --git a/src/ol/format/EsriJSON.js b/src/ol/format/EsriJSON.js index 066647957a..5b17a7f43b 100644 --- a/src/ol/format/EsriJSON.js +++ b/src/ol/format/EsriJSON.js @@ -78,7 +78,7 @@ GEOMETRY_WRITERS[GeometryType.MULTI_POLYGON] = writeMultiPolygonGeometry; */ class EsriJSON extends JSONFeature { /** - * @param {Options=} opt_options Options. + * @param {Options} [opt_options] Options. */ constructor(opt_options) { const options = opt_options ? opt_options : {}; @@ -95,8 +95,8 @@ class EsriJSON extends JSONFeature { /** * @param {Object} object Object. - * @param {import("./Feature.js").ReadOptions=} opt_options Read options. - * @param {string=} opt_idField Name of the field where to get the id from. + * @param {import("./Feature.js").ReadOptions} [opt_options] Read options. + * @param {string} [opt_idField] Name of the field where to get the id from. * @protected * @return {import("../Feature.js").default} Feature. */ @@ -120,7 +120,7 @@ class EsriJSON extends JSONFeature { /** * @param {Object} object Object. - * @param {import("./Feature.js").ReadOptions=} opt_options Read options. + * @param {import("./Feature.js").ReadOptions} [opt_options] Read options. * @protected * @return {Array} Features. */ @@ -148,7 +148,7 @@ class EsriJSON extends JSONFeature { /** * @param {EsriJSONGeometry} object Object. - * @param {import("./Feature.js").ReadOptions=} opt_options Read options. + * @param {import("./Feature.js").ReadOptions} [opt_options] Read options. * @protected * @return {import("../geom/Geometry.js").default} Geometry. */ @@ -180,7 +180,7 @@ class EsriJSON extends JSONFeature { * Encode a geometry as a EsriJSON object. * * @param {import("../geom/Geometry.js").default} geometry Geometry. - * @param {import("./Feature.js").WriteOptions=} opt_options Write options. + * @param {import("./Feature.js").WriteOptions} [opt_options] Write options. * @return {EsriJSONGeometry} Object. * @api */ @@ -192,7 +192,7 @@ class EsriJSON extends JSONFeature { * Encode a feature as a esriJSON Feature object. * * @param {import("../Feature.js").default} feature Feature. - * @param {import("./Feature.js").WriteOptions=} opt_options Write options. + * @param {import("./Feature.js").WriteOptions} [opt_options] Write options. * @return {Object} Object. * @api */ @@ -231,7 +231,7 @@ class EsriJSON extends JSONFeature { * Encode an array of features as a EsriJSON object. * * @param {Array} features Features. - * @param {import("./Feature.js").WriteOptions=} opt_options Write options. + * @param {import("./Feature.js").WriteOptions} [opt_options] Write options. * @return {EsriJSONFeatureSet} EsriJSON Object. * @api */ @@ -249,7 +249,7 @@ class EsriJSON extends JSONFeature { /** * @param {EsriJSONGeometry} object Object. - * @param {import("./Feature.js").ReadOptions=} opt_options Read options. + * @param {import("./Feature.js").ReadOptions} [opt_options] Read options. * @return {import("../geom/Geometry.js").default} Geometry. */ function readGeometry(object, opt_options) { @@ -429,7 +429,7 @@ function readPolygonGeometry(object) { /** * @param {import("../geom/Point.js").default} geometry Geometry. - * @param {import("./Feature.js").WriteOptions=} opt_options Write options. + * @param {import("./Feature.js").WriteOptions} [opt_options] Write options. * @return {EsriJSONPoint} EsriJSON geometry. */ function writePointGeometry(geometry, opt_options) { @@ -481,7 +481,7 @@ function getHasZM(geometry) { /** * @param {import("../geom/LineString.js").default} lineString Geometry. - * @param {import("./Feature.js").WriteOptions=} opt_options Write options. + * @param {import("./Feature.js").WriteOptions} [opt_options] Write options. * @return {EsriJSONPolyline} EsriJSON geometry. */ function writeLineStringGeometry(lineString, opt_options) { @@ -497,7 +497,7 @@ function writeLineStringGeometry(lineString, opt_options) { /** * @param {import("../geom/Polygon.js").default} polygon Geometry. - * @param {import("./Feature.js").WriteOptions=} opt_options Write options. + * @param {import("./Feature.js").WriteOptions} [opt_options] Write options. * @return {EsriJSONPolygon} EsriJSON geometry. */ function writePolygonGeometry(polygon, opt_options) { @@ -514,7 +514,7 @@ function writePolygonGeometry(polygon, opt_options) { /** * @param {import("../geom/MultiLineString.js").default} multiLineString Geometry. - * @param {import("./Feature.js").WriteOptions=} opt_options Write options. + * @param {import("./Feature.js").WriteOptions} [opt_options] Write options. * @return {EsriJSONPolyline} EsriJSON geometry. */ function writeMultiLineStringGeometry(multiLineString, opt_options) { @@ -528,7 +528,7 @@ function writeMultiLineStringGeometry(multiLineString, opt_options) { /** * @param {import("../geom/MultiPoint.js").default} multiPoint Geometry. - * @param {import("./Feature.js").WriteOptions=} opt_options Write options. + * @param {import("./Feature.js").WriteOptions} [opt_options] Write options. * @return {EsriJSONMultipoint} EsriJSON geometry. */ function writeMultiPointGeometry(multiPoint, opt_options) { @@ -542,7 +542,7 @@ function writeMultiPointGeometry(multiPoint, opt_options) { /** * @param {import("../geom/MultiPolygon.js").default} geometry Geometry. - * @param {import("./Feature.js").WriteOptions=} opt_options Write options. + * @param {import("./Feature.js").WriteOptions} [opt_options] Write options. * @return {EsriJSONPolygon} EsriJSON geometry. */ function writeMultiPolygonGeometry(geometry, opt_options) { @@ -563,7 +563,7 @@ function writeMultiPolygonGeometry(geometry, opt_options) { /** * @param {import("../geom/Geometry.js").default} geometry Geometry. - * @param {import("./Feature.js").WriteOptions=} opt_options Write options. + * @param {import("./Feature.js").WriteOptions} [opt_options] Write options. * @return {EsriJSONGeometry} EsriJSON geometry. */ function writeGeometry(geometry, opt_options) { diff --git a/src/ol/format/Feature.js b/src/ol/format/Feature.js index e3473eae9a..24a887c0cc 100644 --- a/src/ol/format/Feature.js +++ b/src/ol/format/Feature.js @@ -81,7 +81,7 @@ class FeatureFormat { /** * Adds the data projection to the read options. * @param {Document|Element|Object|string} source Source. - * @param {ReadOptions=} opt_options Options. + * @param {ReadOptions} [opt_options] Options. * @return {ReadOptions|undefined} Options. * @protected */ @@ -139,7 +139,7 @@ class FeatureFormat { * * @abstract * @param {Document|Element|Object|string} source Source. - * @param {ReadOptions=} opt_options Read options. + * @param {ReadOptions} [opt_options] Read options. * @return {import("../Feature.js").FeatureLike} Feature. */ readFeature(source, opt_options) { @@ -151,7 +151,7 @@ class FeatureFormat { * * @abstract * @param {Document|Element|ArrayBuffer|Object|string} source Source. - * @param {ReadOptions=} opt_options Read options. + * @param {ReadOptions} [opt_options] Read options. * @return {Array} Features. */ readFeatures(source, opt_options) { @@ -163,7 +163,7 @@ class FeatureFormat { * * @abstract * @param {Document|Element|Object|string} source Source. - * @param {ReadOptions=} opt_options Read options. + * @param {ReadOptions} [opt_options] Read options. * @return {import("../geom/Geometry.js").default} Geometry. */ readGeometry(source, opt_options) { @@ -186,7 +186,7 @@ class FeatureFormat { * * @abstract * @param {import("../Feature.js").default} feature Feature. - * @param {WriteOptions=} opt_options Write options. + * @param {WriteOptions} [opt_options] Write options. * @return {string} Result. */ writeFeature(feature, opt_options) { @@ -198,7 +198,7 @@ class FeatureFormat { * * @abstract * @param {Array} features Features. - * @param {WriteOptions=} opt_options Write options. + * @param {WriteOptions} [opt_options] Write options. * @return {string} Result. */ writeFeatures(features, opt_options) { @@ -210,7 +210,7 @@ class FeatureFormat { * * @abstract * @param {import("../geom/Geometry.js").default} geometry Geometry. - * @param {WriteOptions=} opt_options Write options. + * @param {WriteOptions} [opt_options] Write options. * @return {string} Result. */ writeGeometry(geometry, opt_options) { @@ -223,7 +223,7 @@ export default FeatureFormat; /** * @param {import("../geom/Geometry.js").default} geometry Geometry. * @param {boolean} write Set to true for writing, false for reading. - * @param {(WriteOptions|ReadOptions)=} opt_options Options. + * @param {WriteOptions|ReadOptions} [opt_options] Options. * @return {import("../geom/Geometry.js").default} Transformed geometry. */ export function transformGeometryWithOptions(geometry, write, opt_options) { @@ -277,7 +277,7 @@ export function transformGeometryWithOptions(geometry, write, opt_options) { /** * @param {import("../extent.js").Extent} extent Extent. - * @param {ReadOptions=} opt_options Read options. + * @param {ReadOptions} [opt_options] Read options. * @return {import("../extent.js").Extent} Transformed extent. */ export function transformExtentWithOptions(extent, opt_options) { diff --git a/src/ol/format/GML.js b/src/ol/format/GML.js index 5763af23c2..0577902018 100644 --- a/src/ol/format/GML.js +++ b/src/ol/format/GML.js @@ -9,7 +9,7 @@ import GML3 from './GML3.js'; * version 3.1.1. * Currently only supports GML 3.1.1 Simple Features profile. * - * @param {import("./GMLBase.js").Options=} opt_options + * @param {import("./GMLBase.js").Options} [opt_options] * Optional configuration object. * @api */ @@ -20,7 +20,7 @@ const GML = GML3; * * @function * @param {Array} features Features. - * @param {import("./Feature.js").WriteOptions=} opt_options Options. + * @param {import("./Feature.js").WriteOptions} [opt_options] Options. * @return {string} Result. * @api */ @@ -31,7 +31,7 @@ GML.prototype.writeFeatures; * * @function * @param {Array} features Features. - * @param {import("./Feature.js").WriteOptions=} opt_options Options. + * @param {import("./Feature.js").WriteOptions} [opt_options] Options. * @return {Node} Node. * @api */ diff --git a/src/ol/format/GML2.js b/src/ol/format/GML2.js index 654a08126b..300f27fc29 100644 --- a/src/ol/format/GML2.js +++ b/src/ol/format/GML2.js @@ -49,7 +49,7 @@ const MULTIGEOMETRY_TO_MEMBER_NODENAME = { */ class GML2 extends GMLBase { /** - * @param {import("./GMLBase.js").Options=} opt_options Optional configuration object. + * @param {import("./GMLBase.js").Options} [opt_options] Optional configuration object. */ constructor(opt_options) { const options = @@ -170,7 +170,7 @@ class GML2 extends GMLBase { * @const * @param {*} value Value. * @param {Array<*>} objectStack Object stack. - * @param {string=} opt_nodeName Node name. + * @param {string} [opt_nodeName] Node name. * @return {Element|undefined} Node. * @private */ @@ -434,7 +434,7 @@ class GML2 extends GMLBase { /** * @param {*} value Value. * @param {Array<*>} objectStack Object stack. - * @param {string=} opt_nodeName Node name. + * @param {string} [opt_nodeName] Node name. * @return {Node} Node. * @private */ @@ -476,8 +476,8 @@ class GML2 extends GMLBase { /** * @param {Array} point Point geometry. - * @param {string=} opt_srsName Optional srsName - * @param {boolean=} opt_hasZ whether the geometry has a Z coordinate (is 3D) or not. + * @param {string} [opt_srsName] Optional srsName + * @param {boolean} [opt_hasZ] whether the geometry has a Z coordinate (is 3D) or not. * @return {string} The coords string. * @private */ @@ -636,7 +636,7 @@ class GML2 extends GMLBase { * @const * @param {*} value Value. * @param {Array<*>} objectStack Object stack. - * @param {string=} opt_nodeName Node name. + * @param {string} [opt_nodeName] Node name. * @return {Node|undefined} Node. * @private */ diff --git a/src/ol/format/GML3.js b/src/ol/format/GML3.js index 294e492aea..50fb0572eb 100644 --- a/src/ol/format/GML3.js +++ b/src/ol/format/GML3.js @@ -62,7 +62,7 @@ const MULTIGEOMETRY_TO_MEMBER_NODENAME = { */ class GML3 extends GMLBase { /** - * @param {import("./GMLBase.js").Options=} opt_options Optional configuration object. + * @param {import("./GMLBase.js").Options} [opt_options] Optional configuration object. */ constructor(opt_options) { const options = @@ -466,8 +466,8 @@ class GML3 extends GMLBase { /** * @param {Array} point Point geometry. - * @param {string=} opt_srsName Optional srsName - * @param {boolean=} opt_hasZ whether the geometry has a Z coordinate (is 3D) or not. + * @param {string} [opt_srsName] Optional srsName + * @param {boolean} [opt_hasZ] whether the geometry has a Z coordinate (is 3D) or not. * @return {string} The coords string. * @private */ @@ -573,7 +573,7 @@ class GML3 extends GMLBase { /** * @param {*} value Value. * @param {Array<*>} objectStack Object stack. - * @param {string=} opt_nodeName Node name. + * @param {string} [opt_nodeName] Node name. * @return {Node} Node. * @private */ @@ -920,7 +920,7 @@ class GML3 extends GMLBase { * @const * @param {*} value Value. * @param {Array<*>} objectStack Object stack. - * @param {string=} opt_nodeName Node name. + * @param {string} [opt_nodeName] Node name. * @return {Node|undefined} Node. * @private */ @@ -936,7 +936,7 @@ class GML3 extends GMLBase { * @const * @param {*} value Value. * @param {Array<*>} objectStack Object stack. - * @param {string=} opt_nodeName Node name. + * @param {string} [opt_nodeName] Node name. * @return {Element|undefined} Node. * @private */ @@ -968,7 +968,7 @@ class GML3 extends GMLBase { * Encode a geometry in GML 3.1.1 Simple Features. * * @param {import("../geom/Geometry.js").default} geometry Geometry. - * @param {import("./Feature.js").WriteOptions=} opt_options Options. + * @param {import("./Feature.js").WriteOptions} [opt_options] Options. * @return {Node} Node. * @api */ @@ -995,7 +995,7 @@ class GML3 extends GMLBase { * Encode an array of features in the GML 3.1.1 format as an XML node. * * @param {Array} features Features. - * @param {import("./Feature.js").WriteOptions=} opt_options Options. + * @param {import("./Feature.js").WriteOptions} [opt_options] Options. * @return {Element} Node. * @api */ @@ -1169,7 +1169,7 @@ GML3.prototype.SEGMENTS_PARSERS = { * * @function * @param {Array} features Features. - * @param {import("./Feature.js").WriteOptions=} opt_options Options. + * @param {import("./Feature.js").WriteOptions} [opt_options] Options. * @return {string} Result. * @api */ diff --git a/src/ol/format/GML32.js b/src/ol/format/GML32.js index 64ddb58578..5e6dec6a89 100644 --- a/src/ol/format/GML32.js +++ b/src/ol/format/GML32.js @@ -14,7 +14,7 @@ import {writeStringTextNode} from '../format/xsd.js'; */ class GML32 extends GML3 { /** - * @param {import("./GMLBase.js").Options=} opt_options Optional configuration object. + * @param {import("./GMLBase.js").Options} [opt_options] Optional configuration object. */ constructor(opt_options) { const options = /** @type {import("./GMLBase.js").Options} */ (opt_options diff --git a/src/ol/format/GMLBase.js b/src/ol/format/GMLBase.js index 5ac3c3788e..afbffa04f5 100644 --- a/src/ol/format/GMLBase.js +++ b/src/ol/format/GMLBase.js @@ -93,7 +93,7 @@ const ONLY_WHITESPACE_RE = /^[\s\xa0]*$/; */ class GMLBase extends XMLFeature { /** - * @param {Options=} opt_options Optional configuration object. + * @param {Options} [opt_options] Optional configuration object. */ constructor(opt_options) { super(); @@ -532,7 +532,7 @@ class GMLBase extends XMLFeature { /** * @param {Element} node Node. - * @param {import("./Feature.js").ReadOptions=} opt_options Options. + * @param {import("./Feature.js").ReadOptions} [opt_options] Options. * @protected * @return {import("../geom/Geometry.js").default|import("../extent.js").Extent} Geometry. */ @@ -546,7 +546,7 @@ class GMLBase extends XMLFeature { /** * @param {Element} node Node. - * @param {import("./Feature.js").ReadOptions=} opt_options Options. + * @param {import("./Feature.js").ReadOptions} [opt_options] Options. * @return {Array} Features. */ readFeaturesFromNode(node, opt_options) { diff --git a/src/ol/format/GPX.js b/src/ol/format/GPX.js index baf23abf3b..1b105e6651 100644 --- a/src/ol/format/GPX.js +++ b/src/ol/format/GPX.js @@ -131,7 +131,7 @@ const GPX_SERIALIZERS = makeStructureNS(NAMESPACE_URIS, { */ class GPX extends XMLFeature { /** - * @param {Options=} opt_options Options. + * @param {Options} [opt_options] Options. */ constructor(opt_options) { super(); @@ -170,7 +170,7 @@ class GPX extends XMLFeature { /** * @param {Element} node Node. - * @param {import("./Feature.js").ReadOptions=} opt_options Options. + * @param {import("./Feature.js").ReadOptions} [opt_options] Options. * @return {import("../Feature.js").default} Feature. */ readFeatureFromNode(node, opt_options) { @@ -193,7 +193,7 @@ class GPX extends XMLFeature { /** * @param {Element} node Node. - * @param {import("./Feature.js").ReadOptions=} opt_options Options. + * @param {import("./Feature.js").ReadOptions} [opt_options] Options. * @return {Array} Features. */ readFeaturesFromNode(node, opt_options) { @@ -221,7 +221,7 @@ class GPX extends XMLFeature { * as tracks (``). * * @param {Array} features Features. - * @param {import("./Feature.js").WriteOptions=} opt_options Options. + * @param {import("./Feature.js").WriteOptions} [opt_options] Options. * @return {Node} Node. * @api */ @@ -508,7 +508,7 @@ const GEOMETRY_TYPE_TO_NODENAME = { /** * @param {*} value Value. * @param {Array<*>} objectStack Object stack. - * @param {string=} opt_nodeName Node name. + * @param {string} [opt_nodeName] Node name. * @return {Node|undefined} Node. */ function GPX_NODE_FACTORY(value, objectStack, opt_nodeName) { @@ -557,7 +557,7 @@ function appendCoordinate(flatCoordinates, layoutOptions, node, values) { * * @param {LayoutOptions} layoutOptions Layout options. * @param {Array} flatCoordinates Flat coordinates. - * @param {Array=} ends Ends. + * @param {Array} [ends] Ends. * @return {import("../geom/GeometryLayout.js").default} Layout. */ function applyLayoutOptions(layoutOptions, flatCoordinates, ends) { diff --git a/src/ol/format/GeoJSON.js b/src/ol/format/GeoJSON.js index 583215bdfc..3ef5d15beb 100644 --- a/src/ol/format/GeoJSON.js +++ b/src/ol/format/GeoJSON.js @@ -51,7 +51,7 @@ import {transformGeometryWithOptions} from './Feature.js'; */ class GeoJSON extends JSONFeature { /** - * @param {Options=} opt_options Options. + * @param {Options} [opt_options] Options. */ constructor(opt_options) { const options = opt_options ? opt_options : {}; @@ -86,7 +86,7 @@ class GeoJSON extends JSONFeature { /** * @param {Object} object Object. - * @param {import("./Feature.js").ReadOptions=} opt_options Read options. + * @param {import("./Feature.js").ReadOptions} [opt_options] Read options. * @protected * @return {import("../Feature.js").default} Feature. */ @@ -129,7 +129,7 @@ class GeoJSON extends JSONFeature { /** * @param {Object} object Object. - * @param {import("./Feature.js").ReadOptions=} opt_options Read options. + * @param {import("./Feature.js").ReadOptions} [opt_options] Read options. * @protected * @return {Array} Features. */ @@ -154,7 +154,7 @@ class GeoJSON extends JSONFeature { /** * @param {GeoJSONGeometry} object Object. - * @param {import("./Feature.js").ReadOptions=} opt_options Read options. + * @param {import("./Feature.js").ReadOptions} [opt_options] Read options. * @protected * @return {import("../geom/Geometry.js").default} Geometry. */ @@ -188,7 +188,7 @@ class GeoJSON extends JSONFeature { * Encode a feature as a GeoJSON Feature object. * * @param {import("../Feature.js").default} feature Feature. - * @param {import("./Feature.js").WriteOptions=} opt_options Write options. + * @param {import("./Feature.js").WriteOptions} [opt_options] Write options. * @return {GeoJSONFeature} Object. * @api */ @@ -230,7 +230,7 @@ class GeoJSON extends JSONFeature { * Encode an array of features as a GeoJSON object. * * @param {Array} features Features. - * @param {import("./Feature.js").WriteOptions=} opt_options Write options. + * @param {import("./Feature.js").WriteOptions} [opt_options] Write options. * @return {GeoJSONFeatureCollection} GeoJSON Object. * @api */ @@ -250,7 +250,7 @@ class GeoJSON extends JSONFeature { * Encode a geometry as a GeoJSON object. * * @param {import("../geom/Geometry.js").default} geometry Geometry. - * @param {import("./Feature.js").WriteOptions=} opt_options Write options. + * @param {import("./Feature.js").WriteOptions} [opt_options] Write options. * @return {GeoJSONGeometry|GeoJSONGeometryCollection} Object. * @api */ @@ -261,7 +261,7 @@ class GeoJSON extends JSONFeature { /** * @param {GeoJSONGeometry|GeoJSONGeometryCollection} object Object. - * @param {import("./Feature.js").ReadOptions=} opt_options Read options. + * @param {import("./Feature.js").ReadOptions} [opt_options] Read options. * @return {import("../geom/Geometry.js").default} Geometry. */ function readGeometry(object, opt_options) { @@ -321,7 +321,7 @@ function readGeometry(object, opt_options) { /** * @param {GeoJSONGeometryCollection} object Object. - * @param {import("./Feature.js").ReadOptions=} opt_options Read options. + * @param {import("./Feature.js").ReadOptions} [opt_options] Read options. * @return {GeometryCollection} Geometry collection. */ function readGeometryCollectionGeometry(object, opt_options) { @@ -387,7 +387,7 @@ function readPolygonGeometry(object) { /** * @param {import("../geom/Geometry.js").default} geometry Geometry. - * @param {import("./Feature.js").WriteOptions=} opt_options Write options. + * @param {import("./Feature.js").WriteOptions} [opt_options] Write options. * @return {GeoJSONGeometry} GeoJSON geometry. */ function writeGeometry(geometry, opt_options) { @@ -462,7 +462,7 @@ function writeGeometry(geometry, opt_options) { /** * @param {GeometryCollection} geometry Geometry. - * @param {import("./Feature.js").WriteOptions=} opt_options Write options. + * @param {import("./Feature.js").WriteOptions} [opt_options] Write options. * @return {GeoJSONGeometryCollection} GeoJSON geometry collection. */ function writeGeometryCollectionGeometry(geometry, opt_options) { @@ -479,7 +479,7 @@ function writeGeometryCollectionGeometry(geometry, opt_options) { /** * @param {LineString} geometry Geometry. - * @param {import("./Feature.js").WriteOptions=} opt_options Write options. + * @param {import("./Feature.js").WriteOptions} [opt_options] Write options. * @return {GeoJSONGeometry} GeoJSON geometry. */ function writeLineStringGeometry(geometry, opt_options) { @@ -491,7 +491,7 @@ function writeLineStringGeometry(geometry, opt_options) { /** * @param {MultiLineString} geometry Geometry. - * @param {import("./Feature.js").WriteOptions=} opt_options Write options. + * @param {import("./Feature.js").WriteOptions} [opt_options] Write options. * @return {GeoJSONGeometry} GeoJSON geometry. */ function writeMultiLineStringGeometry(geometry, opt_options) { @@ -503,7 +503,7 @@ function writeMultiLineStringGeometry(geometry, opt_options) { /** * @param {MultiPoint} geometry Geometry. - * @param {import("./Feature.js").WriteOptions=} opt_options Write options. + * @param {import("./Feature.js").WriteOptions} [opt_options] Write options. * @return {GeoJSONGeometry} GeoJSON geometry. */ function writeMultiPointGeometry(geometry, opt_options) { @@ -515,7 +515,7 @@ function writeMultiPointGeometry(geometry, opt_options) { /** * @param {MultiPolygon} geometry Geometry. - * @param {import("./Feature.js").WriteOptions=} opt_options Write options. + * @param {import("./Feature.js").WriteOptions} [opt_options] Write options. * @return {GeoJSONGeometry} GeoJSON geometry. */ function writeMultiPolygonGeometry(geometry, opt_options) { @@ -531,7 +531,7 @@ function writeMultiPolygonGeometry(geometry, opt_options) { /** * @param {Point} geometry Geometry. - * @param {import("./Feature.js").WriteOptions=} opt_options Write options. + * @param {import("./Feature.js").WriteOptions} [opt_options] Write options. * @return {GeoJSONGeometry} GeoJSON geometry. */ function writePointGeometry(geometry, opt_options) { @@ -543,7 +543,7 @@ function writePointGeometry(geometry, opt_options) { /** * @param {Polygon} geometry Geometry. - * @param {import("./Feature.js").WriteOptions=} opt_options Write options. + * @param {import("./Feature.js").WriteOptions} [opt_options] Write options. * @return {GeoJSONGeometry} GeoJSON geometry. */ function writePolygonGeometry(geometry, opt_options) { diff --git a/src/ol/format/IGC.js b/src/ol/format/IGC.js index 441abce9bb..d519fb5cd4 100644 --- a/src/ol/format/IGC.js +++ b/src/ol/format/IGC.js @@ -62,7 +62,7 @@ const NEWLINE_RE = /\r\n|\r|\n/; */ class IGC extends TextFeature { /** - * @param {Options=} opt_options Options. + * @param {Options} [opt_options] Options. */ constructor(opt_options) { super(); @@ -86,7 +86,7 @@ class IGC extends TextFeature { /** * @protected * @param {string} text Text. - * @param {import("./Feature.js").ReadOptions=} opt_options Read options. + * @param {import("./Feature.js").ReadOptions} [opt_options] Read options. * @return {import("../Feature.js").default} Feature. */ readFeatureFromText(text, opt_options) { @@ -166,7 +166,7 @@ class IGC extends TextFeature { /** * @param {string} text Text. - * @param {import("./Feature.js").ReadOptions=} opt_options Read options. + * @param {import("./Feature.js").ReadOptions} [opt_options] Read options. * @protected * @return {Array} Features. */ diff --git a/src/ol/format/IIIFInfo.js b/src/ol/format/IIIFInfo.js index a7a930dcc7..37b7e7baa8 100644 --- a/src/ol/format/IIIFInfo.js +++ b/src/ol/format/IIIFInfo.js @@ -435,7 +435,7 @@ class IIIFInfo { } /** - * @param {PreferredOptions=} opt_preferredOptions Optional options for preferred format and quality. + * @param {PreferredOptions} [opt_preferredOptions] Optional options for preferred format and quality. * @return {import("../source/IIIF.js").Options} IIIF tile source ready constructor options. * @api */ diff --git a/src/ol/format/JSONFeature.js b/src/ol/format/JSONFeature.js index 020b6dc114..b83ac8b1e9 100644 --- a/src/ol/format/JSONFeature.js +++ b/src/ol/format/JSONFeature.js @@ -30,7 +30,7 @@ class JSONFeature extends FeatureFormat { * read a feature collection. * * @param {ArrayBuffer|Document|Element|Object|string} source Source. - * @param {import("./Feature.js").ReadOptions=} opt_options Read options. + * @param {import("./Feature.js").ReadOptions} [opt_options] Read options. * @return {import("../Feature.js").default} Feature. * @api */ @@ -46,7 +46,7 @@ class JSONFeature extends FeatureFormat { * collection. * * @param {ArrayBuffer|Document|Element|Object|string} source Source. - * @param {import("./Feature.js").ReadOptions=} opt_options Read options. + * @param {import("./Feature.js").ReadOptions} [opt_options] Read options. * @return {Array} Features. * @api */ @@ -60,7 +60,7 @@ class JSONFeature extends FeatureFormat { /** * @abstract * @param {Object} object Object. - * @param {import("./Feature.js").ReadOptions=} opt_options Read options. + * @param {import("./Feature.js").ReadOptions} [opt_options] Read options. * @protected * @return {import("../Feature.js").default} Feature. */ @@ -71,7 +71,7 @@ class JSONFeature extends FeatureFormat { /** * @abstract * @param {Object} object Object. - * @param {import("./Feature.js").ReadOptions=} opt_options Read options. + * @param {import("./Feature.js").ReadOptions} [opt_options] Read options. * @protected * @return {Array} Features. */ @@ -83,7 +83,7 @@ class JSONFeature extends FeatureFormat { * Read a geometry. * * @param {ArrayBuffer|Document|Element|Object|string} source Source. - * @param {import("./Feature.js").ReadOptions=} opt_options Read options. + * @param {import("./Feature.js").ReadOptions} [opt_options] Read options. * @return {import("../geom/Geometry.js").default} Geometry. * @api */ @@ -97,7 +97,7 @@ class JSONFeature extends FeatureFormat { /** * @abstract * @param {Object} object Object. - * @param {import("./Feature.js").ReadOptions=} opt_options Read options. + * @param {import("./Feature.js").ReadOptions} [opt_options] Read options. * @protected * @return {import("../geom/Geometry.js").default} Geometry. */ @@ -130,7 +130,7 @@ class JSONFeature extends FeatureFormat { * Encode a feature as string. * * @param {import("../Feature.js").default} feature Feature. - * @param {import("./Feature.js").WriteOptions=} opt_options Write options. + * @param {import("./Feature.js").WriteOptions} [opt_options] Write options. * @return {string} Encoded feature. * @api */ @@ -141,7 +141,7 @@ class JSONFeature extends FeatureFormat { /** * @abstract * @param {import("../Feature.js").default} feature Feature. - * @param {import("./Feature.js").WriteOptions=} opt_options Write options. + * @param {import("./Feature.js").WriteOptions} [opt_options] Write options. * @return {Object} Object. */ writeFeatureObject(feature, opt_options) { @@ -152,7 +152,7 @@ class JSONFeature extends FeatureFormat { * Encode an array of features as string. * * @param {Array} features Features. - * @param {import("./Feature.js").WriteOptions=} opt_options Write options. + * @param {import("./Feature.js").WriteOptions} [opt_options] Write options. * @return {string} Encoded features. * @api */ @@ -163,7 +163,7 @@ class JSONFeature extends FeatureFormat { /** * @abstract * @param {Array} features Features. - * @param {import("./Feature.js").WriteOptions=} opt_options Write options. + * @param {import("./Feature.js").WriteOptions} [opt_options] Write options. * @return {Object} Object. */ writeFeaturesObject(features, opt_options) { @@ -174,7 +174,7 @@ class JSONFeature extends FeatureFormat { * Encode a geometry as string. * * @param {import("../geom/Geometry.js").default} geometry Geometry. - * @param {import("./Feature.js").WriteOptions=} opt_options Write options. + * @param {import("./Feature.js").WriteOptions} [opt_options] Write options. * @return {string} Encoded geometry. * @api */ @@ -185,7 +185,7 @@ class JSONFeature extends FeatureFormat { /** * @abstract * @param {import("../geom/Geometry.js").default} geometry Geometry. - * @param {import("./Feature.js").WriteOptions=} opt_options Write options. + * @param {import("./Feature.js").WriteOptions} [opt_options] Write options. * @return {Object} Object. */ writeGeometryObject(geometry, opt_options) { diff --git a/src/ol/format/KML.js b/src/ol/format/KML.js index 84c9165075..9f98a5943c 100644 --- a/src/ol/format/KML.js +++ b/src/ol/format/KML.js @@ -427,7 +427,7 @@ function defaultIconUrlFunction(href) { */ class KML extends XMLFeature { /** - * @param {Options=} opt_options Options. + * @param {Options} [opt_options] Options. */ constructor(opt_options) { super(); @@ -624,7 +624,7 @@ class KML extends XMLFeature { /** * @param {Element} node Node. - * @param {import("./Feature.js").ReadOptions=} opt_options Options. + * @param {import("./Feature.js").ReadOptions} [opt_options] Options. * @return {import("../Feature.js").default} Feature. */ readFeatureFromNode(node, opt_options) { @@ -644,7 +644,7 @@ class KML extends XMLFeature { /** * @protected * @param {Element} node Node. - * @param {import("./Feature.js").ReadOptions=} opt_options Options. + * @param {import("./Feature.js").ReadOptions} [opt_options] Options. * @return {Array} Features. */ readFeaturesFromNode(node, opt_options) { @@ -886,7 +886,7 @@ class KML extends XMLFeature { * MultiPoints, MultiLineStrings, and MultiPolygons are output as MultiGeometries. * * @param {Array} features Features. - * @param {import("./Feature.js").WriteOptions=} opt_options Options. + * @param {import("./Feature.js").WriteOptions} [opt_options] Options. * @return {Node} Node. * @api */ @@ -2403,7 +2403,7 @@ const DOCUMENT_SERIALIZERS = makeStructureNS(NAMESPACE_URIS, { * @const * @param {*} value Value. * @param {Array<*>} objectStack Object stack. - * @param {string=} opt_nodeName Node name. + * @param {string} [opt_nodeName] Node name. * @return {Node|undefined} Node. */ const DOCUMENT_NODE_FACTORY = function (value, objectStack, opt_nodeName) { @@ -2492,7 +2492,7 @@ const ICON_SERIALIZERS = makeStructureNS( * @const * @param {*} value Value. * @param {Array<*>} objectStack Object stack. - * @param {string=} opt_nodeName Node name. + * @param {string} [opt_nodeName] Node name. * @return {Node|undefined} Node. */ const GX_NODE_FACTORY = function (value, objectStack, opt_nodeName) { @@ -2731,7 +2731,7 @@ const GEOMETRY_TYPE_TO_NODENAME = { * @const * @param {*} value Value. * @param {Array<*>} objectStack Object stack. - * @param {string=} opt_nodeName Node name. + * @param {string} [opt_nodeName] Node name. * @return {Node|undefined} Node. */ const GEOMETRY_NODE_FACTORY = function (value, objectStack, opt_nodeName) { diff --git a/src/ol/format/MVT.js b/src/ol/format/MVT.js index 9052c919cf..759e907f4f 100644 --- a/src/ol/format/MVT.js +++ b/src/ol/format/MVT.js @@ -38,12 +38,12 @@ import {linearRingIsClockwise} from '../geom/flat/orient.js'; * @classdesc * Feature format for reading data in the Mapbox MVT format. * - * @param {Options=} opt_options Options. + * @param {Options} [opt_options] Options. * @api */ class MVT extends FeatureFormat { /** - * @param {Options=} opt_options Options. + * @param {Options} [opt_options] Options. */ constructor(opt_options) { super(); @@ -260,7 +260,7 @@ class MVT extends FeatureFormat { * Read all features. * * @param {ArrayBuffer} source Source. - * @param {import("./Feature.js").ReadOptions=} opt_options Read options. + * @param {import("./Feature.js").ReadOptions} [opt_options] Read options. * @return {Array} Features. * @api */ diff --git a/src/ol/format/OSMXML.js b/src/ol/format/OSMXML.js index 39385a929e..9ce8668a2d 100644 --- a/src/ol/format/OSMXML.js +++ b/src/ol/format/OSMXML.js @@ -60,7 +60,7 @@ class OSMXML extends XMLFeature { /** * @protected * @param {Element} node Node. - * @param {import("./Feature.js").ReadOptions=} opt_options Options. + * @param {import("./Feature.js").ReadOptions} [opt_options] Options. * @return {Array} Features. */ readFeaturesFromNode(node, opt_options) { diff --git a/src/ol/format/Polyline.js b/src/ol/format/Polyline.js index e19e722d44..047aad1285 100644 --- a/src/ol/format/Polyline.js +++ b/src/ol/format/Polyline.js @@ -35,7 +35,7 @@ import {transformGeometryWithOptions} from './Feature.js'; */ class Polyline extends TextFeature { /** - * @param {Options=} opt_options Optional configuration object. + * @param {Options} [opt_options] Optional configuration object. */ constructor(opt_options) { super(); @@ -65,7 +65,7 @@ class Polyline extends TextFeature { /** * @protected * @param {string} text Text. - * @param {import("./Feature.js").ReadOptions=} opt_options Read options. + * @param {import("./Feature.js").ReadOptions} [opt_options] Read options. * @return {import("../Feature.js").default} Feature. */ readFeatureFromText(text, opt_options) { @@ -75,7 +75,7 @@ class Polyline extends TextFeature { /** * @param {string} text Text. - * @param {import("./Feature.js").ReadOptions=} opt_options Read options. + * @param {import("./Feature.js").ReadOptions} [opt_options] Read options. * @protected * @return {Array} Features. */ @@ -86,7 +86,7 @@ class Polyline extends TextFeature { /** * @param {string} text Text. - * @param {import("./Feature.js").ReadOptions=} opt_options Read options. + * @param {import("./Feature.js").ReadOptions} [opt_options] Read options. * @protected * @return {import("../geom/Geometry.js").default} Geometry. */ @@ -111,7 +111,7 @@ class Polyline extends TextFeature { /** * @param {import("../Feature.js").default} feature Features. - * @param {import("./Feature.js").WriteOptions=} opt_options Write options. + * @param {import("./Feature.js").WriteOptions} [opt_options] Write options. * @protected * @return {string} Text. */ @@ -127,7 +127,7 @@ class Polyline extends TextFeature { /** * @param {Array} features Features. - * @param {import("./Feature.js").WriteOptions=} opt_options Write options. + * @param {import("./Feature.js").WriteOptions} [opt_options] Write options. * @protected * @return {string} Text. */ @@ -137,7 +137,7 @@ class Polyline extends TextFeature { /** * @param {LineString} geometry Geometry. - * @param {import("./Feature.js").WriteOptions=} opt_options Write options. + * @param {import("./Feature.js").WriteOptions} [opt_options] Write options. * @protected * @return {string} Text. */ @@ -163,7 +163,7 @@ class Polyline extends TextFeature { * * @param {Array} numbers A list of n-dimensional points. * @param {number} stride The number of dimension of the points in the list. - * @param {number=} opt_factor The factor by which the numbers will be + * @param {number} [opt_factor] The factor by which the numbers will be * multiplied. The remaining decimal places will get rounded away. * Default is `1e5`. * @return {string} The encoded string. @@ -197,7 +197,7 @@ export function encodeDeltas(numbers, stride, opt_factor) { * @param {string} encoded An encoded string. * @param {number} stride The number of dimension of the points in the * encoded string. - * @param {number=} opt_factor The factor by which the resulting numbers will + * @param {number} [opt_factor] The factor by which the resulting numbers will * be divided. Default is `1e5`. * @return {Array} A list of n-dimensional points. * @api @@ -231,7 +231,7 @@ export function decodeDeltas(encoded, stride, opt_factor) { * Attention: This function will modify the passed array! * * @param {Array} numbers A list of floating point numbers. - * @param {number=} opt_factor The factor by which the numbers will be + * @param {number} [opt_factor] The factor by which the numbers will be * multiplied. The remaining decimal places will get rounded away. * Default is `1e5`. * @return {string} The encoded string. @@ -250,7 +250,7 @@ export function encodeFloats(numbers, opt_factor) { * Decode a list of floating point numbers from an encoded string * * @param {string} encoded An encoded string. - * @param {number=} opt_factor The factor by which the result will be divided. + * @param {number} [opt_factor] The factor by which the result will be divided. * Default is `1e5`. * @return {Array} A list of floating point numbers. * @api diff --git a/src/ol/format/TextFeature.js b/src/ol/format/TextFeature.js index 27c28c024b..41e47babcb 100644 --- a/src/ol/format/TextFeature.js +++ b/src/ol/format/TextFeature.js @@ -29,7 +29,7 @@ class TextFeature extends FeatureFormat { * Read the feature from the source. * * @param {Document|Element|Object|string} source Source. - * @param {import("./Feature.js").ReadOptions=} opt_options Read options. + * @param {import("./Feature.js").ReadOptions} [opt_options] Read options. * @return {import("../Feature.js").default} Feature. * @api */ @@ -43,7 +43,7 @@ class TextFeature extends FeatureFormat { /** * @abstract * @param {string} text Text. - * @param {import("./Feature.js").ReadOptions=} opt_options Read options. + * @param {import("./Feature.js").ReadOptions} [opt_options] Read options. * @protected * @return {import("../Feature.js").default} Feature. */ @@ -55,7 +55,7 @@ class TextFeature extends FeatureFormat { * Read the features from the source. * * @param {Document|Element|Object|string} source Source. - * @param {import("./Feature.js").ReadOptions=} opt_options Read options. + * @param {import("./Feature.js").ReadOptions} [opt_options] Read options. * @return {Array} Features. * @api */ @@ -69,7 +69,7 @@ class TextFeature extends FeatureFormat { /** * @abstract * @param {string} text Text. - * @param {import("./Feature.js").ReadOptions=} opt_options Read options. + * @param {import("./Feature.js").ReadOptions} [opt_options] Read options. * @protected * @return {Array} Features. */ @@ -81,7 +81,7 @@ class TextFeature extends FeatureFormat { * Read the geometry from the source. * * @param {Document|Element|Object|string} source Source. - * @param {import("./Feature.js").ReadOptions=} opt_options Read options. + * @param {import("./Feature.js").ReadOptions} [opt_options] Read options. * @return {import("../geom/Geometry.js").default} Geometry. * @api */ @@ -95,7 +95,7 @@ class TextFeature extends FeatureFormat { /** * @abstract * @param {string} text Text. - * @param {import("./Feature.js").ReadOptions=} opt_options Read options. + * @param {import("./Feature.js").ReadOptions} [opt_options] Read options. * @protected * @return {import("../geom/Geometry.js").default} Geometry. */ @@ -127,7 +127,7 @@ class TextFeature extends FeatureFormat { * Encode a feature as a string. * * @param {import("../Feature.js").default} feature Feature. - * @param {import("./Feature.js").WriteOptions=} opt_options Write options. + * @param {import("./Feature.js").WriteOptions} [opt_options] Write options. * @return {string} Encoded feature. * @api */ @@ -138,7 +138,7 @@ class TextFeature extends FeatureFormat { /** * @abstract * @param {import("../Feature.js").default} feature Features. - * @param {import("./Feature.js").WriteOptions=} opt_options Write options. + * @param {import("./Feature.js").WriteOptions} [opt_options] Write options. * @protected * @return {string} Text. */ @@ -150,7 +150,7 @@ class TextFeature extends FeatureFormat { * Encode an array of features as string. * * @param {Array} features Features. - * @param {import("./Feature.js").WriteOptions=} opt_options Write options. + * @param {import("./Feature.js").WriteOptions} [opt_options] Write options. * @return {string} Encoded features. * @api */ @@ -161,7 +161,7 @@ class TextFeature extends FeatureFormat { /** * @abstract * @param {Array} features Features. - * @param {import("./Feature.js").WriteOptions=} opt_options Write options. + * @param {import("./Feature.js").WriteOptions} [opt_options] Write options. * @protected * @return {string} Text. */ @@ -173,7 +173,7 @@ class TextFeature extends FeatureFormat { * Write a single geometry. * * @param {import("../geom/Geometry.js").default} geometry Geometry. - * @param {import("./Feature.js").WriteOptions=} opt_options Write options. + * @param {import("./Feature.js").WriteOptions} [opt_options] Write options. * @return {string} Geometry. * @api */ @@ -184,7 +184,7 @@ class TextFeature extends FeatureFormat { /** * @abstract * @param {import("../geom/Geometry.js").default} geometry Geometry. - * @param {import("./Feature.js").WriteOptions=} opt_options Write options. + * @param {import("./Feature.js").WriteOptions} [opt_options] Write options. * @protected * @return {string} Text. */ diff --git a/src/ol/format/TopoJSON.js b/src/ol/format/TopoJSON.js index 0c3178c053..ede0944c52 100644 --- a/src/ol/format/TopoJSON.js +++ b/src/ol/format/TopoJSON.js @@ -56,7 +56,7 @@ import {transformGeometryWithOptions} from './Feature.js'; */ class TopoJSON extends JSONFeature { /** - * @param {Options=} opt_options Options. + * @param {Options} [opt_options] Options. */ constructor(opt_options) { super(); @@ -85,7 +85,7 @@ class TopoJSON extends JSONFeature { /** * @param {Object} object Object. - * @param {import("./Feature.js").ReadOptions=} opt_options Read options. + * @param {import("./Feature.js").ReadOptions} [opt_options] Read options. * @protected * @return {Array} Features. */ @@ -318,7 +318,7 @@ function readMultiPolygonGeometry(object, arcs) { * @param {string|undefined} property Property to set the `GeometryCollection`'s parent * object to. * @param {string} name Name of the `Topology`'s child object. - * @param {import("./Feature.js").ReadOptions=} opt_options Read options. + * @param {import("./Feature.js").ReadOptions} [opt_options] Read options. * @return {Array} Array of features. */ function readFeaturesFromGeometryCollection( @@ -356,7 +356,7 @@ function readFeaturesFromGeometryCollection( * @param {string|undefined} property Property to set the `GeometryCollection`'s parent * object to. * @param {string} name Name of the `Topology`'s child object. - * @param {import("./Feature.js").ReadOptions=} opt_options Read options. + * @param {import("./Feature.js").ReadOptions} [opt_options] Read options. * @return {Feature} Feature. */ function readFeatureFromGeometry( diff --git a/src/ol/format/WFS.js b/src/ol/format/WFS.js index e089dcedce..a358f0ce77 100644 --- a/src/ol/format/WFS.js +++ b/src/ol/format/WFS.js @@ -266,7 +266,7 @@ const DEFAULT_VERSION = '1.1.0'; */ class WFS extends XMLFeature { /** - * @param {Options=} opt_options Optional configuration object. + * @param {Options} [opt_options] Optional configuration object. */ constructor(opt_options) { super(); @@ -325,7 +325,7 @@ class WFS extends XMLFeature { /** * @protected * @param {Element} node Node. - * @param {import("./Feature.js").ReadOptions=} opt_options Options. + * @param {import("./Feature.js").ReadOptions} [opt_options] Options. * @return {Array} Features. */ readFeaturesFromNode(node, opt_options) { @@ -563,9 +563,9 @@ class WFS extends XMLFeature { * * @param {!string} geometryName Geometry name to use. * @param {!import("../extent.js").Extent} extent Extent. - * @param {string=} opt_srsName SRS name. No srsName attribute will be + * @param {string} [opt_srsName] SRS name. No srsName attribute will be * set on geometries when this is not provided. - * @param {import("./filter/Filter.js").default=} opt_filter Filter condition. + * @param {import("./filter/Filter.js").default} [opt_filter] Filter condition. * @return {import("./filter/Filter.js").default} The filter. */ combineBboxAndFilter(geometryName, extent, opt_srsName, opt_filter) { diff --git a/src/ol/format/WKT.js b/src/ol/format/WKT.js index 6f91b1e2bc..f2ee8ebc9f 100644 --- a/src/ol/format/WKT.js +++ b/src/ol/format/WKT.js @@ -117,7 +117,7 @@ class Lexer { /** * @param {string} c Character. - * @param {boolean=} opt_decimal Whether the string number + * @param {boolean} [opt_decimal] Whether the string number * contains a dot, i.e. is a decimal number. * @return {boolean} Whether the character is numeric. * @private @@ -604,7 +604,7 @@ class Parser { */ class WKT extends TextFeature { /** - * @param {Options=} opt_options Options. + * @param {Options} [opt_options] Options. */ constructor(opt_options) { super(); @@ -636,7 +636,7 @@ class WKT extends TextFeature { /** * @protected * @param {string} text Text. - * @param {import("./Feature.js").ReadOptions=} opt_options Read options. + * @param {import("./Feature.js").ReadOptions} [opt_options] Read options. * @return {import("../Feature.js").default} Feature. */ readFeatureFromText(text, opt_options) { @@ -651,7 +651,7 @@ class WKT extends TextFeature { /** * @param {string} text Text. - * @param {import("./Feature.js").ReadOptions=} opt_options Read options. + * @param {import("./Feature.js").ReadOptions} [opt_options] Read options. * @protected * @return {Array} Features. */ @@ -677,7 +677,7 @@ class WKT extends TextFeature { /** * @param {string} text Text. - * @param {import("./Feature.js").ReadOptions=} opt_options Read options. + * @param {import("./Feature.js").ReadOptions} [opt_options] Read options. * @protected * @return {import("../geom/Geometry.js").default} Geometry. */ @@ -692,7 +692,7 @@ class WKT extends TextFeature { /** * @param {import("../Feature.js").default} feature Features. - * @param {import("./Feature.js").WriteOptions=} opt_options Write options. + * @param {import("./Feature.js").WriteOptions} [opt_options] Write options. * @protected * @return {string} Text. */ @@ -706,7 +706,7 @@ class WKT extends TextFeature { /** * @param {Array} features Features. - * @param {import("./Feature.js").WriteOptions=} opt_options Write options. + * @param {import("./Feature.js").WriteOptions} [opt_options] Write options. * @protected * @return {string} Text. */ @@ -724,7 +724,7 @@ class WKT extends TextFeature { /** * @param {import("../geom/Geometry.js").default} geometry Geometry. - * @param {import("./Feature.js").WriteOptions=} opt_options Write options. + * @param {import("./Feature.js").WriteOptions} [opt_options] Write options. * @protected * @return {string} Text. */ diff --git a/src/ol/format/WMSGetFeatureInfo.js b/src/ol/format/WMSGetFeatureInfo.js index 1aa6ae6958..b1e2f97658 100644 --- a/src/ol/format/WMSGetFeatureInfo.js +++ b/src/ol/format/WMSGetFeatureInfo.js @@ -33,7 +33,7 @@ const layerIdentifier = '_layer'; */ class WMSGetFeatureInfo extends XMLFeature { /** - * @param {Options=} opt_options Options. + * @param {Options} [opt_options] Options. */ constructor(opt_options) { super(); @@ -151,7 +151,7 @@ class WMSGetFeatureInfo extends XMLFeature { /** * @protected * @param {Element} node Node. - * @param {import("./Feature.js").ReadOptions=} opt_options Options. + * @param {import("./Feature.js").ReadOptions} [opt_options] Options. * @return {Array} Features. */ readFeaturesFromNode(node, opt_options) { diff --git a/src/ol/format/XMLFeature.js b/src/ol/format/XMLFeature.js index e2a8539fef..9dc05efe40 100644 --- a/src/ol/format/XMLFeature.js +++ b/src/ol/format/XMLFeature.js @@ -37,7 +37,7 @@ class XMLFeature extends FeatureFormat { * Read a single feature. * * @param {Document|Element|Object|string} source Source. - * @param {import("./Feature.js").ReadOptions=} opt_options Read options. + * @param {import("./Feature.js").ReadOptions} [opt_options] Read options. * @return {import("../Feature.js").default} Feature. * @api */ @@ -62,7 +62,7 @@ class XMLFeature extends FeatureFormat { /** * @param {Document} doc Document. - * @param {import("./Feature.js").ReadOptions=} opt_options Options. + * @param {import("./Feature.js").ReadOptions} [opt_options] Options. * @return {import("../Feature.js").default} Feature. */ readFeatureFromDocument(doc, opt_options) { @@ -76,7 +76,7 @@ class XMLFeature extends FeatureFormat { /** * @param {Element} node Node. - * @param {import("./Feature.js").ReadOptions=} opt_options Options. + * @param {import("./Feature.js").ReadOptions} [opt_options] Options. * @return {import("../Feature.js").default} Feature. */ readFeatureFromNode(node, opt_options) { @@ -87,7 +87,7 @@ class XMLFeature extends FeatureFormat { * Read all features from a feature collection. * * @param {Document|Element|Object|string} source Source. - * @param {import("./Feature.js").ReadOptions=} opt_options Options. + * @param {import("./Feature.js").ReadOptions} [opt_options] Options. * @return {Array} Features. * @api */ @@ -112,7 +112,7 @@ class XMLFeature extends FeatureFormat { /** * @param {Document} doc Document. - * @param {import("./Feature.js").ReadOptions=} opt_options Options. + * @param {import("./Feature.js").ReadOptions} [opt_options] Options. * @protected * @return {Array} Features. */ @@ -133,7 +133,7 @@ class XMLFeature extends FeatureFormat { /** * @abstract * @param {Element} node Node. - * @param {import("./Feature.js").ReadOptions=} opt_options Options. + * @param {import("./Feature.js").ReadOptions} [opt_options] Options. * @protected * @return {Array} Features. */ @@ -145,7 +145,7 @@ class XMLFeature extends FeatureFormat { * Read a single geometry from a source. * * @param {Document|Element|Object|string} source Source. - * @param {import("./Feature.js").ReadOptions=} opt_options Read options. + * @param {import("./Feature.js").ReadOptions} [opt_options] Read options. * @return {import("../geom/Geometry.js").default} Geometry. */ readGeometry(source, opt_options) { @@ -169,7 +169,7 @@ class XMLFeature extends FeatureFormat { /** * @param {Document} doc Document. - * @param {import("./Feature.js").ReadOptions=} opt_options Options. + * @param {import("./Feature.js").ReadOptions} [opt_options] Options. * @protected * @return {import("../geom/Geometry.js").default} Geometry. */ @@ -179,7 +179,7 @@ class XMLFeature extends FeatureFormat { /** * @param {Element} node Node. - * @param {import("./Feature.js").ReadOptions=} opt_options Options. + * @param {import("./Feature.js").ReadOptions} [opt_options] Options. * @protected * @return {import("../geom/Geometry.js").default} Geometry. */ @@ -229,7 +229,7 @@ class XMLFeature extends FeatureFormat { * Encode a feature as string. * * @param {import("../Feature.js").default} feature Feature. - * @param {import("./Feature.js").WriteOptions=} opt_options Write options. + * @param {import("./Feature.js").WriteOptions} [opt_options] Write options. * @return {string} Encoded feature. */ writeFeature(feature, opt_options) { @@ -239,7 +239,7 @@ class XMLFeature extends FeatureFormat { /** * @param {import("../Feature.js").default} feature Feature. - * @param {import("./Feature.js").WriteOptions=} opt_options Options. + * @param {import("./Feature.js").WriteOptions} [opt_options] Options. * @protected * @return {Node} Node. */ @@ -251,7 +251,7 @@ class XMLFeature extends FeatureFormat { * Encode an array of features as string. * * @param {Array} features Features. - * @param {import("./Feature.js").WriteOptions=} opt_options Write options. + * @param {import("./Feature.js").WriteOptions} [opt_options] Write options. * @return {string} Result. * @api */ @@ -262,7 +262,7 @@ class XMLFeature extends FeatureFormat { /** * @param {Array} features Features. - * @param {import("./Feature.js").WriteOptions=} opt_options Options. + * @param {import("./Feature.js").WriteOptions} [opt_options] Options. * @return {Node} Node. */ writeFeaturesNode(features, opt_options) { @@ -273,7 +273,7 @@ class XMLFeature extends FeatureFormat { * Encode a geometry as string. * * @param {import("../geom/Geometry.js").default} geometry Geometry. - * @param {import("./Feature.js").WriteOptions=} opt_options Write options. + * @param {import("./Feature.js").WriteOptions} [opt_options] Write options. * @return {string} Encoded geometry. */ writeGeometry(geometry, opt_options) { @@ -283,7 +283,7 @@ class XMLFeature extends FeatureFormat { /** * @param {import("../geom/Geometry.js").default} geometry Geometry. - * @param {import("./Feature.js").WriteOptions=} opt_options Options. + * @param {import("./Feature.js").WriteOptions} [opt_options] Options. * @return {Node} Node. */ writeGeometryNode(geometry, opt_options) { diff --git a/src/ol/format/filter.js b/src/ol/format/filter.js index d7ba483c5a..c44f97a774 100644 --- a/src/ol/format/filter.js +++ b/src/ol/format/filter.js @@ -63,7 +63,7 @@ export function not(condition) { * * @param {!string} geometryName Geometry name to use. * @param {!import("../extent.js").Extent} extent Extent. - * @param {string=} opt_srsName SRS name. No srsName attribute will be + * @param {string} [opt_srsName] SRS name. No srsName attribute will be * set on geometries when this is not provided. * @return {!Bbox} `` operator. * @api @@ -78,7 +78,7 @@ export function bbox(geometryName, extent, opt_srsName) { * * @param {!string} geometryName Geometry name to use. * @param {!import("../geom/Geometry.js").default} geometry Geometry. - * @param {string=} opt_srsName SRS name. No srsName attribute will be + * @param {string} [opt_srsName] SRS name. No srsName attribute will be * set on geometries when this is not provided. * @return {!Contains} `` operator. * @api @@ -93,7 +93,7 @@ export function contains(geometryName, geometry, opt_srsName) { * * @param {!string} geometryName Geometry name to use. * @param {!import("../geom/Geometry.js").default} geometry Geometry. - * @param {string=} opt_srsName SRS name. No srsName attribute will be + * @param {string} [opt_srsName] SRS name. No srsName attribute will be * set on geometries when this is not provided. * @return {!Intersects} `` operator. * @api @@ -108,7 +108,7 @@ export function intersects(geometryName, geometry, opt_srsName) { * * @param {!string} geometryName Geometry name to use. * @param {!import("../geom/Geometry.js").default} geometry Geometry. - * @param {string=} opt_srsName SRS name. No srsName attribute will be + * @param {string} [opt_srsName] SRS name. No srsName attribute will be * set on geometries when this is not provided. * @return {!Disjoint} `` operator. * @api @@ -123,7 +123,7 @@ export function disjoint(geometryName, geometry, opt_srsName) { * * @param {!string} geometryName Geometry name to use. * @param {!import("../geom/Geometry.js").default} geometry Geometry. - * @param {string=} opt_srsName SRS name. No srsName attribute will be + * @param {string} [opt_srsName] SRS name. No srsName attribute will be * set on geometries when this is not provided. * @return {!Within} `` operator. * @api @@ -140,7 +140,7 @@ export function within(geometryName, geometry, opt_srsName) { * @param {!import("../geom/Geometry.js").default} geometry Geometry. * @param {!number} distance Distance. * @param {!string} unit Unit. - * @param {string=} opt_srsName SRS name. No srsName attribute will be + * @param {string} [opt_srsName] SRS name. No srsName attribute will be * set on geometries when this is not provided. * @return {!DWithin} `` operator. * @api @@ -154,7 +154,7 @@ export function dwithin(geometryName, geometry, distance, unit, opt_srsName) { * * @param {!string} propertyName Name of the context property to compare. * @param {!(string|number)} expression The value to compare. - * @param {boolean=} opt_matchCase Case-sensitive? + * @param {boolean} [opt_matchCase] Case-sensitive? * @return {!EqualTo} `` operator. * @api */ @@ -167,7 +167,7 @@ export function equalTo(propertyName, expression, opt_matchCase) { * * @param {!string} propertyName Name of the context property to compare. * @param {!(string|number)} expression The value to compare. - * @param {boolean=} opt_matchCase Case-sensitive? + * @param {boolean} [opt_matchCase] Case-sensitive? * @return {!NotEqualTo} `` operator. * @api */ @@ -255,13 +255,13 @@ export function between(propertyName, lowerBoundary, upperBoundary) { * * @param {!string} propertyName Name of the context property to compare. * @param {!string} pattern Text pattern. - * @param {string=} opt_wildCard Pattern character which matches any sequence of + * @param {string} [opt_wildCard] Pattern character which matches any sequence of * zero or more string characters. Default is '*'. - * @param {string=} opt_singleChar pattern character which matches any single + * @param {string} [opt_singleChar] pattern character which matches any single * string character. Default is '.'. - * @param {string=} opt_escapeChar Escape character which can be used to escape + * @param {string} [opt_escapeChar] Escape character which can be used to escape * the pattern characters. Default is '!'. - * @param {boolean=} opt_matchCase Case-sensitive? + * @param {boolean} [opt_matchCase] Case-sensitive? * @return {!IsLike} `` operator. * @api */ diff --git a/src/ol/format/filter/Bbox.js b/src/ol/format/filter/Bbox.js index 1e3d899f6d..c8273c0e92 100644 --- a/src/ol/format/filter/Bbox.js +++ b/src/ol/format/filter/Bbox.js @@ -14,7 +14,7 @@ class Bbox extends Filter { /** * @param {!string} geometryName Geometry name to use. * @param {!import("../../extent.js").Extent} extent Extent. - * @param {string=} opt_srsName SRS name. No srsName attribute will be set + * @param {string} [opt_srsName] SRS name. No srsName attribute will be set * on geometries when this is not provided. */ constructor(geometryName, extent, opt_srsName) { diff --git a/src/ol/format/filter/ComparisonBinary.js b/src/ol/format/filter/ComparisonBinary.js index e1c4b8c2b0..1d86883497 100644 --- a/src/ol/format/filter/ComparisonBinary.js +++ b/src/ol/format/filter/ComparisonBinary.js @@ -15,7 +15,7 @@ class ComparisonBinary extends Comparison { * @param {!string} tagName The XML tag name for this filter. * @param {!string} propertyName Name of the context property to compare. * @param {!(string|number)} expression The value to compare. - * @param {boolean=} opt_matchCase Case-sensitive? + * @param {boolean} [opt_matchCase] Case-sensitive? */ constructor(tagName, propertyName, expression, opt_matchCase) { super(tagName, propertyName); diff --git a/src/ol/format/filter/Contains.js b/src/ol/format/filter/Contains.js index 408dc2659f..f06f33d098 100644 --- a/src/ol/format/filter/Contains.js +++ b/src/ol/format/filter/Contains.js @@ -13,7 +13,7 @@ class Contains extends Spatial { /** * @param {!string} geometryName Geometry name to use. * @param {!import("../../geom/Geometry.js").default} geometry Geometry. - * @param {string=} opt_srsName SRS name. No srsName attribute will be + * @param {string} [opt_srsName] SRS name. No srsName attribute will be * set on geometries when this is not provided. */ constructor(geometryName, geometry, opt_srsName) { diff --git a/src/ol/format/filter/DWithin.js b/src/ol/format/filter/DWithin.js index 7ecc8c1510..9e1f54b0ab 100644 --- a/src/ol/format/filter/DWithin.js +++ b/src/ol/format/filter/DWithin.js @@ -15,7 +15,7 @@ class DWithin extends Spatial { * @param {!import("../../geom/Geometry.js").default} geometry Geometry. * @param {!number} distance Distance. * @param {!string} unit Unit. - * @param {string=} opt_srsName SRS name. No srsName attribute will be + * @param {string} [opt_srsName] SRS name. No srsName attribute will be * set on geometries when this is not provided. */ constructor(geometryName, geometry, distance, unit, opt_srsName) { diff --git a/src/ol/format/filter/Disjoint.js b/src/ol/format/filter/Disjoint.js index a3601c55a2..80c8895d2c 100644 --- a/src/ol/format/filter/Disjoint.js +++ b/src/ol/format/filter/Disjoint.js @@ -13,7 +13,7 @@ class Disjoint extends Spatial { /** * @param {!string} geometryName Geometry name to use. * @param {!import("../../geom/Geometry.js").default} geometry Geometry. - * @param {string=} opt_srsName SRS name. No srsName attribute will be + * @param {string} [opt_srsName] SRS name. No srsName attribute will be * set on geometries when this is not provided. */ constructor(geometryName, geometry, opt_srsName) { diff --git a/src/ol/format/filter/EqualTo.js b/src/ol/format/filter/EqualTo.js index 7134883671..1ad14c3d77 100644 --- a/src/ol/format/filter/EqualTo.js +++ b/src/ol/format/filter/EqualTo.js @@ -12,7 +12,7 @@ class EqualTo extends ComparisonBinary { /** * @param {!string} propertyName Name of the context property to compare. * @param {!(string|number)} expression The value to compare. - * @param {boolean=} opt_matchCase Case-sensitive? + * @param {boolean} [opt_matchCase] Case-sensitive? */ constructor(propertyName, expression, opt_matchCase) { super('PropertyIsEqualTo', propertyName, expression, opt_matchCase); diff --git a/src/ol/format/filter/Intersects.js b/src/ol/format/filter/Intersects.js index db74c2bcc1..b80a704e2f 100644 --- a/src/ol/format/filter/Intersects.js +++ b/src/ol/format/filter/Intersects.js @@ -13,7 +13,7 @@ class Intersects extends Spatial { /** * @param {!string} geometryName Geometry name to use. * @param {!import("../../geom/Geometry.js").default} geometry Geometry. - * @param {string=} opt_srsName SRS name. No srsName attribute will be + * @param {string} [opt_srsName] SRS name. No srsName attribute will be * set on geometries when this is not provided. */ constructor(geometryName, geometry, opt_srsName) { diff --git a/src/ol/format/filter/IsLike.js b/src/ol/format/filter/IsLike.js index 666cfafc07..49e5c44268 100644 --- a/src/ol/format/filter/IsLike.js +++ b/src/ol/format/filter/IsLike.js @@ -13,13 +13,13 @@ class IsLike extends Comparison { * [constructor description] * @param {!string} propertyName Name of the context property to compare. * @param {!string} pattern Text pattern. - * @param {string=} opt_wildCard Pattern character which matches any sequence of + * @param {string} [opt_wildCard] Pattern character which matches any sequence of * zero or more string characters. Default is '*'. - * @param {string=} opt_singleChar pattern character which matches any single + * @param {string} [opt_singleChar] pattern character which matches any single * string character. Default is '.'. - * @param {string=} opt_escapeChar Escape character which can be used to escape + * @param {string} [opt_escapeChar] Escape character which can be used to escape * the pattern characters. Default is '!'. - * @param {boolean=} opt_matchCase Case-sensitive? + * @param {boolean} [opt_matchCase] Case-sensitive? */ constructor( propertyName, diff --git a/src/ol/format/filter/NotEqualTo.js b/src/ol/format/filter/NotEqualTo.js index 66e34a3eb6..f9923c97b8 100644 --- a/src/ol/format/filter/NotEqualTo.js +++ b/src/ol/format/filter/NotEqualTo.js @@ -12,7 +12,7 @@ class NotEqualTo extends ComparisonBinary { /** * @param {!string} propertyName Name of the context property to compare. * @param {!(string|number)} expression The value to compare. - * @param {boolean=} opt_matchCase Case-sensitive? + * @param {boolean} [opt_matchCase] Case-sensitive? */ constructor(propertyName, expression, opt_matchCase) { super('PropertyIsNotEqualTo', propertyName, expression, opt_matchCase); diff --git a/src/ol/format/filter/Spatial.js b/src/ol/format/filter/Spatial.js index b978333c7f..7fd5affe0e 100644 --- a/src/ol/format/filter/Spatial.js +++ b/src/ol/format/filter/Spatial.js @@ -16,7 +16,7 @@ class Spatial extends Filter { * @param {!string} tagName The XML tag name for this filter. * @param {!string} geometryName Geometry name to use. * @param {!import("../../geom/Geometry.js").default} geometry Geometry. - * @param {string=} opt_srsName SRS name. No srsName attribute will be + * @param {string} [opt_srsName] SRS name. No srsName attribute will be * set on geometries when this is not provided. */ constructor(tagName, geometryName, geometry, opt_srsName) { diff --git a/src/ol/format/filter/Within.js b/src/ol/format/filter/Within.js index 5ee73102ed..4c51282a3c 100644 --- a/src/ol/format/filter/Within.js +++ b/src/ol/format/filter/Within.js @@ -13,7 +13,7 @@ class Within extends Spatial { /** * @param {!string} geometryName Geometry name to use. * @param {!import("../../geom/Geometry.js").default} geometry Geometry. - * @param {string=} opt_srsName SRS name. No srsName attribute will be + * @param {string} [opt_srsName] SRS name. No srsName attribute will be * set on geometries when this is not provided. */ constructor(geometryName, geometry, opt_srsName) { diff --git a/src/ol/geom/Circle.js b/src/ol/geom/Circle.js index b120e0873d..0a70180d4c 100644 --- a/src/ol/geom/Circle.js +++ b/src/ol/geom/Circle.js @@ -18,8 +18,8 @@ class Circle extends SimpleGeometry { * @param {!import("../coordinate.js").Coordinate} center Center. * For internal use, flat coordinates in combination with `opt_layout` and no * `opt_radius` are also accepted. - * @param {number=} opt_radius Radius. - * @param {import("./GeometryLayout.js").default=} opt_layout Layout. + * @param {number} [opt_radius] Radius. + * @param {import("./GeometryLayout.js").default} [opt_layout] Layout. */ constructor(center, opt_radius, opt_layout) { super(); @@ -189,7 +189,7 @@ class Circle extends SimpleGeometry { * number) of the circle. * @param {!import("../coordinate.js").Coordinate} center Center. * @param {number} radius Radius. - * @param {import("./GeometryLayout.js").default=} opt_layout Layout. + * @param {import("./GeometryLayout.js").default} [opt_layout] Layout. * @api */ setCenterAndRadius(center, radius, opt_layout) { diff --git a/src/ol/geom/Geometry.js b/src/ol/geom/Geometry.js index e7d7cd26f0..3d19052f86 100644 --- a/src/ol/geom/Geometry.js +++ b/src/ol/geom/Geometry.js @@ -135,7 +135,7 @@ class Geometry extends BaseObject { * Return the closest point of the geometry to the passed point as * {@link module:ol/coordinate~Coordinate coordinate}. * @param {import("../coordinate.js").Coordinate} point Point. - * @param {import("../coordinate.js").Coordinate=} opt_closestPoint Closest point. + * @param {import("../coordinate.js").Coordinate} [opt_closestPoint] Closest point. * @return {import("../coordinate.js").Coordinate} Closest point. * @api */ @@ -168,7 +168,7 @@ class Geometry extends BaseObject { /** * Get the extent of the geometry. - * @param {import("../extent.js").Extent=} opt_extent Extent. + * @param {import("../extent.js").Extent} [opt_extent] Extent. * @return {import("../extent.js").Extent} extent Extent. * @api */ @@ -200,8 +200,8 @@ class Geometry extends BaseObject { * coordinates in place. * @abstract * @param {number} sx The scaling factor in the x-direction. - * @param {number=} opt_sy The scaling factor in the y-direction (defaults to sx). - * @param {import("../coordinate.js").Coordinate=} opt_anchor The scale origin (defaults to the center + * @param {number} [opt_sy] The scaling factor in the y-direction (defaults to sx). + * @param {import("../coordinate.js").Coordinate} [opt_anchor] The scale origin (defaults to the center * of the geometry extent). * @api */ diff --git a/src/ol/geom/GeometryCollection.js b/src/ol/geom/GeometryCollection.js index f18a6500fe..c41cc79045 100644 --- a/src/ol/geom/GeometryCollection.js +++ b/src/ol/geom/GeometryCollection.js @@ -20,7 +20,7 @@ import {listen, unlistenByKey} from '../events.js'; */ class GeometryCollection extends Geometry { /** - * @param {Array=} opt_geometries Geometries. + * @param {Array} [opt_geometries] Geometries. */ constructor(opt_geometries) { super(); @@ -255,8 +255,8 @@ class GeometryCollection extends Geometry { * coordinates in place. * @abstract * @param {number} sx The scaling factor in the x-direction. - * @param {number=} opt_sy The scaling factor in the y-direction (defaults to sx). - * @param {import("../coordinate.js").Coordinate=} opt_anchor The scale origin (defaults to the center + * @param {number} [opt_sy] The scaling factor in the y-direction (defaults to sx). + * @param {import("../coordinate.js").Coordinate} [opt_anchor] The scale origin (defaults to the center * of the geometry extent). * @api */ diff --git a/src/ol/geom/LineString.js b/src/ol/geom/LineString.js index 4bbee3069c..8f340fc27f 100644 --- a/src/ol/geom/LineString.js +++ b/src/ol/geom/LineString.js @@ -25,7 +25,7 @@ class LineString extends SimpleGeometry { /** * @param {Array|Array} coordinates Coordinates. * For internal use, flat coordinates in combination with `opt_layout` are also accepted. - * @param {import("./GeometryLayout.js").default=} opt_layout Layout. + * @param {import("./GeometryLayout.js").default} [opt_layout] Layout. */ constructor(coordinates, opt_layout) { super(); @@ -163,7 +163,7 @@ class LineString extends SimpleGeometry { * return the last coordinate. * * @param {number} m M. - * @param {boolean=} opt_extrapolate Extrapolate. Default is `false`. + * @param {boolean} [opt_extrapolate] Extrapolate. Default is `false`. * @return {import("../coordinate.js").Coordinate} Coordinate. * @api */ @@ -204,7 +204,7 @@ class LineString extends SimpleGeometry { * The `fraction` is a number between 0 and 1, where 0 is the start of the * linestring and 1 is the end. * @param {number} fraction Fraction. - * @param {import("../coordinate.js").Coordinate=} opt_dest Optional coordinate whose values will + * @param {import("../coordinate.js").Coordinate} [opt_dest] Optional coordinate whose values will * be modified. If not provided, a new coordinate will be returned. * @return {import("../coordinate.js").Coordinate} Coordinate of the interpolated point. * @api @@ -293,7 +293,7 @@ class LineString extends SimpleGeometry { /** * Set the coordinates of the linestring. * @param {!Array} coordinates Coordinates. - * @param {import("./GeometryLayout.js").default=} opt_layout Layout. + * @param {import("./GeometryLayout.js").default} [opt_layout] Layout. * @api */ setCoordinates(coordinates, opt_layout) { diff --git a/src/ol/geom/LinearRing.js b/src/ol/geom/LinearRing.js index 0c4de89059..f7618e619f 100644 --- a/src/ol/geom/LinearRing.js +++ b/src/ol/geom/LinearRing.js @@ -22,7 +22,7 @@ class LinearRing extends SimpleGeometry { /** * @param {Array|Array} coordinates Coordinates. * For internal use, flat coordinates in combination with `opt_layout` are also accepted. - * @param {import("./GeometryLayout.js").default=} opt_layout Layout. + * @param {import("./GeometryLayout.js").default} [opt_layout] Layout. */ constructor(coordinates, opt_layout) { super(); @@ -167,7 +167,7 @@ class LinearRing extends SimpleGeometry { /** * Set the coordinates of the linear ring. * @param {!Array} coordinates Coordinates. - * @param {import("./GeometryLayout.js").default=} opt_layout Layout. + * @param {import("./GeometryLayout.js").default} [opt_layout] Layout. * @api */ setCoordinates(coordinates, opt_layout) { diff --git a/src/ol/geom/MultiLineString.js b/src/ol/geom/MultiLineString.js index 61901868b0..d4f712c2be 100644 --- a/src/ol/geom/MultiLineString.js +++ b/src/ol/geom/MultiLineString.js @@ -28,8 +28,8 @@ class MultiLineString extends SimpleGeometry { * @param {Array|LineString>|Array} coordinates * Coordinates or LineString geometries. (For internal use, flat coordinates in * combination with `opt_layout` and `opt_ends` are also accepted.) - * @param {import("./GeometryLayout.js").default=} opt_layout Layout. - * @param {Array=} opt_ends Flat coordinate ends for internal use. + * @param {import("./GeometryLayout.js").default} [opt_layout] Layout. + * @param {Array} [opt_ends] Flat coordinate ends for internal use. */ constructor(coordinates, opt_layout, opt_ends) { super(); @@ -165,8 +165,8 @@ class MultiLineString extends SimpleGeometry { * LineStrings. * * @param {number} m M. - * @param {boolean=} opt_extrapolate Extrapolate. Default is `false`. - * @param {boolean=} opt_interpolate Interpolate. Default is `false`. + * @param {boolean} [opt_extrapolate] Extrapolate. Default is `false`. + * @param {boolean} [opt_interpolate] Interpolate. Default is `false`. * @return {import("../coordinate.js").Coordinate} Coordinate. * @api */ @@ -332,7 +332,7 @@ class MultiLineString extends SimpleGeometry { /** * Set the coordinates of the multilinestring. * @param {!Array>} coordinates Coordinates. - * @param {GeometryLayout=} opt_layout Layout. + * @param {GeometryLayout} [opt_layout] Layout. * @api */ setCoordinates(coordinates, opt_layout) { diff --git a/src/ol/geom/MultiPoint.js b/src/ol/geom/MultiPoint.js index 2f152e66e7..4036c7993d 100644 --- a/src/ol/geom/MultiPoint.js +++ b/src/ol/geom/MultiPoint.js @@ -20,7 +20,7 @@ class MultiPoint extends SimpleGeometry { /** * @param {Array|Array} coordinates Coordinates. * For internal use, flat coordinates in combination with `opt_layout` are also accepted. - * @param {import("./GeometryLayout.js").default=} opt_layout Layout. + * @param {import("./GeometryLayout.js").default} [opt_layout] Layout. */ constructor(coordinates, opt_layout) { super(); @@ -181,7 +181,7 @@ class MultiPoint extends SimpleGeometry { /** * Set the coordinates of the multipoint. * @param {!Array} coordinates Coordinates. - * @param {import("./GeometryLayout.js").default=} opt_layout Layout. + * @param {import("./GeometryLayout.js").default} [opt_layout] Layout. * @api */ setCoordinates(coordinates, opt_layout) { diff --git a/src/ol/geom/MultiPolygon.js b/src/ol/geom/MultiPolygon.js index 0e36511b4b..2c15391d78 100644 --- a/src/ol/geom/MultiPolygon.js +++ b/src/ol/geom/MultiPolygon.js @@ -35,8 +35,8 @@ class MultiPolygon extends SimpleGeometry { /** * @param {Array>|Polygon>|Array} coordinates Coordinates. * For internal use, flat coordinates in combination with `opt_layout` and `opt_endss` are also accepted. - * @param {import("./GeometryLayout.js").default=} opt_layout Layout. - * @param {Array>=} opt_endss Array of ends for internal use with flat coordinates. + * @param {import("./GeometryLayout.js").default} [opt_layout] Layout. + * @param {Array>} [opt_endss] Array of ends for internal use with flat coordinates. */ constructor(coordinates, opt_layout, opt_endss) { super(); @@ -236,7 +236,7 @@ class MultiPolygon extends SimpleGeometry { * Get the coordinate array for this geometry. This array has the structure * of a GeoJSON coordinate array for multi-polygons. * - * @param {boolean=} opt_right Orient coordinates according to the right-hand + * @param {boolean} [opt_right] Orient coordinates according to the right-hand * rule (counter-clockwise for exterior and clockwise for interior rings). * If `false`, coordinates will be oriented according to the left-hand rule * (clockwise for exterior and counter-clockwise for interior rings). @@ -449,7 +449,7 @@ class MultiPolygon extends SimpleGeometry { /** * Set the coordinates of the multipolygon. * @param {!Array>>} coordinates Coordinates. - * @param {import("./GeometryLayout.js").default=} opt_layout Layout. + * @param {import("./GeometryLayout.js").default} [opt_layout] Layout. * @api */ setCoordinates(coordinates, opt_layout) { diff --git a/src/ol/geom/Point.js b/src/ol/geom/Point.js index 3f5801600c..a640affb70 100644 --- a/src/ol/geom/Point.js +++ b/src/ol/geom/Point.js @@ -16,7 +16,7 @@ import {squaredDistance as squaredDx} from '../math.js'; class Point extends SimpleGeometry { /** * @param {import("../coordinate.js").Coordinate} coordinates Coordinates. - * @param {import("./GeometryLayout.js").default=} opt_layout Layout. + * @param {import("./GeometryLayout.js").default} [opt_layout] Layout. */ constructor(coordinates, opt_layout) { super(); @@ -100,7 +100,7 @@ class Point extends SimpleGeometry { /** * @param {!Array<*>} coordinates Coordinates. - * @param {import("./GeometryLayout.js").default=} opt_layout Layout. + * @param {import("./GeometryLayout.js").default} [opt_layout] Layout. * @api */ setCoordinates(coordinates, opt_layout) { diff --git a/src/ol/geom/Polygon.js b/src/ol/geom/Polygon.js index 96b0eb5f1a..cc4785e13e 100644 --- a/src/ol/geom/Polygon.js +++ b/src/ol/geom/Polygon.js @@ -35,8 +35,8 @@ class Polygon extends SimpleGeometry { * an array of vertices' coordinates where the first coordinate and the last are * equivalent. (For internal use, flat coordinates in combination with * `opt_layout` and `opt_ends` are also accepted.) - * @param {import("./GeometryLayout.js").default=} opt_layout Layout. - * @param {Array=} opt_ends Ends (for internal use with flat coordinates). + * @param {import("./GeometryLayout.js").default} [opt_layout] Layout. + * @param {Array} [opt_ends] Ends (for internal use with flat coordinates). */ constructor(coordinates, opt_layout, opt_ends) { super(); @@ -198,7 +198,7 @@ class Polygon extends SimpleGeometry { * Get the coordinate array for this geometry. This array has the structure * of a GeoJSON coordinate array for polygons. * - * @param {boolean=} opt_right Orient coordinates according to the right-hand + * @param {boolean} [opt_right] Orient coordinates according to the right-hand * rule (counter-clockwise for exterior and clockwise for interior rings). * If `false`, coordinates will be oriented according to the left-hand rule * (clockwise for exterior and counter-clockwise for interior rings). @@ -387,7 +387,7 @@ class Polygon extends SimpleGeometry { /** * Set the coordinates of the polygon. * @param {!Array>} coordinates Coordinates. - * @param {import("./GeometryLayout.js").default=} opt_layout Layout. + * @param {import("./GeometryLayout.js").default} [opt_layout] Layout. * @api */ setCoordinates(coordinates, opt_layout) { @@ -414,9 +414,9 @@ export default Polygon; * @param {import("../coordinate.js").Coordinate} center Center (`[lon, lat]` in degrees). * @param {number} radius The great-circle distance from the center to * the polygon vertices in meters. - * @param {number=} opt_n Optional number of vertices for the resulting + * @param {number} [opt_n] Optional number of vertices for the resulting * polygon. Default is `32`. - * @param {number=} opt_sphereRadius Optional radius for the sphere (defaults to + * @param {number} [opt_sphereRadius] Optional radius for the sphere (defaults to * the Earth's mean radius using the WGS84 ellipsoid). * @return {Polygon} The "circular" polygon. * @api @@ -468,8 +468,8 @@ export function fromExtent(extent) { /** * Create a regular polygon from a circle. * @param {import("./Circle.js").default} circle Circle geometry. - * @param {number=} opt_sides Number of sides of the polygon. Default is 32. - * @param {number=} opt_angle Start angle for the first vertex of the polygon in + * @param {number} [opt_sides] Number of sides of the polygon. Default is 32. + * @param {number} [opt_angle] Start angle for the first vertex of the polygon in * counter-clockwise radians. 0 means East. Default is 0. * @return {Polygon} Polygon geometry. * @api @@ -499,7 +499,7 @@ export function fromCircle(circle, opt_sides, opt_angle) { * @param {Polygon} polygon Polygon geometry. * @param {import("../coordinate.js").Coordinate} center Center of the regular polygon. * @param {number} radius Radius of the regular polygon. - * @param {number=} opt_angle Start angle for the first vertex of the polygon in + * @param {number} [opt_angle] Start angle for the first vertex of the polygon in * counter-clockwise radians. 0 means East. Default is 0. */ export function makeRegular(polygon, center, radius, opt_angle) { diff --git a/src/ol/geom/SimpleGeometry.js b/src/ol/geom/SimpleGeometry.js index 7119ebd5d9..87e1c67e2d 100644 --- a/src/ol/geom/SimpleGeometry.js +++ b/src/ol/geom/SimpleGeometry.js @@ -164,7 +164,7 @@ class SimpleGeometry extends Geometry { /** * @abstract * @param {!Array<*>} coordinates Coordinates. - * @param {import("./GeometryLayout.js").default=} opt_layout Layout. + * @param {import("./GeometryLayout.js").default} [opt_layout] Layout. */ setCoordinates(coordinates, opt_layout) { abstract(); @@ -242,8 +242,8 @@ class SimpleGeometry extends Geometry { * Scale the geometry (with an optional origin). This modifies the geometry * coordinates in place. * @param {number} sx The scaling factor in the x-direction. - * @param {number=} opt_sy The scaling factor in the y-direction (defaults to sx). - * @param {import("../coordinate.js").Coordinate=} opt_anchor The scale origin (defaults to the center + * @param {number} [opt_sy] The scaling factor in the y-direction (defaults to sx). + * @param {import("../coordinate.js").Coordinate} [opt_anchor] The scale origin (defaults to the center * of the geometry extent). * @api */ @@ -333,7 +333,7 @@ export function getStrideForLayout(layout) { /** * @param {SimpleGeometry} simpleGeometry Simple geometry. * @param {import("../transform.js").Transform} transform Transform. - * @param {Array=} opt_dest Destination. + * @param {Array} [opt_dest] Destination. * @return {Array} Transformed flat coordinates. */ export function transformGeom2D(simpleGeometry, transform, opt_dest) { diff --git a/src/ol/geom/flat/closest.js b/src/ol/geom/flat/closest.js index c9f5e0242f..247f3e92c6 100644 --- a/src/ol/geom/flat/closest.js +++ b/src/ol/geom/flat/closest.js @@ -138,7 +138,7 @@ export function multiArrayMaxSquaredDelta( * @param {number} y Y. * @param {Array} closestPoint Closest point. * @param {number} minSquaredDistance Minimum squared distance. - * @param {Array=} opt_tmpPoint Temporary point object. + * @param {Array} [opt_tmpPoint] Temporary point object. * @return {number} Minimum squared distance. */ export function assignClosestPoint( @@ -251,7 +251,7 @@ export function assignClosestPoint( * @param {number} y Y. * @param {Array} closestPoint Closest point. * @param {number} minSquaredDistance Minimum squared distance. - * @param {Array=} opt_tmpPoint Temporary point object. + * @param {Array} [opt_tmpPoint] Temporary point object. * @return {number} Minimum squared distance. */ export function assignClosestArrayPoint( @@ -299,7 +299,7 @@ export function assignClosestArrayPoint( * @param {number} y Y. * @param {Array} closestPoint Closest point. * @param {number} minSquaredDistance Minimum squared distance. - * @param {Array=} opt_tmpPoint Temporary point object. + * @param {Array} [opt_tmpPoint] Temporary point object. * @return {number} Minimum squared distance. */ export function assignClosestMultiArrayPoint( diff --git a/src/ol/geom/flat/deflate.js b/src/ol/geom/flat/deflate.js index 00ac60b06d..882f95f1e9 100644 --- a/src/ol/geom/flat/deflate.js +++ b/src/ol/geom/flat/deflate.js @@ -43,7 +43,7 @@ export function deflateCoordinates( * @param {number} offset Offset. * @param {Array>} coordinatess Coordinatess. * @param {number} stride Stride. - * @param {Array=} opt_ends Ends. + * @param {Array} [opt_ends] Ends. * @return {Array} Ends. */ export function deflateCoordinatesArray( @@ -74,7 +74,7 @@ export function deflateCoordinatesArray( * @param {number} offset Offset. * @param {Array>>} coordinatesss Coordinatesss. * @param {number} stride Stride. - * @param {Array>=} opt_endss Endss. + * @param {Array>} [opt_endss] Endss. * @return {Array>} Endss. */ export function deflateMultiCoordinatesArray( diff --git a/src/ol/geom/flat/flip.js b/src/ol/geom/flat/flip.js index af60307a87..e5abcf5992 100644 --- a/src/ol/geom/flat/flip.js +++ b/src/ol/geom/flat/flip.js @@ -7,8 +7,8 @@ * @param {number} offset Offset. * @param {number} end End. * @param {number} stride Stride. - * @param {Array=} opt_dest Destination. - * @param {number=} opt_destOffset Destination offset. + * @param {Array} [opt_dest] Destination. + * @param {number} [opt_destOffset] Destination offset. * @return {Array} Flat coordinates. */ export function flipXY( diff --git a/src/ol/geom/flat/inflate.js b/src/ol/geom/flat/inflate.js index 590cd301f5..774a813fc9 100644 --- a/src/ol/geom/flat/inflate.js +++ b/src/ol/geom/flat/inflate.js @@ -7,7 +7,7 @@ * @param {number} offset Offset. * @param {number} end End. * @param {number} stride Stride. - * @param {Array=} opt_coordinates Coordinates. + * @param {Array} [opt_coordinates] Coordinates. * @return {Array} Coordinates. */ export function inflateCoordinates( @@ -31,7 +31,7 @@ export function inflateCoordinates( * @param {number} offset Offset. * @param {Array} ends Ends. * @param {number} stride Stride. - * @param {Array>=} opt_coordinatess Coordinatess. + * @param {Array>} [opt_coordinatess] Coordinatess. * @return {Array>} Coordinatess. */ export function inflateCoordinatesArray( @@ -63,7 +63,7 @@ export function inflateCoordinatesArray( * @param {number} offset Offset. * @param {Array>} endss Endss. * @param {number} stride Stride. - * @param {Array>>=} opt_coordinatesss + * @param {Array>>} [opt_coordinatesss] * Coordinatesss. * @return {Array>>} Coordinatesss. */ diff --git a/src/ol/geom/flat/interiorpoint.js b/src/ol/geom/flat/interiorpoint.js index 77e2882986..1a158d3e95 100644 --- a/src/ol/geom/flat/interiorpoint.js +++ b/src/ol/geom/flat/interiorpoint.js @@ -13,7 +13,7 @@ import {numberSafeCompareFunction} from '../../array.js'; * @param {number} stride Stride. * @param {Array} flatCenters Flat centers. * @param {number} flatCentersOffset Flat center offset. - * @param {Array=} opt_dest Destination. + * @param {Array} [opt_dest] Destination. * @return {Array} Destination point as XYM coordinate, where M is the * length of the horizontal intersection that the point belongs to. */ diff --git a/src/ol/geom/flat/interpolate.js b/src/ol/geom/flat/interpolate.js index 72f819f78a..d87709ca5e 100644 --- a/src/ol/geom/flat/interpolate.js +++ b/src/ol/geom/flat/interpolate.js @@ -10,8 +10,8 @@ import {lerp} from '../../math.js'; * @param {number} end End. * @param {number} stride Stride. * @param {number} fraction Fraction. - * @param {Array=} opt_dest Destination. - * @param {number=} opt_dimension Destination dimension (default is `2`) + * @param {Array} [opt_dest] Destination. + * @param {number} [opt_dimension] Destination dimension (default is `2`) * @return {Array} Destination. */ export function interpolatePoint( diff --git a/src/ol/geom/flat/orient.js b/src/ol/geom/flat/orient.js index 28b4acdec9..9a580887b1 100644 --- a/src/ol/geom/flat/orient.js +++ b/src/ol/geom/flat/orient.js @@ -38,7 +38,7 @@ export function linearRingIsClockwise(flatCoordinates, offset, end, stride) { * @param {number} offset Offset. * @param {Array} ends Array of end indexes. * @param {number} stride Stride. - * @param {boolean=} opt_right Test for right-hand orientation + * @param {boolean} [opt_right] Test for right-hand orientation * (counter-clockwise exterior ring and clockwise interior rings). * @return {boolean} Rings are correctly oriented. */ @@ -81,7 +81,7 @@ export function linearRingsAreOriented( * @param {number} offset Offset. * @param {Array>} endss Array of array of end indexes. * @param {number} stride Stride. - * @param {boolean=} opt_right Test for right-hand orientation + * @param {boolean} [opt_right] Test for right-hand orientation * (counter-clockwise exterior ring and clockwise interior rings). * @return {boolean} Rings are correctly oriented. */ @@ -116,7 +116,7 @@ export function linearRingssAreOriented( * @param {number} offset Offset. * @param {Array} ends Ends. * @param {number} stride Stride. - * @param {boolean=} opt_right Follow the right-hand rule for orientation. + * @param {boolean} [opt_right] Follow the right-hand rule for orientation. * @return {number} End. */ export function orientLinearRings( @@ -157,7 +157,7 @@ export function orientLinearRings( * @param {number} offset Offset. * @param {Array>} endss Array of array of end indexes. * @param {number} stride Stride. - * @param {boolean=} opt_right Follow the right-hand rule for orientation. + * @param {boolean} [opt_right] Follow the right-hand rule for orientation. * @return {number} End. */ export function orientLinearRingsArray( diff --git a/src/ol/geom/flat/simplify.js b/src/ol/geom/flat/simplify.js index 75fc8b011f..89057a3304 100644 --- a/src/ol/geom/flat/simplify.js +++ b/src/ol/geom/flat/simplify.js @@ -36,7 +36,7 @@ import {squaredDistance, squaredSegmentDistance} from '../../math.js'; * @param {number} stride Stride. * @param {number} squaredTolerance Squared tolerance. * @param {boolean} highQuality Highest quality. - * @param {Array=} opt_simplifiedFlatCoordinates Simplified flat + * @param {Array} [opt_simplifiedFlatCoordinates] Simplified flat * coordinates. * @return {Array} Simplified line string. */ diff --git a/src/ol/geom/flat/transform.js b/src/ol/geom/flat/transform.js index ed33240d45..45096f13c4 100644 --- a/src/ol/geom/flat/transform.js +++ b/src/ol/geom/flat/transform.js @@ -8,7 +8,7 @@ * @param {number} end End. * @param {number} stride Stride. * @param {import("../../transform.js").Transform} transform Transform. - * @param {Array=} opt_dest Destination. + * @param {Array} [opt_dest] Destination. * @return {Array} Transformed coordinates. */ export function transform2D( @@ -40,7 +40,7 @@ export function transform2D( * @param {number} stride Stride. * @param {number} angle Angle. * @param {Array} anchor Rotation anchor point. - * @param {Array=} opt_dest Destination. + * @param {Array} [opt_dest] Destination. * @return {Array} Transformed coordinates. */ export function rotate( @@ -82,7 +82,7 @@ export function rotate( * @param {number} sx Scale factor in the x-direction. * @param {number} sy Scale factor in the y-direction. * @param {Array} anchor Scale anchor point. - * @param {Array=} opt_dest Destination. + * @param {Array} [opt_dest] Destination. * @return {Array} Transformed coordinates. */ export function scale( @@ -121,7 +121,7 @@ export function scale( * @param {number} stride Stride. * @param {number} deltaX Delta X. * @param {number} deltaY Delta Y. - * @param {Array=} opt_dest Destination. + * @param {Array} [opt_dest] Destination. * @return {Array} Transformed coordinates. */ export function translate( diff --git a/src/ol/interaction.js b/src/ol/interaction.js index 285a966c9b..0a6a74380a 100644 --- a/src/ol/interaction.js +++ b/src/ol/interaction.js @@ -75,7 +75,7 @@ export {default as Translate} from './interaction/Translate.js'; * * {@link module:ol/interaction/MouseWheelZoom~MouseWheelZoom} * * {@link module:ol/interaction/DragZoom~DragZoom} * - * @param {DefaultsOptions=} opt_options Defaults options. + * @param {DefaultsOptions} [opt_options] Defaults options. * @return {import("./Collection.js").default} * A collection of interactions to be used with the {@link module:ol/Map~Map} * constructor's `interactions` option. diff --git a/src/ol/interaction/DoubleClickZoom.js b/src/ol/interaction/DoubleClickZoom.js index b73aff9321..bea4c52e3f 100644 --- a/src/ol/interaction/DoubleClickZoom.js +++ b/src/ol/interaction/DoubleClickZoom.js @@ -17,7 +17,7 @@ import MapBrowserEventType from '../MapBrowserEventType.js'; */ class DoubleClickZoom extends Interaction { /** - * @param {Options=} opt_options Options. + * @param {Options} [opt_options] Options. */ constructor(opt_options) { super(); diff --git a/src/ol/interaction/DragAndDrop.js b/src/ol/interaction/DragAndDrop.js index 7c2d433aa0..44bb6aaac4 100644 --- a/src/ol/interaction/DragAndDrop.js +++ b/src/ol/interaction/DragAndDrop.js @@ -45,8 +45,8 @@ export class DragAndDropEvent extends Event { /** * @param {DragAndDropEventType} type Type. * @param {File} file File. - * @param {Array=} opt_features Features. - * @param {import("../proj/Projection.js").default=} opt_projection Projection. + * @param {Array} [opt_features] Features. + * @param {import("../proj/Projection.js").default} [opt_projection] Projection. */ constructor(type, file, opt_features, opt_projection) { super(type); @@ -88,7 +88,7 @@ export class DragAndDropEvent extends Event { */ class DragAndDrop extends Interaction { /** - * @param {Options=} opt_options Options. + * @param {Options} [opt_options] Options. */ constructor(opt_options) { const options = opt_options ? opt_options : {}; diff --git a/src/ol/interaction/DragBox.js b/src/ol/interaction/DragBox.js index b59791da6e..804777da95 100644 --- a/src/ol/interaction/DragBox.js +++ b/src/ol/interaction/DragBox.js @@ -107,7 +107,7 @@ export class DragBoxEvent extends Event { */ class DragBox extends PointerInteraction { /** - * @param {Options=} opt_options Options. + * @param {Options} [opt_options] Options. */ constructor(opt_options) { super(); diff --git a/src/ol/interaction/DragPan.js b/src/ol/interaction/DragPan.js index e4a7d78efc..f13a932751 100644 --- a/src/ol/interaction/DragPan.js +++ b/src/ol/interaction/DragPan.js @@ -34,7 +34,7 @@ import { */ class DragPan extends PointerInteraction { /** - * @param {Options=} opt_options Options. + * @param {Options} [opt_options] Options. */ constructor(opt_options) { super({ diff --git a/src/ol/interaction/DragRotate.js b/src/ol/interaction/DragRotate.js index dfba6b40ee..cb04464fb5 100644 --- a/src/ol/interaction/DragRotate.js +++ b/src/ol/interaction/DragRotate.js @@ -30,7 +30,7 @@ import {disable} from '../rotationconstraint.js'; */ class DragRotate extends PointerInteraction { /** - * @param {Options=} opt_options Options. + * @param {Options} [opt_options] Options. */ constructor(opt_options) { const options = opt_options ? opt_options : {}; diff --git a/src/ol/interaction/DragRotateAndZoom.js b/src/ol/interaction/DragRotateAndZoom.js index f722803537..99bbb5d5e9 100644 --- a/src/ol/interaction/DragRotateAndZoom.js +++ b/src/ol/interaction/DragRotateAndZoom.js @@ -26,7 +26,7 @@ import {mouseOnly, shiftKeyOnly} from '../events/condition.js'; */ class DragRotateAndZoom extends PointerInteraction { /** - * @param {Options=} opt_options Options. + * @param {Options} [opt_options] Options. */ constructor(opt_options) { const options = opt_options ? opt_options : {}; diff --git a/src/ol/interaction/DragZoom.js b/src/ol/interaction/DragZoom.js index 68e3361226..66b8373a51 100644 --- a/src/ol/interaction/DragZoom.js +++ b/src/ol/interaction/DragZoom.js @@ -38,7 +38,7 @@ import {shiftKeyOnly} from '../events/condition.js'; */ class DragZoom extends DragBox { /** - * @param {Options=} opt_options Options. + * @param {Options} [opt_options] Options. */ constructor(opt_options) { const options = opt_options ? opt_options : {}; diff --git a/src/ol/interaction/Draw.js b/src/ol/interaction/Draw.js index 9818d2c223..b547efa42f 100644 --- a/src/ol/interaction/Draw.js +++ b/src/ol/interaction/Draw.js @@ -1140,9 +1140,9 @@ function getDefaultStyleFunction() { * Create a `geometryFunction` for `type: 'Circle'` that will create a regular * polygon with a user specified number of sides and start angle instead of a * `import("../geom/Circle.js").Circle` geometry. - * @param {number=} opt_sides Number of sides of the regular polygon. + * @param {number} [opt_sides] Number of sides of the regular polygon. * Default is 32. - * @param {number=} opt_angle Angle of the first point in counter-clockwise + * @param {number} [opt_angle] Angle of the first point in counter-clockwise * radians. 0 means East. * Default is the angle defined by the heading from the center of the * regular polygon to the current pointer position. diff --git a/src/ol/interaction/Extent.js b/src/ol/interaction/Extent.js index edda36d2b1..9dc85b21c4 100644 --- a/src/ol/interaction/Extent.js +++ b/src/ol/interaction/Extent.js @@ -85,7 +85,7 @@ export class ExtentEvent extends Event { */ class Extent extends PointerInteraction { /** - * @param {Options=} opt_options Options. + * @param {Options} [opt_options] Options. */ constructor(opt_options) { const options = opt_options || {}; diff --git a/src/ol/interaction/Interaction.js b/src/ol/interaction/Interaction.js index 55c3f240c0..284b90aed6 100644 --- a/src/ol/interaction/Interaction.js +++ b/src/ol/interaction/Interaction.js @@ -31,7 +31,7 @@ import {easeOut, linear} from '../easing.js'; */ class Interaction extends BaseObject { /** - * @param {InteractionOptions=} opt_options Options. + * @param {InteractionOptions} [opt_options] Options. */ constructor(opt_options) { super(); @@ -102,7 +102,7 @@ class Interaction extends BaseObject { /** * @param {import("../View.js").default} view View. * @param {import("../coordinate.js").Coordinate} delta Delta. - * @param {number=} opt_duration Duration. + * @param {number} [opt_duration] Duration. */ export function pan(view, delta, opt_duration) { const currentCenter = view.getCenterInternal(); @@ -119,8 +119,8 @@ export function pan(view, delta, opt_duration) { /** * @param {import("../View.js").default} view View. * @param {number} delta Delta from previous zoom level. - * @param {import("../coordinate.js").Coordinate=} opt_anchor Anchor coordinate in the user projection. - * @param {number=} opt_duration Duration. + * @param {import("../coordinate.js").Coordinate} [opt_anchor] Anchor coordinate in the user projection. + * @param {number} [opt_duration] Duration. */ export function zoomByDelta(view, delta, opt_anchor, opt_duration) { const currentZoom = view.getZoom(); diff --git a/src/ol/interaction/KeyboardPan.js b/src/ol/interaction/KeyboardPan.js index d328bb9cee..c7b49917db 100644 --- a/src/ol/interaction/KeyboardPan.js +++ b/src/ol/interaction/KeyboardPan.js @@ -34,7 +34,7 @@ import {rotate as rotateCoordinate} from '../coordinate.js'; */ class KeyboardPan extends Interaction { /** - * @param {Options=} opt_options Options. + * @param {Options} [opt_options] Options. */ constructor(opt_options) { super(); diff --git a/src/ol/interaction/KeyboardZoom.js b/src/ol/interaction/KeyboardZoom.js index 5faf63cb72..9dc139170d 100644 --- a/src/ol/interaction/KeyboardZoom.js +++ b/src/ol/interaction/KeyboardZoom.js @@ -30,7 +30,7 @@ import {targetNotEditable} from '../events/condition.js'; */ class KeyboardZoom extends Interaction { /** - * @param {Options=} opt_options Options. + * @param {Options} [opt_options] Options. */ constructor(opt_options) { super(); diff --git a/src/ol/interaction/Modify.js b/src/ol/interaction/Modify.js index 58b6178553..e42571a09e 100644 --- a/src/ol/interaction/Modify.js +++ b/src/ol/interaction/Modify.js @@ -1100,7 +1100,7 @@ class Modify extends PointerInteraction { /** * @param {import("../pixel.js").Pixel} pixel Pixel * @param {import("../PluggableMap.js").default} map Map. - * @param {import("../coordinate.js").Coordinate=} opt_coordinate The pixel Coordinate. + * @param {import("../coordinate.js").Coordinate} [opt_coordinate] The pixel Coordinate. * @private */ handlePointerAtPixel_(pixel, map, opt_coordinate) { diff --git a/src/ol/interaction/MouseWheelZoom.js b/src/ol/interaction/MouseWheelZoom.js index 8b81933558..2b0d1b912f 100644 --- a/src/ol/interaction/MouseWheelZoom.js +++ b/src/ol/interaction/MouseWheelZoom.js @@ -41,7 +41,7 @@ export const Mode = { */ class MouseWheelZoom extends Interaction { /** - * @param {Options=} opt_options Options. + * @param {Options} [opt_options] Options. */ constructor(opt_options) { const options = opt_options ? opt_options : {}; diff --git a/src/ol/interaction/PinchRotate.js b/src/ol/interaction/PinchRotate.js index ba4848ad06..f971f82bd4 100644 --- a/src/ol/interaction/PinchRotate.js +++ b/src/ol/interaction/PinchRotate.js @@ -22,7 +22,7 @@ import {disable} from '../rotationconstraint.js'; */ class PinchRotate extends PointerInteraction { /** - * @param {Options=} opt_options Options. + * @param {Options} [opt_options] Options. */ constructor(opt_options) { const options = opt_options ? opt_options : {}; diff --git a/src/ol/interaction/PinchZoom.js b/src/ol/interaction/PinchZoom.js index 7a5071921d..4e29acc821 100644 --- a/src/ol/interaction/PinchZoom.js +++ b/src/ol/interaction/PinchZoom.js @@ -19,7 +19,7 @@ import {FALSE} from '../functions.js'; */ class PinchZoom extends PointerInteraction { /** - * @param {Options=} opt_options Options. + * @param {Options} [opt_options] Options. */ constructor(opt_options) { const options = opt_options ? opt_options : {}; diff --git a/src/ol/interaction/Pointer.js b/src/ol/interaction/Pointer.js index 1420269088..a4919e15c1 100644 --- a/src/ol/interaction/Pointer.js +++ b/src/ol/interaction/Pointer.js @@ -45,7 +45,7 @@ import {getValues} from '../obj.js'; */ class PointerInteraction extends Interaction { /** - * @param {Options=} opt_options Options. + * @param {Options} [opt_options] Options. */ constructor(opt_options) { const options = opt_options ? opt_options : {}; diff --git a/src/ol/interaction/Select.js b/src/ol/interaction/Select.js index 3769125606..14fc85e485 100644 --- a/src/ol/interaction/Select.js +++ b/src/ol/interaction/Select.js @@ -151,7 +151,7 @@ const originalFeatureStyles = {}; */ class Select extends Interaction { /** - * @param {Options=} opt_options Options. + * @param {Options} [opt_options] Options. */ constructor(opt_options) { super(); diff --git a/src/ol/interaction/Snap.js b/src/ol/interaction/Snap.js index cd7124f5d2..5ea6945a95 100644 --- a/src/ol/interaction/Snap.js +++ b/src/ol/interaction/Snap.js @@ -95,7 +95,7 @@ const tempSegment = []; */ class Snap extends PointerInteraction { /** - * @param {Options=} opt_options Options. + * @param {Options} [opt_options] Options. */ constructor(opt_options) { const options = opt_options ? opt_options : {}; @@ -200,7 +200,7 @@ class Snap extends PointerInteraction { /** * Add a feature to the collection of features that we may snap to. * @param {import("../Feature.js").default} feature Feature. - * @param {boolean=} opt_listen Whether to listen to the feature change or not + * @param {boolean} [opt_listen] Whether to listen to the feature change or not * Defaults to `true`. * @api */ @@ -322,7 +322,7 @@ class Snap extends PointerInteraction { /** * Remove a feature from the collection of features that we may snap to. * @param {import("../Feature.js").default} feature Feature - * @param {boolean=} opt_unlisten Whether to unlisten to the feature change + * @param {boolean} [opt_unlisten] Whether to unlisten to the feature change * or not. Defaults to `true`. * @api */ diff --git a/src/ol/interaction/Translate.js b/src/ol/interaction/Translate.js index 9d8f54d2e1..f5e49da084 100644 --- a/src/ol/interaction/Translate.js +++ b/src/ol/interaction/Translate.js @@ -115,7 +115,7 @@ export class TranslateEvent extends Event { */ class Translate extends PointerInteraction { /** - * @param {Options=} opt_options Options. + * @param {Options} [opt_options] Options. */ constructor(opt_options) { const options = opt_options ? opt_options : {}; diff --git a/src/ol/layer/Base.js b/src/ol/layer/Base.js index bdc8183d0f..801aad532f 100644 --- a/src/ol/layer/Base.js +++ b/src/ol/layer/Base.js @@ -95,7 +95,7 @@ class BaseLayer extends BaseObject { * This method is not meant to be called by layers or layer renderers because the state * is incorrect if the layer is included in a layer group. * - * @param {boolean=} opt_managed Layer is managed. + * @param {boolean} [opt_managed] Layer is managed. * @return {import("./Layer.js").State} Layer state. */ getLayerState(opt_managed) { @@ -124,7 +124,7 @@ class BaseLayer extends BaseObject { /** * @abstract - * @param {Array=} opt_array Array of layers (to be + * @param {Array} [opt_array] Array of layers (to be * modified in place). * @return {Array} Array of layers. */ @@ -134,7 +134,7 @@ class BaseLayer extends BaseObject { /** * @abstract - * @param {Array=} opt_states Optional list of layer + * @param {Array} [opt_states] Optional list of layer * states (to be modified in place). * @return {Array} List of layer states. */ diff --git a/src/ol/layer/BaseImage.js b/src/ol/layer/BaseImage.js index 1d240b1242..dd6f2e12e7 100644 --- a/src/ol/layer/BaseImage.js +++ b/src/ol/layer/BaseImage.js @@ -43,7 +43,7 @@ import Layer from './Layer.js'; */ class BaseImageLayer extends Layer { /** - * @param {Options=} opt_options Layer options. + * @param {Options} [opt_options] Layer options. */ constructor(opt_options) { const options = opt_options ? opt_options : {}; diff --git a/src/ol/layer/BaseTile.js b/src/ol/layer/BaseTile.js index de5fa0f4cf..aa833159ff 100644 --- a/src/ol/layer/BaseTile.js +++ b/src/ol/layer/BaseTile.js @@ -48,7 +48,7 @@ import {assign} from '../obj.js'; */ class BaseTileLayer extends Layer { /** - * @param {Options=} opt_options Tile layer options. + * @param {Options} [opt_options] Tile layer options. */ constructor(opt_options) { const options = opt_options ? opt_options : {}; diff --git a/src/ol/layer/BaseVector.js b/src/ol/layer/BaseVector.js index 20189f2483..606aa6d116 100644 --- a/src/ol/layer/BaseVector.js +++ b/src/ol/layer/BaseVector.js @@ -76,7 +76,7 @@ const Property = { */ class BaseVectorLayer extends Layer { /** - * @param {Options=} opt_options Options. + * @param {Options} [opt_options] Options. */ constructor(opt_options) { const options = opt_options ? opt_options : {}; @@ -241,7 +241,7 @@ class BaseVectorLayer extends Layer { * so only features that have their own styles will be rendered in the layer. Call * `setStyle()` without arguments to reset to the default style. See * {@link module:ol/style} for information on the default style. - * @param {(import("../style/Style.js").StyleLike|null)=} opt_style Layer style. + * @param {import("../style/Style.js").StyleLike|null} [opt_style] Layer style. * @api */ setStyle(opt_style) { diff --git a/src/ol/layer/Graticule.js b/src/ol/layer/Graticule.js index 249bc1e724..fba118c66c 100644 --- a/src/ol/layer/Graticule.js +++ b/src/ol/layer/Graticule.js @@ -177,7 +177,7 @@ const INTERVALS = [ */ class Graticule extends VectorLayer { /** - * @param {Options=} opt_options Options. + * @param {Options} [opt_options] Options. */ constructor(opt_options) { const options = opt_options ? opt_options : {}; diff --git a/src/ol/layer/Group.js b/src/ol/layer/Group.js index 8738391f87..f08e7290bb 100644 --- a/src/ol/layer/Group.js +++ b/src/ol/layer/Group.js @@ -53,7 +53,7 @@ const Property = { */ class LayerGroup extends BaseLayer { /** - * @param {Options=} opt_options Layer options. + * @param {Options} [opt_options] Layer options. */ constructor(opt_options) { const options = opt_options || {}; @@ -193,7 +193,7 @@ class LayerGroup extends BaseLayer { } /** - * @param {Array=} opt_array Array of layers (to be modified in place). + * @param {Array} [opt_array] Array of layers (to be modified in place). * @return {Array} Array of layers. */ getLayersArray(opt_array) { @@ -205,7 +205,7 @@ class LayerGroup extends BaseLayer { } /** - * @param {Array=} opt_states Optional list of layer states (to be modified in place). + * @param {Array} [opt_states] Optional list of layer states (to be modified in place). * @return {Array} List of layer states. */ getLayerStatesArray(opt_states) { diff --git a/src/ol/layer/Heatmap.js b/src/ol/layer/Heatmap.js index 1e3110dab7..7563cdcf04 100644 --- a/src/ol/layer/Heatmap.js +++ b/src/ol/layer/Heatmap.js @@ -66,7 +66,7 @@ const DEFAULT_GRADIENT = ['#00f', '#0ff', '#0f0', '#ff0', '#f00']; */ class Heatmap extends VectorLayer { /** - * @param {Options=} opt_options Options. + * @param {Options} [opt_options] Options. */ constructor(opt_options) { const options = opt_options ? opt_options : {}; diff --git a/src/ol/layer/Image.js b/src/ol/layer/Image.js index 5d0f86738b..1d52dbe43f 100644 --- a/src/ol/layer/Image.js +++ b/src/ol/layer/Image.js @@ -18,7 +18,7 @@ import CanvasImageLayerRenderer from '../renderer/canvas/ImageLayer.js'; */ class ImageLayer extends BaseImageLayer { /** - * @param {import("./BaseImage.js").Options=} opt_options Layer options. + * @param {import("./BaseImage.js").Options} [opt_options] Layer options. */ constructor(opt_options) { super(opt_options); diff --git a/src/ol/layer/Layer.js b/src/ol/layer/Layer.js index 57fa50d4e1..e55944faad 100644 --- a/src/ol/layer/Layer.js +++ b/src/ol/layer/Layer.js @@ -140,7 +140,7 @@ class Layer extends BaseLayer { } /** - * @param {Array=} opt_array Array of layers (to be modified in place). + * @param {Array} [opt_array] Array of layers (to be modified in place). * @return {Array} Array of layers. */ getLayersArray(opt_array) { @@ -150,7 +150,7 @@ class Layer extends BaseLayer { } /** - * @param {Array=} opt_states Optional list of layer states (to be modified in place). + * @param {Array} [opt_states] Optional list of layer states (to be modified in place). * @return {Array} List of layer states. */ getLayerStatesArray(opt_states) { diff --git a/src/ol/layer/Tile.js b/src/ol/layer/Tile.js index 01aca6aa49..0898da7457 100644 --- a/src/ol/layer/Tile.js +++ b/src/ol/layer/Tile.js @@ -18,7 +18,7 @@ import CanvasTileLayerRenderer from '../renderer/canvas/TileLayer.js'; */ class TileLayer extends BaseTileLayer { /** - * @param {import("./BaseTile.js").Options=} opt_options Tile layer options. + * @param {import("./BaseTile.js").Options} [opt_options] Tile layer options. */ constructor(opt_options) { super(opt_options); diff --git a/src/ol/layer/Vector.js b/src/ol/layer/Vector.js index cd9843ab8b..1de881bc95 100644 --- a/src/ol/layer/Vector.js +++ b/src/ol/layer/Vector.js @@ -17,7 +17,7 @@ import CanvasVectorLayerRenderer from '../renderer/canvas/VectorLayer.js'; */ class VectorLayer extends BaseVectorLayer { /** - * @param {import("./BaseVector.js").Options=} opt_options Options. + * @param {import("./BaseVector.js").Options} [opt_options] Options. */ constructor(opt_options) { super(opt_options); diff --git a/src/ol/layer/VectorImage.js b/src/ol/layer/VectorImage.js index 3e59628873..bb9dbbb745 100644 --- a/src/ol/layer/VectorImage.js +++ b/src/ol/layer/VectorImage.js @@ -57,7 +57,7 @@ import {assign} from '../obj.js'; */ class VectorImageLayer extends BaseVectorLayer { /** - * @param {Options=} opt_options Options. + * @param {Options} [opt_options] Options. */ constructor(opt_options) { const options = opt_options ? opt_options : {}; diff --git a/src/ol/layer/VectorTile.js b/src/ol/layer/VectorTile.js index 527e609bdf..63d79b5ef8 100644 --- a/src/ol/layer/VectorTile.js +++ b/src/ol/layer/VectorTile.js @@ -76,13 +76,13 @@ import {assign} from '../obj.js'; * property on the layer object; for example, setting `title: 'My Title'` in the * options means that `title` is observable, and has get/set accessors. * - * @param {Options=} opt_options Options. + * @param {Options} [opt_options] Options. * @extends {BaseVectorLayer} * @api */ class VectorTileLayer extends BaseVectorLayer { /** - * @param {Options=} opt_options Options. + * @param {Options} [opt_options] Options. */ constructor(opt_options) { const options = opt_options ? opt_options : {}; diff --git a/src/ol/net.js b/src/ol/net.js index 770e0acec9..70409178ec 100644 --- a/src/ol/net.js +++ b/src/ol/net.js @@ -10,8 +10,8 @@ import {getUid} from './util.js'; * @param {string} url Request url. A 'callback' query parameter will be * appended. * @param {Function} callback Callback on success. - * @param {function()=} opt_errback Callback on error. - * @param {string=} opt_callbackParam Custom query parameter for the JSONP + * @param {Function} [opt_errback] Callback on error. + * @param {string} [opt_callbackParam] Custom query parameter for the JSONP * callback. Default is 'callback'. */ export function jsonp(url, callback, opt_errback, opt_callbackParam) { diff --git a/src/ol/proj.js b/src/ol/proj.js index 4f10fc02f8..27acfd46ec 100644 --- a/src/ol/proj.js +++ b/src/ol/proj.js @@ -99,8 +99,8 @@ export {Projection}; /** * @param {Array} input Input coordinate array. - * @param {Array=} opt_output Output array of coordinate values. - * @param {number=} opt_dimension Dimension. + * @param {Array} [opt_output] Output array of coordinate values. + * @param {number} [opt_dimension] Dimension. * @return {Array} Output coordinate array (new array, same coordinate * values). */ @@ -119,8 +119,8 @@ export function cloneTransform(input, opt_output, opt_dimension) { /** * @param {Array} input Input coordinate array. - * @param {Array=} opt_output Output array of coordinate values. - * @param {number=} opt_dimension Dimension. + * @param {Array} [opt_output] Output array of coordinate values. + * @param {number} [opt_dimension] Dimension. * @return {Array} Input coordinate array (same array as input). */ export function identityTransform(input, opt_output, opt_dimension) { @@ -182,7 +182,7 @@ export function get(projectionLike) { * @param {ProjectionLike} projection The projection. * @param {number} resolution Nominal resolution in projection units. * @param {import("./coordinate.js").Coordinate} point Point to find adjusted resolution at. - * @param {import("./proj/Units.js").default=} opt_units Units to get the point resolution in. + * @param {import("./proj/Units.js").default} [opt_units] Units to get the point resolution in. * Default is the projection's units. * @return {number} Point resolution. * @api @@ -321,8 +321,8 @@ export function createTransformFromCoordinateTransform(coordTransform) { return ( /** * @param {Array} input Input. - * @param {Array=} opt_output Output. - * @param {number=} opt_dimension Dimension. + * @param {Array} [opt_output] Output. + * @param {number} [opt_dimension] Dimension. * @return {Array} Output. */ function (input, opt_output, opt_dimension) { @@ -380,7 +380,7 @@ export function addCoordinateTransforms(source, destination, forward, inverse) { * Transforms a coordinate from longitude/latitude to a different projection. * @param {import("./coordinate.js").Coordinate} coordinate Coordinate as longitude and latitude, i.e. * an array with longitude as 1st and latitude as 2nd element. - * @param {ProjectionLike=} opt_projection Target projection. The + * @param {ProjectionLike} [opt_projection] Target projection. The * default is Web Mercator, i.e. 'EPSG:3857'. * @return {import("./coordinate.js").Coordinate} Coordinate projected to the target projection. * @api @@ -396,7 +396,7 @@ export function fromLonLat(coordinate, opt_projection) { /** * Transforms a coordinate to longitude/latitude. * @param {import("./coordinate.js").Coordinate} coordinate Projected coordinate. - * @param {ProjectionLike=} opt_projection Projection of the coordinate. + * @param {ProjectionLike} [opt_projection] Projection of the coordinate. * The default is Web Mercator, i.e. 'EPSG:3857'. * @return {import("./coordinate.js").Coordinate} Coordinate as longitude and latitude, i.e. an array * with longitude as 1st and latitude as 2nd element. @@ -502,7 +502,7 @@ export function transform(coordinate, source, destination) { * @param {import("./extent.js").Extent} extent The extent to transform. * @param {ProjectionLike} source Source projection-like. * @param {ProjectionLike} destination Destination projection-like. - * @param {number=} opt_stops Number of stops per side used for the transform. + * @param {number} [opt_stops] Number of stops per side used for the transform. * By default only the corners are used. * @return {import("./extent.js").Extent} The transformed extent. * @api diff --git a/src/ol/proj/epsg3857.js b/src/ol/proj/epsg3857.js index 1a8ad31072..1d7afb2083 100644 --- a/src/ol/proj/epsg3857.js +++ b/src/ol/proj/epsg3857.js @@ -78,8 +78,8 @@ export const PROJECTIONS = [ * Transformation from EPSG:4326 to EPSG:3857. * * @param {Array} input Input array of coordinate values. - * @param {Array=} opt_output Output array of coordinate values. - * @param {number=} opt_dimension Dimension (default is `2`). + * @param {Array} [opt_output] Output array of coordinate values. + * @param {number} [opt_dimension] Dimension (default is `2`). * @return {Array} Output array of coordinate values. */ export function fromEPSG4326(input, opt_output, opt_dimension) { @@ -111,8 +111,8 @@ export function fromEPSG4326(input, opt_output, opt_dimension) { * Transformation from EPSG:3857 to EPSG:4326. * * @param {Array} input Input array of coordinate values. - * @param {Array=} opt_output Output array of coordinate values. - * @param {number=} opt_dimension Dimension (default is `2`). + * @param {Array} [opt_output] Output array of coordinate values. + * @param {number} [opt_dimension] Dimension (default is `2`). * @return {Array} Output array of coordinate values. */ export function toEPSG4326(input, opt_output, opt_dimension) { diff --git a/src/ol/proj/epsg4326.js b/src/ol/proj/epsg4326.js index d1f9cdc07b..5a720abf2e 100644 --- a/src/ol/proj/epsg4326.js +++ b/src/ol/proj/epsg4326.js @@ -37,7 +37,7 @@ export const METERS_PER_UNIT = (Math.PI * RADIUS) / 180; class EPSG4326Projection extends Projection { /** * @param {string} code Code. - * @param {string=} opt_axisOrientation Axis orientation. + * @param {string} [opt_axisOrientation] Axis orientation. */ constructor(code, opt_axisOrientation) { super({ diff --git a/src/ol/render.js b/src/ol/render.js index 60d8d6689d..67c36960d2 100644 --- a/src/ol/render.js +++ b/src/ol/render.js @@ -61,7 +61,7 @@ import {getTransformFromProjections, getUserProjection} from './proj.js'; * ``` * * @param {CanvasRenderingContext2D} context Canvas context. - * @param {ToContextOptions=} opt_options Options. + * @param {ToContextOptions} [opt_options] Options. * @return {CanvasImmediateRenderer} Canvas Immediate. * @api */ diff --git a/src/ol/render/Event.js b/src/ol/render/Event.js index 7f20aac9a2..7aa72a2961 100644 --- a/src/ol/render/Event.js +++ b/src/ol/render/Event.js @@ -7,10 +7,10 @@ import Event from '../events/Event.js'; class RenderEvent extends Event { /** * @param {import("./EventType.js").default} type Type. - * @param {import("../transform.js").Transform=} opt_inversePixelTransform Transform for + * @param {import("../transform.js").Transform} [opt_inversePixelTransform] Transform for * CSS pixels to rendered pixels. - * @param {import("../PluggableMap.js").FrameState=} opt_frameState Frame state. - * @param {?CanvasRenderingContext2D=} opt_context Context. + * @param {import("../PluggableMap.js").FrameState} [opt_frameState] Frame state. + * @param {?CanvasRenderingContext2D} [opt_context] Context. */ constructor(type, opt_inversePixelTransform, opt_frameState, opt_context) { super(type); diff --git a/src/ol/render/VectorContext.js b/src/ol/render/VectorContext.js index c7fcca15dd..f4d477faf3 100644 --- a/src/ol/render/VectorContext.js +++ b/src/ol/render/VectorContext.js @@ -100,13 +100,13 @@ class VectorContext { /** * @param {import("../style/Image.js").default} imageStyle Image style. - * @param {import("../render/canvas.js").DeclutterImageWithText=} opt_declutterImageWithText Shared data for combined decluttering with a text style. + * @param {import("../render/canvas.js").DeclutterImageWithText} [opt_declutterImageWithText] Shared data for combined decluttering with a text style. */ setImageStyle(imageStyle, opt_declutterImageWithText) {} /** * @param {import("../style/Text.js").default} textStyle Text style. - * @param {import("../render/canvas.js").DeclutterImageWithText=} opt_declutterImageWithText Shared data for combined decluttering with an image style. + * @param {import("../render/canvas.js").DeclutterImageWithText} [opt_declutterImageWithText] Shared data for combined decluttering with an image style. */ setTextStyle(textStyle, opt_declutterImageWithText) {} } diff --git a/src/ol/render/canvas/Executor.js b/src/ol/render/canvas/Executor.js index e0a9a3df64..b5da8e92af 100644 --- a/src/ol/render/canvas/Executor.js +++ b/src/ol/render/canvas/Executor.js @@ -595,10 +595,10 @@ class Executor { * @param {import("../../transform.js").Transform} transform Transform. * @param {Array<*>} instructions Instructions array. * @param {boolean} snapToPixel Snap point symbols and text to integer pixels. - * @param {FeatureCallback=} opt_featureCallback Feature callback. - * @param {import("../../extent.js").Extent=} opt_hitExtent Only check + * @param {FeatureCallback} [opt_featureCallback] Feature callback. + * @param {import("../../extent.js").Extent} [opt_hitExtent] Only check * features that intersect this extent. - * @param {import("rbush").default=} opt_declutterTree Declutter tree. + * @param {import("rbush").default} [opt_declutterTree] Declutter tree. * @return {T|undefined} Callback result. * @template T */ @@ -1141,7 +1141,7 @@ class Executor { * @param {import("../../transform.js").Transform} transform Transform. * @param {number} viewRotation View rotation. * @param {boolean} snapToPixel Snap point symbols and text to integer pixels. - * @param {import("rbush").default=} opt_declutterTree Declutter tree. + * @param {import("rbush").default} [opt_declutterTree] Declutter tree. */ execute( context, @@ -1168,8 +1168,8 @@ class Executor { * @param {CanvasRenderingContext2D} context Context. * @param {import("../../transform.js").Transform} transform Transform. * @param {number} viewRotation View rotation. - * @param {FeatureCallback=} opt_featureCallback Feature callback. - * @param {import("../../extent.js").Extent=} opt_hitExtent Only check + * @param {FeatureCallback} [opt_featureCallback] Feature callback. + * @param {import("../../extent.js").Extent} [opt_hitExtent] Only check * features that intersect this extent. * @return {T|undefined} Callback result. * @template T diff --git a/src/ol/render/canvas/ExecutorGroup.js b/src/ol/render/canvas/ExecutorGroup.js index f957766a82..160b3426c2 100644 --- a/src/ol/render/canvas/ExecutorGroup.js +++ b/src/ol/render/canvas/ExecutorGroup.js @@ -38,7 +38,7 @@ class ExecutorGroup { * @param {boolean} overlaps The executor group can have overlapping geometries. * @param {!Object>} allInstructions * The serializable instructions. - * @param {number=} opt_renderBuffer Optional rendering buffer. + * @param {number} [opt_renderBuffer] Optional rendering buffer. */ constructor( maxExtent, @@ -312,9 +312,9 @@ class ExecutorGroup { * @param {import("../../transform.js").Transform} transform Transform. * @param {number} viewRotation View rotation. * @param {boolean} snapToPixel Snap point symbols and test to integer pixel. - * @param {Array=} opt_builderTypes Ordered replay types to replay. + * @param {Array} [opt_builderTypes] Ordered replay types to replay. * Default is {@link module:ol/render/replay~ORDER} - * @param {import("rbush").default=} opt_declutterTree Declutter tree. + * @param {import("rbush").default} [opt_declutterTree] Declutter tree. */ execute( context, diff --git a/src/ol/render/canvas/ImageBuilder.js b/src/ol/render/canvas/ImageBuilder.js index 2a2819b104..9df168dce5 100644 --- a/src/ol/render/canvas/ImageBuilder.js +++ b/src/ol/render/canvas/ImageBuilder.js @@ -234,7 +234,7 @@ class CanvasImageBuilder extends CanvasBuilder { /** * @param {import("../../style/Image.js").default} imageStyle Image style. - * @param {Object=} opt_sharedData Shared data. + * @param {Object} [opt_sharedData] Shared data. */ setImageStyle(imageStyle, opt_sharedData) { const anchor = imageStyle.getAnchor(); diff --git a/src/ol/render/canvas/Immediate.js b/src/ol/render/canvas/Immediate.js index ba33de0a44..101d9fe22b 100644 --- a/src/ol/render/canvas/Immediate.js +++ b/src/ol/render/canvas/Immediate.js @@ -46,8 +46,8 @@ class CanvasImmediateRenderer extends VectorContext { * @param {import("../../extent.js").Extent} extent Extent. * @param {import("../../transform.js").Transform} transform Transform. * @param {number} viewRotation View rotation. - * @param {number=} opt_squaredTolerance Optional squared tolerance for simplification. - * @param {import("../../proj.js").TransformFunction=} opt_userTransform Transform from user to view projection. + * @param {number} [opt_squaredTolerance] Optional squared tolerance for simplification. + * @param {import("../../proj.js").TransformFunction} [opt_userTransform] Transform from user to view projection. */ constructor( context, diff --git a/src/ol/render/canvas/TextBuilder.js b/src/ol/render/canvas/TextBuilder.js index e124a496b6..cca8a26d40 100644 --- a/src/ol/render/canvas/TextBuilder.js +++ b/src/ol/render/canvas/TextBuilder.js @@ -484,7 +484,7 @@ class CanvasTextBuilder extends CanvasBuilder { /** * @param {import("../../style/Text.js").default} textStyle Text style. - * @param {Object=} opt_sharedData Shared data. + * @param {Object} [opt_sharedData] Shared data. */ setTextStyle(textStyle, opt_sharedData) { let textState, fillState, strokeState; diff --git a/src/ol/renderer/canvas/TileLayer.js b/src/ol/renderer/canvas/TileLayer.js index aa968c9506..a131e65f4d 100644 --- a/src/ol/renderer/canvas/TileLayer.js +++ b/src/ol/renderer/canvas/TileLayer.js @@ -576,7 +576,7 @@ class CanvasTileLayerRenderer extends CanvasLayerRenderer { * @param {import("../../extent.js").Extent} extent Extent. * @param {number} currentZ Current Z. * @param {number} preload Load low resolution tiles up to 'preload' levels. - * @param {function(import("../../Tile.js").default)=} opt_tileCallback Tile callback. + * @param {function(import("../../Tile.js").default):void} [opt_tileCallback] Tile callback. * @protected */ manageTilePyramid( diff --git a/src/ol/renderer/canvas/VectorLayer.js b/src/ol/renderer/canvas/VectorLayer.js index 9747a00bca..c27704de4e 100644 --- a/src/ol/renderer/canvas/VectorLayer.js +++ b/src/ol/renderer/canvas/VectorLayer.js @@ -156,7 +156,7 @@ class CanvasVectorLayerRenderer extends CanvasLayerRenderer { /** * @param {ExecutorGroup} executorGroup Executor group. * @param {import("../../PluggableMap.js").FrameState} frameState Frame state. - * @param {import("rbush").default=} opt_declutterTree Declutter tree. + * @param {import("rbush").default} [opt_declutterTree] Declutter tree. */ renderWorlds(executorGroup, frameState, opt_declutterTree) { const extent = frameState.extent; @@ -716,8 +716,8 @@ class CanvasVectorLayerRenderer extends CanvasLayerRenderer { * @param {number} squaredTolerance Squared render tolerance. * @param {import("../../style/Style.js").default|Array} styles The style or array of styles. * @param {import("../../render/canvas/BuilderGroup.js").default} builderGroup Builder group. - * @param {import("../../proj.js").TransformFunction=} opt_transform Transform from user to view projection. - * @param {import("../../render/canvas/BuilderGroup.js").default=} opt_declutterBuilderGroup Builder for decluttering. + * @param {import("../../proj.js").TransformFunction} [opt_transform] Transform from user to view projection. + * @param {import("../../render/canvas/BuilderGroup.js").default} [opt_declutterBuilderGroup] Builder for decluttering. * @return {boolean} `true` if an image is loading. */ renderFeature( diff --git a/src/ol/renderer/canvas/VectorTileLayer.js b/src/ol/renderer/canvas/VectorTileLayer.js index 8afbeb1178..323651e815 100644 --- a/src/ol/renderer/canvas/VectorTileLayer.js +++ b/src/ol/renderer/canvas/VectorTileLayer.js @@ -787,7 +787,7 @@ class CanvasVectorTileLayerRenderer extends CanvasTileLayerRenderer { * @param {number} squaredTolerance Squared tolerance. * @param {import("../../style/Style.js").default|Array} styles The style or array of styles. * @param {import("../../render/canvas/BuilderGroup.js").default} builderGroup Replay group. - * @param {import("../../render/canvas/BuilderGroup.js").default=} opt_declutterBuilderGroup Builder group for decluttering. + * @param {import("../../render/canvas/BuilderGroup.js").default} [opt_declutterBuilderGroup] Builder group for decluttering. * @return {boolean} `true` if an image is loading. */ renderFeature( diff --git a/src/ol/renderer/vector.js b/src/ol/renderer/vector.js index fcda4e0588..e4a0849d98 100644 --- a/src/ol/renderer/vector.js +++ b/src/ol/renderer/vector.js @@ -72,7 +72,7 @@ export function getTolerance(resolution, pixelRatio) { * @param {import("../geom/Circle.js").default} geometry Geometry. * @param {import("../style/Style.js").default} style Style. * @param {import("../Feature.js").default} feature Feature. - * @param {import("../render/canvas/BuilderGroup.js").default=} opt_declutterBuilderGroup Builder for decluttering. + * @param {import("../render/canvas/BuilderGroup.js").default} [opt_declutterBuilderGroup] Builder for decluttering. */ function renderCircleGeometry( builderGroup, @@ -109,7 +109,7 @@ function renderCircleGeometry( * @param {number} squaredTolerance Squared tolerance. * @param {function(import("../events/Event.js").default): void} listener Listener function. * @param {import("../proj.js").TransformFunction} [opt_transform] Transform from user to view projection. - * @param {import("../render/canvas/BuilderGroup.js").default=} opt_declutterBuilderGroup Builder for decluttering. + * @param {import("../render/canvas/BuilderGroup.js").default} [opt_declutterBuilderGroup] Builder for decluttering. * @return {boolean} `true` if style is loading. */ export function renderFeature( @@ -154,7 +154,7 @@ export function renderFeature( * @param {import("../style/Style.js").default} style Style. * @param {number} squaredTolerance Squared tolerance. * @param {import("../proj.js").TransformFunction} [opt_transform] Optional transform function. - * @param {import("../render/canvas/BuilderGroup.js").default=} opt_declutterBuilderGroup Builder for decluttering. + * @param {import("../render/canvas/BuilderGroup.js").default} [opt_declutterBuilderGroup] Builder for decluttering. */ function renderFeatureInternal( replayGroup, @@ -214,7 +214,7 @@ function renderGeometry(replayGroup, geometry, style, feature) { * @param {import("../geom/GeometryCollection.js").default} geometry Geometry. * @param {import("../style/Style.js").default} style Style. * @param {import("../Feature.js").default} feature Feature. - * @param {import("../render/canvas/BuilderGroup.js").default=} opt_declutterBuilderGroup Builder for decluttering. + * @param {import("../render/canvas/BuilderGroup.js").default} [opt_declutterBuilderGroup] Builder for decluttering. */ function renderGeometryCollectionGeometry( replayGroup, @@ -242,7 +242,7 @@ function renderGeometryCollectionGeometry( * @param {import("../geom/LineString.js").default|import("../render/Feature.js").default} geometry Geometry. * @param {import("../style/Style.js").default} style Style. * @param {import("../Feature.js").FeatureLike} feature Feature. - * @param {import("../render/canvas/BuilderGroup.js").default=} opt_declutterBuilderGroup Builder for decluttering. + * @param {import("../render/canvas/BuilderGroup.js").default} [opt_declutterBuilderGroup] Builder for decluttering. */ function renderLineStringGeometry( builderGroup, @@ -276,7 +276,7 @@ function renderLineStringGeometry( * @param {import("../geom/MultiLineString.js").default|import("../render/Feature.js").default} geometry Geometry. * @param {import("../style/Style.js").default} style Style. * @param {import("../Feature.js").FeatureLike} feature Feature. - * @param {import("../render/canvas/BuilderGroup.js").default=} opt_declutterBuilderGroup Builder for decluttering. + * @param {import("../render/canvas/BuilderGroup.js").default} [opt_declutterBuilderGroup] Builder for decluttering. */ function renderMultiLineStringGeometry( builderGroup, @@ -310,7 +310,7 @@ function renderMultiLineStringGeometry( * @param {import("../geom/MultiPolygon.js").default} geometry Geometry. * @param {import("../style/Style.js").default} style Style. * @param {import("../Feature.js").default} feature Feature. - * @param {import("../render/canvas/BuilderGroup.js").default=} opt_declutterBuilderGroup Builder for decluttering. + * @param {import("../render/canvas/BuilderGroup.js").default} [opt_declutterBuilderGroup] Builder for decluttering. */ function renderMultiPolygonGeometry( builderGroup, @@ -345,7 +345,7 @@ function renderMultiPolygonGeometry( * @param {import("../geom/Point.js").default|import("../render/Feature.js").default} geometry Geometry. * @param {import("../style/Style.js").default} style Style. * @param {import("../Feature.js").FeatureLike} feature Feature. - * @param {import("../render/canvas/BuilderGroup.js").default=} opt_declutterBuilderGroup Builder for decluttering. + * @param {import("../render/canvas/BuilderGroup.js").default} [opt_declutterBuilderGroup] Builder for decluttering. */ function renderPointGeometry( builderGroup, @@ -389,7 +389,7 @@ function renderPointGeometry( * @param {import("../geom/MultiPoint.js").default|import("../render/Feature.js").default} geometry Geometry. * @param {import("../style/Style.js").default} style Style. * @param {import("../Feature.js").FeatureLike} feature Feature. - * @param {import("../render/canvas/BuilderGroup.js").default=} opt_declutterBuilderGroup Builder for decluttering. + * @param {import("../render/canvas/BuilderGroup.js").default} [opt_declutterBuilderGroup] Builder for decluttering. */ function renderMultiPointGeometry( builderGroup, @@ -433,7 +433,7 @@ function renderMultiPointGeometry( * @param {import("../geom/Polygon.js").default|import("../render/Feature.js").default} geometry Geometry. * @param {import("../style/Style.js").default} style Style. * @param {import("../Feature.js").FeatureLike} feature Feature. - * @param {import("../render/canvas/BuilderGroup.js").default=} opt_declutterBuilderGroup Builder for decluttering. + * @param {import("../render/canvas/BuilderGroup.js").default} [opt_declutterBuilderGroup] Builder for decluttering. */ function renderPolygonGeometry( builderGroup, diff --git a/src/ol/renderer/webgl/Layer.js b/src/ol/renderer/webgl/Layer.js index 8c178a6da9..59822fe1df 100644 --- a/src/ol/renderer/webgl/Layer.js +++ b/src/ol/renderer/webgl/Layer.js @@ -51,7 +51,7 @@ export const WebGLWorkerMessageType = { class WebGLLayerRenderer extends LayerRenderer { /** * @param {LayerType} layer Layer. - * @param {Options=} [opt_options] Options. + * @param {Options} [opt_options] Options. */ constructor(layer, opt_options) { super(layer); diff --git a/src/ol/reproj.js b/src/ol/reproj.js index 5bdefac6bc..6dd6b72228 100644 --- a/src/ol/reproj.js +++ b/src/ol/reproj.js @@ -197,8 +197,8 @@ export function calculateSourceExtentResolution( * @param {import("./reproj/Triangulation.js").default} triangulation Calculated triangulation. * @param {Array} sources Array of sources. * @param {number} gutter Gutter of the sources. - * @param {boolean=} opt_renderEdges Render reprojection edges. - * @param {object=} opt_contextOptions Properties to set on the canvas context. + * @param {boolean} [opt_renderEdges] Render reprojection edges. + * @param {object} [opt_contextOptions] Properties to set on the canvas context. * @return {HTMLCanvasElement} Canvas with reprojected data. */ export function render( diff --git a/src/ol/reproj/Image.js b/src/ol/reproj/Image.js index bbb6e8b1e6..012007f6ac 100644 --- a/src/ol/reproj/Image.js +++ b/src/ol/reproj/Image.js @@ -32,7 +32,7 @@ class ReprojImage extends ImageBase { * @param {number} pixelRatio Pixel ratio. * @param {FunctionType} getImageFunction * Function returning source images (extent, resolution, pixelRatio). - * @param {object=} opt_contextOptions Properties to set on the canvas context. + * @param {object} [opt_contextOptions] Properties to set on the canvas context. */ constructor( sourceProj, diff --git a/src/ol/reproj/Tile.js b/src/ol/reproj/Tile.js index 92929bd793..02fe5c75db 100644 --- a/src/ol/reproj/Tile.js +++ b/src/ol/reproj/Tile.js @@ -37,9 +37,9 @@ class ReprojTile extends Tile { * @param {number} gutter Gutter of the source tiles. * @param {FunctionType} getTileFunction * Function returning source tiles (z, x, y, pixelRatio). - * @param {number=} opt_errorThreshold Acceptable reprojection error (in px). - * @param {boolean=} opt_renderEdges Render reprojection edges. - * @param {object=} opt_contextOptions Properties to set on the canvas context. + * @param {number} [opt_errorThreshold] Acceptable reprojection error (in px). + * @param {boolean} [opt_renderEdges] Render reprojection edges. + * @param {object} [opt_contextOptions] Properties to set on the canvas context. */ constructor( sourceProj, diff --git a/src/ol/resolutionconstraint.js b/src/ol/resolutionconstraint.js index 461c0b1f1f..0685f32b08 100644 --- a/src/ol/resolutionconstraint.js +++ b/src/ol/resolutionconstraint.js @@ -64,9 +64,9 @@ 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_showFullExtent If true, allows us to show the full extent. Default: false. + * @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_showFullExtent] If true, allows us to show the full extent. Default: false. * @return {Type} Zoom function. */ export function createSnapToResolutions( @@ -80,7 +80,7 @@ export function createSnapToResolutions( * @param {number|undefined} resolution Resolution. * @param {number} direction Direction. * @param {import("./size.js").Size} size Viewport size. - * @param {boolean=} opt_isMoving True if an interaction or animation is in progress. + * @param {boolean} [opt_isMoving] True if an interaction or animation is in progress. * @return {number|undefined} Resolution. */ function (resolution, direction, size, opt_isMoving) { @@ -125,10 +125,10 @@ export function createSnapToResolutions( /** * @param {number} power Power. * @param {number} maxResolution Maximum resolution. - * @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_showFullExtent If true, allows us to show the full extent. Default: false. + * @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_showFullExtent] If true, allows us to show the full extent. Default: false. * @return {Type} Zoom function. */ export function createSnapToPower( @@ -144,7 +144,7 @@ export function createSnapToPower( * @param {number|undefined} resolution Resolution. * @param {number} direction Direction. * @param {import("./size.js").Size} size Viewport size. - * @param {boolean=} opt_isMoving True if an interaction or animation is in progress. + * @param {boolean} [opt_isMoving] True if an interaction or animation is in progress. * @return {number|undefined} Resolution. */ function (resolution, direction, size, opt_isMoving) { @@ -195,9 +195,9 @@ export function createSnapToPower( /** * @param {number} maxResolution Max resolution. * @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_showFullExtent If true, allows us to show the full extent. Default: false. + * @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_showFullExtent] If true, allows us to show the full extent. Default: false. * @return {Type} Zoom function. */ export function createMinMaxResolution( @@ -212,7 +212,7 @@ export function createMinMaxResolution( * @param {number|undefined} resolution Resolution. * @param {number} direction Direction. * @param {import("./size.js").Size} size Viewport size. - * @param {boolean=} opt_isMoving True if an interaction or animation is in progress. + * @param {boolean} [opt_isMoving] True if an interaction or animation is in progress. * @return {number|undefined} Resolution. */ function (resolution, direction, size, opt_isMoving) { diff --git a/src/ol/rotationconstraint.js b/src/ol/rotationconstraint.js index 43e5252760..c97c23d63c 100644 --- a/src/ol/rotationconstraint.js +++ b/src/ol/rotationconstraint.js @@ -40,7 +40,7 @@ export function createSnapToN(n) { return ( /** * @param {number|undefined} rotation Rotation. - * @param {boolean=} opt_isMoving True if an interaction or animation is in progress. + * @param {boolean} [opt_isMoving] True if an interaction or animation is in progress. * @return {number|undefined} Rotation. */ function (rotation, opt_isMoving) { @@ -59,7 +59,7 @@ export function createSnapToN(n) { } /** - * @param {number=} opt_tolerance Tolerance. + * @param {number} [opt_tolerance] Tolerance. * @return {Type} Rotation constraint. */ export function createSnapToZero(opt_tolerance) { @@ -67,7 +67,7 @@ export function createSnapToZero(opt_tolerance) { return ( /** * @param {number|undefined} rotation Rotation. - * @param {boolean=} opt_isMoving True if an interaction or animation is in progress. + * @param {boolean} [opt_isMoving] True if an interaction or animation is in progress. * @return {number|undefined} Rotation. */ function (rotation, opt_isMoving) { diff --git a/src/ol/size.js b/src/ol/size.js index 97ed790cf2..87fd79a176 100644 --- a/src/ol/size.js +++ b/src/ol/size.js @@ -12,7 +12,7 @@ * Returns a buffered size. * @param {Size} size Size. * @param {number} num The amount by which to buffer. - * @param {Size=} opt_size Optional reusable size array. + * @param {Size} [opt_size] Optional reusable size array. * @return {Size} The buffered size. */ export function buffer(size, num, opt_size) { @@ -37,7 +37,7 @@ export function hasArea(size) { * Returns a size scaled by a ratio. The result will be an array of integers. * @param {Size} size Size. * @param {number} ratio Ratio. - * @param {Size=} opt_size Optional reusable size array. + * @param {Size} [opt_size] Optional reusable size array. * @return {Size} The scaled size. */ export function scale(size, ratio, opt_size) { @@ -54,7 +54,7 @@ export function scale(size, ratio, opt_size) { * `Size` array. * (meaning: non-square), * @param {number|Size} size Width and height. - * @param {Size=} opt_size Optional reusable size array. + * @param {Size} [opt_size] Optional reusable size array. * @return {Size} Size. * @api */ diff --git a/src/ol/source/Cluster.js b/src/ol/source/Cluster.js index abf69ba8e8..22050979bd 100644 --- a/src/ol/source/Cluster.js +++ b/src/ol/source/Cluster.js @@ -92,7 +92,7 @@ class Cluster extends VectorSource { /** * Remove all features from the source. - * @param {boolean=} opt_fast Skip dispatching of {@link module:ol/source/Vector.VectorSourceEvent#removefeature} events. + * @param {boolean} [opt_fast] Skip dispatching of {@link module:ol/source/Vector.VectorSourceEvent#removefeature} events. * @api */ clear(opt_fast) { diff --git a/src/ol/source/IIIF.js b/src/ol/source/IIIF.js index acc14cb42e..162b16dd01 100644 --- a/src/ol/source/IIIF.js +++ b/src/ol/source/IIIF.js @@ -60,7 +60,7 @@ function formatPercentage(percentage) { */ class IIIF extends TileImage { /** - * @param {Options=} opt_options Tile source options. Use {@link import("../format/IIIFInfo.js").IIIFInfo} + * @param {Options} [opt_options] Tile source options. Use {@link import("../format/IIIFInfo.js").IIIFInfo} * to parse Image API service information responses into constructor options. * @api */ diff --git a/src/ol/source/ImageArcGISRest.js b/src/ol/source/ImageArcGISRest.js index 21c60cabb7..f213779bb6 100644 --- a/src/ol/source/ImageArcGISRest.js +++ b/src/ol/source/ImageArcGISRest.js @@ -50,7 +50,7 @@ import {containsExtent, getHeight, getWidth} from '../extent.js'; */ class ImageArcGISRest extends ImageSource { /** - * @param {Options=} opt_options Image ArcGIS Rest Options. + * @param {Options} [opt_options] Image ArcGIS Rest Options. */ constructor(opt_options) { const options = opt_options ? opt_options : {}; diff --git a/src/ol/source/ImageCanvas.js b/src/ol/source/ImageCanvas.js index bc73fe22b2..5ab0aea92f 100644 --- a/src/ol/source/ImageCanvas.js +++ b/src/ol/source/ImageCanvas.js @@ -52,7 +52,7 @@ import { */ class ImageCanvasSource extends ImageSource { /** - * @param {Options=} opt_options ImageCanvas options. + * @param {Options} [opt_options] ImageCanvas options. */ constructor(opt_options) { const options = opt_options ? opt_options : {}; diff --git a/src/ol/source/ImageWMS.js b/src/ol/source/ImageWMS.js index 89356b9003..cb9a90c86a 100644 --- a/src/ol/source/ImageWMS.js +++ b/src/ol/source/ImageWMS.js @@ -62,7 +62,7 @@ const GETFEATUREINFO_IMAGE_SIZE = [101, 101]; */ class ImageWMS extends ImageSource { /** - * @param {Options=} [opt_options] ImageWMS options. + * @param {Options} [opt_options] ImageWMS options. */ constructor(opt_options) { const options = opt_options ? opt_options : {}; diff --git a/src/ol/source/OSM.js b/src/ol/source/OSM.js index ae8a85073c..c28d326c17 100644 --- a/src/ol/source/OSM.js +++ b/src/ol/source/OSM.js @@ -48,7 +48,7 @@ export const ATTRIBUTION = */ class OSM extends XYZ { /** - * @param {Options=} [opt_options] Open Street Map options. + * @param {Options} [opt_options] Open Street Map options. */ constructor(opt_options) { const options = opt_options || {}; diff --git a/src/ol/source/Raster.js b/src/ol/source/Raster.js index 0d0ee5bb26..df100f7216 100644 --- a/src/ol/source/Raster.js +++ b/src/ol/source/Raster.js @@ -597,7 +597,7 @@ class RasterSource extends ImageSource { /** * Set the operation. * @param {Operation} operation New operation. - * @param {Object=} opt_lib Functions that will be available to operations run + * @param {Object} [opt_lib] Functions that will be available to operations run * in a worker. * @api */ diff --git a/src/ol/source/Tile.js b/src/ol/source/Tile.js index 36d0080f8e..90ab003a23 100644 --- a/src/ol/source/Tile.js +++ b/src/ol/source/Tile.js @@ -291,7 +291,7 @@ class TileSource extends Source { * is outside the resolution and extent range of the tile grid, `null` will be * returned. * @param {import("../tilecoord.js").TileCoord} tileCoord Tile coordinate. - * @param {import("../proj/Projection.js").default=} opt_projection Projection. + * @param {import("../proj/Projection.js").default} [opt_projection] Projection. * @return {import("../tilecoord.js").TileCoord} Tile coordinate to be passed to the tileUrlFunction or * null if no tile URL should be created for the passed `tileCoord`. */ diff --git a/src/ol/source/TileArcGISRest.js b/src/ol/source/TileArcGISRest.js index 83ba9f803c..3f112f7545 100644 --- a/src/ol/source/TileArcGISRest.js +++ b/src/ol/source/TileArcGISRest.js @@ -62,7 +62,7 @@ import {hash as tileCoordHash} from '../tilecoord.js'; */ class TileArcGISRest extends TileImage { /** - * @param {Options=} opt_options Tile ArcGIS Rest options. + * @param {Options} [opt_options] Tile ArcGIS Rest options. */ constructor(opt_options) { const options = opt_options ? opt_options : {}; diff --git a/src/ol/source/TileDebug.js b/src/ol/source/TileDebug.js index f662f158fd..36353da531 100644 --- a/src/ol/source/TileDebug.js +++ b/src/ol/source/TileDebug.js @@ -101,7 +101,7 @@ class LabeledTile extends Tile { */ class TileDebug extends XYZ { /** - * @param {Options=} opt_options Debug tile options. + * @param {Options} [opt_options] Debug tile options. */ constructor(opt_options) { /** diff --git a/src/ol/source/TileWMS.js b/src/ol/source/TileWMS.js index c6dcc27109..a0aa4dcd3f 100644 --- a/src/ol/source/TileWMS.js +++ b/src/ol/source/TileWMS.js @@ -77,7 +77,7 @@ import {hash as tileCoordHash} from '../tilecoord.js'; */ class TileWMS extends TileImage { /** - * @param {Options=} [opt_options] Tile WMS options. + * @param {Options} [opt_options] Tile WMS options. */ constructor(opt_options) { const options = opt_options ? opt_options : /** @type {Options} */ ({}); diff --git a/src/ol/source/UTFGrid.js b/src/ol/source/UTFGrid.js index c5b96469b3..7d5c97895b 100644 --- a/src/ol/source/UTFGrid.js +++ b/src/ol/source/UTFGrid.js @@ -132,7 +132,7 @@ export class CustomTile extends Tile { * for given coordinate (or `null` if not yet loaded). * @param {import("../coordinate.js").Coordinate} coordinate Coordinate. * @param {function(*): void} callback Callback. - * @param {boolean=} opt_request If `true` the callback is always async. + * @param {boolean} [opt_request] If `true` the callback is always async. * The tile data is requested if not yet loaded. */ forDataAtCoordinate(coordinate, callback, opt_request) { @@ -378,7 +378,7 @@ class UTFGrid extends TileSource { * @param {import("../coordinate.js").Coordinate} coordinate Coordinate. * @param {number} resolution Resolution. * @param {function(*): void} callback Callback. - * @param {boolean=} opt_request If `true` the callback is always async. + * @param {boolean} [opt_request] If `true` the callback is always async. * The tile data is requested if not yet loaded. * @api */ diff --git a/src/ol/source/UrlTile.js b/src/ol/source/UrlTile.js index f0d20eb3a4..6351fd7c41 100644 --- a/src/ol/source/UrlTile.js +++ b/src/ol/source/UrlTile.js @@ -162,7 +162,7 @@ class UrlTile extends TileSource { /** * Set the tile URL function of the source. * @param {import("../Tile.js").UrlFunction} tileUrlFunction Tile URL function. - * @param {string=} key Optional new tile key for the source. + * @param {string} [key] Optional new tile key for the source. * @api */ setTileUrlFunction(tileUrlFunction, key) { diff --git a/src/ol/source/Vector.js b/src/ol/source/Vector.js index 9c6e076c1f..e686c8f335 100644 --- a/src/ol/source/Vector.js +++ b/src/ol/source/Vector.js @@ -39,8 +39,8 @@ import {xhr} from '../featureloader.js'; export class VectorSourceEvent extends Event { /** * @param {string} type Type. - * @param {import("../Feature.js").default=} opt_feature Feature. - * @param {Array>=} opt_features Features. + * @param {import("../Feature.js").default} [opt_feature] Feature. + * @param {Array>} [opt_features] Features. */ constructor(type, opt_feature, opt_features) { super(type); @@ -165,7 +165,7 @@ export class VectorSourceEvent extends Event { */ class VectorSource extends Source { /** - * @param {Options=} opt_options Vector source options. + * @param {Options} [opt_options] Vector source options. */ constructor(opt_options) { const options = opt_options || {}; @@ -500,7 +500,7 @@ class VectorSource extends Source { /** * Remove all features from the source. - * @param {boolean=} opt_fast Skip dispatching of {@link module:ol/source/Vector.VectorSourceEvent#removefeature} events. + * @param {boolean} [opt_fast] Skip dispatching of {@link module:ol/source/Vector.VectorSourceEvent#removefeature} events. * @api */ clear(opt_fast) { @@ -712,7 +712,7 @@ class VectorSource extends Source { * This method is not available when the source is configured with * `useSpatialIndex` set to `false`. * @param {import("../coordinate.js").Coordinate} coordinate Coordinate. - * @param {function(import("../Feature.js").default):boolean=} opt_filter Feature filter function. + * @param {function(import("../Feature.js").default):boolean} [opt_filter] Feature filter function. * The filter function will receive one argument, the {@link module:ol/Feature feature} * and it should return a boolean value. By default, no filtering is made. * @return {import("../Feature.js").default} Closest feature. @@ -771,7 +771,7 @@ class VectorSource extends Source { * * This method is not available when the source is configured with * `useSpatialIndex` set to `false`. - * @param {import("../extent.js").Extent=} opt_extent Destination extent. If provided, no new extent + * @param {import("../extent.js").Extent} [opt_extent] Destination extent. If provided, no new extent * will be created. Instead, that extent's coordinates will be overwritten. * @return {import("../extent.js").Extent} Extent. * @api diff --git a/src/ol/source/XYZ.js b/src/ol/source/XYZ.js index 24f98456d1..5bb759e119 100644 --- a/src/ol/source/XYZ.js +++ b/src/ol/source/XYZ.js @@ -69,7 +69,7 @@ import {createXYZ, extentFromProjection} from '../tilegrid.js'; */ class XYZ extends TileImage { /** - * @param {Options=} opt_options XYZ options. + * @param {Options} [opt_options] XYZ options. */ constructor(opt_options) { const options = opt_options || {}; diff --git a/src/ol/source/Zoomify.js b/src/ol/source/Zoomify.js index 0531e9634c..ae7c950d8b 100644 --- a/src/ol/source/Zoomify.js +++ b/src/ol/source/Zoomify.js @@ -29,7 +29,7 @@ export class CustomTile extends ImageTile { * @param {string} src Image source URI. * @param {?string} crossOrigin Cross origin. * @param {import("../Tile.js").LoadFunction} tileLoadFunction Tile load function. - * @param {import("../Tile.js").Options=} opt_options Tile options. + * @param {import("../Tile.js").Options} [opt_options] Tile options. */ constructor( tileSize, diff --git a/src/ol/sphere.js b/src/ol/sphere.js index 4f41b307d6..3d85297dec 100644 --- a/src/ol/sphere.js +++ b/src/ol/sphere.js @@ -27,7 +27,7 @@ export const DEFAULT_RADIUS = 6371008.8; * Get the great circle distance (in meters) between two geographic coordinates. * @param {Array} c1 Starting coordinate. * @param {Array} c2 Ending coordinate. - * @param {number=} opt_radius The sphere radius to use. Defaults to the Earth's + * @param {number} [opt_radius] The sphere radius to use. Defaults to the Earth's * mean radius using the WGS84 ellipsoid. * @return {number} The great circle distance between the points (in meters). * @api @@ -67,7 +67,7 @@ function getLengthInternal(coordinates, radius) { * the sum of all rings. For points, the length is zero. For multi-part * geometries, the length is the sum of the length of each part. * @param {import("./geom/Geometry.js").default} geometry A geometry. - * @param {SphereMetricOptions=} opt_options Options for the + * @param {SphereMetricOptions} [opt_options] Options for the * length calculation. By default, geometries are assumed to be in 'EPSG:3857'. * You can change this by providing a `projection` option. * @return {number} The spherical length (in meters). @@ -161,7 +161,7 @@ function getAreaInternal(coordinates, radius) { * Get the spherical area of a geometry. This is the area (in meters) assuming * that polygon edges are segments of great circles on a sphere. * @param {import("./geom/Geometry.js").default} geometry A geometry. - * @param {SphereMetricOptions=} opt_options Options for the area + * @param {SphereMetricOptions} [opt_options] Options for the area * calculation. By default, geometries are assumed to be in 'EPSG:3857'. * You can change this by providing a `projection` option. * @return {number} The spherical area (in square meters). @@ -225,7 +225,7 @@ export function getArea(geometry, opt_options) { * @param {number} distance The great-circle distance between the origin * point and the target point. * @param {number} bearing The bearing (in radians). - * @param {number=} opt_radius The sphere radius to use. Defaults to the Earth's + * @param {number} [opt_radius] The sphere radius to use. Defaults to the Earth's * mean radius using the WGS84 ellipsoid. * @return {import("./coordinate.js").Coordinate} The target point. */ diff --git a/src/ol/string.js b/src/ol/string.js index 8c8289e82b..ee2790ba6b 100644 --- a/src/ol/string.js +++ b/src/ol/string.js @@ -5,7 +5,7 @@ /** * @param {number} number Number to be formatted * @param {number} width The desired width - * @param {number=} opt_precision Precision of the output string (i.e. number of decimal places) + * @param {number} [opt_precision] Precision of the output string (i.e. number of decimal places) * @return {string} Formatted string */ export function padNumber(number, width, opt_precision) { diff --git a/src/ol/structs/LRUCache.js b/src/ol/structs/LRUCache.js index fbae5b6d29..ae8a024c4b 100644 --- a/src/ol/structs/LRUCache.js +++ b/src/ol/structs/LRUCache.js @@ -23,7 +23,7 @@ import {assert} from '../asserts.js'; */ class LRUCache { /** - * @param {number=} opt_highWaterMark High water mark. + * @param {number} [opt_highWaterMark] High water mark. */ constructor(opt_highWaterMark) { /** @@ -100,7 +100,7 @@ class LRUCache { /** * @param {string} key Key. - * @param {*=} opt_options Options (reserverd for subclasses). + * @param {*} [opt_options] Options (reserverd for subclasses). * @return {T} Value. */ get(key, opt_options) { diff --git a/src/ol/structs/LinkedList.js b/src/ol/structs/LinkedList.js index 48b6bffa26..09e53b4506 100644 --- a/src/ol/structs/LinkedList.js +++ b/src/ol/structs/LinkedList.js @@ -15,7 +15,7 @@ */ class LinkedList { /** - * @param {boolean=} opt_circular The last item is connected to the first one, + * @param {boolean} [opt_circular] The last item is connected to the first one, * and the first item to the last one. Default is true. */ constructor(opt_circular) { diff --git a/src/ol/structs/RBush.js b/src/ol/structs/RBush.js index 10f0a52abd..a9d7dc5b4e 100644 --- a/src/ol/structs/RBush.js +++ b/src/ol/structs/RBush.js @@ -24,7 +24,7 @@ import {isEmpty} from '../obj.js'; */ class RBush { /** - * @param {number=} opt_maxEntries Max entries. + * @param {number} [opt_maxEntries] Max entries. */ constructor(opt_maxEntries) { /** @@ -198,7 +198,7 @@ class RBush { } /** - * @param {import("../extent.js").Extent=} opt_extent Extent. + * @param {import("../extent.js").Extent} [opt_extent] Extent. * @return {import("../extent.js").Extent} Extent. */ getExtent(opt_extent) { diff --git a/src/ol/style/Circle.js b/src/ol/style/Circle.js index 122c6a4226..ef890c3a58 100644 --- a/src/ol/style/Circle.js +++ b/src/ol/style/Circle.js @@ -25,7 +25,7 @@ import RegularShape from './RegularShape.js'; */ class CircleStyle extends RegularShape { /** - * @param {Options=} opt_options Options. + * @param {Options} [opt_options] Options. */ constructor(opt_options) { const options = opt_options ? opt_options : {}; diff --git a/src/ol/style/Fill.js b/src/ol/style/Fill.js index a04af10b27..cb96102514 100644 --- a/src/ol/style/Fill.js +++ b/src/ol/style/Fill.js @@ -16,7 +16,7 @@ */ class Fill { /** - * @param {Options=} opt_options Options. + * @param {Options} [opt_options] Options. */ constructor(opt_options) { const options = opt_options || {}; diff --git a/src/ol/style/Icon.js b/src/ol/style/Icon.js index 540c9361f9..d3c6fa3577 100644 --- a/src/ol/style/Icon.js +++ b/src/ol/style/Icon.js @@ -53,7 +53,7 @@ import {getUid} from '../util.js'; */ class Icon extends ImageStyle { /** - * @param {Options=} opt_options Options. + * @param {Options} [opt_options] Options. */ constructor(opt_options) { const options = opt_options || {}; diff --git a/src/ol/style/Stroke.js b/src/ol/style/Stroke.js index e3885f56de..69931d6d06 100644 --- a/src/ol/style/Stroke.js +++ b/src/ol/style/Stroke.js @@ -27,7 +27,7 @@ */ class Stroke { /** - * @param {Options=} opt_options Options. + * @param {Options} [opt_options] Options. */ constructor(opt_options) { const options = opt_options || {}; diff --git a/src/ol/style/Style.js b/src/ol/style/Style.js index 55d4ed6253..aa16023376 100644 --- a/src/ol/style/Style.js +++ b/src/ol/style/Style.js @@ -147,7 +147,7 @@ import {assert} from '../asserts.js'; */ class Style { /** - * @param {Options=} opt_options Style options. + * @param {Options} [opt_options] Style options. */ constructor(opt_options) { const options = opt_options || {}; diff --git a/src/ol/style/Text.js b/src/ol/style/Text.js index a245e6f2d8..5a129772ac 100644 --- a/src/ol/style/Text.js +++ b/src/ol/style/Text.js @@ -50,7 +50,7 @@ const DEFAULT_FILL_COLOR = '#333'; */ class Text { /** - * @param {Options=} opt_options Options. + * @param {Options} [opt_options] Options. */ constructor(opt_options) { const options = opt_options || {}; diff --git a/src/ol/tilecoord.js b/src/ol/tilecoord.js index 9c3c612856..fbd65e6db5 100644 --- a/src/ol/tilecoord.js +++ b/src/ol/tilecoord.js @@ -13,7 +13,7 @@ * @param {number} z Z. * @param {number} x X. * @param {number} y Y. - * @param {TileCoord=} opt_tileCoord Tile coordinate. + * @param {TileCoord} [opt_tileCoord] Tile coordinate. * @return {TileCoord} Tile coordinate. */ export function createOrUpdate(z, x, y, opt_tileCoord) { diff --git a/src/ol/tilegrid.js b/src/ol/tilegrid.js index c31f58c740..c342cf6e8c 100644 --- a/src/ol/tilegrid.js +++ b/src/ol/tilegrid.js @@ -53,11 +53,11 @@ export function wrapX(tileGrid, tileCoord, projection) { /** * @param {import("./extent.js").Extent} extent Extent. - * @param {number=} opt_maxZoom Maximum zoom level (default is + * @param {number} [opt_maxZoom] Maximum zoom level (default is * DEFAULT_MAX_ZOOM). - * @param {number|import("./size.js").Size=} opt_tileSize Tile size (default uses + * @param {number|import("./size.js").Size} [opt_tileSize] Tile size (default uses * DEFAULT_TILE_SIZE). - * @param {import("./extent/Corner.js").default=} opt_corner Extent corner (default is `'top-left'`). + * @param {import("./extent/Corner.js").default} [opt_corner] Extent corner (default is `'top-left'`). * @return {!TileGrid} TileGrid instance. */ export function createForExtent(extent, opt_maxZoom, opt_tileSize, opt_corner) { @@ -87,7 +87,7 @@ export function createForExtent(extent, opt_maxZoom, opt_tileSize, opt_corner) { /** * Creates a tile grid with a standard XYZ tiling scheme. - * @param {XYZOptions=} opt_options Tile grid options. + * @param {XYZOptions} [opt_options] Tile grid options. * @return {!TileGrid} Tile grid instance. * @api */ @@ -113,11 +113,11 @@ export function createXYZ(opt_options) { /** * Create a resolutions array from an extent. A zoom factor of 2 is assumed. * @param {import("./extent.js").Extent} extent Extent. - * @param {number=} opt_maxZoom Maximum zoom level (default is + * @param {number} [opt_maxZoom] Maximum zoom level (default is * DEFAULT_MAX_ZOOM). - * @param {number|import("./size.js").Size=} opt_tileSize Tile size (default uses + * @param {number|import("./size.js").Size} [opt_tileSize] Tile size (default uses * DEFAULT_TILE_SIZE). - * @param {number=} opt_maxResolution Resolution at level zero. + * @param {number} [opt_maxResolution] Resolution at level zero. * @return {!Array} Resolutions array. */ function resolutionsFromExtent( @@ -149,11 +149,11 @@ function resolutionsFromExtent( /** * @param {import("./proj.js").ProjectionLike} projection Projection. - * @param {number=} opt_maxZoom Maximum zoom level (default is + * @param {number} [opt_maxZoom] Maximum zoom level (default is * DEFAULT_MAX_ZOOM). - * @param {number|import("./size.js").Size=} opt_tileSize Tile size (default uses + * @param {number|import("./size.js").Size} [opt_tileSize] Tile size (default uses * DEFAULT_TILE_SIZE). - * @param {import("./extent/Corner.js").default=} opt_corner Extent corner (default is `'top-left'`). + * @param {import("./extent/Corner.js").default} [opt_corner] Extent corner (default is `'top-left'`). * @return {!TileGrid} TileGrid instance. */ export function createForProjection( diff --git a/src/ol/tilegrid/TileGrid.js b/src/ol/tilegrid/TileGrid.js index 97372ec2ad..9758aa780a 100644 --- a/src/ol/tilegrid/TileGrid.js +++ b/src/ol/tilegrid/TileGrid.js @@ -222,8 +222,8 @@ class TileGrid { /** * @param {import("../tilecoord.js").TileCoord} tileCoord Tile coordinate. * @param {function(number, import("../TileRange.js").default): boolean} callback Callback. - * @param {import("../TileRange.js").default=} opt_tileRange Temporary import("../TileRange.js").default object. - * @param {import("../extent.js").Extent=} opt_extent Temporary import("../extent.js").Extent object. + * @param {import("../TileRange.js").default} [opt_tileRange] Temporary import("../TileRange.js").default object. + * @param {import("../extent.js").Extent} [opt_extent] Temporary import("../extent.js").Extent object. * @return {boolean} Callback succeeded. */ forEachTileCoordParentTileRange( @@ -323,8 +323,8 @@ class TileGrid { /** * @param {import("../tilecoord.js").TileCoord} tileCoord Tile coordinate. - * @param {import("../TileRange.js").default=} opt_tileRange Temporary import("../TileRange.js").default object. - * @param {import("../extent.js").Extent=} opt_extent Temporary import("../extent.js").Extent object. + * @param {import("../TileRange.js").default} [opt_tileRange] Temporary import("../TileRange.js").default object. + * @param {import("../extent.js").Extent} [opt_extent] Temporary import("../extent.js").Extent object. * @return {import("../TileRange.js").default} Tile range. */ getTileCoordChildTileRange(tileCoord, opt_tileRange, opt_extent) { @@ -354,7 +354,7 @@ class TileGrid { * Get the extent for a tile range. * @param {number} z Integer zoom level. * @param {import("../TileRange.js").default} tileRange Tile range. - * @param {import("../extent.js").Extent=} opt_extent Temporary import("../extent.js").Extent object. + * @param {import("../extent.js").Extent} [opt_extent] Temporary import("../extent.js").Extent object. * @return {import("../extent.js").Extent} Extent. */ getTileRangeExtent(z, tileRange, opt_extent) { @@ -372,7 +372,7 @@ class TileGrid { * Get a tile range for the given extent and integer zoom level. * @param {import("../extent.js").Extent} extent Extent. * @param {number} z Integer zoom level. - * @param {import("../TileRange.js").default=} opt_tileRange Temporary tile range object. + * @param {import("../TileRange.js").default} [opt_tileRange] Temporary tile range object. * @return {import("../TileRange.js").default} Tile range. */ getTileRangeForExtentAndZ(extent, z, opt_tileRange) { @@ -408,7 +408,7 @@ class TileGrid { * Get the extent of a tile coordinate. * * @param {import("../tilecoord.js").TileCoord} tileCoord Tile coordinate. - * @param {import("../extent.js").Extent=} opt_extent Temporary extent object. + * @param {import("../extent.js").Extent} [opt_extent] Temporary extent object. * @return {import("../extent.js").Extent} Extent. * @api */ @@ -430,7 +430,7 @@ class TileGrid { * * @param {import("../coordinate.js").Coordinate} coordinate Coordinate. * @param {number} resolution Resolution. - * @param {import("../tilecoord.js").TileCoord=} opt_tileCoord Destination import("../tilecoord.js").TileCoord object. + * @param {import("../tilecoord.js").TileCoord} [opt_tileCoord] Destination import("../tilecoord.js").TileCoord object. * @return {import("../tilecoord.js").TileCoord} Tile coordinate. * @api */ @@ -453,7 +453,7 @@ class TileGrid { * @param {boolean} reverseIntersectionPolicy Instead of letting edge * intersections go to the higher tile coordinate, let edge intersections * go to the lower tile coordinate. - * @param {import("../tilecoord.js").TileCoord=} opt_tileCoord Temporary import("../tilecoord.js").TileCoord object. + * @param {import("../tilecoord.js").TileCoord} [opt_tileCoord] Temporary import("../tilecoord.js").TileCoord object. * @return {import("../tilecoord.js").TileCoord} Tile coordinate. * @private */ @@ -498,7 +498,7 @@ class TileGrid { * @param {boolean} reverseIntersectionPolicy Instead of letting edge * intersections go to the higher tile coordinate, let edge intersections * go to the lower tile coordinate. - * @param {import("../tilecoord.js").TileCoord=} opt_tileCoord Temporary import("../tilecoord.js").TileCoord object. + * @param {import("../tilecoord.js").TileCoord} [opt_tileCoord] Temporary import("../tilecoord.js").TileCoord object. * @return {import("../tilecoord.js").TileCoord} Tile coordinate. * @private */ @@ -529,7 +529,7 @@ class TileGrid { * Get a tile coordinate given a map coordinate and zoom level. * @param {import("../coordinate.js").Coordinate} coordinate Coordinate. * @param {number} z Zoom level. - * @param {import("../tilecoord.js").TileCoord=} opt_tileCoord Destination import("../tilecoord.js").TileCoord object. + * @param {import("../tilecoord.js").TileCoord} [opt_tileCoord] Destination import("../tilecoord.js").TileCoord object. * @return {import("../tilecoord.js").TileCoord} Tile coordinate. * @api */ @@ -583,7 +583,7 @@ class TileGrid { /** * @param {number} resolution Resolution. - * @param {number=} opt_direction If 0, the nearest resolution will be used. + * @param {number} [opt_direction] 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. Default is 0. * @return {number} Z. diff --git a/src/ol/tilegrid/WMTS.js b/src/ol/tilegrid/WMTS.js index f7617c773e..45005b6efb 100644 --- a/src/ol/tilegrid/WMTS.js +++ b/src/ol/tilegrid/WMTS.js @@ -90,9 +90,9 @@ export default WMTSTileGrid; * optional TileMatrixSetLimits. * @param {Object} matrixSet An object representing a matrixSet in the * capabilities document. - * @param {import("../extent.js").Extent=} opt_extent An optional extent to restrict the tile + * @param {import("../extent.js").Extent} [opt_extent] An optional extent to restrict the tile * ranges the server provides. - * @param {Array=} opt_matrixLimits An optional object representing + * @param {Array} [opt_matrixLimits] An optional object representing * the available matrices for tileGrid. * @return {WMTSTileGrid} WMTS tileGrid instance. * @api diff --git a/src/ol/webgl.js b/src/ol/webgl.js index c587143393..2e9ace2315 100644 --- a/src/ol/webgl.js +++ b/src/ol/webgl.js @@ -85,7 +85,7 @@ const CONTEXT_IDS = ['experimental-webgl', 'webgl', 'webkit-3d', 'moz-webgl']; /** * @param {HTMLCanvasElement} canvas Canvas. - * @param {Object=} opt_attributes Attributes. + * @param {Object} [opt_attributes] Attributes. * @return {WebGLRenderingContext} WebGL rendering context. */ export function getContext(canvas, opt_attributes) { diff --git a/src/ol/webgl/Buffer.js b/src/ol/webgl/Buffer.js index 7a09f74a6a..d15b54312f 100644 --- a/src/ol/webgl/Buffer.js +++ b/src/ol/webgl/Buffer.js @@ -35,7 +35,7 @@ export const BufferUsage = { class WebGLArrayBuffer { /** * @param {number} type Buffer type, either ARRAY_BUFFER or ELEMENT_ARRAY_BUFFER. - * @param {number=} opt_usage Intended usage, either `STATIC_DRAW`, `STREAM_DRAW` or `DYNAMIC_DRAW`. + * @param {number} [opt_usage] Intended usage, either `STATIC_DRAW`, `STREAM_DRAW` or `DYNAMIC_DRAW`. * Default is `DYNAMIC_DRAW`. */ constructor(type, opt_usage) { diff --git a/src/ol/webgl/Helper.js b/src/ol/webgl/Helper.js index ec1aafa9c5..39d65b33dd 100644 --- a/src/ol/webgl/Helper.js +++ b/src/ol/webgl/Helper.js @@ -105,7 +105,7 @@ export const AttributeType = { /** * @typedef {Object} UniformInternalDescription * @property {string} name Name - * @property {UniformValue=} value Value + * @property {UniformValue} [value] Value * @property {WebGLTexture} [texture] Texture * @private */ @@ -238,7 +238,7 @@ export const AttributeType = { */ class WebGLHelper extends Disposable { /** - * @param {Options=} opt_options Options. + * @param {Options} [opt_options] Options. */ constructor(opt_options) { super(); diff --git a/src/ol/xml.js b/src/ol/xml.js index a7377838a5..40cf9765bb 100644 --- a/src/ol/xml.js +++ b/src/ol/xml.js @@ -106,7 +106,7 @@ export function parse(xml) { * Make an array extender function for extending the array at the top of the * object stack. * @param {function(this: T, Node, Array<*>): (Array<*>|undefined)} valueReader Value reader. - * @param {T=} opt_this The object to use as `this` in `valueReader`. + * @param {T} [opt_this] The object to use as `this` in `valueReader`. * @return {Parser} Parser. * @template T */ @@ -136,7 +136,7 @@ export function makeArrayExtender(valueReader, opt_this) { * Make an array pusher function for pushing to the array at the top of the * object stack. * @param {function(this: T, Element, Array<*>): *} valueReader Value reader. - * @param {T=} opt_this The object to use as `this` in `valueReader`. + * @param {T} [opt_this] The object to use as `this` in `valueReader`. * @return {Parser} Parser. * @template T */ @@ -166,7 +166,7 @@ export function makeArrayPusher(valueReader, opt_this) { * Make an object stack replacer function for replacing the object at the * top of the stack. * @param {function(this: T, Node, Array<*>): *} valueReader Value reader. - * @param {T=} opt_this The object to use as `this` in `valueReader`. + * @param {T} [opt_this] The object to use as `this` in `valueReader`. * @return {Parser} Parser. * @template T */ @@ -193,8 +193,8 @@ export function makeReplacer(valueReader, opt_this) { * Make an object property pusher function for adding a property to the * object at the top of the stack. * @param {function(this: T, Element, Array<*>): *} valueReader Value reader. - * @param {string=} opt_property Property. - * @param {T=} opt_this The object to use as `this` in `valueReader`. + * @param {string} [opt_property] Property. + * @param {T} [opt_this] The object to use as `this` in `valueReader`. * @return {Parser} Parser. * @template T */ @@ -232,8 +232,8 @@ export function makeObjectPropertyPusher(valueReader, opt_property, opt_this) { /** * Make an object property setter function. * @param {function(this: T, Element, Array<*>): *} valueReader Value reader. - * @param {string=} opt_property Property. - * @param {T=} opt_this The object to use as `this` in `valueReader`. + * @param {string} [opt_property] Property. + * @param {T} [opt_this] The object to use as `this` in `valueReader`. * @return {Parser} Parser. * @template T */ @@ -266,7 +266,7 @@ export function makeObjectPropertySetter(valueReader, opt_property, opt_this) { * designated parent. The parent is the `node` of the * {@link module:ol/xml~NodeStackItem} at the top of the `objectStack`. * @param {function(this: T, Node, V, Array<*>): void} nodeWriter Node writer. - * @param {T=} opt_this The object to use as `this` in `nodeWriter`. + * @param {T} [opt_this] The object to use as `this` in `nodeWriter`. * @return {Serializer} Serializer. * @template T, V */ @@ -294,7 +294,7 @@ export function makeChildAppender(nodeWriter, opt_this) { * geometry writer, which could be reused for writing MultiLineString * geometries. * @param {function(this: T, Element, V, Array<*>): void} nodeWriter Node writer. - * @param {T=} opt_this The object to use as `this` in `nodeWriter`. + * @param {T} [opt_this] The object to use as `this` in `nodeWriter`. * @return {Serializer} Serializer. * @template T, V */ @@ -317,10 +317,10 @@ export function makeArraySerializer(nodeWriter, opt_this) { * {@link module:ol/xml~serialize} or {@link module:ol/xml~pushSerializeAndPop} as node names, * or a fixed node name. The namespace of the created nodes can either be fixed, * or the parent namespace will be used. - * @param {string=} opt_nodeName Fixed node name which will be used for all + * @param {string} [opt_nodeName] Fixed node name which will be used for all * created nodes. If not provided, the 3rd argument to the resulting node * factory needs to be provided and will be the nodeName. - * @param {string=} opt_namespaceURI Fixed namespace URI which will be used for + * @param {string} [opt_namespaceURI] Fixed namespace URI which will be used for * all created nodes. If not provided, the namespace of the parent node will * be used. * @return {function(*, Array<*>, string=): (Node|undefined)} Node factory. @@ -331,7 +331,7 @@ export function makeSimpleNodeFactory(opt_nodeName, opt_namespaceURI) { /** * @param {*} value Value. * @param {Array<*>} objectStack Object stack. - * @param {string=} opt_nodeName Node name. + * @param {string} [opt_nodeName] Node name. * @return {Node} Node. */ function (value, objectStack, opt_nodeName) { @@ -386,7 +386,7 @@ export function makeSequence(object, orderedKeys) { * values are version specific. * @param {Array} namespaceURIs Namespace URIs. * @param {T} structure Structure. - * @param {Object=} opt_structureNS Namespaced structure to add to. + * @param {Object} [opt_structureNS] Namespaced structure to add to. * @return {Object} Namespaced structure. * @template T */ @@ -408,7 +408,7 @@ export function makeStructureNS(namespaceURIs, structure, opt_structureNS) { * Parsers by namespace. * @param {Element} node Node. * @param {Array<*>} objectStack Object stack. - * @param {*=} opt_this The object to use as `this`. + * @param {*} [opt_this] The object to use as `this`. */ export function parseNode(parsersNS, node, objectStack, opt_this) { let n; @@ -430,7 +430,7 @@ export function parseNode(parsersNS, node, objectStack, opt_this) { * Parsers by namespace. * @param {Element} node Node. * @param {Array<*>} objectStack Object stack. - * @param {*=} opt_this The object to use as `this`. + * @param {*} [opt_this] The object to use as `this`. * @return {T} Object. * @template T */ @@ -459,12 +459,12 @@ export function pushParseAndPop( * @param {Array<*>} values Values to serialize. An example would be an array * of {@link module:ol/Feature~Feature} instances. * @param {Array<*>} objectStack Node stack. - * @param {Array=} opt_keys Keys of the `values`. Will be passed to the + * @param {Array} [opt_keys] Keys of the `values`. Will be passed to the * `nodeFactory`. This is used for serializing object literals where the * node name relates to the property key. The array length of `opt_keys` has * to match the length of `values`. For serializing a sequence, `opt_keys` * determines the order of the sequence. - * @param {T=} opt_this The object to use as `this` for the node factory and + * @param {T} [opt_this] The object to use as `this` for the node factory and * serializers. * @template T */ @@ -512,12 +512,12 @@ export function serialize( * @param {Array<*>} values Values to serialize. An example would be an array * of {@link module:ol/Feature~Feature} instances. * @param {Array<*>} objectStack Node stack. - * @param {Array=} opt_keys Keys of the `values`. Will be passed to the + * @param {Array} [opt_keys] Keys of the `values`. Will be passed to the * `nodeFactory`. This is used for serializing object literals where the * node name relates to the property key. The array length of `opt_keys` has * to match the length of `values`. For serializing a sequence, `opt_keys` * determines the order of the sequence. - * @param {T=} opt_this The object to use as `this` for the node factory and + * @param {T} [opt_this] The object to use as `this` for the node factory and * serializers. * @return {O|undefined} Object. * @template O, T diff --git a/test/spec/ol/interaction/draw.test.js b/test/spec/ol/interaction/draw.test.js index c7ed96369e..0aad9df692 100644 --- a/test/spec/ol/interaction/draw.test.js +++ b/test/spec/ol/interaction/draw.test.js @@ -75,8 +75,8 @@ describe('ol.interaction.Draw', function () { * @param {string} type Event type. * @param {number} x Horizontal offset from map center. * @param {number} y Vertical offset from map center. - * @param {boolean=} opt_shiftKey Shift key is pressed. - * @param {boolean=} opt_pointerId Pointer id. + * @param {boolean} [opt_shiftKey] Shift key is pressed. + * @param {boolean} [opt_pointerId] Pointer id. * @return {module:ol/MapBrowserEvent} The simulated event. */ function simulateEvent(type, x, y, opt_shiftKey, opt_pointerId = 0) { diff --git a/test/spec/ol/interaction/extent.test.js b/test/spec/ol/interaction/extent.test.js index aeabf4e4f0..00c325ec63 100644 --- a/test/spec/ol/interaction/extent.test.js +++ b/test/spec/ol/interaction/extent.test.js @@ -41,7 +41,7 @@ describe('ol.interaction.Extent', function () { * @param {string} type Event type. * @param {number} x Horizontal offset from map center. * @param {number} y Vertical offset from map center. - * @param {boolean=} opt_shiftKey Shift key is pressed. + * @param {boolean} [opt_shiftKey] Shift key is pressed. * @param {number} button The mouse button. */ function simulateEvent(type, x, y, opt_shiftKey, button) { diff --git a/test/spec/ol/interaction/select.test.js b/test/spec/ol/interaction/select.test.js index 5e8377f7c4..e0c76bcc5b 100644 --- a/test/spec/ol/interaction/select.test.js +++ b/test/spec/ol/interaction/select.test.js @@ -92,7 +92,7 @@ describe('ol.interaction.Select', function () { * @param {string} type Event type. * @param {number} x Horizontal offset from map center. * @param {number} y Vertical offset from map center. - * @param {boolean=} opt_shiftKey Shift key is pressed. + * @param {boolean} [opt_shiftKey] Shift key is pressed. */ function simulateEvent(type, x, y, opt_shiftKey) { const viewport = map.getViewport(); diff --git a/test/spec/ol/interaction/translate.test.js b/test/spec/ol/interaction/translate.test.js index 4a11399333..4b8038287a 100644 --- a/test/spec/ol/interaction/translate.test.js +++ b/test/spec/ol/interaction/translate.test.js @@ -62,7 +62,7 @@ describe('ol.interaction.Translate', function () { * @param {string} type Event type. * @param {number} x Horizontal offset from map center. * @param {number} y Vertical offset from map center. - * @param {boolean=} opt_shiftKey Shift key is pressed. + * @param {boolean} [opt_shiftKey] Shift key is pressed. */ function simulateEvent(type, x, y, opt_shiftKey) { const viewport = map.getViewport(); diff --git a/test/spec/ol/renderer/canvas/builder.test.js b/test/spec/ol/renderer/canvas/builder.test.js index 9ceda6f06f..400e3fafae 100644 --- a/test/spec/ol/renderer/canvas/builder.test.js +++ b/test/spec/ol/renderer/canvas/builder.test.js @@ -29,8 +29,8 @@ describe('ol.render.canvas.BuilderGroup', function () { /** * @param {BuilderGroup} builder The builder to get instructions from. - * @param {number=} pixelRatio The pixel ratio. - * @param {boolean=} overlaps Whether there is overlaps. + * @param {number} [pixelRatio] The pixel ratio. + * @param {boolean} [overlaps] Whether there is overlaps. */ function execute(builder, pixelRatio, overlaps) { const executor = new ExecutorGroup( From bd489fec4cecb9d427acb0edaf487a74a4bb7966 Mon Sep 17 00:00:00 2001 From: Simon Seyock Date: Wed, 3 Feb 2021 22:40:14 +0100 Subject: [PATCH 451/525] Fix strict null checking for format/WKT NOTE: `EMPTY` may only occur immediately after geometry type --- src/ol/format/Feature.js | 10 +-- src/ol/format/TextFeature.js | 4 +- src/ol/format/WKT.js | 140 ++++++++++++++++------------------- 3 files changed, 70 insertions(+), 84 deletions(-) diff --git a/src/ol/format/Feature.js b/src/ol/format/Feature.js index 24a887c0cc..67cecd902c 100644 --- a/src/ol/format/Feature.js +++ b/src/ol/format/Feature.js @@ -67,15 +67,15 @@ class FeatureFormat { constructor() { /** * @protected - * @type {import("../proj/Projection.js").default} + * @type {import("../proj/Projection.js").default|undefined} */ - this.dataProjection = null; + this.dataProjection = undefined; /** * @protected - * @type {import("../proj/Projection.js").default} + * @type {import("../proj/Projection.js").default|undefined} */ - this.defaultFeatureProjection = null; + this.defaultFeatureProjection = undefined; } /** @@ -175,7 +175,7 @@ class FeatureFormat { * * @abstract * @param {Document|Element|Object|string} source Source. - * @return {import("../proj/Projection.js").default} Projection. + * @return {import("../proj/Projection.js").default|undefined} Projection. */ readProjection(source) { return abstract(); diff --git a/src/ol/format/TextFeature.js b/src/ol/format/TextFeature.js index 41e47babcb..8787f03915 100644 --- a/src/ol/format/TextFeature.js +++ b/src/ol/format/TextFeature.js @@ -107,7 +107,7 @@ class TextFeature extends FeatureFormat { * Read the projection from the source. * * @param {Document|Element|Object|string} source Source. - * @return {import("../proj/Projection.js").default} Projection. + * @return {import("../proj/Projection.js").default|undefined} Projection. * @api */ readProjection(source) { @@ -117,7 +117,7 @@ class TextFeature extends FeatureFormat { /** * @param {string} text Text. * @protected - * @return {import("../proj/Projection.js").default} Projection. + * @return {import("../proj/Projection.js").default|undefined} Projection. */ readProjectionFromText(text) { return this.dataProjection; diff --git a/src/ol/format/WKT.js b/src/ol/format/WKT.js index f2ee8ebc9f..6684d8f7c0 100644 --- a/src/ol/format/WKT.js +++ b/src/ol/format/WKT.js @@ -69,6 +69,7 @@ const ZM = 'ZM'; * @enum {number} */ const TokenType = { + START: 0, TEXT: 1, LEFT_PAREN: 2, RIGHT_PAREN: 3, @@ -146,7 +147,7 @@ class Lexer { /** * Fetch and return the next token. - * @return {!Token} Next string token. + * @return {Token} Next string token. */ nextToken() { const c = this.nextChar_(); @@ -238,7 +239,10 @@ class Parser { * @type {Token} * @private */ - this.token_; + this.token_ = { + position: 0, + type: TokenType.START, + }; /** * @type {import("../geom/GeometryLayout.js").default} @@ -261,8 +265,7 @@ class Parser { * @return {boolean} Whether the token matches the given type. */ isTokenType(type) { - const isMatch = this.token_.type == type; - return isMatch; + return this.token_.type == type; } /** @@ -284,8 +287,7 @@ class Parser { */ parse() { this.consume_(); - const geometry = this.parseGeometry_(); - return geometry; + return this.parseGeometry_(); } /** @@ -313,7 +315,7 @@ class Parser { } /** - * @return {!Array} A collection of geometries. + * @return {Array} A collection of geometries. * @private */ parseGeometryCollectionText_() { @@ -325,8 +327,6 @@ class Parser { if (this.match(TokenType.RIGHT_PAREN)) { return geometries; } - } else if (this.isEmptyGeometry_()) { - return []; } throw new Error(this.formatErrorMessage_()); } @@ -341,14 +341,12 @@ class Parser { if (this.match(TokenType.RIGHT_PAREN)) { return coordinates; } - } else if (this.isEmptyGeometry_()) { - return null; } throw new Error(this.formatErrorMessage_()); } /** - * @return {!Array>} All points in a linestring. + * @return {Array>} All points in a linestring. * @private */ parseLineStringText_() { @@ -357,14 +355,12 @@ class Parser { if (this.match(TokenType.RIGHT_PAREN)) { return coordinates; } - } else if (this.isEmptyGeometry_()) { - return []; } throw new Error(this.formatErrorMessage_()); } /** - * @return {!Array>>} All points in a polygon. + * @return {Array>>} All points in a polygon. * @private */ parsePolygonText_() { @@ -373,14 +369,12 @@ class Parser { if (this.match(TokenType.RIGHT_PAREN)) { return coordinates; } - } else if (this.isEmptyGeometry_()) { - return []; } throw new Error(this.formatErrorMessage_()); } /** - * @return {!Array>} All points in a multipoint. + * @return {Array>} All points in a multipoint. * @private */ parseMultiPointText_() { @@ -394,14 +388,12 @@ class Parser { if (this.match(TokenType.RIGHT_PAREN)) { return coordinates; } - } else if (this.isEmptyGeometry_()) { - return []; } throw new Error(this.formatErrorMessage_()); } /** - * @return {!Array>>} All linestring points + * @return {Array>>} All linestring points * in a multilinestring. * @private */ @@ -411,14 +403,12 @@ class Parser { if (this.match(TokenType.RIGHT_PAREN)) { return coordinates; } - } else if (this.isEmptyGeometry_()) { - return []; } throw new Error(this.formatErrorMessage_()); } /** - * @return {!Array>>>} All polygon points in a multipolygon. + * @return {Array>>>} All polygon points in a multipolygon. * @private */ parseMultiPolygonText_() { @@ -427,14 +417,12 @@ class Parser { if (this.match(TokenType.RIGHT_PAREN)) { return coordinates; } - } else if (this.isEmptyGeometry_()) { - return []; } throw new Error(this.formatErrorMessage_()); } /** - * @return {!Array} A point. + * @return {Array} A point. * @private */ parsePoint_() { @@ -455,7 +443,7 @@ class Parser { } /** - * @return {!Array>} An array of points. + * @return {Array>} An array of points. * @private */ parsePointList_() { @@ -467,7 +455,7 @@ class Parser { } /** - * @return {!Array>} An array of points. + * @return {Array>} An array of points. * @private */ parsePointTextList_() { @@ -479,7 +467,7 @@ class Parser { } /** - * @return {!Array>>} An array of points. + * @return {Array>>} An array of points. * @private */ parseLineStringTextList_() { @@ -491,7 +479,7 @@ class Parser { } /** - * @return {!Array>>>} An array of points. + * @return {Array>>>} An array of points. * @private */ parsePolygonTextList_() { @@ -533,15 +521,19 @@ class Parser { } /** - * @return {!import("../geom/Geometry.js").default} The geometry. + * @return {import("../geom/Geometry.js").default} The geometry. * @private */ parseGeometry_() { const token = this.token_; if (this.match(TokenType.TEXT)) { - const geomType = token.value; + const geomType = /** @type {string} */ (token.value); this.layout_ = this.parseGeometryLayout_(); + const isEmpty = this.isEmptyGeometry_(); if (geomType == 'GEOMETRYCOLLECTION') { + if (isEmpty) { + return new GeometryCollection([]); + } const geometries = this.parseGeometryCollectionText_(); return new GeometryCollection(geometries); } else { @@ -551,43 +543,44 @@ class Parser { } let coordinates; - switch (geomType) { - case 'POINT': { - coordinates = this.parsePointText_(); - break; - } - case 'LINESTRING': { - coordinates = this.parseLineStringText_(); - break; - } - case 'POLYGON': { - coordinates = this.parsePolygonText_(); - break; - } - case 'MULTIPOINT': { - coordinates = this.parseMultiPointText_(); - break; - } - case 'MULTILINESTRING': { - coordinates = this.parseMultiLineStringText_(); - break; - } - case 'MULTIPOLYGON': { - coordinates = this.parseMultiPolygonText_(); - break; - } - default: { - throw new Error('Invalid geometry type: ' + geomType); - } - } - if (!coordinates) { - if (ctor === GeometryConstructor['POINT']) { + if (isEmpty) { + if (geomType == 'POINT') { coordinates = [NaN, NaN]; } else { coordinates = []; } + } else { + switch (geomType) { + case 'POINT': { + coordinates = this.parsePointText_(); + break; + } + case 'LINESTRING': { + coordinates = this.parseLineStringText_(); + break; + } + case 'POLYGON': { + coordinates = this.parsePolygonText_(); + break; + } + case 'MULTIPOINT': { + coordinates = this.parseMultiPointText_(); + break; + } + case 'MULTILINESTRING': { + coordinates = this.parseMultiLineStringText_(); + break; + } + case 'MULTIPOLYGON': { + coordinates = this.parseMultiPolygonText_(); + break; + } + default: + break; + } } + return new ctor(coordinates, this.layout_); } } @@ -623,7 +616,7 @@ class WKT extends TextFeature { /** * Parse a WKT string. * @param {string} wkt WKT string. - * @return {import("../geom/Geometry.js").default|undefined} + * @return {import("../geom/Geometry.js").default} * The geometry created. * @private */ @@ -641,12 +634,9 @@ class WKT extends TextFeature { */ readFeatureFromText(text, opt_options) { const geom = this.readGeometryFromText(text, opt_options); - if (geom) { - const feature = new Feature(); - feature.setGeometry(geom); - return feature; - } - return null; + const feature = new Feature(); + feature.setGeometry(geom); + return feature; } /** @@ -683,11 +673,7 @@ class WKT extends TextFeature { */ readGeometryFromText(text, opt_options) { const geometry = this.parse_(text); - if (geometry) { - return transformGeometryWithOptions(geometry, false, opt_options); - } else { - return null; - } + return transformGeometryWithOptions(geometry, false, opt_options); } /** @@ -855,7 +841,7 @@ const GeometryEncoder = { /** * Encode a geometry as WKT. - * @param {!import("../geom/Geometry.js").default} geom The geometry to encode. + * @param {import("../geom/Geometry.js").default} geom The geometry to encode. * @return {string} WKT string for the geometry. */ function encode(geom) { From 2ad578979747bc3eacaaf577eb05b65679de7fdd Mon Sep 17 00:00:00 2001 From: Simon Seyock Date: Thu, 4 Feb 2021 18:19:33 +0100 Subject: [PATCH 452/525] Add descriptions for properties. --- src/ol/PluggableMap.js | 38 ++++++++-------- src/ol/VectorRenderTile.js | 16 +++---- src/ol/View.js | 40 ++++++++--------- src/ol/css.js | 14 +++--- src/ol/events.js | 8 ++-- src/ol/format/GPX.js | 4 +- src/ol/format/KML.js | 14 +++--- src/ol/format/WFS.js | 12 ++--- src/ol/format/WKT.js | 6 +-- src/ol/interaction/Modify.js | 12 ++--- src/ol/interaction/Snap.js | 10 ++--- src/ol/layer/Graticule.js | 4 +- src/ol/layer/Layer.js | 20 ++++----- src/ol/render.js | 4 +- src/ol/render/canvas.js | 76 ++++++++++++++++---------------- src/ol/render/canvas/Executor.js | 28 ++++++------ src/ol/renderer/Map.js | 10 ++--- src/ol/reproj.js | 4 +- src/ol/reproj/Triangulation.js | 4 +- src/ol/source/BingMaps.js | 2 +- src/ol/source/IIIF.js | 12 ++--- src/ol/source/Image.js | 8 ++-- src/ol/source/Source.js | 6 +-- src/ol/source/Tile.js | 20 ++++----- src/ol/source/UrlTile.js | 28 ++++++------ src/ol/source/VectorTile.js | 2 +- src/ol/source/Zoomify.js | 2 +- src/ol/structs/LRUCache.js | 8 ++-- src/ol/structs/LinkedList.js | 6 +-- src/ol/structs/RBush.js | 10 ++--- src/ol/style/Image.js | 10 ++--- src/ol/style/RegularShape.js | 16 +++---- src/ol/webgl/Helper.js | 4 +- src/ol/xml.js | 2 +- test/test-extensions.js | 4 +- 35 files changed, 232 insertions(+), 232 deletions(-) diff --git a/src/ol/PluggableMap.js b/src/ol/PluggableMap.js index a7441f9502..54f1e34607 100644 --- a/src/ol/PluggableMap.js +++ b/src/ol/PluggableMap.js @@ -48,20 +48,20 @@ import {removeNode} from './dom.js'; * @property {number} pixelRatio The pixel ratio of the frame. * @property {number} time The time when rendering of the frame was requested. * @property {import("./View.js").State} viewState The state of the current view. - * @property {boolean} animate - * @property {import("./transform.js").Transform} coordinateToPixelTransform - * @property {import("rbush").default} declutterTree - * @property {null|import("./extent.js").Extent} extent - * @property {number} index - * @property {Array} layerStatesArray - * @property {number} layerIndex - * @property {import("./transform.js").Transform} pixelToCoordinateTransform - * @property {Array} postRenderFunctions - * @property {import("./size.js").Size} size - * @property {TileQueue} tileQueue - * @property {!Object>} usedTiles - * @property {Array} viewHints - * @property {!Object>} wantedTiles + * @property {boolean} animate Animate. + * @property {import("./transform.js").Transform} coordinateToPixelTransform CoordinateToPixelTransform. + * @property {import("rbush").default} declutterTree DeclutterTree. + * @property {null|import("./extent.js").Extent} extent Extent. + * @property {number} index Index. + * @property {Array} layerStatesArray LayerStatesArray. + * @property {number} layerIndex LayerIndex. + * @property {import("./transform.js").Transform} pixelToCoordinateTransform PixelToCoordinateTransform. + * @property {Array} postRenderFunctions PostRenderFunctions. + * @property {import("./size.js").Size} size Size. + * @property {TileQueue} tileQueue TileQueue. + * @property {!Object>} usedTiles UsedTiles. + * @property {Array} viewHints ViewHints. + * @property {!Object>} wantedTiles WantedTiles. */ /** @@ -83,11 +83,11 @@ import {removeNode} from './dom.js'; /** * @typedef {Object} MapOptionsInternal - * @property {Collection} [controls] - * @property {Collection} [interactions] - * @property {HTMLElement|Document} keyboardEventTarget - * @property {Collection} overlays - * @property {Object} values + * @property {Collection} [controls] Controls. + * @property {Collection} [interactions] Interactions. + * @property {HTMLElement|Document} keyboardEventTarget KeyboardEventTarget. + * @property {Collection} overlays Overlays. + * @property {Object} values Values. */ /** diff --git a/src/ol/VectorRenderTile.js b/src/ol/VectorRenderTile.js index 0902b92af5..7f771fcdde 100644 --- a/src/ol/VectorRenderTile.js +++ b/src/ol/VectorRenderTile.js @@ -7,14 +7,14 @@ import {getUid} from './util.js'; /** * @typedef {Object} ReplayState - * @property {boolean} dirty - * @property {null|import("./render.js").OrderFunction} renderedRenderOrder - * @property {number} renderedTileRevision - * @property {number} renderedResolution - * @property {number} renderedRevision - * @property {number} renderedZ - * @property {number} renderedTileResolution - * @property {number} renderedTileZ + * @property {boolean} dirty Dirty. + * @property {null|import("./render.js").OrderFunction} renderedRenderOrder RenderedRenderOrder. + * @property {number} renderedTileRevision RenderedTileRevision. + * @property {number} renderedResolution RenderedResolution. + * @property {number} renderedRevision RenderedRevision. + * @property {number} renderedZ RenderedZ. + * @property {number} renderedTileResolution RenderedTileResolution. + * @property {number} renderedTileZ RenderedTileZ. */ /** diff --git a/src/ol/View.js b/src/ol/View.js index 127a256241..23a04fb5c9 100644 --- a/src/ol/View.js +++ b/src/ol/View.js @@ -54,25 +54,25 @@ import {fromExtent as polygonFromExtent} from './geom/Polygon.js'; * An animation configuration * * @typedef {Object} Animation - * @property {import("./coordinate.js").Coordinate} [sourceCenter] - * @property {import("./coordinate.js").Coordinate} [targetCenter] - * @property {number} [sourceResolution] - * @property {number} [targetResolution] - * @property {number} [sourceRotation] - * @property {number} [targetRotation] - * @property {import("./coordinate.js").Coordinate} [anchor] - * @property {number} start - * @property {number} duration - * @property {boolean} complete - * @property {function(number):number} easing - * @property {function(boolean):void} callback + * @property {import("./coordinate.js").Coordinate} [sourceCenter] Source center. + * @property {import("./coordinate.js").Coordinate} [targetCenter] Target center. + * @property {number} [sourceResolution] Source resolution. + * @property {number} [targetResolution] Target resolution. + * @property {number} [sourceRotation] Source rotation. + * @property {number} [targetRotation] Target rotation. + * @property {import("./coordinate.js").Coordinate} [anchor] Anchor. + * @property {number} start Start. + * @property {number} duration Duration. + * @property {boolean} complete Complete. + * @property {function(number):number} easing Easing. + * @property {function(boolean):void} callback Callback. */ /** * @typedef {Object} Constraints - * @property {import("./centerconstraint.js").Type} center - * @property {import("./resolutionconstraint.js").Type} resolution - * @property {import("./rotationconstraint.js").Type} rotation + * @property {import("./centerconstraint.js").Type} center Center. + * @property {import("./resolutionconstraint.js").Type} resolution Resolution. + * @property {import("./rotationconstraint.js").Type} rotation Rotation. */ /** @@ -203,11 +203,11 @@ import {fromExtent as polygonFromExtent} from './geom/Polygon.js'; /** * @typedef {Object} State - * @property {import("./coordinate.js").Coordinate} center - * @property {import("./proj/Projection.js").default} projection - * @property {number} resolution - * @property {number} rotation - * @property {number} zoom + * @property {import("./coordinate.js").Coordinate} center Center. + * @property {import("./proj/Projection.js").default} projection Projection. + * @property {number} resolution Resolution. + * @property {number} rotation Rotation. + * @property {number} zoom Zoom. */ /** diff --git a/src/ol/css.js b/src/ol/css.js index b7eb38b0bf..76cadeb35c 100644 --- a/src/ol/css.js +++ b/src/ol/css.js @@ -4,13 +4,13 @@ /** * @typedef {Object} FontParameters - * @property {string} style - * @property {string} variant - * @property {string} weight - * @property {string} size - * @property {string} lineHeight - * @property {string} family - * @property {Array} families + * @property {string} style Style. + * @property {string} variant Variant. + * @property {string} weight Weight. + * @property {string} size Size. + * @property {string} lineHeight LineHeight. + * @property {string} family Family. + * @property {Array} families Families. */ /** diff --git a/src/ol/events.js b/src/ol/events.js index 7a150b78ba..c7b3e8db0d 100644 --- a/src/ol/events.js +++ b/src/ol/events.js @@ -6,9 +6,9 @@ import {clear} from './obj.js'; /** * Key to use with {@link module:ol/Observable~Observable#unByKey}. * @typedef {Object} EventsKey - * @property {ListenerFunction} listener - * @property {import("./events/Target.js").EventTargetLike} target - * @property {string} type + * @property {ListenerFunction} listener Listener. + * @property {import("./events/Target.js").EventTargetLike} target Target. + * @property {string} type Type. * @api */ @@ -22,7 +22,7 @@ import {clear} from './obj.js'; /** * @typedef {Object} ListenerObject - * @property {ListenerFunction} handleEvent + * @property {ListenerFunction} handleEvent HandleEvent listener function. */ /** diff --git a/src/ol/format/GPX.js b/src/ol/format/GPX.js index 1b105e6651..9ac50dc18b 100644 --- a/src/ol/format/GPX.js +++ b/src/ol/format/GPX.js @@ -109,8 +109,8 @@ const GPX_SERIALIZERS = makeStructureNS(NAMESPACE_URIS, { /** * @typedef {Object} LayoutOptions - * @property {boolean} [hasZ] - * @property {boolean} [hasM] + * @property {boolean} [hasZ] HasZ. + * @property {boolean} [hasM] HasM. */ /** diff --git a/src/ol/format/KML.js b/src/ol/format/KML.js index 9f98a5943c..e2c9e0dd2a 100644 --- a/src/ol/format/KML.js +++ b/src/ol/format/KML.js @@ -56,17 +56,17 @@ import {transformGeometryWithOptions} from './Feature.js'; /** * @typedef {Object} Vec2 - * @property {number} x - * @property {import("../style/IconAnchorUnits").default} xunits - * @property {number} y - * @property {import("../style/IconAnchorUnits").default} yunits - * @property {import("../style/IconOrigin.js").default} origin + * @property {number} x X coordinate. + * @property {import("../style/IconAnchorUnits").default} xunits Units of x. + * @property {number} y Y coordinate. + * @property {import("../style/IconAnchorUnits").default} yunits Units of Y. + * @property {import("../style/IconOrigin.js").default} origin Origin. */ /** * @typedef {Object} GxTrackObject - * @property {Array} flatCoordinates - * @property {Array} whens + * @property {Array} flatCoordinates Flat coordinates. + * @property {Array} whens Whens. */ /** diff --git a/src/ol/format/WFS.js b/src/ol/format/WFS.js index a358f0ce77..12f76c44df 100644 --- a/src/ol/format/WFS.js +++ b/src/ol/format/WFS.js @@ -178,17 +178,17 @@ const TRANSACTION_SERIALIZERS = { /** * Number of features; bounds/extent. * @typedef {Object} FeatureCollectionMetadata - * @property {number} numberOfFeatures - * @property {import("../extent.js").Extent} bounds + * @property {number} numberOfFeatures NumberOfFeatures. + * @property {import("../extent.js").Extent} bounds Bounds. */ /** * Total deleted; total inserted; total updated; array of insert ids. * @typedef {Object} TransactionResponse - * @property {number} totalDeleted - * @property {number} totalInserted - * @property {number} totalUpdated - * @property {Array} insertIds + * @property {number} totalDeleted TotalDeleted. + * @property {number} totalInserted TotalInserted. + * @property {number} totalUpdated TotalUpdated. + * @property {Array} insertIds InsertIds. */ /** diff --git a/src/ol/format/WKT.js b/src/ol/format/WKT.js index f2ee8ebc9f..f15b406d2b 100644 --- a/src/ol/format/WKT.js +++ b/src/ol/format/WKT.js @@ -35,9 +35,9 @@ const GeometryConstructor = { /** * @typedef {Object} Token - * @property {number} type - * @property {number|string} [value] - * @property {number} position + * @property {number} type Type. + * @property {number|string} [value] Value. + * @property {number} position Position. */ /** diff --git a/src/ol/interaction/Modify.js b/src/ol/interaction/Modify.js index e42571a09e..f0300ca116 100644 --- a/src/ol/interaction/Modify.js +++ b/src/ol/interaction/Modify.js @@ -81,12 +81,12 @@ const ModifyEventType = { /** * @typedef {Object} SegmentData - * @property {Array} [depth] - * @property {Feature} feature - * @property {import("../geom/SimpleGeometry.js").default} geometry - * @property {number} [index] - * @property {Array} segment - * @property {Array} [featureSegments] + * @property {Array} [depth] Depth. + * @property {Feature} feature Feature. + * @property {import("../geom/SimpleGeometry.js").default} geometry Geometry. + * @property {number} [index] Index. + * @property {Array} segment Segment. + * @property {Array} [featureSegments] FeatureSegments. */ /** diff --git a/src/ol/interaction/Snap.js b/src/ol/interaction/Snap.js index 5ea6945a95..f3b29ce299 100644 --- a/src/ol/interaction/Snap.js +++ b/src/ol/interaction/Snap.js @@ -28,15 +28,15 @@ import {listen, unlistenByKey} from '../events.js'; /** * @typedef {Object} Result - * @property {boolean} snapped - * @property {import("../coordinate.js").Coordinate|null} vertex - * @property {import("../pixel.js").Pixel|null} vertexPixel + * @property {boolean} snapped Snapped. + * @property {import("../coordinate.js").Coordinate|null} vertex Vertex. + * @property {import("../pixel.js").Pixel|null} vertexPixel VertexPixel. */ /** * @typedef {Object} SegmentData - * @property {import("../Feature.js").default} feature - * @property {Array} segment + * @property {import("../Feature.js").default} feature Feature. + * @property {Array} segment Segment. */ /** diff --git a/src/ol/layer/Graticule.js b/src/ol/layer/Graticule.js index fba118c66c..7d0fbaf0ce 100644 --- a/src/ol/layer/Graticule.js +++ b/src/ol/layer/Graticule.js @@ -72,8 +72,8 @@ const INTERVALS = [ /** * @typedef {Object} GraticuleLabelDataType - * @property {Point} geom - * @property {string} text + * @property {Point} geom Geometry. + * @property {string} text Text. */ /** diff --git a/src/ol/layer/Layer.js b/src/ol/layer/Layer.js index e55944faad..14448b239f 100644 --- a/src/ol/layer/Layer.js +++ b/src/ol/layer/Layer.js @@ -44,17 +44,17 @@ import {listen, unlistenByKey} from '../events.js'; /** * @typedef {Object} State - * @property {import("./Layer.js").default} layer + * @property {import("./Layer.js").default} layer Layer. * @property {number} opacity Opacity, the value is rounded to two digits to appear after the decimal point. - * @property {import("../source/State.js").default} sourceState - * @property {boolean} visible - * @property {boolean} managed - * @property {import("../extent.js").Extent} [extent] - * @property {number} zIndex - * @property {number} maxResolution - * @property {number} minResolution - * @property {number} minZoom - * @property {number} maxZoom + * @property {import("../source/State.js").default} sourceState SourceState. + * @property {boolean} visible Visible. + * @property {boolean} managed Managed. + * @property {import("../extent.js").Extent} [extent] Extent. + * @property {number} zIndex ZIndex. + * @property {number} maxResolution Maximum resolution. + * @property {number} minResolution Minimum resolution. + * @property {number} minZoom Minimum zoom. + * @property {number} maxZoom Maximum zoom. */ /** diff --git a/src/ol/render.js b/src/ol/render.js index 67c36960d2..150c8809a3 100644 --- a/src/ol/render.js +++ b/src/ol/render.js @@ -15,8 +15,8 @@ import {getTransformFromProjections, getUserProjection} from './proj.js'; /** * @typedef {Object} State * @property {CanvasRenderingContext2D} context Canvas context that the layer is being rendered to. - * @property {import("./Feature.js").FeatureLike} feature - * @property {import("./geom/SimpleGeometry.js").default} geometry + * @property {import("./Feature.js").FeatureLike} feature Feature. + * @property {import("./geom/SimpleGeometry.js").default} geometry Geometry. * @property {number} pixelRatio Pixel ratio used by the layer renderer. * @property {number} resolution Resolution that the render batch was created and optimized for. * This is not the view's resolution that is being rendered. diff --git a/src/ol/render/canvas.js b/src/ol/render/canvas.js index b5ff8eb574..61780050a9 100644 --- a/src/ol/render/canvas.js +++ b/src/ol/render/canvas.js @@ -11,60 +11,60 @@ import {toString} from '../transform.js'; /** * @typedef {Object} FillState - * @property {import("../colorlike.js").ColorLike} fillStyle + * @property {import("../colorlike.js").ColorLike} fillStyle FillStyle. */ /** * @typedef Label - * @property {number} width - * @property {number} height - * @property {Array} contextInstructions + * @property {number} width Width. + * @property {number} height Height. + * @property {Array} contextInstructions ContextInstructions. */ /** * @typedef {Object} FillStrokeState - * @property {import("../colorlike.js").ColorLike} [currentFillStyle] - * @property {import("../colorlike.js").ColorLike} [currentStrokeStyle] - * @property {CanvasLineCap} [currentLineCap] - * @property {Array} currentLineDash - * @property {number} [currentLineDashOffset] - * @property {CanvasLineJoin} [currentLineJoin] - * @property {number} [currentLineWidth] - * @property {number} [currentMiterLimit] - * @property {number} [lastStroke] - * @property {import("../colorlike.js").ColorLike} [fillStyle] - * @property {import("../colorlike.js").ColorLike} [strokeStyle] - * @property {CanvasLineCap} [lineCap] - * @property {Array} lineDash - * @property {number} [lineDashOffset] - * @property {CanvasLineJoin} [lineJoin] - * @property {number} [lineWidth] - * @property {number} [miterLimit] + * @property {import("../colorlike.js").ColorLike} [currentFillStyle] Current FillStyle. + * @property {import("../colorlike.js").ColorLike} [currentStrokeStyle] Current StrokeStyle. + * @property {CanvasLineCap} [currentLineCap] Current LineCap. + * @property {Array} currentLineDash Current LineDash. + * @property {number} [currentLineDashOffset] Current LineDashOffset. + * @property {CanvasLineJoin} [currentLineJoin] Current LineJoin. + * @property {number} [currentLineWidth] Current LineWidth. + * @property {number} [currentMiterLimit] Current MiterLimit. + * @property {number} [lastStroke] Last stroke. + * @property {import("../colorlike.js").ColorLike} [fillStyle] FillStyle. + * @property {import("../colorlike.js").ColorLike} [strokeStyle] StrokeStyle. + * @property {CanvasLineCap} [lineCap] LineCap. + * @property {Array} lineDash LineDash. + * @property {number} [lineDashOffset] LineDashOffset. + * @property {CanvasLineJoin} [lineJoin] LineJoin. + * @property {number} [lineWidth] LineWidth. + * @property {number} [miterLimit] MiterLimit. */ /** * @typedef {Object} StrokeState - * @property {CanvasLineCap} lineCap - * @property {Array} lineDash - * @property {number} lineDashOffset - * @property {CanvasLineJoin} lineJoin - * @property {number} lineWidth - * @property {number} miterLimit - * @property {import("../colorlike.js").ColorLike} strokeStyle + * @property {CanvasLineCap} lineCap LineCap. + * @property {Array} lineDash LineDash. + * @property {number} lineDashOffset LineDashOffset. + * @property {CanvasLineJoin} lineJoin LineJoin. + * @property {number} lineWidth LineWidth. + * @property {number} miterLimit MiterLimit. + * @property {import("../colorlike.js").ColorLike} strokeStyle StrokeStyle. */ /** * @typedef {Object} TextState - * @property {string} font - * @property {string} [textAlign] - * @property {string} textBaseline - * @property {string} [placement] - * @property {number} [maxAngle] - * @property {boolean} [overflow] - * @property {import("../style/Fill.js").default} [backgroundFill] - * @property {import("../style/Stroke.js").default} [backgroundStroke] - * @property {import("../size.js").Size} [scale] - * @property {Array} [padding] + * @property {string} font Font. + * @property {string} [textAlign] TextAlign. + * @property {string} textBaseline TextBaseline. + * @property {string} [placement] Placement. + * @property {number} [maxAngle] MaxAngle. + * @property {boolean} [overflow] Overflow. + * @property {import("../style/Fill.js").default} [backgroundFill] BackgroundFill. + * @property {import("../style/Stroke.js").default} [backgroundStroke] BackgroundStroke. + * @property {import("../size.js").Size} [scale] Scale. + * @property {Array} [padding] Padding. */ /** diff --git a/src/ol/render/canvas/Executor.js b/src/ol/render/canvas/Executor.js index b5da8e92af..813a94324f 100644 --- a/src/ol/render/canvas/Executor.js +++ b/src/ol/render/canvas/Executor.js @@ -29,24 +29,24 @@ import {transform2D} from '../../geom/flat/transform.js'; /** * @typedef {Object} BBox - * @property {number} minX - * @property {number} minY - * @property {number} maxX - * @property {number} maxY - * @property {*} value + * @property {number} minX Minimal x. + * @property {number} minY Minimal y. + * @property {number} maxX Maximal x. + * @property {number} maxY Maximal y + * @property {*} value Value. */ /** * @typedef {Object} ImageOrLabelDimensions - * @property {number} drawImageX - * @property {number} drawImageY - * @property {number} drawImageW - * @property {number} drawImageH - * @property {number} originX - * @property {number} originY - * @property {Array} scale - * @property {BBox} declutterBox - * @property {import("../../transform.js").Transform} canvasTransform + * @property {number} drawImageX DrawImageX. + * @property {number} drawImageY DrawImageY. + * @property {number} drawImageW DrawImageW. + * @property {number} drawImageH DrawImageH. + * @property {number} originX OriginX. + * @property {number} originY OriginY. + * @property {Array} scale Scale. + * @property {BBox} declutterBox DeclutterBox. + * @property {import("../../transform.js").Transform} canvasTransform CanvasTransform. */ /** diff --git a/src/ol/renderer/Map.js b/src/ol/renderer/Map.js index dc777be439..d663541cd9 100644 --- a/src/ol/renderer/Map.js +++ b/src/ol/renderer/Map.js @@ -12,11 +12,11 @@ import {wrapX} from '../coordinate.js'; /** * @typedef HitMatch - * @property {import("../Feature.js").FeatureLike} feature - * @property {import("../layer/Layer.js").default} layer - * @property {import("../geom/SimpleGeometry.js").default} geometry - * @property {number} distanceSq - * @property {import("./vector.js").FeatureCallback} callback + * @property {import("../Feature.js").FeatureLike} feature Feature. + * @property {import("../layer/Layer.js").default} layer Layer. + * @property {import("../geom/SimpleGeometry.js").default} geometry Geometry. + * @property {number} distanceSq Squared distance. + * @property {import("./vector.js").FeatureCallback} callback Callback. * @template T */ diff --git a/src/ol/reproj.js b/src/ol/reproj.js index 6dd6b72228..00f9536c99 100644 --- a/src/ol/reproj.js +++ b/src/ol/reproj.js @@ -180,8 +180,8 @@ export function calculateSourceExtentResolution( /** * @typedef {Object} ImageExtent - * @property {import("./extent.js").Extent} extent - * @property {HTMLCanvasElement|HTMLImageElement|HTMLVideoElement} image + * @property {import("./extent.js").Extent} extent Extent. + * @property {HTMLCanvasElement|HTMLImageElement|HTMLVideoElement} image Image. */ /** diff --git a/src/ol/reproj/Triangulation.js b/src/ol/reproj/Triangulation.js index da7f70ead7..15dfacdb13 100644 --- a/src/ol/reproj/Triangulation.js +++ b/src/ol/reproj/Triangulation.js @@ -19,8 +19,8 @@ import {log2, modulo} from '../math.js'; /** * Single triangle; consists of 3 source points and 3 target points. * @typedef {Object} Triangle - * @property {Array} source - * @property {Array} target + * @property {Array} source Source. + * @property {Array} target Target. */ /** diff --git a/src/ol/source/BingMaps.js b/src/ol/source/BingMaps.js index ef0836f7a1..fc41d162ab 100644 --- a/src/ol/source/BingMaps.js +++ b/src/ol/source/BingMaps.js @@ -78,7 +78,7 @@ const TOS_ATTRIBUTION = /** * @typedef {Object} ResourceSet - * @property {Array} resources + * @property {Array} resources Resources. */ /** diff --git a/src/ol/source/IIIF.js b/src/ol/source/IIIF.js index 162b16dd01..8d86c2f368 100644 --- a/src/ol/source/IIIF.js +++ b/src/ol/source/IIIF.js @@ -16,12 +16,12 @@ import {toSize} from '../size.js'; * @typedef {Object} Options * @property {import("./Source.js").AttributionLike} [attributions] Attributions. * @property {boolean} [attributionsCollapsible=true] Attributions are collapsible. - * @property {number} [cacheSize] - * @property {null|string} [crossOrigin] - * @property {import("../extent.js").Extent} [extent=[0, -height, width, 0]] + * @property {number} [cacheSize] Size of the cache. + * @property {null|string} [crossOrigin] The value for the crossOrigin option of the request. + * @property {import("../extent.js").Extent} [extent=[0, -height, width, 0]] The extent. * @property {string} [format='jpg'] Requested image format. * @property {boolean} [imageSmoothing=true] Enable image smoothing. - * @property {import("../proj.js").ProjectionLike} [projection] + * @property {import("../proj.js").ProjectionLike} [projection] Projection. * @property {string} [quality] Requested IIIF image quality. Default is 'native' * for version 1, 'default' for versions 2 and 3. * @property {number} [reprojectionErrorThreshold=0.5] Maximum allowed reprojection error (in pixels). @@ -33,13 +33,13 @@ import {toSize} from '../size.js'; * @property {import("./State.js").default} [state] Source state. * @property {Array} [supports=[]] Supported IIIF region and size calculation * features. - * @property {number} [tilePixelRatio] + * @property {number} [tilePixelRatio] Tile pixel ratio. * @property {number|import("../size.js").Size} [tileSize] Tile size. * Same tile size is used for all zoom levels. If tile size is a number, * a square tile is assumed. If the IIIF image service supports arbitrary * tiling (sizeByH, sizeByW, sizeByWh or sizeByPct as well as regionByPx or regionByPct * are supported), the default tilesize is 256. - * @property {number} [transition] + * @property {number} [transition] Transition. * @property {string} [url] Base URL of the IIIF Image service. * This should be the same as the IIIF Image ID. * @property {import("../format/IIIFInfo.js").Versions} [version=Versions.VERSION2] Service's IIIF Image API version. diff --git a/src/ol/source/Image.js b/src/ol/source/Image.js index 2c62214b1b..6ab9754ec6 100644 --- a/src/ol/source/Image.js +++ b/src/ol/source/Image.js @@ -62,11 +62,11 @@ export class ImageSourceEvent extends Event { /** * @typedef {Object} Options - * @property {import("./Source.js").AttributionLike} [attributions] + * @property {import("./Source.js").AttributionLike} [attributions] Attributions. * @property {boolean} [imageSmoothing=true] Enable image smoothing. - * @property {import("../proj.js").ProjectionLike} [projection] - * @property {Array} [resolutions] - * @property {import("./State.js").default} [state] + * @property {import("../proj.js").ProjectionLike} [projection] Projection. + * @property {Array} [resolutions] Resolutions. + * @property {import("./State.js").default} [state] State. */ /** diff --git a/src/ol/source/Source.js b/src/ol/source/Source.js index af2898cfec..cd07fc14b2 100644 --- a/src/ol/source/Source.js +++ b/src/ol/source/Source.js @@ -26,11 +26,11 @@ import {get as getProjection} from '../proj.js'; /** * @typedef {Object} Options - * @property {AttributionLike} [attributions] + * @property {AttributionLike} [attributions] Attributions. * @property {boolean} [attributionsCollapsible=true] Attributions are collapsible. * @property {import("../proj.js").ProjectionLike} [projection] Projection. Default is the view projection. - * @property {import("./State.js").default} [state='ready'] - * @property {boolean} [wrapX=false] + * @property {import("./State.js").default} [state='ready'] State. + * @property {boolean} [wrapX=false] WrapX. */ /** diff --git a/src/ol/source/Tile.js b/src/ol/source/Tile.js index 90ab003a23..7e9036fe83 100644 --- a/src/ol/source/Tile.js +++ b/src/ol/source/Tile.js @@ -17,18 +17,18 @@ import {scale as scaleSize, toSize} from '../size.js'; /** * @typedef {Object} Options - * @property {import("./Source.js").AttributionLike} [attributions] + * @property {import("./Source.js").AttributionLike} [attributions] Attributions. * @property {boolean} [attributionsCollapsible=true] Attributions are collapsible. - * @property {number} [cacheSize] + * @property {number} [cacheSize] CacheSize. * @property {boolean} [opaque=false] Whether the layer is opaque. - * @property {number} [tilePixelRatio] - * @property {import("../proj.js").ProjectionLike} [projection] - * @property {import("./State.js").default} [state] - * @property {import("../tilegrid/TileGrid.js").default} [tileGrid] - * @property {boolean} [wrapX=true] - * @property {number} [transition] - * @property {string} [key] - * @property {number} [zDirection=0] + * @property {number} [tilePixelRatio] TilePixelRatio. + * @property {import("../proj.js").ProjectionLike} [projection] Projection. + * @property {import("./State.js").default} [state] State. + * @property {import("../tilegrid/TileGrid.js").default} [tileGrid] TileGrid. + * @property {boolean} [wrapX=true] WrapX. + * @property {number} [transition] Transition. + * @property {string} [key] Key. + * @property {number} [zDirection=0] ZDirection. */ /** diff --git a/src/ol/source/UrlTile.js b/src/ol/source/UrlTile.js index 6351fd7c41..d049731fdd 100644 --- a/src/ol/source/UrlTile.js +++ b/src/ol/source/UrlTile.js @@ -10,22 +10,22 @@ import {getUid} from '../util.js'; /** * @typedef {Object} Options - * @property {import("./Source.js").AttributionLike} [attributions] + * @property {import("./Source.js").AttributionLike} [attributions] Attributions. * @property {boolean} [attributionsCollapsible=true] Attributions are collapsible. - * @property {number} [cacheSize] + * @property {number} [cacheSize] Cache size. * @property {boolean} [opaque=false] Whether the layer is opaque. - * @property {import("../proj.js").ProjectionLike} [projection] - * @property {import("./State.js").default} [state] - * @property {import("../tilegrid/TileGrid.js").default} [tileGrid] - * @property {import("../Tile.js").LoadFunction} tileLoadFunction - * @property {number} [tilePixelRatio] - * @property {import("../Tile.js").UrlFunction} [tileUrlFunction] - * @property {string} [url] - * @property {Array} [urls] - * @property {boolean} [wrapX=true] - * @property {number} [transition] - * @property {string} [key] - * @property {number} [zDirection=0] + * @property {import("../proj.js").ProjectionLike} [projection] Projection. + * @property {import("./State.js").default} [state] State. + * @property {import("../tilegrid/TileGrid.js").default} [tileGrid] TileGrid. + * @property {import("../Tile.js").LoadFunction} tileLoadFunction TileLoadFunction. + * @property {number} [tilePixelRatio] TilePixelRatio. + * @property {import("../Tile.js").UrlFunction} [tileUrlFunction] TileUrlFunction. + * @property {string} [url] Url. + * @property {Array} [urls] Urls. + * @property {boolean} [wrapX=true] WrapX. + * @property {number} [transition] Transition. + * @property {string} [key] Key. + * @property {number} [zDirection=0] ZDirection. */ /** diff --git a/src/ol/source/VectorTile.js b/src/ol/source/VectorTile.js index a4f6b467f8..f9e9ed77bc 100644 --- a/src/ol/source/VectorTile.js +++ b/src/ol/source/VectorTile.js @@ -28,7 +28,7 @@ import {toSize} from '../size.js'; * @property {import("./Source.js").AttributionLike} [attributions] Attributions. * @property {boolean} [attributionsCollapsible=true] Attributions are collapsible. * @property {number} [cacheSize] Initial tile cache size. Will auto-grow to hold at least twice the number of tiles in the viewport. - * @property {import("../extent.js").Extent} [extent] + * @property {import("../extent.js").Extent} [extent] Extent. * @property {import("../format/Feature.js").default} [format] Feature format for tiles. Used and required by the default. * @property {boolean} [overlaps=true] This source may have overlapping geometries. Setting this * to `false` (e.g. for sources with polygons that represent administrative diff --git a/src/ol/source/Zoomify.js b/src/ol/source/Zoomify.js index ae7c950d8b..eba71977d5 100644 --- a/src/ol/source/Zoomify.js +++ b/src/ol/source/Zoomify.js @@ -104,7 +104,7 @@ export class CustomTile extends ImageTile { * A `{?-?}` template pattern, for example `subdomain{a-f}.domain.com`, may be * used instead of defining each one separately in the `urls` option. * @property {string} [tierSizeCalculation] Tier size calculation method: `default` or `truncated`. - * @property {import("../size.js").Size} size + * @property {import("../size.js").Size} size Size. * @property {import("../extent.js").Extent} [extent] Extent for the TileGrid that is created. * Default sets the TileGrid in the * fourth quadrant, meaning extent is `[0, -height, width, 0]`. To change the diff --git a/src/ol/structs/LRUCache.js b/src/ol/structs/LRUCache.js index ae8a024c4b..e8e3b42343 100644 --- a/src/ol/structs/LRUCache.js +++ b/src/ol/structs/LRUCache.js @@ -6,10 +6,10 @@ import {assert} from '../asserts.js'; /** * @typedef {Object} Entry - * @property {string} key_ - * @property {Object} newer - * @property {Object} older - * @property {*} value_ + * @property {string} key_ Key. + * @property {Object} newer Newer. + * @property {Object} older Older. + * @property {*} value_ Value. */ /** diff --git a/src/ol/structs/LinkedList.js b/src/ol/structs/LinkedList.js index 09e53b4506..3920259a11 100644 --- a/src/ol/structs/LinkedList.js +++ b/src/ol/structs/LinkedList.js @@ -4,9 +4,9 @@ /** * @typedef {Object} Item - * @property {Item} [prev] - * @property {Item} [next] - * @property {?} data + * @property {Item} [prev] Previous. + * @property {Item} [next] Next. + * @property {?} data Data. */ /** diff --git a/src/ol/structs/RBush.js b/src/ol/structs/RBush.js index a9d7dc5b4e..1be15b420c 100644 --- a/src/ol/structs/RBush.js +++ b/src/ol/structs/RBush.js @@ -8,11 +8,11 @@ import {isEmpty} from '../obj.js'; /** * @typedef {Object} Entry - * @property {number} minX - * @property {number} minY - * @property {number} maxX - * @property {number} maxY - * @property {Object} [value] + * @property {number} minX MinX. + * @property {number} minY MinY. + * @property {number} maxX MaxX. + * @property {number} maxY MaxY. + * @property {Object} [value] Value. */ /** diff --git a/src/ol/style/Image.js b/src/ol/style/Image.js index 32e8810574..f481c888ac 100644 --- a/src/ol/style/Image.js +++ b/src/ol/style/Image.js @@ -6,11 +6,11 @@ import {toSize} from '../size.js'; /** * @typedef {Object} Options - * @property {number} opacity - * @property {boolean} rotateWithView - * @property {number} rotation - * @property {number|import("../size.js").Size} scale - * @property {Array} displacement + * @property {number} opacity Opacity. + * @property {boolean} rotateWithView If the image should get rotated with the view. + * @property {number} rotation Rotation. + * @property {number|import("../size.js").Size} scale Scale. + * @property {Array} displacement Displacement. */ /** diff --git a/src/ol/style/RegularShape.js b/src/ol/style/RegularShape.js index 6522fdb0d3..0d5452228d 100644 --- a/src/ol/style/RegularShape.js +++ b/src/ol/style/RegularShape.js @@ -36,14 +36,14 @@ import { /** * @typedef {Object} RenderOptions - * @property {import("../colorlike.js").ColorLike} [strokeStyle] - * @property {number} strokeWidth - * @property {number} size - * @property {CanvasLineCap} lineCap - * @property {Array} lineDash - * @property {number} lineDashOffset - * @property {CanvasLineJoin} lineJoin - * @property {number} miterLimit + * @property {import("../colorlike.js").ColorLike} [strokeStyle] StrokeStyle. + * @property {number} strokeWidth StrokeWidth. + * @property {number} size Size. + * @property {CanvasLineCap} lineCap LineCap. + * @property {Array} lineDash LineDash. + * @property {number} lineDashOffset LineDashOffset. + * @property {CanvasLineJoin} lineJoin LineJoin. + * @property {number} miterLimit MiterLimit. */ /** diff --git a/src/ol/webgl/Helper.js b/src/ol/webgl/Helper.js index 39d65b33dd..7334355dc8 100644 --- a/src/ol/webgl/Helper.js +++ b/src/ol/webgl/Helper.js @@ -27,8 +27,8 @@ import {includes} from '../array.js'; /** * @typedef {Object} BufferCacheEntry - * @property {import("./Buffer.js").default} buffer - * @property {WebGLBuffer} webGlBuffer + * @property {import("./Buffer.js").default} buffer Buffer. + * @property {WebGLBuffer} webGlBuffer WebGlBuffer. */ /** diff --git a/src/ol/xml.js b/src/ol/xml.js index 40cf9765bb..c9650bac64 100644 --- a/src/ol/xml.js +++ b/src/ol/xml.js @@ -8,7 +8,7 @@ import {extend} from './array.js'; * {@link module:ol/xml~makeSimpleNodeFactory}, the top `objectStack` item needs * to have this structure. * @typedef {Object} NodeStackItem - * @property {Node} node + * @property {Node} node Node. */ /** diff --git a/test/test-extensions.js b/test/test-extensions.js index 5120a28f36..fcace986ae 100644 --- a/test/test-extensions.js +++ b/test/test-extensions.js @@ -333,8 +333,8 @@ /** * @typedef {Object} XMLEqlOptions - * @property {boolean} [includeWhiteSpace] - * @property {boolean} [ignoreElementOrder] + * @property {boolean} [includeWhiteSpace] IncludeWhiteSpace. + * @property {boolean} [ignoreElementOrder] IgnoreElementOrder. */ /** From d31abd2f77324390a790a495ec6dc88c5714f749 Mon Sep 17 00:00:00 2001 From: Andreas Hocevar Date: Sat, 6 Feb 2021 12:04:31 +0100 Subject: [PATCH 453/525] Sensible defaults --- examples/modify-icon.html | 2 +- src/ol/interaction/Modify.js | 10 ++++++---- test/spec/ol/interaction/modify.test.js | 6 +++--- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/examples/modify-icon.html b/examples/modify-icon.html index 37d936c61c..b8e42193bc 100644 --- a/examples/modify-icon.html +++ b/examples/modify-icon.html @@ -4,7 +4,7 @@ title: Icon modification shortdesc: Example using a Modify interaction to edit an icon. docs: > The icon on this map can be dragged to modify its location. -

    The Modify interaction can be configured with a `layer` option. With this option, hit detection will be used to determine the modification candidate.

    +

    The Modify interaction can be configured with a `hitDetection` option. With this option, the modification candidate will not be determined by the `pixelTolerance`, but match the visual appearance of the geometry.

    tags: "vector, modify, icon, marker" ---
    diff --git a/src/ol/interaction/Modify.js b/src/ol/interaction/Modify.js index 4a20d3665f..049ba94c5d 100644 --- a/src/ol/interaction/Modify.js +++ b/src/ol/interaction/Modify.js @@ -128,9 +128,8 @@ const ModifyEventType = { * provided, a vector source must be provided with the `source` option. * @property {boolean} [wrapX=false] Wrap the world horizontally on the sketch * overlay. - * @property {boolean} [snapToPointer=false] The vertex, point or segment being modified snaps to the - * pointer coordinate when clicked within the `pixelTolerance`. Setting this to `true` is recommended - * when the `Snap` interaction is used and the source geometry is not a snap target. + * @property {boolean} [snapToPointer=!hitDetection] The vertex, point or segment being modified snaps to the + * pointer coordinate when clicked within the `pixelTolerance`. */ /** @@ -393,7 +392,10 @@ class Modify extends PointerInteraction { /** * @private */ - this.snapToPointer_ = options.snapToPointer || false; + this.snapToPointer_ = + options.snapToPointer === undefined + ? !this.hitDetection_ + : options.snapToPointer; } /** diff --git a/test/spec/ol/interaction/modify.test.js b/test/spec/ol/interaction/modify.test.js index e25e8b5c67..ae41a018a2 100644 --- a/test/spec/ol/interaction/modify.test.js +++ b/test/spec/ol/interaction/modify.test.js @@ -1045,9 +1045,8 @@ describe('ol.interaction.Modify', function () { ); }); - it('snaps to pointer when snapToPointer is true', function () { + it('snaps to pointer by default', function () { const modify = new Modify({ - snapToPointer: true, source: source, }); map.addInteraction(modify); @@ -1061,9 +1060,10 @@ describe('ol.interaction.Modify', function () { expect(pointFeature.getGeometry().getCoordinates()).to.eql([2, -2]); }); - it('does not snap to pointer by default', function () { + it('does not snap to pointer when snapToPointer is false', function () { const modify = new Modify({ source: source, + snapToPointer: false, }); map.addInteraction(modify); source.clear(); From 4d5d80cb2726f65e0b0ce383ae6506a02f4a1155 Mon Sep 17 00:00:00 2001 From: Andreas Hocevar Date: Sat, 6 Feb 2021 13:38:14 +0100 Subject: [PATCH 454/525] Respect opacity for vector instructions --- .../layer-vectortile-opacity/expected.png | Bin 0 -> 71452 bytes .../cases/layer-vectortile-opacity/main.js | 30 ++++++++++++++++ .../expected.png | Bin 0 -> 84211 bytes .../main.js | 32 ++++++++++++++++++ src/ol/renderer/canvas/VectorTileLayer.js | 4 +++ 5 files changed, 66 insertions(+) create mode 100644 rendering/cases/layer-vectortile-opacity/expected.png create mode 100644 rendering/cases/layer-vectortile-opacity/main.js create mode 100644 rendering/cases/layer-vectortile-rendermode-vector-opacity/expected.png create mode 100644 rendering/cases/layer-vectortile-rendermode-vector-opacity/main.js diff --git a/rendering/cases/layer-vectortile-opacity/expected.png b/rendering/cases/layer-vectortile-opacity/expected.png new file mode 100644 index 0000000000000000000000000000000000000000..4cdca58a93ef484bc62c30f91d558885191d223f GIT binary patch literal 71452 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

    YAaWe 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 rGC+vz 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 Date: Sat, 6 Feb 2021 14:18:23 +0100 Subject: [PATCH 455/525] Warn when map container's width or height are zero --- src/ol/PluggableMap.js | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/src/ol/PluggableMap.js b/src/ol/PluggableMap.js index 54f1e34607..7f53e2cd7b 100644 --- a/src/ol/PluggableMap.js +++ b/src/ol/PluggableMap.js @@ -1500,18 +1500,25 @@ class PluggableMap extends BaseObject { this.setSize(undefined); } else { const computedStyle = getComputedStyle(targetElement); - this.setSize([ + const width = targetElement.offsetWidth - - parseFloat(computedStyle['borderLeftWidth']) - - parseFloat(computedStyle['paddingLeft']) - - parseFloat(computedStyle['paddingRight']) - - parseFloat(computedStyle['borderRightWidth']), + parseFloat(computedStyle['borderLeftWidth']) - + parseFloat(computedStyle['paddingLeft']) - + parseFloat(computedStyle['paddingRight']) - + parseFloat(computedStyle['borderRightWidth']); + const height = targetElement.offsetHeight - - parseFloat(computedStyle['borderTopWidth']) - - parseFloat(computedStyle['paddingTop']) - - parseFloat(computedStyle['paddingBottom']) - - parseFloat(computedStyle['borderBottomWidth']), - ]); + parseFloat(computedStyle['borderTopWidth']) - + parseFloat(computedStyle['paddingTop']) - + parseFloat(computedStyle['paddingBottom']) - + parseFloat(computedStyle['borderBottomWidth']); + if (height === 0 || width === 0) { + // eslint-disable-next-line + console.warn( + "No map visible because the map container's width or height are 0." + ); + } + this.setSize([width, height]); } this.updateViewportSize_(); From 2b52a12453f05d4b94f3a5b082a5a13d1f911041 Mon Sep 17 00:00:00 2001 From: mike-000 <49240900+mike-000@users.noreply.github.com> Date: Sat, 6 Feb 2021 13:45:13 +0000 Subject: [PATCH 456/525] Correct pixel ratio description --- src/ol/source/ImageCanvas.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/ol/source/ImageCanvas.js b/src/ol/source/ImageCanvas.js index 5ab0aea92f..c1ff2d8d26 100644 --- a/src/ol/source/ImageCanvas.js +++ b/src/ol/source/ImageCanvas.js @@ -15,8 +15,8 @@ import { * A function returning the canvas element (`{HTMLCanvasElement}`) * used by the source as an image. The arguments passed to the function are: * {@link module:ol/extent~Extent} the image extent, `{number}` the image resolution, - * `{number}` the device pixel ratio, {@link module:ol/size~Size} the image size, and - * {@link module:ol/proj/Projection} the image projection. The canvas returned by + * `{number}` the pixel ratio of the map, {@link module:ol/size~Size} the image size, + * and {@link module:ol/proj/Projection} the image projection. The canvas returned by * this function is cached by the source. The this keyword inside the function * references the {@link module:ol/source/ImageCanvas}. * @@ -30,8 +30,8 @@ import { * @property {FunctionType} [canvasFunction] Canvas function. * The function returning the canvas element used by the source * as an image. The arguments passed to the function are: `{import("../extent.js").Extent}` the - * image extent, `{number}` the image resolution, `{number}` the device pixel - * ratio, `{import("../size.js").Size}` the image size, and `{import("../proj/Projection.js").Projection}` the image + * image extent, `{number}` the image resolution, `{number}` the pixel ratio of the map, + * `{import("../size.js").Size}` the image size, and `{import("../proj/Projection.js").Projection}` the image * projection. The canvas returned by this function is cached by the source. If * the value returned by the function is later changed then * `changed` should be called on the source for the source to From 1c47d268fb3d02a3be4b8c80c358424aae505c2c Mon Sep 17 00:00:00 2001 From: mike-000 <49240900+mike-000@users.noreply.github.com> Date: Sat, 6 Feb 2021 13:49:48 +0000 Subject: [PATCH 457/525] Correct pixel ratio description --- src/ol/style/Icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ol/style/Icon.js b/src/ol/style/Icon.js index d3c6fa3577..916f6c5aa3 100644 --- a/src/ol/style/Icon.js +++ b/src/ol/style/Icon.js @@ -323,7 +323,7 @@ class Icon extends ImageStyle { /** * Get the pixel ratio. * @param {number} pixelRatio Pixel ratio. - * @return {number} The pixel ration of the image. + * @return {number} The pixel ratio of the image. * @api */ getPixelRatio(pixelRatio) { From 45ba5792cc94d179023c1028532f170c24aad3b4 Mon Sep 17 00:00:00 2001 From: Andreas Hocevar Date: Sat, 6 Feb 2021 14:57:21 +0100 Subject: [PATCH 458/525] Remove renderMode: 'image' for vector tile layers --- changelog/upgrade-notes.md | 6 ++++ doc/errors/index.md | 2 +- src/ol/layer/MapboxVector.js | 4 --- src/ol/layer/VectorTile.js | 15 +++++----- src/ol/layer/VectorTileRenderType.js | 30 ++++++++++++------- src/ol/renderer/canvas/VectorTileLayer.js | 4 --- test/spec/ol/layer/vectortile.test.js | 5 ---- .../renderer/canvas/vectortilelayer.test.js | 17 ----------- 8 files changed, 35 insertions(+), 48 deletions(-) diff --git a/changelog/upgrade-notes.md b/changelog/upgrade-notes.md index 81a771307c..692cadc7a8 100644 --- a/changelog/upgrade-notes.md +++ b/changelog/upgrade-notes.md @@ -1,5 +1,11 @@ ## Upgrade notes +### Next version + +#### Deprecation of `image` render mode for vector tile layers + +`renderMode: 'image'` for vector tile layers has been deprecated. Appliacations continue to work, but a warning will be issued to the console. To get rid of the warning, simply remove the `renderMode` option. + ### v6.5.0 #### Units of the `hitTolerance` option fixed diff --git a/doc/errors/index.md b/doc/errors/index.md index de2df3826b..21a033cd23 100644 --- a/doc/errors/index.md +++ b/doc/errors/index.md @@ -111,7 +111,7 @@ Features for `updates` must have an id set by the feature reader or `ol.Feature# ### 28 -`renderMode` must be `'image'`, `'hybrid'` or `'vector'`. +`renderMode` must be `'hybrid'` or `'vector'`. ### 29 diff --git a/src/ol/layer/MapboxVector.js b/src/ol/layer/MapboxVector.js index 370e17bd4a..0dfed94b2c 100644 --- a/src/ol/layer/MapboxVector.js +++ b/src/ol/layer/MapboxVector.js @@ -193,10 +193,6 @@ const SourceType = { * the largest possible buffer of the used tiles. It should be at least the size of the largest * point symbol or line width. * @property {import("./VectorTileRenderType.js").default|string} [renderMode='hybrid'] Render mode for vector tiles: - * * `'image'`: Vector tiles are rendered as images. Great performance, but point symbols and texts - * are always rotated with the view and pixels are scaled during zoom animations. When `declutter` - * is set to `true`, the decluttering is done per tile resulting in labels and point symbols getting - * cut off at tile boundaries. * * `'hybrid'`: Polygon and line elements are rendered as images, so pixels are scaled during zoom * animations. Point symbols and texts are accurately rendered as vectors and can stay upright on * rotated views. diff --git a/src/ol/layer/VectorTile.js b/src/ol/layer/VectorTile.js index 63d79b5ef8..7c5ac9029b 100644 --- a/src/ol/layer/VectorTile.js +++ b/src/ol/layer/VectorTile.js @@ -36,10 +36,6 @@ import {assign} from '../obj.js'; * the largest possible buffer of the used tiles. It should be at least the size of the largest * point symbol or line width. * @property {import("./VectorTileRenderType.js").default|string} [renderMode='hybrid'] Render mode for vector tiles: - * * `'image'`: Vector tiles are rendered as images. Only available when `declutter` is set to `false` (default). - * Otherwise, `'hybrid'` mode will used instead. Great performance, but point symbols and texts - * are always rotated with the view and pixels are scaled during zoom animations. Labels and point symbols will - * get cut off at tile boundaries. * * `'hybrid'`: Polygon and line elements are rendered as images, so pixels are scaled during zoom * animations. Point symbols and texts are accurately rendered as vectors and can stay upright on * rotated views. @@ -93,14 +89,19 @@ class VectorTileLayer extends BaseVectorLayer { super(/** @type {import("./BaseVector.js").Options} */ (baseOptions)); - const renderMode = options.renderMode || VectorTileRenderType.HYBRID; + let renderMode = options.renderMode || VectorTileRenderType.HYBRID; + if (renderMode === VectorTileRenderType.IMAGE) { + //FIXME deprecated - remove this check in v7. + //eslint-disable-next-line + console.warn('renderMode: "image" is deprecated. Option ignored.') + renderMode = undefined; + } assert( renderMode == undefined || - renderMode == VectorTileRenderType.IMAGE || renderMode == VectorTileRenderType.HYBRID || renderMode == VectorTileRenderType.VECTOR, 28 - ); // `renderMode` must be `'image'`, `'hybrid'` or `'vector'`. + ); // `renderMode` must be `'hybrid'` or `'vector'`. /** * @private diff --git a/src/ol/layer/VectorTileRenderType.js b/src/ol/layer/VectorTileRenderType.js index 1e4700551d..e5710fe897 100644 --- a/src/ol/layer/VectorTileRenderType.js +++ b/src/ol/layer/VectorTileRenderType.js @@ -5,20 +5,30 @@ /** * @enum {string} * Render mode for vector tiles: - * * `'image'`: Vector tiles are rendered as images. Great performance, but - * point symbols and texts are always rotated with the view and pixels are - * scaled during zoom animations. - * * `'hybrid'`: Polygon and line elements are rendered as images, so pixels - * are scaled during zoom animations. Point symbols and texts are accurately - * rendered as vectors and can stay upright on rotated views. - * * `'vector'`: Everything is rendered as vectors. Use this mode for improved - * performance on vector tile layers with only a few rendered features (e.g. - * for highlighting a subset of features of another layer with the same - * source). * @api */ export default { + /** + * Vector tiles are rendered as images. Great performance, but + * point symbols and texts are always rotated with the view and pixels are + * scaled during zoom animations + * @api + * @deprecated + */ IMAGE: 'image', + /** + * Polygon and line elements are rendered as images, so pixels + * are scaled during zoom animations. Point symbols and texts are accurately + * rendered as vectors and can stay upright on rotated views. + * @api + */ HYBRID: 'hybrid', + /** + * Everything is rendered as vectors. Use this mode for improved + * performance on vector tile layers with only a few rendered features (e.g. + * for highlighting a subset of features of another layer with the same + * source). + * @api + */ VECTOR: 'vector', }; diff --git a/src/ol/renderer/canvas/VectorTileLayer.js b/src/ol/renderer/canvas/VectorTileLayer.js index 323651e815..61fefaf26f 100644 --- a/src/ol/renderer/canvas/VectorTileLayer.js +++ b/src/ol/renderer/canvas/VectorTileLayer.js @@ -60,7 +60,6 @@ const IMAGE_REPLAYS = { * @type {!Object>} */ const VECTOR_REPLAYS = { - 'image': [ReplayType.DEFAULT], 'hybrid': [ReplayType.IMAGE, ReplayType.TEXT, ReplayType.DEFAULT], 'vector': [ ReplayType.POLYGON, @@ -682,9 +681,6 @@ class CanvasVectorTileLayerRenderer extends CanvasTileLayerRenderer { const layer = /** @type {import("../../layer/VectorTile.js").default} */ (this.getLayer()); const renderMode = layer.getRenderMode(); - if (renderMode === VectorTileRenderType.IMAGE) { - return this.container; - } const source = layer.getSource(); // Unqueue tiles from the image queue when we don't need any more diff --git a/test/spec/ol/layer/vectortile.test.js b/test/spec/ol/layer/vectortile.test.js index 025e1e39b2..2c1d512be5 100644 --- a/test/spec/ol/layer/vectortile.test.js +++ b/test/spec/ol/layer/vectortile.test.js @@ -43,11 +43,6 @@ describe('ol.layer.VectorTile', function () { source: new VectorTileSource({}), }); expect(layer.getRenderMode()).to.be('hybrid'); - layer = new VectorTileLayer({ - renderMode: 'image', - source: new VectorTileSource({}), - }); - expect(layer.getRenderMode()).to.be('image'); expect(function () { layer = new VectorTileLayer({ renderMode: 'foo', diff --git a/test/spec/ol/renderer/canvas/vectortilelayer.test.js b/test/spec/ol/renderer/canvas/vectortilelayer.test.js index 787bb8226d..ef37096906 100644 --- a/test/spec/ol/renderer/canvas/vectortilelayer.test.js +++ b/test/spec/ol/renderer/canvas/vectortilelayer.test.js @@ -117,23 +117,6 @@ describe('ol.renderer.canvas.VectorTileLayer', function () { expect(renderer.getLayer()).to.be(layer); }); - it('does not render replays for pure image rendering', function () { - const testLayer = new VectorTileLayer({ - renderMode: VectorTileRenderType.IMAGE, - source: source, - style: layerStyle, - }); - map.removeLayer(layer); - map.addLayer(testLayer); - const spy = sinon.spy( - CanvasVectorTileLayerRenderer.prototype, - 'getRenderTransform' - ); - map.renderSync(); - expect(spy.callCount).to.be(0); - spy.restore(); - }); - it('does not render images for pure vector rendering', function () { const testLayer = new VectorTileLayer({ renderMode: VectorTileRenderType.VECTOR, From ebc3631341576ace5d9933f4004de2dd5fec0693 Mon Sep 17 00:00:00 2001 From: Andreas Hocevar Date: Sat, 6 Feb 2021 15:21:39 +0100 Subject: [PATCH 459/525] Also apply layer opacity to decluttered content --- .../expected.png | Bin 0 -> 71434 bytes .../main.js | 31 ++++++++++++++++++ src/ol/renderer/canvas/VectorTileLayer.js | 5 ++- 3 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 rendering/cases/layer-vectortile-opacity-declutter/expected.png create mode 100644 rendering/cases/layer-vectortile-opacity-declutter/main.js diff --git a/rendering/cases/layer-vectortile-opacity-declutter/expected.png b/rendering/cases/layer-vectortile-opacity-declutter/expected.png new file mode 100644 index 0000000000000000000000000000000000000000..b8b3cc196cf17babe8914d0c7e76a9528ba23292 GIT binary patch literal 71434 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 Date: Sat, 6 Feb 2021 17:45:20 +0100 Subject: [PATCH 460/525] Fix test for projection. --- test/spec/ol/format/wkt.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/spec/ol/format/wkt.test.js b/test/spec/ol/format/wkt.test.js index b98aaec420..eddb55bfb3 100644 --- a/test/spec/ol/format/wkt.test.js +++ b/test/spec/ol/format/wkt.test.js @@ -9,7 +9,7 @@ describe('ol.format.WKT', function () { describe('#readProjectionFromText', function () { it('returns the default projection', function () { const projection = format.readProjectionFromText('POINT(1 2)'); - expect(projection).to.be(null); + expect(projection).to.be(undefined); }); }); From 7df38575b847f7cd5356db07e9f1b3711ee8e6a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maximilian=20Kr=C3=B6g?= Date: Sat, 6 Feb 2021 18:50:35 +0100 Subject: [PATCH 461/525] Improve measure example ux - Pass click events on measure tooltips through to the map - Put the tooltip for the currently drawn geometry on top - Disable text selection in the tooltips so clicking to draw does not select --- examples/measure.css | 2 ++ examples/measure.js | 2 ++ 2 files changed, 4 insertions(+) diff --git a/examples/measure.css b/examples/measure.css index d7cff60da3..d4bd28c6ce 100644 --- a/examples/measure.css +++ b/examples/measure.css @@ -7,6 +7,8 @@ opacity: 0.7; white-space: nowrap; font-size: 12px; + cursor: default; + user-select: none; } .ol-tooltip-measure { opacity: 1; diff --git a/examples/measure.js b/examples/measure.js index 6e4b1e2530..e1d52a010b 100644 --- a/examples/measure.js +++ b/examples/measure.js @@ -248,6 +248,8 @@ function createMeasureTooltip() { element: measureTooltipElement, offset: [0, -15], positioning: 'bottom-center', + stopEvent: false, + insertFirst: false, }); map.addOverlay(measureTooltip); } From 9d547daba953ee3c86b759356e8f2d3e088abb3b Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 8 Feb 2021 07:50:22 +0000 Subject: [PATCH 462/525] Bump @babel/core from 7.12.10 to 7.12.13 Bumps [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) from 7.12.10 to 7.12.13. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.12.13/packages/babel-core) Signed-off-by: dependabot-preview[bot] --- package-lock.json | 333 ++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 276 insertions(+), 57 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9a20382dc9..166dde1b3b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,19 +20,19 @@ "dev": true }, "@babel/core": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.10.tgz", - "integrity": "sha512-eTAlQKq65zHfkHZV0sIVODCPGVgoo1HdBlbSLi9CqOzuZanMv2ihzY+4paiKr1mH+XmYESMAmJ/dpZ68eN6d8w==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.13.tgz", + "integrity": "sha512-BQKE9kXkPlXHPeqissfxo0lySWJcYdEP0hdtJOH/iJfDdhOCcgtNCjftCJg3qqauB4h+lz2N6ixM++b9DN1Tcw==", "dev": true, "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.10", - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helpers": "^7.12.5", - "@babel/parser": "^7.12.10", - "@babel/template": "^7.12.7", - "@babel/traverse": "^7.12.10", - "@babel/types": "^7.12.10", + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.12.13", + "@babel/helper-module-transforms": "^7.12.13", + "@babel/helpers": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.12.13", + "@babel/types": "^7.12.13", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.1", @@ -43,83 +43,177 @@ }, "dependencies": { "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", "dev": true, "requires": { - "@babel/highlight": "^7.10.4" + "@babel/highlight": "^7.12.13" } }, "@babel/generator": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.10.tgz", - "integrity": "sha512-6mCdfhWgmqLdtTkhXjnIz0LcdVCd26wS2JXRtj2XY0u5klDsXBREA/pG5NVOuVnF2LUrBGNFtQkIqqTbblg0ww==", + "version": "7.12.15", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.15.tgz", + "integrity": "sha512-6F2xHxBiFXWNSGb7vyCUTBF8RCLY66rS0zEPcP8t/nQyXjha5EuK4z7H5o7fWG8B4M7y6mqVWq1J+1PuwRhecQ==", "dev": true, "requires": { - "@babel/types": "^7.12.10", + "@babel/types": "^7.12.13", "jsesc": "^2.5.1", "source-map": "^0.5.0" } }, + "@babel/helper-function-name": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", + "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.13.tgz", + "integrity": "sha512-B+7nN0gIL8FZ8SvMcF+EPyB21KnCcZHQZFczCxbiNGV/O0rsrSBlWGLzmtBJ3GMjSVMIm4lpFhR+VdVBuIsUcQ==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-module-imports": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.13.tgz", + "integrity": "sha512-NGmfvRp9Rqxy0uHSSVP+SRIW1q31a7Ji10cLBcqSDUngGentY4FRiHOFZFE1CLU5eiL0oE8reH7Tg1y99TDM/g==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-module-transforms": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.13.tgz", + "integrity": "sha512-acKF7EjqOR67ASIlDTupwkKM1eUisNAjaSduo5Cz+793ikfnpe7p4Q7B7EWU2PCoSTPWsQkR7hRUWEIZPiVLGA==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-replace-supers": "^7.12.13", + "@babel/helper-simple-access": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/helper-validator-identifier": "^7.12.11", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.12.13", + "@babel/types": "^7.12.13", + "lodash": "^4.17.19" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", + "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-replace-supers": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.13.tgz", + "integrity": "sha512-pctAOIAMVStI2TMLhozPKbf5yTEXc0OJa0eENheb4w09SrgOWEs+P4nTOZYJQCqs8JlErGLDPDJTiGIp3ygbLg==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.12.13", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/traverse": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-simple-access": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.13.tgz", + "integrity": "sha512-0ski5dyYIHEfwpWGx5GPWhH35j342JaflmCeQmsPWcrOQDtCN6C1zKAVRFVbK53lPW2c9TsuLLSUDf0tIGJ5hA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", "dev": true }, "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.12.13.tgz", + "integrity": "sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.10.4", + "@babel/helper-validator-identifier": "^7.12.11", "chalk": "^2.0.0", "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.10.tgz", - "integrity": "sha512-PJdRPwyoOqFAWfLytxrWwGrAxghCgh/yTNCYciOz8QgjflA7aZhECPZAa2VUedKg2+QMWkI0L9lynh2SNmNEgA==", + "version": "7.12.15", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.15.tgz", + "integrity": "sha512-AQBOU2Z9kWwSZMd6lNjCX0GUgFonL1wAM1db8L8PMk9UDaGsRCArBkU4Sc+UCM3AE4hjbXx+h58Lb3QT4oRmrA==", "dev": true }, "@babel/template": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.7.tgz", - "integrity": "sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", "dev": true, "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.12.7", - "@babel/types": "^7.12.7" + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" } }, "@babel/traverse": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.10.tgz", - "integrity": "sha512-6aEtf0IeRgbYWzta29lePeYSk+YAFIC3kyqESeft8o5CkFlYIMX+EQDDWEiAQ9LHOA3d0oHdgrSsID/CKqXJlg==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.13.tgz", + "integrity": "sha512-3Zb4w7eE/OslI0fTp8c7b286/cQps3+vdLW3UcwC8VSJC6GbKn55aeVVu2QJNuCDoeKyptLOFrPq8WqZZBodyA==", "dev": true, "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.10", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.12.10", - "@babel/types": "^7.12.10", + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.12.13", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.19" } }, "@babel/types": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.10.tgz", - "integrity": "sha512-sf6wboJV5mGyip2hIpDSKsr80RszPinEFjsHTalMxZAZkoQ2/2yQzxlcFN52SJqsyPfLtPmenL4g2KB3KJXPDw==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.10.4", + "@babel/helper-validator-identifier": "^7.12.11", "lodash": "^4.17.19", "to-fast-properties": "^2.0.0" } @@ -140,9 +234,9 @@ "dev": true }, "json5": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", - "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", "dev": true, "requires": { "minimist": "^1.2.5" @@ -741,14 +835,139 @@ } }, "@babel/helpers": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.5.tgz", - "integrity": "sha512-lgKGMQlKqA8meJqKsW6rUnc4MdUk35Ln0ATDqdM1a/UpARODdI4j5Y5lVfUScnSNkJcdCRAaWkspykNoFg9sJA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.13.tgz", + "integrity": "sha512-oohVzLRZ3GQEk4Cjhfs9YkJA4TdIDTObdBEZGrd6F/T0GPSnuV6l22eMcxlvcvzVIPH3VTtxbseudM1zIE+rPQ==", "dev": true, "requires": { - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.12.5", - "@babel/types": "^7.12.5" + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.12.13", + "@babel/types": "^7.12.13" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dev": true, + "requires": { + "@babel/highlight": "^7.12.13" + } + }, + "@babel/generator": { + "version": "7.12.15", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.15.tgz", + "integrity": "sha512-6F2xHxBiFXWNSGb7vyCUTBF8RCLY66rS0zEPcP8t/nQyXjha5EuK4z7H5o7fWG8B4M7y6mqVWq1J+1PuwRhecQ==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", + "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.12.13.tgz", + "integrity": "sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.12.15", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.15.tgz", + "integrity": "sha512-AQBOU2Z9kWwSZMd6lNjCX0GUgFonL1wAM1db8L8PMk9UDaGsRCArBkU4Sc+UCM3AE4hjbXx+h58Lb3QT4oRmrA==", + "dev": true + }, + "@babel/template": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/traverse": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.13.tgz", + "integrity": "sha512-3Zb4w7eE/OslI0fTp8c7b286/cQps3+vdLW3UcwC8VSJC6GbKn55aeVVu2QJNuCDoeKyptLOFrPq8WqZZBodyA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.12.13", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + } + }, + "@babel/types": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } } }, "@babel/highlight": { From ed885ea443e1703cc2814525116c8b0f32936e4e Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 8 Feb 2021 07:54:09 +0000 Subject: [PATCH 463/525] Bump marked from 1.2.8 to 2.0.0 Bumps [marked](https://github.com/markedjs/marked) from 1.2.8 to 2.0.0. - [Release notes](https://github.com/markedjs/marked/releases) - [Changelog](https://github.com/markedjs/marked/blob/master/release.config.js) - [Commits](https://github.com/markedjs/marked/compare/v1.2.8...v2.0.0) 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 9a20382dc9..e7a982ab14 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9046,9 +9046,9 @@ "dev": true }, "marked": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/marked/-/marked-1.2.8.tgz", - "integrity": "sha512-lzmFjGnzWHkmbk85q/ILZjFoHHJIQGF+SxGEfIdGk/XhiTPhqGs37gbru6Kkd48diJnEyYwnG67nru0Z2gQtuQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-2.0.0.tgz", + "integrity": "sha512-NqRSh2+LlN2NInpqTQnS614Y/3NkVMFFU6sJlRFEpxJ/LHuK/qJECH7/fXZjk4VZstPW/Pevjil/VtSONsLc7Q==", "dev": true }, "md5.js": { diff --git a/package.json b/package.json index fe32827ef6..a7da3a847c 100644 --- a/package.json +++ b/package.json @@ -85,7 +85,7 @@ "karma-sourcemap-loader": "^0.3.7", "karma-webpack": "^4.0.0-rc.2", "loglevelnext": "^4.0.1", - "marked": "1.2.8", + "marked": "2.0.0", "mocha": "8.2.1", "pixelmatch": "^5.1.0", "pngjs": "^6.0.0", From db4ab0eb7aa46c966865ce34762a5d753e58c62b Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 8 Feb 2021 07:57:49 +0000 Subject: [PATCH 464/525] Bump puppeteer from 5.5.0 to 7.0.1 Bumps [puppeteer](https://github.com/puppeteer/puppeteer) from 5.5.0 to 7.0.1. - [Release notes](https://github.com/puppeteer/puppeteer/releases) - [Changelog](https://github.com/puppeteer/puppeteer/blob/main/CHANGELOG.md) - [Commits](https://github.com/puppeteer/puppeteer/compare/v5.5.0...v7.0.1) Signed-off-by: dependabot-preview[bot] --- package-lock.json | 53 +++++++++++++++++++++++++---------------------- package.json | 2 +- 2 files changed, 29 insertions(+), 26 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9a20382dc9..89a56cb68c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2132,10 +2132,13 @@ "dev": true }, "agent-base": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-5.1.1.tgz", - "integrity": "sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==", - "dev": true + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "requires": { + "debug": "4" + } }, "aggregate-error": { "version": "3.0.1", @@ -2894,9 +2897,9 @@ } }, "bl": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.0.3.tgz", - "integrity": "sha512-fs4G6/Hu4/EE+F75J8DuN/0IpQqNjAdC7aEQv7Qt8MHGUH7Ckv2MwTEEeN9QehD0pfIDkMI1bkHYkKy7xHyKIg==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.0.4.tgz", + "integrity": "sha512-7tdr4EpSd7jJ6tuQ21vu2ke8w7pNEstzj1O8wwq6sNNzO3UDi5MA8Gny/gquCj7r2C6fHudg8tKRGyjRgmvNxQ==", "dev": true, "requires": { "buffer": "^5.5.0", @@ -4452,9 +4455,9 @@ "dev": true }, "devtools-protocol": { - "version": "0.0.818844", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.818844.tgz", - "integrity": "sha512-AD1hi7iVJ8OD0aMLQU5VK0XH9LDlA1+BcPIgrAxPfaibx2DbWucuyOhc4oyQCbnvDDO68nN6/LcKfqTP343Jjg==", + "version": "0.0.847576", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.847576.tgz", + "integrity": "sha512-0M8kobnSQE0Jmly7Mhbeq0W/PpZfnuK+WjN2ZRVPbGqYwCHCioAVp84H0TcLimgECcN5H976y5QiXMGBC9JKmg==", "dev": true }, "di": { @@ -7470,12 +7473,12 @@ "dev": true }, "https-proxy-agent": { - "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==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", "dev": true, "requires": { - "agent-base": "5", + "agent-base": "6", "debug": "4" } }, @@ -10559,15 +10562,15 @@ "dev": true }, "puppeteer": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-5.5.0.tgz", - "integrity": "sha512-OM8ZvTXAhfgFA7wBIIGlPQzvyEETzDjeRa4mZRCRHxYL+GNH5WAuYUQdja3rpWZvkX/JKqmuVgbsxDNsDFjMEg==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-7.0.1.tgz", + "integrity": "sha512-04V05BKQdloUCOa7JyQBaNXPIiVByz1eAFAElcrpMHIQkfu22J0RKFhRWkXZGXdl03yoHuaZwqyB/qG7YJu5Ew==", "dev": true, "requires": { "debug": "^4.1.0", - "devtools-protocol": "0.0.818844", + "devtools-protocol": "0.0.847576", "extract-zip": "^2.0.0", - "https-proxy-agent": "^4.0.0", + "https-proxy-agent": "^5.0.0", "node-fetch": "^2.6.1", "pkg-dir": "^4.2.0", "progress": "^2.0.1", @@ -12616,9 +12619,9 @@ } }, "tar-stream": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.1.4.tgz", - "integrity": "sha512-o3pS2zlG4gxr67GmFYBLlq+dM8gyRGUOvsrHclSkvtVtQbjV0s/+ZE8OpICbaj8clrX3tjeHngYGP7rweaBnuw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", "dev": true, "requires": { "bl": "^4.0.3", @@ -14342,9 +14345,9 @@ } }, "ws": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.0.tgz", - "integrity": "sha512-iFtXzngZVXPGgpTlP1rBqsUK82p9tKqsWRPg5L56egiljujJT3vGAYnHANvFxBieXrTFavhzhxW52jnaWV+w2w==", + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.3.tgz", + "integrity": "sha512-hr6vCR76GsossIRsr8OLR9acVVm1jyfEWvhbNjtgPOrfvAlKzvyeg/P6r8RuDjRyrcQoPQT7K0DGEPc7Ae6jzA==", "dev": true }, "xmlcreate": { diff --git a/package.json b/package.json index fe32827ef6..eca32fb7bc 100644 --- a/package.json +++ b/package.json @@ -90,7 +90,7 @@ "pixelmatch": "^5.1.0", "pngjs": "^6.0.0", "proj4": "2.7.0", - "puppeteer": "5.5.0", + "puppeteer": "7.0.1", "rollup": "^2.1.0", "rollup-plugin-babel": "^4.3.3", "rollup-plugin-commonjs": "^10.0.0", From cbc1095ba9179d3750c4baf585c3a83413516a83 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 8 Feb 2021 08:02:41 +0000 Subject: [PATCH 465/525] Bump webpack-cli from 4.4.0 to 4.5.0 Bumps [webpack-cli](https://github.com/webpack/webpack-cli) from 4.4.0 to 4.5.0. - [Release notes](https://github.com/webpack/webpack-cli/releases) - [Changelog](https://github.com/webpack/webpack-cli/blob/master/CHANGELOG.md) - [Commits](https://github.com/webpack/webpack-cli/compare/webpack-cli@4.4.0...webpack-cli@4.5.0) Signed-off-by: dependabot-preview[bot] --- package-lock.json | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9a20382dc9..5ae405abe0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2065,24 +2065,24 @@ } }, "@webpack-cli/configtest": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.0.0.tgz", - "integrity": "sha512-Un0SdBoN1h4ACnIO7EiCjWuyhNI0Jl96JC+63q6xi4HDUYRZn8Auluea9D+v9NWKc5J4sICVEltdBaVjLX39xw==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.0.1.tgz", + "integrity": "sha512-B+4uBUYhpzDXmwuo3V9yBH6cISwxEI4J+NO5ggDaGEEHb0osY/R7MzeKc0bHURXQuZjMM4qD+bSJCKIuI3eNBQ==", "dev": true }, "@webpack-cli/info": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.2.1.tgz", - "integrity": "sha512-fLnDML5HZ5AEKzHul8xLAksoKN2cibu6MgonkUj8R9V7bbeVRkd1XbGEGWrAUNYHbX1jcqCsDEpBviE5StPMzQ==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.2.2.tgz", + "integrity": "sha512-5U9kUJHnwU+FhKH4PWGZuBC1hTEPYyxGSL5jjoBI96Gx8qcYJGOikpiIpFoTq8mmgX3im2zAo2wanv/alD74KQ==", "dev": true, "requires": { "envinfo": "^7.7.3" } }, "@webpack-cli/serve": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.2.2.tgz", - "integrity": "sha512-03GkWxcgFfm8+WIwcsqJb9agrSDNDDoxaNnexPnCCexP5SCE4IgFd9lNpSy+K2nFqVMpgTFw6SwbmVAVTndVew==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.3.0.tgz", + "integrity": "sha512-k2p2VrONcYVX1wRRrf0f3X2VGltLWcv+JzXRBDmvCxGlCeESx4OXw91TsWeKOkp784uNoVQo313vxJFHXPPwfw==", "dev": true }, "@xtuc/ieee754": { @@ -4733,9 +4733,9 @@ "dev": true }, "envinfo": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.7.3.tgz", - "integrity": "sha512-46+j5QxbPWza0PB1i15nZx0xQ4I/EfQxg9J8Had3b408SV63nEtor2e+oiY63amTo9KTuh2a3XLObNwduxYwwA==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.7.4.tgz", + "integrity": "sha512-TQXTYFVVwwluWSFis6K2XKxgrD22jEv0FTuLCQI+OjH7rn93+iY0fSSFM5lrSxFY+H1+B0/cvvlamr3UsBivdQ==", "dev": true }, "errno": { @@ -13685,17 +13685,17 @@ } }, "webpack-cli": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.4.0.tgz", - "integrity": "sha512-/Qh07CXfXEkMu5S8wEpjuaw2Zj/CC0hf/qbTDp6N8N7JjdGuaOjZ7kttz+zhuJO/J5m7alQEhNk9lsc4rC6xgQ==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.5.0.tgz", + "integrity": "sha512-wXg/ef6Ibstl2f50mnkcHblRPN/P9J4Nlod5Hg9HGFgSeF8rsqDGHJeVe4aR26q9l62TUJi6vmvC2Qz96YJw1Q==", "dev": true, "requires": { "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^1.0.0", - "@webpack-cli/info": "^1.2.1", - "@webpack-cli/serve": "^1.2.2", + "@webpack-cli/configtest": "^1.0.1", + "@webpack-cli/info": "^1.2.2", + "@webpack-cli/serve": "^1.3.0", "colorette": "^1.2.1", - "commander": "^6.2.0", + "commander": "^7.0.0", "enquirer": "^2.3.6", "execa": "^5.0.0", "fastest-levenshtein": "^1.0.12", @@ -13707,9 +13707,9 @@ }, "dependencies": { "commander": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", - "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.0.0.tgz", + "integrity": "sha512-ovx/7NkTrnPuIV8sqk/GjUIIM1+iUQeqA3ye2VNpq9sVoiZsooObWlQy+OPWGI17GDaEoybuAGJm6U8yC077BA==", "dev": true }, "cross-spawn": { From 0d5d346bcdfa2942b48cc7c1ee3f36e4a4bd04f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maximilian=20Kr=C3=B6g?= Date: Sun, 7 Feb 2021 18:03:17 +0100 Subject: [PATCH 466/525] Update links to external resources --- CONTRIBUTING.md | 10 +++++----- DEVELOPING.md | 2 +- README.md | 4 ++-- config/jsdoc/api/plugins/markdown.js | 2 +- config/jsdoc/api/readme.md | 2 +- config/jsdoc/api/template/README.md | 2 +- config/jsdoc/api/template/publish.js | 2 +- doc/faq.md | 6 +++--- doc/index.hbs | 2 +- doc/quickstart.hbs | 2 +- doc/tutorials/background.md | 2 +- doc/tutorials/raster-reprojection.md | 2 +- examples/animated-gif.html | 2 +- examples/bing-maps.html | 2 +- examples/flight-animation.html | 4 ++-- examples/flight-animation.js | 2 +- examples/full-screen-drag-rotate-and-zoom.html | 2 +- examples/full-screen-source.html | 2 +- examples/full-screen.html | 2 +- examples/here-maps.js | 2 +- examples/igc.html | 2 +- examples/localized-openstreetmap.html | 4 ++-- examples/localized-openstreetmap.js | 2 +- examples/mobile-full-screen.html | 4 ++-- examples/overlay.html | 2 +- examples/overviewmap-custom.html | 2 +- examples/permalink.html | 2 +- examples/preload.html | 2 +- examples/raster.html | 2 +- examples/readme.md | 2 +- examples/resources/mapbox-streets-v6-style.js | 2 +- examples/static-image.html | 2 +- examples/static-image.js | 2 +- examples/tissot.html | 2 +- examples/turf.html | 2 +- examples/utfgrid.html | 2 +- examples/vector-labels.js | 2 +- examples/vector-osm.html | 2 +- examples/wmts-dimensions.html | 2 +- examples/wmts-ign.js | 2 +- examples/xyz.html | 2 +- src/ol/Geolocation.js | 8 ++++---- src/ol/control/FullScreen.js | 2 +- src/ol/css.js | 2 +- src/ol/events/condition.js | 8 ++++---- src/ol/format/OSMXML.js | 2 +- src/ol/format/readme.md | 2 +- src/ol/geom/flat/contains.js | 2 +- src/ol/geom/flat/orient.js | 4 ++-- src/ol/source/BingMaps.js | 2 +- src/ol/source/ImageArcGISRest.js | 2 +- src/ol/source/TileArcGISRest.js | 2 +- src/ol/source/TileWMS.js | 2 +- src/ol/structs/PriorityQueue.js | 4 ++-- test/README.md | 2 +- test/spec/ol/proj.test.js | 4 ++-- test/spec/ol/proj/epsg3857.test.js | 6 +++--- test/spec/ol/structs/rbush.test.js | 2 +- test/spec/ol/tilegrid/tilegrid.test.js | 2 +- test/test-extensions.js | 2 +- 60 files changed, 81 insertions(+), 81 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index a29b692030..e91b51831b 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -4,7 +4,7 @@ Thanks for your interest in contributing to OpenLayers. Please see the project' ## Asking Questions -Please ask questions about using the library on [Stack Overflow using the tag 'openlayers'](http://stackoverflow.com/questions/tagged/openlayers). +Please ask questions about using the library on [Stack Overflow using the tag 'openlayers'](https://stackoverflow.com/questions/tagged/openlayers). When you want to get involved and discuss new features or changes, please use [the mailing list](https://groups.google.com/forum/#!forum/openlayers-dev). @@ -68,12 +68,12 @@ easily-understandable chunks. Any individual commit should not add more than one new class or one new function. Do not submit commits that change thousands of lines or that contain more than one distinct logical change. Trivial commits, e.g. to fix lint errors, should be merged into the commit that -introduced the error. See the [Atomic Commit Convention on Wikipedia](http://en.wikipedia.org/wiki/Atomic_commit#Atomic_Commit_Convention) for more detail. +introduced the error. See the [Atomic Commit Convention on Wikipedia](https://en.wikipedia.org/wiki/Atomic_commit#Atomic_Commit_Convention) for more detail. `git apply --patch` and `git rebase` can help you create a clean commit history. -[Reviewboard.org](http://www.reviewboard.org/docs/codebase/dev/git/clean-commits/) -and [Pro GIT](http://git-scm.com/book/en/Git-Tools-Rewriting-History) have +[Reviewboard.org](https://www.reviewboard.org/docs/codebase/dev/git/clean-commits/) +and [Pro GIT](https://git-scm.com/book/en/Git-Tools-Rewriting-History) have explain how to use them. @@ -81,7 +81,7 @@ explain how to use them. Commit messages should be short, begin with a verb in the imperative, and contain no trailing punctuation. We follow -http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html +https://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html for the formatting of commit messages. Git commit message should look like: diff --git a/DEVELOPING.md b/DEVELOPING.md index 82bc72557c..3718bc71d1 100644 --- a/DEVELOPING.md +++ b/DEVELOPING.md @@ -10,7 +10,7 @@ You will obviously start by The minimum requirements are: * Git -* [Node.js](http://nodejs.org/) (version 8 and above) +* [Node.js](https://nodejs.org/) (version 8 and above) The executables `git` and `node` should be in your `PATH`. diff --git a/README.md b/README.md index 1c0c006a06..b908c20619 100644 --- a/README.md +++ b/README.md @@ -108,7 +108,7 @@ TypeScript users may want to use a [third-party types package](https://github.co ## Supported Browsers -OpenLayers runs on all modern browsers that support [HTML5](https://html.spec.whatwg.org/multipage/) and [ECMAScript 5](http://www.ecma-international.org/ecma-262/5.1/). This includes Chrome, Firefox, Safari and Edge. +OpenLayers runs on all modern browsers that support [HTML5](https://html.spec.whatwg.org/multipage/) and [ECMAScript 5](https://262.ecma-international.org/5.1/). This includes Chrome, Firefox, Safari and Edge. For older browsers and platforms (Internet Explorer, Android 4.x, iOS v12 and older, Safari v12 and older), polyfills may be needed for the following browser features: @@ -134,7 +134,7 @@ Please see our guide on [contributing](CONTRIBUTING.md) if you're interested in ## Community -- Need help? Find it on [Stack Overflow using the tag 'openlayers'](http://stackoverflow.com/questions/tagged/openlayers) +- Need help? Find it on [Stack Overflow using the tag 'openlayers'](https://stackoverflow.com/questions/tagged/openlayers) - Follow [@openlayers](https://twitter.com/openlayers) on Twitter ![Test Status](https://github.com/openlayers/openlayers/workflows/Test/badge.svg) diff --git a/config/jsdoc/api/plugins/markdown.js b/config/jsdoc/api/plugins/markdown.js index d5e5c486f8..3d7da8869a 100644 --- a/config/jsdoc/api/plugins/markdown.js +++ b/config/jsdoc/api/plugins/markdown.js @@ -1,7 +1,7 @@ /** * Modified from JSDoc's plugins/markdown and lib/jsdoc/util/markdown modules * (see https://github.com/jsdoc3/jsdoc/), which are licensed under the Apache 2 - * license (see http://www.apache.org/licenses/LICENSE-2.0). + * license (see https://www.apache.org/licenses/LICENSE-2.0). * * This version does not protect http(s) urls from being turned into links, and * works around an issue with `~` characters in module paths by escaping them. diff --git a/config/jsdoc/api/readme.md b/config/jsdoc/api/readme.md index 5179e075e5..849442a7fb 100644 --- a/config/jsdoc/api/readme.md +++ b/config/jsdoc/api/readme.md @@ -1,6 +1,6 @@ # API Documentation -This directory contains configuration (`conf.json`), static content (`index.md`), template (`template/`) and plugins (`plugins/`) for the [JSDoc3](http://usejsdoc.org/) API generator. +This directory contains configuration (`conf.json`), static content (`index.md`), template (`template/`) and plugins (`plugins/`) for the [JSDoc3](https://jsdoc.app/) API generator. ## Documenting the source code diff --git a/config/jsdoc/api/template/README.md b/config/jsdoc/api/template/README.md index dd759dfade..e419f46b15 100644 --- a/config/jsdoc/api/template/README.md +++ b/config/jsdoc/api/template/README.md @@ -1,3 +1,3 @@ This template is based on the [Jaguar](https://github.com/davidshimjs/jaguarjs/tree/master/docs/templates/jaguar) template. [JaguarJS](https://github.com/davidshimjs/jaguarjs) is licensed under the [LGPL license](https://github.com/davidshimjs/jaguarjs/tree/master/LICENSE). -The default template for JSDoc 3 uses: [the Taffy Database library](http://taffydb.com/) and the [Underscore Template library](http://documentcloud.github.com/underscore/#template). +The default template for JSDoc 3 uses: [the Taffy Database library](https://taffydb.com/) and the [Underscore Template library](https://underscorejs.org/#template). diff --git a/config/jsdoc/api/template/publish.js b/config/jsdoc/api/template/publish.js index 936d7463bd..f750010173 100644 --- a/config/jsdoc/api/template/publish.js +++ b/config/jsdoc/api/template/publish.js @@ -322,7 +322,7 @@ function buildNav(members) { } /** - * @param {Object} taffyData See . + * @param {Object} taffyData See {@link https://taffydb.com/}. * @param {Object} opts Options. * @param {Object} tutorials Tutorials. */ diff --git a/doc/faq.md b/doc/faq.md index 908e14d54e..206922dc2f 100644 --- a/doc/faq.md +++ b/doc/faq.md @@ -7,7 +7,7 @@ layout: doc.hbs Certain questions arise more often than others when users ask for help. This document tries to list some of the common questions that frequently get asked, -e.g. on [Stack Overflow](http://stackoverflow.com/questions/tagged/openlayers). +e.g. on [Stack Overflow](https://stackoverflow.com/questions/tagged/openlayers). If you think a question (and naturally its answer) should be added here, feel free to ping us or to send a pull request enhancing this document. @@ -198,8 +198,8 @@ for English, `en`, as a mnemonic: East before North. So you want to center your map on a certain place on the earth and obviously you need to have its coordinates for this. Let's assume you want your map centered on Schladming, a beautiful place in Austria. Head over to the wikipedia -page for [Schladming](http://en.wikipedia.org/wiki/Schladming). In the top-right -corner there is a link to [GeoHack](http://tools.wmflabs.org/geohack/geohack.php?pagename=Schladming¶ms=47_23_39_N_13_41_21_E_type:city(4565)_region:AT-6), +page for [Schladming](https://en.wikipedia.org/wiki/Schladming). In the top-right +corner there is a link to [GeoHack](https://geohack.toolforge.org/geohack.php?pagename=Schladming¶ms=47_23_39_N_13_41_21_E_type:city(4565)_region:AT-6), which effectively tells you the coordinates are: WGS84: diff --git a/doc/index.hbs b/doc/index.hbs index ba62116e51..b86373a90c 100644 --- a/doc/index.hbs +++ b/doc/index.hbs @@ -19,4 +19,4 @@ We have put together a document that lists [Frequently Asked Questions (FAQ)](fa # More questions? -If you cannot find an answer in the documentation or the FAQ, you can search [Stack Overflow](http://stackoverflow.com/questions/tagged/openlayers). If you cannot find an answer there, ask a new question there, using the tag 'openlayers'. +If you cannot find an answer in the documentation or the FAQ, you can search [Stack Overflow](https://stackoverflow.com/questions/tagged/openlayers). If you cannot find an answer there, ask a new question there, using the tag 'openlayers'. diff --git a/doc/quickstart.hbs b/doc/quickstart.hbs index e548fedb0f..66d6e42e0f 100644 --- a/doc/quickstart.hbs +++ b/doc/quickstart.hbs @@ -78,7 +78,7 @@ The first part is to include the JavaScript library. For the purpose of this tut

    ``` -The map in the application is contained in a [`
    ` HTML element](http://en.wikipedia.org/wiki/Span_and_div). Through this `
    ` the map properties like width, height and border can be controlled through CSS. Here's the CSS element used to make the map 400 pixels high and as wide as the browser window. +The map in the application is contained in a [`
    ` HTML element](https://en.wikipedia.org/wiki/Span_and_div). Through this `
    ` the map properties like width, height and border can be controlled through CSS. Here's the CSS element used to make the map 400 pixels high and as wide as the browser window. ```xml
    vertical exaggeration: x
    sun elevation: °
    sun azimuth: °