Mapa-szkic z tylko ważnymi drogami i POI. Kąty, odległości itp. są tylko ilustratywne, niedokładne.
"
+ }
+ },
+ "question": "Jaki rodzaj mapy jest pokazany?"
+ }
+ },
+ "title": {
+ "render": "Mapa"
+ }
+ },
+ "maproulette": {
+ "description": "Warstwa pokazująca wszystkie zadania w MapRoulette",
+ "filter": {
+ "0": {
+ "options": {
+ "0": {
+ "question": "Pokaż zadania z wszystkimi statusami"
+ },
+ "1": {
+ "question": "Pokaż zadania, które zostały stworzone"
+ },
+ "6": {
+ "question": "Pokaż zadania, które są już wykonane"
+ },
+ "7": {
+ "question": "Pokaż zadania oznaczone jako zbyt trudne"
+ },
+ "8": {
+ "question": "Pokaż zadania, które są wyłączone"
+ }
+ }
+ },
+ "1": {
+ "options": {
+ "0": {
+ "question": "Nazwa wyzwania zawiera {search}"
+ }
+ }
+ },
+ "2": {
+ "options": {
+ "0": {
+ "question": "ID wyzwania pasuje do {search}"
+ }
+ }
+ }
+ },
+ "name": "Zadania MapRoulette",
+ "tagRenderings": {
+ "mark_duplicate": {
+ "render": {
+ "special": {
+ "message": "Oznacz jako nieznalezione lub fałszywie pozytywne"
+ }
+ }
+ },
+ "mark_fixed": {
+ "render": {
+ "special": {
+ "message": "Oznacz jako naprawione"
+ }
+ }
+ },
+ "mark_too_hard": {
+ "render": {
+ "special": {
+ "message": "Oznacz jako zbyt trudne"
+ }
+ }
+ },
+ "status": {
+ "mappings": {
+ "0": {
+ "then": "Zadanie jest stworzone"
+ },
+ "1": {
+ "then": "Zadanie jest naprawione"
+ },
+ "2": {
+ "then": "Zadanie jest fałszywie pozytywne"
+ },
+ "3": {
+ "then": "Zadanie jest pominięte"
+ },
+ "4": {
+ "then": "Zadania jest usunięte"
+ },
+ "5": {
+ "then": "Zadania jest już wykonane"
+ },
+ "6": {
+ "then": "Zadanie jest oznaczone jako zbyt trudne"
+ },
+ "7": {
+ "then": "Zadanie jest wyłączone"
+ }
+ }
+ }
+ },
+ "title": {
+ "render": "Obiekt MapRoulette: {parentName}"
+ }
+ },
+ "maproulette_challenge": {
+ "filter": {
+ "0": {
+ "options": {
+ "0": {
+ "question": "Pokaż zadania z wszystkimi statusami"
+ },
+ "1": {
+ "question": "Pokaż zadania, które zostały stworzone"
+ },
+ "2": {
+ "question": "Pokaż zadania, które są już wykonane"
+ }
+ }
+ }
+ }
+ },
+ "note": {
+ "title": {
+ "mappings": {
+ "0": {
+ "then": "Zamknięta notatka"
+ }
+ },
+ "render": "Notatka"
+ }
+ },
+ "observation_tower": {
+ "description": "Wieże z panoramicznym widokiem",
+ "name": "Wieże obserwacyjne",
+ "tagRenderings": {
+ "Fee": {
+ "mappings": {
+ "0": {
+ "then": "Darmowe wejście"
+ }
+ },
+ "question": "Ile kosztuje wstęp na tę wieżę?",
+ "render": "Wizyta na tej wieży kosztuje {charge}"
+ },
+ "Height": {
+ "question": "Jaka jest wysokość tej wieży?",
+ "render": "Ta wieża ma wysokość {height}"
+ },
+ "Operator": {
+ "question": "Kto obsługuje tę wieżę?",
+ "render": "Obsługiwana przez {operator}"
+ },
+ "access": {
+ "mappings": {
+ "0": {
+ "then": "Ta wieża jest publicznie dostępna"
+ },
+ "1": {
+ "then": "Ta wieża można być zwiedzana tylko z przewodnikiem"
+ }
+ }
+ },
+ "elevator": {
+ "mappings": {
+ "0": {
+ "then": "Ta wieża ma windę, która zabiera zwiedzających na górę"
+ },
+ "1": {
+ "then": "Ta wieża nie ma windy"
+ }
+ },
+ "question": "Czy ta wieża ma windę?"
+ },
+ "name": {
+ "mappings": {
+ "0": {
+ "then": "Ta wieża nie ma określonej nazwy"
+ }
+ },
+ "question": "Jaka jest nazwa tej wieży?",
+ "render": "Ta wieża nazywa się {name}"
+ },
+ "step_count": {
+ "question": "Ile pojedynczych stopni trzeba pokonać, aby dostać się na górę tej wieży?",
+ "render": "Ta wieża ma {step_count} stopni na górę"
+ }
+ },
+ "title": {
+ "mappings": {
+ "0": {
+ "then": "{name}"
+ }
+ },
+ "render": "Wieża obserwacyjna"
+ },
+ "units": {
+ "0": {
+ "applicableUnits": {
+ "0": {
+ "human": " metr"
+ }
+ }
+ }
+ }
+ },
+ "osm_community_index": {
+ "description": "Warstwa pokazująca społeczności OpenStreetMap",
+ "filter": {
+ "0": {
+ "options": {
+ "0": {
+ "question": "Kraj"
+ }
+ }
+ },
+ "2": {
+ "options": {
+ "0": {
+ "question": "Region"
+ }
+ }
+ },
+ "4": {
+ "options": {
+ "0": {
+ "question": "Terytorium"
+ }
+ }
+ },
+ "5": {
+ "options": {
+ "0": {
+ "question": "Świat"
+ }
+ }
+ },
+ "6": {
+ "options": {
+ "0": {
+ "question": "Inne społeczności"
+ }
+ }
+ }
+ },
+ "name": "Indeks społeczności OSM",
+ "title": {
+ "render": "Indeks społeczności OSM"
+ }
},
"parcel_lockers": {
- "description": "Warstwa pokazująca paczkomaty umożliwiające odbieranie i wysyłanie przesyłek.",
- "name": "Paczkomaty",
- "presets": {
- "0": {
- "title": "paczkomat"
- }
- },
- "tagRenderings": {
- "brand": {
- "freeform": {
- "placeholder": "Marka"
- },
- "mappings": {
- "0": {
- "then": "To jest paczkomat Amazonu"
- },
- "3": {
- "then": "To jest paczkomat PostNL"
- }
- },
- "question": "Jakiej marki jest ten paczkomat?",
- "render": "To jest paczkomat marki {brand}"
- },
- "mail-in": {
- "mappings": {
- "0": {
- "then": "Z tego paczkomatu można wysyłać przesyłki"
- },
- "1": {
- "then": "Z tego paczkomatu nie można wysyłać przesyłek"
- }
- },
- "question": "Czy z tego paczkomatu można wysyłać przesyłki?"
- },
- "operator": {
- "freeform": {
- "placeholder": "Operator"
- },
- "render": "Ten paczkomat jest obsługiwany przez {operator}"
- },
- "pickup": {
- "mappings": {
- "0": {
- "then": "Z tego paczkomatu można odbierać przesyłki"
- },
- "1": {
- "then": "Z tego paczkomatu nie można odbierać przesyłek"
- }
- },
- "question": "Czy z tego paczkomatu można odbierać przesyłki?"
- }
- },
- "title": {
- "mappings": {
- "0": {
- "then": "Paczkomat {brand}"
- }
- },
- "render": "Paczkomat"
+ "description": "Warstwa pokazująca paczkomaty umożliwiające odbieranie i wysyłanie przesyłek.",
+ "name": "Paczkomaty",
+ "presets": {
+ "0": {
+ "title": "paczkomat"
}
+ },
+ "tagRenderings": {
+ "brand": {
+ "freeform": {
+ "placeholder": "Marka"
+ },
+ "mappings": {
+ "0": {
+ "then": "To jest paczkomat Amazonu"
+ },
+ "3": {
+ "then": "To jest paczkomat PostNL"
+ }
+ },
+ "question": "Jakiej marki jest ten paczkomat?",
+ "render": "To jest paczkomat marki {brand}"
+ },
+ "mail-in": {
+ "mappings": {
+ "0": {
+ "then": "Z tego paczkomatu można wysyłać przesyłki"
+ },
+ "1": {
+ "then": "Z tego paczkomatu nie można wysyłać przesyłek"
+ }
+ },
+ "question": "Czy z tego paczkomatu można wysyłać przesyłki?"
+ },
+ "operator": {
+ "freeform": {
+ "placeholder": "Operator"
+ },
+ "render": "Ten paczkomat jest obsługiwany przez {operator}"
+ },
+ "pickup": {
+ "mappings": {
+ "0": {
+ "then": "Z tego paczkomatu można odbierać przesyłki"
+ },
+ "1": {
+ "then": "Z tego paczkomatu nie można odbierać przesyłek"
+ }
+ },
+ "question": "Czy z tego paczkomatu można odbierać przesyłki?"
+ }
+ },
+ "title": {
+ "mappings": {
+ "0": {
+ "then": "Paczkomat {brand}"
+ }
+ },
+ "render": "Paczkomat"
+ }
},
"parking": {
- "description": "Warstwa pokazująca parkingi samochodowe",
- "name": "Parking",
- "presets": {
- "0": {
- "title": "parking samochodowy"
- }
- },
- "tagRenderings": {
- "capacity": {
- "freeform": {
- "placeholder": "Liczba miejsc parkingowych"
- },
- "question": "Ile miejsc parkingowych jest na tym parkingu?",
- "render": "Jest {capacity} miejsc parkingowych"
- },
- "capacity-disabled": {
- "freeform": {
- "placeholder": "Liczba miejsc parkingowych przeznaczonych dla niepełnosprawnych"
- },
- "mappings": {
- "0": {
- "then": "Są tutaj miejsca parkingowe dla niepełnosprawnych, ale nie wiadomo ile"
- },
- "1": {
- "then": "Nie ma tutaj żadnych miejsc parkingowych dla niepełnosprawnych"
- },
- "2": {
- "then": "Nie ma tutaj żadnych miejsc parkingowych dla niepełnosprawnych"
- }
- },
- "question": "Jak wiele miejsc parkingowych dla niepełnosprawnych znajduje się na tym parkingu?",
- "render": "Jest {capacity:disabled} miejsc parkingowych dla niepełnosprawnych"
- },
- "parking-type": {
- "mappings": {
- "2": {
- "then": "To jest podziemny parking"
- },
- "3": {
- "then": "To jest wielopiętrowy parking"
- },
- "5": {
- "then": "To jest pas do parkowania na jezdni"
- }
- },
- "question": "Jaki to rodzaj parkingu?"
- }
- },
- "title": {
- "render": "Parking samochodowy"
+ "description": "Warstwa pokazująca parkingi samochodowe",
+ "name": "Parking",
+ "presets": {
+ "0": {
+ "title": "parking samochodowy"
}
+ },
+ "tagRenderings": {
+ "capacity": {
+ "freeform": {
+ "placeholder": "Liczba miejsc parkingowych"
+ },
+ "question": "Ile miejsc parkingowych jest na tym parkingu?",
+ "render": "Jest {capacity} miejsc parkingowych"
+ },
+ "capacity-disabled": {
+ "freeform": {
+ "placeholder": "Liczba miejsc parkingowych przeznaczonych dla niepełnosprawnych"
+ },
+ "mappings": {
+ "0": {
+ "then": "Są tutaj miejsca parkingowe dla niepełnosprawnych, ale nie wiadomo ile"
+ },
+ "1": {
+ "then": "Nie ma tutaj żadnych miejsc parkingowych dla niepełnosprawnych"
+ },
+ "2": {
+ "then": "Nie ma tutaj żadnych miejsc parkingowych dla niepełnosprawnych"
+ }
+ },
+ "question": "Jak wiele miejsc parkingowych dla niepełnosprawnych znajduje się na tym parkingu?",
+ "render": "Jest {capacity:disabled} miejsc parkingowych dla niepełnosprawnych"
+ },
+ "parking-type": {
+ "mappings": {
+ "2": {
+ "then": "To jest podziemny parking"
+ },
+ "3": {
+ "then": "To jest wielopiętrowy parking"
+ },
+ "5": {
+ "then": "To jest pas do parkowania na jezdni"
+ }
+ },
+ "question": "Jaki to rodzaj parkingu?"
+ }
+ },
+ "title": {
+ "render": "Parking samochodowy"
+ }
},
"parking_spaces": {
- "description": "Warstwa pokazująca pojedyncze miejsca parkingowe.",
- "name": "Miejsca parkingowe",
- "tagRenderings": {
- "type": {
- "mappings": {
- "0": {
- "then": "To jest zwykłe miejsce parkingowe."
- },
- "1": {
- "then": "To jest zwykłe miejsce parkingowe."
- },
- "2": {
- "then": "To jest miejsce parkingowe dla niepełnosprawnych."
- },
- "3": {
- "then": "To jest prywatne miejsce parkingowe."
- },
- "4": {
- "then": "To miejsce parkingowe jest zarezerwowane dla ładowania pojazdów."
- },
- "5": {
- "then": "To miejsce parkingowe jest przeznaczone dla dostaw."
- },
- "8": {
- "then": "To miejsce parkingowe jest przeznaczone dla busów."
- },
- "9": {
- "then": "To miejsce parkingowe jest przeznaczone dla motocykli."
- },
- "10": {
- "then": "To miejsce jest przeznaczone dla rodziców z dziećmi."
- },
- "11": {
- "then": "To jest miejsce parkingowe przeznaczone dla pracowników."
- },
- "12": {
- "then": "To miejsce parkingowe jest przeznaczone dla taksówek."
- }
- }
+ "description": "Warstwa pokazująca pojedyncze miejsca parkingowe.",
+ "name": "Miejsca parkingowe",
+ "tagRenderings": {
+ "type": {
+ "mappings": {
+ "0": {
+ "then": "To jest zwykłe miejsce parkingowe."
+ },
+ "1": {
+ "then": "To jest zwykłe miejsce parkingowe."
+ },
+ "2": {
+ "then": "To jest miejsce parkingowe dla niepełnosprawnych."
+ },
+ "3": {
+ "then": "To jest prywatne miejsce parkingowe."
+ },
+ "4": {
+ "then": "To miejsce parkingowe jest zarezerwowane dla ładowania pojazdów."
+ },
+ "5": {
+ "then": "To miejsce parkingowe jest przeznaczone dla dostaw."
+ },
+ "8": {
+ "then": "To miejsce parkingowe jest przeznaczone dla busów."
+ },
+ "9": {
+ "then": "To miejsce parkingowe jest przeznaczone dla motocykli."
+ },
+ "10": {
+ "then": "To miejsce jest przeznaczone dla rodziców z dziećmi."
+ },
+ "11": {
+ "then": "To jest miejsce parkingowe przeznaczone dla pracowników."
+ },
+ "12": {
+ "then": "To miejsce parkingowe jest przeznaczone dla taksówek."
}
+ }
}
+ }
},
"postoffices": {
- "tagRenderings": {
- "parcel-from": {
- "mappings": {
- "0": {
- "then": "Można tutaj wysłać paczki"
- },
- "1": {
- "then": "Nie można tutaj wysłać paczek"
- }
- },
- "question": "Czy można tutaj wysłać paczkę?"
+ "tagRenderings": {
+ "parcel-from": {
+ "mappings": {
+ "0": {
+ "then": "Można tutaj wysłać paczki"
+ },
+ "1": {
+ "then": "Nie można tutaj wysłać paczek"
}
+ },
+ "question": "Czy można tutaj wysłać paczkę?"
}
+ }
},
"public_bookcase": {
- "tagRenderings": {
- "public_bookcase-brand": {
- "mappings": {
- "0": {
- "then": "Część sieci \"Little Free Library\""
- }
- }
+ "tagRenderings": {
+ "public_bookcase-brand": {
+ "mappings": {
+ "0": {
+ "then": "Część sieci \"Little Free Library\""
}
+ }
}
+ }
},
"questions": {
- "tagRenderings": {
- "check_date": {
- "mappings": {
- "0": {
- "then": "Ten obiekt został ostatnio sprawdzony dzisiaj"
- }
- },
- "question": "Kiedy ten obiekt został ostatnio sprawdzony?",
- "render": "Ten obiekt był ostatnio sprawdzony {check_date}"
- },
- "denominations-coins": {
- "mappings": {
- "0": {
- "then": "Akceptowane są monety 1 centowe"
- },
- "1": {
- "then": "Akceptowane są monety 2 centowe"
- },
- "2": {
- "then": "Akceptowane są monety 5 centowe"
- },
- "3": {
- "then": "Akceptowane są monety 10-centowe"
- },
- "4": {
- "then": "Akceptowane są monety 20-centowe"
- },
- "5": {
- "then": "Akceptowane są monety 50-centowe"
- },
- "6": {
- "then": "Akceptowane są monety 1 euro"
- },
- "7": {
- "then": "Akceptowane są monety 2 euro"
- }
- },
- "question": "Jakimi monetami można tutaj zapłacić?"
- },
- "denominations-notes": {
- "mappings": {
- "0": {
- "then": "Banknoty 5 euro są akceptowane"
- },
- "1": {
- "then": "Banknoty 10 euro są akceptowane"
- },
- "2": {
- "then": "Banknoty 20 euro są akceptowane"
- },
- "3": {
- "then": "Banknoty 50 euro są akceptowane"
- },
- "4": {
- "then": "Banknoty 100 euro są akceptowane"
- },
- "5": {
- "then": "Banknoty 200 euro są akceptowane"
- },
- "6": {
- "then": "Banknoty 500 euro są akceptowane"
- }
- },
- "question": "Jakimi banknotami można tu zapłacić?"
- },
- "description": {
- "question": "Czy jest jeszcze coś istotnego, czego nie mogłeś podać w poprzednich pytaniach? Dodaj to tutaj.",
- "questionHint": "Nie powtarzaj już podanych faktów"
- },
- "dog-access": {
- "mappings": {
- "0": {
- "then": "Psy dozwolone"
- },
- "1": {
- "then": "Psy nie dozwolone"
- },
- "2": {
- "then": "Psy dozwolone, ale muszą być na smyczy"
- },
- "3": {
- "then": "Psy dozwolone i mogą biegać bez ograniczeń"
- }
- },
- "question": "Czy w tej firmie psy są dozwolone?"
- },
- "email": {
- "question": "Jaki jest adres e-mail do {title()}?"
- },
- "induction-loop": {
- "mappings": {
- "0": {
- "then": "To miejsce ma pętlę indukcyjną audio"
- },
- "1": {
- "then": "To miejsce nie ma pętli indukcyjnej dźwięku"
- }
- },
- "question": "Czy to miejsce ma pętlę indukcyjną dźwięku dla osób niedosłyszących?"
- },
- "internet": {
- "mappings": {
- "0": {
- "then": "To miejsce oferuje bezprzewodowy dostęp do Internetu"
- },
- "1": {
- "then": "To miejsce nie oferuje dostępu do Internetu"
- },
- "2": {
- "then": "To miejsce oferuje dostęp do Internetu"
- },
- "3": {
- "then": "To miejsce oferuje dostęp do Internetu za pośrednictwem terminala lub komputera"
- },
- "4": {
- "then": "To miejsce oferuje przewodowy dostęp do Internetu"
- }
- },
- "question": "Czy to miejsce oferuje dostęp do Internetu?"
- },
- "internet-fee": {
- "mappings": {
- "0": {
- "then": "W tym miejscu dostęp do Internetu jest płatny"
- },
- "1": {
- "then": "Dostęp do Internetu jest w tym miejscu bezpłatny"
- },
- "2": {
- "then": "Dostęp do Internetu jest w tym miejscu bezpłatny, tylko dla klientów"
- }
- },
- "question": "Czy dostęp do Internetu jest płatny?"
- },
- "internet-ssid": {
- "freeform": {
- "placeholder": "Wprowadź nazwę sieci"
- },
- "question": "Jaka jest nazwa sieci dla bezprzewodowego dostępu do Internetu?",
- "render": "Nazwa sieci to {internet_access:ssid}"
- },
- "level": {
- "mappings": {
- "0": {
- "then": "Znajduje się pod ziemią"
- },
- "1": {
- "then": "Znajduje się na parterze"
- },
- "2": {
- "then": "Znajduje się na parterze"
- },
- "3": {
- "then": "Znajduje się na pierwszym piętrze"
- },
- "4": {
- "then": "Położone na pierwszym poziomie piwnicy"
- }
- },
- "question": "Na jakim poziomie znajduje się ta funkcja?",
- "render": "Znajduje się na {level} piętrze"
- },
- "luminous_or_lit": {
- "mappings": {
- "0": {
- "then": "Ten obiekt zarówno emituje światło, jak i jest oświetlany przez zewnętrzne źródło światła"
- },
- "1": {
- "then": "Ten obiekt emituje światło"
- },
- "2": {
- "then": "Ten obiekt jest oświetlony zewnętrznie, np. przez reflektor lub inne światła"
- },
- "3": {
- "then": "Obiekt ten nie emituje światła i nie jest oświetlany z zewnątrz"
- }
- },
- "question": "Czy ten obiekt jest oświetlony lub emituje światło?"
- },
- "multilevels": {
- "override": {
- "question": "Na jakie poziomy jedzie ta winda?",
- "render": "Ta winda jedzie na piętra {level}"
- }
- },
- "opening_hours": {
- "question": "Jakie są godziny otwarcia {title()}?",
- "render": "
Godziny otwarcia
{opening_hours_table(opening_hours)}"
- },
- "opening_hours_24_7": {
- "override": {
- "mappings": {
- "0": {
- "then": "Otwarte 24/7 (również w święta)"
- }
- }
- }
- },
- "opening_hours_by_appointment": {
- "override": {
- "mappings": {
- "0": {
- "then": "Tylko po wcześniejszym umówieniu się"
- },
- "1": {
- "then": "Tylko po wcześniejszym umówieniu się"
- }
- }
- }
- },
- "payment-options": {
- "mappings": {
- "0": {
- "then": "Płatność gotówkowa jest tutaj dostępna"
- },
- "1": {
- "then": "Płatność kartą jest tutaj dostępna"
- }
- },
- "question": "Jakie metody płatności są tutaj dostępne?"
- },
- "payment-options-advanced": {
- "override": {
- "mappings+": {
- "0": {
- "then": "Płatność odbywa się za pomocą dedykowanej aplikacji"
- },
- "1": {
- "then": "Płatność odbywa się za pomocą karty członkowskiej"
- }
- }
- }
- },
- "payment-options-split": {
- "override": {
- "mappings+": {
- "0": {
- "then": "Monety są tutaj akceptowane"
- },
- "1": {
- "then": "Banknoty są tutaj akceptowane"
- },
- "2": {
- "then": "Akceptowane są tutaj karty debetowe"
- },
- "3": {
- "then": "Akceptowane są tutaj karty kredytowe"
- }
- }
- }
- },
- "phone": {
- "question": "Jaki jest numer telefonu do {title()}?"
- },
- "service:electricity": {
- "mappings": {
- "0": {
- "then": "W budynku znajduje się wiele gniazdek elektrycznych, gdzie klienci mogą naładować swoje urządzenia"
- },
- "1": {
- "then": "W budynku znajduje się kilka gniazdek elektrycznych, gdzie klienci mogą naładować swoje urządzenia"
- },
- "2": {
- "then": "W budynku nie ma gniazdek elektrycznych dostępnych dla klientów, ale mogą zostać one udostępnione po spytaniu obsługi"
- },
- "3": {
- "then": "W budynku nie ma gniazdek elektrycznych dostępnych dla klientów"
- }
- },
- "question": "Czy w tym przybytku znajdują się gniazdka elektryczne, gdzie klienci mogą naładować swoje urządzenia?"
- },
- "smoking": {
- "mappings": {
- "0": {
- "then": "Palenie jest dozwolone"
- },
- "1": {
- "then": "Palenie jest zakazane"
- },
- "2": {
- "then": "Palenie jest dozwolone na zewnątrz."
- }
- },
- "question": "Czy w {title()} wolno palić?"
- },
- "website": {
- "question": "Jaka jest strona internetowa {title()}?"
- },
- "wheelchair-access": {
- "mappings": {
- "0": {
- "then": "W tym miejscu zainstalowane zostały udogodnienia dla osób na wózkach inwalidzkich"
- },
- "1": {
- "then": "To miejsce jest łatwo dostępne dla osób na wózkach inwalidzkich"
- },
- "2": {
- "then": "To miejsce jest dostępne dla osób na wózkach inwalidzkich, ale z pewnymi trudnościami"
- },
- "3": {
- "then": "To miejsce jest niedostępne dla osób na wózkach inwalidzkich"
- }
- },
- "question": "Czy to miejsce jest dostępne dla osób na wózkach inwalidzkich?"
- },
- "wikipedia": {
- "mappings": {
- "0": {
- "then": "Link do strony Wikipedii nie został jeszcze określony"
- },
- "1": {
- "then": "Link do strony Wikipedii nie został jeszcze określony"
- }
- },
- "question": "Jaki jest powiązany obiekt Wikidata?"
+ "tagRenderings": {
+ "check_date": {
+ "mappings": {
+ "0": {
+ "then": "Ten obiekt został ostatnio sprawdzony dzisiaj"
}
+ },
+ "question": "Kiedy ten obiekt został ostatnio sprawdzony?",
+ "render": "Ten obiekt był ostatnio sprawdzony {check_date}"
+ },
+ "denominations-coins": {
+ "mappings": {
+ "0": {
+ "then": "Akceptowane są monety 1 centowe"
+ },
+ "1": {
+ "then": "Akceptowane są monety 2 centowe"
+ },
+ "2": {
+ "then": "Akceptowane są monety 5 centowe"
+ },
+ "3": {
+ "then": "Akceptowane są monety 10-centowe"
+ },
+ "4": {
+ "then": "Akceptowane są monety 20-centowe"
+ },
+ "5": {
+ "then": "Akceptowane są monety 50-centowe"
+ },
+ "6": {
+ "then": "Akceptowane są monety 1 euro"
+ },
+ "7": {
+ "then": "Akceptowane są monety 2 euro"
+ }
+ },
+ "question": "Jakimi monetami można tutaj zapłacić?"
+ },
+ "denominations-notes": {
+ "mappings": {
+ "0": {
+ "then": "Banknoty 5 euro są akceptowane"
+ },
+ "1": {
+ "then": "Banknoty 10 euro są akceptowane"
+ },
+ "2": {
+ "then": "Banknoty 20 euro są akceptowane"
+ },
+ "3": {
+ "then": "Banknoty 50 euro są akceptowane"
+ },
+ "4": {
+ "then": "Banknoty 100 euro są akceptowane"
+ },
+ "5": {
+ "then": "Banknoty 200 euro są akceptowane"
+ },
+ "6": {
+ "then": "Banknoty 500 euro są akceptowane"
+ }
+ },
+ "question": "Jakimi banknotami można tu zapłacić?"
+ },
+ "description": {
+ "question": "Czy jest jeszcze coś istotnego, czego nie mogłeś podać w poprzednich pytaniach? Dodaj to tutaj.",
+ "questionHint": "Nie powtarzaj już podanych faktów"
+ },
+ "dog-access": {
+ "mappings": {
+ "0": {
+ "then": "Psy dozwolone"
+ },
+ "1": {
+ "then": "Psy nie dozwolone"
+ },
+ "2": {
+ "then": "Psy dozwolone, ale muszą być na smyczy"
+ },
+ "3": {
+ "then": "Psy dozwolone i mogą biegać bez ograniczeń"
+ }
+ },
+ "question": "Czy w tej firmie psy są dozwolone?"
+ },
+ "email": {
+ "question": "Jaki jest adres e-mail do {title()}?"
+ },
+ "induction-loop": {
+ "mappings": {
+ "0": {
+ "then": "To miejsce ma pętlę indukcyjną audio"
+ },
+ "1": {
+ "then": "To miejsce nie ma pętli indukcyjnej dźwięku"
+ }
+ },
+ "question": "Czy to miejsce ma pętlę indukcyjną dźwięku dla osób niedosłyszących?"
+ },
+ "internet": {
+ "mappings": {
+ "0": {
+ "then": "To miejsce oferuje bezprzewodowy dostęp do Internetu"
+ },
+ "1": {
+ "then": "To miejsce nie oferuje dostępu do Internetu"
+ },
+ "2": {
+ "then": "To miejsce oferuje dostęp do Internetu"
+ },
+ "3": {
+ "then": "To miejsce oferuje dostęp do Internetu za pośrednictwem terminala lub komputera"
+ },
+ "4": {
+ "then": "To miejsce oferuje przewodowy dostęp do Internetu"
+ }
+ },
+ "question": "Czy to miejsce oferuje dostęp do Internetu?"
+ },
+ "internet-fee": {
+ "mappings": {
+ "0": {
+ "then": "W tym miejscu dostęp do Internetu jest płatny"
+ },
+ "1": {
+ "then": "Dostęp do Internetu jest w tym miejscu bezpłatny"
+ },
+ "2": {
+ "then": "Dostęp do Internetu jest w tym miejscu bezpłatny, tylko dla klientów"
+ }
+ },
+ "question": "Czy dostęp do Internetu jest płatny?"
+ },
+ "internet-ssid": {
+ "freeform": {
+ "placeholder": "Wprowadź nazwę sieci"
+ },
+ "question": "Jaka jest nazwa sieci dla bezprzewodowego dostępu do Internetu?",
+ "render": "Nazwa sieci to {internet_access:ssid}"
+ },
+ "level": {
+ "mappings": {
+ "0": {
+ "then": "Znajduje się pod ziemią"
+ },
+ "1": {
+ "then": "Znajduje się na parterze"
+ },
+ "2": {
+ "then": "Znajduje się na parterze"
+ },
+ "3": {
+ "then": "Znajduje się na pierwszym piętrze"
+ },
+ "4": {
+ "then": "Położone na pierwszym poziomie piwnicy"
+ }
+ },
+ "question": "Na jakim poziomie znajduje się ta funkcja?",
+ "render": "Znajduje się na {level} piętrze"
+ },
+ "luminous_or_lit": {
+ "mappings": {
+ "0": {
+ "then": "Ten obiekt zarówno emituje światło, jak i jest oświetlany przez zewnętrzne źródło światła"
+ },
+ "1": {
+ "then": "Ten obiekt emituje światło"
+ },
+ "2": {
+ "then": "Ten obiekt jest oświetlony zewnętrznie, np. przez reflektor lub inne światła"
+ },
+ "3": {
+ "then": "Obiekt ten nie emituje światła i nie jest oświetlany z zewnątrz"
+ }
+ },
+ "question": "Czy ten obiekt jest oświetlony lub emituje światło?"
+ },
+ "multilevels": {
+ "override": {
+ "question": "Na jakie poziomy jedzie ta winda?",
+ "render": "Ta winda jedzie na piętra {level}"
+ }
+ },
+ "opening_hours": {
+ "question": "Jakie są godziny otwarcia {title()}?",
+ "render": "
Godziny otwarcia
{opening_hours_table(opening_hours)}"
+ },
+ "opening_hours_24_7": {
+ "override": {
+ "mappings": {
+ "0": {
+ "then": "Otwarte 24/7 (również w święta)"
+ }
+ }
+ }
+ },
+ "opening_hours_by_appointment": {
+ "override": {
+ "mappings": {
+ "0": {
+ "then": "Tylko po wcześniejszym umówieniu się"
+ },
+ "1": {
+ "then": "Tylko po wcześniejszym umówieniu się"
+ }
+ }
+ }
+ },
+ "payment-options": {
+ "mappings": {
+ "0": {
+ "then": "Płatność gotówkowa jest tutaj dostępna"
+ },
+ "1": {
+ "then": "Płatność kartą jest tutaj dostępna"
+ }
+ },
+ "question": "Jakie metody płatności są tutaj dostępne?"
+ },
+ "payment-options-advanced": {
+ "override": {
+ "mappings+": {
+ "0": {
+ "then": "Płatność odbywa się za pomocą dedykowanej aplikacji"
+ },
+ "1": {
+ "then": "Płatność odbywa się za pomocą karty członkowskiej"
+ }
+ }
+ }
+ },
+ "payment-options-split": {
+ "override": {
+ "mappings+": {
+ "0": {
+ "then": "Monety są tutaj akceptowane"
+ },
+ "1": {
+ "then": "Banknoty są tutaj akceptowane"
+ },
+ "2": {
+ "then": "Akceptowane są tutaj karty debetowe"
+ },
+ "3": {
+ "then": "Akceptowane są tutaj karty kredytowe"
+ }
+ }
+ }
+ },
+ "phone": {
+ "question": "Jaki jest numer telefonu do {title()}?"
+ },
+ "service:electricity": {
+ "mappings": {
+ "0": {
+ "then": "W budynku znajduje się wiele gniazdek elektrycznych, gdzie klienci mogą naładować swoje urządzenia"
+ },
+ "1": {
+ "then": "W budynku znajduje się kilka gniazdek elektrycznych, gdzie klienci mogą naładować swoje urządzenia"
+ },
+ "2": {
+ "then": "W budynku nie ma gniazdek elektrycznych dostępnych dla klientów, ale mogą zostać one udostępnione po spytaniu obsługi"
+ },
+ "3": {
+ "then": "W budynku nie ma gniazdek elektrycznych dostępnych dla klientów"
+ }
+ },
+ "question": "Czy w tym przybytku znajdują się gniazdka elektryczne, gdzie klienci mogą naładować swoje urządzenia?"
+ },
+ "smoking": {
+ "mappings": {
+ "0": {
+ "then": "Palenie jest dozwolone"
+ },
+ "1": {
+ "then": "Palenie jest zakazane"
+ },
+ "2": {
+ "then": "Palenie jest dozwolone na zewnątrz."
+ }
+ },
+ "question": "Czy w {title()} wolno palić?"
+ },
+ "website": {
+ "question": "Jaka jest strona internetowa {title()}?"
+ },
+ "wheelchair-access": {
+ "mappings": {
+ "0": {
+ "then": "W tym miejscu zainstalowane zostały udogodnienia dla osób na wózkach inwalidzkich"
+ },
+ "1": {
+ "then": "To miejsce jest łatwo dostępne dla osób na wózkach inwalidzkich"
+ },
+ "2": {
+ "then": "To miejsce jest dostępne dla osób na wózkach inwalidzkich, ale z pewnymi trudnościami"
+ },
+ "3": {
+ "then": "To miejsce jest niedostępne dla osób na wózkach inwalidzkich"
+ }
+ },
+ "question": "Czy to miejsce jest dostępne dla osób na wózkach inwalidzkich?"
+ },
+ "wikipedia": {
+ "mappings": {
+ "0": {
+ "then": "Link do strony Wikipedii nie został jeszcze określony"
+ },
+ "1": {
+ "then": "Link do strony Wikipedii nie został jeszcze określony"
+ }
+ },
+ "question": "Jaki jest powiązany obiekt Wikidata?"
}
+ }
},
"reception_desk": {
- "tagRenderings": {
- "desk-height": {
- "question": "Jaka jest wysokość tego biurka recepcji? ",
- "questionHint": "Jest to mierzone od podłogi do najniższej użytecznej części biurka",
- "render": "Wysokość tego biurka to {canonical(desk:height)}"
- }
- },
- "units": {
- "0": {
- "applicableUnits": {
- "0": {
- "human": "metr"
- },
- "1": {
- "human": "centymetr"
- }
- }
- }
+ "tagRenderings": {
+ "desk-height": {
+ "question": "Jaka jest wysokość tego biurka recepcji? ",
+ "questionHint": "Jest to mierzone od podłogi do najniższej użytecznej części biurka",
+ "render": "Wysokość tego biurka to {canonical(desk:height)}"
}
+ },
+ "units": {
+ "0": {
+ "applicableUnits": {
+ "0": {
+ "human": "metr"
+ },
+ "1": {
+ "human": "centymetr"
+ }
+ }
+ }
+ }
},
"recycling": {
- "tagRenderings": {
- "recycling-accepts": {
- "mappings": {
- "16": {
- "then": "Plastik może być tutaj poddany recyklingowi"
- }
- }
+ "tagRenderings": {
+ "recycling-accepts": {
+ "mappings": {
+ "16": {
+ "then": "Plastik może być tutaj poddany recyklingowi"
}
+ }
}
+ }
},
"school": {
- "tagRenderings": {
- "school-language": {
- "render": {
- "special": {
- "render_all": "Następujące języki są używane w tej szkole:{list()}",
- "render_single_language": "Język {language():font-bold} jest głównym językiem używanym w tej szkole"
- }
- }
- },
- "school-name": {
- "question": "Jaką nazwę ma ta szkoła?",
- "render": "Ta szkoła nazywa się {name}"
- },
- "target-audience": {
- "mappings": {
- "3": {
- "then": "To jest szkoła dla uczniów z autyzmem"
- },
- "6": {
- "then": "To jest szkoła dla uczniów głuchych i słabosłyszących"
- },
- "7": {
- "then": "To jest szkoła dla uczniów z niepełnosprawnościami"
- },
- "8": {
- "then": "To jest szkoła dla uczniów z specjalnymi potrzebami"
- }
- }
+ "tagRenderings": {
+ "school-language": {
+ "render": {
+ "special": {
+ "render_all": "Następujące języki są używane w tej szkole:{list()}",
+ "render_single_language": "Język {language():font-bold} jest głównym językiem używanym w tej szkole"
}
+ }
},
- "title": {
- "render": "Szkoła {name}"
+ "school-name": {
+ "question": "Jaką nazwę ma ta szkoła?",
+ "render": "Ta szkoła nazywa się {name}"
+ },
+ "target-audience": {
+ "mappings": {
+ "3": {
+ "then": "To jest szkoła dla uczniów z autyzmem"
+ },
+ "6": {
+ "then": "To jest szkoła dla uczniów głuchych i słabosłyszących"
+ },
+ "7": {
+ "then": "To jest szkoła dla uczniów z niepełnosprawnościami"
+ },
+ "8": {
+ "then": "To jest szkoła dla uczniów z specjalnymi potrzebami"
+ }
+ }
}
+ },
+ "title": {
+ "render": "Szkoła {name}"
+ }
},
"windturbine": {
- "title": {
- "mappings": {
- "0": {
- "then": "{name}"
- }
- },
- "render": "turbina wiatrowa"
- }
+ "title": {
+ "mappings": {
+ "0": {
+ "then": "{name}"
+ }
+ },
+ "render": "turbina wiatrowa"
+ }
}
-}
\ No newline at end of file
+ }
+}
diff --git a/langs/layers/pt.json b/langs/layers/pt.json
index c9719c968..0b555ee2d 100644
--- a/langs/layers/pt.json
+++ b/langs/layers/pt.json
@@ -233,7 +233,11 @@
},
"artwork-website": {
"question": "Existe um site com mais informações sobre esta obra de arte?",
- "render": "Mais informações neste site"
+ "render": {
+ "special": {
+ "text": "Mais informações neste site"
+ }
+ }
},
"artwork_subject": {
"question": "O que esta obra de arte representa?",
diff --git a/langs/layers/ru.json b/langs/layers/ru.json
index a320c85f5..b32efc029 100644
--- a/langs/layers/ru.json
+++ b/langs/layers/ru.json
@@ -117,7 +117,11 @@
},
"artwork-website": {
"question": "Есть ли сайт с более подробной информацией об этой работе?",
- "render": "Больше информации на этом сайте"
+ "render": {
+ "special": {
+ "text": "Больше информации на этом сайте"
+ }
+ }
}
},
"title": {
@@ -996,7 +1000,11 @@
"render": "В знак памяти о {subject}"
},
"ghost_bike-source": {
- "render": "Доступна более подробная информация"
+ "render": {
+ "special": {
+ "text": "Доступна более подробная информация"
+ }
+ }
},
"ghost_bike-start_date": {
"render": "Установлен {start_date}"
@@ -1295,13 +1303,6 @@
}
}
},
- "nature_reserve": {
- "tagRenderings": {
- "Email": {
- "render": "{email}"
- }
- }
- },
"observation_tower": {
"name": "Смотровые башни",
"title": {
@@ -1515,7 +1516,11 @@
},
"public_bookcase-website": {
"question": "Есть ли веб-сайт с более подробной информацией об этом общественном книжном шкафе?",
- "render": "Более подробная информация на сайте"
+ "render": {
+ "special": {
+ "text": "Более подробная информация на сайте"
+ }
+ }
}
},
"title": {
diff --git a/langs/layers/zh_Hant.json b/langs/layers/zh_Hant.json
index 82fb3ca3b..1b07031cf 100644
--- a/langs/layers/zh_Hant.json
+++ b/langs/layers/zh_Hant.json
@@ -72,7 +72,11 @@
},
"artwork-website": {
"question": "在那個網站能夠找到更多藝術品的資訊?",
- "render": "這個網站有更多資訊"
+ "render": {
+ "special": {
+ "text": "這個網站有更多資訊"
+ }
+ }
}
},
"title": {
diff --git a/langs/nb_NO.json b/langs/nb_NO.json
index 74da37d95..3c56e2c00 100644
--- a/langs/nb_NO.json
+++ b/langs/nb_NO.json
@@ -300,17 +300,6 @@
"doDelete": "Fjern bilde",
"dontDelete": "Avbryt",
"isDeleted": "Slettet",
- "nearbyPictures": {
- "allFiltered": "Ingen bilder samsvarte",
- "browseNearby": "Utforsk bilder i nærheten …",
- "confirm": "Valgt bilde viser {title()}",
- "loadMore": "Last inn flere bilder",
- "loading": "Laster inn bilder i nærheten …",
- "noImageSelected": "Velg et bilde for å knytte det til objektet",
- "nothingFound": "Fant ingen bilder i nærheten …",
- "removeFilters": "Klikk her for å fjerne filterne",
- "title": "Bilder i nærheten"
- },
"pleaseLogin": "Logg inn for å legge til et bilde",
"respectPrivacy": "Ikke ta bilder av folk eller bilskilt. Ikke last opp Google Maps, Google Streetview eller andre opphavsrettsbeskyttede kilder.",
"toBig": "Bildet ditt på {actual_size} er for stort. Det kan maksimalt være {max_size}.",
diff --git a/langs/nl.json b/langs/nl.json
index 1a82b45e7..1a7e651cb 100644
--- a/langs/nl.json
+++ b/langs/nl.json
@@ -404,20 +404,6 @@
"doDelete": "Verwijder afbeelding",
"dontDelete": "Annuleren",
"isDeleted": "Verwijderd",
- "nearbyPictures": {
- "allFiltered": "Geen enkele afbeelding voldoet aan je filter",
- "browseNearby": "Bekijk afbeeldingen van deze buurt…",
- "confirm": "De geselecteerde afbeelding toont {title()}",
- "hasMatchingPicture": "Is er een afbeelding die dit object toont? Selecteer deze hieronder:",
- "loadMore": "Toon meer afbeeldingen",
- "loading": "Afbeeldingen worden geladen…",
- "noImageSelected": "Selecteer een afbeelding om deze te linken",
- "nothingFound": "Geen afbeeldingen van deze buurt gevonden…",
- "onlyTowards": "Toon enkel afbeeldingen die naar dit object kijken",
- "removeFilters": "Verwijder alle filters",
- "title": "Afbeeldingen van de buurt",
- "withinRadius": "Toon enkel afbeeldingen die gemaakt zijn binnen {radius} meter van dit object"
- },
"pleaseLogin": "Gelieve je aan te melden om een foto toe te voegen",
"respectPrivacy": "Fotografeer geen mensen of nummerplaten. Voeg geen Google Maps, Google Streetview of foto's met auteursrechten toe.",
"toBig": "Je afbeelding is te groot, namelijk {actual_size}. Gelieve afbeeldingen van maximaal {max_size} te gebruiken",
diff --git a/langs/pa_PK.json b/langs/pa_PK.json
index 15de79618..48e25c330 100644
--- a/langs/pa_PK.json
+++ b/langs/pa_PK.json
@@ -85,12 +85,7 @@
"addPicture": "تصویر پایو",
"doDelete": "تصویر ہٹاؤ",
"dontDelete": "رد کرو",
- "isDeleted": "مٹائی گئی",
- "nearbyPictures": {
- "browseNearby": "نیڑے تیڑے تے تصویراں ویکھو۔ ۔ ۔",
- "loadMore": "ہور تصویراں لوڈ کرو",
- "title": "نیڑے تیڑے تے تصویراں"
- }
+ "isDeleted": "مٹائی گئی"
},
"move": {
"cancel": "چلݨ رد کرو"
diff --git a/langs/pl.json b/langs/pl.json
index a7983b322..d4d949a35 100644
--- a/langs/pl.json
+++ b/langs/pl.json
@@ -268,13 +268,6 @@
"doDelete": "Usuń ilustrację",
"dontDelete": "Anuluj",
"isDeleted": "Usunięte",
- "nearbyPictures": {
- "browseNearby": "Przeglądaj zdjęcia w pobliżu…",
- "loadMore": "Załaduj więcej zdjęć",
- "loading": "Wczytywanie obrazów w pobliżu…",
- "nothingFound": "Nie znaleziono zdjęć w pobliżu…",
- "removeFilters": "Kliknij tutaj, aby usunąć filtry"
- },
"pleaseLogin": "Zaloguj się, by dodać zdjęcie",
"respectPrivacy": "Nie fotografuj ludzi i tablic rejestracyjnych. Nie wysyłaj także treści z Google Maps, Google Streetview ani innych licencjonowanych źródeł.",
"uploadDone": "Twoje zdjęcie zostało dodane. Dzięki za pomoc!",
diff --git a/langs/pt.json b/langs/pt.json
index bc70ecd62..1b2767540 100644
--- a/langs/pt.json
+++ b/langs/pt.json
@@ -297,20 +297,6 @@
"doDelete": "Remover imagem",
"dontDelete": "Cancelar",
"isDeleted": "Eliminada",
- "nearbyPictures": {
- "allFiltered": "Nenhuma imagem correspondeu ao seu filtro",
- "browseNearby": "Procurar imagens próximas…",
- "confirm": "A imagem selecionada mostra {title()}",
- "hasMatchingPicture": "Será que uma imagem corresponde ao objeto? Selecione abaixo",
- "loadMore": "Carregar mais imagens",
- "loading": "A carregar imagens próximas…",
- "noImageSelected": "Selecione uma imagem para ligá-la ao objeto",
- "nothingFound": "Não foram encontradas imagens próximas…",
- "onlyTowards": "Mostrar apenas fotografias que são tiradas em direção a este objeto",
- "removeFilters": "Clique aqui para remover os filtros",
- "title": "Fotografias próximas",
- "withinRadius": "Mostrar apenas fotografias que são tiradas num raio de {radius} metros deste objeto"
- },
"pleaseLogin": "Entre na sua conta para adicionar uma imagem",
"respectPrivacy": "Não fotografe pessoas nem placas de veículos. Não envie imagens do Google Maps, do Google Streetview ou outras fontes protegidas por direitos de autor.",
"toBig": "A sua imagem é muito grande porque tem {actual_size}. Use imagens com o máximo {max_size}",
diff --git a/langs/pt_BR.json b/langs/pt_BR.json
index c72ba63eb..d6af7cb4d 100644
--- a/langs/pt_BR.json
+++ b/langs/pt_BR.json
@@ -141,9 +141,6 @@
"doDelete": "Remover imagem",
"dontDelete": "Cancelar",
"isDeleted": "Excluída",
- "nearbyPictures": {
- "browseNearby": "Navegue pelas imagens próximas…"
- },
"pleaseLogin": "Faça login para adicionar uma imagem",
"respectPrivacy": "Não fotografe pessoas e nem placas de veículos. Não faça upload do Google Maps, Google Streetview ou outras fontes protegidas por direitos autorais.",
"uploadDone": "Sua foto foi adicionada. Obrigado por ajudar!",
diff --git a/langs/sl.json b/langs/sl.json
index 70b3d22f6..ffaadefb2 100644
--- a/langs/sl.json
+++ b/langs/sl.json
@@ -66,8 +66,7 @@
"addPicture": "Dodaj sliko",
"doDelete": "Odstrani sliko",
"dontDelete": "Prekliči",
- "isDeleted": "Izbrisana",
- "nearbyPictures": {}
+ "isDeleted": "Izbrisana"
},
"importInspector": {},
"importLayer": {},
diff --git a/langs/sv.json b/langs/sv.json
index 06a1d189d..35a494b8a 100644
--- a/langs/sv.json
+++ b/langs/sv.json
@@ -69,7 +69,6 @@
"doDelete": "Ta bort bild",
"dontDelete": "Avbryt",
"isDeleted": "Borttagen",
- "nearbyPictures": {},
"pleaseLogin": "Logga in för att lägga till en bild",
"respectPrivacy": "Fotografera inte personer eller registreringsskyltar. Ladda inte upp från Google Maps, Google Streetview eller andra upphovsrättsskyddade källor.",
"toBig": "Din bild är för stor då den är {actual_size}. Vänligen använd endast bilder som är högst {max_size}",
diff --git a/langs/themes/de.json b/langs/themes/de.json
index 8a31bbcd5..c3897e52a 100644
--- a/langs/themes/de.json
+++ b/langs/themes/de.json
@@ -1350,4 +1350,4 @@
"shortDescription": "Eine Karte mit Abfalleimern",
"title": "Abfalleimer"
}
-}
\ No newline at end of file
+}
diff --git a/langs/themes/en.json b/langs/themes/en.json
index ca9c5a4f9..d07b53164 100644
--- a/langs/themes/en.json
+++ b/langs/themes/en.json
@@ -858,12 +858,12 @@
"description": "This maps shows all the changes made with MapComplete",
"layers": {
"0": {
- "description": "Shows all MapComplete changes",
+ "description": "Show all MapComplete changes",
"filter": {
"0": {
"options": {
"0": {
- "question": "Themename contains {search}"
+ "question": "Theme name contains {search}"
}
}
},
@@ -920,12 +920,12 @@
"name": "Changeset centers",
"tagRenderings": {
"contributor": {
- "question": "What contributor did make this change?",
+ "question": "Which contributor made this change?",
"render": "Change made by {user}"
},
"host": {
"question": "What host (website) was this change made with?",
- "render": "Change with with {host}"
+ "render": "Change made with {host}"
},
"locale": {
"question": "What locale (language) was this change made in?",
@@ -936,7 +936,7 @@
},
"theme-id": {
"question": "What theme was used to make this change?",
- "render": "Change with theme {theme}"
+ "render": "Change with theme {theme}"
},
"version": {
"question": "What version of MapComplete was used to make this change?",
@@ -957,7 +957,7 @@
}
}
},
- "shortDescription": "Shows changes made by MapComplete",
+ "shortDescription": "Show changes made with MapComplete",
"title": "Changes made with MapComplete"
},
"maproulette": {
diff --git a/langs/themes/fr.json b/langs/themes/fr.json
index 1154031d0..21da83331 100644
--- a/langs/themes/fr.json
+++ b/langs/themes/fr.json
@@ -844,6 +844,65 @@
},
"title": "Ressauts et traversées"
},
+ "mapcomplete-changes": {
+ "description": "Cette carte montre tous les changements faits avec MapComplete",
+ "layers": {
+ "0": {
+ "filter": {
+ "5": {
+ "options": {
+ "0": {
+ "question": "Langage utilisateur (code-ISO) {search}"
+ }
+ }
+ },
+ "7": {
+ "options": {
+ "0": {
+ "question": "Le groupe de modifications a ajouté au moins une image"
+ }
+ }
+ }
+ },
+ "tagRenderings": {
+ "contributor": {
+ "question": "Quel contributeur a fait cette modification ?",
+ "render": "Modification faite par {user}"
+ },
+ "host": {
+ "render": "Modification faite avec {host}"
+ },
+ "locale": {
+ "question": "En quelle langue est-ce que ce changement a été fait ?"
+ },
+ "show_changeset_id": {
+ "render": "Groupe de modifications {id}"
+ },
+ "theme-id": {
+ "question": "Quel thème a été utilisé pour faire cette modification ?",
+ "render": "Modifié avec le thème {theme}"
+ },
+ "version": {
+ "question": "Quelle version de MapComplete a été utilisée pour faire cette modification ?",
+ "render": "Fait avec {editor}"
+ }
+ },
+ "title": {
+ "render": "Groupe de modifications pour {theme}"
+ }
+ },
+ "1": {
+ "override": {
+ "tagRenderings+": {
+ "0": {
+ "render": "D'autres statistiques sont disponibles ici"
+ }
+ }
+ }
+ }
+ },
+ "title": "Changements faits avec MapComplete"
+ },
"maproulette": {
"description": "Thème MapRoulette permettant d’afficher, rechercher, filtrer et résoudre les tâches.",
"title": "Tâches MapRoulette"
diff --git a/langs/themes/nl.json b/langs/themes/nl.json
index 8344d4fba..2affa3f47 100644
--- a/langs/themes/nl.json
+++ b/langs/themes/nl.json
@@ -936,6 +936,89 @@
},
"title": "Stoepranden en oversteekplaatsen"
},
+ "mapcomplete-changes": {
+ "description": "Deze kaart toont alle wijzigingen die met MapComplete gemaakt werden",
+ "layers": {
+ "0": {
+ "description": "Toon alle MapComplete wijzigingen",
+ "filter": {
+ "0": {
+ "options": {
+ "0": {
+ "question": "Themenaam bevat {search}"
+ }
+ }
+ },
+ "1": {
+ "options": {
+ "0": {
+ "question": "Gemaakt door bijdrager {search}"
+ }
+ }
+ },
+ "2": {
+ "options": {
+ "0": {
+ "question": "Niet gemaakt door bijdrager {search}"
+ }
+ }
+ },
+ "3": {
+ "options": {
+ "0": {
+ "question": "Gemaakt voor {search}"
+ }
+ }
+ },
+ "4": {
+ "options": {
+ "0": {
+ "question": "Gemaakt na {search}"
+ }
+ }
+ },
+ "5": {
+ "options": {
+ "0": {
+ "question": "De taal van de bijdrager is {search}"
+ }
+ }
+ },
+ "6": {
+ "options": {
+ "0": {
+ "question": "Gemaakt met host {search}"
+ }
+ }
+ },
+ "7": {
+ "options": {
+ "0": {
+ "question": "Changeset bevat minstens één afbeelding"
+ }
+ }
+ }
+ },
+ "name": "Centerpunt van changeset",
+ "tagRenderings": {
+ "contributor": {
+ "question": "Welke bijdrager maakte deze wijziging?",
+ "render": "Wijziging gemaakt door {user}"
+ },
+ "host": {
+ "question": "Met welke host (website) werd deze wijziging gemaakt?",
+ "render": "Wijziging gemaakt met {host}"
+ },
+ "locale": {
+ "question": "In welke locale (taal) werd deze wijziging gemaakt?",
+ "render": "De gebruikerstaal is {locale}"
+ }
+ }
+ }
+ },
+ "shortDescription": "Toon wijzigingen gemaakt met MapComplete",
+ "title": "Wijzigingen gemaakt met MapComplete"
+ },
"maproulette": {
"description": "Thema met MapRoulette taken, waar je ze kunt zoeken, filteren en ze oplossen.",
"title": "MapRoulette taken"
diff --git a/langs/zh_Hant.json b/langs/zh_Hant.json
index e168f70f3..8772a0778 100644
--- a/langs/zh_Hant.json
+++ b/langs/zh_Hant.json
@@ -280,20 +280,6 @@
"doDelete": "移除圖片",
"dontDelete": "取消",
"isDeleted": "已移除",
- "nearbyPictures": {
- "allFiltered": "沒有符合篩選器的圖片",
- "browseNearby": "瀏覽附近的圖片…",
- "confirm": "選取的圖片顯示 {title()}",
- "hasMatchingPicture": "有圖片符合物件嗎?請從底下結果選取",
- "loadMore": "載入更多圖片",
- "loading": "載入附近圖片…",
- "noImageSelected": "選取圖片來連結到物件",
- "nothingFound": "附近沒有找到圖片…",
- "onlyTowards": "只顯示往這個物件方向照的圖片",
- "removeFilters": "點這裡來移除篩選",
- "title": "附近圖片",
- "withinRadius": "只顯示這個物件半徑 {radius} 公尺內照的圖片"
- },
"pleaseLogin": "請登入以新增圖片",
"respectPrivacy": "請別照人像或是車牌,不要上傳 Google 地圖、Google 街景或其他受版權保護的資料來源。",
"toBig": "{actual_size} 因此照片太大,請使用最大 {max_size} 的照片",
diff --git a/package-lock.json b/package-lock.json
index 1264b5d76..9256578de 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -40,7 +40,7 @@
"mangrove-reviews-typescript": "^1.1.0",
"maplibre-gl": "^3.2.0",
"opening_hours": "^3.6.0",
- "osm-auth": "^1.0.2",
+ "osm-auth": "^2.2.0",
"osmtogeojson": "^3.0.0-beta.5",
"papaparse": "^5.3.1",
"pic4carto": "^2.1.15",
@@ -72,9 +72,13 @@
"@types/prompt-sync": "^4.1.0",
"@types/wikidata-sdk": "^6.1.0",
"@types/xml2js": "^0.4.9",
+ "@typescript-eslint/eslint-plugin": "^6.1.0",
+ "@typescript-eslint/parser": "^6.1.0",
"assert": "^2.0.0",
"chai": "^4.3.6",
"dependency-cruiser": "^10.4.0",
+ "eslint": "^8.45.0",
+ "eslint-plugin-svelte": "^2.32.2",
"fs": "0.0.1-security",
"node-html-parser": "^6.1.5",
"prettier": "^2.8.8",
@@ -89,12 +93,19 @@
"ts-node": "^10.9.1",
"ts2json-schema": "^1.4.0",
"tslib": "^2.5.0",
- "tslint": "^6.1.3",
- "tslint-no-circular-imports": "^0.7.0",
"typescript": "^4.7.4",
"vite": "^4.0.5"
}
},
+ "node_modules/@aashutoshrathi/word-wrap": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz",
+ "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/@ampproject/remapping": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz",
@@ -1634,6 +1645,144 @@
"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.1.0",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.0.tgz",
+ "integrity": "sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==",
+ "dev": true,
+ "dependencies": {
+ "ajv": "^6.12.4",
+ "debug": "^4.3.2",
+ "espree": "^9.6.0",
+ "globals": "^13.19.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^4.1.0",
+ "minimatch": "^3.1.2",
+ "strip-json-comments": "^3.1.1"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@eslint/eslintrc/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,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/globals": {
+ "version": "13.20.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz",
+ "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==",
+ "dev": true,
+ "dependencies": {
+ "type-fest": "^0.20.2"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/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
+ },
+ "node_modules/@eslint/eslintrc/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,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@eslint/js": {
+ "version": "8.44.0",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.44.0.tgz",
+ "integrity": "sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==",
+ "dev": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@humanwhocodes/config-array": {
+ "version": "0.11.10",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz",
+ "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==",
+ "dev": true,
+ "dependencies": {
+ "@humanwhocodes/object-schema": "^1.2.1",
+ "debug": "^4.1.1",
+ "minimatch": "^3.0.5"
+ },
+ "engines": {
+ "node": ">=10.10.0"
+ }
+ },
+ "node_modules/@humanwhocodes/module-importer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
+ "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
+ "dev": true,
+ "engines": {
+ "node": ">=12.22"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "node_modules/@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
+ },
"node_modules/@jest/schemas": {
"version": "29.4.0",
"resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.0.tgz",
@@ -3682,9 +3831,9 @@
}
},
"node_modules/@types/json-schema": {
- "version": "7.0.11",
- "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz",
- "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==",
+ "version": "7.0.12",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz",
+ "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==",
"dev": true
},
"node_modules/@types/json5": {
@@ -3766,6 +3915,12 @@
"@types/node": "*"
}
},
+ "node_modules/@types/semver": {
+ "version": "7.5.0",
+ "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz",
+ "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==",
+ "dev": true
+ },
"node_modules/@types/showdown": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/@types/showdown/-/showdown-2.0.0.tgz",
@@ -3803,6 +3958,295 @@
"resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz",
"integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA=="
},
+ "node_modules/@typescript-eslint/eslint-plugin": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.1.0.tgz",
+ "integrity": "sha512-qg7Bm5TyP/I7iilGyp6DRqqkt8na00lI6HbjWZObgk3FFSzH5ypRwAHXJhJkwiRtTcfn+xYQIMOR5kJgpo6upw==",
+ "dev": true,
+ "dependencies": {
+ "@eslint-community/regexpp": "^4.5.1",
+ "@typescript-eslint/scope-manager": "6.1.0",
+ "@typescript-eslint/type-utils": "6.1.0",
+ "@typescript-eslint/utils": "6.1.0",
+ "@typescript-eslint/visitor-keys": "6.1.0",
+ "debug": "^4.3.4",
+ "graphemer": "^1.4.0",
+ "ignore": "^5.2.4",
+ "natural-compare": "^1.4.0",
+ "natural-compare-lite": "^1.4.0",
+ "semver": "^7.5.4",
+ "ts-api-utils": "^1.0.1"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha",
+ "eslint": "^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/eslint-plugin/node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": {
+ "version": "7.5.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
+ "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@typescript-eslint/eslint-plugin/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
+ },
+ "node_modules/@typescript-eslint/parser": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.1.0.tgz",
+ "integrity": "sha512-hIzCPvX4vDs4qL07SYzyomamcs2/tQYXg5DtdAfj35AyJ5PIUqhsLf4YrEIFzZcND7R2E8tpQIZKayxg8/6Wbw==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/scope-manager": "6.1.0",
+ "@typescript-eslint/types": "6.1.0",
+ "@typescript-eslint/typescript-estree": "6.1.0",
+ "@typescript-eslint/visitor-keys": "6.1.0",
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/scope-manager": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.1.0.tgz",
+ "integrity": "sha512-AxjgxDn27hgPpe2rQe19k0tXw84YCOsjDJ2r61cIebq1t+AIxbgiXKvD4999Wk49GVaAcdJ/d49FYel+Pp3jjw==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "6.1.0",
+ "@typescript-eslint/visitor-keys": "6.1.0"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/type-utils": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.1.0.tgz",
+ "integrity": "sha512-kFXBx6QWS1ZZ5Ni89TyT1X9Ag6RXVIVhqDs0vZE/jUeWlBv/ixq2diua6G7ece6+fXw3TvNRxP77/5mOMusx2w==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/typescript-estree": "6.1.0",
+ "@typescript-eslint/utils": "6.1.0",
+ "debug": "^4.3.4",
+ "ts-api-utils": "^1.0.1"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/types": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.1.0.tgz",
+ "integrity": "sha512-+Gfd5NHCpDoHDOaU/yIF3WWRI2PcBRKKpP91ZcVbL0t5tQpqYWBs3z/GGhvU+EV1D0262g9XCnyqQh19prU0JQ==",
+ "dev": true,
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.1.0.tgz",
+ "integrity": "sha512-nUKAPWOaP/tQjU1IQw9sOPCDavs/iU5iYLiY/6u7gxS7oKQoi4aUxXS1nrrVGTyBBaGesjkcwwHkbkiD5eBvcg==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "6.1.0",
+ "@typescript-eslint/visitor-keys": "6.1.0",
+ "debug": "^4.3.4",
+ "globby": "^11.1.0",
+ "is-glob": "^4.0.3",
+ "semver": "^7.5.4",
+ "ts-api-utils": "^1.0.1"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": {
+ "version": "7.5.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
+ "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
+ },
+ "node_modules/@typescript-eslint/utils": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.1.0.tgz",
+ "integrity": "sha512-wp652EogZlKmQoMS5hAvWqRKplXvkuOnNzZSE0PVvsKjpexd/XznRVHAtrfHFYmqaJz0DFkjlDsGYC9OXw+OhQ==",
+ "dev": true,
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.4.0",
+ "@types/json-schema": "^7.0.12",
+ "@types/semver": "^7.5.0",
+ "@typescript-eslint/scope-manager": "6.1.0",
+ "@typescript-eslint/types": "6.1.0",
+ "@typescript-eslint/typescript-estree": "6.1.0",
+ "semver": "^7.5.4"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/utils/node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@typescript-eslint/utils/node_modules/semver": {
+ "version": "7.5.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
+ "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@typescript-eslint/utils/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
+ },
+ "node_modules/@typescript-eslint/visitor-keys": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.1.0.tgz",
+ "integrity": "sha512-yQeh+EXhquh119Eis4k0kYhj9vmFzNpbhM3LftWQVwqVjipCkwHBQOZutcYW+JVkjtTG9k8nrZU1UoNedPDd1A==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "6.1.0",
+ "eslint-visitor-keys": "^3.4.1"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
"node_modules/@ungap/promise-all-settled": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz",
@@ -4107,6 +4551,15 @@
"resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz",
"integrity": "sha512-H3LU5RLiSsGXPhN+Nipar0iR0IofH+8r89G2y1tBKxQ/agagKyAjhkAFDRBfodP2caPrNKHpAWNIM/c9yeL7uA=="
},
+ "node_modules/array-union": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/asn1": {
"version": "0.2.6",
"resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz",
@@ -4436,15 +4889,6 @@
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
"integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="
},
- "node_modules/builtin-modules": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
- "integrity": "sha512-wxXCdllwGhI2kCC0MnvTGYTMvnVZTvqgypkiTI8Pa5tcz2i6VqsqwYGgqwXji+4RgCzms6EajE4IxiUH6HH8nQ==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/bytewise": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/bytewise/-/bytewise-1.1.0.tgz",
@@ -4919,6 +5363,20 @@
"integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==",
"devOptional": true
},
+ "node_modules/cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "dev": true,
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
"node_modules/css-line-break": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/css-line-break/-/css-line-break-2.1.0.tgz",
@@ -5433,6 +5891,18 @@
"node": ">=0.3.1"
}
},
+ "node_modules/dir-glob": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+ "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+ "dev": true,
+ "dependencies": {
+ "path-type": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/dlv": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
@@ -5454,6 +5924,18 @@
"doctest-ts-improved": "dist/main.js"
}
},
+ "node_modules/doctrine": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+ "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+ "dev": true,
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
"node_modules/dom-serializer": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz",
@@ -5719,6 +6201,378 @@
"source-map": "~0.6.1"
}
},
+ "node_modules/eslint": {
+ "version": "8.45.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.45.0.tgz",
+ "integrity": "sha512-pd8KSxiQpdYRfYa9Wufvdoct3ZPQQuVuU5O6scNgMuOMYuxvH0IGaYK0wUFjo4UYYQQCUndlXiMbnxopwvvTiw==",
+ "dev": true,
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.2.0",
+ "@eslint-community/regexpp": "^4.4.0",
+ "@eslint/eslintrc": "^2.1.0",
+ "@eslint/js": "8.44.0",
+ "@humanwhocodes/config-array": "^0.11.10",
+ "@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.2.0",
+ "eslint-visitor-keys": "^3.4.1",
+ "espree": "^9.6.0",
+ "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.2",
+ "globals": "^13.19.0",
+ "graphemer": "^1.4.0",
+ "ignore": "^5.2.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "is-path-inside": "^3.0.3",
+ "js-yaml": "^4.1.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "levn": "^0.4.1",
+ "lodash.merge": "^4.6.2",
+ "minimatch": "^3.1.2",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.3",
+ "strip-ansi": "^6.0.1",
+ "text-table": "^0.2.0"
+ },
+ "bin": {
+ "eslint": "bin/eslint.js"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-plugin-svelte": {
+ "version": "2.32.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-svelte/-/eslint-plugin-svelte-2.32.2.tgz",
+ "integrity": "sha512-Jgbop2fNZsoxxkklZAIbDNhwAPynvnCtUXLsEC6O2qax7N/pfe2cNqT0ZoBbubXKJitQQDEyVDQ1rZs4ZWcrTA==",
+ "dev": true,
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.2.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14",
+ "debug": "^4.3.1",
+ "esutils": "^2.0.3",
+ "known-css-properties": "^0.27.0",
+ "postcss": "^8.4.5",
+ "postcss-load-config": "^3.1.4",
+ "postcss-safe-parser": "^6.0.0",
+ "postcss-selector-parser": "^6.0.11",
+ "semver": "^7.5.3",
+ "svelte-eslint-parser": "^0.32.0"
+ },
+ "engines": {
+ "node": "^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ota-meshi"
+ },
+ "peerDependencies": {
+ "eslint": "^7.0.0 || ^8.0.0-0",
+ "svelte": "^3.37.0 || ^4.0.0"
+ },
+ "peerDependenciesMeta": {
+ "svelte": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-plugin-svelte/node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/eslint-plugin-svelte/node_modules/semver": {
+ "version": "7.5.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
+ "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/eslint-plugin-svelte/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
+ },
+ "node_modules/eslint-scope": {
+ "version": "7.2.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.1.tgz",
+ "integrity": "sha512-CvefSOsDdaYYvxChovdrPo/ZGt8d5lrJWleAc1diXRKhHGiTYEI26cvo8Kle/wGnsizoCJjK73FMg1/IkIwiNA==",
+ "dev": true,
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-visitor-keys": {
+ "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,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint/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,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/eslint/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/eslint/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/eslint/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/eslint/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/eslint/node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint/node_modules/glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/eslint/node_modules/globals": {
+ "version": "13.20.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz",
+ "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==",
+ "dev": true,
+ "dependencies": {
+ "type-fest": "^0.20.2"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/eslint/node_modules/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
+ },
+ "node_modules/eslint/node_modules/levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "dev": true,
+ "dependencies": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/eslint/node_modules/optionator": {
+ "version": "0.9.3",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz",
+ "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==",
+ "dev": true,
+ "dependencies": {
+ "@aashutoshrathi/word-wrap": "^1.2.3",
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/eslint/node_modules/prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/eslint/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/eslint/node_modules/type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "dev": true,
+ "dependencies": {
+ "prelude-ls": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/eslint/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,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/espree": {
+ "version": "9.6.1",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz",
+ "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
+ "dev": true,
+ "dependencies": {
+ "acorn": "^8.9.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^3.4.1"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/espree/node_modules/acorn": {
+ "version": "8.10.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz",
+ "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==",
+ "dev": true,
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
"node_modules/esprima": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
@@ -5731,12 +6585,35 @@
"node": ">=4"
}
},
+ "node_modules/esquery": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz",
+ "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==",
+ "dev": true,
+ "dependencies": {
+ "estraverse": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "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,
+ "dependencies": {
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
"node_modules/estraverse": {
"version": "5.3.0",
"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
"integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
- "optional": true,
- "peer": true,
+ "devOptional": true,
"engines": {
"node": ">=4.0"
}
@@ -6001,6 +6878,18 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/file-entry-cache": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+ "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
+ "dev": true,
+ "dependencies": {
+ "flat-cache": "^3.0.4"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
"node_modules/fill-range": {
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
@@ -6035,6 +6924,40 @@
"flat": "cli.js"
}
},
+ "node_modules/flat-cache": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
+ "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
+ "dev": true,
+ "dependencies": {
+ "flatted": "^3.1.0",
+ "rimraf": "^3.0.2"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/flat-cache/node_modules/rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "dev": true,
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/flatted": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz",
+ "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==",
+ "dev": true
+ },
"node_modules/follow-redirects": {
"version": "1.15.2",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz",
@@ -6362,6 +7285,26 @@
"node": ">=4"
}
},
+ "node_modules/globby": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
+ "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
+ "dev": true,
+ "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/gopd": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
@@ -6379,6 +7322,12 @@
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
"integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA=="
},
+ "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/growl": {
"version": "1.10.5",
"resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz",
@@ -6720,6 +7669,15 @@
}
]
},
+ "node_modules/ignore": {
+ "version": "5.2.4",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz",
+ "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4"
+ }
+ },
"node_modules/immutable": {
"version": "4.2.2",
"resolved": "https://registry.npmjs.org/immutable/-/immutable-4.2.2.tgz",
@@ -6742,6 +7700,15 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.19"
+ }
+ },
"node_modules/incremental-convex-hull": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/incremental-convex-hull/-/incremental-convex-hull-1.0.1.tgz",
@@ -7012,6 +7979,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",
"resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
@@ -7300,17 +8276,6 @@
"node": ">=4"
}
},
- "node_modules/jshashes": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/jshashes/-/jshashes-1.0.8.tgz",
- "integrity": "sha512-btmQZ/w1rj8Lb6nEwvhjM7nBYoj54yaEFo2PWh3RkxZ8qNwuvOxvQYN/JxVuwoMmdIluL+XwYVJ+pEEZoSYybQ==",
- "bin": {
- "hashes": "bin/hashes"
- },
- "engines": {
- "node": "*"
- }
- },
"node_modules/json-schema": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
@@ -7334,6 +8299,12 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
+ "dev": true
+ },
"node_modules/json-stringify-pretty-compact": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/json-stringify-pretty-compact/-/json-stringify-pretty-compact-3.0.0.tgz",
@@ -7477,6 +8448,12 @@
"node": ">=6"
}
},
+ "node_modules/known-css-properties": {
+ "version": "0.27.0",
+ "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.27.0.tgz",
+ "integrity": "sha512-uMCj6+hZYDoffuvAJjFAPz56E9uoowFHmTkqRtRq5WyC5Q6Cu/fTZKNQpX/RbzChBYLLl3lo8CjFZBAZXq9qFg==",
+ "dev": true
+ },
"node_modules/latlon2country": {
"version": "1.2.6",
"resolved": "https://registry.npmjs.org/latlon2country/-/latlon2country-1.2.6.tgz",
@@ -7549,6 +8526,12 @@
"integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==",
"dev": true
},
+ "node_modules/lodash.merge": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+ "dev": true
+ },
"node_modules/log-symbols": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
@@ -8043,6 +9026,18 @@
"integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==",
"dev": true
},
+ "node_modules/natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+ "dev": true
+ },
+ "node_modules/natural-compare-lite": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz",
+ "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==",
+ "dev": true
+ },
"node_modules/neo-async": {
"version": "2.6.2",
"resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
@@ -8189,18 +9184,6 @@
"node": ">= 0.4"
}
},
- "node_modules/ohauth": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/ohauth/-/ohauth-1.0.1.tgz",
- "integrity": "sha512-R9ZUN3+FVCwzeOOHCJpzA9jw/byRxp5O9X06mTL6Sp/LIQn/rLrMv6cwYctX+hoIKzRUsalGJXZ1kG5wBmSskQ==",
- "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.",
- "dependencies": {
- "jshashes": "~1.0.8"
- },
- "engines": {
- "node": ">=10"
- }
- },
"node_modules/once": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
@@ -8372,16 +9355,14 @@
}
},
"node_modules/osm-auth": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/osm-auth/-/osm-auth-1.1.2.tgz",
- "integrity": "sha512-oLaU+c/TP7eKAZpBN4S1mv/N94IXp5A+wLpDfAVlpq/b6iikas8ZthXPqhM8QKg/qB8RaKvZPJgxqYS+5m8G8g==",
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/osm-auth/-/osm-auth-2.2.0.tgz",
+ "integrity": "sha512-x93jAMaYWqPgfVeOMydFLFpFC8ERnlIKXwiUOrYYWTDEWqq15K/BI5UAjzuYXvLg0WxVxM8YC4N1T30SZeKJBQ==",
"dependencies": {
- "ohauth": "~1.0.1",
- "resolve-url": "~0.2.1",
"store": "~2.0.12"
},
"engines": {
- "node": ">=14"
+ "node": ">=16"
}
},
"node_modules/osm-polygon-features": {
@@ -8488,11 +9469,29 @@
"node": ">=0.10.0"
}
},
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/path-parse": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
},
+ "node_modules/path-type": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/pathe": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.0.tgz",
@@ -8585,6 +9584,99 @@
"splaytree": "^3.1.0"
}
},
+ "node_modules/postcss": {
+ "version": "8.4.26",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.26.tgz",
+ "integrity": "sha512-jrXHFF8iTloAenySjM/ob3gSj7pCu0Ji49hnjqzsgSRa50hkWCKD0HQ+gMNJkW38jBI68MpAAg7ZWwHwX8NMMw==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "nanoid": "^3.3.6",
+ "picocolors": "^1.0.0",
+ "source-map-js": "^1.0.2"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/postcss-load-config": {
+ "version": "3.1.4",
+ "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz",
+ "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==",
+ "dependencies": {
+ "lilconfig": "^2.0.5",
+ "yaml": "^1.10.2"
+ },
+ "engines": {
+ "node": ">= 10"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ "peerDependencies": {
+ "postcss": ">=8.0.9",
+ "ts-node": ">=9.0.0"
+ },
+ "peerDependenciesMeta": {
+ "postcss": {
+ "optional": true
+ },
+ "ts-node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/postcss-safe-parser": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz",
+ "integrity": "sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=12.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ "peerDependencies": {
+ "postcss": "^8.3.3"
+ }
+ },
+ "node_modules/postcss-scss": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.6.tgz",
+ "integrity": "sha512-rLDPhJY4z/i4nVFZ27j9GqLxj1pwxE80eAzUNRMXtcpipFYIeowerzBgG3yJhMtObGEXidtIgbUpQ3eLDsf5OQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss-scss"
+ }
+ ],
+ "engines": {
+ "node": ">=12.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.19"
+ }
+ },
"node_modules/postcss-selector-parser": {
"version": "6.0.11",
"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz",
@@ -8597,6 +9689,23 @@
"node": ">=4"
}
},
+ "node_modules/postcss/node_modules/nanoid": {
+ "version": "3.3.6",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz",
+ "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
"node_modules/potpack": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/potpack/-/potpack-2.0.0.tgz",
@@ -9191,12 +10300,6 @@
"protocol-buffers-schema": "^3.3.1"
}
},
- "node_modules/resolve-url": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
- "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==",
- "deprecated": "https://github.com/lydell/resolve-url#deprecated"
- },
"node_modules/restore-cursor": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
@@ -9608,6 +10711,27 @@
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
"dev": true
},
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/showdown": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/showdown/-/showdown-2.1.0.tgz",
@@ -9721,6 +10845,15 @@
"resolved": "https://registry.npmjs.org/skmeans/-/skmeans-0.9.7.tgz",
"integrity": "sha512-hNj1/oZ7ygsfmPZ7ZfN5MUBRoGg1gtpnImuJBgLO0ljQ67DtJuiQaiYdS4lUA6s0KCwnPhGivtC/WRwIZLkHyg=="
},
+ "node_modules/slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/slice-ansi": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz",
@@ -9869,12 +11002,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/sprintf-js": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
- "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
- "dev": true
- },
"node_modules/sshpk": {
"version": "1.17.0",
"resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz",
@@ -10054,9 +11181,9 @@
}
},
"node_modules/svelte": {
- "version": "3.55.1",
- "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.55.1.tgz",
- "integrity": "sha512-S+87/P0Ve67HxKkEV23iCdAh/SX1xiSfjF1HOglno/YTbSTW7RniICMCofWGdJJbdjw3S+0PfFb1JtGfTXE0oQ==",
+ "version": "3.59.2",
+ "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.59.2.tgz",
+ "integrity": "sha512-vzSyuGr3eEoAtT/A6bmajosJZIUWySzY2CzB3w2pgPvnkUjGqlDnsNnA0PMO+mMAhuyMul6C2uuZzY6ELSkzyA==",
"engines": {
"node": ">= 8"
}
@@ -10083,6 +11210,33 @@
"svelte": "^3.55.0"
}
},
+ "node_modules/svelte-eslint-parser": {
+ "version": "0.32.1",
+ "resolved": "https://registry.npmjs.org/svelte-eslint-parser/-/svelte-eslint-parser-0.32.1.tgz",
+ "integrity": "sha512-GCSfeIzdgk53CaOzK+s/+l2igfTno3mWGkwoDYAwPes/rD9Al2fc7ksfopjx5UL87S7dw1eL73F6wNYiiuhzIA==",
+ "dev": true,
+ "dependencies": {
+ "eslint-scope": "^7.0.0",
+ "eslint-visitor-keys": "^3.0.0",
+ "espree": "^9.0.0",
+ "postcss": "^8.4.25",
+ "postcss-scss": "^4.0.6"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ota-meshi"
+ },
+ "peerDependencies": {
+ "svelte": "^3.37.0 || ^4.0.0"
+ },
+ "peerDependenciesMeta": {
+ "svelte": {
+ "optional": true
+ }
+ }
+ },
"node_modules/svelte-hmr": {
"version": "0.15.1",
"resolved": "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.15.1.tgz",
@@ -10242,40 +11396,6 @@
"node": ">=10.13.0"
}
},
- "node_modules/tailwindcss/node_modules/nanoid": {
- "version": "3.3.4",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz",
- "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==",
- "bin": {
- "nanoid": "bin/nanoid.cjs"
- },
- "engines": {
- "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
- }
- },
- "node_modules/tailwindcss/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==",
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/postcss"
- }
- ],
- "dependencies": {
- "nanoid": "^3.3.4",
- "picocolors": "^1.0.0",
- "source-map-js": "^1.0.2"
- },
- "engines": {
- "node": "^10 || ^12 || >=14"
- }
- },
"node_modules/tailwindcss/node_modules/postcss-import": {
"version": "14.1.0",
"resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz",
@@ -10310,34 +11430,6 @@
"postcss": "^8.3.3"
}
},
- "node_modules/tailwindcss/node_modules/postcss-load-config": {
- "version": "3.1.4",
- "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz",
- "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==",
- "dependencies": {
- "lilconfig": "^2.0.5",
- "yaml": "^1.10.2"
- },
- "engines": {
- "node": ">= 10"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
- },
- "peerDependencies": {
- "postcss": ">=8.0.9",
- "ts-node": ">=9.0.0"
- },
- "peerDependenciesMeta": {
- "postcss": {
- "optional": true
- },
- "ts-node": {
- "optional": true
- }
- }
- },
"node_modules/tailwindcss/node_modules/postcss-nested": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.0.tgz",
@@ -10439,6 +11531,12 @@
"utrie": "^1.0.2"
}
},
+ "node_modules/text-table": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
+ "dev": true
+ },
"node_modules/through": {
"version": "2.3.8",
"resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
@@ -10588,6 +11686,18 @@
"node": ">=14"
}
},
+ "node_modules/ts-api-utils": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.1.tgz",
+ "integrity": "sha512-lC/RGlPmwdrIBFTX59wwNzqh7aR2otPNPR/5brHZm/XKFYKsfqxihXUe9pU3JI+3vGkl+vyCoNNnPhJn3aLK1A==",
+ "dev": true,
+ "engines": {
+ "node": ">=16.13.0"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.2.0"
+ }
+ },
"node_modules/ts-json-schema-generator": {
"version": "0.95.0",
"resolved": "https://registry.npmjs.org/ts-json-schema-generator/-/ts-json-schema-generator-0.95.0.tgz",
@@ -10809,117 +11919,6 @@
"integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
"devOptional": true
},
- "node_modules/tslint": {
- "version": "6.1.3",
- "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.3.tgz",
- "integrity": "sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg==",
- "deprecated": "TSLint has been deprecated in favor of ESLint. Please see https://github.com/palantir/tslint/issues/4534 for more information.",
- "dev": true,
- "dependencies": {
- "@babel/code-frame": "^7.0.0",
- "builtin-modules": "^1.1.1",
- "chalk": "^2.3.0",
- "commander": "^2.12.1",
- "diff": "^4.0.1",
- "glob": "^7.1.1",
- "js-yaml": "^3.13.1",
- "minimatch": "^3.0.4",
- "mkdirp": "^0.5.3",
- "resolve": "^1.3.2",
- "semver": "^5.3.0",
- "tslib": "^1.13.0",
- "tsutils": "^2.29.0"
- },
- "bin": {
- "tslint": "bin/tslint"
- },
- "engines": {
- "node": ">=4.8.0"
- },
- "peerDependencies": {
- "typescript": ">=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >=3.0.0-dev || >= 3.1.0-dev || >= 3.2.0-dev || >= 4.0.0-dev"
- }
- },
- "node_modules/tslint-no-circular-imports": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/tslint-no-circular-imports/-/tslint-no-circular-imports-0.7.0.tgz",
- "integrity": "sha512-k3wxpeMC4ef40UbpfBVHEHIzKfNZq5/SCtAO1YjGsaNTklo+K53/TWLrym+poA65RJFDiYgYNWvkeIIkJNA0Vw==",
- "dev": true,
- "peerDependencies": {
- "tslint": ">=5.0.0",
- "typescript": ">=2.1.0"
- }
- },
- "node_modules/tslint/node_modules/argparse": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
- "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
- "dev": true,
- "dependencies": {
- "sprintf-js": "~1.0.2"
- }
- },
- "node_modules/tslint/node_modules/commander": {
- "version": "2.20.3",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
- "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
- "dev": true
- },
- "node_modules/tslint/node_modules/diff": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
- "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
- "dev": true,
- "engines": {
- "node": ">=0.3.1"
- }
- },
- "node_modules/tslint/node_modules/js-yaml": {
- "version": "3.14.1",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
- "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
- "dev": true,
- "dependencies": {
- "argparse": "^1.0.7",
- "esprima": "^4.0.0"
- },
- "bin": {
- "js-yaml": "bin/js-yaml.js"
- }
- },
- "node_modules/tslint/node_modules/semver": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
- "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
- "dev": true,
- "bin": {
- "semver": "bin/semver"
- }
- },
- "node_modules/tslint/node_modules/tslib": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
- "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
- "dev": true
- },
- "node_modules/tsutils": {
- "version": "2.29.0",
- "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz",
- "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==",
- "dev": true,
- "dependencies": {
- "tslib": "^1.8.1"
- },
- "peerDependencies": {
- "typescript": ">=2.1.0 || >=2.1.0-dev || >=2.2.0-dev || >=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >= 3.0.0-dev || >= 3.1.0-dev"
- }
- },
- "node_modules/tsutils/node_modules/tslib": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
- "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
- "dev": true
- },
"node_modules/tunnel-agent": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
@@ -11519,9 +12518,9 @@
"integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA=="
},
"node_modules/typescript": {
- "version": "4.9.4",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz",
- "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==",
+ "version": "4.9.5",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz",
+ "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==",
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
@@ -11896,40 +12895,6 @@
"url": "https://github.com/sponsors/antfu"
}
},
- "node_modules/vite/node_modules/nanoid": {
- "version": "3.3.4",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz",
- "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==",
- "bin": {
- "nanoid": "bin/nanoid.cjs"
- },
- "engines": {
- "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
- }
- },
- "node_modules/vite/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==",
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/postcss"
- }
- ],
- "dependencies": {
- "nanoid": "^3.3.4",
- "picocolors": "^1.0.0",
- "source-map-js": "^1.0.2"
- },
- "engines": {
- "node": "^10 || ^12 || >=14"
- }
- },
"node_modules/vitefu": {
"version": "0.2.4",
"resolved": "https://registry.npmjs.org/vitefu/-/vitefu-0.2.4.tgz",
@@ -12404,6 +13369,12 @@
}
},
"dependencies": {
+ "@aashutoshrathi/word-wrap": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz",
+ "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==",
+ "dev": true
+ },
"@ampproject/remapping": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz",
@@ -13487,6 +14458,102 @@
"integrity": "sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw==",
"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": "2.1.0",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.0.tgz",
+ "integrity": "sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==",
+ "dev": true,
+ "requires": {
+ "ajv": "^6.12.4",
+ "debug": "^4.3.2",
+ "espree": "^9.6.0",
+ "globals": "^13.19.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^4.1.0",
+ "minimatch": "^3.1.2",
+ "strip-json-comments": "^3.1.1"
+ },
+ "dependencies": {
+ "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",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ }
+ },
+ "globals": {
+ "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"
+ }
+ },
+ "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
+ },
+ "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
+ }
+ }
+ },
+ "@eslint/js": {
+ "version": "8.44.0",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.44.0.tgz",
+ "integrity": "sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==",
+ "dev": true
+ },
+ "@humanwhocodes/config-array": {
+ "version": "0.11.10",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz",
+ "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==",
+ "dev": true,
+ "requires": {
+ "@humanwhocodes/object-schema": "^1.2.1",
+ "debug": "^4.1.1",
+ "minimatch": "^3.0.5"
+ }
+ },
+ "@humanwhocodes/module-importer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
+ "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
+ "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
+ },
"@jest/schemas": {
"version": "29.4.0",
"resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.0.tgz",
@@ -15090,9 +16157,9 @@
}
},
"@types/json-schema": {
- "version": "7.0.11",
- "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz",
- "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==",
+ "version": "7.0.12",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz",
+ "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==",
"dev": true
},
"@types/json5": {
@@ -15174,6 +16241,12 @@
"@types/node": "*"
}
},
+ "@types/semver": {
+ "version": "7.5.0",
+ "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz",
+ "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==",
+ "dev": true
+ },
"@types/showdown": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/@types/showdown/-/showdown-2.0.0.tgz",
@@ -15210,6 +16283,185 @@
"resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz",
"integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA=="
},
+ "@typescript-eslint/eslint-plugin": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.1.0.tgz",
+ "integrity": "sha512-qg7Bm5TyP/I7iilGyp6DRqqkt8na00lI6HbjWZObgk3FFSzH5ypRwAHXJhJkwiRtTcfn+xYQIMOR5kJgpo6upw==",
+ "dev": true,
+ "requires": {
+ "@eslint-community/regexpp": "^4.5.1",
+ "@typescript-eslint/scope-manager": "6.1.0",
+ "@typescript-eslint/type-utils": "6.1.0",
+ "@typescript-eslint/utils": "6.1.0",
+ "@typescript-eslint/visitor-keys": "6.1.0",
+ "debug": "^4.3.4",
+ "graphemer": "^1.4.0",
+ "ignore": "^5.2.4",
+ "natural-compare": "^1.4.0",
+ "natural-compare-lite": "^1.4.0",
+ "semver": "^7.5.4",
+ "ts-api-utils": "^1.0.1"
+ },
+ "dependencies": {
+ "lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "requires": {
+ "yallist": "^4.0.0"
+ }
+ },
+ "semver": {
+ "version": "7.5.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
+ "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+ "dev": true,
+ "requires": {
+ "lru-cache": "^6.0.0"
+ }
+ },
+ "yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
+ }
+ }
+ },
+ "@typescript-eslint/parser": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.1.0.tgz",
+ "integrity": "sha512-hIzCPvX4vDs4qL07SYzyomamcs2/tQYXg5DtdAfj35AyJ5PIUqhsLf4YrEIFzZcND7R2E8tpQIZKayxg8/6Wbw==",
+ "dev": true,
+ "requires": {
+ "@typescript-eslint/scope-manager": "6.1.0",
+ "@typescript-eslint/types": "6.1.0",
+ "@typescript-eslint/typescript-estree": "6.1.0",
+ "@typescript-eslint/visitor-keys": "6.1.0",
+ "debug": "^4.3.4"
+ }
+ },
+ "@typescript-eslint/scope-manager": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.1.0.tgz",
+ "integrity": "sha512-AxjgxDn27hgPpe2rQe19k0tXw84YCOsjDJ2r61cIebq1t+AIxbgiXKvD4999Wk49GVaAcdJ/d49FYel+Pp3jjw==",
+ "dev": true,
+ "requires": {
+ "@typescript-eslint/types": "6.1.0",
+ "@typescript-eslint/visitor-keys": "6.1.0"
+ }
+ },
+ "@typescript-eslint/type-utils": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.1.0.tgz",
+ "integrity": "sha512-kFXBx6QWS1ZZ5Ni89TyT1X9Ag6RXVIVhqDs0vZE/jUeWlBv/ixq2diua6G7ece6+fXw3TvNRxP77/5mOMusx2w==",
+ "dev": true,
+ "requires": {
+ "@typescript-eslint/typescript-estree": "6.1.0",
+ "@typescript-eslint/utils": "6.1.0",
+ "debug": "^4.3.4",
+ "ts-api-utils": "^1.0.1"
+ }
+ },
+ "@typescript-eslint/types": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.1.0.tgz",
+ "integrity": "sha512-+Gfd5NHCpDoHDOaU/yIF3WWRI2PcBRKKpP91ZcVbL0t5tQpqYWBs3z/GGhvU+EV1D0262g9XCnyqQh19prU0JQ==",
+ "dev": true
+ },
+ "@typescript-eslint/typescript-estree": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.1.0.tgz",
+ "integrity": "sha512-nUKAPWOaP/tQjU1IQw9sOPCDavs/iU5iYLiY/6u7gxS7oKQoi4aUxXS1nrrVGTyBBaGesjkcwwHkbkiD5eBvcg==",
+ "dev": true,
+ "requires": {
+ "@typescript-eslint/types": "6.1.0",
+ "@typescript-eslint/visitor-keys": "6.1.0",
+ "debug": "^4.3.4",
+ "globby": "^11.1.0",
+ "is-glob": "^4.0.3",
+ "semver": "^7.5.4",
+ "ts-api-utils": "^1.0.1"
+ },
+ "dependencies": {
+ "lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "requires": {
+ "yallist": "^4.0.0"
+ }
+ },
+ "semver": {
+ "version": "7.5.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
+ "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+ "dev": true,
+ "requires": {
+ "lru-cache": "^6.0.0"
+ }
+ },
+ "yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
+ }
+ }
+ },
+ "@typescript-eslint/utils": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.1.0.tgz",
+ "integrity": "sha512-wp652EogZlKmQoMS5hAvWqRKplXvkuOnNzZSE0PVvsKjpexd/XznRVHAtrfHFYmqaJz0DFkjlDsGYC9OXw+OhQ==",
+ "dev": true,
+ "requires": {
+ "@eslint-community/eslint-utils": "^4.4.0",
+ "@types/json-schema": "^7.0.12",
+ "@types/semver": "^7.5.0",
+ "@typescript-eslint/scope-manager": "6.1.0",
+ "@typescript-eslint/types": "6.1.0",
+ "@typescript-eslint/typescript-estree": "6.1.0",
+ "semver": "^7.5.4"
+ },
+ "dependencies": {
+ "lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "requires": {
+ "yallist": "^4.0.0"
+ }
+ },
+ "semver": {
+ "version": "7.5.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
+ "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+ "dev": true,
+ "requires": {
+ "lru-cache": "^6.0.0"
+ }
+ },
+ "yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
+ }
+ }
+ },
+ "@typescript-eslint/visitor-keys": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.1.0.tgz",
+ "integrity": "sha512-yQeh+EXhquh119Eis4k0kYhj9vmFzNpbhM3LftWQVwqVjipCkwHBQOZutcYW+JVkjtTG9k8nrZU1UoNedPDd1A==",
+ "dev": true,
+ "requires": {
+ "@typescript-eslint/types": "6.1.0",
+ "eslint-visitor-keys": "^3.4.1"
+ }
+ },
"@ungap/promise-all-settled": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz",
@@ -15448,6 +16700,12 @@
"resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz",
"integrity": "sha512-H3LU5RLiSsGXPhN+Nipar0iR0IofH+8r89G2y1tBKxQ/agagKyAjhkAFDRBfodP2caPrNKHpAWNIM/c9yeL7uA=="
},
+ "array-union": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
+ "dev": true
+ },
"asn1": {
"version": "0.2.6",
"resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz",
@@ -15682,12 +16940,6 @@
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
"integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="
},
- "builtin-modules": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
- "integrity": "sha512-wxXCdllwGhI2kCC0MnvTGYTMvnVZTvqgypkiTI8Pa5tcz2i6VqsqwYGgqwXji+4RgCzms6EajE4IxiUH6HH8nQ==",
- "dev": true
- },
"bytewise": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/bytewise/-/bytewise-1.1.0.tgz",
@@ -16045,6 +17297,17 @@
"integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==",
"devOptional": true
},
+ "cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "dev": true,
+ "requires": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ }
+ },
"css-line-break": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/css-line-break/-/css-line-break-2.1.0.tgz",
@@ -16414,6 +17677,15 @@
"resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz",
"integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w=="
},
+ "dir-glob": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+ "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+ "dev": true,
+ "requires": {
+ "path-type": "^4.0.0"
+ }
+ },
"dlv": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
@@ -16432,6 +17704,15 @@
"typescript": "^4.6.2"
}
},
+ "doctrine": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+ "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+ "dev": true,
+ "requires": {
+ "esutils": "^2.0.2"
+ }
+ },
"dom-serializer": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz",
@@ -16647,17 +17928,297 @@
"source-map": "~0.6.1"
}
},
+ "eslint": {
+ "version": "8.45.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.45.0.tgz",
+ "integrity": "sha512-pd8KSxiQpdYRfYa9Wufvdoct3ZPQQuVuU5O6scNgMuOMYuxvH0IGaYK0wUFjo4UYYQQCUndlXiMbnxopwvvTiw==",
+ "dev": true,
+ "requires": {
+ "@eslint-community/eslint-utils": "^4.2.0",
+ "@eslint-community/regexpp": "^4.4.0",
+ "@eslint/eslintrc": "^2.1.0",
+ "@eslint/js": "8.44.0",
+ "@humanwhocodes/config-array": "^0.11.10",
+ "@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.2.0",
+ "eslint-visitor-keys": "^3.4.1",
+ "espree": "^9.6.0",
+ "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.2",
+ "globals": "^13.19.0",
+ "graphemer": "^1.4.0",
+ "ignore": "^5.2.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "is-path-inside": "^3.0.3",
+ "js-yaml": "^4.1.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "levn": "^0.4.1",
+ "lodash.merge": "^4.6.2",
+ "minimatch": "^3.1.2",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.3",
+ "strip-ansi": "^6.0.1",
+ "text-table": "^0.2.0"
+ },
+ "dependencies": {
+ "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",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ }
+ },
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true
+ },
+ "glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "dev": true,
+ "requires": {
+ "is-glob": "^4.0.3"
+ }
+ },
+ "globals": {
+ "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"
+ }
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "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
+ },
+ "levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ }
+ },
+ "optionator": {
+ "version": "0.9.3",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz",
+ "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==",
+ "dev": true,
+ "requires": {
+ "@aashutoshrathi/word-wrap": "^1.2.3",
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0"
+ }
+ },
+ "prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ },
+ "type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "^1.2.1"
+ }
+ },
+ "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
+ }
+ }
+ },
+ "eslint-plugin-svelte": {
+ "version": "2.32.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-svelte/-/eslint-plugin-svelte-2.32.2.tgz",
+ "integrity": "sha512-Jgbop2fNZsoxxkklZAIbDNhwAPynvnCtUXLsEC6O2qax7N/pfe2cNqT0ZoBbubXKJitQQDEyVDQ1rZs4ZWcrTA==",
+ "dev": true,
+ "requires": {
+ "@eslint-community/eslint-utils": "^4.2.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14",
+ "debug": "^4.3.1",
+ "esutils": "^2.0.3",
+ "known-css-properties": "^0.27.0",
+ "postcss": "^8.4.5",
+ "postcss-load-config": "^3.1.4",
+ "postcss-safe-parser": "^6.0.0",
+ "postcss-selector-parser": "^6.0.11",
+ "semver": "^7.5.3",
+ "svelte-eslint-parser": "^0.32.0"
+ },
+ "dependencies": {
+ "lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "requires": {
+ "yallist": "^4.0.0"
+ }
+ },
+ "semver": {
+ "version": "7.5.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
+ "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+ "dev": true,
+ "requires": {
+ "lru-cache": "^6.0.0"
+ }
+ },
+ "yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
+ }
+ }
+ },
+ "eslint-scope": {
+ "version": "7.2.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.1.tgz",
+ "integrity": "sha512-CvefSOsDdaYYvxChovdrPo/ZGt8d5lrJWleAc1diXRKhHGiTYEI26cvo8Kle/wGnsizoCJjK73FMg1/IkIwiNA==",
+ "dev": true,
+ "requires": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ }
+ },
+ "eslint-visitor-keys": {
+ "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.6.1",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz",
+ "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
+ "dev": true,
+ "requires": {
+ "acorn": "^8.9.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^3.4.1"
+ },
+ "dependencies": {
+ "acorn": {
+ "version": "8.10.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz",
+ "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==",
+ "dev": true
+ }
+ }
+ },
"esprima": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
"integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="
},
+ "esquery": {
+ "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"
+ }
+ },
+ "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"
+ }
+ },
"estraverse": {
"version": "5.3.0",
"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
"integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
- "optional": true,
- "peer": true
+ "devOptional": true
},
"estree-walker": {
"version": "2.0.2",
@@ -16873,6 +18434,15 @@
"escape-string-regexp": "^1.0.5"
}
},
+ "file-entry-cache": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+ "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
+ "dev": true,
+ "requires": {
+ "flat-cache": "^3.0.4"
+ }
+ },
"fill-range": {
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
@@ -16895,6 +18465,33 @@
"resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz",
"integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ=="
},
+ "flat-cache": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
+ "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
+ "dev": true,
+ "requires": {
+ "flatted": "^3.1.0",
+ "rimraf": "^3.0.2"
+ },
+ "dependencies": {
+ "rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "dev": true,
+ "requires": {
+ "glob": "^7.1.3"
+ }
+ }
+ }
+ },
+ "flatted": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz",
+ "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==",
+ "dev": true
+ },
"follow-redirects": {
"version": "1.15.2",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz",
@@ -17149,6 +18746,20 @@
"integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
"dev": true
},
+ "globby": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
+ "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
+ "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"
+ }
+ },
"gopd": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
@@ -17163,6 +18774,12 @@
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
"integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA=="
},
+ "graphemer": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
+ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
+ "dev": true
+ },
"growl": {
"version": "1.10.5",
"resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz",
@@ -17411,6 +19028,12 @@
"resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
"integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="
},
+ "ignore": {
+ "version": "5.2.4",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz",
+ "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==",
+ "dev": true
+ },
"immutable": {
"version": "4.2.2",
"resolved": "https://registry.npmjs.org/immutable/-/immutable-4.2.2.tgz",
@@ -17427,6 +19050,12 @@
"resolve-from": "^4.0.0"
}
},
+ "imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+ "dev": true
+ },
"incremental-convex-hull": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/incremental-convex-hull/-/incremental-convex-hull-1.0.1.tgz",
@@ -17621,6 +19250,12 @@
"define-properties": "^1.1.3"
}
},
+ "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",
"resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
@@ -17830,11 +19465,6 @@
"integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
"dev": true
},
- "jshashes": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/jshashes/-/jshashes-1.0.8.tgz",
- "integrity": "sha512-btmQZ/w1rj8Lb6nEwvhjM7nBYoj54yaEFo2PWh3RkxZ8qNwuvOxvQYN/JxVuwoMmdIluL+XwYVJ+pEEZoSYybQ=="
- },
"json-schema": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
@@ -17855,6 +19485,12 @@
"jsonify": "^0.0.1"
}
},
+ "json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
+ "dev": true
+ },
"json-stringify-pretty-compact": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/json-stringify-pretty-compact/-/json-stringify-pretty-compact-3.0.0.tgz",
@@ -17968,6 +19604,12 @@
"integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==",
"dev": true
},
+ "known-css-properties": {
+ "version": "0.27.0",
+ "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.27.0.tgz",
+ "integrity": "sha512-uMCj6+hZYDoffuvAJjFAPz56E9uoowFHmTkqRtRq5WyC5Q6Cu/fTZKNQpX/RbzChBYLLl3lo8CjFZBAZXq9qFg==",
+ "dev": true
+ },
"latlon2country": {
"version": "1.2.6",
"resolved": "https://registry.npmjs.org/latlon2country/-/latlon2country-1.2.6.tgz",
@@ -18022,6 +19664,12 @@
"integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==",
"dev": true
},
+ "lodash.merge": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+ "dev": true
+ },
"log-symbols": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
@@ -18401,6 +20049,18 @@
"integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==",
"dev": true
},
+ "natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+ "dev": true
+ },
+ "natural-compare-lite": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz",
+ "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==",
+ "dev": true
+ },
"neo-async": {
"version": "2.6.2",
"resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
@@ -18513,14 +20173,6 @@
"resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
"integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="
},
- "ohauth": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/ohauth/-/ohauth-1.0.1.tgz",
- "integrity": "sha512-R9ZUN3+FVCwzeOOHCJpzA9jw/byRxp5O9X06mTL6Sp/LIQn/rLrMv6cwYctX+hoIKzRUsalGJXZ1kG5wBmSskQ==",
- "requires": {
- "jshashes": "~1.0.8"
- }
- },
"once": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
@@ -18651,12 +20303,10 @@
"dev": true
},
"osm-auth": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/osm-auth/-/osm-auth-1.1.2.tgz",
- "integrity": "sha512-oLaU+c/TP7eKAZpBN4S1mv/N94IXp5A+wLpDfAVlpq/b6iikas8ZthXPqhM8QKg/qB8RaKvZPJgxqYS+5m8G8g==",
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/osm-auth/-/osm-auth-2.2.0.tgz",
+ "integrity": "sha512-x93jAMaYWqPgfVeOMydFLFpFC8ERnlIKXwiUOrYYWTDEWqq15K/BI5UAjzuYXvLg0WxVxM8YC4N1T30SZeKJBQ==",
"requires": {
- "ohauth": "~1.0.1",
- "resolve-url": "~0.2.1",
"store": "~2.0.12"
}
},
@@ -18732,11 +20382,23 @@
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
"integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg=="
},
+ "path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true
+ },
"path-parse": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
},
+ "path-type": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+ "dev": true
+ },
"pathe": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.0.tgz",
@@ -18816,6 +20478,46 @@
"splaytree": "^3.1.0"
}
},
+ "postcss": {
+ "version": "8.4.26",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.26.tgz",
+ "integrity": "sha512-jrXHFF8iTloAenySjM/ob3gSj7pCu0Ji49hnjqzsgSRa50hkWCKD0HQ+gMNJkW38jBI68MpAAg7ZWwHwX8NMMw==",
+ "requires": {
+ "nanoid": "^3.3.6",
+ "picocolors": "^1.0.0",
+ "source-map-js": "^1.0.2"
+ },
+ "dependencies": {
+ "nanoid": {
+ "version": "3.3.6",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz",
+ "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA=="
+ }
+ }
+ },
+ "postcss-load-config": {
+ "version": "3.1.4",
+ "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz",
+ "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==",
+ "requires": {
+ "lilconfig": "^2.0.5",
+ "yaml": "^1.10.2"
+ }
+ },
+ "postcss-safe-parser": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz",
+ "integrity": "sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==",
+ "dev": true,
+ "requires": {}
+ },
+ "postcss-scss": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.6.tgz",
+ "integrity": "sha512-rLDPhJY4z/i4nVFZ27j9GqLxj1pwxE80eAzUNRMXtcpipFYIeowerzBgG3yJhMtObGEXidtIgbUpQ3eLDsf5OQ==",
+ "dev": true,
+ "requires": {}
+ },
"postcss-selector-parser": {
"version": "6.0.11",
"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz",
@@ -19236,11 +20938,6 @@
"protocol-buffers-schema": "^3.3.1"
}
},
- "resolve-url": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
- "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg=="
- },
"restore-cursor": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
@@ -19553,6 +21250,21 @@
}
}
},
+ "shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "requires": {
+ "shebang-regex": "^3.0.0"
+ }
+ },
+ "shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true
+ },
"showdown": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/showdown/-/showdown-2.1.0.tgz",
@@ -19632,6 +21344,12 @@
"resolved": "https://registry.npmjs.org/skmeans/-/skmeans-0.9.7.tgz",
"integrity": "sha512-hNj1/oZ7ygsfmPZ7ZfN5MUBRoGg1gtpnImuJBgLO0ljQ67DtJuiQaiYdS4lUA6s0KCwnPhGivtC/WRwIZLkHyg=="
},
+ "slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "dev": true
+ },
"slice-ansi": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz",
@@ -19739,12 +21457,6 @@
}
}
},
- "sprintf-js": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
- "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
- "dev": true
- },
"sshpk": {
"version": "1.17.0",
"resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz",
@@ -19878,9 +21590,9 @@
"integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="
},
"svelte": {
- "version": "3.55.1",
- "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.55.1.tgz",
- "integrity": "sha512-S+87/P0Ve67HxKkEV23iCdAh/SX1xiSfjF1HOglno/YTbSTW7RniICMCofWGdJJbdjw3S+0PfFb1JtGfTXE0oQ=="
+ "version": "3.59.2",
+ "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.59.2.tgz",
+ "integrity": "sha512-vzSyuGr3eEoAtT/A6bmajosJZIUWySzY2CzB3w2pgPvnkUjGqlDnsNnA0PMO+mMAhuyMul6C2uuZzY6ELSkzyA=="
},
"svelte-check": {
"version": "3.0.3",
@@ -19898,6 +21610,19 @@
"typescript": "^4.9.4"
}
},
+ "svelte-eslint-parser": {
+ "version": "0.32.1",
+ "resolved": "https://registry.npmjs.org/svelte-eslint-parser/-/svelte-eslint-parser-0.32.1.tgz",
+ "integrity": "sha512-GCSfeIzdgk53CaOzK+s/+l2igfTno3mWGkwoDYAwPes/rD9Al2fc7ksfopjx5UL87S7dw1eL73F6wNYiiuhzIA==",
+ "dev": true,
+ "requires": {
+ "eslint-scope": "^7.0.0",
+ "eslint-visitor-keys": "^3.0.0",
+ "espree": "^9.0.0",
+ "postcss": "^8.4.25",
+ "postcss-scss": "^4.0.6"
+ }
+ },
"svelte-hmr": {
"version": "0.15.1",
"resolved": "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.15.1.tgz",
@@ -19983,21 +21708,6 @@
"is-glob": "^4.0.3"
}
},
- "nanoid": {
- "version": "3.3.4",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz",
- "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw=="
- },
- "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==",
- "requires": {
- "nanoid": "^3.3.4",
- "picocolors": "^1.0.0",
- "source-map-js": "^1.0.2"
- }
- },
"postcss-import": {
"version": "14.1.0",
"resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz",
@@ -20016,15 +21726,6 @@
"camelcase-css": "^2.0.1"
}
},
- "postcss-load-config": {
- "version": "3.1.4",
- "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz",
- "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==",
- "requires": {
- "lilconfig": "^2.0.5",
- "yaml": "^1.10.2"
- }
- },
"postcss-nested": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.0.tgz",
@@ -20108,6 +21809,12 @@
"utrie": "^1.0.2"
}
},
+ "text-table": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
+ "dev": true
+ },
"through": {
"version": "2.3.8",
"resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
@@ -20231,6 +21938,13 @@
"punycode": "^2.3.0"
}
},
+ "ts-api-utils": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.1.tgz",
+ "integrity": "sha512-lC/RGlPmwdrIBFTX59wwNzqh7aR2otPNPR/5brHZm/XKFYKsfqxihXUe9pU3JI+3vGkl+vyCoNNnPhJn3aLK1A==",
+ "dev": true,
+ "requires": {}
+ },
"ts-json-schema-generator": {
"version": "0.95.0",
"resolved": "https://registry.npmjs.org/ts-json-schema-generator/-/ts-json-schema-generator-0.95.0.tgz",
@@ -20392,96 +22106,6 @@
"integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
"devOptional": true
},
- "tslint": {
- "version": "6.1.3",
- "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.3.tgz",
- "integrity": "sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg==",
- "dev": true,
- "requires": {
- "@babel/code-frame": "^7.0.0",
- "builtin-modules": "^1.1.1",
- "chalk": "^2.3.0",
- "commander": "^2.12.1",
- "diff": "^4.0.1",
- "glob": "^7.1.1",
- "js-yaml": "^3.13.1",
- "minimatch": "^3.0.4",
- "mkdirp": "^0.5.3",
- "resolve": "^1.3.2",
- "semver": "^5.3.0",
- "tslib": "^1.13.0",
- "tsutils": "^2.29.0"
- },
- "dependencies": {
- "argparse": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
- "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
- "dev": true,
- "requires": {
- "sprintf-js": "~1.0.2"
- }
- },
- "commander": {
- "version": "2.20.3",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
- "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
- "dev": true
- },
- "diff": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
- "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
- "dev": true
- },
- "js-yaml": {
- "version": "3.14.1",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
- "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
- "dev": true,
- "requires": {
- "argparse": "^1.0.7",
- "esprima": "^4.0.0"
- }
- },
- "semver": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
- "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
- "dev": true
- },
- "tslib": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
- "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
- "dev": true
- }
- }
- },
- "tslint-no-circular-imports": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/tslint-no-circular-imports/-/tslint-no-circular-imports-0.7.0.tgz",
- "integrity": "sha512-k3wxpeMC4ef40UbpfBVHEHIzKfNZq5/SCtAO1YjGsaNTklo+K53/TWLrym+poA65RJFDiYgYNWvkeIIkJNA0Vw==",
- "dev": true,
- "requires": {}
- },
- "tsutils": {
- "version": "2.29.0",
- "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz",
- "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==",
- "dev": true,
- "requires": {
- "tslib": "^1.8.1"
- },
- "dependencies": {
- "tslib": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
- "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
- "dev": true
- }
- }
- },
"tunnel-agent": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
@@ -21015,9 +22639,9 @@
"integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA=="
},
"typescript": {
- "version": "4.9.4",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz",
- "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg=="
+ "version": "4.9.5",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz",
+ "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g=="
},
"typescript-json-schema": {
"version": "0.50.1",
@@ -21248,23 +22872,6 @@
"postcss": "^8.4.20",
"resolve": "^1.22.1",
"rollup": "^3.7.0"
- },
- "dependencies": {
- "nanoid": {
- "version": "3.3.4",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz",
- "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw=="
- },
- "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==",
- "requires": {
- "nanoid": "^3.3.4",
- "picocolors": "^1.0.0",
- "source-map-js": "^1.0.2"
- }
- }
}
},
"vite-node": {
@@ -21605,4 +23212,4 @@
"integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="
}
}
-}
+}
\ No newline at end of file
diff --git a/package.json b/package.json
index 20ce152ef..fff429293 100644
--- a/package.json
+++ b/package.json
@@ -1,18 +1,58 @@
{
"name": "mapcomplete",
- "version": "0.31.4",
+ "version": "0.32.0",
"repository": "https://github.com/pietervdvn/MapComplete",
"description": "A small website to edit OSM easily",
"bugs": "https://github.com/pietervdvn/MapComplete/issues",
"homepage": "https://mapcomplete.org",
"main": "index.ts",
"type": "module",
+ "config": {
+ "#": "Various endpoints that are instance-specific",
+ "#oauth_credentials:comment": [
+ "`oauth_credentials` are the OAuth-2 credentials for the production-OSM server and the test-server.",
+ "Are you deploying your own instance? Register your application too.",
+ "See https://wiki.openstreetmap.org/wiki/OAuth#Registering_your_application_as_OAuth_2.0_consumer for instructions",
+ "Use `https:////land.html` as redirect URIs. You can add `http://127.0.0.1:1234/land.html` too for local development.",
+ "Alternatively, you can override the `osm` credentials using the environment variables `VITE_OSM_OAUTH_CLIENT_ID` and `VITE_OSM_OAUTH_SECRET`"
+ ],
+ "oauth_credentials": {
+ "osm_pietervdvn": {
+ "#": "This client_id is registered by 'Pieter Vander Vennet' on OSM.org",
+ "oauth_client_id": "sa1ngLJBJ8McmzHElN8NYtIDm5TZTYEYhq3-0snO4Qc",
+ "oauth_secret": "XU_cD5Mvw9VKk9T0t_gO8V7cbRC4Hmw2Tb4Rv0Zmz-U",
+ "url": "https://www.openstreetmap.org"
+ },
+ "osm": {
+ "#": "This client-id is registered by 'MapComplete' on osm.org",
+ "oauth_client_id": "K93H1d8ve7p-tVLE1ZwsQ4lAFLQk8INx5vfTLMu5DWk",
+ "oauth_secret": "NBWGhWDrD3QDB35xtVuxv4aExnmIt4FA_WgeLtwxasg",
+ "url": "https://www.openstreetmap.org"
+ },
+ "osm-test": {
+ "oauth_client_id": "HwUn6GPxGm1m9WwMarxTglhy6dBTM4YkaV1I9h6pDGU",
+ "oauth_secret": "luFZtPJg7j96K6WM6RpcZ_3M-r6muuDq6fG1ygk0I_4",
+ "url": "https://master.apis.dev.openstreetmap.org"
+ }
+ },
+ "api_keys": {
+ "#": "Various API-keys for various services. Feel free to reuse those in another MapComplete-hosted version",
+ "imgur": "7070e7167f0a25a",
+ "mapillary_v4": "MLY|4441509239301885|b40ad2d3ea105435bd40c7e76993ae85"
+ },
+ "default_overpass_urls": [
+ "https://overpass-api.de/api/interpreter",
+ "https://overpass.kumi.systems/api/interpreter",
+ "https://overpass.openstreetmap.ru/cgi/interpreter"
+ ],
+ "country_coder_host": "https://raw.githubusercontent.com/pietervdvn/MapComplete-data/main/latlon2country"
+ },
"scripts": {
"start": "npm run generate:layeroverview && npm run strt",
"strt": "vite --host",
"strttest": "export NODE_OPTIONS=--max_old_space_size=8364 && parcel serve test.html assets/templates/*.svg assets/templates/fonts/*.ttf",
"watch:css": "tailwindcss -i index.css -o public/css/index-tailwind-output.css --watch",
- "generate:css": "tailwindcss -i index.css -o public/css/index-tailwind-output.css",
+ "generate:css": "tailwindcss -i src/index.css -o public/css/index-tailwind-output.css",
"generate:doctests": "doctest-ts-improved . --ignore .*.spec.ts --ignore .*ConfigJson.ts",
"test:run-only": "vitest --run test",
"test": " export NODE_OPTIONS=\"--max-old-space-size=8192\" && npm run clean:tests && (npm run generate:doctests 2>&1 | grep -v \"No doctests found in\") && npm run test:run-only && npm run clean:tests",
@@ -27,6 +67,7 @@
"generate:cache:speelplekken": "npm run generate:layeroverview && vite-node scripts/generateCache.ts -- speelplekken 14 ../MapComplete-data/speelplekken_cache/ 51.20 4.35 51.09 4.56",
"generate:cache:natuurpunt": "npm run generate:layeroverview && vite-node scripts/generateCache.ts -- natuurpunt 12 ../MapComplete-data/natuurpunt_cache/ 50.40 2.1 51.54 6.4 --generate-point-overview nature_reserve,visitor_information_centre",
"generate:layeroverview": "export NODE_OPTIONS=\"--max-old-space-size=8192\" && vite-node scripts/generateLayerOverview.ts",
+ "generate:mapcomplete-changes-theme": "export NODE_OPTIONS=\"--max-old-space-size=8192\" && vite-node scripts/generateLayerOverview.ts -- --generate-change-map",
"refresh:layeroverview": "export NODE_OPTIONS=\"--max-old-space-size=8192\" && vite-node scripts/generateLayerOverview.ts -- --force",
"generate:licenses": "vite-node scripts/generateLicenseInfo.ts -- --no-fail",
"query:licenses": "vite-node scripts/generateLicenseInfo.ts -- --query",
@@ -39,6 +80,9 @@
"generate": "mkdir -p ./assets/generated; npm run generate:licenses; npm run generate:images; npm run generate:charging-stations; npm run generate:translations; npm run reset:layeroverview; npm run generate:service-worker",
"generate:charging-stations": "cd ./assets/layers/charging_station && vite-node csvToJson.ts && cd -",
"prepare-deploy": "npm run generate:service-worker && ./scripts/build.sh",
+ "lint": "npm run lint:prettier && npm run lint:eslint",
+ "lint:eslint": "eslint ./src",
+ "lint:prettier": "prettier --check '**/*.ts' '**/*.svelte'",
"format": "prettier --write '**/*.ts' '**/*.svelte'",
"clean:tests": "find . -type f -name \"*.doctest.ts\" | xargs -r rm",
"clean": "rm -rf .cache/ && (find *.html | grep -v \"^\\(404\\|index\\|land\\|test\\|studio\\|theme\\|style_test\\|statistics\\).html\" | xargs -r rm) && (ls | grep \"^index_[a-zA-Z_-]\\+\\.ts$\" | xargs -r rm)",
@@ -93,7 +137,7 @@
"mangrove-reviews-typescript": "^1.1.0",
"maplibre-gl": "^3.2.0",
"opening_hours": "^3.6.0",
- "osm-auth": "^1.0.2",
+ "osm-auth": "^2.2.0",
"osmtogeojson": "^3.0.0-beta.5",
"papaparse": "^5.3.1",
"pic4carto": "^2.1.15",
@@ -125,9 +169,13 @@
"@types/prompt-sync": "^4.1.0",
"@types/wikidata-sdk": "^6.1.0",
"@types/xml2js": "^0.4.9",
+ "@typescript-eslint/eslint-plugin": "^6.1.0",
+ "@typescript-eslint/parser": "^6.1.0",
"assert": "^2.0.0",
"chai": "^4.3.6",
"dependency-cruiser": "^10.4.0",
+ "eslint": "^8.45.0",
+ "eslint-plugin-svelte": "^2.32.2",
"fs": "0.0.1-security",
"node-html-parser": "^6.1.5",
"prettier": "^2.8.8",
@@ -142,8 +190,6 @@
"ts-node": "^10.9.1",
"ts2json-schema": "^1.4.0",
"tslib": "^2.5.0",
- "tslint": "^6.1.3",
- "tslint-no-circular-imports": "^0.7.0",
"typescript": "^4.7.4",
"vite": "^4.0.5"
}
diff --git a/public/css/index-tailwind-output.css b/public/css/index-tailwind-output.css
index e2b1f304b..91a0cd7e0 100644
--- a/public/css/index-tailwind-output.css
+++ b/public/css/index-tailwind-output.css
@@ -698,13 +698,6 @@ video {
position: sticky;
}
-.inset-0 {
- top: 0px;
- right: 0px;
- bottom: 0px;
- left: 0px;
-}
-
.-inset-1 {
top: -0.25rem;
right: -0.25rem;
@@ -744,26 +737,6 @@ video {
bottom: 0px;
}
-.top-12 {
- top: 3rem;
-}
-
-.left-3 {
- left: 0.75rem;
-}
-
-.top-3 {
- top: 0.75rem;
-}
-
-.right-2 {
- right: 0.5rem;
-}
-
-.bottom-3 {
- bottom: 0.75rem;
-}
-
.right-1\/3 {
right: 33.333333%;
}
@@ -780,14 +753,6 @@ video {
top: 2.5rem;
}
-.left-1\/2 {
- left: 50%;
-}
-
-.top-1\/2 {
- top: 50%;
-}
-
.isolate {
isolation: isolate;
}
@@ -874,6 +839,11 @@ video {
margin-right: 0.5rem;
}
+.my-1 {
+ margin-top: 0.25rem;
+ margin-bottom: 0.25rem;
+}
+
.mx-4 {
margin-left: 1rem;
margin-right: 1rem;
@@ -896,10 +866,6 @@ video {
margin-right: 1.5rem;
}
-.mt-6 {
- margin-top: 1.5rem;
-}
-
.mt-1 {
margin-top: 0.25rem;
}
@@ -976,14 +942,6 @@ video {
margin-left: -1.5rem;
}
-.-ml-12 {
- margin-left: -3rem;
-}
-
-.-mt-12 {
- margin-top: -3rem;
-}
-
.mr-3 {
margin-right: 0.75rem;
}
@@ -1122,11 +1080,6 @@ video {
height: 1rem;
}
-.h-min {
- height: -webkit-min-content;
- height: min-content;
-}
-
.h-1\/2 {
height: 50%;
}
@@ -1328,23 +1281,6 @@ video {
animation: spin 1s linear infinite;
}
-@-webkit-keyframes pulse {
- 50% {
- opacity: .5;
- }
-}
-
-@keyframes pulse {
- 50% {
- opacity: .5;
- }
-}
-
-.animate-pulse {
- -webkit-animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
- animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
-}
-
.cursor-pointer {
cursor: pointer;
}
@@ -1458,6 +1394,12 @@ video {
column-gap: 0.25rem;
}
+.space-x-1 > :not([hidden]) ~ :not([hidden]) {
+ --tw-space-x-reverse: 0;
+ margin-right: calc(0.25rem * var(--tw-space-x-reverse));
+ margin-left: calc(0.25rem * calc(1 - var(--tw-space-x-reverse)));
+}
+
.space-y-reverse > :not([hidden]) ~ :not([hidden]) {
--tw-space-y-reverse: 1;
}
@@ -1506,8 +1448,8 @@ video {
overflow: hidden;
}
-.overflow-scroll {
- overflow: scroll;
+.overflow-x-auto {
+ overflow-x: auto;
}
.overflow-y-auto {
@@ -1557,18 +1499,14 @@ video {
border-radius: 1rem;
}
-.rounded-3xl {
- border-radius: 1.5rem;
+.rounded-md {
+ border-radius: 0.375rem;
}
.rounded-lg {
border-radius: 0.5rem;
}
-.rounded-md {
- border-radius: 0.375rem;
-}
-
.rounded-sm {
border-radius: 0.125rem;
}
@@ -1699,11 +1637,6 @@ video {
background-color: rgb(255 255 255 / var(--tw-bg-opacity));
}
-.bg-red-500 {
- --tw-bg-opacity: 1;
- background-color: rgb(239 68 68 / var(--tw-bg-opacity));
-}
-
.bg-black {
--tw-bg-opacity: 1;
background-color: rgb(0 0 0 / var(--tw-bg-opacity));
@@ -1740,10 +1673,6 @@ video {
padding: 0.5rem;
}
-.p-3 {
- padding: 0.75rem;
-}
-
.p-4 {
padding: 1rem;
}
@@ -1780,6 +1709,11 @@ video {
padding-right: 0.5rem;
}
+.py-2 {
+ padding-top: 0.5rem;
+ padding-bottom: 0.5rem;
+}
+
.pl-1 {
padding-left: 0.25rem;
}
@@ -1788,10 +1722,6 @@ video {
padding-right: 0.5rem;
}
-.pl-3 {
- padding-left: 0.75rem;
-}
-
.pl-2 {
padding-left: 0.5rem;
}
@@ -1820,6 +1750,10 @@ video {
padding-left: 1rem;
}
+.pl-3 {
+ padding-left: 0.75rem;
+}
+
.pr-0 {
padding-right: 0px;
}
@@ -1879,11 +1813,6 @@ video {
line-height: 1.5rem;
}
-.text-xs {
- font-size: 0.75rem;
- line-height: 1rem;
-}
-
.font-bold {
font-weight: 700;
}
@@ -2122,12 +2051,6 @@ video {
backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);
}
-.transition-colors {
- transition-property: color, background-color, border-color, text-decoration-color, fill, stroke;
- transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
- transition-duration: 150ms;
-}
-
.transition {
transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, -webkit-transform, -webkit-filter, -webkit-backdrop-filter;
transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter;
@@ -2136,6 +2059,12 @@ video {
transition-duration: 150ms;
}
+.transition-colors {
+ transition-property: color, background-color, border-color, text-decoration-color, fill, stroke;
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+ transition-duration: 150ms;
+}
+
.ease-in-out {
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
}
@@ -2736,10 +2665,6 @@ a.link-underline {
}
@media (min-width: 640px) {
- .sm\:top-3 {
- top: 0.75rem;
- }
-
.sm\:m-2 {
margin: 0.5rem;
}
@@ -2778,40 +2703,18 @@ a.link-underline {
height: 6rem;
}
- .sm\:w-fit {
- width: -webkit-fit-content;
- width: -moz-fit-content;
- width: fit-content;
- }
-
.sm\:w-24 {
width: 6rem;
}
- .sm\:max-w-sm {
- max-width: 24rem;
- }
-
.sm\:max-w-xl {
max-width: 36rem;
}
- .sm\:flex-row {
- flex-direction: row;
- }
-
- .sm\:flex-wrap {
- flex-wrap: wrap;
- }
-
.sm\:flex-nowrap {
flex-wrap: nowrap;
}
- .sm\:items-start {
- align-items: flex-start;
- }
-
.sm\:items-stretch {
align-items: stretch;
}
@@ -2832,10 +2735,6 @@ a.link-underline {
padding: 0.5rem;
}
- .sm\:pl-0 {
- padding-left: 0px;
- }
-
.sm\:pt-1 {
padding-top: 0.25rem;
}
@@ -2901,10 +2800,6 @@ a.link-underline {
width: 2rem;
}
- .md\:w-1\/3 {
- width: 33.333333%;
- }
-
.md\:w-6\/12 {
width: 50%;
}
diff --git a/scripts/@types/eli.ts b/scripts/@types/eli.ts
new file mode 100644
index 000000000..87e1f85af
--- /dev/null
+++ b/scripts/@types/eli.ts
@@ -0,0 +1,213 @@
+import { Feature, FeatureCollection } from "geojson"
+
+export interface Eli extends FeatureCollection {
+ features: EliEntry[]
+}
+
+export interface EliEntry extends Feature {
+ properties: {
+ /**
+ * The name of the imagery source
+ */
+ name: string
+
+ /**
+ * Whether the imagery name should be translated
+ */
+ i18n?: boolean
+
+ /**
+ * Type of layer
+ */
+ type: "tms" | "wms" | "bing" | "scanex" | "wms_endpoint" | "wmts"
+
+ /**
+ * A rough categorisation of different types of layers.
+ * @see https://github.com/osmlab/editor-layer-index/blob/gh-pages/CONTRIBUTING.md#categories
+ */
+ category?:
+ | "photo"
+ | "map"
+ | "historicmap"
+ | "osmbasedmap"
+ | "historicphoto"
+ | "qa"
+ | "elevation"
+ | "other"
+
+ /**
+ * A URL template for imagery tiles
+ */
+ url: string
+
+ /**
+ * The minimum zoom level
+ */
+ min_zoom?: number
+
+ /**
+ * The maximum zoom level
+ */
+ max_zoom?: number
+
+ /**
+ * explicit/implicit permission by the owner for use in OSM
+ */
+ permission_osm?: "explicit" | "implicit" | "no"
+
+ /**
+ * A URL for the license or permissions for the imagery
+ */
+ license_url?: string
+
+ /**
+ * A URL for the privacy policy of the operator or false if there is no existing privacy policy for tis imagery.
+ */
+ privacy_policy_url?: string | boolean
+
+ /**
+ * A unique identifier for the source; used in imagery_used changeset tag
+ */
+ id: string
+
+ /**
+ * A short English-language description of the source
+ */
+ description?: string
+
+ /**
+ * The ISO 3166-1 alpha-2 two letter country code in upper case. Use ZZ for unknown or multiple.
+ */
+ country_code?: string
+
+ /**
+ * Whether this imagery should be shown in the default world-wide menu
+ */
+ default?: boolean
+
+ /**
+ * Whether this imagery is the best source for the region
+ */
+ best?: boolean
+
+ /**
+ * The age of the oldest imagery or data in the source, as an RFC3339 date or leading portion of one
+ */
+ start_date?: string
+
+ /**
+ * The age of the newest imagery or data in the source, as an RFC3339 date or leading portion of one
+ */
+ end_date?: string
+
+ /**
+ * HTTP header to check for information if the tile is invalid
+ */
+ no_tile_header?: { [header: string]: string[] } | null
+
+ /**
+ * 'true' if tiles are transparent and can be overlaid on another source
+ */
+ overlay?: boolean
+
+ /**
+ * Available projections
+ */
+ available_projections?: string[]
+
+ /**
+ * Attribution
+ */
+ attribution?: {
+ /**
+ * URL
+ */
+ url?: string
+
+ /**
+ * Text
+ */
+ text?: string
+
+ /**
+ * HTML formatted attribution
+ */
+ html?: string
+
+ /**
+ * Whether attribution is required
+ */
+ required?: boolean
+ }
+
+ /**
+ * A URL for an image, that can be displayed in the list of imagery layers next to the name
+ */
+ icon?: string
+
+ /**
+ * A link to an EULA text that has to be accepted by the user, before the imagery source is added. Can contain {lang} to be replaced by a current user language wiki code (like FR:) or an empty string for the default English text.
+ */
+ eula?: string
+
+ /**
+ * A URL for an image, that is displayed in the mapview for attribution
+ */
+ "logo-image"?: string
+
+ /**
+ * Customized text for the terms of use link (default is "Background Terms of Use")
+ */
+ "terms-of-use-text"?: string
+
+ /**
+ * Specify a checksum for tiles, which aren't real tiles. `type` is the digest type and can be MD5, SHA-1, SHA-256, SHA-384 and SHA-512, value is the hex encoded checksum in lower case. To create a checksum save the tile as file and upload it to e.g. https://defuse.ca/checksums.htm.
+ */
+ "no-tile-checksum"?: string
+
+ /**
+ * header-name attribute specifies a header returned by tile server, that will be shown as `metadata-key` attribute in Show Tile Info dialog
+ */
+ "metadata-header"?: string
+
+ /**
+ * Set to `true` if imagery source is properly aligned and does not need imagery offset adjustments. This is used for OSM based sources too.
+ */
+ "valid-georeference"?: boolean
+
+ /**
+ * Size of individual tiles delivered by a TMS service
+ */
+ "tile-size"?: number
+
+ /**
+ * Whether tiles status can be accessed by appending /status to the tile URL and can be submitted for re-rendering by appending /dirty.
+ */
+ "mod-tile-features"?: string
+
+ /**
+ * HTTP headers to be sent to server. It has two attributes header-name and header-value. May be specified multiple times.
+ */
+ "custom-http-headers"?: { "header-name": string; "header-value": string }[]
+
+ /**
+ * Default layer to open (when using WMS_ENDPOINT type). Contains list of layer tag with two attributes - name and style, e.g. `\"default-layers\": [\"layer\": { name=\"Basisdata_NP_Basiskart_JanMayen_WMTS_25829\" \"style\":\"default\" } ]` (not allowed in `mirror` attribute)
+ */
+ "default-layers"?: { layer: { "layer-name": string; "layer-style": string } }[]
+
+ /**
+ * format to use when connecting tile server (when using WMS_ENDPOINT type)
+ */
+ format?: string
+
+ /**
+ * If `true` transparent tiles will be requested from WMS server
+ */
+ transparent?: boolean
+
+ /**
+ * minimum expiry time for tiles in seconds. The larger the value, the longer entry in cache will be considered valid
+ */
+ "minimum-tile-expire"?: number
+ }
+}
diff --git a/scripts/GenerateSeries.ts b/scripts/GenerateSeries.ts
index 6ed84955f..3017e8180 100644
--- a/scripts/GenerateSeries.ts
+++ b/scripts/GenerateSeries.ts
@@ -1,10 +1,10 @@
import { existsSync, readdirSync, readFileSync, unlinkSync, writeFileSync } from "fs"
import ScriptUtils from "./ScriptUtils"
-import { Utils } from "../Utils"
+import { Utils } from "../src/Utils"
import Script from "./Script"
-import { GeoOperations } from "../Logic/GeoOperations"
+import { GeoOperations } from "../src/Logic/GeoOperations"
import { Feature, Polygon } from "geojson"
-import { Tiles } from "../Models/TileRange"
+import { Tiles } from "../src/Models/TileRange"
class StatsDownloader {
private readonly urlTemplate =
diff --git a/scripts/downloadEli.ts b/scripts/downloadEli.ts
index 39f903ba2..97758888b 100644
--- a/scripts/downloadEli.ts
+++ b/scripts/downloadEli.ts
@@ -1,6 +1,6 @@
import Script from "./Script"
import { Utils } from "../src/Utils"
-import { FeatureCollection } from "geojson"
+import { Eli, EliEntry } from "./@types/eli"
import fs from "fs"
class DownloadEli extends Script {
@@ -12,8 +12,8 @@ class DownloadEli extends Script {
// Target should use '.json' instead of '.geojson', as the latter cannot be imported by the build systems
const target = args[0] ?? "src/assets/editor-layer-index.json"
- const eli = await Utils.downloadJson(url)
- const keptLayers = []
+ const eli: Eli = await Utils.downloadJson(url)
+ const keptLayers: EliEntry[] = []
console.log("Got", eli.features.length, "ELI-entries")
for (let layer of eli.features) {
const props = layer.properties
@@ -45,11 +45,11 @@ class DownloadEli extends Script {
continue
}
- if (props.permission_url === "no") {
+ if (props.permission_osm === "no") {
continue
}
- if (props.max_zoom < 19) {
+ if (props.max_zoom && props.max_zoom < 19) {
// We want users to zoom to level 19 when adding a point
// If they are on a layer which hasn't enough precision, they can not zoom far enough. This is confusing, so we don't use this layer
continue
@@ -60,24 +60,24 @@ class DownloadEli extends Script {
continue
}
- const keptKeys = [
- "name",
- "id",
- "url",
- "attribution",
- "type",
- "category",
- "min_zoom",
- "max_zoom",
- "best",
- "default",
- "tile-size",
- ]
- layer.properties = {}
- for (const keptKey of keptKeys) {
- if (props[keptKey]) {
- layer.properties[keptKey] = props[keptKey]
- }
+ if (props.url.startsWith("http://")) {
+ // Mixed content will not work properly, so we don't use this layer
+ continue
+ }
+
+ // Override the layer, so it contains only the properties we need
+ layer.properties = {
+ name: props.name,
+ id: props.id,
+ url: props.url,
+ attribution: props.attribution,
+ type: props.type,
+ category: props.category,
+ min_zoom: props.min_zoom,
+ max_zoom: props.max_zoom,
+ best: props.best ? true : undefined,
+ default: props.default ? true : undefined,
+ "tile-size": props["tile-size"],
}
layer = { properties: layer.properties, type: layer.type, geometry: layer.geometry }
diff --git a/scripts/fixQuestionHint.ts b/scripts/fixQuestionHint.ts
index e7b0a1b1e..1406d2b32 100644
--- a/scripts/fixQuestionHint.ts
+++ b/scripts/fixQuestionHint.ts
@@ -1,10 +1,10 @@
import * as fs from "fs"
-import { DesugaringStep } from "../Models/ThemeConfig/Conversion/Conversion"
-import { LayerConfigJson } from "../Models/ThemeConfig/Json/LayerConfigJson"
-import { QuestionableTagRenderingConfigJson } from "../Models/ThemeConfig/Json/QuestionableTagRenderingConfigJson"
+import { DesugaringStep } from "../src/Models/ThemeConfig/Conversion/Conversion"
+import { LayerConfigJson } from "../src/Models/ThemeConfig/Json/LayerConfigJson"
+import { QuestionableTagRenderingConfigJson } from "../src/Models/ThemeConfig/Json/QuestionableTagRenderingConfigJson"
import * as fakedom from "fake-dom"
import Script from "./Script"
-import { FixedUiElement } from "../UI/Base/FixedUiElement"
+import { FixedUiElement } from "../src/UI/Base/FixedUiElement"
class ExtractQuestionHint extends DesugaringStep {
constructor() {
diff --git a/scripts/generateLayerOverview.ts b/scripts/generateLayerOverview.ts
index 8cf68d9ff..926932c35 100644
--- a/scripts/generateLayerOverview.ts
+++ b/scripts/generateLayerOverview.ts
@@ -20,7 +20,7 @@ import { DesugaringContext } from "../src/Models/ThemeConfig/Conversion/Conversi
import { Utils } from "../src/Utils"
import Script from "./Script"
import { AllSharedLayers } from "../src/Customizations/AllSharedLayers"
-
+import { parse as parse_html } from "node-html-parser"
// This scripts scans 'src/assets/layers/*.json' for layer definition files and 'src/assets/themes/*.json' for theme definition files.
// It spits out an overview of those to be used to load them
@@ -269,7 +269,8 @@ class LayerOverviewUtils extends Script {
if (
recompiledThemes.length > 0 &&
- !(recompiledThemes.length === 1 && recompiledThemes[0] === "mapcomplete-changes")
+ !(recompiledThemes.length === 1 && recompiledThemes[0] === "mapcomplete-changes") &&
+ args.indexOf("--generate-change-map") >= 0
) {
// mapcomplete-changes shows an icon for each corresponding mapcomplete-theme
const iconsPerTheme = Array.from(sharedThemes.values()).map((th) => ({
@@ -516,7 +517,9 @@ class LayerOverviewUtils extends Script {
hideFromOverview: t.hideFromOverview ?? false,
shortDescription:
t.shortDescription ??
- new Translation(t.description).FirstSentence().translations,
+ new Translation(t.description)
+ .FirstSentence()
+ .OnEveryLanguage((s) => parse_html(s).innerText).translations,
mustHaveLanguage: t.mustHaveLanguage?.length > 0,
}
})
diff --git a/src/Logic/ImageProviders/Mapillary.ts b/src/Logic/ImageProviders/Mapillary.ts
index 1fbbbc145..102bb709b 100644
--- a/src/Logic/ImageProviders/Mapillary.ts
+++ b/src/Logic/ImageProviders/Mapillary.ts
@@ -86,7 +86,7 @@ export class Mapillary extends ImageProvider {
public async DownloadAttribution(url: string): Promise {
const license = new LicenseInfo()
- license.artist = "Contributor name unavailable"
+ license.artist = undefined
license.license = "CC BY-SA 4.0"
// license.license = "Creative Commons Attribution-ShareAlike 4.0 International License";
license.attributionRequired = true
diff --git a/src/Logic/Osm/Actions/ChangeTagAction.ts b/src/Logic/Osm/Actions/ChangeTagAction.ts
index 1abfb6798..72fbffab4 100644
--- a/src/Logic/Osm/Actions/ChangeTagAction.ts
+++ b/src/Logic/Osm/Actions/ChangeTagAction.ts
@@ -28,7 +28,7 @@ export default class ChangeTagAction extends OsmChangeAction {
currentTags: Record,
meta: {
theme: string
- changeType: "answer" | "soft-delete" | "add-image" | string
+ changeType: "answer" | "soft-delete" | "add-image" | "link-image" | string
}
) {
super(elementId, true)
diff --git a/src/Logic/Osm/Actions/LinkPicture.ts b/src/Logic/Osm/Actions/LinkPicture.ts
new file mode 100644
index 000000000..014a836a0
--- /dev/null
+++ b/src/Logic/Osm/Actions/LinkPicture.ts
@@ -0,0 +1,32 @@
+import ChangeTagAction from "./ChangeTagAction"
+import { Tag } from "../../Tags/Tag"
+
+export default class LinkPicture extends ChangeTagAction {
+ /**
+ * Adds a link to an image
+ * @param elementId
+ * @param proposedKey: a key which might be used, typically `image`. If the key is already used with a different URL, `key+":0"` will be used instead (or a higher number if needed)
+ * @param url
+ * @param currentTags
+ * @param meta
+ *
+ */
+ constructor(
+ elementId: string,
+ proposedKey: "image" | "mapillary" | "wiki_commons" | string,
+ url: string,
+ currentTags: Record,
+ meta: {
+ theme: string
+ changeType: "add-image" | "link-image"
+ }
+ ) {
+ let key = proposedKey
+ let i = 0
+ while (currentTags[key] !== undefined && currentTags[key] !== url) {
+ key = proposedKey + ":" + i
+ i++
+ }
+ super(elementId, new Tag(key, url), currentTags, meta)
+ }
+}
diff --git a/src/Logic/Osm/OsmConnection.ts b/src/Logic/Osm/OsmConnection.ts
index a14d30849..b4b47d68e 100644
--- a/src/Logic/Osm/OsmConnection.ts
+++ b/src/Logic/Osm/OsmConnection.ts
@@ -1,8 +1,10 @@
-import osmAuth from "osm-auth"
+// @ts-ignore
+import { osmAuth } from "osm-auth"
import { Store, Stores, UIEventSource } from "../UIEventSource"
import { OsmPreferences } from "./OsmPreferences"
import { Utils } from "../../Utils"
-
+import { LocalStorageSource } from "../Web/LocalStorageSource"
+import * as config from "../../../package.json"
export default class UserDetails {
public loggedIn = false
public name = "Not logged in"
@@ -22,23 +24,18 @@ export default class UserDetails {
}
}
+export interface AuthConfig {
+ "#"?: string // optional comment
+ oauth_client_id: string
+ oauth_secret: string
+ url: string
+}
+
export type OsmServiceState = "online" | "readonly" | "offline" | "unknown" | "unreachable"
export class OsmConnection {
- public static readonly oauth_configs = {
- osm: {
- oauth_consumer_key: "hivV7ec2o49Two8g9h8Is1VIiVOgxQ1iYexCbvem",
- oauth_secret: "wDBRTCem0vxD7txrg1y6p5r8nvmz8tAhET7zDASI",
- url: "https://www.openstreetmap.org",
- // OAUTH 1.0 application
- // https://www.openstreetmap.org/user/Pieter%20Vander%20Vennet/oauth_clients/7404
- },
- "osm-test": {
- oauth_consumer_key: "Zgr7EoKb93uwPv2EOFkIlf3n9NLwj5wbyfjZMhz2",
- oauth_secret: "3am1i1sykHDMZ66SGq4wI2Z7cJMKgzneCHp3nctn",
- url: "https://master.apis.dev.openstreetmap.org",
- },
- }
+ public static readonly oauth_configs: Record =
+ config.config.oauth_credentials
public auth
public userDetails: UIEventSource
public isLoggedIn: Store
@@ -53,11 +50,7 @@ export class OsmConnection {
"not-attempted"
)
public preferencesHandler: OsmPreferences
- public readonly _oauth_config: {
- oauth_consumer_key: string
- oauth_secret: string
- url: string
- }
+ public readonly _oauth_config: AuthConfig
private readonly _dryRun: Store
private fakeUser: boolean
private _onLoggedIn: ((userDetails: UserDetails) => void)[] = []
@@ -83,6 +76,19 @@ export class OsmConnection {
console.debug("Using backend", this._oauth_config.url)
this._iframeMode = Utils.runningFromConsole ? false : window !== window.top
+ // Check if there are settings available in environment variables, and if so, use those
+ if (
+ import.meta.env.VITE_OSM_OAUTH_CLIENT_ID !== undefined &&
+ import.meta.env.VITE_OSM_OAUTH_SECRET !== undefined
+ ) {
+ console.debug("Using environment variables for oauth config")
+ this._oauth_config = {
+ oauth_client_id: import.meta.env.VITE_OSM_OAUTH_CLIENT_ID,
+ oauth_secret: import.meta.env.VITE_OSM_OAUTH_SECRET,
+ url: "https://www.openstreetmap.org",
+ }
+ }
+
this.userDetails = new UIEventSource(
new UserDetails(this._oauth_config.url),
"userDetails"
@@ -190,6 +196,9 @@ export class OsmConnection {
const self = this
console.log("Trying to log in...")
this.updateAuthObject()
+ LocalStorageSource.Get("location_before_login").setData(
+ Utils.runningFromConsole ? undefined : window.location.href
+ )
this.auth.xhr(
{
method: "GET",
@@ -202,13 +211,8 @@ export class OsmConnection {
if (err.status == 401) {
console.log("Clearing tokens...")
// Not authorized - our token probably got revoked
- // Reset all the tokens
- const tokens = [
- "https://www.openstreetmap.orgoauth_request_token_secret",
- "https://www.openstreetmap.orgoauth_token",
- "https://www.openstreetmap.orgoauth_token_secret",
- ]
- tokens.forEach((token) => localStorage.removeItem(token))
+ self.auth.logout()
+ self.LogOut()
}
return
}
@@ -310,6 +314,7 @@ export class OsmConnection {
): Promise {
return await this.interact(path, "POST", header, content)
}
+
public async put(
path: string,
content?: string,
@@ -486,15 +491,29 @@ export class OsmConnection {
// Same for an iframe...
this.auth = new osmAuth({
- oauth_consumer_key: this._oauth_config.oauth_consumer_key,
- oauth_secret: this._oauth_config.oauth_secret,
+ client_id: this._oauth_config.oauth_client_id,
url: this._oauth_config.url,
- landing: standalone ? undefined : window.location.href,
+ scope: "read_prefs write_prefs write_api write_gpx write_notes",
+ redirect_uri: Utils.runningFromConsole
+ ? "https://mapcomplete.org/land.html"
+ : window.location.protocol + "//" + window.location.host + "/land.html",
singlepage: !standalone,
auto: true,
})
}
+ /**
+ * To be called by land.html
+ */
+ public finishLogin(callback: (previousURL: string) => void) {
+ this.auth.authenticate(function () {
+ // Fully authed at this point
+ console.log("Authentication successful!")
+ const previousLocation = LocalStorageSource.Get("location_before_login")
+ callback(previousLocation.data)
+ })
+ }
+
private CheckForMessagesContinuously() {
const self = this
if (this.isChecking) {
diff --git a/src/Logic/Web/NearbyImagesSearch.ts b/src/Logic/Web/NearbyImagesSearch.ts
new file mode 100644
index 000000000..665cc66e7
--- /dev/null
+++ b/src/Logic/Web/NearbyImagesSearch.ts
@@ -0,0 +1,222 @@
+import { IndexedFeatureSource } from "../FeatureSource/FeatureSource"
+import { GeoOperations } from "../GeoOperations"
+import { ImmutableStore, Store, Stores, UIEventSource } from "../UIEventSource"
+import { Mapillary } from "../ImageProviders/Mapillary"
+import P4C from "pic4carto"
+import { Utils } from "../../Utils"
+export interface NearbyImageOptions {
+ lon: number
+ lat: number
+ // Radius of the upstream search
+ searchRadius?: 500 | number
+ maxDaysOld?: 1095 | number
+ blacklist: Store<{ url: string }[]>
+ shownImagesCount?: UIEventSource
+ towardscenter?: UIEventSource
+ allowSpherical?: UIEventSource
+ // Radius of what is shown. Useless to select a value > searchRadius; defaults to searchRadius
+ shownRadius?: UIEventSource
+}
+
+export interface P4CPicture {
+ pictureUrl: string
+ date?: number
+ coordinates: { lat: number; lng: number }
+ provider: "Mapillary" | string
+ author?
+ license?
+ detailsUrl?: string
+ direction?
+ osmTags?: object /*To copy straight into OSM!*/
+ thumbUrl: string
+ details: {
+ isSpherical: boolean
+ }
+}
+
+/**
+ * Uses Pic4wCarto to fetch nearby images from various providers
+ */
+export default class NearbyImagesSearch {
+ private static readonly services = [
+ "mapillary",
+ "flickr",
+ "openstreetcam",
+ "wikicommons",
+ ] as const
+
+ private individualStores
+ private readonly _store: UIEventSource = new UIEventSource([])
+ public readonly store: Store = this._store
+ private readonly _options: NearbyImageOptions
+
+ constructor(options: NearbyImageOptions, features: IndexedFeatureSource) {
+ this.individualStores = NearbyImagesSearch.services.map((s) =>
+ NearbyImagesSearch.buildPictureFetcher(options, s)
+ )
+ this._options = options
+ if (features !== undefined) {
+ const osmImages = new ImagesInLoadedDataFetcher(features).fetchAround({
+ lat: options.lat,
+ lon: options.lon,
+ searchRadius: options.searchRadius ?? 100,
+ })
+ this.individualStores.push(
+ new ImmutableStore({ images: osmImages, beforeFilter: osmImages.length })
+ )
+ }
+ for (const source of this.individualStores) {
+ source.addCallback(() => this.update())
+ }
+ this.update()
+ }
+
+ private static buildPictureFetcher(
+ options: NearbyImageOptions,
+ fetcher: "mapillary" | "flickr" | "openstreetcam" | "wikicommons"
+ ): Store<{ images: P4CPicture[]; beforeFilter: number }> {
+ const picManager = new P4C.PicturesManager({ usefetchers: [fetcher] })
+ const searchRadius = options.searchRadius ?? 100
+ const maxAgeSeconds = (options.maxDaysOld ?? 3 * 365) * 24 * 60 * 60 * 1000
+
+ const p4cStore = Stores.FromPromise(
+ picManager.startPicsRetrievalAround(
+ new P4C.LatLng(options.lat, options.lon),
+ searchRadius,
+ {
+ mindate: new Date().getTime() - maxAgeSeconds,
+ towardscenter: false,
+ }
+ )
+ )
+ return p4cStore.map(
+ (images) => {
+ if (images === undefined) {
+ return undefined
+ }
+ const beforeFilterCount = images.length
+ if (!options?.allowSpherical?.data) {
+ images = images?.filter((i) => i.details.isSpherical !== true)
+ }
+
+ const shownRadius = options?.shownRadius?.data ?? searchRadius
+ if (shownRadius !== searchRadius) {
+ images = images.filter((i) => {
+ const d = GeoOperations.distanceBetween(
+ [i.coordinates.lng, i.coordinates.lat],
+ [options.lon, options.lat]
+ )
+ return d <= shownRadius
+ })
+ }
+ if (options.towardscenter?.data) {
+ images = images.filter((i) => {
+ if (i.direction === undefined || isNaN(i.direction)) {
+ return false
+ }
+ const bearing = GeoOperations.bearing(
+ [i.coordinates.lng, i.coordinates.lat],
+ [options.lon, options.lat]
+ )
+ const diff = Math.abs((i.direction - bearing) % 360)
+ return diff < 40
+ })
+ }
+
+ images?.sort((a, b) => {
+ const distanceA = GeoOperations.distanceBetween(
+ [a.coordinates.lng, a.coordinates.lat],
+ [options.lon, options.lat]
+ )
+ const distanceB = GeoOperations.distanceBetween(
+ [b.coordinates.lng, b.coordinates.lat],
+ [options.lon, options.lat]
+ )
+ return distanceA - distanceB
+ })
+
+ return { images, beforeFilter: beforeFilterCount }
+ },
+ [options.blacklist, options.allowSpherical, options.towardscenter, options.shownRadius]
+ )
+ }
+
+ private update() {
+ const seen: Set = new Set(this._options.blacklist.data.map((d) => d.url))
+ let beforeFilter = 0
+ let result: P4CPicture[] = []
+ for (const source of this.individualStores) {
+ const imgs = source.data
+ if (imgs === undefined) {
+ continue
+ }
+ beforeFilter = beforeFilter + imgs.beforeFilter
+ for (const img of imgs.images) {
+ if (seen.has(img.pictureUrl)) {
+ continue
+ }
+ seen.add(img.pictureUrl)
+ result.push(img)
+ }
+ }
+ const c = [this._options.lon, this._options.lat]
+ result.sort((a, b) => {
+ const da = GeoOperations.distanceBetween([a.coordinates.lng, a.coordinates.lat], c)
+ const db = GeoOperations.distanceBetween([b.coordinates.lng, b.coordinates.lat], c)
+ return da - db
+ })
+ if (Utils.sameList(result, this._store.data)) {
+ // return
+ }
+ this._store.setData(result)
+ }
+}
+
+/**
+ * Extracts pictures from currently loaded features
+ */
+class ImagesInLoadedDataFetcher {
+ private indexedFeatures: IndexedFeatureSource
+
+ constructor(indexedFeatures: IndexedFeatureSource) {
+ this.indexedFeatures = indexedFeatures
+ }
+
+ public fetchAround(loc: { lon: number; lat: number; searchRadius?: number }): P4CPicture[] {
+ const foundImages: P4CPicture[] = []
+ this.indexedFeatures.features.data.forEach((feature) => {
+ const props = feature.properties
+ const images = []
+ if (props.image) {
+ images.push(props.image)
+ }
+ for (let i = 0; i < 10; i++) {
+ if (props["image:" + i]) {
+ images.push(props["image:" + i])
+ }
+ }
+ if (images.length == 0) {
+ return
+ }
+ const centerpoint = GeoOperations.centerpointCoordinates(feature)
+ const d = GeoOperations.distanceBetween(centerpoint, [loc.lon, loc.lat])
+ if (loc.searchRadius !== undefined && d > loc.searchRadius) {
+ return
+ }
+ for (const image of images) {
+ foundImages.push({
+ pictureUrl: image,
+ thumbUrl: image,
+ coordinates: { lng: centerpoint[0], lat: centerpoint[1] },
+ provider: "OpenStreetMap",
+ details: {
+ isSpherical: false,
+ },
+ osmTags: { image },
+ })
+ }
+ })
+
+ return foundImages
+ }
+}
diff --git a/src/Models/Constants.ts b/src/Models/Constants.ts
index ad7e9a62d..2d7a87e74 100644
--- a/src/Models/Constants.ts
+++ b/src/Models/Constants.ts
@@ -1,14 +1,13 @@
-import { Utils } from "../Utils"
import * as meta from "../../package.json"
+import { Utils } from "../Utils"
export type PriviligedLayerType = (typeof Constants.priviliged_layers)[number]
export default class Constants {
public static vNumber = meta.version
- public static ImgurApiKey = "7070e7167f0a25a"
- public static readonly mapillary_client_token_v4 =
- "MLY|4441509239301885|b40ad2d3ea105435bd40c7e76993ae85"
+ public static ImgurApiKey = meta.config.api_keys.imgur
+ public static readonly mapillary_client_token_v4 = meta.config.api_keys.mapillary_v4
/**
* API key for Maproulette
@@ -19,15 +18,7 @@ export default class Constants {
*/
public static readonly MaprouletteApiKey = ""
- public static defaultOverpassUrls = [
- // The official instance, 10000 queries per day per project allowed
- "https://overpass-api.de/api/interpreter",
- // 'Fair usage'
- "https://overpass.kumi.systems/api/interpreter",
- // Offline: "https://overpass.nchc.org.tw/api/interpreter",
- "https://overpass.openstreetmap.ru/cgi/interpreter",
- // Doesn't support nwr: "https://overpass.openstreetmap.fr/api/interpreter"
- ]
+ public static defaultOverpassUrls = meta.config.default_overpass_urls
public static readonly added_by_default = [
"selected_element",
@@ -100,6 +91,7 @@ export default class Constants {
"etymology",
"food",
"cafes_and_pubs",
+ "shops",
"playgrounds",
"hailhydrant",
"toilets",
@@ -113,9 +105,8 @@ export default class Constants {
* In seconds
*/
static zoomToLocationTimeout = 15
- static countryCoderEndpoint: string =
- "https://raw.githubusercontent.com/pietervdvn/MapComplete-data/main/latlon2country"
- public static readonly OsmPreferenceKeyPicturesLicense = "pictures-license"
+ static countryCoderEndpoint: string = meta.config.country_coder_host
+
/**
* These are the values that are allowed to use as 'backdrop' icon for a map pin
*/
diff --git a/src/Models/ThemeConfig/Conversion/Validation.ts b/src/Models/ThemeConfig/Conversion/Validation.ts
index d79c7bc17..d51ae560e 100644
--- a/src/Models/ThemeConfig/Conversion/Validation.ts
+++ b/src/Models/ThemeConfig/Conversion/Validation.ts
@@ -1,42 +1,43 @@
-import { DesugaringStep, Each, Fuse, On } from "./Conversion"
-import { LayerConfigJson } from "../Json/LayerConfigJson"
-import LayerConfig from "../LayerConfig"
-import { Utils } from "../../../Utils"
-import Constants from "../../Constants"
-import { Translation } from "../../../UI/i18n/Translation"
-import { LayoutConfigJson } from "../Json/LayoutConfigJson"
-import LayoutConfig from "../LayoutConfig"
-import { TagRenderingConfigJson } from "../Json/TagRenderingConfigJson"
-import { TagUtils } from "../../../Logic/Tags/TagUtils"
-import { ExtractImages } from "./FixImages"
-import { And } from "../../../Logic/Tags/And"
-import Translations from "../../../UI/i18n/Translations"
-import Svg from "../../../Svg"
-import FilterConfigJson from "../Json/FilterConfigJson"
-import DeleteConfig from "../DeleteConfig"
-import { QuestionableTagRenderingConfigJson } from "../Json/QuestionableTagRenderingConfigJson"
-import Validators from "../../../UI/InputElement/Validators"
-import TagRenderingConfig from "../TagRenderingConfig"
+import { DesugaringStep, Each, Fuse, On } from "./Conversion";
+import { LayerConfigJson } from "../Json/LayerConfigJson";
+import LayerConfig from "../LayerConfig";
+import { Utils } from "../../../Utils";
+import Constants from "../../Constants";
+import { Translation } from "../../../UI/i18n/Translation";
+import { LayoutConfigJson } from "../Json/LayoutConfigJson";
+import LayoutConfig from "../LayoutConfig";
+import { TagRenderingConfigJson } from "../Json/TagRenderingConfigJson";
+import { TagUtils } from "../../../Logic/Tags/TagUtils";
+import { ExtractImages } from "./FixImages";
+import { And } from "../../../Logic/Tags/And";
+import Translations from "../../../UI/i18n/Translations";
+import Svg from "../../../Svg";
+import FilterConfigJson from "../Json/FilterConfigJson";
+import DeleteConfig from "../DeleteConfig";
+import { QuestionableTagRenderingConfigJson } from "../Json/QuestionableTagRenderingConfigJson";
+import Validators from "../../../UI/InputElement/Validators";
+import TagRenderingConfig from "../TagRenderingConfig";
+import { parse as parse_html } from "node-html-parser";
class ValidateLanguageCompleteness extends DesugaringStep {
- private readonly _languages: string[]
+ private readonly _languages: string[];
constructor(...languages: string[]) {
super(
"Checks that the given object is fully translated in the specified languages",
[],
"ValidateLanguageCompleteness"
- )
- this._languages = languages ?? ["en"]
+ );
+ this._languages = languages ?? ["en"];
}
convert(
obj: any,
context: string
): { result: LayerConfig; errors: string[]; warnings: string[] } {
- const errors = []
- const warnings: string[] = []
- const translations = Translation.ExtractAllTranslationsFrom(obj)
+ const errors = [];
+ const warnings: string[] = [];
+ const translations = Translation.ExtractAllTranslationsFrom(obj);
for (const neededLanguage of this._languages) {
translations
.filter(
@@ -47,38 +48,38 @@ class ValidateLanguageCompleteness extends DesugaringStep {
.forEach((missing) => {
errors.push(
context +
- "A theme should be translation-complete for " +
- neededLanguage +
- ", but it lacks a translation for " +
- missing.context +
- ".\n\tThe known translation is " +
- missing.tr.textFor("en")
- )
- })
+ "A theme should be translation-complete for " +
+ neededLanguage +
+ ", but it lacks a translation for " +
+ missing.context +
+ ".\n\tThe known translation is " +
+ missing.tr.textFor("en")
+ );
+ });
}
return {
result: obj,
errors,
- warnings,
- }
+ warnings
+ };
}
}
export class DoesImageExist extends DesugaringStep {
- private readonly _knownImagePaths: Set
- private readonly _ignore?: Set
- private readonly doesPathExist: (path: string) => boolean = undefined
+ private readonly _knownImagePaths: Set;
+ private readonly _ignore?: Set;
+ private readonly doesPathExist: (path: string) => boolean = undefined;
constructor(
knownImagePaths: Set,
checkExistsSync: (path: string) => boolean = undefined,
ignore?: Set
) {
- super("Checks if an image exists", [], "DoesImageExist")
- this._ignore = ignore
- this._knownImagePaths = knownImagePaths
- this.doesPathExist = checkExistsSync
+ super("Checks if an image exists", [], "DoesImageExist");
+ this._ignore = ignore;
+ this._knownImagePaths = knownImagePaths;
+ this.doesPathExist = checkExistsSync;
}
convert(
@@ -86,53 +87,53 @@ export class DoesImageExist extends DesugaringStep {
context: string
): { result: string; errors?: string[]; warnings?: string[]; information?: string[] } {
if (this._ignore?.has(image)) {
- return { result: image }
+ return { result: image };
}
- const errors = []
- const warnings = []
- const information = []
+ const errors = [];
+ const warnings = [];
+ const information = [];
if (image.indexOf("{") >= 0) {
- information.push("Ignoring image with { in the path: " + image)
- return { result: image }
+ information.push("Ignoring image with { in the path: " + image);
+ return { result: image };
}
if (image === "assets/SocialImage.png") {
- return { result: image }
+ return { result: image };
}
if (image.match(/[a-z]*/)) {
if (Svg.All[image + ".svg"] !== undefined) {
// This is a builtin img, e.g. 'checkmark' or 'crosshair'
- return { result: image }
+ return { result: image };
}
}
if (image.startsWith("<") && image.endsWith(">")) {
// This is probably HTML, you're on your own here
- return { result: image }
+ return { result: image };
}
if (!this._knownImagePaths.has(image)) {
if (this.doesPathExist === undefined) {
errors.push(
`Image with path ${image} not found or not attributed; it is used in ${context}`
- )
+ );
} else if (!this.doesPathExist(image)) {
errors.push(
`Image with path ${image} does not exist; it is used in ${context}.\n Check for typo's and missing directories in the path.`
- )
+ );
} else {
errors.push(
`Image with path ${image} is not attributed (but it exists); execute 'npm run query:licenses' to add the license information and/or run 'npm run generate:licenses' to compile all the license info`
- )
+ );
}
}
return {
result: image,
errors,
warnings,
- information,
- }
+ information
+ };
}
}
@@ -141,11 +142,11 @@ class ValidateTheme extends DesugaringStep {
* The paths where this layer is originally saved. Triggers some extra checks
* @private
*/
- private readonly _path?: string
- private readonly _isBuiltin: boolean
+ private readonly _path?: string;
+ private readonly _isBuiltin: boolean;
//private readonly _sharedTagRenderings: Map
- private readonly _validateImage: DesugaringStep
- private readonly _extractImages: ExtractImages = undefined
+ private readonly _validateImage: DesugaringStep;
+ private readonly _extractImages: ExtractImages = undefined;
constructor(
doesImageExist: DoesImageExist,
@@ -153,12 +154,12 @@ class ValidateTheme extends DesugaringStep {
isBuiltin: boolean,
sharedTagRenderings?: Set
) {
- super("Doesn't change anything, but emits warnings and errors", [], "ValidateTheme")
- this._validateImage = doesImageExist
- this._path = path
- this._isBuiltin = isBuiltin
+ super("Doesn't change anything, but emits warnings and errors", [], "ValidateTheme");
+ this._validateImage = doesImageExist;
+ this._path = path;
+ this._isBuiltin = isBuiltin;
if (sharedTagRenderings) {
- this._extractImages = new ExtractImages(this._isBuiltin, sharedTagRenderings)
+ this._extractImages = new ExtractImages(this._isBuiltin, sharedTagRenderings);
}
}
@@ -166,11 +167,11 @@ class ValidateTheme extends DesugaringStep {
json: LayoutConfigJson,
context: string
): { result: LayoutConfigJson; errors: string[]; warnings: string[]; information: string[] } {
- const errors = []
- const warnings = []
- const information = []
+ const errors = [];
+ const warnings = [];
+ const information = [];
- const theme = new LayoutConfig(json, this._isBuiltin)
+ const theme = new LayoutConfig(json, this._isBuiltin);
{
// Legacy format checks
@@ -178,31 +179,31 @@ class ValidateTheme extends DesugaringStep {
if (json["units"] !== undefined) {
errors.push(
"The theme " +
- json.id +
- " has units defined - these should be defined on the layer instead. (Hint: use overrideAll: { '+units': ... }) "
- )
+ json.id +
+ " has units defined - these should be defined on the layer instead. (Hint: use overrideAll: { '+units': ... }) "
+ );
}
if (json["roamingRenderings"] !== undefined) {
errors.push(
"Theme " +
- json.id +
- " contains an old 'roamingRenderings'. Use an 'overrideAll' instead"
- )
+ json.id +
+ " contains an old 'roamingRenderings'. Use an 'overrideAll' instead"
+ );
}
}
}
if (this._isBuiltin && this._extractImages !== undefined) {
// Check images: are they local, are the licenses there, is the theme icon square, ...
- const images = this._extractImages.convertStrict(json, "validation")
- const remoteImages = images.filter((img) => img.path.indexOf("http") == 0)
+ const images = this._extractImages.convertStrict(json, "validation");
+ const remoteImages = images.filter((img) => img.path.indexOf("http") == 0);
for (const remoteImage of remoteImages) {
errors.push(
"Found a remote image: " +
- remoteImage +
- " in theme " +
- json.id +
- ", please download it."
- )
+ remoteImage +
+ " in theme " +
+ json.id +
+ ", please download it."
+ );
}
for (const image of images) {
this._validateImage.convertJoin(
@@ -211,30 +212,30 @@ class ValidateTheme extends DesugaringStep {
errors,
warnings,
information
- )
+ );
}
}
try {
if (this._isBuiltin) {
if (theme.id !== theme.id.toLowerCase()) {
- errors.push("Theme ids should be in lowercase, but it is " + theme.id)
+ errors.push("Theme ids should be in lowercase, but it is " + theme.id);
}
const filename = this._path.substring(
this._path.lastIndexOf("/") + 1,
this._path.length - 5
- )
+ );
if (theme.id !== filename) {
errors.push(
"Theme ids should be the same as the name.json, but we got id: " +
- theme.id +
- " and filename " +
- filename +
- " (" +
- this._path +
- ")"
- )
+ theme.id +
+ " and filename " +
+ filename +
+ " (" +
+ this._path +
+ ")"
+ );
}
this._validateImage.convertJoin(
theme.icon,
@@ -242,44 +243,44 @@ class ValidateTheme extends DesugaringStep {
errors,
warnings,
information
- )
+ );
}
- const dups = Utils.Dupiclates(json.layers.map((layer) => layer["id"]))
+ const dups = Utils.Dupiclates(json.layers.map((layer) => layer["id"]));
if (dups.length > 0) {
errors.push(
`The theme ${json.id} defines multiple layers with id ${dups.join(", ")}`
- )
+ );
}
if (json["mustHaveLanguage"] !== undefined) {
const checked = new ValidateLanguageCompleteness(
...json["mustHaveLanguage"]
- ).convert(theme, theme.id)
+ ).convert(theme, theme.id);
- errors.push(...checked.errors)
+ errors.push(...checked.errors);
}
if (!json.hideFromOverview && theme.id !== "personal" && this._isBuiltin) {
// The first key in the the title-field must be english, otherwise the title in the loading page will be the different language
- const targetLanguage = theme.title.SupportedLanguages()[0]
+ const targetLanguage = theme.title.SupportedLanguages()[0];
if (targetLanguage !== "en") {
warnings.push(
`TargetLanguage is not 'en' for public theme ${theme.id}, it is ${targetLanguage}. Move 'en' up in the title of the theme and set it as the first key`
- )
+ );
}
// Official, public themes must have a full english translation
- const checked = new ValidateLanguageCompleteness("en").convert(theme, theme.id)
- errors.push(...checked.errors)
+ const checked = new ValidateLanguageCompleteness("en").convert(theme, theme.id);
+ errors.push(...checked.errors);
}
} catch (e) {
- errors.push(e)
+ errors.push(e);
}
return {
result: json,
errors,
warnings,
- information,
- }
+ information
+ };
}
}
@@ -294,7 +295,7 @@ export class ValidateThemeAndLayers extends Fuse {
"Validates a theme and the contained layers",
new ValidateTheme(doesImageExist, path, isBuiltin, sharedTagRenderings),
new On("layers", new Each(new ValidateLayer(undefined, isBuiltin, doesImageExist)))
- )
+ );
}
}
@@ -304,26 +305,26 @@ class OverrideShadowingCheck extends DesugaringStep {
"Checks that an 'overrideAll' does not override a single override",
[],
"OverrideShadowingCheck"
- )
+ );
}
convert(
json: LayoutConfigJson,
_: string
): { result: LayoutConfigJson; errors?: string[]; warnings?: string[] } {
- const overrideAll = json.overrideAll
+ const overrideAll = json.overrideAll;
if (overrideAll === undefined) {
- return { result: json }
+ return { result: json };
}
- const errors = []
- const withOverride = json.layers.filter((l) => l["override"] !== undefined)
+ const errors = [];
+ const withOverride = json.layers.filter((l) => l["override"] !== undefined);
for (const layer of withOverride) {
for (const key in overrideAll) {
if (key.endsWith("+") || key.startsWith("+")) {
// This key will _add_ to the list, not overwrite it - so no warning is needed
- continue
+ continue;
}
if (
layer["override"][key] !== undefined ||
@@ -334,19 +335,19 @@ class OverrideShadowingCheck extends DesugaringStep {
JSON.stringify(layer["builtin"]) +
" has a shadowed property: " +
key +
- " is overriden by overrideAll of the theme"
- errors.push(w)
+ " is overriden by overrideAll of the theme";
+ errors.push(w);
}
}
}
- return { result: json, errors }
+ return { result: json, errors };
}
}
class MiscThemeChecks extends DesugaringStep {
constructor() {
- super("Miscelleanous checks on the theme", [], "MiscThemesChecks")
+ super("Miscelleanous checks on the theme", [], "MiscThemesChecks");
}
convert(
@@ -358,19 +359,19 @@ class MiscThemeChecks extends DesugaringStep {
warnings?: string[]
information?: string[]
} {
- const warnings = []
- const errors = []
+ const warnings = [];
+ const errors = [];
if (json.id !== "personal" && (json.layers === undefined || json.layers.length === 0)) {
- errors.push("The theme " + json.id + " has no 'layers' defined (" + context + ")")
+ errors.push("The theme " + json.id + " has no 'layers' defined (" + context + ")");
}
if (json.socialImage === "") {
- warnings.push("Social image for theme " + json.id + " is the emtpy string")
+ warnings.push("Social image for theme " + json.id + " is the emtpy string");
}
return {
result: json,
warnings,
- errors,
- }
+ errors
+ };
}
}
@@ -380,7 +381,7 @@ export class PrevalidateTheme extends Fuse {
"Various consistency checks on the raw JSON",
new MiscThemeChecks(),
new OverrideShadowingCheck()
- )
+ );
}
}
@@ -390,7 +391,7 @@ export class DetectConflictingAddExtraTags extends DesugaringStep 0)) {
- return { result: json }
+ return { result: json };
}
- const tagRendering = new TagRenderingConfig(json)
+ const tagRendering = new TagRenderingConfig(json);
- const errors = []
+ const errors = [];
for (let i = 0; i < tagRendering.mappings.length; i++) {
- const mapping = tagRendering.mappings[i]
+ const mapping = tagRendering.mappings[i];
if (!mapping.addExtraTags) {
- continue
+ continue;
}
- const keysInMapping = new Set(mapping.if.usedKeys())
+ const keysInMapping = new Set(mapping.if.usedKeys());
- const keysInAddExtraTags = mapping.addExtraTags.map((t) => t.key)
+ const keysInAddExtraTags = mapping.addExtraTags.map((t) => t.key);
- const duplicateKeys = keysInAddExtraTags.filter((k) => keysInMapping.has(k))
+ const duplicateKeys = keysInAddExtraTags.filter((k) => keysInMapping.has(k));
if (duplicateKeys.length > 0) {
errors.push(
"At " +
- context +
- ".mappings[" +
- i +
- "]: AddExtraTags overrides a key that is set in the `if`-clause of this mapping. Selecting this answer might thus first set one value (needed to match as answer) and then override it with a different value, resulting in an unsaveable question. The offending `addExtraTags` is " +
- duplicateKeys.join(", ")
- )
+ context +
+ ".mappings[" +
+ i +
+ "]: AddExtraTags overrides a key that is set in the `if`-clause of this mapping. Selecting this answer might thus first set one value (needed to match as answer) and then override it with a different value, resulting in an unsaveable question. The offending `addExtraTags` is " +
+ duplicateKeys.join(", ")
+ );
}
}
return {
result: json,
- errors,
- }
+ errors
+ };
}
}
export class DetectShadowedMappings extends DesugaringStep {
- private readonly _calculatedTagNames: string[]
+ private readonly _calculatedTagNames: string[];
constructor(layerConfig?: LayerConfigJson) {
- super("Checks that the mappings don't shadow each other", [], "DetectShadowedMappings")
- this._calculatedTagNames = DetectShadowedMappings.extractCalculatedTagNames(layerConfig)
+ super("Checks that the mappings don't shadow each other", [], "DetectShadowedMappings");
+ this._calculatedTagNames = DetectShadowedMappings.extractCalculatedTagNames(layerConfig);
}
/**
@@ -457,11 +458,11 @@ export class DetectShadowedMappings extends DesugaringStep {
if (ct.indexOf(":=") >= 0) {
- return ct.split(":=")[0]
+ return ct.split(":=")[0];
}
- return ct.split("=")[0]
+ return ct.split("=")[0];
}) ?? []
- )
+ );
}
/**
@@ -501,40 +502,40 @@ export class DetectShadowedMappings extends DesugaringStep {
- const ctx = `${context}.mappings[${i}]`
- const ifTags = TagUtils.Tag(m.if, ctx)
- const hideInAnswer = m["hideInAnswer"]
+ const ctx = `${context}.mappings[${i}]`;
+ const ifTags = TagUtils.Tag(m.if, ctx);
+ const hideInAnswer = m["hideInAnswer"];
if (hideInAnswer !== undefined && hideInAnswer !== false && hideInAnswer !== true) {
- let conditionTags = TagUtils.Tag(hideInAnswer)
+ let conditionTags = TagUtils.Tag(hideInAnswer);
// Merge the condition too!
- return new And([conditionTags, ifTags])
+ return new And([conditionTags, ifTags]);
}
- return ifTags
- })
+ return ifTags;
+ });
for (let i = 0; i < json.mappings.length; i++) {
if (!parsedConditions[i].isUsableAsAnswer()) {
// There is no straightforward way to convert this mapping.if into a properties-object, so we simply skip this one
// Yes, it might be shadowed, but running this check is to difficult right now
- continue
+ continue;
}
- const keyValues = parsedConditions[i].asChange(defaultProperties)
- const properties = {}
+ const keyValues = parsedConditions[i].asChange(defaultProperties);
+ const properties = {};
keyValues.forEach(({ k, v }) => {
- properties[k] = v
- })
+ properties[k] = v;
+ });
for (let j = 0; j < i; j++) {
- const doesMatch = parsedConditions[j].matchesProperties(properties)
+ const doesMatch = parsedConditions[j].matchesProperties(properties);
if (
doesMatch &&
json.mappings[j]["hideInAnswer"] === true &&
@@ -542,15 +543,15 @@ export class DetectShadowedMappings extends DesugaringStep {
- private readonly _doesImageExist: DoesImageExist
+ private readonly _doesImageExist: DoesImageExist;
constructor(doesImageExist: DoesImageExist) {
super(
"Checks that 'then'clauses in mappings don't have images, but use 'icon' instead",
[],
"DetectMappingsWithImages"
- )
- this._doesImageExist = doesImageExist
+ );
+ this._doesImageExist = doesImageExist;
}
/**
@@ -615,38 +616,38 @@ export class DetectMappingsWithImages extends DesugaringStep= 0
- const images = Utils.Dedup(Translations.T(mapping.then)?.ExtractImages() ?? [])
- const ctx = `${context}.mappings[${i}]`
+ const mapping = json.mappings[i];
+ const ignore = mapping["#"]?.indexOf(ignoreToken) >= 0;
+ const images = Utils.Dedup(Translations.T(mapping.then)?.ExtractImages() ?? []);
+ const ctx = `${context}.mappings[${i}]`;
if (images.length > 0) {
if (!ignore) {
errors.push(
`${ctx}: A mapping has an image in the 'then'-clause. Remove the image there and use \`"icon": \` instead. The images found are ${images.join(
", "
)}. (This check can be turned of by adding "#": "${ignoreToken}" in the mapping, but this is discouraged`
- )
+ );
} else {
information.push(
`${ctx}: Ignored image ${images.join(
", "
)} in 'then'-clause of a mapping as this check has been disabled`
- )
+ );
for (const image of images) {
- this._doesImageExist.convertJoin(image, ctx, errors, warnings, information)
+ this._doesImageExist.convertJoin(image, ctx, errors, warnings, information);
}
}
} else if (ignore) {
- warnings.push(`${ctx}: unused '${ignoreToken}' - please remove this`)
+ warnings.push(`${ctx}: unused '${ignoreToken}' - please remove this`);
}
}
@@ -654,17 +655,72 @@ export class DetectMappingsWithImages extends DesugaringStep> {
+ constructor() {
+ super("Given a possible set of translations, validates that does have `rel='noopener'` set", [], "ValidatePossibleLinks");
+ }
+
+ public isTabnabbingProne(str: string): boolean {
+ const p = parse_html(str);
+ const links = Array.from(p.getElementsByTagName("a"));
+ if (links.length == 0) {
+ return false;
}
+ for (const link of Array.from(links)) {
+ if (link.getAttribute("target") !== "_blank") {
+ continue;
+ }
+ const rel = new Set(link.getAttribute("rel")?.split(" ") ?? []);
+ if (rel.has("noopener")) {
+ continue;
+ }
+ const source = link.getAttribute("href");
+ if (source.startsWith("http")) {
+ // No variable part - we assume the link is safe
+ continue;
+ }
+ return true;
+ }
+ return false;
+ }
+
+ convert(json: string | Record, context: string): {
+ result: string | Record;
+ errors?: string[];
+ warnings?: string[];
+ information?: string[]
+ } {
+
+ const errors = [];
+ if (typeof json === "string") {
+ if (this.isTabnabbingProne(json)) {
+ errors.push("At " + context + ": the string " + json + " has a link targeting `_blank`, but it doesn't have `rel='noopener'` set. This gives rise to reverse tabnapping");
+ }
+ } else {
+ for (const k in json) {
+ if (this.isTabnabbingProne(json[k])) {
+ errors.push(`At ${context}: the translation for ${k} '${json[k]}' has a link targeting \`_blank\`, but it doesn't have \`rel='noopener'\` set. This gives rise to reverse tabnapping`);
+ }
+ }
+ }
+ return {
+ errors,
+ result: json
+ };
}
}
class MiscTagRenderingChecks extends DesugaringStep {
- private _options: { noQuestionHintCheck: boolean }
+ private _options: { noQuestionHintCheck: boolean };
constructor(options: { noQuestionHintCheck: boolean }) {
- super("Miscellaneous checks on the tagrendering", ["special"], "MiscTagRenderingChecks")
- this._options = options
+ super("Miscellaneous checks on the tagrendering", ["special"], "MiscTagRenderingChecks");
+ this._options = options;
}
convert(
@@ -676,25 +732,26 @@ class MiscTagRenderingChecks extends DesugaringStep {
warnings?: string[]
information?: string[]
} {
- const warnings = []
- const errors = []
+ const warnings = [];
+ const errors = [];
if (json["special"] !== undefined) {
errors.push(
"At " +
- context +
- ': detected `special` on the top level. Did you mean `{"render":{ "special": ... }}`'
- )
+ context +
+ ": detected `special` on the top level. Did you mean `{\"render\":{ \"special\": ... }}`"
+ );
}
if (json["group"]) {
errors.push(
"At " +
- context +
- ': groups are deprecated, use `"label": ["' +
- json["group"] +
- '"]` instead'
- )
+ context +
+ ": groups are deprecated, use `\"label\": [\"" +
+ json["group"] +
+ "\"]` instead"
+ );
}
- const freeformType = json["freeform"]?.["type"]
+
+ const freeformType = json["freeform"]?.["type"];
if (freeformType) {
if (Validators.availableTypes.indexOf(freeformType) < 0) {
throw (
@@ -704,14 +761,14 @@ class MiscTagRenderingChecks extends DesugaringStep {
freeformType +
"; try one of " +
Validators.availableTypes.join(", ")
- )
+ );
}
}
return {
result: json,
errors,
- warnings,
- }
+ warnings
+ };
}
}
@@ -726,8 +783,16 @@ export class ValidateTagRenderings extends Fuse {
new DetectShadowedMappings(layerConfig),
new DetectConflictingAddExtraTags(),
new DetectMappingsWithImages(doesImageExist),
+ new On("render",
+ new ValidatePossibleLinks()),
+ new On("question",
+ new ValidatePossibleLinks()),
+ new On("questionHint",
+ new ValidatePossibleLinks()),
+ new On("mappings",
+ new Each(new On("then", new ValidatePossibleLinks()))),
new MiscTagRenderingChecks(options)
- )
+ );
}
}
@@ -736,41 +801,41 @@ export class ValidateLayer extends DesugaringStep {
* The paths where this layer is originally saved. Triggers some extra checks
* @private
*/
- private readonly _path?: string
- private readonly _isBuiltin: boolean
- private readonly _doesImageExist: DoesImageExist
+ private readonly _path?: string;
+ private readonly _isBuiltin: boolean;
+ private readonly _doesImageExist: DoesImageExist;
constructor(path: string, isBuiltin: boolean, doesImageExist: DoesImageExist) {
- super("Doesn't change anything, but emits warnings and errors", [], "ValidateLayer")
- this._path = path
- this._isBuiltin = isBuiltin
- this._doesImageExist = doesImageExist
+ super("Doesn't change anything, but emits warnings and errors", [], "ValidateLayer");
+ this._path = path;
+ this._isBuiltin = isBuiltin;
+ this._doesImageExist = doesImageExist;
}
convert(
json: LayerConfigJson,
context: string
): { result: LayerConfigJson; errors: string[]; warnings?: string[]; information?: string[] } {
- const errors = []
- const warnings = []
- const information = []
- context = "While validating a layer: " + context
+ const errors = [];
+ const warnings = [];
+ const information = [];
+ context = "While validating a layer: " + context;
if (typeof json === "string") {
- errors.push(context + ": This layer hasn't been expanded: " + json)
+ errors.push(context + ": This layer hasn't been expanded: " + json);
return {
result: null,
- errors,
- }
+ errors
+ };
}
if (json.source === "special") {
if (!Constants.priviliged_layers.find((x) => x == json.id)) {
errors.push(
context +
- ": layer " +
- json.id +
- " uses 'special' as source.osmTags. However, this layer is not a priviliged layer"
- )
+ ": layer " +
+ json.id +
+ " uses 'special' as source.osmTags. However, this layer is not a priviliged layer"
+ );
}
}
@@ -778,49 +843,49 @@ export class ValidateLayer extends DesugaringStep {
if (json.title === undefined && json.source !== "special:library") {
errors.push(
context +
- ": this layer does not have a title defined but it does have tagRenderings. Not having a title will disable the popups, resulting in an unclickable element. Please add a title. If not having a popup is intended and the tagrenderings need to be kept (e.g. in a library layer), set `title: null` to disable this error."
- )
+ ": this layer does not have a title defined but it does have tagRenderings. Not having a title will disable the popups, resulting in an unclickable element. Please add a title. If not having a popup is intended and the tagrenderings need to be kept (e.g. in a library layer), set `title: null` to disable this error."
+ );
}
if (json.title === null) {
information.push(
context +
- ": title is `null`. This results in an element that cannot be clicked - even though tagRenderings is set."
- )
+ ": title is `null`. This results in an element that cannot be clicked - even though tagRenderings is set."
+ );
}
}
if (json["builtin"] !== undefined) {
- errors.push(context + ": This layer hasn't been expanded: " + json)
+ errors.push(context + ": This layer hasn't been expanded: " + json);
return {
result: null,
- errors,
- }
+ errors
+ };
}
if (json.minzoom > Constants.minZoomLevelToAddNewPoint) {
;(json.presets?.length > 0 ? errors : warnings).push(
`At ${context}: minzoom is ${json.minzoom}, this should be at most ${Constants.minZoomLevelToAddNewPoint} as a preset is set. Why? Selecting the pin for a new item will zoom in to level before adding the point. Having a greater minzoom will hide the points, resulting in possible duplicates`
- )
+ );
}
{
// duplicate ids in tagrenderings check
const duplicates = Utils.Dedup(
Utils.Dupiclates(Utils.NoNull((json.tagRenderings ?? []).map((tr) => tr["id"])))
- )
+ );
if (duplicates.length > 0) {
- console.log(json.tagRenderings)
+ console.log(json.tagRenderings);
errors.push(
"At " +
- context +
- ": some tagrenderings have a duplicate id: " +
- duplicates.join(", ")
- )
+ context +
+ ": some tagrenderings have a duplicate id: " +
+ duplicates.join(", ")
+ );
}
}
if (json.deletion !== undefined && json.deletion instanceof DeleteConfig) {
if (json.deletion.softDeletionTags === undefined) {
- warnings.push("No soft-deletion tags in deletion block for layer " + json.id)
+ warnings.push("No soft-deletion tags in deletion block for layer " + json.id);
}
}
@@ -831,9 +896,9 @@ export class ValidateLayer extends DesugaringStep {
if (json["overpassTags"] !== undefined) {
errors.push(
"Layer " +
- json.id +
- 'still uses the old \'overpassTags\'-format. Please use "source": {"osmTags": }\' instead of "overpassTags": (note: this isn\'t your fault, the custom theme generator still spits out the old format)'
- )
+ json.id +
+ "still uses the old 'overpassTags'-format. Please use \"source\": {\"osmTags\": }' instead of \"overpassTags\": (note: this isn't your fault, the custom theme generator still spits out the old format)"
+ );
}
const forbiddenTopLevel = [
"icon",
@@ -844,88 +909,88 @@ export class ValidateLayer extends DesugaringStep {
"width",
"color",
"colour",
- "iconOverlays",
- ]
+ "iconOverlays"
+ ];
for (const forbiddenKey of forbiddenTopLevel) {
if (json[forbiddenKey] !== undefined)
errors.push(
context +
- ": layer " +
- json.id +
- " still has a forbidden key " +
- forbiddenKey
- )
+ ": layer " +
+ json.id +
+ " still has a forbidden key " +
+ forbiddenKey
+ );
}
if (json["hideUnderlayingFeaturesMinPercentage"] !== undefined) {
errors.push(
context +
- ": layer " +
- json.id +
- " contains an old 'hideUnderlayingFeaturesMinPercentage'"
- )
+ ": layer " +
+ json.id +
+ " contains an old 'hideUnderlayingFeaturesMinPercentage'"
+ );
}
if (
json.isShown !== undefined &&
(json.isShown["render"] !== undefined || json.isShown["mappings"] !== undefined)
) {
- warnings.push(context + " has a tagRendering as `isShown`")
+ warnings.push(context + " has a tagRendering as `isShown`");
}
}
if (this._isBuiltin) {
// Check location of layer file
- const expected: string = `assets/layers/${json.id}/${json.id}.json`
+ const expected: string = `assets/layers/${json.id}/${json.id}.json`;
if (this._path != undefined && this._path.indexOf(expected) < 0) {
errors.push(
"Layer is in an incorrect place. The path is " +
- this._path +
- ", but expected " +
- expected
- )
+ this._path +
+ ", but expected " +
+ expected
+ );
}
}
if (this._isBuiltin) {
// Check for correct IDs
if (json.tagRenderings?.some((tr) => tr["id"] === "")) {
- const emptyIndexes: number[] = []
+ const emptyIndexes: number[] = [];
for (let i = 0; i < json.tagRenderings.length; i++) {
- const tagRendering = json.tagRenderings[i]
+ const tagRendering = json.tagRenderings[i];
if (tagRendering["id"] === "") {
- emptyIndexes.push(i)
+ emptyIndexes.push(i);
}
}
errors.push(
`Some tagrendering-ids are empty or have an emtpy string; this is not allowed (at ${context}.tagRenderings.[${emptyIndexes.join(
","
)}])`
- )
+ );
}
const duplicateIds = Utils.Dupiclates(
(json.tagRenderings ?? [])
?.map((f) => f["id"])
.filter((id) => id !== "questions")
- )
+ );
if (duplicateIds.length > 0 && !Utils.runningFromConsole) {
errors.push(
`Some tagRenderings have a duplicate id: ${duplicateIds} (at ${context}.tagRenderings)`
- )
+ );
}
if (json.description === undefined) {
if (typeof json.source === null) {
- errors.push(context + ": A priviliged layer must have a description")
+ errors.push(context + ": A priviliged layer must have a description");
} else {
- warnings.push(context + ": A builtin layer should have a description")
+ warnings.push(context + ": A builtin layer should have a description");
}
}
}
if (json.filter) {
- const r = new On("filter", new Each(new ValidateFilter())).convert(json, context)
- warnings.push(...(r.warnings ?? []))
- errors.push(...(r.errors ?? []))
- information.push(...(r.information ?? []))
+ const r = new On("filter", new Each(new ValidateFilter())).convert(json, context);
+ warnings.push(...(r.warnings ?? []));
+ errors.push(...(r.errors ?? []));
+ information.push(...(r.information ?? []));
}
if (json.tagRenderings !== undefined) {
@@ -933,74 +998,74 @@ export class ValidateLayer extends DesugaringStep {
"tagRenderings",
new Each(
new ValidateTagRenderings(json, this._doesImageExist, {
- noQuestionHintCheck: json["#"]?.indexOf("no-question-hint-check") >= 0,
+ noQuestionHintCheck: json["#"]?.indexOf("no-question-hint-check") >= 0
})
)
- ).convert(json, context)
- warnings.push(...(r.warnings ?? []))
- errors.push(...(r.errors ?? []))
- information.push(...(r.information ?? []))
+ ).convert(json, context);
+ warnings.push(...(r.warnings ?? []));
+ errors.push(...(r.errors ?? []));
+ information.push(...(r.information ?? []));
}
{
const hasCondition = json.mapRendering?.filter(
(mr) => mr["icon"] !== undefined && mr["icon"]["condition"] !== undefined
- )
+ );
if (hasCondition?.length > 0) {
errors.push(
"At " +
- context +
- ":\n One or more icons in the mapRenderings have a condition set. Don't do this, as this will result in an invisible but clickable element. Use extra filters in the source instead. The offending mapRenderings are:\n" +
- JSON.stringify(hasCondition, null, " ")
- )
+ context +
+ ":\n One or more icons in the mapRenderings have a condition set. Don't do this, as this will result in an invisible but clickable element. Use extra filters in the source instead. The offending mapRenderings are:\n" +
+ JSON.stringify(hasCondition, null, " ")
+ );
}
}
if (json.presets !== undefined) {
if (typeof json.source === "string") {
- throw "A special layer cannot have presets"
+ throw "A special layer cannot have presets";
}
// Check that a preset will be picked up by the layer itself
- const baseTags = TagUtils.Tag(json.source["osmTags"])
+ const baseTags = TagUtils.Tag(json.source["osmTags"]);
for (let i = 0; i < json.presets.length; i++) {
- const preset = json.presets[i]
+ const preset = json.presets[i];
const tags: { k: string; v: string }[] = new And(
preset.tags.map((t) => TagUtils.Tag(t))
- ).asChange({ id: "node/-1" })
- const properties = {}
+ ).asChange({ id: "node/-1" });
+ const properties = {};
for (const tag of tags) {
- properties[tag.k] = tag.v
+ properties[tag.k] = tag.v;
}
- const doMatch = baseTags.matchesProperties(properties)
+ const doMatch = baseTags.matchesProperties(properties);
if (!doMatch) {
errors.push(
context +
- ".presets[" +
- i +
- "]: This preset does not match the required tags of this layer. This implies that a newly added point will not show up.\n A newly created point will have properties: " +
- JSON.stringify(properties) +
- "\n The required tags are: " +
- baseTags.asHumanString(false, false, {})
- )
+ ".presets[" +
+ i +
+ "]: This preset does not match the required tags of this layer. This implies that a newly added point will not show up.\n A newly created point will have properties: " +
+ JSON.stringify(properties) +
+ "\n The required tags are: " +
+ baseTags.asHumanString(false, false, {})
+ );
}
}
}
} catch (e) {
- errors.push(e)
+ errors.push(e);
}
return {
result: json,
errors,
warnings,
- information,
- }
+ information
+ };
}
}
export class ValidateFilter extends DesugaringStep {
constructor() {
- super("Detect common errors in the filters", [], "ValidateFilter")
+ super("Detect common errors in the filters", [], "ValidateFilter");
}
convert(
@@ -1014,22 +1079,22 @@ export class ValidateFilter extends DesugaringStep {
} {
if (typeof filter === "string") {
// Calling another filter, we skip
- return { result: filter }
+ return { result: filter };
}
- const errors = []
+ const errors = [];
for (const option of filter.options) {
for (let i = 0; i < option.fields?.length ?? 0; i++) {
- const field = option.fields[i]
- const type = field.type ?? "string"
+ const field = option.fields[i];
+ const type = field.type ?? "string";
if (Validators.availableTypes.find((t) => t === type) === undefined) {
const err = `Invalid filter: ${type} is not a valid textfield type (at ${context}.fields[${i}])\n\tTry one of ${Array.from(
Validators.availableTypes
- ).join(",")}`
- errors.push(err)
+ ).join(",")}`;
+ errors.push(err);
}
}
}
- return { result: filter, errors }
+ return { result: filter, errors };
}
}
@@ -1042,7 +1107,7 @@ export class DetectDuplicateFilters extends DesugaringStep<{
"Tries to detect layers where a shared filter can be used (or where similar filters occur)",
[],
"DetectDuplicateFilters"
- )
+ );
}
convert(
@@ -1054,11 +1119,11 @@ export class DetectDuplicateFilters extends DesugaringStep<{
warnings?: string[]
information?: string[]
} {
- const errors: string[] = []
- const warnings: string[] = []
- const information: string[] = []
+ const errors: string[] = [];
+ const warnings: string[] = [];
+ const information: string[] = [];
- const { layers, themes } = json
+ const { layers, themes } = json;
const perOsmTag = new Map<
string,
{
@@ -1066,24 +1131,24 @@ export class DetectDuplicateFilters extends DesugaringStep<{
layout: LayoutConfigJson | undefined
filter: FilterConfigJson
}[]
- >()
+ >();
for (const layer of layers) {
- this.addLayerFilters(layer, perOsmTag)
+ this.addLayerFilters(layer, perOsmTag);
}
for (const theme of themes) {
if (theme.id === "personal") {
- continue
+ continue;
}
for (const layer of theme.layers) {
if (typeof layer === "string") {
- continue
+ continue;
}
if (layer["builtin"] !== undefined) {
- continue
+ continue;
}
- this.addLayerFilters(layer, perOsmTag, theme)
+ this.addLayerFilters(layer, perOsmTag, theme);
}
}
@@ -1091,25 +1156,25 @@ export class DetectDuplicateFilters extends DesugaringStep<{
perOsmTag.forEach((value, key) => {
if (value.length <= 1) {
// Seen this key just once, it is unique
- return
+ return;
}
- let msg = "Possible duplicate filter: " + key
+ let msg = "Possible duplicate filter: " + key;
for (const { filter, layer, layout } of value) {
- let id = ""
+ let id = "";
if (layout !== undefined) {
- id = layout.id + ":"
+ id = layout.id + ":";
}
- msg += `\n - ${id}${layer.id}.${filter.id}`
+ msg += `\n - ${id}${layer.id}.${filter.id}`;
}
- warnings.push(msg)
- })
+ warnings.push(msg);
+ });
return {
result: json,
errors,
warnings,
- information,
- }
+ information
+ };
}
/**
@@ -1128,33 +1193,33 @@ export class DetectDuplicateFilters extends DesugaringStep<{
layout?: LayoutConfigJson | undefined
): void {
if (layer.filter === undefined || layer.filter === null) {
- return
+ return;
}
if (layer.filter["sameAs"] !== undefined) {
- return
+ return;
}
for (const filter of <(string | FilterConfigJson)[]>layer.filter) {
if (typeof filter === "string") {
- continue
+ continue;
}
if (filter["#"]?.indexOf("ignore-possible-duplicate") >= 0) {
- continue
+ continue;
}
for (const option of filter.options) {
if (option.osmTags === undefined) {
- continue
+ continue;
}
- const key = JSON.stringify(option.osmTags)
+ const key = JSON.stringify(option.osmTags);
if (!perOsmTag.has(key)) {
- perOsmTag.set(key, [])
+ perOsmTag.set(key, []);
}
perOsmTag.get(key).push({
layer,
filter,
- layout,
- })
+ layout
+ });
}
}
}
diff --git a/src/Models/ThemeConfig/TagRenderingConfig.ts b/src/Models/ThemeConfig/TagRenderingConfig.ts
index 5fe5c7ca9..2039022e8 100644
--- a/src/Models/ThemeConfig/TagRenderingConfig.ts
+++ b/src/Models/ThemeConfig/TagRenderingConfig.ts
@@ -243,7 +243,7 @@ export default class TagRenderingConfig {
if (txt === "") {
throw context + " Rendering for language " + ln + " is empty"
}
- if (txt.indexOf("{" + this.freeform.key + "}") >= 0) {
+ if (txt.indexOf("{" + this.freeform.key + "}") >= 0 || txt.indexOf("&LBRACE" + this.freeform.key + "&RBRACE") ) {
continue
}
if (txt.indexOf("{" + this.freeform.key + ":") >= 0) {
diff --git a/src/UI/Base/SubtleLink.svelte b/src/UI/Base/SubtleLink.svelte
index 401c34a24..5a3d9f505 100644
--- a/src/UI/Base/SubtleLink.svelte
+++ b/src/UI/Base/SubtleLink.svelte
@@ -34,6 +34,7 @@
class={twMerge(options.extraClasses, "button text-ellipsis")}
{href}
target={newTab ? "_blank" : undefined}
+ rel={newTab ? "noopener" : undefined}
>
{#if imageUrl !== undefined}
diff --git a/src/UI/Base/Table.ts b/src/UI/Base/Table.ts
index e27dbff89..c400b9129 100644
--- a/src/UI/Base/Table.ts
+++ b/src/UI/Base/Table.ts
@@ -29,7 +29,7 @@ export default class Table extends BaseUIElement {
const header = Utils.NoNull(headerMarkdownParts).join(" | ")
const headerSep = headerMarkdownParts.map((part) => "-".repeat(part.length + 2)).join(" | ")
const table = this._contents
- .map((row) => row.map((el) => el?.AsMarkdown()?.replace("|", "\\|") ?? " ").join(" | "))
+ .map((row) => row.map((el) => el?.AsMarkdown()?.replaceAll("\\","\\\\")?.replaceAll("|", "\\|") ?? " ").join(" | "))
.join("\n")
return "\n\n" + [header, headerSep, table, ""].join("\n")
diff --git a/src/UI/BigComponents/ContactLink.svelte b/src/UI/BigComponents/ContactLink.svelte
index f3ccac9e2..7cebd2c0d 100644
--- a/src/UI/BigComponents/ContactLink.svelte
+++ b/src/UI/BigComponents/ContactLink.svelte
@@ -35,7 +35,7 @@
src={`https://raw.githubusercontent.com/pietervdvn/MapComplete-data/main/community_index/${resource.type}.svg`}
/>