diff --git a/ACCESSIBILITY.md b/ACCESSIBILITY.md index b48557f01..8fd90adc3 100644 --- a/ACCESSIBILITY.md +++ b/ACCESSIBILITY.md @@ -165,12 +165,12 @@ for more info. | ✅ | Browser language preference | iD tries to use the language set in the browser | | ✅ | Base language fallback | E.g. if `pt_BR` is incomplete, `pt` should be tried before `en` | [#7996](https://github.com/openstreetmap/iD/issues/7996) | ✅ | Custom fallback languages | If the preferred language is incomplete, user-specified ones should be tried before `en` (e.g. `kk` → `ru`) | [#7996](https://github.com/openstreetmap/iD/issues/7996) -| 🟠 | [`lang` HTML attributes](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/lang) | Helps with text-to-speech, text formatting, and auto-transliteration, particularly when iD mixes strings from different languages | [#7963](https://github.com/openstreetmap/iD/issues/7963) +| ✅ | [`lang` HTML attributes](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/lang) | Helps with text-to-speech, text formatting, and auto-transliteration, particularly when iD mixes strings from different languages | [#7998](https://github.com/openstreetmap/iD/pull/7998) | ✅ | Locale URL parameters | `locale` and `rtl` can be used to manually set iD's locale preferences. See the [API](API.md#url-parameters) | | ❌ | Language selection in UI | The mapper should be able to view and change iD's language in the interface at any time. Useful for public computers with fixed browser languages | [#3120](https://github.com/openstreetmap/iD/issues/3120) | | 🟩 | Right-to-left layouts | The [`dir` HTML attribute](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/dir) is properly set for languages like Hebrew and Arabic | | ✅ | [Language-specific plurals](https://docs.transifex.com/localization-tips-workflows/plurals-and-genders#how-pluralized-strings-are-handled-by-transifex) | English has two plural forms, but some languages need more to be grammatically correct | [#597](https://github.com/openstreetmap/iD/issues/597), [#7991](https://github.com/openstreetmap/iD/issues/7991) | -| 🟠 | [Localized number formats](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat) | Most in-text numbers are localized. Numeric fields are not | [#3615](https://github.com/openstreetmap/iD/issues/3615), [#7993](https://github.com/openstreetmap/iD/issues/7993) | +| ✅ | [Localized number formats](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat) | Most in-text numbers are localized, including numeric fields | [#8769](https://github.com/openstreetmap/iD/pull/8769), [#7993](https://github.com/openstreetmap/iD/issues/7993) | | 🟠 | Label icons | Icons should accompany text labels to illustrate the meaning of untranslated terms | ### Translatability diff --git a/CHANGELOG.md b/CHANGELOG.md index 8fb805d9a..5e61d4326 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -37,32 +37,58 @@ _Breaking developer changes, which may affect downstream projects or sites that # Unreleased (2.26.0-dev) #### :tada: New Features +* Combo fields for tags with `yes/no` values now also display the `no` state and allow to toggle between the two states ([#7427]) #### :sparkles: Usability & Accessibility * Make it easier to search for OSM objects by id ([#9520], thanks [@k-yle]) +* Localize numbers in numeric fields ([#8769], thanks [@1ec5]) #### :scissors: Operations #### :camera: Street-Level #### :white_check_mark: Validation +* Offer to connect sidewalk to service road without tagging the connection as a crossing ([#9650], thanks [@1ec5]) #### :bug: Bugfixes +* Fix `multi/many/semiCombo` options for not being selectable immediately after removing them for fields with predefined options +* Fix a bug where the _Add_ input element on comboboxes with a fixed set of allowed options is still hidden after an option of a previously "fully saturated" field is removed +* Fix wrongly flagged "incorrect geometry type" warnings for features with lifecycle-prefixed tags ([#9483], thanks [@biswajit-k]) +* Fix corruption of tag values of fields with referenced strings, but restricted `options`, when an unavailable option is entered manually into the field. +* Properly handle case sensitive tag values in taginfo suggestions in raw tag editor ([#9640]) +* Fix dysfunctional autocomplete of wikidata fields for some languages with country-codes ([#9638]) +* Prevent certain tag values from corrupting css classes when they contain whitespaces ([#9637], thanks [@k-yle]) +* Don't move the cursor to the end of (some) input fields while editing in the middle ([#9233]) #### :earth_asia: Localization * Send `Accept-Language` header on Nominatim API calls ([#9501], thanks [@k-yle]) -* Add Address and Phone Format for India ([#9482], thanks [@biswajit-k]) +* Add Address and Phone format for India ([#9482], thanks [@biswajit-k]) +* Add Address format for the Philippines ([#9482], thanks [@bryceco]) #### :hourglass: Performance #### :mortar_board: Walkthrough / Help #### :rocket: Presets * Render "oneway" arrows for features with `waterway=pressurized`, `waterway=spillway`, `seamark:type=two-way_route` or `seamark:type=recommended_traffic_lane` ([#9492], thanks [@k-yle]) * Render "right-side" arrows for features with lifecycle prefixes ([#9493], thanks [@k-yle]) +* Take regional variants of parent presets into account when resolving preset fields ([#9524]) * Render "right-side" arrows for `man_made=quay` features +* Add support icons also in `multiCombo` and `semiCombo` fields ([#9433]) #### :hammer: Development -* Upgrade dependencies: `fortawesome` to v6.4, `which-polygon` to v2.2.1, `glob` to v9.2, `temaki` to v5.3, `marked` to v4.3, `core-js-bundle` to v3.30 +* Upgrade dependencies: `fortawesome` to v6.4, `which-polygon` to v2.2.1, `glob` to v9.2, `temaki` to v5.4, `marked` to v4.3, `core-js-bundle` to v3.30, `osm-auth` to v2.1 * Bundle `package-lock.json` file in repository for faster `clean-install` builds * Build icons from configured presets source and also process field value `icons` in `npm run build:data` +[#8769]: https://github.com/openstreetmap/iD/pull/8769 +[#7427]: https://github.com/openstreetmap/iD/issues/7427 +[#9233]: https://github.com/openstreetmap/iD/issues/9233 +[#9433]: https://github.com/openstreetmap/iD/pull/9433 [#9482]: https://github.com/openstreetmap/iD/pull/9482 +[#9483]: https://github.com/openstreetmap/iD/pull/9483 [#9492]: https://github.com/openstreetmap/iD/pull/9492 [#9493]: https://github.com/openstreetmap/iD/pull/9493 -[#9520]: https://github.com/openstreetmap/iD/pull/9520 [#9501]: https://github.com/openstreetmap/iD/pull/9501 +[#9520]: https://github.com/openstreetmap/iD/pull/9520 +[#9524]: https://github.com/openstreetmap/iD/issues/9524 +[#9630]: https://github.com/openstreetmap/iD/pull/9630 +[#9637]: https://github.com/openstreetmap/iD/pull/9637 +[#9638]: https://github.com/openstreetmap/iD/pull/9638 +[#9640]: https://github.com/openstreetmap/iD/issues/9640 +[#9650]: https://github.com/openstreetmap/iD/pull/9650 [@biswajit-k]: https://github.com/biswajit-k +[@bryceco]: https://github.com/bryceco # 2.25.2 diff --git a/css/80_app.css b/css/80_app.css index a11605bd2..d93fc1104 100644 --- a/css/80_app.css +++ b/css/80_app.css @@ -1640,10 +1640,14 @@ input.date-selector { display: none; } -.form-field-input-combo input.raw-value { +.form-field-input-combo input.raw-value, +.form-field-input-semicombo input.raw-value, +.form-field-input-multicombo input.raw-value { font-family: monospace; } -.form-field-input-combo input.known-value { +.form-field-input-combo input.known-value, +.form-field-input-semicombo input.known-value, +.form-field-input-multicombo input.known-value { color: #7092ff; } @@ -1676,6 +1680,12 @@ input.date-selector { max-width: 100%; color: #7092ff; } +.form-field-input-multicombo li.chip.negated span { + text-decoration: line-through; +} +.form-field-input-multicombo li.chip input { + width: 1em; +} .ideditor[dir='ltr'] .form-field-input-multicombo li.chip { padding: 2px 0px 2px 5px; } @@ -1700,7 +1710,7 @@ input.date-selector { font-style: italic; } -.form-field-input-multicombo li.chip span { +.form-field-input-multicombo li.chip > span { display: block; flex: 1 1 auto; overflow: hidden; @@ -1739,7 +1749,9 @@ input.date-selector { width: auto; } -.form-field-input-combo .tag-value-icon { +.form-field-input-combo .tag-value-icon, +.form-field-input-semicombo .input-wrap .tag-value-icon, +.form-field-input-multicombo .input-wrap .tag-value-icon { display: inline-block; position: relative; height: 24px; @@ -1750,7 +1762,9 @@ input.date-selector { z-index: 1; padding-left: 11px; } -.ideditor[dir='rtl'] .form-field-input-combo .tag-value-icon { +.ideditor[dir='rtl'] .form-field-input-combo .tag-value-icon, +.ideditor[dir='rtl'] .form-field-input-semicombo .input-wrap .tag-value-icon, +.ideditor[dir='rtl'] .form-field-input-multicombo .input-wrap .tag-value-icon { margin-right: 0; margin-left: -30px; padding-left: 0; @@ -1761,16 +1775,30 @@ input.date-selector { height: 21px; margin: auto; } -.ideditor[dir='ltr'] .form-field-input-combo .tag-value-icon + input { +.ideditor[dir='ltr'] .form-field-input-combo .tag-value-icon + input, +.ideditor[dir='ltr'] .form-field-input-semicombo .input-wrap .tag-value-icon + input, +.ideditor[dir='ltr'] .form-field-input-multicombo .input-wrap .tag-value-icon + input { padding-left: 40px; } -.ideditor[dir='rtl'] .form-field-input-combo .tag-value-icon + input { +.ideditor[dir='rtl'] .form-field-input-combo .tag-value-icon + input, +.ideditor[dir='rtl'] .form-field-input-semicombo .input-wrap .tag-value-icon + input, +.ideditor[dir='rtl'] .form-field-input-multicombo .input-wrap .tag-value-icon + input { padding-right: 40px; } .combobox-option .tag-value-icon { display: inline-block; width: 28px; } +.form-field-input-multicombo li.chip .tag-value-icon .icon { + margin: 0; + margin-right: 6px; + display: inline-block; + vertical-align: center; +} +.ideditor[dir='rtl'] .form-field-input-multicombo li.chip .tag-value-icon .icon { + margin-right: 6px; + margin-left: 0; +} /* Field - Text / Numeric diff --git a/data/address_formats.json b/data/address_formats.json index a48598661..8c0872440 100644 --- a/data/address_formats.json +++ b/data/address_formats.json @@ -223,5 +223,13 @@ ["street", "housenumber"], ["postcode", "city"] ] + }, + { + "countryCodes": ["ph"], + "format": [ + ["unit", "housenumber", "street"], + ["district", "city"], + ["postcode", "province"] + ] } ] diff --git a/data/core.yaml b/data/core.yaml index ebe5892e4..37e18ea69 100644 --- a/data/core.yaml +++ b/data/core.yaml @@ -1931,6 +1931,8 @@ en: title: Connect this feature connect_features: title: Connect the features + connect_using_crossing: + title: Connect using a crossing connect_using_ford: title: Connect using a ford continue_from_start: diff --git a/data/languages.json b/data/languages.json index a80a070dd..2bdfc3581 100644 --- a/data/languages.json +++ b/data/languages.json @@ -1,6 +1,6 @@ { "aa": {}, - "ab": {}, + "ab": {"nativeName": "Аԥсшәа"}, "ace": {}, "ach": {}, "ada": {}, @@ -18,12 +18,14 @@ "aln": {}, "alt": {}, "am": {"nativeName": "አማርኛ"}, - "an": {}, + "an": {"nativeName": "aragonés"}, "ang": {}, + "ann": {"nativeName": "Obolo"}, "anp": {}, + "apc": {"nativeName": "العامية"}, "ar": {"nativeName": "العربية"}, "arc": {}, - "arn": {}, + "arn": {"nativeName": "Mapudungun"}, "aro": {}, "arp": {}, "arq": {}, @@ -40,10 +42,13 @@ "awa": {}, "ay": {}, "az": {"nativeName": "azərbaycan"}, + "az-Arab": {"base": "az", "script": "Arab", "nativeName": "تۆرکجه"}, "az-Cyrl": {"base": "az", "script": "Cyrl"}, "az-Latn": {"base": "az", "script": "Latn"}, - "ba": {}, - "bal": {}, + "ba": {"nativeName": "башҡорт теле"}, + "bal": {"nativeName": "بلۆچی"}, + "bal-Arab": {"base": "bal", "script": "Arab"}, + "bal-Latn": {"base": "bal", "script": "Latn"}, "ban": {}, "bar": {}, "bas": {"nativeName": "Ɓàsàa"}, @@ -60,16 +65,17 @@ "bfq": {}, "bft": {"nativeName": "بلتی"}, "bg": {"nativeName": "български"}, - "bgn": {}, + "bgc": {"nativeName": "हरियाणवी"}, + "bgn": {"nativeName": "بلوچی (رخشانی)"}, "bha": {"nativeName": "भरीयाटी"}, - "bho": {}, + "bho": {"nativeName": "भोजपुरी"}, "bi": {}, "bik": {}, "bin": {}, "bjn": {}, "bkm": {}, "bla": {}, - "blt": {}, + "blt": {"nativeName": "ꪼꪕꪒꪾ"}, "bm": {"nativeName": "bamanakan"}, "bn": {"nativeName": "বাংলা"}, "bo": {"nativeName": "བོད་སྐད་"}, @@ -82,7 +88,7 @@ "bs": {"nativeName": "bosanski"}, "bs-Cyrl": {"base": "bs", "script": "Cyrl"}, "bs-Latn": {"base": "bs", "script": "Latn"}, - "bss": {}, + "bss": {"nativeName": "Akoose"}, "bua": {}, "bug": {}, "bum": {}, @@ -92,10 +98,10 @@ "cad": {}, "car": {}, "cay": {}, - "cch": {}, + "cch": {"nativeName": "Atsam"}, "ccp": {"nativeName": "𑄌𑄋𑄴𑄟𑄳𑄦"}, "ce": {"nativeName": "нохчийн"}, - "ceb": {"nativeName": "Binisaya"}, + "ceb": {"nativeName": "Cebuano"}, "cgg": {"nativeName": "Rukiga"}, "ch": {}, "chb": {}, @@ -103,14 +109,14 @@ "chk": {}, "chm": {}, "chn": {}, - "cho": {}, + "cho": {"nativeName": "Chahta"}, "chp": {}, "chr": {"nativeName": "ᏣᎳᎩ"}, "chy": {}, - "cic": {}, + "cic": {"nativeName": "Chikashshanompaʼ"}, "ckb": {"nativeName": "کوردیی ناوەندی"}, "clc": {}, - "co": {}, + "co": {"nativeName": "corsu"}, "cop": {}, "cps": {}, "cr": {}, @@ -126,7 +132,7 @@ "csb": {}, "csw": {}, "cu": {}, - "cv": {}, + "cv": {"nativeName": "чӑваш"}, "cwd": {}, "cy": {"nativeName": "Cymraeg"}, "da": {"nativeName": "dansk"}, @@ -156,8 +162,10 @@ "egy": {}, "eka": {}, "el": {"nativeName": "Ελληνικά"}, + "el-polyton": {}, "elx": {}, "en": {"nativeName": "English"}, + "en-Dsrt": {"base": "en", "script": "Dsrt"}, "enm": {}, "eo": {"nativeName": "esperanto"}, "es": {"nativeName": "español"}, @@ -183,12 +191,12 @@ "frm": {}, "fro": {}, "frp": {}, - "frr": {}, + "frr": {"nativeName": "Nordfriisk"}, "frs": {}, "fur": {"nativeName": "furlan"}, "fy": {"nativeName": "Frysk"}, "ga": {"nativeName": "Gaeilge"}, - "gaa": {}, + "gaa": {"nativeName": "Gã"}, "gag": {}, "gan": {}, "gay": {}, @@ -200,7 +208,7 @@ "gl": {"nativeName": "galego"}, "glk": {}, "gmh": {}, - "gn": {}, + "gn": {"nativeName": "avañe’ẽ"}, "goh": {}, "gom": {}, "gon": {}, @@ -223,12 +231,13 @@ "hdn": {}, "he": {"nativeName": "עברית"}, "hi": {"nativeName": "हिन्दी"}, - "hi-Latn": {"base": "en", "script": "Latn"}, + "hi-Latn": {"base": "en", "script": "Latn", "nativeName": "Hindi (Latin)"}, "hif": {}, "hil": {}, "hit": {}, "hmn": {}, - "hnj": {}, + "hnj": {"nativeName": "𞄀𞄄𞄰𞄩𞄍𞄜𞄰"}, + "hnj-Hmnp": {"base": "hnj", "script": "Hmnp"}, "ho": {}, "hr": {"nativeName": "hrvatski"}, "hsb": {"nativeName": "hornjoserbšćina"}, @@ -251,7 +260,7 @@ "ikt": {}, "ilo": {}, "inh": {}, - "io": {}, + "io": {"nativeName": "Ido"}, "is": {"nativeName": "íslenska"}, "it": {"nativeName": "italiano"}, "iu": {}, @@ -260,7 +269,7 @@ "ja-Hira": {"base": "ja", "script": "Hira"}, "ja-Latn": {"base": "ja", "script": "Latn"}, "jam": {}, - "jbo": {}, + "jbo": {"nativeName": "la .lojban."}, "jgo": {"nativeName": "Ndaꞌa"}, "jmc": {"nativeName": "Kimachame"}, "jpr": {}, @@ -271,15 +280,15 @@ "kaa": {}, "kab": {"nativeName": "Taqbaylit"}, "kac": {}, - "kaj": {}, + "kaj": {"nativeName": "Kaje"}, "kam": {"nativeName": "Kikamba"}, "kaw": {}, "kbd": {}, "kbl": {}, - "kcg": {}, + "kcg": {"nativeName": "Katab"}, "kde": {"nativeName": "Chimakonde"}, "kea": {"nativeName": "kabuverdianu"}, - "ken": {}, + "ken": {"nativeName": "Kɛnyaŋ"}, "kfo": {}, "kg": {}, "kgp": {"nativeName": "kanhgág"}, @@ -303,7 +312,7 @@ "koi": {}, "kok": {"nativeName": "कोंकणी"}, "kos": {}, - "kpe": {}, + "kpe": {"nativeName": "Kpɛlɛɛ"}, "kr": {}, "krc": {}, "kri": {}, @@ -333,7 +342,7 @@ "lfn": {}, "lg": {"nativeName": "Luganda"}, "li": {}, - "lij": {}, + "lij": {"nativeName": "ligure"}, "lil": {}, "liv": {}, "lkt": {"nativeName": "Lakȟólʼiyapi"}, @@ -344,6 +353,7 @@ "lou": {}, "loz": {}, "lrc": {"nativeName": "لۊری شومالی"}, + "lsm": {}, "lt": {"nativeName": "lietuvių"}, "ltg": {}, "lu": {"nativeName": "Tshiluba"}, @@ -364,7 +374,7 @@ "man": {}, "mas": {"nativeName": "Maa"}, "mde": {}, - "mdf": {}, + "mdf": {"nativeName": "мокшень кяль"}, "mdr": {}, "men": {}, "mer": {"nativeName": "Kĩmĩrũ"}, @@ -374,7 +384,7 @@ "mgh": {"nativeName": "Makua"}, "mgo": {"nativeName": "metaʼ"}, "mh": {}, - "mi": {"nativeName": "te reo Māori"}, + "mi": {"nativeName": "Māori"}, "mic": {}, "min": {}, "mk": {"nativeName": "македонски"}, @@ -383,21 +393,22 @@ "mnc": {}, "mni": {"nativeName": "মৈতৈলোন্"}, "mni-Beng": {"base": "mni", "script": "Beng"}, + "mni-Mtei": {"base": "mni", "script": "Mtei"}, "moe": {}, - "moh": {}, + "moh": {"nativeName": "Kanienʼkéha"}, "mos": {}, "mr": {"nativeName": "मराठी"}, "mrj": {}, "ms": {"nativeName": "Melayu"}, "mt": {"nativeName": "Malti"}, "mua": {"nativeName": "MUNDAŊ"}, - "mus": {}, + "mus": {"nativeName": "Mvskoke"}, "mwl": {}, "mwr": {}, "mwv": {}, "my": {"nativeName": "မြန်မာ"}, "mye": {}, - "myv": {}, + "myv": {"nativeName": "эрзянь кель"}, "mzn": {"nativeName": "مازرونی"}, "na": {}, "nan": {}, @@ -405,7 +416,7 @@ "naq": {"nativeName": "Khoekhoegowab"}, "nb": {"nativeName": "norsk bokmål"}, "nd": {"nativeName": "isiNdebele"}, - "nds": {"nativeName": "nds"}, + "nds": {}, "ne": {"nativeName": "नेपाली"}, "new": {}, "ng": {}, @@ -413,20 +424,20 @@ "niu": {}, "njo": {}, "nl": {"nativeName": "Nederlands"}, - "nmg": {"nativeName": "nmg"}, + "nmg": {}, "nn": {"nativeName": "norsk nynorsk"}, "nnh": {"nativeName": "Shwóŋò ngiembɔɔn"}, "no": {"nativeName": "norsk"}, "nog": {}, "non": {}, "nov": {}, - "nqo": {}, + "nqo": {"nativeName": "ߒߞߏ"}, "nr": {}, "nso": {}, "nus": {"nativeName": "Thok Nath"}, - "nv": {}, + "nv": {"nativeName": "Diné Bizaad"}, "nwc": {}, - "ny": {}, + "ny": {"nativeName": "Nyanja"}, "nym": {}, "nyn": {"nativeName": "Runyankore"}, "nyo": {}, @@ -442,13 +453,13 @@ "om": {"nativeName": "Oromoo"}, "or": {"nativeName": "ଓଡ଼ିଆ"}, "os": {"nativeName": "ирон"}, - "osa": {}, + "osa": {"nativeName": "𐓏𐓘𐓻𐓘𐓻𐓟"}, "ota": {}, "pa": {"nativeName": "ਪੰਜਾਬੀ"}, "pag": {}, "pal": {}, "pam": {}, - "pap": {}, + "pap": {"nativeName": "Papiamentu"}, "pau": {}, "pcd": {}, "pcm": {"nativeName": "Naijíriá Píjin"}, @@ -458,25 +469,27 @@ "pfl": {}, "phn": {}, "pi": {}, + "pis": {"nativeName": "Pijin"}, "pl": {"nativeName": "polski"}, "pms": {}, "pnb": {"nativeName": "پنجابی"}, "pnt": {}, "pon": {}, "pqm": {}, - "prg": {}, + "prg": {"nativeName": "prūsiskan"}, "pro": {}, "ps": {"nativeName": "پښتو"}, "pt": {"nativeName": "português"}, "qu": {"nativeName": "Runasimi"}, - "quc": {}, + "quc": {"nativeName": "Kʼicheʼ"}, "qug": {}, - "raj": {}, + "raj": {"nativeName": "राजस्थानी"}, "rap": {}, "rar": {}, "rgn": {}, - "rhg": {}, - "rif": {}, + "rhg": {"nativeName": "𐴌𐴗𐴥𐴝𐴙𐴚𐴒𐴙𐴝"}, + "rhg-Rohg": {"base": "rhg", "script": "Rohg"}, + "rif": {"nativeName": "Tarifit"}, "rm": {"nativeName": "rumantsch"}, "rn": {"nativeName": "Ikirundi"}, "ro": {"nativeName": "română"}, @@ -496,19 +509,20 @@ "saq": {"nativeName": "Kisampur"}, "sas": {}, "sat": {"nativeName": "ᱥᱟᱱᱛᱟᱲᱤ"}, + "sat-Deva": {"base": "sat", "script": "Deva"}, "sat-Olck": {"base": "sat", "script": "Olck"}, "saz": {}, "sba": {}, "sbp": {"nativeName": "Ishisangu"}, "sc": {"nativeName": "sardu"}, "scl": {"nativeName": "ݜݨیاٗ"}, - "scn": {}, + "scn": {"nativeName": "sicilianu"}, "sco": {}, "sd": {"nativeName": "سنڌي"}, "sd-Arab": {"base": "sd", "script": "Arab"}, "sd-Deva": {"base": "sd", "script": "Deva"}, "sdc": {}, - "sdh": {}, + "sdh": {"nativeName": "کوردی خوارگ"}, "se": {"nativeName": "davvisámegiella"}, "see": {}, "seh": {"nativeName": "sena"}, @@ -523,7 +537,7 @@ "shi": {"nativeName": "ⵜⴰⵛⵍⵃⵉⵜ"}, "shi-Latn": {"base": "shi", "script": "Latn"}, "shi-Tfng": {"base": "shi", "script": "Tfng"}, - "shn": {}, + "shn": {"nativeName": "တႆး"}, "shu": {}, "si": {"nativeName": "සිංහල"}, "sid": {}, @@ -534,10 +548,10 @@ "sli": {}, "sly": {}, "sm": {}, - "sma": {}, - "smj": {}, + "sma": {"nativeName": "Åarjelsaemien gïele"}, + "smj": {"nativeName": "julevsámegiella"}, "smn": {"nativeName": "anarâškielâ"}, - "sms": {}, + "sms": {"nativeName": "sääʹmǩiõll"}, "sn": {"nativeName": "chiShona"}, "snk": {}, "so": {"nativeName": "Soomaali"}, @@ -548,9 +562,9 @@ "sr-Latn": {"base": "sr", "script": "Latn"}, "srn": {}, "srr": {}, - "ss": {}, - "ssy": {}, - "st": {}, + "ss": {"nativeName": "siSwati"}, + "ssy": {"nativeName": "Saho"}, + "st": {"nativeName": "Sesotho"}, "stq": {}, "str": {}, "su": {"nativeName": "Basa Sunda"}, @@ -562,8 +576,8 @@ "sw": {"nativeName": "Kiswahili"}, "swb": {}, "syc": {}, - "syr": {}, - "szl": {}, + "syr": {"nativeName": "ܣܘܪܝܝܐ"}, + "szl": {"nativeName": "ślōnski"}, "ta": {"nativeName": "தமிழ்"}, "tce": {}, "tcy": {}, @@ -590,10 +604,11 @@ "tn": {}, "to": {"nativeName": "lea fakatonga"}, "tog": {}, - "tpi": {}, + "tok": {"nativeName": "Toki Pona"}, + "tpi": {"nativeName": "Tok Pisin"}, "tr": {"nativeName": "Türkçe"}, "tru": {}, - "trv": {}, + "trv": {"nativeName": "patas Taroko"}, "trw": {"nativeName": "توروالی"}, "ts": {}, "tsd": {}, @@ -613,7 +628,6 @@ "uga": {}, "uk": {"nativeName": "українська"}, "umb": {}, - "und": {"nativeName": "und"}, "ur": {"nativeName": "اردو"}, "uz": {"nativeName": "o‘zbek"}, "uz-Arab": {"base": "uz", "script": "Arab"}, @@ -623,7 +637,7 @@ "vai-Latn": {"base": "vai", "script": "Latn"}, "vai-Vaii": {"base": "vai", "script": "Vaii"}, "ve": {}, - "vec": {}, + "vec": {"nativeName": "Veneto"}, "vep": {}, "vi": {"nativeName": "Tiếng Việt"}, "vls": {}, @@ -632,17 +646,17 @@ "vot": {}, "vro": {}, "vun": {"nativeName": "Kyivunjo"}, - "wa": {}, + "wa": {"nativeName": "walon"}, "wae": {"nativeName": "Walser"}, "wal": {}, "war": {}, "was": {}, "wbl": {"nativeName": "وخی"}, - "wbp": {}, + "wbp": {"nativeName": "Warlpiri"}, "wo": {"nativeName": "Wolof"}, "wuu": {}, "xal": {}, - "xh": {"nativeName": "isiXhosa"}, + "xh": {"nativeName": "IsiXhosa"}, "xmf": {}, "xog": {"nativeName": "Olusoga"}, "yao": {}, diff --git a/data/territory_languages.json b/data/territory_languages.json index 1025855a1..0d5db48e7 100644 --- a/data/territory_languages.json +++ b/data/territory_languages.json @@ -12,7 +12,7 @@ "ar": ["es", "en", "cy", "gn"], "as": ["sm", "en"], "at": ["de", "bar", "en", "fr", "it", "hr", "sl", "hu"], - "au": ["en", "zh-Hant", "it", "wbp"], + "au": ["en", "zh-Hant", "it", "wbp", "hnj"], "aw": ["nl", "pap", "en"], "ax": ["sv"], "az": ["az", "az-Cyrl", "tly", "ku", "ttt", "tkr"], @@ -30,7 +30,7 @@ "bn": ["ms", "zh-Hant", "ms-Arab", "en"], "bo": ["es", "qu", "ay", "gn", "aro"], "bq": ["pap", "nl"], - "br": ["pt", "en", "de", "it", "ja", "es", "kgp", "ko", "yrl", "gub", "xav"], + "br": ["pt", "en", "de", "it", "vec", "ja", "es", "kgp", "ko", "yrl", "gub", "xav"], "bs": ["en"], "bt": ["dz", "ne", "tsj", "en", "lep"], "bv": ["und"], @@ -46,10 +46,11 @@ "ci": ["fr", "bci", "sef", "dnj", "kfo", "bqv"], "ck": ["en"], "cl": ["es", "en", "arn"], - "cm": ["fr", "en", "bum", "ff", "ewo", "ybb", "bbj", "nnh", "bkm", "bas", "bax", "byv", "mua", "maf", "bfd", "bss", "kkj", "dua", "mgo", "ar", "jgo", "ksf", "agq", "ha-Arab", "nmg", "yav", "ff-Adlm"], - "cn": ["zh", "wuu", "yue-Hans", "hsn", "hak", "nan", "gan", "ii", "ug", "za", "mn-Mong", "bo", "ko", "kk-Arab", "lis", "ky-Arab", "nxq", "khb", "tdd", "lcp", "en", "ru", "vi", "uz-Cyrl", "lzh"], + "cm": ["fr", "en", "bum", "ff", "ewo", "ybb", "bbj", "nnh", "bkm", "bas", "bax", "byv", "mua", "maf", "bfd", "bss", "kkj", "dua", "mgo", "ar", "jgo", "ksf", "ken", "agq", "ha-Arab", "nmg", "yav", "ff-Adlm"], + "cn": ["zh", "wuu", "yue-Hans", "hsn", "hak", "nan", "gan", "ii", "ug", "za", "mn-Mong", "bo", "ko", "kk-Arab", "lis", "ky-Arab", "nxq", "khb", "tdd", "lcp", "en", "hnj", "ru", "vi", "uz-Cyrl", "lzh"], "co": ["es", "guc", "yrl"], "cp": ["und"], + "cq": ["en"], "cr": ["es"], "cu": ["es"], "cv": ["kea", "pt"], @@ -70,19 +71,19 @@ "eg": ["ar", "arz", "en", "el"], "eh": ["ar"], "er": ["ti", "en", "tig", "ar", "aa", "ssy", "byn"], - "es": ["es", "en", "ca", "gl", "eu", "ast", "ext", "an"], - "et": ["en", "am", "om", "so", "ti", "sid", "wal", "aa"], + "es": ["es", "en", "ca", "gl", "eu", "ast", "ext", "an", "oc"], + "et": ["en", "am", "om", "so", "ti", "sid", "wal", "aa", "gez"], "fi": ["fi", "en", "sv", "de", "ru", "et", "rmf", "se", "smn", "sms"], "fj": ["en", "hi", "hif", "fj", "rtm"], "fk": ["en"], "fm": ["en", "chk", "pon", "kos", "yap", "uli"], "fo": ["fo"], - "fr": ["fr", "en", "es", "de", "oc", "it", "pt", "pcd", "gsw", "br", "co", "ca", "eu", "nl", "frp", "ia"], + "fr": ["fr", "en", "es", "de", "oc", "it", "pt", "pcd", "gsw", "br", "co", "hnj", "ca", "eu", "nl", "frp", "ia"], "ga": ["fr", "puu"], - "gb": ["en", "fr", "de", "es", "pl", "pa", "ur", "ta", "gu", "sco", "cy", "bn", "ar", "zh-Hant", "it", "lt", "pt", "so", "tr", "ga", "gd", "kw"], + "gb": ["en", "fr", "de", "es", "pl", "pa", "ur", "ta", "gu", "sco", "cy", "bn", "ar", "zh-Hant", "it", "lt", "pt", "so", "tr", "ga", "gd", "kw", "en-Shaw"], "gd": ["en"], "ge": ["ka", "xmf", "ru", "hy", "ab", "os", "ku"], - "gf": ["fr", "gcr", "zh-Hant"], + "gf": ["fr", "gcr", "zh-Hant", "hnj"], "gg": ["en"], "gh": ["ak", "en", "ee", "abr", "gur", "ada", "gaa", "nzi", "ha", "saf", "ff", "ff-Adlm"], "gi": ["en", "es"], @@ -100,23 +101,23 @@ "hk": ["zh-Hant", "yue", "en", "zh"], "hm": ["und"], "hn": ["es", "en"], - "hr": ["hr", "en", "it"], + "hr": ["hr", "en", "it", "vec"], "ht": ["ht", "fr"], "hu": ["hu", "en", "de", "fr", "ro", "hr", "sk", "sl"], "ic": ["es"], "id": ["id", "jv", "su", "mad", "ms", "min", "bew", "ban", "bug", "bjn", "ace", "ms-Arab", "sas", "bbc", "zh-Hant", "mak", "ljp", "rej", "gor", "nij", "kge", "aoz", "kvr", "lbw", "gay", "rob", "mdr", "sxn", "sly", "mwv"], "ie": ["en", "ga", "fr"], - "il": ["he", "en", "ar", "ru", "ro", "yi", "pl", "lad", "hu", "am", "ti", "ml"], + "il": ["he", "en", "ar", "apc", "ru", "ro", "yi", "pl", "lad", "hu", "am", "ti", "ml"], "im": ["en", "gv"], "in": ["hi", "en", "bn", "te", "mr", "ta", "ur", "gu", "kn", "ml", "or", "pa", "bho", "awa", "as", "bgc", "mag", "mai", "mwr", "hne", "dcc", "bjj", "ne", "sat", "wtm", "rkt", "ks", "kok", "gom", "swv", "gbm", "lmn", "sd", "gon", "kfy", "doi", "kru", "sck", "wbq", "xnr", "khn", "tcy", "wbr", "brx", "sd-Deva", "noe", "bhb", "mni", "hi-Latn", "raj", "hoc", "mtr", "unr", "bhi", "hoj", "kha", "kfr", "grt", "unx", "bfy", "srx", "saz", "ccp", "bfq", "njo", "ria", "bo", "bpy", "bft", "bra", "lep", "btv", "lif", "lah", "sa", "kht", "dv", "dz"], "io": ["en"], "iq": ["ar", "en", "ckb", "az-Arab", "fa", "lrc", "syr"], "ir": ["fa", "az-Arab", "mzn", "glk", "ckb", "sdh", "tk", "lrc", "ar", "bal", "rmt", "bqi", "luz", "lki", "bgn", "prd", "hy", "ps", "ka", "gbz", "kk-Arab"], "is": ["is", "da"], - "it": ["it", "en", "fr", "sc", "de", "vec", "nap", "lij", "scn", "sdc", "sl", "fur", "egl", "ca", "el", "lmo", "pms", "hr", "rgn", "lld"], + "it": ["it", "en", "fr", "lmo", "sc", "de", "vec", "nap", "lij", "scn", "sdc", "sl", "fur", "egl", "ca", "el", "pms", "hr", "rgn", "lld"], "je": ["en"], "jm": ["en", "jam"], - "jo": ["ar", "en"], + "jo": ["ar", "apc", "en"], "jp": ["ja", "ryu", "ko"], "ke": ["sw", "en", "ki", "luy", "luo", "kam", "kln", "guz", "mer", "mas", "ebu", "so", "dav", "teo", "pko", "om", "saq", "ar", "pa", "gu"], "kg": ["ky", "ru"], @@ -129,8 +130,8 @@ "kw": ["ar"], "ky": ["en"], "kz": ["ru", "kk", "en", "de", "ug-Cyrl"], - "la": ["lo", "kjg", "kdt"], - "lb": ["ar", "en", "hy", "ku-Arab", "fr"], + "la": ["lo", "kjg", "hnj", "kdt"], + "lb": ["apc", "ar", "en", "hy", "ku-Arab", "fr"], "lc": ["en"], "li": ["de", "gsw", "wae"], "lk": ["si", "ta", "en"], @@ -140,7 +141,7 @@ "lu": ["fr", "lb", "de", "en", "pt"], "lv": ["lv", "en", "ru", "ltg"], "ly": ["ar"], - "ma": ["ary", "ar", "zgh", "fr", "en", "tzm", "shi", "shi-Latn", "rif", "rif-Latn", "es"], + "ma": ["ary", "ar", "zgh", "fr", "en", "tzm", "shi", "shi-Latn", "rif", "rif-Tfng", "es"], "mc": ["fr"], "md": ["ro", "uk", "bg", "gag", "ru"], "me": ["sr-Latn", "sq", "sr"], @@ -149,7 +150,7 @@ "mh": ["en", "mh"], "mk": ["mk", "sq", "tr"], "ml": ["bm", "fr", "ffm", "snk", "mwk", "ses", "tmh", "bm-Nkoo", "khq", "dtm", "kao", "ar", "bmq", "bze"], - "mm": ["my", "shn", "kac", "rhg", "mnw", "kht"], + "mm": ["my", "shn", "kac", "rhg", "mnw", "hnj", "kht"], "mn": ["mn", "kk-Arab", "zh", "ru", "ug-Cyrl"], "mo": ["zh-Hant", "pt", "zh", "en"], "mp": ["en", "ch"], @@ -160,16 +161,16 @@ "mu": ["mfe", "en", "bho", "ur", "fr", "ta"], "mv": ["dv", "en"], "mw": ["en", "ny", "tum", "tog", "zu"], - "mx": ["es", "en", "yua", "nhe", "nhw", "maz", "nch", "sei"], + "mx": ["es", "en", "yua", "nhe", "nhw", "maz", "nch", "vec", "sei"], "my": ["ms", "en", "zh", "ta", "iba", "jv", "zmi", "dtp", "ml", "bug", "bjn"], "mz": ["pt", "vmw", "ndc", "ts", "ngl", "seh", "mgh", "rng", "ny", "yao", "sw", "zu"], "na": ["af", "kj", "ng", "naq", "hz", "en", "de", "tn"], "nc": ["fr"], "ne": ["ha", "fr", "dje", "fuq", "tmh", "ar", "twq", "ff", "ff-Adlm"], "nf": ["en"], - "ng": ["en", "pcm", "ha", "ig", "yo", "fuv", "tiv", "efi", "ibb", "ha-Arab", "bin", "kaj", "kcg", "ar", "cch", "amo", "ff", "ff-Adlm"], + "ng": ["en", "pcm", "ha", "ig", "yo", "fuv", "tiv", "efi", "ibb", "ha-Arab", "bin", "kaj", "kcg", "ar", "cch", "amo", "ann", "ff", "ff-Adlm"], "ni": ["es"], - "nl": ["nl", "en", "de", "fr", "nds", "li", "fy", "gos", "id", "zea", "rif-Latn", "tr"], + "nl": ["nl", "en", "de", "fr", "nds", "li", "fy", "gos", "id", "zea", "rif", "tr"], "no": ["nb", "no", "nn", "se"], "np": ["ne", "mai", "bho", "new", "jml", "en", "dty", "awa", "thl", "bap", "tdg", "thr", "lif", "mgp", "thq", "mrd", "bfy", "xsr", "rjs", "taj", "hi", "gvr", "bo", "tkt", "tdh", "bn", "unr-Deva", "lep"], "nr": ["en", "na"], @@ -181,12 +182,12 @@ "pf": ["fr", "ty", "zh-Hant"], "pg": ["tpi", "en", "ho"], "ph": ["en", "fil", "es", "ceb", "ilo", "hil", "bik", "war", "fbl", "pam", "pag", "mdh", "tsg", "zh-Hant", "cps", "krj", "bto", "hnn", "tbw", "bku"], - "pk": ["ur", "en", "ps", "sd", "skr", "bal", "brh", "hno", "fa", "bgn", "hnd", "gju", "bft", "kvx", "khw", "mvy", "gjk", "kxp", "ks", "trw", "btv", "pnb", "scl", "trw", "kls"], - "pl": ["pl", "en", "de", "ru", "szl", "be", "uk", "csb", "sli", "lt"], + "pk": ["ur", "en", "ps", "sd", "skr", "bal", "hno", "brh", "fa", "bgn", "hnd", "gju", "bft", "kvx", "khw", "mvy", "gjk", "kxp", "ks", "trw", "btv", "pnb", "scl", "trw", "kls"], + "pl": ["pl", "en", "de", "ru", "szl", "be", "uk", "csb", "sli", "lt", "prg"], "pm": ["fr", "en"], "pn": ["en"], "pr": ["es", "en"], - "ps": ["ar"], + "ps": ["ar", "apc"], "pt": ["pt", "en", "fr", "es", "gl"], "pw": ["pau", "en"], "py": ["gn", "es", "de"], @@ -197,39 +198,39 @@ "ru": ["ru", "tt", "ba", "cv", "hy", "ce", "av", "udm", "chm", "os", "sah", "kbd", "myv", "dar", "bua", "mdf", "kum", "kv", "lez", "krc", "inh", "tyv", "az-Cyrl", "ady", "krl", "lbe", "koi", "mrj", "alt", "fi", "sr-Latn", "vep", "mn", "izh", "cu", "vot"], "rw": ["rw", "en", "fr"], "sa": ["ar", "ars"], - "sb": ["en", "rug"], + "sb": ["en", "pis", "rug"], "sc": ["crs", "fr", "en"], "sd": ["ar", "en", "bej", "fvr", "ha-Arab", "mls", "fia", "zag"], "se": ["sv", "en", "fi", "fit", "se", "rmu", "yi", "smj", "sma", "ia"], "sg": ["en", "zh", "ms", "ta", "ml", "pa"], "sh": ["en"], - "si": ["sl", "hr", "en", "de", "hu", "it"], + "si": ["sl", "hr", "en", "de", "vec", "hu", "it"], "sj": ["nb", "ru"], "sk": ["sk", "cs", "en", "de", "hu", "uk", "pl"], "sl": ["kri", "en", "men", "tem", "ff", "ff-Adlm"], "sm": ["it", "eo"], "sn": ["wo", "fr", "ff", "srr", "dyo", "sav", "mfv", "bjt", "snf", "knf", "bsc", "mey", "tnr", "ff-Adlm"], "so": ["so", "ar", "sw", "om"], - "sr": ["nl", "srn", "zh-Hant"], + "sr": ["nl", "srn", "zh-Hant", "hnj"], "ss": ["ar", "en", "nus"], "st": ["pt"], "sv": ["es"], "sx": ["en", "es", "vic", "nl"], - "sy": ["ar", "ku", "fr", "hy", "syr"], + "sy": ["apc", "ar", "ku", "fr", "hy", "syr"], "sz": ["en", "ss", "zu", "ts"], "ta": ["en"], "tc": ["en"], "td": ["fr", "ar"], "tf": ["fr"], "tg": ["fr", "ee", "ife"], - "th": ["th", "en", "tts", "nod", "sou", "mfa", "zh-Hant", "kxm", "kdt", "mnw", "shn", "lcp", "lwl"], + "th": ["th", "en", "tts", "nod", "sou", "mfa", "zh-Hant", "kxm", "kdt", "mnw", "hnj", "shn", "lcp", "lwl"], "tj": ["tg", "ru", "fa", "ar"], "tk": ["en", "tkl"], "tl": ["pt", "tet"], "tm": ["tk", "ru", "uz", "ku"], "tn": ["aeb", "ar", "fr"], "to": ["to", "en"], - "tr": ["tr", "en", "ku", "zza", "kbd", "az", "az-Arab", "ar", "bgx", "bg", "ady", "kiu", "hy", "ka", "lzz", "sr-Latn", "sq", "ab", "el", "tru", "uz", "ky-Latn", "kk"], + "tr": ["tr", "en", "ku", "apc", "zza", "kbd", "az", "az-Arab", "ar", "bgx", "bg", "ady", "kiu", "hy", "ka", "lzz", "sr-Latn", "sq", "ab", "el", "tru", "uz", "ky-Latn", "kk"], "tt": ["en", "es"], "tv": ["tvl", "en"], "tw": ["zh-Hant", "trv"], @@ -237,7 +238,7 @@ "ua": ["uk", "ru", "pl", "yi", "rue", "be", "crh", "ro", "bg", "tr", "hu", "el"], "ug": ["sw", "lg", "nyn", "cgg", "xog", "en", "teo", "laj", "ach", "myx", "rw", "ttj", "hi"], "um": ["en"], - "us": ["en", "es", "zh-Hant", "fr", "de", "fil", "it", "vi", "ko", "ru", "nv", "yi", "pdc", "haw", "frc", "chr", "esu", "dak", "cho", "lkt", "ik", "mus", "cad", "cic", "osa"], + "us": ["en", "es", "zh-Hant", "fr", "de", "fil", "it", "vi", "ko", "ru", "nv", "yi", "pdc", "hnj", "haw", "frc", "chr", "esu", "dak", "cho", "lkt", "ik", "mus", "cad", "cic", "io", "jbo", "osa"], "uy": ["es"], "uz": ["uz", "uz-Cyrl", "ru", "kaa", "tr"], "va": ["it", "la"], @@ -245,7 +246,7 @@ "ve": ["es", "yrl"], "vg": ["en"], "vi": ["en"], - "vn": ["vi", "zh-Hant", "cjm"], + "vn": ["vi", "zh-Hant", "blt", "hnj", "cjm"], "vu": ["bi", "en", "fr"], "wf": ["wls", "fr", "fud"], "ws": ["sm", "en"], diff --git a/modules/actions/change_preset.js b/modules/actions/change_preset.js index 13f02596e..09bd4e3f3 100644 --- a/modules/actions/change_preset.js +++ b/modules/actions/change_preset.js @@ -3,6 +3,7 @@ export function actionChangePreset(entityID, oldPreset, newPreset, skipFieldDefa var entity = graph.entity(entityID); var geometry = entity.geometry(graph); var tags = entity.tags; + const loc = entity.extent(graph).center(); // preserve tags that the new preset might care about, if any var preserveKeys; @@ -15,14 +16,14 @@ export function actionChangePreset(entityID, oldPreset, newPreset, skipFieldDefa // only if old preset is not a sub-preset of the new one: // preserve tags for which the new preset has a field // https://github.com/openstreetmap/iD/issues/9372 - newPreset.fields().concat(newPreset.moreFields()) + newPreset.fields(loc).concat(newPreset.moreFields(loc)) .filter(f => f.matchGeometry(geometry)) .map(f => f.key).filter(Boolean) .forEach(key => preserveKeys.push(key)); } } - if (oldPreset) tags = oldPreset.unsetTags(tags, geometry, preserveKeys); - if (newPreset) tags = newPreset.setTags(tags, geometry, skipFieldDefaults); + if (oldPreset) tags = oldPreset.unsetTags(tags, geometry, preserveKeys, loc); + if (newPreset) tags = newPreset.setTags(tags, geometry, skipFieldDefaults, loc); return graph.replace(entity.update({tags: tags})); }; diff --git a/modules/core/localizer.js b/modules/core/localizer.js index a072b41ad..59067f699 100644 --- a/modules/core/localizer.js +++ b/modules/core/localizer.js @@ -424,5 +424,81 @@ export function coreLocalizer() { return code; // if not found, use the code }; + /** + * Returns a function that formats a floating-point number in the given + * locale. + */ + localizer.floatFormatter = (locale) => { + if (!('Intl' in window && 'NumberFormat' in Intl && + 'formatToParts' in Intl.NumberFormat.prototype)) { + return (number, fractionDigits) => { + return fractionDigits === undefined ? number.toString() : number.toFixed(fractionDigits); + }; + } else { + return (number, fractionDigits) => number.toLocaleString(locale, { + minimumFractionDigits: fractionDigits, + maximumFractionDigits: fractionDigits === undefined ? 20 : fractionDigits, + }); + } + }; + + /** + * Returns a function that parses a number formatted according to the given + * locale as a floating-point number. + */ + localizer.floatParser = (locale) => { + // https://stackoverflow.com/a/55366435/4585461 + const polyfill = (string) => +string.trim(); + if (!('Intl' in window && 'NumberFormat' in Intl)) return polyfill; + const format = new Intl.NumberFormat(locale, { maximumFractionDigits: 20 }); + if (!('formatToParts' in format)) return polyfill; + const parts = format.formatToParts(-12345.6); + const numerals = Array.from({ length: 10 }).map((_, i) => format.format(i)); + const index = new Map(numerals.map((d, i) => [d, i])); + const literalPart = parts.find(d => d.type === 'literal'); + const literal = literalPart && new RegExp(`[${literalPart.value}]`, 'g'); + const groupPart = parts.find(d => d.type === 'group'); + const group = groupPart && new RegExp(`[${groupPart.value}]`, 'g'); + const decimalPart = parts.find(d => d.type === 'decimal'); + const decimal = decimalPart && new RegExp(`[${decimalPart.value}]`); + const numeral = new RegExp(`[${numerals.join('')}]`, 'g'); + const getIndex = d => index.get(d); + return (string) => { + string = string.trim(); + if (literal) string = string.replace(literal, ''); + if (group) string = string.replace(group, ''); + if (decimal) string = string.replace(decimal, '.'); + string = string.replace(numeral, getIndex); + return string ? +string : NaN; + }; + }; + + /** + * Returns a function that returns the number of decimal places in a + * formatted number string. + */ + localizer.decimalPlaceCounter = (locale) => { + var literal, group, decimal; + if ('Intl' in window && 'NumberFormat' in Intl) { + const format = new Intl.NumberFormat(locale, { maximumFractionDigits: 20 }); + if ('formatToParts' in format) { + const parts = format.formatToParts(-12345.6); + const literalPart = parts.find(d => d.type === 'literal'); + literal = literalPart && new RegExp(`[${literalPart.value}]`, 'g'); + const groupPart = parts.find(d => d.type === 'group'); + group = groupPart && new RegExp(`[${groupPart.value}]`, 'g'); + const decimalPart = parts.find(d => d.type === 'decimal'); + decimal = decimalPart && new RegExp(`[${decimalPart.value}]`); + } + } + return (string) => { + string = string.trim(); + if (literal) string = string.replace(literal, ''); + if (group) string = string.replace(group, ''); + const parts = string.split(decimal || '.'); + return parts && parts[1] && parts[1].length || 0; + }; + }; + return localizer; } diff --git a/modules/modes/add_area.js b/modules/modes/add_area.js index b253d425f..7932feec0 100644 --- a/modules/modes/add_area.js +++ b/modules/modes/add_area.js @@ -15,9 +15,11 @@ export function modeAddArea(context, mode) { .on('startFromWay', startFromWay) .on('startFromNode', startFromNode); - var defaultTags = { area: 'yes' }; - if (mode.preset) defaultTags = mode.preset.setTags(defaultTags, 'area'); - + function defaultTags(loc) { + var defaultTags = { area: 'yes' }; + if (mode.preset) defaultTags = mode.preset.setTags(defaultTags, 'area', false, loc); + return defaultTags; + } function actionClose(wayId) { return function (graph) { @@ -29,7 +31,7 @@ export function modeAddArea(context, mode) { function start(loc) { var startGraph = context.graph(); var node = osmNode({ loc: loc }); - var way = osmWay({ tags: defaultTags }); + var way = osmWay({ tags: defaultTags(loc) }); context.perform( actionAddEntity(node), @@ -45,7 +47,7 @@ export function modeAddArea(context, mode) { function startFromWay(loc, edge) { var startGraph = context.graph(); var node = osmNode({ loc: loc }); - var way = osmWay({ tags: defaultTags }); + var way = osmWay({ tags: defaultTags(loc) }); context.perform( actionAddEntity(node), @@ -61,7 +63,7 @@ export function modeAddArea(context, mode) { function startFromNode(node) { var startGraph = context.graph(); - var way = osmWay({ tags: defaultTags }); + var way = osmWay({ tags: defaultTags(node.loc) }); context.perform( actionAddEntity(way), diff --git a/modules/modes/add_line.js b/modules/modes/add_line.js index 42e9d5db9..426f4ce4b 100644 --- a/modules/modes/add_line.js +++ b/modules/modes/add_line.js @@ -15,14 +15,17 @@ export function modeAddLine(context, mode) { .on('startFromWay', startFromWay) .on('startFromNode', startFromNode); - var defaultTags = {}; - if (mode.preset) defaultTags = mode.preset.setTags(defaultTags, 'line'); + function defaultTags(loc) { + var defaultTags = {}; + if (mode.preset) defaultTags = mode.preset.setTags(defaultTags, 'line', false, loc); + return defaultTags; + } function start(loc) { var startGraph = context.graph(); var node = osmNode({ loc: loc }); - var way = osmWay({ tags: defaultTags }); + var way = osmWay({ tags: defaultTags(loc) }); context.perform( actionAddEntity(node), @@ -37,7 +40,7 @@ export function modeAddLine(context, mode) { function startFromWay(loc, edge) { var startGraph = context.graph(); var node = osmNode({ loc: loc }); - var way = osmWay({ tags: defaultTags }); + var way = osmWay({ tags: defaultTags(loc) }); context.perform( actionAddEntity(node), @@ -52,7 +55,7 @@ export function modeAddLine(context, mode) { function startFromNode(node) { var startGraph = context.graph(); - var way = osmWay({ tags: defaultTags }); + var way = osmWay({ tags: defaultTags(node.loc) }); context.perform( actionAddEntity(way), diff --git a/modules/modes/add_point.js b/modules/modes/add_point.js index 3ad4a301b..deff506a9 100644 --- a/modules/modes/add_point.js +++ b/modules/modes/add_point.js @@ -19,12 +19,15 @@ export function modeAddPoint(context, mode) { .on('cancel', cancel) .on('finish', cancel); - var defaultTags = {}; - if (mode.preset) defaultTags = mode.preset.setTags(defaultTags, 'point'); + function defaultTags(loc) { + var defaultTags = {}; + if (mode.preset) defaultTags = mode.preset.setTags(defaultTags, 'point', false, loc); + return defaultTags; + } function add(loc) { - var node = osmNode({ loc: loc, tags: defaultTags }); + var node = osmNode({ loc: loc, tags: defaultTags(loc) }); context.perform( actionAddEntity(node), @@ -36,7 +39,7 @@ export function modeAddPoint(context, mode) { function addWay(loc, edge) { - var node = osmNode({ tags: defaultTags }); + var node = osmNode({ tags: defaultTags(loc) }); context.perform( actionAddMidpoint({loc: loc, edge: edge}, node), @@ -54,14 +57,15 @@ export function modeAddPoint(context, mode) { function addNode(node) { - if (Object.keys(defaultTags).length === 0) { + const _defaultTags = defaultTags(node.loc); + if (Object.keys(_defaultTags).length === 0) { enterSelectMode(node); return; } var tags = Object.assign({}, node.tags); // shallow copy - for (var key in defaultTags) { - tags[key] = defaultTags[key]; + for (var key in _defaultTags) { + tags[key] = _defaultTags[key]; } context.perform( diff --git a/modules/osm/tags.js b/modules/osm/tags.js index 8381d7281..af1a2d022 100644 --- a/modules/osm/tags.js +++ b/modules/osm/tags.js @@ -76,11 +76,11 @@ export function osmTagSuggestingArea(tags) { var returnTags = {}; for (var realKey in tags) { const key = osmRemoveLifecyclePrefix(realKey); - if (key in osmAreaKeys && !(tags[key] in osmAreaKeys[key])) { + if (key in osmAreaKeys && !(tags[realKey] in osmAreaKeys[key])) { returnTags[realKey] = tags[realKey]; return returnTags; } - if (key in osmAreaKeysExceptions && tags[key] in osmAreaKeysExceptions[key]) { + if (key in osmAreaKeysExceptions && tags[realKey] in osmAreaKeysExceptions[key]) { returnTags[realKey] = tags[realKey]; return returnTags; } @@ -242,3 +242,6 @@ export var osmRailwayTrackTagValues = { export var osmFlowingWaterwayTagValues = { canal: true, ditch: true, drain: true, fish_pass: true, river: true, stream: true, tidal_channel: true }; + +// Tags which values should be considered case sensitive when offering tag suggestions +export const allowUpperCaseTagValues = /network|taxon|genus|species|brand|grape_variety|royal_cypher|listed_status|booth|rating|stars|:output|_hours|_times|_ref|manufacturer|country|target|brewery|cai_scale|traffic_sign/; diff --git a/modules/presets/index.js b/modules/presets/index.js index 8996aae12..2caf97549 100644 --- a/modules/presets/index.js +++ b/modules/presets/index.js @@ -163,9 +163,6 @@ export function presetIndex() { // Rebuild universal fields array _universal = Object.values(_fields).filter(field => field.universal); - // Reset all the preset fields - they'll need to be resolved again - Object.values(_presets).forEach(preset => preset.resetFields()); - // Rebuild geometry index _geometryIndex = { point: {}, vertex: {}, line: {}, area: {}, relation: {} }; _this.collection.forEach(preset => { diff --git a/modules/presets/preset.js b/modules/presets/preset.js index fbf3b841f..3b025512b 100644 --- a/modules/presets/preset.js +++ b/modules/presets/preset.js @@ -1,7 +1,10 @@ +import { isEqual } from 'lodash'; + import { t } from '../core/localizer'; import { osmAreaKeys, osmAreaKeysExceptions } from '../osm/tags'; import { utilArrayUniq, utilObjectOmit } from '../util'; import { utilSafeClassName } from '../util/util'; +import { locationManager } from '../core/LocationManager'; // @@ -13,8 +16,6 @@ export function presetPreset(presetID, preset, addable, allFields, allPresets) { allPresets = allPresets || {}; let _this = Object.assign({}, preset); // shallow copy let _addable = addable || false; - let _resolvedFields; // cache - let _resolvedMoreFields; // cache let _searchName; // cache let _searchNameStripped; // cache let _searchAliases; // cache @@ -40,11 +41,9 @@ export function presetPreset(presetID, preset, addable, allFields, allPresets) { _this.originalMoreFields = (_this.moreFields || []); - _this.fields = () => _resolvedFields || (_resolvedFields = resolveFields('fields')); + _this.fields = loc => resolveFields('fields', loc); - _this.moreFields = () => _resolvedMoreFields || (_resolvedMoreFields = resolveFields('moreFields')); - - _this.resetFields = () => _resolvedFields = _resolvedMoreFields = null; + _this.moreFields = loc => resolveFields('moreFields', loc); _this.tags = _this.tags || {}; @@ -219,13 +218,13 @@ export function presetPreset(presetID, preset, addable, allFields, allPresets) { }; - _this.unsetTags = (tags, geometry, ignoringKeys, skipFieldDefaults) => { + _this.unsetTags = (tags, geometry, ignoringKeys, skipFieldDefaults, loc) => { // allow manually keeping some tags let removeTags = ignoringKeys ? utilObjectOmit(_this.removeTags, ignoringKeys) : _this.removeTags; tags = utilObjectOmit(tags, Object.keys(removeTags)); if (geometry && !skipFieldDefaults) { - _this.fields().forEach(field => { + _this.fields(loc).forEach(field => { if (field.matchGeometry(geometry) && field.key && field.default === tags[field.key] && (!ignoringKeys || ignoringKeys.indexOf(field.key) === -1)) { @@ -239,7 +238,7 @@ export function presetPreset(presetID, preset, addable, allFields, allPresets) { }; - _this.setTags = (tags, geometry, skipFieldDefaults) => { + _this.setTags = (tags, geometry, skipFieldDefaults, loc) => { const addTags = _this.addTags; tags = Object.assign({}, tags); // shallow copy @@ -277,7 +276,7 @@ export function presetPreset(presetID, preset, addable, allFields, allPresets) { } if (geometry && !skipFieldDefaults) { - _this.fields().forEach(field => { + _this.fields(loc).forEach(field => { if (field.matchGeometry(geometry) && field.key && !tags[field.key] && field.default) { tags[field.key] = field.default; } @@ -290,14 +289,14 @@ export function presetPreset(presetID, preset, addable, allFields, allPresets) { // For a preset without fields, use the fields of the parent preset. // Replace {preset} placeholders with the fields of the specified presets. - function resolveFields(which) { + function resolveFields(which, loc) { const fieldIDs = (which === 'fields' ? _this.originalFields : _this.originalMoreFields); let resolved = []; fieldIDs.forEach(fieldID => { const match = fieldID.match(referenceRegex); if (match !== null) { // a presetID wrapped in braces {} - resolved = resolved.concat(inheritFields(match[1], which)); + resolved = resolved.concat(inheritFields(allPresets[match[1]], which)); } else if (allFields[fieldID]) { // a normal fieldID resolved.push(allFields[fieldID]); } else { @@ -310,7 +309,19 @@ export function presetPreset(presetID, preset, addable, allFields, allPresets) { const endIndex = _this.id.lastIndexOf('/'); const parentID = endIndex && _this.id.substring(0, endIndex); if (parentID) { - resolved = inheritFields(parentID, which); + let parent = allPresets[parentID]; + if (loc) { + const validHere = locationManager.locationSetsAt(loc); + if (parent.locationSetID && !validHere[parent.locationSetID]) { + // this is a preset for which a regional variant of the main preset exists + const candidateIDs = Object.keys(allPresets).filter(k => k.startsWith(parentID)); + parent = allPresets[candidateIDs.find(candidateID => { + const candidate = allPresets[candidateID]; + return validHere[candidate.locationSetID] && isEqual(candidate.tags, parent.tags); + })]; + } + } + resolved = inheritFields(parent, which); } } @@ -318,8 +329,7 @@ export function presetPreset(presetID, preset, addable, allFields, allPresets) { // returns an array of fields to inherit from the given presetID, if found - function inheritFields(presetID, which) { - const parent = allPresets[presetID]; + function inheritFields(parent, which) { if (!parent) return []; if (which === 'fields') { diff --git a/modules/services/taginfo.js b/modules/services/taginfo.js index bd6903cb4..283772a6d 100644 --- a/modules/services/taginfo.js +++ b/modules/services/taginfo.js @@ -4,6 +4,7 @@ import { json as d3_json } from 'd3-fetch'; import { utilObjectOmit, utilQsString } from '../util'; import { localizer } from '../core/localizer'; +import { allowUpperCaseTagValues } from '../osm/tags'; import { taginfoApiUrl } from '../../config/id.js'; @@ -312,8 +313,7 @@ export default { // A few OSM keys expect values to contain uppercase values (see #3377). // This is not an exhaustive list (e.g. `name` also has uppercase values) // but these are the fields where taginfo value lookup is most useful. - var re = /network|taxon|genus|species|brand|grape_variety|royal_cypher|listed_status|booth|rating|stars|:output|_hours|_times|_ref|manufacturer|country|target|brewery|cai_scale/; - var allowUpperCase = re.test(params.key); + var allowUpperCase = allowUpperCaseTagValues.test(params.key); var f = filterValues(allowUpperCase); var result = d.data.filter(f).map(valKeyDescription); diff --git a/modules/services/wikidata.js b/modules/services/wikidata.js index 1e242114a..a45ff0ac2 100644 --- a/modules/services/wikidata.js +++ b/modules/services/wikidata.js @@ -17,7 +17,7 @@ export default { // Search for Wikidata items matching the query - itemsForSearchQuery: function(query, callback) { + itemsForSearchQuery: function _itemsForSearchQuery(query, callback, language) { if (!query) { if (callback) callback('No query', {}); return; @@ -32,7 +32,7 @@ export default { search: query, type: 'item', // the language to search - language: lang, + language: language || lang, // the language for the label and description in the result uselang: lang, limit: 10, @@ -42,7 +42,14 @@ export default { d3_json(url) .then(function(result) { if (result && result.error) { - throw new Error(result.error); + if (result.error.code === 'badvalue' && + result.error.info.includes(lang) && + !language && lang.includes('-')) { + // retry without "country suffix" region subtag + _itemsForSearchQuery(query, callback, lang.split('-')[0]); + } else { + throw new Error(result.error); + } } if (callback) callback(null, result.search || {}); }) diff --git a/modules/svg/tag_classes.js b/modules/svg/tag_classes.js index e358e9903..cf535c34f 100644 --- a/modules/svg/tag_classes.js +++ b/modules/svg/tag_classes.js @@ -159,7 +159,12 @@ export function svgTagClasses() { classes.push('tag-wikidata'); } - return classes.join(' ').trim(); + // ensure that classes for tags keys/values with special characters like spaces + // are not added to the DOM, because it can cause bizarre issues (#9448) + return classes + .filter(klass => /^[-_a-z0-9]+$/.test(klass)) + .join(' ') + .trim(); }; diff --git a/modules/ui/fields/combo.js b/modules/ui/fields/combo.js index 1c601dc4a..78066bd70 100644 --- a/modules/ui/fields/combo.js +++ b/modules/ui/fields/combo.js @@ -73,7 +73,7 @@ export function uiFieldCombo(field, context) { function tagValue(dval) { dval = clean(dval || ''); - var found = getOptions().find(function(o) { + var found = getOptions(true).find(function(o) { return o.key && clean(o.value) === dval; }); if (found) return found.key; @@ -151,7 +151,7 @@ export function uiFieldCombo(field, context) { function objectDifference(a, b) { return a.filter(function(d1) { return !b.some(function(d2) { - return !d2.isMixed && d1.value === d2.value; + return d1.value === d2.value; }); }); } @@ -167,15 +167,21 @@ export function uiFieldCombo(field, context) { setTaginfoValues('', setPlaceholder); } else { selection.call(_combobox, attachTo); - setStaticValues(setPlaceholder); + setTimeout(() => setStaticValues(setPlaceholder), 0); } } - function getOptions() { + function getOptions(allOptions) { var stringsField = field.resolveReference('stringsCrossReference'); if (!(field.options || stringsField.options)) return []; - return (field.options || stringsField.options).map(function(v) { + let options; + if (allOptions !== true) { + options = field.options || stringsField.options; + } else { + options = [].concat(field.options, stringsField.options).filter(Boolean); + } + return options.map(function(v) { const labelId = getLabelId(stringsField, v); return { key: v, @@ -325,6 +331,12 @@ export function uiFieldCombo(field, context) { _container.selectAll('input') .attr('placeholder', ph); + + // Hide 'Add' button if this field uses fixed set of + // options and they're all currently used + var hideAdd = (!_allowCustomValues && !values.length); + _container.selectAll('.chiplist .input-wrap') + .style('display', hideAdd ? 'none' : null); } @@ -404,6 +416,17 @@ export function uiFieldCombo(field, context) { } + function invertMultikey(d3_event, d) { + d3_event.preventDefault(); + d3_event.stopPropagation(); + var t = {}; + if (_isMulti) { + t[d.key] = _tags[d.key] === 'yes' ? 'no' : 'yes'; + } + dispatch.call('change', this, t); + } + + function combo(selection) { _container = selection.selectAll('.form-field-input-wrap') .data([0]); @@ -443,6 +466,11 @@ export function uiFieldCombo(field, context) { .attr('class', 'input-wrap') .merge(_inputWrap); + // Hide 'Add' button if this field uses fixed set of + // options and they're all currently used + var hideAdd = (!_allowCustomValues && !_comboData.length); + _inputWrap.style('display', hideAdd ? 'none' : null); + _input = _inputWrap.selectAll('input') .data([0]); } else { @@ -515,11 +543,15 @@ export function uiFieldCombo(field, context) { function updateIcon(value) { value = tagValue(value); + let container = _container; + if (field.type === 'multiCombo' || field.type === 'semiCombo') { + container = _container.select('.input-wrap'); + } const iconsField = field.resolveReference('iconsCrossReference'); if (iconsField.icons) { - _container.selectAll('.tag-value-icon').remove(); + container.selectAll('.tag-value-icon').remove(); if (iconsField.icons[value]) { - _container.selectAll('.tag-value-icon') + container.selectAll('.tag-value-icon') .data([value]) .enter() .insert('div', 'input') @@ -533,6 +565,14 @@ export function uiFieldCombo(field, context) { _tags = tags; var stringsField = field.resolveReference('stringsCrossReference'); + var isMixed = Array.isArray(tags[field.key]); + var showsValue = value => !isMixed && value && !(field.type === 'typeCombo' && value === 'yes'); + var isRawValue = value => showsValue(value) + && !stringsField.hasTextForStringId(`options.${value}`) + && !stringsField.hasTextForStringId(`options.${value}.title`); + var isKnownValue = value => showsValue(value) && !isRawValue(value); + var isReadOnly = !_allowCustomValues; + if (_isMulti || _isSemi) { _multiData = []; @@ -545,13 +585,13 @@ export function uiFieldCombo(field, context) { if (!field.key && field.keys.indexOf(k) === -1) continue; var v = tags[k]; - if (!v || (typeof v === 'string' && v.toLowerCase() === 'no')) continue; var suffix = field.key ? k.slice(field.key.length) : k; _multiData.push({ key: k, value: displayValue(suffix), - display: renderValue(suffix), + display: addComboboxIcons(renderValue(suffix), suffix), + state: typeof v === 'string' ? v.toLowerCase() : '', isMixed: Array.isArray(v) }); } @@ -592,7 +632,7 @@ export function uiFieldCombo(field, context) { return { key: v, value: displayValue(v), - display: renderValue(v), + display: addComboboxIcons(renderValue(v), v), isMixed: !commonValues.includes(v) }; }); @@ -610,20 +650,13 @@ export function uiFieldCombo(field, context) { // a negative maxlength doesn't make sense maxLength = Math.max(0, maxLength); - var allowDragAndDrop = _isSemi // only semiCombo values are ordered - && !Array.isArray(tags[field.key]); - - // Exclude existing multikeys from combo options.. - var available = objectDifference(_comboData, _multiData); - _combobox.data(available); - - // Hide 'Add' button if this field uses fixed set of - // options and they're all currently used, - // or if the field is already at its character limit - var hideAdd = (!_allowCustomValues && !available.length) || maxLength <= 0; + // Hide 'Add' button if this field is already at its character limit + var hideAdd = maxLength <= 0 || (!_allowCustomValues && !_comboData.length); _container.selectAll('.chiplist .input-wrap') .style('display', hideAdd ? 'none' : null); + var allowDragAndDrop = _isSemi // only semiCombo values are ordered + && !Array.isArray(tags[field.key]); // Render chips var chips = _container.selectAll('.chip') @@ -651,8 +684,24 @@ export function uiFieldCombo(field, context) { return d.isMixed; }) .attr('title', function(d) { - return d.isMixed ? t('inspector.unshared_value_tooltip') : null; - }); + if (d.isMixed) { + return t('inspector.unshared_value_tooltip'); + } + if (!['yes', 'no'].includes(d.state)) { + return d.state; + } + return null; + }) + .classed('negated', d => d.state === 'no'); + + if (!_isSemi) { + chips.selectAll('input[type=checkbox]').remove(); + chips.insert('input', 'span') + .attr('type', 'checkbox') + .property('checked', d => d.state === 'yes') + .property('indeterminate', d => d.isMixed || !['yes', 'no'].includes(d.state)) + .on('click', invertMultikey); + } if (allowDragAndDrop) { registerDragAndDrop(chips); @@ -674,21 +723,14 @@ export function uiFieldCombo(field, context) { .attr('class', 'remove') .text('×'); + updateIcon(''); } else { - var isMixed = Array.isArray(tags[field.key]); - var mixedValues = isMixed && tags[field.key].map(function(val) { return displayValue(val); }).filter(Boolean); - var showsValue = !isMixed && tags[field.key] && !(field.type === 'typeCombo' && tags[field.key] === 'yes'); - var isRawValue = showsValue && !stringsField.hasTextForStringId(`options.${tags[field.key]}`) - && !stringsField.hasTextForStringId(`options.${tags[field.key]}.title`); - var isKnownValue = showsValue && !isRawValue; - - var isReadOnly = !_allowCustomValues || isKnownValue; - utilGetSetValue(_input, !isMixed ? displayValue(tags[field.key]) : '') + .data([tags[field.key]]) .classed('raw-value', isRawValue) .classed('known-value', isKnownValue) .attr('readonly', isReadOnly ? 'readonly' : undefined) @@ -697,7 +739,7 @@ export function uiFieldCombo(field, context) { .classed('mixed', isMixed) .on('keydown.deleteCapture', function(d3_event) { if (isReadOnly && - isKnownValue && + isKnownValue(tags[field.key]) && (d3_event.keyCode === utilKeybinding.keyCodes['⌫'] || d3_event.keyCode === utilKeybinding.keyCodes['⌦'])) { @@ -718,6 +760,16 @@ export function uiFieldCombo(field, context) { _lengthIndicator.update(tags[field.key]); } } + + const refreshStyles = () => { + _input + .data([tagValue(utilGetSetValue(_input))]) + .classed('raw-value', isRawValue) + .classed('known-value', isKnownValue); + }; + _input.on('input.refreshStyles', refreshStyles); + _combobox.on('update.refreshStyles', refreshStyles); + refreshStyles(); }; function registerDragAndDrop(selection) { diff --git a/modules/ui/fields/input.js b/modules/ui/fields/input.js index 5ad862ba7..aa8d55225 100644 --- a/modules/ui/fields/input.js +++ b/modules/ui/fields/input.js @@ -11,6 +11,7 @@ import { svgIcon } from '../../svg/icon'; import { cardinal } from '../../osm/node'; import { uiLengthIndicator } from '..'; import { uiTooltip } from '../tooltip'; +import { isEqual } from 'lodash-es'; export { uiFieldText as uiFieldColour, @@ -18,9 +19,11 @@ export { uiFieldText as uiFieldIdentifier, uiFieldText as uiFieldNumber, uiFieldText as uiFieldTel, - uiFieldText as uiFieldUrl + uiFieldText as uiFieldUrl, + likelyRawNumberFormat }; +const likelyRawNumberFormat = /^-?(0\.\d*|\d*\.\d{0,2}(\d{4,})?|\d{4,}\.\d{3})$/; export function uiFieldText(field, context) { var dispatch = d3_dispatch('change'); @@ -32,6 +35,9 @@ export function uiFieldText(field, context) { var _tags; var _phoneFormats = {}; const isDirectionField = field.key.split(':').some(keyPart => keyPart === 'direction'); + const formatFloat = localizer.floatFormatter(localizer.languageCode()); + const parseLocaleFloat = localizer.floatParser(localizer.languageCode()); + const countDecimalPlaces = localizer.decimalPlaceCounter(localizer.languageCode()); if (field.type === 'tel') { fileFetcher.get('phone_formats') @@ -132,18 +138,20 @@ export function uiFieldText(field, context) { var raw_vals = input.node().value || '0'; var vals = raw_vals.split(';'); vals = vals.map(function(v) { - var num = Number(v); + v = v.trim(); + const isRawNumber = likelyRawNumberFormat.test(v); + var num = isRawNumber ? parseFloat(v) : parseLocaleFloat(v); if (isDirectionField) { - const compassDir = cardinal[v.trim().toLowerCase()]; + const compassDir = cardinal[v.toLowerCase()]; if (compassDir !== undefined) { num = compassDir; } } - if (!isFinite(num)) { - // do nothing if the value is neither a number, nor a cardinal direction - return v.trim(); - } + // do nothing if the value is neither a number, nor a cardinal direction + if (!isFinite(num)) return v; + num = parseFloat(num); + if (!isFinite(num)) return v; num += d; // clamp to 0..359 degree range if it's a direction field @@ -152,8 +160,9 @@ export function uiFieldText(field, context) { num = ((num % 360) + 360) % 360; } // make sure no extra decimals are introduced - const numDecimals = v.includes('.') ? v.split('.')[1].length : 0; - return clamped(num).toFixed(numDecimals); + return formatFloat(clamped(num), isRawNumber + ? (v.includes('.') ? v.split('.')[1].length : 0) + : countDecimalPlaces(v)); }); input.node().value = vals.join(';'); change()(); @@ -384,6 +393,17 @@ export function uiFieldText(field, context) { } + // returns all values of a (potential) multiselection and/or multi-key field + function getVals(tags) { + if (field.keys) { + return new Set(field.keys.reduce((acc, key) => acc.concat(tags[key]), []) + .filter(Boolean)); + } else { + return new Set([].concat(tags[field.key]).filter(Boolean)); + } + } + + function change(onInput) { return function() { var t = {}; @@ -391,21 +411,42 @@ export function uiFieldText(field, context) { if (!onInput) val = context.cleanTagValue(val); // don't override multiple values with blank string - if (!val && Array.isArray(_tags[field.key])) return; + if (!val && getVals(_tags).size > 1) return; - if (!onInput) { - if (field.type === 'number' && val) { - var vals = val.split(';'); - vals = vals.map(function(v) { - var num = Number(v); - return isFinite(num) ? clamped(num) : v.trim(); - }); - val = vals.join(';'); - } - utilGetSetValue(input, val); + var displayVal = val; + if (field.type === 'number' && val) { + var numbers = val.split(';'); + numbers = numbers.map(function(v) { + if (likelyRawNumberFormat.test(v)) { + // input number likely in "raw" format + return v; + } + var num = parseLocaleFloat(v); + const fractionDigits = countDecimalPlaces(v); + return isFinite(num) ? clamped(num).toFixed(fractionDigits) : v; + }); + val = numbers.join(';'); } + if (!onInput) utilGetSetValue(input, displayVal); t[field.key] = val || undefined; - dispatch.call('change', this, t, onInput); + if (field.keys) { + // for multi-key fields with: handle alternative tag keys gracefully + // https://github.com/openstreetmap/id-tagging-schema/issues/905 + dispatch.call('change', this, tags => { + if (field.keys.some(key => tags[key])) { + // use exiting key(s) + field.keys.filter(key => tags[key]).forEach(key => { + tags[key] = val || undefined; + }); + } else { + // fall back to default key if none of the `keys` is preset + tags[field.key] = val || undefined; + } + return tags; + }, onInput); + } else { + dispatch.call('change', this, t, onInput); + } }; } @@ -416,14 +457,47 @@ export function uiFieldText(field, context) { return i; }; - i.tags = function(tags) { _tags = tags; - var isMixed = Array.isArray(tags[field.key]); + const vals = getVals(tags); + const isMixed = vals.size > 1; + var val = vals.size === 1 ? [...vals][0] : ''; + var shouldUpdate; - utilGetSetValue(input, !isMixed && tags[field.key] ? tags[field.key] : '') - .attr('title', isMixed ? tags[field.key].filter(Boolean).join('\n') : undefined) + if (field.type === 'number' && val) { + var numbers = val.split(';'); + var oriNumbers = utilGetSetValue(input).split(';'); + if (numbers.length !== oriNumbers.length) shouldUpdate = true; + numbers = numbers.map(function(v) { + v = v.trim(); + var num = Number(v); + if (!isFinite(num) || v === '') return v; + const fractionDigits = v.includes('.') ? v.split('.')[1].length : 0; + return formatFloat(num, fractionDigits); + }); + val = numbers.join(';'); + // for number fields, we don't want to override the content of the + // input element with the same number using a different formatting + // (e.g. when entering "1234.5", this should not be reformatted to + // "1.234,5" which could otherwise cause the cursor to be in the + // wrong location after the change) + // but if the actual numeric value of the field has changed (e.g. + // by pressing the +/- buttons or using the raw tag editor), we + // can and should update the content of the input element. + shouldUpdate = (inputValue, setValue) => { + const inputNums = inputValue.split(';').map(setVal => + likelyRawNumberFormat.test(setVal) + ? parseFloat(setVal) + : parseLocaleFloat(setVal) + ); + const setNums = setValue.split(';').map(parseLocaleFloat); + return !isEqual(inputNums, setNums); + }; + } + + utilGetSetValue(input, val, shouldUpdate) + .attr('title', isMixed ? [...vals].join('\n') : undefined) .attr('placeholder', isMixed ? t('inspector.multiple_values') : (field.placeholder() || t('inspector.unknown'))) .classed('mixed', isMixed); diff --git a/modules/ui/fields/localized.js b/modules/ui/fields/localized.js index 631475823..8726ce8c5 100644 --- a/modules/ui/fields/localized.js +++ b/modules/ui/fields/localized.js @@ -96,7 +96,7 @@ export function uiFieldLocalized(field, context) { var preset = presetManager.match(entity, context.graph()); if (preset) { var isSuggestion = preset.suggestion; - var fields = preset.fields(); + var fields = preset.fields(entity.extent(context.graph()).center()); var showsBrandField = fields.some(function(d) { return d.id === 'brand'; }); var showsOperatorField = fields.some(function(d) { return d.id === 'operator'; }); var setsName = preset.addTags.name; diff --git a/modules/ui/fields/roadheight.js b/modules/ui/fields/roadheight.js index dfe7cd0d1..612193073 100644 --- a/modules/ui/fields/roadheight.js +++ b/modules/ui/fields/roadheight.js @@ -3,8 +3,9 @@ import { select as d3_select } from 'd3-selection'; import * as countryCoder from '@rapideditor/country-coder'; import { uiCombobox } from '../combobox'; -import { t } from '../../core/localizer'; +import { t, localizer } from '../../core/localizer'; import { utilGetSetValue, utilNoAuto, utilRebind, utilTotalExtent } from '../../util'; +import { likelyRawNumberFormat } from './input'; export function uiFieldRoadheight(field, context) { @@ -16,6 +17,8 @@ export function uiFieldRoadheight(field, context) { var _entityIDs = []; var _tags; var _isImperial; + var formatFloat = localizer.floatFormatter(localizer.languageCode()); + var parseLocaleFloat = localizer.floatParser(localizer.languageCode()); var primaryUnits = [ { @@ -129,16 +132,27 @@ export function uiFieldRoadheight(field, context) { if (!primaryValue && !secondaryValue) { tag[field.key] = undefined; - } else if (isNaN(primaryValue) || isNaN(secondaryValue) || !_isImperial) { - tag[field.key] = context.cleanTagValue(primaryValue); } else { - if (primaryValue !== '') { - primaryValue = context.cleanTagValue(primaryValue + '\''); + var rawPrimaryValue = likelyRawNumberFormat.test(primaryValue) + ? parseFloat(primaryValue) + : parseLocaleFloat(primaryValue); + if (isNaN(rawPrimaryValue)) rawPrimaryValue = primaryValue; + var rawSecondaryValue = likelyRawNumberFormat.test(secondaryValue) + ? parseFloat(secondaryValue) + : parseLocaleFloat(secondaryValue); + if (isNaN(rawSecondaryValue)) rawSecondaryValue = secondaryValue; + + if (isNaN(rawPrimaryValue) || isNaN(rawSecondaryValue) || !_isImperial) { + tag[field.key] = context.cleanTagValue(rawPrimaryValue); + } else { + if (rawPrimaryValue !== '') { + rawPrimaryValue = rawPrimaryValue + '\''; + } + if (rawSecondaryValue !== '') { + rawSecondaryValue = rawSecondaryValue + '"'; + } + tag[field.key] = context.cleanTagValue(rawPrimaryValue + rawSecondaryValue); } - if (secondaryValue !== '') { - secondaryValue = context.cleanTagValue(secondaryValue + '"'); - } - tag[field.key] = primaryValue + secondaryValue; } dispatch.call('change', this, tag); @@ -156,26 +170,36 @@ export function uiFieldRoadheight(field, context) { if (primaryValue && (primaryValue.indexOf('\'') >= 0 || primaryValue.indexOf('"') >= 0)) { secondaryValue = primaryValue.match(/(-?[\d.]+)"/); if (secondaryValue !== null) { - secondaryValue = secondaryValue[1]; + secondaryValue = formatFloat(parseFloat(secondaryValue[1])); } primaryValue = primaryValue.match(/(-?[\d.]+)'/); if (primaryValue !== null) { - primaryValue = primaryValue[1]; + primaryValue = formatFloat(parseFloat(primaryValue[1])); } _isImperial = true; } else if (primaryValue) { + var rawValue = primaryValue; + primaryValue = parseFloat(rawValue); + if (isNaN(primaryValue)) { + primaryValue = rawValue; + } else { + primaryValue = formatFloat(primaryValue); + } _isImperial = false; } } setUnitSuggestions(); + // If feet are specified but inches are omitted, assume zero inches. + var inchesPlaceholder = formatFloat(0); + utilGetSetValue(primaryInput, typeof primaryValue === 'string' ? primaryValue : '') .attr('title', isMixed ? primaryValue.filter(Boolean).join('\n') : null) .attr('placeholder', isMixed ? t('inspector.multiple_values') : t('inspector.unknown')) .classed('mixed', isMixed); utilGetSetValue(secondaryInput, typeof secondaryValue === 'string' ? secondaryValue : '') - .attr('placeholder', isMixed ? t('inspector.multiple_values') : (_isImperial ? '0' : null)) + .attr('placeholder', isMixed ? t('inspector.multiple_values') : (_isImperial ? inchesPlaceholder : null)) .classed('mixed', isMixed) .classed('disabled', !_isImperial) .attr('readonly', _isImperial ? null : 'readonly'); diff --git a/modules/ui/fields/roadspeed.js b/modules/ui/fields/roadspeed.js index 151468c35..2b0ecc59c 100644 --- a/modules/ui/fields/roadspeed.js +++ b/modules/ui/fields/roadspeed.js @@ -3,8 +3,9 @@ import { select as d3_select } from 'd3-selection'; import * as countryCoder from '@rapideditor/country-coder'; import { uiCombobox } from '../combobox'; -import { t } from '../../core/localizer'; +import { t, localizer } from '../../core/localizer'; import { utilGetSetValue, utilNoAuto, utilRebind, utilTotalExtent } from '../../util'; +import { likelyRawNumberFormat } from './input'; export function uiFieldRoadspeed(field, context) { @@ -14,6 +15,8 @@ export function uiFieldRoadspeed(field, context) { var _entityIDs = []; var _tags; var _isImperial; + var formatFloat = localizer.floatFormatter(localizer.languageCode()); + var parseLocaleFloat = localizer.floatParser(localizer.languageCode()); var speedCombo = uiCombobox(context, 'roadspeed'); var unitCombo = uiCombobox(context, 'roadspeed-unit') @@ -91,8 +94,8 @@ export function uiFieldRoadspeed(field, context) { function comboValues(d) { return { - value: d.toString(), - title: d.toString() + value: formatFloat(d), + title: formatFloat(d) }; } @@ -106,10 +109,16 @@ export function uiFieldRoadspeed(field, context) { if (!value) { tag[field.key] = undefined; - } else if (isNaN(value) || !_isImperial) { - tag[field.key] = context.cleanTagValue(value); } else { - tag[field.key] = context.cleanTagValue(value + ' mph'); + var rawValue = likelyRawNumberFormat.test(value) + ? parseFloat(value) + : parseLocaleFloat(value); + if (isNaN(rawValue)) rawValue = value; + if (isNaN(rawValue) || !_isImperial) { + tag[field.key] = context.cleanTagValue(rawValue); + } else { + tag[field.key] = context.cleanTagValue(rawValue + ' mph'); + } } dispatch.call('change', this, tag); @@ -119,16 +128,23 @@ export function uiFieldRoadspeed(field, context) { roadspeed.tags = function(tags) { _tags = tags; - var value = tags[field.key]; + var rawValue = tags[field.key]; + var value = rawValue; var isMixed = Array.isArray(value); if (!isMixed) { - if (value && value.indexOf('mph') >= 0) { - value = parseInt(value, 10).toString(); + if (rawValue && rawValue.indexOf('mph') >= 0) { _isImperial = true; - } else if (value) { + } else if (rawValue) { _isImperial = false; } + + value = parseInt(value, 10); + if (isNaN(value)) { + value = rawValue; + } else { + value = formatFloat(value); + } } setUnitSuggestions(); diff --git a/modules/ui/sections/preset_fields.js b/modules/ui/sections/preset_fields.js index c694c4b58..4b11edbc4 100644 --- a/modules/ui/sections/preset_fields.js +++ b/modules/ui/sections/preset_fields.js @@ -4,6 +4,7 @@ import { presetManager } from '../../presets'; import { t, localizer } from '../../core/localizer'; import { utilArrayIdentical } from '../../util/array'; import { utilArrayUnion, utilRebind } from '../../util'; +import { geoExtent } from '../../geo/extent'; import { uiField } from '../field'; import { uiFormFields } from '../form_fields'; import { uiSection } from '../section'; @@ -32,6 +33,11 @@ export function uiSectionPresetFields(context) { return geoms; }, {})); + const loc = _entityIDs.reduce(function(extent, entityID) { + var entity = context.graph().entity(entityID); + return extent.extend(entity.extent(context.graph())); + }, geoExtent()).center(); + var presetsManager = presetManager; var allFields = []; @@ -39,8 +45,8 @@ export function uiSectionPresetFields(context) { var sharedTotalFields; _presets.forEach(function(preset) { - var fields = preset.fields(); - var moreFields = preset.moreFields(); + var fields = preset.fields(loc); + var moreFields = preset.moreFields(loc); allFields = utilArrayUnion(allFields, fields); allMoreFields = utilArrayUnion(allMoreFields, moreFields); diff --git a/modules/ui/sections/raw_tag_editor.js b/modules/ui/sections/raw_tag_editor.js index 7d669ed62..9220b81a2 100644 --- a/modules/ui/sections/raw_tag_editor.js +++ b/modules/ui/sections/raw_tag_editor.js @@ -11,6 +11,7 @@ import { localizer, t } from '../../core/localizer'; import { utilArrayDifference, utilArrayIdentical } from '../../util/array'; import { utilGetSetValue, utilNoAuto, utilRebind, utilTagDiff } from '../../util'; import { uiTooltip } from '..'; +import { allowUpperCaseTagValues } from '../../osm/tags'; export function uiSectionRawTagEditor(id, context) { @@ -421,7 +422,9 @@ export function uiSectionRawTagEditor(id, context) { query: value }, function(err, data) { if (!err) { - var filtered = data.filter(function(d) { return _tags[d.value] === undefined; }); + const filtered = data + .filter(d => _tags[d.value] === undefined) + .filter(d => d.value.toLowerCase().includes(value.toLowerCase())); callback(sort(value, filtered)); } }); @@ -435,9 +438,13 @@ export function uiSectionRawTagEditor(id, context) { geometry: geometry, query: value }, function(err, data) { - if (!err) callback(sort(value, data)); + if (!err) { + const filtered = data.filter(d => d.value.toLowerCase().includes(value.toLowerCase())); + callback(sort(value, filtered)); + } }); - })); + }) + .caseSensitive(allowUpperCaseTagValues.test(utilGetSetValue(key)))); function sort(value, data) { diff --git a/modules/util/get_set_value.js b/modules/util/get_set_value.js index 486a3902e..597fa9b7c 100644 --- a/modules/util/get_set_value.js +++ b/modules/util/get_set_value.js @@ -1,14 +1,14 @@ // Like selection.property('value', ...), but avoids no-op value sets, // which can result in layout/repaint thrashing in some situations. /** @returns {string} */ -export function utilGetSetValue(selection, value) { - function d3_selection_value(value) { +export function utilGetSetValue(selection, value, shouldUpdate) { + function setValue(value, shouldUpdate) { function valueNull() { delete this.value; } function valueConstant() { - if (this.value !== value) { + if (shouldUpdate(this.value, value)) { this.value = value; } } @@ -17,7 +17,7 @@ export function utilGetSetValue(selection, value) { var x = value.apply(this, arguments); if (x === null || x === undefined) { delete this.value; - } else if (this.value !== x) { + } else if (shouldUpdate(this.value, x)) { this.value = x; } } @@ -27,9 +27,21 @@ export function utilGetSetValue(selection, value) { ? valueFunction : valueConstant); } + function stickyCursor(func) { + return function() { + const cursor = { start: this.selectionStart, end: this.selectionEnd }; + func.apply(this, arguments); + this.setSelectionRange(cursor.start, cursor.end); + }; + } + if (arguments.length === 1) { return selection.property('value'); } - return selection.each(d3_selection_value(value)); + if (shouldUpdate === undefined) { + shouldUpdate = (a, b) => a !== b; + } + + return selection.each(stickyCursor(setValue(value, shouldUpdate))); } diff --git a/modules/validations/crossing_ways.js b/modules/validations/crossing_ways.js index 2195ea8e4..e23939e89 100644 --- a/modules/validations/crossing_ways.js +++ b/modules/validations/crossing_ways.js @@ -1,3 +1,5 @@ +import { isEqual } from 'lodash'; + import { actionAddMidpoint } from '../actions/add_midpoint'; import { actionChangeTags } from '../actions/change_tags'; import { actionMergeNodes } from '../actions/merge_nodes'; @@ -123,9 +125,8 @@ export function validationCrossingWays(context) { motorway: true, motorway_link: true, trunk: true, trunk_link: true, primary: true, primary_link: true, secondary: true, secondary_link: true }; - var nonCrossingHighways = { track: true }; - function tagsForConnectionNodeIfAllowed(entity1, entity2, graph) { + function tagsForConnectionNodeIfAllowed(entity1, entity2, graph, lessLikelyTags) { var featureType1 = getFeatureType(entity1, graph); var featureType2 = getFeatureType(entity2, graph); @@ -141,11 +142,18 @@ export function validationCrossingWays(context) { // one feature is a path but not both var roadFeature = entity1IsPath ? entity2 : entity1; - if (nonCrossingHighways[roadFeature.tags.highway]) { - // don't mark path connections with certain roads as crossings + var pathFeature = entity1IsPath ? entity1 : entity2; + // don't mark path connections with tracks as crossings + if (roadFeature.tags.highway === 'track') { + return {}; + } + // a sidewalk crossing a driveway is unremarkable and unlikely to be interrupted by the driveway + // a sidewalk crossing another kind of service road may be similarly unremarkable + if (!lessLikelyTags && + roadFeature.tags.highway === 'service' && + pathFeature.tags.highway === 'footway' && pathFeature.tags.footway === 'sidewalk') { return {}; } - var pathFeature = entity1IsPath ? entity1 : entity2; if (['marked', 'unmarked', 'traffic_signals', 'uncontrolled'].indexOf(pathFeature.tags.crossing) !== -1) { // if the path is a crossing, match the crossing type return bothLines ? { highway: 'crossing', crossing: pathFeature.tags.crossing } : {}; @@ -435,6 +443,10 @@ export function validationCrossingWays(context) { if (connectionTags) { fixes.push(makeConnectWaysFix(this.data.connectionTags)); + let lessLikelyConnectionTags = tagsForConnectionNodeIfAllowed(entities[0], entities[1], graph, true); + if (lessLikelyConnectionTags && !isEqual(connectionTags, lessLikelyConnectionTags)) { + fixes.push(makeConnectWaysFix(lessLikelyConnectionTags)); + } } if (isCrossingIndoors) { @@ -692,16 +704,21 @@ export function validationCrossingWays(context) { function makeConnectWaysFix(connectionTags) { var fixTitleID = 'connect_features'; + var fixIcon = 'iD-icon-crossing'; + if (connectionTags.highway === 'crossing') { + fixTitleID = 'connect_using_crossing'; + fixIcon = 'temaki-pedestrian'; + } if (connectionTags.ford) { fixTitleID = 'connect_using_ford'; + fixIcon = 'roentgen-ford'; } - return new validationIssueFix({ - icon: 'iD-icon-crossing', + const fix = new validationIssueFix({ + icon: fixIcon, title: t.append('issues.fix.' + fixTitleID + '.title'), onClick: function(context) { var loc = this.issue.loc; - var connectionTags = this.issue.data.connectionTags; var edges = this.issue.data.edges; context.perform( @@ -737,6 +754,8 @@ export function validationCrossingWays(context) { ); } }); + fix._connectionTags = connectionTags; + return fix; } function makeChangeLayerFix(higherOrLower) { diff --git a/package-lock.json b/package-lock.json index 2e59d15bc..59587160e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,20 +14,20 @@ "@mapbox/vector-tile": "^1.3.1", "@rapideditor/country-coder": "~5.2.0", "@rapideditor/location-conflation": "~1.2.0", - "@tmcw/togeojson": "^5.2.1", + "@tmcw/togeojson": "^5.6.0", "@turf/bbox": "^6.0.0", "@turf/bbox-clip": "^6.0.0", "abortcontroller-polyfill": "^1.7.5", "aes-js": "^3.1.2", "alif-toolkit": "^1.2.9", - "core-js-bundle": "^3.30.1", + "core-js-bundle": "^3.30.2", "diacritics": "1.3.0", "fast-deep-equal": "~3.1.1", "fast-json-stable-stringify": "2.1.0", "lodash-es": "~4.17.15", - "marked": "~4.3.0", + "marked": "~5.0.2", "node-diff3": "~3.1.0", - "osm-auth": "~2.0.1", + "osm-auth": "~2.1.0", "pannellum": "2.5.6", "pbf": "^3.2.1", "polygon-clipping": "~0.15.1", @@ -41,41 +41,41 @@ "@fortawesome/free-regular-svg-icons": "~6.4.0", "@fortawesome/free-solid-svg-icons": "~6.4.0", "@mapbox/maki": "^8.0.1", - "@openstreetmap/id-tagging-schema": "^6.0.0", - "@rapideditor/temaki": "~5.3.0", + "@openstreetmap/id-tagging-schema": "^6.2.0", + "@rapideditor/temaki": "~5.4.0", "@transifex/api": "^5.2.0", "autoprefixer": "^10.4.14", - "chai": "^4.3.4", + "chai": "^4.3.7", "chalk": "^4.1.2", - "cldr-core": "^41.0.0", - "cldr-localenames-full": "^41.0.0", + "cldr-core": "^43.0.0", + "cldr-localenames-full": "^43.0.0", "concat-files": "^0.1.1", - "d3": "~7.8.1", + "d3": "~7.8.4", "dotenv": "^16.0.3", "editor-layer-index": "github:osmlab/editor-layer-index#gh-pages", - "esbuild": "^0.17.10", + "esbuild": "^0.17.19", "esbuild-visualizer": "^0.4.0", - "eslint": "^8.8.0", + "eslint": "^8.41.0", "fetch-mock": "^9.11.0", "gaze": "^1.1.3", "glob": "^9.2.1", "happen": "^0.3.2", "js-yaml": "^4.0.0", "json-stringify-pretty-compact": "^3.0.0", - "karma": "^6.3.5", - "karma-chrome-launcher": "^3.1.0", + "karma": "^6.4.2", + "karma-chrome-launcher": "^3.2.0", "karma-coverage": "2.1.1", "karma-mocha": "^2.0.1", "karma-remap-istanbul": "^0.6.0", "mapillary_sprite_source": "^1.8.0", "mapillary-js": "4.1.1", - "minimist": "^1.2.3", - "mocha": "^10.0.0", + "minimist": "^1.2.8", + "mocha": "^10.2.0", "name-suggestion-index": "~6.0", - "node-fetch": "^2.6.9", + "node-fetch": "^2.6.11", "npm-run-all": "^4.0.0", - "osm-community-index": "~5.5.0", - "postcss": "^8.4.21", + "osm-community-index": "~5.5.2", + "postcss": "^8.4.23", "postcss-selector-prepend": "^0.5.0", "shelljs": "^0.8.0", "shx": "^0.3.0", @@ -487,13 +487,126 @@ "kuler": "^2.0.0" } }, - "node_modules/@esbuild/linux-x64": { - "version": "0.17.10", + "node_modules/@esbuild/android-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", + "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", + "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", + "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", + "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", + "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", + "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", + "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", + "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", + "cpu": [ + "arm" + ], + "dev": true, "optional": true, "os": [ "linux" @@ -502,15 +615,264 @@ "node": ">=12" } }, - "node_modules/@eslint/eslintrc": { - "version": "1.3.2", + "node_modules/@esbuild/linux-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", + "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", + "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", + "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", + "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", + "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", + "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", + "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", + "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", + "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", + "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", + "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", + "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", + "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", + "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz", + "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.3.tgz", + "integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==", "dev": true, - "license": "MIT", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.4.0", - "globals": "^13.15.0", + "espree": "^9.5.2", + "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -524,6 +886,15 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/@eslint/js": { + "version": "8.41.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.41.0.tgz", + "integrity": "sha512-LxcyMGxwmTh2lY9FwHPGWOHmYFCZvbrFCBZL4FzSSsxsRPuhrYUg/49/0KDfW8tnIEaEHtfmn6+NPN+1DqaNmA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, "node_modules/@fortawesome/fontawesome-common-types": { "version": "6.4.0", "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.4.0.tgz", @@ -587,27 +958,19 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.10.5", + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", + "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", "dev": true, - "license": "Apache-2.0", "dependencies": { "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", - "minimatch": "^3.0.4" + "minimatch": "^3.0.5" }, "engines": { "node": ">=10.10.0" } }, - "node_modules/@humanwhocodes/gitignore-to-minimatch": { - "version": "1.0.2", - "dev": true, - "license": "Apache-2.0", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", "dev": true, @@ -622,8 +985,9 @@ }, "node_modules/@humanwhocodes/object-schema": { "version": "1.2.1", - "dev": true, - "license": "BSD-3-Clause" + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true }, "node_modules/@istanbuljs/schema": { "version": "0.1.3", @@ -711,8 +1075,9 @@ }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, - "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -723,16 +1088,18 @@ }, "node_modules/@nodelib/fs.stat": { "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, - "license": "MIT", "engines": { "node": ">= 8" } }, "node_modules/@nodelib/fs.walk": { "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, - "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -742,9 +1109,9 @@ } }, "node_modules/@openstreetmap/id-tagging-schema": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@openstreetmap/id-tagging-schema/-/id-tagging-schema-6.0.0.tgz", - "integrity": "sha512-/G7HoAQkNjqyDQy2Fb+Zg1fyWqFGGALhPEydk3yU3khnuqX0ORJC8Bsx8/U2ZIHZebba5VHoYFeouxyy3rOZRg==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@openstreetmap/id-tagging-schema/-/id-tagging-schema-6.2.0.tgz", + "integrity": "sha512-v9AX9c7KXqxNDIDpK7XLjvQsOWA8GHXghF7hBzXdOkpkh117PoRKwh9LwN284fbw/WKGh/jBun+6nsCOsp3vVQ==", "dev": true }, "node_modules/@rapideditor/country-coder": { @@ -775,9 +1142,9 @@ } }, "node_modules/@rapideditor/temaki": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@rapideditor/temaki/-/temaki-5.3.0.tgz", - "integrity": "sha512-1BH1MuLjwESgHPK05pgaxaw/2LRQh/hRKzXaVOUU4nJ+AcB+2ZWTft98zgagu4DJrBsde7ZaWzP3f/k+tyjGOw==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@rapideditor/temaki/-/temaki-5.4.0.tgz", + "integrity": "sha512-3VJ/abQsugyD6ossYFiVjo3l4/OPih3kKigabBN8zLbGdY6Fy2xySFKXlESFHiFf0KciV+0UpujYykMRijPx4Q==", "dev": true, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" @@ -872,8 +1239,9 @@ "license": "MIT" }, "node_modules/@tmcw/togeojson": { - "version": "5.2.2", - "license": "BSD-2-Clause", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@tmcw/togeojson/-/togeojson-5.6.0.tgz", + "integrity": "sha512-p+c0kbSY/tIwd3C0rpmTf3iFAOUYV6bkJbDiq0oQDGROOc7c6uh/X8r/mijY6SIFYIkVuKc8MS2REKhur2e6Jw==", "peerDependencies": { "@types/geojson": "*" } @@ -949,13 +1317,18 @@ }, "node_modules/@types/cookie": { "version": "0.4.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", + "dev": true }, "node_modules/@types/cors": { - "version": "2.8.12", + "version": "2.8.13", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz", + "integrity": "sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==", "dev": true, - "license": "MIT" + "dependencies": { + "@types/node": "*" + } }, "node_modules/@types/earcut": { "version": "2.1.1", @@ -1002,11 +1375,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@ungap/promise-all-settled": { - "version": "1.1.2", - "dev": true, - "license": "ISC" - }, "node_modules/@xmldom/xmldom": { "version": "0.8.6", "dev": true, @@ -1027,8 +1395,9 @@ }, "node_modules/accepts": { "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "dev": true, - "license": "MIT", "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" @@ -1038,9 +1407,10 @@ } }, "node_modules/acorn": { - "version": "8.8.0", + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", "dev": true, - "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -1050,8 +1420,9 @@ }, "node_modules/acorn-jsx": { "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, - "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } @@ -1091,8 +1462,9 @@ }, "node_modules/ajv": { "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, - "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -1198,14 +1570,6 @@ "node": ">=0.10.0" } }, - "node_modules/array-union": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/array-uniq": { "version": "1.0.3", "dev": true, @@ -1322,8 +1686,9 @@ }, "node_modules/base64id": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", "dev": true, - "license": "MIT", "engines": { "node": "^4.5.0 || >= 5.9" } @@ -1741,8 +2106,9 @@ }, "node_modules/callsites": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -1793,13 +2159,14 @@ ] }, "node_modules/chai": { - "version": "4.3.6", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", + "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", "dev": true, - "license": "MIT", "dependencies": { "assertion-error": "^1.1.0", "check-error": "^1.0.2", - "deep-eql": "^3.0.1", + "deep-eql": "^4.1.2", "get-func-name": "^2.0.0", "loupe": "^2.3.1", "pathval": "^1.1.1", @@ -1883,16 +2250,18 @@ "license": "ISC" }, "node_modules/cldr-core": { - "version": "41.0.0", - "dev": true, - "license": "Unicode-DFS-2016" + "version": "43.0.0", + "resolved": "https://registry.npmjs.org/cldr-core/-/cldr-core-43.0.0.tgz", + "integrity": "sha512-dPsV6/yTve1tvK2tyOEVkcugOX1MjIWWOlT/IYcHN33IesBykFR5pzUBpKnco7wZxwNGe3+d3tOVQcN+7i9/iA==", + "dev": true }, "node_modules/cldr-localenames-full": { - "version": "41.0.0", + "version": "43.0.0", + "resolved": "https://registry.npmjs.org/cldr-localenames-full/-/cldr-localenames-full-43.0.0.tgz", + "integrity": "sha512-sTO3eShh8mUhoGf7SQAw/LPR/SSWVrK2jnolhkVr3zKaeBgXyLjAeXTjKdPq9uYXmnV9E5RXDdvfyz6Huf3tYA==", "dev": true, - "license": "Unicode-DFS-2016", "peerDependencies": { - "cldr-core": "41.0.0" + "cldr-core": "43.0.0" } }, "node_modules/cliui": { @@ -2130,8 +2499,9 @@ }, "node_modules/cookie": { "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -2147,9 +2517,9 @@ } }, "node_modules/core-js-bundle": { - "version": "3.30.1", - "resolved": "https://registry.npmjs.org/core-js-bundle/-/core-js-bundle-3.30.1.tgz", - "integrity": "sha512-o7bb5+2lllehje8wj8MPNMvGh5fQ3dIWKlyYBflkDUYwYfiq8fKoxegiRJFxWRVme0edjHuXV0vVkS0APHAELg==", + "version": "3.30.2", + "resolved": "https://registry.npmjs.org/core-js-bundle/-/core-js-bundle-3.30.2.tgz", + "integrity": "sha512-CHPd8RYmUcVfUD+BKf30ocf2M+NmaoQudWSEmQrWguJ6CJzZ9rsidXXV8t56TGRhY7RZlQRKr1dWnYisOS04zA==", "hasInstallScript": true, "funding": { "type": "opencollective", @@ -2163,8 +2533,9 @@ }, "node_modules/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, - "license": "MIT", "dependencies": { "object-assign": "^4", "vary": "^1" @@ -2175,8 +2546,9 @@ }, "node_modules/cors/node_modules/object-assign": { "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -2330,9 +2702,10 @@ "license": "MIT" }, "node_modules/d3": { - "version": "7.8.2", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/d3/-/d3-7.8.4.tgz", + "integrity": "sha512-q2WHStdhiBtD8DMmhDPyJmXUxr6VWRngKyiJ5EfXMxPw+tqT6BhNjhJZ4w3BHsNm3QoVfZLY8Orq/qPFczwKRA==", "dev": true, - "license": "ISC", "dependencies": { "d3-array": "3", "d3-axis": "3", @@ -2752,14 +3125,15 @@ } }, "node_modules/deep-eql": { - "version": "3.0.1", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", + "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", "dev": true, - "license": "MIT", "dependencies": { "type-detect": "^4.0.0" }, "engines": { - "node": ">=0.12" + "node": ">=6" } }, "node_modules/deep-is": { @@ -2895,17 +3269,6 @@ "dev": true, "license": "MIT" }, - "node_modules/dir-glob": { - "version": "3.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/doctrine": { "version": "3.0.0", "dev": true, @@ -3068,9 +3431,9 @@ } }, "node_modules/engine.io": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.2.1.tgz", - "integrity": "sha512-ECceEFcAaNRybd3lsGQKas3ZlMVjN3cyWwMP25D2i0zWfyiytVbTpRPa34qrr+FHddtpBVOmq4H/DCv1O0lZRA==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.4.2.tgz", + "integrity": "sha512-FKn/3oMiJjrOEOeUub2WCox6JhxBXq/Zn3fZOMCBxKnNYtsdKjxhl7yR3fZhM9PV+rdE75SU5SYMc+2PGzo+Tg==", "dev": true, "dependencies": { "@types/cookie": "^0.4.1", @@ -3082,16 +3445,17 @@ "cors": "~2.8.5", "debug": "~4.3.1", "engine.io-parser": "~5.0.3", - "ws": "~8.2.3" + "ws": "~8.11.0" }, "engines": { "node": ">=10.0.0" } }, "node_modules/engine.io-parser": { - "version": "5.0.4", + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.6.tgz", + "integrity": "sha512-tjuoZDMAdEhVnSFleYPCtdL2GXwVTGtNjoeJd9IhIG3C1xs9uwxqRNEu5WpnDZCaozwVlK/nuQhpodhXSIMaxw==", "dev": true, - "license": "MIT", "engines": { "node": ">=10.0.0" } @@ -3180,10 +3544,11 @@ } }, "node_modules/esbuild": { - "version": "0.17.10", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", + "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", "dev": true, "hasInstallScript": true, - "license": "MIT", "bin": { "esbuild": "bin/esbuild" }, @@ -3191,28 +3556,28 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/android-arm": "0.17.10", - "@esbuild/android-arm64": "0.17.10", - "@esbuild/android-x64": "0.17.10", - "@esbuild/darwin-arm64": "0.17.10", - "@esbuild/darwin-x64": "0.17.10", - "@esbuild/freebsd-arm64": "0.17.10", - "@esbuild/freebsd-x64": "0.17.10", - "@esbuild/linux-arm": "0.17.10", - "@esbuild/linux-arm64": "0.17.10", - "@esbuild/linux-ia32": "0.17.10", - "@esbuild/linux-loong64": "0.17.10", - "@esbuild/linux-mips64el": "0.17.10", - "@esbuild/linux-ppc64": "0.17.10", - "@esbuild/linux-riscv64": "0.17.10", - "@esbuild/linux-s390x": "0.17.10", - "@esbuild/linux-x64": "0.17.10", - "@esbuild/netbsd-x64": "0.17.10", - "@esbuild/openbsd-x64": "0.17.10", - "@esbuild/sunos-x64": "0.17.10", - "@esbuild/win32-arm64": "0.17.10", - "@esbuild/win32-ia32": "0.17.10", - "@esbuild/win32-x64": "0.17.10" + "@esbuild/android-arm": "0.17.19", + "@esbuild/android-arm64": "0.17.19", + "@esbuild/android-x64": "0.17.19", + "@esbuild/darwin-arm64": "0.17.19", + "@esbuild/darwin-x64": "0.17.19", + "@esbuild/freebsd-arm64": "0.17.19", + "@esbuild/freebsd-x64": "0.17.19", + "@esbuild/linux-arm": "0.17.19", + "@esbuild/linux-arm64": "0.17.19", + "@esbuild/linux-ia32": "0.17.19", + "@esbuild/linux-loong64": "0.17.19", + "@esbuild/linux-mips64el": "0.17.19", + "@esbuild/linux-ppc64": "0.17.19", + "@esbuild/linux-riscv64": "0.17.19", + "@esbuild/linux-s390x": "0.17.19", + "@esbuild/linux-x64": "0.17.19", + "@esbuild/netbsd-x64": "0.17.19", + "@esbuild/openbsd-x64": "0.17.19", + "@esbuild/sunos-x64": "0.17.19", + "@esbuild/win32-arm64": "0.17.19", + "@esbuild/win32-ia32": "0.17.19", + "@esbuild/win32-x64": "0.17.19" } }, "node_modules/esbuild-visualizer": { @@ -3378,38 +3743,40 @@ } }, "node_modules/eslint": { - "version": "8.24.0", + "version": "8.41.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.41.0.tgz", + "integrity": "sha512-WQDQpzGBOP5IrXPo4Hc0814r4/v2rrIsB0rhT7jtunIalgg6gYXWhRMOejVO8yH21T/FGaxjmFjBMNqcIlmH1Q==", "dev": true, - "license": "MIT", "dependencies": { - "@eslint/eslintrc": "^1.3.2", - "@humanwhocodes/config-array": "^0.10.5", - "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.0.3", + "@eslint/js": "8.41.0", + "@humanwhocodes/config-array": "^0.11.8", "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.4.0", - "esquery": "^1.4.0", + "eslint-scope": "^7.2.0", + "eslint-visitor-keys": "^3.4.1", + "espree": "^9.5.2", + "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", - "glob-parent": "^6.0.1", - "globals": "^13.15.0", - "globby": "^11.1.0", - "grapheme-splitter": "^1.0.4", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", - "js-sdsl": "^4.1.4", + "is-path-inside": "^3.0.3", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", @@ -3417,7 +3784,6 @@ "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.1", - "regexpp": "^3.2.0", "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" @@ -3433,58 +3799,42 @@ } }, "node_modules/eslint-scope": { - "version": "7.1.1", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", + "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/eslint-utils": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" }, "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" - } - }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=10" + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-visitor-keys": { - "version": "3.3.0", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", "dev": true, - "license": "Apache-2.0", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/espree": { - "version": "9.4.0", + "version": "9.5.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.2.tgz", + "integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "acorn": "^8.8.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.1" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -3506,9 +3856,10 @@ } }, "node_modules/esquery": { - "version": "1.4.0", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "estraverse": "^5.1.0" }, @@ -3518,8 +3869,9 @@ }, "node_modules/esrecurse": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" }, @@ -3529,8 +3881,9 @@ }, "node_modules/estraverse": { "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, - "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -3623,32 +3976,6 @@ "version": "3.1.3", "license": "MIT" }, - "node_modules/fast-glob": { - "version": "3.2.12", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "license": "MIT" @@ -3664,9 +3991,10 @@ "license": "MIT" }, "node_modules/fastq": { - "version": "1.13.0", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", "dev": true, - "license": "ISC", "dependencies": { "reusify": "^1.0.4" } @@ -4061,9 +4389,10 @@ } }, "node_modules/globals": { - "version": "13.17.0", + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", "dev": true, - "license": "MIT", "dependencies": { "type-fest": "^0.20.2" }, @@ -4074,25 +4403,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/globby": { - "version": "11.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/globule": { "version": "1.3.4", "dev": true, @@ -4152,10 +4462,11 @@ "dev": true, "license": "ISC" }, - "node_modules/grapheme-splitter": { - "version": "1.0.4", - "dev": true, - "license": "MIT" + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true }, "node_modules/gulp-util": { "version": "3.0.7", @@ -4541,17 +4852,19 @@ "license": "BSD-3-Clause" }, "node_modules/ignore": { - "version": "5.2.0", + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", "dev": true, - "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/import-fresh": { "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, - "license": "MIT", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -4859,6 +5172,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/is-plain-obj": { "version": "2.1.0", "dev": true, @@ -5167,11 +5489,6 @@ "dev": true, "license": "BSD-3-Clause" }, - "node_modules/js-sdsl": { - "version": "4.1.4", - "dev": true, - "license": "MIT" - }, "node_modules/js-tokens": { "version": "4.0.0", "dev": true, @@ -5206,8 +5523,9 @@ }, "node_modules/json-schema-traverse": { "version": "0.4.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true }, "node_modules/json-stable-stringify": { "version": "0.0.1", @@ -5281,9 +5599,10 @@ "license": "MIT" }, "node_modules/karma": { - "version": "6.4.1", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/karma/-/karma-6.4.2.tgz", + "integrity": "sha512-C6SU/53LB31BEgRg+omznBEMY4SjHU3ricV6zBcAe1EeILKkeScr+fZXtaI5WyDbkVowJxxAI6h73NcFPmXolQ==", "dev": true, - "license": "MIT", "dependencies": { "@colors/colors": "1.5.0", "body-parser": "^1.19.0", @@ -5318,9 +5637,10 @@ } }, "node_modules/karma-chrome-launcher": { - "version": "3.1.1", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.2.0.tgz", + "integrity": "sha512-rE9RkUPI7I9mAxByQWkGJFXfFD6lE4gC5nPuZdobf/QdTEJI6EU4yIay/cfU/xV4ZxlM5JiTv7zWYgA64NpS5Q==", "dev": true, - "license": "MIT", "dependencies": { "which": "^1.2.1" } @@ -5738,14 +6058,14 @@ "license": "(MIT AND Zlib)" }, "node_modules/marked": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", - "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/marked/-/marked-5.0.2.tgz", + "integrity": "sha512-TXksm9GwqXCRNbFUZmMtqNLvy3K2cQHuWmyBDLOrY1e6i9UvZpOTJXoz7fBjYkJkaUFzV9hBFxMuZSyQt8R6KQ==", "bin": { "marked": "bin/marked.js" }, "engines": { - "node": ">= 12" + "node": ">= 18" } }, "node_modules/martinez-polygon-clipping": { @@ -5821,26 +6141,6 @@ "node": ">=0.10.0" } }, - "node_modules/merge2": { - "version": "1.4.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "dev": true, - "license": "MIT", - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, "node_modules/miller-rabin": { "version": "4.0.1", "dev": true, @@ -5917,9 +6217,13 @@ } }, "node_modules/minimist": { - "version": "1.2.6", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true, - "license": "MIT" + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/minipass": { "version": "4.2.4", @@ -5942,11 +6246,11 @@ } }, "node_modules/mocha": { - "version": "10.0.0", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", + "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", "dev": true, - "license": "MIT", "dependencies": { - "@ungap/promise-all-settled": "1.1.2", "ansi-colors": "4.1.1", "browser-stdout": "1.3.1", "chokidar": "3.5.3", @@ -6146,9 +6450,16 @@ } }, "node_modules/nanoid": { - "version": "3.3.4", + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", "dev": true, - "license": "MIT", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -6163,8 +6474,9 @@ }, "node_modules/negotiator": { "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -6217,9 +6529,9 @@ } }, "node_modules/node-fetch": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", - "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz", + "integrity": "sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==", "dev": true, "dependencies": { "whatwg-url": "^5.0.0" @@ -6624,20 +6936,21 @@ "license": "MIT" }, "node_modules/osm-auth": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/osm-auth/-/osm-auth-2.0.1.tgz", - "integrity": "sha512-Uw0hpw7IVlFMqd6hW9kTS1Qah9xh85hwn1xqLgCONGKRtHZ3ZaUzg/obm7WOwheJSmSmkwfiDnPN0imZyNOSbw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/osm-auth/-/osm-auth-2.1.0.tgz", + "integrity": "sha512-C1T6SCPovt7KagqNV4GXtRNlJ2SJ5SjJWRdtLGU72ntYoeXHGP2IgqeExu17cDeqLY1A3mIofmC6fUGkE7RdbA==", "dependencies": { "store": "~2.0.12" }, "engines": { - "node": ">=14" + "node": ">=16" } }, "node_modules/osm-community-index": { - "version": "5.5.0", + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/osm-community-index/-/osm-community-index-5.5.2.tgz", + "integrity": "sha512-76bW4m5jjrm9DnWDc2/lRfknUd1/iDw67HwFUA5Ll/XVPow2iYP4QNej9o6rIGg2iv8T1RUXzx6gLm16HiFu2Q==", "dev": true, - "license": "ISC", "dependencies": { "diacritics": "^1.3.0" }, @@ -6684,8 +6997,9 @@ }, "node_modules/parent-module": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, - "license": "MIT", "dependencies": { "callsites": "^3.0.0" }, @@ -6804,14 +7118,6 @@ "dev": true, "license": "MIT" }, - "node_modules/path-type": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/pathval": { "version": "1.1.1", "dev": true, @@ -6925,9 +7231,9 @@ "license": "ISC" }, "node_modules/postcss": { - "version": "8.4.21", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", - "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", + "version": "8.4.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.23.tgz", + "integrity": "sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA==", "dev": true, "funding": [ { @@ -6937,10 +7243,14 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "nanoid": "^3.3.4", + "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" }, @@ -7155,6 +7465,8 @@ }, "node_modules/queue-microtask": { "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true, "funding": [ { @@ -7169,8 +7481,7 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "MIT" + ] }, "node_modules/quickselect": { "version": "2.0.0", @@ -7460,17 +7771,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/regexpp": { - "version": "3.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, "node_modules/remap-istanbul": { "version": "0.9.6", "dev": true, @@ -7557,8 +7857,9 @@ }, "node_modules/resolve-from": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -7572,8 +7873,9 @@ }, "node_modules/reusify": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true, - "license": "MIT", "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -7633,6 +7935,8 @@ }, "node_modules/run-parallel": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "dev": true, "funding": [ { @@ -7648,7 +7952,6 @@ "url": "https://feross.org/support" } ], - "license": "MIT", "dependencies": { "queue-microtask": "^1.2.2" } @@ -7915,14 +8218,6 @@ "sinon": ">=4.0.0" } }, - "node_modules/slash": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/smash": { "version": "0.0.15", "dev": true, @@ -7938,30 +8233,36 @@ } }, "node_modules/socket.io": { - "version": "4.5.2", + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.6.1.tgz", + "integrity": "sha512-KMcaAi4l/8+xEjkRICl6ak8ySoxsYG+gG6/XfRCPJPQ/haCRIJBTL4wIl8YCsmtaBovcAXGLOShyVWQ/FG8GZA==", "dev": true, - "license": "MIT", "dependencies": { "accepts": "~1.3.4", "base64id": "~2.0.0", "debug": "~4.3.2", - "engine.io": "~6.2.0", - "socket.io-adapter": "~2.4.0", - "socket.io-parser": "~4.2.0" + "engine.io": "~6.4.1", + "socket.io-adapter": "~2.5.2", + "socket.io-parser": "~4.2.1" }, "engines": { "node": ">=10.0.0" } }, "node_modules/socket.io-adapter": { - "version": "2.4.0", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.2.tgz", + "integrity": "sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==", "dev": true, - "license": "MIT" + "dependencies": { + "ws": "~8.11.0" + } }, "node_modules/socket.io-parser": { - "version": "4.2.1", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.3.tgz", + "integrity": "sha512-JMafRntWVO2DCJimKsRTh/wnqVvO4hrfwOqtO7f+uzwsQMuxO6VwImtYxaQ+ieoyshWOTJyV0fA21lccEXRPpQ==", "dev": true, - "license": "MIT", "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.1" @@ -8904,8 +9205,9 @@ }, "node_modules/type-fest": { "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, - "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -9042,16 +9344,18 @@ }, "node_modules/uri-js": { "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" } }, "node_modules/uri-js/node_modules/punycode": { - "version": "2.1.1", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -9114,8 +9418,9 @@ }, "node_modules/vary": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.8" } @@ -9404,9 +9709,10 @@ "license": "ISC" }, "node_modules/ws": { - "version": "8.2.3", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", "dev": true, - "license": "MIT", "engines": { "node": ">=10.0.0" }, @@ -9814,19 +10120,185 @@ "kuler": "^2.0.0" } }, - "@esbuild/linux-x64": { - "version": "0.17.10", + "@esbuild/android-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", + "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", "dev": true, "optional": true }, + "@esbuild/android-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", + "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", + "dev": true, + "optional": true + }, + "@esbuild/android-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", + "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", + "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", + "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", + "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", + "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", + "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", + "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", + "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", + "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-mips64el": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", + "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ppc64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", + "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-riscv64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", + "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-s390x": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", + "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", + "dev": true, + "optional": true + }, + "@esbuild/linux-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", + "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", + "dev": true, + "optional": true + }, + "@esbuild/netbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", + "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", + "dev": true, + "optional": true + }, + "@esbuild/openbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", + "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", + "dev": true, + "optional": true + }, + "@esbuild/sunos-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", + "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", + "dev": true, + "optional": true + }, + "@esbuild/win32-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", + "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", + "dev": true, + "optional": true + }, + "@esbuild/win32-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", + "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", + "dev": true, + "optional": true + }, + "@esbuild/win32-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", + "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", + "dev": true, + "optional": true + }, + "@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^3.3.0" + } + }, + "@eslint-community/regexpp": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz", + "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==", + "dev": true + }, "@eslint/eslintrc": { - "version": "1.3.2", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.3.tgz", + "integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==", "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.4.0", - "globals": "^13.15.0", + "espree": "^9.5.2", + "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -9834,6 +10306,12 @@ "strip-json-comments": "^3.1.1" } }, + "@eslint/js": { + "version": "8.41.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.41.0.tgz", + "integrity": "sha512-LxcyMGxwmTh2lY9FwHPGWOHmYFCZvbrFCBZL4FzSSsxsRPuhrYUg/49/0KDfW8tnIEaEHtfmn6+NPN+1DqaNmA==", + "dev": true + }, "@fortawesome/fontawesome-common-types": { "version": "6.4.0", "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.4.0.tgz", @@ -9877,24 +10355,24 @@ } }, "@humanwhocodes/config-array": { - "version": "0.10.5", + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", + "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", "dev": true, "requires": { "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", - "minimatch": "^3.0.4" + "minimatch": "^3.0.5" } }, - "@humanwhocodes/gitignore-to-minimatch": { - "version": "1.0.2", - "dev": true - }, "@humanwhocodes/module-importer": { "version": "1.0.1", "dev": true }, "@humanwhocodes/object-schema": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, "@istanbuljs/schema": { @@ -9955,6 +10433,8 @@ }, "@nodelib/fs.scandir": { "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, "requires": { "@nodelib/fs.stat": "2.0.5", @@ -9963,10 +10443,14 @@ }, "@nodelib/fs.stat": { "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true }, "@nodelib/fs.walk": { "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, "requires": { "@nodelib/fs.scandir": "2.1.5", @@ -9974,9 +10458,9 @@ } }, "@openstreetmap/id-tagging-schema": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@openstreetmap/id-tagging-schema/-/id-tagging-schema-6.0.0.tgz", - "integrity": "sha512-/G7HoAQkNjqyDQy2Fb+Zg1fyWqFGGALhPEydk3yU3khnuqX0ORJC8Bsx8/U2ZIHZebba5VHoYFeouxyy3rOZRg==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@openstreetmap/id-tagging-schema/-/id-tagging-schema-6.2.0.tgz", + "integrity": "sha512-v9AX9c7KXqxNDIDpK7XLjvQsOWA8GHXghF7hBzXdOkpkh117PoRKwh9LwN284fbw/WKGh/jBun+6nsCOsp3vVQ==", "dev": true }, "@rapideditor/country-coder": { @@ -10001,9 +10485,9 @@ } }, "@rapideditor/temaki": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@rapideditor/temaki/-/temaki-5.3.0.tgz", - "integrity": "sha512-1BH1MuLjwESgHPK05pgaxaw/2LRQh/hRKzXaVOUU4nJ+AcB+2ZWTft98zgagu4DJrBsde7ZaWzP3f/k+tyjGOw==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@rapideditor/temaki/-/temaki-5.4.0.tgz", + "integrity": "sha512-3VJ/abQsugyD6ossYFiVjo3l4/OPih3kKigabBN8zLbGdY6Fy2xySFKXlESFHiFf0KciV+0UpujYykMRijPx4Q==", "dev": true }, "@resvg/resvg-js": { @@ -10066,7 +10550,9 @@ "dev": true }, "@tmcw/togeojson": { - "version": "5.2.2", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@tmcw/togeojson/-/togeojson-5.6.0.tgz", + "integrity": "sha512-p+c0kbSY/tIwd3C0rpmTf3iFAOUYV6bkJbDiq0oQDGROOc7c6uh/X8r/mijY6SIFYIkVuKc8MS2REKhur2e6Jw==", "requires": {} }, "@transifex/api": { @@ -10113,11 +10599,18 @@ }, "@types/cookie": { "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", "dev": true }, "@types/cors": { - "version": "2.8.12", - "dev": true + "version": "2.8.13", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz", + "integrity": "sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==", + "dev": true, + "requires": { + "@types/node": "*" + } }, "@types/earcut": { "version": "2.1.1", @@ -10155,10 +10648,6 @@ "version": "2.1.1", "dev": true }, - "@ungap/promise-all-settled": { - "version": "1.1.2", - "dev": true - }, "@xmldom/xmldom": { "version": "0.8.6", "dev": true @@ -10174,6 +10663,8 @@ }, "accepts": { "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "dev": true, "requires": { "mime-types": "~2.1.34", @@ -10181,11 +10672,15 @@ } }, "acorn": { - "version": "8.8.0", + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", "dev": true }, "acorn-jsx": { "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, "requires": {} }, @@ -10213,6 +10708,8 @@ }, "ajv": { "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -10274,10 +10771,6 @@ "version": "1.0.2", "dev": true }, - "array-union": { - "version": "2.1.0", - "dev": true - }, "array-uniq": { "version": "1.0.3", "dev": true @@ -10350,6 +10843,8 @@ }, "base64id": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", "dev": true }, "beeper": { @@ -10666,6 +11161,8 @@ }, "callsites": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true }, "camelcase": { @@ -10691,12 +11188,14 @@ "dev": true }, "chai": { - "version": "4.3.6", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", + "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", "dev": true, "requires": { "assertion-error": "^1.1.0", "check-error": "^1.0.2", - "deep-eql": "^3.0.1", + "deep-eql": "^4.1.2", "get-func-name": "^2.0.0", "loupe": "^2.3.1", "pathval": "^1.1.1", @@ -10750,11 +11249,15 @@ "version": "2.2.0" }, "cldr-core": { - "version": "41.0.0", + "version": "43.0.0", + "resolved": "https://registry.npmjs.org/cldr-core/-/cldr-core-43.0.0.tgz", + "integrity": "sha512-dPsV6/yTve1tvK2tyOEVkcugOX1MjIWWOlT/IYcHN33IesBykFR5pzUBpKnco7wZxwNGe3+d3tOVQcN+7i9/iA==", "dev": true }, "cldr-localenames-full": { - "version": "41.0.0", + "version": "43.0.0", + "resolved": "https://registry.npmjs.org/cldr-localenames-full/-/cldr-localenames-full-43.0.0.tgz", + "integrity": "sha512-sTO3eShh8mUhoGf7SQAw/LPR/SSWVrK2jnolhkVr3zKaeBgXyLjAeXTjKdPq9uYXmnV9E5RXDdvfyz6Huf3tYA==", "dev": true, "requires": {} }, @@ -10946,6 +11449,8 @@ }, "cookie": { "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", "dev": true }, "core-js": { @@ -10953,9 +11458,9 @@ "dev": true }, "core-js-bundle": { - "version": "3.30.1", - "resolved": "https://registry.npmjs.org/core-js-bundle/-/core-js-bundle-3.30.1.tgz", - "integrity": "sha512-o7bb5+2lllehje8wj8MPNMvGh5fQ3dIWKlyYBflkDUYwYfiq8fKoxegiRJFxWRVme0edjHuXV0vVkS0APHAELg==" + "version": "3.30.2", + "resolved": "https://registry.npmjs.org/core-js-bundle/-/core-js-bundle-3.30.2.tgz", + "integrity": "sha512-CHPd8RYmUcVfUD+BKf30ocf2M+NmaoQudWSEmQrWguJ6CJzZ9rsidXXV8t56TGRhY7RZlQRKr1dWnYisOS04zA==" }, "core-util-is": { "version": "1.0.3", @@ -10963,6 +11468,8 @@ }, "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", @@ -10971,6 +11478,8 @@ "dependencies": { "object-assign": { "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "dev": true } } @@ -11088,7 +11597,9 @@ "dev": true }, "d3": { - "version": "7.8.2", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/d3/-/d3-7.8.4.tgz", + "integrity": "sha512-q2WHStdhiBtD8DMmhDPyJmXUxr6VWRngKyiJ5EfXMxPw+tqT6BhNjhJZ4w3BHsNm3QoVfZLY8Orq/qPFczwKRA==", "dev": true, "requires": { "d3-array": "3", @@ -11347,7 +11858,9 @@ "dev": true }, "deep-eql": { - "version": "3.0.1", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", + "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", "dev": true, "requires": { "type-detect": "^4.0.0" @@ -11446,13 +11959,6 @@ } } }, - "dir-glob": { - "version": "3.0.1", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, "doctrine": { "version": "3.0.0", "dev": true, @@ -11569,9 +12075,9 @@ "dev": true }, "engine.io": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.2.1.tgz", - "integrity": "sha512-ECceEFcAaNRybd3lsGQKas3ZlMVjN3cyWwMP25D2i0zWfyiytVbTpRPa34qrr+FHddtpBVOmq4H/DCv1O0lZRA==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.4.2.tgz", + "integrity": "sha512-FKn/3oMiJjrOEOeUub2WCox6JhxBXq/Zn3fZOMCBxKnNYtsdKjxhl7yR3fZhM9PV+rdE75SU5SYMc+2PGzo+Tg==", "dev": true, "requires": { "@types/cookie": "^0.4.1", @@ -11583,11 +12089,13 @@ "cors": "~2.8.5", "debug": "~4.3.1", "engine.io-parser": "~5.0.3", - "ws": "~8.2.3" + "ws": "~8.11.0" } }, "engine.io-parser": { - "version": "5.0.4", + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.6.tgz", + "integrity": "sha512-tjuoZDMAdEhVnSFleYPCtdL2GXwVTGtNjoeJd9IhIG3C1xs9uwxqRNEu5WpnDZCaozwVlK/nuQhpodhXSIMaxw==", "dev": true }, "ent": { @@ -11654,31 +12162,33 @@ } }, "esbuild": { - "version": "0.17.10", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", + "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", "dev": true, "requires": { - "@esbuild/android-arm": "0.17.10", - "@esbuild/android-arm64": "0.17.10", - "@esbuild/android-x64": "0.17.10", - "@esbuild/darwin-arm64": "0.17.10", - "@esbuild/darwin-x64": "0.17.10", - "@esbuild/freebsd-arm64": "0.17.10", - "@esbuild/freebsd-x64": "0.17.10", - "@esbuild/linux-arm": "0.17.10", - "@esbuild/linux-arm64": "0.17.10", - "@esbuild/linux-ia32": "0.17.10", - "@esbuild/linux-loong64": "0.17.10", - "@esbuild/linux-mips64el": "0.17.10", - "@esbuild/linux-ppc64": "0.17.10", - "@esbuild/linux-riscv64": "0.17.10", - "@esbuild/linux-s390x": "0.17.10", - "@esbuild/linux-x64": "0.17.10", - "@esbuild/netbsd-x64": "0.17.10", - "@esbuild/openbsd-x64": "0.17.10", - "@esbuild/sunos-x64": "0.17.10", - "@esbuild/win32-arm64": "0.17.10", - "@esbuild/win32-ia32": "0.17.10", - "@esbuild/win32-x64": "0.17.10" + "@esbuild/android-arm": "0.17.19", + "@esbuild/android-arm64": "0.17.19", + "@esbuild/android-x64": "0.17.19", + "@esbuild/darwin-arm64": "0.17.19", + "@esbuild/darwin-x64": "0.17.19", + "@esbuild/freebsd-arm64": "0.17.19", + "@esbuild/freebsd-x64": "0.17.19", + "@esbuild/linux-arm": "0.17.19", + "@esbuild/linux-arm64": "0.17.19", + "@esbuild/linux-ia32": "0.17.19", + "@esbuild/linux-loong64": "0.17.19", + "@esbuild/linux-mips64el": "0.17.19", + "@esbuild/linux-ppc64": "0.17.19", + "@esbuild/linux-riscv64": "0.17.19", + "@esbuild/linux-s390x": "0.17.19", + "@esbuild/linux-x64": "0.17.19", + "@esbuild/netbsd-x64": "0.17.19", + "@esbuild/openbsd-x64": "0.17.19", + "@esbuild/sunos-x64": "0.17.19", + "@esbuild/win32-arm64": "0.17.19", + "@esbuild/win32-ia32": "0.17.19", + "@esbuild/win32-x64": "0.17.19" } }, "esbuild-visualizer": { @@ -11786,37 +12296,40 @@ } }, "eslint": { - "version": "8.24.0", + "version": "8.41.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.41.0.tgz", + "integrity": "sha512-WQDQpzGBOP5IrXPo4Hc0814r4/v2rrIsB0rhT7jtunIalgg6gYXWhRMOejVO8yH21T/FGaxjmFjBMNqcIlmH1Q==", "dev": true, "requires": { - "@eslint/eslintrc": "^1.3.2", - "@humanwhocodes/config-array": "^0.10.5", - "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.0.3", + "@eslint/js": "8.41.0", + "@humanwhocodes/config-array": "^0.11.8", "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.4.0", - "esquery": "^1.4.0", + "eslint-scope": "^7.2.0", + "eslint-visitor-keys": "^3.4.1", + "espree": "^9.5.2", + "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", - "glob-parent": "^6.0.1", - "globals": "^13.15.0", - "globby": "^11.1.0", - "grapheme-splitter": "^1.0.4", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", - "js-sdsl": "^4.1.4", + "is-path-inside": "^3.0.3", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", @@ -11824,44 +12337,36 @@ "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.1", - "regexpp": "^3.2.0", "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" } }, "eslint-scope": { - "version": "7.1.1", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", + "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", "dev": true, "requires": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, - "eslint-utils": { - "version": "3.0.0", - "dev": true, - "requires": { - "eslint-visitor-keys": "^2.0.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "2.1.0", - "dev": true - } - } - }, "eslint-visitor-keys": { - "version": "3.3.0", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", "dev": true }, "espree": { - "version": "9.4.0", + "version": "9.5.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.2.tgz", + "integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==", "dev": true, "requires": { "acorn": "^8.8.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.1" } }, "esprima": { @@ -11869,7 +12374,9 @@ "dev": true }, "esquery": { - "version": "1.4.0", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "dev": true, "requires": { "estraverse": "^5.1.0" @@ -11877,6 +12384,8 @@ }, "esrecurse": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, "requires": { "estraverse": "^5.2.0" @@ -11884,6 +12393,8 @@ }, "estraverse": { "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true }, "esutils": { @@ -11948,26 +12459,6 @@ "fast-deep-equal": { "version": "3.1.3" }, - "fast-glob": { - "version": "3.2.12", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "dependencies": { - "glob-parent": { - "version": "5.1.2", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - } - } - }, "fast-json-stable-stringify": { "version": "2.1.0" }, @@ -11980,7 +12471,9 @@ "dev": true }, "fastq": { - "version": "1.13.0", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", "dev": true, "requires": { "reusify": "^1.0.4" @@ -12231,24 +12724,14 @@ } }, "globals": { - "version": "13.17.0", + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", "dev": true, "requires": { "type-fest": "^0.20.2" } }, - "globby": { - "version": "11.1.0", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - } - }, "globule": { "version": "1.3.4", "dev": true, @@ -12290,8 +12773,10 @@ "version": "4.2.10", "dev": true }, - "grapheme-splitter": { - "version": "1.0.4", + "graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true }, "gulp-util": { @@ -12534,11 +13019,15 @@ "version": "1.2.1" }, "ignore": { - "version": "5.2.0", + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", "dev": true }, "import-fresh": { "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, "requires": { "parent-module": "^1.0.0", @@ -12724,6 +13213,12 @@ "version": "1.0.2", "dev": true }, + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true + }, "is-plain-obj": { "version": "2.1.0", "dev": true @@ -12919,10 +13414,6 @@ "version": "2.6.4", "dev": true }, - "js-sdsl": { - "version": "4.1.4", - "dev": true - }, "js-tokens": { "version": "4.0.0", "dev": true @@ -12944,6 +13435,8 @@ }, "json-schema-traverse": { "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, "json-stable-stringify": { @@ -12995,7 +13488,9 @@ "dev": true }, "karma": { - "version": "6.4.1", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/karma/-/karma-6.4.2.tgz", + "integrity": "sha512-C6SU/53LB31BEgRg+omznBEMY4SjHU3ricV6zBcAe1EeILKkeScr+fZXtaI5WyDbkVowJxxAI6h73NcFPmXolQ==", "dev": true, "requires": { "@colors/colors": "1.5.0", @@ -13039,7 +13534,9 @@ } }, "karma-chrome-launcher": { - "version": "3.1.1", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.2.0.tgz", + "integrity": "sha512-rE9RkUPI7I9mAxByQWkGJFXfFD6lE4gC5nPuZdobf/QdTEJI6EU4yIay/cfU/xV4ZxlM5JiTv7zWYgA64NpS5Q==", "dev": true, "requires": { "which": "^1.2.1" @@ -13349,9 +13846,9 @@ } }, "marked": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", - "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==" + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/marked/-/marked-5.0.2.tgz", + "integrity": "sha512-TXksm9GwqXCRNbFUZmMtqNLvy3K2cQHuWmyBDLOrY1e6i9UvZpOTJXoz7fBjYkJkaUFzV9hBFxMuZSyQt8R6KQ==" }, "martinez-polygon-clipping": { "version": "0.7.3", @@ -13411,18 +13908,6 @@ } } }, - "merge2": { - "version": "1.4.1", - "dev": true - }, - "micromatch": { - "version": "4.0.5", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, "miller-rabin": { "version": "4.0.1", "dev": true, @@ -13475,7 +13960,9 @@ } }, "minimist": { - "version": "1.2.6", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true }, "minipass": { @@ -13492,10 +13979,11 @@ } }, "mocha": { - "version": "10.0.0", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", + "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", "dev": true, "requires": { - "@ungap/promise-all-settled": "1.1.2", "ansi-colors": "4.1.1", "browser-stdout": "1.3.1", "chokidar": "3.5.3", @@ -13641,7 +14129,9 @@ } }, "nanoid": { - "version": "3.3.4", + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", "dev": true }, "natural-compare": { @@ -13650,6 +14140,8 @@ }, "negotiator": { "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "dev": true }, "neo-async": { @@ -13692,9 +14184,9 @@ "version": "3.1.2" }, "node-fetch": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", - "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz", + "integrity": "sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==", "dev": true, "requires": { "whatwg-url": "^5.0.0" @@ -13962,15 +14454,17 @@ "dev": true }, "osm-auth": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/osm-auth/-/osm-auth-2.0.1.tgz", - "integrity": "sha512-Uw0hpw7IVlFMqd6hW9kTS1Qah9xh85hwn1xqLgCONGKRtHZ3ZaUzg/obm7WOwheJSmSmkwfiDnPN0imZyNOSbw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/osm-auth/-/osm-auth-2.1.0.tgz", + "integrity": "sha512-C1T6SCPovt7KagqNV4GXtRNlJ2SJ5SjJWRdtLGU72ntYoeXHGP2IgqeExu17cDeqLY1A3mIofmC6fUGkE7RdbA==", "requires": { "store": "~2.0.12" } }, "osm-community-index": { - "version": "5.5.0", + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/osm-community-index/-/osm-community-index-5.5.2.tgz", + "integrity": "sha512-76bW4m5jjrm9DnWDc2/lRfknUd1/iDw67HwFUA5Ll/XVPow2iYP4QNej9o6rIGg2iv8T1RUXzx6gLm16HiFu2Q==", "dev": true, "requires": { "diacritics": "^1.3.0" @@ -13999,6 +14493,8 @@ }, "parent-module": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, "requires": { "callsites": "^3.0.0" @@ -14076,10 +14572,6 @@ "version": "2.4.0", "dev": true }, - "path-type": { - "version": "4.0.0", - "dev": true - }, "pathval": { "version": "1.1.1", "dev": true @@ -14154,12 +14646,12 @@ } }, "postcss": { - "version": "8.4.21", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", - "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", + "version": "8.4.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.23.tgz", + "integrity": "sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA==", "dev": true, "requires": { - "nanoid": "^3.3.4", + "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" } @@ -14304,6 +14796,8 @@ }, "queue-microtask": { "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true }, "quickselect": { @@ -14516,10 +15010,6 @@ "functions-have-names": "^1.2.2" } }, - "regexpp": { - "version": "3.2.0", - "dev": true - }, "remap-istanbul": { "version": "0.9.6", "dev": true, @@ -14587,6 +15077,8 @@ }, "resolve-from": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, "resolve-protobuf-schema": { @@ -14597,6 +15089,8 @@ }, "reusify": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true }, "rfdc": { @@ -14638,6 +15132,8 @@ }, "run-parallel": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "dev": true, "requires": { "queue-microtask": "^1.2.2" @@ -14821,10 +15317,6 @@ "dev": true, "requires": {} }, - "slash": { - "version": "3.0.0", - "dev": true - }, "smash": { "version": "0.0.15", "dev": true, @@ -14834,23 +15326,32 @@ } }, "socket.io": { - "version": "4.5.2", + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.6.1.tgz", + "integrity": "sha512-KMcaAi4l/8+xEjkRICl6ak8ySoxsYG+gG6/XfRCPJPQ/haCRIJBTL4wIl8YCsmtaBovcAXGLOShyVWQ/FG8GZA==", "dev": true, "requires": { "accepts": "~1.3.4", "base64id": "~2.0.0", "debug": "~4.3.2", - "engine.io": "~6.2.0", - "socket.io-adapter": "~2.4.0", - "socket.io-parser": "~4.2.0" + "engine.io": "~6.4.1", + "socket.io-adapter": "~2.5.2", + "socket.io-parser": "~4.2.1" } }, "socket.io-adapter": { - "version": "2.4.0", - "dev": true + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.2.tgz", + "integrity": "sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==", + "dev": true, + "requires": { + "ws": "~8.11.0" + } }, "socket.io-parser": { - "version": "4.2.1", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.3.tgz", + "integrity": "sha512-JMafRntWVO2DCJimKsRTh/wnqVvO4hrfwOqtO7f+uzwsQMuxO6VwImtYxaQ+ieoyshWOTJyV0fA21lccEXRPpQ==", "dev": true, "requires": { "@socket.io/component-emitter": "~3.1.0", @@ -15502,6 +16003,8 @@ }, "type-fest": { "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true }, "type-is": { @@ -15572,13 +16075,17 @@ }, "uri-js": { "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, "requires": { "punycode": "^2.1.0" }, "dependencies": { "punycode": { - "version": "2.1.1", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", "dev": true } } @@ -15632,6 +16139,8 @@ }, "vary": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "dev": true }, "vinyl": { @@ -15829,7 +16338,9 @@ "dev": true }, "ws": { - "version": "8.2.3", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", "dev": true, "requires": {} }, diff --git a/package.json b/package.json index c468a239c..1cb83b38e 100644 --- a/package.json +++ b/package.json @@ -49,20 +49,20 @@ "@mapbox/geojson-area": "^0.2.2", "@mapbox/sexagesimal": "1.2.0", "@mapbox/vector-tile": "^1.3.1", - "@tmcw/togeojson": "^5.2.1", + "@tmcw/togeojson": "^5.6.0", "@turf/bbox": "^6.0.0", "@turf/bbox-clip": "^6.0.0", "abortcontroller-polyfill": "^1.7.5", "aes-js": "^3.1.2", "alif-toolkit": "^1.2.9", - "core-js-bundle": "^3.30.1", + "core-js-bundle": "^3.30.2", "diacritics": "1.3.0", "fast-deep-equal": "~3.1.1", "fast-json-stable-stringify": "2.1.0", "lodash-es": "~4.17.15", - "marked": "~4.3.0", + "marked": "~5.0.2", "node-diff3": "~3.1.0", - "osm-auth": "~2.0.1", + "osm-auth": "~2.1.0", "pannellum": "2.5.6", "pbf": "^3.2.1", "polygon-clipping": "~0.15.1", @@ -75,42 +75,42 @@ "@fortawesome/free-brands-svg-icons": "~6.4.0", "@fortawesome/free-regular-svg-icons": "~6.4.0", "@fortawesome/free-solid-svg-icons": "~6.4.0", - "@rapideditor/temaki": "~5.3.0", + "@rapideditor/temaki": "~5.4.0", "@mapbox/maki": "^8.0.1", - "@openstreetmap/id-tagging-schema": "^6.0.0", + "@openstreetmap/id-tagging-schema": "^6.2.0", "@transifex/api": "^5.2.0", "autoprefixer": "^10.4.14", - "chai": "^4.3.4", + "chai": "^4.3.7", "chalk": "^4.1.2", - "cldr-core": "^41.0.0", - "cldr-localenames-full": "^41.0.0", + "cldr-core": "^43.0.0", + "cldr-localenames-full": "^43.0.0", "concat-files": "^0.1.1", - "d3": "~7.8.1", + "d3": "~7.8.4", "dotenv": "^16.0.3", "editor-layer-index": "github:osmlab/editor-layer-index#gh-pages", - "esbuild": "^0.17.10", + "esbuild": "^0.17.19", "esbuild-visualizer": "^0.4.0", - "eslint": "^8.8.0", + "eslint": "^8.41.0", "fetch-mock": "^9.11.0", "gaze": "^1.1.3", "glob": "^9.2.1", "happen": "^0.3.2", "js-yaml": "^4.0.0", "json-stringify-pretty-compact": "^3.0.0", - "karma": "^6.3.5", - "karma-chrome-launcher": "^3.1.0", + "karma": "^6.4.2", + "karma-chrome-launcher": "^3.2.0", "karma-coverage": "2.1.1", "karma-mocha": "^2.0.1", "karma-remap-istanbul": "^0.6.0", "mapillary_sprite_source": "^1.8.0", "mapillary-js": "4.1.1", - "minimist": "^1.2.3", - "mocha": "^10.0.0", + "minimist": "^1.2.8", + "mocha": "^10.2.0", "name-suggestion-index": "~6.0", - "node-fetch": "^2.6.9", + "node-fetch": "^2.6.11", "npm-run-all": "^4.0.0", - "osm-community-index": "~5.5.0", - "postcss": "^8.4.21", + "osm-community-index": "~5.5.2", + "postcss": "^8.4.23", "postcss-selector-prepend": "^0.5.0", "shelljs": "^0.8.0", "shx": "^0.3.0", diff --git a/scripts/language_names.js b/scripts/language_names.js index 680ff3731..8bce6e959 100644 --- a/scripts/language_names.js +++ b/scripts/language_names.js @@ -67,7 +67,7 @@ function getLangNamesInNativeLang() { let langDirectoryPaths = fs.readdirSync(cldrMainDir); langDirectoryPaths.forEach(code => { let languagesPath = `${cldrMainDir}${code}/languages.json`; - //if (!fs.existsSync(languagesPath)) return; + if (!fs.existsSync(languagesPath)) return; let languageObj = JSON.parse(fs.readFileSync(languagesPath, 'utf8')).main[code]; let identity = languageObj.identity; diff --git a/test/spec/core/localizer.js b/test/spec/core/localizer.js index cf30d5ab7..de157710a 100644 --- a/test/spec/core/localizer.js +++ b/test/spec/core/localizer.js @@ -6,4 +6,88 @@ describe('iD.coreLocalizer', function() { expect(selection.selectChild().classed('localized-text')).to.be.true; }); }); + describe('#floatFormatter', function () { + it('uses the specified number of fraction digits', function () { + var localizer = iD.coreLocalizer(); + var formatFloat = localizer.floatFormatter('en'); + expect(formatFloat(-0.1)).to.eql('-0.1'); + expect(formatFloat(-0.1, 0)).to.eql('-0'); + expect(formatFloat(-0.1, 2)).to.eql('-0.10'); + expect(formatFloat(0.0, 1)).to.eql('0.0'); + }); + it('roundtrips English numbers', function () { + var localizer = iD.coreLocalizer(); + var parseFloat = localizer.floatParser('en'); + var formatFloat = localizer.floatFormatter('en'); + expect(formatFloat(parseFloat('0.1'))).to.eql('0.1'); + expect(formatFloat(parseFloat('.1'))).to.eql('0.1'); + expect(formatFloat(parseFloat('-0.1'))).to.eql('-0.1'); + expect(formatFloat(parseFloat('1.234'))).to.eql('1.234'); + expect(formatFloat(parseFloat('1234'))).to.eql('1,234'); + expect(formatFloat(parseFloat('1234.56'))).to.eql('1,234.56'); + expect(formatFloat(parseFloat('3.14159'))).to.eql('3.14159'); + }); + }); + describe('#floatParser', function () { + it('roundtrips English numbers', function () { + var localizer = iD.coreLocalizer(); + var formatFloat = localizer.floatFormatter('en'); + var parseFloat = localizer.floatParser('en'); + expect(parseFloat(formatFloat(-0.1))).to.eql(-0.1); + expect(parseFloat(formatFloat(1.234))).to.eql(1.234); + expect(parseFloat(formatFloat(1234))).to.eql(1234); + expect(parseFloat(formatFloat(1234.56))).to.eql(1234.56); + expect(parseFloat(formatFloat(3.14159))).to.eql(3.14159); + }); + it('roundtrips Spanish numbers', function () { + var localizer = iD.coreLocalizer(); + var formatFloat = localizer.floatFormatter('es'); + var parseFloat = localizer.floatParser('es'); + expect(parseFloat(formatFloat(-0.1))).to.eql(-0.1); + expect(parseFloat(formatFloat(1.234))).to.eql(1.234); + expect(parseFloat(formatFloat(1234))).to.eql(1234); + expect(parseFloat(formatFloat(1234.56))).to.eql(1234.56); + expect(parseFloat(formatFloat(3.14159))).to.eql(3.14159); + }); + it('roundtrips Hebrew numbers', function () { + var localizer = iD.coreLocalizer(); + var formatFloat = localizer.floatFormatter('he'); + var parseFloat = localizer.floatParser('he'); + expect(parseFloat(formatFloat(-0.1))).to.eql(-0.1); + expect(parseFloat(formatFloat(1.234))).to.eql(1.234); + expect(parseFloat(formatFloat(1234))).to.eql(1234); + expect(parseFloat(formatFloat(1234.56))).to.eql(1234.56); + expect(parseFloat(formatFloat(3.14159))).to.eql(3.14159); + }); + it('roundtrips Arabic numbers', function () { + var localizer = iD.coreLocalizer(); + var formatFloat = localizer.floatFormatter('ar-EG'); + var parseFloat = localizer.floatParser('ar-EG'); + expect(parseFloat(formatFloat(-0.1))).to.eql(-0.1); + expect(parseFloat(formatFloat(1.234))).to.eql(1.234); + expect(parseFloat(formatFloat(1234))).to.eql(1234); + expect(parseFloat(formatFloat(1234.56))).to.eql(1234.56); + expect(parseFloat(formatFloat(3.14159))).to.eql(3.14159); + }); + it('roundtrips Bengali numbers', function () { + var localizer = iD.coreLocalizer(); + var formatFloat = localizer.floatFormatter('bn'); + var parseFloat = localizer.floatParser('bn'); + expect(parseFloat(formatFloat(-0.1))).to.eql(-0.1); + expect(parseFloat(formatFloat(1.234))).to.eql(1.234); + expect(parseFloat(formatFloat(1234))).to.eql(1234); + expect(parseFloat(formatFloat(1234.56))).to.eql(1234.56); + expect(parseFloat(formatFloat(3.14159))).to.eql(3.14159); + }); + }); + describe('#decimalPlaceCounter', function () { + it('counts decimal places in English numbers', function () { + var localizer = iD.coreLocalizer(); + var countDecimalPlaces = localizer.decimalPlaceCounter('en'); + expect(countDecimalPlaces('-0')).to.eql(0); + expect(countDecimalPlaces('-0.1')).to.eql(1); + expect(countDecimalPlaces('1.234')).to.eql(3); + expect(countDecimalPlaces('10')).to.eql(0); + }); + }); }); diff --git a/test/spec/presets/field.js b/test/spec/presets/field.js index f00236c36..6e3a957bd 100644 --- a/test/spec/presets/field.js +++ b/test/spec/presets/field.js @@ -53,6 +53,7 @@ describe('iD.presetField', function() { var context = iD.coreContext().assetPath('../dist/').init(); var uiField = iD.uiFieldCombo(field, context); + uiField(d3.select(document.createElement('div')).classed('form-field-input-wrap', true)); uiField.tags({k: 'v'}); expect(field.t.append).not.to.have.been.called; expect(other.t.append).to.have.been.called; diff --git a/test/spec/presets/index.js b/test/spec/presets/index.js index c656cf159..9c3c39efe 100644 --- a/test/spec/presets/index.js +++ b/test/spec/presets/index.js @@ -420,7 +420,7 @@ describe('iD.presetIndex', function () { var graph = iD.coreGraph([surfShop]); var url = 'https://fakemaprules.io/fake.json'; - // no exernal presets yet + // no external presets yet expect(iD.presetIndex().match(surfShop, graph).id).to.eql('point'); // reset graph... diff --git a/test/spec/validations/crossing_ways.js b/test/spec/validations/crossing_ways.js index 57ce0ff95..735b22b88 100644 --- a/test/spec/validations/crossing_ways.js +++ b/test/spec/validations/crossing_ways.js @@ -2,7 +2,12 @@ describe('iD.validations.crossing_ways', function () { var context; beforeEach(function() { - context = iD.coreContext().assetPath('../dist/').init(); + const container = d3.select('body').append('div'); + context = iD.coreContext().assetPath('../dist/').init().container(container); + container + .append('div') + .attr('class', 'main-map') + .call(context.map()); }); function createWaysWithOneCrossingPoint(tags1, tags2) { @@ -253,6 +258,17 @@ describe('iD.validations.crossing_ways', function () { verifySingleCrossingIssue(validate(), {}); }); + it('flags sidewalk crossing service road', function() { + createWaysWithOneCrossingPoint({ highway: 'service' }, { highway: 'footway', footway: 'sidewalk' }); + const issues = validate(); + verifySingleCrossingIssue(issues, {}); + context.enter(iD.modeSelect(context, ['w-1'])); + const dynamicFixes = issues[0].dynamicFixes(context); + expect(dynamicFixes).to.have.lengthOf(5); + expect(dynamicFixes[0]._connectionTags).to.eql({}); + expect(dynamicFixes[1]._connectionTags).to.eql({ highway: 'crossing' }); + }); + it('flags road crossing railway', function() { createWaysWithOneCrossingPoint({ highway: 'residential' }, { railway: 'rail' }); verifySingleCrossingIssue(validate(), { railway: 'level_crossing' });