From 1beeec0d339d28d8d05a14c336a24d91799a09a9 Mon Sep 17 00:00:00 2001 From: zoran995 Date: Tue, 19 Jan 2021 13:24:52 +0100 Subject: [PATCH 001/654] convert search providers to utilise the new model architecture - add SearchProviderMixin to connect searchProviders with model system - write architecture decission record - port existing search providers to proposed model --- .../0007-configurable-search-providers.md | 35 ++ lib/ModelMixins/SearchProviderMixin.ts | 92 +++++ .../WebFeatureServiceSearchProviderMixin.ts | 222 ++++++++++++ lib/Models/BingMapsSearchProvider.ts | 201 ----------- lib/Models/SearchProvider.ts | 27 -- .../AustralianGazetteerSearchProvider.ts | 44 +-- .../SearchProvider/BingMapsSearchProvider.ts | 189 +++++++++++ .../CatalogSearchProvider.ts | 34 +- .../SearchProvider/SearchProviderFactory.ts | 4 + .../SearchProviderResults.ts | 6 +- .../{ => SearchProvider}/SearchResult.ts | 8 +- .../SearchProvider/StubSearchProvider.ts | 31 ++ .../createStubSearchProvider.ts | 27 ++ .../SearchProvider/registerSearchProviders.ts | 15 + .../upsertSearchProviderFromJson.ts | 57 ++++ lib/Models/Terria.ts | 129 ++++++- lib/Models/WebFeatureServiceSearchProvider.ts | 221 ------------ lib/ReactViewModels/SearchState.ts | 24 +- lib/ReactViews/Mobile/MobileHeader.jsx | 44 +-- lib/ReactViews/SidePanel/SidePanel.jsx | 8 +- .../BingMapsSearchProviderTraits.ts | 35 ++ .../CatalogSearchProviderTraits.ts | 14 + .../LocationSearchProviderTraits.ts | 37 ++ .../SearchProvider/SearchProviderTraits.ts | 32 ++ .../WebFeatureServiceSearchProviderTraits.ts | 18 + .../CatalogItemNameSearchProviderViewModel.js | 317 ------------------ .../GazetteerSearchProviderViewModel.js | 227 ------------- lib/ViewModels/GnafSearchProviderViewModel.js | 119 ------- .../NominatimSearchProviderViewModel.js | 199 ----------- .../AustralianGazetteerSearchProviderSpec.ts | 4 +- ...alogItemNameSearchProviderViewModelSpec.js | 280 ---------------- 31 files changed, 1023 insertions(+), 1677 deletions(-) create mode 100644 architecture/0007-configurable-search-providers.md create mode 100644 lib/ModelMixins/SearchProviderMixin.ts create mode 100644 lib/ModelMixins/WebFeatureServiceSearchProviderMixin.ts delete mode 100644 lib/Models/BingMapsSearchProvider.ts delete mode 100644 lib/Models/SearchProvider.ts rename lib/Models/{ => SearchProvider}/AustralianGazetteerSearchProvider.ts (84%) create mode 100644 lib/Models/SearchProvider/BingMapsSearchProvider.ts rename lib/Models/{ => SearchProvider}/CatalogSearchProvider.ts (89%) create mode 100644 lib/Models/SearchProvider/SearchProviderFactory.ts rename lib/Models/{ => SearchProvider}/SearchProviderResults.ts (74%) rename lib/Models/{ => SearchProvider}/SearchResult.ts (87%) create mode 100644 lib/Models/SearchProvider/StubSearchProvider.ts create mode 100644 lib/Models/SearchProvider/createStubSearchProvider.ts create mode 100644 lib/Models/SearchProvider/registerSearchProviders.ts create mode 100644 lib/Models/SearchProvider/upsertSearchProviderFromJson.ts delete mode 100644 lib/Models/WebFeatureServiceSearchProvider.ts create mode 100644 lib/Traits/SearchProvider/BingMapsSearchProviderTraits.ts create mode 100644 lib/Traits/SearchProvider/CatalogSearchProviderTraits.ts create mode 100644 lib/Traits/SearchProvider/LocationSearchProviderTraits.ts create mode 100644 lib/Traits/SearchProvider/SearchProviderTraits.ts create mode 100644 lib/Traits/SearchProvider/WebFeatureServiceSearchProviderTraits.ts delete mode 100644 lib/ViewModels/CatalogItemNameSearchProviderViewModel.js delete mode 100644 lib/ViewModels/GazetteerSearchProviderViewModel.js delete mode 100644 lib/ViewModels/GnafSearchProviderViewModel.js delete mode 100644 lib/ViewModels/NominatimSearchProviderViewModel.js delete mode 100644 test/ViewModels/CatalogItemNameSearchProviderViewModelSpec.js diff --git a/architecture/0007-configurable-search-providers.md b/architecture/0007-configurable-search-providers.md new file mode 100644 index 00000000000..87fe3660d02 --- /dev/null +++ b/architecture/0007-configurable-search-providers.md @@ -0,0 +1,35 @@ +# 7. Configuration of search providers + +Date: 2021-01-19 + +## Status + +Proposed + +## Context + +Ticket. +https://github.com/TerriaJS/terriajs/issues/5141. + +### Intro + +The existing approach to the definition of SearchProviders requires the development team's involvement and rebuild of the application, which can be undesired behavior in highly dynamic environments. +It's much better to enable the administrators to maintain the search providers. + +## Proposal +- SearchProviders could greatly use the benefits of the new model system used for Catalog. +- Create a simple base Mixin (`SearchProviderMixin`) to attach SearchProviders to the Model system and enable easier creation of new search providers. +- Make SearchProviders configurable from `config.json`. +- Provide sensible defaults for everything. +- Typescript everything. +- Make everything translateable (administrator can specify i18next keys for all names) + +## Benefits + +- Much easier to implement new search providers. +- Much easier to update existing search providers, `urls` and `keys`. +- Offer administrators an option to decide wheter they want to load group members using `CatalogSearchProvider`. + +## Consequences + +This is quite a large change and should be thoroughly tested to avoid the possible bugs in the search providers migration. \ No newline at end of file diff --git a/lib/ModelMixins/SearchProviderMixin.ts b/lib/ModelMixins/SearchProviderMixin.ts new file mode 100644 index 00000000000..b53a05bd2e3 --- /dev/null +++ b/lib/ModelMixins/SearchProviderMixin.ts @@ -0,0 +1,92 @@ +import { action, observable } from "mobx"; +import { fromPromise } from "mobx-utils"; +import Ellipsoid from "terriajs-cesium/Source/Core/Ellipsoid"; +import CesiumMath from "terriajs-cesium/Source/Core/Math"; +import Rectangle from "terriajs-cesium/Source/Core/Rectangle"; +import Constructor from "../Core/Constructor"; +import Model from "../Models/Model"; +import SearchProviderResults from "../Models/SearchProvider/SearchProviderResults"; +import Terria from "../Models/Terria"; +import SearchProviderTraits from "../Traits/SearchProvider/SearchProviderTraits"; + +type SearchProvider = Model; + +function SearchProviderMixin>(Base: T) { + abstract class SearchProviderMixin extends Base { + abstract get type(): string; + @observable name = "Unknown"; + @observable isOpen = this.openByDefault; + + @action + toggleOpen() { + this.isOpen = !this.isOpen; + } + + @action + search(searchText: string): SearchProviderResults { + const result = new SearchProviderResults(Base); + result.resultsCompletePromise = fromPromise( + this.doSearch(searchText, result) + ); + return result; + } + + protected abstract doSearch( + searchText: string, + results: SearchProviderResults + ): Promise; + + shouldRunSearch(searchText: string) { + if ( + searchText === undefined || + /^\s*$/.test(searchText) || + (this.minCharacters && searchText.length < this.minCharacters) || + (this.minCharacters === undefined && + searchText.length < + this.terria.configParameters.searchBar.minCharacters) + ) { + return false; + } + return true; + } + + get hasSearchProviderMixin() { + return true; + } + } + return SearchProviderMixin; +} + +namespace SearchProviderMixin { + export interface SearchProviderMixin + extends InstanceType> {} + export function isMixedInto(model: any): model is SearchProviderMixin { + return model && model.hasSearchProviderMixin; + } +} + +export default SearchProviderMixin; + +interface MapCenter { + longitude: number; + latitude: number; +} + +export function getMapCenter(terria: Terria): MapCenter { + const view = terria.currentViewer.getCurrentCameraView(); + if (view.position !== undefined) { + const cameraPositionCartographic = Ellipsoid.WGS84.cartesianToCartographic( + view.position + ); + return { + longitude: CesiumMath.toDegrees(cameraPositionCartographic.longitude), + latitude: CesiumMath.toDegrees(cameraPositionCartographic.latitude) + }; + } else { + const center = Rectangle.center(view.rectangle); + return { + longitude: CesiumMath.toDegrees(center.longitude), + latitude: CesiumMath.toDegrees(center.latitude) + }; + } +} diff --git a/lib/ModelMixins/WebFeatureServiceSearchProviderMixin.ts b/lib/ModelMixins/WebFeatureServiceSearchProviderMixin.ts new file mode 100644 index 00000000000..70a0c26bf9e --- /dev/null +++ b/lib/ModelMixins/WebFeatureServiceSearchProviderMixin.ts @@ -0,0 +1,222 @@ +import i18next from "i18next"; +import { runInAction } from "mobx"; +import Resource from "terriajs-cesium/Source/Core/Resource"; +import URI from "urijs"; +import Constructor from "../Core/Constructor"; +import makeRealPromise from "../Core/makeRealPromise"; +import zoomRectangleFromPoint from "../Map/zoomRectangleFromPoint"; +import Model from "../Models/Model"; +import SearchProviderResults from "../Models/SearchProvider/SearchProviderResults"; +import SearchResult from "../Models/SearchProvider/SearchResult"; +import Terria from "../Models/Terria"; +import xml2json from "../ThirdParty/xml2json"; +import WebFeatureServiceSearchProviderTraits from "../Traits/SearchProvider/WebFeatureServiceSearchProviderTraits"; +import SearchProviderMixin from "./SearchProviderMixin"; + +function WebFeatureServiceSearchProviderMixin< + T extends Constructor> +>(Base: T) { + abstract class WebFeatureServiceSearchProviderMixin extends SearchProviderMixin( + Base + ) { + protected abstract featureToSearchResultFunction: ( + feature: any + ) => SearchResult; + protected abstract transformSearchText: + | ((searchText: string) => string) + | undefined; + protected abstract searchResultFilterFunction: + | ((feature: any) => boolean) + | undefined; + protected abstract searchResultScoreFunction: + | ((feature: any, searchText: string) => number) + | undefined; + + cancelRequest?: () => void; + + private _waitingForResults: boolean = false; + + getXml(url: string): Promise { + const resource = new Resource({ url }); + this._waitingForResults = true; + const xmlPromise = resource.fetchXML(); + this.cancelRequest = resource.request.cancelFunction; + return makeRealPromise(xmlPromise).finally(() => { + this._waitingForResults = false; + }); + } + + protected doSearch( + searchText: string, + results: SearchProviderResults + ): Promise { + results.results.length = 0; + results.message = undefined; + + if (this._waitingForResults) { + // There's been a new search! Cancel the previous one. + if (this.cancelRequest !== undefined) { + this.cancelRequest(); + this.cancelRequest = undefined; + } + this._waitingForResults = false; + } + + const originalSearchText = searchText; + + searchText = searchText.trim(); + if (this.transformSearchText !== undefined) { + searchText = this.transformSearchText(searchText); + } + if (searchText.length < 2) { + return Promise.resolve(); + } + + // Support for matchCase="false" is patchy, but we try anyway + const filter = ` + ${this.searchPropertyName} + *${searchText}*`; + + const _wfsServiceUrl = new URI(this.url); + _wfsServiceUrl.setSearch({ + service: "WFS", + request: "GetFeature", + typeName: this.searchPropertyTypeName, + version: "1.1.0", + srsName: "urn:ogc:def:crs:EPSG::4326", // srsName must be formatted like this for correct lat/long order >:( + filter: filter + }); + + return this.getXml(_wfsServiceUrl.toString()) + .then((xml: any) => { + let json: any = xml2json(xml); + let features: any[]; + if (json === undefined) { + results.message = i18next.t("viewModels.searchErrorOccurred"); + return; + } + + if (json.member !== undefined) { + features = json.member; + } else if (json.featureMember !== undefined) { + features = json.featureMember; + } else { + results.message = i18next.t("viewModels.searchNoPlaceNames"); + return; + } + + // if there's only one feature, make it an array + if (!Array.isArray(features)) { + features = [features]; + } + + const resultSet = new Set(); + + runInAction(() => { + if (this.searchResultFilterFunction !== undefined) { + features = features.filter(this.searchResultFilterFunction); + } + + if (features.length === 0) { + results.message = i18next.t("viewModels.searchNoPlaceNames"); + return; + } + + if (this.searchResultScoreFunction !== undefined) { + features = features.sort( + (featureA, featureB) => + this.searchResultScoreFunction!( + featureB, + originalSearchText + ) - + this.searchResultScoreFunction!(featureA, originalSearchText) + ); + } + + let searchResults = features + .map(this.featureToSearchResultFunction) + .map(result => { + result.clickAction = createZoomToFunction( + this, + result.location + ); + return result; + }); + + // If we don't have a scoring function, sort the search results now + // We can't do this earlier because we don't know what the schema of the unprocessed feature looks like + if (this.searchResultScoreFunction === undefined) { + // Put shorter results first + // They have a larger percentage of letters that the user actually typed in them + searchResults = searchResults.sort( + (featureA, featureB) => + featureA.name.length - featureB.name.length + ); + } + + // Remove results that have the same name and are close to each other + searchResults = searchResults.filter(result => { + const hash = `${result.name},${result.location?.latitude.toFixed( + 1 + )},${result.location?.longitude.toFixed(1)}`; + if (resultSet.has(hash)) { + return false; + } + resultSet.add(hash); + return true; + }); + + // append new results to all results + results.results.push(...searchResults); + }); + }) + .catch(e => { + if (results.isCanceled) { + // A new search has superseded this one, so ignore the result. + return; + } + results.message = i18next.t("viewModels.searchErrorOccurred"); + }); + } + get isWebFeatureServiceSearchProviderMixin() { + return true; + } + } + + return WebFeatureServiceSearchProviderMixin; +} + +namespace WebFeatureServiceSearchProviderMixin { + export interface WebFeatureServiceSearchProviderMixin + extends InstanceType< + ReturnType + > {} + export function isMixedInto( + model: any + ): model is WebFeatureServiceSearchProviderMixin { + return model && model.isWebFeatureServiceSearchProviderMixin; + } +} +export default WebFeatureServiceSearchProviderMixin; + +function createZoomToFunction( + model: WebFeatureServiceSearchProviderMixin.WebFeatureServiceSearchProviderMixin, + location: any +) { + // Server does not return information of a bounding box, just a location. + // bboxSize is used to expand a point + var bboxSize = 0.2; + var rectangle = zoomRectangleFromPoint( + location.latitude, + location.longitude, + bboxSize + ); + + const flightDurationSeconds: number = + model.flightDurationSeconds || + model.terria.configParameters.searchBar.flightDurationSeconds; + + return function() { + model.terria.currentViewer.zoomTo(rectangle, flightDurationSeconds); + }; +} diff --git a/lib/Models/BingMapsSearchProvider.ts b/lib/Models/BingMapsSearchProvider.ts deleted file mode 100644 index 4acf5b53bd7..00000000000 --- a/lib/Models/BingMapsSearchProvider.ts +++ /dev/null @@ -1,201 +0,0 @@ -import { observable, runInAction } from "mobx"; -import defaultValue from "terriajs-cesium/Source/Core/defaultValue"; -import defined from "terriajs-cesium/Source/Core/defined"; -import Ellipsoid from "terriajs-cesium/Source/Core/Ellipsoid"; -import CesiumMath from "terriajs-cesium/Source/Core/Math"; -import Rectangle from "terriajs-cesium/Source/Core/Rectangle"; -import Resource from "terriajs-cesium/Source/Core/Resource"; -import loadJsonp from "../Core/loadJsonp"; -import SearchProvider from "./SearchProvider"; -import SearchResult from "./SearchResult"; -import Terria from "./Terria"; -import SearchProviderResults from "./SearchProviderResults"; -import i18next from "i18next"; - -interface BingMapsSearchProviderOptions { - terria: Terria; - url?: string; - key?: string; - flightDurationSeconds?: number; - primaryCountry?: string; - culture?: string; -} - -export default class BingMapsSearchProvider extends SearchProvider { - readonly terria: Terria; - @observable url: string; - @observable key: string | undefined; - @observable flightDurationSeconds: number; - @observable primaryCountry: string; - @observable culture: string; - - constructor(options: BingMapsSearchProviderOptions) { - super(); - - this.terria = options.terria; - this.name = i18next.t("viewModels.searchLocations"); - this.url = defaultValue(options.url, "https://dev.virtualearth.net/"); - if (this.url.length > 0 && this.url[this.url.length - 1] !== "/") { - this.url += "/"; - } - this.key = options.key; - this.flightDurationSeconds = defaultValue( - options.flightDurationSeconds, - 1.5 - ); - this.primaryCountry = defaultValue(options.primaryCountry, "Australia"); - this.culture = defaultValue(options.culture, "en-au"); - - if (!this.key) { - console.warn( - "The " + - this.name + - " geocoder will always return no results because a Bing Maps key has not been provided. Please get a Bing Maps key from bingmapsportal.com and add it to parameters.bingMapsKey in config.json." - ); - } - } - - protected doSearch( - searchText: string, - searchResults: SearchProviderResults - ): Promise { - searchResults.results.length = 0; - searchResults.message = undefined; - - if (searchText === undefined || /^\s*$/.test(searchText)) { - return Promise.resolve(); - } - - this.terria.analytics.logEvent("search", "bing", searchText); - - let longitudeDegrees; - let latitudeDegrees; - - const view = this.terria.currentViewer.getCurrentCameraView(); - if (view.position !== undefined) { - const cameraPositionCartographic = Ellipsoid.WGS84.cartesianToCartographic( - view.position - ); - longitudeDegrees = CesiumMath.toDegrees( - cameraPositionCartographic.longitude - ); - latitudeDegrees = CesiumMath.toDegrees( - cameraPositionCartographic.latitude - ); - } else { - const center = Rectangle.center(view.rectangle); - longitudeDegrees = CesiumMath.toDegrees(center.longitude); - latitudeDegrees = CesiumMath.toDegrees(center.latitude); - } - - const promise: Promise = loadJsonp( - new Resource({ - url: - this.url + - "REST/v1/Locations?culture=" + - this.culture + - "&userLocation=" + - latitudeDegrees + - "," + - longitudeDegrees, - queryParameters: { - query: searchText, - key: this.key - } - }), - "jsonp" - ); - - return promise - .then(result => { - if (searchResults.isCanceled) { - // A new search has superseded this one, so ignore the result. - return; - } - - if (result.resourceSets.length === 0) { - searchResults.message = i18next.t("viewModels.searchNoLocations"); - return; - } - - var resourceSet = result.resourceSets[0]; - if (resourceSet.resources.length === 0) { - searchResults.message = i18next.t("viewModels.searchNoLocations"); - return; - } - - const primaryCountryLocations: any[] = []; - const otherLocations: any[] = []; - - // Locations in the primary country go on top, locations elsewhere go undernearth and we add - // the country name to them. - for (let i = 0; i < resourceSet.resources.length; ++i) { - const resource = resourceSet.resources[i]; - - let name = resource.name; - if (!defined(name)) { - continue; - } - - let list = primaryCountryLocations; - let isImportant = true; - - const country = resource.address - ? resource.address.countryRegion - : undefined; - if (defined(this.primaryCountry) && country !== this.primaryCountry) { - // Add this location to the list of other locations. - list = otherLocations; - isImportant = false; - - // Add the country to the name, if it's not already there. - if ( - defined(country) && - name.lastIndexOf(country) !== name.length - country.length - ) { - name += ", " + country; - } - } - - list.push( - new SearchResult({ - name: name, - isImportant: isImportant, - clickAction: createZoomToFunction(this, resource), - location: { - latitude: resource.point.coordinates[0], - longitude: resource.point.coordinates[1] - } - }) - ); - } - - runInAction(() => { - searchResults.results.push(...primaryCountryLocations); - searchResults.results.push(...otherLocations); - }); - - if (searchResults.results.length === 0) { - searchResults.message = i18next.t("viewModels.searchNoLocations"); - } - }) - .catch(() => { - if (searchResults.isCanceled) { - // A new search has superseded this one, so ignore the result. - return; - } - - searchResults.message = i18next.t("viewModels.searchErrorOccurred"); - }); - } -} - -function createZoomToFunction(model: BingMapsSearchProvider, resource: any) { - const [south, west, north, east] = resource.bbox; - const rectangle = Rectangle.fromDegrees(west, south, east, north); - - return function() { - const terria = model.terria; - terria.currentViewer.zoomTo(rectangle, model.flightDurationSeconds); - }; -} diff --git a/lib/Models/SearchProvider.ts b/lib/Models/SearchProvider.ts deleted file mode 100644 index de29a899952..00000000000 --- a/lib/Models/SearchProvider.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { action, observable } from "mobx"; -import { fromPromise } from "mobx-utils"; -import SearchProviderResults from "./SearchProviderResults"; - -export default abstract class SearchProvider { - @observable name = "Unknown"; - @observable isOpen = true; - - @action - toggleOpen() { - this.isOpen = !this.isOpen; - } - - @action - search(searchText: string): SearchProviderResults { - const result = new SearchProviderResults(this); - result.resultsCompletePromise = fromPromise( - this.doSearch(searchText, result) - ); - return result; - } - - protected abstract doSearch( - searchText: string, - results: SearchProviderResults - ): Promise; -} diff --git a/lib/Models/AustralianGazetteerSearchProvider.ts b/lib/Models/SearchProvider/AustralianGazetteerSearchProvider.ts similarity index 84% rename from lib/Models/AustralianGazetteerSearchProvider.ts rename to lib/Models/SearchProvider/AustralianGazetteerSearchProvider.ts index b0f352ffdea..9d0dbf50954 100644 --- a/lib/Models/AustralianGazetteerSearchProvider.ts +++ b/lib/Models/SearchProvider/AustralianGazetteerSearchProvider.ts @@ -1,7 +1,7 @@ -import i18next from "i18next"; +import WebFeatureServiceSearchProviderTraits from "../../Traits/SearchProvider/WebFeatureServiceSearchProviderTraits"; +import CreateModel from "../CreateModel"; +import WebFeatureServiceSearchProviderMixin from "./../../ModelMixins/WebFeatureServiceSearchProviderMixin"; import SearchResult from "./SearchResult"; -import Terria from "./Terria"; -import WebFeatureServiceSearchProvider from "./WebFeatureServiceSearchProvider"; const featureCodesToNamesMap = new Map([ ["AF", "Aviation"], @@ -220,23 +220,25 @@ const searchResultScoreFunction = function( return score; }; -const WFS_SERVICE_URL = - "http://services.ga.gov.au/gis/services/Australian_Gazetteer/MapServer/WFSServer"; -const SEARCH_PROPERTY_NAME = "Australian_Gazetteer:NameU"; -const SEARCH_PROPERTY_TYPE_NAME = "Australian_Gazetteer:Gazetteer_of_Australia"; - -export default function createAustralianGazetteerSearchProvider( - terria: Terria +export default class AustralianGazetteerSearchProvider extends WebFeatureServiceSearchProviderMixin( + CreateModel(WebFeatureServiceSearchProviderTraits) ) { - return new WebFeatureServiceSearchProvider({ - terria, - featureToSearchResultFunction, - wfsServiceUrl: WFS_SERVICE_URL, - searchPropertyName: SEARCH_PROPERTY_NAME, - searchPropertyTypeName: SEARCH_PROPERTY_TYPE_NAME, - transformSearchText: searchText => searchText.toUpperCase(), - name: i18next.t("viewModels.searchPlaceNames"), - searchResultFilterFunction: searchResultFilterFunction, - searchResultScoreFunction: searchResultScoreFunction - }); + static readonly type = "australian-gazetteer-search-provider"; + + get type(){ + return AustralianGazetteerSearchProvider.type; + } + + featureToSearchResultFunction: ( + feature: any + ) => SearchResult = featureToSearchResultFunction; + transformSearchText: + | ((searchText: string) => string) + | undefined = searchText => searchText.toUpperCase(); + searchResultFilterFunction: + | ((feature: any) => boolean) + | undefined = searchResultFilterFunction; + searchResultScoreFunction: + | ((feature: any, searchText: string) => number) + | undefined = searchResultScoreFunction; } diff --git a/lib/Models/SearchProvider/BingMapsSearchProvider.ts b/lib/Models/SearchProvider/BingMapsSearchProvider.ts new file mode 100644 index 00000000000..312c873c5e8 --- /dev/null +++ b/lib/Models/SearchProvider/BingMapsSearchProvider.ts @@ -0,0 +1,189 @@ +import i18next from "i18next"; +import { runInAction } from "mobx"; +import defined from "terriajs-cesium/Source/Core/defined"; +import Rectangle from "terriajs-cesium/Source/Core/Rectangle"; +import Resource from "terriajs-cesium/Source/Core/Resource"; +import loadJsonp from "../../Core/loadJsonp"; +import SearchProviderMixin, { + getMapCenter +} from "../../ModelMixins/SearchProviderMixin"; +import BingMapsSearchProviderTraits from "../../Traits/SearchProvider/BingMapsSearchProviderTraits"; +import CreateModel from "../CreateModel"; +import SearchProviderResults from "./SearchProviderResults"; +import SearchResult from "./SearchResult"; +import CommonStrata from "./../CommonStrata"; +import Terria from "../Terria"; + +export default class BingMapsSearchProvider extends SearchProviderMixin( + CreateModel(BingMapsSearchProviderTraits) +) { + static readonly type = "bing-maps-search-provider"; + + get type() { + return BingMapsSearchProvider.type; + } + + constructor(uniqueId: string | undefined, terria: Terria) { + super(uniqueId, terria); + if ( + (!this.key || this.key === "") && + this.terria.configParameters.bingMapsKey + ) { + this.setTrait( + CommonStrata.defaults, + "key", + this.terria.configParameters.bingMapsKey + ); + } + this.showWarning(); + } + + showWarning() { + if (!this.key || this.key === "") { + console.warn( + "The " + + this.name + + " geocoder will always return no results because a Bing Maps key has not been provided. Please get a Bing Maps key from bingmapsportal.com and add it to parameters.bingMapsKey in config.json." + ); + } + } + + protected doSearch( + searchText: string, + searchResults: SearchProviderResults + ): Promise { + console.log(this.key); + searchResults.results.length = 0; + searchResults.message = undefined; + + if (this.shouldRunSearch(searchText)) { + return Promise.resolve(); + } + + this.terria.analytics.logEvent("search", "bing", searchText); + + const searchQuery = new Resource({ + url: this.url + "REST/v1/Locations", + queryParameters: { + culture: this.culture, + query: searchText, + key: this.key + } + }); + + if (this.mapCenter) { + const mapCenter = getMapCenter(this.terria); + + searchQuery.appendQueryParameters({ + userLocation: `${mapCenter.latitude}, ${mapCenter.longitude}` + }); + } + + const promise: Promise = loadJsonp(searchQuery, "jsonp"); + + return promise + .then(result => { + if (searchResults.isCanceled) { + // A new search has superseded this one, so ignore the result. + return; + } + + if (result.resourceSets.length === 0) { + searchResults.message = i18next.t("viewModels.searchNoLocations"); + return; + } + + var resourceSet = result.resourceSets[0]; + if (resourceSet.resources.length === 0) { + searchResults.message = i18next.t("viewModels.searchNoLocations"); + return; + } + + const locations = this.sortByPriority(resourceSet.resources); + + runInAction(() => { + searchResults.results.push(...locations.primaryCountry); + searchResults.results.push(...locations.other); + }); + + if (searchResults.results.length === 0) { + searchResults.message = i18next.t("viewModels.searchNoLocations"); + } + }) + .catch(() => { + if (searchResults.isCanceled) { + // A new search has superseded this one, so ignore the result. + return; + } + + searchResults.message = i18next.t("viewModels.searchErrorOccurred"); + }); + } + + protected sortByPriority(resources: any[]) { + const primaryCountryLocations: any[] = []; + const otherLocations: any[] = []; + + // Locations in the primary country go on top, locations elsewhere go undernearth and we add + // the country name to them. + for (let i = 0; i < resources.length; ++i) { + const resource = resources[i]; + + let name = resource.name; + if (!defined(name)) { + continue; + } + + let list = primaryCountryLocations; + let isImportant = true; + + const country = resource.address + ? resource.address.countryRegion + : undefined; + if (defined(this.primaryCountry) && country !== this.primaryCountry) { + // Add this location to the list of other locations. + list = otherLocations; + isImportant = false; + + // Add the country to the name, if it's not already there. + if ( + defined(country) && + name.lastIndexOf(country) !== name.length - country.length + ) { + name += ", " + country; + } + } + + list.push( + new SearchResult({ + name: name, + isImportant: isImportant, + clickAction: createZoomToFunction(this, resource), + location: { + latitude: resource.point.coordinates[0], + longitude: resource.point.coordinates[1] + } + }) + ); + } + + return { + primaryCountry: primaryCountryLocations, + other: otherLocations + }; + } +} + +function createZoomToFunction(model: BingMapsSearchProvider, resource: any) { + const [south, west, north, east] = resource.bbox; + const rectangle = Rectangle.fromDegrees(west, south, east, north); + + return function() { + const flightDurationSeconds: number = + model.flightDurationSeconds || + model.terria.configParameters.searchBar.flightDurationSeconds; + + const terria = model.terria; + terria.currentViewer.zoomTo(rectangle, flightDurationSeconds); + }; +} diff --git a/lib/Models/CatalogSearchProvider.ts b/lib/Models/SearchProvider/CatalogSearchProvider.ts similarity index 89% rename from lib/Models/CatalogSearchProvider.ts rename to lib/Models/SearchProvider/CatalogSearchProvider.ts index 07dc5658a50..1a1e85c9ba2 100644 --- a/lib/Models/CatalogSearchProvider.ts +++ b/lib/Models/SearchProvider/CatalogSearchProvider.ts @@ -1,14 +1,12 @@ import { autorun, observable, runInAction } from "mobx"; -import SearchProvider from "./SearchProvider"; -import SearchResult from "./SearchResult"; -import Terria from "./Terria"; +import GroupMixin from "../../ModelMixins/GroupMixin"; +import ReferenceMixin from "../../ModelMixins/ReferenceMixin"; +import CatalogSearchProviderTraits from "../../Traits/SearchProvider/CatalogSearchProviderTraits"; +import CreateModel from "../CreateModel"; +import Terria from "../Terria"; +import SearchProviderMixin from "./../../ModelMixins/SearchProviderMixin"; import SearchProviderResults from "./SearchProviderResults"; -import GroupMixin from "../ModelMixins/GroupMixin"; -import ReferenceMixin from "../ModelMixins/ReferenceMixin"; - -interface CatalogSearchProviderOptions { - terria: Terria; -} +import SearchResult from "./SearchResult"; type UniqueIdString = string; type ResultMap = Map; @@ -95,18 +93,18 @@ export function loadAndSearchCatalogRecursively( }); } -export default class CatalogSearchProvider extends SearchProvider { - readonly terria: Terria; - @observable isSearching: boolean = false; - @observable debounceDurationOnceLoaded: number = 300; - - constructor(options: CatalogSearchProviderOptions) { - super(); +export default class CatalogSearchProvider extends SearchProviderMixin( + CreateModel(CatalogSearchProviderTraits) +) { + static readonly type = "catalog-search-provider"; - this.terria = options.terria; - this.name = "Catalog Items"; + get type() { + return CatalogSearchProvider.type; } + @observable isSearching: boolean = false; + @observable debounceDurationOnceLoaded: number = 300; + protected doSearch( searchText: string, searchResults: SearchProviderResults diff --git a/lib/Models/SearchProvider/SearchProviderFactory.ts b/lib/Models/SearchProvider/SearchProviderFactory.ts new file mode 100644 index 00000000000..cc9058c0c6a --- /dev/null +++ b/lib/Models/SearchProvider/SearchProviderFactory.ts @@ -0,0 +1,4 @@ +import ModelFactory from "../ModelFactory"; + +const SearchProviderFactory = new ModelFactory(); +export default SearchProviderFactory; diff --git a/lib/Models/SearchProviderResults.ts b/lib/Models/SearchProvider/SearchProviderResults.ts similarity index 74% rename from lib/Models/SearchProviderResults.ts rename to lib/Models/SearchProvider/SearchProviderResults.ts index 92ddfd1ddca..751e7f7cd60 100644 --- a/lib/Models/SearchProviderResults.ts +++ b/lib/Models/SearchProvider/SearchProviderResults.ts @@ -1,7 +1,7 @@ import { observable } from "mobx"; import SearchResult from "./SearchResult"; import { IPromiseBasedObservable, fromPromise } from "mobx-utils"; -import SearchProvider from "./SearchProvider"; +import SearchProviderMixin from "./../../ModelMixins/SearchProviderMixin"; export default class SearchProviderResults { @observable results: SearchResult[] = []; @@ -11,7 +11,9 @@ export default class SearchProviderResults { Promise.resolve() ); - constructor(readonly searchProvider: SearchProvider) {} + constructor( + readonly searchProvider: SearchProviderMixin.SearchProviderMixin + ) {} get isSearching() { return this.resultsCompletePromise.state === "pending"; diff --git a/lib/Models/SearchResult.ts b/lib/Models/SearchProvider/SearchResult.ts similarity index 87% rename from lib/Models/SearchResult.ts rename to lib/Models/SearchProvider/SearchResult.ts index 6b7a2c906ce..39dbbb7e251 100644 --- a/lib/Models/SearchResult.ts +++ b/lib/Models/SearchProvider/SearchResult.ts @@ -1,9 +1,9 @@ -import { BaseModel } from "./Model"; -import { observable, action } from "mobx"; +import { action, observable } from "mobx"; import defaultValue from "terriajs-cesium/Source/Core/defaultValue"; import defined from "terriajs-cesium/Source/Core/defined"; -import raiseErrorOnRejectedPromise from "./raiseErrorOnRejectedPromise"; -import GroupMixin from "../ModelMixins/GroupMixin"; +import GroupMixin from "../../ModelMixins/GroupMixin"; +import { BaseModel } from "../Model"; +import raiseErrorOnRejectedPromise from "../raiseErrorOnRejectedPromise"; export interface SearchResultOptions { name?: string; diff --git a/lib/Models/SearchProvider/StubSearchProvider.ts b/lib/Models/SearchProvider/StubSearchProvider.ts new file mode 100644 index 00000000000..50b19adb3db --- /dev/null +++ b/lib/Models/SearchProvider/StubSearchProvider.ts @@ -0,0 +1,31 @@ +import LocationSearchProviderTraits from "./../../Traits/SearchProvider/LocationSearchProviderTraits"; +import primitiveTrait from "./../../Traits/primitiveTrait"; +import SearchProviderMixin from "../../ModelMixins/SearchProviderMixin"; +import CreateModel from "../CreateModel"; +import SearchProviderResults from "./SearchProviderResults"; + +export class StubSearchProviderTraits extends LocationSearchProviderTraits { + @primitiveTrait({ + type: "boolean", + name: "Is experiencing issues", + description: + "Whether the search provider is experiencing issues which may cause search results to be unavailable" + }) + isExperiencingIssues: boolean = true; +} + +export default class StubSearchProvider extends SearchProviderMixin( + CreateModel(StubSearchProviderTraits) +) { + static readonly type = "stub-search-provider"; + get type(): string { + return StubSearchProvider.type; + } + + protected doSearch( + searchText: string, + results: SearchProviderResults + ): Promise { + return Promise.resolve(); + } +} diff --git a/lib/Models/SearchProvider/createStubSearchProvider.ts b/lib/Models/SearchProvider/createStubSearchProvider.ts new file mode 100644 index 00000000000..76434e11ba8 --- /dev/null +++ b/lib/Models/SearchProvider/createStubSearchProvider.ts @@ -0,0 +1,27 @@ +import Terria from "./../Terria"; +import StubSearchProvider from "./StubSearchProvider"; +import CommonStrata from "./../CommonStrata"; +import { BaseModel } from "../Model"; + +const getUniqueStubSearchProviderName = (terria: Terria) => { + const stubName = "[StubSearchProvider]"; + let uniqueId = stubName; + let idIncrement = 1; + while (terria.getModelById(BaseModel, uniqueId) !== undefined) { + uniqueId = stubName + " (" + idIncrement + ")"; + idIncrement++; + } + return uniqueId; +}; + +export default function createStubSearchProvider( + terria: Terria, + uniqueId?: string +): StubSearchProvider { + const idToUse = uniqueId || getUniqueStubSearchProviderName(terria); + const stub = new StubSearchProvider(idToUse, terria); + + stub.setTrait(CommonStrata.underride, "name", stub.uniqueId); + terria.addSearchProvider(stub); + return stub; +} diff --git a/lib/Models/SearchProvider/registerSearchProviders.ts b/lib/Models/SearchProvider/registerSearchProviders.ts new file mode 100644 index 00000000000..919a6da697c --- /dev/null +++ b/lib/Models/SearchProvider/registerSearchProviders.ts @@ -0,0 +1,15 @@ +import BingMapsSearchProvider from "./BingMapsSearchProvider"; +import AustralianGazetteerSearchProvider from "./AustralianGazetteerSearchProvider"; +import SearchProviderFactory from "./SearchProviderFactory"; + +export default function registerSearchProviders() { + SearchProviderFactory.register( + BingMapsSearchProvider.type, + BingMapsSearchProvider + ); + + SearchProviderFactory.register( + AustralianGazetteerSearchProvider.type, + AustralianGazetteerSearchProvider + ); +} diff --git a/lib/Models/SearchProvider/upsertSearchProviderFromJson.ts b/lib/Models/SearchProvider/upsertSearchProviderFromJson.ts new file mode 100644 index 00000000000..c52dca54b74 --- /dev/null +++ b/lib/Models/SearchProvider/upsertSearchProviderFromJson.ts @@ -0,0 +1,57 @@ +import Terria from "./../Terria"; +import ModelFactory from "./../ModelFactory"; +import { BaseModel } from "../Model"; +import i18next from "i18next"; +import TerriaError from "../../Core/TerriaError"; +import CommonStrata from "./../CommonStrata"; +import updateModelFromJson from "../updateModelFromJson"; +import createStubSearchProvider from "./createStubSearchProvider"; + +export default function upsertSearchProviderFromJson( + factory: ModelFactory, + terria: Terria, + stratumName: string, + json: any +) { + let uniqueId = json.id; + if (uniqueId === undefined) { + const id = json.localId || json.name; + if (id === undefined) { + throw new TerriaError({ + title: i18next.t("models.catalog.idForMatchingErrorTitle"), + message: i18next.t("models.catalog.idForMatchingErrorMessage") + }); + } + uniqueId = id; + } + + let model = terria.getModelById(BaseModel, uniqueId); + + if (model === undefined) { + model = factory.create(json.type, uniqueId, terria); + if (model === undefined) { + console.log( + new TerriaError({ + title: i18next.t("models.catalog.unsupportedTypeTitle"), + message: i18next.t("models.catalog.unsupportedTypeMessage", { + type: json.type + }) + }) + ); + model = createStubSearchProvider(terria, uniqueId); + const stub = model; + stub.setTrait(CommonStrata.underride, "isExperiencingIssues", true); + stub.setTrait(CommonStrata.override, "name", `${uniqueId} (Stub)`); + } + + model?.terria.addSearchProvider(model); + } + + try { + updateModelFromJson(model, stratumName, json); + } catch (error) { + console.log(`Error updating search provider from JSON`); + console.log(error); + model?.setTrait(CommonStrata.underride, "isExperiencingIssues", true); + } +} diff --git a/lib/Models/Terria.ts b/lib/Models/Terria.ts index a14b7795f26..899e0ced372 100644 --- a/lib/Models/Terria.ts +++ b/lib/Models/Terria.ts @@ -1,6 +1,14 @@ import { convertCatalog, convertShare } from "catalog-converter"; import i18next from "i18next"; -import { action, computed, observable, runInAction, toJS, when } from "mobx"; +import { + action, + computed, + isObservableArray, + observable, + runInAction, + toJS, + when +} from "mobx"; import { createTransformer } from "mobx-utils"; import Clock from "terriajs-cesium/Source/Core/Clock"; import defaultValue from "terriajs-cesium/Source/Core/defaultValue"; @@ -72,6 +80,8 @@ import Mappable, { isDataSource } from "./Mappable"; import { BaseModel } from "./Model"; import NoViewer from "./NoViewer"; import openGroup from "./openGroup"; +import SearchProviderFactory from "./SearchProvider/SearchProviderFactory"; +import upsertSearchProviderFromJson from "./SearchProvider/upsertSearchProviderFromJson"; import ShareDataService from "./ShareDataService"; import SplitItemReference from "./SplitItemReference"; import TimelineStack from "./TimelineStack"; @@ -117,7 +127,50 @@ interface ConfigParameters { helpContent?: HelpContentItem[]; helpContentTerms?: Term[]; languageConfiguration?: LanguageConfiguration; + /** + * Index of which brandBarElements to show for mobile header + */ displayOneBrand?: number; + /** + * The search bar allows requesting information from various search services at once. + */ + searchBar: SearchBar; +} + +interface SearchBar { + /** + * Input text field placeholder shown when no input has been given yet. The string is translateable. + * @default "search.placeholder" + */ + placeholder: string; + /** + * Maximum amount of entries in the suggestion list. + * @default 5 + */ + recommendedListLength: number; + /** + * Defines whether search results are to be sorted alphanumerically. + * @default true + */ + sortByName: boolean; + /** + * The duration of the camera flight to an entered location, in seconds. + * @default 1.5 + */ + flightDurationSeconds: number; + /** + * True if the geocoder should query as the user types to autocomplete. + * @default true + */ + autocomplete: boolean; + /** + * Minimum number of characters to start search. + */ + minCharacters: number; + /** + * Array of search providers to be used. + */ + searchProviders: any[]; } interface StartOptions { @@ -160,6 +213,7 @@ interface HomeCameraInit { export default class Terria { private models = observable.map(); + private locationSearchProviders = observable.map(); /** Map from share key -> id */ readonly shareKeysMap = observable.map(); /** Map from id -> share keys */ @@ -253,7 +307,35 @@ export default class Terria { helpContent: [], helpContentTerms: defaultTerms, languageConfiguration: undefined, - displayOneBrand: 0 // index of which brandBarElements to show for mobile header + displayOneBrand: 0, + searchBar: { + placeholder: "search.placeholder", + recommendedListLength: 5, + sortByName: true, + flightDurationSeconds: 1.5, + autocomplete: true, + minCharacters: 3, + searchProviders: [ + { + id: "search-provider/bing-maps", + type: "bing-maps-search-provider", + name: "search.bingMaps", + url: "https://dev.virtualearth.net/", + flightDurationSeconds: 1.5 + }, + { + id: "search-provider/australian-gazetteer", + type: "australian-gazetteer-search-provider", + name: "viewModels.searchPlaceNames", + url: + "http://services.ga.gov.au/gis/services/Australian_Gazetteer/MapServer/WFSServer", + searchPropertyName: "Australian_Gazetteer:NameU", + searchPropertyTypeName: "Australian_Gazetteer:Gazetteer_of_Australia", + flightDurationSeconds: 1.5, + minCharacters: 3 + } + ] + } }; @observable @@ -401,6 +483,32 @@ export default class Terria { shareKeys?.forEach(shareKey => this.addShareKey(model.uniqueId!, shareKey)); } + /** + * Add new SearchProvider to the list of SearchProviders. + */ + @action + addSearchProvider(model: BaseModel) { + if (model.uniqueId === undefined) { + throw new DeveloperError( + "A SearchProvider without a `uniqueId` cannot be added." + ); + } + + if (this.locationSearchProviders.has(model.uniqueId)) { + throw new RuntimeError( + "A SearchProvider with the specified ID already exists." + ); + } + + this.locationSearchProviders.set(model.uniqueId, model); + } + + get locationSearchProvidersArray() { + return [...this.locationSearchProviders.entries()].map(function(entry) { + return entry[1]; + }); + } + /** * Remove references to a model from Terria. */ @@ -533,6 +641,23 @@ export default class Terria { return this.updateApplicationUrl(options.applicationUrl.href); } }) + .then(() => { + let searchProviders = this.configParameters.searchBar.searchProviders; + if (!isObservableArray(searchProviders)) + throw new TerriaError({ + sender: SearchProviderFactory, + title: "SearchProviders", + message: "" + }); + searchProviders.forEach(searchProvider => { + upsertSearchProviderFromJson( + SearchProviderFactory, + this, + CommonStrata.definition, + searchProvider + ); + }); + }) .then(() => { this.loadPersistedMapSettings(); }); diff --git a/lib/Models/WebFeatureServiceSearchProvider.ts b/lib/Models/WebFeatureServiceSearchProvider.ts deleted file mode 100644 index 4b63b25328f..00000000000 --- a/lib/Models/WebFeatureServiceSearchProvider.ts +++ /dev/null @@ -1,221 +0,0 @@ -import i18next from "i18next"; -import { runInAction } from "mobx"; -import URI from "urijs"; -import zoomRectangleFromPoint from "../Map/zoomRectangleFromPoint"; -import xml2json from "../ThirdParty/xml2json"; -import SearchProvider from "./SearchProvider"; -import SearchProviderResults from "./SearchProviderResults"; -import SearchResult from "./SearchResult"; -import Terria from "./Terria"; -import defaultValue from "terriajs-cesium/Source/Core/defaultValue"; -import Resource from "terriajs-cesium/Source/Core/Resource"; -import makeRealPromise from "../Core/makeRealPromise"; - -export interface WebFeatureServiceSearchProviderOptions { - /** Base url for the service */ - wfsServiceUrl: string; - /** Which property to look for the search text in */ - searchPropertyName: string; - /** Type of the properties to search */ - searchPropertyTypeName: string; - /** Convert a WFS feature to a search result */ - featureToSearchResultFunction: (feature: any) => SearchResult; - terria: Terria; - /** How long it takes to zoom in when a search result is clicked */ - flightDurationSeconds?: number; - /** Apply a function to search text before it gets passed to the service. Useful for changing case */ - transformSearchText?: (searchText: string) => string; - /** Return true if a feature should be included in search results */ - searchResultFilterFunction?: (feature: any) => boolean; - /** Return a score that gets used to sort results (in descending order) */ - searchResultScoreFunction?: (feature: any, searchText: string) => number; - /** name of the search provider */ - name: string; -} - -export default class WebFeatureServiceSearchProvider extends SearchProvider { - private _wfsServiceUrl: uri.URI; - private _searchPropertyName: string; - private _searchPropertyTypeName: string; - private _featureToSearchResultFunction: (feature: any) => SearchResult; - flightDurationSeconds: number; - readonly terria: Terria; - private _transformSearchText: ((searchText: string) => string) | undefined; - private _searchResultFilterFunction: ((feature: any) => boolean) | undefined; - private _searchResultScoreFunction: - | ((feature: any, searchText: string) => number) - | undefined; - cancelRequest?: () => void; - private _waitingForResults: boolean = false; - - constructor(options: WebFeatureServiceSearchProviderOptions) { - super(); - this._wfsServiceUrl = new URI(options.wfsServiceUrl); - this._searchPropertyName = options.searchPropertyName; - this._searchPropertyTypeName = options.searchPropertyTypeName; - this._featureToSearchResultFunction = options.featureToSearchResultFunction; - this.terria = options.terria; - this.flightDurationSeconds = defaultValue( - options.flightDurationSeconds, - 1.5 - ); - this._transformSearchText = options.transformSearchText; - this._searchResultFilterFunction = options.searchResultFilterFunction; - this._searchResultScoreFunction = options.searchResultScoreFunction; - this.name = options.name; - } - - getXml(): Promise { - const resource = new Resource({ url: this._wfsServiceUrl.toString() }); - this._waitingForResults = true; - const xmlPromise = resource.fetchXML(); - this.cancelRequest = resource.request.cancelFunction; - return makeRealPromise(xmlPromise).finally(() => { - this._waitingForResults = false; - }); - } - - protected doSearch( - searchText: string, - results: SearchProviderResults - ): Promise { - results.results.length = 0; - results.message = undefined; - - if (this._waitingForResults) { - // There's been a new search! Cancel the previous one. - if (this.cancelRequest !== undefined) { - this.cancelRequest(); - this.cancelRequest = undefined; - } - this._waitingForResults = false; - } - - const originalSearchText = searchText; - - searchText = searchText.trim(); - if (this._transformSearchText !== undefined) { - searchText = this._transformSearchText(searchText); - } - if (searchText.length < 2) { - return Promise.resolve(); - } - - // Support for matchCase="false" is patchy, but we try anyway - const filter = ` - ${this._searchPropertyName} - *${searchText}*`; - - this._wfsServiceUrl.setSearch({ - service: "WFS", - request: "GetFeature", - typeName: this._searchPropertyTypeName, - version: "1.1.0", - srsName: "urn:ogc:def:crs:EPSG::4326", // srsName must be formatted like this for correct lat/long order >:( - filter: filter - }); - - return this.getXml() - .then((xml: any) => { - let json: any = xml2json(xml); - let features: any[]; - if (json === undefined) { - results.message = i18next.t("viewModels.searchErrorOccurred"); - return; - } - - if (json.member !== undefined) { - features = json.member; - } else if (json.featureMember !== undefined) { - features = json.featureMember; - } else { - results.message = i18next.t("viewModels.searchNoPlaceNames"); - return; - } - - // if there's only one feature, make it an array - if (!Array.isArray(features)) { - features = [features]; - } - - const resultSet = new Set(); - - runInAction(() => { - if (this._searchResultFilterFunction !== undefined) { - features = features.filter(this._searchResultFilterFunction); - } - - if (features.length === 0) { - results.message = i18next.t("viewModels.searchNoPlaceNames"); - return; - } - - if (this._searchResultScoreFunction !== undefined) { - features = features.sort( - (featureA, featureB) => - this._searchResultScoreFunction!(featureB, originalSearchText) - - this._searchResultScoreFunction!(featureA, originalSearchText) - ); - } - - let searchResults = features - .map(this._featureToSearchResultFunction) - .map(result => { - result.clickAction = createZoomToFunction(this, result.location); - return result; - }); - - // If we don't have a scoring function, sort the search results now - // We can't do this earlier because we don't know what the schema of the unprocessed feature looks like - if (this._searchResultScoreFunction === undefined) { - // Put shorter results first - // They have a larger percentage of letters that the user actually typed in them - searchResults = searchResults.sort( - (featureA, featureB) => - featureA.name.length - featureB.name.length - ); - } - - // Remove results that have the same name and are close to each other - searchResults = searchResults.filter(result => { - const hash = `${result.name},${result.location?.latitude.toFixed( - 1 - )},${result.location?.longitude.toFixed(1)}`; - if (resultSet.has(hash)) { - return false; - } - resultSet.add(hash); - return true; - }); - - // append new results to all results - results.results.push(...searchResults); - }); - }) - .catch(e => { - if (results.isCanceled) { - // A new search has superseded this one, so ignore the result. - return; - } - results.message = i18next.t("viewModels.searchErrorOccurred"); - }); - } -} - -function createZoomToFunction( - model: WebFeatureServiceSearchProvider, - location: any -) { - // Server does not return information of a bounding box, just a location. - // bboxSize is used to expand a point - var bboxSize = 0.2; - var rectangle = zoomRectangleFromPoint( - location.latitude, - location.longitude, - bboxSize - ); - - return function() { - model.terria.currentViewer.zoomTo(rectangle, model.flightDurationSeconds); - }; -} diff --git a/lib/ReactViewModels/SearchState.ts b/lib/ReactViewModels/SearchState.ts index 639668806e7..bcd1fe31248 100644 --- a/lib/ReactViewModels/SearchState.ts +++ b/lib/ReactViewModels/SearchState.ts @@ -1,16 +1,15 @@ -// import CatalogItemNameSearchProviderViewModel from "../ViewModels/CatalogItemNameSearchProviderViewModel"; import { - observable, - reaction, - IReactionDisposer, + action, computed, - action + IReactionDisposer, + observable, + reaction } from "mobx"; -import Terria from "../Models/Terria"; -import SearchProviderResults from "../Models/SearchProviderResults"; -import SearchProvider from "../Models/SearchProvider"; import filterOutUndefined from "../Core/filterOutUndefined"; -import CatalogSearchProvider from "../Models/CatalogSearchProvider"; +import CatalogSearchProvider from "../Models/SearchProvider/CatalogSearchProvider"; +import SearchProviderResults from "../Models/SearchProvider/SearchProviderResults"; +import Terria from "../Models/Terria"; +import SearchProviderMixin from "./../ModelMixins/SearchProviderMixin"; interface SearchStateOptions { terria: Terria; @@ -20,9 +19,10 @@ interface SearchStateOptions { export default class SearchState { @observable - catalogSearchProvider: SearchProvider | undefined; + catalogSearchProvider: SearchProviderMixin.SearchProviderMixin | undefined; - @observable locationSearchProviders: SearchProvider[]; + @observable + locationSearchProviders: SearchProviderMixin.SearchProviderMixin[]; @observable catalogSearchText: string = ""; @observable isWaitingToStartCatalogSearch: boolean = false; @@ -48,7 +48,7 @@ export default class SearchState { constructor(options: SearchStateOptions) { this.catalogSearchProvider = options.catalogSearchProvider || - new CatalogSearchProvider({ terria: options.terria }); + new CatalogSearchProvider("catalog-search-provider", options.terria); this.locationSearchProviders = options.locationSearchProviders || []; this._catalogSearchDisposer = reaction( diff --git a/lib/ReactViews/Mobile/MobileHeader.jsx b/lib/ReactViews/Mobile/MobileHeader.jsx index 5e0c64f1b94..372ee34aa6e 100644 --- a/lib/ReactViews/Mobile/MobileHeader.jsx +++ b/lib/ReactViews/Mobile/MobileHeader.jsx @@ -1,20 +1,21 @@ -import React from "react"; +import classNames from "classnames"; import createReactClass from "create-react-class"; +import { runInAction } from "mobx"; +import { observer } from "mobx-react"; import PropTypes from "prop-types"; -import SearchBox from "../Search/SearchBox"; -import MobileModalWindow from "./MobileModalWindow"; -import Branding from "../SidePanel/Branding"; -import Styles from "./mobile-header.scss"; -import Icon, { StyledIcon } from "../Icon"; -import MobileMenu from "./MobileMenu"; -import classNames from "classnames"; -import { removeMarker } from "../../Models/LocationMarkerUtils"; +import React from "react"; import { withTranslation } from "react-i18next"; import { withTheme } from "styled-components"; -import { observer } from "mobx-react"; -import { runInAction } from "mobx"; +import { useTranslationIfExists } from "../../Language/languageHelpers"; +import { removeMarker } from "../../Models/LocationMarkerUtils"; import Box from "../../Styled/Box"; import { RawButton } from "../../Styled/Button"; +import Icon, { StyledIcon } from "../Icon"; +import SearchBox from "../Search/SearchBox"; +import Branding from "../SidePanel/Branding"; +import Styles from "./mobile-header.scss"; +import MobileMenu from "./MobileMenu"; +import MobileModalWindow from "./MobileModalWindow"; const MobileHeader = observer( createReactClass({ @@ -141,10 +142,10 @@ const MobileHeader = observer( render() { const searchState = this.props.viewState.searchState; const displayOne = this.props.terria.configParameters.displayOneBrand; - const { t } = this.props; + const { t, terria } = this.props; const nowViewingLength = - this.props.terria.workbench.items !== undefined - ? this.props.terria.workbench.items.length + terria.workbench.items !== undefined + ? terria.workbench.items.length : 0; return ( @@ -193,7 +194,7 @@ const MobileHeader = observer( /> @@ -240,7 +241,9 @@ const MobileHeader = observer( searchText={searchState.locationSearchText} onSearchTextChanged={this.changeLocationSearchText} onDoSearch={this.searchLocations} - placeholder={t("search.placeholder")} + placeholder={useTranslationIfExists( + terria.configParameters.searchBar.placeholder + )} alwaysShowClear={true} onClear={this.closeLocationSearch} autoFocus={true} @@ -266,13 +269,10 @@ const MobileHeader = observer( menuLeftItems={this.props.menuLeftItems} viewState={this.props.viewState} allBaseMaps={this.props.allBaseMaps} - terria={this.props.terria} - showFeedback={!!this.props.terria.configParameters.feedbackUrl} - /> - + ); } diff --git a/lib/ReactViews/SidePanel/SidePanel.jsx b/lib/ReactViews/SidePanel/SidePanel.jsx index 83b49332499..daa5c7e51aa 100644 --- a/lib/ReactViews/SidePanel/SidePanel.jsx +++ b/lib/ReactViews/SidePanel/SidePanel.jsx @@ -4,13 +4,13 @@ import PropTypes from "prop-types"; import React from "react"; import { withTranslation } from "react-i18next"; import styled, { withTheme } from "styled-components"; +import { useTranslationIfExists } from "../../Language/languageHelpers"; +import { useRefForTerria } from "../Hooks/useRefForTerria"; import Icon, { StyledIcon } from "../Icon"; import SearchBoxAndResults from "../Search/SearchBoxAndResults"; import Workbench from "../Workbench/Workbench"; import FullScreenButton from "./FullScreenButton"; -import { useRefForTerria } from "../Hooks/useRefForTerria"; - import Box from "../../Styled/Box"; import Spacing from "../../Styled/Spacing"; import Text from "../../Styled/Text"; @@ -171,7 +171,9 @@ const SidePanel = observer( diff --git a/lib/Traits/SearchProvider/BingMapsSearchProviderTraits.ts b/lib/Traits/SearchProvider/BingMapsSearchProviderTraits.ts new file mode 100644 index 00000000000..f39d28a1227 --- /dev/null +++ b/lib/Traits/SearchProvider/BingMapsSearchProviderTraits.ts @@ -0,0 +1,35 @@ +import mixTraits from "../mixTraits"; +import primitiveTrait from "../primitiveTrait"; +import LocationSearchProviderTraits, { + SearchProviderMapCenterTraits +} from "./LocationSearchProviderTraits"; + +export default class BingMapsSearchProviderTraits extends mixTraits( + LocationSearchProviderTraits, + SearchProviderMapCenterTraits +) { + url: string = "https://dev.virtualearth.net/"; + + @primitiveTrait({ + type: "string", + name: "Key", + description: "The Bing Maps key." + }) + key?: string; + + @primitiveTrait({ + type: "string", + name: "Primary country", + description: "Name of the country to prioritize the search results." + }) + primaryCountry: string = "Australia"; + + @primitiveTrait({ + type: "string", + name: "Culture", + description: `Use the culture parameter to specify a culture for your request. + The culture parameter provides the result in the language of the culture. + For a list of supported cultures, see [Supported Culture Codes](https://docs.microsoft.com/en-us/bingmaps/rest-services/common-parameters-and-types/supported-culture-codes)` + }) + culture: string = "en-au"; +} diff --git a/lib/Traits/SearchProvider/CatalogSearchProviderTraits.ts b/lib/Traits/SearchProvider/CatalogSearchProviderTraits.ts new file mode 100644 index 00000000000..7808d9d81b4 --- /dev/null +++ b/lib/Traits/SearchProvider/CatalogSearchProviderTraits.ts @@ -0,0 +1,14 @@ +import mixTraits from "../mixTraits"; +import SearchProviderTraits from "./SearchProviderTraits"; +import primitiveTrait from "../primitiveTrait"; + +export default class CatalogSearchProviderTraits extends mixTraits( + SearchProviderTraits +) { + @primitiveTrait({ + type: "string", + name: "Name", + description: "Name of the search provider." + }) + name: string = "Catalog items"; +} diff --git a/lib/Traits/SearchProvider/LocationSearchProviderTraits.ts b/lib/Traits/SearchProvider/LocationSearchProviderTraits.ts new file mode 100644 index 00000000000..b7285613ff5 --- /dev/null +++ b/lib/Traits/SearchProvider/LocationSearchProviderTraits.ts @@ -0,0 +1,37 @@ +import ModelTraits from "../ModelTraits"; +import primitiveTrait from "../primitiveTrait"; +import SearchProviderTraits from "./SearchProviderTraits"; + +export default class LocationSearchProviderTraits extends SearchProviderTraits { + @primitiveTrait({ + type: "string", + name: "URL", + description: "The URL of search provider." + }) + url: string = ""; + + @primitiveTrait({ + type: "boolean", + name: "Open by default", + description: + "True if the geocoder should query as the user types to autocomplete." + }) + autocomplete?: boolean; + + @primitiveTrait({ + type: "number", + name: "URL", + description: "Time to move to the result location." + }) + flightDurationSeconds?: number; +} + +export class SearchProviderMapCenterTraits extends ModelTraits { + @primitiveTrait({ + type: "boolean", + name: "Map center", + description: + "Whether the current location of the map center is supplied with search request" + }) + mapCenter: boolean = true; +} diff --git a/lib/Traits/SearchProvider/SearchProviderTraits.ts b/lib/Traits/SearchProvider/SearchProviderTraits.ts new file mode 100644 index 00000000000..0c2ac76e391 --- /dev/null +++ b/lib/Traits/SearchProvider/SearchProviderTraits.ts @@ -0,0 +1,32 @@ +import ModelTraits from "../ModelTraits"; +import primitiveTrait from "../primitiveTrait"; + +export default class SearchProviderTraits extends ModelTraits { + @primitiveTrait({ + type: "string", + name: "Name", + description: "Name of the search provider." + }) + name: string = "unknown"; + + @primitiveTrait({ + type: "string", + name: "ID", + description: "Unique id of the search provider." + }) + id?: string; + + @primitiveTrait({ + type: "boolean", + name: "Open by default", + description: "Wheter are this search provider results open by default" + }) + openByDefault: boolean = true; + + @primitiveTrait({ + type: "number", + name: "Minimum characters", + description: "Minimum number of characters required for search to start" + }) + minCharacters?: number; +} diff --git a/lib/Traits/SearchProvider/WebFeatureServiceSearchProviderTraits.ts b/lib/Traits/SearchProvider/WebFeatureServiceSearchProviderTraits.ts new file mode 100644 index 00000000000..c95945ff74c --- /dev/null +++ b/lib/Traits/SearchProvider/WebFeatureServiceSearchProviderTraits.ts @@ -0,0 +1,18 @@ +import primitiveTrait from "../primitiveTrait"; +import LocationSearchProviderTraits from "./LocationSearchProviderTraits"; + +export default class WebFeatureServiceSearchProviderTraits extends LocationSearchProviderTraits { + @primitiveTrait({ + type: "string", + name: "Search property name", + description: "Which property to look for the search text in" + }) + searchPropertyName?: string; + + @primitiveTrait({ + type: "string", + name: "Search property type name", + description: "Type of the properties to search" + }) + searchPropertyTypeName?: string; +} diff --git a/lib/ViewModels/CatalogItemNameSearchProviderViewModel.js b/lib/ViewModels/CatalogItemNameSearchProviderViewModel.js deleted file mode 100644 index 91be2973e47..00000000000 --- a/lib/ViewModels/CatalogItemNameSearchProviderViewModel.js +++ /dev/null @@ -1,317 +0,0 @@ -"use strict"; - -/*global require*/ -var inherit = require("../Core/inherit"); -var runLater = require("../Core/runLater"); -var SearchProvider = require("../Models/SearchProvider").default; -var SearchResult = require("../Models/SearchResult").default; - -var defaultValue = require("terriajs-cesium/Source/Core/defaultValue").default; -var defined = require("terriajs-cesium/Source/Core/defined").default; -var when = require("terriajs-cesium/Source/ThirdParty/when").default; -const i18next = require("i18next").default; - -var CatalogItemNameSearchProviderViewModel = function(options) { - SearchProvider.call(this); - - options = defaultValue(options, defaultValue.EMPTY_OBJECT); - - this.terria = options.terria; - this._searchInProgress = undefined; - - this.name = i18next.t("viewModels.searchCatalogueItem"); - this.maxResults = defaultValue(options.maxResults, 10000); -}; - -inherit(SearchProvider, CatalogItemNameSearchProviderViewModel); - -CatalogItemNameSearchProviderViewModel.prototype.search = function(searchText) { - function parseSearchFilters() { - /* Filter search by type, eg 'is:wms fish' or '-is:wfs house'. Multiple 'is' clauses are or-ed. */ - var isRE = /(^|\s)(-?)is:([a-zA-Z0-9_-]+)\b/i; - while (searchText.match(isRE)) { - if (!searchText.match(isRE)[2]) { - searchFilters.typeIs.push(searchText.match(isRE)[3].toLowerCase()); - } else { - searchFilters.typeIsNot.push(searchText.match(isRE)[3].toLowerCase()); - } - searchText = searchText.replace(isRE, "").trim(); - } - /* Change number of search results: 'show:20' or 'show:all' */ - var showRE = /\bshow:(all|[0-9]+)\b/i; - while (searchText.match(showRE)) { - searchFilters.maxResults = searchText.match(showRE)[1].toLowerCase(); - if (searchFilters.maxResults === "all") { - searchFilters.maxResults = 10000; - } else { - searchFilters.maxResults = parseInt(searchFilters.maxResults, 10); - } - searchText = searchText.replace(showRE, "").trim(); - } - - /* Filter by URL: 'url:landgate.wa' or '-url:geoserver.nicta.com.au' */ - var urlRE = /(^|\s)(-?)url:([^ ]+)(\b|$)/i; - while (searchText.match(urlRE)) { - if (!searchText.match(urlRE)[2]) { - searchFilters.urlMatches.push(searchText.match(urlRE)[3].toLowerCase()); - } else { - searchFilters.urlDoesNotMatch.push( - searchText.match(urlRE)[3].toLowerCase() - ); - } - searchText = searchText.replace(urlRE, "").trim(); - } - } - - if (this._searchInProgress) { - this._searchInProgress.cancel = true; - this._searchInProgress = undefined; - } - - if (!defined(searchText) || /^\s*$/.test(searchText)) { - this.isSearching = false; - this.searchResults.removeAll(); - return; - } - - var searchFilters = { - typeIs: [], - typeIsNot: [], - urlMatches: [], - urlDoesNotMatch: [] - }; - parseSearchFilters(); - - this.isSearching = true; - this.searchResults.removeAll(); - this.searchMessage = undefined; - - this.terria.analytics.logEvent("search", "catalogue", searchText); - - var searchInProgress = (this._searchInProgress = { - cancel: false - }); - - var path = []; - var topLevelGroup = this.terria.catalog.group; - var promise = findMatchingItemsRecursively( - this, - searchInProgress, - new RegExp(searchText, "i"), - topLevelGroup, - path, - undefined, - searchFilters - ); - - var that = this; - return when(promise).then(function() { - that.isSearching = false; - - if (searchInProgress.cancel) { - return; - } - - if (that.searchResults.length === 0) { - that.searchMessage = i18next.t("viewModels.searchNoCatalogueItem"); - } - }); -}; - -function itemMatchesFilters(item, searchFilters) { - if ( - searchFilters.typeIs.length > 0 && - searchFilters.typeIs.indexOf(item.type.toLowerCase()) < 0 - ) { - return false; - } - if ( - searchFilters.typeIsNot.length > 0 && - searchFilters.typeIsNot.indexOf(item.type.toLowerCase()) >= 0 - ) { - return false; - } - if (!item.url) { - // if no URL, it can't match any positive filters, and can't fail by matching any negative ones. - return searchFilters.urlMatches.length === 0; - } - - var r = true; - // multiple -url: filters are and-ed - searchFilters.urlDoesNotMatch.forEach(function(e) { - // we just do simple string matching, not regex - if (item.url.toLowerCase().indexOf(e) >= 0) { - r = false; - } - }); - if (!r) { - return false; - } - if (searchFilters.urlMatches.length === 0) { - return true; - } - - r = false; - // multiple url: filters are or-ed - searchFilters.urlMatches.forEach(function(e) { - // we just do simple string matching, not regex - if (item.url.toLowerCase().indexOf(e) >= 0) { - r = true; - } - }); - - return r; -} - -function findMatchingItemsRecursively( - viewModel, - searchInProgress, - searchExpression, - group, - path, - promise, - searchFilters -) { - path.push(group); - if (!defined(searchFilters)) { - searchFilters = {}; - } - var items = group.items; - var maxResults = defined(searchFilters.maxResults) - ? searchFilters.maxResults - : viewModel.maxResults; - for ( - var i = 0; - !searchInProgress.cancel && - viewModel.searchResults.length < maxResults && - i < items.length; - ++i - ) { - var item = items[i]; - - if (item.isHidden) { - continue; - } - - // Match non-top-level items whose name contain the search text. - if ( - searchExpression.test(item.name) && - itemMatchesFilters(item, searchFilters) - ) { - addSearchResult(viewModel.searchResults, item, path); - } - - if (defined(item.items)) { - promise = loadAndSearchGroup( - viewModel, - item, - searchInProgress, - searchExpression, - path, - promise, - searchFilters - ); - } - } - - path.pop(); - - return promise; -} - -function loadAndSearchGroup( - viewModel, - group, - searchInProgress, - searchExpression, - path, - promise, - searchFilters -) { - path = path.slice(); - - // Let a previous load (represented by 'promise') finish first. - return when(promise).then(function() { - if (searchInProgress.cancel) { - return; - } - return runLater(function() { - if (searchInProgress.cancel) { - return; - } - var loadPromise = group.load(); - if (defined(loadPromise) && group.isLoading) { - return loadPromise - .then(function() { - return findMatchingItemsRecursively( - viewModel, - searchInProgress, - searchExpression, - group, - path, - undefined, - searchFilters - ); - }) - .otherwise(ignoreLoadErrors); - } else { - return findMatchingItemsRecursively( - viewModel, - searchInProgress, - searchExpression, - group, - path, - undefined, - searchFilters - ); - } - }); - }); -} - -function ignoreLoadErrors() {} - -function addSearchResult(searchResults, item, path) { - // Get the index of an existing search result that refers to the same catalog item (or -1) - var index = -1; - for (var j = 0; j < searchResults.length; ++j) { - if (item === searchResults[j].catalogItem) { - index = j; - break; - } - } - - // If a search result for item already exists, modify the tooltip of that search result - var prefix = i18next.t("viewModels.inMultipleLocations"); - if (index >= 0) { - if (searchResults[index].tooltip.indexOf(prefix) !== 0) { - searchResults[index].tooltip = searchResults[index].tooltip.replace( - /^In /, - prefix - ); - } - } else { - // Otherwise, create a new search result - searchResults.push( - new SearchResult({ - name: item.name, - isImportant: true, - catalogItem: item, - tooltip: pathToTooltip(path) - }) - ); - } -} - -function pathToTooltip(path) { - var result = i18next.t("viewModels.inDataCatalogue"); - - // Start at 1 to skip "Root Group" - for (var i = 1; i < path.length; ++i) { - result += " -> " + path[i].name; - } - - return result; -} - -module.exports = CatalogItemNameSearchProviderViewModel; diff --git a/lib/ViewModels/GazetteerSearchProviderViewModel.js b/lib/ViewModels/GazetteerSearchProviderViewModel.js deleted file mode 100644 index c2866d8c39d..00000000000 --- a/lib/ViewModels/GazetteerSearchProviderViewModel.js +++ /dev/null @@ -1,227 +0,0 @@ -"use strict"; - -/*global require*/ -var inherit = require("../Core/inherit"); -var SearchProviderViewModel = require("./SearchProviderViewModel"); -var SearchResultViewModel = require("../Models/SearchResultViewModel"); -var zoomRectangleFromPoint = require("../Map/zoomRectangleFromPoint"); - -var defaultValue = require("terriajs-cesium/Source/Core/defaultValue").default; -var defined = require("terriajs-cesium/Source/Core/defined").default; -const i18next = require("i18next").default; -var loadJson = require("../Core/loadJson").default; - -var GazetteerSearchProviderViewModel = function(options) { - SearchProviderViewModel.call(this); - - options = defaultValue(options, defaultValue.EMPTY_OBJECT); - - this.terria = options.terria; - this._geocodeInProgress = undefined; - - this.name = i18next.t("viewModels.searchPlaceNames"); - this.url = defaultValue( - options.url, - "http://www.ga.gov.au/gazetteer-search/gazetteer2012/select/" - ); - this.forceUseOfProxy = defaultValue(options.forceUseOfProxy, true); - this.flightDurationSeconds = defaultValue(options.flightDurationSeconds, 1.5); -}; - -inherit(SearchProviderViewModel, GazetteerSearchProviderViewModel); - -GazetteerSearchProviderViewModel.prototype.search = function(searchText) { - if (!defined(searchText) || /^\s*$/.test(searchText)) { - this.isSearching = false; - this.searchResults.removeAll(); - return; - } - - this.isSearching = true; - this.searchResults.removeAll(); - this.searchMessage = undefined; - - this.terria.analytics.logEvent("search", "gazetteer", searchText); - - // If there is already a search in progress, cancel it. - if (defined(this._geocodeInProgress)) { - this._geocodeInProgress.cancel = true; - this._geocodeInProgress = undefined; - } - - // I don't know how to get server-side sorting, so we have to retrieve lots of rows, then filter. - // Retrieving only 10 rows (default) means "Sydney" fails to actually retrieve Sydney... - - // Worth considering using "fq=class_code:(R%20X)", which would only return towns, states etc - - var url = this.url + "?q=name:*" + searchText + "*"; - // filter out bores, built structures, caves, landmarks, trig stations - url += "%20-class_code:(D%20E%20G%20J%20T)%20-feature_code:PRS"; - url += "&rows=200"; - - if (this.forceUseOfProxy || this.terria.corsProxy.shouldUseProxy(url)) { - url = this.terria.corsProxy.getURL(url); - } - - var promise = loadJson(url); - - var that = this; - var geocodeInProgress = (this._geocodeInProgress = promise - .then(function(solrQueryResponse) { - if (geocodeInProgress.cancel) { - return; - } - that.isSearching = false; - - if ( - defined(solrQueryResponse.response) && - solrQueryResponse.response.numFound > 0 - ) { - var results = solrQueryResponse.response.docs.sort(function(a, b) { - return sortResults(a, b, searchText); - }); - results = stripDuplicates(results); - results.slice(0, 10).forEach(function(result) { - var locLat = result.location.split(",")[0]; - var locLng = result.location.split(",")[1]; - - that.searchResults.push( - new SearchResultViewModel({ - name: - result.name + - (result.state_id !== "N/A" ? " (" + result.state_id + ")" : ""), - isImportant: !!result.feature_code.match( - "^(CNTY|CONT|DI|PRSH|STAT|LOCB|LOCU|SUB|URBN)$" - ), - clickAction: createZoomToFunction(that, locLat, locLng), - location: { - latitude: locLat, - longitude: locLng - } - }) - ); - }); - } else { - that.searchMessage = i18next.t("viewModels.searchNoPlaceNames"); - } - - that.isSearching = false; - }) - .otherwise(function() { - if (geocodeInProgress.cancel) { - return; - } - - that.isSearching = false; - that.searchMessage = i18next.t("viewModels.searchErrorOccurred"); - })); - - return geocodeInProgress; -}; - -// Given a list of results sorted in decreasing importance, strip results that are close to another result with the same name -function stripDuplicates(results) { - var i; - var placeshash = {}; - var stripped = []; - for (i = 0; i < results.length; i++) { - var lat = Number(results[i].location.split(",")[0]).toFixed(1); - var lng = Number(results[i].location.split(",")[1]).toFixed(1); - - var hash = results[i].name + "_" + lat + " " + lng; - if (!defined(placeshash[hash])) { - placeshash[hash] = results[i]; - stripped.push(results[i]); - } - } - return stripped; -} - -function featureScore(a, searchText) { - // could be further refined using http://www.ga.gov.au/image_cache/GA19367.pdf - // feature_code is defined on p24 - // class_code (A-X) matches a row in the table on p23 (eg, 'C' is 'Bays & Gulfs') - var featureTypes = [ - "CONT", - "STAT", - "URBN", - "LOCB", - "LOCU", - "SUB", - "DI", - "CNTY", - "DI" - ]; - featureTypes.push( - "HBR", - "CAPE", - "PEN", - "PT", - "BAY", - "PORT", - "GULF", - "BGHT", - "COVE", - "MT", - "HILL", - "PEAK", - "OCEN", - "SEA", - "RESV", - "LAKE", - "RES", - "STRM" - ); - featureTypes.push("PLN", "REEF", "VAL", "PRSH"); - - var aScore = 10000 - (featureTypes.indexOf(a.feature_code) + 1) * 100; - if (aScore === 10000) { - aScore = 0; - } - - if (a.name.toUpperCase() === searchText.toUpperCase()) { - // Bonus for exact match - // More testing required to choose this value. Should "Geelong" (parish in Queensland) outrank "North Geelong" (suburb in Vic)? - aScore += 10 * 100; - } else if (a.name.match(new RegExp("^" + searchText + "\\b", "i"))) { - // bonus for first word match ('Steve Bay' better than 'West Steve Bay') - aScore += 8 * 100; - } else if (a.name.match(new RegExp("\\b" + searchText + "\\b", "i"))) { - // bonus for word-boundary match ('Steve' better than 'Steveville') - aScore += 4 * 100; - } else if (a.name.match(new RegExp("^" + searchText, "i"))) { - // bonus for word-boundary match ('Steventon' better than 'Nosteve Town') - aScore += 2 * 100; - } - if (a.state_id === "N/A") { - // seems to be an indicator of a low quality result - aScore -= 10 * 100; - } - if (a.status === "U") { - // Not official? H=historical, U=unofficial. Bleh. - aScore -= 5 * 100; - } - if (a.status === "H") { - aScore -= 10 * 100; - } - - return aScore; -} - -function sortResults(a, b, searchText) { - return featureScore(b, searchText) - featureScore(a, searchText); -} - -function createZoomToFunction(viewModel, locLat, locLng) { - // Server does not return information of a bounding box, just a location. - // bboxSize is used to expand a point - var bboxSize = 0.2; - var rectangle = zoomRectangleFromPoint(locLat, locLng, bboxSize); - - return function() { - var terria = viewModel.terria; - terria.currentViewer.zoomTo(rectangle, viewModel.flightDurationSeconds); - }; -} - -module.exports = GazetteerSearchProviderViewModel; diff --git a/lib/ViewModels/GnafSearchProviderViewModel.js b/lib/ViewModels/GnafSearchProviderViewModel.js deleted file mode 100644 index 1b8412f32cf..00000000000 --- a/lib/ViewModels/GnafSearchProviderViewModel.js +++ /dev/null @@ -1,119 +0,0 @@ -"use strict"; - -/*global require*/ -var inherit = require("../Core/inherit"); -var SearchProviderViewModel = require("./SearchProviderViewModel"); -var SearchResultViewModel = require("../Models/SearchResultViewModel"); -var zoomRectangleFromPoint = require("../Map/zoomRectangleFromPoint"); -var GnafApi = require("../Models/GnafApi"); - -var defaultValue = require("terriajs-cesium/Source/Core/defaultValue").default; -var defined = require("terriajs-cesium/Source/Core/defined").default; -const i18next = require("i18next").default; - -/** - * Search provider that uses the Data61 Elastic Search GNAF service to look up addresses. - * - * @param options.terria Terria instance - * @param [options.gnafApi] The GnafApi object to query - if none is provided one will be created using terria.corsProxy - * and the default settings. - * @param [options.flightDurationSeconds] The number of seconds for the flight animation when zooming to new results. - * @constructor - */ -var GnafSearchProviderViewModel = function(options) { - SearchProviderViewModel.call(this); - - options = defaultValue(options, defaultValue.EMPTY_OBJECT); - this.terria = options.terria; - - var url = defaultValue( - options.url, - this.terria.configParameters.gnafSearchUrl - ); - - this.name = i18next.t("viewModels.searchAddresses"); - this.gnafApi = defaultValue( - options.gnafApi, - new GnafApi(this.terria.corsProxy, url) - ); - this._geocodeInProgress = undefined; - this.flightDurationSeconds = defaultValue(options.flightDurationSeconds, 1.5); -}; - -inherit(SearchProviderViewModel, GnafSearchProviderViewModel); - -GnafSearchProviderViewModel.prototype.search = function(searchText) { - this.isSearching = true; - this.searchResults.removeAll(); - - if (!defined(searchText) || /^\s*$/.test(searchText)) { - return; - } - - this.searchMessage = undefined; - this.terria.analytics.logEvent("search", "gnaf", searchText); - - // If there is already a search in progress, cancel it. - if (defined(this._geocodeInProgress)) { - this._geocodeInProgress.cancel = true; - this._geocodeInProgress = undefined; - } - - var thisGeocode = this.gnafApi - .geoCode(searchText) - .then( - function(hits) { - if (thisGeocode.cancel) { - return; - } - - this.isSearching = false; - - if (hits.length === 0) { - this.searchMessage = i18next.t("viewModels.searchNoLocations"); - return; - } - - this.searchResults = hits.map( - function(hit) { - return new SearchResultViewModel({ - name: hit.name, - isImportant: hit.locational, - clickAction: createZoomToFunction( - this.terria, - hit.location, - this.flightDurationSeconds - ), - location: hit.location - }); - }.bind(this) - ); - }.bind(this) - ) - .otherwise( - function() { - if (thisGeocode.cancel) { - return; - } - - this.isSearching = false; - this.searchMessage = i18next.t("viewModels.searchErrorOccurred"); - }.bind(this) - ); - - this._geocodeInProgress = thisGeocode; -}; - -function createZoomToFunction(terria, location, duration) { - var rectangle = zoomRectangleFromPoint( - location.latitude, - location.longitude, - 0.01 - ); - - return function() { - terria.currentViewer.zoomTo(rectangle, duration); - }; -} - -module.exports = GnafSearchProviderViewModel; diff --git a/lib/ViewModels/NominatimSearchProviderViewModel.js b/lib/ViewModels/NominatimSearchProviderViewModel.js deleted file mode 100644 index 71e248956c1..00000000000 --- a/lib/ViewModels/NominatimSearchProviderViewModel.js +++ /dev/null @@ -1,199 +0,0 @@ -"use strict"; - -/*global require*/ -var inherit = require("../Core/inherit"); -var SearchProviderViewModel = require("./SearchProviderViewModel"); -var SearchResultViewModel = require("../Models/SearchResultViewModel"); - -var CesiumMath = require("terriajs-cesium/Source/Core/Math").default; -var Cartesian2 = require("terriajs-cesium/Source/Core/Cartesian2").default; -var defaultValue = require("terriajs-cesium/Source/Core/defaultValue").default; -var defined = require("terriajs-cesium/Source/Core/defined").default; -var Ellipsoid = require("terriajs-cesium/Source/Core/Ellipsoid").default; -var loadJson = require("../Core/loadJson").default; -var Rectangle = require("terriajs-cesium/Source/Core/Rectangle").default; -var when = require("terriajs-cesium/Source/ThirdParty/when").default; -const i18next = require("i18next").default; - -var NominatimSearchProviderViewModel = function(options) { - SearchProviderViewModel.call(this); - - options = defaultValue(options, defaultValue.EMPTY_OBJECT); - - this.terria = options.terria; - this.countryCodes = defined(options.countryCodes) - ? "&countrycodes=" + options.countryCodes - : ""; - - this._geocodeInProgress = undefined; - - this.name = "Nominatim"; - this.url = defaultValue(options.url, "//nominatim.openstreetmap.org/"); - if (this.url.length > 0 && this.url[this.url.length - 1] !== "/") { - this.url += "/"; - } - this.flightDurationSeconds = defaultValue(options.flightDurationSeconds, 1.5); - this.limitBounded = 2; - this.limitOthers = 2; -}; - -inherit(SearchProviderViewModel, NominatimSearchProviderViewModel); - -NominatimSearchProviderViewModel.prototype.search = function(searchText) { - if (!defined(searchText) || /^\s*$/.test(searchText)) { - this.isSearching = false; - this.searchResults.removeAll(); - return; - } - - this.isSearching = true; - this.searchResults.removeAll(); - this.searchMessage = undefined; - - this.terria.analytics.logEvent("search", "nominatim", searchText); - - // If there is already a search in progress, cancel it. - if (defined(this._geocodeInProgress)) { - this._geocodeInProgress.cancel = true; - this._geocodeInProgress = undefined; - } - - var bboxStr = ""; - - if (defined(this.terria.cesium)) { - var viewer = this.terria.cesium.viewer; - var posUL = viewer.camera.pickEllipsoid( - new Cartesian2(0, 0), - Ellipsoid.WGS84 - ); - var posLR = viewer.camera.pickEllipsoid( - new Cartesian2(viewer.canvas.width, viewer.canvas.height), - Ellipsoid.WGS84 - ); - if (defined(posUL) && defined(posLR)) { - posUL = Ellipsoid.WGS84.cartesianToCartographic(posUL); - posLR = Ellipsoid.WGS84.cartesianToCartographic(posLR); - bboxStr = - "&viewbox=" + - CesiumMath.toDegrees(posUL.longitude) + - "," + - CesiumMath.toDegrees(posUL.latitude) + - "," + - CesiumMath.toDegrees(posLR.longitude) + - "," + - CesiumMath.toDegrees(posLR.latitude); - } else { - bboxStr = ""; - } - } else if (defined(this.terria.leaflet)) { - var bbox = this.terria.leaflet.map.getBounds(); - bboxStr = - "&viewbox=" + - bbox.getWest() + - "," + - bbox.getNorth() + - "," + - bbox.getEast() + - "," + - bbox.getSouth(); - } - var promiseBounded = loadJson( - this.url + - "search?q=" + - searchText + - bboxStr + - "&bounded=1&format=json" + - this.countryCodes + - "&limit=" + - this.limitBounded - ); - var promiseOthers = loadJson( - this.url + - "search?q=" + - searchText + - "&format=json" + - this.countryCodes + - "&limit=" + - this.limitOthers - ); - - var that = this; - var geocodeInProgress = (this._geocodeInProgress = { - cancel: false - }); - - return when - .all([promiseBounded, promiseOthers]) - .then(function(result) { - if (geocodeInProgress.cancel) { - return; - } - that.isSearching = false; - - if (result.length === 0) { - return; - } - - var locations = []; - - // Locations in the bounded query go on top, locations elsewhere go undernearth - var findDbl = function(elts, id) { - return elts.filter(function(elt) { - return elt.id === id; - })[0]; - }; - - for (var i = 0; i < result.length; ++i) { - for (var j = 0; j < result[i].length; ++j) { - var resource = result[i][j]; - - var name = resource.display_name; - if (!defined(name)) { - continue; - } - - if (!findDbl(locations, resource.place_id)) { - locations.push( - new SearchResultViewModel({ - id: resource.place_id, - name: name, - isImportant: true, - clickAction: createZoomToFunction(that, resource) - }) - ); - } - } - } - - that.searchResults.push.apply(that.searchResults, locations); - - if (that.searchResults.length === 0) { - that.searchMessage = i18next.t("viewModels.searchNoLocations"); - } - }) - .otherwise(function() { - if (geocodeInProgress.cancel) { - return; - } - - that.isSearching = false; - that.searchMessage = i18next.t("viewModels.searchErrorOccurred"); - }); -}; - -function createZoomToFunction(viewModel, resource) { - var bbox = resource.boundingbox; - var south = bbox[0]; - var west = bbox[2]; - var north = bbox[1]; - var east = bbox[3]; - - var rectangle = Rectangle.fromDegrees(west, south, east, north); - - return function() { - var terria = viewModel.terria; - terria.currentViewer.zoomTo(rectangle, viewModel.flightDurationSeconds); - }; -} - -module.exports = NominatimSearchProviderViewModel; diff --git a/test/Models/AustralianGazetteerSearchProviderSpec.ts b/test/Models/AustralianGazetteerSearchProviderSpec.ts index b31b8ba790f..33a4a48047c 100644 --- a/test/Models/AustralianGazetteerSearchProviderSpec.ts +++ b/test/Models/AustralianGazetteerSearchProviderSpec.ts @@ -1,7 +1,7 @@ import { configure } from "mobx"; -import createAustralianGazetteerSearchProvider from "../../lib/Models/AustralianGazetteerSearchProvider"; +import createAustralianGazetteerSearchProvider from "../../lib/Models/SearchProvider/AustralianGazetteerSearchProvider"; import Terria from "../../lib/Models/Terria"; -import WebFeatureServiceSearchProvider from "../../lib/Models/WebFeatureServiceSearchProvider"; +import WebFeatureServiceSearchProvider from "../../lib/Models/SearchProvider/WebFeatureServiceSearchProvider"; const wfsResponseXml = require("raw-loader!../../wwwroot/test/WFS/getWithFilter.xml"); diff --git a/test/ViewModels/CatalogItemNameSearchProviderViewModelSpec.js b/test/ViewModels/CatalogItemNameSearchProviderViewModelSpec.js deleted file mode 100644 index b672bbcfae5..00000000000 --- a/test/ViewModels/CatalogItemNameSearchProviderViewModelSpec.js +++ /dev/null @@ -1,280 +0,0 @@ -"use strict"; - -/*global require,describe,it,expect,beforeEach*/ -var CatalogGroup = require("../../lib/Models/CatalogGroup"); -var CatalogItem = require("../../lib/Models/CatalogItem"); -var WebMapServiceCatalogItem = require("../../lib/Models/WebMapServiceCatalogItem"); -var GeoJsonCatalogItem = require("../../lib/Models/GeoJsonCatalogItem"); -var CatalogItemNameSearchProviderViewModel = require("../../lib/ViewModels/CatalogItemNameSearchProviderViewModel"); -var inherit = require("../../lib/Core/inherit"); -var runLater = require("../../lib/Core/runLater"); -var Terria = require("../../lib/Models/Terria"); - -describe("CatalogItemNameSearchProviderViewModel", function() { - var terria; - var searchProvider; - - beforeEach(function() { - terria = new Terria({ - baseUrl: "./" - }); - - searchProvider = new CatalogItemNameSearchProviderViewModel({ - terria: terria - }); - }); - - it("finds catalog items in a case-insensitive manner", function(done) { - var catalogGroup = terria.catalog.group; - - var item = new CatalogItem(terria); - item.name = "Thing to find"; - catalogGroup.add(item); - - searchProvider - .search("thing") - .then(function() { - expect(searchProvider.searchResults.length).toBe(1); - expect(searchProvider.searchResults[0].name).toBe("Thing to find"); - }) - .then(done) - .otherwise(done.fail); - }); - - it("finds catalog groups in a case-insensitive manner", function(done) { - var catalogGroup = terria.catalog.group; - - var item = new CatalogGroup(terria); - item.name = "Group to find"; - catalogGroup.add(item); - - searchProvider - .search("to") - .then(function() { - expect(searchProvider.searchResults.length).toBe(1); - expect(searchProvider.searchResults[0].name).toBe("Group to find"); - }) - .then(done) - .otherwise(done.fail); - }); - - it("does not find catalog items if they do not match", function(done) { - var catalogGroup = terria.catalog.group; - - var item = new CatalogItem(terria); - item.name = "Thing to find"; - catalogGroup.add(item); - - searchProvider - .search("foo") - .then(function() { - expect(searchProvider.searchResults.length).toBe(0); - }) - .then(done) - .otherwise(done.fail); - }); - - it("finds items in asynchronously-loaded groups", function(done) { - var DelayedGroup = function() { - CatalogGroup.call(this, terria); - - this.name = "Delayed Group"; - this._load = function() { - var that = this; - return runLater(function() { - var item = new CatalogItem(terria); - item.name = "Thing to find"; - that.add(item); - }); - }; - }; - inherit(CatalogGroup, DelayedGroup); - - terria.catalog.group.add(new DelayedGroup()); - searchProvider - .search("thing") - .then(function() { - expect(searchProvider.searchResults.length).toBe(1); - expect(searchProvider.searchResults[0].name).toBe("Thing to find"); - }) - .then(done) - .otherwise(done.fail); - }); - - it("finds results of a certain type in a case-insensitive manner", function(done) { - var catalogGroup = terria.catalog.group; - - var item1 = new WebMapServiceCatalogItem(terria); - item1.name = "WMS item to find"; - catalogGroup.add(item1); - - var item2 = new GeoJsonCatalogItem(terria, ""); - item2.name = "GeoJson item to find"; - catalogGroup.add(item2); - - searchProvider - .search("to is:wMs") - .then(function() { - expect(searchProvider.searchResults.length).toBe(1); - expect(searchProvider.searchResults[0].name).toBe("WMS item to find"); - }) - .then(done) - .otherwise(done.fail); - }); - - it("finds results not of a certain type in a case-insensitive manner", function(done) { - var catalogGroup = terria.catalog.group; - - var item1 = new WebMapServiceCatalogItem(terria); - item1.name = "WMS item to find"; - catalogGroup.add(item1); - - var item2 = new GeoJsonCatalogItem(terria, ""); - item2.name = "GeoJson item to find"; - catalogGroup.add(item2); - - searchProvider - .search("to -is:wMs") - .then(function() { - expect(searchProvider.searchResults.length).toBe(1); - expect(searchProvider.searchResults[0].name).toBe( - "GeoJson item to find" - ); - }) - .then(done) - .otherwise(done.fail); - }); - - it("finds results having a certain url", function(done) { - var catalogGroup = terria.catalog.group; - - var item1 = new CatalogItem(terria); - item1.name = "Server 1 item to find"; - item1.url = "http://server1.gov.au/page"; - catalogGroup.add(item1); - - var item2 = new CatalogItem(terria); - item2.name = "Server 2 item to find"; - item2.url = "http://server2.gov.au/page"; - catalogGroup.add(item2); - - searchProvider - .search("to url:server1.gov") - .then(function() { - expect(searchProvider.searchResults.length).toBe(1); - expect(searchProvider.searchResults[0].name).toBe( - "Server 1 item to find" - ); - }) - .then(done) - .otherwise(done.fail); - }); - - it("finds results that do not have a certain url", function(done) { - var catalogGroup = terria.catalog.group; - - var item1 = new CatalogItem(terria); - item1.name = "Server 1 item to find"; - item1.url = "http://server1.gov.au/page"; - catalogGroup.add(item1); - - var item2 = new CatalogItem(terria); - item2.name = "Server 2 item to find"; - item2.url = "http://server2.gov.au/page"; - catalogGroup.add(item2); - - searchProvider - .search("to -url:server1.gov") - .then(function() { - expect(searchProvider.searchResults.length).toBe(1); - expect(searchProvider.searchResults[0].name).toBe( - "Server 2 item to find" - ); - }) - .then(done) - .otherwise(done.fail); - }); - - it("stops searching after the specified number of items", function(done) { - var catalogGroup = terria.catalog.group; - - var maxResults = 9; - - // Add items matching the query. - for (var i = 0; i < maxResults; ++i) { - var item = new CatalogItem(terria); - item.name = "Thing to find " + i; - catalogGroup.add(item); - } - - // Add an 11th item that will flip out if asked to load. - var FlipOutGroup = function(terria) { - CatalogGroup.call(this, terria); - - this.name = "Flip Out Group"; - this._load = function() { - done.fail("This item should not be asked to load."); - }; - }; - inherit(CatalogGroup, FlipOutGroup); - catalogGroup.add(new FlipOutGroup(terria)); - - searchProvider.maxResults = maxResults; - searchProvider - .search("thing") - .then(function() { - expect(searchProvider.searchResults.length).toBe(maxResults); - }) - .then(done) - .otherwise(done.fail); - }); - - it("combines duplicate search entries of the same item in different groups", function(done) { - var catalogGroup = terria.catalog.group; - - var group1 = new CatalogGroup(terria); - group1.name = "Group1"; - catalogGroup.add(group1); - - var item = new CatalogItem(terria); - item.name = "Thing to find"; - catalogGroup.add(item); - group1.add(item); - - searchProvider - .search("to") - .then(function() { - expect(searchProvider.searchResults.length).toBe(1); - expect(searchProvider.searchResults[0].name).toBe("Thing to find"); - expect(searchProvider.searchResults[0].tooltip).toMatch( - /^In multiple locations including: / - ); - }) - .then(done) - .otherwise(done.fail); - }); - - it("does not combine different items with the same item name", function(done) { - var catalogGroup = terria.catalog.group; - - var item1 = new CatalogItem(terria); - item1.name = "Thing to find"; - item1.id = "thing1"; - catalogGroup.add(item1); - - var item2 = new CatalogItem(terria); - item2.name = "Thing to find"; - item2.id = "thing2"; - catalogGroup.add(item2); - - searchProvider - .search("to") - .then(function() { - expect(searchProvider.searchResults.length).toBe(2); - expect(searchProvider.searchResults[0].name).toBe("Thing to find"); - expect(searchProvider.searchResults[1].name).toBe("Thing to find"); - }) - .then(done) - .otherwise(done.fail); - }); -}); From f73539ee4900c3b9500f295853c6ef558dbade83 Mon Sep 17 00:00:00 2001 From: zoran995 Date: Tue, 19 Jan 2021 14:00:46 +0100 Subject: [PATCH 002/654] add SearchProvider folder in ModelMixins --- .../{ => SerchProvider}/SearchProviderMixin.ts | 10 +++++----- .../WebFeatureServiceSearchProviderMixin.ts | 17 ++++++++--------- .../AustralianGazetteerSearchProvider.ts | 6 +++--- .../SearchProvider/BingMapsSearchProvider.ts | 2 +- .../SearchProvider/CatalogSearchProvider.ts | 2 +- .../SearchProvider/SearchProviderResults.ts | 2 +- lib/Models/SearchProvider/StubSearchProvider.ts | 2 +- lib/ReactViewModels/SearchState.ts | 2 +- 8 files changed, 21 insertions(+), 22 deletions(-) rename lib/ModelMixins/{ => SerchProvider}/SearchProviderMixin.ts (89%) rename lib/ModelMixins/{ => SerchProvider}/WebFeatureServiceSearchProviderMixin.ts (92%) diff --git a/lib/ModelMixins/SearchProviderMixin.ts b/lib/ModelMixins/SerchProvider/SearchProviderMixin.ts similarity index 89% rename from lib/ModelMixins/SearchProviderMixin.ts rename to lib/ModelMixins/SerchProvider/SearchProviderMixin.ts index b53a05bd2e3..bb9b056b5c0 100644 --- a/lib/ModelMixins/SearchProviderMixin.ts +++ b/lib/ModelMixins/SerchProvider/SearchProviderMixin.ts @@ -3,11 +3,11 @@ import { fromPromise } from "mobx-utils"; import Ellipsoid from "terriajs-cesium/Source/Core/Ellipsoid"; import CesiumMath from "terriajs-cesium/Source/Core/Math"; import Rectangle from "terriajs-cesium/Source/Core/Rectangle"; -import Constructor from "../Core/Constructor"; -import Model from "../Models/Model"; -import SearchProviderResults from "../Models/SearchProvider/SearchProviderResults"; -import Terria from "../Models/Terria"; -import SearchProviderTraits from "../Traits/SearchProvider/SearchProviderTraits"; +import Constructor from "../../Core/Constructor"; +import Model from "../../Models/Model"; +import SearchProviderResults from "../../Models/SearchProvider/SearchProviderResults"; +import Terria from "../../Models/Terria"; +import SearchProviderTraits from "../../Traits/SearchProvider/SearchProviderTraits"; type SearchProvider = Model; diff --git a/lib/ModelMixins/WebFeatureServiceSearchProviderMixin.ts b/lib/ModelMixins/SerchProvider/WebFeatureServiceSearchProviderMixin.ts similarity index 92% rename from lib/ModelMixins/WebFeatureServiceSearchProviderMixin.ts rename to lib/ModelMixins/SerchProvider/WebFeatureServiceSearchProviderMixin.ts index 70a0c26bf9e..c8c1a814835 100644 --- a/lib/ModelMixins/WebFeatureServiceSearchProviderMixin.ts +++ b/lib/ModelMixins/SerchProvider/WebFeatureServiceSearchProviderMixin.ts @@ -2,15 +2,14 @@ import i18next from "i18next"; import { runInAction } from "mobx"; import Resource from "terriajs-cesium/Source/Core/Resource"; import URI from "urijs"; -import Constructor from "../Core/Constructor"; -import makeRealPromise from "../Core/makeRealPromise"; -import zoomRectangleFromPoint from "../Map/zoomRectangleFromPoint"; -import Model from "../Models/Model"; -import SearchProviderResults from "../Models/SearchProvider/SearchProviderResults"; -import SearchResult from "../Models/SearchProvider/SearchResult"; -import Terria from "../Models/Terria"; -import xml2json from "../ThirdParty/xml2json"; -import WebFeatureServiceSearchProviderTraits from "../Traits/SearchProvider/WebFeatureServiceSearchProviderTraits"; +import Constructor from "../../Core/Constructor"; +import makeRealPromise from "../../Core/makeRealPromise"; +import zoomRectangleFromPoint from "../../Map/zoomRectangleFromPoint"; +import Model from "../../Models/Model"; +import SearchProviderResults from "../../Models/SearchProvider/SearchProviderResults"; +import SearchResult from "../../Models/SearchProvider/SearchResult"; +import xml2json from "../../ThirdParty/xml2json"; +import WebFeatureServiceSearchProviderTraits from "../../Traits/SearchProvider/WebFeatureServiceSearchProviderTraits"; import SearchProviderMixin from "./SearchProviderMixin"; function WebFeatureServiceSearchProviderMixin< diff --git a/lib/Models/SearchProvider/AustralianGazetteerSearchProvider.ts b/lib/Models/SearchProvider/AustralianGazetteerSearchProvider.ts index 9d0dbf50954..2b4d2996215 100644 --- a/lib/Models/SearchProvider/AustralianGazetteerSearchProvider.ts +++ b/lib/Models/SearchProvider/AustralianGazetteerSearchProvider.ts @@ -1,6 +1,6 @@ import WebFeatureServiceSearchProviderTraits from "../../Traits/SearchProvider/WebFeatureServiceSearchProviderTraits"; import CreateModel from "../CreateModel"; -import WebFeatureServiceSearchProviderMixin from "./../../ModelMixins/WebFeatureServiceSearchProviderMixin"; +import WebFeatureServiceSearchProviderMixin from "../../ModelMixins/SerchProvider/WebFeatureServiceSearchProviderMixin"; import SearchResult from "./SearchResult"; const featureCodesToNamesMap = new Map([ @@ -224,8 +224,8 @@ export default class AustralianGazetteerSearchProvider extends WebFeatureService CreateModel(WebFeatureServiceSearchProviderTraits) ) { static readonly type = "australian-gazetteer-search-provider"; - - get type(){ + + get type() { return AustralianGazetteerSearchProvider.type; } diff --git a/lib/Models/SearchProvider/BingMapsSearchProvider.ts b/lib/Models/SearchProvider/BingMapsSearchProvider.ts index 312c873c5e8..522e3723d3c 100644 --- a/lib/Models/SearchProvider/BingMapsSearchProvider.ts +++ b/lib/Models/SearchProvider/BingMapsSearchProvider.ts @@ -6,7 +6,7 @@ import Resource from "terriajs-cesium/Source/Core/Resource"; import loadJsonp from "../../Core/loadJsonp"; import SearchProviderMixin, { getMapCenter -} from "../../ModelMixins/SearchProviderMixin"; +} from "../../ModelMixins/SerchProvider/SearchProviderMixin"; import BingMapsSearchProviderTraits from "../../Traits/SearchProvider/BingMapsSearchProviderTraits"; import CreateModel from "../CreateModel"; import SearchProviderResults from "./SearchProviderResults"; diff --git a/lib/Models/SearchProvider/CatalogSearchProvider.ts b/lib/Models/SearchProvider/CatalogSearchProvider.ts index 1a1e85c9ba2..946b2a4ec67 100644 --- a/lib/Models/SearchProvider/CatalogSearchProvider.ts +++ b/lib/Models/SearchProvider/CatalogSearchProvider.ts @@ -4,7 +4,7 @@ import ReferenceMixin from "../../ModelMixins/ReferenceMixin"; import CatalogSearchProviderTraits from "../../Traits/SearchProvider/CatalogSearchProviderTraits"; import CreateModel from "../CreateModel"; import Terria from "../Terria"; -import SearchProviderMixin from "./../../ModelMixins/SearchProviderMixin"; +import SearchProviderMixin from "../../ModelMixins/SerchProvider/SearchProviderMixin"; import SearchProviderResults from "./SearchProviderResults"; import SearchResult from "./SearchResult"; diff --git a/lib/Models/SearchProvider/SearchProviderResults.ts b/lib/Models/SearchProvider/SearchProviderResults.ts index 751e7f7cd60..78ee3340855 100644 --- a/lib/Models/SearchProvider/SearchProviderResults.ts +++ b/lib/Models/SearchProvider/SearchProviderResults.ts @@ -1,7 +1,7 @@ import { observable } from "mobx"; import SearchResult from "./SearchResult"; import { IPromiseBasedObservable, fromPromise } from "mobx-utils"; -import SearchProviderMixin from "./../../ModelMixins/SearchProviderMixin"; +import SearchProviderMixin from "../../ModelMixins/SerchProvider/SearchProviderMixin"; export default class SearchProviderResults { @observable results: SearchResult[] = []; diff --git a/lib/Models/SearchProvider/StubSearchProvider.ts b/lib/Models/SearchProvider/StubSearchProvider.ts index 50b19adb3db..0737ffad5ff 100644 --- a/lib/Models/SearchProvider/StubSearchProvider.ts +++ b/lib/Models/SearchProvider/StubSearchProvider.ts @@ -1,6 +1,6 @@ import LocationSearchProviderTraits from "./../../Traits/SearchProvider/LocationSearchProviderTraits"; import primitiveTrait from "./../../Traits/primitiveTrait"; -import SearchProviderMixin from "../../ModelMixins/SearchProviderMixin"; +import SearchProviderMixin from "../../ModelMixins/SerchProvider/SearchProviderMixin"; import CreateModel from "../CreateModel"; import SearchProviderResults from "./SearchProviderResults"; diff --git a/lib/ReactViewModels/SearchState.ts b/lib/ReactViewModels/SearchState.ts index bcd1fe31248..a12ebd79085 100644 --- a/lib/ReactViewModels/SearchState.ts +++ b/lib/ReactViewModels/SearchState.ts @@ -9,7 +9,7 @@ import filterOutUndefined from "../Core/filterOutUndefined"; import CatalogSearchProvider from "../Models/SearchProvider/CatalogSearchProvider"; import SearchProviderResults from "../Models/SearchProvider/SearchProviderResults"; import Terria from "../Models/Terria"; -import SearchProviderMixin from "./../ModelMixins/SearchProviderMixin"; +import SearchProviderMixin from "../ModelMixins/SerchProvider/SearchProviderMixin"; interface SearchStateOptions { terria: Terria; From 26494d926985738ea4fc4d95022b2cb4537f15a3 Mon Sep 17 00:00:00 2001 From: zoran995 Date: Tue, 19 Jan 2021 14:44:01 +0100 Subject: [PATCH 003/654] set default traits --- .../SerchProvider/SearchProviderMixin.ts | 4 +++- .../SearchProvider/BingMapsSearchProvider.ts | 12 ++-------- .../upsertSearchProviderFromJson.ts | 24 +++++++++++++++++++ 3 files changed, 29 insertions(+), 11 deletions(-) diff --git a/lib/ModelMixins/SerchProvider/SearchProviderMixin.ts b/lib/ModelMixins/SerchProvider/SearchProviderMixin.ts index bb9b056b5c0..723049bc7df 100644 --- a/lib/ModelMixins/SerchProvider/SearchProviderMixin.ts +++ b/lib/ModelMixins/SerchProvider/SearchProviderMixin.ts @@ -4,9 +4,11 @@ import Ellipsoid from "terriajs-cesium/Source/Core/Ellipsoid"; import CesiumMath from "terriajs-cesium/Source/Core/Math"; import Rectangle from "terriajs-cesium/Source/Core/Rectangle"; import Constructor from "../../Core/Constructor"; -import Model from "../../Models/Model"; +import Model, { BaseModel } from "../../Models/Model"; import SearchProviderResults from "../../Models/SearchProvider/SearchProviderResults"; +import StratumFromTraits from "../../Models/StratumFromTraits"; import Terria from "../../Models/Terria"; +import ModelTraits from "../../Traits/ModelTraits"; import SearchProviderTraits from "../../Traits/SearchProvider/SearchProviderTraits"; type SearchProvider = Model; diff --git a/lib/Models/SearchProvider/BingMapsSearchProvider.ts b/lib/Models/SearchProvider/BingMapsSearchProvider.ts index 522e3723d3c..7adffd9947c 100644 --- a/lib/Models/SearchProvider/BingMapsSearchProvider.ts +++ b/lib/Models/SearchProvider/BingMapsSearchProvider.ts @@ -25,10 +25,7 @@ export default class BingMapsSearchProvider extends SearchProviderMixin( constructor(uniqueId: string | undefined, terria: Terria) { super(uniqueId, terria); - if ( - (!this.key || this.key === "") && - this.terria.configParameters.bingMapsKey - ) { + if (!this.key && this.terria.configParameters.bingMapsKey) { this.setTrait( CommonStrata.defaults, "key", @@ -52,7 +49,6 @@ export default class BingMapsSearchProvider extends SearchProviderMixin( searchText: string, searchResults: SearchProviderResults ): Promise { - console.log(this.key); searchResults.results.length = 0; searchResults.message = undefined; @@ -179,11 +175,7 @@ function createZoomToFunction(model: BingMapsSearchProvider, resource: any) { const rectangle = Rectangle.fromDegrees(west, south, east, north); return function() { - const flightDurationSeconds: number = - model.flightDurationSeconds || - model.terria.configParameters.searchBar.flightDurationSeconds; - const terria = model.terria; - terria.currentViewer.zoomTo(rectangle, flightDurationSeconds); + terria.currentViewer.zoomTo(rectangle, model.flightDurationSeconds!); }; } diff --git a/lib/Models/SearchProvider/upsertSearchProviderFromJson.ts b/lib/Models/SearchProvider/upsertSearchProviderFromJson.ts index c52dca54b74..bfbd63735ab 100644 --- a/lib/Models/SearchProvider/upsertSearchProviderFromJson.ts +++ b/lib/Models/SearchProvider/upsertSearchProviderFromJson.ts @@ -47,6 +47,8 @@ export default function upsertSearchProviderFromJson( model?.terria.addSearchProvider(model); } + addDefaultTraits(model); + try { updateModelFromJson(model, stratumName, json); } catch (error) { @@ -55,3 +57,25 @@ export default function upsertSearchProviderFromJson( model?.setTrait(CommonStrata.underride, "isExperiencingIssues", true); } } + +function addDefaultTraits(model: BaseModel) { + const terria = model.terria; + + model.setTrait( + CommonStrata.defaults, + "flightDurationSeconds", + terria.configParameters.searchBar.flightDurationSeconds + ); + + model.setTrait( + CommonStrata.defaults, + "minCharacters", + terria.configParameters.searchBar.minCharacters + ); + + model.setTrait( + CommonStrata.defaults, + "recommendedListLength", + terria.configParameters.searchBar.recommendedListLength + ); +} From 55f3c4296b6178056d1cdbed8e53922fd439bbea Mon Sep 17 00:00:00 2001 From: zoran995 Date: Thu, 21 Jan 2021 15:06:06 +0100 Subject: [PATCH 004/654] update useTranslationIfExists to request translation# at start of the key and add deprecation warning --- lib/Language/languageHelpers.ts | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/lib/Language/languageHelpers.ts b/lib/Language/languageHelpers.ts index 1b0ea910ac3..3e1834adb5b 100644 --- a/lib/Language/languageHelpers.ts +++ b/lib/Language/languageHelpers.ts @@ -4,5 +4,15 @@ import i18next from "i18next"; * Takes a given string and translates it if it exists, otherwise return */ export function useTranslationIfExists(keyOrString: string) { - return i18next.exists(keyOrString) ? i18next.t(keyOrString) : keyOrString; + if (keyOrString && keyOrString.indexOf("translate#") === 0) { + const translationKey = keyOrString.substr("translate#".length); + return i18next.exists(translationKey) + ? i18next.t(translationKey) + : translationKey; + } else { + console.warn( + "using translation key within config won't work in future unless you prefix it with `translate#`" + ); + return keyOrString; + } } From c7525381394792007ad7829554f05f22797babb5 Mon Sep 17 00:00:00 2001 From: zoran995 Date: Thu, 21 Jan 2021 15:16:58 +0100 Subject: [PATCH 005/654] restore default return for useTranslationIfExists until final decission to remove it, and to have time to update everything --- lib/Language/languageHelpers.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/Language/languageHelpers.ts b/lib/Language/languageHelpers.ts index 3e1834adb5b..01a7a30c3ca 100644 --- a/lib/Language/languageHelpers.ts +++ b/lib/Language/languageHelpers.ts @@ -13,6 +13,8 @@ export function useTranslationIfExists(keyOrString: string) { console.warn( "using translation key within config won't work in future unless you prefix it with `translate#`" ); - return keyOrString; + // after the depreaction + // return keyOrString; + return i18next.exists(keyOrString) ? i18next.t(keyOrString) : keyOrString; } } From 4778f074b847bac2f25fc727b1465d509ccf3f01 Mon Sep 17 00:00:00 2001 From: zoran995 Date: Thu, 21 Jan 2021 15:19:30 +0100 Subject: [PATCH 006/654] remove id from list of traits --- lib/Traits/SearchProvider/SearchProviderTraits.ts | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/lib/Traits/SearchProvider/SearchProviderTraits.ts b/lib/Traits/SearchProvider/SearchProviderTraits.ts index 0c2ac76e391..a023dfcb040 100644 --- a/lib/Traits/SearchProvider/SearchProviderTraits.ts +++ b/lib/Traits/SearchProvider/SearchProviderTraits.ts @@ -9,24 +9,19 @@ export default class SearchProviderTraits extends ModelTraits { }) name: string = "unknown"; - @primitiveTrait({ - type: "string", - name: "ID", - description: "Unique id of the search provider." - }) - id?: string; - @primitiveTrait({ type: "boolean", name: "Open by default", - description: "Wheter are this search provider results open by default" + description: "Wheter are this search provider results open by default", + isNullable: true }) openByDefault: boolean = true; @primitiveTrait({ type: "number", name: "Minimum characters", - description: "Minimum number of characters required for search to start" + description: "Minimum number of characters required for search to start", + isNullable: true }) minCharacters?: number; } From c2608bfc3ea64936a34898b275116ab649214393 Mon Sep 17 00:00:00 2001 From: zoran995 Date: Thu, 21 Jan 2021 15:21:00 +0100 Subject: [PATCH 007/654] make translation of names work correctly --- lib/ModelMixins/SerchProvider/SearchProviderMixin.ts | 9 +++++---- lib/Models/SearchProvider/SearchProviderResults.ts | 5 ++--- lib/Models/Terria.ts | 6 +++--- lib/Models/updateModelFromJson.ts | 4 ++++ lib/ReactViews/Search/SearchBoxAndResults.jsx | 9 +++------ .../SearchProvider/LocationSearchProviderTraits.ts | 6 ++++-- 6 files changed, 21 insertions(+), 18 deletions(-) diff --git a/lib/ModelMixins/SerchProvider/SearchProviderMixin.ts b/lib/ModelMixins/SerchProvider/SearchProviderMixin.ts index 723049bc7df..4c28a48f4f6 100644 --- a/lib/ModelMixins/SerchProvider/SearchProviderMixin.ts +++ b/lib/ModelMixins/SerchProvider/SearchProviderMixin.ts @@ -11,12 +11,13 @@ import Terria from "../../Models/Terria"; import ModelTraits from "../../Traits/ModelTraits"; import SearchProviderTraits from "../../Traits/SearchProvider/SearchProviderTraits"; -type SearchProvider = Model; +type SearchProviderMixin = Model; -function SearchProviderMixin>(Base: T) { +function SearchProviderMixin>( + Base: T +) { abstract class SearchProviderMixin extends Base { abstract get type(): string; - @observable name = "Unknown"; @observable isOpen = this.openByDefault; @action @@ -26,7 +27,7 @@ function SearchProviderMixin>(Base: T) { @action search(searchText: string): SearchProviderResults { - const result = new SearchProviderResults(Base); + const result = new SearchProviderResults(this); result.resultsCompletePromise = fromPromise( this.doSearch(searchText, result) ); diff --git a/lib/Models/SearchProvider/SearchProviderResults.ts b/lib/Models/SearchProvider/SearchProviderResults.ts index 78ee3340855..91946a31771 100644 --- a/lib/Models/SearchProvider/SearchProviderResults.ts +++ b/lib/Models/SearchProvider/SearchProviderResults.ts @@ -11,9 +11,8 @@ export default class SearchProviderResults { Promise.resolve() ); - constructor( - readonly searchProvider: SearchProviderMixin.SearchProviderMixin - ) {} + constructor(readonly searchProvider: SearchProviderMixin) { + } get isSearching() { return this.resultsCompletePromise.state === "pending"; diff --git a/lib/Models/Terria.ts b/lib/Models/Terria.ts index 899e0ced372..95191e61137 100644 --- a/lib/Models/Terria.ts +++ b/lib/Models/Terria.ts @@ -309,7 +309,7 @@ export default class Terria { languageConfiguration: undefined, displayOneBrand: 0, searchBar: { - placeholder: "search.placeholder", + placeholder: "translate#search.placeholder", recommendedListLength: 5, sortByName: true, flightDurationSeconds: 1.5, @@ -319,14 +319,14 @@ export default class Terria { { id: "search-provider/bing-maps", type: "bing-maps-search-provider", - name: "search.bingMaps", + name: "translate#viewModels.searchLocations", url: "https://dev.virtualearth.net/", flightDurationSeconds: 1.5 }, { id: "search-provider/australian-gazetteer", type: "australian-gazetteer-search-provider", - name: "viewModels.searchPlaceNames", + name: "translate#viewModels.searchPlaceNames", url: "http://services.ga.gov.au/gis/services/Australian_Gazetteer/MapServer/WFSServer", searchPropertyName: "Australian_Gazetteer:NameU", diff --git a/lib/Models/updateModelFromJson.ts b/lib/Models/updateModelFromJson.ts index e5d59929a8e..7fc34fa6a2e 100644 --- a/lib/Models/updateModelFromJson.ts +++ b/lib/Models/updateModelFromJson.ts @@ -2,6 +2,7 @@ import { runInAction, isObservableArray } from "mobx"; import TerriaError from "../Core/TerriaError"; import createStratumInstance from "./createStratumInstance"; import { BaseModel } from "./Model"; +import { useTranslationIfExists } from "./../Language/languageHelpers"; export default function updateModelFromJson( model: BaseModel, @@ -48,6 +49,9 @@ export default function updateModelFromJson( newTrait ); } + if (propertyName === "name") { + newTrait = useTranslationIfExists(jsonValue); + } model.setTrait(stratumName, propertyName, newTrait); } }); diff --git a/lib/ReactViews/Search/SearchBoxAndResults.jsx b/lib/ReactViews/Search/SearchBoxAndResults.jsx index dfb628c8d6b..1bd33992a9c 100644 --- a/lib/ReactViews/Search/SearchBoxAndResults.jsx +++ b/lib/ReactViews/Search/SearchBoxAndResults.jsx @@ -198,12 +198,9 @@ export class SearchBoxAndResultsRaw extends React.Component { overflow-y: auto; `} > - + {searchState.locationSearchResults.map(search => ( - + ))} diff --git a/lib/Traits/SearchProvider/LocationSearchProviderTraits.ts b/lib/Traits/SearchProvider/LocationSearchProviderTraits.ts index b7285613ff5..5067a14f335 100644 --- a/lib/Traits/SearchProvider/LocationSearchProviderTraits.ts +++ b/lib/Traits/SearchProvider/LocationSearchProviderTraits.ts @@ -14,14 +14,16 @@ export default class LocationSearchProviderTraits extends SearchProviderTraits { type: "boolean", name: "Open by default", description: - "True if the geocoder should query as the user types to autocomplete." + "True if the geocoder should query as the user types to autocomplete.", + isNullable: true }) autocomplete?: boolean; @primitiveTrait({ type: "number", name: "URL", - description: "Time to move to the result location." + description: "Time to move to the result location.", + isNullable: true }) flightDurationSeconds?: number; } From d8616bd7b83be15a10f2205a00446f48f085279b Mon Sep 17 00:00:00 2001 From: zoran995 Date: Tue, 16 Feb 2021 11:56:18 +0100 Subject: [PATCH 008/654] Continue work on connecting search providers to UI - tsify some of the search UI components - properly separate the catalog and search bar - use the recommendedListLength when rendering - use isOpen when rendering - add boundingBoxLimit search bar config param --- .../LocationSearchProviderMixin.ts | 69 ++++++ .../SearchProviderMixin.ts | 44 +--- .../WebFeatureServiceSearchProviderMixin.ts | 4 +- .../AustralianGazetteerSearchProvider.ts | 2 +- .../SearchProvider/BingMapsSearchProvider.ts | 6 +- .../SearchProvider/CatalogSearchProvider.ts | 2 +- .../SearchProvider/SearchProviderResults.ts | 7 +- .../SearchProvider/StubSearchProvider.ts | 2 +- .../upsertSearchProviderFromJson.ts | 4 +- lib/Models/Terria.ts | 16 +- lib/ReactViewModels/SearchState.ts | 5 +- lib/ReactViews/Loader.tsx | 12 +- .../Search/LocationSearchResults.jsx | 193 ----------------- .../Search/LocationSearchResults.tsx | 204 ++++++++++++++++++ lib/ReactViews/Search/SearchBox.jsx | 8 +- lib/ReactViews/Search/SearchBoxAndResults.jsx | 26 +-- lib/ReactViews/Search/SearchHeader.jsx | 39 ---- lib/ReactViews/Search/SearchHeader.tsx | 32 +++ lib/ReactViews/Search/SearchResult.jsx | 120 ----------- lib/ReactViews/Search/SearchResult.tsx | 107 +++++++++ .../Search/location-search-result.scss | 83 ------- .../Search/location-search-result.scss.d.ts | 13 -- lib/ReactViews/Search/search-box.scss | 60 ------ lib/ReactViews/Search/search-box.scss.d.ts | 10 - lib/ReactViews/Search/search-result.scss | 95 -------- lib/ReactViews/Search/search-result.scss.d.ts | 17 -- lib/Styled/{List.jsx => List.tsx} | 0 .../LocationSearchProviderTraits.ts | 20 +- .../SearchProvider/SearchProviderTraits.ts | 8 - 29 files changed, 481 insertions(+), 727 deletions(-) create mode 100644 lib/ModelMixins/SearchProvider/LocationSearchProviderMixin.ts rename lib/ModelMixins/{SerchProvider => SearchProvider}/SearchProviderMixin.ts (54%) rename lib/ModelMixins/{SerchProvider => SearchProvider}/WebFeatureServiceSearchProviderMixin.ts (97%) delete mode 100644 lib/ReactViews/Search/LocationSearchResults.jsx create mode 100644 lib/ReactViews/Search/LocationSearchResults.tsx delete mode 100644 lib/ReactViews/Search/SearchHeader.jsx create mode 100644 lib/ReactViews/Search/SearchHeader.tsx delete mode 100644 lib/ReactViews/Search/SearchResult.jsx create mode 100644 lib/ReactViews/Search/SearchResult.tsx delete mode 100644 lib/ReactViews/Search/location-search-result.scss delete mode 100644 lib/ReactViews/Search/location-search-result.scss.d.ts delete mode 100644 lib/ReactViews/Search/search-box.scss delete mode 100644 lib/ReactViews/Search/search-box.scss.d.ts delete mode 100644 lib/ReactViews/Search/search-result.scss delete mode 100644 lib/ReactViews/Search/search-result.scss.d.ts rename lib/Styled/{List.jsx => List.tsx} (100%) diff --git a/lib/ModelMixins/SearchProvider/LocationSearchProviderMixin.ts b/lib/ModelMixins/SearchProvider/LocationSearchProviderMixin.ts new file mode 100644 index 00000000000..faa54b3ad92 --- /dev/null +++ b/lib/ModelMixins/SearchProvider/LocationSearchProviderMixin.ts @@ -0,0 +1,69 @@ +import { action, observable } from "mobx"; +import { fromPromise } from "mobx-utils"; +import Ellipsoid from "terriajs-cesium/Source/Core/Ellipsoid"; +import CesiumMath from "terriajs-cesium/Source/Core/Math"; +import Rectangle from "terriajs-cesium/Source/Core/Rectangle"; +import Constructor from "../../Core/Constructor"; +import Model, { BaseModel } from "../../Models/Model"; +import SearchProviderResults from "../../Models/SearchProvider/SearchProviderResults"; +import StratumFromTraits from "../../Models/StratumFromTraits"; +import Terria from "../../Models/Terria"; +import ModelTraits from "../../Traits/ModelTraits"; +import SearchProviderTraits from "../../Traits/SearchProvider/SearchProviderTraits"; +import CommonStrata from "../../Models/CommonStrata"; +import LocationSearchProviderTraits from "../../Traits/SearchProvider/LocationSearchProviderTraits"; +import SearchProviderMixin from "./SearchProviderMixin"; + +type LocationSearchProviderModel = Model; + +function LocationSearchProviderMixin< + T extends Constructor +>(Base: T) { + abstract class LocationSearchProviderMixin extends SearchProviderMixin(Base) { + @action + toggleOpen(stratumId: CommonStrata = CommonStrata.user) { + this.setTrait(stratumId, "isOpen", !this.isOpen); + } + + get hasLocationSearchProviderMixin() { + return true; + } + } + return LocationSearchProviderMixin; +} + +interface MapCenter { + longitude: number; + latitude: number; +} + +export function getMapCenter(terria: Terria): MapCenter { + const view = terria.currentViewer.getCurrentCameraView(); + if (view.position !== undefined) { + const cameraPositionCartographic = Ellipsoid.WGS84.cartesianToCartographic( + view.position + ); + return { + longitude: CesiumMath.toDegrees(cameraPositionCartographic.longitude), + latitude: CesiumMath.toDegrees(cameraPositionCartographic.latitude) + }; + } else { + const center = Rectangle.center(view.rectangle); + return { + longitude: CesiumMath.toDegrees(center.longitude), + latitude: CesiumMath.toDegrees(center.latitude) + }; + } +} + +namespace LocationSearchProviderMixin { + export interface LocationSearchProviderMixin + extends InstanceType> {} + export function isMixedInto( + model: any + ): model is LocationSearchProviderMixin { + return model && model.hasLocationSearchProviderMixin; + } +} + +export default LocationSearchProviderMixin; diff --git a/lib/ModelMixins/SerchProvider/SearchProviderMixin.ts b/lib/ModelMixins/SearchProvider/SearchProviderMixin.ts similarity index 54% rename from lib/ModelMixins/SerchProvider/SearchProviderMixin.ts rename to lib/ModelMixins/SearchProvider/SearchProviderMixin.ts index 4c28a48f4f6..cf3e9066936 100644 --- a/lib/ModelMixins/SerchProvider/SearchProviderMixin.ts +++ b/lib/ModelMixins/SearchProvider/SearchProviderMixin.ts @@ -1,29 +1,17 @@ -import { action, observable } from "mobx"; +import { action } from "mobx"; import { fromPromise } from "mobx-utils"; -import Ellipsoid from "terriajs-cesium/Source/Core/Ellipsoid"; -import CesiumMath from "terriajs-cesium/Source/Core/Math"; -import Rectangle from "terriajs-cesium/Source/Core/Rectangle"; import Constructor from "../../Core/Constructor"; -import Model, { BaseModel } from "../../Models/Model"; +import Model from "../../Models/Model"; import SearchProviderResults from "../../Models/SearchProvider/SearchProviderResults"; -import StratumFromTraits from "../../Models/StratumFromTraits"; -import Terria from "../../Models/Terria"; -import ModelTraits from "../../Traits/ModelTraits"; import SearchProviderTraits from "../../Traits/SearchProvider/SearchProviderTraits"; -type SearchProviderMixin = Model; +type SearchProviderModel = Model; -function SearchProviderMixin>( +function SearchProviderMixin>( Base: T ) { abstract class SearchProviderMixin extends Base { abstract get type(): string; - @observable isOpen = this.openByDefault; - - @action - toggleOpen() { - this.isOpen = !this.isOpen; - } @action search(searchText: string): SearchProviderResults { @@ -69,27 +57,3 @@ namespace SearchProviderMixin { } export default SearchProviderMixin; - -interface MapCenter { - longitude: number; - latitude: number; -} - -export function getMapCenter(terria: Terria): MapCenter { - const view = terria.currentViewer.getCurrentCameraView(); - if (view.position !== undefined) { - const cameraPositionCartographic = Ellipsoid.WGS84.cartesianToCartographic( - view.position - ); - return { - longitude: CesiumMath.toDegrees(cameraPositionCartographic.longitude), - latitude: CesiumMath.toDegrees(cameraPositionCartographic.latitude) - }; - } else { - const center = Rectangle.center(view.rectangle); - return { - longitude: CesiumMath.toDegrees(center.longitude), - latitude: CesiumMath.toDegrees(center.latitude) - }; - } -} diff --git a/lib/ModelMixins/SerchProvider/WebFeatureServiceSearchProviderMixin.ts b/lib/ModelMixins/SearchProvider/WebFeatureServiceSearchProviderMixin.ts similarity index 97% rename from lib/ModelMixins/SerchProvider/WebFeatureServiceSearchProviderMixin.ts rename to lib/ModelMixins/SearchProvider/WebFeatureServiceSearchProviderMixin.ts index c8c1a814835..56a1e276079 100644 --- a/lib/ModelMixins/SerchProvider/WebFeatureServiceSearchProviderMixin.ts +++ b/lib/ModelMixins/SearchProvider/WebFeatureServiceSearchProviderMixin.ts @@ -10,12 +10,12 @@ import SearchProviderResults from "../../Models/SearchProvider/SearchProviderRes import SearchResult from "../../Models/SearchProvider/SearchResult"; import xml2json from "../../ThirdParty/xml2json"; import WebFeatureServiceSearchProviderTraits from "../../Traits/SearchProvider/WebFeatureServiceSearchProviderTraits"; -import SearchProviderMixin from "./SearchProviderMixin"; +import LocationSearchProviderMixin from "./LocationSearchProviderMixin"; function WebFeatureServiceSearchProviderMixin< T extends Constructor> >(Base: T) { - abstract class WebFeatureServiceSearchProviderMixin extends SearchProviderMixin( + abstract class WebFeatureServiceSearchProviderMixin extends LocationSearchProviderMixin( Base ) { protected abstract featureToSearchResultFunction: ( diff --git a/lib/Models/SearchProvider/AustralianGazetteerSearchProvider.ts b/lib/Models/SearchProvider/AustralianGazetteerSearchProvider.ts index 2b4d2996215..986f781134d 100644 --- a/lib/Models/SearchProvider/AustralianGazetteerSearchProvider.ts +++ b/lib/Models/SearchProvider/AustralianGazetteerSearchProvider.ts @@ -1,6 +1,6 @@ import WebFeatureServiceSearchProviderTraits from "../../Traits/SearchProvider/WebFeatureServiceSearchProviderTraits"; import CreateModel from "../CreateModel"; -import WebFeatureServiceSearchProviderMixin from "../../ModelMixins/SerchProvider/WebFeatureServiceSearchProviderMixin"; +import WebFeatureServiceSearchProviderMixin from "../../ModelMixins/SearchProvider/WebFeatureServiceSearchProviderMixin"; import SearchResult from "./SearchResult"; const featureCodesToNamesMap = new Map([ diff --git a/lib/Models/SearchProvider/BingMapsSearchProvider.ts b/lib/Models/SearchProvider/BingMapsSearchProvider.ts index 7adffd9947c..e910f0950ed 100644 --- a/lib/Models/SearchProvider/BingMapsSearchProvider.ts +++ b/lib/Models/SearchProvider/BingMapsSearchProvider.ts @@ -4,9 +4,9 @@ import defined from "terriajs-cesium/Source/Core/defined"; import Rectangle from "terriajs-cesium/Source/Core/Rectangle"; import Resource from "terriajs-cesium/Source/Core/Resource"; import loadJsonp from "../../Core/loadJsonp"; -import SearchProviderMixin, { +import LocationSearchProviderMixin, { getMapCenter -} from "../../ModelMixins/SerchProvider/SearchProviderMixin"; +} from "../../ModelMixins/SearchProvider/LocationSearchProviderMixin"; import BingMapsSearchProviderTraits from "../../Traits/SearchProvider/BingMapsSearchProviderTraits"; import CreateModel from "../CreateModel"; import SearchProviderResults from "./SearchProviderResults"; @@ -14,7 +14,7 @@ import SearchResult from "./SearchResult"; import CommonStrata from "./../CommonStrata"; import Terria from "../Terria"; -export default class BingMapsSearchProvider extends SearchProviderMixin( +export default class BingMapsSearchProvider extends LocationSearchProviderMixin( CreateModel(BingMapsSearchProviderTraits) ) { static readonly type = "bing-maps-search-provider"; diff --git a/lib/Models/SearchProvider/CatalogSearchProvider.ts b/lib/Models/SearchProvider/CatalogSearchProvider.ts index 946b2a4ec67..4bdafa81e5d 100644 --- a/lib/Models/SearchProvider/CatalogSearchProvider.ts +++ b/lib/Models/SearchProvider/CatalogSearchProvider.ts @@ -4,7 +4,7 @@ import ReferenceMixin from "../../ModelMixins/ReferenceMixin"; import CatalogSearchProviderTraits from "../../Traits/SearchProvider/CatalogSearchProviderTraits"; import CreateModel from "../CreateModel"; import Terria from "../Terria"; -import SearchProviderMixin from "../../ModelMixins/SerchProvider/SearchProviderMixin"; +import SearchProviderMixin from "../../ModelMixins/SearchProvider/SearchProviderMixin"; import SearchProviderResults from "./SearchProviderResults"; import SearchResult from "./SearchResult"; diff --git a/lib/Models/SearchProvider/SearchProviderResults.ts b/lib/Models/SearchProvider/SearchProviderResults.ts index 91946a31771..09fcc1aafe5 100644 --- a/lib/Models/SearchProvider/SearchProviderResults.ts +++ b/lib/Models/SearchProvider/SearchProviderResults.ts @@ -1,7 +1,7 @@ import { observable } from "mobx"; import SearchResult from "./SearchResult"; import { IPromiseBasedObservable, fromPromise } from "mobx-utils"; -import SearchProviderMixin from "../../ModelMixins/SerchProvider/SearchProviderMixin"; +import SearchProviderMixin from "../../ModelMixins/SearchProvider/SearchProviderMixin"; export default class SearchProviderResults { @observable results: SearchResult[] = []; @@ -11,8 +11,9 @@ export default class SearchProviderResults { Promise.resolve() ); - constructor(readonly searchProvider: SearchProviderMixin) { - } + constructor( + readonly searchProvider: SearchProviderMixin.SearchProviderMixin + ) {} get isSearching() { return this.resultsCompletePromise.state === "pending"; diff --git a/lib/Models/SearchProvider/StubSearchProvider.ts b/lib/Models/SearchProvider/StubSearchProvider.ts index 0737ffad5ff..28745157278 100644 --- a/lib/Models/SearchProvider/StubSearchProvider.ts +++ b/lib/Models/SearchProvider/StubSearchProvider.ts @@ -1,6 +1,6 @@ import LocationSearchProviderTraits from "./../../Traits/SearchProvider/LocationSearchProviderTraits"; import primitiveTrait from "./../../Traits/primitiveTrait"; -import SearchProviderMixin from "../../ModelMixins/SerchProvider/SearchProviderMixin"; +import SearchProviderMixin from "../../ModelMixins/SearchProvider/SearchProviderMixin"; import CreateModel from "../CreateModel"; import SearchProviderResults from "./SearchProviderResults"; diff --git a/lib/Models/SearchProvider/upsertSearchProviderFromJson.ts b/lib/Models/SearchProvider/upsertSearchProviderFromJson.ts index bfbd63735ab..19474f3f14c 100644 --- a/lib/Models/SearchProvider/upsertSearchProviderFromJson.ts +++ b/lib/Models/SearchProvider/upsertSearchProviderFromJson.ts @@ -47,7 +47,7 @@ export default function upsertSearchProviderFromJson( model?.terria.addSearchProvider(model); } - addDefaultTraits(model); + setDefaultTraits(model); try { updateModelFromJson(model, stratumName, json); @@ -58,7 +58,7 @@ export default function upsertSearchProviderFromJson( } } -function addDefaultTraits(model: BaseModel) { +function setDefaultTraits(model: BaseModel) { const terria = model.terria; model.setTrait( diff --git a/lib/Models/Terria.ts b/lib/Models/Terria.ts index f80853b2cad..ae40c94569b 100644 --- a/lib/Models/Terria.ts +++ b/lib/Models/Terria.ts @@ -246,6 +246,10 @@ interface SearchBar { * Minimum number of characters to start search. */ minCharacters: number; + /** + * Bounding box limits for the search results. + */ + boundingBoxLimit?: number[]; /** * Array of search providers to be used. */ @@ -401,18 +405,8 @@ export default class Terria { type: "bing-maps-search-provider", name: "translate#viewModels.searchLocations", url: "https://dev.virtualearth.net/", - flightDurationSeconds: 1.5 - }, - { - id: "search-provider/australian-gazetteer", - type: "australian-gazetteer-search-provider", - name: "translate#viewModels.searchPlaceNames", - url: - "http://services.ga.gov.au/gis/services/Australian_Gazetteer/MapServer/WFSServer", - searchPropertyName: "Australian_Gazetteer:NameU", - searchPropertyTypeName: "Australian_Gazetteer:Gazetteer_of_Australia", flightDurationSeconds: 1.5, - minCharacters: 3 + isOpen: true } ] } diff --git a/lib/ReactViewModels/SearchState.ts b/lib/ReactViewModels/SearchState.ts index a12ebd79085..fc7373547e0 100644 --- a/lib/ReactViewModels/SearchState.ts +++ b/lib/ReactViewModels/SearchState.ts @@ -6,10 +6,11 @@ import { reaction } from "mobx"; import filterOutUndefined from "../Core/filterOutUndefined"; +import LocationSearchProviderMixin from "../ModelMixins/SearchProvider/LocationSearchProviderMixin"; +import SearchProviderMixin from "../ModelMixins/SearchProvider/SearchProviderMixin"; import CatalogSearchProvider from "../Models/SearchProvider/CatalogSearchProvider"; import SearchProviderResults from "../Models/SearchProvider/SearchProviderResults"; import Terria from "../Models/Terria"; -import SearchProviderMixin from "../ModelMixins/SerchProvider/SearchProviderMixin"; interface SearchStateOptions { terria: Terria; @@ -22,7 +23,7 @@ export default class SearchState { catalogSearchProvider: SearchProviderMixin.SearchProviderMixin | undefined; @observable - locationSearchProviders: SearchProviderMixin.SearchProviderMixin[]; + locationSearchProviders: LocationSearchProviderMixin.LocationSearchProviderMixin[]; @observable catalogSearchText: string = ""; @observable isWaitingToStartCatalogSearch: boolean = false; diff --git a/lib/ReactViews/Loader.tsx b/lib/ReactViews/Loader.tsx index a8a6c816fa0..0d5a62f1d50 100644 --- a/lib/ReactViews/Loader.tsx +++ b/lib/ReactViews/Loader.tsx @@ -10,11 +10,19 @@ interface PropsType extends WithTranslation { message?: string; boxProps?: any; textProps?: any; + hideMessage?: boolean; t: TFunction; [spread: string]: any; } const Loader: React.FC = (props: PropsType) => { - const { message, t, boxProps, textProps, ...rest }: PropsType = props; + const { + message, + t, + boxProps, + textProps, + hideMessage, + ...rest + }: PropsType = props; return ( = (props: PropsType) => { {...rest} /> - {message || t("loader.loadingMessage")} + {!hideMessage && (message || t("loader.loadingMessage"))} ); diff --git a/lib/ReactViews/Search/LocationSearchResults.jsx b/lib/ReactViews/Search/LocationSearchResults.jsx deleted file mode 100644 index 54c1d7320db..00000000000 --- a/lib/ReactViews/Search/LocationSearchResults.jsx +++ /dev/null @@ -1,193 +0,0 @@ -/** - Initially this was written to support various location search providers in master, - however we only have a single location provider at the moment, and how we merge - them in the new design is yet to be resolved, see: - https://github.com/TerriaJS/nsw-digital-twin/issues/248#issuecomment-599919318 - */ - -import { observer } from "mobx-react"; -import React from "react"; -import createReactClass from "create-react-class"; -import styled from "styled-components"; -import PropTypes from "prop-types"; -import { withTranslation } from "react-i18next"; -import SearchHeader from "./SearchHeader"; -import SearchResult from "./SearchResult"; -import classNames from "classnames"; -import Styles from "./location-search-result.scss"; -import isDefined from "../../Core/isDefined"; - -import Icon, { StyledIcon } from "../Icon"; -// import Box, { BoxSpan } from "../../Styled/Box"; -import { BoxSpan } from "../../Styled/Box"; -import Text, { TextSpan } from "../../Styled/Text"; - -import { RawButton } from "../../Styled/Button"; - -const RawButtonAndHighlight = styled(RawButton)` - ${p => ` - &:hover, &:focus { - background-color: ${p.theme.greyLighter}; - ${StyledIcon} { - fill-opacity: 1; - } - }`} -`; - -const MAX_RESULTS_BEFORE_TRUNCATING = 5; - -const LocationSearchResults = observer( - createReactClass({ - displayName: "LocationSearchResults", - - propTypes: { - viewState: PropTypes.object.isRequired, - isWaitingForSearchToStart: PropTypes.bool, - terria: PropTypes.object.isRequired, - search: PropTypes.object.isRequired, - onLocationClick: PropTypes.func.isRequired, - theme: PropTypes.string, - locationSearchText: PropTypes.string, - t: PropTypes.func.isRequired - }, - - getInitialState() { - return { - isOpen: true, - isExpanded: false - }; - }, - - getDefaultProps() { - return { - theme: "light" - }; - }, - - toggleIsOpen() { - this.setState({ - isOpen: !this.state.isOpen - }); - }, - - toggleExpand() { - this.setState({ - isExpanded: !this.state.isExpanded - }); - }, - - renderResultsFooter() { - const { t } = this.props; - if (this.state.isExpanded) { - return t("search.viewLess", { - name: this.props.search.searchProvider.name - }); - } - return t("search.viewMore", { - name: this.props.search.searchProvider.name - }); - }, - - render() { - const search = this.props.search; - const { isOpen, isExpanded } = this.state; - const searchProvider = search.searchProvider; - const locationSearchBoundingBox = this.props.terria.configParameters - .locationSearchBoundingBox; - - const validResults = isDefined(locationSearchBoundingBox) - ? search.results.filter(function(r) { - return ( - r.location.longitude > locationSearchBoundingBox[0] && - r.location.longitude < locationSearchBoundingBox[2] && - r.location.latitude > locationSearchBoundingBox[1] && - r.location.latitude < locationSearchBoundingBox[3] - ); - }) - : search.results; - - const results = - validResults.length > MAX_RESULTS_BEFORE_TRUNCATING - ? isExpanded - ? validResults - : validResults.slice(0, MAX_RESULTS_BEFORE_TRUNCATING) - : validResults; - - return ( -
- {/* */} - - - {`${search.searchProvider.name} (${validResults?.length})`} - - - - - -
    - {results.map((result, i) => ( - - ))} -
- {isOpen && validResults.length > MAX_RESULTS_BEFORE_TRUNCATING && ( - - - - {this.renderResultsFooter()} - - - - )} -
-
- ); - } - }) -); - -module.exports = withTranslation()(LocationSearchResults); diff --git a/lib/ReactViews/Search/LocationSearchResults.tsx b/lib/ReactViews/Search/LocationSearchResults.tsx new file mode 100644 index 00000000000..1ad36202da2 --- /dev/null +++ b/lib/ReactViews/Search/LocationSearchResults.tsx @@ -0,0 +1,204 @@ +/** + Initially this was written to support various location search providers in master, + however we only have a single location provider at the moment, and how we merge + them in the new design is yet to be resolved, see: + https://github.com/TerriaJS/nsw-digital-twin/issues/248#issuecomment-599919318 + */ + +import { observable, computed, action } from "mobx"; +import { observer } from "mobx-react"; +import React from "react"; +import { + useTranslation, + withTranslation, + WithTranslation +} from "react-i18next"; +import styled, { DefaultTheme } from "styled-components"; +import isDefined from "../../Core/isDefined"; +import Terria from "../../Models/Terria"; +import ViewState from "../../ReactViewModels/ViewState"; +import Ul from "../../Styled/List"; +import Icon, { StyledIcon } from "../Icon"; +import LocationSearchProviderMixin from "./../../ModelMixins/SearchProvider/LocationSearchProviderMixin"; +import SearchProviderResults from "../../Models/SearchProvider/SearchProviderResults"; +import SearchHeader from "./SearchHeader"; +import SearchResult from "./SearchResult"; +import Loader from "../Loader"; +const BoxSpan: any = require("../../Styled/Box").BoxSpan; +const Box: any = require("../../Styled/Box").default; +const Text: any = require("../../Styled/Text").default; +const TextSpan: any = require("../../Styled/Text").TextSpan; +const RawButton: any = require("../../Styled/Button").RawButton; + +const RawButtonAndHighlight = styled(RawButton)` + ${p => ` + &:hover, &:focus { + background-color: ${p.theme.greyLighter}; + ${StyledIcon} { + fill-opacity: 1; + } + }`} +`; + +interface PropsType extends WithTranslation { + viewState: ViewState; + isWaitingForSearchToStart: boolean; + terria: Terria; + search: SearchProviderResults; + onLocationClick: () => void; + theme: DefaultTheme; + locationSearchText: string; +} + +@observer +class LocationSearchResults extends React.Component { + @observable isExpanded = false; + + @action.bound + toggleExpand() { + this.isExpanded = !this.isExpanded; + } + + @computed + get validResults() { + const { search, terria } = this.props; + const locationSearchBoundingBox = + terria.configParameters.searchBar.boundingBoxLimit; + const validResults = isDefined(locationSearchBoundingBox) + ? search.results.filter(function(r: any) { + return ( + r.location.longitude > locationSearchBoundingBox[0] && + r.location.longitude < locationSearchBoundingBox[2] && + r.location.latitude > locationSearchBoundingBox[1] && + r.location.latitude < locationSearchBoundingBox[3] + ); + }) + : search.results; + return validResults; + } + + render() { + const { search } = this.props; + const searchProvider: LocationSearchProviderMixin.LocationSearchProviderMixin = search.searchProvider as any; + + const maxResults = searchProvider.recommendedListLength || 5; + const validResults = this.validResults; + const results = + validResults.length > maxResults + ? this.isExpanded + ? validResults + : validResults.slice(0, maxResults) + : validResults; + const isOpen = searchProvider.isOpen; + return ( + + searchProvider.toggleOpen()} + > + + + + + + + {isOpen && ( + <> + +
    + {results.map((result: any, i: number) => ( + + ))} +
+ {validResults.length > maxResults && ( + + + + + + + + )} + + )} +
+
+ ); + } +} + +interface SearchResultsFooterProps { + isExpanded: boolean; + name: string; +} + +const SearchResultsFooter: React.FC = ( + props: SearchResultsFooterProps +) => { + const { t } = useTranslation(); + if (props.isExpanded) { + return t("search.viewLess", { + name: props.name + }); + } + return t("search.viewMore", { + name: props.name + }); +}; + +interface NameWithLoaderProps { + name: string; + length?: number; + isOpen: boolean; + search: SearchProviderResults; + isWaitingForSearchToStart: boolean; +} + +const NameWithLoader: React.FC = observer( + (props: NameWithLoaderProps) => ( + + + {`${props.name} (${props.length || + 0})`} + + {!props.isOpen && + (props.search.isSearching || props.isWaitingForSearchToStart) && ( + + )} + + ) +); +export default withTranslation()(LocationSearchResults); diff --git a/lib/ReactViews/Search/SearchBox.jsx b/lib/ReactViews/Search/SearchBox.jsx index 0027ba02355..74ccf71f097 100644 --- a/lib/ReactViews/Search/SearchBox.jsx +++ b/lib/ReactViews/Search/SearchBox.jsx @@ -1,12 +1,12 @@ -import React from "react"; -import PropTypes from "prop-types"; import createReactClass from "create-react-class"; import debounce from "lodash-es/debounce"; -import Icon, { StyledIcon } from "../Icon"; +import PropTypes from "prop-types"; +import React from "react"; import styled, { withTheme } from "styled-components"; import Box, { BoxSpan } from "../../Styled/Box"; -import Text from "../../Styled/Text"; import { RawButton } from "../../Styled/Button"; +import Text from "../../Styled/Text"; +import Icon, { StyledIcon } from "../Icon"; const SearchInput = styled.input` box-sizing: border-box; diff --git a/lib/ReactViews/Search/SearchBoxAndResults.jsx b/lib/ReactViews/Search/SearchBoxAndResults.jsx index 1bd33992a9c..6765ebe623c 100644 --- a/lib/ReactViews/Search/SearchBoxAndResults.jsx +++ b/lib/ReactViews/Search/SearchBoxAndResults.jsx @@ -1,23 +1,19 @@ -import React from "react"; -import { removeMarker } from "../../Models/LocationMarkerUtils"; import { reaction, runInAction } from "mobx"; -import { Trans } from "react-i18next"; -import PropTypes from "prop-types"; import { observer } from "mobx-react"; +import PropTypes from "prop-types"; +import React from "react"; +import { Trans } from "react-i18next"; import styled from "styled-components"; -// import { ThemeContext } from "styled-components"; - -import SearchBox from "../Search/SearchBox"; -// import SidebarSearch from "../Search/SidebarSearch"; -import LocationSearchResults from "../Search/LocationSearchResults"; -import Icon, { StyledIcon } from "../Icon"; - +import { addMarker, removeMarker } from "../../Models/LocationMarkerUtils"; import Box from "../../Styled/Box"; -import Text from "../../Styled/Text"; -import Spacing from "../../Styled/Spacing"; import { RawButton } from "../../Styled/Button"; - -import { addMarker } from "../../Models/LocationMarkerUtils"; +import Spacing from "../../Styled/Spacing"; +import Text from "../../Styled/Text"; +import Icon, { StyledIcon } from "../Icon"; +// import SidebarSearch from "../Search/SidebarSearch"; +import LocationSearchResults from "./LocationSearchResults"; +// import { ThemeContext } from "styled-components"; +import SearchBox from "./SearchBox"; export function SearchInDataCatalog({ viewState, handleClick }) { const locationSearchText = viewState.searchState.locationSearchText; diff --git a/lib/ReactViews/Search/SearchHeader.jsx b/lib/ReactViews/Search/SearchHeader.jsx deleted file mode 100644 index bbc5f03260c..00000000000 --- a/lib/ReactViews/Search/SearchHeader.jsx +++ /dev/null @@ -1,39 +0,0 @@ -import Loader from "../Loader"; -import { observer } from "mobx-react"; -import React from "react"; -import createReactClass from "create-react-class"; -import PropTypes from "prop-types"; -import Styles from "./search-header.scss"; - -/** Renders either a loader or a message based off search state. */ -export default observer( - createReactClass({ - displayName: "SearchHeader", - - propTypes: { - searchResults: PropTypes.object.isRequired, - isWaitingForSearchToStart: PropTypes.bool - }, - - render() { - if ( - this.props.searchResults.isSearching || - this.props.isWaitingForSearchToStart - ) { - return ( -
- -
- ); - } else if (this.props.searchResults.message) { - return ( -
- {this.props.searchResults.message} -
- ); - } else { - return null; - } - } - }) -); diff --git a/lib/ReactViews/Search/SearchHeader.tsx b/lib/ReactViews/Search/SearchHeader.tsx new file mode 100644 index 00000000000..5ead1157445 --- /dev/null +++ b/lib/ReactViews/Search/SearchHeader.tsx @@ -0,0 +1,32 @@ +import React from "react"; +import Loader from "../Loader"; +import { observer } from "mobx-react"; +const Text = require("../../Styled/Text").default; +const BoxSpan = require("../../Styled/Box").BoxSpan; + +interface SearchHeaderProps { + searchResults: { [key: string]: any }; + isWaitingForSearchToStart: boolean; +} + +const SearchHeader: React.FC = observer( + (props: SearchHeaderProps) => { + if (props.searchResults.isSearching || props.isWaitingForSearchToStart) { + return ( +
+ +
+ ); + } else if (props.searchResults.message) { + return ( + + {props.searchResults.message} + + ); + } else { + return null; + } + } +); + +export default SearchHeader; diff --git a/lib/ReactViews/Search/SearchResult.jsx b/lib/ReactViews/Search/SearchResult.jsx deleted file mode 100644 index 491feb2ffcc..00000000000 --- a/lib/ReactViews/Search/SearchResult.jsx +++ /dev/null @@ -1,120 +0,0 @@ -import React from "react"; -import PropTypes from "prop-types"; -import styled, { withTheme } from "styled-components"; -import createReactClass from "create-react-class"; -import Icon, { StyledIcon } from "../Icon"; - -import Box, { BoxSpan } from "../../Styled/Box"; -import { RawButton } from "../../Styled/Button"; -import { TextSpan } from "../../Styled/Text"; -import Hr from "../../Styled/Hr"; -import Spacing, { SpacingSpan } from "../../Styled/Spacing"; - -import highlightKeyword from "../ReactViewHelpers/highlightKeyword"; - -// Not sure how to generalise this or if it should be kept in stlyed/Button.jsx - -// Initially had this as border bottom on the button, but need a HR given it's not a full width border -// // ${p => !p.isLastResult && `border-bottom: 1px solid ${p.theme.greyLighter};`} -const RawButtonAndHighlight = styled(RawButton)` - ${p => ` - &:hover, &:focus { - background-color: ${p.theme.greyLighter}; - ${StyledIcon} { - fill-opacity: 1; - } - }`} -`; - -// A Location item when doing Bing map searvh or Gazetter search -export const SearchResult = createReactClass({ - propTypes: { - name: PropTypes.string.isRequired, - clickAction: PropTypes.func.isRequired, - isLastResult: PropTypes.bool, - locationSearchText: PropTypes.string, - icon: PropTypes.string, - theme: PropTypes.object, - searchResultTheme: PropTypes.string - }, - - getDefaultProps() { - return { - icon: false, - searchResultTheme: "light" - }; - }, - - render() { - const { - searchResultTheme, - theme, - name, - locationSearchText, - icon - // isLastResult - } = this.props; - const isDarkTheme = searchResultTheme === "dark"; - const isLightTheme = searchResultTheme === "light"; - const highlightedResultName = highlightKeyword(name, locationSearchText); - return ( -
  • - - - {/* {!isLastResult && ( */} - - -
    - -
    - {/* )} */} - - - {icon && ( - - )} - - - - {highlightedResultName} - - - - - -
    -
    -
  • - ); - } -}); - -export default withTheme(SearchResult); diff --git a/lib/ReactViews/Search/SearchResult.tsx b/lib/ReactViews/Search/SearchResult.tsx new file mode 100644 index 00000000000..a431a4278cc --- /dev/null +++ b/lib/ReactViews/Search/SearchResult.tsx @@ -0,0 +1,107 @@ +import React from "react"; +import styled, { useTheme } from "styled-components"; +import { Li } from "../../Styled/List"; +import Icon, { StyledIcon } from "../Icon"; +import highlightKeyword from "../ReactViewHelpers/highlightKeyword"; + +const Box = require("../../Styled/Box").default; +const BoxSpan = require("../../Styled/Box").BoxSpan; +const TextSpan = require("../../Styled/Text").TextSpan; +const RawButton = require("../../Styled/Button").RawButton; +const Spacing = require("../../Styled/Spacing").default; +const SpacingSpan = require("../../Styled/Spacing").SpacingSpan; +const Hr = require("../../Styled/Hr").default; + +// Not sure how to generalise this or if it should be kept in stlyed/Button.jsx + +// Initially had this as border bottom on the button, but need a HR given it's not a full width border +// // ${p => !p.isLastResult && `border-bottom: 1px solid ${p.theme.greyLighter};`} +const RawButtonAndHighlight = styled(RawButton)` + ${p => ` + &:hover, &:focus { + background-color: ${p.theme.greyLighter}; + ${StyledIcon} { + fill-opacity: 1; + } + }`} +`; + +interface SearchResultProps { + name: string; + clickAction(): void; + isLastResult: boolean; + locationSearchText: string; + icon: string; +} + +const SearchResult: React.FC = ( + props: SearchResultProps +) => { + const theme = useTheme(); + const highlightedResultName = highlightKeyword( + props.name, + props.locationSearchText + ); + const isLightTheme = true; + const isDarkTheme = false; + return ( +
  • + + + {/* {!isLastResult && ( */} + + +
    + +
    + {/* )} */} + + + {props.icon && ( + + )} + + + + {highlightedResultName} + + + + + +
    +
    +
  • + ); +}; + +export default SearchResult; diff --git a/lib/ReactViews/Search/location-search-result.scss b/lib/ReactViews/Search/location-search-result.scss deleted file mode 100644 index b6455bd65e3..00000000000 --- a/lib/ReactViews/Search/location-search-result.scss +++ /dev/null @@ -1,83 +0,0 @@ -@import "../../Sass/common/mixins"; -@import "~terriajs-variables"; - -.heading { - composes: btn from "../../Sass/common/_buttons.scss"; - padding: $padding; - position: relative; - width: 100%; - text-align: left; - font-weight: bold; - &, - &:hover, - &:focus { - box-shadow: inset 0 -1px 0 0 rgba(255, 255, 255, 0.15); - } - @media (min-width: $md) { - color: $text-light; - } - svg { - height: 10px; - width: 10px; - position: absolute; - right: $padding + $padding-small; - top: $padding + $padding-small; - } -} - -.footer { - composes: btn from "../../Sass/common/_buttons.scss"; - padding: $padding; - font-size: 12px; - position: relative; - width: 100%; - text-align: left; - box-shadow: none; - @media (min-width: $md) { - color: $text-light; - } - svg { - height: 20px; - width: 20px; - position: absolute; - right: $padding; - top: $padding; - } -} - -.provider-result { - margin-top: $padding-small; - @media (min-width: $md) { - color: $text-darker; - } - // background-color: $dark-with-overlay; - .items { - display: none; - } -} - -// on mobile, we don't want the gap between search results -.light { - // background: #fff; - margin-top: 0; - svg { - // fill: #000; - } -} - -.dark { - svg { - // fill: #ffffff; - } -} - -.isOpen { - .items { - display: block; - } -} - -.items { - composes: clearfix from "../../Sass/common/_base.scss"; - composes: list-reset from "../../Sass/common/_base.scss"; -} diff --git a/lib/ReactViews/Search/location-search-result.scss.d.ts b/lib/ReactViews/Search/location-search-result.scss.d.ts deleted file mode 100644 index d53b3b8dd6a..00000000000 --- a/lib/ReactViews/Search/location-search-result.scss.d.ts +++ /dev/null @@ -1,13 +0,0 @@ -// This file is automatically generated. -// Please do not change this file! -interface CssExports { - 'footer': string; - 'heading': string; - 'isOpen': string; - 'items': string; - 'light': string; - 'provider-result': string; - 'providerResult': string; -} -declare var cssExports: CssExports; -export = cssExports; diff --git a/lib/ReactViews/Search/search-box.scss b/lib/ReactViews/Search/search-box.scss deleted file mode 100644 index 204fec49fd4..00000000000 --- a/lib/ReactViews/Search/search-box.scss +++ /dev/null @@ -1,60 +0,0 @@ -@import "~terriajs-variables"; -@import "../../Sass/common/mixins"; - -.formLabel { - position: absolute; - svg { - // height: $input-height; - // width: $input-height; - height: 20px; - width: 20px; - fill: $charcoal-grey; - padding: $padding; - fill-opacity: 0.5; - } -} - -.searchField { - composes: field from "../../Sass/common/_form.scss"; - font-family: $font-base; -} - -.searchData { - position: relative; - width: 100%; -} - -input[type="text"].searchField { - padding-left: $input-height; - padding-right: $input-height; - color: $text-dark; - width: 100%; - overflow: hidden; - border-color: transparent; // if you need to remove borders, always use transparent "X"px borders instead of 0 borders for a11y - @include placeholder { - text-align: center; - @include transition(all, 0.25s, linear); - } - - &:focus { - @include placeholder { - padding-left: 0; - } - } -} - -.searchClear { - composes: btn from "../../Sass/common/_buttons.scss"; - right: 0px; - top: 0px; - position: absolute; - height: $input-height; - width: $input-height; - svg { - height: 15px; - width: 15px; - margin: 0 auto; - fill: $charcoal-grey; - fill-opacity: 0.5; - } -} diff --git a/lib/ReactViews/Search/search-box.scss.d.ts b/lib/ReactViews/Search/search-box.scss.d.ts deleted file mode 100644 index d7e28504b25..00000000000 --- a/lib/ReactViews/Search/search-box.scss.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -// This file is automatically generated. -// Please do not change this file! -interface CssExports { - 'formLabel': string; - 'searchClear': string; - 'searchData': string; - 'searchField': string; -} -declare var cssExports: CssExports; -export = cssExports; diff --git a/lib/ReactViews/Search/search-result.scss b/lib/ReactViews/Search/search-result.scss deleted file mode 100644 index 618d47f3cce..00000000000 --- a/lib/ReactViews/Search/search-result.scss +++ /dev/null @@ -1,95 +0,0 @@ -@import "~terriajs-variables"; - -.search-result { - span { - overflow-wrap: break-word; - word-wrap: break-word; - } -} - -.search-result.light .btn { - // border-bottom: 1px solid rgba($grey, 0.4); - background: transparent; - &:hover { - // border-bottom: 1px solid $color-primary; - color: $color-primary; - } - svg { - fill: #000; - } -} - -.search-result.dark .btn { - color: #fff; - border: 0; - box-shadow: inset 0 -1px 0 0 rgba(255, 255, 255, 0.15); - margin-bottom: 0; - svg { - fill-opacity: 0.5; - } - &:hover { - svg { - fill: #fff; - } - } -} - -.icon { - position: absolute; - top: 5px; - bottom: 0; - // TODO: better icon management - left: -3px; - height: 21px; - width: 17px; - margin: 7px 0; -} - -.resultName { - padding-left: 20px; -} - -.arrow-icon { - position: absolute; - top: 5px; - bottom: 0; - right: 1px; - height: 10px; - width: 10px; - width: 14px; - margin: 8px; - // margin: $padding; - - svg { - fill-opacity: 0; - } -} - -.btn { - composes: btn from "../../Sass/common/_buttons.scss"; - &.btn { - position: relative; - padding: $padding; - padding-left: 0; - margin-bottom: $padding-mini; - padding-right: $padding; - width: 100%; - border: 1px solid transparent; - } - &:hover { - background-color: $grey-lighter; - .arrow-icon svg { - fill-opacity: 1; - } - } - &.btnLocationName { - padding: $padding $padding * 3; - } -} -.btnWithBorderBottom { - &.btnWithBorderBottom { - @media (min-width: $sm) { - border-bottom: 1px solid $grey; - } - } -} diff --git a/lib/ReactViews/Search/search-result.scss.d.ts b/lib/ReactViews/Search/search-result.scss.d.ts deleted file mode 100644 index ba4c634fc8a..00000000000 --- a/lib/ReactViews/Search/search-result.scss.d.ts +++ /dev/null @@ -1,17 +0,0 @@ -// This file is automatically generated. -// Please do not change this file! -interface CssExports { - 'arrow-icon': string; - 'arrowIcon': string; - 'btn': string; - 'btnLocationName': string; - 'btnWithBorderBottom': string; - 'dark': string; - 'icon': string; - 'light': string; - 'resultName': string; - 'search-result': string; - 'searchResult': string; -} -declare var cssExports: CssExports; -export = cssExports; diff --git a/lib/Styled/List.jsx b/lib/Styled/List.tsx similarity index 100% rename from lib/Styled/List.jsx rename to lib/Styled/List.tsx diff --git a/lib/Traits/SearchProvider/LocationSearchProviderTraits.ts b/lib/Traits/SearchProvider/LocationSearchProviderTraits.ts index 5067a14f335..06f73b469a2 100644 --- a/lib/Traits/SearchProvider/LocationSearchProviderTraits.ts +++ b/lib/Traits/SearchProvider/LocationSearchProviderTraits.ts @@ -17,7 +17,14 @@ export default class LocationSearchProviderTraits extends SearchProviderTraits { "True if the geocoder should query as the user types to autocomplete.", isNullable: true }) - autocomplete?: boolean; + autocomplete?: boolean = true; + + @primitiveTrait({ + type: "number", + name: "recommendedListLength", + description: "Maximum amount of entries in the suggestion list." + }) + recommendedListLength: number = 5; @primitiveTrait({ type: "number", @@ -25,7 +32,16 @@ export default class LocationSearchProviderTraits extends SearchProviderTraits { description: "Time to move to the result location.", isNullable: true }) - flightDurationSeconds?: number; + flightDurationSeconds?: number = 1.5; + + @primitiveTrait({ + type: "boolean", + name: "Is open", + description: + "True if the search results of this search provider are visible; otherwise, false.", + isNullable: true + }) + isOpen: boolean = true; } export class SearchProviderMapCenterTraits extends ModelTraits { diff --git a/lib/Traits/SearchProvider/SearchProviderTraits.ts b/lib/Traits/SearchProvider/SearchProviderTraits.ts index a023dfcb040..f19e6449184 100644 --- a/lib/Traits/SearchProvider/SearchProviderTraits.ts +++ b/lib/Traits/SearchProvider/SearchProviderTraits.ts @@ -9,14 +9,6 @@ export default class SearchProviderTraits extends ModelTraits { }) name: string = "unknown"; - @primitiveTrait({ - type: "boolean", - name: "Open by default", - description: "Wheter are this search provider results open by default", - isNullable: true - }) - openByDefault: boolean = true; - @primitiveTrait({ type: "number", name: "Minimum characters", From 030b913918ae35e216376b792737431da576dc3f Mon Sep 17 00:00:00 2001 From: zoran995 Date: Tue, 16 Feb 2021 11:57:18 +0100 Subject: [PATCH 009/654] restore australian-gazetteer-search-provider as example --- lib/Models/Terria.ts | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/lib/Models/Terria.ts b/lib/Models/Terria.ts index ae40c94569b..42d38bdee19 100644 --- a/lib/Models/Terria.ts +++ b/lib/Models/Terria.ts @@ -407,6 +407,19 @@ export default class Terria { url: "https://dev.virtualearth.net/", flightDurationSeconds: 1.5, isOpen: true + }, + { + id: "search-provider/australian-gazetteer", + type: "australian-gazetteer-search-provider", + name: "translate#viewModels.searchPlaceNames", + url: + "http://services.ga.gov.au/gis/services/Australian_Gazetteer/MapServer/WFSServer", + searchPropertyName: "Australian_Gazetteer:NameU", + searchPropertyTypeName: "Australian_Gazetteer:Gazetteer_of_Australia", + flightDurationSeconds: 1.5, + minCharacters: 3, + recommendedListLength: 3, + isOpen: false } ] } From e826dd66195167aba8cd4e01f99f5c56ab12727c Mon Sep 17 00:00:00 2001 From: zoran995 Date: Tue, 16 Feb 2021 13:29:30 +0100 Subject: [PATCH 010/654] move shoudRunSearch to search function so we don't have to implement it for every search provider --- lib/Language/en/translation.json | 2 ++ lib/ModelMixins/SearchProvider/SearchProviderMixin.ts | 10 +++++++++- lib/Models/SearchProvider/BingMapsSearchProvider.ts | 4 ---- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/lib/Language/en/translation.json b/lib/Language/en/translation.json index a4394b46fe2..ddd59794964 100644 --- a/lib/Language/en/translation.json +++ b/lib/Language/en/translation.json @@ -607,6 +607,8 @@ "viewModels": { "searchNoLocations": "Sorry, no locations match your search query.", "searchErrorOccurred": "An error occurred while searching. Please check your internet connection or try again later.", + "seachMinCharacters": "You need to enter minimum {{count}} character", + "seachMinCharacters_plural": "You need to enter minimum {{count}} characters", "searchAddresses": "Addresses", "searchPlaceNames": "Official Place Names", "searchNoPlaceNames": "Sorry, no official place names match your search query.", diff --git a/lib/ModelMixins/SearchProvider/SearchProviderMixin.ts b/lib/ModelMixins/SearchProvider/SearchProviderMixin.ts index cf3e9066936..fbadf029f90 100644 --- a/lib/ModelMixins/SearchProvider/SearchProviderMixin.ts +++ b/lib/ModelMixins/SearchProvider/SearchProviderMixin.ts @@ -4,6 +4,7 @@ import Constructor from "../../Core/Constructor"; import Model from "../../Models/Model"; import SearchProviderResults from "../../Models/SearchProvider/SearchProviderResults"; import SearchProviderTraits from "../../Traits/SearchProvider/SearchProviderTraits"; +import i18next from "i18next"; type SearchProviderModel = Model; @@ -16,6 +17,13 @@ function SearchProviderMixin>( @action search(searchText: string): SearchProviderResults { const result = new SearchProviderResults(this); + if (!this.shouldRunSearch(searchText)) { + result.resultsCompletePromise = fromPromise(Promise.resolve()); + result.message = i18next.t("viewModels.seachMinCharacters", { + count: this.minCharacters + }); + return result; + } result.resultsCompletePromise = fromPromise( this.doSearch(searchText, result) ); @@ -27,7 +35,7 @@ function SearchProviderMixin>( results: SearchProviderResults ): Promise; - shouldRunSearch(searchText: string) { + private shouldRunSearch(searchText: string) { if ( searchText === undefined || /^\s*$/.test(searchText) || diff --git a/lib/Models/SearchProvider/BingMapsSearchProvider.ts b/lib/Models/SearchProvider/BingMapsSearchProvider.ts index e910f0950ed..4bbd5d2035d 100644 --- a/lib/Models/SearchProvider/BingMapsSearchProvider.ts +++ b/lib/Models/SearchProvider/BingMapsSearchProvider.ts @@ -52,10 +52,6 @@ export default class BingMapsSearchProvider extends LocationSearchProviderMixin( searchResults.results.length = 0; searchResults.message = undefined; - if (this.shouldRunSearch(searchText)) { - return Promise.resolve(); - } - this.terria.analytics.logEvent("search", "bing", searchText); const searchQuery = new Resource({ From e388d1e026f4bf4945614b9ca0607fe6c70390d9 Mon Sep 17 00:00:00 2001 From: zoran995 Date: Tue, 16 Feb 2021 13:30:42 +0100 Subject: [PATCH 011/654] remove autocomplete and sortByName for later implementation if needed --- lib/Models/Terria.ts | 15 ++------------- .../LocationSearchProviderTraits.ts | 9 --------- 2 files changed, 2 insertions(+), 22 deletions(-) diff --git a/lib/Models/Terria.ts b/lib/Models/Terria.ts index 5347a8db651..fcbb4d3f385 100644 --- a/lib/Models/Terria.ts +++ b/lib/Models/Terria.ts @@ -223,7 +223,7 @@ interface ConfigParameters { interface SearchBar { /** * Input text field placeholder shown when no input has been given yet. The string is translateable. - * @default "search.placeholder" + * @default "translate#search.placeholder" */ placeholder: string; /** @@ -231,21 +231,11 @@ interface SearchBar { * @default 5 */ recommendedListLength: number; - /** - * Defines whether search results are to be sorted alphanumerically. - * @default true - */ - sortByName: boolean; /** * The duration of the camera flight to an entered location, in seconds. * @default 1.5 */ flightDurationSeconds: number; - /** - * True if the geocoder should query as the user types to autocomplete. - * @default true - */ - autocomplete: boolean; /** * Minimum number of characters to start search. */ @@ -400,9 +390,7 @@ export default class Terria { searchBar: { placeholder: "translate#search.placeholder", recommendedListLength: 5, - sortByName: true, flightDurationSeconds: 1.5, - autocomplete: true, minCharacters: 3, searchProviders: [ { @@ -411,6 +399,7 @@ export default class Terria { name: "translate#viewModels.searchLocations", url: "https://dev.virtualearth.net/", flightDurationSeconds: 1.5, + minCharacters: 5, isOpen: true }, { diff --git a/lib/Traits/SearchProvider/LocationSearchProviderTraits.ts b/lib/Traits/SearchProvider/LocationSearchProviderTraits.ts index 06f73b469a2..2893c7ea07f 100644 --- a/lib/Traits/SearchProvider/LocationSearchProviderTraits.ts +++ b/lib/Traits/SearchProvider/LocationSearchProviderTraits.ts @@ -10,15 +10,6 @@ export default class LocationSearchProviderTraits extends SearchProviderTraits { }) url: string = ""; - @primitiveTrait({ - type: "boolean", - name: "Open by default", - description: - "True if the geocoder should query as the user types to autocomplete.", - isNullable: true - }) - autocomplete?: boolean = true; - @primitiveTrait({ type: "number", name: "recommendedListLength", From 34570f3b64093d0f3fcbe4f2d4cdc48af1b0e51d Mon Sep 17 00:00:00 2001 From: zoran995 Date: Wed, 17 Feb 2021 17:55:24 +0100 Subject: [PATCH 012/654] make searchBar optional in config --- lib/Models/Terria.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Models/Terria.ts b/lib/Models/Terria.ts index fcbb4d3f385..c0b5eae898a 100644 --- a/lib/Models/Terria.ts +++ b/lib/Models/Terria.ts @@ -217,7 +217,7 @@ interface ConfigParameters { /** * The search bar allows requesting information from various search services at once. */ - searchBar: SearchBar; + searchBar?: SearchBar; } interface SearchBar { From 53c42107300eae7780630f088ffcd3eabf050e3a Mon Sep 17 00:00:00 2001 From: zoran995 Date: Wed, 17 Feb 2021 18:03:41 +0100 Subject: [PATCH 013/654] resolve issues with optional searchBar --- lib/ModelMixins/SearchProvider/SearchProviderMixin.ts | 2 +- .../WebFeatureServiceSearchProviderMixin.ts | 2 +- .../SearchProvider/upsertSearchProviderFromJson.ts | 6 +++--- lib/Models/Terria.ts | 2 +- lib/ReactViews/Search/LocationSearchResults.tsx | 4 ++-- .../LocationSearchProviderTraitsSpec.ts | 11 +++++++++++ 6 files changed, 19 insertions(+), 8 deletions(-) create mode 100644 test/Traits/SearchProvider/LocationSearchProviderTraitsSpec.ts diff --git a/lib/ModelMixins/SearchProvider/SearchProviderMixin.ts b/lib/ModelMixins/SearchProvider/SearchProviderMixin.ts index fbadf029f90..606fc07735b 100644 --- a/lib/ModelMixins/SearchProvider/SearchProviderMixin.ts +++ b/lib/ModelMixins/SearchProvider/SearchProviderMixin.ts @@ -42,7 +42,7 @@ function SearchProviderMixin>( (this.minCharacters && searchText.length < this.minCharacters) || (this.minCharacters === undefined && searchText.length < - this.terria.configParameters.searchBar.minCharacters) + this.terria.configParameters.searchBar!.minCharacters) ) { return false; } diff --git a/lib/ModelMixins/SearchProvider/WebFeatureServiceSearchProviderMixin.ts b/lib/ModelMixins/SearchProvider/WebFeatureServiceSearchProviderMixin.ts index 56a1e276079..dad3a5d4a16 100644 --- a/lib/ModelMixins/SearchProvider/WebFeatureServiceSearchProviderMixin.ts +++ b/lib/ModelMixins/SearchProvider/WebFeatureServiceSearchProviderMixin.ts @@ -213,7 +213,7 @@ function createZoomToFunction( const flightDurationSeconds: number = model.flightDurationSeconds || - model.terria.configParameters.searchBar.flightDurationSeconds; + model.terria.configParameters.searchBar!.flightDurationSeconds; return function() { model.terria.currentViewer.zoomTo(rectangle, flightDurationSeconds); diff --git a/lib/Models/SearchProvider/upsertSearchProviderFromJson.ts b/lib/Models/SearchProvider/upsertSearchProviderFromJson.ts index 19474f3f14c..4921a9c561d 100644 --- a/lib/Models/SearchProvider/upsertSearchProviderFromJson.ts +++ b/lib/Models/SearchProvider/upsertSearchProviderFromJson.ts @@ -64,18 +64,18 @@ function setDefaultTraits(model: BaseModel) { model.setTrait( CommonStrata.defaults, "flightDurationSeconds", - terria.configParameters.searchBar.flightDurationSeconds + terria.configParameters.searchBar!.flightDurationSeconds ); model.setTrait( CommonStrata.defaults, "minCharacters", - terria.configParameters.searchBar.minCharacters + terria.configParameters.searchBar!.minCharacters ); model.setTrait( CommonStrata.defaults, "recommendedListLength", - terria.configParameters.searchBar.recommendedListLength + terria.configParameters.searchBar!.recommendedListLength ); } diff --git a/lib/Models/Terria.ts b/lib/Models/Terria.ts index c0b5eae898a..6b96e90f3bd 100644 --- a/lib/Models/Terria.ts +++ b/lib/Models/Terria.ts @@ -730,7 +730,7 @@ export default class Terria { } }) .then(() => { - let searchProviders = this.configParameters.searchBar.searchProviders; + let searchProviders = this.configParameters.searchBar!.searchProviders; if (!isObservableArray(searchProviders)) throw new TerriaError({ sender: SearchProviderFactory, diff --git a/lib/ReactViews/Search/LocationSearchResults.tsx b/lib/ReactViews/Search/LocationSearchResults.tsx index 1ad36202da2..7b8e5bc2abd 100644 --- a/lib/ReactViews/Search/LocationSearchResults.tsx +++ b/lib/ReactViews/Search/LocationSearchResults.tsx @@ -62,8 +62,8 @@ class LocationSearchResults extends React.Component { @computed get validResults() { const { search, terria } = this.props; - const locationSearchBoundingBox = - terria.configParameters.searchBar.boundingBoxLimit; + const locationSearchBoundingBox = terria.configParameters.searchBar! + .boundingBoxLimit; const validResults = isDefined(locationSearchBoundingBox) ? search.results.filter(function(r: any) { return ( diff --git a/test/Traits/SearchProvider/LocationSearchProviderTraitsSpec.ts b/test/Traits/SearchProvider/LocationSearchProviderTraitsSpec.ts new file mode 100644 index 00000000000..781a510e90f --- /dev/null +++ b/test/Traits/SearchProvider/LocationSearchProviderTraitsSpec.ts @@ -0,0 +1,11 @@ +import Terria from "../../../lib/Models/Terria"; + +describe("LocationSearchProviderTraits", function() { + let terria: Terria; + beforeEach(async function() { + terria = new Terria({ + baseUrl: "./" + }); + //geoJsonCatalogItem = new GeoJsonCatalogItem("test", terria); + }); +}); From 5a580a3e539da3054de8ce5b98843a827c6fceba Mon Sep 17 00:00:00 2001 From: zoran995 Date: Wed, 17 Feb 2021 23:09:56 +0100 Subject: [PATCH 014/654] correct name of translation string --- lib/Language/en/translation.json | 4 ++-- lib/ModelMixins/SearchProvider/SearchProviderMixin.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/Language/en/translation.json b/lib/Language/en/translation.json index ddd59794964..c289fc50858 100644 --- a/lib/Language/en/translation.json +++ b/lib/Language/en/translation.json @@ -607,8 +607,8 @@ "viewModels": { "searchNoLocations": "Sorry, no locations match your search query.", "searchErrorOccurred": "An error occurred while searching. Please check your internet connection or try again later.", - "seachMinCharacters": "You need to enter minimum {{count}} character", - "seachMinCharacters_plural": "You need to enter minimum {{count}} characters", + "searchMinCharacters": "You need to enter minimum {{count}} character", + "searchMinCharacters_plural": "You need to enter minimum {{count}} characters", "searchAddresses": "Addresses", "searchPlaceNames": "Official Place Names", "searchNoPlaceNames": "Sorry, no official place names match your search query.", diff --git a/lib/ModelMixins/SearchProvider/SearchProviderMixin.ts b/lib/ModelMixins/SearchProvider/SearchProviderMixin.ts index 606fc07735b..349b806a5fb 100644 --- a/lib/ModelMixins/SearchProvider/SearchProviderMixin.ts +++ b/lib/ModelMixins/SearchProvider/SearchProviderMixin.ts @@ -19,7 +19,7 @@ function SearchProviderMixin>( const result = new SearchProviderResults(this); if (!this.shouldRunSearch(searchText)) { result.resultsCompletePromise = fromPromise(Promise.resolve()); - result.message = i18next.t("viewModels.seachMinCharacters", { + result.message = i18next.t("viewModels.searchMinCharacters", { count: this.minCharacters }); return result; From 894237bf3869e4231fe6edf2eaf30b717f07ae35 Mon Sep 17 00:00:00 2001 From: zoran995 Date: Thu, 18 Feb 2021 00:44:17 +0100 Subject: [PATCH 015/654] copy deprecationWarning from cesium, move default search providers array to config.json --- lib/Core/deprecationWarning.ts | 94 +++++++++++++++++++ lib/Language/languageHelpers.ts | 11 ++- lib/Models/Terria.ts | 44 ++++----- .../Search/LocationSearchResults.tsx | 4 +- 4 files changed, 119 insertions(+), 34 deletions(-) create mode 100644 lib/Core/deprecationWarning.ts diff --git a/lib/Core/deprecationWarning.ts b/lib/Core/deprecationWarning.ts new file mode 100644 index 00000000000..9b57e432663 --- /dev/null +++ b/lib/Core/deprecationWarning.ts @@ -0,0 +1,94 @@ +import DeveloperError from "terriajs-cesium/Source/Core/DeveloperError"; +import defined from "terriajs-cesium/Source/Core/defined"; +import defaultValue from "terriajs-cesium/Source/Core/defaultValue"; + +/** + * Port of Cesium's functions `deprecationWarning` and `oneTimeWarning`. + */ +const warnings: { [key: string]: boolean } = {}; + +/** + * Logs a one time message to the console. Use this function instead of + * console.log directly since this does not log duplicate messages + * unless it is called from multiple workers. + * + * @function oneTimeWarning + * + * @param {String} identifier The unique identifier for this warning. + * @param {String} [message=identifier] The message to log to the console. + * + * @example + * for(var i=0;i>includeStart('debug', pragmas.debug); + if (!defined(identifier)) { + throw new DeveloperError("identifier is required."); + } + //>>includeEnd('debug'); + + if (!defined(warnings[identifier])) { + warnings[identifier] = true; + console.warn(defaultValue(message, identifier)); + } +} + +/** + * Logs a deprecation message to the console. Use this function instead of + * console.log directly since this does not log duplicate messages + * unless it is called from multiple workers. + * + * @function deprecationWarning + * + * @param {String} identifier The unique identifier for this deprecated API. + * @param {String} message The message to log to the console. + * + * @example + * // Deprecated function or class + * function Foo() { + * deprecationWarning('Foo', 'Foo was deprecated in Cesium 1.01. It will be removed in 1.03. Use newFoo instead.'); + * // ... + * } + * + * // Deprecated function + * Bar.prototype.func = function() { + * deprecationWarning('Bar.func', 'Bar.func() was deprecated in Cesium 1.01. It will be removed in 1.03. Use Bar.newFunc() instead.'); + * // ... + * }; + * + * // Deprecated property + * Object.defineProperties(Bar.prototype, { + * prop : { + * get : function() { + * deprecationWarning('Bar.prop', 'Bar.prop was deprecated in Cesium 1.01. It will be removed in 1.03. Use Bar.newProp instead.'); + * // ... + * }, + * set : function(value) { + * deprecationWarning('Bar.prop', 'Bar.prop was deprecated in Cesium 1.01. It will be removed in 1.03. Use Bar.newProp instead.'); + * // ... + * } + * } + * }); + * + * @private + */ +function deprecationWarning(identifier: string, message: string) { + //>>includeStart('debug', pragmas.debug); + if (!defined(identifier) || !defined(message)) { + throw new DeveloperError("identifier and message are required."); + } + //>>includeEnd('debug'); + + oneTimeWarning(identifier, message); +} + +export default deprecationWarning; diff --git a/lib/Language/languageHelpers.ts b/lib/Language/languageHelpers.ts index 01a7a30c3ca..c8f32ea0c9d 100644 --- a/lib/Language/languageHelpers.ts +++ b/lib/Language/languageHelpers.ts @@ -1,5 +1,5 @@ import i18next from "i18next"; - +import deprecationWarning from "../Core/deprecationWarning"; /** * Takes a given string and translates it if it exists, otherwise return */ @@ -9,12 +9,15 @@ export function useTranslationIfExists(keyOrString: string) { return i18next.exists(translationKey) ? i18next.t(translationKey) : translationKey; - } else { - console.warn( - "using translation key within config won't work in future unless you prefix it with `translate#`" + } else if (keyOrString) { + deprecationWarning( + "useTranslationIfExists", + "Using translation key inside config without `translate#` prefix is deprecated" ); // after the depreaction // return keyOrString; return i18next.exists(keyOrString) ? i18next.t(keyOrString) : keyOrString; + } else { + return keyOrString; } } diff --git a/lib/Models/Terria.ts b/lib/Models/Terria.ts index 6b96e90f3bd..71cae12da5f 100644 --- a/lib/Models/Terria.ts +++ b/lib/Models/Terria.ts @@ -392,30 +392,7 @@ export default class Terria { recommendedListLength: 5, flightDurationSeconds: 1.5, minCharacters: 3, - searchProviders: [ - { - id: "search-provider/bing-maps", - type: "bing-maps-search-provider", - name: "translate#viewModels.searchLocations", - url: "https://dev.virtualearth.net/", - flightDurationSeconds: 1.5, - minCharacters: 5, - isOpen: true - }, - { - id: "search-provider/australian-gazetteer", - type: "australian-gazetteer-search-provider", - name: "translate#viewModels.searchPlaceNames", - url: - "http://services.ga.gov.au/gis/services/Australian_Gazetteer/MapServer/WFSServer", - searchPropertyName: "Australian_Gazetteer:NameU", - searchPropertyTypeName: "Australian_Gazetteer:Gazetteer_of_Australia", - flightDurationSeconds: 1.5, - minCharacters: 3, - recommendedListLength: 3, - isOpen: false - } - ] + searchProviders: [] } }; @@ -576,8 +553,10 @@ export default class Terria { } if (this.locationSearchProviders.has(model.uniqueId)) { - throw new RuntimeError( - "A SearchProvider with the specified ID already exists." + console.log( + new DeveloperError( + "A SearchProvider with the specified ID already exists." + ) ); } @@ -730,7 +709,7 @@ export default class Terria { } }) .then(() => { - let searchProviders = this.configParameters.searchBar!.searchProviders; + let searchProviders = this.configParameters.searchBar?.searchProviders; if (!isObservableArray(searchProviders)) throw new TerriaError({ sender: SearchProviderFactory, @@ -843,7 +822,16 @@ export default class Terria { updateParameters(parameters: ConfigParameters): void { Object.keys(parameters).forEach((key: string) => { if (this.configParameters.hasOwnProperty(key)) { - this.configParameters[key] = parameters[key]; + if (key === "searchBar") { + // merge default and new + //@ts-ignore + this.configParameters[key] = { + ...this.configParameters[key], + ...parameters[key] + }; + } else { + this.configParameters[key] = parameters[key]; + } } }); diff --git a/lib/ReactViews/Search/LocationSearchResults.tsx b/lib/ReactViews/Search/LocationSearchResults.tsx index 7b8e5bc2abd..d9927e669e6 100644 --- a/lib/ReactViews/Search/LocationSearchResults.tsx +++ b/lib/ReactViews/Search/LocationSearchResults.tsx @@ -62,8 +62,8 @@ class LocationSearchResults extends React.Component { @computed get validResults() { const { search, terria } = this.props; - const locationSearchBoundingBox = terria.configParameters.searchBar! - .boundingBoxLimit; + const locationSearchBoundingBox = + terria.configParameters.searchBar?.boundingBoxLimit; const validResults = isDefined(locationSearchBoundingBox) ? search.results.filter(function(r: any) { return ( From 4fba7f8e5ae0cb37cde091c73a641addf5a434fa Mon Sep 17 00:00:00 2001 From: zoran995 Date: Thu, 18 Feb 2021 00:45:08 +0100 Subject: [PATCH 016/654] add tests --- .../AustralianGazetteerSearchProviderSpec.ts | 19 +++++-- .../BingMapsSearchProviderSpec.ts | 55 +++++++++++++++++++ .../LocationSearchProviderTraitsSpec.ts | 23 +++++++- 3 files changed, 90 insertions(+), 7 deletions(-) rename test/Models/{ => SearchProvider}/AustralianGazetteerSearchProviderSpec.ts (55%) create mode 100644 test/Models/SearchProvider/BingMapsSearchProviderSpec.ts diff --git a/test/Models/AustralianGazetteerSearchProviderSpec.ts b/test/Models/SearchProvider/AustralianGazetteerSearchProviderSpec.ts similarity index 55% rename from test/Models/AustralianGazetteerSearchProviderSpec.ts rename to test/Models/SearchProvider/AustralianGazetteerSearchProviderSpec.ts index 33a4a48047c..9ffe6205216 100644 --- a/test/Models/AustralianGazetteerSearchProviderSpec.ts +++ b/test/Models/SearchProvider/AustralianGazetteerSearchProviderSpec.ts @@ -1,9 +1,8 @@ import { configure } from "mobx"; -import createAustralianGazetteerSearchProvider from "../../lib/Models/SearchProvider/AustralianGazetteerSearchProvider"; -import Terria from "../../lib/Models/Terria"; -import WebFeatureServiceSearchProvider from "../../lib/Models/SearchProvider/WebFeatureServiceSearchProvider"; +import Terria from "../../../lib/Models/Terria"; +import AustralianGazetteerSearchProvider from "../../../lib/Models/SearchProvider/AustralianGazetteerSearchProvider"; -const wfsResponseXml = require("raw-loader!../../wwwroot/test/WFS/getWithFilter.xml"); +const wfsResponseXml = require("raw-loader!../../../wwwroot/test/WFS/getWithFilter.xml"); configure({ enforceActions: "observed", @@ -11,10 +10,18 @@ configure({ }); describe("GazetteerSearchProvider", function() { - let searchProvider: WebFeatureServiceSearchProvider; + let searchProvider: AustralianGazetteerSearchProvider; beforeEach(function() { - searchProvider = createAustralianGazetteerSearchProvider(new Terria()); + searchProvider = new AustralianGazetteerSearchProvider( + "test", + new Terria() + ); + }); + + it(" type", function() { + expect(searchProvider.type).toEqual(AustralianGazetteerSearchProvider.type); }); + it("queries the web feature service and returns search results", async function() { spyOn(searchProvider, "getXml").and.returnValue( Promise.resolve(wfsResponseXml) diff --git a/test/Models/SearchProvider/BingMapsSearchProviderSpec.ts b/test/Models/SearchProvider/BingMapsSearchProviderSpec.ts new file mode 100644 index 00000000000..bfa3673ec23 --- /dev/null +++ b/test/Models/SearchProvider/BingMapsSearchProviderSpec.ts @@ -0,0 +1,55 @@ +import BingMapsSearchProvider from "../../../lib/Models/SearchProvider/BingMapsSearchProvider"; +import Terria from "../../../lib/Models/Terria"; + +describe("BingMapsSearchProvider", function() { + let searchProvider: BingMapsSearchProvider; + beforeEach(function() { + searchProvider = new BingMapsSearchProvider("test", new Terria()); + jasmine.Ajax.install(); + jasmine.Ajax.stubRequest(/https:\/\/dev.virtualearth.net/i).andReturn({ + responseText: JSON.stringify({ + resourceSets: [ + { + estimatedTotal: 1, + resources: [ + { + address: { + addressLine: "Borgo Garibaldi", + adminDistrict: "Veneto", + adminDistrict2: "Belluno", + countryRegion: "Italy", + formattedAddress: "Borgo Garibaldi, 32026 Borgo Valbelluna", + locality: "Borgo Valbelluna", + postalCode: "32026" + }, + bbox: [46.06294, 12.08387, 46.06359, 12.08573], + confidence: "Medium", + entityType: "RoadBlock", + name: "Borgo Garibaldi, 32026 Borgo Valbelluna", + point: { type: "Point", coordinates: [46.06323, 12.0848] } + } + ] + } + ] + }) + }); + }); + + afterEach(function() { + jasmine.Ajax.uninstall(); + }); + + it(" type", function() { + expect(searchProvider.type).toEqual(BingMapsSearchProvider.type); + }); + + it("find location", function(done) { + const results = searchProvider.search("melb"); + expect(results).toBeDefined(); + expect(results.results.length).toEqual(1); + expect(results.results[0].name).toEqual( + "Borgo Garibaldi, 32026 Borgo Valbelluna" + ); + done(); + }); +}); diff --git a/test/Traits/SearchProvider/LocationSearchProviderTraitsSpec.ts b/test/Traits/SearchProvider/LocationSearchProviderTraitsSpec.ts index 781a510e90f..e07d7033acf 100644 --- a/test/Traits/SearchProvider/LocationSearchProviderTraitsSpec.ts +++ b/test/Traits/SearchProvider/LocationSearchProviderTraitsSpec.ts @@ -1,11 +1,32 @@ import Terria from "../../../lib/Models/Terria"; +import BingMapsSearchProvider from "../../../lib/Models/SearchProvider/BingMapsSearchProvider"; +import LocationSearchProviderMixin from "../../../lib/ModelMixins/SearchProvider/LocationSearchProviderMixin"; describe("LocationSearchProviderTraits", function() { let terria: Terria; + let bingMapsSearchProvider: BingMapsSearchProvider; beforeEach(async function() { terria = new Terria({ baseUrl: "./" }); - //geoJsonCatalogItem = new GeoJsonCatalogItem("test", terria); + bingMapsSearchProvider = new BingMapsSearchProvider("test", terria); + }); + + it(" - properly mixed", function() { + expect( + LocationSearchProviderMixin.isMixedInto(bingMapsSearchProvider) + ).toBeTruthy(); + }); + + it(" - propperly defines default recommendedListLength", function() { + expect(bingMapsSearchProvider.recommendedListLength).toEqual(5); + }); + + it(" - propperly defines default flightDurationSeconds", function() { + expect(bingMapsSearchProvider.flightDurationSeconds).toEqual(1.5); + }); + + it(" - propperly defines default isOpen", function() { + expect(bingMapsSearchProvider.isOpen).toEqual(true); }); }); From e104c34f439a05adbc932e54fc58a2fe8393732f Mon Sep 17 00:00:00 2001 From: zoran995 Date: Thu, 18 Feb 2021 00:49:54 +0100 Subject: [PATCH 017/654] use propper translation strings --- lib/Language/en/translation.json | 8 ++++++++ lib/Models/SearchProvider/upsertSearchProviderFromJson.ts | 8 ++++---- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/lib/Language/en/translation.json b/lib/Language/en/translation.json index c289fc50858..92de53a1d3b 100644 --- a/lib/Language/en/translation.json +++ b/lib/Language/en/translation.json @@ -1437,6 +1437,14 @@ "datasetScaleErrorMessage": "The {{name}} dataset will not be shown when zoomed in this close to the map because the data custodian has indicated that the data is not intended or suitable for display at this scale. Click the dataset's Info button on the Now Viewing tab for more information about the dataset and the data custodian." } }, + "searchProvider": { + "models": { + "unsupportedTypeTitle": "Unknown type", + "unsupportedTypeMessage": "Could not create unknown model type {{type}}.", + "idForMatchingErrorTitle": "Missing property", + "idForMatchingErrorMessage": "Model objects must have an `id`, `localId`, or `name` property." + } + }, "deltaTool": { "titlePrefix": "Change Detection", "description": "This tool visualizes the difference between imagery captured at two discrete points in time.", diff --git a/lib/Models/SearchProvider/upsertSearchProviderFromJson.ts b/lib/Models/SearchProvider/upsertSearchProviderFromJson.ts index 4921a9c561d..c9c7427e756 100644 --- a/lib/Models/SearchProvider/upsertSearchProviderFromJson.ts +++ b/lib/Models/SearchProvider/upsertSearchProviderFromJson.ts @@ -18,8 +18,8 @@ export default function upsertSearchProviderFromJson( const id = json.localId || json.name; if (id === undefined) { throw new TerriaError({ - title: i18next.t("models.catalog.idForMatchingErrorTitle"), - message: i18next.t("models.catalog.idForMatchingErrorMessage") + title: i18next.t("searchProvider.models.idForMatchingErrorTitle"), + message: i18next.t("searchProvider.models.idForMatchingErrorMessage") }); } uniqueId = id; @@ -32,8 +32,8 @@ export default function upsertSearchProviderFromJson( if (model === undefined) { console.log( new TerriaError({ - title: i18next.t("models.catalog.unsupportedTypeTitle"), - message: i18next.t("models.catalog.unsupportedTypeMessage", { + title: i18next.t("searchProvider.models.unsupportedTypeTitle"), + message: i18next.t("searchProvider.models.unsupportedTypeMessage", { type: json.type }) }) From 91630c46e9f4e85bcd74d06c7c54bed494c2c004 Mon Sep 17 00:00:00 2001 From: zoran995 Date: Thu, 18 Feb 2021 01:11:09 +0100 Subject: [PATCH 018/654] tests --- .../BingMapsSearchProviderSpec.ts | 55 ------------------- .../BingMapsSearchProviderTraitsSpec.ts | 28 ++++++++++ 2 files changed, 28 insertions(+), 55 deletions(-) delete mode 100644 test/Models/SearchProvider/BingMapsSearchProviderSpec.ts create mode 100644 test/Traits/SearchProvider/BingMapsSearchProviderTraitsSpec.ts diff --git a/test/Models/SearchProvider/BingMapsSearchProviderSpec.ts b/test/Models/SearchProvider/BingMapsSearchProviderSpec.ts deleted file mode 100644 index bfa3673ec23..00000000000 --- a/test/Models/SearchProvider/BingMapsSearchProviderSpec.ts +++ /dev/null @@ -1,55 +0,0 @@ -import BingMapsSearchProvider from "../../../lib/Models/SearchProvider/BingMapsSearchProvider"; -import Terria from "../../../lib/Models/Terria"; - -describe("BingMapsSearchProvider", function() { - let searchProvider: BingMapsSearchProvider; - beforeEach(function() { - searchProvider = new BingMapsSearchProvider("test", new Terria()); - jasmine.Ajax.install(); - jasmine.Ajax.stubRequest(/https:\/\/dev.virtualearth.net/i).andReturn({ - responseText: JSON.stringify({ - resourceSets: [ - { - estimatedTotal: 1, - resources: [ - { - address: { - addressLine: "Borgo Garibaldi", - adminDistrict: "Veneto", - adminDistrict2: "Belluno", - countryRegion: "Italy", - formattedAddress: "Borgo Garibaldi, 32026 Borgo Valbelluna", - locality: "Borgo Valbelluna", - postalCode: "32026" - }, - bbox: [46.06294, 12.08387, 46.06359, 12.08573], - confidence: "Medium", - entityType: "RoadBlock", - name: "Borgo Garibaldi, 32026 Borgo Valbelluna", - point: { type: "Point", coordinates: [46.06323, 12.0848] } - } - ] - } - ] - }) - }); - }); - - afterEach(function() { - jasmine.Ajax.uninstall(); - }); - - it(" type", function() { - expect(searchProvider.type).toEqual(BingMapsSearchProvider.type); - }); - - it("find location", function(done) { - const results = searchProvider.search("melb"); - expect(results).toBeDefined(); - expect(results.results.length).toEqual(1); - expect(results.results[0].name).toEqual( - "Borgo Garibaldi, 32026 Borgo Valbelluna" - ); - done(); - }); -}); diff --git a/test/Traits/SearchProvider/BingMapsSearchProviderTraitsSpec.ts b/test/Traits/SearchProvider/BingMapsSearchProviderTraitsSpec.ts new file mode 100644 index 00000000000..1d4ca1f6ad7 --- /dev/null +++ b/test/Traits/SearchProvider/BingMapsSearchProviderTraitsSpec.ts @@ -0,0 +1,28 @@ +import Terria from "../../../lib/Models/Terria"; +import BingMapsSearchProvider from "../../../lib/Models/SearchProvider/BingMapsSearchProvider"; +import LocationSearchProviderMixin from "../../../lib/ModelMixins/SearchProvider/LocationSearchProviderMixin"; + +describe("BingMapsSearchProviderTraits", function() { + let terria: Terria; + let bingMapsSearchProvider: BingMapsSearchProvider; + beforeEach(async function() { + terria = new Terria({ + baseUrl: "./" + }); + bingMapsSearchProvider = new BingMapsSearchProvider("test", terria); + }); + + it(" - properly mixed", function() { + expect( + LocationSearchProviderMixin.isMixedInto(bingMapsSearchProvider) + ).toBeTruthy(); + }); + + describe(" - default values", function() { + it(" - propperly defines default url", function() { + expect(bingMapsSearchProvider.url).toEqual( + "https://dev.virtualearth.net/" + ); + }); + }); +}); From 907b4cc41ed99ea9693e3c91ba552bd2cb5f22f4 Mon Sep 17 00:00:00 2001 From: zoran995 Date: Thu, 8 Jul 2021 08:30:15 +0200 Subject: [PATCH 019/654] fix bad merge --- lib/Styled/List.tsx | 32 ++++++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/lib/Styled/List.tsx b/lib/Styled/List.tsx index 8df57000c29..94a61b3024b 100644 --- a/lib/Styled/List.tsx +++ b/lib/Styled/List.tsx @@ -1,13 +1,37 @@ -import styled from "styled-components"; +import styled, { css } from "styled-components"; -export const Ul = styled.ul` +export const Li = styled.li``; + +type ListProps = Partial<{ + spaced: boolean; + lined: boolean; + fullWidth: boolean; +}>; + +export const Ul = styled.ul` list-style: none; padding: 0; margin: 0; + ${props => props.fullWidth && "width: 100%;"} + ${props => + props.spaced && + css` + ${Li}:not(:first-child) { + padding-top: 5px; + } + `} + ${props => + props.lined && + css` + ${Li}:first-child { + padding-bottom: 5px; + } + ${Li}:not(:first-child) { + border-top: 1px solid grey; + } + `} `; -export const Li = styled.li``; - export const Ol = styled(Ul).attrs({ as: "ol" })``; From 7ec3b1f113460127efeabe1d5da086d24e169dcc Mon Sep 17 00:00:00 2001 From: zoran995 Date: Thu, 8 Jul 2021 09:16:45 +0200 Subject: [PATCH 020/654] connect search providers with analytics and resolve merge conflicts --- lib/Core/AnalyticEvents/analyticEvents.ts | 4 +--- .../LocationSearchProviderMixin.ts | 19 +++++++-------- .../SearchProvider/SearchProviderMixin.ts | 15 ++++++++---- .../WebFeatureServiceSearchProviderMixin.ts | 2 ++ .../AustralianGazetteerSearchProvider.ts | 12 ++++++++++ .../SearchProvider/BingMapsSearchProvider.ts | 14 +++++++++-- .../SearchProvider/CatalogSearchProvider.ts | 21 ++++++++--------- .../SearchProvider/SearchProviderResults.ts | 2 +- .../SearchProvider/StubSearchProvider.ts | 4 ++++ lib/ReactViewModels/SearchState.ts | 16 +++++++------ lib/ReactViews/Mobile/MobileHeader.jsx | 10 +------- .../Search/LocationSearchResults.tsx | 18 +++++++-------- lib/ReactViews/Search/SearchBoxAndResults.jsx | 17 +++++++------- lib/ReactViews/Search/SearchHeader.tsx | 6 ++--- lib/ReactViews/Search/SearchResult.tsx | 23 ++++++------------- lib/Styled/Icon.tsx | 2 +- lib/Styled/Input.tsx | 2 +- lib/Styled/Select.tsx | 2 +- 18 files changed, 99 insertions(+), 90 deletions(-) diff --git a/lib/Core/AnalyticEvents/analyticEvents.ts b/lib/Core/AnalyticEvents/analyticEvents.ts index 51154c1218c..39f9f443cf3 100644 --- a/lib/Core/AnalyticEvents/analyticEvents.ts +++ b/lib/Core/AnalyticEvents/analyticEvents.ts @@ -15,9 +15,7 @@ export enum Category { export enum SearchAction { bing = "Bing", catalog = "Catalog", - gazetteer = "Gazetteer", - gnaf = "gnaf", - nominatim = "nominatim" + gazetteer = "Gazetteer" } export enum LaunchAction { diff --git a/lib/ModelMixins/SearchProvider/LocationSearchProviderMixin.ts b/lib/ModelMixins/SearchProvider/LocationSearchProviderMixin.ts index faa54b3ad92..15e40342c25 100644 --- a/lib/ModelMixins/SearchProvider/LocationSearchProviderMixin.ts +++ b/lib/ModelMixins/SearchProvider/LocationSearchProviderMixin.ts @@ -1,15 +1,10 @@ -import { action, observable } from "mobx"; -import { fromPromise } from "mobx-utils"; +import { action } from "mobx"; import Ellipsoid from "terriajs-cesium/Source/Core/Ellipsoid"; import CesiumMath from "terriajs-cesium/Source/Core/Math"; import Rectangle from "terriajs-cesium/Source/Core/Rectangle"; import Constructor from "../../Core/Constructor"; -import Model, { BaseModel } from "../../Models/Model"; -import SearchProviderResults from "../../Models/SearchProvider/SearchProviderResults"; -import StratumFromTraits from "../../Models/StratumFromTraits"; +import Model from "../../Models/Model"; import Terria from "../../Models/Terria"; -import ModelTraits from "../../Traits/ModelTraits"; -import SearchProviderTraits from "../../Traits/SearchProvider/SearchProviderTraits"; import CommonStrata from "../../Models/CommonStrata"; import LocationSearchProviderTraits from "../../Traits/SearchProvider/LocationSearchProviderTraits"; import SearchProviderMixin from "./SearchProviderMixin"; @@ -20,15 +15,16 @@ function LocationSearchProviderMixin< T extends Constructor >(Base: T) { abstract class LocationSearchProviderMixin extends SearchProviderMixin(Base) { + get hasLocationSearchProviderMixin() { + return true; + } + @action toggleOpen(stratumId: CommonStrata = CommonStrata.user) { this.setTrait(stratumId, "isOpen", !this.isOpen); } - - get hasLocationSearchProviderMixin() { - return true; - } } + return LocationSearchProviderMixin; } @@ -59,6 +55,7 @@ export function getMapCenter(terria: Terria): MapCenter { namespace LocationSearchProviderMixin { export interface LocationSearchProviderMixin extends InstanceType> {} + export function isMixedInto( model: any ): model is LocationSearchProviderMixin { diff --git a/lib/ModelMixins/SearchProvider/SearchProviderMixin.ts b/lib/ModelMixins/SearchProvider/SearchProviderMixin.ts index 349b806a5fb..e62d16c54fa 100644 --- a/lib/ModelMixins/SearchProvider/SearchProviderMixin.ts +++ b/lib/ModelMixins/SearchProvider/SearchProviderMixin.ts @@ -14,6 +14,13 @@ function SearchProviderMixin>( abstract class SearchProviderMixin extends Base { abstract get type(): string; + protected abstract logEvent(searchText: string): void; + + protected abstract doSearch( + searchText: string, + results: SearchProviderResults + ): Promise; + @action search(searchText: string): SearchProviderResults { const result = new SearchProviderResults(this); @@ -24,17 +31,13 @@ function SearchProviderMixin>( }); return result; } + this.logEvent(searchText); result.resultsCompletePromise = fromPromise( this.doSearch(searchText, result) ); return result; } - protected abstract doSearch( - searchText: string, - results: SearchProviderResults - ): Promise; - private shouldRunSearch(searchText: string) { if ( searchText === undefined || @@ -53,12 +56,14 @@ function SearchProviderMixin>( return true; } } + return SearchProviderMixin; } namespace SearchProviderMixin { export interface SearchProviderMixin extends InstanceType> {} + export function isMixedInto(model: any): model is SearchProviderMixin { return model && model.hasSearchProviderMixin; } diff --git a/lib/ModelMixins/SearchProvider/WebFeatureServiceSearchProviderMixin.ts b/lib/ModelMixins/SearchProvider/WebFeatureServiceSearchProviderMixin.ts index dad3a5d4a16..80d5e68e508 100644 --- a/lib/ModelMixins/SearchProvider/WebFeatureServiceSearchProviderMixin.ts +++ b/lib/ModelMixins/SearchProvider/WebFeatureServiceSearchProviderMixin.ts @@ -177,6 +177,7 @@ function WebFeatureServiceSearchProviderMixin< results.message = i18next.t("viewModels.searchErrorOccurred"); }); } + get isWebFeatureServiceSearchProviderMixin() { return true; } @@ -190,6 +191,7 @@ namespace WebFeatureServiceSearchProviderMixin { extends InstanceType< ReturnType > {} + export function isMixedInto( model: any ): model is WebFeatureServiceSearchProviderMixin { diff --git a/lib/Models/SearchProvider/AustralianGazetteerSearchProvider.ts b/lib/Models/SearchProvider/AustralianGazetteerSearchProvider.ts index 986f781134d..e9725ca0cfb 100644 --- a/lib/Models/SearchProvider/AustralianGazetteerSearchProvider.ts +++ b/lib/Models/SearchProvider/AustralianGazetteerSearchProvider.ts @@ -2,6 +2,10 @@ import WebFeatureServiceSearchProviderTraits from "../../Traits/SearchProvider/W import CreateModel from "../CreateModel"; import WebFeatureServiceSearchProviderMixin from "../../ModelMixins/SearchProvider/WebFeatureServiceSearchProviderMixin"; import SearchResult from "./SearchResult"; +import { + Category, + SearchAction +} from "../../Core/AnalyticEvents/analyticEvents"; const featureCodesToNamesMap = new Map([ ["AF", "Aviation"], @@ -229,6 +233,14 @@ export default class AustralianGazetteerSearchProvider extends WebFeatureService return AustralianGazetteerSearchProvider.type; } + protected logEvent(searchText: string) { + this.terria.analytics?.logEvent( + Category.search, + SearchAction.gazetteer, + searchText + ); + } + featureToSearchResultFunction: ( feature: any ) => SearchResult = featureToSearchResultFunction; diff --git a/lib/Models/SearchProvider/BingMapsSearchProvider.ts b/lib/Models/SearchProvider/BingMapsSearchProvider.ts index 4bbd5d2035d..6a075946c65 100644 --- a/lib/Models/SearchProvider/BingMapsSearchProvider.ts +++ b/lib/Models/SearchProvider/BingMapsSearchProvider.ts @@ -13,6 +13,10 @@ import SearchProviderResults from "./SearchProviderResults"; import SearchResult from "./SearchResult"; import CommonStrata from "./../CommonStrata"; import Terria from "../Terria"; +import { + Category, + SearchAction +} from "../../Core/AnalyticEvents/analyticEvents"; export default class BingMapsSearchProvider extends LocationSearchProviderMixin( CreateModel(BingMapsSearchProviderTraits) @@ -45,6 +49,14 @@ export default class BingMapsSearchProvider extends LocationSearchProviderMixin( } } + protected logEvent(searchText: string) { + this.terria.analytics?.logEvent( + Category.search, + SearchAction.gazetteer, + searchText + ); + } + protected doSearch( searchText: string, searchResults: SearchProviderResults @@ -52,8 +64,6 @@ export default class BingMapsSearchProvider extends LocationSearchProviderMixin( searchResults.results.length = 0; searchResults.message = undefined; - this.terria.analytics.logEvent("search", "bing", searchText); - const searchQuery = new Resource({ url: this.url + "REST/v1/Locations", queryParameters: { diff --git a/lib/Models/SearchProvider/CatalogSearchProvider.ts b/lib/Models/SearchProvider/CatalogSearchProvider.ts index 810902cfb6e..a5fe35e79a7 100644 --- a/lib/Models/SearchProvider/CatalogSearchProvider.ts +++ b/lib/Models/SearchProvider/CatalogSearchProvider.ts @@ -12,12 +12,9 @@ import Terria from "../Terria"; import SearchProviderResults from "./SearchProviderResults"; import SearchResult from "./SearchResult"; -interface CatalogSearchProviderOptions { - terria: Terria; -} - type UniqueIdString = string; type ResultMap = Map; + export function loadAndSearchCatalogRecursively( terria: Terria, searchTextLowercase: string, @@ -105,13 +102,20 @@ export default class CatalogSearchProvider extends SearchProviderMixin( CreateModel(CatalogSearchProviderTraits) ) { static readonly type = "catalog-search-provider"; + @observable isSearching: boolean = false; + @observable debounceDurationOnceLoaded: number = 300; get type() { return CatalogSearchProvider.type; } - @observable isSearching: boolean = false; - @observable debounceDurationOnceLoaded: number = 300; + protected logEvent(searchText: string) { + this.terria.analytics?.logEvent( + Category.search, + SearchAction.catalog, + searchText + ); + } protected doSearch( searchText: string, @@ -126,11 +130,6 @@ export default class CatalogSearchProvider extends SearchProviderMixin( return Promise.resolve(); } - this.terria.analytics?.logEvent( - Category.search, - SearchAction.catalog, - searchText - ); const resultMap: ResultMap = new Map(); const promise: Promise = loadAndSearchCatalogRecursively( diff --git a/lib/Models/SearchProvider/SearchProviderResults.ts b/lib/Models/SearchProvider/SearchProviderResults.ts index 09fcc1aafe5..8f2c887bd31 100644 --- a/lib/Models/SearchProvider/SearchProviderResults.ts +++ b/lib/Models/SearchProvider/SearchProviderResults.ts @@ -1,6 +1,6 @@ import { observable } from "mobx"; import SearchResult from "./SearchResult"; -import { IPromiseBasedObservable, fromPromise } from "mobx-utils"; +import { fromPromise, IPromiseBasedObservable } from "mobx-utils"; import SearchProviderMixin from "../../ModelMixins/SearchProvider/SearchProviderMixin"; export default class SearchProviderResults { diff --git a/lib/Models/SearchProvider/StubSearchProvider.ts b/lib/Models/SearchProvider/StubSearchProvider.ts index 28745157278..4fec65f6175 100644 --- a/lib/Models/SearchProvider/StubSearchProvider.ts +++ b/lib/Models/SearchProvider/StubSearchProvider.ts @@ -22,6 +22,10 @@ export default class StubSearchProvider extends SearchProviderMixin( return StubSearchProvider.type; } + protected logEvent(searchText: string) { + return; + } + protected doSearch( searchText: string, results: SearchProviderResults diff --git a/lib/ReactViewModels/SearchState.ts b/lib/ReactViewModels/SearchState.ts index fc7373547e0..dfe12ad9bea 100644 --- a/lib/ReactViewModels/SearchState.ts +++ b/lib/ReactViewModels/SearchState.ts @@ -52,21 +52,23 @@ export default class SearchState { new CatalogSearchProvider("catalog-search-provider", options.terria); this.locationSearchProviders = options.locationSearchProviders || []; + const self = this; + this._catalogSearchDisposer = reaction( - () => this.catalogSearchText, + () => self.catalogSearchText, () => { - this.isWaitingToStartCatalogSearch = true; - if (this.catalogSearchProvider) { - this.catalogSearchResults = this.catalogSearchProvider.search(""); + self.isWaitingToStartCatalogSearch = true; + if (self.catalogSearchProvider) { + self.catalogSearchResults = self.catalogSearchProvider.search(""); } } ); this._locationSearchDisposer = reaction( - () => this.locationSearchText, + () => self.locationSearchText, () => { - this.isWaitingToStartLocationSearch = true; - this.locationSearchResults = this.locationSearchProviders.map( + self.isWaitingToStartLocationSearch = true; + self.locationSearchResults = self.locationSearchProviders.map( provider => { return provider.search(""); } diff --git a/lib/ReactViews/Mobile/MobileHeader.jsx b/lib/ReactViews/Mobile/MobileHeader.jsx index 6ed7bc0eb25..8a4599b16a2 100644 --- a/lib/ReactViews/Mobile/MobileHeader.jsx +++ b/lib/ReactViews/Mobile/MobileHeader.jsx @@ -4,21 +4,13 @@ import { runInAction } from "mobx"; import { observer } from "mobx-react"; import PropTypes from "prop-types"; import React from "react"; -import SearchBox from "../Search/SearchBox"; -import MobileModalWindow from "./MobileModalWindow"; -import Branding from "../SidePanel/Branding"; -import Styles from "./mobile-header.scss"; -import Icon, { StyledIcon } from "../../Styled/Icon"; -import MobileMenu from "./MobileMenu"; -import classNames from "classnames"; -import { removeMarker } from "../../Models/LocationMarkerUtils"; import { withTranslation } from "react-i18next"; import { withTheme } from "styled-components"; import { useTranslationIfExists } from "../../Language/languageHelpers"; import { removeMarker } from "../../Models/LocationMarkerUtils"; import Box from "../../Styled/Box"; import { RawButton } from "../../Styled/Button"; -import Icon, { StyledIcon } from "../Icon"; +import Icon, { StyledIcon } from "../../Styled/Icon"; import SearchBox from "../Search/SearchBox"; import Branding from "../SidePanel/Branding"; import Styles from "./mobile-header.scss"; diff --git a/lib/ReactViews/Search/LocationSearchResults.tsx b/lib/ReactViews/Search/LocationSearchResults.tsx index d9927e669e6..8189ab45c71 100644 --- a/lib/ReactViews/Search/LocationSearchResults.tsx +++ b/lib/ReactViews/Search/LocationSearchResults.tsx @@ -5,7 +5,7 @@ https://github.com/TerriaJS/nsw-digital-twin/issues/248#issuecomment-599919318 */ -import { observable, computed, action } from "mobx"; +import { action, computed, observable } from "mobx"; import { observer } from "mobx-react"; import React from "react"; import { @@ -15,20 +15,18 @@ import { } from "react-i18next"; import styled, { DefaultTheme } from "styled-components"; import isDefined from "../../Core/isDefined"; +import SearchProviderResults from "../../Models/SearchProvider/SearchProviderResults"; import Terria from "../../Models/Terria"; import ViewState from "../../ReactViewModels/ViewState"; +import Box, { BoxSpan } from "../../Styled/Box"; +import { RawButton } from "../../Styled/Button"; +import Icon, { StyledIcon } from "../../Styled/Icon"; import Ul from "../../Styled/List"; -import Icon, { StyledIcon } from "../Icon"; +import Text, { TextSpan } from "../../Styled/Text"; +import Loader from "../Loader"; import LocationSearchProviderMixin from "./../../ModelMixins/SearchProvider/LocationSearchProviderMixin"; -import SearchProviderResults from "../../Models/SearchProvider/SearchProviderResults"; import SearchHeader from "./SearchHeader"; import SearchResult from "./SearchResult"; -import Loader from "../Loader"; -const BoxSpan: any = require("../../Styled/Box").BoxSpan; -const Box: any = require("../../Styled/Box").default; -const Text: any = require("../../Styled/Text").default; -const TextSpan: any = require("../../Styled/Text").TextSpan; -const RawButton: any = require("../../Styled/Button").RawButton; const RawButtonAndHighlight = styled(RawButton)` ${p => ` @@ -109,7 +107,7 @@ class LocationSearchResults extends React.Component { isOpen={isOpen} search={search} isWaitingForSearchToStart={this.props.isWaitingForSearchToStart} - > + /> ); } + SearchInDataCatalog.propTypes = { handleClick: PropTypes.func.isRequired, viewState: PropTypes.object.isRequired @@ -74,11 +66,13 @@ const PresentationBox = styled(Box).attrs({ `; export const LOCATION_SEARCH_INPUT_NAME = "LocationSearchInput"; + export class SearchBoxAndResultsRaw extends React.Component { constructor(props) { super(props); this.locationSearchRef = React.createRef(); } + componentDidMount() { this.props.viewState.updateAppRef( LOCATION_SEARCH_INPUT_NAME, @@ -114,6 +108,7 @@ export class SearchBoxAndResultsRaw extends React.Component { this._nowViewingChangeSubscription = undefined; } } + changeSearchText(newText) { runInAction(() => { this.props.viewState.searchState.locationSearchText = newText; @@ -134,17 +129,21 @@ export class SearchBoxAndResultsRaw extends React.Component { }); } } + search() { this.props.viewState.searchState.searchLocations(); } + toggleShowLocationSearchResults(bool) { runInAction(() => { this.props.viewState.searchState.showLocationSearchResults = bool; }); } + startLocationSearch() { this.toggleShowLocationSearchResults(true); } + render() { const { viewState, placeholder } = this.props; const searchState = viewState.searchState; diff --git a/lib/ReactViews/Search/SearchHeader.tsx b/lib/ReactViews/Search/SearchHeader.tsx index 5ead1157445..89a4202d251 100644 --- a/lib/ReactViews/Search/SearchHeader.tsx +++ b/lib/ReactViews/Search/SearchHeader.tsx @@ -1,8 +1,8 @@ +import { observer } from "mobx-react"; import React from "react"; +import { BoxSpan } from "../../Styled/Box"; +import Text from "../../Styled/Text"; import Loader from "../Loader"; -import { observer } from "mobx-react"; -const Text = require("../../Styled/Text").default; -const BoxSpan = require("../../Styled/Box").BoxSpan; interface SearchHeaderProps { searchResults: { [key: string]: any }; diff --git a/lib/ReactViews/Search/SearchResult.tsx b/lib/ReactViews/Search/SearchResult.tsx index a431a4278cc..681c51acca9 100644 --- a/lib/ReactViews/Search/SearchResult.tsx +++ b/lib/ReactViews/Search/SearchResult.tsx @@ -1,16 +1,13 @@ import React from "react"; import styled, { useTheme } from "styled-components"; import { Li } from "../../Styled/List"; -import Icon, { StyledIcon } from "../Icon"; +import Icon, { StyledIcon } from "../../Styled/Icon"; import highlightKeyword from "../ReactViewHelpers/highlightKeyword"; - -const Box = require("../../Styled/Box").default; -const BoxSpan = require("../../Styled/Box").BoxSpan; -const TextSpan = require("../../Styled/Text").TextSpan; -const RawButton = require("../../Styled/Button").RawButton; -const Spacing = require("../../Styled/Spacing").default; -const SpacingSpan = require("../../Styled/Spacing").SpacingSpan; -const Hr = require("../../Styled/Hr").default; +import Box, { BoxSpan } from "../../Styled/Box"; +import { TextSpan } from "../../Styled/Text"; +import Spacing, { SpacingSpan } from "../../Styled/Spacing"; +import { RawButton } from "../../Styled/Button"; +import Hr from "../../Styled/Hr"; // Not sure how to generalise this or if it should be kept in stlyed/Button.jsx @@ -59,13 +56,7 @@ const SearchResult: React.FC = ( {/* )} */} - + ` -moz-appearance: none; diff --git a/lib/Styled/Select.tsx b/lib/Styled/Select.tsx index 9589283aa80..a7862c88785 100644 --- a/lib/Styled/Select.tsx +++ b/lib/Styled/Select.tsx @@ -27,7 +27,7 @@ or with overrides on icon import React from "react"; import styled, { useTheme } from "styled-components"; -const Box: any = require("./Box").default; +import Box from "./Box"; import { GLYPHS, StyledIcon } from "./Icon"; const StyledSelect = styled.select` From 7bef63def684eab07785b31c11fa8c28b6a9375c Mon Sep 17 00:00:00 2001 From: zoran995 Date: Thu, 8 Jul 2021 12:12:48 +0200 Subject: [PATCH 021/654] resolve conflict trait location --- lib/Models/SearchProvider/StubSearchProvider.ts | 2 +- lib/Traits/SearchProvider/BingMapsSearchProviderTraits.ts | 6 +++--- lib/Traits/SearchProvider/CatalogSearchProviderTraits.ts | 2 +- lib/Traits/SearchProvider/LocationSearchProviderTraits.ts | 2 +- lib/Traits/SearchProvider/SearchProviderTraits.ts | 2 +- .../SearchProvider/WebFeatureServiceSearchProviderTraits.ts | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/lib/Models/SearchProvider/StubSearchProvider.ts b/lib/Models/SearchProvider/StubSearchProvider.ts index 4fec65f6175..bd0e99969e2 100644 --- a/lib/Models/SearchProvider/StubSearchProvider.ts +++ b/lib/Models/SearchProvider/StubSearchProvider.ts @@ -1,5 +1,5 @@ import LocationSearchProviderTraits from "./../../Traits/SearchProvider/LocationSearchProviderTraits"; -import primitiveTrait from "./../../Traits/primitiveTrait"; +import primitiveTrait from "./../../Traits/Decorators/primitiveTrait"; import SearchProviderMixin from "../../ModelMixins/SearchProvider/SearchProviderMixin"; import CreateModel from "../CreateModel"; import SearchProviderResults from "./SearchProviderResults"; diff --git a/lib/Traits/SearchProvider/BingMapsSearchProviderTraits.ts b/lib/Traits/SearchProvider/BingMapsSearchProviderTraits.ts index f39d28a1227..81649828868 100644 --- a/lib/Traits/SearchProvider/BingMapsSearchProviderTraits.ts +++ b/lib/Traits/SearchProvider/BingMapsSearchProviderTraits.ts @@ -1,5 +1,5 @@ import mixTraits from "../mixTraits"; -import primitiveTrait from "../primitiveTrait"; +import primitiveTrait from "../Decorators/primitiveTrait"; import LocationSearchProviderTraits, { SearchProviderMapCenterTraits } from "./LocationSearchProviderTraits"; @@ -27,8 +27,8 @@ export default class BingMapsSearchProviderTraits extends mixTraits( @primitiveTrait({ type: "string", name: "Culture", - description: `Use the culture parameter to specify a culture for your request. - The culture parameter provides the result in the language of the culture. + description: `Use the culture parameter to specify a culture for your request. + The culture parameter provides the result in the language of the culture. For a list of supported cultures, see [Supported Culture Codes](https://docs.microsoft.com/en-us/bingmaps/rest-services/common-parameters-and-types/supported-culture-codes)` }) culture: string = "en-au"; diff --git a/lib/Traits/SearchProvider/CatalogSearchProviderTraits.ts b/lib/Traits/SearchProvider/CatalogSearchProviderTraits.ts index 7808d9d81b4..2dc2ff84927 100644 --- a/lib/Traits/SearchProvider/CatalogSearchProviderTraits.ts +++ b/lib/Traits/SearchProvider/CatalogSearchProviderTraits.ts @@ -1,6 +1,6 @@ import mixTraits from "../mixTraits"; import SearchProviderTraits from "./SearchProviderTraits"; -import primitiveTrait from "../primitiveTrait"; +import primitiveTrait from "../Decorators/primitiveTrait"; export default class CatalogSearchProviderTraits extends mixTraits( SearchProviderTraits diff --git a/lib/Traits/SearchProvider/LocationSearchProviderTraits.ts b/lib/Traits/SearchProvider/LocationSearchProviderTraits.ts index 2893c7ea07f..cb00c39d7c8 100644 --- a/lib/Traits/SearchProvider/LocationSearchProviderTraits.ts +++ b/lib/Traits/SearchProvider/LocationSearchProviderTraits.ts @@ -1,5 +1,5 @@ import ModelTraits from "../ModelTraits"; -import primitiveTrait from "../primitiveTrait"; +import primitiveTrait from "../Decorators/primitiveTrait"; import SearchProviderTraits from "./SearchProviderTraits"; export default class LocationSearchProviderTraits extends SearchProviderTraits { diff --git a/lib/Traits/SearchProvider/SearchProviderTraits.ts b/lib/Traits/SearchProvider/SearchProviderTraits.ts index f19e6449184..175ed48a22e 100644 --- a/lib/Traits/SearchProvider/SearchProviderTraits.ts +++ b/lib/Traits/SearchProvider/SearchProviderTraits.ts @@ -1,5 +1,5 @@ import ModelTraits from "../ModelTraits"; -import primitiveTrait from "../primitiveTrait"; +import primitiveTrait from "../Decorators/primitiveTrait"; export default class SearchProviderTraits extends ModelTraits { @primitiveTrait({ diff --git a/lib/Traits/SearchProvider/WebFeatureServiceSearchProviderTraits.ts b/lib/Traits/SearchProvider/WebFeatureServiceSearchProviderTraits.ts index c95945ff74c..1be4884242e 100644 --- a/lib/Traits/SearchProvider/WebFeatureServiceSearchProviderTraits.ts +++ b/lib/Traits/SearchProvider/WebFeatureServiceSearchProviderTraits.ts @@ -1,4 +1,4 @@ -import primitiveTrait from "../primitiveTrait"; +import primitiveTrait from "../Decorators/primitiveTrait"; import LocationSearchProviderTraits from "./LocationSearchProviderTraits"; export default class WebFeatureServiceSearchProviderTraits extends LocationSearchProviderTraits { From ea9618849d41abf35ba3552d9874dd3cd20dba6e Mon Sep 17 00:00:00 2001 From: zoran995 Date: Thu, 8 Jul 2021 13:29:49 +0200 Subject: [PATCH 022/654] fix lint --- lib/ReactViews/Mobile/MobileHeader.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/ReactViews/Mobile/MobileHeader.jsx b/lib/ReactViews/Mobile/MobileHeader.jsx index 8a4599b16a2..d03e128a971 100644 --- a/lib/ReactViews/Mobile/MobileHeader.jsx +++ b/lib/ReactViews/Mobile/MobileHeader.jsx @@ -141,7 +141,7 @@ const MobileHeader = observer( render() { const searchState = this.props.viewState.searchState; - const { t } = this.props; + const { t, terria } = this.props; const nowViewingLength = terria.workbench.items !== undefined ? terria.workbench.items.length From da980b94caea4f8ffce74706470af3bf5f7e1304 Mon Sep 17 00:00:00 2001 From: Zoran Kokeza Date: Thu, 2 Sep 2021 19:19:12 +0200 Subject: [PATCH 023/654] rename directory to searchproviders --- .../LocationSearchProviderMixin.ts | 4 ++-- .../SearchProviderMixin.ts | 6 +++--- .../WebFeatureServiceSearchProviderMixin.ts | 6 +++--- .../AustralianGazetteerSearchProvider.ts | 8 ++++---- .../BingMapsSearchProvider.ts | 16 ++++++++-------- .../CatalogSearchProvider.ts | 4 ++-- .../SearchProviderFactory.ts | 0 .../SearchProviderResults.ts | 4 ++-- .../SearchResult.ts | 0 .../StubSearchProvider.ts | 6 +++--- .../createStubSearchProvider.ts | 6 +++--- .../registerSearchProviders.ts | 0 .../upsertSearchProviderFromJson.ts | 8 ++++---- lib/Models/Terria.ts | 8 +++----- lib/ReactViewModels/SearchState.ts | 8 ++++---- lib/ReactViews/Search/LocationSearchResults.tsx | 4 ++-- .../BingMapsSearchProviderTraits.ts | 0 .../CatalogSearchProviderTraits.ts | 0 .../LocationSearchProviderTraits.ts | 0 .../SearchProviderTraits.ts | 0 .../WebFeatureServiceSearchProviderTraits.ts | 0 .../AustralianGazetteerSearchProviderSpec.ts | 2 +- .../BingMapsSearchProviderTraitsSpec.ts | 4 ++-- .../LocationSearchProviderTraitsSpec.ts | 4 ++-- 24 files changed, 48 insertions(+), 50 deletions(-) rename lib/ModelMixins/{SearchProvider => SearchProviders}/LocationSearchProviderMixin.ts (98%) rename lib/ModelMixins/{SearchProvider => SearchProviders}/SearchProviderMixin.ts (91%) rename lib/ModelMixins/{SearchProvider => SearchProviders}/WebFeatureServiceSearchProviderMixin.ts (97%) rename lib/Models/{SearchProvider => SearchProviders}/AustralianGazetteerSearchProvider.ts (98%) rename lib/Models/{SearchProvider => SearchProviders}/BingMapsSearchProvider.ts (97%) rename lib/Models/{SearchProvider => SearchProviders}/CatalogSearchProvider.ts (98%) rename lib/Models/{SearchProvider => SearchProviders}/SearchProviderFactory.ts (100%) rename lib/Models/{SearchProvider => SearchProviders}/SearchProviderResults.ts (96%) rename lib/Models/{SearchProvider => SearchProviders}/SearchResult.ts (100%) rename lib/Models/{SearchProvider => SearchProviders}/StubSearchProvider.ts (82%) rename lib/Models/{SearchProvider => SearchProviders}/createStubSearchProvider.ts (90%) rename lib/Models/{SearchProvider => SearchProviders}/registerSearchProviders.ts (100%) rename lib/Models/{SearchProvider => SearchProviders}/upsertSearchProviderFromJson.ts (94%) rename lib/Traits/{SearchProvider => SearchProviders}/BingMapsSearchProviderTraits.ts (100%) rename lib/Traits/{SearchProvider => SearchProviders}/CatalogSearchProviderTraits.ts (100%) rename lib/Traits/{SearchProvider => SearchProviders}/LocationSearchProviderTraits.ts (100%) rename lib/Traits/{SearchProvider => SearchProviders}/SearchProviderTraits.ts (100%) rename lib/Traits/{SearchProvider => SearchProviders}/WebFeatureServiceSearchProviderTraits.ts (100%) rename test/Models/{SearchProvider => SearchProviders}/AustralianGazetteerSearchProviderSpec.ts (95%) rename test/Traits/{SearchProvider => SearchProviders}/BingMapsSearchProviderTraitsSpec.ts (91%) rename test/Traits/{SearchProvider => SearchProviders}/LocationSearchProviderTraitsSpec.ts (92%) diff --git a/lib/ModelMixins/SearchProvider/LocationSearchProviderMixin.ts b/lib/ModelMixins/SearchProviders/LocationSearchProviderMixin.ts similarity index 98% rename from lib/ModelMixins/SearchProvider/LocationSearchProviderMixin.ts rename to lib/ModelMixins/SearchProviders/LocationSearchProviderMixin.ts index 15e40342c25..51600365987 100644 --- a/lib/ModelMixins/SearchProvider/LocationSearchProviderMixin.ts +++ b/lib/ModelMixins/SearchProviders/LocationSearchProviderMixin.ts @@ -3,10 +3,10 @@ import Ellipsoid from "terriajs-cesium/Source/Core/Ellipsoid"; import CesiumMath from "terriajs-cesium/Source/Core/Math"; import Rectangle from "terriajs-cesium/Source/Core/Rectangle"; import Constructor from "../../Core/Constructor"; +import CommonStrata from "../../Models/CommonStrata"; import Model from "../../Models/Model"; import Terria from "../../Models/Terria"; -import CommonStrata from "../../Models/CommonStrata"; -import LocationSearchProviderTraits from "../../Traits/SearchProvider/LocationSearchProviderTraits"; +import LocationSearchProviderTraits from "../../Traits/SearchProviders/LocationSearchProviderTraits"; import SearchProviderMixin from "./SearchProviderMixin"; type LocationSearchProviderModel = Model; diff --git a/lib/ModelMixins/SearchProvider/SearchProviderMixin.ts b/lib/ModelMixins/SearchProviders/SearchProviderMixin.ts similarity index 91% rename from lib/ModelMixins/SearchProvider/SearchProviderMixin.ts rename to lib/ModelMixins/SearchProviders/SearchProviderMixin.ts index e62d16c54fa..4e961471f8a 100644 --- a/lib/ModelMixins/SearchProvider/SearchProviderMixin.ts +++ b/lib/ModelMixins/SearchProviders/SearchProviderMixin.ts @@ -1,10 +1,10 @@ +import i18next from "i18next"; import { action } from "mobx"; import { fromPromise } from "mobx-utils"; import Constructor from "../../Core/Constructor"; import Model from "../../Models/Model"; -import SearchProviderResults from "../../Models/SearchProvider/SearchProviderResults"; -import SearchProviderTraits from "../../Traits/SearchProvider/SearchProviderTraits"; -import i18next from "i18next"; +import SearchProviderResults from "../../Models/SearchProviders/SearchProviderResults"; +import SearchProviderTraits from "../../Traits/SearchProviders/SearchProviderTraits"; type SearchProviderModel = Model; diff --git a/lib/ModelMixins/SearchProvider/WebFeatureServiceSearchProviderMixin.ts b/lib/ModelMixins/SearchProviders/WebFeatureServiceSearchProviderMixin.ts similarity index 97% rename from lib/ModelMixins/SearchProvider/WebFeatureServiceSearchProviderMixin.ts rename to lib/ModelMixins/SearchProviders/WebFeatureServiceSearchProviderMixin.ts index 80d5e68e508..d205658edd3 100644 --- a/lib/ModelMixins/SearchProvider/WebFeatureServiceSearchProviderMixin.ts +++ b/lib/ModelMixins/SearchProviders/WebFeatureServiceSearchProviderMixin.ts @@ -6,10 +6,10 @@ import Constructor from "../../Core/Constructor"; import makeRealPromise from "../../Core/makeRealPromise"; import zoomRectangleFromPoint from "../../Map/zoomRectangleFromPoint"; import Model from "../../Models/Model"; -import SearchProviderResults from "../../Models/SearchProvider/SearchProviderResults"; -import SearchResult from "../../Models/SearchProvider/SearchResult"; +import SearchProviderResults from "../../Models/SearchProviders/SearchProviderResults"; +import SearchResult from "../../Models/SearchProviders/SearchResult"; import xml2json from "../../ThirdParty/xml2json"; -import WebFeatureServiceSearchProviderTraits from "../../Traits/SearchProvider/WebFeatureServiceSearchProviderTraits"; +import WebFeatureServiceSearchProviderTraits from "../../Traits/SearchProviders/WebFeatureServiceSearchProviderTraits"; import LocationSearchProviderMixin from "./LocationSearchProviderMixin"; function WebFeatureServiceSearchProviderMixin< diff --git a/lib/Models/SearchProvider/AustralianGazetteerSearchProvider.ts b/lib/Models/SearchProviders/AustralianGazetteerSearchProvider.ts similarity index 98% rename from lib/Models/SearchProvider/AustralianGazetteerSearchProvider.ts rename to lib/Models/SearchProviders/AustralianGazetteerSearchProvider.ts index e9725ca0cfb..48f7a21c7d2 100644 --- a/lib/Models/SearchProvider/AustralianGazetteerSearchProvider.ts +++ b/lib/Models/SearchProviders/AustralianGazetteerSearchProvider.ts @@ -1,11 +1,11 @@ -import WebFeatureServiceSearchProviderTraits from "../../Traits/SearchProvider/WebFeatureServiceSearchProviderTraits"; -import CreateModel from "../CreateModel"; -import WebFeatureServiceSearchProviderMixin from "../../ModelMixins/SearchProvider/WebFeatureServiceSearchProviderMixin"; -import SearchResult from "./SearchResult"; import { Category, SearchAction } from "../../Core/AnalyticEvents/analyticEvents"; +import WebFeatureServiceSearchProviderMixin from "../../ModelMixins/SearchProviders/WebFeatureServiceSearchProviderMixin"; +import WebFeatureServiceSearchProviderTraits from "../../Traits/SearchProviders/WebFeatureServiceSearchProviderTraits"; +import CreateModel from "../CreateModel"; +import SearchResult from "./SearchResult"; const featureCodesToNamesMap = new Map([ ["AF", "Aviation"], diff --git a/lib/Models/SearchProvider/BingMapsSearchProvider.ts b/lib/Models/SearchProviders/BingMapsSearchProvider.ts similarity index 97% rename from lib/Models/SearchProvider/BingMapsSearchProvider.ts rename to lib/Models/SearchProviders/BingMapsSearchProvider.ts index 6a075946c65..b62eb5e62ae 100644 --- a/lib/Models/SearchProvider/BingMapsSearchProvider.ts +++ b/lib/Models/SearchProviders/BingMapsSearchProvider.ts @@ -3,20 +3,20 @@ import { runInAction } from "mobx"; import defined from "terriajs-cesium/Source/Core/defined"; import Rectangle from "terriajs-cesium/Source/Core/Rectangle"; import Resource from "terriajs-cesium/Source/Core/Resource"; +import { + Category, + SearchAction +} from "../../Core/AnalyticEvents/analyticEvents"; import loadJsonp from "../../Core/loadJsonp"; import LocationSearchProviderMixin, { getMapCenter -} from "../../ModelMixins/SearchProvider/LocationSearchProviderMixin"; -import BingMapsSearchProviderTraits from "../../Traits/SearchProvider/BingMapsSearchProviderTraits"; +} from "../../ModelMixins/SearchProviders/LocationSearchProviderMixin"; +import BingMapsSearchProviderTraits from "../../Traits/SearchProviders/BingMapsSearchProviderTraits"; +import CommonStrata from "../CommonStrata"; import CreateModel from "../CreateModel"; +import Terria from "../Terria"; import SearchProviderResults from "./SearchProviderResults"; import SearchResult from "./SearchResult"; -import CommonStrata from "./../CommonStrata"; -import Terria from "../Terria"; -import { - Category, - SearchAction -} from "../../Core/AnalyticEvents/analyticEvents"; export default class BingMapsSearchProvider extends LocationSearchProviderMixin( CreateModel(BingMapsSearchProviderTraits) diff --git a/lib/Models/SearchProvider/CatalogSearchProvider.ts b/lib/Models/SearchProviders/CatalogSearchProvider.ts similarity index 98% rename from lib/Models/SearchProvider/CatalogSearchProvider.ts rename to lib/Models/SearchProviders/CatalogSearchProvider.ts index a5fe35e79a7..9e84d7ebcfd 100644 --- a/lib/Models/SearchProvider/CatalogSearchProvider.ts +++ b/lib/Models/SearchProviders/CatalogSearchProvider.ts @@ -5,8 +5,8 @@ import { } from "../../Core/AnalyticEvents/analyticEvents"; import GroupMixin from "../../ModelMixins/GroupMixin"; import ReferenceMixin from "../../ModelMixins/ReferenceMixin"; -import SearchProviderMixin from "../../ModelMixins/SearchProvider/SearchProviderMixin"; -import CatalogSearchProviderTraits from "../../Traits/SearchProvider/CatalogSearchProviderTraits"; +import SearchProviderMixin from "../../ModelMixins/SearchProviders/SearchProviderMixin"; +import CatalogSearchProviderTraits from "../../Traits/SearchProviders/CatalogSearchProviderTraits"; import CreateModel from "../CreateModel"; import Terria from "../Terria"; import SearchProviderResults from "./SearchProviderResults"; diff --git a/lib/Models/SearchProvider/SearchProviderFactory.ts b/lib/Models/SearchProviders/SearchProviderFactory.ts similarity index 100% rename from lib/Models/SearchProvider/SearchProviderFactory.ts rename to lib/Models/SearchProviders/SearchProviderFactory.ts diff --git a/lib/Models/SearchProvider/SearchProviderResults.ts b/lib/Models/SearchProviders/SearchProviderResults.ts similarity index 96% rename from lib/Models/SearchProvider/SearchProviderResults.ts rename to lib/Models/SearchProviders/SearchProviderResults.ts index 8f2c887bd31..df3cf9e6538 100644 --- a/lib/Models/SearchProvider/SearchProviderResults.ts +++ b/lib/Models/SearchProviders/SearchProviderResults.ts @@ -1,7 +1,7 @@ import { observable } from "mobx"; -import SearchResult from "./SearchResult"; import { fromPromise, IPromiseBasedObservable } from "mobx-utils"; -import SearchProviderMixin from "../../ModelMixins/SearchProvider/SearchProviderMixin"; +import SearchProviderMixin from "../../ModelMixins/SearchProviders/SearchProviderMixin"; +import SearchResult from "./SearchResult"; export default class SearchProviderResults { @observable results: SearchResult[] = []; diff --git a/lib/Models/SearchProvider/SearchResult.ts b/lib/Models/SearchProviders/SearchResult.ts similarity index 100% rename from lib/Models/SearchProvider/SearchResult.ts rename to lib/Models/SearchProviders/SearchResult.ts diff --git a/lib/Models/SearchProvider/StubSearchProvider.ts b/lib/Models/SearchProviders/StubSearchProvider.ts similarity index 82% rename from lib/Models/SearchProvider/StubSearchProvider.ts rename to lib/Models/SearchProviders/StubSearchProvider.ts index bd0e99969e2..b6fe2e47719 100644 --- a/lib/Models/SearchProvider/StubSearchProvider.ts +++ b/lib/Models/SearchProviders/StubSearchProvider.ts @@ -1,6 +1,6 @@ -import LocationSearchProviderTraits from "./../../Traits/SearchProvider/LocationSearchProviderTraits"; -import primitiveTrait from "./../../Traits/Decorators/primitiveTrait"; -import SearchProviderMixin from "../../ModelMixins/SearchProvider/SearchProviderMixin"; +import SearchProviderMixin from "../../ModelMixins/SearchProviders/SearchProviderMixin"; +import primitiveTrait from "../../Traits/Decorators/primitiveTrait"; +import LocationSearchProviderTraits from "../../Traits/SearchProviders/LocationSearchProviderTraits"; import CreateModel from "../CreateModel"; import SearchProviderResults from "./SearchProviderResults"; diff --git a/lib/Models/SearchProvider/createStubSearchProvider.ts b/lib/Models/SearchProviders/createStubSearchProvider.ts similarity index 90% rename from lib/Models/SearchProvider/createStubSearchProvider.ts rename to lib/Models/SearchProviders/createStubSearchProvider.ts index 76434e11ba8..914668b8038 100644 --- a/lib/Models/SearchProvider/createStubSearchProvider.ts +++ b/lib/Models/SearchProviders/createStubSearchProvider.ts @@ -1,7 +1,7 @@ -import Terria from "./../Terria"; -import StubSearchProvider from "./StubSearchProvider"; -import CommonStrata from "./../CommonStrata"; +import CommonStrata from "../CommonStrata"; import { BaseModel } from "../Model"; +import Terria from "../Terria"; +import StubSearchProvider from "./StubSearchProvider"; const getUniqueStubSearchProviderName = (terria: Terria) => { const stubName = "[StubSearchProvider]"; diff --git a/lib/Models/SearchProvider/registerSearchProviders.ts b/lib/Models/SearchProviders/registerSearchProviders.ts similarity index 100% rename from lib/Models/SearchProvider/registerSearchProviders.ts rename to lib/Models/SearchProviders/registerSearchProviders.ts diff --git a/lib/Models/SearchProvider/upsertSearchProviderFromJson.ts b/lib/Models/SearchProviders/upsertSearchProviderFromJson.ts similarity index 94% rename from lib/Models/SearchProvider/upsertSearchProviderFromJson.ts rename to lib/Models/SearchProviders/upsertSearchProviderFromJson.ts index c9c7427e756..fbbe43fbde4 100644 --- a/lib/Models/SearchProvider/upsertSearchProviderFromJson.ts +++ b/lib/Models/SearchProviders/upsertSearchProviderFromJson.ts @@ -1,9 +1,9 @@ -import Terria from "./../Terria"; -import ModelFactory from "./../ModelFactory"; -import { BaseModel } from "../Model"; import i18next from "i18next"; import TerriaError from "../../Core/TerriaError"; -import CommonStrata from "./../CommonStrata"; +import CommonStrata from "../CommonStrata"; +import { BaseModel } from "../Model"; +import ModelFactory from "../ModelFactory"; +import Terria from "../Terria"; import updateModelFromJson from "../updateModelFromJson"; import createStubSearchProvider from "./createStubSearchProvider"; diff --git a/lib/Models/Terria.ts b/lib/Models/Terria.ts index ff2008b3ad8..072674d6d7f 100644 --- a/lib/Models/Terria.ts +++ b/lib/Models/Terria.ts @@ -57,9 +57,7 @@ import ReferenceMixin from "../ModelMixins/ReferenceMixin"; import TimeVarying from "../ModelMixins/TimeVarying"; import { HelpContentItem } from "../ReactViewModels/defaultHelpContent"; import { defaultTerms, Term } from "../ReactViewModels/defaultTerms"; -import NotificationState, { - Notification -} from "../ReactViewModels/NotificationState"; +import NotificationState from "../ReactViewModels/NotificationState"; import { shareConvertNotification } from "../ReactViews/Notification/shareConvertNotification"; import MappableTraits from "../Traits/TraitsClasses/MappableTraits"; import { BaseMapViewModel } from "../ViewModels/BaseMapViewModel"; @@ -90,8 +88,8 @@ import MapInteractionMode from "./MapInteractionMode"; import { BaseModel } from "./Model"; import NoViewer from "./NoViewer"; import openGroup from "./openGroup"; -import SearchProviderFactory from "./SearchProvider/SearchProviderFactory"; -import upsertSearchProviderFromJson from "./SearchProvider/upsertSearchProviderFromJson"; +import SearchProviderFactory from "./SearchProviders/SearchProviderFactory"; +import upsertSearchProviderFromJson from "./SearchProviders/upsertSearchProviderFromJson"; import ShareDataService from "./ShareDataService"; import SplitItemReference from "./SplitItemReference"; import TimelineStack from "./TimelineStack"; diff --git a/lib/ReactViewModels/SearchState.ts b/lib/ReactViewModels/SearchState.ts index dfe12ad9bea..7fa7acbbc39 100644 --- a/lib/ReactViewModels/SearchState.ts +++ b/lib/ReactViewModels/SearchState.ts @@ -6,10 +6,10 @@ import { reaction } from "mobx"; import filterOutUndefined from "../Core/filterOutUndefined"; -import LocationSearchProviderMixin from "../ModelMixins/SearchProvider/LocationSearchProviderMixin"; -import SearchProviderMixin from "../ModelMixins/SearchProvider/SearchProviderMixin"; -import CatalogSearchProvider from "../Models/SearchProvider/CatalogSearchProvider"; -import SearchProviderResults from "../Models/SearchProvider/SearchProviderResults"; +import LocationSearchProviderMixin from "../ModelMixins/SearchProviders/LocationSearchProviderMixin"; +import SearchProviderMixin from "../ModelMixins/SearchProviders/SearchProviderMixin"; +import CatalogSearchProvider from "../Models/SearchProviders/CatalogSearchProvider"; +import SearchProviderResults from "../Models/SearchProviders/SearchProviderResults"; import Terria from "../Models/Terria"; interface SearchStateOptions { diff --git a/lib/ReactViews/Search/LocationSearchResults.tsx b/lib/ReactViews/Search/LocationSearchResults.tsx index 8189ab45c71..45e83b0e602 100644 --- a/lib/ReactViews/Search/LocationSearchResults.tsx +++ b/lib/ReactViews/Search/LocationSearchResults.tsx @@ -15,7 +15,8 @@ import { } from "react-i18next"; import styled, { DefaultTheme } from "styled-components"; import isDefined from "../../Core/isDefined"; -import SearchProviderResults from "../../Models/SearchProvider/SearchProviderResults"; +import LocationSearchProviderMixin from "../../ModelMixins/SearchProviders/LocationSearchProviderMixin"; +import SearchProviderResults from "../../Models/SearchProviders/SearchProviderResults"; import Terria from "../../Models/Terria"; import ViewState from "../../ReactViewModels/ViewState"; import Box, { BoxSpan } from "../../Styled/Box"; @@ -24,7 +25,6 @@ import Icon, { StyledIcon } from "../../Styled/Icon"; import Ul from "../../Styled/List"; import Text, { TextSpan } from "../../Styled/Text"; import Loader from "../Loader"; -import LocationSearchProviderMixin from "./../../ModelMixins/SearchProvider/LocationSearchProviderMixin"; import SearchHeader from "./SearchHeader"; import SearchResult from "./SearchResult"; diff --git a/lib/Traits/SearchProvider/BingMapsSearchProviderTraits.ts b/lib/Traits/SearchProviders/BingMapsSearchProviderTraits.ts similarity index 100% rename from lib/Traits/SearchProvider/BingMapsSearchProviderTraits.ts rename to lib/Traits/SearchProviders/BingMapsSearchProviderTraits.ts diff --git a/lib/Traits/SearchProvider/CatalogSearchProviderTraits.ts b/lib/Traits/SearchProviders/CatalogSearchProviderTraits.ts similarity index 100% rename from lib/Traits/SearchProvider/CatalogSearchProviderTraits.ts rename to lib/Traits/SearchProviders/CatalogSearchProviderTraits.ts diff --git a/lib/Traits/SearchProvider/LocationSearchProviderTraits.ts b/lib/Traits/SearchProviders/LocationSearchProviderTraits.ts similarity index 100% rename from lib/Traits/SearchProvider/LocationSearchProviderTraits.ts rename to lib/Traits/SearchProviders/LocationSearchProviderTraits.ts diff --git a/lib/Traits/SearchProvider/SearchProviderTraits.ts b/lib/Traits/SearchProviders/SearchProviderTraits.ts similarity index 100% rename from lib/Traits/SearchProvider/SearchProviderTraits.ts rename to lib/Traits/SearchProviders/SearchProviderTraits.ts diff --git a/lib/Traits/SearchProvider/WebFeatureServiceSearchProviderTraits.ts b/lib/Traits/SearchProviders/WebFeatureServiceSearchProviderTraits.ts similarity index 100% rename from lib/Traits/SearchProvider/WebFeatureServiceSearchProviderTraits.ts rename to lib/Traits/SearchProviders/WebFeatureServiceSearchProviderTraits.ts diff --git a/test/Models/SearchProvider/AustralianGazetteerSearchProviderSpec.ts b/test/Models/SearchProviders/AustralianGazetteerSearchProviderSpec.ts similarity index 95% rename from test/Models/SearchProvider/AustralianGazetteerSearchProviderSpec.ts rename to test/Models/SearchProviders/AustralianGazetteerSearchProviderSpec.ts index 9ffe6205216..1c7faea9edc 100644 --- a/test/Models/SearchProvider/AustralianGazetteerSearchProviderSpec.ts +++ b/test/Models/SearchProviders/AustralianGazetteerSearchProviderSpec.ts @@ -1,6 +1,6 @@ import { configure } from "mobx"; +import AustralianGazetteerSearchProvider from "../../../lib/Models/SearchProviders/AustralianGazetteerSearchProvider"; import Terria from "../../../lib/Models/Terria"; -import AustralianGazetteerSearchProvider from "../../../lib/Models/SearchProvider/AustralianGazetteerSearchProvider"; const wfsResponseXml = require("raw-loader!../../../wwwroot/test/WFS/getWithFilter.xml"); diff --git a/test/Traits/SearchProvider/BingMapsSearchProviderTraitsSpec.ts b/test/Traits/SearchProviders/BingMapsSearchProviderTraitsSpec.ts similarity index 91% rename from test/Traits/SearchProvider/BingMapsSearchProviderTraitsSpec.ts rename to test/Traits/SearchProviders/BingMapsSearchProviderTraitsSpec.ts index 1d4ca1f6ad7..96678eab1c1 100644 --- a/test/Traits/SearchProvider/BingMapsSearchProviderTraitsSpec.ts +++ b/test/Traits/SearchProviders/BingMapsSearchProviderTraitsSpec.ts @@ -1,6 +1,6 @@ +import LocationSearchProviderMixin from "../../../lib/ModelMixins/SearchProviders/LocationSearchProviderMixin"; +import BingMapsSearchProvider from "../../../lib/Models/SearchProviders/BingMapsSearchProvider"; import Terria from "../../../lib/Models/Terria"; -import BingMapsSearchProvider from "../../../lib/Models/SearchProvider/BingMapsSearchProvider"; -import LocationSearchProviderMixin from "../../../lib/ModelMixins/SearchProvider/LocationSearchProviderMixin"; describe("BingMapsSearchProviderTraits", function() { let terria: Terria; diff --git a/test/Traits/SearchProvider/LocationSearchProviderTraitsSpec.ts b/test/Traits/SearchProviders/LocationSearchProviderTraitsSpec.ts similarity index 92% rename from test/Traits/SearchProvider/LocationSearchProviderTraitsSpec.ts rename to test/Traits/SearchProviders/LocationSearchProviderTraitsSpec.ts index e07d7033acf..4ef2f6f9d44 100644 --- a/test/Traits/SearchProvider/LocationSearchProviderTraitsSpec.ts +++ b/test/Traits/SearchProviders/LocationSearchProviderTraitsSpec.ts @@ -1,6 +1,6 @@ +import LocationSearchProviderMixin from "../../../lib/ModelMixins/SearchProviders/LocationSearchProviderMixin"; +import BingMapsSearchProvider from "../../../lib/Models/SearchProviders/BingMapsSearchProvider"; import Terria from "../../../lib/Models/Terria"; -import BingMapsSearchProvider from "../../../lib/Models/SearchProvider/BingMapsSearchProvider"; -import LocationSearchProviderMixin from "../../../lib/ModelMixins/SearchProvider/LocationSearchProviderMixin"; describe("LocationSearchProviderTraits", function() { let terria: Terria; From 69b95223548b3dc3792c6473b78b9c285f27c1f0 Mon Sep 17 00:00:00 2001 From: Zoran Kokeza Date: Thu, 2 Sep 2021 19:42:48 +0200 Subject: [PATCH 024/654] add default value to zoomTo --- lib/Models/GlobeOrMap.ts | 4 ++-- lib/Models/SearchProviders/BingMapsSearchProvider.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/Models/GlobeOrMap.ts b/lib/Models/GlobeOrMap.ts index 120702c91e5..02c8d963bae 100644 --- a/lib/Models/GlobeOrMap.ts +++ b/lib/Models/GlobeOrMap.ts @@ -24,9 +24,9 @@ import TimeVarying from "../ModelMixins/TimeVarying"; import MouseCoords from "../ReactViewModels/MouseCoords"; import CameraView from "./CameraView"; import Cesium3DTilesCatalogItem from "./Catalog/CatalogItems/Cesium3DTilesCatalogItem"; +import GeoJsonCatalogItem from "./Catalog/CatalogItems/GeoJsonCatalogItem"; import CommonStrata from "./Definition/CommonStrata"; import Feature from "./Feature"; -import GeoJsonCatalogItem from "./Catalog/CatalogItems/GeoJsonCatalogItem"; import Terria from "./Terria"; require("./ImageryLayerFeatureInfo"); // overrides Cesium's prototype.configureDescriptionFromProperties @@ -70,7 +70,7 @@ export default abstract class GlobeOrMap { @action zoomTo( target: CameraView | Rectangle | MappableMixin.Instance, - flightDurationSeconds: number + flightDurationSeconds: number = 3.0 ): Promise { this.isMapZooming = true; const zoomId = createGuid(); diff --git a/lib/Models/SearchProviders/BingMapsSearchProvider.ts b/lib/Models/SearchProviders/BingMapsSearchProvider.ts index a35980a1718..ab125b0231e 100644 --- a/lib/Models/SearchProviders/BingMapsSearchProvider.ts +++ b/lib/Models/SearchProviders/BingMapsSearchProvider.ts @@ -182,6 +182,6 @@ function createZoomToFunction(model: BingMapsSearchProvider, resource: any) { return function() { const terria = model.terria; - terria.currentViewer.zoomTo(rectangle, model.flightDurationSeconds!); + terria.currentViewer.zoomTo(rectangle, model.flightDurationSeconds); }; } From 819c7abf8de7f567cbabd8e21826eabda6820b1f Mon Sep 17 00:00:00 2001 From: Zoran Kokeza Date: Thu, 2 Sep 2021 19:50:26 +0200 Subject: [PATCH 025/654] fix bad merge --- .../Ows/WebFeatureServiceSearchProvider.ts | 221 ------------------ lib/Models/SearchProviders/SearchProvider.ts | 27 --- 2 files changed, 248 deletions(-) delete mode 100644 lib/Models/Catalog/Ows/WebFeatureServiceSearchProvider.ts delete mode 100644 lib/Models/SearchProviders/SearchProvider.ts diff --git a/lib/Models/Catalog/Ows/WebFeatureServiceSearchProvider.ts b/lib/Models/Catalog/Ows/WebFeatureServiceSearchProvider.ts deleted file mode 100644 index 55ac7ddeac9..00000000000 --- a/lib/Models/Catalog/Ows/WebFeatureServiceSearchProvider.ts +++ /dev/null @@ -1,221 +0,0 @@ -import i18next from "i18next"; -import { runInAction } from "mobx"; -import URI from "urijs"; -import zoomRectangleFromPoint from "../../../Map/zoomRectangleFromPoint"; -import xml2json from "../../../ThirdParty/xml2json"; -import SearchProvider from "../../SearchProviders/SearchProvider"; -import SearchProviderResults from "../../SearchProviders/SearchProviderResults"; -import SearchResult from "../../SearchProviders/SearchResult"; -import Terria from "../../Terria"; -import defaultValue from "terriajs-cesium/Source/Core/defaultValue"; -import Resource from "terriajs-cesium/Source/Core/Resource"; -import makeRealPromise from "../../../Core/makeRealPromise"; - -export interface WebFeatureServiceSearchProviderOptions { - /** Base url for the service */ - wfsServiceUrl: string; - /** Which property to look for the search text in */ - searchPropertyName: string; - /** Type of the properties to search */ - searchPropertyTypeName: string; - /** Convert a WFS feature to a search result */ - featureToSearchResultFunction: (feature: any) => SearchResult; - terria: Terria; - /** How long it takes to zoom in when a search result is clicked */ - flightDurationSeconds?: number; - /** Apply a function to search text before it gets passed to the service. Useful for changing case */ - transformSearchText?: (searchText: string) => string; - /** Return true if a feature should be included in search results */ - searchResultFilterFunction?: (feature: any) => boolean; - /** Return a score that gets used to sort results (in descending order) */ - searchResultScoreFunction?: (feature: any, searchText: string) => number; - /** name of the search provider */ - name: string; -} - -export default class WebFeatureServiceSearchProvider extends SearchProvider { - private _wfsServiceUrl: uri.URI; - private _searchPropertyName: string; - private _searchPropertyTypeName: string; - private _featureToSearchResultFunction: (feature: any) => SearchResult; - flightDurationSeconds: number; - readonly terria: Terria; - private _transformSearchText: ((searchText: string) => string) | undefined; - private _searchResultFilterFunction: ((feature: any) => boolean) | undefined; - private _searchResultScoreFunction: - | ((feature: any, searchText: string) => number) - | undefined; - cancelRequest?: () => void; - private _waitingForResults: boolean = false; - - constructor(options: WebFeatureServiceSearchProviderOptions) { - super(); - this._wfsServiceUrl = new URI(options.wfsServiceUrl); - this._searchPropertyName = options.searchPropertyName; - this._searchPropertyTypeName = options.searchPropertyTypeName; - this._featureToSearchResultFunction = options.featureToSearchResultFunction; - this.terria = options.terria; - this.flightDurationSeconds = defaultValue( - options.flightDurationSeconds, - 1.5 - ); - this._transformSearchText = options.transformSearchText; - this._searchResultFilterFunction = options.searchResultFilterFunction; - this._searchResultScoreFunction = options.searchResultScoreFunction; - this.name = options.name; - } - - getXml(): Promise { - const resource = new Resource({ url: this._wfsServiceUrl.toString() }); - this._waitingForResults = true; - const xmlPromise = resource.fetchXML(); - this.cancelRequest = resource.request.cancelFunction; - return makeRealPromise(xmlPromise).finally(() => { - this._waitingForResults = false; - }); - } - - protected doSearch( - searchText: string, - results: SearchProviderResults - ): Promise { - results.results.length = 0; - results.message = undefined; - - if (this._waitingForResults) { - // There's been a new search! Cancel the previous one. - if (this.cancelRequest !== undefined) { - this.cancelRequest(); - this.cancelRequest = undefined; - } - this._waitingForResults = false; - } - - const originalSearchText = searchText; - - searchText = searchText.trim(); - if (this._transformSearchText !== undefined) { - searchText = this._transformSearchText(searchText); - } - if (searchText.length < 2) { - return Promise.resolve(); - } - - // Support for matchCase="false" is patchy, but we try anyway - const filter = ` - ${this._searchPropertyName} - *${searchText}*`; - - this._wfsServiceUrl.setSearch({ - service: "WFS", - request: "GetFeature", - typeName: this._searchPropertyTypeName, - version: "1.1.0", - srsName: "urn:ogc:def:crs:EPSG::4326", // srsName must be formatted like this for correct lat/long order >:( - filter: filter - }); - - return this.getXml() - .then((xml: any) => { - let json: any = xml2json(xml); - let features: any[]; - if (json === undefined) { - results.message = i18next.t("viewModels.searchErrorOccurred"); - return; - } - - if (json.member !== undefined) { - features = json.member; - } else if (json.featureMember !== undefined) { - features = json.featureMember; - } else { - results.message = i18next.t("viewModels.searchNoPlaceNames"); - return; - } - - // if there's only one feature, make it an array - if (!Array.isArray(features)) { - features = [features]; - } - - const resultSet = new Set(); - - runInAction(() => { - if (this._searchResultFilterFunction !== undefined) { - features = features.filter(this._searchResultFilterFunction); - } - - if (features.length === 0) { - results.message = i18next.t("viewModels.searchNoPlaceNames"); - return; - } - - if (this._searchResultScoreFunction !== undefined) { - features = features.sort( - (featureA, featureB) => - this._searchResultScoreFunction!(featureB, originalSearchText) - - this._searchResultScoreFunction!(featureA, originalSearchText) - ); - } - - let searchResults = features - .map(this._featureToSearchResultFunction) - .map(result => { - result.clickAction = createZoomToFunction(this, result.location); - return result; - }); - - // If we don't have a scoring function, sort the search results now - // We can't do this earlier because we don't know what the schema of the unprocessed feature looks like - if (this._searchResultScoreFunction === undefined) { - // Put shorter results first - // They have a larger percentage of letters that the user actually typed in them - searchResults = searchResults.sort( - (featureA, featureB) => - featureA.name.length - featureB.name.length - ); - } - - // Remove results that have the same name and are close to each other - searchResults = searchResults.filter(result => { - const hash = `${result.name},${result.location?.latitude.toFixed( - 1 - )},${result.location?.longitude.toFixed(1)}`; - if (resultSet.has(hash)) { - return false; - } - resultSet.add(hash); - return true; - }); - - // append new results to all results - results.results.push(...searchResults); - }); - }) - .catch(e => { - if (results.isCanceled) { - // A new search has superseded this one, so ignore the result. - return; - } - results.message = i18next.t("viewModels.searchErrorOccurred"); - }); - } -} - -function createZoomToFunction( - model: WebFeatureServiceSearchProvider, - location: any -) { - // Server does not return information of a bounding box, just a location. - // bboxSize is used to expand a point - var bboxSize = 0.2; - var rectangle = zoomRectangleFromPoint( - location.latitude, - location.longitude, - bboxSize - ); - - return function() { - model.terria.currentViewer.zoomTo(rectangle, model.flightDurationSeconds); - }; -} diff --git a/lib/Models/SearchProviders/SearchProvider.ts b/lib/Models/SearchProviders/SearchProvider.ts deleted file mode 100644 index de29a899952..00000000000 --- a/lib/Models/SearchProviders/SearchProvider.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { action, observable } from "mobx"; -import { fromPromise } from "mobx-utils"; -import SearchProviderResults from "./SearchProviderResults"; - -export default abstract class SearchProvider { - @observable name = "Unknown"; - @observable isOpen = true; - - @action - toggleOpen() { - this.isOpen = !this.isOpen; - } - - @action - search(searchText: string): SearchProviderResults { - const result = new SearchProviderResults(this); - result.resultsCompletePromise = fromPromise( - this.doSearch(searchText, result) - ); - return result; - } - - protected abstract doSearch( - searchText: string, - results: SearchProviderResults - ): Promise; -} From 28702c809bf2816099819898bcb727cc337911c8 Mon Sep 17 00:00:00 2001 From: Zoran Kokeza Date: Thu, 2 Sep 2021 20:00:13 +0200 Subject: [PATCH 026/654] don't update name in updateModelFromJson but when rendering --- lib/Models/Definition/updateModelFromJson.ts | 5 ----- lib/ReactViews/Search/LocationSearchResults.tsx | 6 ++++-- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/lib/Models/Definition/updateModelFromJson.ts b/lib/Models/Definition/updateModelFromJson.ts index 69c7e6e1ad2..179edc0e2e2 100644 --- a/lib/Models/Definition/updateModelFromJson.ts +++ b/lib/Models/Definition/updateModelFromJson.ts @@ -2,7 +2,6 @@ import { isObservableArray, runInAction } from "mobx"; import isDefined from "../../Core/isDefined"; import Result from "../../Core/Result"; import TerriaError from "../../Core/TerriaError"; -import { useTranslationIfExists } from "./../../Language/languageHelpers"; import createStratumInstance from "./createStratumInstance"; import { BaseModel } from "./Model"; @@ -63,10 +62,6 @@ export default function updateModelFromJson( } model.setTrait(stratumName, propertyName, newTrait); } - if (propertyName === "name") { - newTrait = useTranslationIfExists(jsonValue); - } - model.setTrait(stratumName, propertyName, newTrait); } }); }); diff --git a/lib/ReactViews/Search/LocationSearchResults.tsx b/lib/ReactViews/Search/LocationSearchResults.tsx index 45e83b0e602..05020d7554d 100644 --- a/lib/ReactViews/Search/LocationSearchResults.tsx +++ b/lib/ReactViews/Search/LocationSearchResults.tsx @@ -15,6 +15,7 @@ import { } from "react-i18next"; import styled, { DefaultTheme } from "styled-components"; import isDefined from "../../Core/isDefined"; +import { useTranslationIfExists } from "../../Language/languageHelpers"; import LocationSearchProviderMixin from "../../ModelMixins/SearchProviders/LocationSearchProviderMixin"; import SearchProviderResults from "../../Models/SearchProviders/SearchProviderResults"; import Terria from "../../Models/Terria"; @@ -189,8 +190,9 @@ const NameWithLoader: React.FC = observer( (props: NameWithLoaderProps) => ( - {`${props.name} (${props.length || - 0})`} + {`${useTranslationIfExists( + props.name + )} (${props.length || 0})`} {!props.isOpen && (props.search.isSearching || props.isWaitingForSearchToStart) && ( From 2463af83910db58feda6327644ebd5b0f48c0d06 Mon Sep 17 00:00:00 2001 From: Zoran Kokeza Date: Thu, 2 Sep 2021 20:54:04 +0200 Subject: [PATCH 027/654] use new error handling --- .../upsertSearchProviderFromJson.ts | 45 +++++++++++++------ lib/Models/Terria.ts | 36 +++++++++++---- 2 files changed, 58 insertions(+), 23 deletions(-) diff --git a/lib/Models/SearchProviders/upsertSearchProviderFromJson.ts b/lib/Models/SearchProviders/upsertSearchProviderFromJson.ts index a54a282c714..f583b591a95 100644 --- a/lib/Models/SearchProviders/upsertSearchProviderFromJson.ts +++ b/lib/Models/SearchProviders/upsertSearchProviderFromJson.ts @@ -1,4 +1,5 @@ import i18next from "i18next"; +import Result from "../../Core/Result"; import TerriaError from "../../Core/TerriaError"; import CommonStrata from "../Definition/CommonStrata"; import { BaseModel } from "../Definition/Model"; @@ -6,21 +7,26 @@ import ModelFactory from "../Definition/ModelFactory"; import updateModelFromJson from "../Definition/updateModelFromJson"; import Terria from "../Terria"; import createStubSearchProvider from "./createStubSearchProvider"; +import StubSearchProvider from "./StubSearchProvider"; export default function upsertSearchProviderFromJson( factory: ModelFactory, terria: Terria, stratumName: string, json: any -) { +): Result { + const errors: TerriaError[] = []; + let uniqueId = json.id; if (uniqueId === undefined) { const id = json.localId || json.name; if (id === undefined) { - throw new TerriaError({ - title: i18next.t("searchProvider.models.idForMatchingErrorTitle"), - message: i18next.t("searchProvider.models.idForMatchingErrorMessage") - }); + return Result.error( + new TerriaError({ + title: i18next.t("models.catalog.idForMatchingErrorTitle"), + message: i18next.t("models.catalog.idForMatchingErrorMessage") + }) + ); } uniqueId = id; } @@ -30,7 +36,7 @@ export default function upsertSearchProviderFromJson( if (model === undefined) { model = factory.create(json.type, uniqueId, terria); if (model === undefined) { - console.log( + errors.push( new TerriaError({ title: i18next.t("searchProvider.models.unsupportedTypeTitle"), message: i18next.t("searchProvider.models.unsupportedTypeMessage", { @@ -44,18 +50,29 @@ export default function upsertSearchProviderFromJson( stub.setTrait(CommonStrata.override, "name", `${uniqueId} (Stub)`); } - model?.terria.addSearchProvider(model); + if (model.type !== StubSearchProvider.type) { + try { + model.terria.addSearchProvider(model); + } catch (error) { + errors.push(error); + } + } } setDefaultTraits(model); - try { - updateModelFromJson(model, stratumName, json); - } catch (error) { - console.log(`Error updating search provider from JSON`); - console.log(error); - model?.setTrait(CommonStrata.underride, "isExperiencingIssues", true); - } + updateModelFromJson(model, stratumName, json).catchError(error => { + errors.push(error); + model!.setTrait(CommonStrata.underride, "isExperiencingIssues", true); + }); + + return new Result( + model, + TerriaError.combine( + errors, + `Error upserting search provider JSON: \`${uniqueId}\`` + ) + ); } function setDefaultTraits(model: BaseModel) { diff --git a/lib/Models/Terria.ts b/lib/Models/Terria.ts index aa9cb2ab6e5..34a8a631d97 100644 --- a/lib/Models/Terria.ts +++ b/lib/Models/Terria.ts @@ -914,12 +914,18 @@ export default class Terria { ) ); + this.initializeSearchProviders().catchError(error => + this.raiseErrorToUser( + TerriaError.from(error, "Failed to initialize searchProviders") + ) + ); + if (options.applicationUrl) { (await this.updateApplicationUrl(options.applicationUrl.href)).raiseError( this ); } - this.initializeSearchProviders(); + this.loadPersistedMapSettings(); } @@ -942,21 +948,33 @@ export default class Terria { } initializeSearchProviders() { + const errors: TerriaError[] = []; let searchProviders = this.configParameters.searchBar?.searchProviders; - if (!isObservableArray(searchProviders)) - throw new TerriaError({ - sender: SearchProviderFactory, - title: "SearchProviders", - message: "" - }); - searchProviders.forEach(searchProvider => { + if (!isObservableArray(searchProviders)) { + errors.push( + new TerriaError({ + sender: SearchProviderFactory, + title: "SearchProviders", + message: { key: "searchProvider.noSearchProviders" } + }) + ); + } + searchProviders?.forEach(searchProvider => { upsertSearchProviderFromJson( SearchProviderFactory, this, CommonStrata.definition, searchProvider - ); + ).pushErrorTo(errors); }); + + return new Result( + undefined, + TerriaError.combine( + errors, + "An error occurred while loading search providers" + ) + ); } async loadPersistedOrInitBaseMap() { From 8e15054af1f8d3dc40e0256da7df78334282b22e Mon Sep 17 00:00:00 2001 From: Zoran Kokeza Date: Fri, 3 Sep 2021 00:21:58 +0200 Subject: [PATCH 028/654] properly handle translations, and fix issue with catalog search provider not properly handling errors --- lib/Language/en/translation.json | 1 + lib/Language/languageHelpers.ts | 12 +++-- .../SearchProviders/SearchProviderMixin.ts | 10 ++-- .../WebFeatureServiceSearchProviderMixin.ts | 19 ++++--- .../SearchProviders/BingMapsSearchProvider.ts | 20 +++++--- .../SearchProviders/CatalogSearchProvider.ts | 49 +++++++++++-------- .../SearchProviders/SearchProviderResults.ts | 7 ++- .../Search/LocationSearchResults.tsx | 4 +- lib/ReactViews/Search/SearchHeader.tsx | 11 ++++- 9 files changed, 87 insertions(+), 46 deletions(-) diff --git a/lib/Language/en/translation.json b/lib/Language/en/translation.json index 6aedf624cbe..14c19281190 100644 --- a/lib/Language/en/translation.json +++ b/lib/Language/en/translation.json @@ -1520,6 +1520,7 @@ } }, "searchProvider": { + "noSearchProviders": "There is no configured search providers", "models": { "unsupportedTypeTitle": "Unknown type", "unsupportedTypeMessage": "Could not create unknown model type {{type}}.", diff --git a/lib/Language/languageHelpers.ts b/lib/Language/languageHelpers.ts index 3d57da40cee..065ddd55ae1 100644 --- a/lib/Language/languageHelpers.ts +++ b/lib/Language/languageHelpers.ts @@ -1,14 +1,18 @@ import i18next from "i18next"; + /** * Takes a given string and translates it if it exists, otherwise return */ -export function useTranslationIfExists(keyOrString: string) { - if (keyOrString && keyOrString.indexOf("translate#") === 0) { +export function useTranslationIfExists( + keyOrString: string = "", + options?: { [key: string]: string | number | undefined } +) { + if (keyOrString.indexOf("translate#") === 0) { const translationKey = keyOrString.substr("translate#".length); return i18next.exists(translationKey) - ? i18next.t(translationKey) + ? i18next.t(translationKey, options) : translationKey; } else { - return keyOrString || ""; + return keyOrString; } } diff --git a/lib/ModelMixins/SearchProviders/SearchProviderMixin.ts b/lib/ModelMixins/SearchProviders/SearchProviderMixin.ts index aa488842053..fba60fd2b1b 100644 --- a/lib/ModelMixins/SearchProviders/SearchProviderMixin.ts +++ b/lib/ModelMixins/SearchProviders/SearchProviderMixin.ts @@ -1,4 +1,3 @@ -import i18next from "i18next"; import { action } from "mobx"; import { fromPromise } from "mobx-utils"; import Constructor from "../../Core/Constructor"; @@ -26,9 +25,12 @@ function SearchProviderMixin>( const result = new SearchProviderResults(this); if (!this.shouldRunSearch(searchText)) { result.resultsCompletePromise = fromPromise(Promise.resolve()); - result.message = i18next.t("viewModels.searchMinCharacters", { - count: this.minCharacters - }); + result.message = { + content: "translate#viewModels.searchMinCharacters", + params: { + count: this.minCharacters + } + }; return result; } this.logEvent(searchText); diff --git a/lib/ModelMixins/SearchProviders/WebFeatureServiceSearchProviderMixin.ts b/lib/ModelMixins/SearchProviders/WebFeatureServiceSearchProviderMixin.ts index d205658edd3..3fa2a49af40 100644 --- a/lib/ModelMixins/SearchProviders/WebFeatureServiceSearchProviderMixin.ts +++ b/lib/ModelMixins/SearchProviders/WebFeatureServiceSearchProviderMixin.ts @@ -1,11 +1,10 @@ -import i18next from "i18next"; import { runInAction } from "mobx"; import Resource from "terriajs-cesium/Source/Core/Resource"; import URI from "urijs"; import Constructor from "../../Core/Constructor"; import makeRealPromise from "../../Core/makeRealPromise"; import zoomRectangleFromPoint from "../../Map/zoomRectangleFromPoint"; -import Model from "../../Models/Model"; +import Model from "../../Models/Definition/Model"; import SearchProviderResults from "../../Models/SearchProviders/SearchProviderResults"; import SearchResult from "../../Models/SearchProviders/SearchResult"; import xml2json from "../../ThirdParty/xml2json"; @@ -91,7 +90,9 @@ function WebFeatureServiceSearchProviderMixin< let json: any = xml2json(xml); let features: any[]; if (json === undefined) { - results.message = i18next.t("viewModels.searchErrorOccurred"); + results.message = { + content: "translate#viewModels.searchErrorOccurred" + }; return; } @@ -100,7 +101,9 @@ function WebFeatureServiceSearchProviderMixin< } else if (json.featureMember !== undefined) { features = json.featureMember; } else { - results.message = i18next.t("viewModels.searchNoPlaceNames"); + results.message = { + content: "translate#translate#viewModels.searchNoPlaceNames" + }; return; } @@ -117,7 +120,9 @@ function WebFeatureServiceSearchProviderMixin< } if (features.length === 0) { - results.message = i18next.t("viewModels.searchNoPlaceNames"); + results.message = { + content: "translate#viewModels.searchNoPlaceNames" + }; return; } @@ -174,7 +179,9 @@ function WebFeatureServiceSearchProviderMixin< // A new search has superseded this one, so ignore the result. return; } - results.message = i18next.t("viewModels.searchErrorOccurred"); + results.message = { + content: "translate#viewModels.searchErrorOccurred" + }; }); } diff --git a/lib/Models/SearchProviders/BingMapsSearchProvider.ts b/lib/Models/SearchProviders/BingMapsSearchProvider.ts index ab125b0231e..764c3c16574 100644 --- a/lib/Models/SearchProviders/BingMapsSearchProvider.ts +++ b/lib/Models/SearchProviders/BingMapsSearchProvider.ts @@ -1,4 +1,3 @@ -import i18next from "i18next"; import { runInAction } from "mobx"; import defined from "terriajs-cesium/Source/Core/defined"; import Rectangle from "terriajs-cesium/Source/Core/Rectangle"; @@ -8,6 +7,7 @@ import { SearchAction } from "../../Core/AnalyticEvents/analyticEvents"; import loadJsonp from "../../Core/loadJsonp"; +import { useTranslationIfExists } from "../../Language/languageHelpers"; import LocationSearchProviderMixin, { getMapCenter } from "../../ModelMixins/SearchProviders/LocationSearchProviderMixin"; @@ -43,7 +43,7 @@ export default class BingMapsSearchProvider extends LocationSearchProviderMixin( if (!this.key || this.key === "") { console.warn( "The " + - this.name + + useTranslationIfExists(this.name) + " geocoder will always return no results because a Bing Maps key has not been provided. Please get a Bing Maps key from bingmapsportal.com and add it to parameters.bingMapsKey in config.json." ); } @@ -91,13 +91,17 @@ export default class BingMapsSearchProvider extends LocationSearchProviderMixin( } if (result.resourceSets.length === 0) { - searchResults.message = i18next.t("viewModels.searchNoLocations"); + searchResults.message = { + content: "translate#viewModels.searchNoLocations" + }; return; } var resourceSet = result.resourceSets[0]; if (resourceSet.resources.length === 0) { - searchResults.message = i18next.t("viewModels.searchNoLocations"); + searchResults.message = { + content: "translate#viewModels.searchNoLocations" + }; return; } @@ -109,7 +113,9 @@ export default class BingMapsSearchProvider extends LocationSearchProviderMixin( }); if (searchResults.results.length === 0) { - searchResults.message = i18next.t("viewModels.searchNoLocations"); + searchResults.message = { + content: "translate#viewModels.searchNoLocations" + }; } }) .catch(() => { @@ -118,7 +124,9 @@ export default class BingMapsSearchProvider extends LocationSearchProviderMixin( return; } - searchResults.message = i18next.t("viewModels.searchErrorOccurred"); + searchResults.message = { + content: "translate#viewModels.searchErrorOccurred" + }; }); } diff --git a/lib/Models/SearchProviders/CatalogSearchProvider.ts b/lib/Models/SearchProviders/CatalogSearchProvider.ts index e4f7b5b2686..7c02059e02b 100644 --- a/lib/Models/SearchProviders/CatalogSearchProvider.ts +++ b/lib/Models/SearchProviders/CatalogSearchProvider.ts @@ -69,7 +69,7 @@ export function loadAndSearchCatalogRecursively( if (referencesAndGroupsToLoad.length === 0) { return Promise.resolve(terria); } - return new Promise(resolve => { + return new Promise((resolve, reject) => { autorun(reaction => { Promise.all( referencesAndGroupsToLoad.map(async model => { @@ -82,18 +82,22 @@ export function loadAndSearchCatalogRecursively( // return model.loadMembers(); // } }) - ).then(() => { - // Then call this function again to see if new child references were loaded in - resolve( - loadAndSearchCatalogRecursively( - terria, - searchTextLowercase, - searchResults, - resultMap, - iteration + 1 - ) - ); - }); + ) + .then(() => { + // Then call this function again to see if new child references were loaded in + resolve( + loadAndSearchCatalogRecursively( + terria, + searchTextLowercase, + searchResults, + resultMap, + iteration + 1 + ) + ); + }) + .catch(error => { + reject(error); + }); reaction.dispose(); }); }); @@ -133,14 +137,12 @@ export default class CatalogSearchProvider extends SearchProviderMixin( const resultMap: ResultMap = new Map(); - const promise: Promise = loadAndSearchCatalogRecursively( + return loadAndSearchCatalogRecursively( this.terria, searchText.toLowerCase(), searchResults, resultMap - ); - - return promise + ) .then(terria => { runInAction(() => { this.isSearching = false; @@ -156,8 +158,9 @@ export default class CatalogSearchProvider extends SearchProviderMixin( }); if (searchResults.results.length === 0) { - searchResults.message = - "Sorry, no locations match your search query."; + searchResults.message = { + content: "translate#viewModels.searchNoLocations" + }; } }) .catch(() => { @@ -165,9 +168,13 @@ export default class CatalogSearchProvider extends SearchProviderMixin( // A new search has superseded this one, so ignore the result. return; } + runInAction(() => { + this.isSearching = false; + }); - searchResults.message = - "An error occurred while searching. Please check your internet connection or try again later."; + searchResults.message = { + content: "translate#viewModels.searchErrorOccurred" + }; }); } } diff --git a/lib/Models/SearchProviders/SearchProviderResults.ts b/lib/Models/SearchProviders/SearchProviderResults.ts index df3cf9e6538..9718de635d5 100644 --- a/lib/Models/SearchProviders/SearchProviderResults.ts +++ b/lib/Models/SearchProviders/SearchProviderResults.ts @@ -5,7 +5,12 @@ import SearchResult from "./SearchResult"; export default class SearchProviderResults { @observable results: SearchResult[] = []; - @observable message: string | undefined; + @observable message?: { + content: string; + params?: { + [key: string]: string | number | undefined; + }; + }; isCanceled = false; resultsCompletePromise: IPromiseBasedObservable = fromPromise( Promise.resolve() diff --git a/lib/ReactViews/Search/LocationSearchResults.tsx b/lib/ReactViews/Search/LocationSearchResults.tsx index 05020d7554d..4c70a0a9d5a 100644 --- a/lib/ReactViews/Search/LocationSearchResults.tsx +++ b/lib/ReactViews/Search/LocationSearchResults.tsx @@ -170,11 +170,11 @@ const SearchResultsFooter: React.FC = ( const { t } = useTranslation(); if (props.isExpanded) { return t("search.viewLess", { - name: props.name + name: useTranslationIfExists(props.name) }); } return t("search.viewMore", { - name: props.name + name: useTranslationIfExists(props.name) }); }; diff --git a/lib/ReactViews/Search/SearchHeader.tsx b/lib/ReactViews/Search/SearchHeader.tsx index 89a4202d251..ef74ed80732 100644 --- a/lib/ReactViews/Search/SearchHeader.tsx +++ b/lib/ReactViews/Search/SearchHeader.tsx @@ -1,11 +1,13 @@ import { observer } from "mobx-react"; import React from "react"; +import { useTranslationIfExists } from "../../Language/languageHelpers"; +import SearchProviderResults from "../../Models/SearchProviders/SearchProviderResults"; import { BoxSpan } from "../../Styled/Box"; import Text from "../../Styled/Text"; import Loader from "../Loader"; interface SearchHeaderProps { - searchResults: { [key: string]: any }; + searchResults: SearchProviderResults; isWaitingForSearchToStart: boolean; } @@ -20,7 +22,12 @@ const SearchHeader: React.FC = observer( } else if (props.searchResults.message) { return ( - {props.searchResults.message} + + {useTranslationIfExists( + props.searchResults.message.content, + props.searchResults.message.params + )} + ); } else { From c91a2403ed02d538c15e028b5b25159bd46109b7 Mon Sep 17 00:00:00 2001 From: Zoran Kokeza Date: Fri, 3 Sep 2021 00:23:04 +0200 Subject: [PATCH 029/654] fix data catalog not showing search result messages --- lib/Models/SearchProviders/CatalogSearchProvider.ts | 10 ++++++++++ lib/ReactViews/DataCatalog/DataCatalog.jsx | 13 ++++--------- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/lib/Models/SearchProviders/CatalogSearchProvider.ts b/lib/Models/SearchProviders/CatalogSearchProvider.ts index 7c02059e02b..9b9a550cf2d 100644 --- a/lib/Models/SearchProviders/CatalogSearchProvider.ts +++ b/lib/Models/SearchProviders/CatalogSearchProvider.ts @@ -7,6 +7,7 @@ import GroupMixin from "../../ModelMixins/GroupMixin"; import ReferenceMixin from "../../ModelMixins/ReferenceMixin"; import SearchProviderMixin from "../../ModelMixins/SearchProviders/SearchProviderMixin"; import CatalogSearchProviderTraits from "../../Traits/SearchProviders/CatalogSearchProviderTraits"; +import CommonStrata from "../Definition/CommonStrata"; import CreateModel from "../Definition/CreateModel"; import Terria from "../Terria"; import SearchProviderResults from "./SearchProviderResults"; @@ -110,6 +111,15 @@ export default class CatalogSearchProvider extends SearchProviderMixin( @observable isSearching: boolean = false; @observable debounceDurationOnceLoaded: number = 300; + constructor(id: string | undefined, terria: Terria) { + super(id, terria); + this.setTrait( + CommonStrata.defaults, + "minCharacters", + terria.configParameters.searchBar!.minCharacters + ); + } + get type() { return CatalogSearchProvider.type; } diff --git a/lib/ReactViews/DataCatalog/DataCatalog.jsx b/lib/ReactViews/DataCatalog/DataCatalog.jsx index d4ffbe7a58d..68c9d55db11 100644 --- a/lib/ReactViews/DataCatalog/DataCatalog.jsx +++ b/lib/ReactViews/DataCatalog/DataCatalog.jsx @@ -1,17 +1,12 @@ -import React from "react"; -import { observer } from "mobx-react"; - import createReactClass from "create-react-class"; - +import { observer } from "mobx-react"; import PropTypes from "prop-types"; +import React from "react"; import { withTranslation } from "react-i18next"; - import defined from "terriajs-cesium/Source/Core/defined"; - -import DataCatalogMember from "./DataCatalogMember"; import SearchHeader from "../Search/SearchHeader"; - import Styles from "./data-catalog.scss"; +import DataCatalogMember from "./DataCatalogMember"; // Displays the data catalog. export const DataCatalog = observer( @@ -48,7 +43,7 @@ export const DataCatalog = observer( Date: Fri, 3 Sep 2021 00:28:13 +0200 Subject: [PATCH 030/654] fix search in data catalogue button --- lib/ReactViews/Search/SearchBoxAndResults.jsx | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/lib/ReactViews/Search/SearchBoxAndResults.jsx b/lib/ReactViews/Search/SearchBoxAndResults.jsx index 89b58cc5758..82d12719296 100644 --- a/lib/ReactViews/Search/SearchBoxAndResults.jsx +++ b/lib/ReactViews/Search/SearchBoxAndResults.jsx @@ -2,19 +2,20 @@ import { reaction, runInAction } from "mobx"; import { observer } from "mobx-react"; import PropTypes from "prop-types"; import React from "react"; -import { Trans } from "react-i18next"; +import { useTranslation } from "react-i18next"; import styled from "styled-components"; import { addMarker, removeMarker } from "../../Models/LocationMarkerUtils"; -import SearchBox from "../Search/SearchBox"; -import LocationSearchResults from "../Search/LocationSearchResults"; -import Icon, { StyledIcon } from "../../Styled/Icon"; import Box from "../../Styled/Box"; import { RawButton } from "../../Styled/Button"; +import Icon, { StyledIcon } from "../../Styled/Icon"; import Spacing from "../../Styled/Spacing"; import Text from "../../Styled/Text"; +import LocationSearchResults from "../Search/LocationSearchResults"; +import SearchBox from "../Search/SearchBox"; export function SearchInDataCatalog({ viewState, handleClick }) { const locationSearchText = viewState.searchState.locationSearchText; + const { t } = useTranslation(); return ( - - Search {locationSearchText} in the Data Catalogue - + {t("search.searchInDataCatalog", { + locationSearchText: locationSearchText + })} From 4b6221a3309d9248d32fd863d2dbb38e19c2f8d9 Mon Sep 17 00:00:00 2001 From: Zoran Kokeza Date: Fri, 3 Sep 2021 00:43:15 +0200 Subject: [PATCH 031/654] update translation file --- lib/Language/en/translation.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Language/en/translation.json b/lib/Language/en/translation.json index 14c19281190..9398615b849 100644 --- a/lib/Language/en/translation.json +++ b/lib/Language/en/translation.json @@ -446,7 +446,7 @@ "resultsLabel": "Search Results", "done": "Done", "data": "Data", - "searchInDataCatalog": "Search <1>'{{locationSearchText}}' in the Data Catalogue", + "searchInDataCatalog": "Search '{{locationSearchText}}' in the Data Catalogue", "search": "Search '{{searchText}}' in the Data Catalogue", "viewLess": "View less {{name}} results", "viewMore": "View more {{name}} results", From cc6ec14aa17e47fc306b40da2f72ae6af61dc26b Mon Sep 17 00:00:00 2001 From: Zoran Kokeza Date: Sun, 17 Oct 2021 15:41:21 +0200 Subject: [PATCH 032/654] update bingMapsSearchProvider warning when there is no key --- .../SearchProviders/BingMapsSearchProvider.ts | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/lib/Models/SearchProviders/BingMapsSearchProvider.ts b/lib/Models/SearchProviders/BingMapsSearchProvider.ts index 764c3c16574..f626b11dac7 100644 --- a/lib/Models/SearchProviders/BingMapsSearchProvider.ts +++ b/lib/Models/SearchProviders/BingMapsSearchProvider.ts @@ -29,22 +29,24 @@ export default class BingMapsSearchProvider extends LocationSearchProviderMixin( constructor(uniqueId: string | undefined, terria: Terria) { super(uniqueId, terria); - if (!this.key && this.terria.configParameters.bingMapsKey) { - this.setTrait( - CommonStrata.defaults, - "key", - this.terria.configParameters.bingMapsKey - ); - } - this.showWarning(); + runInAction(() => { + if (!this.key && this.terria.configParameters.bingMapsKey) { + this.setTrait( + CommonStrata.defaults, + "key", + this.terria.configParameters.bingMapsKey + ); + } + this.showWarning(); + }); } showWarning() { if (!this.key || this.key === "") { console.warn( - "The " + - useTranslationIfExists(this.name) + - " geocoder will always return no results because a Bing Maps key has not been provided. Please get a Bing Maps key from bingmapsportal.com and add it to parameters.bingMapsKey in config.json." + `The ${useTranslationIfExists(this.name)}(${ + this.type + }) geocoder will always return no results because a Bing Maps key has not been provided. Please get a Bing Maps key from bingmapsportal.com and add it to parameters.bingMapsKey in config.json.` ); } } From ce884cd1ad5bbe1d76af922cdf58a2e22ced6dff Mon Sep 17 00:00:00 2001 From: Zoran Kokeza Date: Sun, 17 Oct 2021 17:25:47 +0200 Subject: [PATCH 033/654] use mixTraits of directly extending Traits --- lib/Traits/SearchProviders/BingMapsSearchProviderTraits.ts | 2 +- lib/Traits/SearchProviders/CatalogSearchProviderTraits.ts | 2 +- lib/Traits/SearchProviders/LocationSearchProviderTraits.ts | 7 +++++-- .../WebFeatureServiceSearchProviderTraits.ts | 5 ++++- 4 files changed, 11 insertions(+), 5 deletions(-) diff --git a/lib/Traits/SearchProviders/BingMapsSearchProviderTraits.ts b/lib/Traits/SearchProviders/BingMapsSearchProviderTraits.ts index 81649828868..d233d921f0d 100644 --- a/lib/Traits/SearchProviders/BingMapsSearchProviderTraits.ts +++ b/lib/Traits/SearchProviders/BingMapsSearchProviderTraits.ts @@ -1,5 +1,5 @@ -import mixTraits from "../mixTraits"; import primitiveTrait from "../Decorators/primitiveTrait"; +import mixTraits from "../mixTraits"; import LocationSearchProviderTraits, { SearchProviderMapCenterTraits } from "./LocationSearchProviderTraits"; diff --git a/lib/Traits/SearchProviders/CatalogSearchProviderTraits.ts b/lib/Traits/SearchProviders/CatalogSearchProviderTraits.ts index 2dc2ff84927..bac19734806 100644 --- a/lib/Traits/SearchProviders/CatalogSearchProviderTraits.ts +++ b/lib/Traits/SearchProviders/CatalogSearchProviderTraits.ts @@ -1,6 +1,6 @@ +import primitiveTrait from "../Decorators/primitiveTrait"; import mixTraits from "../mixTraits"; import SearchProviderTraits from "./SearchProviderTraits"; -import primitiveTrait from "../Decorators/primitiveTrait"; export default class CatalogSearchProviderTraits extends mixTraits( SearchProviderTraits diff --git a/lib/Traits/SearchProviders/LocationSearchProviderTraits.ts b/lib/Traits/SearchProviders/LocationSearchProviderTraits.ts index cb00c39d7c8..8c21cf5f93b 100644 --- a/lib/Traits/SearchProviders/LocationSearchProviderTraits.ts +++ b/lib/Traits/SearchProviders/LocationSearchProviderTraits.ts @@ -1,8 +1,11 @@ -import ModelTraits from "../ModelTraits"; import primitiveTrait from "../Decorators/primitiveTrait"; +import mixTraits from "../mixTraits"; +import ModelTraits from "../ModelTraits"; import SearchProviderTraits from "./SearchProviderTraits"; -export default class LocationSearchProviderTraits extends SearchProviderTraits { +export default class LocationSearchProviderTraits extends mixTraits( + SearchProviderTraits +) { @primitiveTrait({ type: "string", name: "URL", diff --git a/lib/Traits/SearchProviders/WebFeatureServiceSearchProviderTraits.ts b/lib/Traits/SearchProviders/WebFeatureServiceSearchProviderTraits.ts index 1be4884242e..636585348d3 100644 --- a/lib/Traits/SearchProviders/WebFeatureServiceSearchProviderTraits.ts +++ b/lib/Traits/SearchProviders/WebFeatureServiceSearchProviderTraits.ts @@ -1,7 +1,10 @@ import primitiveTrait from "../Decorators/primitiveTrait"; +import mixTraits from "../mixTraits"; import LocationSearchProviderTraits from "./LocationSearchProviderTraits"; -export default class WebFeatureServiceSearchProviderTraits extends LocationSearchProviderTraits { +export default class WebFeatureServiceSearchProviderTraits extends mixTraits( + LocationSearchProviderTraits +) { @primitiveTrait({ type: "string", name: "Search property name", From 9713dedd9199056e6bcef208ce558c9bc7a00f91 Mon Sep 17 00:00:00 2001 From: Zoran Kokeza Date: Sun, 17 Oct 2021 17:26:38 +0200 Subject: [PATCH 034/654] remove deprecationWarning function as it's not needed anymore --- lib/Core/deprecationWarning.ts | 94 ---------------------------------- 1 file changed, 94 deletions(-) delete mode 100644 lib/Core/deprecationWarning.ts diff --git a/lib/Core/deprecationWarning.ts b/lib/Core/deprecationWarning.ts deleted file mode 100644 index 9b57e432663..00000000000 --- a/lib/Core/deprecationWarning.ts +++ /dev/null @@ -1,94 +0,0 @@ -import DeveloperError from "terriajs-cesium/Source/Core/DeveloperError"; -import defined from "terriajs-cesium/Source/Core/defined"; -import defaultValue from "terriajs-cesium/Source/Core/defaultValue"; - -/** - * Port of Cesium's functions `deprecationWarning` and `oneTimeWarning`. - */ -const warnings: { [key: string]: boolean } = {}; - -/** - * Logs a one time message to the console. Use this function instead of - * console.log directly since this does not log duplicate messages - * unless it is called from multiple workers. - * - * @function oneTimeWarning - * - * @param {String} identifier The unique identifier for this warning. - * @param {String} [message=identifier] The message to log to the console. - * - * @example - * for(var i=0;i>includeStart('debug', pragmas.debug); - if (!defined(identifier)) { - throw new DeveloperError("identifier is required."); - } - //>>includeEnd('debug'); - - if (!defined(warnings[identifier])) { - warnings[identifier] = true; - console.warn(defaultValue(message, identifier)); - } -} - -/** - * Logs a deprecation message to the console. Use this function instead of - * console.log directly since this does not log duplicate messages - * unless it is called from multiple workers. - * - * @function deprecationWarning - * - * @param {String} identifier The unique identifier for this deprecated API. - * @param {String} message The message to log to the console. - * - * @example - * // Deprecated function or class - * function Foo() { - * deprecationWarning('Foo', 'Foo was deprecated in Cesium 1.01. It will be removed in 1.03. Use newFoo instead.'); - * // ... - * } - * - * // Deprecated function - * Bar.prototype.func = function() { - * deprecationWarning('Bar.func', 'Bar.func() was deprecated in Cesium 1.01. It will be removed in 1.03. Use Bar.newFunc() instead.'); - * // ... - * }; - * - * // Deprecated property - * Object.defineProperties(Bar.prototype, { - * prop : { - * get : function() { - * deprecationWarning('Bar.prop', 'Bar.prop was deprecated in Cesium 1.01. It will be removed in 1.03. Use Bar.newProp instead.'); - * // ... - * }, - * set : function(value) { - * deprecationWarning('Bar.prop', 'Bar.prop was deprecated in Cesium 1.01. It will be removed in 1.03. Use Bar.newProp instead.'); - * // ... - * } - * } - * }); - * - * @private - */ -function deprecationWarning(identifier: string, message: string) { - //>>includeStart('debug', pragmas.debug); - if (!defined(identifier) || !defined(message)) { - throw new DeveloperError("identifier and message are required."); - } - //>>includeEnd('debug'); - - oneTimeWarning(identifier, message); -} - -export default deprecationWarning; From b95cf473604f1c5280b8d0608967ac8003c0f8c1 Mon Sep 17 00:00:00 2001 From: Zoran Kokeza Date: Sun, 17 Oct 2021 19:32:13 +0200 Subject: [PATCH 035/654] add search bar model and make it use traits --- lib/Core/TerriaError.ts | 2 +- .../SearchProviders/SearchProviderMixin.ts | 2 +- .../WebFeatureServiceSearchProviderMixin.ts | 2 +- .../SearchProviders/CatalogSearchProvider.ts | 5 +- lib/Models/SearchProviders/SearchBarModel.ts | 79 ++++++++++ .../createStubSearchProvider.ts | 2 +- .../upsertSearchProviderFromJson.ts | 13 +- lib/Models/Terria.ts | 143 +++--------------- lib/ReactViews/Mobile/MobileHeader.jsx | 2 +- .../Search/LocationSearchResults.tsx | 27 +++- lib/ReactViews/SidePanel/SidePanel.jsx | 13 +- lib/Traits/SearchProviders/SearchBarTraits.ts | 44 ++++++ 12 files changed, 189 insertions(+), 145 deletions(-) create mode 100644 lib/Models/SearchProviders/SearchBarModel.ts create mode 100644 lib/Traits/SearchProviders/SearchBarTraits.ts diff --git a/lib/Core/TerriaError.ts b/lib/Core/TerriaError.ts index e3dcbd17f12..eb8f1009e00 100644 --- a/lib/Core/TerriaError.ts +++ b/lib/Core/TerriaError.ts @@ -218,7 +218,7 @@ export default class TerriaError { // shouldRaiseToUser will be true if at least one error includes shouldRaiseToUser = true const shouldRaiseToUser = filteredErrors - .map(error => error._shouldRaiseToUser ?? false) + .map(error => error.shouldRaiseToUser ?? false) .includes(true); return new TerriaError({ diff --git a/lib/ModelMixins/SearchProviders/SearchProviderMixin.ts b/lib/ModelMixins/SearchProviders/SearchProviderMixin.ts index c4c4c015517..36107923d16 100644 --- a/lib/ModelMixins/SearchProviders/SearchProviderMixin.ts +++ b/lib/ModelMixins/SearchProviders/SearchProviderMixin.ts @@ -48,7 +48,7 @@ function SearchProviderMixin>( (this.minCharacters && searchText.length < this.minCharacters) || (this.minCharacters === undefined && searchText.length < - this.terria.configParameters.searchBar!.minCharacters) + this.terria.configParameters.searchBarModel!.minCharacters) ) { return false; } diff --git a/lib/ModelMixins/SearchProviders/WebFeatureServiceSearchProviderMixin.ts b/lib/ModelMixins/SearchProviders/WebFeatureServiceSearchProviderMixin.ts index 3fa2a49af40..b7c6aa9c600 100644 --- a/lib/ModelMixins/SearchProviders/WebFeatureServiceSearchProviderMixin.ts +++ b/lib/ModelMixins/SearchProviders/WebFeatureServiceSearchProviderMixin.ts @@ -222,7 +222,7 @@ function createZoomToFunction( const flightDurationSeconds: number = model.flightDurationSeconds || - model.terria.configParameters.searchBar!.flightDurationSeconds; + model.terria.configParameters.searchBarModel!.flightDurationSeconds; return function() { model.terria.currentViewer.zoomTo(rectangle, flightDurationSeconds); diff --git a/lib/Models/SearchProviders/CatalogSearchProvider.ts b/lib/Models/SearchProviders/CatalogSearchProvider.ts index 81c83c3d34c..b23c93a5d98 100644 --- a/lib/Models/SearchProviders/CatalogSearchProvider.ts +++ b/lib/Models/SearchProviders/CatalogSearchProvider.ts @@ -1,9 +1,8 @@ -import { autorun, computed, observable, runInAction } from "mobx"; +import { autorun, observable, runInAction } from "mobx"; import { Category, SearchAction } from "../../Core/AnalyticEvents/analyticEvents"; -import isDefined from "../../Core/isDefined"; import { TerriaErrorSeverity } from "../../Core/TerriaError"; import GroupMixin from "../../ModelMixins/GroupMixin"; import ReferenceMixin from "../../ModelMixins/ReferenceMixin"; @@ -119,7 +118,7 @@ export default class CatalogSearchProvider extends SearchProviderMixin( this.setTrait( CommonStrata.defaults, "minCharacters", - terria.configParameters.searchBar!.minCharacters + terria.configParameters.searchBarModel!.minCharacters ); } diff --git a/lib/Models/SearchProviders/SearchBarModel.ts b/lib/Models/SearchProviders/SearchBarModel.ts new file mode 100644 index 00000000000..5ba225bce88 --- /dev/null +++ b/lib/Models/SearchProviders/SearchBarModel.ts @@ -0,0 +1,79 @@ +import { action, isObservableArray, observable } from "mobx"; +import { DeveloperError } from "terriajs-cesium"; +import Result from "../../Core/Result"; +import TerriaError from "../../Core/TerriaError"; +import { SearchBarTraits } from "../../Traits/SearchProviders/SearchBarTraits"; +import CommonStrata from "../Definition/CommonStrata"; +import CreateModel from "../Definition/CreateModel"; +import { BaseModel } from "../Definition/Model"; +import Terria from "../Terria"; +import SearchProviderFactory from "./SearchProviderFactory"; +import upsertSearchProviderFromJson from "./upsertSearchProviderFromJson"; + +export class SearchBarModel extends CreateModel(SearchBarTraits) { + private locationSearchProviders = observable.map(); + + constructor(readonly terria: Terria) { + super("search-bar-model", terria); + } + + initializeSearchProviders() { + const errors: TerriaError[] = []; + + const searchProviders = this.terria.configParameters.searchProviders; + + if (!isObservableArray(searchProviders)) { + errors.push( + new TerriaError({ + sender: SearchProviderFactory, + title: "SearchProviders", + message: { key: "searchProvider.noSearchProviders" } + }) + ); + } + searchProviders?.forEach(searchProvider => { + upsertSearchProviderFromJson( + SearchProviderFactory, + this.terria, + CommonStrata.definition, + searchProvider + ).pushErrorTo(errors); + }); + + return new Result( + undefined, + TerriaError.combine( + errors, + "An error occurred while loading search providers" + ) + ); + } + + /** + * Add new SearchProvider to the list of SearchProviders. + */ + @action + addSearchProvider(model: BaseModel) { + if (model.uniqueId === undefined) { + throw new DeveloperError( + "A SearchProvider without a `uniqueId` cannot be added." + ); + } + + if (this.locationSearchProviders.has(model.uniqueId)) { + console.log( + new DeveloperError( + "A SearchProvider with the specified ID already exists." + ) + ); + } + + this.locationSearchProviders.set(model.uniqueId, model); + } + + get locationSearchProvidersArray() { + return [...this.locationSearchProviders.entries()].map(function(entry) { + return entry[1]; + }); + } +} diff --git a/lib/Models/SearchProviders/createStubSearchProvider.ts b/lib/Models/SearchProviders/createStubSearchProvider.ts index e72e219326f..e7098bad3fb 100644 --- a/lib/Models/SearchProviders/createStubSearchProvider.ts +++ b/lib/Models/SearchProviders/createStubSearchProvider.ts @@ -22,6 +22,6 @@ export default function createStubSearchProvider( const stub = new StubSearchProvider(idToUse, terria); stub.setTrait(CommonStrata.underride, "name", stub.uniqueId); - terria.addSearchProvider(stub); + terria.configParameters.searchBarModel?.addSearchProvider(stub); return stub; } diff --git a/lib/Models/SearchProviders/upsertSearchProviderFromJson.ts b/lib/Models/SearchProviders/upsertSearchProviderFromJson.ts index f583b591a95..4f669113fb8 100644 --- a/lib/Models/SearchProviders/upsertSearchProviderFromJson.ts +++ b/lib/Models/SearchProviders/upsertSearchProviderFromJson.ts @@ -1,6 +1,7 @@ import i18next from "i18next"; import Result from "../../Core/Result"; import TerriaError from "../../Core/TerriaError"; +import { useTranslationIfExists } from "../../Language/languageHelpers"; import CommonStrata from "../Definition/CommonStrata"; import { BaseModel } from "../Definition/Model"; import ModelFactory from "../Definition/ModelFactory"; @@ -52,7 +53,7 @@ export default function upsertSearchProviderFromJson( if (model.type !== StubSearchProvider.type) { try { - model.terria.addSearchProvider(model); + model.terria.configParameters.searchBarModel?.addSearchProvider(model); } catch (error) { errors.push(error); } @@ -70,7 +71,9 @@ export default function upsertSearchProviderFromJson( model, TerriaError.combine( errors, - `Error upserting search provider JSON: \`${uniqueId}\`` + `Error upserting search provider JSON: \`${useTranslationIfExists( + uniqueId + )}\`` ) ); } @@ -81,18 +84,18 @@ function setDefaultTraits(model: BaseModel) { model.setTrait( CommonStrata.defaults, "flightDurationSeconds", - terria.configParameters.searchBar!.flightDurationSeconds + terria.configParameters.searchBarModel?.flightDurationSeconds ); model.setTrait( CommonStrata.defaults, "minCharacters", - terria.configParameters.searchBar!.minCharacters + terria.configParameters.searchBarModel?.minCharacters ); model.setTrait( CommonStrata.defaults, "recommendedListLength", - terria.configParameters.searchBar!.recommendedListLength + terria.configParameters.searchBarModel?.recommendedListLength ); } diff --git a/lib/Models/Terria.ts b/lib/Models/Terria.ts index 245ab5532bc..7ed0426eccc 100644 --- a/lib/Models/Terria.ts +++ b/lib/Models/Terria.ts @@ -1,14 +1,6 @@ import { Share } from "catalog-converter"; import i18next from "i18next"; -import { - action, - computed, - isObservableArray, - observable, - runInAction, - toJS, - when -} from "mobx"; +import { action, computed, observable, runInAction, toJS, when } from "mobx"; import { createTransformer } from "mobx-utils"; import Clock from "terriajs-cesium/Source/Core/Clock"; import defaultValue from "terriajs-cesium/Source/Core/defaultValue"; @@ -101,9 +93,8 @@ import Internationalization, { } from "./Internationalization"; import MapInteractionMode from "./MapInteractionMode"; import NoViewer from "./NoViewer"; -import SearchProviderFactory from "./SearchProviders/SearchProviderFactory"; -import upsertSearchProviderFromJson from "./SearchProviders/upsertSearchProviderFromJson"; import CatalogIndex from "./SearchProviders/CatalogIndex"; +import { SearchBarModel } from "./SearchProviders/SearchBarModel"; import ShareDataService from "./ShareDataService"; import TimelineStack from "./TimelineStack"; import ViewerMode from "./ViewerMode"; @@ -292,36 +283,7 @@ interface ConfigParameters { /** * The search bar allows requesting information from various search services at once. */ - searchBar?: SearchBar; -} - -interface SearchBar { - /** - * Input text field placeholder shown when no input has been given yet. The string is translateable. - * @default "translate#search.placeholder" - */ - placeholder: string; - /** - * Maximum amount of entries in the suggestion list. - * @default 5 - */ - recommendedListLength: number; - /** - * The duration of the camera flight to an entered location, in seconds. - * @default 1.5 - */ - flightDurationSeconds: number; - /** - * Minimum number of characters to start search. - */ - minCharacters: number; - /** - * Bounding box limits for the search results. - */ - boundingBoxLimit?: number[]; - /** - * Array of search providers to be used. - */ + searchBarModel?: SearchBarModel; searchProviders: any[]; } @@ -379,7 +341,7 @@ interface HomeCameraInit { export default class Terria { private readonly models = observable.map(); - private locationSearchProviders = observable.map(); + private searchProviders: any[] = []; /** Map from share key -> id */ readonly shareKeysMap = observable.map(); /** Map from id -> share keys */ @@ -499,13 +461,8 @@ export default class Terria { }, { text: "map.extraCreditLinks.disclaimer", url: "about.html#disclaimer" } ], - searchBar: { - placeholder: "translate#search.placeholder", - recommendedListLength: 5, - flightDurationSeconds: 1.5, - minCharacters: 3, - searchProviders: [] - } + searchBarModel: new SearchBarModel(this), + searchProviders: [] }; @observable @@ -702,34 +659,6 @@ export default class Terria { shareKeys?.forEach(shareKey => this.addShareKey(model.uniqueId!, shareKey)); } - /** - * Add new SearchProvider to the list of SearchProviders. - */ - @action - addSearchProvider(model: BaseModel) { - if (model.uniqueId === undefined) { - throw new DeveloperError( - "A SearchProvider without a `uniqueId` cannot be added." - ); - } - - if (this.locationSearchProviders.has(model.uniqueId)) { - console.log( - new DeveloperError( - "A SearchProvider with the specified ID already exists." - ) - ); - } - - this.locationSearchProviders.set(model.uniqueId, model); - } - - get locationSearchProvidersArray() { - return [...this.locationSearchProviders.entries()].map(function(entry) { - return entry[1]; - }); - } - /** * Remove references to a model from Terria. */ @@ -887,6 +816,8 @@ export default class Terria { if (isJsonObject(config) && isJsonObject(config.parameters)) { this.updateParameters(config.parameters); } + if (isJsonObject(config) && Array.isArray(config.searchProviders)) { + } if (this.configParameters.errorService) { this.setupErrorServiceProvider(this.configParameters.errorService); } @@ -934,11 +865,13 @@ export default class Terria { ) ); - this.initializeSearchProviders().catchError(error => - this.raiseErrorToUser( - TerriaError.from(error, "Failed to initialize searchProviders") - ) - ); + this.configParameters.searchBarModel + ?.initializeSearchProviders() + .catchError(error => + this.raiseErrorToUser( + TerriaError.from(error, "Failed to initialize searchProviders") + ) + ); if (options.applicationUrl) { (await this.updateApplicationUrl(options.applicationUrl.href)).raiseError( @@ -975,36 +908,6 @@ export default class Terria { } } - initializeSearchProviders() { - const errors: TerriaError[] = []; - let searchProviders = this.configParameters.searchBar?.searchProviders; - if (!isObservableArray(searchProviders)) { - errors.push( - new TerriaError({ - sender: SearchProviderFactory, - title: "SearchProviders", - message: { key: "searchProvider.noSearchProviders" } - }) - ); - } - searchProviders?.forEach(searchProvider => { - upsertSearchProviderFromJson( - SearchProviderFactory, - this, - CommonStrata.definition, - searchProvider - ).pushErrorTo(errors); - }); - - return new Result( - undefined, - TerriaError.combine( - errors, - "An error occurred while loading search providers" - ) - ); - } - async loadPersistedOrInitBaseMap() { const baseMapItems = this.baseMapsModel.baseMapItems; // Set baseMap fallback to first option @@ -1095,13 +998,15 @@ export default class Terria { updateParameters(parameters: ConfigParameters | JsonObject): void { Object.entries(parameters).forEach(([key, value]) => { if (this.configParameters.hasOwnProperty(key)) { - if (key === "searchBar") { - // merge default and new - //@ts-ignore - this.configParameters[key] = { - ...this.configParameters[key], - ...value - }; + if (key === "searchBarModel") { + if (!isDefined(this.configParameters.searchBarModel)) { + this.configParameters.searchBarModel = new SearchBarModel(this); + } + updateModelFromJson( + this.configParameters.searchBarModel!, + CommonStrata.definition, + value + ); } else { (this.configParameters as any)[key] = value; } diff --git a/lib/ReactViews/Mobile/MobileHeader.jsx b/lib/ReactViews/Mobile/MobileHeader.jsx index c0becf1bb4c..37edae88734 100644 --- a/lib/ReactViews/Mobile/MobileHeader.jsx +++ b/lib/ReactViews/Mobile/MobileHeader.jsx @@ -245,7 +245,7 @@ const MobileHeader = observer( onSearchTextChanged={this.changeLocationSearchText} onDoSearch={this.searchLocations} placeholder={useTranslationIfExists( - terria.configParameters.searchBar.placeholder + terria.configParameters.searchBarModel.placeholder )} alwaysShowClear={true} onClear={this.closeLocationSearch} diff --git a/lib/ReactViews/Search/LocationSearchResults.tsx b/lib/ReactViews/Search/LocationSearchResults.tsx index 4c70a0a9d5a..c51a240aa77 100644 --- a/lib/ReactViews/Search/LocationSearchResults.tsx +++ b/lib/ReactViews/Search/LocationSearchResults.tsx @@ -62,14 +62,29 @@ class LocationSearchResults extends React.Component { get validResults() { const { search, terria } = this.props; const locationSearchBoundingBox = - terria.configParameters.searchBar?.boundingBoxLimit; - const validResults = isDefined(locationSearchBoundingBox) + terria.configParameters.searchBarModel?.boundingBoxLimit; + let filterResults = false; + let west: number | undefined, + east: number | undefined, + south: number | undefined, + north: number | undefined; + if (locationSearchBoundingBox) { + ({ west, east, south, north } = locationSearchBoundingBox); + + filterResults = + isDefined(west) && + isDefined(east) && + isDefined(south) && + isDefined(north); + } + + const validResults = filterResults ? search.results.filter(function(r: any) { return ( - r.location.longitude > locationSearchBoundingBox[0] && - r.location.longitude < locationSearchBoundingBox[2] && - r.location.latitude > locationSearchBoundingBox[1] && - r.location.latitude < locationSearchBoundingBox[3] + r.location.longitude > west! && + r.location.longitude < east! && + r.location.latitude > south! && + r.location.latitude < north! ); }) : search.results; diff --git a/lib/ReactViews/SidePanel/SidePanel.jsx b/lib/ReactViews/SidePanel/SidePanel.jsx index 56752e409e7..8de9a888293 100644 --- a/lib/ReactViews/SidePanel/SidePanel.jsx +++ b/lib/ReactViews/SidePanel/SidePanel.jsx @@ -5,17 +5,16 @@ import React from "react"; import { withTranslation } from "react-i18next"; import styled, { withTheme } from "styled-components"; import { useTranslationIfExists } from "../../Language/languageHelpers"; -import { useRefForTerria } from "../Hooks/useRefForTerria"; +import Box from "../../Styled/Box"; +import Button from "../../Styled/Button"; import Icon, { StyledIcon } from "../../Styled/Icon"; +import Spacing from "../../Styled/Spacing"; +import Text from "../../Styled/Text"; +import { useRefForTerria } from "../Hooks/useRefForTerria"; import SearchBoxAndResults from "../Search/SearchBoxAndResults"; import Workbench from "../Workbench/Workbench"; import FullScreenButton from "./FullScreenButton"; -import Box from "../../Styled/Box"; -import Spacing from "../../Styled/Spacing"; -import Text from "../../Styled/Text"; -import Button from "../../Styled/Button"; - const BoxHelpfulHints = styled(Box)``; const ResponsiveSpacing = styled(Box)` @@ -172,7 +171,7 @@ const SidePanel = observer( viewState={this.props.viewState} terria={this.props.terria} placeholder={useTranslationIfExists( - this.props.terria.configParameters.searchBar.placeholder + this.props.terria.configParameters.searchBarModel.placeholder )} /> diff --git a/lib/Traits/SearchProviders/SearchBarTraits.ts b/lib/Traits/SearchProviders/SearchBarTraits.ts new file mode 100644 index 00000000000..e54e2b53e67 --- /dev/null +++ b/lib/Traits/SearchProviders/SearchBarTraits.ts @@ -0,0 +1,44 @@ +import Rectangle from "terriajs-cesium/Source/Core/Rectangle"; +import objectTrait from "../Decorators/objectTrait"; +import primitiveTrait from "../Decorators/primitiveTrait"; +import ModelTraits from "../ModelTraits"; +import { RectangleTraits } from "../TraitsClasses/MappableTraits"; + +export class SearchBarTraits extends ModelTraits { + @primitiveTrait({ + type: "string", + name: "placeholder", + description: + "Input text field placeholder shown when no input has been given yet. The string is translateable." + }) + placeholder: string = "translate#search.placeholder"; + + @primitiveTrait({ + type: "number", + name: "Recommended list length", + description: "Maximum amount of entries in the suggestion list." + }) + recommendedListLength: number = 5; + + @primitiveTrait({ + type: "number", + name: "Flight duration seconds", + description: + "The duration of the camera flight to an entered location, in seconds." + }) + flightDurationSeconds: number = 1.5; + + @primitiveTrait({ + type: "number", + name: "Minimum characters", + description: "Minimum number of characters required for search to start" + }) + minCharacters: number = 3; + + @objectTrait({ + type: RectangleTraits, + name: "Minimum characters", + description: "Minimum number of characters required for search to start" + }) + boundingBoxLimit?: RectangleTraits = Rectangle.MAX_VALUE; +} From 5bb733efa74a896afc77914f88c58cc3b8f567d5 Mon Sep 17 00:00:00 2001 From: Zoran Kokeza Date: Sun, 17 Oct 2021 19:49:58 +0200 Subject: [PATCH 036/654] update docs --- doc/customizing/client-side-config.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/doc/customizing/client-side-config.md b/doc/customizing/client-side-config.md index d3b4c921406..1013fbb661d 100644 --- a/doc/customizing/client-side-config.md +++ b/doc/customizing/client-side-config.md @@ -89,6 +89,8 @@ Specifies various options for configuring TerriaJS: |feedbackPreamble|no|**string**|feedback.feedbackPreamble|Text showing at the top of feedback form, supports the internationalization using the translation key.| |feedbackMinLength|no|**number**|0|Minimum length of feedback comment.| |`theme`|no|**any**|`{}`|An object used to override theme properties - for example `{"logoHeight": "70px"}`.| +|`searchBar`|no|**[SearchBar](#searchbar)**|`new SearchBar()`|Search bar configuration| +|`searchProviders`|no|**[SearchProviders](#searchbarproviders)|`[]`|Search providers that will be used for search| ### MagdaReferenceHeaders @@ -149,6 +151,7 @@ Configuration of items to appear in the search bar *** ### ErrorServiceOptions + |Name|Required|Type|Default|Description| |----|--------|----|-------|-----------| |provider|yes|**string**|`undefined`|A string identifying the error service provider to use. Currently only `rollbar` is supported.| @@ -203,3 +206,16 @@ This file will have to be re-generated manually every time the catalog structure - if items are renamed, or moved - dynamic groups are updated (for example, WMS server publishes new layers) + +### SearchBar + +Configuration for the search bar. Some of the values will be used as default for +search provider values. + +|Name|Required|Type|Default|Description| +|----|--------|----|-------|-----------| +|placeholder|no|**string**|`translate#search.placeholder`|Input text field placeholder shown when no input has been given yet. The string is translateable.| +|recommendedListLength|no|**number**|`5`|Maximum amount of entries in the suggestion list.| +|flightDurationSeconds|no|**number**|`1.5`|The duration of the camera flight to an entered location, in seconds.| +|minCharacters|no|**number**|3|Minimum number of characters required for search to start| +|boundingBoxLimit|no|**Rectangle**|`Cesium.Rectangle.MAX_VALUE`|Bounding box limits for the search results {west, south, east, north}| From 1523c81ede94b5e4cbe757b6de218a4467e7b423 Mon Sep 17 00:00:00 2001 From: Zoran Kokeza Date: Sun, 17 Oct 2021 19:50:44 +0200 Subject: [PATCH 037/654] update trait description --- lib/Traits/SearchProviders/SearchBarTraits.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/Traits/SearchProviders/SearchBarTraits.ts b/lib/Traits/SearchProviders/SearchBarTraits.ts index e54e2b53e67..85c9bbb2da3 100644 --- a/lib/Traits/SearchProviders/SearchBarTraits.ts +++ b/lib/Traits/SearchProviders/SearchBarTraits.ts @@ -37,8 +37,9 @@ export class SearchBarTraits extends ModelTraits { @objectTrait({ type: RectangleTraits, - name: "Minimum characters", - description: "Minimum number of characters required for search to start" + name: "Bounding box limit", + description: + "Bounding box limits for the search results {west, south, east, north}" }) boundingBoxLimit?: RectangleTraits = Rectangle.MAX_VALUE; } From f424f70bf2494b7fc6e7558f54b697d0b9304d36 Mon Sep 17 00:00:00 2001 From: Zoran Kokeza Date: Sun, 17 Oct 2021 21:54:53 +0200 Subject: [PATCH 038/654] fix import from terriajs-cesium --- lib/Models/SearchProviders/SearchBarModel.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Models/SearchProviders/SearchBarModel.ts b/lib/Models/SearchProviders/SearchBarModel.ts index 5ba225bce88..8f4ebec25bc 100644 --- a/lib/Models/SearchProviders/SearchBarModel.ts +++ b/lib/Models/SearchProviders/SearchBarModel.ts @@ -1,5 +1,5 @@ import { action, isObservableArray, observable } from "mobx"; -import { DeveloperError } from "terriajs-cesium"; +import DeveloperError from "terriajs-cesium/Source/Core/DeveloperError"; import Result from "../../Core/Result"; import TerriaError from "../../Core/TerriaError"; import { SearchBarTraits } from "../../Traits/SearchProviders/SearchBarTraits"; From cc7fabdb09b85c5f395ce0e4a9946573e9f90508 Mon Sep 17 00:00:00 2001 From: Zoran Kokeza Date: Sun, 17 Oct 2021 23:48:47 +0200 Subject: [PATCH 039/654] add docs --- doc/customizing/client-side-config.md | 29 +----- doc/customizing/search-providers.md | 127 ++++++++++++++++++++++++++ doc/mkdocs.yml | 1 + 3 files changed, 130 insertions(+), 27 deletions(-) create mode 100644 doc/customizing/search-providers.md diff --git a/doc/customizing/client-side-config.md b/doc/customizing/client-side-config.md index 1013fbb661d..4d141dc934f 100644 --- a/doc/customizing/client-side-config.md +++ b/doc/customizing/client-side-config.md @@ -46,7 +46,7 @@ Specifies various options for configuring TerriaJS: |`supportEmail`|no|**string**|`"info@terria.io"`|The email address shown when things go wrong.| |`defaultMaximumShownFeatureInfos`|no|**number**|`100`|The maximum number of "feature info" boxes that can be displayed when clicking a point.| |`regionMappingDefinitionsUrl`|yes|**string**|`"build/TerriaJS/data/regionMapping.json"`|URL of the JSON file that defines region mapping for CSV files. This option only needs to be changed in unusual deployments. It has to be changed if deploying as static site, for instance.| -|`catalogIndexUrl`|no|**string**||URL of the JSON file that contains index of catalog. See [CatalogIndex](#catalogindex)| +|`catalogIndexUrl`|no|**string**||URL of the JSON file that contains index of catalog. See [CatalogIndex](search-providers.md#catalogindex)| |`conversionServiceBaseUrl`|no|**string**|`"convert/"`|URL of OGR2OGR conversion service (part of TerriaJS-Server). This option only needs to be changed in unusual deployments. It has to be changed if deploying as static site, for instance.| |`proj4ServiceBaseUrl`|no|**string**|`"proj4def/"`|URL of Proj4 projection lookup service (part of TerriaJS-Server). This option only needs to be changed in unusual deployments. It has to be changed if deploying as static site, for instance.| |`corsProxyBaseUrl`|no|**string**|`"proxy/"`|URL of CORS proxy service (part of TerriaJS-Server). This option only needs to be changed in unusual deployments. It has to be changed if deploying as static site, for instance.| @@ -90,7 +90,7 @@ Specifies various options for configuring TerriaJS: |feedbackMinLength|no|**number**|0|Minimum length of feedback comment.| |`theme`|no|**any**|`{}`|An object used to override theme properties - for example `{"logoHeight": "70px"}`.| |`searchBar`|no|**[SearchBar](#searchbar)**|`new SearchBar()`|Search bar configuration| -|`searchProviders`|no|**[SearchProviders](#searchbarproviders)|`[]`|Search providers that will be used for search| +|`searchProviders`|no|**[SearchProviders](search-providers.md)|`[]`|Search providers that will be used for search| ### MagdaReferenceHeaders @@ -182,31 +182,6 @@ Configuration of items to appear in the search bar *** -### CatalogIndex - -If your TerriaMap has many (>50) dynamic groups (groups which need to be loaded - for example CKAN, WMS-group...) it may be worth generating a static catalog index JSON file. This file will contain ID, name and description fields of all catalog items, which can be used to search through the catalog very quickly without needing to load dynamic groups. - -The https://github.com/nextapps-de/flexsearch library is used to index and search the catalog index file. - -**Note** NodeJS v10 is not supported, please use v12 or v14. - -To generate the catalog index: - -- `npm run build-tools` -- `node .\build\generateCatalogIndex.js config-url base-url` where - - `config-url` is URL to client-side-config file - - `base-url` is URL to terriajs-server (this is used to load `server-config` and to proxy requests) - - For example `node .\build\generateCatalogIndex.js http://localhost:3001/config.json http://localhost:3001` -- This will output two files - - `catalog-index.json` - - `catalog-index-errors.json` with any error messages which occurred while loading catalog members -- Set `catalogIndexUrl` config parameter - -This file will have to be re-generated manually every time the catalog structure changes - for example: - -- if items are renamed, or moved -- dynamic groups are updated (for example, WMS server publishes new layers) - ### SearchBar Configuration for the search bar. Some of the values will be used as default for diff --git a/doc/customizing/search-providers.md b/doc/customizing/search-providers.md new file mode 100644 index 00000000000..f2d9fa6935e --- /dev/null +++ b/doc/customizing/search-providers.md @@ -0,0 +1,127 @@ +# Search providers + +Terriajs supports 2 types of search providers + +1. Catalog search provider +2. Location search providers + +Each search provider can be configured using following options + +|Name|Required|Type|Default|Description| +|----|--------|----|-------|-----------| +|name|no|**string**|`unknown`|Name of the search provider.| +|minCharacters|no|**number**|`catalogParameters.searchBar.minCharacters`|Minimum number of characters required for search to start.| + +## Catalog search provider + +`type: catalog-search-provider` + +Catalog search provider is used to find the desired dataset. Catalog search provider can be used with or without static catalog index JSON file. Without catalog index each catalog group and item will be dynamically fetched from remote servers in the moment of the search, and for bigger catalog this will cause poor performance of search. For example when having WMS-group in catalog searching in that catalog will cause catalog to issue `getCapabilities` request, wait for response and then perform the search. TerriaJS supports only search provider of type `catalog-search-provider` + +### CatalogIndex + +If your TerriaMap has many (>50) dynamic groups (groups which need to be loaded - for example CKAN, WMS-group...) it may be worth generating a static catalog index JSON file. This file will contain ID, name and description fields of all catalog items, which can be used to search through the catalog very quickly without needing to load dynamic groups. + +The [flexsearch](https://github.com/nextapps-de/flexsearch) library is used to index and search the catalog index file. + +**Note** NodeJS v10 is not supported, please use v12 or v14. + +To generate the catalog index: + +- `npm run build-tools` +- `node .\build\generateCatalogIndex.js config-url base-url` where + - `config-url` is URL to client-side-config file + - `base-url` is URL to terriajs-server (this is used to load `server-config` and to proxy requests) + - For example `node .\build\generateCatalogIndex.js http://localhost:3001/config.json http://localhost:3001` +- This will output two files + - `catalog-index.json` + - `catalog-index-errors.json` with any error messages which occurred while loading catalog members +- Set `catalogIndexUrl` config parameter + +This file will have to be re-generated manually every time the catalog structure changes - for example: + +- if items are renamed, or moved +- dynamic groups are updated (for example, WMS server publishes new layers) + +## Location search providers + +Location search providers are used to search for locations on the map. TerriaJS currently supports two implementations of search providers: + +- [`BingMapsSearchProvider`](#bingmapssearchprovider) - implementation which in background uses Bing Map search API +- [`AustralianGazetteerSearchProvider`](#australiangazetteersearchprovider) - uses `WebFeatureServiceSearchProvider` + +Each `LocationSearchProvider support following confing options + +|Name|Required|Type|Default|Description| +|----|--------|----|-------|-----------| +|url|yes|**string**|`""`|The URL of search provider.| +|recommendedListLength|no|**number**|`5`|Default amount of entries in the suggestion list.| +|flightDurationSeconds|no|**number**|`1.5`|Time to move to the result location.| +|isOpen|no|**boolean**|`true`|True if the search results of this search provider are visible by default; otherwise, false (user manually open search results).| + +### BingMapsSearchProvider + +`type: bing-maps-search-provider` + +Bing maps search provider is based on commercial API which is provided by BingMaps. To enable it, it is necessary to add an apropriate Bing Maps API key as config parameter. This search provider as results returns addresses and a place name locations. + +|Name|Required|Type|Default|Description| +|----|--------|----|-------|-----------| +|`key`|no|**string**|`configParameters.bingMapsKey`|The Bing Maps key.| +|primaryCountry|no|**string**|`Australia`|Name of the country to prioritize the search results.| +|`culture`|no|**string**|`en-au`|Use the culture parameter to specify a culture for your request.The culture parameter provides the result in the language of the culture. For a list of supported cultures, see [Supported Culture Codes](https://docs.microsoft.com/en-us/bingmaps/rest-services/common-parameters-and-types/supported-culture-codes)| +|`mapCenter`|no|**boolean**|`true`|Whether the current location of the map center is supplied with search request| + +It provides a default value for `url: https://dev.virtualearth.net/` + +**Example** + +```json +{ + "id": "search-provider/bing-maps", + "type": "bing-maps-search-provider", + "name": "translate#viewModels.searchLocations", + "url": "https://dev.virtualearth.net/", + "flightDurationSeconds": 1.5, + "minCharacters": 5, + "isOpen": true +}, +``` + +### AustralianGazetteerSearchProvider + +`type: australian-gazetteer-search-provider` + +Australian gazzetteer search provider is based on web feature service that uses an official place names of Australia. It is based on `WebFeatureServiceProvider`. +It can be configured using following options + +|Name|Required|Type|Default|Description| +|----|--------|----|-------|-----------| +|`searchPropertyName`|yes|**string**|`undefined`|Which property to look for the search text in| +|`searchPropertyTypeName`|yes|**string**|`undefined`|Type of the properties to search| + +**Example** + +```json +{ + "id": "search-provider/australian-gazetteer", + "type": "australian-gazetteer-search-provider", + "name": "translate#viewModels.searchPlaceNames", + "url": "http://services.ga.gov.au/gis/services/Australian_Gazetteer/MapServer/WFSServer", + "searchPropertyName": "Australian_Gazetteer:NameU", + "searchPropertyTypeName": "Australian_Gazetteer:Gazetteer_of_Australia", + "flightDurationSeconds": 1.5, + "minCharacters": 3, + "recommendedListLength": 3, + "isOpen": false +} +``` + +### Implementing new location search provider + +Implementing new location search provider is similar to implementing new `CatalogItems` and `CatalogGroups`. Each of them should be based on the usage of one of the mixins + +- `LocationSearchProviderMixin` - should be used for API based location search providers. Example of such search provider is `BingMapSearchProvider`. +- `WebFeatureServiceSearchProviderMixin` - should be used for location search providers that will rely on data provided by `WebFeatureService`. Example of such search provider is `AustralianGazetteerSearchProvider`. + +Each new `SearchProvider` should be registered inside `registerSearchProvider` so they can be properly upserted from json definition provider in config file. diff --git a/doc/mkdocs.yml b/doc/mkdocs.yml index 638656a8038..3a7e4b8d141 100644 --- a/doc/mkdocs.yml +++ b/doc/mkdocs.yml @@ -17,6 +17,7 @@ nav: - Server-side Config: customizing/server-side-config.md - Skinning: customizing/skinning.md - Translation guide: customizing/translation-guide.md + - Search Providers: customizing/search-providers.md - Connecting to Data: - Overview: connecting-to-data/README.md - Cross-Origin Resource Sharing: connecting-to-data/cross-origin-resource-sharing.md From 0241915b10d94ec3adaf4214bc720f3f835e1210 Mon Sep 17 00:00:00 2001 From: Stephen Davies Date: Tue, 19 Jul 2022 17:03:43 +1000 Subject: [PATCH 040/654] Improve old changelog message --- CHANGES.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGES.md b/CHANGES.md index 475733b2e5d..41be7c3b7fe 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -159,7 +159,7 @@ Change Log * Multiple changes to `GtfsCatalogItem`: * Removed `apiKey` in favour of more general `headers` * Removed unused `bearingDirectionProperty` & `compassDirectionProperty` - * `image` is no longer resolved relative to the TerriaJS asset folder. This will allow using relative URLs for assets that aren't inside the TerriaJS asset folder. Any relative `image` urls should now have "build/TerriaJS/" prepended (the value of `terria.baseUrl`). + * `image` is no longer resolved relative to the TerriaJS asset folder. This will allow using relative URLs for assets that aren't inside the TerriaJS asset folder. Prepend "build/TerriaJS/" (the value of `terria.baseUrl`) to any existing relative `image` urls. * Added `colorModelsByProperty` to `GtfsCatalogItem` which will colour 1 model differently for different vehichles based on properties matched by regular expression. E.g. colour a vehicle model by which train line the vehicle is travelling on. * Fixed a bug where cross-origin billboard images threw errors in Leaflet mode when trying to recolour the image. * Changed rounding of the numbers of the countdown timer in the workbench UI for items that use polling. The timer wil now show 00:00 for at most 500ms (instead of a full second). This means that for timers that are a multiple of 1000ms the timer will now show 00:01 for the last second before polling, instead of 00:00. From 5c661d413909650e9eec70654e8bb011a3d3b4f9 Mon Sep 17 00:00:00 2001 From: Stephen Davies Date: Tue, 19 Jul 2022 17:08:25 +1000 Subject: [PATCH 041/654] Capitalise HTTPS in message --- wwwroot/languages/en/translation.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/wwwroot/languages/en/translation.json b/wwwroot/languages/en/translation.json index c909551219f..664bd0daefe 100644 --- a/wwwroot/languages/en/translation.json +++ b/wwwroot/languages/en/translation.json @@ -62,7 +62,7 @@ "browserCannotProvide": "Your browser cannot provide your location.", "myLocation": "My Location", "location": "Location", - "originError": "Your browser can only provide your location when using https. You may be able to use {{secureUrl}} instead.", + "originError": "Your browser can only provide your location when using HTTPS. You may be able to use {{secureUrl}} instead.", "centreMap": "Centre map at your current location" }, "splitterTool": { @@ -618,7 +618,6 @@ "loader": { "loadingMessage": "Loading" }, - "emptyWorkbenchMessage": "<0><0>Your workbench is empty<1>Click '$t(addData.addDataBtnText)' above to <2><0>Browse the Data Catalogue<1>Load your own data onto the map<3><0>TIP.<2>All your active data sets will be listed here", "emptyWorkbench": { "emptyArea": "Your workbench is empty", "helpfulHints": "Helpful hints", From d0722a2e99b325265df222b36bcf3710d417a339 Mon Sep 17 00:00:00 2001 From: Stephen Davies Date: Tue, 19 Jul 2022 17:08:54 +1000 Subject: [PATCH 042/654] Fixup main page --- doc/README.md | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-) diff --git a/doc/README.md b/doc/README.md index b84f33f08f7..3a21f6f8b1c 100644 --- a/doc/README.md +++ b/doc/README.md @@ -1,19 +1,5 @@ [TerriaJS](http://terria.io) is an open-source framework for web-based geospatial catalog explorers. -The documentation on this site is for applications using TerriaJS version 8. If you are still maintaining an application using TerriaJS version 7 or lower go to [docs-v7.terria.io](https://docs-v7.terria.io). - -**Most of these docs were written for TerriaJS version <= 7. We're working on updating these docs, however it will take us some time. For the time being these parts are probably the most useful:** - -* [Migration Guide](contributing/migration-guide.md): A migration guide for map builders who maintain a version 7 map and wish to upgrade. -* [v8 Catalog Items](connecting-to-data/catalog-items.md): Generated documentation on all version 8 Catalog Items. -* [v8 Catalog Groups](connecting-to-data/catalog-groups.md): Generated documentation on all version 8 Catalog Groups. -* [v8 Catalog Functions](connecting-to-data/catalog-functions.md): Generated documentation on all version 8 Catalog Function. -* [Getting Started](getting-started.md): Quick start guide to building your first TerriaJS application. Updated for version 8. -* [Deploying](deploying/README.md): Deploy a TerriaJS application in simple and advanced scenarios. Updated for version 8. -* [Frontend Style Guide](contributing/frontend-style-guide.md): A style guide for writing/updating .jsx/.tsx React views for TerriaJS. Some React components have been updated in accordance to this style guide but many have not yet. - -Partially updated docs: - * [Getting Started](getting-started.md): Quick start guide to building your first TerriaJS application. * [Customizing](customizing/README.md): Configure and tweak a TerriaJS application, including skinning and setting up the catalog. * [Connecting to Data](connecting-to-data/README.md): Connect TerriaJS to your servers and data. @@ -22,6 +8,10 @@ Partially updated docs: Looking for help using a TerriaJS-based site? Try the [Terria Platforms User Guide](https://userguide.terria.io/). +!!! note + + The documentation on this site is for applications using TerriaJS version 8. If you are still maintaining an application using TerriaJS version 7 or lower go to [docs-v7.terria.io](https://docs-v7.terria.io). + This documentation is maintained at [github.com/TerriaJS/TerriaJS/tree/main/doc](https://github.com/TerriaJS/TerriaJS/tree/main/doc). It can be viewed at [docs.terria.io](https://docs.terria.io). From bfb0aecf022192ec01873c5d9b213eab2e596e2d Mon Sep 17 00:00:00 2001 From: Stephen Davies Date: Tue, 19 Jul 2022 17:09:19 +1000 Subject: [PATCH 043/654] WIP add docker & without docker documentation --- doc/customizing/without-docker.md | 103 +++++++++++++++++++++++++++++ doc/getting-started.md | 106 ++---------------------------- 2 files changed, 109 insertions(+), 100 deletions(-) create mode 100644 doc/customizing/without-docker.md diff --git a/doc/customizing/without-docker.md b/doc/customizing/without-docker.md new file mode 100644 index 00000000000..2988df28e0c --- /dev/null +++ b/doc/customizing/without-docker.md @@ -0,0 +1,103 @@ +### Quick Start + +If you've done this sort of thing before, you'll find it easy to clone and build TerriaMap with these quick instructions: + +```bash +git clone https://github.com/TerriaJS/TerriaMap.git + +cd TerriaMap + +export NODE_OPTIONS=--max_old_space_size=4096 + +npm install -g yarn + +yarn install && yarn gulp && yarn start + +# Open at http://localhost:3001 +``` + +If you run into trouble or want more explanation, read on. + +### Prerequisites + +TerriaJS can be built and run on almost any macOS, Linux, or Windows system. The following are required to build TerriaJS: + +* The Bash command shell. On macOS or Linux you almost certainly already have this. On Windows, you can easily get it by installing [Git for Windows](https://gitforwindows.org/). In the instructions below, we assume you're using a Bash command prompt. +* [Node.js](https://nodejs.org) v12.0 or later. You can check your node version by running `node --version` on the command-line. +* [npm](https://www.npmjs.com/) v6.0 or later. npm is usually installed automatically alongside the above. You can check your npm version by running `npm --version`. +* [yarn](https://yarnpkg.com/) v1.19.0 or later. This can be installed using `npm install -g yarn@^1.19.0` + +### Cloning TerriaMap + +The latest version of TerriaMap is on [GitHub](https://github.com), and the preferred way to get it is by using `git`: + +```bash +git clone https://github.com/TerriaJS/TerriaMap.git + +cd TerriaMap +``` + +If you're unable to use git, you can also [download a ZIP file](https://github.com/TerriaJS/TerriaMap/archive/main.zip) and extract it somewhere on your system. We recommend using git, though, because it makes it much easier to update to later versions in the future. + +### Increase NodeJS memory limit + +To avoid running out of memory when installing dependencies and building TerriaMap, increase the memory limit of node: + +```bash +export NODE_OPTIONS=--max_old_space_size=4096 +``` + +### Installing Dependencies + +All of the dependencies required to build and run TerriaMap, other than the prerequisites listed above, are installed using `yarn`: + +```bash +yarn install +``` + +The dependencies are installed in the `node_modules` subdirectory. No global changes are made to your system. + +### Building TerriaMap + +Do a standard build of TerriaMap with: + +```bash +yarn gulp +``` + +Or, you can create a minified release build with: + +```bash +yarn gulp release +``` + +To watch for changes and automatically do an incremental build when any are detected, use: + +```bash +yarn gulp watch +``` + +`yarn gulp` simply runs `gulp`, so you can use that directly if you prefer (run `npm install -g gulp-cli` to install it globally). + +The full set of `gulp` tasks can be found on the [Development Environment](contributing/development-environment.md#terriamap-gulp-tasks) page. + +### Running TerriaMap + +TerriaMap includes a simple Node.js-based web server, called [terriajs-server](https://github.com/TerriaJS/terriajs-server). To start it, run: + +```bash +yarn start +``` + +Then, open a web browser on `http://localhost:3001` to use TerriaMap. + +### Keeping up with Updates + +If you're building an application by using TerriaMap as a starting point, you will want to keep in sync as TerriaMap is improved and updated to use new versions of TerriaJS. Forking the TerriaMap repo and using git to keep it in sync is outside the scope of this document, but GitHub has a [nice explanation](https://help.github.com/articles/fork-a-repo/). + +After pulling new changes, you will need to run `yarn install` again to pick up any changed dependencies and then build TerriaMap. If you have problems building or running, it is sometimes helpful to remove and reinstall the dependencies from npm: + +```bash +rm -rf node_modules +yarn install +``` \ No newline at end of file diff --git a/doc/getting-started.md b/doc/getting-started.md index 0cd5e88472e..b9273e04fa0 100644 --- a/doc/getting-started.md +++ b/doc/getting-started.md @@ -1,112 +1,18 @@ The easiest way to get started with TerriaJS is to use [TerriaMap](https://github.com/TerriaJS/TerriaMap). TerriaMap is a full-featured application built on TerriaJS, ready to be customized with your own branding and catalog. It is also a great starting point for more in-depth customization. -This guide explains how to build and run TerriaMap locally. See [Deploying](deploying/README.md) to learn how to deploy it for use by others. - -You may also be interested in how to [make your own map without writing any code](http://stevebennett.me/2015/07/02/your-own-personal-national-map-with-terriajs-no-coding-and-nothing-to-deploy/). - -### Quick Start - -If you've done this sort of thing before, you'll find it easy to clone and build TerriaMap with these quick instructions: +This guide explains how to build and run TerriaMap locally using docker. See: +* [Building TerriaMap](customizing/building-terriamap.md) to learn how to +* See [Deploying](deploying/README.md) to learn how to deploy it for use by others. ```bash -git clone https://github.com/TerriaJS/TerriaMap.git - -cd TerriaMap - -export NODE_OPTIONS=--max_old_space_size=4096 - -npm install -g yarn - -yarn install && yarn gulp && yarn start - -# Open at http://localhost:3001 +docker run -p 3001:3001 ghcr.io/terriajs/terriamap ``` -If you run into trouble or want more explanation, read on. - -### Prerequisites - -TerriaJS can be built and run on almost any macOS, Linux, or Windows system. The following are required to build TerriaJS: - -* The Bash command shell. On macOS or Linux you almost certainly already have this. On Windows, you can easily get it by installing [Git for Windows](https://gitforwindows.org/). In the instructions below, we assume you're using a Bash command prompt. -* [Node.js](https://nodejs.org) v12.0 or later. You can check your node version by running `node --version` on the command-line. -* [npm](https://www.npmjs.com/) v6.0 or later. npm is usually installed automatically alongside the above. You can check your npm version by running `npm --version`. -* [yarn](https://yarnpkg.com/) v1.19.0 or later. This can be installed using `npm install -g yarn@^1.19.0` +To customise -### Cloning TerriaMap - -The latest version of TerriaMap is on [GitHub](https://github.com), and the preferred way to get it is by using `git`: - -```bash -git clone https://github.com/TerriaJS/TerriaMap.git - -cd TerriaMap -``` - -If you're unable to use git, you can also [download a ZIP file](https://github.com/TerriaJS/TerriaMap/archive/main.zip) and extract it somewhere on your system. We recommend using git, though, because it makes it much easier to update to later versions in the future. - -### Increase NodeJS memory limit - -To avoid running out of memory when installing dependencies and building TerriaMap, increase the memory limit of node: - -```bash -export NODE_OPTIONS=--max_old_space_size=4096 -``` - -### Installing Dependencies - -All of the dependencies required to build and run TerriaMap, other than the prerequisites listed above, are installed using `yarn`: - -```bash -yarn install -``` +## Without Docker -The dependencies are installed in the `node_modules` subdirectory. No global changes are made to your system. -### Building TerriaMap - -Do a standard build of TerriaMap with: - -```bash -yarn gulp -``` - -Or, you can create a minified release build with: - -```bash -yarn gulp release -``` - -To watch for changes and automatically do an incremental build when any are detected, use: - -```bash -yarn gulp watch -``` - -`yarn gulp` simply runs `gulp`, so you can use that directly if you prefer (run `npm install -g gulp-cli` to install it globally). - -The full set of `gulp` tasks can be found on the [Development Environment](contributing/development-environment.md#terriamap-gulp-tasks) page. - -### Running TerriaMap - -TerriaMap includes a simple Node.js-based web server, called [terriajs-server](https://github.com/TerriaJS/terriajs-server). To start it, run: - -```bash -yarn start -``` - -Then, open a web browser on `http://localhost:3001` to use TerriaMap. - -### Keeping up with Updates - -If you're building an application by using TerriaMap as a starting point, you will want to keep in sync as TerriaMap is improved and updated to use new versions of TerriaJS. Forking the TerriaMap repo and using git to keep it in sync is outside the scope of this document, but GitHub has a [nice explanation](https://help.github.com/articles/fork-a-repo/). - -After pulling new changes, you will need to run `yarn install` again to pick up any changed dependencies and then build TerriaMap. If you have problems building or running, it is sometimes helpful to remove and reinstall the dependencies from npm: - -```bash -rm -rf node_modules -yarn install -``` ### Having trouble? From f659bf38610310ff063e9bdbad378688cf61850d Mon Sep 17 00:00:00 2001 From: Zoran Kokeza Date: Sat, 6 Aug 2022 11:45:30 +0200 Subject: [PATCH 044/654] fix: move map credits to map column so chart don't hide it --- CHANGES.md | 2 ++ lib/ReactViews/StandardUserInterface/MapColumn.jsx | 11 +++++++++++ .../StandardUserInterface/StandardUserInterface.tsx | 8 +------- 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index bd44995d8c8..2ee195934b9 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -23,6 +23,8 @@ Change Log * Fix `SearchBoxAndResults` Trans values * Fix `generateCatalogIndex` for nested references * Fix `SearchBox` handling of `searchWithDebounce` when `debounceDuration` prop changes. It now fushes instead of cancels. +* Move map credits to map column so it don't get hidden by chart panel +* [The next improvement] #### release 8.2.10 - 2022-08-02 diff --git a/lib/ReactViews/StandardUserInterface/MapColumn.jsx b/lib/ReactViews/StandardUserInterface/MapColumn.jsx index f1eb25f7433..037a2b31bbe 100644 --- a/lib/ReactViews/StandardUserInterface/MapColumn.jsx +++ b/lib/ReactViews/StandardUserInterface/MapColumn.jsx @@ -6,6 +6,7 @@ import React from "react"; import { withTranslation } from "react-i18next"; import FeatureDetection from "terriajs-cesium/Source/Core/FeatureDetection"; import BottomDock from "../BottomDock/BottomDock"; +import { MapCredits } from "../Credits"; import Loader from "../Loader"; import BottomLeftBar from "../Map/BottomLeftBar/BottomLeftBar"; import DistanceLegend from "../Map/Legend/DistanceLegend"; @@ -117,6 +118,16 @@ const MapColumn = observer( /> +
    = observer( allBaseMaps={allBaseMaps} animationDuration={animationDuration} /> -
    From 642b1d5b4a6371bbe00b18d3ae8227da49f0e0aa Mon Sep 17 00:00:00 2001 From: Zoran Kokeza Date: Mon, 8 Aug 2022 10:55:53 +0200 Subject: [PATCH 045/654] feat: tsify map column and reorganize some of the components --- lib/Models/Terria.ts | 2 +- lib/ReactViewModels/MouseCoords.ts | 10 +- lib/ReactViews/BottomDock/BottomDock.tsx | 6 +- .../ContextProviders.tsx | 2 +- .../ViewStateContext.tsx | 0 lib/ReactViews/Context/index.ts | 2 + lib/ReactViews/Credits/index.ts | 2 - lib/ReactViews/Custom/ExternalLink.tsx | 2 +- lib/ReactViews/Disclaimer.jsx | 2 +- lib/ReactViews/DragDropFile.tsx | 5 +- lib/ReactViews/DragDropNotification.jsx | 2 +- .../ExplorerWindow/ExplorerWindow.tsx | 2 +- .../FeatureInfo/FeatureInfoPanel.jsx | 2 +- lib/ReactViews/Feedback/FeedbackForm.tsx | 5 +- .../HelpScreens/SatelliteHelpPrompt.jsx | 2 +- lib/ReactViews/Map/BottomBar/BottomBar.tsx | 31 +++ .../{ => Map/BottomBar}/Credits/Credit.tsx | 2 +- .../BottomBar}/Credits/Credit.type.ts | 0 .../{ => Map/BottomBar}/Credits/Credits.tsx | 0 .../BottomBar}/Credits/CreditsContainer.tsx | 12 +- .../DataAttribution/DataAttributionModal.tsx | 15 +- .../BottomBar/Credits}/MapCreditLogo.tsx | 6 +- .../BottomBar/Credits}/MapCredits.tsx | 14 +- .../{ => Map/BottomBar}/Credits/Spacer.tsx | 0 .../BottomBar}/Credits/TerriaLogo.tsx | 4 +- lib/ReactViews/Map/BottomBar/Credits/index.ts | 2 + .../Map/BottomBar/DistanceLegend.tsx | 243 ++++++++++++++++++ lib/ReactViews/Map/BottomBar/LocationBar.tsx | 88 +++++++ lib/ReactViews/Map/BottomBar/index.ts | 1 + .../Map/BottomLeftBar/BottomLeftBar.tsx | 34 ++- .../Map/HelpButton/help-button.scss | 4 - lib/ReactViews/Map/Legend/DistanceLegend.jsx | 233 ----------------- lib/ReactViews/Map/Legend/LocationBar.jsx | 82 ------ lib/ReactViews/Map/Legend/legend.scss | 75 ------ lib/ReactViews/Map/Legend/legend.scss.d.ts | 15 -- lib/ReactViews/Map/MapColumn.tsx | 136 ++++++++++ .../CollapsedNavigation.tsx} | 24 +- .../Items/AugmentedVirtualityTool.tsx | 0 .../Items/CatalogShortcut.jsx | 0 .../Items/CloseToolButton.tsx | 19 +- .../Items/Compass}/Compass.tsx | 50 ++-- .../Items/Compass}/GyroscopeGuidance.jsx | 18 +- .../Map/MapNavigation/Items/Compass/index.ts | 1 + .../Items/MapNavigationItem.tsx | 4 +- .../Items/MeasureTool.ts | 2 +- .../Items/MyLocation.ts | 4 +- .../Items/ToggleSplitterTool.ts | 0 .../Items/ToolButton.tsx | 0 .../Items/ZoomControl.tsx | 7 +- .../Map/MapNavigation/Items/index.ts | 14 + .../MapNavigation.tsx | 34 +-- .../filterViewerAndScreenSize.ts | 25 ++ lib/ReactViews/Map/MapNavigation/index.ts | 2 + .../registerMapNavigations.tsx | 20 +- .../{ => MenuBar}/HelpButton/HelpButton.tsx | 8 +- .../Map/MenuBar/HelpButton/help-button.scss | 4 + .../HelpButton/help-button.scss.d.ts | 0 lib/ReactViews/Map/{ => MenuBar}/MenuBar.jsx | 11 +- .../{ => MenuBar}/StoryButton/StoryButton.tsx | 14 +- .../Map/MenuBar/StoryButton/story-button.scss | 13 + .../StoryButton/story-button.scss.d.ts | 0 .../Map/{ => MenuBar}/menu-bar.scss | 12 +- .../Map/{ => MenuBar}/menu-bar.scss.d.ts | 0 .../Map/Navigation/FullScreenButton.jsx | 60 ----- .../Map/Panels/HelpPanel/HelpPanel.jsx | 2 +- .../Map/Panels/HelpPanel/HelpPanelItem.jsx | 2 +- .../Map/Panels/LangPanel/LangPanel.tsx | 2 +- .../Map/Panels/SharePanel/Print/PrintView.tsx | 16 +- lib/ReactViews/Map/ProgressBar.jsx | 105 -------- lib/ReactViews/Map/ProgressBar.tsx | 90 +++++++ lib/ReactViews/Map/Splitter.jsx | 230 ----------------- .../Map/StoryButton/story-button.scss | 13 - lib/ReactViews/Map/TerriaViewerWrapper.jsx | 57 ---- .../TerriaViewerWrapper/Splitter/Splitter.tsx | 102 ++++++++ .../TerriaViewerWrapper/Splitter/dragHook.ts | 166 ++++++++++++ .../TerriaViewerWrapper.tsx | 84 ++++++ .../Map/TerriaViewerWrapper/index.ts | 1 + .../{StandardUserInterface => Map}/Toast.tsx | 0 lib/ReactViews/Map/experimental-features.scss | 22 -- .../Map/experimental-features.scss.d.ts | 9 - lib/ReactViews/Map/progress-bar.scss | 31 --- lib/ReactViews/Map/progress-bar.scss.d.ts | 12 - lib/ReactViews/Map/splitter.scss | 42 --- lib/ReactViews/Map/splitter.scss.d.ts | 10 - lib/ReactViews/Map/terria-viewer-wrapper.scss | 57 ---- .../Map/terria-viewer-wrapper.scss.d.ts | 10 - lib/ReactViews/Mobile/MobileHeader.jsx | 4 +- lib/ReactViews/Mobile/MobileMenu.jsx | 1 - .../Notification/MapInteractionWindow.tsx | 2 +- lib/ReactViews/Notification/Notification.tsx | 2 +- lib/ReactViews/SidePanel/Branding.tsx | 2 +- lib/ReactViews/SidePanel/FullScreenButton.jsx | 2 +- lib/ReactViews/SidePanel/SidePanel.tsx | 6 +- .../ExperimentalFeatures.tsx | 4 +- .../GlobalTerriaStyles.ts | 15 ++ .../StandardUserInterface/MapColumn.jsx | 219 ---------------- .../SidePanelContainer.tsx | 2 +- .../StandardUserInterface.tsx | 21 +- .../TrainerBar/TrainerBar.tsx | 5 +- .../WorkflowPanelContainer.tsx | 4 +- .../customizable}/MenuButton.jsx | 2 +- .../customizable/MenuItem.jsx | 2 +- .../customizable}/menu-button.scss | 4 +- .../customizable}/menu-button.scss.d.ts | 0 lib/ReactViews/StandardUserInterface/index.ts | 5 + .../StandardUserInterface/map-column.scss | 99 ------- .../map-column.scss.d.ts | 29 --- lib/ReactViews/Story/StoryBuilder.tsx | 5 +- .../Story/StoryPanel/StoryPanel.tsx | 7 +- lib/ReactViews/Tools/DiffTool/DiffTool.tsx | 3 +- .../Tools/PedestrianMode/PedestrianMode.tsx | 2 +- lib/ReactViews/Tools/Tool.tsx | 2 +- lib/ReactViews/Tour/TourPortal.jsx | 2 +- .../WelcomeMessage/WelcomeMessage.jsx | 2 +- .../{Map/Panels => Workbench}/TerrainSide.tsx | 14 +- .../Workbench/WorkbenchSplitScreen.tsx | 2 +- .../Workflow/SelectableDimensionWorkflow.tsx | 2 +- lib/Styled/Text.tsx | 9 +- .../terriajs-cesium-extra/index.d.ts | 1 + test/Map/StyledHtmlSpec.tsx | 2 +- test/ReactViews/ClipboardSpec.tsx | 2 +- .../DimensionSelectorSectionSpec.tsx | 2 +- test/ReactViews/Generic/PromptSpec.tsx | 2 +- .../Map/Navigation/Compass/CompassSpec.tsx | 6 +- .../Compass}/GyroscopeGuidanceSpec.tsx | 8 +- .../Map/Panels/HelpPanel/VideoGuideSpec.tsx | 2 +- test/ReactViews/MeasureToolSpec.jsx | 2 +- test/ReactViews/Preview/DescriptionSpec.tsx | 2 +- test/ReactViews/Search/BreadcrumbsSpec.tsx | 2 +- .../Search/SearchBoxAndResultsSpec.tsx | 2 +- test/ReactViews/Search/SearchBoxSpec.tsx | 2 +- test/ReactViews/ShortReportSpec.tsx | 2 +- .../TrainerBar/TrainerBarSpec.tsx | 2 +- .../TrainerBar/test-help-content.js | 0 test/ReactViews/WarningBoxSpec.tsx | 2 +- test/ReactViews/withContext.tsx | 4 +- 136 files changed, 1261 insertions(+), 1716 deletions(-) rename lib/ReactViews/{StandardUserInterface => Context}/ContextProviders.tsx (91%) rename lib/ReactViews/{StandardUserInterface => Context}/ViewStateContext.tsx (100%) create mode 100644 lib/ReactViews/Context/index.ts delete mode 100644 lib/ReactViews/Credits/index.ts create mode 100644 lib/ReactViews/Map/BottomBar/BottomBar.tsx rename lib/ReactViews/{ => Map/BottomBar}/Credits/Credit.tsx (89%) rename lib/ReactViews/{ => Map/BottomBar}/Credits/Credit.type.ts (100%) rename lib/ReactViews/{ => Map/BottomBar}/Credits/Credits.tsx (100%) rename lib/ReactViews/{ => Map/BottomBar}/Credits/CreditsContainer.tsx (62%) rename lib/ReactViews/{ => Map/BottomBar}/Credits/DataAttribution/DataAttributionModal.tsx (86%) rename lib/ReactViews/{Credits/MapCredits => Map/BottomBar/Credits}/MapCreditLogo.tsx (75%) rename lib/ReactViews/{Credits/MapCredits => Map/BottomBar/Credits}/MapCredits.tsx (84%) rename lib/ReactViews/{ => Map/BottomBar}/Credits/Spacer.tsx (100%) rename lib/ReactViews/{ => Map/BottomBar}/Credits/TerriaLogo.tsx (71%) create mode 100644 lib/ReactViews/Map/BottomBar/Credits/index.ts create mode 100644 lib/ReactViews/Map/BottomBar/DistanceLegend.tsx create mode 100644 lib/ReactViews/Map/BottomBar/LocationBar.tsx create mode 100644 lib/ReactViews/Map/BottomBar/index.ts delete mode 100644 lib/ReactViews/Map/HelpButton/help-button.scss delete mode 100644 lib/ReactViews/Map/Legend/DistanceLegend.jsx delete mode 100644 lib/ReactViews/Map/Legend/LocationBar.jsx delete mode 100644 lib/ReactViews/Map/Legend/legend.scss delete mode 100644 lib/ReactViews/Map/Legend/legend.scss.d.ts create mode 100644 lib/ReactViews/Map/MapColumn.tsx rename lib/ReactViews/Map/{Navigation/Items/OverflowNavigationItem.tsx => MapNavigation/CollapsedNavigation.tsx} (84%) rename lib/ReactViews/Map/{Navigation => MapNavigation}/Items/AugmentedVirtualityTool.tsx (100%) rename lib/ReactViews/Map/{Navigation => MapNavigation}/Items/CatalogShortcut.jsx (100%) rename lib/ReactViews/Map/{Navigation => MapNavigation}/Items/CloseToolButton.tsx (65%) rename lib/ReactViews/Map/{Navigation/Items => MapNavigation/Items/Compass}/Compass.tsx (94%) rename lib/ReactViews/{GyroscopeGuidance => Map/MapNavigation/Items/Compass}/GyroscopeGuidance.jsx (91%) create mode 100644 lib/ReactViews/Map/MapNavigation/Items/Compass/index.ts rename lib/ReactViews/Map/{Navigation => MapNavigation}/Items/MapNavigationItem.tsx (94%) rename lib/ReactViews/Map/{Navigation => MapNavigation}/Items/MeasureTool.ts (99%) rename lib/ReactViews/Map/{Navigation => MapNavigation}/Items/MyLocation.ts (98%) rename lib/ReactViews/Map/{Navigation => MapNavigation}/Items/ToggleSplitterTool.ts (100%) rename lib/ReactViews/Map/{Navigation => MapNavigation}/Items/ToolButton.tsx (100%) rename lib/ReactViews/Map/{Navigation => MapNavigation}/Items/ZoomControl.tsx (97%) create mode 100644 lib/ReactViews/Map/MapNavigation/Items/index.ts rename lib/ReactViews/Map/{Navigation => MapNavigation}/MapNavigation.tsx (90%) create mode 100644 lib/ReactViews/Map/MapNavigation/filterViewerAndScreenSize.ts create mode 100644 lib/ReactViews/Map/MapNavigation/index.ts rename lib/ReactViews/Map/{Navigation => MapNavigation}/registerMapNavigations.tsx (92%) rename lib/ReactViews/Map/{ => MenuBar}/HelpButton/HelpButton.tsx (86%) create mode 100644 lib/ReactViews/Map/MenuBar/HelpButton/help-button.scss rename lib/ReactViews/Map/{ => MenuBar}/HelpButton/help-button.scss.d.ts (100%) rename lib/ReactViews/Map/{ => MenuBar}/MenuBar.jsx (91%) rename lib/ReactViews/Map/{ => MenuBar}/StoryButton/StoryButton.tsx (88%) create mode 100644 lib/ReactViews/Map/MenuBar/StoryButton/story-button.scss rename lib/ReactViews/Map/{ => MenuBar}/StoryButton/story-button.scss.d.ts (100%) rename lib/ReactViews/Map/{ => MenuBar}/menu-bar.scss (83%) rename lib/ReactViews/Map/{ => MenuBar}/menu-bar.scss.d.ts (100%) delete mode 100644 lib/ReactViews/Map/Navigation/FullScreenButton.jsx delete mode 100644 lib/ReactViews/Map/ProgressBar.jsx create mode 100644 lib/ReactViews/Map/ProgressBar.tsx delete mode 100644 lib/ReactViews/Map/Splitter.jsx delete mode 100644 lib/ReactViews/Map/StoryButton/story-button.scss delete mode 100644 lib/ReactViews/Map/TerriaViewerWrapper.jsx create mode 100644 lib/ReactViews/Map/TerriaViewerWrapper/Splitter/Splitter.tsx create mode 100644 lib/ReactViews/Map/TerriaViewerWrapper/Splitter/dragHook.ts create mode 100644 lib/ReactViews/Map/TerriaViewerWrapper/TerriaViewerWrapper.tsx create mode 100644 lib/ReactViews/Map/TerriaViewerWrapper/index.ts rename lib/ReactViews/{StandardUserInterface => Map}/Toast.tsx (100%) delete mode 100644 lib/ReactViews/Map/experimental-features.scss delete mode 100644 lib/ReactViews/Map/experimental-features.scss.d.ts delete mode 100644 lib/ReactViews/Map/progress-bar.scss delete mode 100644 lib/ReactViews/Map/progress-bar.scss.d.ts delete mode 100644 lib/ReactViews/Map/splitter.scss delete mode 100644 lib/ReactViews/Map/splitter.scss.d.ts delete mode 100644 lib/ReactViews/Map/terria-viewer-wrapper.scss delete mode 100644 lib/ReactViews/Map/terria-viewer-wrapper.scss.d.ts rename lib/ReactViews/{Map => StandardUserInterface}/ExperimentalFeatures.tsx (91%) delete mode 100644 lib/ReactViews/StandardUserInterface/MapColumn.jsx rename lib/ReactViews/{Map => StandardUserInterface}/TrainerBar/TrainerBar.tsx (99%) rename lib/ReactViews/{Map => StandardUserInterface/customizable}/MenuButton.jsx (95%) rename lib/ReactViews/{Map => StandardUserInterface/customizable}/menu-button.scss (74%) rename lib/ReactViews/{Map => StandardUserInterface/customizable}/menu-button.scss.d.ts (100%) create mode 100644 lib/ReactViews/StandardUserInterface/index.ts delete mode 100644 lib/ReactViews/StandardUserInterface/map-column.scss delete mode 100644 lib/ReactViews/StandardUserInterface/map-column.scss.d.ts rename lib/ReactViews/{Map/Panels => Workbench}/TerrainSide.tsx (92%) rename test/ReactViews/{GyroscopeGuidance => Map/Navigation/Compass}/GyroscopeGuidanceSpec.tsx (74%) rename test/ReactViews/{Map => StandardUserInterface}/TrainerBar/TrainerBarSpec.tsx (96%) rename test/ReactViews/{Map => StandardUserInterface}/TrainerBar/test-help-content.js (100%) diff --git a/lib/Models/Terria.ts b/lib/Models/Terria.ts index 388e7609c60..abfaf1c15dd 100644 --- a/lib/Models/Terria.ts +++ b/lib/Models/Terria.ts @@ -58,7 +58,7 @@ import TimeVarying from "../ModelMixins/TimeVarying"; import { HelpContentItem } from "../ReactViewModels/defaultHelpContent"; import { defaultTerms, Term } from "../ReactViewModels/defaultTerms"; import NotificationState from "../ReactViewModels/NotificationState"; -import { ICredit } from "../ReactViews/Credits"; +import { ICredit } from "../ReactViews/Map/BottomBar/Credits"; import { SHARE_VERSION } from "../ReactViews/Map/Panels/SharePanel/BuildShareLink"; import { shareConvertNotification } from "../ReactViews/Notification/shareConvertNotification"; import MappableTraits from "../Traits/TraitsClasses/MappableTraits"; diff --git a/lib/ReactViewModels/MouseCoords.ts b/lib/ReactViewModels/MouseCoords.ts index c018c17cc0c..7c2caf39368 100644 --- a/lib/ReactViewModels/MouseCoords.ts +++ b/lib/ReactViewModels/MouseCoords.ts @@ -38,11 +38,11 @@ export default class MouseCoords { tileRequestInFlight?: unknown; @observable elevation?: string; - @observable utmZone?: unknown; + @observable utmZone?: string; @observable latitude?: string; @observable longitude?: string; - @observable north?: unknown; - @observable east?: unknown; + @observable north?: string; + @observable east?: string; @observable cartographic?: Cartographic; @observable useProjection = false; @@ -64,11 +64,12 @@ export default class MouseCoords { ); } - @action + @action.bound toggleUseProjection() { this.useProjection = !this.useProjection; } + @action updateCoordinatesFromCesium(terria: Terria, position: Cartesian2) { if (!terria.cesium) { return; @@ -156,6 +157,7 @@ export default class MouseCoords { } } + @action updateCoordinatesFromLeaflet(terria: Terria, mouseMoveEvent: MouseEvent) { if (!terria.leaflet) { return; diff --git a/lib/ReactViews/BottomDock/BottomDock.tsx b/lib/ReactViews/BottomDock/BottomDock.tsx index b5ce4e93357..fe83d947f90 100644 --- a/lib/ReactViews/BottomDock/BottomDock.tsx +++ b/lib/ReactViews/BottomDock/BottomDock.tsx @@ -10,13 +10,13 @@ import Styles from "./bottom-dock.scss"; import ChartDisclaimer from "./ChartDisclaimer"; import Timeline from "./Timeline/Timeline"; -interface PropsType extends MeasureElementProps { +interface PropsType { terria: Terria; viewState: ViewState; } @observer -class BottomDock extends React.Component { +class BottomDock extends React.Component { refToMeasure: HTMLDivElement | null = null; handleClick() { @@ -25,7 +25,7 @@ class BottomDock extends React.Component { }); } - componentDidUpdate(prevProps: PropsType) { + componentDidUpdate(prevProps: PropsType & MeasureElementProps) { if ( prevProps.heightFromMeasureElementHOC !== this.props.heightFromMeasureElementHOC diff --git a/lib/ReactViews/StandardUserInterface/ContextProviders.tsx b/lib/ReactViews/Context/ContextProviders.tsx similarity index 91% rename from lib/ReactViews/StandardUserInterface/ContextProviders.tsx rename to lib/ReactViews/Context/ContextProviders.tsx index 44bc042c5e6..06854c0c0de 100644 --- a/lib/ReactViews/StandardUserInterface/ContextProviders.tsx +++ b/lib/ReactViews/Context/ContextProviders.tsx @@ -3,7 +3,7 @@ import { DefaultTheme, ThemeProvider } from "styled-components"; import ViewState from "../../ReactViewModels/ViewState"; import { ViewStateProvider } from "./ViewStateContext"; -export default (props: { +export const ContextProviders = (props: { viewState: ViewState; theme: DefaultTheme | ((theme: DefaultTheme) => DefaultTheme); children: React.ReactNode[]; diff --git a/lib/ReactViews/StandardUserInterface/ViewStateContext.tsx b/lib/ReactViews/Context/ViewStateContext.tsx similarity index 100% rename from lib/ReactViews/StandardUserInterface/ViewStateContext.tsx rename to lib/ReactViews/Context/ViewStateContext.tsx diff --git a/lib/ReactViews/Context/index.ts b/lib/ReactViews/Context/index.ts new file mode 100644 index 00000000000..fba95c1445c --- /dev/null +++ b/lib/ReactViews/Context/index.ts @@ -0,0 +1,2 @@ +export * from "./ViewStateContext"; +export * from "./ContextProviders"; diff --git a/lib/ReactViews/Credits/index.ts b/lib/ReactViews/Credits/index.ts deleted file mode 100644 index c64853d9cd8..00000000000 --- a/lib/ReactViews/Credits/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { ICredit } from "./Credit.type"; -export { MapCredits } from "./MapCredits/MapCredits"; diff --git a/lib/ReactViews/Custom/ExternalLink.tsx b/lib/ReactViews/Custom/ExternalLink.tsx index a82e7964c3e..5d6669b974e 100644 --- a/lib/ReactViews/Custom/ExternalLink.tsx +++ b/lib/ReactViews/Custom/ExternalLink.tsx @@ -1,7 +1,7 @@ import { AnchorHTMLAttributes, default as React } from "react"; import { useTranslation } from "react-i18next"; import styled from "styled-components"; -import { useViewState } from "../StandardUserInterface/ViewStateContext"; +import { useViewState } from "../Context"; const Icon = require("../../Styled/Icon").default; const { StyledIcon } = require("../../Styled/Icon"); diff --git a/lib/ReactViews/Disclaimer.jsx b/lib/ReactViews/Disclaimer.jsx index 7ee23f377c6..6cabf1c1326 100644 --- a/lib/ReactViews/Disclaimer.jsx +++ b/lib/ReactViews/Disclaimer.jsx @@ -12,7 +12,7 @@ import Button from "../Styled/Button"; import Spacing from "../Styled/Spacing"; import Text from "../Styled/Text"; import parseCustomMarkdownToReact from "./Custom/parseCustomMarkdownToReact"; -import { withViewState } from "./StandardUserInterface/ViewStateContext"; +import { withViewState } from "./Context"; import FadeIn from "./Transitions/FadeIn/FadeIn"; const TopElementBox = styled(Box)` diff --git a/lib/ReactViews/DragDropFile.tsx b/lib/ReactViews/DragDropFile.tsx index e0162f9591f..777df0f0515 100644 --- a/lib/ReactViews/DragDropFile.tsx +++ b/lib/ReactViews/DragDropFile.tsx @@ -14,10 +14,7 @@ import MappableMixin from "../ModelMixins/MappableMixin"; import addUserFiles from "../Models/Catalog/addUserFiles"; import { BaseModel } from "../Models/Definition/Model"; import Styles from "./drag-drop-file.scss"; -import { - WithViewState, - withViewState -} from "./StandardUserInterface/ViewStateContext"; +import { WithViewState, withViewState } from "./Context"; interface PropsType extends WithTranslation, WithViewState {} diff --git a/lib/ReactViews/DragDropNotification.jsx b/lib/ReactViews/DragDropNotification.jsx index fec17f6ab94..63bf30c8c7d 100644 --- a/lib/ReactViews/DragDropNotification.jsx +++ b/lib/ReactViews/DragDropNotification.jsx @@ -6,7 +6,7 @@ import PropTypes from "prop-types"; import React from "react"; import Icon from "../Styled/Icon"; import Styles from "./drag-drop-notification.scss"; -import { withViewState } from "./StandardUserInterface/ViewStateContext"; +import { withViewState } from "./Context"; @observer class DragDropNotification extends React.Component { diff --git a/lib/ReactViews/ExplorerWindow/ExplorerWindow.tsx b/lib/ReactViews/ExplorerWindow/ExplorerWindow.tsx index 91dac320a8b..5ed52578fe7 100644 --- a/lib/ReactViews/ExplorerWindow/ExplorerWindow.tsx +++ b/lib/ReactViews/ExplorerWindow/ExplorerWindow.tsx @@ -2,7 +2,7 @@ import { action } from "mobx"; import { observer } from "mobx-react"; import React from "react"; import ViewState from "../../ReactViewModels/ViewState"; -import { useViewState } from "../StandardUserInterface/ViewStateContext"; +import { useViewState } from "../Context"; import ModalPopup from "./ModalPopup"; import Tabs from "./Tabs"; diff --git a/lib/ReactViews/FeatureInfo/FeatureInfoPanel.jsx b/lib/ReactViews/FeatureInfo/FeatureInfoPanel.jsx index 8a3c3c92219..1ecd8cd561c 100644 --- a/lib/ReactViews/FeatureInfo/FeatureInfoPanel.jsx +++ b/lib/ReactViews/FeatureInfo/FeatureInfoPanel.jsx @@ -22,7 +22,7 @@ import { import Icon from "../../Styled/Icon"; import DragWrapper from "../DragWrapper"; import Loader from "../Loader"; -import { withViewState } from "../StandardUserInterface/ViewStateContext"; +import { withViewState } from "../Context"; import Styles from "./feature-info-panel.scss"; import FeatureInfoCatalogItem from "./FeatureInfoCatalogItem"; diff --git a/lib/ReactViews/Feedback/FeedbackForm.tsx b/lib/ReactViews/Feedback/FeedbackForm.tsx index 564bcbba485..4524f8eb34b 100644 --- a/lib/ReactViews/Feedback/FeedbackForm.tsx +++ b/lib/ReactViews/Feedback/FeedbackForm.tsx @@ -16,10 +16,7 @@ import Text from "../../Styled/Text"; import parseCustomMarkdownToReact, { parseCustomMarkdownToReactWithOptions } from "../Custom/parseCustomMarkdownToReact"; -import { - WithViewState, - withViewState -} from "../StandardUserInterface/ViewStateContext"; +import { WithViewState, withViewState } from "../Context"; import { applyTranslationIfExists } from "./../../Language/languageHelpers"; interface IProps extends WithTranslation, WithViewState { diff --git a/lib/ReactViews/HelpScreens/SatelliteHelpPrompt.jsx b/lib/ReactViews/HelpScreens/SatelliteHelpPrompt.jsx index 57aa0fbfcd2..5bf038c3956 100644 --- a/lib/ReactViews/HelpScreens/SatelliteHelpPrompt.jsx +++ b/lib/ReactViews/HelpScreens/SatelliteHelpPrompt.jsx @@ -1,7 +1,7 @@ import { observer } from "mobx-react"; import React from "react"; import { useTranslation } from "react-i18next"; -import { useViewState } from "../StandardUserInterface/ViewStateContext"; +import { useViewState } from "../Context"; import HelpPrompt from "./HelpPrompt"; export const SATELLITE_HELP_PROMPT_KEY = "satelliteGuidance"; diff --git a/lib/ReactViews/Map/BottomBar/BottomBar.tsx b/lib/ReactViews/Map/BottomBar/BottomBar.tsx new file mode 100644 index 00000000000..5e04dc4b151 --- /dev/null +++ b/lib/ReactViews/Map/BottomBar/BottomBar.tsx @@ -0,0 +1,31 @@ +import React, { VFC } from "react"; +import Box from "../../../Styled/Box"; +import { MapCredits } from "./Credits"; +import { useViewState } from "../../Context"; +import { DistanceLegend } from "./DistanceLegend"; +import { LocationBar } from "./LocationBar"; + +export const BottomBar: VFC = () => { + const viewState = useViewState(); + return ( + + + + + + + + ); +}; diff --git a/lib/ReactViews/Credits/Credit.tsx b/lib/ReactViews/Map/BottomBar/Credits/Credit.tsx similarity index 89% rename from lib/ReactViews/Credits/Credit.tsx rename to lib/ReactViews/Map/BottomBar/Credits/Credit.tsx index 5901407ea9c..751297ff0f7 100644 --- a/lib/ReactViews/Credits/Credit.tsx +++ b/lib/ReactViews/Map/BottomBar/Credits/Credit.tsx @@ -1,6 +1,6 @@ import React, { FC } from "react"; import { useTranslation } from "react-i18next"; -import { ExternalLinkIcon } from "../Custom/ExternalLink"; +import { ExternalLinkIcon } from "../../../Custom/ExternalLink"; import { ICredit } from "./Credit.type"; import { Spacer } from "./Spacer"; diff --git a/lib/ReactViews/Credits/Credit.type.ts b/lib/ReactViews/Map/BottomBar/Credits/Credit.type.ts similarity index 100% rename from lib/ReactViews/Credits/Credit.type.ts rename to lib/ReactViews/Map/BottomBar/Credits/Credit.type.ts diff --git a/lib/ReactViews/Credits/Credits.tsx b/lib/ReactViews/Map/BottomBar/Credits/Credits.tsx similarity index 100% rename from lib/ReactViews/Credits/Credits.tsx rename to lib/ReactViews/Map/BottomBar/Credits/Credits.tsx diff --git a/lib/ReactViews/Credits/CreditsContainer.tsx b/lib/ReactViews/Map/BottomBar/Credits/CreditsContainer.tsx similarity index 62% rename from lib/ReactViews/Credits/CreditsContainer.tsx rename to lib/ReactViews/Map/BottomBar/Credits/CreditsContainer.tsx index 5d06fef8d7b..06c7d15afa7 100644 --- a/lib/ReactViews/Credits/CreditsContainer.tsx +++ b/lib/ReactViews/Map/BottomBar/Credits/CreditsContainer.tsx @@ -1,19 +1,12 @@ import styled from "styled-components"; -import Box from "../../Styled/Box"; +import Box from "../../../../Styled/Box"; export const CreditsContainer = styled(Box).attrs(() => ({ - fullWidth: true, styledHeight: "30px", styledMaxHeight: "30px", verticalCenter: true, - gap: true, - position: "absolute" + gap: true }))` - z-index: 0; - bottom: 0; - background: linear-gradient(180deg, #000000 0%, #000000 100%); - font-size: 0.7rem; - opacity: 0.75; a { text-decoration: underline; cursor: pointer; @@ -21,7 +14,6 @@ export const CreditsContainer = styled(Box).attrs(() => ({ display: flex; align-items: center; } - img { height: 24px; } diff --git a/lib/ReactViews/Credits/DataAttribution/DataAttributionModal.tsx b/lib/ReactViews/Map/BottomBar/Credits/DataAttribution/DataAttributionModal.tsx similarity index 86% rename from lib/ReactViews/Credits/DataAttribution/DataAttributionModal.tsx rename to lib/ReactViews/Map/BottomBar/Credits/DataAttribution/DataAttributionModal.tsx index 192a77f4956..a93d967a0e3 100644 --- a/lib/ReactViews/Credits/DataAttribution/DataAttributionModal.tsx +++ b/lib/ReactViews/Map/BottomBar/Credits/DataAttribution/DataAttributionModal.tsx @@ -3,13 +3,13 @@ import React, { FC } from "react"; import ReactDOM from "react-dom"; import { useTranslation } from "react-i18next"; import styled from "styled-components"; -import Box from "../../../Styled/Box"; -import { Li } from "../../../Styled/List"; -import Spacing from "../../../Styled/Spacing"; -import Text from "../../../Styled/Text"; -import parseCustomHtmlToReact from "../../Custom/parseCustomHtmlToReact"; -import CloseButton from "../../Generic/CloseButton"; -import { PrefaceBox } from "../../Generic/PrefaceBox"; +import Box from "../../../../../Styled/Box"; +import { Li } from "../../../../../Styled/List"; +import Spacing from "../../../../../Styled/Spacing"; +import Text from "../../../../../Styled/Text"; +import parseCustomHtmlToReact from "../../../../Custom/parseCustomHtmlToReact"; +import CloseButton from "../../../../Generic/CloseButton"; +import { PrefaceBox } from "../../../../Generic/PrefaceBox"; interface IDataAttributionModalProps { closeModal: () => void; @@ -20,7 +20,6 @@ const AttributionText = styled(Text).attrs(() => ({ medium: true }))` a { color: ${props => props.theme.textDark}; text-decoration: underline; - img { height: 19px; vertical-align: middle; diff --git a/lib/ReactViews/Credits/MapCredits/MapCreditLogo.tsx b/lib/ReactViews/Map/BottomBar/Credits/MapCreditLogo.tsx similarity index 75% rename from lib/ReactViews/Credits/MapCredits/MapCreditLogo.tsx rename to lib/ReactViews/Map/BottomBar/Credits/MapCreditLogo.tsx index 9ba2b6be382..7f0cffb0b18 100644 --- a/lib/ReactViews/Credits/MapCredits/MapCreditLogo.tsx +++ b/lib/ReactViews/Map/BottomBar/Credits/MapCreditLogo.tsx @@ -1,8 +1,8 @@ import React, { FC } from "react"; import CreditDisplay from "terriajs-cesium/Source/Scene/CreditDisplay"; -import GlobeOrMap from "../../../Models/GlobeOrMap"; -import Leaflet from "../../../Models/Leaflet"; -import parseCustomHtmlToReact from "../../Custom/parseCustomHtmlToReact"; +import GlobeOrMap from "../../../../Models/GlobeOrMap"; +import Leaflet from "../../../../Models/Leaflet"; +import parseCustomHtmlToReact from "../../../Custom/parseCustomHtmlToReact"; interface IMapCreditLogoProps { currentViewer: GlobeOrMap; diff --git a/lib/ReactViews/Credits/MapCredits/MapCredits.tsx b/lib/ReactViews/Map/BottomBar/Credits/MapCredits.tsx similarity index 84% rename from lib/ReactViews/Credits/MapCredits/MapCredits.tsx rename to lib/ReactViews/Map/BottomBar/Credits/MapCredits.tsx index 404abdeeb8b..05a8a30a118 100644 --- a/lib/ReactViews/Credits/MapCredits/MapCredits.tsx +++ b/lib/ReactViews/Map/BottomBar/Credits/MapCredits.tsx @@ -2,13 +2,13 @@ import { reaction } from "mobx"; import { observer } from "mobx-react"; import React, { FC, useCallback, useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; -import GlobeOrMap from "../../../Models/GlobeOrMap"; -import { ICredit } from "../Credit.type"; -import { Credits } from "../Credits"; -import { CreditsContainer } from "../CreditsContainer"; -import { DataAttributionModal } from "../DataAttribution/DataAttributionModal"; -import { Spacer } from "../Spacer"; -import { TerriaLogo } from "../TerriaLogo"; +import GlobeOrMap from "../../../../Models/GlobeOrMap"; +import { ICredit } from "./Credit.type"; +import { Credits } from "./Credits"; +import { CreditsContainer } from "./CreditsContainer"; +import { DataAttributionModal } from "./DataAttribution/DataAttributionModal"; +import { Spacer } from "./Spacer"; +import { TerriaLogo } from "./TerriaLogo"; import { MapCreditLogo } from "./MapCreditLogo"; interface IMapCreditsProps { diff --git a/lib/ReactViews/Credits/Spacer.tsx b/lib/ReactViews/Map/BottomBar/Credits/Spacer.tsx similarity index 100% rename from lib/ReactViews/Credits/Spacer.tsx rename to lib/ReactViews/Map/BottomBar/Credits/Spacer.tsx diff --git a/lib/ReactViews/Credits/TerriaLogo.tsx b/lib/ReactViews/Map/BottomBar/Credits/TerriaLogo.tsx similarity index 71% rename from lib/ReactViews/Credits/TerriaLogo.tsx rename to lib/ReactViews/Map/BottomBar/Credits/TerriaLogo.tsx index ab56a9046ed..fd035fd8688 100644 --- a/lib/ReactViews/Credits/TerriaLogo.tsx +++ b/lib/ReactViews/Map/BottomBar/Credits/TerriaLogo.tsx @@ -1,7 +1,7 @@ import React, { FC } from "react"; -import Box from "../../Styled/Box"; +import Box from "../../../../Styled/Box"; -const logo = require("../../../wwwroot/images/terria-watermark.svg"); +const logo = require("../../../../../wwwroot/images/terria-watermark.svg"); export const TerriaLogo: FC = () => { return ( diff --git a/lib/ReactViews/Map/BottomBar/Credits/index.ts b/lib/ReactViews/Map/BottomBar/Credits/index.ts new file mode 100644 index 00000000000..ebd9ea095ca --- /dev/null +++ b/lib/ReactViews/Map/BottomBar/Credits/index.ts @@ -0,0 +1,2 @@ +export { ICredit } from "./Credit.type"; +export { MapCredits } from "./MapCredits"; diff --git a/lib/ReactViews/Map/BottomBar/DistanceLegend.tsx b/lib/ReactViews/Map/BottomBar/DistanceLegend.tsx new file mode 100644 index 00000000000..6236d49259f --- /dev/null +++ b/lib/ReactViews/Map/BottomBar/DistanceLegend.tsx @@ -0,0 +1,243 @@ +"use strict"; +import L from "leaflet"; +import { runInAction } from "mobx"; +import { observer } from "mobx-react"; +import React, { FC, useEffect, useState, memo } from "react"; +import { useTheme } from "styled-components"; +import Cartesian2 from "terriajs-cesium/Source/Core/Cartesian2"; +import EllipsoidGeodesic from "terriajs-cesium/Source/Core/EllipsoidGeodesic"; +import CesiumEvent from "terriajs-cesium/Source/Core/Event"; +import getTimestamp from "terriajs-cesium/Source/Core/getTimestamp"; +import Scene from "terriajs-cesium/Source/Scene/Scene"; +import isDefined from "../../../Core/isDefined"; +import Box from "../../../Styled/Box"; +import Text from "../../../Styled/Text"; +import { useViewState } from "../../Context"; + +const geodesic = new EllipsoidGeodesic(); + +const distances = [ + 1, + 2, + 3, + 5, + 10, + 20, + 30, + 50, + 100, + 200, + 300, + 500, + 1000, + 2000, + 3000, + 5000, + 10000, + 20000, + 30000, + 50000, + 100000, + 200000, + 300000, + 500000, + 1000000, + 2000000, + 3000000, + 5000000, + 10000000, + 20000000, + 30000000, + 50000000 +]; + +interface IDistanceLegendProps { + scale?: number; + isPrintMode?: boolean; +} + +export const DistanceLegend: FC = observer( + ({ scale = 1, isPrintMode = false }) => { + const [distanceLabel, setDistanceLabel] = useState(); + const [barWidth, setBarWidth] = useState(0); + + const { terria } = useViewState(); + const theme = useTheme(); + + let removeUpdateSubscription: + | CesiumEvent.RemoveCallback + | (() => void) + | undefined; + + useEffect(() => { + const viewerSubscriptions: CesiumEvent.RemoveCallback[] = []; + + removeUpdateSubscription = addUpdateSubscription(); + + return () => { + if (removeUpdateSubscription) { + removeUpdateSubscription(); + } + viewerSubscriptions.forEach(clear => clear()); + }; + }, [terria.cesium, terria.leaflet]); + + const addUpdateSubscription = (): + | CesiumEvent.RemoveCallback + | (() => void) + | undefined => { + if (isDefined(terria.cesium)) { + const scene = terria.cesium.scene; + let removeUpdateSubscription: + | CesiumEvent.RemoveCallback + | undefined = scene.postRender.addEventListener(() => { + updateDistanceLegendCesium(scene); + if (isPrintMode) { + removeUpdateSubscription?.(); + removeUpdateSubscription = undefined; + } + }); + return removeUpdateSubscription; + } else if (isDefined(terria.leaflet)) { + const map = terria.leaflet.map; + let removeUpdateSubscription: (() => void) | undefined = undefined; + + if (!isPrintMode) { + const potentialChangeCallback = function potentialChangeCallback() { + updateDistanceLegendLeaflet(map); + }; + removeUpdateSubscription = function() { + map.off("zoomend", potentialChangeCallback); + map.off("moveend", potentialChangeCallback); + }; + + map.on("zoomend", potentialChangeCallback); + map.on("moveend", potentialChangeCallback); + } + + updateDistanceLegendLeaflet(map); + return removeUpdateSubscription; + } + }; + + const updateDistanceLegendCesium = (scene: Scene) => { + const now = getTimestamp(); + + // Find the distance between two pixels at the bottom center of the screen. + const width = scene.canvas.clientWidth; + const height = scene.canvas.clientHeight; + + const left = scene.camera.getPickRay( + new Cartesian2((width / 2) | 0, height - 1) + ); + const right = scene.camera.getPickRay( + new Cartesian2((1 + width / 2) | 0, height - 1) + ); + + const globe = scene.globe; + + if (!isDefined(left) || !isDefined(right)) { + return; + } + + const leftPosition = globe.pick(left, scene); + const rightPosition = globe.pick(right, scene); + + if (!isDefined(leftPosition) || !isDefined(rightPosition)) { + setBarWidth(0); + setDistanceLabel(undefined); + return; + } + + const leftCartographic = globe.ellipsoid.cartesianToCartographic( + leftPosition + ); + const rightCartographic = globe.ellipsoid.cartesianToCartographic( + rightPosition + ); + + geodesic.setEndPoints(leftCartographic, rightCartographic); + const pixelDistance = geodesic.surfaceDistance; + runInAction(() => (terria.mainViewer.scale = pixelDistance)); + + // Find the first distance that makes the scale bar less than 100 pixels. + const maxBarWidth = 100; + let distance; + for (let i = distances.length - 1; !isDefined(distance) && i >= 0; --i) { + if (distances[i] / pixelDistance < maxBarWidth) { + distance = distances[i]; + } + } + + if (isDefined(distance)) { + let label; + if (distance >= 1000) { + label = (distance / 1000).toString() + " km"; + } else { + label = distance.toString() + " m"; + } + setBarWidth(((distance / pixelDistance) * scale) | 0); + setDistanceLabel(label); + } else { + setBarWidth(0); + setDistanceLabel(undefined); + } + }; + + const updateDistanceLegendLeaflet = (map: L.Map) => { + const halfHeight = map.getSize().y / 2; + const maxPixelWidth = 100; + const maxMeters = map + .containerPointToLatLng([0, halfHeight]) + .distanceTo(map.containerPointToLatLng([maxPixelWidth, halfHeight])); + + runInAction(() => (terria.mainViewer.scale = maxMeters / 100)); + // @ts-ignore + const meters = L.control.scale()._getRoundNum(maxMeters); + const label = meters < 1000 ? meters + " m" : meters / 1000 + " km"; + + setBarWidth((meters / maxMeters) * maxPixelWidth * scale); + setDistanceLabel(label); + }; + + const barStyle = { + width: barWidth + "px", + left: 5 + (125 - barWidth) / 2 + "px", + height: "2px" + }; + + return distanceLabel ? ( + + + {distanceLabel} + +
    + + ) : null; + } +); diff --git a/lib/ReactViews/Map/BottomBar/LocationBar.tsx b/lib/ReactViews/Map/BottomBar/LocationBar.tsx new file mode 100644 index 00000000000..67ee4c5798b --- /dev/null +++ b/lib/ReactViews/Map/BottomBar/LocationBar.tsx @@ -0,0 +1,88 @@ +import { observer } from "mobx-react"; +import React, { FC } from "react"; +import { useTranslation } from "react-i18next"; +import styled, { useTheme } from "styled-components"; +import MouseCoords from "../../../ReactViewModels/MouseCoords"; +import Box from "../../../Styled/Box"; +import { RawButton } from "../../../Styled/Button"; +import { TextSpan } from "../../../Styled/Text"; + +interface ILocationBarProps { + mouseCoords: MouseCoords; +} + +const Section = styled(Box).attrs({ + paddedHorizontally: true +})``; + +const StyledText = styled(TextSpan).attrs({ + textLight: true, + mono: true, + noWrap: true +})` + font-size: 0.7rem; + padding: 0 5px 0 5px; +`; + +export const LocationBar: FC = observer( + ({ mouseCoords }) => { + const theme = useTheme(); + const { t } = useTranslation(); + + return ( + + + {!mouseCoords.useProjection ? ( + <> +
    + {t("legend.lat")} + {mouseCoords.latitude} +
    +
    + {t("legend.lon")} + {mouseCoords.longitude} +
    + + ) : ( + <> +
    + {t("legend.zone")} + {mouseCoords.utmZone} +
    +
    + {t("legend.e")} + {mouseCoords.east} +
    +
    + {t("legend.n")} + {mouseCoords.north} +
    + + )} +
    + {t("legend.elev")} + {mouseCoords.elevation} +
    +
    +
    + ); + } +); diff --git a/lib/ReactViews/Map/BottomBar/index.ts b/lib/ReactViews/Map/BottomBar/index.ts new file mode 100644 index 00000000000..c8b81e2ff08 --- /dev/null +++ b/lib/ReactViews/Map/BottomBar/index.ts @@ -0,0 +1 @@ +export { BottomBar } from "./BottomBar"; diff --git a/lib/ReactViews/Map/BottomLeftBar/BottomLeftBar.tsx b/lib/ReactViews/Map/BottomLeftBar/BottomLeftBar.tsx index 8099e7325da..c4440c11864 100644 --- a/lib/ReactViews/Map/BottomLeftBar/BottomLeftBar.tsx +++ b/lib/ReactViews/Map/BottomLeftBar/BottomLeftBar.tsx @@ -1,4 +1,4 @@ -import React from "react"; +import React, { FC } from "react"; import { useTranslation } from "react-i18next"; import ViewState from "../../../ReactViewModels/ViewState"; @@ -10,47 +10,43 @@ import MapDataCount from "../../BottomDock/MapDataCount"; import Terria from "../../../Models/Terria"; import MapIconButton from "../../MapIconButton/MapIconButton"; import defined from "terriajs-cesium/Source/Core/defined"; - -interface Props { - terria: Terria; - viewState: ViewState; -} +import { useViewState } from "../../Context"; const BottomLeftContainer = styled(Box)` position: absolute; bottom: 40px; - @media (max-width: ${props => props.theme.mobile}px) { bottom: 35px; } `; -const shouldShowPlayStoryButton = (props: Props) => - props.terria.configParameters.storyEnabled && - defined(props.terria.stories) && - props.terria.stories.length > 0 && - props.viewState.useSmallScreenInterface; +const shouldShowPlayStoryButton = (viewState: ViewState) => + viewState.terria.configParameters.storyEnabled && + defined(viewState.terria.stories) && + viewState.terria.stories.length > 0 && + viewState.useSmallScreenInterface; -const BottomLeftBar = (props: Props) => { +const BottomLeftBar: FC = () => { const { t } = useTranslation(); const theme = useTheme(); + const viewState = useViewState(); const isNotificationActive = - props.terria.notificationState.currentNotification; + viewState.terria.notificationState.currentNotification; return ( - {shouldShowPlayStoryButton(props) ? ( + {shouldShowPlayStoryButton(viewState) ? ( } - onClick={() => props.viewState.runStories()} + onClick={() => viewState.runStories()} primary={!isNotificationActive} > {t("story.playStory")} diff --git a/lib/ReactViews/Map/HelpButton/help-button.scss b/lib/ReactViews/Map/HelpButton/help-button.scss deleted file mode 100644 index c89132566d1..00000000000 --- a/lib/ReactViews/Map/HelpButton/help-button.scss +++ /dev/null @@ -1,4 +0,0 @@ -.helpBtn { - composes: btn from "../../../Sass/common/_buttons.scss"; - composes: btn--map from "../../../Sass/common/_buttons.scss"; -} diff --git a/lib/ReactViews/Map/Legend/DistanceLegend.jsx b/lib/ReactViews/Map/Legend/DistanceLegend.jsx deleted file mode 100644 index e163b318901..00000000000 --- a/lib/ReactViews/Map/Legend/DistanceLegend.jsx +++ /dev/null @@ -1,233 +0,0 @@ -"use strict"; -import React from "react"; -import PropTypes from "prop-types"; -import L from "leaflet"; -import Cartesian2 from "terriajs-cesium/Source/Core/Cartesian2"; -import defined from "terriajs-cesium/Source/Core/defined"; -import EllipsoidGeodesic from "terriajs-cesium/Source/Core/EllipsoidGeodesic"; -import getTimestamp from "terriajs-cesium/Source/Core/getTimestamp"; -import Styles from "./legend.scss"; -import { observer, disposeOnUnmount } from "mobx-react"; -import { autorun, runInAction } from "mobx"; - -const geodesic = new EllipsoidGeodesic(); - -const distances = [ - 1, - 2, - 3, - 5, - 10, - 20, - 30, - 50, - 100, - 200, - 300, - 500, - 1000, - 2000, - 3000, - 5000, - 10000, - 20000, - 30000, - 50000, - 100000, - 200000, - 300000, - 500000, - 1000000, - 2000000, - 3000000, - 5000000, - 10000000, - 20000000, - 30000000, - 50000000 -]; - -@observer -class DistanceLegend extends React.Component { - constructor(props) { - super(props); - this.state = { - distanceLabel: undefined, - barWidth: 0 - }; - } - static displayName = "DistanceLegend"; - static propTypes = { - terria: PropTypes.object, - scale: PropTypes.number, - isPrintMode: PropTypes.bool - }; - - /* eslint-disable-next-line camelcase */ - UNSAFE_componentWillMount() { - this.viewerSubscriptions = []; - this.removeUpdateSubscription = undefined; - - this._lastLegendUpdate = undefined; - this.viewerSubscriptions.push( - this.props.terria.mainViewer.beforeViewerChanged.addEventListener(() => { - if (defined(this.removeUpdateSubscription)) { - this.removeUpdateSubscription(); - this.removeUpdateSubscription = undefined; - } - }) - ); - disposeOnUnmount( - this, - autorun(() => this.addUpdateSubscription()) - ); - } - - componentWillUnmount() { - this.removeUpdateSubscription && this.removeUpdateSubscription(); - this.viewerSubscriptions.forEach(remove => remove()); - } - - addUpdateSubscription() { - const that = this; - if (defined(this.props.terria.cesium)) { - const scene = this.props.terria.cesium.scene; - this.removeUpdateSubscription = scene.postRender.addEventListener(() => { - this.updateDistanceLegendCesium(scene); - if (this.props.isPrintMode) { - this.removeUpdateSubscription(); - this.removeUpdateSubscription = null; - } - }); - } else if (defined(this.props.terria.leaflet)) { - const map = this.props.terria.leaflet.map; - - const potentialChangeCallback = function potentialChangeCallback() { - that.updateDistanceLegendLeaflet(map); - }; - if (!this.props.isPrintMode) { - that.removeUpdateSubscription = function() { - map.off("zoomend", potentialChangeCallback); - map.off("moveend", potentialChangeCallback); - }; - - map.on("zoomend", potentialChangeCallback); - map.on("moveend", potentialChangeCallback); - } - - that.updateDistanceLegendLeaflet(map); - } - } - - updateDistanceLegendCesium(scene) { - const now = getTimestamp(); - if (now < this._lastLegendUpdate + 250) { - return; - } - - this._lastLegendUpdate = now; - - // Find the distance between two pixels at the bottom center of the screen. - const width = scene.canvas.clientWidth; - const height = scene.canvas.clientHeight; - - const left = scene.camera.getPickRay( - new Cartesian2((width / 2) | 0, height - 1) - ); - const right = scene.camera.getPickRay( - new Cartesian2((1 + width / 2) | 0, height - 1) - ); - - const globe = scene.globe; - const leftPosition = globe.pick(left, scene); - const rightPosition = globe.pick(right, scene); - - if (!defined(leftPosition) || !defined(rightPosition)) { - this.setState({ - barWidth: undefined, - distanceLabel: undefined - }); - return; - } - - const leftCartographic = globe.ellipsoid.cartesianToCartographic( - leftPosition - ); - const rightCartographic = globe.ellipsoid.cartesianToCartographic( - rightPosition - ); - - geodesic.setEndPoints(leftCartographic, rightCartographic); - const pixelDistance = geodesic.surfaceDistance; - runInAction(() => (this.props.terria.mainViewer.scale = pixelDistance)); - - // Find the first distance that makes the scale bar less than 100 pixels. - const maxBarWidth = 100; - let distance; - for (let i = distances.length - 1; !defined(distance) && i >= 0; --i) { - if (distances[i] / pixelDistance < maxBarWidth) { - distance = distances[i]; - } - } - - if (defined(distance)) { - let label; - if (distance >= 1000) { - label = (distance / 1000).toString() + " km"; - } else { - label = distance.toString() + " m"; - } - - this.setState({ - barWidth: ((distance / pixelDistance) * this.props.scale) | 0, - distanceLabel: label - }); - } else { - this.setState({ - barWidth: undefined, - distanceLabel: undefined - }); - } - } - - updateDistanceLegendLeaflet(map) { - const halfHeight = map.getSize().y / 2; - const maxPixelWidth = 100; - const maxMeters = map - .containerPointToLatLng([0, halfHeight]) - .distanceTo(map.containerPointToLatLng([maxPixelWidth, halfHeight])); - - runInAction(() => (this.props.terria.mainViewer.scale = maxMeters / 100)); - - const meters = L.control.scale()._getRoundNum(maxMeters); - const label = meters < 1000 ? meters + " m" : meters / 1000 + " km"; - - this.setState({ - barWidth: (meters / maxMeters) * maxPixelWidth * this.props.scale, - distanceLabel: label - }); - } - - render() { - const barStyle = { - width: this.state.barWidth + "px", - left: 5 + (125 - this.state.barWidth) / 2 + "px", - height: "2px" - }; - - const distanceLabel = this.state.distanceLabel ? ( -
    - -
    -
    - ) : null; - - return distanceLabel; - } -} -DistanceLegend.defaultProps = { - scale: 1, - isPrintMode: false -}; - -export default DistanceLegend; diff --git a/lib/ReactViews/Map/Legend/LocationBar.jsx b/lib/ReactViews/Map/Legend/LocationBar.jsx deleted file mode 100644 index 47ea185d906..00000000000 --- a/lib/ReactViews/Map/Legend/LocationBar.jsx +++ /dev/null @@ -1,82 +0,0 @@ -"use strict"; -import classNames from "classnames"; -import createReactClass from "create-react-class"; -import { observer } from "mobx-react"; -import PropTypes from "prop-types"; -import { withTranslation } from "react-i18next"; -import React from "react"; -import Styles from "./legend.scss"; - -const LocationBar = observer( - createReactClass({ - displayName: "LocationBar", - - propTypes: { - terria: PropTypes.object, - showUtmZone: PropTypes.bool, - mouseCoords: PropTypes.object.isRequired, - t: PropTypes.func.isRequired - }, - - getDefaultProps: function() { - return { - showUtmZone: true - }; - }, - - toggleUseProjection() { - this.props.mouseCoords.toggleUseProjection(); - }, - - render() { - const { t } = this.props; - return ( - - ); - } - }) -); - -module.exports = withTranslation()(LocationBar); diff --git a/lib/ReactViews/Map/Legend/legend.scss b/lib/ReactViews/Map/Legend/legend.scss deleted file mode 100644 index 58110a76b6e..00000000000 --- a/lib/ReactViews/Map/Legend/legend.scss +++ /dev/null @@ -1,75 +0,0 @@ -@import "~terriajs-variables"; -@import "../../../Sass/common/mixins"; - -$distance-bg: rgba($dark, 0.9); - -.baseLegend { - box-sizing: border-box; - font-family: $font-base; - float: left; - background-color: #fff; - color: $text-dark; - padding: $padding-small $padding-small; - font-size: $font-size-mid-mini; - text-align: center; - line-height: 1; - border: 0; - outline: 0; - font-family: $font-mono; - max-height: 21px; - margin-top: $padding-mini; - &:hover { - background: $faint-bg; - } - - .bar { - background: #fff; - margin: 0 auto; - display: block; - @include transition(all 0.5s ease-in-out); - } -} - -.locationBar, -.distanceLegend { - composes: baseLegend; - // Adjust colors to match btn--map. - background-color: unset; - margin-bottom: $padding-mini; - color: $text-light; - &:hover { - // background: $color-primary; - } - // - margin-right: $padding-small; - span { - padding: 0 $padding-small; - } - - li, - div { - display: inline-block; - padding: 0 $padding-small; - text-align: left; - } - - .section-long { - width: 130px; - } - - .section { - width: 112px; - } - - .section-short { - width: 70px; - } -} - -.distanceLegend { - &:hover { - background: $charcoal-grey; - } - text-align: center; - width: 110px; -} diff --git a/lib/ReactViews/Map/Legend/legend.scss.d.ts b/lib/ReactViews/Map/Legend/legend.scss.d.ts deleted file mode 100644 index 2216fd3b3ba..00000000000 --- a/lib/ReactViews/Map/Legend/legend.scss.d.ts +++ /dev/null @@ -1,15 +0,0 @@ -// This file is automatically generated. -// Please do not change this file! -interface CssExports { - 'bar': string; - 'baseLegend': string; - 'distanceLegend': string; - 'locationBar': string; - 'section': string; - 'section-long': string; - 'section-short': string; - 'sectionLong': string; - 'sectionShort': string; -} -declare var cssExports: CssExports; -export = cssExports; diff --git a/lib/ReactViews/Map/MapColumn.tsx b/lib/ReactViews/Map/MapColumn.tsx new file mode 100644 index 00000000000..25f647c9164 --- /dev/null +++ b/lib/ReactViews/Map/MapColumn.tsx @@ -0,0 +1,136 @@ +import { observer } from "mobx-react"; +import React, { FC } from "react"; +import { useTranslation } from "react-i18next"; +import Box from "../../Styled/Box"; +import BottomDock from "../BottomDock/BottomDock"; +import { useViewState } from "../Context"; +import Loader from "../Loader"; +import SlideUpFadeIn from "../Transitions/SlideUpFadeIn/SlideUpFadeIn"; +import { BottomBar } from "./BottomBar"; +import BottomLeftBar from "./BottomLeftBar/BottomLeftBar"; +import { MapNavigation } from "./MapNavigation"; +import MenuBar from "./MenuBar/MenuBar"; +import { ProgressBar } from "./ProgressBar"; +import { TerriaViewerWrapper } from "./TerriaViewerWrapper"; +import Toast from "./Toast"; + +interface IMapColumnProps { + customFeedbacks: any; + animationDuration: number; + customElements: any; +} + +/** + * Right-hand column that contains the map, controls that sit over the map and sometimes the bottom dock containing + * the timeline and charts. + */ +export const MapColumn: FC = observer( + ({ customFeedbacks, customElements, animationDuration }) => { + const viewState = useViewState(); + const { t } = useTranslation(); + + return ( + + +
    + +
    + {!viewState.hideMapUi && ( + <> + + + + )} + + + + {!viewState.hideMapUi && ( + <> + + + + + + + + + + + {viewState.terria.configParameters.printDisclaimer && ( + + {viewState.terria.configParameters.printDisclaimer.text} + + )} + + )} +
    +
    + {true && ( + + )} +
    +
    + ); + } +); + +export default MapColumn; diff --git a/lib/ReactViews/Map/Navigation/Items/OverflowNavigationItem.tsx b/lib/ReactViews/Map/MapNavigation/CollapsedNavigation.tsx similarity index 84% rename from lib/ReactViews/Map/Navigation/Items/OverflowNavigationItem.tsx rename to lib/ReactViews/Map/MapNavigation/CollapsedNavigation.tsx index 78e2ee980cc..b43925c5d84 100644 --- a/lib/ReactViews/Map/Navigation/Items/OverflowNavigationItem.tsx +++ b/lib/ReactViews/Map/MapNavigation/CollapsedNavigation.tsx @@ -3,16 +3,16 @@ import { observer } from "mobx-react"; import React, { useEffect } from "react"; import { useTranslation } from "react-i18next"; import styled, { useTheme } from "styled-components"; -import { applyTranslationIfExists } from "../../../../Language/languageHelpers"; -import Box, { BoxSpan } from "../../../../Styled/Box"; -import { StyledIcon } from "../../../../Styled/Icon"; -import Spacing from "../../../../Styled/Spacing"; -import Text from "../../../../Styled/Text"; -import { IMapNavigationItem } from "../../../../ViewModels/MapNavigation/MapNavigationModel"; -import CloseButton from "../../../Generic/CloseButton"; -import { PrefaceBox } from "../../../Generic/PrefaceBox"; -import { useViewState } from "../../../StandardUserInterface/ViewStateContext"; -import { filterViewerAndScreenSize } from "../MapNavigation"; +import { applyTranslationIfExists } from "../../../Language/languageHelpers"; +import Box, { BoxSpan } from "../../../Styled/Box"; +import { StyledIcon } from "../../../Styled/Icon"; +import Spacing from "../../../Styled/Spacing"; +import Text from "../../../Styled/Text"; +import { IMapNavigationItem } from "../../../ViewModels/MapNavigation/MapNavigationModel"; +import { useViewState } from "../../Context"; +import CloseButton from "../../Generic/CloseButton"; +import { PrefaceBox } from "../../Generic/PrefaceBox"; +import { filterViewerAndScreenSize } from "./filterViewerAndScreenSize"; interface PropTypes { items: IMapNavigationItem[]; @@ -128,7 +128,7 @@ const CollapsedNavigationPanel: React.FC = observer( ); const CollapsedNavigationDisplayName = "CollapsedNavigation"; -const CollapsedNavigation: React.FC = observer(() => { +export const CollapsedNavigation: React.FC = observer(() => { const viewState = useViewState(); useEffect(() => autorun(() => { @@ -163,5 +163,3 @@ const CollapsedNavigation: React.FC = observer(() => { ); }); - -export default CollapsedNavigation; diff --git a/lib/ReactViews/Map/Navigation/Items/AugmentedVirtualityTool.tsx b/lib/ReactViews/Map/MapNavigation/Items/AugmentedVirtualityTool.tsx similarity index 100% rename from lib/ReactViews/Map/Navigation/Items/AugmentedVirtualityTool.tsx rename to lib/ReactViews/Map/MapNavigation/Items/AugmentedVirtualityTool.tsx diff --git a/lib/ReactViews/Map/Navigation/Items/CatalogShortcut.jsx b/lib/ReactViews/Map/MapNavigation/Items/CatalogShortcut.jsx similarity index 100% rename from lib/ReactViews/Map/Navigation/Items/CatalogShortcut.jsx rename to lib/ReactViews/Map/MapNavigation/Items/CatalogShortcut.jsx diff --git a/lib/ReactViews/Map/Navigation/Items/CloseToolButton.tsx b/lib/ReactViews/Map/MapNavigation/Items/CloseToolButton.tsx similarity index 65% rename from lib/ReactViews/Map/Navigation/Items/CloseToolButton.tsx rename to lib/ReactViews/Map/MapNavigation/Items/CloseToolButton.tsx index 719b03526d0..377e116533d 100644 --- a/lib/ReactViews/Map/Navigation/Items/CloseToolButton.tsx +++ b/lib/ReactViews/Map/MapNavigation/Items/CloseToolButton.tsx @@ -1,15 +1,12 @@ -import React from "react"; -import { withTranslation, WithTranslation } from "react-i18next"; -import ViewState from "../../../../ReactViewModels/ViewState"; +import React, { FC } from "react"; +import { useTranslation } from "react-i18next"; import Icon from "../../../../Styled/Icon"; +import { useViewState } from "../../../Context"; import MapIconButton from "../../../MapIconButton/MapIconButton"; -interface PropsType extends WithTranslation { - viewState: ViewState; - t: any; -} - -function CloseToolButton({ viewState, t }: PropsType) { +export const CloseToolButton: FC = () => { + const { t } = useTranslation(); + const viewState = useViewState(); const closeText = t("tool.closeButtonTitle", { toolName: viewState.currentTool?.toolName }); @@ -31,6 +28,4 @@ function CloseToolButton({ viewState, t }: PropsType) { {closeText} ); -} - -export default withTranslation()(CloseToolButton); +}; diff --git a/lib/ReactViews/Map/Navigation/Items/Compass.tsx b/lib/ReactViews/Map/MapNavigation/Items/Compass/Compass.tsx similarity index 94% rename from lib/ReactViews/Map/Navigation/Items/Compass.tsx rename to lib/ReactViews/Map/MapNavigation/Items/Compass/Compass.tsx index e25167822b7..22206c308dd 100644 --- a/lib/ReactViews/Map/Navigation/Items/Compass.tsx +++ b/lib/ReactViews/Map/MapNavigation/Items/Compass/Compass.tsx @@ -23,21 +23,21 @@ import CesiumMath from "terriajs-cesium/Source/Core/Math"; import Matrix4 from "terriajs-cesium/Source/Core/Matrix4"; import Ray from "terriajs-cesium/Source/Core/Ray"; import Transforms from "terriajs-cesium/Source/Core/Transforms"; -import isDefined from "../../../../Core/isDefined"; -import Terria from "../../../../Models/Terria"; -import ViewState from "../../../../ReactViewModels/ViewState"; -import Box from "../../../../Styled/Box"; -import Icon, { StyledIcon } from "../../../../Styled/Icon"; -import GyroscopeGuidance from "../../../GyroscopeGuidance/GyroscopeGuidance"; -import { withTerriaRef } from "../../../HOCs/withTerriaRef"; -import FadeIn from "../../../Transitions/FadeIn/FadeIn"; +import isDefined from "../../../../../Core/isDefined"; +import Terria from "../../../../../Models/Terria"; +import ViewState from "../../../../../ReactViewModels/ViewState"; +import Box from "../../../../../Styled/Box"; +import Icon, { StyledIcon } from "../../../../../Styled/Icon"; +import { GyroscopeGuidance } from "./GyroscopeGuidance"; +import { withTerriaRef } from "../../../../HOCs/withTerriaRef"; +import FadeIn from "../../../../Transitions/FadeIn/FadeIn"; const CameraFlightPath = require("terriajs-cesium/Source/Scene/CameraFlightPath") .default; export const COMPASS_LOCAL_PROPERTY_KEY = "CompassHelpPrompted"; -// Map Compass +// Map CompassBase // // Markup: // @@ -63,7 +63,7 @@ const StyledCompass = styled.div` `; /** - * Take a compass width and scale it up 10px, instead of hardcoding values like: + * Take a compassbase width and scale it up 10px, instead of hardcoding values like: * // const compassScaleRatio = 66 / 56; */ const getCompassScaleRatio = (compassWidth: string) => @@ -80,7 +80,7 @@ const getCompassScaleRatio = (compassWidth: string) => * - chrome (not even another webkit browser) * - "default browser zoom" (doesn't happen when you are even at 110%, but will * when shrunk down enough) - * - the way our compass is composed + * - the way our compassbase is composed * * The action of triggering the 'active' state (scaled up to * `getCompassScaleRatio()`) & back down means that the "InnerRing" will look @@ -88,10 +88,10 @@ const getCompassScaleRatio = (compassWidth: string) => * chrome will decide to render it in the correct position. * * I haven't dug further to the root cause as doing it like this means wew now - * have a beautiful animating compass. + * have a beautiful animating compassbase. * * So please leave scale(0.9999) alone unless you can fix the rendering issue in - * chrome, or if you want to develop a burning hatred for the compass 🙏🔥 + * chrome, or if you want to develop a burning hatred for the compassbase 🙏🔥 * **/ const StyledCompassOuterRing = styled.div` @@ -149,8 +149,8 @@ type IStateTypes = { activeForTransition: boolean; }; -// the compass on map -class Compass extends React.Component { +// the compassbase on map +class CompassBase extends React.Component { _unsubscribeFromPostRender: any; _unsubscribeFromAnimationFrame: any; private _unsubscribeFromViewerChange?: CesiumEvent.RemoveCallback; @@ -325,7 +325,7 @@ class Compass extends React.Component { }; const { t } = this.props; const active = this.state.active; - const description = t("compass.description"); + const description = t("compassbase.description"); const showGuidance = !this.props.viewState.terria.getLocalProperty( COMPASS_LOCAL_PROPERTY_KEY ); @@ -368,7 +368,7 @@ class Compass extends React.Component { {/* "Center circle icon" */} - + { this.setState({ active: true })} onMouseOut={() => { @@ -443,7 +443,7 @@ const windowPositionScratch = new Cartesian2(); const pickRayScratch = new Ray(); function rotate( - viewModel: Compass, + viewModel: CompassBase, compassElement: Element, cursorVector: Cartesian2 ) { @@ -568,7 +568,7 @@ function rotate( } function orbit( - viewModel: Compass, + viewModel: CompassBase, compassElement: Element, cursorVector: Cartesian2 ) { @@ -732,7 +732,7 @@ function orbit( ); } -function subscribeToAnimationFrame(viewModel: Compass) { +function subscribeToAnimationFrame(viewModel: CompassBase) { viewModel._unsubscribeFromAnimationFrame = (id => () => cancelAnimationFrame(id))( requestAnimationFrame(() => { @@ -744,7 +744,7 @@ function subscribeToAnimationFrame(viewModel: Compass) { ); } -function viewerChange(viewModel: Compass) { +function viewerChange(viewModel: CompassBase) { runInAction(() => { if (isDefined(viewModel.props.terria.cesium)) { if (viewModel._unsubscribeFromPostRender) { @@ -772,7 +772,7 @@ function viewerChange(viewModel: Compass) { } export const COMPASS_NAME = "MapNavigationCompassOuterRing"; -export const COMPASS_TOOL_ID = "compass"; -export default withTranslation()( - withTheme(withTerriaRef(Compass, COMPASS_NAME)) +export const COMPASS_TOOL_ID = "compassbase"; +export const Compass = withTranslation()( + withTheme(withTerriaRef(CompassBase, COMPASS_NAME)) ); diff --git a/lib/ReactViews/GyroscopeGuidance/GyroscopeGuidance.jsx b/lib/ReactViews/Map/MapNavigation/Items/Compass/GyroscopeGuidance.jsx similarity index 91% rename from lib/ReactViews/GyroscopeGuidance/GyroscopeGuidance.jsx rename to lib/ReactViews/Map/MapNavigation/Items/Compass/GyroscopeGuidance.jsx index 88abd356266..329ca1f50fc 100644 --- a/lib/ReactViews/GyroscopeGuidance/GyroscopeGuidance.jsx +++ b/lib/ReactViews/Map/MapNavigation/Items/Compass/GyroscopeGuidance.jsx @@ -3,15 +3,15 @@ import styled, { css } from "styled-components"; import PropTypes from "prop-types"; import { useTranslation } from "react-i18next"; -import Icon from "../../Styled/Icon"; -import Box from "../../Styled/Box"; -import { TextSpan } from "../../Styled/Text"; -import { RawButton } from "../../Styled/Button"; -import Spacing from "../../Styled/Spacing"; -import MapIconButton from "../MapIconButton/MapIconButton"; +import Icon from "../../../../../Styled/Icon"; +import Box from "../../../../../Styled/Box"; +import { TextSpan } from "../../../../../Styled/Text"; +import { RawButton } from "../../../../../Styled/Button"; +import Spacing from "../../../../../Styled/Spacing"; +import MapIconButton from "../../../../MapIconButton/MapIconButton"; // import MenuPanel from "../StandardUserInterface/customizable/MenuPanel"; -import CleanDropdownPanel from "../CleanDropdownPanel/CleanDropdownPanel"; -import { COMPASS_LOCAL_PROPERTY_KEY } from "../Map/Navigation/Items/Compass"; +import CleanDropdownPanel from "../../../../CleanDropdownPanel/CleanDropdownPanel"; +import { COMPASS_LOCAL_PROPERTY_KEY } from "./Compass"; GyroscopeGuidance.propTypes = { viewState: PropTypes.object.isRequired, @@ -129,7 +129,7 @@ GyroscopeGuidancePanel.propTypes = { onClose: PropTypes.func.isRequired }; -export default function GyroscopeGuidance(props) { +export function GyroscopeGuidance(props) { const [controlPanelOpen, setControlPanelOpen] = useState(false); const controlsMapIcon = useRef(); const { t } = useTranslation(); diff --git a/lib/ReactViews/Map/MapNavigation/Items/Compass/index.ts b/lib/ReactViews/Map/MapNavigation/Items/Compass/index.ts new file mode 100644 index 00000000000..fca157c39b0 --- /dev/null +++ b/lib/ReactViews/Map/MapNavigation/Items/Compass/index.ts @@ -0,0 +1 @@ +export { Compass, COMPASS_TOOL_ID } from "./Compass"; diff --git a/lib/ReactViews/Map/Navigation/Items/MapNavigationItem.tsx b/lib/ReactViews/Map/MapNavigation/Items/MapNavigationItem.tsx similarity index 94% rename from lib/ReactViews/Map/Navigation/Items/MapNavigationItem.tsx rename to lib/ReactViews/Map/MapNavigation/Items/MapNavigationItem.tsx index 83e0ac7aa29..75e7591a82a 100644 --- a/lib/ReactViews/Map/Navigation/Items/MapNavigationItem.tsx +++ b/lib/ReactViews/Map/MapNavigation/Items/MapNavigationItem.tsx @@ -19,7 +19,7 @@ interface PropTypes { } @observer -class MapNavigationItem extends React.Component { +class MapNavigationItemBase extends React.Component { constructor(props: PropTypes) { super(props); } @@ -73,4 +73,4 @@ export const Control = styled(Box).attrs({ text-align: center; `; -export default withTranslation()(MapNavigationItem); +export const MapNavigationItem = withTranslation()(MapNavigationItemBase); diff --git a/lib/ReactViews/Map/Navigation/Items/MeasureTool.ts b/lib/ReactViews/Map/MapNavigation/Items/MeasureTool.ts similarity index 99% rename from lib/ReactViews/Map/Navigation/Items/MeasureTool.ts rename to lib/ReactViews/Map/MapNavigation/Items/MeasureTool.ts index c07fc0cab17..4aaa58bce46 100644 --- a/lib/ReactViews/Map/Navigation/Items/MeasureTool.ts +++ b/lib/ReactViews/Map/MapNavigation/Items/MeasureTool.ts @@ -21,7 +21,7 @@ interface MeasureToolOptions { onClose(): void; } -export default class MeasureTool extends MapNavigationItemController { +export class MeasureTool extends MapNavigationItemController { static id = "measure-tool"; static displayName = "MeasureTool"; diff --git a/lib/ReactViews/Map/Navigation/Items/MyLocation.ts b/lib/ReactViews/Map/MapNavigation/Items/MyLocation.ts similarity index 98% rename from lib/ReactViews/Map/Navigation/Items/MyLocation.ts rename to lib/ReactViews/Map/MapNavigation/Items/MyLocation.ts index 211da462262..300b97d82bd 100644 --- a/lib/ReactViews/Map/Navigation/Items/MyLocation.ts +++ b/lib/ReactViews/Map/MapNavigation/Items/MyLocation.ts @@ -19,7 +19,7 @@ interface PropTypes { terria: Terria; } -class MyLocation extends MapNavigationItemController { +export class MyLocation extends MapNavigationItemController { static id = "my-location"; static displayName = "MyLocation"; readonly terria: Terria; @@ -188,5 +188,3 @@ class MyLocation extends MapNavigationItemController { } } } - -export default MyLocation; diff --git a/lib/ReactViews/Map/Navigation/Items/ToggleSplitterTool.ts b/lib/ReactViews/Map/MapNavigation/Items/ToggleSplitterTool.ts similarity index 100% rename from lib/ReactViews/Map/Navigation/Items/ToggleSplitterTool.ts rename to lib/ReactViews/Map/MapNavigation/Items/ToggleSplitterTool.ts diff --git a/lib/ReactViews/Map/Navigation/Items/ToolButton.tsx b/lib/ReactViews/Map/MapNavigation/Items/ToolButton.tsx similarity index 100% rename from lib/ReactViews/Map/Navigation/Items/ToolButton.tsx rename to lib/ReactViews/Map/MapNavigation/Items/ToolButton.tsx diff --git a/lib/ReactViews/Map/Navigation/Items/ZoomControl.tsx b/lib/ReactViews/Map/MapNavigation/Items/ZoomControl.tsx similarity index 97% rename from lib/ReactViews/Map/Navigation/Items/ZoomControl.tsx rename to lib/ReactViews/Map/MapNavigation/Items/ZoomControl.tsx index 1e641ee161a..5b2eaf92563 100644 --- a/lib/ReactViews/Map/Navigation/Items/ZoomControl.tsx +++ b/lib/ReactViews/Map/MapNavigation/Items/ZoomControl.tsx @@ -17,7 +17,7 @@ import Box from "../../../../Styled/Box"; import { RawButton } from "../../../../Styled/Button"; import Icon, { GLYPHS } from "../../../../Styled/Icon"; import Ul, { Li } from "../../../../Styled/List"; -import Terria from "./../../../../Models/Terria"; +import Terria from "../../../../Models/Terria"; const Tween = require("terriajs-cesium/Source/ThirdParty/Tween").default; @@ -29,7 +29,7 @@ interface PropTypes extends WithTranslation { export const ZOOM_CONTROL_ID = "zoom"; -class ZoomControl extends React.Component { +class ZoomControlBase extends React.Component { static displayName = "ZoomControl"; constructor(props: PropTypes) { @@ -236,10 +236,9 @@ const StyledZoomControl = styled(Box).attrs(props => ({ width: 20px; fill: ${props => props.theme.darkWithOverlay}; } - ${Li} { margin: 5px 0; } `; -export default withTranslation()(withTheme(ZoomControl)); +export const ZoomControl = withTranslation()(withTheme(ZoomControlBase)); diff --git a/lib/ReactViews/Map/MapNavigation/Items/index.ts b/lib/ReactViews/Map/MapNavigation/Items/index.ts new file mode 100644 index 00000000000..7d28299b240 --- /dev/null +++ b/lib/ReactViews/Map/MapNavigation/Items/index.ts @@ -0,0 +1,14 @@ +export { + AR_TOOL_ID, + AugmentedVirtualityController, + AugmentedVirtualityHoverController, + AugmentedVirtualityRealign, + AugmentedVirtualityRealignController +} from "./AugmentedVirtualityTool"; +export { CloseToolButton } from "./CloseToolButton"; +export * from "./Compass"; +export { Control, MapNavigationItem } from "./MapNavigationItem"; +export { MeasureTool } from "./MeasureTool"; +export { MyLocation } from "./MyLocation"; +export { ToggleSplitterController } from "./ToggleSplitterTool"; +export { ZoomControl, ZOOM_CONTROL_ID } from "./ZoomControl"; diff --git a/lib/ReactViews/Map/Navigation/MapNavigation.tsx b/lib/ReactViews/Map/MapNavigation/MapNavigation.tsx similarity index 90% rename from lib/ReactViews/Map/Navigation/MapNavigation.tsx rename to lib/ReactViews/Map/MapNavigation/MapNavigation.tsx index f7c7ce7d06e..d66609c783f 100644 --- a/lib/ReactViews/Map/Navigation/MapNavigation.tsx +++ b/lib/ReactViews/Map/MapNavigation/MapNavigation.tsx @@ -12,7 +12,6 @@ import { observer } from "mobx-react"; import React from "react"; import { WithTranslation, withTranslation } from "react-i18next"; import styled, { DefaultTheme, withTheme } from "styled-components"; -import isDefined from "../../../Core/isDefined"; import ViewState from "../../../ReactViewModels/ViewState"; import Box from "../../../Styled/Box"; import Icon, { GLYPHS } from "../../../Styled/Icon"; @@ -22,9 +21,9 @@ import MapNavigationModel, { } from "../../../ViewModels/MapNavigation/MapNavigationModel"; import withControlledVisibility from "../../HOCs/withControlledVisibility"; import MapIconButton from "../../MapIconButton/MapIconButton"; -import MapNavigationItem, { Control } from "./Items/MapNavigationItem"; +import { filterViewerAndScreenSize } from "./filterViewerAndScreenSize"; +import { Control, MapNavigationItem } from "./Items"; import { registerMapNavigations } from "./registerMapNavigations"; -import { ScreenSize } from "../../../ViewModels/CompositeBar/CompositeBarModel"; const OVERFLOW_ACTION_SIZE = 42; @@ -55,11 +54,9 @@ const StyledMapNavigation = styled.div` } } pointer-events: none; - button { pointer-events: auto; } - ${p => p.trainerBarVisible && ` @@ -89,7 +86,7 @@ enum Orientation { } @observer -class MapNavigation extends React.Component { +class MapNavigationBase extends React.Component { static displayName = "MapNavigation"; private navigationRef = React.createRef(); private readonly resizeListener: () => any; @@ -328,27 +325,6 @@ class MapNavigation extends React.Component { } } -export default withTranslation()( - withTheme(withControlledVisibility(MapNavigation)) +export const MapNavigation = withTranslation()( + withTheme(withControlledVisibility(MapNavigationBase)) ); - -export function filterViewerAndScreenSize( - item: IMapNavigationItem, - viewState: ViewState -) { - const currentViewer = viewState.terria.mainViewer.viewerMode; - const screenSize: ScreenSize = item.screenSize ?? "any"; - if (viewState.useSmallScreenInterface) { - return ( - (!isDefined(item.controller.viewerMode) || - item.controller.viewerMode === currentViewer) && - (screenSize === "any" || item.screenSize === "small") - ); - } else { - return ( - (!isDefined(item.controller.viewerMode) || - item.controller.viewerMode === currentViewer) && - (screenSize === "any" || item.screenSize === "medium") - ); - } -} diff --git a/lib/ReactViews/Map/MapNavigation/filterViewerAndScreenSize.ts b/lib/ReactViews/Map/MapNavigation/filterViewerAndScreenSize.ts new file mode 100644 index 00000000000..d555f60305a --- /dev/null +++ b/lib/ReactViews/Map/MapNavigation/filterViewerAndScreenSize.ts @@ -0,0 +1,25 @@ +import isDefined from "../../../Core/isDefined"; +import ViewState from "../../../ReactViewModels/ViewState"; +import { ScreenSize } from "../../../ViewModels/CompositeBar/CompositeBarModel"; +import { IMapNavigationItem } from "../../../ViewModels/MapNavigation/MapNavigationModel"; + +export function filterViewerAndScreenSize( + item: IMapNavigationItem, + viewState: ViewState +) { + const currentViewer = viewState.terria.mainViewer.viewerMode; + const screenSize: ScreenSize = item.screenSize ?? "any"; + if (viewState.useSmallScreenInterface) { + return ( + (!isDefined(item.controller.viewerMode) || + item.controller.viewerMode === currentViewer) && + (screenSize === "any" || item.screenSize === "small") + ); + } else { + return ( + (!isDefined(item.controller.viewerMode) || + item.controller.viewerMode === currentViewer) && + (screenSize === "any" || item.screenSize === "medium") + ); + } +} diff --git a/lib/ReactViews/Map/MapNavigation/index.ts b/lib/ReactViews/Map/MapNavigation/index.ts new file mode 100644 index 00000000000..0511deeab3f --- /dev/null +++ b/lib/ReactViews/Map/MapNavigation/index.ts @@ -0,0 +1,2 @@ +export { CollapsedNavigation } from "./CollapsedNavigation"; +export { MapNavigation } from "./MapNavigation"; diff --git a/lib/ReactViews/Map/Navigation/registerMapNavigations.tsx b/lib/ReactViews/Map/MapNavigation/registerMapNavigations.tsx similarity index 92% rename from lib/ReactViews/Map/Navigation/registerMapNavigations.tsx rename to lib/ReactViews/Map/MapNavigation/registerMapNavigations.tsx index 2a3a731c1e2..3c48d555e87 100644 --- a/lib/ReactViews/Map/Navigation/registerMapNavigations.tsx +++ b/lib/ReactViews/Map/MapNavigation/registerMapNavigations.tsx @@ -18,14 +18,16 @@ import { AugmentedVirtualityController, AugmentedVirtualityHoverController, AugmentedVirtualityRealign, - AugmentedVirtualityRealignController -} from "./Items/AugmentedVirtualityTool"; -import CloseToolButton from "./Items/CloseToolButton"; -import Compass, { COMPASS_TOOL_ID } from "./Items/Compass"; -import MeasureTool from "./Items/MeasureTool"; -import MyLocation from "./Items/MyLocation"; -import { ToggleSplitterController } from "./Items/ToggleSplitterTool"; -import ZoomControl, { ZOOM_CONTROL_ID } from "./Items/ZoomControl"; + AugmentedVirtualityRealignController, + CloseToolButton, + Compass, + COMPASS_TOOL_ID, + MeasureTool, + MyLocation, + ToggleSplitterController, + ZoomControl, + ZOOM_CONTROL_ID +} from "./Items"; export const CLOSE_TOOL_ID = "close-tool"; @@ -135,7 +137,7 @@ export const registerMapNavigations = (viewState: ViewState) => { location: "TOP", screenSize: undefined, controller: closeToolButtonController, - render: , + render: , order: 7 }); closeToolButtonController.setVisible(false); diff --git a/lib/ReactViews/Map/HelpButton/HelpButton.tsx b/lib/ReactViews/Map/MenuBar/HelpButton/HelpButton.tsx similarity index 86% rename from lib/ReactViews/Map/HelpButton/HelpButton.tsx rename to lib/ReactViews/Map/MenuBar/HelpButton/HelpButton.tsx index 90b73e41868..91a1fbeafce 100644 --- a/lib/ReactViews/Map/HelpButton/HelpButton.tsx +++ b/lib/ReactViews/Map/MenuBar/HelpButton/HelpButton.tsx @@ -1,10 +1,10 @@ import React from "react"; import { useTranslation } from "react-i18next"; -import ViewState from "../../../ReactViewModels/ViewState"; -import Icon from "../../../Styled/Icon"; -import Text from "../../../Styled/Text"; -import Prompt from "../../Generic/Prompt"; +import ViewState from "../../../../ReactViewModels/ViewState"; +import Icon from "../../../../Styled/Icon"; +import Text from "../../../../Styled/Text"; +import Prompt from "../../../Generic/Prompt"; import Styles from "./help-button.scss"; import { runInAction } from "mobx"; diff --git a/lib/ReactViews/Map/MenuBar/HelpButton/help-button.scss b/lib/ReactViews/Map/MenuBar/HelpButton/help-button.scss new file mode 100644 index 00000000000..fa774176e12 --- /dev/null +++ b/lib/ReactViews/Map/MenuBar/HelpButton/help-button.scss @@ -0,0 +1,4 @@ +.helpBtn { + composes: btn from "../../../../Sass/common/_buttons.scss"; + composes: btn--map from "../../../../Sass/common/_buttons.scss"; +} diff --git a/lib/ReactViews/Map/HelpButton/help-button.scss.d.ts b/lib/ReactViews/Map/MenuBar/HelpButton/help-button.scss.d.ts similarity index 100% rename from lib/ReactViews/Map/HelpButton/help-button.scss.d.ts rename to lib/ReactViews/Map/MenuBar/HelpButton/help-button.scss.d.ts diff --git a/lib/ReactViews/Map/MenuBar.jsx b/lib/ReactViews/Map/MenuBar/MenuBar.jsx similarity index 91% rename from lib/ReactViews/Map/MenuBar.jsx rename to lib/ReactViews/Map/MenuBar/MenuBar.jsx index 601021c5d8e..18bdef81b51 100644 --- a/lib/ReactViews/Map/MenuBar.jsx +++ b/lib/ReactViews/Map/MenuBar/MenuBar.jsx @@ -3,17 +3,17 @@ import styled from "styled-components"; import PropTypes from "prop-types"; import classNames from "classnames"; -import SettingPanel from "./Panels/SettingPanel"; -import SharePanel from "./Panels/SharePanel/SharePanel"; -import ToolsPanel from "./Panels/ToolsPanel/ToolsPanel"; +import SettingPanel from "../Panels/SettingPanel"; +import SharePanel from "../Panels/SharePanel/SharePanel"; +import ToolsPanel from "../Panels/ToolsPanel/ToolsPanel"; import StoryButton from "./StoryButton/StoryButton"; -import LangPanel from "./Panels/LangPanel/LangPanel"; +import LangPanel from "../Panels/LangPanel/LangPanel"; import Styles from "./menu-bar.scss"; import { runInAction } from "mobx"; import { observer } from "mobx-react"; -import withControlledVisibility from "../../ReactViews/HOCs/withControlledVisibility"; +import withControlledVisibility from "../../HOCs/withControlledVisibility"; import HelpButton from "./HelpButton/HelpButton"; const StyledMenuBar = styled.div` @@ -117,7 +117,6 @@ MenuBar.displayName = "MenuBar"; MenuBar.propTypes = { terria: PropTypes.object, viewState: PropTypes.object.isRequired, - allBaseMaps: PropTypes.array, // Not implemented yet animationDuration: PropTypes.number, menuItems: PropTypes.arrayOf(PropTypes.element), menuLeftItems: PropTypes.arrayOf(PropTypes.element) diff --git a/lib/ReactViews/Map/StoryButton/StoryButton.tsx b/lib/ReactViews/Map/MenuBar/StoryButton/StoryButton.tsx similarity index 88% rename from lib/ReactViews/Map/StoryButton/StoryButton.tsx rename to lib/ReactViews/Map/MenuBar/StoryButton/StoryButton.tsx index 2f9e2713f80..3be439d76b5 100644 --- a/lib/ReactViews/Map/StoryButton/StoryButton.tsx +++ b/lib/ReactViews/Map/MenuBar/StoryButton/StoryButton.tsx @@ -2,13 +2,13 @@ import React, { Ref } from "react"; import { Trans, useTranslation } from "react-i18next"; import { DefaultTheme } from "styled-components"; -import triggerResize from "../../../Core/triggerResize"; -import Terria from "../../../Models/Terria"; -import ViewState from "../../../ReactViewModels/ViewState"; -import Icon from "../../../Styled/Icon"; -import Text from "../../../Styled/Text"; -import Prompt from "../../Generic/Prompt"; -import { useRefForTerria } from "../../Hooks/useRefForTerria"; +import triggerResize from "../../../../Core/triggerResize"; +import Terria from "../../../../Models/Terria"; +import ViewState from "../../../../ReactViewModels/ViewState"; +import Icon from "../../../../Styled/Icon"; +import Text from "../../../../Styled/Text"; +import Prompt from "../../../Generic/Prompt"; +import { useRefForTerria } from "../../../Hooks/useRefForTerria"; import Styles from "./story-button.scss"; diff --git a/lib/ReactViews/Map/MenuBar/StoryButton/story-button.scss b/lib/ReactViews/Map/MenuBar/StoryButton/story-button.scss new file mode 100644 index 00000000000..b3aa3dad359 --- /dev/null +++ b/lib/ReactViews/Map/MenuBar/StoryButton/story-button.scss @@ -0,0 +1,13 @@ +@import "~terriajs-variables"; + +.storyBtn { + composes: btn from "../../../../Sass/common/_buttons.scss"; + composes: btn--map from "../../../../Sass/common/_buttons.scss"; + + &:hover, + &:focus { + svg { + fill: #ffffff; + } + } +} diff --git a/lib/ReactViews/Map/StoryButton/story-button.scss.d.ts b/lib/ReactViews/Map/MenuBar/StoryButton/story-button.scss.d.ts similarity index 100% rename from lib/ReactViews/Map/StoryButton/story-button.scss.d.ts rename to lib/ReactViews/Map/MenuBar/StoryButton/story-button.scss.d.ts diff --git a/lib/ReactViews/Map/menu-bar.scss b/lib/ReactViews/Map/MenuBar/menu-bar.scss similarity index 83% rename from lib/ReactViews/Map/menu-bar.scss rename to lib/ReactViews/Map/MenuBar/menu-bar.scss index 97656d4e0df..0508b8c6abc 100644 --- a/lib/ReactViews/Map/menu-bar.scss +++ b/lib/ReactViews/Map/MenuBar/menu-bar.scss @@ -22,9 +22,9 @@ margin-left: 165px; } .menu { - composes: list-reset from "../../Sass/common/_base.scss"; - composes: clearfix from "../../Sass/common/_base.scss"; - composes: sm-show from "../../Sass/common/_base.scss"; + composes: list-reset from "../../../Sass/common/_base.scss"; + composes: clearfix from "../../../Sass/common/_base.scss"; + composes: sm-show from "../../../Sass/common/_base.scss"; margin: 0 $padding-small $padding-small $padding-small; @@ -75,11 +75,11 @@ } .flex { - composes: flex from "../../Sass/common/_base.scss"; + composes: flex from "../../../Sass/common/_base.scss"; } .langBtn { - composes: btn from "../../Sass/common/_buttons.scss"; - composes: btn--map from "../../Sass/common/_buttons.scss"; + composes: btn from "../../../Sass/common/_buttons.scss"; + composes: btn--map from "../../../Sass/common/_buttons.scss"; text-transform: uppercase; } diff --git a/lib/ReactViews/Map/menu-bar.scss.d.ts b/lib/ReactViews/Map/MenuBar/menu-bar.scss.d.ts similarity index 100% rename from lib/ReactViews/Map/menu-bar.scss.d.ts rename to lib/ReactViews/Map/MenuBar/menu-bar.scss.d.ts diff --git a/lib/ReactViews/Map/Navigation/FullScreenButton.jsx b/lib/ReactViews/Map/Navigation/FullScreenButton.jsx deleted file mode 100644 index 36b8f1ec15a..00000000000 --- a/lib/ReactViews/Map/Navigation/FullScreenButton.jsx +++ /dev/null @@ -1,60 +0,0 @@ -"use strict"; -const React = require("react"); -const createReactClass = require("create-react-class"); -const PropTypes = require("prop-types"); -import Styles from "./full_screen_button.scss"; -import classNames from "classnames"; -import Icon from "../../../Styled/Icon"; - -// The button to make the map full screen and hide the workbench. -const FullScreenButton = createReactClass({ - displayName: "FullScreenButton", - - propTypes: { - terria: PropTypes.object, - viewState: PropTypes.object.isRequired, - animationDuration: PropTypes.number // Defaults to 1 millisecond. - }, - - getInitialState() { - return { - isActive: false - }; - }, - - toggleFullScreen() { - this.props.viewState.setIsMapFullScreen( - !this.props.viewState.isMapFullScreen - ); - }, - - renderButtonText() { - if (this.props.viewState.isMapFullScreen) { - return Show Workbench; - } else { - return ; - } - }, - - render() { - const btnClassName = classNames(Styles.btn, { - [Styles.isActive]: this.props.viewState.isMapFullScreen - }); - const btnTitle = this.props.viewState.isMapFullScreen - ? "Show workbench" - : "Hide workbench"; - return ( -
    - -
    - ); - } -}); -module.exports = FullScreenButton; diff --git a/lib/ReactViews/Map/Panels/HelpPanel/HelpPanel.jsx b/lib/ReactViews/Map/Panels/HelpPanel/HelpPanel.jsx index a4ce63e81d9..bb774a57d4f 100644 --- a/lib/ReactViews/Map/Panels/HelpPanel/HelpPanel.jsx +++ b/lib/ReactViews/Map/Panels/HelpPanel/HelpPanel.jsx @@ -14,7 +14,7 @@ import Icon, { StyledIcon } from "../../../../Styled/Icon"; import Spacing from "../../../../Styled/Spacing"; import Text from "../../../../Styled/Text"; import parseCustomMarkdownToReact from "../../../Custom/parseCustomMarkdownToReact"; -import { withViewState } from "../../../StandardUserInterface/ViewStateContext"; +import { withViewState } from "../../../Context"; import HelpPanelItem from "./HelpPanelItem"; export const HELP_PANEL_ID = "help"; diff --git a/lib/ReactViews/Map/Panels/HelpPanel/HelpPanelItem.jsx b/lib/ReactViews/Map/Panels/HelpPanel/HelpPanelItem.jsx index 42bd18c6841..d4086330207 100644 --- a/lib/ReactViews/Map/Panels/HelpPanel/HelpPanelItem.jsx +++ b/lib/ReactViews/Map/Panels/HelpPanel/HelpPanelItem.jsx @@ -10,7 +10,7 @@ import { import { isJsonString } from "../../../../Core/Json"; import Icon, { StyledIcon } from "../../../../Styled/Icon"; import Text from "../../../../Styled/Text"; -import { applyTranslationIfExists } from "./../../../../Language/languageHelpers"; +import { applyTranslationIfExists } from "../../../../Language/languageHelpers"; import HelpVideoPanel from "./HelpVideoPanel"; @observer diff --git a/lib/ReactViews/Map/Panels/LangPanel/LangPanel.tsx b/lib/ReactViews/Map/Panels/LangPanel/LangPanel.tsx index f05b81a990d..2ad49bc15b8 100644 --- a/lib/ReactViews/Map/Panels/LangPanel/LangPanel.tsx +++ b/lib/ReactViews/Map/Panels/LangPanel/LangPanel.tsx @@ -6,7 +6,7 @@ import { RawButton } from "../../../../Styled/Button"; import Icon from "../../../../Styled/Icon"; import Ul, { Li } from "../../../../Styled/List"; import MenuPanel from "../../../StandardUserInterface/customizable/MenuPanel"; -import Styles from "../../menu-bar.scss"; +import Styles from "../../MenuBar/menu-bar.scss"; const stripLangLocale = (lang: string = ""): string => lang.split("-")[0]; diff --git a/lib/ReactViews/Map/Panels/SharePanel/Print/PrintView.tsx b/lib/ReactViews/Map/Panels/SharePanel/Print/PrintView.tsx index 3beb8fa44d5..4507a17913e 100644 --- a/lib/ReactViews/Map/Panels/SharePanel/Print/PrintView.tsx +++ b/lib/ReactViews/Map/Panels/SharePanel/Print/PrintView.tsx @@ -2,9 +2,9 @@ import DOMPurify from "dompurify"; import React, { useEffect, useRef, useState } from "react"; import ReactDOM from "react-dom"; import { StyleSheetManager, ThemeProvider } from "styled-components"; -import { terriaTheme } from "../../../../StandardUserInterface/StandardTheme"; -import { useViewState } from "../../../../StandardUserInterface/ViewStateContext"; -import DistanceLegend from "../../../Legend/DistanceLegend"; +import { terriaTheme } from "../../../../StandardUserInterface"; +import { useViewState } from "../../../../Context"; +import { DistanceLegend } from "../../../BottomBar/DistanceLegend"; import { buildShareLink, buildShortShareLink, @@ -72,10 +72,19 @@ const styles = ` padding: 5px; } + .tjs-legend__distanceLegend > label { + color: black; + } + + .tjs-legend__distanceLegend:hover { + background: #fff; + } + .tjs-legend__bar { border-bottom: 3px solid black; border-right: 3px solid black; border-left: 3px solid black; + margin: 0 auto; } body { @@ -174,7 +183,6 @@ const PrintView = (props: Props) => { {screenshot ? ( 0 ? rawPercentage : 100 - ); - - this.setState({ - percentage: sanitisedPercentage - }); - }, - - setMode(loading) { - this.setState({ loading: loading }); - }, - - componentWillUnmount() { - this.eventHelper.removeAll(); - }, - - /** - * Progress bar is influced by two loading states: - * The base globe where the progress bar shows actual progress, - * Sources where load progress is indeterminate including 3DTilesets where the progress bar is animated. - */ - render() { - const determinateProgress = this.state.percentage + "%"; - const indeterminateStillLoading = this.state.loading; - const allComplete = this.state.percentage === 100 && !this.state.loading; - - // use the baseMapContrastColor to ensure progress bar is visible on light backgrounds. If contrast color is white, use it. If its black, use the primary color of the current theme. - const backgroundColor = - this.props.viewState.terria.baseMapContrastColor === "#ffffff" - ? "#ffffff" - : this.props.theme.colorPrimary; - - return ( -
    - ); - } - }) -); - -export default withViewState(withTheme(ProgressBar)); diff --git a/lib/ReactViews/Map/ProgressBar.tsx b/lib/ReactViews/Map/ProgressBar.tsx new file mode 100644 index 00000000000..a35f3f30a5f --- /dev/null +++ b/lib/ReactViews/Map/ProgressBar.tsx @@ -0,0 +1,90 @@ +import React, { VFC, useCallback, useEffect, useMemo, useState } from "react"; +import styled, { keyframes, useTheme } from "styled-components"; +import EventHelper from "terriajs-cesium/Source/Core/EventHelper"; +import { useViewState } from "../Context"; + +export const ProgressBar: VFC = () => { + const [loadPercentage, setLoadPercentage] = useState(0); + const [indeterminateLoading, setIndeterminateLoading] = useState(); + + const theme = useTheme(); + const { terria } = useViewState(); + + const setProgress = useCallback((remaining: number, max: number) => { + const rawPercentage = (1 - remaining / max) * 100; + const sanitisedPercentage = Math.floor(remaining > 0 ? rawPercentage : 100); + setLoadPercentage(sanitisedPercentage); + }, []); + + const setMode = (mode: any) => { + setIndeterminateLoading(mode); + }; + + useEffect(() => { + const eventHelper = new EventHelper(); + + eventHelper.add(terria.tileLoadProgressEvent, setProgress); + + eventHelper.add(terria.indeterminateTileLoadProgressEvent, setMode); + + return () => { + eventHelper.removeAll(); + }; + }, []); + + const backgroundColor = useMemo( + () => + terria.baseMapContrastColor === "#ffffff" + ? "#ffffff" + : theme.colorPrimary, + [] + ); + + const allComplete = loadPercentage === 100 && !indeterminateLoading; + + return ( + + ); +}; + +interface IStyledProgressBarProps { + loadPercentage: string; + complete: boolean; + indeterminate: boolean; + backgroundColor: string; +} + +const StyledProgressBar = styled.div` + height: 5px; + overflow: hidden; + transition: opacity 200ms linear, width 200ms linear, visibility 400ms linear; + background-color: ${props => props.backgroundColor}; + width: ${props => props.loadPercentage}; + + ${props => props.complete && `visibility: hidden;`} + + ${props => + props.indeterminate && + ` + width: 100%; + animation: ${indeterminateAnimation} 1.2s infinite linear; + transform-origin: 0% 50%; + `} +`; + +const indeterminateAnimation = keyframes` + 0% { + transform: translateX(0) scaleX(0); + } + 40% { + transform: translateX(0) scaleX(0.4); + } + 100% { + transform: translateX(100%) scaleX(0.5); + } +}`; diff --git a/lib/ReactViews/Map/Splitter.jsx b/lib/ReactViews/Map/Splitter.jsx deleted file mode 100644 index caf89e9b71d..00000000000 --- a/lib/ReactViews/Map/Splitter.jsx +++ /dev/null @@ -1,230 +0,0 @@ -import React from "react"; -import createReactClass from "create-react-class"; -import PropTypes from "prop-types"; -import { withTranslation } from "react-i18next"; -import { GLYPHS, StyledIcon } from "../../Styled/Icon"; -import Styles from "./splitter.scss"; -import { observer } from "mobx-react"; -import { runInAction } from "mobx"; - -// Feature detect support for passive: true in event subscriptions. -// See https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Safely_detecting_option_support -let passiveSupported = false; -try { - const options = Object.defineProperty({}, "passive", { - get: function() { - passiveSupported = true; - return true; - } - }); - - window.addEventListener("test", null, options); - window.removeEventListener("test", null, options); -} catch (err) {} - -const notPassive = passiveSupported ? { passive: false } : false; - -const Splitter = observer( - createReactClass({ - displayName: "Splitter", - - propTypes: { - terria: PropTypes.object.isRequired, - viewState: PropTypes.object.isRequired, - thumbSize: PropTypes.number, - padding: PropTypes.number, - t: PropTypes.func.isRequired - }, - - getDefaultProps() { - return { - thumbSize: 42, - padding: 0 - }; - }, - - componentDidMount() { - const that = this; - window.addEventListener("resize", function() { - that.forceRefresh(); - }); - }, - - componentWillUnmount() { - this.unsubscribe(); - }, - - forceRefresh() { - const smallChange = - this.props.terria.splitPosition < 0.5 ? 0.0001 : -0.0001; // Make sure never <0 or >1. - runInAction(() => { - this.props.terria.splitPosition += smallChange; - }); - }, - - startDrag(event) { - const viewer = this.props.terria.currentViewer; - viewer.pauseMapInteraction(); - - // While dragging is in progress, subscribe to document-level movement and up events. - document.addEventListener("mousemove", this.drag, notPassive); - document.addEventListener("touchmove", this.drag, notPassive); - document.addEventListener("mouseup", this.stopDrag, notPassive); - document.addEventListener("touchend", this.stopDrag, notPassive); - - event.preventDefault(); - event.stopPropagation(); - }, - - drag(event) { - let clientX = event.clientX; - let clientY = event.clientY; - if (event.targetTouches && event.targetTouches.length > 0) { - clientX = event.targetTouches.item(0).clientX; - clientY = event.targetTouches.item(0).clientY; - } - - const viewer = this.props.terria.mainViewer.currentViewer; - const container = viewer.getContainer(); - const mapRect = container.getBoundingClientRect(); - - const that = this; - function computeSplitFraction(startBound, endBound, position) { - const difference = endBound - startBound; - const fraction = (position - startBound) / difference; - - const min = - startBound + that.props.padding + that.props.thumbSize * 0.5; - const max = endBound - that.props.padding - that.props.thumbSize * 0.5; - const minFraction = (min - startBound) / difference; - const maxFraction = (max - startBound) / difference; - - return Math.min(maxFraction, Math.max(minFraction, fraction)); - } - let splitFractionX = computeSplitFraction( - mapRect.left, - mapRect.right, - clientX - ); - let splitFractionY = computeSplitFraction( - mapRect.top, - mapRect.bottom, - clientY - ); - - // We compute the maximum and minium windows bounds as a percentage so that we can always apply the bounds - // restriction as a percentage for consistency (we currently use absolute values for X and percentage values for - // Y, but always apply the constraint as a percentage). - // We use absolute pixel values for horizontal restriction because of the fixed UI elements which occupy an - // absolute amount of screen relestate and 100 px seems like a fine amount for the current UI. - const minX = computeSplitFraction( - mapRect.left, - mapRect.right, - mapRect.left + 100 - ); - const maxX = computeSplitFraction( - mapRect.left, - mapRect.right, - mapRect.right - 100 - ); - // Resctrict to within +/-30% of the center vertically (so we don't run into the top and bottom UI elements). - const minY = 0.2; - const maxY = 0.8; - - splitFractionX = Math.min(maxX, Math.max(minX, splitFractionX)); - splitFractionY = Math.min(maxY, Math.max(minY, splitFractionY)); - - runInAction(() => { - this.props.terria.splitPosition = splitFractionX; - this.props.terria.splitPositionVertical = splitFractionY; - }); - - event.preventDefault(); - event.stopPropagation(); - }, - - stopDrag(event) { - this.unsubscribe(); - - const viewer = this.props.terria.currentViewer; - // Ensure splitter stays in sync with map - this.props.viewState.triggerResizeEvent(); - - viewer.resumeMapInteraction(); - - event.preventDefault(); - event.stopPropagation(); - }, - - unsubscribe() { - document.removeEventListener("mousemove", this.drag, notPassive); - document.removeEventListener("touchmove", this.drag, notPassive); - document.removeEventListener("mouseup", this.stopDrag, notPassive); - document.removeEventListener("touchend", this.stopDrag, notPassive); - window.removeEventListener("resize", this.forceRefresh); - }, - - getPosition() { - const canvasWidth = this.props.terria.currentViewer.getContainer() - .clientWidth; - const canvasHeight = this.props.terria.currentViewer.getContainer() - .clientHeight; - return { - x: this.props.terria.splitPosition * canvasWidth, - y: this.props.terria.splitPositionVertical * canvasHeight - }; - }, - - render() { - if ( - !this.props.terria.showSplitter || - !this.props.terria.currentViewer.canShowSplitter || - !this.props.terria.currentViewer.getContainer() - ) { - return null; - } - - const thumbWidth = this.props.thumbSize; - const position = this.getPosition(); - - const dividerStyle = { - left: position.x + "px", - backgroundColor: this.props.terria.baseMapContrastColor - }; - - const thumbStyle = { - left: position.x + "px", - top: position.y + "px", - width: thumbWidth + "px", - height: thumbWidth + "px", - marginLeft: "-" + thumbWidth * 0.5 + "px", - marginTop: "-" + thumbWidth * 0.5 + "px", - lineHeight: thumbWidth - 2 + "px", - borderRadius: thumbWidth * 0.5 + "px", - fontSize: thumbWidth - 12 + "px" - }; - - const { t } = this.props; - - return ( -
    -
    -
    -
    - -
    - ); - } - }) -); - -module.exports = withTranslation()(Splitter); diff --git a/lib/ReactViews/Map/StoryButton/story-button.scss b/lib/ReactViews/Map/StoryButton/story-button.scss deleted file mode 100644 index 51c17ff0a88..00000000000 --- a/lib/ReactViews/Map/StoryButton/story-button.scss +++ /dev/null @@ -1,13 +0,0 @@ -@import "~terriajs-variables"; - -.storyBtn { - composes: btn from "../../../Sass/common/_buttons.scss"; - composes: btn--map from "../../../Sass/common/_buttons.scss"; - - &:hover, - &:focus { - svg { - fill: #ffffff; - } - } -} diff --git a/lib/ReactViews/Map/TerriaViewerWrapper.jsx b/lib/ReactViews/Map/TerriaViewerWrapper.jsx deleted file mode 100644 index 06888dab80d..00000000000 --- a/lib/ReactViews/Map/TerriaViewerWrapper.jsx +++ /dev/null @@ -1,57 +0,0 @@ -import React from "react"; -import PropTypes from "prop-types"; -import { observer } from "mobx-react"; - -import Styles from "./terria-viewer-wrapper.scss"; - -import Splitter from "./Splitter"; -// eslint-disable-next-line no-unused-vars -import TerriaViewer from "../../ViewModels/TerriaViewer"; - -/** - * @typedef {object} Props - * @prop {Terria} terria - * @prop {ViewState} viewState - * - * @extends {React.Component} - */ -@observer -class TerriaViewerWrapper extends React.Component { - static propTypes = { - terria: PropTypes.object.isRequired, - viewState: PropTypes.object.isRequired - }; - - /** - * @argument {HTMLDivElement} container - */ - containerRef = container => { - this.props.terria.mainViewer.attached && - this.props.terria.mainViewer.detach(); - if (container !== null) { - this.props.terria.mainViewer.attach(container); - } - }; - - componentWillUnmount() { - this.props.terria.mainViewer.attached && - this.props.terria.mainViewer.detach(); - } - - render() { - return ( - - ); - } -} -module.exports = TerriaViewerWrapper; diff --git a/lib/ReactViews/Map/TerriaViewerWrapper/Splitter/Splitter.tsx b/lib/ReactViews/Map/TerriaViewerWrapper/Splitter/Splitter.tsx new file mode 100644 index 00000000000..2865d8a4543 --- /dev/null +++ b/lib/ReactViews/Map/TerriaViewerWrapper/Splitter/Splitter.tsx @@ -0,0 +1,102 @@ +import { runInAction } from "mobx"; +import { observer } from "mobx-react"; +import React, { FC, useCallback, useEffect } from "react"; +import { useTranslation } from "react-i18next"; +import { useTheme } from "styled-components"; +import Terria from "../../../../Models/Terria"; +import { GLYPHS, StyledIcon } from "../../../../Styled/Icon"; +import { useViewState } from "../../../Context"; +import { useDragHook } from "./dragHook"; + +interface ISplitterProps { + thumbSize?: number; + padding?: number; +} + +export const Splitter: FC = observer( + ({ thumbSize = 42, padding = 0 }) => { + const viewState = useViewState(); + const theme = useTheme(); + const { t } = useTranslation(); + + const { startDrag, dragUnsubscribe } = useDragHook( + viewState, + padding, + thumbSize + ); + + const onResize = useCallback(() => { + const smallChange = + viewState.terria.splitPosition < 0.5 ? 0.0001 : -0.0001; // Make sure never <0 or >1. + runInAction(() => { + viewState.terria.splitPosition += smallChange; + }); + }, [viewState]); + + useEffect(() => { + window.addEventListener("resize", onResize); + return () => { + dragUnsubscribe(); + window.removeEventListener("resize", onResize); + }; + }, [onResize, dragUnsubscribe]); + + if ( + !viewState.terria.showSplitter || + !viewState.terria.currentViewer.canShowSplitter || + !viewState.terria.currentViewer.getContainer() + ) { + return null; + } + + const position = getPosition(viewState.terria); + + return ( +
    +
    +
    +
    + +
    + ); + } +); + +const getPosition = (terria: Terria) => { + const canvasWidth = terria.currentViewer.getContainer()?.clientWidth || 0; + const canvasHeight = terria.currentViewer.getContainer()?.clientHeight || 0; + return { + x: terria.splitPosition * canvasWidth, + y: terria.splitPositionVertical * canvasHeight + }; +}; diff --git a/lib/ReactViews/Map/TerriaViewerWrapper/Splitter/dragHook.ts b/lib/ReactViews/Map/TerriaViewerWrapper/Splitter/dragHook.ts new file mode 100644 index 00000000000..69ee2a8a607 --- /dev/null +++ b/lib/ReactViews/Map/TerriaViewerWrapper/Splitter/dragHook.ts @@ -0,0 +1,166 @@ +import { runInAction } from "mobx"; +import { + MouseEvent as ReactMouseEvent, + TouchEvent as ReactTouchEvent, + useCallback +} from "react"; +import ViewState from "../../../../ReactViewModels/ViewState"; + +// Feature detect support for passive: true in event subscriptions. +// See https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Safely_detecting_option_support +let passiveSupported = false; +try { + const options = Object.defineProperty({}, "passive", { + get: function() { + passiveSupported = true; + return true; + } + }); + + const callback = () => { + return null; + }; + + window.addEventListener("test", callback, options); + window.removeEventListener("test", callback, options); +} catch (err) {} + +const notPassive = passiveSupported ? { passive: false } : false; + +export const useDragHook = ( + viewState: ViewState, + padding: number, + thumbSize: number +) => { + const drag = useCallback( + (e: MouseEvent | TouchEvent) => { + let clientX: number | undefined = undefined; + let clientY: number | undefined = undefined; + if (e instanceof MouseEvent) { + clientX = e.clientX; + clientY = e.clientY; + } else { + if (e.targetTouches && e.targetTouches.length > 0) { + clientX = e.targetTouches.item(0)?.clientX; + clientY = e.targetTouches.item(0)?.clientY; + } + } + if (!clientX || !clientY) return; + + const viewer = viewState.terria.mainViewer.currentViewer; + const container = viewer.getContainer(); + const mapRect = container?.getBoundingClientRect(); + if (!mapRect) return; + + let splitFractionX = computeSplitFraction( + mapRect.left, + mapRect.right, + clientX, + padding, + thumbSize + ); + let splitFractionY = computeSplitFraction( + mapRect.top, + mapRect.bottom, + clientY, + padding, + thumbSize + ); + + // We compute the maximum and minium windows bounds as a percentage so that we can always apply the bounds + // restriction as a percentage for consistency (we currently use absolute values for X and percentage values for + // Y, but always apply the constraint as a percentage). + // We use absolute pixel values for horizontal restriction because of the fixed UI elements which occupy an + // absolute amount of screen relestate and 100 px seems like a fine amount for the current UI. + const minX = computeSplitFraction( + mapRect.left, + mapRect.right, + mapRect.left + 100, + padding, + thumbSize + ); + const maxX = computeSplitFraction( + mapRect.left, + mapRect.right, + mapRect.right - 100, + padding, + thumbSize + ); + // Resctrict to within +/-30% of the center vertically (so we don't run into the top and bottom UI elements). + const minY = 0.2; + const maxY = 0.8; + + splitFractionX = Math.min(maxX, Math.max(minX, splitFractionX)); + splitFractionY = Math.min(maxY, Math.max(minY, splitFractionY)); + + runInAction(() => { + viewState.terria.splitPosition = splitFractionX; + viewState.terria.splitPositionVertical = splitFractionY; + }); + + e.preventDefault(); + e.stopPropagation(); + }, + [viewState] + ); + + const stopDrag = useCallback( + (e: Event) => { + dragUnsubscribe(); + + const viewer = viewState.terria.currentViewer; + // Ensure splitter stays in sync with map + viewState.triggerResizeEvent(); + + viewer.resumeMapInteraction(); + + e.preventDefault(); + e.stopPropagation(); + }, + [viewState] + ); + + const startDrag = useCallback( + (e: ReactMouseEvent | ReactTouchEvent | undefined) => { + const viewer = viewState.terria.currentViewer; + viewer.pauseMapInteraction(); + + // While dragging is in progress, subscribe to document-level movement and up events. + document.addEventListener("mousemove", drag, notPassive); + document.addEventListener("touchmove", drag, notPassive); + document.addEventListener("mouseup", stopDrag, notPassive); + document.addEventListener("touchend", stopDrag, notPassive); + + e?.preventDefault(); + e?.stopPropagation(); + }, + [drag, stopDrag, viewState] + ); + + const dragUnsubscribe = useCallback(() => { + document.removeEventListener("mousemove", drag, notPassive as never); + document.removeEventListener("touchmove", drag, notPassive as never); + document.removeEventListener("mouseup", stopDrag, notPassive as never); + document.removeEventListener("touchend", stopDrag, notPassive as never); + }, [drag, stopDrag]); + + return { startDrag, dragUnsubscribe }; +}; + +function computeSplitFraction( + startBound: number, + endBound: number, + position: number, + padding: number, + thumbSize: number +) { + const difference = endBound - startBound; + const fraction = (position - startBound) / difference; + + const min = startBound + padding + thumbSize * 0.5; + const max = endBound - padding - thumbSize * 0.5; + const minFraction = (min - startBound) / difference; + const maxFraction = (max - startBound) / difference; + + return Math.min(maxFraction, Math.max(minFraction, fraction)); +} diff --git a/lib/ReactViews/Map/TerriaViewerWrapper/TerriaViewerWrapper.tsx b/lib/ReactViews/Map/TerriaViewerWrapper/TerriaViewerWrapper.tsx new file mode 100644 index 00000000000..00ad97196fd --- /dev/null +++ b/lib/ReactViews/Map/TerriaViewerWrapper/TerriaViewerWrapper.tsx @@ -0,0 +1,84 @@ +import React, { FC, useEffect, useRef } from "react"; + +import { Splitter } from "./Splitter/Splitter"; +import { useViewState } from "../../Context"; +import styled from "styled-components"; + +export const TerriaViewerWrapper: FC = () => { + const viewState = useViewState(); + const containerRef = useRef(null); + + useEffect(() => { + if (viewState.terria.mainViewer.attached) { + viewState.terria.mainViewer.detach(); + } + if (containerRef.current) { + viewState.terria.mainViewer.attach(containerRef.current); + } + + return () => { + viewState.terria.mainViewer.detach(); + }; + }, [viewState]); + + return ( + + + Loading the map, please wait... + + +
    + + ); +}; + +const TerrriaViewerContainer = styled.aside` + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; +`; + +const StyledMapPlaceholder = styled.div` + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + color: black; + text-align: center; + width: 100%; + height: 25%; + margin: auto; + @media (min-width: ${p => p.theme.sm}px) { + color: white; + } +`; diff --git a/lib/ReactViews/Map/TerriaViewerWrapper/index.ts b/lib/ReactViews/Map/TerriaViewerWrapper/index.ts new file mode 100644 index 00000000000..fb3377a1c87 --- /dev/null +++ b/lib/ReactViews/Map/TerriaViewerWrapper/index.ts @@ -0,0 +1 @@ +export { TerriaViewerWrapper } from "./TerriaViewerWrapper"; diff --git a/lib/ReactViews/StandardUserInterface/Toast.tsx b/lib/ReactViews/Map/Toast.tsx similarity index 100% rename from lib/ReactViews/StandardUserInterface/Toast.tsx rename to lib/ReactViews/Map/Toast.tsx diff --git a/lib/ReactViews/Map/experimental-features.scss b/lib/ReactViews/Map/experimental-features.scss deleted file mode 100644 index c9a98d01566..00000000000 --- a/lib/ReactViews/Map/experimental-features.scss +++ /dev/null @@ -1,22 +0,0 @@ -@import "~terriajs-variables"; - -.experimental-features { - position: absolute; - left: 25px; - bottom: 25px; - z-index: 1; - - @media (min-width: $sm) { - top: auto; - bottom: 100px; - } -} - -.control { - margin: 15px 0; - text-align: center; - - &:last-child { - margin-bottom: 0; - } -} diff --git a/lib/ReactViews/Map/experimental-features.scss.d.ts b/lib/ReactViews/Map/experimental-features.scss.d.ts deleted file mode 100644 index d84db085ee8..00000000000 --- a/lib/ReactViews/Map/experimental-features.scss.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -// This file is automatically generated. -// Please do not change this file! -interface CssExports { - 'control': string; - 'experimental-features': string; - 'experimentalFeatures': string; -} -declare var cssExports: CssExports; -export = cssExports; diff --git a/lib/ReactViews/Map/progress-bar.scss b/lib/ReactViews/Map/progress-bar.scss deleted file mode 100644 index 7e05acb098d..00000000000 --- a/lib/ReactViews/Map/progress-bar.scss +++ /dev/null @@ -1,31 +0,0 @@ -.progress-bar { - z-index: 1; - position: absolute; - top: 0; - left: 0; - height: 5px; - overflow: hidden; - transition: opacity 200ms linear, width 200ms linear, visibility 400ms linear; -} - -.complete { - visibility: hidden; -} - -.indeterminate-bar-animated { - width: 100%; - animation: indeterminateAnimation 1.2s infinite linear; - transform-origin: 0% 50%; -} - -@keyframes indeterminateAnimation { - 0% { - transform: translateX(0) scaleX(0); - } - 40% { - transform: translateX(0) scaleX(0.4); - } - 100% { - transform: translateX(100%) scaleX(0.5); - } -} diff --git a/lib/ReactViews/Map/progress-bar.scss.d.ts b/lib/ReactViews/Map/progress-bar.scss.d.ts deleted file mode 100644 index ae6c7a6c853..00000000000 --- a/lib/ReactViews/Map/progress-bar.scss.d.ts +++ /dev/null @@ -1,12 +0,0 @@ -// This file is automatically generated. -// Please do not change this file! -interface CssExports { - 'complete': string; - 'indeterminate-bar-animated': string; - 'indeterminateAnimation': string; - 'indeterminateBarAnimated': string; - 'progress-bar': string; - 'progressBar': string; -} -declare var cssExports: CssExports; -export = cssExports; diff --git a/lib/ReactViews/Map/splitter.scss b/lib/ReactViews/Map/splitter.scss deleted file mode 100644 index 9849d3c22d8..00000000000 --- a/lib/ReactViews/Map/splitter.scss +++ /dev/null @@ -1,42 +0,0 @@ -@import "~terriajs-variables"; - -.divider-wrapper { - position: absolute; - width: 100%; - height: 100%; -} - -.divider { - position: absolute; - top: 0; - bottom: 0; - left: 50%; - width: 1px; - background-color: #fff; - pointer-events: none; - z-index: 999; -} - -.thumb { - position: absolute; - width: 40px; - height: 40px; - border-radius: 20px; - border: 1px solid lightgrey; - text-align: center; - line-height: 38px; - left: 50%; - top: 50%; - font-size: 28px; - font-family: monospace; - background-color: white; - color: grey; - margin-top: -20px; - margin-left: -20px; - z-index: 999; - padding: 8px; - cursor: ew-resize; - svg { - fill: #000; - } -} diff --git a/lib/ReactViews/Map/splitter.scss.d.ts b/lib/ReactViews/Map/splitter.scss.d.ts deleted file mode 100644 index e6984139b8c..00000000000 --- a/lib/ReactViews/Map/splitter.scss.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -// This file is automatically generated. -// Please do not change this file! -interface CssExports { - 'divider': string; - 'divider-wrapper': string; - 'dividerWrapper': string; - 'thumb': string; -} -declare var cssExports: CssExports; -export = cssExports; diff --git a/lib/ReactViews/Map/terria-viewer-wrapper.scss b/lib/ReactViews/Map/terria-viewer-wrapper.scss deleted file mode 100644 index 21961915fee..00000000000 --- a/lib/ReactViews/Map/terria-viewer-wrapper.scss +++ /dev/null @@ -1,57 +0,0 @@ -@import "~terriajs-variables"; -@import "../../Sass/common/mixins"; - -.container { - top: 0; - right: 0; - bottom: 0; - left: 0; - position: absolute; -} - -.cesium-container { - top: 0; - right: 0; - bottom: 0; - left: 0; - position: absolute; - cursor: auto; - - :global { - .selection-indicator { - pointer-events: none; - position: absolute; - width: 50px; - height: 50px; - } - - #terriaLogoWrapper { - display: inline-block; - } - - .cesium-widget, - .cesium-widget canvas { - position: absolute; - width: 100%; - height: 100%; - touch-action: none; - } - } -} - -.mapPlaceholder { - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - color: black; - text-align: center; - width: 100%; - height: 25%; - margin: auto; - - @media (min-width: $sm) { - color: white; - } -} diff --git a/lib/ReactViews/Map/terria-viewer-wrapper.scss.d.ts b/lib/ReactViews/Map/terria-viewer-wrapper.scss.d.ts deleted file mode 100644 index 8f5c50b26cb..00000000000 --- a/lib/ReactViews/Map/terria-viewer-wrapper.scss.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -// This file is automatically generated. -// Please do not change this file! -interface CssExports { - 'cesium-container': string; - 'cesiumContainer': string; - 'container': string; - 'mapPlaceholder': string; -} -declare var cssExports: CssExports; -export = cssExports; diff --git a/lib/ReactViews/Mobile/MobileHeader.jsx b/lib/ReactViews/Mobile/MobileHeader.jsx index b6cdc37dd35..78544200602 100644 --- a/lib/ReactViews/Mobile/MobileHeader.jsx +++ b/lib/ReactViews/Mobile/MobileHeader.jsx @@ -11,7 +11,7 @@ import { RawButton } from "../../Styled/Button"; import Icon, { StyledIcon } from "../../Styled/Icon"; import SearchBox from "../Search/SearchBox"; import Branding from "../SidePanel/Branding"; -import { withViewState } from "../StandardUserInterface/ViewStateContext"; +import { withViewState } from "../Context"; import Styles from "./mobile-header.scss"; import MobileMenu from "./MobileMenu"; import MobileModalWindow from "./MobileModalWindow"; @@ -259,7 +259,6 @@ class MobileHeader extends React.Component { menuItems={this.props.menuItems} menuLeftItems={this.props.menuLeftItems} viewState={this.props.viewState} - allBaseMaps={this.props.allBaseMaps} terria={this.props.viewState.terria} showFeedback={ !!this.props.viewState.terria.configParameters.feedbackUrl @@ -299,7 +298,6 @@ const HamburgerButton = styled(RawButton)` MobileHeader.propTypes = { viewState: PropTypes.object.isRequired, - allBaseMaps: PropTypes.array, version: PropTypes.string, menuLeftItems: PropTypes.array, menuItems: PropTypes.array, diff --git a/lib/ReactViews/Mobile/MobileMenu.jsx b/lib/ReactViews/Mobile/MobileMenu.jsx index 4181ce1a572..95a4f6b12b8 100644 --- a/lib/ReactViews/Mobile/MobileMenu.jsx +++ b/lib/ReactViews/Mobile/MobileMenu.jsx @@ -29,7 +29,6 @@ const MobileMenu = observer( showFeedback: PropTypes.bool, terria: PropTypes.object.isRequired, i18n: PropTypes.object, - allBaseMaps: PropTypes.array.isRequired, t: PropTypes.func.isRequired }, diff --git a/lib/ReactViews/Notification/MapInteractionWindow.tsx b/lib/ReactViews/Notification/MapInteractionWindow.tsx index 96881c44ef9..3fa89412f81 100644 --- a/lib/ReactViews/Notification/MapInteractionWindow.tsx +++ b/lib/ReactViews/Notification/MapInteractionWindow.tsx @@ -10,7 +10,7 @@ import isDefined from "../../Core/isDefined"; import MapInteractionMode, { UIMode } from "../../Models/MapInteractionMode"; import ViewState from "../../ReactViewModels/ViewState"; import parseCustomHtmlToReact from "../Custom/parseCustomHtmlToReact"; -import { withViewState } from "../StandardUserInterface/ViewStateContext"; +import { withViewState } from "../Context"; import Styles from "./map-interaction-window.scss"; const MapInteractionWindowWrapper = styled.div<{ isDiffTool: boolean }>` diff --git a/lib/ReactViews/Notification/Notification.tsx b/lib/ReactViews/Notification/Notification.tsx index bf33f2c27b3..4b7e597d1bc 100644 --- a/lib/ReactViews/Notification/Notification.tsx +++ b/lib/ReactViews/Notification/Notification.tsx @@ -1,7 +1,7 @@ import { observer } from "mobx-react"; import React from "react"; import triggerResize from "../../Core/triggerResize"; -import { useViewState } from "../StandardUserInterface/ViewStateContext"; +import { useViewState } from "../Context"; // Avoid type error caused by importing untyped jsx const NotificationWindow = require("./NotificationWindow").default; diff --git a/lib/ReactViews/SidePanel/Branding.tsx b/lib/ReactViews/SidePanel/Branding.tsx index 0a975a2e615..8b9d4b93a9c 100644 --- a/lib/ReactViews/SidePanel/Branding.tsx +++ b/lib/ReactViews/SidePanel/Branding.tsx @@ -4,7 +4,7 @@ import React from "react"; import isDefined from "../../Core/isDefined"; import ViewState from "../../ReactViewModels/ViewState"; import parseCustomHtmlToReact from "../Custom/parseCustomHtmlToReact"; -import { withViewState } from "../StandardUserInterface/ViewStateContext"; +import { withViewState } from "../Context"; const DEFAULT_BRANDING = ''; diff --git a/lib/ReactViews/SidePanel/FullScreenButton.jsx b/lib/ReactViews/SidePanel/FullScreenButton.jsx index 91fb9427a08..55273d9d57d 100644 --- a/lib/ReactViews/SidePanel/FullScreenButton.jsx +++ b/lib/ReactViews/SidePanel/FullScreenButton.jsx @@ -8,7 +8,7 @@ import { withTranslation } from "react-i18next"; import { Category, ViewAction } from "../../Core/AnalyticEvents/analyticEvents"; import Icon from "../../Styled/Icon"; import withControlledVisibility from "../HOCs/withControlledVisibility"; -import { withViewState } from "../StandardUserInterface/ViewStateContext"; +import { withViewState } from "../Context"; import Styles from "./full_screen_button.scss"; // The button to make the map full screen and hide the workbench. diff --git a/lib/ReactViews/SidePanel/SidePanel.tsx b/lib/ReactViews/SidePanel/SidePanel.tsx index 7e326274167..96917be2a1c 100644 --- a/lib/ReactViews/SidePanel/SidePanel.tsx +++ b/lib/ReactViews/SidePanel/SidePanel.tsx @@ -11,17 +11,21 @@ import Text from "../../Styled/Text"; import { ExplorerWindowElementName } from "../ExplorerWindow/ExplorerWindow"; import { useRefForTerria } from "../Hooks/useRefForTerria"; import SearchBoxAndResults from "../Search/SearchBoxAndResults"; -import { withViewState } from "../StandardUserInterface/ViewStateContext"; +import { withViewState } from "../Context"; import Workbench from "../Workbench/Workbench"; const BoxHelpfulHints = styled(Box)``; const ResponsiveSpacing = styled(Box)` + height: 110px; height: 110px; // Hardcoded px value, TODO: make it not hardcoded @media (max-height: 700px) { height: 3vh; } + @media (max-height: 700px) { + height: 3vh; + } `; const HelpfulHintsIcon = () => { diff --git a/lib/ReactViews/Map/ExperimentalFeatures.tsx b/lib/ReactViews/StandardUserInterface/ExperimentalFeatures.tsx similarity index 91% rename from lib/ReactViews/Map/ExperimentalFeatures.tsx rename to lib/ReactViews/StandardUserInterface/ExperimentalFeatures.tsx index 1f4beec8aed..55ec911cd8f 100644 --- a/lib/ReactViews/Map/ExperimentalFeatures.tsx +++ b/lib/ReactViews/StandardUserInterface/ExperimentalFeatures.tsx @@ -1,7 +1,7 @@ import React from "react"; import styled from "styled-components"; import ViewState from "../../ReactViewModels/ViewState"; -import { withViewState } from "../StandardUserInterface/ViewStateContext"; +import { withViewState } from "../Context"; interface IProps { viewState: ViewState; @@ -13,7 +13,6 @@ const ControlsWrapper = styled.div` left: 25px; bottom: 25px; z-index: 1; - @media (min-width: ${props => props.theme.sm}px) { top: auto; bottom: 100px; @@ -22,7 +21,6 @@ const ControlsWrapper = styled.div` const Control = styled.div` margin: 15px 0; text-align: center; - &:last-child { margin-bottom: 0; } diff --git a/lib/ReactViews/StandardUserInterface/GlobalTerriaStyles.ts b/lib/ReactViews/StandardUserInterface/GlobalTerriaStyles.ts index 18cf6d79dae..6d65b5a65db 100644 --- a/lib/ReactViews/StandardUserInterface/GlobalTerriaStyles.ts +++ b/lib/ReactViews/StandardUserInterface/GlobalTerriaStyles.ts @@ -67,4 +67,19 @@ body { button { cursor: pointer; } + +.selection-indicator { + pointer-events: none; + position: absolute; + width: 50px; + height: 50px; +} + +.cesium-widget, +.cesium-widget canvas { + position: absolute; + width: 100%; + height: 100%; + touch-action: none; +} `; diff --git a/lib/ReactViews/StandardUserInterface/MapColumn.jsx b/lib/ReactViews/StandardUserInterface/MapColumn.jsx deleted file mode 100644 index 037a2b31bbe..00000000000 --- a/lib/ReactViews/StandardUserInterface/MapColumn.jsx +++ /dev/null @@ -1,219 +0,0 @@ -import classNames from "classnames"; -import createReactClass from "create-react-class"; -import { observer } from "mobx-react"; -import PropTypes from "prop-types"; -import React from "react"; -import { withTranslation } from "react-i18next"; -import FeatureDetection from "terriajs-cesium/Source/Core/FeatureDetection"; -import BottomDock from "../BottomDock/BottomDock"; -import { MapCredits } from "../Credits"; -import Loader from "../Loader"; -import BottomLeftBar from "../Map/BottomLeftBar/BottomLeftBar"; -import DistanceLegend from "../Map/Legend/DistanceLegend"; -import LocationBar from "../Map/Legend/LocationBar"; -import MenuBar from "../Map/MenuBar"; -import MapNavigation from "../Map/Navigation/MapNavigation"; -import TerriaViewerWrapper from "../Map/TerriaViewerWrapper"; -import SlideUpFadeIn from "../Transitions/SlideUpFadeIn/SlideUpFadeIn"; -import Styles from "./map-column.scss"; -import Toast from "./Toast"; -import { withViewState } from "./ViewStateContext"; - -const chromeVersion = FeatureDetection.chromeVersion(); - -/** - * Right-hand column that contains the map, controls that sit over the map and sometimes the bottom dock containing - * the timeline and charts. - */ -const MapColumn = observer( - createReactClass({ - displayName: "MapColumn", - - propTypes: { - viewState: PropTypes.object.isRequired, - customFeedbacks: PropTypes.array.isRequired, - allBaseMaps: PropTypes.array.isRequired, - animationDuration: PropTypes.number.isRequired, - customElements: PropTypes.object.isRequired, - t: PropTypes.func.isRequired - }, - - getInitialState() { - return {}; - }, - - render() { - const { customElements } = this.props; - const { t } = this.props; - // TODO: remove? see: https://bugs.chromium.org/p/chromium/issues/detail?id=1001663 - const isAboveChrome75 = - chromeVersion && chromeVersion[0] && Number(chromeVersion[0]) > 75; - const mapCellClass = classNames(Styles.mapCell, { - [Styles.mapCellChrome]: isAboveChrome75 - }); - return ( -
    -
    -
    - -
    - - -
    -
    -
    - -
    - - - - - - - - -
    - - -
    -
    - {/* TODO: re-implement/support custom feedbacks */} - {/* -
    - -
    -
    */} - - - -
    {feedbackItem}
    -
    -
    -
    - - - -
    - -
    -
    - -
    -
    -
    -
    - ); - } - }) -); - -export default withTranslation()(withViewState(MapColumn)); diff --git a/lib/ReactViews/StandardUserInterface/SidePanelContainer.tsx b/lib/ReactViews/StandardUserInterface/SidePanelContainer.tsx index 6891012b24e..6d2ba957329 100644 --- a/lib/ReactViews/StandardUserInterface/SidePanelContainer.tsx +++ b/lib/ReactViews/StandardUserInterface/SidePanelContainer.tsx @@ -1,7 +1,7 @@ import { action } from "mobx"; import styled from "styled-components"; import ViewState from "../../ReactViewModels/ViewState"; -import { withViewState } from "./ViewStateContext"; +import { withViewState } from "../Context"; type PropsType = { viewState: ViewState; diff --git a/lib/ReactViews/StandardUserInterface/StandardUserInterface.tsx b/lib/ReactViews/StandardUserInterface/StandardUserInterface.tsx index 28a04676ee6..2502918a5f9 100644 --- a/lib/ReactViews/StandardUserInterface/StandardUserInterface.tsx +++ b/lib/ReactViews/StandardUserInterface/StandardUserInterface.tsx @@ -17,12 +17,11 @@ import FeedbackForm from "../Feedback/FeedbackForm"; import { Medium, Small } from "../Generic/Responsive"; import SatelliteHelpPrompt from "../HelpScreens/SatelliteHelpPrompt"; import withFallback from "../HOCs/withFallback"; -import ExperimentalFeatures from "../Map/ExperimentalFeatures"; -import CollapsedNavigation from "../Map/Navigation/Items/OverflowNavigationItem"; +import ExperimentalFeatures from "./ExperimentalFeatures"; +import { CollapsedNavigation } from "../Map/MapNavigation"; import HelpPanel from "../Map/Panels/HelpPanel/HelpPanel"; import PrintView from "../Map/Panels/SharePanel/Print/PrintView"; -import ProgressBar from "../Map/ProgressBar"; -import TrainerBar from "../Map/TrainerBar/TrainerBar"; +import TrainerBar from "./TrainerBar/TrainerBar"; import MobileHeader from "../Mobile/MobileHeader"; import MapInteractionWindow from "../Notification/MapInteractionWindow"; import Notification from "../Notification/Notification"; @@ -35,9 +34,9 @@ import Tool from "../Tools/Tool"; import TourPortal from "../Tour/TourPortal"; import WelcomeMessage from "../WelcomeMessage/WelcomeMessage"; import SelectableDimensionWorkflow from "../Workflow/SelectableDimensionWorkflow"; -import ContextProviders from "./ContextProviders"; +import { ContextProviders } from "../Context"; import { GlobalTerriaStyles } from "./GlobalTerriaStyles"; -import MapColumn from "./MapColumn"; +import MapColumn from "../Map/MapColumn"; import processCustomElements from "./processCustomElements"; import SidePanelContainer from "./SidePanelContainer"; import Styles from "./standard-user-interface.scss"; @@ -49,13 +48,12 @@ export const animationDuration = 250; interface StandardUserInterfaceProps { terria: ViewState["terria"]; viewState: ViewState; - allBaseMaps?: any[]; themeOverrides?: Partial; minimumLargeScreenWidth?: number; version: string; } -const StandardUserInterface: React.FC = observer( +const StandardUserInterfaceBase: React.FC = observer( props => { const { t } = useTranslation(); @@ -134,7 +132,6 @@ const StandardUserInterface: React.FC = observer( ); const terria = props.terria; - const allBaseMaps = props.allBaseMaps; const showStoryBuilder = props.viewState.storyBuilderShown && @@ -177,7 +174,6 @@ const StandardUserInterface: React.FC = observer( menuItems={customElements.menu} menuLeftItems={customElements.menuLeft} version={props.version} - allBaseMaps={allBaseMaps} /> @@ -227,11 +223,9 @@ const StandardUserInterface: React.FC = observer(
    -
    @@ -310,4 +304,5 @@ const StandardUserInterface: React.FC = observer( } ); -export default withFallback(StandardUserInterface); +export const StandardUserInterface = withFallback(StandardUserInterfaceBase); +export default withFallback(StandardUserInterfaceBase); diff --git a/lib/ReactViews/Map/TrainerBar/TrainerBar.tsx b/lib/ReactViews/StandardUserInterface/TrainerBar/TrainerBar.tsx similarity index 99% rename from lib/ReactViews/Map/TrainerBar/TrainerBar.tsx rename to lib/ReactViews/StandardUserInterface/TrainerBar/TrainerBar.tsx index 531d31d4957..249d36c4f9f 100644 --- a/lib/ReactViews/Map/TrainerBar/TrainerBar.tsx +++ b/lib/ReactViews/StandardUserInterface/TrainerBar/TrainerBar.tsx @@ -17,10 +17,7 @@ import Select from "../../../Styled/Select"; import Spacing from "../../../Styled/Spacing"; import Text, { TextSpan } from "../../../Styled/Text"; import measureElement, { MeasureElementProps } from "../../HOCs/measureElement"; -import { - WithViewState, - withViewState -} from "../../StandardUserInterface/ViewStateContext"; +import { WithViewState, withViewState } from "../../Context"; import { applyTranslationIfExists } from "./../../../Language/languageHelpers"; const StyledHtml: any = require("../../Map/Panels/HelpPanel/StyledHtml") diff --git a/lib/ReactViews/StandardUserInterface/WorkflowPanelContainer.tsx b/lib/ReactViews/StandardUserInterface/WorkflowPanelContainer.tsx index 94ac20446ed..1bd836e38ee 100644 --- a/lib/ReactViews/StandardUserInterface/WorkflowPanelContainer.tsx +++ b/lib/ReactViews/StandardUserInterface/WorkflowPanelContainer.tsx @@ -3,7 +3,7 @@ import styled from "styled-components"; import ViewState from "../../ReactViewModels/ViewState"; import { WorkflowPanelPortalId } from "../Workflow/WorkflowPanel"; import PortalContainer from "./PortalContainer"; -import { withViewState } from "./ViewStateContext"; +import { withViewState } from "../Context"; type PropsType = { viewState: ViewState; @@ -28,10 +28,8 @@ const Container = styled.div<{ show: boolean }>` height: 100vh; width: ${p => p.theme.workflowPanelWidth}px; max-width: ${p => p.theme.workflowPanelWidth}px; - transition: all 0.25s; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); - visibility: ${p => (p.show ? "visible" : "hidden")}; margin-left: ${p => (p.show ? "0px" : `-${p.theme.workflowPanelWidth}px`)}; opacity: ${p => (p.show ? 1 : 0)}; diff --git a/lib/ReactViews/Map/MenuButton.jsx b/lib/ReactViews/StandardUserInterface/customizable/MenuButton.jsx similarity index 95% rename from lib/ReactViews/Map/MenuButton.jsx rename to lib/ReactViews/StandardUserInterface/customizable/MenuButton.jsx index 52395c1ec2b..626bac2eacf 100644 --- a/lib/ReactViews/Map/MenuButton.jsx +++ b/lib/ReactViews/StandardUserInterface/customizable/MenuButton.jsx @@ -1,6 +1,6 @@ import React from "react"; import classNames from "classnames"; -import Icon from "../../Styled/Icon"; +import Icon from "../../../Styled/Icon"; import PropTypes from "prop-types"; import Styles from "./menu-button.scss"; diff --git a/lib/ReactViews/StandardUserInterface/customizable/MenuItem.jsx b/lib/ReactViews/StandardUserInterface/customizable/MenuItem.jsx index 9a8f1aaf321..897122345f0 100644 --- a/lib/ReactViews/StandardUserInterface/customizable/MenuItem.jsx +++ b/lib/ReactViews/StandardUserInterface/customizable/MenuItem.jsx @@ -1,4 +1,4 @@ -import MenuButton from "../../Map/MenuButton"; +import MenuButton from "./MenuButton"; import responsiveSwitch from "./ResponsiveSwitch"; import withControlledVisibility from "../../HOCs/withControlledVisibility"; import MobileMenuItem from "../../Mobile/MobileMenuItem"; diff --git a/lib/ReactViews/Map/menu-button.scss b/lib/ReactViews/StandardUserInterface/customizable/menu-button.scss similarity index 74% rename from lib/ReactViews/Map/menu-button.scss rename to lib/ReactViews/StandardUserInterface/customizable/menu-button.scss index eac534aec5d..b35fa5b3397 100644 --- a/lib/ReactViews/Map/menu-button.scss +++ b/lib/ReactViews/StandardUserInterface/customizable/menu-button.scss @@ -1,8 +1,8 @@ @import "~terriajs-variables"; .btn--about-link { - composes: btn from "../../Sass/common/_buttons.scss"; - composes: btn--map from "../../Sass/common/_buttons.scss"; + composes: btn from "../../../Sass/common/_buttons.scss"; + composes: btn--map from "../../../Sass/common/_buttons.scss"; border-radius: $radius-small; border: 0; svg { diff --git a/lib/ReactViews/Map/menu-button.scss.d.ts b/lib/ReactViews/StandardUserInterface/customizable/menu-button.scss.d.ts similarity index 100% rename from lib/ReactViews/Map/menu-button.scss.d.ts rename to lib/ReactViews/StandardUserInterface/customizable/menu-button.scss.d.ts diff --git a/lib/ReactViews/StandardUserInterface/index.ts b/lib/ReactViews/StandardUserInterface/index.ts new file mode 100644 index 00000000000..f0f63b85c00 --- /dev/null +++ b/lib/ReactViews/StandardUserInterface/index.ts @@ -0,0 +1,5 @@ +export { + StandardUserInterface, + StandardUserInterface as default +} from "./StandardUserInterface"; +export { terriaTheme } from "./StandardTheme"; diff --git a/lib/ReactViews/StandardUserInterface/map-column.scss b/lib/ReactViews/StandardUserInterface/map-column.scss deleted file mode 100644 index 93bf7fa4475..00000000000 --- a/lib/ReactViews/StandardUserInterface/map-column.scss +++ /dev/null @@ -1,99 +0,0 @@ -@import "~terriajs-variables"; -@import "../../Sass/common/mixins"; - -.map__inner { - display: table; - width: 100%; - height: 100%; - - * { - box-sizing: border-box; - } -} -.map__innerChrome { - // Chrome only :( hack until - // https://bugs.chromium.org/p/chromium/issues/detail?id=1001663 gets resolved - display: flex; - flex-flow: column; -} - -.map__row { - display: table-row; - - &:first-child { - height: 100%; - position: relative; - } -} - -.map__cell { - display: table-cell; - position: relative; - width: 100%; -} -.map__cellChrome { - // Chrome only :( hack until - // https://bugs.chromium.org/p/chromium/issues/detail?id=1001663 gets resolved - display: block; - height: 100%; -} - -@include empty-module("map-cell-map"); - -.map-wrapper { - position: absolute; - top: 0; - width: 100%; - z-index: 0; -} - -@include empty-module("feedback"); - -.location-distance { - composes: clearfix from "../../Sass/common/_base.scss"; - display: none; - @media (min-width: $sm) { - display: block; - } - position: absolute; - bottom: 2px; - right: 3px; - z-index: 1; -} - -.feedback-button-wrapper { - @media (min-width: $sm) { - bottom: 100px; - right: $padding * 2; - margin: 0; - } - - @media (max-width: $mobile) { - position: fixed; - } - position: absolute; - z-index: 0; - bottom: 25px; - right: 16px; - margin: 4px 0; -} - -.with-time-series-controls { - bottom: 58px; - - @media (max-width: $mobile) { - bottom: $mobile-bottom-timeline; - } -} - -.print-disclaimer { - display: none; -} - -@media print { - .print-disclaimer { - display: block; - width: 100%; - clear: both; - } -} diff --git a/lib/ReactViews/StandardUserInterface/map-column.scss.d.ts b/lib/ReactViews/StandardUserInterface/map-column.scss.d.ts deleted file mode 100644 index 8f9308b3b49..00000000000 --- a/lib/ReactViews/StandardUserInterface/map-column.scss.d.ts +++ /dev/null @@ -1,29 +0,0 @@ -// This file is automatically generated. -// Please do not change this file! -interface CssExports { - 'feedback': string; - 'feedback-button-wrapper': string; - 'feedbackButtonWrapper': string; - 'location-distance': string; - 'locationDistance': string; - 'map-cell-map': string; - 'map-wrapper': string; - 'mapCell': string; - 'mapCellChrome': string; - 'mapCellMap': string; - 'mapInner': string; - 'mapInnerChrome': string; - 'mapRow': string; - 'mapWrapper': string; - 'map__cell': string; - 'map__cellChrome': string; - 'map__inner': string; - 'map__innerChrome': string; - 'map__row': string; - 'print-disclaimer': string; - 'printDisclaimer': string; - 'with-time-series-controls': string; - 'withTimeSeriesControls': string; -} -declare var cssExports: CssExports; -export = cssExports; diff --git a/lib/ReactViews/Story/StoryBuilder.tsx b/lib/ReactViews/Story/StoryBuilder.tsx index e017fbd2917..289cbad1251 100644 --- a/lib/ReactViews/Story/StoryBuilder.tsx +++ b/lib/ReactViews/Story/StoryBuilder.tsx @@ -27,10 +27,7 @@ import measureElement, { MeasureElementProps } from "../HOCs/measureElement"; import VideoGuide from "../Map/Panels/HelpPanel/VideoGuide"; import { getShareData } from "../Map/Panels/SharePanel/BuildShareLink"; import SharePanel from "../Map/Panels/SharePanel/SharePanel"; -import { - WithViewState, - withViewState -} from "../StandardUserInterface/ViewStateContext"; +import { WithViewState, withViewState } from "../Context"; import Story from "./Story"; import Styles from "./story-builder.scss"; import StoryEditor from "./StoryEditor.jsx"; diff --git a/lib/ReactViews/Story/StoryPanel/StoryPanel.tsx b/lib/ReactViews/Story/StoryPanel/StoryPanel.tsx index 46aba61d34c..2eaf2430c1e 100644 --- a/lib/ReactViews/Story/StoryPanel/StoryPanel.tsx +++ b/lib/ReactViews/Story/StoryPanel/StoryPanel.tsx @@ -15,11 +15,8 @@ import TerriaError from "../../../Core/TerriaError"; import Terria from "../../../Models/Terria"; import Box from "../../../Styled/Box"; import Hr from "../../../Styled/Hr"; -import { onStoryButtonClick } from "../../Map/StoryButton/StoryButton"; -import { - WithViewState, - withViewState -} from "../../StandardUserInterface/ViewStateContext"; +import { onStoryButtonClick } from "../../Map/MenuBar/StoryButton/StoryButton"; +import { WithViewState, withViewState } from "../../Context"; import { Story } from "../Story"; import Styles from "../story-panel.scss"; import StoryBody from "./StoryBody"; diff --git a/lib/ReactViews/Tools/DiffTool/DiffTool.tsx b/lib/ReactViews/Tools/DiffTool/DiffTool.tsx index 3b6befd5cd9..c23842afd61 100644 --- a/lib/ReactViews/Tools/DiffTool/DiffTool.tsx +++ b/lib/ReactViews/Tools/DiffTool/DiffTool.tsx @@ -44,7 +44,7 @@ import { GLYPHS, StyledIcon } from "../../../Styled/Icon"; import Loader from "../../Loader"; import DatePicker from "./DatePicker"; import LocationPicker from "./LocationPicker"; -import { CLOSE_TOOL_ID } from "../../Map/Navigation/registerMapNavigations"; +import { CLOSE_TOOL_ID } from "../../Map/MapNavigation/registerMapNavigations"; const dateFormat = require("dateformat"); @@ -834,7 +834,6 @@ const CloseDifferenceButton = styled(Button)` left: 50%; transform: translateX(-50%); top: 18px; - padding: 0 20px; `; diff --git a/lib/ReactViews/Tools/PedestrianMode/PedestrianMode.tsx b/lib/ReactViews/Tools/PedestrianMode/PedestrianMode.tsx index 457effff180..de2322bc5df 100644 --- a/lib/ReactViews/Tools/PedestrianMode/PedestrianMode.tsx +++ b/lib/ReactViews/Tools/PedestrianMode/PedestrianMode.tsx @@ -8,7 +8,7 @@ import PositionRightOfWorkbench from "../../Workbench/PositionRightOfWorkbench"; import DropPedestrianToGround from "./DropPedestrianToGround"; import MiniMap, { getViewFromScene, MiniMapView } from "./MiniMap"; import MovementControls from "./MovementControls"; -import MeasureTool from "../../Map/Navigation/Items/MeasureTool"; +import { MeasureTool } from "../../Map/MapNavigation/Items"; // The desired camera height measured from the surface in metres export const PEDESTRIAN_HEIGHT = 1.7; diff --git a/lib/ReactViews/Tools/Tool.tsx b/lib/ReactViews/Tools/Tool.tsx index e096229466d..45176ae799a 100644 --- a/lib/ReactViews/Tools/Tool.tsx +++ b/lib/ReactViews/Tools/Tool.tsx @@ -11,7 +11,7 @@ import Terria from "../../Models/Terria"; import ViewerMode from "../../Models/ViewerMode"; import ViewState from "../../ReactViewModels/ViewState"; import MapNavigationItemController from "../../ViewModels/MapNavigation/MapNavigationItemController"; -import { useViewState } from "../StandardUserInterface/ViewStateContext"; +import { useViewState } from "../Context"; interface ToolProps { toolName: string; diff --git a/lib/ReactViews/Tour/TourPortal.jsx b/lib/ReactViews/Tour/TourPortal.jsx index b853f90fbb5..622fc879823 100644 --- a/lib/ReactViews/Tour/TourPortal.jsx +++ b/lib/ReactViews/Tour/TourPortal.jsx @@ -23,7 +23,7 @@ import { parseCustomMarkdownToReactWithOptions } from "../Custom/parseCustomMark import Caret from "../Generic/Caret"; import CloseButton from "../Generic/CloseButton"; import { useWindowSize } from "../Hooks/useWindowSize"; -import { useViewState } from "../StandardUserInterface/ViewStateContext"; +import { useViewState } from "../Context"; import { applyTranslationIfExists } from "./../../Language/languageHelpers"; import { calculateLeftPosition, diff --git a/lib/ReactViews/WelcomeMessage/WelcomeMessage.jsx b/lib/ReactViews/WelcomeMessage/WelcomeMessage.jsx index 0a594033717..1e1381c0780 100644 --- a/lib/ReactViews/WelcomeMessage/WelcomeMessage.jsx +++ b/lib/ReactViews/WelcomeMessage/WelcomeMessage.jsx @@ -12,7 +12,7 @@ import Text, { TextSpan } from "../../Styled/Text"; import { ExplorerWindowElementName } from "../ExplorerWindow/ExplorerWindow"; import { useKeyPress } from "../Hooks/useKeyPress.js"; import VideoGuide from "../Map/Panels/HelpPanel/VideoGuide"; -import { withViewState } from "../StandardUserInterface/ViewStateContext"; +import { withViewState } from "../Context"; import { TourPortalDisplayName } from "../Tour/TourPortal"; import FadeIn from "../Transitions/FadeIn/FadeIn"; import SlideUpFadeIn from "../Transitions/SlideUpFadeIn/SlideUpFadeIn"; diff --git a/lib/ReactViews/Map/Panels/TerrainSide.tsx b/lib/ReactViews/Workbench/TerrainSide.tsx similarity index 92% rename from lib/ReactViews/Map/Panels/TerrainSide.tsx rename to lib/ReactViews/Workbench/TerrainSide.tsx index 7390ad0fb77..6d9c94fd7b2 100644 --- a/lib/ReactViews/Map/Panels/TerrainSide.tsx +++ b/lib/ReactViews/Workbench/TerrainSide.tsx @@ -4,13 +4,13 @@ import React from "react"; import { useTranslation } from "react-i18next"; import { useTheme } from "styled-components"; import SplitDirection from "terriajs-cesium/Source/Scene/SplitDirection"; -import Terria from "../../../Models/Terria"; -import ViewerMode from "../../../Models/ViewerMode"; -import Box from "../../../Styled/Box"; -import Checkbox from "../../../Styled/Checkbox/Checkbox"; -import { TextSpan } from "../../../Styled/Text"; -import { RawButton } from "./../../../Styled/Button"; -import { Spacing } from "./../../../Styled/Spacing"; +import Terria from "../../Models/Terria"; +import ViewerMode from "../../Models/ViewerMode"; +import Box from "../../Styled/Box"; +import Checkbox from "../../Styled/Checkbox/Checkbox"; +import { TextSpan } from "../../Styled/Text"; +import { RawButton } from "../../Styled/Button"; +import { Spacing } from "../../Styled/Spacing"; const sides = { left: "settingPanel.terrain.left", diff --git a/lib/ReactViews/Workbench/WorkbenchSplitScreen.tsx b/lib/ReactViews/Workbench/WorkbenchSplitScreen.tsx index 924354e1d26..578aa8528f2 100644 --- a/lib/ReactViews/Workbench/WorkbenchSplitScreen.tsx +++ b/lib/ReactViews/Workbench/WorkbenchSplitScreen.tsx @@ -11,7 +11,7 @@ import Box from "../../Styled/Box"; import { RawButton } from "../../Styled/Button"; import { GLYPHS, StyledIcon } from "../../Styled/Icon"; import Spacing from "../../Styled/Spacing"; -import TerrainSide from "../Map/Panels/TerrainSide"; +import TerrainSide from "./TerrainSide"; interface IWorkbenchSplitScreenProps { terria: Terria; diff --git a/lib/ReactViews/Workflow/SelectableDimensionWorkflow.tsx b/lib/ReactViews/Workflow/SelectableDimensionWorkflow.tsx index 84401e5eb66..3989e048f74 100644 --- a/lib/ReactViews/Workflow/SelectableDimensionWorkflow.tsx +++ b/lib/ReactViews/Workflow/SelectableDimensionWorkflow.tsx @@ -5,7 +5,7 @@ import { useTranslation } from "react-i18next"; import { getName } from "../../ModelMixins/CatalogMemberMixin"; import { filterSelectableDimensions } from "../../Models/SelectableDimensions/SelectableDimensions"; import SelectableDimension from "../SelectableDimensions/SelectableDimension"; -import { useViewState } from "../StandardUserInterface/ViewStateContext"; +import { useViewState } from "../Context"; import WorkbenchItemControls, { hideAllControls } from "../Workbench/Controls/WorkbenchItemControls"; diff --git a/lib/Styled/Text.tsx b/lib/Styled/Text.tsx index 4c9cae1c2db..972c869eabe 100644 --- a/lib/Styled/Text.tsx +++ b/lib/Styled/Text.tsx @@ -32,7 +32,7 @@ interface ITextWeight { interface ITextPropsBase { displayBlock?: boolean; isLink?: boolean; - nunito?: boolean; + mono?: boolean; openSans?: boolean; breakWord?: boolean; uppercase?: boolean; @@ -67,6 +67,8 @@ export const Text = styled.div` // TODO: themeify family font-family: ${props => props.theme.fontBase}; + + ${props => props.mono && `font-family: ${props.theme.fontMono};`} ${props => props.breakWord && @@ -184,11 +186,6 @@ export const Text = styled.div` ` font-size: ${props.styledFontSize}; `} - ${props => - props.styledLineHeight && - ` - line-height: ${props.styledLineHeight}; - `} ${props => props.highlightLinks && diff --git a/lib/ThirdParty/terriajs-cesium-extra/index.d.ts b/lib/ThirdParty/terriajs-cesium-extra/index.d.ts index a173ff3c2e6..b39d29200e6 100644 --- a/lib/ThirdParty/terriajs-cesium-extra/index.d.ts +++ b/lib/ThirdParty/terriajs-cesium-extra/index.d.ts @@ -53,4 +53,5 @@ declare interface FeatureDetection { isEdge(): boolean; isInternetExplorer(): boolean; internetExplorerVersion(): number[]; + chromeVersion(): number[]; } diff --git a/test/Map/StyledHtmlSpec.tsx b/test/Map/StyledHtmlSpec.tsx index 1cd3cee964c..ddf46cb2d89 100644 --- a/test/Map/StyledHtmlSpec.tsx +++ b/test/Map/StyledHtmlSpec.tsx @@ -5,7 +5,7 @@ import { ThemeProvider } from "styled-components"; import { act } from "react-dom/test-utils"; import Terria from "../../lib/Models/Terria"; import ViewState from "../../lib/ReactViewModels/ViewState"; -import { terriaTheme } from "../../lib/ReactViews/StandardUserInterface/StandardTheme"; +import { terriaTheme } from "../../lib/ReactViews/StandardUserInterface"; import { StyledHtmlRaw } from "../../lib/ReactViews/Map/Panels/HelpPanel/StyledHtml"; import { TooltipWithButtonLauncher } from "../../lib/ReactViews/Generic/TooltipWrapper"; import registerCustomComponentTypes from "../../lib/ReactViews/Custom/registerCustomComponentTypes"; diff --git a/test/ReactViews/ClipboardSpec.tsx b/test/ReactViews/ClipboardSpec.tsx index 407fceee603..9bb3674a875 100644 --- a/test/ReactViews/ClipboardSpec.tsx +++ b/test/ReactViews/ClipboardSpec.tsx @@ -2,7 +2,7 @@ const create: any = require("react-test-renderer").create; import React from "react"; import { act } from "react-dom/test-utils"; import { ThemeProvider } from "styled-components"; -import { terriaTheme } from "../../lib/ReactViews/StandardUserInterface/StandardTheme"; +import { terriaTheme } from "../../lib/ReactViews/StandardUserInterface"; import Clipboard from "../../lib/ReactViews/Clipboard"; import Input from "../../lib/Styled/Input"; import Button from "../../lib/Styled/Button"; diff --git a/test/ReactViews/DimensionSelectorSectionSpec.tsx b/test/ReactViews/DimensionSelectorSectionSpec.tsx index 37f96fb58d7..7fd2fab99f9 100644 --- a/test/ReactViews/DimensionSelectorSectionSpec.tsx +++ b/test/ReactViews/DimensionSelectorSectionSpec.tsx @@ -15,7 +15,7 @@ import SelectableDimensions, { import Terria from "../../lib/Models/Terria"; import { SelectableDimensionGroup } from "../../lib/ReactViews/SelectableDimensions/Group"; import SelectableDimension from "../../lib/ReactViews/SelectableDimensions/SelectableDimension"; -import { terriaTheme } from "../../lib/ReactViews/StandardUserInterface/StandardTheme"; +import { terriaTheme } from "../../lib/ReactViews/StandardUserInterface"; import SelectableDimensionSection from "../../lib/ReactViews/Workbench/Controls/SelectableDimensionSection"; import Checkbox from "../../lib/Styled/Checkbox"; import CatalogMemberTraits from "../../lib/Traits/TraitsClasses/CatalogMemberTraits"; diff --git a/test/ReactViews/Generic/PromptSpec.tsx b/test/ReactViews/Generic/PromptSpec.tsx index 0f37b725af3..59c41d9c017 100644 --- a/test/ReactViews/Generic/PromptSpec.tsx +++ b/test/ReactViews/Generic/PromptSpec.tsx @@ -5,7 +5,7 @@ import Terria from "../../../lib/Models/Terria"; import ViewState from "../../../lib/ReactViewModels/ViewState"; import { runInAction } from "mobx"; const Prompt: any = require("../../../lib/ReactViews/Generic/Prompt").default; -import { terriaTheme } from "../../../lib/ReactViews/StandardUserInterface/StandardTheme"; +import { terriaTheme } from "../../../lib/ReactViews/StandardUserInterface"; import Caret from "../../../lib/ReactViews/Generic/Caret"; describe("HelpPrompt", function() { diff --git a/test/ReactViews/Map/Navigation/Compass/CompassSpec.tsx b/test/ReactViews/Map/Navigation/Compass/CompassSpec.tsx index 6d985e9cf77..befff7771e9 100644 --- a/test/ReactViews/Map/Navigation/Compass/CompassSpec.tsx +++ b/test/ReactViews/Map/Navigation/Compass/CompassSpec.tsx @@ -5,10 +5,8 @@ import { act } from "react-dom/test-utils"; import Terria from "../../../../../lib/Models/Terria"; import ViewState from "../../../../../lib/ReactViewModels/ViewState"; import { ThemeProvider } from "styled-components"; -import { terriaTheme } from "../../../../../lib/ReactViews/StandardUserInterface/StandardTheme"; -// import Compass from "../../../../../lib/ReactViews/Map/Navigation/Compass"; -const Compass: any = require("../../../../../lib/ReactViews/Map/Navigation/Items/Compass") - .default; +import { terriaTheme } from "../../../../../lib/ReactViews/StandardUserInterface"; +import { Compass } from "../../../../../lib/ReactViews/Map/MapNavigation/Items/Compass/Compass"; import { StyledIcon } from "../../../../../lib/Styled/Icon"; describe("Compass", function() { diff --git a/test/ReactViews/GyroscopeGuidance/GyroscopeGuidanceSpec.tsx b/test/ReactViews/Map/Navigation/Compass/GyroscopeGuidanceSpec.tsx similarity index 74% rename from test/ReactViews/GyroscopeGuidance/GyroscopeGuidanceSpec.tsx rename to test/ReactViews/Map/Navigation/Compass/GyroscopeGuidanceSpec.tsx index 2547dc23091..f1b600f049b 100644 --- a/test/ReactViews/GyroscopeGuidance/GyroscopeGuidanceSpec.tsx +++ b/test/ReactViews/Map/Navigation/Compass/GyroscopeGuidanceSpec.tsx @@ -1,10 +1,10 @@ const create: any = require("react-test-renderer").create; import React from "react"; import { act } from "react-dom/test-utils"; -import Terria from "../../../lib/Models/Terria"; -import ViewState from "../../../lib/ReactViewModels/ViewState"; -import GyroscopeGuidance from "../../../lib/ReactViews/GyroscopeGuidance/GyroscopeGuidance"; -import MapIconButton from "../../../lib/ReactViews/MapIconButton/MapIconButton"; +import Terria from "../../../../../lib/Models/Terria"; +import ViewState from "../../../../../lib/ReactViewModels/ViewState"; +import { GyroscopeGuidance } from "../../../../../lib/ReactViews/Map/MapNavigation/Items/Compass/GyroscopeGuidance"; +import MapIconButton from "../../../../../lib/ReactViews/MapIconButton/MapIconButton"; describe("GyroscopeGuidance", function() { let terria: Terria; diff --git a/test/ReactViews/Map/Panels/HelpPanel/VideoGuideSpec.tsx b/test/ReactViews/Map/Panels/HelpPanel/VideoGuideSpec.tsx index f986b0e52bd..e0a3ccaf01b 100644 --- a/test/ReactViews/Map/Panels/HelpPanel/VideoGuideSpec.tsx +++ b/test/ReactViews/Map/Panels/HelpPanel/VideoGuideSpec.tsx @@ -2,7 +2,7 @@ const create: any = require("react-test-renderer").create; import React from "react"; import { act } from "react-dom/test-utils"; import { ThemeProvider } from "styled-components"; -import { terriaTheme } from "../../../../../lib/ReactViews/StandardUserInterface/StandardTheme"; +import { terriaTheme } from "../../../../../lib/ReactViews/StandardUserInterface"; import Terria from "../../../../../lib/Models/Terria"; import ViewState from "../../../../../lib/ReactViewModels/ViewState"; const VideoGuide: any = require("../../../../../lib/ReactViews/Map/Panels/HelpPanel/VideoGuide") diff --git a/test/ReactViews/MeasureToolSpec.jsx b/test/ReactViews/MeasureToolSpec.jsx index 0b644e087f8..1fbe8b48413 100644 --- a/test/ReactViews/MeasureToolSpec.jsx +++ b/test/ReactViews/MeasureToolSpec.jsx @@ -5,7 +5,7 @@ import React from "react"; import Terria from "../../lib/Models/Terria"; import { getMountedInstance } from "./MoreShallowTools"; -import { MeasureTool } from "../../lib/ReactViews/Map/Navigation/MeasureTool"; +import { MeasureTool } from "../../lib/ReactViews/Map/MapNavigation/MeasureTool"; const Entity = require("terriajs-cesium/Source/DataSources/Entity.js").default; const Ellipsoid = require("terriajs-cesium/Source/Core/Ellipsoid.js").default; const ConstantPositionProperty = require("terriajs-cesium/Source/DataSources/ConstantPositionProperty.js") diff --git a/test/ReactViews/Preview/DescriptionSpec.tsx b/test/ReactViews/Preview/DescriptionSpec.tsx index 93e2951f666..77ae47c5e7b 100644 --- a/test/ReactViews/Preview/DescriptionSpec.tsx +++ b/test/ReactViews/Preview/DescriptionSpec.tsx @@ -7,7 +7,7 @@ import Terria from "../../../lib/Models/Terria"; import updateModelFromJson from "../../../lib/Models/Definition/updateModelFromJson"; import WebMapServiceCatalogItem from "../../../lib/Models/Catalog/Ows/WebMapServiceCatalogItem"; import Description from "../../../lib/ReactViews/Preview/Description"; -import { terriaTheme } from "../../../lib/ReactViews/StandardUserInterface/StandardTheme"; +import { terriaTheme } from "../../../lib/ReactViews/StandardUserInterface"; describe("DescriptionSpec", function() { let testRenderer: ReactTestRenderer; diff --git a/test/ReactViews/Search/BreadcrumbsSpec.tsx b/test/ReactViews/Search/BreadcrumbsSpec.tsx index 346db0ce86e..28c70fb927d 100644 --- a/test/ReactViews/Search/BreadcrumbsSpec.tsx +++ b/test/ReactViews/Search/BreadcrumbsSpec.tsx @@ -9,7 +9,7 @@ const DataCatalogTab: any = require("../../../lib/ReactViews/ExplorerWindow/Tabs .default; import Icon from "../../../lib/Styled/Icon"; import { ThemeProvider } from "styled-components"; -import { terriaTheme } from "../../../lib/ReactViews/StandardUserInterface/StandardTheme"; +import { terriaTheme } from "../../../lib/ReactViews/StandardUserInterface"; import { runInAction } from "mobx"; describe("Breadcrumbs", function() { diff --git a/test/ReactViews/Search/SearchBoxAndResultsSpec.tsx b/test/ReactViews/Search/SearchBoxAndResultsSpec.tsx index 4639acc0e23..3378b541bdb 100644 --- a/test/ReactViews/Search/SearchBoxAndResultsSpec.tsx +++ b/test/ReactViews/Search/SearchBoxAndResultsSpec.tsx @@ -8,7 +8,7 @@ import SearchBoxAndResults, { SearchInDataCatalog } from "../../../lib/ReactViews/Search/SearchBoxAndResults"; import { ThemeProvider } from "styled-components"; -import { terriaTheme } from "../../../lib/ReactViews/StandardUserInterface/StandardTheme"; +import { terriaTheme } from "../../../lib/ReactViews/StandardUserInterface"; describe("SearchBoxAndResults", function() { let terria: Terria; diff --git a/test/ReactViews/Search/SearchBoxSpec.tsx b/test/ReactViews/Search/SearchBoxSpec.tsx index cfa30286881..7125cfdaada 100644 --- a/test/ReactViews/Search/SearchBoxSpec.tsx +++ b/test/ReactViews/Search/SearchBoxSpec.tsx @@ -4,7 +4,7 @@ import { act } from "react-dom/test-utils"; import Terria from "../../../lib/Models/Terria"; import ViewState from "../../../lib/ReactViewModels/ViewState"; import { SearchBox } from "../../../lib/ReactViews/Search/SearchBox"; -import { terriaTheme } from "../../../lib/ReactViews/StandardUserInterface/StandardTheme"; +import { terriaTheme } from "../../../lib/ReactViews/StandardUserInterface"; describe("SearchBox", function() { let terria: Terria; diff --git a/test/ReactViews/ShortReportSpec.tsx b/test/ReactViews/ShortReportSpec.tsx index 8c9255eb427..248c4339c0e 100644 --- a/test/ReactViews/ShortReportSpec.tsx +++ b/test/ReactViews/ShortReportSpec.tsx @@ -8,7 +8,7 @@ import { import { ThemeProvider } from "styled-components"; import WebMapServiceCatalogItem from "../../lib/Models/Catalog/Ows/WebMapServiceCatalogItem"; import Terria from "../../lib/Models/Terria"; -import { terriaTheme } from "../../lib/ReactViews/StandardUserInterface/StandardTheme"; +import { terriaTheme } from "../../lib/ReactViews/StandardUserInterface"; import ShortReport from "../../lib/ReactViews/Workbench/Controls/ShortReport"; import Text from "../../lib/Styled/Text"; diff --git a/test/ReactViews/Map/TrainerBar/TrainerBarSpec.tsx b/test/ReactViews/StandardUserInterface/TrainerBar/TrainerBarSpec.tsx similarity index 96% rename from test/ReactViews/Map/TrainerBar/TrainerBarSpec.tsx rename to test/ReactViews/StandardUserInterface/TrainerBar/TrainerBarSpec.tsx index 4d38ca83333..a701a22bc62 100644 --- a/test/ReactViews/Map/TrainerBar/TrainerBarSpec.tsx +++ b/test/ReactViews/StandardUserInterface/TrainerBar/TrainerBarSpec.tsx @@ -3,7 +3,7 @@ import React from "react"; import { act } from "react-dom/test-utils"; import Terria from "../../../../lib/Models/Terria"; import ViewState from "../../../../lib/ReactViewModels/ViewState"; -import TrainerBar from "../../../../lib/ReactViews/Map/TrainerBar/TrainerBar"; +import TrainerBar from "../../../../lib/ReactViews/StandardUserInterface/TrainerBar/TrainerBar"; import Box from "../../../../lib/Styled/Box"; import { createWithContexts } from "../../withContext"; import TestHelpContent from "./test-help-content"; diff --git a/test/ReactViews/Map/TrainerBar/test-help-content.js b/test/ReactViews/StandardUserInterface/TrainerBar/test-help-content.js similarity index 100% rename from test/ReactViews/Map/TrainerBar/test-help-content.js rename to test/ReactViews/StandardUserInterface/TrainerBar/test-help-content.js diff --git a/test/ReactViews/WarningBoxSpec.tsx b/test/ReactViews/WarningBoxSpec.tsx index 417fc486c8c..9fe254d2f8d 100644 --- a/test/ReactViews/WarningBoxSpec.tsx +++ b/test/ReactViews/WarningBoxSpec.tsx @@ -2,7 +2,7 @@ import { create, ReactTestInstance } from "react-test-renderer"; import React from "react"; import { act } from "react-dom/test-utils"; import { ThemeProvider } from "styled-components"; -import { terriaTheme } from "../../lib/ReactViews/StandardUserInterface/StandardTheme"; +import { terriaTheme } from "../../lib/ReactViews/StandardUserInterface"; import WarningBox from "../../lib/ReactViews/Preview/WarningBox"; import Terria from "../../lib/Models/Terria"; import WebMapServiceCatalogItem from "../../lib/Models/Catalog/Ows/WebMapServiceCatalogItem"; diff --git a/test/ReactViews/withContext.tsx b/test/ReactViews/withContext.tsx index fcdcd03c866..35da0173e4d 100644 --- a/test/ReactViews/withContext.tsx +++ b/test/ReactViews/withContext.tsx @@ -2,8 +2,8 @@ import React from "react"; import { create, TestRendererOptions } from "react-test-renderer"; import { ThemeProvider } from "styled-components"; import ViewState from "../../lib/ReactViewModels/ViewState"; -import { terriaTheme } from "../../lib/ReactViews/StandardUserInterface/StandardTheme"; -import { ViewStateProvider } from "../../lib/ReactViews/StandardUserInterface/ViewStateContext"; +import { terriaTheme } from "../../lib/ReactViews/StandardUserInterface"; +import { ViewStateProvider } from "../../lib/ReactViews/Context/ViewStateContext"; export function withThemeContext(node: React.ReactNode) { return {node}; From 6b05e57db4d1400aabcc65edb366d322e5edfe72 Mon Sep 17 00:00:00 2001 From: Yusuke Kiuchi <4221178-yusuke.kiuchi@users.noreply.gitlab.com> Date: Tue, 6 Sep 2022 11:40:46 +0900 Subject: [PATCH 046/654] Update a prompt text in DataPreview --- CHANGES.md | 1 + wwwroot/languages/en/translation.json | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGES.md b/CHANGES.md index e4cd4643a73..00e84ac926f 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -3,6 +3,7 @@ #### next release (8.2.14) - Moved map credits to map column so it don't get hidden by chart panel. +- Update a prompt text in DataPreview. - [The next improvement] #### 8.2.13 - 2022-09-01 diff --git a/wwwroot/languages/en/translation.json b/wwwroot/languages/en/translation.json index ba9d9a4a3ff..e2319e50bae 100644 --- a/wwwroot/languages/en/translation.json +++ b/wwwroot/languages/en/translation.json @@ -472,7 +472,7 @@ }, "preview": { "doesNotContainGeospatialData": "This file does not contain geospatial data.", - "selectToPreview": "<0>Select a dataset to see a preview <1>- OR -<2>Go to the map", + "selectToPreview": "<0>Select a dataset to see a preview

    Press Ctrl or Shift and click + to add multiple datasets.<1>- OR -<2>Go to the map", "loading": "PREVIEW LOADING...", "preview": "{{appName}} preview", "previewItemErrorTitle": "Catalog item could not be previewed.", From 97194771cccb50e07100c395410fda8630b92e7e Mon Sep 17 00:00:00 2001 From: Stephen Davies Date: Sat, 7 Jan 2023 08:15:12 +1100 Subject: [PATCH 047/654] Prettier and yarn lockfile update --- CHANGES.md | 29 +++++++++++++++-------------- doc/getting-started.md | 9 ++++----- yarn.lock | 21 +++++++-------------- 3 files changed, 26 insertions(+), 33 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 04c71bc4d40..bf7803698fb 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -350,24 +350,11 @@ #### 8.2.0 - 2022-04-12 -* **Breaking changes:** - * Multiple changes to `GtfsCatalogItem`: - * Removed `apiKey` in favour of more general `headers` - * Removed unused `bearingDirectionProperty` & `compassDirectionProperty` - * `image` is no longer resolved relative to the TerriaJS asset folder. This will allow using relative URLs for assets that aren't inside the TerriaJS asset folder. Prepend "build/TerriaJS/" (the value of `terria.baseUrl`) to any existing relative `image` urls. -* Added `colorModelsByProperty` to `GtfsCatalogItem` which will colour 1 model differently for different vehichles based on properties matched by regular expression. E.g. colour a vehicle model by which train line the vehicle is travelling on. -* Fixed a bug where cross-origin billboard images threw errors in Leaflet mode when trying to recolour the image. -* Changed rounding of the numbers of the countdown timer in the workbench UI for items that use polling. The timer wil now show 00:00 for at most 500ms (instead of a full second). This means that for timers that are a multiple of 1000ms the timer will now show 00:01 for the last second before polling, instead of 00:00. -* TSified `BuildShareLink`, `InitSourceData` and `ShareData`. -* Added `HasLocalData` interface - which has `hasLocalData` property to implement. -* Added `ModelJson` interface - which provides loose type hints for Model JSON. -* Added `settings` object to `InitSourceData` - provides `baseMaximumScreenSpaceError, useNativeResolution, alwaysShowTimeline, baseMapId, terrainSplitDirection, depthTestAgainstTerrainEnabled` - these properties are now saved in share links/stories. -* Moved `setAlwaysShowTimeline` logic from `SettingsPanel` to `TimelineStack.ts`. - **Breaking changes:** - Multiple changes to `GtfsCatalogItem`: - Removed `apiKey` in favour of more general `headers` - Removed unused `bearingDirectionProperty` & `compassDirectionProperty` - - `image` is no longer resolved relative to the TerriaJS asset folder. This will allow using relative URLs for assets that aren't inside the TerriaJS asset folder. Any relative `image` urls should now have "build/TerriaJS/" prepended (the value of `terria.baseUrl`). + - `image` is no longer resolved relative to the TerriaJS asset folder. This will allow using relative URLs for assets that aren't inside the TerriaJS asset folder. Prepend "build/TerriaJS/" (the value of `terria.baseUrl`) to any existing relative `image` urls. - Added `colorModelsByProperty` to `GtfsCatalogItem` which will colour 1 model differently for different vehichles based on properties matched by regular expression. E.g. colour a vehicle model by which train line the vehicle is travelling on. - Fixed a bug where cross-origin billboard images threw errors in Leaflet mode when trying to recolour the image. - Changed rounding of the numbers of the countdown timer in the workbench UI for items that use polling. The timer wil now show 00:00 for at most 500ms (instead of a full second). This means that for timers that are a multiple of 1000ms the timer will now show 00:01 for the last second before polling, instead of 00:00. @@ -377,6 +364,20 @@ - Added `settings` object to `InitSourceData` - provides `baseMaximumScreenSpaceError, useNativeResolution, alwaysShowTimeline, baseMapId, terrainSplitDirection, depthTestAgainstTerrainEnabled` - these properties are now saved in share links/stories. - Moved `setAlwaysShowTimeline` logic from `SettingsPanel` to `TimelineStack.ts`. +* **Breaking changes:** + - Multiple changes to `GtfsCatalogItem`: + - Removed `apiKey` in favour of more general `headers` + - Removed unused `bearingDirectionProperty` & `compassDirectionProperty` + - `image` is no longer resolved relative to the TerriaJS asset folder. This will allow using relative URLs for assets that aren't inside the TerriaJS asset folder. Any relative `image` urls should now have "build/TerriaJS/" prepended (the value of `terria.baseUrl`). +* Added `colorModelsByProperty` to `GtfsCatalogItem` which will colour 1 model differently for different vehichles based on properties matched by regular expression. E.g. colour a vehicle model by which train line the vehicle is travelling on. +* Fixed a bug where cross-origin billboard images threw errors in Leaflet mode when trying to recolour the image. +* Changed rounding of the numbers of the countdown timer in the workbench UI for items that use polling. The timer wil now show 00:00 for at most 500ms (instead of a full second). This means that for timers that are a multiple of 1000ms the timer will now show 00:01 for the last second before polling, instead of 00:00. +* TSified `BuildShareLink`, `InitSourceData` and `ShareData`. +* Added `HasLocalData` interface - which has `hasLocalData` property to implement. +* Added `ModelJson` interface - which provides loose type hints for Model JSON. +* Added `settings` object to `InitSourceData` - provides `baseMaximumScreenSpaceError, useNativeResolution, alwaysShowTimeline, baseMapId, terrainSplitDirection, depthTestAgainstTerrainEnabled` - these properties are now saved in share links/stories. +* Moved `setAlwaysShowTimeline` logic from `SettingsPanel` to `TimelineStack.ts`. + #### 8.1.27 - 2022-04-08 - Use CKAN Dataset `name` property for WMS `layers` as last resort. diff --git a/doc/getting-started.md b/doc/getting-started.md index c034d006c9b..dd028c41da5 100644 --- a/doc/getting-started.md +++ b/doc/getting-started.md @@ -1,19 +1,18 @@ The easiest way to get started with TerriaJS is to use [TerriaMap](https://github.com/TerriaJS/TerriaMap). TerriaMap is a full-featured application built on TerriaJS, ready to be customized with your own branding and catalog. It is also a great starting point for more in-depth customization. This guide explains how to build and run TerriaMap locally using docker. See: -* [Building TerriaMap](customizing/building-terriamap.md) to learn how to -* See [Deploying](deploying/README.md) to learn how to deploy it for use by others. + +- [Building TerriaMap](customizing/building-terriamap.md) to learn how to +- See [Deploying](deploying/README.md) to learn how to deploy it for use by others. ```bash -docker run -p 3001:3001 ghcr.io/terriajs/terriamap +docker run -p 3001:3001 ghcr.io/terriajs/terriamap ``` To customise ## Without Docker - - ### Having trouble? Checkout the [Problems and Solutions](contributing/problems-and-solutions.md) page to see if we have them covered. You are also welcome to post your problem on the [TerriaJS Discussions](https://github.com/TerriaJS/terriajs/discussions) forum and we'll be happy to help! diff --git a/yarn.lock b/yarn.lock index ebeb96617e5..bfc383bd9d9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1670,6 +1670,11 @@ resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.2.tgz#ee771e2ba4b3dc5b372935d549fd9617bf345b8c" integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ== +"@types/ms@^0.7.31": + version "0.7.31" + resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.31.tgz#31b7ca6407128a3d2bbc27fe2d21b345397f6197" + integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA== + "@types/mustache@^0.8.32": version "0.8.32" resolved "https://registry.yarnpkg.com/@types/mustache/-/mustache-0.8.32.tgz#7db3b81f2bf450bd38805f596d20eca97c4ed595" @@ -6669,7 +6674,7 @@ flatted@^3.1.0: resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.4.tgz#28d9969ea90661b5134259f312ab6aa7929ac5e2" integrity sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw== -flexsearch@^0.7.21: +flexsearch@0.7.21: version "0.7.21" resolved "https://registry.yarnpkg.com/flexsearch/-/flexsearch-0.7.21.tgz#0f5ede3f2aae67ddc351efbe3b24b69d29e9d48b" integrity sha512-W7cHV7Hrwjid6lWmy0IhsWDFQboWSng25U3VVywpHOTJnnAZNPScog67G+cVpeX9f7yDD21ih0WDrMMT+JoaYg== @@ -10027,7 +10032,7 @@ ms@2.1.2: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -ms@2.1.3, ms@^2.1.1: +ms@2.1.3, ms@^2.1.1, ms@^2.1.3: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== @@ -10060,11 +10065,6 @@ mustache@^2.2.1: resolved "https://registry.yarnpkg.com/mustache/-/mustache-2.3.2.tgz#a6d4d9c3f91d13359ab889a812954f9230a3d0c5" integrity sha512-KpMNwdQsYz3O/SBS1qJ/o3sqUJ5wSb8gb0pul8CO0S56b9Y2ALm8zCfsjPXsqGFfoNBkDwZuZIAjhsZI03gYVQ== -mutationobserver-shim@^0.3.1: - version "0.3.7" - resolved "https://registry.yarnpkg.com/mutationobserver-shim/-/mutationobserver-shim-0.3.7.tgz#8bf633b0c0b0291a1107255ed32c13088a8c5bf3" - integrity sha512-oRIDTyZQU96nAiz2AQyngwx1e89iApl2hN5AOYwyxLUB47UYsU3Wv9lJWqH5y/QdiYkc5HQLi23ZNB3fELdHcQ== - mute-stdout@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/mute-stdout/-/mute-stdout-1.0.1.tgz#acb0300eb4de23a7ddeec014e3e96044b3472331" @@ -11799,13 +11799,6 @@ rc-util@^5.16.1, rc-util@^5.2.1, rc-util@^5.3.0, rc-util@^5.5.0: react-is "^16.12.0" shallowequal "^1.1.0" -react-addons-pure-render-mixin@^15.6.0: - version "15.6.3" - resolved "https://registry.yarnpkg.com/react-addons-pure-render-mixin/-/react-addons-pure-render-mixin-15.6.3.tgz#5dc73af0fa32186dbc4887f20667b46d3f9caed7" - integrity sha512-e7F2OsLiyYGr9SHWHGlI/FfHRh+kbYx0hNfdN5zivHIf4vzeno7gsRJKXg71E35CpUCnre+JfM6UgWWgsvJBzA== - dependencies: - object-assign "^4.1.0" - react-anything-sortable@^1.5.2: version "1.7.4" resolved "https://registry.yarnpkg.com/react-anything-sortable/-/react-anything-sortable-1.7.4.tgz#c760cf67d7db226bb3943a7bda21c13614dce0cb" From ab23b589658b16675dabe79b857df613143f35be Mon Sep 17 00:00:00 2001 From: Stephen Davies Date: Sat, 7 Jan 2023 08:15:29 +1100 Subject: [PATCH 048/654] Use better example url --- doc/customizing/initialization-files.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/customizing/initialization-files.md b/doc/customizing/initialization-files.md index 0ac2f44efbd..3cc4c0b27de 100644 --- a/doc/customizing/initialization-files.md +++ b/doc/customizing/initialization-files.md @@ -56,7 +56,7 @@ Most of the other properties of each layer depend on the specific type. See the There are four ways to load an init file into a TerriaJS application: 1. Store it in Terria Map's `wwwroot/init` directory, and refer to it in the `initializationUrls` section of the [`config.json`](../customizing/client-side-config.md) file. It is loaded automatically when you visit the webpage. This is how `wwwroot/init/terria.json` is loaded in the default TerriaMap setup. -2. Store it in Terria Maps's `wwwroot/init` directory, without adding it to config.json. Add the init file name (without `.json`) to the URL after `#`. For instance, `example.com/terria#mycatalog`. See [Controlling with URL Parameters](../deploying/controlling-with-url-parameters.md) for more information. This method is useful when developing a catalog that is not quite ready for public access, but it is helpful to show it to interested stakeholders. +2. Store it in Terria Maps's `wwwroot/init` directory, without adding it to config.json. Add the init file name (without `.json`) to the URL after `#`. For instance, `terria.example.com/#mycatalog`. See [Controlling with URL Parameters](../deploying/controlling-with-url-parameters.md) for more information. This method is useful when developing a catalog that is not quite ready for public access, but it is helpful to show it to interested stakeholders. 3. Store it anywhere on the web (on a [CORS-enabled](../connecting-to-data/cross-origin-resource-sharing.md) server). Add the complete URL (including `.json`) to the URL, after `#`. For instance, `http://nationalmap.gov.au/#http://example.com/mycatalog.json`. This method is useful when developing services for a TerriaJS instance which you don't directly control, and for rapidly previewing changes which you can also share with people. 4. Store it locally, then drag and drop it into the Terria Map window. From 813199da450d7241542178babdf1e29cc38c76f9 Mon Sep 17 00:00:00 2001 From: Stephen Davies Date: Sat, 7 Jan 2023 08:32:51 +1100 Subject: [PATCH 049/654] Fix prettier --- doc/customizing/without-docker.md | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/doc/customizing/without-docker.md b/doc/customizing/without-docker.md index 2988df28e0c..c2d8659c24b 100644 --- a/doc/customizing/without-docker.md +++ b/doc/customizing/without-docker.md @@ -20,12 +20,12 @@ If you run into trouble or want more explanation, read on. ### Prerequisites -TerriaJS can be built and run on almost any macOS, Linux, or Windows system. The following are required to build TerriaJS: +TerriaJS can be built and run on almost any macOS, Linux, or Windows system. The following are required to build TerriaJS: -* The Bash command shell. On macOS or Linux you almost certainly already have this. On Windows, you can easily get it by installing [Git for Windows](https://gitforwindows.org/). In the instructions below, we assume you're using a Bash command prompt. -* [Node.js](https://nodejs.org) v12.0 or later. You can check your node version by running `node --version` on the command-line. -* [npm](https://www.npmjs.com/) v6.0 or later. npm is usually installed automatically alongside the above. You can check your npm version by running `npm --version`. -* [yarn](https://yarnpkg.com/) v1.19.0 or later. This can be installed using `npm install -g yarn@^1.19.0` +- The Bash command shell. On macOS or Linux you almost certainly already have this. On Windows, you can easily get it by installing [Git for Windows](https://gitforwindows.org/). In the instructions below, we assume you're using a Bash command prompt. +- [Node.js](https://nodejs.org) v12.0 or later. You can check your node version by running `node --version` on the command-line. +- [npm](https://www.npmjs.com/) v6.0 or later. npm is usually installed automatically alongside the above. You can check your npm version by running `npm --version`. +- [yarn](https://yarnpkg.com/) v1.19.0 or later. This can be installed using `npm install -g yarn@^1.19.0` ### Cloning TerriaMap @@ -37,7 +37,7 @@ git clone https://github.com/TerriaJS/TerriaMap.git cd TerriaMap ``` -If you're unable to use git, you can also [download a ZIP file](https://github.com/TerriaJS/TerriaMap/archive/main.zip) and extract it somewhere on your system. We recommend using git, though, because it makes it much easier to update to later versions in the future. +If you're unable to use git, you can also [download a ZIP file](https://github.com/TerriaJS/TerriaMap/archive/main.zip) and extract it somewhere on your system. We recommend using git, though, because it makes it much easier to update to later versions in the future. ### Increase NodeJS memory limit @@ -55,7 +55,7 @@ All of the dependencies required to build and run TerriaMap, other than the prer yarn install ``` -The dependencies are installed in the `node_modules` subdirectory. No global changes are made to your system. +The dependencies are installed in the `node_modules` subdirectory. No global changes are made to your system. ### Building TerriaMap @@ -83,7 +83,7 @@ The full set of `gulp` tasks can be found on the [Development Environment](contr ### Running TerriaMap -TerriaMap includes a simple Node.js-based web server, called [terriajs-server](https://github.com/TerriaJS/terriajs-server). To start it, run: +TerriaMap includes a simple Node.js-based web server, called [terriajs-server](https://github.com/TerriaJS/terriajs-server). To start it, run: ```bash yarn start @@ -93,11 +93,11 @@ Then, open a web browser on `http://localhost:3001` to use TerriaMap. ### Keeping up with Updates -If you're building an application by using TerriaMap as a starting point, you will want to keep in sync as TerriaMap is improved and updated to use new versions of TerriaJS. Forking the TerriaMap repo and using git to keep it in sync is outside the scope of this document, but GitHub has a [nice explanation](https://help.github.com/articles/fork-a-repo/). +If you're building an application by using TerriaMap as a starting point, you will want to keep in sync as TerriaMap is improved and updated to use new versions of TerriaJS. Forking the TerriaMap repo and using git to keep it in sync is outside the scope of this document, but GitHub has a [nice explanation](https://help.github.com/articles/fork-a-repo/). -After pulling new changes, you will need to run `yarn install` again to pick up any changed dependencies and then build TerriaMap. If you have problems building or running, it is sometimes helpful to remove and reinstall the dependencies from npm: +After pulling new changes, you will need to run `yarn install` again to pick up any changed dependencies and then build TerriaMap. If you have problems building or running, it is sometimes helpful to remove and reinstall the dependencies from npm: ```bash rm -rf node_modules yarn install -``` \ No newline at end of file +``` From 41e0af07fbc38759d1ac305904a768457ef90822 Mon Sep 17 00:00:00 2001 From: Stephen Davies Date: Mon, 9 Jan 2023 03:36:21 +1100 Subject: [PATCH 050/654] Keep current entries up to date --- doc/contributing/problems-and-solutions.md | 40 +++++++++------------- 1 file changed, 16 insertions(+), 24 deletions(-) diff --git a/doc/contributing/problems-and-solutions.md b/doc/contributing/problems-and-solutions.md index a4d7c63308f..8672f6f3715 100644 --- a/doc/contributing/problems-and-solutions.md +++ b/doc/contributing/problems-and-solutions.md @@ -1,5 +1,17 @@ ### Problem +TerriaJS app is accessible at `http://localhost:3001` but it does not render a map. + +![Map not rendered](./img/no-map.png) + +### Workaround + +The default TerriaJS configuration uses Cesium Ion for serving some of its basemaps. If the Cesium Ion access token has expired then these basemaps will fail to render. We recommend that you [register](https://cesium.com/ion/signup/) and use your own Cesium Ion access token. Please see the documentation on [client side configuration](customizing/client-side-config.md#parameters) for configuring your access token. Also note that it is a violation of the Ion terms-of-use to use the default key in a deployed application. + +--- + +### Problem + Building TerriaMap (without yarn workspaces) throws an error like: ``` @@ -11,24 +23,16 @@ You have two copies of terriajs-cesium Check: ``` -npm list terriajs-cesium +yarn list terriajs-cesium ``` If there are 2 different versions listed, run: ``` -gulp sync-terriajs-dependencies -``` - -If there's only 1 version listed in 2 places your npm lockfile is playing up. To fix it run: - -``` -npm install --save-exact terriajs -npm dedupe -npm install +yarn gulp sync-terriajs-dependencies ``` -Commit lockfile +If there's only 1 version listed in 2 places your yarn lockfile is playing up. To fix it, you could use [yarn-deduplicate](https://www.npmjs.com/package/yarn-deduplicate) or try reverting to a known good commit of your lockfile, and then run `yarn install` again. --- @@ -54,19 +58,7 @@ npx yarn@1.19.0 install It’s possible the problem could also be fixed in certain cases by syncing dependency versions for the same package, and ensuring that a workspace doesn’t install the same dependency but with a different version. Syncing dependencies could help: ``` -gulp sync-terriajs-dependencies +yarn gulp sync-terriajs-dependencies ``` --- - -### Problem - -TerriaJS app is accessible at `http://localhost:3001` but it does not render a map. - -![Map not rendered](./img/no-map.png) - -### Workaround - -The default TerriaJS configuration uses Cesium Ion for serving some of its basemaps. If the Cesium Ion access token has expired then these basemaps will fail to render. We recommend that you [register](https://cesium.com/ion/signup/) and use your own Cesium Ion access token. Please see the documentation on [client side configuration](customizing/client-side-config.md#parameters) for configuring your access token. Also note that it is a violation of the Ion terms-of-use to use the default key in a deployed application. - ---- From 0b94d50bd1ebc9d712a0ad2f5d23f28002bba340 Mon Sep 17 00:00:00 2001 From: Stephen Davies Date: Mon, 9 Jan 2023 03:57:37 +1100 Subject: [PATCH 051/654] Remove old deploy to AWS documentation --- doc/deploying/README.md | 1 - doc/deploying/deploying-to-aws.md | 103 ------------------------------ doc/mkdocs.yml | 1 - 3 files changed, 105 deletions(-) delete mode 100644 doc/deploying/deploying-to-aws.md diff --git a/doc/deploying/README.md b/doc/deploying/README.md index ee161b1f565..81428cacf5a 100644 --- a/doc/deploying/README.md +++ b/doc/deploying/README.md @@ -3,7 +3,6 @@ This section explains how to deploy and maintain production (and production-ish) Deploying TerriaMap itself: - [Deploying TerriaMap](deploying-terriamap.md): General instructions for deploying TerriaMap in almost any environment. -- [Deploying to AWS](deploying-to-aws.md): Deploy TerriaMap to [Amazon Web Services (AWS)](https://aws.amazon.com/). - [Deploying with Kubernetes](deploying-with-kubernetes.md): Deploy TerriaMap using [Docker](https://www.docker.com/) and [Kubernetes](https://kubernetes.io/). Deploying other services for use with TerriaJS: diff --git a/doc/deploying/deploying-to-aws.md b/doc/deploying/deploying-to-aws.md deleted file mode 100644 index 0541985785c..00000000000 --- a/doc/deploying/deploying-to-aws.md +++ /dev/null @@ -1,103 +0,0 @@ -Most of our production TerriaJS-based sites are hosted on Amazon Web Services (AWS). This page describes how to use the automated AWS deployment mechanism available in TerriaMap. There are, of course, countless other ways to deploy to AWS. - -## Prerequisites - -### awscli - -Deploying requires a recent version of `awscli`. It's recommended to install and maintain this using `pip` as the Homebrew and Ubuntu packages are quite old. - -```sh -pip install awscli -``` - -### AWS credentials - -You must have an `awscli` configuration profile (in `~/.aws/config`) with a name that matches `awsProfile` in `package.json`. e.g. - -``` -[profile terria] -aws_access_key_id=YOUR_ACCESS_KEY -aws_secret_access_key=YOUR_SECRET_ACCESS_KEY -``` - -## package.json - -Various parameters controlling AWS deployment are specified in `package.json`. They are: - -- `awsProfile` - The AWS profile to use (see AWS credentials above) when interacting with AWS. -- `awsS3PackagesPath` - The S3 path to which to copy the deployment .tar.gz. -- `awsRegion` - The AWS region in which to create resources. -- `awsEc2InstanceType` - The type of EC2 instance to use. -- `awsEc2ImageId` - The ID of the EC2 image to use. -- `awsKeyName` - The name of a key that may be used to SSH to the EC2 instance. -- `awsS3ServerConfigOverridePath` - The path to a file on S3 containing any overrides to `devserverconfig.json`. -- `awsS3ClientConfigOverridePath` - The path to a file on S3 containing any overrides to `wwwroot/config.json`. - -You can customize these settings by changing `package.json`, or by using `npm config` to override the setting locally, for example; - -``` -npm config set terriajs-map:awsProfile myprofilename -``` - -## stack.json - -You will need to modify [deploy/aws/stack.json](https://github.com/TerriaJS/TerriaMap/blob/master/deploy/aws/stack.json) to match your environment. In particular, you will need to change: - -- `Parameters.HostedZoneName.Default`: This is the domain name where a DNS record for the deployment will be created. -- `SSLCertificateId` in `Resources.ElasticLoadBalancer.Listeners`: The SSL certificate to use for HTTPS connections to the deployment. If you don't have a certificate or don't want to support HTTPS, remove the entire listener with `"LoadBalancerPort": "443"`. -- `terriamap-sharing` in `Resources.S3Role.Properties.Policies.PolicyDocument.Statement`: This authorizes the EC2 instances to access an S3 bucket to be used to store JSON blobs for the sharing feature. You will want to create a bucket for this purpose and add its name here. - -## Deploy - -Prior to deploying, please tag the release, e.g. - -``` -git tag -a 2016-05-17 -m '2016-05-17 release' -git push origin 2016-05-17 -``` - -Deployment is initiated via `npm` scripts. A full production deployment may be initiated with: - -``` -yarn deploy -``` - -Once the stack starts up, it will be available at `terriajs-map-2016-05-17.terria.io`, where `terriajs-map` is the name of the project in `package.json` and `2016-05-17` is the output of `git describe` (that's why you should tag before starting a deployment). - -The following npm scripts are available: - -- `deploy` - Removes the `node_modules` directory, runs `npm install`, and launches the `deploy-without-reinstall` script. -- `deploy-without-reinstall` - Runs `gulp clean` (which removes the `wwwroot/build` directory) and `gulp release`, and then launches the `deploy-current` script. -- `deploy-current` - Gets the two configuration override files specified in package.json from S3, builds a package (.tar.gz), uploads it to S3, and spins up a CloudFormation stack. - -The CloudFormation stack has the following AWS resources: - -- Elastic Load Balancer -- EC2 Security Group -- Auto Scaling Group -- Launch Configurartion -- Route 53 Record Set - -Instances in the Auto Scaling group are bootstrapped using the supplied `user-data` file. - -The process of starting a new stack takes about 5 minutes but it can take a further 15 minutes for the DNS to propagate. - -### Test stack - -Each stack is automatically assigned its own URL based on the name of the stack. e.g. - -``` -https://terriajs-map-2016-05-17.terria.io/ -``` - -### Update DNS alias - -Once you're satisfied the release is working, change the staging environment DNS record to point to the new stack using the Route 53 Console. - -``` -map.terria.io -> terriajs-map-2016-05-17.terria.io -``` - -### Troubleshooting - -The default Mac OS `tar` command [causes trouble](http://superuser.com/questions/318809/linux-os-x-tar-incompatibility-tarballs-created-on-os-x-give-errors-when-unt). You'll need to replace it with `gtar`, eg. using homebrew. diff --git a/doc/mkdocs.yml b/doc/mkdocs.yml index 79240903627..5907399d6be 100644 --- a/doc/mkdocs.yml +++ b/doc/mkdocs.yml @@ -33,7 +33,6 @@ nav: - Deploying: - Overview: deploying/README.md - Deploying TerriaMap: deploying/deploying-terriamap.md - - Deploying to AWS: deploying/deploying-to-aws.md - Deploying with Kubernetes: deploying/deploying-with-kubernetes.md - Setting Up a Region Mapping Server: deploying/setting-up-a-region-mapping-server.md - (Deprecated) Setting Up WMS Region Mapping: deploying/deprecated-wms-region-mapping.md From d8ec705ab629ae6c251f885347f378859f5eafb5 Mon Sep 17 00:00:00 2001 From: Stephen Davies Date: Mon, 9 Jan 2023 03:58:09 +1100 Subject: [PATCH 052/654] Small fixes --- doc/contributing/setting-up-saucelabs.md | 2 +- doc/deploying/setting-up-a-region-mapping-server.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/contributing/setting-up-saucelabs.md b/doc/contributing/setting-up-saucelabs.md index 79c42d9678a..9857a81881a 100644 --- a/doc/contributing/setting-up-saucelabs.md +++ b/doc/contributing/setting-up-saucelabs.md @@ -4,6 +4,6 @@ - Set env variables for SAUCE_USERNAME and SAUCE_ACCESS_KEY using your OS's method for doing that (`export` in bash) with your sauce username and the access key you just copied. - Run `npm install -g karma-cli` Without this karma will sort-of work but give you confusing errors. - Run `yarn start` in your `terriajs` dir in another terminal. -- Run `gulp test-saucelabs` if you have a `karma-saucelabs.conf.js` file, or run `karma start` from the TerriaJS directory if you have a `karma.config.js` file. +- Run `yarn gulp test-saucelabs` if you have a `karma-saucelabs.conf.js` file, or run `karma start` from the TerriaJS directory if you have a `karma.config.js` file. If you want to narrow down the browsers being run (i.e. only run IE9), you can remove them from `karma[-saucelabs].config.js` under `browsers`. diff --git a/doc/deploying/setting-up-a-region-mapping-server.md b/doc/deploying/setting-up-a-region-mapping-server.md index 7a32c1389c4..ed25c31ddce 100644 --- a/doc/deploying/setting-up-a-region-mapping-server.md +++ b/doc/deploying/setting-up-a-region-mapping-server.md @@ -1,3 +1,3 @@ _Region mapping_ is the process of matching a value in a CSV file to a pre-defined boundary, such as a postcode, local government area or electorate. The allowed boundaries for a given TerriaJS instance are given in a file such as `wwwroot/data/regionMapping.json`. -The current method to create a new set of boundaries not currently recognised by TerriaJS is detailed in [this repository](https://github.com/TerriaJS/boundary-tiles). You'll find instructions there to create new region mapping boundaries using a zipped shapefile or GeoJSON file as well as instructions you can follow to host the vector tiles on Amazon Web Services in an S3 bucket + CloudFront, but any static file hosting service will work. +The current method to add a new set of boundaries to TerriaJS is detailed in [this repository](https://github.com/TerriaJS/boundary-tiles). You'll find instructions there to create new region mapping boundaries using a zipped shapefile or GeoJSON file as well as instructions you can follow to host the vector tiles on Amazon Web Services in an S3 bucket + CloudFront, but any static file hosting service will work. From 15eab19879b855e683deb6ff63abf889ccb99cee Mon Sep 17 00:00:00 2001 From: Stephen Davies Date: Mon, 9 Jan 2023 05:04:20 +1100 Subject: [PATCH 053/654] Greatly improve docs for docker and new docs flow --- doc/customizing/cloning-and-building.md | 105 ++++++++++++++++++++++++ doc/getting-started.md | 39 ++++++--- doc/mkdocs.yml | 1 + 3 files changed, 135 insertions(+), 10 deletions(-) create mode 100644 doc/customizing/cloning-and-building.md diff --git a/doc/customizing/cloning-and-building.md b/doc/customizing/cloning-and-building.md new file mode 100644 index 00000000000..f2e4ad58e38 --- /dev/null +++ b/doc/customizing/cloning-and-building.md @@ -0,0 +1,105 @@ +If you've done this sort of thing before, you'll find it easy to clone and build TerriaMap with these quick instructions: + +```bash +git clone https://github.com/TerriaJS/TerriaMap.git + +cd TerriaMap + +export NODE_OPTIONS=--max_old_space_size=4096 + +npm install -g yarn + +yarn install && yarn gulp && yarn start + +# Open at http://localhost:3001 +``` + +If you run into trouble or want more explanation, read on. + +### Prerequisites + +TerriaJS can be built and run on almost any macOS, Linux, or Windows system. The following are required to build TerriaJS: + +- The Bash command shell. On macOS or Linux you almost certainly already have this. On Windows, you can easily get it by installing [Git for Windows](https://gitforwindows.org/). In the instructions below, we assume you're using a Bash command prompt. +- [Node.js](https://nodejs.org) v14.0 or later. You can check your node version by running `node --version` on the command-line. +- [npm](https://www.npmjs.com/) v6.0 or later. npm is usually installed automatically alongside the above. You can check your npm version by running `npm --version`. +- [yarn](https://yarnpkg.com/) v1.19.0 or later. This can be installed using `npm install -g yarn@^1.19.0` + +### Cloning TerriaMap + +The latest version of TerriaMap is on [GitHub](https://github.com), and the preferred way to get it is by using `git`: + +```bash +git clone https://github.com/TerriaJS/TerriaMap.git + +cd TerriaMap +``` + +If you're unable to use git, you can also [download a ZIP file](https://github.com/TerriaJS/TerriaMap/archive/main.zip) and extract it somewhere on your system. We recommend using git, though, because it makes it much easier to update to later versions in the future. + +### Increase NodeJS memory limit + +To avoid running out of memory when installing dependencies and building TerriaMap, increase the memory limit of node: + +```bash +export NODE_OPTIONS=--max_old_space_size=4096 +``` + +### Installing Dependencies + +All of the dependencies required to build and run TerriaMap, other than the prerequisites listed above, are installed using `yarn`: + +```bash +yarn install +``` + +The dependencies are installed in the `node_modules` subdirectory. No global changes are made to your system. + +### Building TerriaMap + +Do a standard build of TerriaMap with: + +```bash +yarn gulp +``` + +Or, you can create a minified release build with: + +```bash +yarn gulp release +``` + +To watch for changes and automatically do an incremental build when any are detected, use: + +```bash +yarn gulp watch +``` + +`yarn gulp` simply runs `gulp`, so you can use that directly if you prefer (run `npm install -g gulp-cli` to install it globally). + +The full set of `gulp` tasks can be found on the [Development Environment](contributing/development-environment.md#terriamap-gulp-tasks) page. + +### Running TerriaMap + +TerriaMap includes a simple Node.js-based web server, called [terriajs-server](https://github.com/TerriaJS/terriajs-server). To start it, run: + +```bash +yarn start +``` + +Then, open a web browser on `http://localhost:3001` to use TerriaMap. + +### Keeping up with Updates + +If you're building an application by using TerriaMap as a starting point, you will want to keep in sync as TerriaMap is improved and updated to use new versions of TerriaJS. Forking the TerriaMap repo and using git to keep it in sync is outside the scope of this document, but GitHub has a [nice explanation](https://help.github.com/articles/fork-a-repo/). + +After pulling new changes, you will need to run `yarn install` again to pick up any changed dependencies and then build TerriaMap. If you have problems building or running, it is sometimes helpful to remove and reinstall the dependencies from npm: + +```bash +rm -rf node_modules +yarn install +``` + +### Having trouble? + +Checkout the [Problems and Solutions](contributing/problems-and-solutions.md) page to see if we have them covered. You are also welcome to post your problem on the [TerriaJS Discussions](https://github.com/TerriaJS/terriajs/discussions) forum and we'll be happy to help! diff --git a/doc/getting-started.md b/doc/getting-started.md index dd028c41da5..620e9cabfd7 100644 --- a/doc/getting-started.md +++ b/doc/getting-started.md @@ -1,22 +1,41 @@ The easiest way to get started with TerriaJS is to use [TerriaMap](https://github.com/TerriaJS/TerriaMap). TerriaMap is a full-featured application built on TerriaJS, ready to be customized with your own branding and catalog. It is also a great starting point for more in-depth customization. -This guide explains how to build and run TerriaMap locally using docker. See: +Use docker to start a TerriaMap container: -- [Building TerriaMap](customizing/building-terriamap.md) to learn how to -- See [Deploying](deploying/README.md) to learn how to deploy it for use by others. +```bash +docker run -d -p 3001:3001 ghcr.io/terriajs/terriamap +``` + +You should now be able to access TerriaMap at [`http://localhost:3001/`](http://localhost:3001/). + +To clean up and delete the container, you can run: ```bash -docker run -p 3001:3001 ghcr.io/terriajs/terriamap +docker rm -f [id given by docker run command] ``` -To customise +### Customizing TerriaMap -## Without Docker +Learn about many customization options in [Customizing TerriaMap](customizing/README.md). + +For customisations that don't require rebuilding TerriaMap, you can apply changes by mounting your own files into the docker container. E.g. to mount a custom `config.json` file, custom catalog file `my-catalog.json` and a custom `serverconfig.json` file, run the following instead of the above `docker run` command: -### Having trouble? +```bash +docker run -d -p 3001:3001 \ +--mount type=bind,source=$(pwd)/config.json,destination=/app/wwwroot/config.json \ +--mount type=bind,source=$(pwd)/my-catalog.json,destination=/app/wwwroot/init/simple.json \ +--mount type=bind,source=$(pwd)/serverconfig.json,destination=/app/serverconfig.json \ +ghcr.io/terriajs/terriamap +``` + +Some more advanced customizations will require rebuilding TerriaMap. To do these you will have to follow the [Cloning and Building](customizing/cloning-and-building.md) guide. -Checkout the [Problems and Solutions](contributing/problems-and-solutions.md) page to see if we have them covered. You are also welcome to post your problem on the [TerriaJS Discussions](https://github.com/TerriaJS/terriajs/discussions) forum and we'll be happy to help! +### Deploying TerriaMap -### Next Steps +Deploy the container you've made using Docker Compose, Kubernetes, or a cloud provider service that will run containers. + +TODO: Update above sentence after updating Deploying section (and point to new section) + +## Without Docker -Now that you have a working local build of TerriaMap, you may want to [customize it](customizing/README.md) or [deploy it](deploying/README.md) for others to use. +Follow the [Cloning and Building](customizing/cloning-and-building.md) guide to get started with TerriaMap without docker. diff --git a/doc/mkdocs.yml b/doc/mkdocs.yml index 5907399d6be..1ab92e71a2e 100644 --- a/doc/mkdocs.yml +++ b/doc/mkdocs.yml @@ -15,6 +15,7 @@ nav: - Client-side Config: customizing/client-side-config.md - Initialization Files: customizing/initialization-files.md - Server-side Config: customizing/server-side-config.md + - Cloning and Building: customizing/cloning-and-building.md - Skinning: customizing/skinning.md - Translation guide: customizing/translation-guide.md - Connecting to Data: From e2d8fbb28377370df50e9f3daa57496e689728fa Mon Sep 17 00:00:00 2001 From: Stephen Davies Date: Mon, 9 Jan 2023 05:05:23 +1100 Subject: [PATCH 054/654] Make "../../lib/..." links in documentation work in mkdocs --- doc/js/rewrite-links.js | 11 +++++++++++ doc/mkdocs.yml | 2 ++ 2 files changed, 13 insertions(+) create mode 100644 doc/js/rewrite-links.js diff --git a/doc/js/rewrite-links.js b/doc/js/rewrite-links.js new file mode 100644 index 00000000000..84bfb4d03ff --- /dev/null +++ b/doc/js/rewrite-links.js @@ -0,0 +1,11 @@ +document.querySelectorAll("a").forEach(function (a) { + // For links in doc markdown pages like "/lib/Models..." or "../../lib/ReactViews/..." + // rewrite them and point to GitHub + if (document.location.hostname !== new URL(a.href).hostname) return; + m = a.href.match("/lib/(.+)$"); + if (m) { + a.href = "https://github.com/TerriaJS/terriajs/blob/main/lib/" + m[1]; + a.target = "_blank"; + a.rel = "noreferrer noopener"; + } +}); diff --git a/doc/mkdocs.yml b/doc/mkdocs.yml index 1ab92e71a2e..cbf81c67875 100644 --- a/doc/mkdocs.yml +++ b/doc/mkdocs.yml @@ -7,6 +7,8 @@ site_dir: ../wwwroot/doc/guide markdown_extensions: - markdown.extensions.admonition strict: false +extra_javascript: + - js/rewrite-links.js nav: - Home: README.md - Getting Started: getting-started.md From 07f99615d83af459ee7acfe37a0aef8327c6a496 Mon Sep 17 00:00:00 2001 From: Stephen Davies Date: Mon, 9 Jan 2023 05:05:36 +1100 Subject: [PATCH 055/654] Attributions update --- doc/acknowledgements/attributions.md | 6080 +++++++++++++++++++++++++- 1 file changed, 6050 insertions(+), 30 deletions(-) diff --git a/doc/acknowledgements/attributions.md b/doc/acknowledgements/attributions.md index 35f82f8fb19..12e72a345b6 100644 --- a/doc/acknowledgements/attributions.md +++ b/doc/acknowledgements/attributions.md @@ -1,7 +1,3 @@ -info fsevents@1.2.13: The platform "linux" is incompatible with this module. -info "fsevents@1.2.13" is an optional dependency and failed compatibility check. Excluding it from installation. -info fsevents@2.3.2: The platform "linux" is incompatible with this module. -info "fsevents@2.3.2" is an optional dependency and failed compatibility check. Excluding it from installation. THE FOLLOWING SETS FORTH ATTRIBUTION NOTICES FOR THIRD PARTY SOFTWARE THAT MAY BE CONTAINED IN PORTIONS OF THE TERRIAJS PRODUCT. ----- @@ -2020,7 +2016,7 @@ MIT License ----- -The following software may be included in this product: @types/create-react-class, @types/dateformat, @types/file-saver, @types/fs-extra, @types/hoist-non-react-statics, @types/json5, @types/mustache, @types/papaparse, @types/parse-json, @types/pbf, @types/rbush, @types/responselike, @types/urijs, @types/which. A copy of the source code may be downloaded from https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/create-react-class), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/dateformat), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/file-saver), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/fs-extra), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/hoist-non-react-statics), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/json5), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/mustache), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/papaparse), https://www.github.com/DefinitelyTyped/DefinitelyTyped.git (@types/parse-json), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/pbf), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/rbush), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/responselike), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/urijs), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/which). This software contains the following license and notice below: +The following software may be included in this product: @types/create-react-class, @types/dateformat, @types/file-saver, @types/fs-extra, @types/hoist-non-react-statics, @types/json5, @types/ms, @types/mustache, @types/papaparse, @types/parse-json, @types/pbf, @types/rbush, @types/responselike, @types/urijs, @types/which. A copy of the source code may be downloaded from https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/create-react-class), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/dateformat), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/file-saver), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/fs-extra), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/hoist-non-react-statics), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/json5), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/ms), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/mustache), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/papaparse), https://www.github.com/DefinitelyTyped/DefinitelyTyped.git (@types/parse-json), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/pbf), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/rbush), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/responselike), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/urijs), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/which). This software contains the following license and notice below: MIT License @@ -8030,7 +8026,7 @@ SOFTWARE. ----- -The following software may be included in this product: create-react-class, invariant, prop-types, react-addons-pure-render-mixin. A copy of the source code may be downloaded from git+https://github.com/facebook/react.git (create-react-class), https://github.com/zertosh/invariant (invariant), https://github.com/facebook/prop-types.git (prop-types), https://github.com/facebook/react.git (react-addons-pure-render-mixin). This software contains the following license and notice below: +The following software may be included in this product: create-react-class, invariant, prop-types. A copy of the source code may be downloaded from git+https://github.com/facebook/react.git (create-react-class), https://github.com/zertosh/invariant (invariant), https://github.com/facebook/prop-types.git (prop-types). This software contains the following license and notice below: MIT License @@ -12761,6 +12757,60 @@ the licensed code: ----- +The following software may be included in this product: fsevents. A copy of the source code may be downloaded from https://github.com/strongloop/fsevents.git. This software contains the following license and notice below: + +MIT License +----------- + +Copyright (C) 2010-2014 Philipp Dunkel + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +----- + +The following software may be included in this product: fsevents. A copy of the source code may be downloaded from https://github.com/fsevents/fsevents.git. This software contains the following license and notice below: + +MIT License +----------- + +Copyright (C) 2010-2020 by Philipp Dunkel, Ben Noordhuis, Elan Shankar, Paul Miller + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +----- + The following software may be included in this product: ftp. A copy of the source code may be downloaded from http://github.com/mscdex/node-ftp.git. This software contains the following license and notice below: Copyright Brian White. All rights reserved. @@ -18484,30 +18534,6 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI ----- -The following software may be included in this product: mutationobserver-shim. A copy of the source code may be downloaded from github.com/megawac/MutationObserver.js. This software contains the following license and notice below: - -Copyright © 2014 Graeme Yeates - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - ------ - The following software may be included in this product: mute-stdout. A copy of the source code may be downloaded from https://github.com/gulpjs/mute-stdout.git. This software contains the following license and notice below: The MIT License (MIT) @@ -20799,6 +20825,10 @@ THIS SOFTWARE. The following software may be included in this product: prettier. A copy of the source code may be downloaded from https://github.com/prettier/prettier.git. This software contains the following license and notice below: +# Prettier license + +Prettier is released under the MIT license: + Copyright © James Long and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: @@ -20807,6 +20837,5996 @@ The above copyright notice and this permission notice shall be included in all c THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +## Licenses of bundled dependencies + +The published Prettier artifact additionally contains code with the following licenses: +MIT, ISC, BSD-2-Clause, BSD-3-Clause, Apache-2.0, 0BSD + +## Bundled dependencies + +### @angular/compiler@v12.2.16 + +License: MIT +By: angular +Repository: + +---------------------------------------- + +### @babel/code-frame@v7.16.7 + +License: MIT +By: The Babel Team +Repository: + +> MIT License +> +> Copyright (c) 2014-present Sebastian McKenzie and other contributors +> +> Permission is hereby granted, free of charge, to any person obtaining +> a copy of this software and associated documentation files (the +> "Software"), to deal in the Software without restriction, including +> without limitation the rights to use, copy, modify, merge, publish, +> distribute, sublicense, and/or sell copies of the Software, and to +> permit persons to whom the Software is furnished to do so, subject to +> the following conditions: +> +> The above copyright notice and this permission notice shall be +> included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +> MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +> NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +> LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +> OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +> WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### @babel/helper-validator-identifier@v7.16.7 + +License: MIT +By: The Babel Team +Repository: + +> MIT License +> +> Copyright (c) 2014-present Sebastian McKenzie and other contributors +> +> Permission is hereby granted, free of charge, to any person obtaining +> a copy of this software and associated documentation files (the +> "Software"), to deal in the Software without restriction, including +> without limitation the rights to use, copy, modify, merge, publish, +> distribute, sublicense, and/or sell copies of the Software, and to +> permit persons to whom the Software is furnished to do so, subject to +> the following conditions: +> +> The above copyright notice and this permission notice shall be +> included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +> MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +> NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +> LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +> OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +> WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### @babel/highlight@v7.16.10 + +License: MIT +By: The Babel Team +Repository: + +> MIT License +> +> Copyright (c) 2014-present Sebastian McKenzie and other contributors +> +> Permission is hereby granted, free of charge, to any person obtaining +> a copy of this software and associated documentation files (the +> "Software"), to deal in the Software without restriction, including +> without limitation the rights to use, copy, modify, merge, publish, +> distribute, sublicense, and/or sell copies of the Software, and to +> permit persons to whom the Software is furnished to do so, subject to +> the following conditions: +> +> The above copyright notice and this permission notice shall be +> included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +> MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +> NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +> LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +> OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +> WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### @babel/parser@v7.18.0 + +License: MIT +By: The Babel Team +Repository: + +> Copyright (C) 2012-2014 by various contributors (see AUTHORS) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +> THE SOFTWARE. + +---------------------------------------- + +### @glimmer/env@v0.1.7 + +License: MIT + +> Copyright (c) 2017 Martin Muñoz and contributors. +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of +> this software and associated documentation files (the "Software"), to deal in +> the Software without restriction, including without limitation the rights to +> use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +> of the Software, and to permit persons to whom the Software is furnished to do +> so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all +> copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +> SOFTWARE. + +---------------------------------------- + +### @glimmer/syntax@v0.84.2 + +License: MIT + +> Copyright (c) 2015 Tilde, Inc. +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of +> this software and associated documentation files (the "Software"), to deal in +> the Software without restriction, including without limitation the rights to +> use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +> of the Software, and to permit persons to whom the Software is furnished to do +> so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all +> copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +> SOFTWARE. + +---------------------------------------- + +### @glimmer/util@v0.84.2 + +License: MIT + +> Copyright (c) 2015 Tilde, Inc. +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of +> this software and associated documentation files (the "Software"), to deal in +> the Software without restriction, including without limitation the rights to +> use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +> of the Software, and to permit persons to whom the Software is furnished to do +> so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all +> copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +> SOFTWARE. + +---------------------------------------- + +### @handlebars/parser@v2.0.0 + +License: ISC +Repository: + +---------------------------------------- + +### @iarna/toml@v2.2.5 + +License: ISC +By: Rebecca Turner +Repository: + +> Copyright (c) 2016, Rebecca Turner +> +> Permission to use, copy, modify, and/or distribute this software for any +> purpose with or without fee is hereby granted, provided that the above +> copyright notice and this permission notice appear in all copies. +> +> THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +> WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +> MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +> ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +> WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +> ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +> OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +---------------------------------------- + +### @nodelib/fs.scandir@v2.1.5 + +License: MIT + +> The MIT License (MIT) +> +> Copyright (c) Denis Malinochkin +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all +> copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +> SOFTWARE. + +---------------------------------------- + +### @nodelib/fs.stat@v2.0.5 + +License: MIT + +> The MIT License (MIT) +> +> Copyright (c) Denis Malinochkin +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all +> copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +> SOFTWARE. + +---------------------------------------- + +### @nodelib/fs.walk@v1.2.8 + +License: MIT + +> The MIT License (MIT) +> +> Copyright (c) Denis Malinochkin +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all +> copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +> SOFTWARE. + +---------------------------------------- + +### @typescript-eslint/types@v5.27.0 + +License: MIT +Repository: + +> MIT License +> +> Copyright (c) 2019 TypeScript ESLint and other contributors +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all +> copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +> SOFTWARE. + +---------------------------------------- + +### @typescript-eslint/typescript-estree@v5.27.0 + +License: BSD-2-Clause +Repository: + +> TypeScript ESTree +> +> Originally extracted from: +> +> TypeScript ESLint Parser +> Copyright JS Foundation and other contributors, https://js.foundation +> +> Redistribution and use in source and binary forms, with or without +> modification, are permitted provided that the following conditions are met: +> +> * Redistributions of source code must retain the above copyright +> notice, this list of conditions and the following disclaimer. +> * Redistributions in binary form must reproduce the above copyright +> notice, this list of conditions and the following disclaimer in the +> documentation and/or other materials provided with the distribution. +> +> THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +> AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +> IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +> ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY +> DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +> (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +> LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +> ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +> (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +> THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +---------------------------------------- + +### @typescript-eslint/visitor-keys@v5.27.0 + +License: MIT +Repository: + +> MIT License +> +> Copyright (c) 2019 TypeScript ESLint and other contributors +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all +> copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +> SOFTWARE. + +---------------------------------------- + +### acorn@v8.7.0 + +License: MIT +Repository: + +> MIT License +> +> Copyright (C) 2012-2020 by various contributors (see AUTHORS) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +> THE SOFTWARE. + +---------------------------------------- + +### acorn-jsx@v5.3.2 + +License: MIT +Repository: + +> Copyright (C) 2012-2017 by Ingvar Stepanyan +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +> THE SOFTWARE. + +---------------------------------------- + +### aggregate-error@v3.1.0 + +License: MIT +By: Sindre Sorhus + +> MIT License +> +> Copyright (c) Sindre Sorhus (sindresorhus.com) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### angular-estree-parser@v2.5.1 + +License: MIT +By: Ika + +> MIT License +> +> Copyright (c) Ika (https://github.com/ikatyang) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all +> copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +> SOFTWARE. + +---------------------------------------- + +### angular-html-parser@v1.8.0 + +License: MIT +By: Ika + +> MIT License +> +> Copyright (c) Ika (https://github.com/ikatyang) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all +> copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +> SOFTWARE. + +---------------------------------------- + +### ansi-regex@v6.0.1 + +License: MIT +By: Sindre Sorhus + +> MIT License +> +> Copyright (c) Sindre Sorhus (https://sindresorhus.com) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### ansi-styles@v3.2.1 + +License: MIT +By: Sindre Sorhus + +> MIT License +> +> Copyright (c) Sindre Sorhus (sindresorhus.com) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### array-union@v2.1.0 + +License: MIT +By: Sindre Sorhus + +> MIT License +> +> Copyright (c) Sindre Sorhus (sindresorhus.com) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### bail@v1.0.5 + +License: MIT +By: Titus Wormer + +> (The MIT License) +> +> Copyright (c) 2015 Titus Wormer +> +> Permission is hereby granted, free of charge, to any person obtaining +> a copy of this software and associated documentation files (the +> 'Software'), to deal in the Software without restriction, including +> without limitation the rights to use, copy, modify, merge, publish, +> distribute, sublicense, and/or sell copies of the Software, and to +> permit persons to whom the Software is furnished to do so, subject to +> the following conditions: +> +> The above copyright notice and this permission notice shall be +> included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +> MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +> IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +> CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +> TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +> SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### balanced-match@v1.0.2 + +License: MIT +By: Julian Gruber +Repository: + +> (MIT) +> +> Copyright (c) 2013 Julian Gruber <julian@juliangruber.com> +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of +> this software and associated documentation files (the "Software"), to deal in +> the Software without restriction, including without limitation the rights to +> use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +> of the Software, and to permit persons to whom the Software is furnished to do +> so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all +> copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +> SOFTWARE. + +---------------------------------------- + +### brace-expansion@v1.1.11 + +License: MIT +By: Julian Gruber +Repository: + +> MIT License +> +> Copyright (c) 2013 Julian Gruber +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all +> copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +> SOFTWARE. + +---------------------------------------- + +### braces@v3.0.2 + +License: MIT +By: Jon Schlinkert + +> The MIT License (MIT) +> +> Copyright (c) 2014-2018, Jon Schlinkert. +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +> THE SOFTWARE. + +---------------------------------------- + +### camelcase@v6.3.0 + +License: MIT +By: Sindre Sorhus + +> MIT License +> +> Copyright (c) Sindre Sorhus (https://sindresorhus.com) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### ccount@v1.1.0 + +License: MIT +By: Titus Wormer + +> (The MIT License) +> +> Copyright (c) 2015 Titus Wormer +> +> Permission is hereby granted, free of charge, to any person obtaining +> a copy of this software and associated documentation files (the +> 'Software'), to deal in the Software without restriction, including +> without limitation the rights to use, copy, modify, merge, publish, +> distribute, sublicense, and/or sell copies of the Software, and to +> permit persons to whom the Software is furnished to do so, subject to +> the following conditions: +> +> The above copyright notice and this permission notice shall be +> included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +> MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +> IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +> CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +> TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +> SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### chalk@v2.4.2 + +License: MIT + +> MIT License +> +> Copyright (c) Sindre Sorhus (sindresorhus.com) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### chalk@v5.0.1 + +License: MIT + +> MIT License +> +> Copyright (c) Sindre Sorhus (https://sindresorhus.com) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### character-entities@v1.2.4 + +License: MIT +By: Titus Wormer + +> (The MIT License) +> +> Copyright (c) 2015 Titus Wormer +> +> Permission is hereby granted, free of charge, to any person obtaining +> a copy of this software and associated documentation files (the +> 'Software'), to deal in the Software without restriction, including +> without limitation the rights to use, copy, modify, merge, publish, +> distribute, sublicense, and/or sell copies of the Software, and to +> permit persons to whom the Software is furnished to do so, subject to +> the following conditions: +> +> The above copyright notice and this permission notice shall be +> included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +> MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +> IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +> CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +> TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +> SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### character-entities-legacy@v1.1.4 + +License: MIT +By: Titus Wormer + +> (The MIT License) +> +> Copyright (c) 2015 Titus Wormer +> +> Permission is hereby granted, free of charge, to any person obtaining +> a copy of this software and associated documentation files (the +> 'Software'), to deal in the Software without restriction, including +> without limitation the rights to use, copy, modify, merge, publish, +> distribute, sublicense, and/or sell copies of the Software, and to +> permit persons to whom the Software is furnished to do so, subject to +> the following conditions: +> +> The above copyright notice and this permission notice shall be +> included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +> MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +> IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +> CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +> TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +> SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### character-reference-invalid@v1.1.4 + +License: MIT +By: Titus Wormer + +> (The MIT License) +> +> Copyright (c) 2015 Titus Wormer +> +> Permission is hereby granted, free of charge, to any person obtaining +> a copy of this software and associated documentation files (the +> 'Software'), to deal in the Software without restriction, including +> without limitation the rights to use, copy, modify, merge, publish, +> distribute, sublicense, and/or sell copies of the Software, and to +> permit persons to whom the Software is furnished to do so, subject to +> the following conditions: +> +> The above copyright notice and this permission notice shall be +> included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +> MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +> IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +> CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +> TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +> SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### ci-info@v3.3.0 + +License: MIT +By: Thomas Watson Steen +Repository: + +> The MIT License (MIT) +> +> Copyright (c) 2016-2021 Thomas Watson Steen +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all +> copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +> SOFTWARE. + +---------------------------------------- + +### clean-stack@v2.2.0 + +License: MIT +By: Sindre Sorhus + +> MIT License +> +> Copyright (c) Sindre Sorhus (sindresorhus.com) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### clone@v1.0.4 + +License: MIT +By: Paul Vorbach +Repository: + +> Copyright © 2011-2015 Paul Vorbach +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of +> this software and associated documentation files (the “Software”), to deal in +> the Software without restriction, including without limitation the rights to +> use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +> the Software, and to permit persons to whom the Software is furnished to do so, +> subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all +> copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +> FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +> COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +> IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, OUT OF OR IN CONNECTION WITH THE +> SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### collapse-white-space@v1.0.6 + +License: MIT +By: Titus Wormer + +> (The MIT License) +> +> Copyright (c) 2015 Titus Wormer +> +> Permission is hereby granted, free of charge, to any person obtaining +> a copy of this software and associated documentation files (the +> 'Software'), to deal in the Software without restriction, including +> without limitation the rights to use, copy, modify, merge, publish, +> distribute, sublicense, and/or sell copies of the Software, and to +> permit persons to whom the Software is furnished to do so, subject to +> the following conditions: +> +> The above copyright notice and this permission notice shall be +> included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +> MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +> IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +> CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +> TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +> SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### color-convert@v1.9.3 + +License: MIT +By: Heather Arthur + +> Copyright (c) 2011-2016 Heather Arthur +> +> Permission is hereby granted, free of charge, to any person obtaining +> a copy of this software and associated documentation files (the +> "Software"), to deal in the Software without restriction, including +> without limitation the rights to use, copy, modify, merge, publish, +> distribute, sublicense, and/or sell copies of the Software, and to +> permit persons to whom the Software is furnished to do so, subject to +> the following conditions: +> +> The above copyright notice and this permission notice shall be +> included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +> MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +> NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +> LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +> OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +> WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### color-name@v1.1.3 + +License: MIT +By: DY +Repository: + +> The MIT License (MIT) +> Copyright (c) 2015 Dmitry Ivanov +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### commondir@v1.0.1 + +License: MIT +By: James Halliday +Repository: + +> The MIT License +> +> Copyright (c) 2013 James Halliday (mail@substack.net) +> +> Permission is hereby granted, free of charge, +> to any person obtaining a copy of this software and +> associated documentation files (the "Software"), to +> deal in the Software without restriction, including +> without limitation the rights to use, copy, modify, +> merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom +> the Software is furnished to do so, +> subject to the following conditions: +> +> The above copyright notice and this permission notice +> shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +> OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +> IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR +> ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +> TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +> SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### concat-map@v0.0.1 + +License: MIT +By: James Halliday +Repository: + +> This software is released under the MIT license: +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of +> this software and associated documentation files (the "Software"), to deal in +> the Software without restriction, including without limitation the rights to +> use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +> the Software, and to permit persons to whom the Software is furnished to do so, +> subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all +> copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +> FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +> COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +> IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +> CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### cosmiconfig@v7.0.1 + +License: MIT +By: David Clark +Repository: + +> The MIT License (MIT) +> +> Copyright (c) 2015 David Clark +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all +> copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +> SOFTWARE. + +---------------------------------------- + +### cross-spawn@v7.0.3 + +License: MIT +By: André Cruz +Repository: + +> The MIT License (MIT) +> +> Copyright (c) 2018 Made With MOXY Lda +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +> THE SOFTWARE. + +---------------------------------------- + +### crypto-random-string@v4.0.0 + +License: MIT +By: Sindre Sorhus + +> MIT License +> +> Copyright (c) Sindre Sorhus (https://sindresorhus.com) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### css-units-list@v1.1.0 + +License: MIT +By: fisker Cheung + +> MIT License +> +> Copyright (c) fisker Cheung (https://www.fiskercheung.com/) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all +> copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +> SOFTWARE. + +---------------------------------------- + +### dashify@v2.0.0 + +License: MIT +By: Jon Schlinkert + +> The MIT License (MIT) +> +> Copyright (c) 2015-present, Jon Schlinkert. +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +> THE SOFTWARE. + +---------------------------------------- + +### debug@v4.3.4 + +License: MIT +By: Josh Junon +Repository: + +> (The MIT License) +> +> Copyright (c) 2014-2017 TJ Holowaychuk +> Copyright (c) 2018-2021 Josh Junon +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software +> and associated documentation files (the 'Software'), to deal in the Software without restriction, +> including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, +> and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, +> subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial +> portions of the Software. +> +> THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT +> LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +> IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +> WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +> SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### defaults@v1.0.3 + +License: MIT +By: Elijah Insua +Repository: + +> The MIT License (MIT) +> +> Copyright (c) 2015 Elijah Insua +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +> THE SOFTWARE. + +---------------------------------------- + +### del@v6.0.0 + +License: MIT +By: Sindre Sorhus + +> MIT License +> +> Copyright (c) Sindre Sorhus (https://sindresorhus.com) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### detect-newline@v3.1.0 + +License: MIT +By: Sindre Sorhus + +> MIT License +> +> Copyright (c) Sindre Sorhus (sindresorhus.com) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### diff@v5.0.0 + +License: BSD-3-Clause +Repository: + +> Software License Agreement (BSD License) +> +> Copyright (c) 2009-2015, Kevin Decker +> +> All rights reserved. +> +> Redistribution and use of this software in source and binary forms, with or without modification, +> are permitted provided that the following conditions are met: +> +> * Redistributions of source code must retain the above +> copyright notice, this list of conditions and the +> following disclaimer. +> +> * Redistributions in binary form must reproduce the above +> copyright notice, this list of conditions and the +> following disclaimer in the documentation and/or other +> materials provided with the distribution. +> +> * Neither the name of Kevin Decker nor the names of its +> contributors may be used to endorse or promote products +> derived from this software without specific prior +> written permission. +> +> THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR +> IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +> FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +> CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +> DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +> DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +> IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +> OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +---------------------------------------- + +### dir-glob@v3.0.1 + +License: MIT +By: Kevin Mårtensson + +> MIT License +> +> Copyright (c) Kevin Mårtensson (github.com/kevva) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### editorconfig@v0.15.3 + +License: MIT +By: EditorConfig Team +Repository: + +> Copyright © 2012 EditorConfig Team +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the “Software”), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +> THE SOFTWARE. + +---------------------------------------- + +### editorconfig-to-prettier@v0.2.0 + +License: ISC +By: Joseph Frazier +Repository: + +---------------------------------------- + +### emoji-regex@v9.2.2 + +License: MIT +By: Mathias Bynens +Repository: + +> Copyright Mathias Bynens +> +> Permission is hereby granted, free of charge, to any person obtaining +> a copy of this software and associated documentation files (the +> "Software"), to deal in the Software without restriction, including +> without limitation the rights to use, copy, modify, merge, publish, +> distribute, sublicense, and/or sell copies of the Software, and to +> permit persons to whom the Software is furnished to do so, subject to +> the following conditions: +> +> The above copyright notice and this permission notice shall be +> included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +> MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +> NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +> LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +> OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +> WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### error-ex@v1.3.2 + +License: MIT + +> The MIT License (MIT) +> +> Copyright (c) 2015 JD Ballard +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +> THE SOFTWARE. + +---------------------------------------- + +### escape-string-regexp@v1.0.5 + +License: MIT +By: Sindre Sorhus + +> The MIT License (MIT) +> +> Copyright (c) Sindre Sorhus (sindresorhus.com) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +> THE SOFTWARE. + +---------------------------------------- + +### escape-string-regexp@v5.0.0 + +License: MIT +By: Sindre Sorhus + +> MIT License +> +> Copyright (c) Sindre Sorhus (https://sindresorhus.com) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### eslint-visitor-keys@v3.3.0 + +License: Apache-2.0 +By: Toru Nagashima + +> Apache License +> Version 2.0, January 2004 +> http://www.apache.org/licenses/ +> +> TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION +> +> 1. Definitions. +> +> "License" shall mean the terms and conditions for use, reproduction, +> and distribution as defined by Sections 1 through 9 of this document. +> +> "Licensor" shall mean the copyright owner or entity authorized by +> the copyright owner that is granting the License. +> +> "Legal Entity" shall mean the union of the acting entity and all +> other entities that control, are controlled by, or are under common +> control with that entity. For the purposes of this definition, +> "control" means (i) the power, direct or indirect, to cause the +> direction or management of such entity, whether by contract or +> otherwise, or (ii) ownership of fifty percent (50%) or more of the +> outstanding shares, or (iii) beneficial ownership of such entity. +> +> "You" (or "Your") shall mean an individual or Legal Entity +> exercising permissions granted by this License. +> +> "Source" form shall mean the preferred form for making modifications, +> including but not limited to software source code, documentation +> source, and configuration files. +> +> "Object" form shall mean any form resulting from mechanical +> transformation or translation of a Source form, including but +> not limited to compiled object code, generated documentation, +> and conversions to other media types. +> +> "Work" shall mean the work of authorship, whether in Source or +> Object form, made available under the License, as indicated by a +> copyright notice that is included in or attached to the work +> (an example is provided in the Appendix below). +> +> "Derivative Works" shall mean any work, whether in Source or Object +> form, that is based on (or derived from) the Work and for which the +> editorial revisions, annotations, elaborations, or other modifications +> represent, as a whole, an original work of authorship. For the purposes +> of this License, Derivative Works shall not include works that remain +> separable from, or merely link (or bind by name) to the interfaces of, +> the Work and Derivative Works thereof. +> +> "Contribution" shall mean any work of authorship, including +> the original version of the Work and any modifications or additions +> to that Work or Derivative Works thereof, that is intentionally +> submitted to Licensor for inclusion in the Work by the copyright owner +> or by an individual or Legal Entity authorized to submit on behalf of +> the copyright owner. For the purposes of this definition, "submitted" +> means any form of electronic, verbal, or written communication sent +> to the Licensor or its representatives, including but not limited to +> communication on electronic mailing lists, source code control systems, +> and issue tracking systems that are managed by, or on behalf of, the +> Licensor for the purpose of discussing and improving the Work, but +> excluding communication that is conspicuously marked or otherwise +> designated in writing by the copyright owner as "Not a Contribution." +> +> "Contributor" shall mean Licensor and any individual or Legal Entity +> on behalf of whom a Contribution has been received by Licensor and +> subsequently incorporated within the Work. +> +> 2. Grant of Copyright License. Subject to the terms and conditions of +> this License, each Contributor hereby grants to You a perpetual, +> worldwide, non-exclusive, no-charge, royalty-free, irrevocable +> copyright license to reproduce, prepare Derivative Works of, +> publicly display, publicly perform, sublicense, and distribute the +> Work and such Derivative Works in Source or Object form. +> +> 3. Grant of Patent License. Subject to the terms and conditions of +> this License, each Contributor hereby grants to You a perpetual, +> worldwide, non-exclusive, no-charge, royalty-free, irrevocable +> (except as stated in this section) patent license to make, have made, +> use, offer to sell, sell, import, and otherwise transfer the Work, +> where such license applies only to those patent claims licensable +> by such Contributor that are necessarily infringed by their +> Contribution(s) alone or by combination of their Contribution(s) +> with the Work to which such Contribution(s) was submitted. If You +> institute patent litigation against any entity (including a +> cross-claim or counterclaim in a lawsuit) alleging that the Work +> or a Contribution incorporated within the Work constitutes direct +> or contributory patent infringement, then any patent licenses +> granted to You under this License for that Work shall terminate +> as of the date such litigation is filed. +> +> 4. Redistribution. You may reproduce and distribute copies of the +> Work or Derivative Works thereof in any medium, with or without +> modifications, and in Source or Object form, provided that You +> meet the following conditions: +> +> (a) You must give any other recipients of the Work or +> Derivative Works a copy of this License; and +> +> (b) You must cause any modified files to carry prominent notices +> stating that You changed the files; and +> +> (c) You must retain, in the Source form of any Derivative Works +> that You distribute, all copyright, patent, trademark, and +> attribution notices from the Source form of the Work, +> excluding those notices that do not pertain to any part of +> the Derivative Works; and +> +> (d) If the Work includes a "NOTICE" text file as part of its +> distribution, then any Derivative Works that You distribute must +> include a readable copy of the attribution notices contained +> within such NOTICE file, excluding those notices that do not +> pertain to any part of the Derivative Works, in at least one +> of the following places: within a NOTICE text file distributed +> as part of the Derivative Works; within the Source form or +> documentation, if provided along with the Derivative Works; or, +> within a display generated by the Derivative Works, if and +> wherever such third-party notices normally appear. The contents +> of the NOTICE file are for informational purposes only and +> do not modify the License. You may add Your own attribution +> notices within Derivative Works that You distribute, alongside +> or as an addendum to the NOTICE text from the Work, provided +> that such additional attribution notices cannot be construed +> as modifying the License. +> +> You may add Your own copyright statement to Your modifications and +> may provide additional or different license terms and conditions +> for use, reproduction, or distribution of Your modifications, or +> for any such Derivative Works as a whole, provided Your use, +> reproduction, and distribution of the Work otherwise complies with +> the conditions stated in this License. +> +> 5. Submission of Contributions. Unless You explicitly state otherwise, +> any Contribution intentionally submitted for inclusion in the Work +> by You to the Licensor shall be under the terms and conditions of +> this License, without any additional terms or conditions. +> Notwithstanding the above, nothing herein shall supersede or modify +> the terms of any separate license agreement you may have executed +> with Licensor regarding such Contributions. +> +> 6. Trademarks. This License does not grant permission to use the trade +> names, trademarks, service marks, or product names of the Licensor, +> except as required for reasonable and customary use in describing the +> origin of the Work and reproducing the content of the NOTICE file. +> +> 7. Disclaimer of Warranty. Unless required by applicable law or +> agreed to in writing, Licensor provides the Work (and each +> Contributor provides its Contributions) on an "AS IS" BASIS, +> WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or +> implied, including, without limitation, any warranties or conditions +> of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A +> PARTICULAR PURPOSE. You are solely responsible for determining the +> appropriateness of using or redistributing the Work and assume any +> risks associated with Your exercise of permissions under this License. +> +> 8. Limitation of Liability. In no event and under no legal theory, +> whether in tort (including negligence), contract, or otherwise, +> unless required by applicable law (such as deliberate and grossly +> negligent acts) or agreed to in writing, shall any Contributor be +> liable to You for damages, including any direct, indirect, special, +> incidental, or consequential damages of any character arising as a +> result of this License or out of the use or inability to use the +> Work (including but not limited to damages for loss of goodwill, +> work stoppage, computer failure or malfunction, or any and all +> other commercial damages or losses), even if such Contributor +> has been advised of the possibility of such damages. +> +> 9. Accepting Warranty or Additional Liability. While redistributing +> the Work or Derivative Works thereof, You may choose to offer, +> and charge a fee for, acceptance of support, warranty, indemnity, +> or other liability obligations and/or rights consistent with this +> License. However, in accepting such obligations, You may act only +> on Your own behalf and on Your sole responsibility, not on behalf +> of any other Contributor, and only if You agree to indemnify, +> defend, and hold each Contributor harmless for any liability +> incurred by, or claims asserted against, such Contributor by reason +> of your accepting any such warranty or additional liability. +> +> END OF TERMS AND CONDITIONS +> +> APPENDIX: How to apply the Apache License to your work. +> +> To apply the Apache License to your work, attach the following +> boilerplate notice, with the fields enclosed by brackets "{}" +> replaced with your own identifying information. (Don't include +> the brackets!) The text should be enclosed in the appropriate +> comment syntax for the file format. We also recommend that a +> file or class name and description of purpose be included on the +> same "printed page" as the copyright notice for easier +> identification within third-party archives. +> +> Copyright contributors +> +> Licensed under the Apache License, Version 2.0 (the "License"); +> you may not use this file except in compliance with the License. +> You may obtain a copy of the License at +> +> http://www.apache.org/licenses/LICENSE-2.0 +> +> Unless required by applicable law or agreed to in writing, software +> distributed under the License is distributed on an "AS IS" BASIS, +> WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +> See the License for the specific language governing permissions and +> limitations under the License. + +---------------------------------------- + +### espree@v9.3.1 + +License: BSD-2-Clause +By: Nicholas C. Zakas + +> BSD 2-Clause License +> +> Copyright (c) Open JS Foundation +> All rights reserved. +> +> Redistribution and use in source and binary forms, with or without +> modification, are permitted provided that the following conditions are met: +> +> 1. Redistributions of source code must retain the above copyright notice, this +> list of conditions and the following disclaimer. +> +> 2. Redistributions in binary form must reproduce the above copyright notice, +> this list of conditions and the following disclaimer in the documentation +> and/or other materials provided with the distribution. +> +> THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +> AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +> IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +> DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +> FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +> DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +> SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +> CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +> OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +> OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +---------------------------------------- + +### esutils@v2.0.3 + +License: BSD-2-Clause +Repository: + +> Redistribution and use in source and binary forms, with or without +> modification, are permitted provided that the following conditions are met: +> +> * Redistributions of source code must retain the above copyright +> notice, this list of conditions and the following disclaimer. +> * Redistributions in binary form must reproduce the above copyright +> notice, this list of conditions and the following disclaimer in the +> documentation and/or other materials provided with the distribution. +> +> THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +> AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +> IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +> ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY +> DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +> (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +> LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +> ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +> (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +> THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +---------------------------------------- + +### execa@v6.1.0 + +License: MIT +By: Sindre Sorhus + +> MIT License +> +> Copyright (c) Sindre Sorhus (https://sindresorhus.com) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### extend@v3.0.2 + +License: MIT +By: Stefan Thomas +Repository: + +> The MIT License (MIT) +> +> Copyright (c) 2014 Stefan Thomas +> +> Permission is hereby granted, free of charge, to any person obtaining +> a copy of this software and associated documentation files (the +> "Software"), to deal in the Software without restriction, including +> without limitation the rights to use, copy, modify, merge, publish, +> distribute, sublicense, and/or sell copies of the Software, and to +> permit persons to whom the Software is furnished to do so, subject to +> the following conditions: +> +> The above copyright notice and this permission notice shall be +> included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +> MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +> NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +> LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +> OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +> WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### fast-glob@v3.2.11 + +License: MIT +By: Denis Malinochkin + +> The MIT License (MIT) +> +> Copyright (c) Denis Malinochkin +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all +> copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +> SOFTWARE. + +---------------------------------------- + +### fast-json-stable-stringify@v2.1.0 + +License: MIT +By: James Halliday +Repository: + +> This software is released under the MIT license: +> +> Copyright (c) 2017 Evgeny Poberezkin +> Copyright (c) 2013 James Halliday +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of +> this software and associated documentation files (the "Software"), to deal in +> the Software without restriction, including without limitation the rights to +> use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +> the Software, and to permit persons to whom the Software is furnished to do so, +> subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all +> copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +> FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +> COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +> IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +> CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### fastq@v1.13.0 + +License: ISC +By: Matteo Collina +Repository: + +> Copyright (c) 2015-2020, Matteo Collina +> +> Permission to use, copy, modify, and/or distribute this software for any +> purpose with or without fee is hereby granted, provided that the above +> copyright notice and this permission notice appear in all copies. +> +> THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +> WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +> MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +> ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +> WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +> ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +> OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +---------------------------------------- + +### file-entry-cache@v6.0.1 + +License: MIT +By: Roy Riojas + +> The MIT License (MIT) +> +> Copyright (c) 2015 Roy Riojas +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all +> copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +> SOFTWARE. + +---------------------------------------- + +### fill-range@v7.0.1 + +License: MIT +By: Jon Schlinkert + +> The MIT License (MIT) +> +> Copyright (c) 2014-present, Jon Schlinkert. +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +> THE SOFTWARE. + +---------------------------------------- + +### find-cache-dir@v3.3.2 + +License: MIT + +> MIT License +> +> Copyright (c) Sindre Sorhus (https://sindresorhus.com) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### find-parent-dir@v0.3.1 + +License: MIT +By: Thorsten Lorenz +Repository: + +> Copyright 2013 Thorsten Lorenz. +> All rights reserved. +> +> Permission is hereby granted, free of charge, to any person +> obtaining a copy of this software and associated documentation +> files (the "Software"), to deal in the Software without +> restriction, including without limitation the rights to use, +> copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the +> Software is furnished to do so, subject to the following +> conditions: +> +> The above copyright notice and this permission notice shall be +> included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +> OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +> NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +> HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +> WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +> FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +> OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### find-up@v4.1.0 + +License: MIT +By: Sindre Sorhus + +> MIT License +> +> Copyright (c) Sindre Sorhus (sindresorhus.com) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### flat-cache@v3.0.4 + +License: MIT +By: Roy Riojas + +> The MIT License (MIT) +> +> Copyright (c) 2015 Roy Riojas +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all +> copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +> SOFTWARE. + +---------------------------------------- + +### flatted@v3.2.5 + +License: ISC +By: Andrea Giammarchi +Repository: + +> ISC License +> +> Copyright (c) 2018-2020, Andrea Giammarchi, @WebReflection +> +> Permission to use, copy, modify, and/or distribute this software for any +> purpose with or without fee is hereby granted, provided that the above +> copyright notice and this permission notice appear in all copies. +> +> THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +> REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +> AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +> INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +> LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE +> OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +> PERFORMANCE OF THIS SOFTWARE. + +---------------------------------------- + +### flatten@v1.0.3 + +License: MIT +By: Joshua Holbrook +Repository: + +> The MIT License (MIT) +> +> Copyright (c) 2016 Joshua Holbrook +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +> THE SOFTWARE. + +---------------------------------------- + +### flow-parser@v0.180.0 + +License: MIT +By: Flow Team +Repository: + +---------------------------------------- + +### fs.realpath@v1.0.0 + +License: ISC +By: Isaac Z. Schlueter +Repository: + +> The ISC License +> +> Copyright (c) Isaac Z. Schlueter and Contributors +> +> Permission to use, copy, modify, and/or distribute this software for any +> purpose with or without fee is hereby granted, provided that the above +> copyright notice and this permission notice appear in all copies. +> +> THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +> WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +> MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +> ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +> WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +> ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +> IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +> +> ---- +> +> This library bundles a version of the `fs.realpath` and `fs.realpathSync` +> methods from Node.js v0.10 under the terms of the Node.js MIT license. +> +> Node's license follows, also included at the header of `old.js` which contains +> the licensed code: +> +> Copyright Joyent, Inc. and other Node contributors. +> +> Permission is hereby granted, free of charge, to any person obtaining a +> copy of this software and associated documentation files (the "Software"), +> to deal in the Software without restriction, including without limitation +> the rights to use, copy, modify, merge, publish, distribute, sublicense, +> and/or sell copies of the Software, and to permit persons to whom the +> Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +> FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +> DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### function-bind@v1.1.1 + +License: MIT +By: Raynos + +> Copyright (c) 2013 Raynos. +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +> THE SOFTWARE. + +---------------------------------------- + +### get-stdin@v8.0.0 + +License: MIT +By: Sindre Sorhus + +> MIT License +> +> Copyright (c) Sindre Sorhus (https://sindresorhus.com) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### get-stream@v6.0.1 + +License: MIT +By: Sindre Sorhus + +> MIT License +> +> Copyright (c) Sindre Sorhus (https://sindresorhus.com) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### glob@v7.2.0 + +License: ISC +By: Isaac Z. Schlueter +Repository: + +> The ISC License +> +> Copyright (c) Isaac Z. Schlueter and Contributors +> +> Permission to use, copy, modify, and/or distribute this software for any +> purpose with or without fee is hereby granted, provided that the above +> copyright notice and this permission notice appear in all copies. +> +> THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +> WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +> MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +> ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +> WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +> ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +> IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +> +> ## Glob Logo +> +> Glob's logo created by Tanya Brassie , licensed +> under a Creative Commons Attribution-ShareAlike 4.0 International License +> https://creativecommons.org/licenses/by-sa/4.0/ + +---------------------------------------- + +### glob-parent@v5.1.2 + +License: ISC +By: Gulp Team + +> The ISC License +> +> Copyright (c) 2015, 2019 Elan Shanker +> +> Permission to use, copy, modify, and/or distribute this software for any +> purpose with or without fee is hereby granted, provided that the above +> copyright notice and this permission notice appear in all copies. +> +> THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +> WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +> MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +> ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +> WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +> ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +> IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +---------------------------------------- + +### globby@v11.1.0 + +License: MIT +By: Sindre Sorhus + +> MIT License +> +> Copyright (c) Sindre Sorhus (sindresorhus.com) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### graceful-fs@v4.2.9 + +License: ISC +Repository: + +> The ISC License +> +> Copyright (c) Isaac Z. Schlueter, Ben Noordhuis, and Contributors +> +> Permission to use, copy, modify, and/or distribute this software for any +> purpose with or without fee is hereby granted, provided that the above +> copyright notice and this permission notice appear in all copies. +> +> THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +> WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +> MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +> ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +> WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +> ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +> IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +---------------------------------------- + +### graphql@v15.6.1 + +License: MIT +Repository: + +> MIT License +> +> Copyright (c) GraphQL Contributors +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all +> copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +> SOFTWARE. + +---------------------------------------- + +### has@v1.0.3 + +License: MIT +By: Thiago de Arruda +Repository: + +> Copyright (c) 2013 Thiago de Arruda +> +> Permission is hereby granted, free of charge, to any person +> obtaining a copy of this software and associated documentation +> files (the "Software"), to deal in the Software without +> restriction, including without limitation the rights to use, +> copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the +> Software is furnished to do so, subject to the following +> conditions: +> +> The above copyright notice and this permission notice shall be +> included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +> OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +> NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +> HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +> WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +> FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +> OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### has-flag@v3.0.0 + +License: MIT +By: Sindre Sorhus + +> MIT License +> +> Copyright (c) Sindre Sorhus (sindresorhus.com) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### html-element-attributes@v3.1.0 + +License: MIT +By: Titus Wormer + +> (The MIT License) +> +> Copyright (c) 2016 Titus Wormer +> +> Permission is hereby granted, free of charge, to any person obtaining +> a copy of this software and associated documentation files (the +> 'Software'), to deal in the Software without restriction, including +> without limitation the rights to use, copy, modify, merge, publish, +> distribute, sublicense, and/or sell copies of the Software, and to +> permit persons to whom the Software is furnished to do so, subject to +> the following conditions: +> +> The above copyright notice and this permission notice shall be +> included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +> MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +> IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +> CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +> TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +> SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### html-tag-names@v2.0.1 + +License: MIT +By: Titus Wormer + +> (The MIT License) +> +> Copyright (c) 2016 Titus Wormer +> +> Permission is hereby granted, free of charge, to any person obtaining +> a copy of this software and associated documentation files (the +> 'Software'), to deal in the Software without restriction, including +> without limitation the rights to use, copy, modify, merge, publish, +> distribute, sublicense, and/or sell copies of the Software, and to +> permit persons to whom the Software is furnished to do so, subject to +> the following conditions: +> +> The above copyright notice and this permission notice shall be +> included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +> MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +> IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +> CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +> TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +> SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### html-void-elements@v2.0.1 + +License: MIT +By: Titus Wormer + +> (The MIT License) +> +> Copyright (c) 2016 Titus Wormer +> +> Permission is hereby granted, free of charge, to any person obtaining +> a copy of this software and associated documentation files (the +> 'Software'), to deal in the Software without restriction, including +> without limitation the rights to use, copy, modify, merge, publish, +> distribute, sublicense, and/or sell copies of the Software, and to +> permit persons to whom the Software is furnished to do so, subject to +> the following conditions: +> +> The above copyright notice and this permission notice shall be +> included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +> MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +> IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +> CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +> TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +> SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### human-signals@v3.0.1 + +License: Apache-2.0 +By: ehmicky + +> Apache License +> Version 2.0, January 2004 +> http://www.apache.org/licenses/ +> +> TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION +> +> 1. Definitions. +> +> "License" shall mean the terms and conditions for use, reproduction, +> and distribution as defined by Sections 1 through 9 of this document. +> +> "Licensor" shall mean the copyright owner or entity authorized by +> the copyright owner that is granting the License. +> +> "Legal Entity" shall mean the union of the acting entity and all +> other entities that control, are controlled by, or are under common +> control with that entity. For the purposes of this definition, +> "control" means (i) the power, direct or indirect, to cause the +> direction or management of such entity, whether by contract or +> otherwise, or (ii) ownership of fifty percent (50%) or more of the +> outstanding shares, or (iii) beneficial ownership of such entity. +> +> "You" (or "Your") shall mean an individual or Legal Entity +> exercising permissions granted by this License. +> +> "Source" form shall mean the preferred form for making modifications, +> including but not limited to software source code, documentation +> source, and configuration files. +> +> "Object" form shall mean any form resulting from mechanical +> transformation or translation of a Source form, including but +> not limited to compiled object code, generated documentation, +> and conversions to other media types. +> +> "Work" shall mean the work of authorship, whether in Source or +> Object form, made available under the License, as indicated by a +> copyright notice that is included in or attached to the work +> (an example is provided in the Appendix below). +> +> "Derivative Works" shall mean any work, whether in Source or Object +> form, that is based on (or derived from) the Work and for which the +> editorial revisions, annotations, elaborations, or other modifications +> represent, as a whole, an original work of authorship. For the purposes +> of this License, Derivative Works shall not include works that remain +> separable from, or merely link (or bind by name) to the interfaces of, +> the Work and Derivative Works thereof. +> +> "Contribution" shall mean any work of authorship, including +> the original version of the Work and any modifications or additions +> to that Work or Derivative Works thereof, that is intentionally +> submitted to Licensor for inclusion in the Work by the copyright owner +> or by an individual or Legal Entity authorized to submit on behalf of +> the copyright owner. For the purposes of this definition, "submitted" +> means any form of electronic, verbal, or written communication sent +> to the Licensor or its representatives, including but not limited to +> communication on electronic mailing lists, source code control systems, +> and issue tracking systems that are managed by, or on behalf of, the +> Licensor for the purpose of discussing and improving the Work, but +> excluding communication that is conspicuously marked or otherwise +> designated in writing by the copyright owner as "Not a Contribution." +> +> "Contributor" shall mean Licensor and any individual or Legal Entity +> on behalf of whom a Contribution has been received by Licensor and +> subsequently incorporated within the Work. +> +> 2. Grant of Copyright License. Subject to the terms and conditions of +> this License, each Contributor hereby grants to You a perpetual, +> worldwide, non-exclusive, no-charge, royalty-free, irrevocable +> copyright license to reproduce, prepare Derivative Works of, +> publicly display, publicly perform, sublicense, and distribute the +> Work and such Derivative Works in Source or Object form. +> +> 3. Grant of Patent License. Subject to the terms and conditions of +> this License, each Contributor hereby grants to You a perpetual, +> worldwide, non-exclusive, no-charge, royalty-free, irrevocable +> (except as stated in this section) patent license to make, have made, +> use, offer to sell, sell, import, and otherwise transfer the Work, +> where such license applies only to those patent claims licensable +> by such Contributor that are necessarily infringed by their +> Contribution(s) alone or by combination of their Contribution(s) +> with the Work to which such Contribution(s) was submitted. If You +> institute patent litigation against any entity (including a +> cross-claim or counterclaim in a lawsuit) alleging that the Work +> or a Contribution incorporated within the Work constitutes direct +> or contributory patent infringement, then any patent licenses +> granted to You under this License for that Work shall terminate +> as of the date such litigation is filed. +> +> 4. Redistribution. You may reproduce and distribute copies of the +> Work or Derivative Works thereof in any medium, with or without +> modifications, and in Source or Object form, provided that You +> meet the following conditions: +> +> (a) You must give any other recipients of the Work or +> Derivative Works a copy of this License; and +> +> (b) You must cause any modified files to carry prominent notices +> stating that You changed the files; and +> +> (c) You must retain, in the Source form of any Derivative Works +> that You distribute, all copyright, patent, trademark, and +> attribution notices from the Source form of the Work, +> excluding those notices that do not pertain to any part of +> the Derivative Works; and +> +> (d) If the Work includes a "NOTICE" text file as part of its +> distribution, then any Derivative Works that You distribute must +> include a readable copy of the attribution notices contained +> within such NOTICE file, excluding those notices that do not +> pertain to any part of the Derivative Works, in at least one +> of the following places: within a NOTICE text file distributed +> as part of the Derivative Works; within the Source form or +> documentation, if provided along with the Derivative Works; or, +> within a display generated by the Derivative Works, if and +> wherever such third-party notices normally appear. The contents +> of the NOTICE file are for informational purposes only and +> do not modify the License. You may add Your own attribution +> notices within Derivative Works that You distribute, alongside +> or as an addendum to the NOTICE text from the Work, provided +> that such additional attribution notices cannot be construed +> as modifying the License. +> +> You may add Your own copyright statement to Your modifications and +> may provide additional or different license terms and conditions +> for use, reproduction, or distribution of Your modifications, or +> for any such Derivative Works as a whole, provided Your use, +> reproduction, and distribution of the Work otherwise complies with +> the conditions stated in this License. +> +> 5. Submission of Contributions. Unless You explicitly state otherwise, +> any Contribution intentionally submitted for inclusion in the Work +> by You to the Licensor shall be under the terms and conditions of +> this License, without any additional terms or conditions. +> Notwithstanding the above, nothing herein shall supersede or modify +> the terms of any separate license agreement you may have executed +> with Licensor regarding such Contributions. +> +> 6. Trademarks. This License does not grant permission to use the trade +> names, trademarks, service marks, or product names of the Licensor, +> except as required for reasonable and customary use in describing the +> origin of the Work and reproducing the content of the NOTICE file. +> +> 7. Disclaimer of Warranty. Unless required by applicable law or +> agreed to in writing, Licensor provides the Work (and each +> Contributor provides its Contributions) on an "AS IS" BASIS, +> WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or +> implied, including, without limitation, any warranties or conditions +> of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A +> PARTICULAR PURPOSE. You are solely responsible for determining the +> appropriateness of using or redistributing the Work and assume any +> risks associated with Your exercise of permissions under this License. +> +> 8. Limitation of Liability. In no event and under no legal theory, +> whether in tort (including negligence), contract, or otherwise, +> unless required by applicable law (such as deliberate and grossly +> negligent acts) or agreed to in writing, shall any Contributor be +> liable to You for damages, including any direct, indirect, special, +> incidental, or consequential damages of any character arising as a +> result of this License or out of the use or inability to use the +> Work (including but not limited to damages for loss of goodwill, +> work stoppage, computer failure or malfunction, or any and all +> other commercial damages or losses), even if such Contributor +> has been advised of the possibility of such damages. +> +> 9. Accepting Warranty or Additional Liability. While redistributing +> the Work or Derivative Works thereof, You may choose to offer, +> and charge a fee for, acceptance of support, warranty, indemnity, +> or other liability obligations and/or rights consistent with this +> License. However, in accepting such obligations, You may act only +> on Your own behalf and on Your sole responsibility, not on behalf +> of any other Contributor, and only if You agree to indemnify, +> defend, and hold each Contributor harmless for any liability +> incurred by, or claims asserted against, such Contributor by reason +> of your accepting any such warranty or additional liability. +> +> END OF TERMS AND CONDITIONS +> +> APPENDIX: How to apply the Apache License to your work. +> +> To apply the Apache License to your work, attach the following +> boilerplate notice, with the fields enclosed by brackets "[]" +> replaced with your own identifying information. (Don't include +> the brackets!) The text should be enclosed in the appropriate +> comment syntax for the file format. We also recommend that a +> file or class name and description of purpose be included on the +> same "printed page" as the copyright notice for easier +> identification within third-party archives. +> +> Copyright 2021 ehmicky +> +> Licensed under the Apache License, Version 2.0 (the "License"); +> you may not use this file except in compliance with the License. +> You may obtain a copy of the License at +> +> http://www.apache.org/licenses/LICENSE-2.0 +> +> Unless required by applicable law or agreed to in writing, software +> distributed under the License is distributed on an "AS IS" BASIS, +> WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +> See the License for the specific language governing permissions and +> limitations under the License. + +---------------------------------------- + +### ignore@v5.2.0 + +License: MIT +By: kael +Repository: + +> Copyright (c) 2013 Kael Zhang , contributors +> http://kael.me/ +> +> Permission is hereby granted, free of charge, to any person obtaining +> a copy of this software and associated documentation files (the +> "Software"), to deal in the Software without restriction, including +> without limitation the rights to use, copy, modify, merge, publish, +> distribute, sublicense, and/or sell copies of the Software, and to +> permit persons to whom the Software is furnished to do so, subject to +> the following conditions: +> +> The above copyright notice and this permission notice shall be +> included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +> MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +> NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +> LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +> OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +> WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### import-fresh@v3.3.0 + +License: MIT +By: Sindre Sorhus + +> MIT License +> +> Copyright (c) Sindre Sorhus (https://sindresorhus.com) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### indent-string@v4.0.0 + +License: MIT +By: Sindre Sorhus + +> MIT License +> +> Copyright (c) Sindre Sorhus (sindresorhus.com) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### indexes-of@v1.0.1 + +License: MIT +By: Dominic Tarr +Repository: + +> Copyright (c) 2013 Dominic Tarr +> +> Permission is hereby granted, free of charge, +> to any person obtaining a copy of this software and +> associated documentation files (the "Software"), to +> deal in the Software without restriction, including +> without limitation the rights to use, copy, modify, +> merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom +> the Software is furnished to do so, +> subject to the following conditions: +> +> The above copyright notice and this permission notice +> shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +> OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +> IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR +> ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +> TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +> SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### inflight@v1.0.6 + +License: ISC +By: Isaac Z. Schlueter +Repository: + +> The ISC License +> +> Copyright (c) Isaac Z. Schlueter +> +> Permission to use, copy, modify, and/or distribute this software for any +> purpose with or without fee is hereby granted, provided that the above +> copyright notice and this permission notice appear in all copies. +> +> THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +> WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +> MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +> ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +> WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +> ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +> IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +---------------------------------------- + +### inherits@v2.0.4 + +License: ISC + +> The ISC License +> +> Copyright (c) Isaac Z. Schlueter +> +> Permission to use, copy, modify, and/or distribute this software for any +> purpose with or without fee is hereby granted, provided that the above +> copyright notice and this permission notice appear in all copies. +> +> THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +> REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +> FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +> INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +> LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +> OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +> PERFORMANCE OF THIS SOFTWARE. + +---------------------------------------- + +### is-alphabetical@v1.0.4 + +License: MIT +By: Titus Wormer + +> (The MIT License) +> +> Copyright (c) 2016 Titus Wormer +> +> Permission is hereby granted, free of charge, to any person obtaining +> a copy of this software and associated documentation files (the +> 'Software'), to deal in the Software without restriction, including +> without limitation the rights to use, copy, modify, merge, publish, +> distribute, sublicense, and/or sell copies of the Software, and to +> permit persons to whom the Software is furnished to do so, subject to +> the following conditions: +> +> The above copyright notice and this permission notice shall be +> included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +> MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +> IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +> CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +> TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +> SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### is-alphanumerical@v1.0.4 + +License: MIT +By: Titus Wormer + +> (The MIT License) +> +> Copyright (c) 2016 Titus Wormer +> +> Permission is hereby granted, free of charge, to any person obtaining +> a copy of this software and associated documentation files (the +> 'Software'), to deal in the Software without restriction, including +> without limitation the rights to use, copy, modify, merge, publish, +> distribute, sublicense, and/or sell copies of the Software, and to +> permit persons to whom the Software is furnished to do so, subject to +> the following conditions: +> +> The above copyright notice and this permission notice shall be +> included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +> MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +> IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +> CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +> TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +> SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### is-arrayish@v0.2.1 + +License: MIT +By: Qix +Repository: + +> The MIT License (MIT) +> +> Copyright (c) 2015 JD Ballard +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +> THE SOFTWARE. + +---------------------------------------- + +### is-buffer@v2.0.5 + +License: MIT +By: Feross Aboukhadijeh +Repository: + +> The MIT License (MIT) +> +> Copyright (c) Feross Aboukhadijeh +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +> THE SOFTWARE. + +---------------------------------------- + +### is-core-module@v2.8.1 + +License: MIT +By: Jordan Harband +Repository: + +> The MIT License (MIT) +> +> Copyright (c) 2014 Dave Justice +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of +> this software and associated documentation files (the "Software"), to deal in +> the Software without restriction, including without limitation the rights to +> use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +> the Software, and to permit persons to whom the Software is furnished to do so, +> subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all +> copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +> FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +> COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +> IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +> CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### is-decimal@v1.0.4 + +License: MIT +By: Titus Wormer + +> (The MIT License) +> +> Copyright (c) 2016 Titus Wormer +> +> Permission is hereby granted, free of charge, to any person obtaining +> a copy of this software and associated documentation files (the +> 'Software'), to deal in the Software without restriction, including +> without limitation the rights to use, copy, modify, merge, publish, +> distribute, sublicense, and/or sell copies of the Software, and to +> permit persons to whom the Software is furnished to do so, subject to +> the following conditions: +> +> The above copyright notice and this permission notice shall be +> included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +> MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +> IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +> CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +> TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +> SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### is-extglob@v2.1.1 + +License: MIT +By: Jon Schlinkert + +> The MIT License (MIT) +> +> Copyright (c) 2014-2016, Jon Schlinkert +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +> THE SOFTWARE. + +---------------------------------------- + +### is-fullwidth-code-point@v4.0.0 + +License: MIT +By: Sindre Sorhus + +> MIT License +> +> Copyright (c) Sindre Sorhus (https://sindresorhus.com) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### is-glob@v4.0.3 + +License: MIT +By: Jon Schlinkert + +> The MIT License (MIT) +> +> Copyright (c) 2014-2017, Jon Schlinkert. +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +> THE SOFTWARE. + +---------------------------------------- + +### is-hexadecimal@v1.0.4 + +License: MIT +By: Titus Wormer + +> (The MIT License) +> +> Copyright (c) 2016 Titus Wormer +> +> Permission is hereby granted, free of charge, to any person obtaining +> a copy of this software and associated documentation files (the +> 'Software'), to deal in the Software without restriction, including +> without limitation the rights to use, copy, modify, merge, publish, +> distribute, sublicense, and/or sell copies of the Software, and to +> permit persons to whom the Software is furnished to do so, subject to +> the following conditions: +> +> The above copyright notice and this permission notice shall be +> included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +> MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +> IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +> CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +> TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +> SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### is-number@v7.0.0 + +License: MIT +By: Jon Schlinkert + +> The MIT License (MIT) +> +> Copyright (c) 2014-present, Jon Schlinkert. +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +> THE SOFTWARE. + +---------------------------------------- + +### is-path-cwd@v2.2.0 + +License: MIT +By: Sindre Sorhus + +> MIT License +> +> Copyright (c) Sindre Sorhus (sindresorhus.com) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### is-path-inside@v3.0.3 + +License: MIT +By: Sindre Sorhus + +> MIT License +> +> Copyright (c) Sindre Sorhus (sindresorhus.com) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### is-plain-obj@v2.1.0 + +License: MIT +By: Sindre Sorhus + +> MIT License +> +> Copyright (c) Sindre Sorhus (sindresorhus.com) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### is-stream@v3.0.0 + +License: MIT +By: Sindre Sorhus + +> MIT License +> +> Copyright (c) Sindre Sorhus (https://sindresorhus.com) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### is-whitespace-character@v1.0.4 + +License: MIT +By: Titus Wormer + +> (The MIT License) +> +> Copyright (c) 2016 Titus Wormer +> +> Permission is hereby granted, free of charge, to any person obtaining +> a copy of this software and associated documentation files (the +> 'Software'), to deal in the Software without restriction, including +> without limitation the rights to use, copy, modify, merge, publish, +> distribute, sublicense, and/or sell copies of the Software, and to +> permit persons to whom the Software is furnished to do so, subject to +> the following conditions: +> +> The above copyright notice and this permission notice shall be +> included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +> MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +> IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +> CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +> TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +> SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### is-word-character@v1.0.4 + +License: MIT +By: Titus Wormer + +> (The MIT License) +> +> Copyright (c) 2016 Titus Wormer +> +> Permission is hereby granted, free of charge, to any person obtaining +> a copy of this software and associated documentation files (the +> 'Software'), to deal in the Software without restriction, including +> without limitation the rights to use, copy, modify, merge, publish, +> distribute, sublicense, and/or sell copies of the Software, and to +> permit persons to whom the Software is furnished to do so, subject to +> the following conditions: +> +> The above copyright notice and this permission notice shall be +> included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +> MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +> IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +> CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +> TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +> SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### isexe@v2.0.0 + +License: ISC +By: Isaac Z. Schlueter +Repository: + +> The ISC License +> +> Copyright (c) Isaac Z. Schlueter and Contributors +> +> Permission to use, copy, modify, and/or distribute this software for any +> purpose with or without fee is hereby granted, provided that the above +> copyright notice and this permission notice appear in all copies. +> +> THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +> WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +> MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +> ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +> WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +> ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +> IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +---------------------------------------- + +### jest-docblock@v27.5.1 + +License: MIT +Repository: + +> MIT License +> +> Copyright (c) Facebook, Inc. and its affiliates. +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all +> copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +> SOFTWARE. + +---------------------------------------- + +### js-tokens@v4.0.0 + +License: MIT +By: Simon Lydell + +> The MIT License (MIT) +> +> Copyright (c) 2014, 2015, 2016, 2017, 2018 Simon Lydell +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +> THE SOFTWARE. + +---------------------------------------- + +### json-parse-even-better-errors@v2.3.1 + +License: MIT +By: Kat Marchán + +> Copyright 2017 Kat Marchán +> Copyright npm, Inc. +> +> Permission is hereby granted, free of charge, to any person obtaining a +> copy of this software and associated documentation files (the "Software"), +> to deal in the Software without restriction, including without limitation +> the rights to use, copy, modify, merge, publish, distribute, sublicense, +> and/or sell copies of the Software, and to permit persons to whom the +> Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +> FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +> DEALINGS IN THE SOFTWARE. +> +> --- +> +> This library is a fork of 'better-json-errors' by Kat Marchán, extended and +> distributed under the terms of the MIT license above. + +---------------------------------------- + +### json5@v2.2.1 + +License: MIT +By: Aseem Kishore +Repository: + +> MIT License +> +> Copyright (c) 2012-2018 Aseem Kishore, and [others]. +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all +> copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +> SOFTWARE. +> +> [others]: https://github.com/json5/json5/contributors + +---------------------------------------- + +### leven@v2.1.0 + +License: MIT +By: Sindre Sorhus + +> The MIT License (MIT) +> +> Copyright (c) Sindre Sorhus (sindresorhus.com) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +> THE SOFTWARE. + +---------------------------------------- + +### leven@v4.0.0 + +License: MIT +By: Sindre Sorhus + +> MIT License +> +> Copyright (c) Sindre Sorhus (https://sindresorhus.com) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### lines-and-columns@v1.2.4 + +License: MIT +By: Brian Donovan +Repository: + +> The MIT License (MIT) +> +> Copyright (c) 2015 Brian Donovan +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +> THE SOFTWARE. + +---------------------------------------- + +### lines-and-columns@v2.0.3 + +License: MIT +By: Brian Donovan +Repository: + +> The MIT License (MIT) +> +> Copyright (c) 2015 Brian Donovan +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +> THE SOFTWARE. + +---------------------------------------- + +### linguist-languages@v7.21.0 + +License: MIT +By: Ika + +> MIT License +> +> Copyright (c) Ika (https://github.com/ikatyang) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all +> copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +> SOFTWARE. + +---------------------------------------- + +### locate-path@v5.0.0 + +License: MIT +By: Sindre Sorhus + +> MIT License +> +> Copyright (c) Sindre Sorhus (sindresorhus.com) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### lru-cache@v4.1.5 + +License: ISC +By: Isaac Z. Schlueter + +> The ISC License +> +> Copyright (c) Isaac Z. Schlueter and Contributors +> +> Permission to use, copy, modify, and/or distribute this software for any +> purpose with or without fee is hereby granted, provided that the above +> copyright notice and this permission notice appear in all copies. +> +> THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +> WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +> MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +> ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +> WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +> ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +> IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +---------------------------------------- + +### lru-cache@v6.0.0 + +License: ISC +By: Isaac Z. Schlueter + +> The ISC License +> +> Copyright (c) Isaac Z. Schlueter and Contributors +> +> Permission to use, copy, modify, and/or distribute this software for any +> purpose with or without fee is hereby granted, provided that the above +> copyright notice and this permission notice appear in all copies. +> +> THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +> WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +> MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +> ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +> WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +> ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +> IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +---------------------------------------- + +### make-dir@v3.1.0 + +License: MIT +By: Sindre Sorhus + +> MIT License +> +> Copyright (c) Sindre Sorhus (sindresorhus.com) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### map-age-cleaner@v0.1.3 + +License: MIT +By: Sam Verschueren + +> MIT License +> +> Copyright (c) Sam Verschueren (github.com/SamVerschueren) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### markdown-escapes@v1.0.4 + +License: MIT +By: Titus Wormer + +> (The MIT License) +> +> Copyright (c) 2016 Titus Wormer +> +> Permission is hereby granted, free of charge, to any person obtaining +> a copy of this software and associated documentation files (the +> 'Software'), to deal in the Software without restriction, including +> without limitation the rights to use, copy, modify, merge, publish, +> distribute, sublicense, and/or sell copies of the Software, and to +> permit persons to whom the Software is furnished to do so, subject to +> the following conditions: +> +> The above copyright notice and this permission notice shall be +> included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +> MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +> IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +> CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +> TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +> SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### mem@v9.0.2 + +License: MIT +By: Sindre Sorhus + +> MIT License +> +> Copyright (c) Sindre Sorhus (https://sindresorhus.com) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### merge-stream@v2.0.0 + +License: MIT +By: Stephen Sugden + +> The MIT License (MIT) +> +> Copyright (c) Stephen Sugden (stephensugden.com) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +> THE SOFTWARE. + +---------------------------------------- + +### merge2@v1.4.1 + +License: MIT +Repository: + +> The MIT License (MIT) +> +> Copyright (c) 2014-2020 Teambition +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all +> copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +> SOFTWARE. + +---------------------------------------- + +### meriyah@v4.2.1 + +License: ISC +By: Kenny F. +Repository: + +> ISC License +> +> Copyright (c) 2019 and later, KFlash and others. +> +> Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. +> +> THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +---------------------------------------- + +### micromatch@v4.0.5 + +License: MIT +By: Jon Schlinkert + +> The MIT License (MIT) +> +> Copyright (c) 2014-present, Jon Schlinkert. +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +> THE SOFTWARE. + +---------------------------------------- + +### mimic-fn@v4.0.0 + +License: MIT +By: Sindre Sorhus + +> MIT License +> +> Copyright (c) Sindre Sorhus (https://sindresorhus.com) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### minimatch@v3.1.2 + +License: ISC +By: Isaac Z. Schlueter +Repository: + +> The ISC License +> +> Copyright (c) Isaac Z. Schlueter and Contributors +> +> Permission to use, copy, modify, and/or distribute this software for any +> purpose with or without fee is hereby granted, provided that the above +> copyright notice and this permission notice appear in all copies. +> +> THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +> WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +> MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +> ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +> WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +> ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +> IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +---------------------------------------- + +### minimist@v1.2.6 + +License: MIT +By: James Halliday +Repository: + +> This software is released under the MIT license: +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of +> this software and associated documentation files (the "Software"), to deal in +> the Software without restriction, including without limitation the rights to +> use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +> the Software, and to permit persons to whom the Software is furnished to do so, +> subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all +> copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +> FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +> COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +> IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +> CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### ms@v2.1.2 + +License: MIT + +> The MIT License (MIT) +> +> Copyright (c) 2016 Zeit, Inc. +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all +> copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +> SOFTWARE. + +---------------------------------------- + +### n-readlines@v1.0.1 + +License: MIT +By: Yoan Arnaudov +Repository: + +> The MIT License (MIT) +> +> Copyright (c) 2013 Liucw +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of +> this software and associated documentation files (the "Software"), to deal in +> the Software without restriction, including without limitation the rights to +> use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +> the Software, and to permit persons to whom the Software is furnished to do so, +> subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all +> copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +> FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +> COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +> IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +> CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### npm-run-path@v5.1.0 + +License: MIT +By: Sindre Sorhus + +> MIT License +> +> Copyright (c) Sindre Sorhus (https://sindresorhus.com) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### once@v1.4.0 + +License: ISC +By: Isaac Z. Schlueter +Repository: + +> The ISC License +> +> Copyright (c) Isaac Z. Schlueter and Contributors +> +> Permission to use, copy, modify, and/or distribute this software for any +> purpose with or without fee is hereby granted, provided that the above +> copyright notice and this permission notice appear in all copies. +> +> THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +> WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +> MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +> ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +> WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +> ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +> IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +---------------------------------------- + +### onetime@v6.0.0 + +License: MIT +By: Sindre Sorhus + +> MIT License +> +> Copyright (c) Sindre Sorhus (https://sindresorhus.com) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### outdent@v0.8.0 + +License: MIT +By: Andrew Bradley +Repository: + +> The MIT License (MIT) +> +> Copyright (c) 2016 Andrew Bradley +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all +> copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +> SOFTWARE. + +---------------------------------------- + +### p-defer@v1.0.0 + +License: MIT +By: Sindre Sorhus + +> The MIT License (MIT) +> +> Copyright (c) Sindre Sorhus (sindresorhus.com) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +> THE SOFTWARE. + +---------------------------------------- + +### p-limit@v2.3.0 + +License: MIT +By: Sindre Sorhus + +> MIT License +> +> Copyright (c) Sindre Sorhus (sindresorhus.com) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### p-locate@v4.1.0 + +License: MIT +By: Sindre Sorhus + +> MIT License +> +> Copyright (c) Sindre Sorhus (sindresorhus.com) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### p-map@v4.0.0 + +License: MIT +By: Sindre Sorhus + +> MIT License +> +> Copyright (c) Sindre Sorhus (https://sindresorhus.com) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### p-try@v2.2.0 + +License: MIT +By: Sindre Sorhus + +> MIT License +> +> Copyright (c) Sindre Sorhus (sindresorhus.com) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### parse-entities@v2.0.0 + +License: MIT +By: Titus Wormer + +> (The MIT License) +> +> Copyright (c) 2015 Titus Wormer +> +> Permission is hereby granted, free of charge, to any person obtaining +> a copy of this software and associated documentation files (the +> 'Software'), to deal in the Software without restriction, including +> without limitation the rights to use, copy, modify, merge, publish, +> distribute, sublicense, and/or sell copies of the Software, and to +> permit persons to whom the Software is furnished to do so, subject to +> the following conditions: +> +> The above copyright notice and this permission notice shall be +> included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +> MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +> IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +> CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +> TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +> SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### parse-json@v5.2.0 + +License: MIT +By: Sindre Sorhus + +> MIT License +> +> Copyright (c) Sindre Sorhus (https://sindresorhus.com) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### parse-srcset@v1.0.2 + +License: MIT +By: Alex Bell +Repository: + +> The MIT License (MIT) +> +> Copyright (c) 2014 Alex Bell +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all +> copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +> SOFTWARE. + +---------------------------------------- + +### path-exists@v4.0.0 + +License: MIT +By: Sindre Sorhus + +> MIT License +> +> Copyright (c) Sindre Sorhus (sindresorhus.com) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### path-is-absolute@v1.0.1 + +License: MIT +By: Sindre Sorhus + +> The MIT License (MIT) +> +> Copyright (c) Sindre Sorhus (sindresorhus.com) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +> THE SOFTWARE. + +---------------------------------------- + +### path-key@v3.1.1 + +License: MIT +By: Sindre Sorhus + +> MIT License +> +> Copyright (c) Sindre Sorhus (sindresorhus.com) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### path-parse@v1.0.7 + +License: MIT +By: Javier Blanco +Repository: + +> The MIT License (MIT) +> +> Copyright (c) 2015 Javier Blanco +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all +> copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +> SOFTWARE. + +---------------------------------------- + +### path-type@v4.0.0 + +License: MIT +By: Sindre Sorhus + +> MIT License +> +> Copyright (c) Sindre Sorhus (sindresorhus.com) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### picocolors@v0.2.1 + +License: ISC +By: Alexey Raspopov + +> ISC License +> +> Copyright (c) 2021 Alexey Raspopov, Kostiantyn Denysov, Anton Verinov +> +> Permission to use, copy, modify, and/or distribute this software for any +> purpose with or without fee is hereby granted, provided that the above +> copyright notice and this permission notice appear in all copies. +> +> THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +> WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +> MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +> ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +> WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +> ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +> OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +---------------------------------------- + +### picomatch@v2.3.1 + +License: MIT +By: Jon Schlinkert + +> The MIT License (MIT) +> +> Copyright (c) 2017-present, Jon Schlinkert. +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +> THE SOFTWARE. + +---------------------------------------- + +### pkg-dir@v4.2.0 + +License: MIT +By: Sindre Sorhus + +> MIT License +> +> Copyright (c) Sindre Sorhus (sindresorhus.com) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### please-upgrade-node@v3.2.0 + +License: MIT +By: typicode +Repository: + +> MIT License +> +> Copyright (c) 2017 +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all +> copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +> SOFTWARE. + +---------------------------------------- + +### postcss@v7.0.39 + +License: MIT +By: Andrey Sitnik + +> The MIT License (MIT) +> +> Copyright 2013 Andrey Sitnik +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of +> this software and associated documentation files (the "Software"), to deal in +> the Software without restriction, including without limitation the rights to +> use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +> the Software, and to permit persons to whom the Software is furnished to do so, +> subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all +> copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +> FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +> COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +> IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +> CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### postcss-less@v3.1.4 + +License: MIT +By: Denys Kniazevych + +> The MIT License (MIT) +> +> Copyright (c) 2013 Andrey Sitnik +> Copyright (c) 2016 Denys Kniazevych +> Copyright (c) 2016 Pat Sissons +> Copyright (c) 2017 Andrew Powell +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all +> copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +> SOFTWARE. + +---------------------------------------- + +### postcss-media-query-parser@v0.2.3 + +License: MIT +By: dryoma +Repository: + +---------------------------------------- + +### postcss-scss@v2.1.1 + +License: MIT +By: Andrey Sitnik + +> The MIT License (MIT) +> +> Copyright 2013 Andrey Sitnik +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of +> this software and associated documentation files (the "Software"), to deal in +> the Software without restriction, including without limitation the rights to +> use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +> the Software, and to permit persons to whom the Software is furnished to do so, +> subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all +> copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +> FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +> COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +> IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +> CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### postcss-selector-parser@v2.2.3 + +License: MIT +By: Ben Briggs + +> Copyright (c) Ben Briggs (http://beneb.info) +> +> Permission is hereby granted, free of charge, to any person +> obtaining a copy of this software and associated documentation +> files (the "Software"), to deal in the Software without +> restriction, including without limitation the rights to use, +> copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the +> Software is furnished to do so, subject to the following +> conditions: +> +> The above copyright notice and this permission notice shall be +> included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +> OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +> NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +> HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +> WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +> FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +> OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### postcss-values-parser@v2.0.1 + +License: MIT +By: Andrew Powell (shellscape) + +> Copyright (c) Andrew Powell +> +> Permission is hereby granted, free of charge, to any person +> obtaining a copy of this software and associated documentation +> files (the "Software"), to deal in the Software without +> restriction, including without limitation the rights to use, +> copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the +> Software is furnished to do so, subject to the following +> conditions: +> +> The above copyright notice and this permission notice shall be +> included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +> OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +> NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +> HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +> WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +> FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +> OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### pseudomap@v1.0.2 + +License: ISC +By: Isaac Z. Schlueter +Repository: + +> The ISC License +> +> Copyright (c) Isaac Z. Schlueter and Contributors +> +> Permission to use, copy, modify, and/or distribute this software for any +> purpose with or without fee is hereby granted, provided that the above +> copyright notice and this permission notice appear in all copies. +> +> THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +> WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +> MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +> ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +> WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +> ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +> IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +---------------------------------------- + +### queue-microtask@v1.2.3 + +License: MIT +By: Feross Aboukhadijeh +Repository: + +> The MIT License (MIT) +> +> Copyright (c) Feross Aboukhadijeh +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of +> this software and associated documentation files (the "Software"), to deal in +> the Software without restriction, including without limitation the rights to +> use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +> the Software, and to permit persons to whom the Software is furnished to do so, +> subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all +> copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +> FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +> COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +> IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +> CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### remark-footnotes@v2.0.0 + +License: MIT +By: Titus Wormer + +> (The MIT License) +> +> Copyright (c) 2020 Titus Wormer +> +> Permission is hereby granted, free of charge, to any person obtaining +> a copy of this software and associated documentation files (the +> 'Software'), to deal in the Software without restriction, including +> without limitation the rights to use, copy, modify, merge, publish, +> distribute, sublicense, and/or sell copies of the Software, and to +> permit persons to whom the Software is furnished to do so, subject to +> the following conditions: +> +> The above copyright notice and this permission notice shall be +> included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +> MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +> IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +> CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +> TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +> SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### remark-math@v3.0.1 + +License: MIT +By: Junyoung Choi + +---------------------------------------- + +### remark-parse@v8.0.3 + +License: MIT +By: Titus Wormer + +---------------------------------------- + +### repeat-string@v1.6.1 + +License: MIT +By: Jon Schlinkert + +> The MIT License (MIT) +> +> Copyright (c) 2014-2016, Jon Schlinkert. +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +> THE SOFTWARE. + +---------------------------------------- + +### resolve@v1.22.0 + +License: MIT +By: James Halliday +Repository: + +> MIT License +> +> Copyright (c) 2012 James Halliday +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all +> copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +> SOFTWARE. + +---------------------------------------- + +### resolve-from@v4.0.0 + +License: MIT +By: Sindre Sorhus + +> MIT License +> +> Copyright (c) Sindre Sorhus (sindresorhus.com) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### reusify@v1.0.4 + +License: MIT +By: Matteo Collina +Repository: + +> The MIT License (MIT) +> +> Copyright (c) 2015 Matteo Collina +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all +> copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +> SOFTWARE. + +---------------------------------------- + +### rimraf@v3.0.2 + +License: ISC +By: Isaac Z. Schlueter + +> The ISC License +> +> Copyright (c) Isaac Z. Schlueter and Contributors +> +> Permission to use, copy, modify, and/or distribute this software for any +> purpose with or without fee is hereby granted, provided that the above +> copyright notice and this permission notice appear in all copies. +> +> THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +> WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +> MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +> ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +> WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +> ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +> IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +---------------------------------------- + +### rollup-plugin-node-polyfills@v0.2.1 + +License: MIT +Repository: + +> The MIT License (MIT) +> +> Copyright (c) 2019 these people +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### run-parallel@v1.2.0 + +License: MIT +By: Feross Aboukhadijeh +Repository: + +> The MIT License (MIT) +> +> Copyright (c) Feross Aboukhadijeh +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of +> this software and associated documentation files (the "Software"), to deal in +> the Software without restriction, including without limitation the rights to +> use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +> the Software, and to permit persons to whom the Software is furnished to do so, +> subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all +> copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +> FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +> COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +> IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +> CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### sdbm@v2.0.0 + +License: MIT +By: Sindre Sorhus + +> MIT License +> +> Copyright (c) Sindre Sorhus (https://sindresorhus.com) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### semver@v6.3.0 + +License: ISC + +> The ISC License +> +> Copyright (c) Isaac Z. Schlueter and Contributors +> +> Permission to use, copy, modify, and/or distribute this software for any +> purpose with or without fee is hereby granted, provided that the above +> copyright notice and this permission notice appear in all copies. +> +> THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +> WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +> MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +> ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +> WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +> ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +> IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +---------------------------------------- + +### semver@v7.3.7 + +License: ISC +By: GitHub Inc. +Repository: + +> The ISC License +> +> Copyright (c) Isaac Z. Schlueter and Contributors +> +> Permission to use, copy, modify, and/or distribute this software for any +> purpose with or without fee is hereby granted, provided that the above +> copyright notice and this permission notice appear in all copies. +> +> THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +> WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +> MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +> ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +> WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +> ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +> IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +---------------------------------------- + +### semver-compare@v1.0.0 + +License: MIT +By: James Halliday +Repository: + +> This software is released under the MIT license: +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of +> this software and associated documentation files (the "Software"), to deal in +> the Software without restriction, including without limitation the rights to +> use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +> the Software, and to permit persons to whom the Software is furnished to do so, +> subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all +> copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +> FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +> COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +> IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +> CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### shebang-command@v2.0.0 + +License: MIT +By: Kevin Mårtensson + +> MIT License +> +> Copyright (c) Kevin Mårtensson (github.com/kevva) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### shebang-regex@v3.0.0 + +License: MIT +By: Sindre Sorhus + +> MIT License +> +> Copyright (c) Sindre Sorhus (sindresorhus.com) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### sigmund@v1.0.1 + +License: ISC +By: Isaac Z. Schlueter +Repository: + +> The ISC License +> +> Copyright (c) Isaac Z. Schlueter and Contributors +> +> Permission to use, copy, modify, and/or distribute this software for any +> purpose with or without fee is hereby granted, provided that the above +> copyright notice and this permission notice appear in all copies. +> +> THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +> WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +> MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +> ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +> WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +> ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +> IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +---------------------------------------- + +### signal-exit@v3.0.7 + +License: ISC +By: Ben Coe +Repository: + +> The ISC License +> +> Copyright (c) 2015, Contributors +> +> Permission to use, copy, modify, and/or distribute this software +> for any purpose with or without fee is hereby granted, provided +> that the above copyright notice and this permission notice +> appear in all copies. +> +> THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +> WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES +> OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE +> LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES +> OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +> WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +> ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +---------------------------------------- + +### simple-html-tokenizer@v0.5.11 + +License: MIT +Repository: + +> Copyright (c) 2014 Yehuda Katz and contributors +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of +> this software and associated documentation files (the "Software"), to deal in +> the Software without restriction, including without limitation the rights to +> use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +> of the Software, and to permit persons to whom the Software is furnished to do +> so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all +> copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +> SOFTWARE. + +---------------------------------------- + +### slash@v3.0.0 + +License: MIT +By: Sindre Sorhus + +> MIT License +> +> Copyright (c) Sindre Sorhus (sindresorhus.com) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### state-toggle@v1.0.3 + +License: MIT +By: Titus Wormer + +> (The MIT License) +> +> Copyright (c) 2016 Titus Wormer +> +> Permission is hereby granted, free of charge, to any person obtaining +> a copy of this software and associated documentation files (the +> 'Software'), to deal in the Software without restriction, including +> without limitation the rights to use, copy, modify, merge, publish, +> distribute, sublicense, and/or sell copies of the Software, and to +> permit persons to whom the Software is furnished to do so, subject to +> the following conditions: +> +> The above copyright notice and this permission notice shall be +> included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +> MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +> IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +> CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +> TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +> SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### string-width@v5.0.1 + +License: MIT +By: Sindre Sorhus + +> MIT License +> +> Copyright (c) Sindre Sorhus (https://sindresorhus.com) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### strip-ansi@v7.0.1 + +License: MIT +By: Sindre Sorhus + +> MIT License +> +> Copyright (c) Sindre Sorhus (https://sindresorhus.com) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### strip-final-newline@v3.0.0 + +License: MIT +By: Sindre Sorhus + +> MIT License +> +> Copyright (c) Sindre Sorhus (https://sindresorhus.com) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### supports-color@v5.5.0 + +License: MIT +By: Sindre Sorhus + +> MIT License +> +> Copyright (c) Sindre Sorhus (sindresorhus.com) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### temp-dir@v2.0.0 + +License: MIT +By: Sindre Sorhus + +> MIT License +> +> Copyright (c) Sindre Sorhus (sindresorhus.com) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### tempy@v2.0.0 + +License: MIT +By: Sindre Sorhus + +> MIT License +> +> Copyright (c) Sindre Sorhus (https://sindresorhus.com) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### to-regex-range@v5.0.1 + +License: MIT +By: Jon Schlinkert + +> The MIT License (MIT) +> +> Copyright (c) 2015-present, Jon Schlinkert. +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +> THE SOFTWARE. + +---------------------------------------- + +### trim@v0.0.1 + +By: TJ Holowaychuk + +---------------------------------------- + +### trim-trailing-lines@v1.1.4 + +License: MIT +By: Titus Wormer + +> (The MIT License) +> +> Copyright (c) 2015 Titus Wormer +> +> Permission is hereby granted, free of charge, to any person obtaining +> a copy of this software and associated documentation files (the +> 'Software'), to deal in the Software without restriction, including +> without limitation the rights to use, copy, modify, merge, publish, +> distribute, sublicense, and/or sell copies of the Software, and to +> permit persons to whom the Software is furnished to do so, subject to +> the following conditions: +> +> The above copyright notice and this permission notice shall be +> included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +> MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +> IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +> CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +> TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +> SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### trough@v1.0.5 + +License: MIT +By: Titus Wormer + +> (The MIT License) +> +> Copyright (c) 2016 Titus Wormer +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +> THE SOFTWARE. + +---------------------------------------- + +### tslib@v1.14.1 + +License: 0BSD +By: Microsoft Corp. +Repository: + +> Copyright (c) Microsoft Corporation. +> +> Permission to use, copy, modify, and/or distribute this software for any +> purpose with or without fee is hereby granted. +> +> THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +> REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +> AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +> INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +> LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +> OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +> PERFORMANCE OF THIS SOFTWARE. + +---------------------------------------- + +### tsutils@v3.21.0 + +License: MIT +By: Klaus Meinhardt +Repository: + +> The MIT License (MIT) +> +> Copyright (c) 2017 Klaus Meinhardt +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all +> copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +> SOFTWARE. + +---------------------------------------- + +### typescript@v4.7.2 + +License: Apache-2.0 +By: Microsoft Corp. +Repository: + +> Apache License +> +> Version 2.0, January 2004 +> +> http://www.apache.org/licenses/ +> +> TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION +> +> 1. Definitions. +> +> "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. +> +> "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. +> +> "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. +> +> "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. +> +> "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. +> +> "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. +> +> "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). +> +> "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. +> +> "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." +> +> "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. +> +> 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. +> +> 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. +> +> 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: +> +> You must give any other recipients of the Work or Derivative Works a copy of this License; and +> +> You must cause any modified files to carry prominent notices stating that You changed the files; and +> +> You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and +> +> If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. +> +> 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. +> +> 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. +> +> 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. +> +> 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. +> +> 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. +> +> END OF TERMS AND CONDITIONS + +---------------------------------------- + +### unherit@v1.1.3 + +License: MIT +By: Titus Wormer + +> (The MIT License) +> +> Copyright (c) 2015 Titus Wormer +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +> THE SOFTWARE. + +---------------------------------------- + +### unified@v9.2.1 + +License: MIT +By: Titus Wormer + +> (The MIT License) +> +> Copyright (c) 2015 Titus Wormer +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +> THE SOFTWARE. + +---------------------------------------- + +### uniq@v1.0.1 + +License: MIT +By: Mikola Lysenko +Repository: + +> The MIT License (MIT) +> +> Copyright (c) 2013 Mikola Lysenko +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +> THE SOFTWARE. + +---------------------------------------- + +### unique-string@v3.0.0 + +License: MIT +By: Sindre Sorhus + +> MIT License +> +> Copyright (c) Sindre Sorhus (https://sindresorhus.com) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### unist-util-is@v4.1.0 + +License: MIT +By: Titus Wormer + +> (The MIT license) +> +> Copyright (c) 2015 Titus Wormer +> +> Permission is hereby granted, free of charge, to any person obtaining +> a copy of this software and associated documentation files (the +> 'Software'), to deal in the Software without restriction, including +> without limitation the rights to use, copy, modify, merge, publish, +> distribute, sublicense, and/or sell copies of the Software, and to +> permit persons to whom the Software is furnished to do so, subject to +> the following conditions: +> +> The above copyright notice and this permission notice shall be +> included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +> MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +> IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +> CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +> TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +> SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### unist-util-remove-position@v2.0.1 + +License: MIT +By: Titus Wormer + +> (The MIT License) +> +> Copyright (c) 2016 Titus Wormer +> +> Permission is hereby granted, free of charge, to any person obtaining +> a copy of this software and associated documentation files (the +> 'Software'), to deal in the Software without restriction, including +> without limitation the rights to use, copy, modify, merge, publish, +> distribute, sublicense, and/or sell copies of the Software, and to +> permit persons to whom the Software is furnished to do so, subject to +> the following conditions: +> +> The above copyright notice and this permission notice shall be +> included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +> MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +> IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +> CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +> TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +> SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### unist-util-stringify-position@v2.0.3 + +License: MIT +By: Titus Wormer + +> (The MIT License) +> +> Copyright (c) 2016 Titus Wormer +> +> Permission is hereby granted, free of charge, to any person obtaining +> a copy of this software and associated documentation files (the +> 'Software'), to deal in the Software without restriction, including +> without limitation the rights to use, copy, modify, merge, publish, +> distribute, sublicense, and/or sell copies of the Software, and to +> permit persons to whom the Software is furnished to do so, subject to +> the following conditions: +> +> The above copyright notice and this permission notice shall be +> included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +> MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +> IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +> CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +> TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +> SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### unist-util-visit@v2.0.3 + +License: MIT +By: Titus Wormer + +> (The MIT License) +> +> Copyright (c) 2015 Titus Wormer +> +> Permission is hereby granted, free of charge, to any person obtaining +> a copy of this software and associated documentation files (the +> 'Software'), to deal in the Software without restriction, including +> without limitation the rights to use, copy, modify, merge, publish, +> distribute, sublicense, and/or sell copies of the Software, and to +> permit persons to whom the Software is furnished to do so, subject to +> the following conditions: +> +> The above copyright notice and this permission notice shall be +> included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +> MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +> IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +> CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +> TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +> SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### unist-util-visit-parents@v3.1.1 + +License: MIT +By: Titus Wormer + +> (The MIT License) +> +> Copyright (c) 2016 Titus Wormer +> +> Permission is hereby granted, free of charge, to any person obtaining +> a copy of this software and associated documentation files (the +> 'Software'), to deal in the Software without restriction, including +> without limitation the rights to use, copy, modify, merge, publish, +> distribute, sublicense, and/or sell copies of the Software, and to +> permit persons to whom the Software is furnished to do so, subject to +> the following conditions: +> +> The above copyright notice and this permission notice shall be +> included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +> MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +> IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +> CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +> TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +> SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### vfile@v4.2.1 + +License: MIT +By: Titus Wormer + +> (The MIT License) +> +> Copyright (c) 2015 Titus Wormer +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +> THE SOFTWARE. + +---------------------------------------- + +### vfile-location@v3.2.0 + +License: MIT +By: Titus Wormer + +> (The MIT License) +> +> Copyright (c) 2016 Titus Wormer +> +> Permission is hereby granted, free of charge, to any person obtaining +> a copy of this software and associated documentation files (the +> 'Software'), to deal in the Software without restriction, including +> without limitation the rights to use, copy, modify, merge, publish, +> distribute, sublicense, and/or sell copies of the Software, and to +> permit persons to whom the Software is furnished to do so, subject to +> the following conditions: +> +> The above copyright notice and this permission notice shall be +> included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +> MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +> IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +> CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +> TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +> SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### vfile-message@v2.0.4 + +License: MIT +By: Titus Wormer + +> (The MIT License) +> +> Copyright (c) 2017 Titus Wormer +> +> Permission is hereby granted, free of charge, to any person obtaining +> a copy of this software and associated documentation files (the +> 'Software'), to deal in the Software without restriction, including +> without limitation the rights to use, copy, modify, merge, publish, +> distribute, sublicense, and/or sell copies of the Software, and to +> permit persons to whom the Software is furnished to do so, subject to +> the following conditions: +> +> The above copyright notice and this permission notice shall be +> included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +> MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +> IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +> CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +> TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +> SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------------------------------- + +### vnopts@v1.0.2 + +License: MIT +By: Ika + +> MIT License +> +> Copyright (c) Ika (https://github.com/ikatyang) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all +> copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +> SOFTWARE. + +---------------------------------------- + +### wcwidth@v1.0.1 + +License: MIT +By: Tim Oxley +Repository: + +> wcwidth.js: JavaScript Portng of Markus Kuhn's wcwidth() Implementation +> ======================================================================= +> +> Copyright (C) 2012 by Jun Woong. +> +> This package is a JavaScript porting of `wcwidth()` implementation +> [by Markus Kuhn](http://www.cl.cam.ac.uk/~mgk25/ucs/wcwidth.c). +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of +> this software and associated documentation files (the "Software"), to deal in +> the Software without restriction, including without limitation the rights to +> use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +> of the Software, and to permit persons to whom the Software is furnished to do +> so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all +> copies or substantial portions of the Software. +> +> +> THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, +> INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +> FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR +> OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +> EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +> PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +> BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +> IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +> ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +> POSSIBILITY OF SUCH DAMAGE. + +---------------------------------------- + +### which@v2.0.2 + +License: ISC +By: Isaac Z. Schlueter +Repository: + +> The ISC License +> +> Copyright (c) Isaac Z. Schlueter and Contributors +> +> Permission to use, copy, modify, and/or distribute this software for any +> purpose with or without fee is hereby granted, provided that the above +> copyright notice and this permission notice appear in all copies. +> +> THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +> WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +> MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +> ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +> WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +> ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +> IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +---------------------------------------- + +### wrappy@v1.0.2 + +License: ISC +By: Isaac Z. Schlueter +Repository: + +> The ISC License +> +> Copyright (c) Isaac Z. Schlueter and Contributors +> +> Permission to use, copy, modify, and/or distribute this software for any +> purpose with or without fee is hereby granted, provided that the above +> copyright notice and this permission notice appear in all copies. +> +> THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +> WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +> MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +> ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +> WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +> ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +> IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +---------------------------------------- + +### xtend@v4.0.2 + +License: MIT +By: Raynos + +> The MIT License (MIT) +> Copyright (c) 2012-2014 Raynos. +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +> THE SOFTWARE. + +---------------------------------------- + +### yallist@v2.1.2 + +License: ISC +By: Isaac Z. Schlueter +Repository: + +> The ISC License +> +> Copyright (c) Isaac Z. Schlueter and Contributors +> +> Permission to use, copy, modify, and/or distribute this software for any +> purpose with or without fee is hereby granted, provided that the above +> copyright notice and this permission notice appear in all copies. +> +> THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +> WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +> MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +> ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +> WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +> ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +> IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +---------------------------------------- + +### yallist@v4.0.0 + +License: ISC +By: Isaac Z. Schlueter +Repository: + +> The ISC License +> +> Copyright (c) Isaac Z. Schlueter and Contributors +> +> Permission to use, copy, modify, and/or distribute this software for any +> purpose with or without fee is hereby granted, provided that the above +> copyright notice and this permission notice appear in all copies. +> +> THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +> WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +> MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +> ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +> WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +> ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +> IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +---------------------------------------- + +### yaml@v1.10.2 + +License: ISC +By: Eemeli Aro + +> Copyright 2018 Eemeli Aro +> +> Permission to use, copy, modify, and/or distribute this software for any purpose +> with or without fee is hereby granted, provided that the above copyright notice +> and this permission notice appear in all copies. +> +> THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +> REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +> FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +> INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +> OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +> TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +> THIS SOFTWARE. + +---------------------------------------- + +### yaml-unist-parser@v1.3.1 + +License: MIT +By: Ika + +> MIT License +> +> Copyright (c) Ika (https://github.com/ikatyang) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all +> copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +> SOFTWARE. + ----- The following software may be included in this product: pretty-hrtime. A copy of the source code may be downloaded from git://github.com/robrich/pretty-hrtime.git. This software contains the following license and notice below: From a4503625425cc46eed3a6bb31f1ad09723697284 Mon Sep 17 00:00:00 2001 From: Stephen Davies Date: Mon, 9 Jan 2023 05:07:50 +1100 Subject: [PATCH 056/654] master -> main --- doc/contributing/development-environment.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/doc/contributing/development-environment.md b/doc/contributing/development-environment.md index 37427621a0f..c3ff38cc38f 100644 --- a/doc/contributing/development-environment.md +++ b/doc/contributing/development-environment.md @@ -37,7 +37,7 @@ git clone https://github.com/TerriaJS/terriajs.git cd .. ``` -This will give you the `master` branch of TerriaJS. While we strive to keep `master` stable and usable at all times, you must be aware that `master` is less tested than actual releases, and it may not be commpatible with the `master` branch of TerriaMap. So, you may want to check out the actual version of TerriaJS that you're using before you start making changes. To do that: +This will give you the `main` branch of TerriaJS. While we strive to keep `main` stable and usable at all times, you must be aware that `main` is less tested than actual releases, and it may not be commpatible with the `main` branch of TerriaMap. So, you may want to check out the actual version of TerriaJS that you're using before you start making changes. To do that: ``` grep terriajs package.json @@ -84,7 +84,7 @@ yarn install If you make changes to TerriaJS and TerriaMap together, here's the process for getting them to production. -First, commit your TerriaJS changes to a branch and open a pull request to merge that branch to master. Simultaneously, you may want to make a branch of TerriaMap that uses your modified version of TerriaJS. To do that, modify TerriaMap's `package.json`. Where it has a line like: +First, commit your TerriaJS changes to a branch and open a pull request to merge that branch to main. Simultaneously, you may want to make a branch of TerriaMap that uses your modified version of TerriaJS. To do that, modify TerriaMap's `package.json`. Where it has a line like: ``` "terriajs": "^4.5.0", @@ -100,24 +100,24 @@ Replace `branchName` with the name of the TerriaJS branch you want to use. You m Once your TerriaJS pull request has been merged and a new version of the `terriajs` npm module has been published, please remember to update `package.json` to point to an official `terriajs` version instead of a branch in a GitHub repo. -The `package.json` in the `master` branch of TerriaMap should point to official releases of `terriajs` on npm, NOT GitHub branches. In other words, it is ok to commit a package.json with a git URL to a branch, but do _not_ merge it to master. +The `package.json` in the `main` branch of TerriaMap should point to official releases of `terriajs` on npm, NOT GitHub branches. In other words, it is ok to commit a package.json with a git URL to a branch, but do _not_ merge it to main. ## Documentation -Documentation is automatically generated from the source via JSDoc (reference) and MkDocs (user guide) by running: +You need a standalone install of MkDocs and the `mkdocs-material` theme in order to build the user guide. Install these by running: ``` -yarn gulp docs +pip install -r doc/requirements.txt ``` -It will be placed in the `wwwroot/doc` folder. - -You need a standalone install of MkDocs and the `mkdocs-material` theme in order to build the user guide. Install these by running: +Documentation is automatically generated from the source via JSDoc (reference) and MkDocs (user guide) by running: ``` -pip install -r doc/requirements.txt +yarn gulp docs ``` +It will be placed in the `wwwroot/doc` folder. + ## Tests / Specs We use [Jasmine](https://jasmine.github.io/) for the TerriaJS tests, called specs in Jasmine parlance. To run the specs, you first need to build them by running this in the TerriaJS (not TerriaMap!) directory: From e91ab64ceaa77a7f208197dc49cbe7a1eb666333 Mon Sep 17 00:00:00 2001 From: Stephen Davies Date: Mon, 9 Jan 2023 06:04:02 +1100 Subject: [PATCH 057/654] Fix relative links to doc files --- doc/connecting-to-data/item-search/indexed-item-search.md | 2 +- doc/contributing/feature-picking.md | 2 +- doc/contributing/problems-and-solutions.md | 2 +- doc/contributing/traits-in-depth.md | 2 +- doc/customizing/cloning-and-building.md | 4 ++-- doc/mkdocs.yml | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/doc/connecting-to-data/item-search/indexed-item-search.md b/doc/connecting-to-data/item-search/indexed-item-search.md index c240f950a8d..3d11384207d 100644 --- a/doc/connecting-to-data/item-search/indexed-item-search.md +++ b/doc/connecting-to-data/item-search/indexed-item-search.md @@ -1,6 +1,6 @@ # Indexed item search provider -The [IndexedItemSearchProvider](../../lib/Models/ItemSearchProviders/IndexedItemSearchProvider.ts) provides the ability to search a large dataset using a statically generated index. This is for example useful for searching buildings in a [cesium 3D tileset](../catalog-type-details/3d-tiles.md). We currently have an implementation for indexing and searching 3d-tiles using `IndexedItemSearchProvider`. +The [IndexedItemSearchProvider](../../../lib/Models/ItemSearchProviders/IndexedItemSearchProvider.ts) provides the ability to search a large dataset using a statically generated index. This is for example useful for searching buildings in a [cesium 3D tileset](../catalog-type-details/3d-tiles.md). We currently have an implementation for indexing and searching 3d-tiles using `IndexedItemSearchProvider`. Read more about the [IndexedItemSearchProvider design](./indexed-item-search-provider-design-notes.md). diff --git a/doc/contributing/feature-picking.md b/doc/contributing/feature-picking.md index e26f1cbebd3..2d8c02324e5 100644 --- a/doc/contributing/feature-picking.md +++ b/doc/contributing/feature-picking.md @@ -12,7 +12,7 @@ It is a work in progress. ## Related docs -- [Feature Info Template](/doc/connecting-to-data/customizing-data-appearance/feature-info-template.md) +- [Feature Info Template](../../doc/connecting-to-data/customizing-data-appearance/feature-info-template.md) ## Outline diff --git a/doc/contributing/problems-and-solutions.md b/doc/contributing/problems-and-solutions.md index 8672f6f3715..ce356111539 100644 --- a/doc/contributing/problems-and-solutions.md +++ b/doc/contributing/problems-and-solutions.md @@ -6,7 +6,7 @@ TerriaJS app is accessible at `http://localhost:3001` but it does not render a m ### Workaround -The default TerriaJS configuration uses Cesium Ion for serving some of its basemaps. If the Cesium Ion access token has expired then these basemaps will fail to render. We recommend that you [register](https://cesium.com/ion/signup/) and use your own Cesium Ion access token. Please see the documentation on [client side configuration](customizing/client-side-config.md#parameters) for configuring your access token. Also note that it is a violation of the Ion terms-of-use to use the default key in a deployed application. +The default TerriaJS configuration uses Cesium Ion for serving some of its basemaps. If the Cesium Ion access token has expired then these basemaps will fail to render. We recommend that you [register](https://cesium.com/ion/signup/) and use your own Cesium Ion access token. Please see the documentation on [client side configuration](../customizing/client-side-config.md#parameters) for configuring your access token. Also note that it is a violation of the Ion terms-of-use to use the default key in a deployed application. --- diff --git a/doc/contributing/traits-in-depth.md b/doc/contributing/traits-in-depth.md index 0a58c70671b..1b61d5a7fb8 100644 --- a/doc/contributing/traits-in-depth.md +++ b/doc/contributing/traits-in-depth.md @@ -127,4 +127,4 @@ As the computed value is updated, other parts of the UI that observe that value ## Strata examples -See [doc/contributing/strata-examples.md](/doc/contributing/strata-examples.md) +See [doc/contributing/strata-examples.md](../../doc/contributing/strata-examples.md) diff --git a/doc/customizing/cloning-and-building.md b/doc/customizing/cloning-and-building.md index f2e4ad58e38..3aeee743b67 100644 --- a/doc/customizing/cloning-and-building.md +++ b/doc/customizing/cloning-and-building.md @@ -77,7 +77,7 @@ yarn gulp watch `yarn gulp` simply runs `gulp`, so you can use that directly if you prefer (run `npm install -g gulp-cli` to install it globally). -The full set of `gulp` tasks can be found on the [Development Environment](contributing/development-environment.md#terriamap-gulp-tasks) page. +The full set of `gulp` tasks can be found on the [Development Environment](../contributing/development-environment.md#terriamap-gulp-tasks) page. ### Running TerriaMap @@ -102,4 +102,4 @@ yarn install ### Having trouble? -Checkout the [Problems and Solutions](contributing/problems-and-solutions.md) page to see if we have them covered. You are also welcome to post your problem on the [TerriaJS Discussions](https://github.com/TerriaJS/terriajs/discussions) forum and we'll be happy to help! +Checkout the [Problems and Solutions](../contributing/problems-and-solutions.md) page to see if we have them covered. You are also welcome to post your problem on the [TerriaJS Discussions](https://github.com/TerriaJS/terriajs/discussions) forum and we'll be happy to help! diff --git a/doc/mkdocs.yml b/doc/mkdocs.yml index cbf81c67875..b6e06bebf45 100644 --- a/doc/mkdocs.yml +++ b/doc/mkdocs.yml @@ -38,7 +38,6 @@ nav: - Deploying TerriaMap: deploying/deploying-terriamap.md - Deploying with Kubernetes: deploying/deploying-with-kubernetes.md - Setting Up a Region Mapping Server: deploying/setting-up-a-region-mapping-server.md - - (Deprecated) Setting Up WMS Region Mapping: deploying/deprecated-wms-region-mapping.md - Setting Up Geoserver: deploying/setting-up-geoserver.md - Using as a CKAN Previewer: deploying/using-as-a-ckan-previewer.md - Controlling with URL Parameters: deploying/controlling-with-url-parameters.md @@ -52,6 +51,7 @@ nav: - Problems and Solutions: contributing/problems-and-solutions.md - New model layer documentation: contributing/model-layer.md - Traits in depth: contributing/traits-in-depth.md + - Strata Examples: contributing/strata-examples.md - Init sources: contributing/init-sources.md - Frontend style guide: contributing/frontend-style-guide.md - Version 8 migration guide: contributing/migration-guide.md From 74c6294ae8bd2e3c712ff8dbf598f4a9b9162794 Mon Sep 17 00:00:00 2001 From: Stephen Davies Date: Wed, 11 Jan 2023 05:48:11 +1100 Subject: [PATCH 058/654] Update indent to 4 spaces for docs to be built by mkdocs This commit is a pre-prettier commit --- .editorconfig | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.editorconfig b/.editorconfig index 7df700c0431..972635b2b8d 100644 --- a/.editorconfig +++ b/.editorconfig @@ -11,5 +11,9 @@ insert_final_newline = true [*.md] trim_trailing_whitespace = false +[doc/**.md] +# mkdocs requires 4 spaces +indent_size = 4 + [*.scss] indent_size = 2 From 224b5c69a023b0d9c3a072f670d48fc47b0484c0 Mon Sep 17 00:00:00 2001 From: Stephen Davies Date: Wed, 11 Jan 2023 05:51:19 +1100 Subject: [PATCH 059/654] =?UTF-8?q?Apply=20prettier=20=E2=9C=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is a post-prettier commit --- doc/README.md | 10 +- doc/connecting-to-data/README.md | 10 +- .../cross-origin-resource-sharing.md | 2 +- .../feature-info-template.md | 30 ++-- .../imagery-data.md | 62 +++---- .../customizing-data-appearance/overview.md | 6 +- .../tabular-data.md | 10 +- doc/connecting-to-data/item-search.md | 6 +- ...dexed-item-search-provider-design-notes.md | 116 ++++++------- .../item-search/indexed-item-search.md | 46 +++--- doc/contributing/README.md | 28 ++-- doc/contributing/development-environment.md | 46 +++--- doc/contributing/feature-picking.md | 156 +++++++++--------- doc/contributing/frontend-style-guide.md | 16 +- doc/contributing/init-sources.md | 48 +++--- doc/contributing/merge-master-into-mobx.md | 12 +- doc/contributing/migration-guide.md | 22 +-- doc/contributing/model-layer.md | 72 ++++---- .../result-object-and-error-handling.md | 36 ++-- doc/contributing/setting-up-saucelabs.md | 14 +- doc/contributing/strata-examples.md | 60 +++---- doc/contributing/traits-in-depth.md | 32 ++-- doc/contributing/translation-guide-dev.md | 44 ++--- doc/customizing/README.md | 8 +- doc/customizing/client-side-config.md | 72 ++++---- doc/customizing/cloning-and-building.md | 8 +- doc/customizing/initialization-files.md | 12 +- doc/customizing/skinning.md | 39 +++-- doc/customizing/translation-guide.md | 18 +- doc/customizing/without-docker.md | 8 +- doc/deploying/README.md | 16 +- .../controlling-in-an-iframe-or-popup.md | 101 ++++++------ .../controlling-with-url-parameters.md | 6 +- doc/deploying/deploying-terriamap.md | 10 +- doc/deploying/deploying-with-kubernetes.md | 32 ++-- .../deprecated-wms-region-mapping.md | 32 ++-- .../running-through-reverse-proxy.md | 8 +- doc/deploying/using-as-a-ckan-previewer.md | 12 +- 38 files changed, 635 insertions(+), 631 deletions(-) diff --git a/doc/README.md b/doc/README.md index dfc7f20458d..3d2a80fb20e 100644 --- a/doc/README.md +++ b/doc/README.md @@ -1,10 +1,10 @@ [TerriaJS](http://terria.io) is an open-source framework for web-based geospatial catalog explorers. -- [Getting Started](getting-started.md): Quick start guide to building your first TerriaJS application. -- [Customizing](customizing/README.md): Configure and tweak a TerriaJS application, including skinning and setting up the catalog. -- [Connecting to Data](connecting-to-data/README.md): Connect TerriaJS to your servers and data. -- [Deploying](deploying/README.md): Deploy a TerriaJS application in simple and advanced scenarios. -- [Contributing](contributing/README.md): Add new features to TerriaJS, be part of the TerriaJS development team, set up a development environment, write tests, and perform code reviews. +- [Getting Started](getting-started.md): Quick start guide to building your first TerriaJS application. +- [Customizing](customizing/README.md): Configure and tweak a TerriaJS application, including skinning and setting up the catalog. +- [Connecting to Data](connecting-to-data/README.md): Connect TerriaJS to your servers and data. +- [Deploying](deploying/README.md): Deploy a TerriaJS application in simple and advanced scenarios. +- [Contributing](contributing/README.md): Add new features to TerriaJS, be part of the TerriaJS development team, set up a development environment, write tests, and perform code reviews. Looking for help using a TerriaJS-based site? Try the [Terria Platforms User Guide](https://userguide.terria.io/). diff --git a/doc/connecting-to-data/README.md b/doc/connecting-to-data/README.md index ab565aad956..c6008151b11 100644 --- a/doc/connecting-to-data/README.md +++ b/doc/connecting-to-data/README.md @@ -4,8 +4,8 @@ Before beginning, it is very important to understand [Cross-Origin Resource Shar TerriaJS can interface with three broad types if data: -- [Catalog Group](../connecting-to-data/catalog-groups.md): A group (folder) of items. Different group types allow the contents to be manually specified or to be automatically determined by querying various types of server. TerriaJS can use many different types of servers to populate a group, including CKAN, CSW, WMS, and more. For example, if you define a catalog group that points at a Web Map Service (WMS) server, TerriaJS will query the WMS `GetCapabilities` when the group is opened and fill the group with all of the layers advertised by the WMS server. -- [Catalog Item](../connecting-to-data/catalog-items.md): Actual geospatial or chart data from a file or service, in various formats. TerriaJS supports WMS, KML, GeoJSON, ArcGIS MapServer, and many more files and services as catalog items. -- [Catalog Function](../connecting-to-data/catalog-functions.md): A parameterized service, such as a Web Processing Service (WPS). The user supplies the parameters and gets back some result. -- [Catalog Reference](../connecting-to-data/catalog-references.md): Resolves to a Catalog Group, Item or Function. -- [Catalog item search](item-search.md): A mechanism for searching inside catalog items. +- [Catalog Group](../connecting-to-data/catalog-groups.md): A group (folder) of items. Different group types allow the contents to be manually specified or to be automatically determined by querying various types of server. TerriaJS can use many different types of servers to populate a group, including CKAN, CSW, WMS, and more. For example, if you define a catalog group that points at a Web Map Service (WMS) server, TerriaJS will query the WMS `GetCapabilities` when the group is opened and fill the group with all of the layers advertised by the WMS server. +- [Catalog Item](../connecting-to-data/catalog-items.md): Actual geospatial or chart data from a file or service, in various formats. TerriaJS supports WMS, KML, GeoJSON, ArcGIS MapServer, and many more files and services as catalog items. +- [Catalog Function](../connecting-to-data/catalog-functions.md): A parameterized service, such as a Web Processing Service (WPS). The user supplies the parameters and gets back some result. +- [Catalog Reference](../connecting-to-data/catalog-references.md): Resolves to a Catalog Group, Item or Function. +- [Catalog item search](item-search.md): A mechanism for searching inside catalog items. diff --git a/doc/connecting-to-data/cross-origin-resource-sharing.md b/doc/connecting-to-data/cross-origin-resource-sharing.md index c4fdd8ab8ce..ef436f644fa 100644 --- a/doc/connecting-to-data/cross-origin-resource-sharing.md +++ b/doc/connecting-to-data/cross-origin-resource-sharing.md @@ -6,7 +6,7 @@ Failing to do this may result in an error like this: Next, you should add servers that _do_ support Cross-Origin Resource Sharing (CORS) to the `corsDomains` list in your [initialization file](../customizing/initialization-files.md). Servers in this list are contacted directly instead of going through the proxy... except: -- if an HTTPS web page is accessing an HTTP server (this way we avoid a mixed content warning from the browser). +- if an HTTPS web page is accessing an HTTP server (this way we avoid a mixed content warning from the browser). If your server does _not_ support CORS, then you still need to add it to the `allowProxyFor` whitelist, but do not add it to the `corsDomains` list. It will then be proxied. diff --git a/doc/connecting-to-data/customizing-data-appearance/feature-info-template.md b/doc/connecting-to-data/customizing-data-appearance/feature-info-template.md index 6933f87ae0b..8ecc4553955 100644 --- a/doc/connecting-to-data/customizing-data-appearance/feature-info-template.md +++ b/doc/connecting-to-data/customizing-data-appearance/feature-info-template.md @@ -88,10 +88,10 @@ The preferred way to format numbers is using the `formats` option, eg: The supported format options are: -- `"maximumFractionDigits": X`: To reduce the number of decimal places to a maximum of X digits. -- `"minimumFractionDigits": X`: To increase the number of decimal places to a minimum of X digits. -- `"useGrouping": true`: To show thousands separators. -- `"style": "percent"`: To show 0.15 as 15%. +- `"maximumFractionDigits": X`: To reduce the number of decimal places to a maximum of X digits. +- `"minimumFractionDigits": X`: To increase the number of decimal places to a minimum of X digits. +- `"useGrouping": true`: To show thousands separators. +- `"style": "percent"`: To show 0.15 as 15%. A second method is to use `terria.formatNumber` directly in the template. This accepts an initial JSON string describing the same options as above. To simplify the notation, the quotes around the keys are optional here. @@ -128,9 +128,9 @@ As with number you can also use `terria.dateTimeformat` directly in the template You can replace text by directly using `terria.partialByName` in the template and providing partials for matching and replacement. For example, with the following template and partials, -- If the value of `feature.data.layerId` matches a property name in the `partials`, it will be replaced by corresponding value. -- If there is no matching in the `partials`, the original value will be used. -- Any unsafe values in the `partials` will be stripped off when being rendered. +- If the value of `feature.data.layerId` matches a property name in the `partials`, it will be replaced by corresponding value. +- If there is no matching in the `partials`, the original value will be used. +- Any unsafe values in the `partials` will be stripped off when being rendered. ```json "featureInfoTemplate": { @@ -154,17 +154,17 @@ For features with time-varying table-based data structures (eg. CSV, SOS2, SDMX- You can place this chart in your template using `{{terria.timeSeries.chart}}`. Alternatively, you can access the following component information: -- `{{terria.timeSeries.xName}}` - the x-column name -- `{{terria.timeSeries.yName}}` - the y-column name -- `{{terria.timeSeries.title}}` -- `{{terria.timeSeries.id}}` -- `{{terria.timeSeries.units}}` - the column units as a comma-separated string. -- `{{terria.timeSeries.data}}` - the data as a comma-separated string. +- `{{terria.timeSeries.xName}}` - the x-column name +- `{{terria.timeSeries.yName}}` - the y-column name +- `{{terria.timeSeries.title}}` +- `{{terria.timeSeries.id}}` +- `{{terria.timeSeries.units}}` - the column units as a comma-separated string. +- `{{terria.timeSeries.data}}` - the data as a comma-separated string. Please note: -- If any of the component information above contains double-quotes, double quotes will be removed before TerriaJS processes the template further. -- If any of the component information above is used as part of tag attributes, it must be surrounded by double-quotes. e.g. `` +- If any of the component information above contains double-quotes, double quotes will be removed before TerriaJS processes the template further. +- If any of the component information above is used as part of tag attributes, it must be surrounded by double-quotes. e.g. `` So you could reconstruct the chart manually as: diff --git a/doc/connecting-to-data/customizing-data-appearance/imagery-data.md b/doc/connecting-to-data/customizing-data-appearance/imagery-data.md index 18ff1444c57..224e2137a40 100644 --- a/doc/connecting-to-data/customizing-data-appearance/imagery-data.md +++ b/doc/connecting-to-data/customizing-data-appearance/imagery-data.md @@ -8,39 +8,39 @@ Here's an example json file which places some sample WMS items in an open group ```json { - "catalog": [ - { - "name": "WMS example", - "type": "group", - "isPromoted": true, - "isOpen": true, - "items": [ + "catalog": [ { - "name": "Solar Satellite DNI & GHI with datetime picker", - "layers": "Solar_Satellite_DNI_2014", - "url": "http://gis.aremi.nationalmap.gov.au/bom/wms", - "type": "wms", - "maxRefreshIntervals": 9000, - "showDatetimePicker": true, - "useOwnClock": true, - "featureInfoTemplate": { - "name": "{{GRAY_INDEX}} W/m2" - } - }, - { - "name": "Solar Satellite DNI & GHI with initialTimeSource", - "layers": "Solar_Satellite_DNI_2014", - "url": "http://gis.aremi.nationalmap.gov.au/bom/wms", - "type": "wms", - "maxRefreshIntervals": 9000, - "initialTimeSource": "2014-06-30T22:00:00Z", - "featureInfoTemplate": { - "name": "{{GRAY_INDEX}} W/m2" - } + "name": "WMS example", + "type": "group", + "isPromoted": true, + "isOpen": true, + "items": [ + { + "name": "Solar Satellite DNI & GHI with datetime picker", + "layers": "Solar_Satellite_DNI_2014", + "url": "http://gis.aremi.nationalmap.gov.au/bom/wms", + "type": "wms", + "maxRefreshIntervals": 9000, + "showDatetimePicker": true, + "useOwnClock": true, + "featureInfoTemplate": { + "name": "{{GRAY_INDEX}} W/m2" + } + }, + { + "name": "Solar Satellite DNI & GHI with initialTimeSource", + "layers": "Solar_Satellite_DNI_2014", + "url": "http://gis.aremi.nationalmap.gov.au/bom/wms", + "type": "wms", + "maxRefreshIntervals": 9000, + "initialTimeSource": "2014-06-30T22:00:00Z", + "featureInfoTemplate": { + "name": "{{GRAY_INDEX}} W/m2" + } + } + ] } - ] - } - ] + ] } ``` diff --git a/doc/connecting-to-data/customizing-data-appearance/overview.md b/doc/connecting-to-data/customizing-data-appearance/overview.md index 93a3e9ae0ba..ac7897c91fd 100644 --- a/doc/connecting-to-data/customizing-data-appearance/overview.md +++ b/doc/connecting-to-data/customizing-data-appearance/overview.md @@ -12,6 +12,6 @@ and can be included there too. This section explains how you can use such a file to improve the look of your data: -- [Customizing the Appearance of Tabular Data](./tabular-data.md) -- [Customizing the Appearance of Imagery Data](./imagery-data.md) -- [Customizing the Feature Info Template](./feature-info-template.md) +- [Customizing the Appearance of Tabular Data](./tabular-data.md) +- [Customizing the Appearance of Imagery Data](./imagery-data.md) +- [Customizing the Feature Info Template](./feature-info-template.md) diff --git a/doc/connecting-to-data/customizing-data-appearance/tabular-data.md b/doc/connecting-to-data/customizing-data-appearance/tabular-data.md index 5896eee8c4b..b1e12421b46 100644 --- a/doc/connecting-to-data/customizing-data-appearance/tabular-data.md +++ b/doc/connecting-to-data/customizing-data-appearance/tabular-data.md @@ -49,8 +49,8 @@ Please note this documentation is still being developed, and does not cover ever that is possible. The definitive source of what you can do with `tableStyle` is this pair: -- [TableStyle](https://github.com/TerriaJS/terriajs/blob/master/lib/Models/TableStyle.js) -- [TableColumnStyle](https://github.com/TerriaJS/terriajs/blob/master/lib/Models/TableColumnStyle.js) +- [TableStyle](https://github.com/TerriaJS/terriajs/blob/master/lib/Models/TableStyle.js) +- [TableColumnStyle](https://github.com/TerriaJS/terriajs/blob/master/lib/Models/TableColumnStyle.js) ## Referencing your data @@ -132,9 +132,9 @@ If you want to change the appearance of individual columns, use `tableStyle`'s ` This example shows a few possibilities: -- A column called "original name" is displayed with the name "better name". -- The legend for that column is shown without any decimal places (`maximumFractionDigits` 0). -- A column in the original data called "bad" is hidden from the workbench. +- A column called "original name" is displayed with the name "better name". +- The legend for that column is shown without any decimal places (`maximumFractionDigits` 0). +- A column in the original data called "bad" is hidden from the workbench. The full list of options is in [TableColumnStyle](https://github.com/TerriaJS/terriajs/blob/master/lib/Models/TableColumnStyle.js). diff --git a/doc/connecting-to-data/item-search.md b/doc/connecting-to-data/item-search.md index f6cb53fc1de..754b870fefb 100644 --- a/doc/connecting-to-data/item-search.md +++ b/doc/connecting-to-data/item-search.md @@ -6,7 +6,7 @@ TerriaJS provides an `ItemSearchProvider` API for defining custom search provide ## Available search providers -- [Indexed item search provider](item-search/indexed-item-search.md) +- [Indexed item search provider](item-search/indexed-item-search.md) ## Configuring the catalog item for searching @@ -50,8 +50,8 @@ The search tool can be opened from the expand menu for the catalog item in the w ## Future implementations -- GeoJSON search provider, for searching inside a geojson catalog item using its properties. -- WPS search provider, for searching any item using a remote server. +- GeoJSON search provider, for searching inside a geojson catalog item using its properties. +- WPS search provider, for searching any item using a remote server. ## Implementing your own search provider diff --git a/doc/connecting-to-data/item-search/indexed-item-search-provider-design-notes.md b/doc/connecting-to-data/item-search/indexed-item-search-provider-design-notes.md index 980f1fd2015..2d60ca5a89c 100644 --- a/doc/connecting-to-data/item-search/indexed-item-search-provider-design-notes.md +++ b/doc/connecting-to-data/item-search/indexed-item-search-provider-design-notes.md @@ -2,9 +2,9 @@ ## Requirements -- Should be file based, not requiring any additional backends -- Should be performant enough to search datasets with as many as 500000 features -- Must be able to search numeric, text or enum properties +- Should be file based, not requiring any additional backends +- Should be performant enough to search datasets with as many as 500000 features +- Must be able to search numeric, text or enum properties In the remaining section we describe the structure of the index. @@ -12,19 +12,19 @@ In the remaining section we describe the structure of the index. `indexRoot` captures the overall structure of the index. It has the following fields: -- `idProperty` - - Required - - Name of the feature property that is used as ID for indexing. This is also - sometimes used by the catalog item to uniquely identify & highlight the - selected feature. -- `resultsDataUrl: string` - - Required - - URL of the CSV [results data file](#results-data-file) mapping a feature by - its ID to result data associated with the feature. -- `indexes: Record` - - Required - - An object whose keys are the property names and values are the - corresponding [Index](#index-types) definition. +- `idProperty` + - Required + - Name of the feature property that is used as ID for indexing. This is also + sometimes used by the catalog item to uniquely identify & highlight the + selected feature. +- `resultsDataUrl: string` + - Required + - URL of the CSV [results data file](#results-data-file) mapping a feature by + its ID to result data associated with the feature. +- `indexes: Record` + - Required + - An object whose keys are the property names and values are the + corresponding [Index](#index-types) definition. ## Results data file @@ -39,18 +39,18 @@ eg: It should contain a header for each column. It should also have a column for the `idProperty` specified in the `indexRoot.json` file. Terria also recongnizes a few special columns which it uses to construct a target to zoom to when the user selects the result. -- `latitude` - - Required - - The latitude of the feature -- `longitude` - - Required - - The longitude of the feature -- `height` - - Optional - - The height of the feature -- `radius` - - Optional - - The radius of the bounding sphere containing the feature +- `latitude` + - Required + - The latitude of the feature +- `longitude` + - Required + - The longitude of the feature +- `height` + - Optional + - The height of the feature +- `radius` + - Optional + - The radius of the bounding sphere containing the feature A zoom target is constructed using the `latitude`, `longitude` and `height` or the `radius` whichever is known. `height` is the height of the feature and `radius` is a radius of the bounding sphere to zoom to. @@ -64,14 +64,14 @@ Numeric index is used for searching numeric properties. It can be used for searc #### Definition -- `type: "numeric"` - - Required -- `range: {min: number, max: number}` - - Required - - The range of values in the index. -- `url: string` - - Required - - URL of the [numeric index file](#numeric-index-file) +- `type: "numeric"` + - Required +- `range: {min: number, max: number}` + - Required + - The range of values in the index. +- `url: string` + - Required + - URL of the [numeric index file](#numeric-index-file) eg: @@ -100,11 +100,11 @@ Enum index is useful for searching fixed list of strings, eg: Roof material prop #### Definition -- `type: "enum"` - - Required -- `values: Record` - - Required - - An object whose keys are the enum string and value defines the [enum value index](#enum-value-index). +- `type: "enum"` + - Required +- `values: Record` + - Required + - An object whose keys are the enum string and value defines the [enum value index](#enum-value-index). eg: @@ -128,12 +128,12 @@ Defines the index for a single enum member. ##### Definition -- `count: number` - - Required - - Number of features that have this enum value. -- `url: string` - - Required - - URL of the [enum value index file](#enum-value-index-file). +- `count: number` + - Required + - Number of features that have this enum value. +- `url: string` + - Required + - URL of the [enum value index file](#enum-value-index-file). ##### Enum value index file @@ -155,11 +155,11 @@ Text index is used for searching arbitrary text properties, for eg: street addre ##### Definition -- `type: "text"` -- Required -- `url: string` -- Required -- URL of the [text index file](#text-index-file). +- `type: "text"` +- Required +- `url: string` +- Required +- URL of the [text index file](#text-index-file). eg: @@ -171,12 +171,12 @@ eg: Text index file is a JSON file with the following structure: -- `index: MiniSearch` - - Required - - The searialized [Minisearch](https://github.com/lucaong/minisearch) index instance -- `options: MiniSearchOptions` - - Required - - The options used to create the MiniSearch instance. +- `index: MiniSearch` + - Required + - The searialized [Minisearch](https://github.com/lucaong/minisearch) index instance +- `options: MiniSearchOptions` + - Required + - The options used to create the MiniSearch instance. ### Why CSV and not JSON? diff --git a/doc/connecting-to-data/item-search/indexed-item-search.md b/doc/connecting-to-data/item-search/indexed-item-search.md index 3d11384207d..2176915fcba 100644 --- a/doc/connecting-to-data/item-search/indexed-item-search.md +++ b/doc/connecting-to-data/item-search/indexed-item-search.md @@ -48,28 +48,28 @@ Search provider configuration: `search: SearchableItemTraits` -- `providerType: "indexed"` - - Required - - A string identifying the search provider in the [ItemSearchProviders](../../../lib/Models/ItemSearchProviders/ItemSearchProviders.ts) registry. This should be `"indexed"` for `IndexedItemSearchProvider`. -- `providerOptions: any` - - Required - - Options for the indexed item search provider - - `indexRootUrl: string` - - Required - - The URL of `indexRoot.json` file that was generted using `terriajs-indexer`. -- `resultTemplate: string` +- `providerType: "indexed"` + - Required + - A string identifying the search provider in the [ItemSearchProviders](../../../lib/Models/ItemSearchProviders/ItemSearchProviders.ts) registry. This should be `"indexed"` for `IndexedItemSearchProvider`. +- `providerOptions: any` + - Required + - Options for the indexed item search provider + - `indexRootUrl: string` + - Required + - The URL of `indexRoot.json` file that was generted using `terriajs-indexer`. +- `resultTemplate: string` - - Optional - - A [Mustache](https://mustache.github.io/) formatted template string used to generate a title text for each result in the search results listing. The columns in `resultsData.csv` can be used as variables in the template string. If not provided, the text defaults to the ID of the feature. + - Optional + - A [Mustache](https://mustache.github.io/) formatted template string used to generate a title text for each result in the search results listing. The columns in `resultsData.csv` can be used as variables in the template string. If not provided, the text defaults to the ID of the feature. -- `parameters: SearchParameterTraits[]` - - Optional - - Additional configuration for each search parameter. This is given as an array of `SearchParameterTraits` indexed by the parameter ID. - - `id: string` - - Required - - ID of the parameter - - `name?: string` - - Optional - - A human readable name to assign to the parameter which will be shown to the user in the search form instead of the ID. - - `queryOptions?: any` - - Query options to be passed to the index when searching. Currently only `text` parameters accept `queryOptions`. For `text` parameter `queryOptions` is expected to be a valid [Minisearch Search Options](https://lucaong.github.io/minisearch/modules/_minisearch_.html#searchoptions-1) object. +- `parameters: SearchParameterTraits[]` + - Optional + - Additional configuration for each search parameter. This is given as an array of `SearchParameterTraits` indexed by the parameter ID. + - `id: string` + - Required + - ID of the parameter + - `name?: string` + - Optional + - A human readable name to assign to the parameter which will be shown to the user in the search form instead of the ID. + - `queryOptions?: any` + - Query options to be passed to the index when searching. Currently only `text` parameters accept `queryOptions`. For `text` parameter `queryOptions` is expected to be a valid [Minisearch Search Options](https://lucaong.github.io/minisearch/modules/_minisearch_.html#searchoptions-1) object. diff --git a/doc/contributing/README.md b/doc/contributing/README.md index 3444db5780b..c1071a137b2 100644 --- a/doc/contributing/README.md +++ b/doc/contributing/README.md @@ -2,23 +2,23 @@ We're thrilled to have you as a contributor! This section explains how to set up ## For all contributors -- [Setting up a development environment](./development-environment.md) -- [Architecture](./architecture.md): The big picture of TerriaJS's architecture **(version 7)** - this page requires major changes to be updated for TerriaJS version 8 - - [New model layer documentation](./model-layer.md) **(version 8)** - - [Traits in depth](./traits-in-depth.md) **(version 8)** - - [Strata examples](./strata-examples.md) **(version 8)** - - [Result object and Error Handling](./result-object-and-error-handling) **(version 8)** - - [Init source](./init-sources.md) **(version 8)** -- [Frontend style guide](./frontend-style-guide.md) -- [Development translation guide](./translation-guide-dev.md) -- [Problems and Solutions](./problems-and-solutions.md) -- [Contributing to TerriaJS](https://github.com/TerriaJS/terriajs/blob/main/CONTRIBUTING.md): How to submit a pull request. Please read! :) +- [Setting up a development environment](./development-environment.md) +- [Architecture](./architecture.md): The big picture of TerriaJS's architecture **(version 7)** - this page requires major changes to be updated for TerriaJS version 8 + - [New model layer documentation](./model-layer.md) **(version 8)** + - [Traits in depth](./traits-in-depth.md) **(version 8)** + - [Strata examples](./strata-examples.md) **(version 8)** + - [Result object and Error Handling](./result-object-and-error-handling) **(version 8)** + - [Init source](./init-sources.md) **(version 8)** +- [Frontend style guide](./frontend-style-guide.md) +- [Development translation guide](./translation-guide-dev.md) +- [Problems and Solutions](./problems-and-solutions.md) +- [Contributing to TerriaJS](https://github.com/TerriaJS/terriajs/blob/main/CONTRIBUTING.md): How to submit a pull request. Please read! :) ## Coming from version 7? -- [Version 8 migration guide](./migration-guide.md) +- [Version 8 migration guide](./migration-guide.md) ## Special cases -- [Setting up Saucelabs](setting-up-saucelabs.md): Creating a local Saucelabs instance for cross-browser testing. -- [Using a Custom Version of Cesium](using-a-custom-version-of-cesium.md) +- [Setting up Saucelabs](setting-up-saucelabs.md): Creating a local Saucelabs instance for cross-browser testing. +- [Using a Custom Version of Cesium](using-a-custom-version-of-cesium.md) diff --git a/doc/contributing/development-environment.md b/doc/contributing/development-environment.md index c3ff38cc38f..c00ed0dcd54 100644 --- a/doc/contributing/development-environment.md +++ b/doc/contributing/development-environment.md @@ -59,10 +59,10 @@ yarn install Yarn will: -- Install all dependencies for both TerriaMap and any packages in your `packages` directory. -- Install the `devDependencies` for packages in the `packages` directory so you can actually develop on them. -- Create sym-links so that everything works. -- De-duplicate semver-compatible packages and bubble them up to the root `node_modules` directory. +- Install all dependencies for both TerriaMap and any packages in your `packages` directory. +- Install the `devDependencies` for packages in the `packages` directory so you can actually develop on them. +- Create sym-links so that everything works. +- De-duplicate semver-compatible packages and bubble them up to the root `node_modules` directory. Now, we can edit TerriaJS in `packages/terriajs` with the benefit of a full-featured git repo. @@ -138,17 +138,17 @@ The test suite is run by opening a web browser on [http://localhost:3002/SpecRun Run any of these tasks with `yarn gulp ` from within the TerriaJS directory: -- default - Invoked by running gulp without any arguments, this task invokes the `build` and `lint` tasks. -- `build` - Builds a non-minified version of the TerriaJS tests. This task may take 10 seconds or more, which is the main reason for the next task. -- `watch` - Starts the same as `build` but then it stays running and watches for changes to any TerriaJS or Cesium source file that was pulled in to the build. When a change to any of these files is detected, a fast incremental build is automatically kicked off. The incremental build is much faster than the full rebuild because dependencies between source files are cached. -- `release` - The same as `build` except that it also minifies the build tests. -- `lint` - Runs ESLint on the files in the `lib` folder and reports any problems. The ESLint rules are defined in the `.eslintrc` file in the root directory of TerriaJS. A stricter set of rules is also find in the `.eslintrc` file in `lib/ReactViews`. -- `docs` - Generates the user guide and reference documentation. The user guide is served at `http://localhost:3002/doc/guide/` and the reference documentation is at `http://localhost:3002/doc/reference/`. -- `make-schema` - Generates [JSON Schema](http://json-schema.org/) for the TerriaJS [Initialization Files](../customizing/initialization-files.md) from the source code. The schema is written to `wwwroot/schema`. -- `test` - Detects browsers available on the local system and launches the test suite in each. The results are reported on the command line. -- `test-electron` - Runs the tests in Electron, a headless (no UI) Chrome-like browser. -- `test-saucelabs` - Runs the tests on a bunch of browsers on [Sauce Labs](https://saucelabs.com/). You will need to [Set up Sauce Labs](setting-up-saucelabs.md). -- `test-browserstack` - Runs the tests on a bunch of browsers on [BrowserStack](https://www.browserstack.com/). You will need to set up a BrowserStack account. +- default - Invoked by running gulp without any arguments, this task invokes the `build` and `lint` tasks. +- `build` - Builds a non-minified version of the TerriaJS tests. This task may take 10 seconds or more, which is the main reason for the next task. +- `watch` - Starts the same as `build` but then it stays running and watches for changes to any TerriaJS or Cesium source file that was pulled in to the build. When a change to any of these files is detected, a fast incremental build is automatically kicked off. The incremental build is much faster than the full rebuild because dependencies between source files are cached. +- `release` - The same as `build` except that it also minifies the build tests. +- `lint` - Runs ESLint on the files in the `lib` folder and reports any problems. The ESLint rules are defined in the `.eslintrc` file in the root directory of TerriaJS. A stricter set of rules is also find in the `.eslintrc` file in `lib/ReactViews`. +- `docs` - Generates the user guide and reference documentation. The user guide is served at `http://localhost:3002/doc/guide/` and the reference documentation is at `http://localhost:3002/doc/reference/`. +- `make-schema` - Generates [JSON Schema](http://json-schema.org/) for the TerriaJS [Initialization Files](../customizing/initialization-files.md) from the source code. The schema is written to `wwwroot/schema`. +- `test` - Detects browsers available on the local system and launches the test suite in each. The results are reported on the command line. +- `test-electron` - Runs the tests in Electron, a headless (no UI) Chrome-like browser. +- `test-saucelabs` - Runs the tests on a bunch of browsers on [Sauce Labs](https://saucelabs.com/). You will need to [Set up Sauce Labs](setting-up-saucelabs.md). +- `test-browserstack` - Runs the tests on a bunch of browsers on [BrowserStack](https://www.browserstack.com/). You will need to set up a BrowserStack account. See `gulpfile.js` for more gulp tasks. @@ -156,12 +156,12 @@ See `gulpfile.js` for more gulp tasks. Run any of these tasks with `yarn gulp ` from within the TerriaMap directory: -- default - Invoked by running gulp without any arguments, this task invokes the `build` and `lint` tasks. -- `build` - Builds a non-minified version of TerriaMap, TerriaJS, Cesium, and all other dependencies, together in one JS file (called `wwwroot/build/TerriaMap.js`). Only the parts of TerriaJS and Cesium that we use (directly or indirectly) are pulled in. Web Workers, CSS, and other resources are also built by this task. This task may take 10 seconds or more, which is the main reason for the next task. -- `watch` - Starts the same as `build` but then it stays running and watches for changes to any TerriaMap, TerriaJS, or Cesium resource. When a change to any of these files is detected, a fast incremental build is automatically kicked off. The incremental build is much faster than the full rebuild because dependencies between source files are cached. -- `release` - The same as `build` except that it also minifies the built JavaScript files. This task should be used when building for production. -- `lint` - Runs ESLint on `index.js` and the files in the `lib` folder and reports any problems. The ESLint rules are defined in the `.eslintrc` file in the root directory of TerriaMap. -- `make-package` - Creates a `.tar.gz` package in `deploy/packages` from the current build. This package can be copied to another machine to run the application there. The arguments are: +- default - Invoked by running gulp without any arguments, this task invokes the `build` and `lint` tasks. +- `build` - Builds a non-minified version of TerriaMap, TerriaJS, Cesium, and all other dependencies, together in one JS file (called `wwwroot/build/TerriaMap.js`). Only the parts of TerriaJS and Cesium that we use (directly or indirectly) are pulled in. Web Workers, CSS, and other resources are also built by this task. This task may take 10 seconds or more, which is the main reason for the next task. +- `watch` - Starts the same as `build` but then it stays running and watches for changes to any TerriaMap, TerriaJS, or Cesium resource. When a change to any of these files is detected, a fast incremental build is automatically kicked off. The incremental build is much faster than the full rebuild because dependencies between source files are cached. +- `release` - The same as `build` except that it also minifies the built JavaScript files. This task should be used when building for production. +- `lint` - Runs ESLint on `index.js` and the files in the `lib` folder and reports any problems. The ESLint rules are defined in the `.eslintrc` file in the root directory of TerriaMap. +- `make-package` - Creates a `.tar.gz` package in `deploy/packages` from the current build. This package can be copied to another machine to run the application there. The arguments are: | Argument | Description | | ------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | @@ -169,5 +169,5 @@ Run any of these tasks with `yarn gulp ` from within the TerriaMap di | `--serverConfigOverride ` | The path to a file with overrides of the `devserverconfig.json` file. If not specified, `devserverconfig.json` is used unmodified. | | `--clientConfigOverride ` | The path to a file with overrides of the `wwwroot/config.json` file. If not specified, `wwwroot/config.json` is used unmodified. | -- `clean` - Removes the `wwwroot/build` directory. -- `sync-terriajs-dependencies` - For all npm packages used by both TerriaMap and TerriaJS, updates TerriaMap's `package.json` to use the same version as TerriaJS. This avoids build problems (errors, hangs) caused by package version conflicts. +- `clean` - Removes the `wwwroot/build` directory. +- `sync-terriajs-dependencies` - For all npm packages used by both TerriaMap and TerriaJS, updates TerriaMap's `package.json` to use the same version as TerriaJS. This avoids build problems (errors, hangs) caused by package version conflicts. diff --git a/doc/contributing/feature-picking.md b/doc/contributing/feature-picking.md index 2d8c02324e5..2301a5c2360 100644 --- a/doc/contributing/feature-picking.md +++ b/doc/contributing/feature-picking.md @@ -8,36 +8,36 @@ It is a work in progress. **Not included in doc**: -- How picked features are shared +- How picked features are shared ## Related docs -- [Feature Info Template](../../doc/connecting-to-data/customizing-data-appearance/feature-info-template.md) +- [Feature Info Template](../../doc/connecting-to-data/customizing-data-appearance/feature-info-template.md) ## Outline 1. Catalog item creates "mappable" items: - - [Cesium Imagery Provider](https://cesium.com/learn/cesiumjs/ref-doc/ImageryProvider.html) - - [Cesium Data Source](https://cesium.com/learn/cesiumjs/ref-doc/DataSource.html) - - [Cesium Terrain Provider](https://cesium.com/learn/cesiumjs/ref-doc/TerrainProvider.html) - - [Cesium Abstract Primitive](https://cesium.com/learn/cesiumjs/ref-doc/Primitive.html) + - [Cesium Imagery Provider](https://cesium.com/learn/cesiumjs/ref-doc/ImageryProvider.html) + - [Cesium Data Source](https://cesium.com/learn/cesiumjs/ref-doc/DataSource.html) + - [Cesium Terrain Provider](https://cesium.com/learn/cesiumjs/ref-doc/TerrainProvider.html) + - [Cesium Abstract Primitive](https://cesium.com/learn/cesiumjs/ref-doc/Primitive.html) 1. Catalog item returns `mapItems` which are rendered by Leaflet or Cesium 1. User clicks on map - - Cesium/Leaflet resolves features - - `FeatureInfoUrlMixin.getFeaturesFromPickResult` is called if applicable - - Feature highlight is created if applicable + - Cesium/Leaflet resolves features + - `FeatureInfoUrlMixin.getFeaturesFromPickResult` is called if applicable + - Feature highlight is created if applicable 1. Terria `PickedFeatures` is populated 1. Picked features appear in [`FeatureInfoPanel`](#featureinfopanel) - - Catalog item for each feature is resolved - - Each catalog item renders [`FeatureInfoCatalogItem`](#featureinfocatalogitem) - - Each feature in catalog item renders [`FeatureInfoSection`](#featureinfosection) + - Catalog item for each feature is resolved + - Each catalog item renders [`FeatureInfoCatalogItem`](#featureinfocatalogitem) + - Each feature in catalog item renders [`FeatureInfoSection`](#featureinfosection) 1. Feature info is rendered by [`FeatureInfoSection`](#featureinfosection) - - Pre-processing/cleaning of feature properties - - Setup Mustache template context data (eg custom expressions) - - `FeatureInfoContext.featureInfoContext()` is called if applicable - and merged into Mustache template context - - Feature info template is rendered - - Mustache - - parseCustomHtmlToReact + - Pre-processing/cleaning of feature properties + - Setup Mustache template context data (eg custom expressions) + - `FeatureInfoContext.featureInfoContext()` is called if applicable - and merged into Mustache template context + - Feature info template is rendered + - Mustache + - parseCustomHtmlToReact **Why is this so complicated?** @@ -47,24 +47,24 @@ Because there is no explicit link between Terria model layer and map renderers ( When creating mappable items there are things you must do to ensure feature picking functions correctly: -- What is a feature? - - Vector/cesium primitive - - Pixel value - - 3D tile - - ... -- How is it picked/selected? - - Does it require a network request? (eg WMS `GetFeatureInfo`) - - Will Cesium handle it automatically - or needs manual implementation -- When a feature is picked, can it's owner (catalog item) be resolved? - - Can it's underlying data be resolved (eg a row in a CSV)? -- What feature information is to be shown to the user? - - Is a feature info template needed? -- Does the feature information require data that isn't stored in the feature itself? - - Do additional network requests need to be made? -- Does the feature change over time? - - How should this be handled when the timeline changes? -- How is the feature shared (in share link/story)? - - Does geometry need to be saved - or is feature a product of a network request +- What is a feature? + - Vector/cesium primitive + - Pixel value + - 3D tile + - ... +- How is it picked/selected? + - Does it require a network request? (eg WMS `GetFeatureInfo`) + - Will Cesium handle it automatically - or needs manual implementation +- When a feature is picked, can it's owner (catalog item) be resolved? + - Can it's underlying data be resolved (eg a row in a CSV)? +- What feature information is to be shown to the user? + - Is a feature info template needed? +- Does the feature information require data that isn't stored in the feature itself? + - Do additional network requests need to be made? +- Does the feature change over time? + - How should this be handled when the timeline changes? +- How is the feature shared (in share link/story)? + - Does geometry need to be saved - or is feature a product of a network request This varies for each type of mappable item. Cesium will give you some of them for free - depending on feature type. @@ -106,12 +106,12 @@ See [lib/Models/Feature/Feature.ts](/lib/Models/Feature/Feature.ts) `Feature` is a wrapper around a Cesium [`Entity`](https://cesium.com/learn/cesiumjs/ref-doc/Entity.html) -- `data` property contains [`TerriaFeatureData`](#terriafeaturedata) -- `_catalogItem` - owner of feature -- `imageryProvider` - if feature picked is from imagery provider -- `loadingFeatureInfoUrl` -- `cesiumEntity` - original cesium entity (when picked) -- `cesiumPrimitive` - original cesium primitive (when picked) +- `data` property contains [`TerriaFeatureData`](#terriafeaturedata) +- `_catalogItem` - owner of feature +- `imageryProvider` - if feature picked is from imagery provider +- `loadingFeatureInfoUrl` +- `cesiumEntity` - original cesium entity (when picked) +- `cesiumPrimitive` - original cesium primitive (when picked) #### `TerriaFeatureData` @@ -121,17 +121,17 @@ This property of [`Feature`](#terria-feature-object) should be used for Terria s Current properties: -- `rowIds` - array of table row IDS that correspond to the feature. This is required for TableMixin to find original data after a [`Feature`](#terria-feature-object) has been picked, -- `timeIntervalCollection` - if feature is time varying, this property can be used instead of `properties` for convenience. +- `rowIds` - array of table row IDS that correspond to the feature. This is required for TableMixin to find original data after a [`Feature`](#terria-feature-object) has been picked, +- `timeIntervalCollection` - if feature is time varying, this property can be used instead of `properties` for convenience. #### Example usage `TableMixin` example usage - enabling time-series charts in feature info: -- `TableMixin` adds `rowIds` to `data` property here [`lib/Table/createLongitudeLatitudeFeaturePerRow.ts`](/lib/Table/createLongitudeLatitudeFeaturePerRow.ts#L83) -- A feature is picked, which triggers `TableMixin.featureInfoContext()`. -- It calls [`lib/Table/tableFeatureInfoContext.ts`](/lib/Table/tableFeatureInfoContext.ts) which uses `data.rowIds` to add "Mustache context data" to the picked feature. -- The Mustache context data contain time series chart functionality +- `TableMixin` adds `rowIds` to `data` property here [`lib/Table/createLongitudeLatitudeFeaturePerRow.ts`](/lib/Table/createLongitudeLatitudeFeaturePerRow.ts#L83) +- A feature is picked, which triggers `TableMixin.featureInfoContext()`. +- It calls [`lib/Table/tableFeatureInfoContext.ts`](/lib/Table/tableFeatureInfoContext.ts) which uses `data.rowIds` to add "Mustache context data" to the picked feature. +- The Mustache context data contain time series chart functionality ### `ImageryLayerFeatureInfo` @@ -147,24 +147,24 @@ Note use of `data` property and how we use `featureDataToGeoJson` to convert `Im There are three nested React components -- [`FeatureInfoPanel`](/lib/ReactViews/FeatureInfo/FeatureInfoPanel.tsx) - - [`FeatureInfoCatalogItem`](/lib/ReactViews/FeatureInfo/FeatureInfoCatalogItem.tsx) for each catalog item - - [`FeatureInfoSection`](/lib/ReactViews/FeatureInfo/FeatureInfoSection.tsx) for each feature in each catalog item +- [`FeatureInfoPanel`](/lib/ReactViews/FeatureInfo/FeatureInfoPanel.tsx) + - [`FeatureInfoCatalogItem`](/lib/ReactViews/FeatureInfo/FeatureInfoCatalogItem.tsx) for each catalog item + - [`FeatureInfoSection`](/lib/ReactViews/FeatureInfo/FeatureInfoSection.tsx) for each feature in each catalog item ### `FeatureInfoPanel` Top level component -- Pulls features from `Terria.pickedFeatures` -- Matches features with catalog items -- Renders `FeatureInfoCatalogItem` for each. +- Pulls features from `Terria.pickedFeatures` +- Matches features with catalog items +- Renders `FeatureInfoCatalogItem` for each. ### `FeatureInfoCatalogItem` Simple component -- Applied limit to how many features are shown -- Renders `FeatureInfoSection` for each feature in specified catalog item +- Applied limit to how many features are shown +- Renders `FeatureInfoSection` for each feature in specified catalog item ### `FeatureInfoSection` @@ -172,16 +172,16 @@ Renders feature information. There are two methods of rendering feature info: -- **"Raw data"** - presents all feature properties as a table -- **"Curated data"** - applies Mustache template using feature properties (and context data) to render complex view of feature properties - - Curated data requires a Mustache [Feature Info Template](/doc/connecting-to-data/customizing-data-appearance/feature-info-template.md) +- **"Raw data"** - presents all feature properties as a table +- **"Curated data"** - applies Mustache template using feature properties (and context data) to render complex view of feature properties + - Curated data requires a Mustache [Feature Info Template](/doc/connecting-to-data/customizing-data-appearance/feature-info-template.md) #### Cleans/pre-processes feature properties -- For time-varying features, gets values for `currentTime` -- Processes nested JSON values -- Replaces values which may interfere with Mustache templates -- Applies `FeatureInfoTraits.format` options (eg `number.toLocaleString` options) +- For time-varying features, gets values for `currentTime` +- Processes nested JSON values +- Replaces values which may interfere with Mustache templates +- Applies `FeatureInfoTraits.format` options (eg `number.toLocaleString` options) #### Raw data: generate table @@ -193,18 +193,18 @@ See [`generateCesiumInfoHTMLFromProperties`](/lib/ReactViews/FeatureInfo/generat This is an object with properties which can be used by Mustache templates: -- All (cleaned) feature properties - this forms the base of the object -- `properties` = array of key:value pairs of feature properties -- `terria` magical object - - a bunch of custom mustache expressions - - `partialByName` - - `formatNumber` - - `formatDateTime` - - `urlEncodeComponent` - - `urlEncode` - - `coords` with `latitude` and `longitude` - - `currentTime` -- properties provided by catalog item through `featureInfoContext` function +- All (cleaned) feature properties - this forms the base of the object +- `properties` = array of key:value pairs of feature properties +- `terria` magical object + - a bunch of custom mustache expressions + - `partialByName` + - `formatNumber` + - `formatDateTime` + - `urlEncodeComponent` + - `urlEncode` + - `coords` with `latitude` and `longitude` + - `currentTime` +- properties provided by catalog item through `featureInfoContext` function ##### Example mustache template with context data @@ -220,9 +220,9 @@ A custom expression - which formats `terria.currentTime` as `"dd-mm-yyyy HH:MM:s Using three components: -- The template - see `FeatureInfoTraits.template` -- "Mustache context data" - see above -- Partials - see `FeatureInfoTraits.partials` +- The template - see `FeatureInfoTraits.template` +- "Mustache context data" - see above +- Partials - see `FeatureInfoTraits.partials` The output HTML/markdown may contain Custom Components. These are handled by the next step diff --git a/doc/contributing/frontend-style-guide.md b/doc/contributing/frontend-style-guide.md index ab8242e8a5b..4e78d106dc4 100644 --- a/doc/contributing/frontend-style-guide.md +++ b/doc/contributing/frontend-style-guide.md @@ -43,8 +43,8 @@ are encapsulated in an action, e.g. rather than: ```ts runInAction(() => { - this.props.viewState.selectedHelpMenuItem = this.props.content.itemName; - this.props.viewState.helpPanelExpanded = true; + this.props.viewState.selectedHelpMenuItem = this.props.content.itemName; + this.props.viewState.helpPanelExpanded = true; }); ``` @@ -147,8 +147,8 @@ For the most part, simple strings should go through fine by calling TypeScript should be the default choice when writing components. Lean towards `tsx` when writing React components, with the following caveats: -- The majority of the `lib/Styled` components are not yet `tsx`, these will need - to be (tsx-ified!) or imported via CommonJS to consume them, e.g. +- The majority of the `lib/Styled` components are not yet `tsx`, these will need + to be (tsx-ified!) or imported via CommonJS to consume them, e.g. ```ts const Box: any = require("../../../Styled/Box").default; @@ -160,10 +160,10 @@ or const BoxSpan: any = require("../../../Styled/Box").BoxSpan; ``` -- When rapididly prototyping a UI, you may find it quicker to do this in jsx - then tsxifying when you know what the final look is. You may want to consider - still having some typed benefits by using logic in TypeScript (either through - a wrapper `tsx`, or some `ts` helpers) to aid in the process. +- When rapididly prototyping a UI, you may find it quicker to do this in jsx + then tsxifying when you know what the final look is. You may want to consider + still having some typed benefits by using logic in TypeScript (either through + a wrapper `tsx`, or some `ts` helpers) to aid in the process. Components written in TypeScript will not need `PropTypes` defined on them, as type errors on props will be caught at compilation rather than a runtime check. diff --git a/doc/contributing/init-sources.md b/doc/contributing/init-sources.md index 12d35073605..0a88fadb0e0 100644 --- a/doc/contributing/init-sources.md +++ b/doc/contributing/init-sources.md @@ -8,13 +8,13 @@ See [Initialization file](../customizing/initialization-files.md) for JSON struc In order they are applied: -- URL to [Initialization file](../customizing/initialization-files.md) specified in [`initializationUrls` in Client-side config](../customizing/client-side-config.md#intializationurls) -- Init fragment paths, for example - - `#simple` - will be resolved using [`initFragmentPaths` in Client-side config](../customizing/client-side-config.md#parameters) - - `#https://some.url/config.json` -- Start data - `#start=ShareData` - - Note: uses [`ShareData`](../customizing/client-side-config.md#sharedata) format - which is slightly different from [Initialization file](../customizing/initialization-files.md) format - - See [`StartData` examples](#startdata-examples) +- URL to [Initialization file](../customizing/initialization-files.md) specified in [`initializationUrls` in Client-side config](../customizing/client-side-config.md#intializationurls) +- Init fragment paths, for example + - `#simple` - will be resolved using [`initFragmentPaths` in Client-side config](../customizing/client-side-config.md#parameters) + - `#https://some.url/config.json` +- Start data - `#start=ShareData` + - Note: uses [`ShareData`](../customizing/client-side-config.md#sharedata) format - which is slightly different from [Initialization file](../customizing/initialization-files.md) format + - See [`StartData` examples](#startdata-examples) Any number of `InitSources` can be specified @@ -24,24 +24,24 @@ When they are applied, some properties may overwrite each other - for example `w We have the following map URL -- `http://ci.terria.io/main/#https://some.url/config.json` +- `http://ci.terria.io/main/#https://some.url/config.json` Which loads `http://ci.terria.io/main` with the following [Client-side config](../customizing/client-side-config.md): -- `http://ci.terria.io/main/config.json` +- `http://ci.terria.io/main/config.json` The config has : -- `initializationUrls = ["simple"] ` -- `initFragmentPaths = undefined` (default is `["init/"]`) +- `initializationUrls = ["simple"] ` +- `initFragmentPaths = undefined` (default is `["init/"]`) So the init URL then resolves to: -- `http://ci.terria.io/main/init/simple.json` +- `http://ci.terria.io/main/init/simple.json` Then, as the URL has fragment path (`#https://some.url/config.json`), another `InitSource` is created: -- `https://some.url/config.json` +- `https://some.url/config.json` Terria will then load both `InitSources` in order: @@ -52,9 +52,9 @@ Terria will then load both `InitSources` in order: These are also treated as `InitSources` - but don't provide ability to set init JSON or URL to init JSON -- `#share=shareId` -- `/catalog/:id` route -- `/story/:shareId` route (same as `#share=shareId`, but will automatically start story) +- `#share=shareId` +- `/catalog/:id` route +- `/story/:shareId` route (same as `#share=shareId`, but will automatically start story) ### `StartData` examples @@ -64,8 +64,8 @@ Uses JSON: ```json { - "version": "8.0.0", - "initSources": ["https://some.url/config.json"] + "version": "8.0.0", + "initSources": ["https://some.url/config.json"] } ``` @@ -75,11 +75,11 @@ http://ci.terria.io/main/#start={%22version%22:%228.0.0%22,%22initSources%22:[{% ```json { - "version": "8.0.0", - "initSources": [ - { - "catalog": [] - } - ] + "version": "8.0.0", + "initSources": [ + { + "catalog": [] + } + ] } ``` diff --git a/doc/contributing/merge-master-into-mobx.md b/doc/contributing/merge-master-into-mobx.md index c0d3d08bbdd..8f07444d810 100644 --- a/doc/contributing/merge-master-into-mobx.md +++ b/doc/contributing/merge-master-into-mobx.md @@ -1,8 +1,8 @@ # Merging master (v7) into mobx (v8) -- Pull and checkout the latest mobx branch. -- Find the common ancestor between that and master: `git merge-base origin/master mobx` -- Open a comparison of all the changes in master since the common ancestor. You can do this on github by visiting e.g. https://github.com/TerriaJS/terriajs/compare/7f54929aa766e83b4608a527c5ec307bdff829b0...master (replace the commit hash with the one reported by git merge-base above). Don't merge any of the changes yet. -- `git checkout -b mobx-merge` -- `git merge origin/master` -- Resolve conflicts. The comparison you opened above may help, especially when a file was deleted into the mobx branch. You'll need to apply any relevant changes to the new (TypeScript) files in the mobx branch. +- Pull and checkout the latest mobx branch. +- Find the common ancestor between that and master: `git merge-base origin/master mobx` +- Open a comparison of all the changes in master since the common ancestor. You can do this on github by visiting e.g. https://github.com/TerriaJS/terriajs/compare/7f54929aa766e83b4608a527c5ec307bdff829b0...master (replace the commit hash with the one reported by git merge-base above). Don't merge any of the changes yet. +- `git checkout -b mobx-merge` +- `git merge origin/master` +- Resolve conflicts. The comparison you opened above may help, especially when a file was deleted into the mobx branch. You'll need to apply any relevant changes to the new (TypeScript) files in the mobx branch. diff --git a/doc/contributing/migration-guide.md b/doc/contributing/migration-guide.md index 55d89f09e23..a0ff1531cf1 100644 --- a/doc/contributing/migration-guide.md +++ b/doc/contributing/migration-guide.md @@ -6,13 +6,13 @@ A guide to upgrade a 7.x.x TerriaJS map to TerriaJS 8.0.0 and beyond. Please pos There are a few features in v7 that we have removed. Some of these include: -- Internet Explorer 11 support (navigating to a map built with TerriaJS 8.0.0+ in IE11 will result in a completely blank page) -- GDAL conversion service - Shapefiles (.zip) are now supported in the frontend -- ABS ITT -- WMS region mapping -- Australian GNAF geocoding (and CSV batch geocoding) - we will be terminating our GNAF service as it is outdated -- Some specific `tableStyle` options -- Modifying styles for HTML elements within Terria's UI using custom CSS with `.tjs-xxxx` class selectors +- Internet Explorer 11 support (navigating to a map built with TerriaJS 8.0.0+ in IE11 will result in a completely blank page) +- GDAL conversion service - Shapefiles (.zip) are now supported in the frontend +- ABS ITT +- WMS region mapping +- Australian GNAF geocoding (and CSV batch geocoding) - we will be terminating our GNAF service as it is outdated +- Some specific `tableStyle` options +- Modifying styles for HTML elements within Terria's UI using custom CSS with `.tjs-xxxx` class selectors Reach out to us if you are using these, we only know about the things we have seen. @@ -20,10 +20,10 @@ Reach out to us if you are using these, we only know about the things we have se To migrate to TerriaJS version 8 you'll need to update each of these: -- Your initialization files -- Custom basemaps or basemap thumbnails -- The TerriaMap code -- Other modifications you've done +- Your initialization files +- Custom basemaps or basemap thumbnails +- The TerriaMap code +- Other modifications you've done ### Upgrading initialization files using the catalog converter diff --git a/doc/contributing/model-layer.md b/doc/contributing/model-layer.md index b0c489b8a36..a0d82dcff79 100644 --- a/doc/contributing/model-layer.md +++ b/doc/contributing/model-layer.md @@ -8,10 +8,10 @@ It is also helpful to understand [what MobX reacts to](https://mobx.js.org/best/ ## Types of classes in the Model layer -- _Traits_: Define the configurable properties of a each stratum of a model object. Traits classes have no logic or behavior, only properties. Note that traits classes are often built by mixing in several sets of traits. Example: `WebMapServiceCatalogItemTraits`. -- _Models_: Concrete, usable model objects representing things like map items and groups in the catalog. They are composed of mix-ins plus some model-specific computed properties and logic. Example: `WebMapServiceCatalogItem`. -- _Mixins_: Provide computed properties and behavior intended to be mixed into model objects to add capabilities to them. Example: `GetCapabilitiesMixin`. -- _Load Strata_: (singular: Load Stratum) Strata that provide values for a subset of the properties defined on model's traits class, usually by loading them from an external source such as WMS GetCapabilities service. Example: `GetCapabilitiesStratum`. +- _Traits_: Define the configurable properties of a each stratum of a model object. Traits classes have no logic or behavior, only properties. Note that traits classes are often built by mixing in several sets of traits. Example: `WebMapServiceCatalogItemTraits`. +- _Models_: Concrete, usable model objects representing things like map items and groups in the catalog. They are composed of mix-ins plus some model-specific computed properties and logic. Example: `WebMapServiceCatalogItem`. +- _Mixins_: Provide computed properties and behavior intended to be mixed into model objects to add capabilities to them. Example: `GetCapabilitiesMixin`. +- _Load Strata_: (singular: Load Stratum) Strata that provide values for a subset of the properties defined on model's traits class, usually by loading them from an external source such as WMS GetCapabilities service. Example: `GetCapabilitiesStratum`. ## Reactivity @@ -33,8 +33,8 @@ A good rule of thumb is this: all properties should either be simple data proper Computed properties with setters should be avoided. In our _old_ architecture, we frequently used computed properties with a setter to model properties that are configurable by the user, but that have a default value computed from other properties when there is no user-specified value. In the current architecture, this is better modeled by: -- Defining the configurable property on the `Traits` class. -- Defining a computed property on the derived Model class that accesses `super.propertyName` (if mixins should be allowed to define the property) or `this.flattened.propertyName` (if only a directly-configured property value should be used) and, if that is undefined, computes and returns the default value from other properties. +- Defining the configurable property on the `Traits` class. +- Defining a computed property on the derived Model class that accesses `super.propertyName` (if mixins should be allowed to define the property) or `this.flattened.propertyName` (if only a directly-configured property value should be used) and, if that is undefined, computes and returns the default value from other properties. If a property does have a setter, it should obey these laws: @@ -80,8 +80,8 @@ In this scenario, consider whether you could instead let the reactive world take We want to keep the UI as small and simple as possible, because: -- The UI is the hardest part of TerriaJS to test with automated tests. If it has lots of complicated logic, we will need to spend a lot of time writing tests for it to ensure that it behaves correctly. A very simple UI is easier to test, and is perhaps so simple that automated tests for it are not needed at all. -- We would like everything that can be done by a user interacting with the UI to be doable programmatically as well. If the UI encodes complex rules or has its own states, this may not be possible, or doing so may require duplicating complicated "business logic" that already exists in the UI. +- The UI is the hardest part of TerriaJS to test with automated tests. If it has lots of complicated logic, we will need to spend a lot of time writing tests for it to ensure that it behaves correctly. A very simple UI is easier to test, and is perhaps so simple that automated tests for it are not needed at all. +- We would like everything that can be done by a user interacting with the UI to be doable programmatically as well. If the UI encodes complex rules or has its own states, this may not be possible, or doing so may require duplicating complicated "business logic" that already exists in the UI. Therefore, whenever possible, TerriaJS logic should be in the Model layer instead of in the UI. The UI should be a pure function from Model state to React components, and actions that simply execute functions or change a small number of properties in the Model layer. @@ -91,9 +91,9 @@ Evaluate observable properties as late as possible. In particular, avoid getting A few notes on defining properties in Model classes: -- _Set only traits_: All settable properties of a Model should be in its Traits. Because Traits are the only properties that are serialized/deserialized for catalog configuration and for sharing, settable properties that are not part of Traits prevent us from being able to completely recover application state. The only exception to this rule is for highly transient properties, such as whether a load from a remote source is currently in progress. -- _Covariance_: If you override a gettable property in a derived class, its type must be covariant with the base class type. That is, it is fine of the derived class property returns `string` while the base class property returns `string | undefined`. And it is fine if the derived class returns `Dog` while the base class returns `Animal`. But it is not ok if this relationship is reversed. You shouldn't really have any settable properties, but if you do, the types of such properties must be identical in base and derived classes. -- _Equals_: Pay attention to the comparer/equals to use with observables to determine if a new value is equal to an old one. The default `equals` is usually fine for primitive types (e.g. string, number, boolean), observable arrays, and objects whose properties are themselves observable (e.g. Traits). But for other types, especially Cesium types like JulianDate, Cartographic, and Cartesian3, it is essential to specify an `equals`. Typically this looks like this: `@computed({ equals: JulianDate.equals })`. +- _Set only traits_: All settable properties of a Model should be in its Traits. Because Traits are the only properties that are serialized/deserialized for catalog configuration and for sharing, settable properties that are not part of Traits prevent us from being able to completely recover application state. The only exception to this rule is for highly transient properties, such as whether a load from a remote source is currently in progress. +- _Covariance_: If you override a gettable property in a derived class, its type must be covariant with the base class type. That is, it is fine of the derived class property returns `string` while the base class property returns `string | undefined`. And it is fine if the derived class returns `Dog` while the base class returns `Animal`. But it is not ok if this relationship is reversed. You shouldn't really have any settable properties, but if you do, the types of such properties must be identical in base and derived classes. +- _Equals_: Pay attention to the comparer/equals to use with observables to determine if a new value is equal to an old one. The default `equals` is usually fine for primitive types (e.g. string, number, boolean), observable arrays, and objects whose properties are themselves observable (e.g. Traits). But for other types, especially Cesium types like JulianDate, Cartographic, and Cartesian3, it is essential to specify an `equals`. Typically this looks like this: `@computed({ equals: JulianDate.equals })`. ## `Traits` @@ -153,8 +153,8 @@ So, instead of trying to make a model change type upon load, `ReferenceMixin` cr There are two types of references -- Strong references -- Weak references +- Strong references +- Weak references ### Strong references @@ -162,12 +162,12 @@ These are a one-to-one mapping from a reference to it's target. The target can o #### Some rules -- The target model of a `ReferenceMixin` may be obtained from the `target` property, but it may be undefined until the promise returned by `loadReference` resolves. It may also be stale if a relevant trait of the reference has changed but `loadReference` hasn't yet been called or hasn't yet finished. -- For simplicity, a particular model may _only_ be the target of a single reference. Multiple references cannot point to the same target. The reference that points to a particular model may be obtained from the model's `sourceReference` property. -- The `uniqueId` of the `target` model must be the same as the `uniqueId` of the model with `ReferenceMixin`. -- The model with `ReferenceMixin` _may_ be in `terria.models`. -- The `target` model must _not_ be in `terria.models`. -- The instance referred to by the `target` property should remain stable (the same instance) whenever possible. But if something drastic changes (e.g. we need an instance of a different model class), it's possible for the `target` property to switch to pointing at an entirely new instance. So it's important to only hold on to references to the `ReferenceMixin` model and access the `target` as needed, rather than holding a reference to the `target` directly. +- The target model of a `ReferenceMixin` may be obtained from the `target` property, but it may be undefined until the promise returned by `loadReference` resolves. It may also be stale if a relevant trait of the reference has changed but `loadReference` hasn't yet been called or hasn't yet finished. +- For simplicity, a particular model may _only_ be the target of a single reference. Multiple references cannot point to the same target. The reference that points to a particular model may be obtained from the model's `sourceReference` property. +- The `uniqueId` of the `target` model must be the same as the `uniqueId` of the model with `ReferenceMixin`. +- The model with `ReferenceMixin` _may_ be in `terria.models`. +- The `target` model must _not_ be in `terria.models`. +- The instance referred to by the `target` property should remain stable (the same instance) whenever possible. But if something drastic changes (e.g. we need an instance of a different model class), it's possible for the `target` property to switch to pointing at an entirely new instance. So it's important to only hold on to references to the `ReferenceMixin` model and access the `target` as needed, rather than holding a reference to the `target` directly. ### Weak References @@ -194,18 +194,18 @@ This means that we can call `asyncLoader.load()` many times without worrying abo `forceLoadX()` shouldn't be called directly - instead you should use `asyncLoader.load()` method - for example in `CatalogMemberMixin` we have -- the abstract method `forceLoadMetadata` -- `loadMetadata()` which wraps `asyncLoader.load()` -- `loadMetadata()` can be called as many times as needed -- See [CatalogMemberMixin example](#CatalogMemberMixin-example) +- the abstract method `forceLoadMetadata` +- `loadMetadata()` which wraps `asyncLoader.load()` +- `loadMetadata()` can be called as many times as needed +- See [CatalogMemberMixin example](#CatalogMemberMixin-example) A **correct** example: ```ts async function forceLoadX() { - const url = this.someObservableUrl; - const someData = await loadText(url); - runInAction(() => (this.someOtherObservable = someData)); + const url = this.someObservableUrl; + const someData = await loadText(url); + runInAction(() => (this.someOtherObservable = someData)); } ``` @@ -219,9 +219,9 @@ An **incorrect** example: ```ts async function forceLoadX() { - const arg = this.someObservable; - const someData = someSynchronousFn(arg); - runInAction(() => (this.someOtherObservable = someData)); + const arg = this.someObservable; + const someData = someSynchronousFn(arg); + runInAction(() => (this.someOtherObservable = someData)); } ``` @@ -238,13 +238,13 @@ get newComputed { **Other tips**: -- You should not nest together `AsyncLoaders`. - Eg. - ```ts - async function forceLoadX() { - await this.forceLoadY(); - } - ``` +- You should not nest together `AsyncLoaders`. + Eg. + ```ts + async function forceLoadX() { + await this.forceLoadY(); + } + ``` For more info, see `lib\Core\AsyncLoader.ts` diff --git a/doc/contributing/result-object-and-error-handling.md b/doc/contributing/result-object-and-error-handling.md index 694f33fe45a..d6ea68a0f2c 100644 --- a/doc/contributing/result-object-and-error-handling.md +++ b/doc/contributing/result-object-and-error-handling.md @@ -13,10 +13,10 @@ See `lib\Core\Result.ts` for more documentation. ```ts function someFn(someArg: boolean): Result { - if (someArg) { - return new Result("success"); - } - return new Result(undefined, TerriaError.from("SOME ERROR")); + if (someArg) { + return new Result("success"); + } + return new Result(undefined, TerriaError.from("SOME ERROR")); } ``` @@ -36,7 +36,7 @@ const value = someFn(false).ignoreError(); ```ts const value = someFn(someArg).catchError((error) => - doSomethingWithError(error) + doSomethingWithError(error) ); ``` @@ -66,18 +66,18 @@ This allows you to add more context to TerriaErrors. Valid `TerriaErrorOverrides` include: -- String values - eg `"Some error message"` -- JSON representation of `TerriaError` - eg `{"title": "Error title", "message": "Some error message"}` +- String values - eg `"Some error message"` +- JSON representation of `TerriaError` - eg `{"title": "Error title", "message": "Some error message"}` #### Simple usage ```ts function someFn(someArg): Result { - if (someArg) { - return new Result("success"); - } - // Here we create a TerriaError with message "Some Error inside result" - return new Result(undefined, TerriaError.from("Some error inside result")); + if (someArg) { + return new Result("success"); + } + // Here we create a TerriaError with message "Some Error inside result" + return new Result(undefined, TerriaError.from("Some error inside result")); } // Here we add `TerriaErrorOverrides` in throwIfError. @@ -125,10 +125,10 @@ See `lib\Core\TerriaError.ts` for more documentation. `TerriaErrorSeverity` enum values can be `Error` or `Warning`. -- Errors with severity `Error` are presented to the user. `Warning` will just be printed to console. -- By default, errors will use `Error` -- `TerriaErrorSeverity` will be copied through nested `TerriaErrors` on creation (eg if you call `TerriaError.from()` on a `Warning` then the parent error will also be `Warning`) -- Loading models from share links or stories will use `Warning` if the model is **not in the workbench**, otherwise it will use `Error`. +- Errors with severity `Error` are presented to the user. `Warning` will just be printed to console. +- By default, errors will use `Error` +- `TerriaErrorSeverity` will be copied through nested `TerriaErrors` on creation (eg if you call `TerriaError.from()` on a `Warning` then the parent error will also be `Warning`) +- Loading models from share links or stories will use `Warning` if the model is **not in the workbench**, otherwise it will use `Error`. #### Example of severity propagation @@ -136,8 +136,8 @@ Say we have this error with severity `Warning`: ```ts const error = { - message: "some message", - severity: TerriaErrorSeverity.Warning + message: "some message", + severity: TerriaErrorSeverity.Warning }; ``` diff --git a/doc/contributing/setting-up-saucelabs.md b/doc/contributing/setting-up-saucelabs.md index 9857a81881a..f93cf5f687e 100644 --- a/doc/contributing/setting-up-saucelabs.md +++ b/doc/contributing/setting-up-saucelabs.md @@ -1,9 +1,9 @@ -- Get an account from [https://saucelabs.com/open-source](https://saucelabs.com/open-source). -- DON'T bother installing any tunnels or any of that nonsense that it tells you to do. This is actually automatically handled by sauce's npm module which is pretty sweet. -- Go to "My Account" in saucelabs (bottom left menu) and copy your access key (middle of the page roughly). -- Set env variables for SAUCE_USERNAME and SAUCE_ACCESS_KEY using your OS's method for doing that (`export` in bash) with your sauce username and the access key you just copied. -- Run `npm install -g karma-cli` Without this karma will sort-of work but give you confusing errors. -- Run `yarn start` in your `terriajs` dir in another terminal. -- Run `yarn gulp test-saucelabs` if you have a `karma-saucelabs.conf.js` file, or run `karma start` from the TerriaJS directory if you have a `karma.config.js` file. +- Get an account from [https://saucelabs.com/open-source](https://saucelabs.com/open-source). +- DON'T bother installing any tunnels or any of that nonsense that it tells you to do. This is actually automatically handled by sauce's npm module which is pretty sweet. +- Go to "My Account" in saucelabs (bottom left menu) and copy your access key (middle of the page roughly). +- Set env variables for SAUCE_USERNAME and SAUCE_ACCESS_KEY using your OS's method for doing that (`export` in bash) with your sauce username and the access key you just copied. +- Run `npm install -g karma-cli` Without this karma will sort-of work but give you confusing errors. +- Run `yarn start` in your `terriajs` dir in another terminal. +- Run `yarn gulp test-saucelabs` if you have a `karma-saucelabs.conf.js` file, or run `karma start` from the TerriaJS directory if you have a `karma.config.js` file. If you want to narrow down the browsers being run (i.e. only run IE9), you can remove them from `karma[-saucelabs].config.js` under `browsers`. diff --git a/doc/contributing/strata-examples.md b/doc/contributing/strata-examples.md index 27865e08fe6..c5052c10247 100644 --- a/doc/contributing/strata-examples.md +++ b/doc/contributing/strata-examples.md @@ -4,36 +4,36 @@ **Bold** items are not `CommonStrata` -- Defaults - - `default` - - **`magda-record`** -- Loadable - - **`getCapabilities`** -- Definition - - `underride` - - `definition` - - `override` -- User - - `user` +- Defaults + - `default` + - **`magda-record`** +- Loadable + - **`getCapabilities`** +- Definition + - `underride` + - `definition` + - `override` +- User + - `user` ### Example Magda record ```json { - "aspects": { - "terria": { - "definition": { - "url": "some-wms-server.com/layer" - }, - "underride": { - "name": "A WMS layer name that has been updated by Magda Minion" - }, - "id": "wms-layer-id", - "type": "wms" - } - }, - "id": "wms-layer-id", - "name": "WMS layer name in Magda" + "aspects": { + "terria": { + "definition": { + "url": "some-wms-server.com/layer" + }, + "underride": { + "name": "A WMS layer name that has been updated by Magda Minion" + }, + "id": "wms-layer-id", + "type": "wms" + } + }, + "id": "wms-layer-id", + "name": "WMS layer name in Magda" } ``` @@ -51,7 +51,7 @@ Will contain properties loaded from WMS `GetCapabilities` request. For example: ```json { - "name": "A WMS layer name provided by WMS GetCapabilities" + "name": "A WMS layer name provided by WMS GetCapabilities" } ``` @@ -63,7 +63,7 @@ In provided example, this would be: ```json { - "name": "A WMS layer name that has been updated by Magda Minion" + "name": "A WMS layer name that has been updated by Magda Minion" } ``` @@ -75,7 +75,7 @@ In provided example, this would be: ```json { - "url": "some-wms-server.com/layer" + "url": "some-wms-server.com/layer" } ``` @@ -83,7 +83,7 @@ In provided example, this would be: ```json { - "name": "A WMS layer name that has been updated by Magda Minion", - "url": "some-wms-server.com/layer" + "name": "A WMS layer name that has been updated by Magda Minion", + "url": "some-wms-server.com/layer" } ``` diff --git a/doc/contributing/traits-in-depth.md b/doc/contributing/traits-in-depth.md index 1b61d5a7fb8..249622e471b 100644 --- a/doc/contributing/traits-in-depth.md +++ b/doc/contributing/traits-in-depth.md @@ -19,10 +19,10 @@ Stratums are how Terria determines which value a Trait should resolve to. There are 4 strata types -- Defaults -- Loadable -- Definition -- User +- Defaults +- Loadable +- Definition +- User Each type can have multiple strata - see [`StratumOrder.ts`](/lib/Models/Definition/StratumOrder.ts) @@ -30,14 +30,14 @@ Each type can have multiple strata - see [`StratumOrder.ts`](/lib/Models/Definit There are 5 common strata - these exist for every model -- Defaults - - `default` -- Definition - - `underride` - - `definition` - - `override` -- User - - `user` +- Defaults + - `default` +- Definition + - `underride` + - `definition` + - `override` +- User + - `user` ### Defaults `defaults` @@ -60,8 +60,8 @@ These should only be used in Trait definitions. Some example usages of `underride` -- Copying `itemPropertiesByIds`, `itemPropertiesByType`, `itemProperties`, to nested groups or nested references - that is, when a group or reference is loaded, if there are nested groups or nested reference - they will get the parent `itemProperties*` set in their `underride` stratum -- Setting `isExperiencingIssues = true` for models which have configuration issues +- Copying `itemPropertiesByIds`, `itemPropertiesByType`, `itemProperties`, to nested groups or nested references - that is, when a group or reference is loaded, if there are nested groups or nested reference - they will get the parent `itemProperties*` set in their `underride` stratum +- Setting `isExperiencingIssues = true` for models which have configuration issues ### Definition `definition` @@ -96,8 +96,8 @@ Values for models created programmatically by dynamic groups - for example `WebM Some use cases: -- To override invalid `definition` values -- Apply `itemProperties` to a model +- To override invalid `definition` values +- Apply `itemProperties` to a model ### User `user` diff --git a/doc/contributing/translation-guide-dev.md b/doc/contributing/translation-guide-dev.md index 630f1e9f0a8..017b5eb8158 100644 --- a/doc/contributing/translation-guide-dev.md +++ b/doc/contributing/translation-guide-dev.md @@ -17,10 +17,10 @@ import React from "react"; import { useTranslation } from "react-i18next"; export function MyComponent() { - const { t, i18n } = useTranslation(); - // or const [t, i18n] = useTranslation(); + const { t, i18n } = useTranslation(); + // or const [t, i18n] = useTranslation(); - return

    {t("key")}

    ; //returns corresponding translated text from translation files + return

    {t("key")}

    ; //returns corresponding translated text from translation files } ``` @@ -37,7 +37,7 @@ import React from "react"; import { withTranslation } from "react-i18next"; function MyComponent({ t, i18n }) { - return

    {t("my translated text")}

    ; + return

    {t("my translated text")}

    ; } export default withTranslation()(MyComponent); @@ -56,13 +56,13 @@ import React from "react"; import { Trans, useTranslation } from "react-i18next"; function MyComponent() { - const { t } = useTranslation("myNamespace"); + const { t } = useTranslation("myNamespace"); - return ( - - Hello World - - ); + return ( + + Hello World + + ); } ``` @@ -76,7 +76,7 @@ Use dynamic values in translations. ```json { - "key": "{{what}} is {{how}}" + "key": "{{what}} is {{how}}" } ``` @@ -99,10 +99,10 @@ i18next features automatic recognition of singular and plural forms. ```json { - "key": "item", - "key_plural": "items", - "keyWithCount": "{{count}} item", - "keyWithCount_plural": "{{count}} items" + "key": "item", + "key_plural": "items", + "keyWithCount": "{{count}} item", + "keyWithCount_plural": "{{count}} items" } ``` @@ -129,9 +129,9 @@ Nesting allows you to reference other keys in a translation. ```json { - "nesting1": "1 $t(nesting2)", - "nesting2": "2 $t(nesting3)", - "nesting3": "3" + "nesting1": "1 $t(nesting2)", + "nesting2": "2 $t(nesting3)", + "nesting3": "3" } ``` @@ -151,9 +151,9 @@ By providing a context you can differ translations. ```json { - "friend": "A friend", - "friend_male": "A boyfriend", - "friend_female": "A girlfriend" + "friend": "A friend", + "friend_male": "A boyfriend", + "friend_female": "A girlfriend" } ``` @@ -169,4 +169,4 @@ See the [react-i18next context documentation](https://www.i18next.com/translatio ## Future work -- Support internationalization of catalog content. +- Support internationalization of catalog content. diff --git a/doc/customizing/README.md b/doc/customizing/README.md index f24dcb64890..1d086f09882 100644 --- a/doc/customizing/README.md +++ b/doc/customizing/README.md @@ -2,7 +2,7 @@ TerriaJS can be extensively customized, often without writing any code. The cata This section explains the various ways to customize a TerriaJS application. It assumes you have already completed the [Getting Started](../getting-started.md) section and have a working Terria Map. -- [Client-side Config](client-side-config.md): Configure which catalog (init) files to load, the application name and support email address, the branding at the top of the application, disclaimers, keys for Bing Maps and Google Analytics, and more. -- [Initialization Files](initialization-files.md): TerriaJS init files describe the catalog that will be presented to the user, the initial map view, and more. Init files let you connect TerriaJS to your servers and data. -- [Server-side Config](server-side-config.md): Configure which domains the server will proxy for (to avoid [Cross-Origin Resource Sharing (CORS) problems](../connecting-to-data/cross-origin-resource-sharing.md)), persistence of sharing data, and more. -- [Skinning](skinning.md): Customize the look and feel of a TerriaJS application. +- [Client-side Config](client-side-config.md): Configure which catalog (init) files to load, the application name and support email address, the branding at the top of the application, disclaimers, keys for Bing Maps and Google Analytics, and more. +- [Initialization Files](initialization-files.md): TerriaJS init files describe the catalog that will be presented to the user, the initial map view, and more. Init files let you connect TerriaJS to your servers and data. +- [Server-side Config](server-side-config.md): Configure which domains the server will proxy for (to avoid [Cross-Origin Resource Sharing (CORS) problems](../connecting-to-data/cross-origin-resource-sharing.md)), persistence of sharing data, and more. +- [Skinning](skinning.md): Customize the look and feel of a TerriaJS application. diff --git a/doc/customizing/client-side-config.md b/doc/customizing/client-side-config.md index fca68c4d008..e163d8486c7 100644 --- a/doc/customizing/client-side-config.md +++ b/doc/customizing/client-side-config.md @@ -45,10 +45,10 @@ Note: relative paths will be resolved to the base URL of client-side config URL For example a map hosted at http://something.com/map -- will have default `configUrl = http://something.com/map/config.json` -- therefore will resolve `initFragmentPaths` to `http://something.com/map` -- if using default `initFragmentPaths = ["init"]` - - init fragments will be resolved to `http://something.com/map/init` +- will have default `configUrl = http://something.com/map/config.json` +- therefore will resolve `initFragmentPaths` to `http://something.com/map` +- if using default `initFragmentPaths = ["init"]` + - init fragments will be resolved to `http://something.com/map/init` ### `v7initializationUrls` @@ -186,22 +186,22 @@ Configuration of items to appear in the search bar ```json { - "enabled": true, - "debug": false, - "react": { - "useSuspense": false - }, - "languages": { - "en": "english", - "de": "deutsch" - }, - "fallbackLanguage": "en", - "changeLanguageOnStartWhen": [ - "querystring", - "localStorage", - "navigator", - "htmlTag" - ] + "enabled": true, + "debug": false, + "react": { + "useSuspense": false + }, + "languages": { + "en": "english", + "de": "deutsch" + }, + "fallbackLanguage": "en", + "changeLanguageOnStartWhen": [ + "querystring", + "localStorage", + "navigator", + "htmlTag" + ] } ``` @@ -220,10 +220,10 @@ Configuration of maps to appear in "Related Maps" menu panel ```json { - "imageUrl": "https://terria-catalogs-public.storage.googleapis.com/misc/related-maps/nationalmap.jpg", - "url": "http://nationalmap.gov.au/", - "title": "NationalMap", - "description": "The NationalMap is a website for map-based access to spatial data from Australian government agencies. It is an initiative of the Australian Government's Department of the Prime Minister and Cabinet and the software has been developed by Data61 working closely with the Department of the Prime Minister and Cabinet, Geoscience Australia and other government agencies." + "imageUrl": "https://terria-catalogs-public.storage.googleapis.com/misc/related-maps/nationalmap.jpg", + "url": "http://nationalmap.gov.au/", + "title": "NationalMap", + "description": "The NationalMap is a website for map-based access to spatial data from Australian government agencies. It is an initiative of the Australian Government's Department of the Prime Minister and Cabinet and the software has been developed by Data61 working closely with the Department of the Prime Minister and Cabinet, Geoscience Australia and other government agencies." } ``` @@ -237,22 +237,22 @@ The https://github.com/nextapps-de/flexsearch library is used to index and searc To generate the catalog index: -- `yarn build-tools` -- `node .\build\generateCatalogIndex.js config-url base-url` where +- `yarn build-tools` +- `node .\build\generateCatalogIndex.js config-url base-url` where - - `config-url` is URL to client-side-config file - - `base-url` is URL to terriajs-server (this is used to load `server-config` and to proxy requests) - - For example `node .\build\generateCatalogIndex.js http://localhost:3001/config.json http://localhost:3001` + - `config-url` is URL to client-side-config file + - `base-url` is URL to terriajs-server (this is used to load `server-config` and to proxy requests) + - For example `node .\build\generateCatalogIndex.js http://localhost:3001/config.json http://localhost:3001` -- This will output three files - - `catalog-index.json` - - `catalog-index-errors.json` with any error messages which occurred while loading catalog members - - `catalog-index-errors-stack.json` with errors stack -- Set `catalogIndexUrl` config parameter to URL to `catalog-index.json` +- This will output three files + - `catalog-index.json` + - `catalog-index-errors.json` with any error messages which occurred while loading catalog members + - `catalog-index-errors-stack.json` with errors stack +- Set `catalogIndexUrl` config parameter to URL to `catalog-index.json` This file will have to be re-generated manually every time the catalog structure changes - for example: -- if items are renamed, or moved -- dynamic groups are updated (for example, WMS server publishes new layers) +- if items are renamed, or moved +- dynamic groups are updated (for example, WMS server publishes new layers) For more details see [/buildprocess/generateCatalogIndex.ts](/buildprocess/generateCatalogIndex.ts) diff --git a/doc/customizing/cloning-and-building.md b/doc/customizing/cloning-and-building.md index 3aeee743b67..69e6104885b 100644 --- a/doc/customizing/cloning-and-building.md +++ b/doc/customizing/cloning-and-building.md @@ -20,10 +20,10 @@ If you run into trouble or want more explanation, read on. TerriaJS can be built and run on almost any macOS, Linux, or Windows system. The following are required to build TerriaJS: -- The Bash command shell. On macOS or Linux you almost certainly already have this. On Windows, you can easily get it by installing [Git for Windows](https://gitforwindows.org/). In the instructions below, we assume you're using a Bash command prompt. -- [Node.js](https://nodejs.org) v14.0 or later. You can check your node version by running `node --version` on the command-line. -- [npm](https://www.npmjs.com/) v6.0 or later. npm is usually installed automatically alongside the above. You can check your npm version by running `npm --version`. -- [yarn](https://yarnpkg.com/) v1.19.0 or later. This can be installed using `npm install -g yarn@^1.19.0` +- The Bash command shell. On macOS or Linux you almost certainly already have this. On Windows, you can easily get it by installing [Git for Windows](https://gitforwindows.org/). In the instructions below, we assume you're using a Bash command prompt. +- [Node.js](https://nodejs.org) v14.0 or later. You can check your node version by running `node --version` on the command-line. +- [npm](https://www.npmjs.com/) v6.0 or later. npm is usually installed automatically alongside the above. You can check your npm version by running `npm --version`. +- [yarn](https://yarnpkg.com/) v1.19.0 or later. This can be installed using `npm install -g yarn@^1.19.0` ### Cloning TerriaMap diff --git a/doc/customizing/initialization-files.md b/doc/customizing/initialization-files.md index 3cc4c0b27de..aabb485f47d 100644 --- a/doc/customizing/initialization-files.md +++ b/doc/customizing/initialization-files.md @@ -42,12 +42,12 @@ An init file is a [JSON file](https://en.wikipedia.org/wiki/JSON) with this basi Key points: -- `catalog` is an array. -- Every element of that array must have a `type` (corresponding to a value recognised by TerriaJS) and a `name`. -- The three major categories of catalog member types are: - - [Catalog Group](../connecting-to-data/catalog-groups.md): A group (folder) of items. Different group types allow the contents to be manually specified or to be automatically determined by querying various types of server. - - [Catalog Item](../connecting-to-data/catalog-items.md): Actual geospatial or chart data from a file or service, in various formats. - - [(Docs not yet available) Catalog Function](../connecting-to-data/catalog-functions.md): A parameterized service, such as a Web Processing Service (WPS). The user supplies the parameters and gets back some result. +- `catalog` is an array. +- Every element of that array must have a `type` (corresponding to a value recognised by TerriaJS) and a `name`. +- The three major categories of catalog member types are: + - [Catalog Group](../connecting-to-data/catalog-groups.md): A group (folder) of items. Different group types allow the contents to be manually specified or to be automatically determined by querying various types of server. + - [Catalog Item](../connecting-to-data/catalog-items.md): Actual geospatial or chart data from a file or service, in various formats. + - [(Docs not yet available) Catalog Function](../connecting-to-data/catalog-functions.md): A parameterized service, such as a Web Processing Service (WPS). The user supplies the parameters and gets back some result. Most of the other properties of each layer depend on the specific type. See the links above for details of each type. diff --git a/doc/customizing/skinning.md b/doc/customizing/skinning.md index 8749f506176..93010374471 100644 --- a/doc/customizing/skinning.md +++ b/doc/customizing/skinning.md @@ -33,30 +33,33 @@ import StandardUserInterface from "terriajs/lib/ReactViews/StandardUserInterface import MenuItem from "terriajs/lib/ReactViews/StandardUserInterface/customizable/MenuItem"; import RelatedMaps from "./RelatedMaps"; import { - Menu, - Nav + Menu, + Nav } from "terriajs/lib/ReactViews/StandardUserInterface/customizable/Groups"; import MeasureTool from "terriajs/lib/ReactViews/Map/Navigation/MeasureTool"; import "./global.scss"; export default function UserInterface(props) { - return ( - - - - - - - - - ); + return ( + + + + + + + + + ); } ``` diff --git a/doc/customizing/translation-guide.md b/doc/customizing/translation-guide.md index df0f5640887..5e8ba15aa38 100644 --- a/doc/customizing/translation-guide.md +++ b/doc/customizing/translation-guide.md @@ -11,8 +11,8 @@ If you are an advanced user or expert, we recommend reading the short and concis The following i18next plugins are used: -- [i18next-browser-languagedetector](https://github.com/i18next/i18next-browser-languageDetector) to detect the browser language, use the localStorage and react to URL query -- [i18next-http-backend](https://github.com/i18next/i18next-http-backend) to enable loading translations from editable language files +- [i18next-browser-languagedetector](https://github.com/i18next/i18next-browser-languageDetector) to detect the browser language, use the localStorage and react to URL query +- [i18next-http-backend](https://github.com/i18next/i18next-http-backend) to enable loading translations from editable language files ### Languages @@ -58,14 +58,14 @@ The translation key must be prefixed with `"translate#"`, so the structure of th ```json { - "help": { - "gettingstarted": { - "title": "Getting started with the map", - "content": "", - "video": "https://...", - "image": "https://..." + "help": { + "gettingstarted": { + "title": "Getting started with the map", + "content": "", + "video": "https://...", + "image": "https://..." + } } - } } ``` diff --git a/doc/customizing/without-docker.md b/doc/customizing/without-docker.md index c2d8659c24b..75055a7108e 100644 --- a/doc/customizing/without-docker.md +++ b/doc/customizing/without-docker.md @@ -22,10 +22,10 @@ If you run into trouble or want more explanation, read on. TerriaJS can be built and run on almost any macOS, Linux, or Windows system. The following are required to build TerriaJS: -- The Bash command shell. On macOS or Linux you almost certainly already have this. On Windows, you can easily get it by installing [Git for Windows](https://gitforwindows.org/). In the instructions below, we assume you're using a Bash command prompt. -- [Node.js](https://nodejs.org) v12.0 or later. You can check your node version by running `node --version` on the command-line. -- [npm](https://www.npmjs.com/) v6.0 or later. npm is usually installed automatically alongside the above. You can check your npm version by running `npm --version`. -- [yarn](https://yarnpkg.com/) v1.19.0 or later. This can be installed using `npm install -g yarn@^1.19.0` +- The Bash command shell. On macOS or Linux you almost certainly already have this. On Windows, you can easily get it by installing [Git for Windows](https://gitforwindows.org/). In the instructions below, we assume you're using a Bash command prompt. +- [Node.js](https://nodejs.org) v12.0 or later. You can check your node version by running `node --version` on the command-line. +- [npm](https://www.npmjs.com/) v6.0 or later. npm is usually installed automatically alongside the above. You can check your npm version by running `npm --version`. +- [yarn](https://yarnpkg.com/) v1.19.0 or later. This can be installed using `npm install -g yarn@^1.19.0` ### Cloning TerriaMap diff --git a/doc/deploying/README.md b/doc/deploying/README.md index 81428cacf5a..0bf4c996963 100644 --- a/doc/deploying/README.md +++ b/doc/deploying/README.md @@ -2,20 +2,20 @@ This section explains how to deploy and maintain production (and production-ish) Deploying TerriaMap itself: -- [Deploying TerriaMap](deploying-terriamap.md): General instructions for deploying TerriaMap in almost any environment. -- [Deploying with Kubernetes](deploying-with-kubernetes.md): Deploy TerriaMap using [Docker](https://www.docker.com/) and [Kubernetes](https://kubernetes.io/). +- [Deploying TerriaMap](deploying-terriamap.md): General instructions for deploying TerriaMap in almost any environment. +- [Deploying with Kubernetes](deploying-with-kubernetes.md): Deploy TerriaMap using [Docker](https://www.docker.com/) and [Kubernetes](https://kubernetes.io/). Deploying other services for use with TerriaJS: -- [Setting Up a Region Mapping Server](setting-up-a-region-mapping-server.md): Set up a server for use with TerriaJS's region mapping feature. -- [Setting Up Geoserver](setting-up-geoserver.md): Configure [GeoServer](http://geoserver.org/) for effective use with TerriaJS. +- [Setting Up a Region Mapping Server](setting-up-a-region-mapping-server.md): Set up a server for use with TerriaJS's region mapping feature. +- [Setting Up Geoserver](setting-up-geoserver.md): Configure [GeoServer](http://geoserver.org/) for effective use with TerriaJS. Using a TerriaMap in other applications: -- [Using as a CKAN Previewer](using-as-a-ckan-previewer.md): Use TerriaJS as a previewer for geospatial data in a [CKAN](http://ckan.org/) site. -- [Controlling with URL Parameters](controlling-with-url-parameters.md): Control a TerriaJS application by passing it URL parameters. This is powerful because it enables another site to launch or embed a customized map with little or no code to write. -- [Controlling in an <iframe> or Popup](controlling-in-an-iframe-or-popup.md): Embed a TerriaJS application in iframe or pop it up in a separate window, and control it by posting it cross-window messages. +- [Using as a CKAN Previewer](using-as-a-ckan-previewer.md): Use TerriaJS as a previewer for geospatial data in a [CKAN](http://ckan.org/) site. +- [Controlling with URL Parameters](controlling-with-url-parameters.md): Control a TerriaJS application by passing it URL parameters. This is powerful because it enables another site to launch or embed a customized map with little or no code to write. +- [Controlling in an <iframe> or Popup](controlling-in-an-iframe-or-popup.md): Embed a TerriaJS application in iframe or pop it up in a separate window, and control it by posting it cross-window messages. Special deployment configurations: -- [Running TerriaMap through a reverse proxy](running-through-reverse-proxy.md): How to configure Terria to work correctly when running through a reverse proxy that performs path rewriting to prefix a path to URLs. E.g. hosting a map to be accessed at http://example.com/my/terriamap/ +- [Running TerriaMap through a reverse proxy](running-through-reverse-proxy.md): How to configure Terria to work correctly when running through a reverse proxy that performs path rewriting to prefix a path to URLs. E.g. hosting a map to be accessed at http://example.com/my/terriamap/ diff --git a/doc/deploying/controlling-in-an-iframe-or-popup.md b/doc/deploying/controlling-in-an-iframe-or-popup.md index 2d27a916832..42f802280a7 100644 --- a/doc/deploying/controlling-in-an-iframe-or-popup.md +++ b/doc/deploying/controlling-in-an-iframe-or-popup.md @@ -13,60 +13,61 @@ Then, the parent window can send messages like this: ```html - - - NationalMap Embed Test - + + + NationalMap Embed Test + - - + + - - + }); + + ``` diff --git a/doc/deploying/controlling-with-url-parameters.md b/doc/deploying/controlling-with-url-parameters.md index 8afc4d8765a..ec3585a9569 100644 --- a/doc/deploying/controlling-with-url-parameters.md +++ b/doc/deploying/controlling-with-url-parameters.md @@ -2,9 +2,9 @@ Many aspects of TerriaJS (and hence TerriaMap, NationalMap, and others) can be configured by the end user by passing URL parameters. Combine them like this: -- The base URL, then a `#` -- Then the first parameter -- Then repeatedly: a `&`, and the next parameter +- The base URL, then a `#` +- Then the first parameter +- Then repeatedly: a `&`, and the next parameter For example: [http://nationalmap.gov.au#test&map=2d](http://nationalmap.gov.au#test&map=2d) diff --git a/doc/deploying/deploying-terriamap.md b/doc/deploying/deploying-terriamap.md index 8c283832bda..49aaf6b5e30 100644 --- a/doc/deploying/deploying-terriamap.md +++ b/doc/deploying/deploying-terriamap.md @@ -16,11 +16,11 @@ The easiest way to deploy your TerriaMap is to use the included Node.js-based we Then, copy the following files and directories from your local system where you built TerriaMap onto the server: -- `wwwroot` -- `node_modules` (note: this can take a long time, be patient) -- `devserverconfig.json` but rename this to `productionserverconfig.json` (and add any private access keys/passwords/secrets) -- `ecosystem.config.js` -- `ecosystem-production.config.js` +- `wwwroot` +- `node_modules` (note: this can take a long time, be patient) +- `devserverconfig.json` but rename this to `productionserverconfig.json` (and add any private access keys/passwords/secrets) +- `ecosystem.config.js` +- `ecosystem-production.config.js` And on the server, change to the directory where you copied those files and directories and run: diff --git a/doc/deploying/deploying-with-kubernetes.md b/doc/deploying/deploying-with-kubernetes.md index 6977f30bc29..15c9d624116 100644 --- a/doc/deploying/deploying-with-kubernetes.md +++ b/doc/deploying/deploying-with-kubernetes.md @@ -19,23 +19,23 @@ E.g. ```yaml global: - rollingUpdate: - maxUnavailable: 1 - image: - tag: "0.0.1" + rollingUpdate: + maxUnavailable: 1 + image: + tag: "0.0.1" terriamap: - clientConfig: - parameters: - disclaimer: - text: "This is a disclaimer" - serverConfig: - port: 8080 - initConfig: - camera: - north: "1" - east: "2" - south: "3" - west: "4" + clientConfig: + parameters: + disclaimer: + text: "This is a disclaimer" + serverConfig: + port: 8080 + initConfig: + camera: + north: "1" + east: "2" + south: "3" + west: "4" ``` # Building Your Own Image diff --git a/doc/deploying/deprecated-wms-region-mapping.md b/doc/deploying/deprecated-wms-region-mapping.md index 2fba69b96fd..1c0d49acd51 100644 --- a/doc/deploying/deprecated-wms-region-mapping.md +++ b/doc/deploying/deprecated-wms-region-mapping.md @@ -8,17 +8,17 @@ _Region mapping_ is the process of matching a value in a CSV file to a pre-defin ## Prepare the shapefiles -- One shapefile should contain all the polygons. -- There should be a `FID` (case-sensitive) attribute, numbering each polygon starting from 0. If no FID attribute is present, use ogr2ogr to add it: +- One shapefile should contain all the polygons. +- There should be a `FID` (case-sensitive) attribute, numbering each polygon starting from 0. If no FID attribute is present, use ogr2ogr to add it: - `ogr2ogr -f "ESRI Shapefile" precincts-fid.shp precincts.shp -sql 'select FID,* from precincts'` + `ogr2ogr -f "ESRI Shapefile" precincts-fid.shp precincts.shp -sql 'select FID,* from precincts'` - If you have several files to process, use a line like this: + If you have several files to process, use a line like this: - `for i in GCCSA IARE ILOC IREG SOS SOSR SUA UCL; do ogr2ogr -f "ESRI Shapefile" ${i}_2011_AUST_fid.shp ${i}_2011_AUST.shp -sql 'select FID,* from '"${i}_2011_AUST"; done` + `for i in GCCSA IARE ILOC IREG SOS SOSR SUA UCL; do ogr2ogr -f "ESRI Shapefile" ${i}_2011_AUST_fid.shp ${i}_2011_AUST.shp -sql 'select FID,* from '"${i}_2011_AUST"; done` -- There should be an attribute containing the identifiers you wish to match against (eg, for postcode boundaries, a `postcode` attribute containing the 4 digit codes themselves). -- The projection should be EPSG:4326 (unprojected lat/long on WGS84). +- There should be an attribute containing the identifiers you wish to match against (eg, for postcode boundaries, a `postcode` attribute containing the 4 digit codes themselves). +- The projection should be EPSG:4326 (unprojected lat/long on WGS84). ## Set up GeoServer @@ -34,9 +34,9 @@ _Region mapping_ is the process of matching a value in a CSV file to a pre-defin 7. Set these properties: -- Declared SRS: EPSG:4326 -- Click "Compute from data" and "Compute from native bounds" to set the bounding box. -- On the _Publishing_ page, set `region_fid` as the _Default Style_ +- Declared SRS: EPSG:4326 +- Click "Compute from data" and "Compute from native bounds" to set the bounding box. +- On the _Publishing_ page, set `region_fid` as the _Default Style_ ## Configure the regions in your TerriaJS-based map @@ -50,9 +50,9 @@ Modify `wwwroot/data/regionMapping.json`. Add a section like this: "description": "Statistical Area Level 4" }, -- `"SA4"`: this identifier does not serve any machine-readable purpose outside this file. -- `layerName`: the WMS layer of your new regions, including the workspace. -- `server`: the URL of your GeoServer, up to and including `/ows`. -- `regionProp`: the name of the attribute containing region identifiers that will be matched against (case-sensitive) -- `aliases`: alias of CSV column header names that will be recognised as matching this kind of feature. Must be lowercase. -- `description`: May be used in GUI elements and error messages. +- `"SA4"`: this identifier does not serve any machine-readable purpose outside this file. +- `layerName`: the WMS layer of your new regions, including the workspace. +- `server`: the URL of your GeoServer, up to and including `/ows`. +- `regionProp`: the name of the attribute containing region identifiers that will be matched against (case-sensitive) +- `aliases`: alias of CSV column header names that will be recognised as matching this kind of feature. Must be lowercase. +- `description`: May be used in GUI elements and error messages. diff --git a/doc/deploying/running-through-reverse-proxy.md b/doc/deploying/running-through-reverse-proxy.md index 04e45c9d37f..229a0612ff8 100644 --- a/doc/deploying/running-through-reverse-proxy.md +++ b/doc/deploying/running-through-reverse-proxy.md @@ -8,9 +8,9 @@ yarn gulp release --baseHref="/my/terriamap/" This paramter can be passed to any `gulp` "build" task: -- `default` (this runs when you call `gulp` without a task) -- `build` -- `release` -- `watch` +- `default` (this runs when you call `gulp` without a task) +- `build` +- `release` +- `watch` _Note that Terria's server doesn't do any path rewriting. This must be used in conjunction with a reverse proxy which does the path rewriting (so that terriajs-server gets a request for `/index.html` when the browser requests `http://example.com/my/terriamap/index.html`)._ diff --git a/doc/deploying/using-as-a-ckan-previewer.md b/doc/deploying/using-as-a-ckan-previewer.md index afd9b69912b..f3ec3a4f86f 100644 --- a/doc/deploying/using-as-a-ckan-previewer.md +++ b/doc/deploying/using-as-a-ckan-previewer.md @@ -13,12 +13,12 @@ Follow the instructions in the CKAN documentation [here](http://docs.ckan.org/en Install a local instance of CKAN per http://docs.ckan.org/en/ckan-2.0/install-from-source.html Follow all the steps : -- In step 1 install openjdk-7-jdk instead of openjdk-6-jdk -- in step 2c use requirements.txt instead of pip-requirements.txt -- In step 3 making 'pass' your password will makes things simpler -- Set up the optional Solr install as per step 5 (Single Solr instance) -- Step 6 can take a long time. If it does fail drop the ckan_default database and redo step 3 and try again -- You do no need to set up the optional DataStore install as per step 7 +- In step 1 install openjdk-7-jdk instead of openjdk-6-jdk +- in step 2c use requirements.txt instead of pip-requirements.txt +- In step 3 making 'pass' your password will makes things simpler +- Set up the optional Solr install as per step 5 (Single Solr instance) +- Step 6 can take a long time. If it does fail drop the ckan_default database and redo step 3 and try again +- You do no need to set up the optional DataStore install as per step 7 To add local storage of files From 965e610a85c31f988a5d6e649045efd120e26f4a Mon Sep 17 00:00:00 2001 From: Nanda Date: Sun, 22 Jan 2023 09:56:13 +1100 Subject: [PATCH 060/654] Normalize Mixin definitions and remove duplicate Mixins in the inheritance chain. --- lib/Core/AbstractConstructor.ts | 2 +- lib/ModelMixins/AccessControlMixin.ts | 12 ++++----- lib/ModelMixins/AutoRefreshingMixin.ts | 8 +++--- lib/ModelMixins/CatalogFunctionJobMixin.ts | 2 +- lib/ModelMixins/CatalogFunctionMixin.ts | 9 +++---- lib/ModelMixins/CatalogMemberMixin.ts | 8 +++--- lib/ModelMixins/Cesium3dTilesMixin.ts | 8 +++--- lib/ModelMixins/ChartableMixin.ts | 10 +++---- lib/ModelMixins/ClippingMixin.ts | 15 +++-------- lib/ModelMixins/DiffableMixin.ts | 6 +++-- lib/ModelMixins/DiscretelyTimeVaryingMixin.ts | 4 +-- lib/ModelMixins/ExportableMixin.ts | 10 +++---- .../FeatureInfoUrlTemplateMixin.ts | 8 +++--- lib/ModelMixins/GeojsonMixin.ts | 8 +++--- lib/ModelMixins/GetCapabilitiesMixin.ts | 6 ++--- lib/ModelMixins/GltfMixin.ts | 6 ++--- lib/ModelMixins/GroupMixin.ts | 10 ++++--- lib/ModelMixins/MappableMixin.ts | 6 +++-- lib/ModelMixins/MinMaxLevelMixin.ts | 8 +++--- lib/ModelMixins/ReferenceMixin.ts | 9 ++++--- lib/ModelMixins/SearchableItemMixin.ts | 12 ++++----- lib/ModelMixins/ShadowMixin.ts | 4 +-- lib/ModelMixins/TableMixin.ts | 27 +++++++++---------- lib/ModelMixins/TileErrorHandlerMixin.ts | 10 ++++--- lib/ModelMixins/TimeFilterMixin.ts | 7 ++--- lib/ModelMixins/UrlMixin.ts | 8 +++--- lib/ModelMixins/XmlRequestMixin.ts | 8 +++--- .../CatalogItems/ApiTableCatalogItem.ts | 2 +- .../CatalogItems/Cesium3DTilesCatalogItem.ts | 5 +--- .../Catalog/CatalogItems/CsvCatalogItem.ts | 6 ++--- .../Catalog/CatalogItems/GeoRssCatalogItem.ts | 4 +-- .../Catalog/CatalogItems/GpxCatalogItem.ts | 6 +---- .../CatalogItems/OpenDataSoftCatalogItem.ts | 6 ++--- .../CatalogItems/ShapefileCatalogItem.ts | 4 +-- .../CatalogItems/SocrataMapViewCatalogItem.ts | 2 +- .../Esri/ArcGisFeatureServerCatalogItem.ts | 4 +-- .../Esri/ArcGisMapServerCatalogItem.ts | 4 ++- lib/Models/Catalog/Gtfs/GtfsCatalogItem.ts | 4 ++- .../SensorObservationServiceCatalogItem.ts | 2 +- .../Ows/WebFeatureServiceCatalogItem.ts | 2 +- .../Catalog/Ows/WebMapServiceCatalogItem.ts | 9 ++++--- .../WebProcessingServiceCatalogFunction.ts | 19 +++++++------ lib/Models/Catalog/registerCatalogMembers.ts | 1 + .../FunctionParameters/BooleanParameter.ts | 5 +++- .../EnumerationParameter.ts | 5 +++- .../FunctionParameters/FunctionParameter.ts | 2 +- .../FunctionParameters/GeoJsonParameter.ts | 5 +++- .../FunctionParameters/InfoParameter.ts | 5 +++- .../FunctionParameters/RectangleParameter.ts | 5 +++- .../FunctionParameters/RegionParameter.ts | 5 +++- .../Custom/Chart/BottomDockChart.jsx | 2 +- .../Custom/Chart/FeatureInfoPanelChart.jsx | 2 +- package.json | 12 ++++++--- 53 files changed, 190 insertions(+), 169 deletions(-) diff --git a/lib/Core/AbstractConstructor.ts b/lib/Core/AbstractConstructor.ts index ee26a347cb1..666e316abb3 100644 --- a/lib/Core/AbstractConstructor.ts +++ b/lib/Core/AbstractConstructor.ts @@ -1,2 +1,2 @@ -type AbstractConstructor = Function & { prototype: T }; +type AbstractConstructor = abstract new (...args: any[]) => T; export default AbstractConstructor; diff --git a/lib/ModelMixins/AccessControlMixin.ts b/lib/ModelMixins/AccessControlMixin.ts index 721edcf11bc..6ac124fd001 100644 --- a/lib/ModelMixins/AccessControlMixin.ts +++ b/lib/ModelMixins/AccessControlMixin.ts @@ -1,14 +1,12 @@ import { action, computed, observable } from "mobx"; -import Constructor from "../Core/Constructor"; +import AbstractConstructor from "../Core/AbstractConstructor"; import Model, { BaseModel } from "../Models/Definition/Model"; import ModelTraits from "../Traits/ModelTraits"; -type AccessControlModel = Model; +type BaseType = Model; -function AccessControlMixin>( - Base: T -) { - class Klass extends Base { +function AccessControlMixin>(Base: T) { + abstract class _AccessControlMixin extends Base { @observable private _accessType: string | undefined; get hasAccessControlMixin() { @@ -60,7 +58,7 @@ function AccessControlMixin>( } } - return Klass; + return _AccessControlMixin; } namespace AccessControlMixin { diff --git a/lib/ModelMixins/AutoRefreshingMixin.ts b/lib/ModelMixins/AutoRefreshingMixin.ts index 5f8f0452822..c4ce39330ec 100644 --- a/lib/ModelMixins/AutoRefreshingMixin.ts +++ b/lib/ModelMixins/AutoRefreshingMixin.ts @@ -6,17 +6,17 @@ import { reaction } from "mobx"; import { now } from "mobx-utils"; -import Constructor from "../Core/Constructor"; +import AbstractConstructor from "../Core/AbstractConstructor"; import Model from "../Models/Definition/Model"; import AutoRefreshingTraits from "../Traits/TraitsClasses/AutoRefreshingTraits"; import MappableMixin from "./MappableMixin"; -type AutoRefreshing = Model; +type BaseType = Model & MappableMixin.Instance; export default function AutoRefreshingMixin< - T extends Constructor + T extends AbstractConstructor >(Base: T) { - abstract class AutoRefreshingMixin extends MappableMixin(Base) { + abstract class AutoRefreshingMixin extends Base { private autoRefreshDisposer: IReactionDisposer | undefined; private autorunRefreshEnableDisposer: IReactionDisposer | undefined; diff --git a/lib/ModelMixins/CatalogFunctionJobMixin.ts b/lib/ModelMixins/CatalogFunctionJobMixin.ts index 65997dd04e1..9411ca26b30 100644 --- a/lib/ModelMixins/CatalogFunctionJobMixin.ts +++ b/lib/ModelMixins/CatalogFunctionJobMixin.ts @@ -111,7 +111,7 @@ function CatalogFunctionJobMixin< T extends Constructor >(Base: T) { abstract class CatalogFunctionJobMixin extends GroupMixin( - AutoRefreshingMixin(CatalogMemberMixin(Base)) + AutoRefreshingMixin(MappableMixin(CatalogMemberMixin(Base))) ) { constructor(...args: any[]) { super(...args); diff --git a/lib/ModelMixins/CatalogFunctionMixin.ts b/lib/ModelMixins/CatalogFunctionMixin.ts index f1f1019563e..13854446ded 100644 --- a/lib/ModelMixins/CatalogFunctionMixin.ts +++ b/lib/ModelMixins/CatalogFunctionMixin.ts @@ -1,18 +1,17 @@ import { runInAction, toJS } from "mobx"; -import RequestErrorEvent from "terriajs-cesium/Source/Core/RequestErrorEvent"; -import Constructor from "../Core/Constructor"; +import AbstractConstructor from "../Core/AbstractConstructor"; import isDefined from "../Core/isDefined"; import TerriaError from "../Core/TerriaError"; import CommonStrata from "../Models/Definition/CommonStrata"; -import FunctionParameter from "../Models/FunctionParameters/FunctionParameter"; import Model from "../Models/Definition/Model"; +import FunctionParameter from "../Models/FunctionParameters/FunctionParameter"; import CatalogFunctionTraits from "../Traits/TraitsClasses/CatalogFunctionTraits"; import CatalogFunctionJobMixin from "./CatalogFunctionJobMixin"; import CatalogMemberMixin from "./CatalogMemberMixin"; -type CatalogFunctionMixin = Model; +type BaseType = Model; -function CatalogFunctionMixin>( +function CatalogFunctionMixin>( Base: T ) { abstract class CatalogFunctionMixin extends CatalogMemberMixin(Base) { diff --git a/lib/ModelMixins/CatalogMemberMixin.ts b/lib/ModelMixins/CatalogMemberMixin.ts index 51e4cdf723e..7d6fa4b8344 100644 --- a/lib/ModelMixins/CatalogMemberMixin.ts +++ b/lib/ModelMixins/CatalogMemberMixin.ts @@ -1,7 +1,7 @@ import { action, computed, isObservableArray, runInAction, toJS } from "mobx"; import Mustache from "mustache"; +import AbstractConstructor from "../Core/AbstractConstructor"; import AsyncLoader from "../Core/AsyncLoader"; -import Constructor from "../Core/Constructor"; import isDefined from "../Core/isDefined"; import { isJsonObject, isJsonString, JsonObject } from "../Core/Json"; import Result from "../Core/Result"; @@ -19,9 +19,9 @@ import GroupMixin from "./GroupMixin"; import MappableMixin from "./MappableMixin"; import ReferenceMixin from "./ReferenceMixin"; -type CatalogMember = Model; +type BaseType = Model; -function CatalogMemberMixin>(Base: T) { +function CatalogMemberMixin>(Base: T) { abstract class CatalogMemberMixin extends AccessControlMixin(Base) implements SelectableDimensions, ViewingControls @@ -99,7 +99,7 @@ function CatalogMemberMixin>(Base: T) { } @computed - get name(): string | undefined { + get name() { return super.name || this.uniqueId; } diff --git a/lib/ModelMixins/Cesium3dTilesMixin.ts b/lib/ModelMixins/Cesium3dTilesMixin.ts index 46e8792a919..9e490ab45c9 100644 --- a/lib/ModelMixins/Cesium3dTilesMixin.ts +++ b/lib/ModelMixins/Cesium3dTilesMixin.ts @@ -23,7 +23,7 @@ import Cesium3DTileFeature from "terriajs-cesium/Source/Scene/Cesium3DTileFeatur import Cesium3DTilePointFeature from "terriajs-cesium/Source/Scene/Cesium3DTilePointFeature"; import Cesium3DTileset from "terriajs-cesium/Source/Scene/Cesium3DTileset"; import Cesium3DTileStyle from "terriajs-cesium/Source/Scene/Cesium3DTileStyle"; -import Constructor from "../Core/Constructor"; +import AbstractConstructor from "../Core/AbstractConstructor"; import isDefined from "../Core/isDefined"; import { isJsonObject, JsonObject } from "../Core/Json"; import runLater from "../Core/runLater"; @@ -80,9 +80,9 @@ class ObservableCesium3DTileset extends Cesium3DTileset { } } -function Cesium3dTilesMixin>>( - Base: T -) { +type BaseType = Model; + +function Cesium3dTilesMixin>(Base: T) { abstract class Cesium3dTilesMixin extends ClippingMixin( ShadowMixin(MappableMixin(CatalogMemberMixin(Base))) ) { diff --git a/lib/ModelMixins/ChartableMixin.ts b/lib/ModelMixins/ChartableMixin.ts index 69ae4758fe1..9da5b576d1c 100644 --- a/lib/ModelMixins/ChartableMixin.ts +++ b/lib/ModelMixins/ChartableMixin.ts @@ -1,11 +1,9 @@ import { maxBy, minBy } from "lodash-es"; -import Constructor from "../Core/Constructor"; +import AbstractConstructor from "../Core/AbstractConstructor"; import LatLonHeight from "../Core/LatLonHeight"; import Model from "../Models/Definition/Model"; import { GlyphStyle } from "../ReactViews/Custom/Chart/Glyphs"; import ModelTraits from "../Traits/ModelTraits"; -import MappableTraits from "../Traits/TraitsClasses/MappableTraits"; -import MappableMixin from "./MappableMixin"; type Scale = "linear" | "time"; @@ -65,8 +63,10 @@ export interface ChartItem { glyphStyle?: GlyphStyle; } -function ChartableMixin>>(Base: T) { - abstract class ChartableMixin extends MappableMixin(Base) { +type BaseType = Model; + +function ChartableMixin>(Base: T) { + abstract class ChartableMixin extends Base { get isChartable() { return true; } diff --git a/lib/ModelMixins/ClippingMixin.ts b/lib/ModelMixins/ClippingMixin.ts index 26820aaa581..d7ea1a192f3 100644 --- a/lib/ModelMixins/ClippingMixin.ts +++ b/lib/ModelMixins/ClippingMixin.ts @@ -11,7 +11,7 @@ import Transforms from "terriajs-cesium/Source/Core/Transforms"; import CustomDataSource from "terriajs-cesium/Source/DataSources/CustomDataSource"; import ClippingPlane from "terriajs-cesium/Source/Scene/ClippingPlane"; import ClippingPlaneCollection from "terriajs-cesium/Source/Scene/ClippingPlaneCollection"; -import Constructor from "../Core/Constructor"; +import AbstractConstructor from "../Core/AbstractConstructor"; import filterOutUndefined from "../Core/filterOutUndefined"; import BoxDrawing from "../Models/BoxDrawing"; import CommonStrata from "../Models/Definition/CommonStrata"; @@ -25,16 +25,9 @@ import HeadingPitchRollTraits from "../Traits/TraitsClasses/HeadingPitchRollTrai import LatLonHeightTraits from "../Traits/TraitsClasses/LatLonHeightTraits"; type BaseType = Model & SelectableDimensions; -type InstanceType = BaseType & { - clippingPlanesOriginMatrix(): Matrix4; - clippingPlaneCollection: ClippingPlaneCollection | undefined; - clippingMapItems: CustomDataSource[]; -}; -function ClippingMixin>( - Base: T -): T & Constructor { - abstract class MixedClass extends Base implements InstanceType { +function ClippingMixin>(Base: T) { + abstract class ClippingMixin extends Base { private _clippingBoxDrawing?: BoxDrawing; abstract clippingPlanesOriginMatrix(): Matrix4; @@ -359,7 +352,7 @@ function ClippingMixin>( } } - return MixedClass; + return ClippingMixin; } export default ClippingMixin; diff --git a/lib/ModelMixins/DiffableMixin.ts b/lib/ModelMixins/DiffableMixin.ts index e4f8289b48e..86d0b2fa475 100644 --- a/lib/ModelMixins/DiffableMixin.ts +++ b/lib/ModelMixins/DiffableMixin.ts @@ -1,6 +1,6 @@ import { computed } from "mobx"; import JulianDate from "terriajs-cesium/Source/Core/JulianDate"; -import Constructor from "../Core/Constructor"; +import AbstractConstructor from "../Core/AbstractConstructor"; import createStratumInstance from "../Models/Definition/createStratumInstance"; import LoadableStratum from "../Models/Definition/LoadableStratum"; import Model, { BaseModel } from "../Models/Definition/Model"; @@ -56,7 +56,9 @@ class DiffStratum extends LoadableStratum(DiffableTraits) { } } -function DiffableMixin>>(Base: T) { +type BaseType = Model; + +function DiffableMixin>(Base: T) { abstract class DiffableMixin extends TimeFilterMixin(Base) { constructor(...args: any[]) { super(...args); diff --git a/lib/ModelMixins/DiscretelyTimeVaryingMixin.ts b/lib/ModelMixins/DiscretelyTimeVaryingMixin.ts index af65915e2ce..3361c37e0b0 100644 --- a/lib/ModelMixins/DiscretelyTimeVaryingMixin.ts +++ b/lib/ModelMixins/DiscretelyTimeVaryingMixin.ts @@ -3,7 +3,7 @@ import binarySearch from "terriajs-cesium/Source/Core/binarySearch"; import JulianDate from "terriajs-cesium/Source/Core/JulianDate"; import { ChartPoint } from "../Charts/ChartData"; import getChartColorForId from "../Charts/getChartColorForId"; -import Constructor from "../Core/Constructor"; +import AbstractConstructor from "../Core/AbstractConstructor"; import filterOutUndefined from "../Core/filterOutUndefined"; import isDefined from "../Core/isDefined"; import TerriaError from "../Core/TerriaError"; @@ -27,7 +27,7 @@ export interface DiscreteTimeAsJS { } function DiscretelyTimeVaryingMixin< - T extends Constructor> + T extends AbstractConstructor> >(Base: T) { abstract class DiscretelyTimeVaryingMixin extends ChartableMixin(Base) diff --git a/lib/ModelMixins/ExportableMixin.ts b/lib/ModelMixins/ExportableMixin.ts index 0ed03838a03..3e5e18a6dac 100644 --- a/lib/ModelMixins/ExportableMixin.ts +++ b/lib/ModelMixins/ExportableMixin.ts @@ -1,13 +1,13 @@ +import { computed } from "mobx"; +import AbstractConstructor from "../Core/AbstractConstructor"; import Model from "../Models/Definition/Model"; -import Constructor from "../Core/Constructor"; import ExportableTraits from "../Traits/TraitsClasses/ExportableTraits"; -import { computed } from "mobx"; export type ExportData = string | { name: string; file: Blob }; -function ExportableMixin>>( - Base: T -) { +function ExportableMixin< + T extends AbstractConstructor> +>(Base: T) { abstract class ExportableMixin extends Base { protected abstract get _canExportData(): boolean; diff --git a/lib/ModelMixins/FeatureInfoUrlTemplateMixin.ts b/lib/ModelMixins/FeatureInfoUrlTemplateMixin.ts index 4206593e484..cf3f9c3ec45 100644 --- a/lib/ModelMixins/FeatureInfoUrlTemplateMixin.ts +++ b/lib/ModelMixins/FeatureInfoUrlTemplateMixin.ts @@ -5,7 +5,7 @@ import Resource from "terriajs-cesium/Source/Core/Resource"; import ConstantProperty from "terriajs-cesium/Source/DataSources/ConstantProperty"; import PropertyBag from "terriajs-cesium/Source/DataSources/PropertyBag"; import ImageryProvider from "terriajs-cesium/Source/Scene/ImageryProvider"; -import Constructor from "../Core/Constructor"; +import AbstractConstructor from "../Core/AbstractConstructor"; import isDefined from "../Core/isDefined"; import loadJson from "../Core/loadJson"; import proxyCatalogItemUrl from "../Models/Catalog/proxyCatalogItemUrl"; @@ -16,9 +16,11 @@ import FeatureInfoUrlTemplateTraits from "../Traits/TraitsClasses/FeatureInfoTra import MappableMixin from "./MappableMixin"; import TimeVarying from "./TimeVarying"; -type Target = Model; +type BaseType = Model; -function FeatureInfoUrlTemplateMixin>(Base: T) { +function FeatureInfoUrlTemplateMixin>( + Base: T +) { abstract class FeatureInfoUrlTemplateMixin extends Base { get hasFeatureInfoUrlTemplateMixin() { return true; diff --git a/lib/ModelMixins/GeojsonMixin.ts b/lib/ModelMixins/GeojsonMixin.ts index 6912a82e8dc..7715d0c60cb 100644 --- a/lib/ModelMixins/GeojsonMixin.ts +++ b/lib/ModelMixins/GeojsonMixin.ts @@ -56,7 +56,7 @@ import PolygonGraphics from "terriajs-cesium/Source/DataSources/PolygonGraphics" import PolylineGraphics from "terriajs-cesium/Source/DataSources/PolylineGraphics"; import Property from "terriajs-cesium/Source/DataSources/Property"; import HeightReference from "terriajs-cesium/Source/Scene/HeightReference"; -import Constructor from "../Core/Constructor"; +import AbstractConstructor from "../Core/AbstractConstructor"; import filterOutUndefined from "../Core/filterOutUndefined"; import formatPropertyValue from "../Core/formatPropertyValue"; import hashFromString from "../Core/hashFromString"; @@ -217,9 +217,11 @@ interface FeatureCounts { total: number; } -function GeoJsonMixin>>(Base: T) { +type BaseType = Model; + +function GeoJsonMixin>(Base: T) { abstract class GeoJsonMixin extends TableMixin( - FeatureInfoUrlTemplateMixin(UrlMixin(CatalogMemberMixin(Base))) + FeatureInfoUrlTemplateMixin(UrlMixin(Base)) ) { @observable private _dataSource: diff --git a/lib/ModelMixins/GetCapabilitiesMixin.ts b/lib/ModelMixins/GetCapabilitiesMixin.ts index 6b8875bfe02..595123de7b1 100644 --- a/lib/ModelMixins/GetCapabilitiesMixin.ts +++ b/lib/ModelMixins/GetCapabilitiesMixin.ts @@ -1,12 +1,12 @@ import { computed } from "mobx"; -import Constructor from "../Core/Constructor"; +import AbstractConstructor from "../Core/AbstractConstructor"; import Model from "../Models/Definition/Model"; import StratumOrder from "../Models/Definition/StratumOrder"; import GetCapabilitiesTraits from "../Traits/TraitsClasses/GetCapabilitiesTraits"; -type CapabilitiesModel = Model; +type BaseType = Model; -function GetCapabilitiesMixin>( +function GetCapabilitiesMixin>( Base: T ) { abstract class GetCapabilitiesMixin extends Base { diff --git a/lib/ModelMixins/GltfMixin.ts b/lib/ModelMixins/GltfMixin.ts index 3459f5480a7..c08bc824fe6 100644 --- a/lib/ModelMixins/GltfMixin.ts +++ b/lib/ModelMixins/GltfMixin.ts @@ -10,7 +10,7 @@ import CustomDataSource from "terriajs-cesium/Source/DataSources/CustomDataSourc import Entity from "terriajs-cesium/Source/DataSources/Entity"; import ModelGraphics from "terriajs-cesium/Source/DataSources/ModelGraphics"; import HeightReference from "terriajs-cesium/Source/Scene/HeightReference"; -import Constructor from "../Core/Constructor"; +import AbstractConstructor from "../Core/AbstractConstructor"; import proxyCatalogItemUrl from "../Models/Catalog/proxyCatalogItemUrl"; import Model from "../Models/Definition/Model"; import GltfTraits from "../Traits/TraitsClasses/GltfTraits"; @@ -23,7 +23,7 @@ import ShadowMixin from "./ShadowMixin"; // we still maintain the type checking, without TS screaming with errors const Axis: Axis = require("terriajs-cesium/Source/Scene/Axis").default; -type GltfModel = Model; +type BaseType = Model; export interface GltfTransformationJson { origin: { @@ -39,7 +39,7 @@ export interface GltfTransformationJson { scale?: number; } -function GltfMixin>(Base: T) { +function GltfMixin>(Base: T) { abstract class GltfMixin extends ShadowMixin( CatalogMemberMixin(MappableMixin(Base)) ) { diff --git a/lib/ModelMixins/GroupMixin.ts b/lib/ModelMixins/GroupMixin.ts index 4b89ed3159d..e42a2c3a353 100644 --- a/lib/ModelMixins/GroupMixin.ts +++ b/lib/ModelMixins/GroupMixin.ts @@ -2,8 +2,8 @@ import { uniq } from "lodash-es"; import { action, computed, runInAction } from "mobx"; import clone from "terriajs-cesium/Source/Core/clone"; import DeveloperError from "terriajs-cesium/Source/Core/DeveloperError"; +import AbstractConstructor from "../Core/AbstractConstructor"; import AsyncLoader from "../Core/AsyncLoader"; -import Constructor from "../Core/Constructor"; import filterOutUndefined from "../Core/filterOutUndefined"; import flatten from "../Core/flatten"; import isDefined from "../Core/isDefined"; @@ -25,8 +25,10 @@ naturalSort.insensitive = true; const MERGED_GROUP_ID_PREPEND = "__merged__"; -function GroupMixin>>(Base: T) { - abstract class Klass extends Base implements Group { +type BaseType = Model; + +function GroupMixin>(Base: T) { + abstract class _GroupMixin extends Base implements Group { private _memberLoader = new AsyncLoader(this.forceLoadMembers.bind(this)); get isGroup() { @@ -412,7 +414,7 @@ function GroupMixin>>(Base: T) { } } - return Klass; + return _GroupMixin; } namespace GroupMixin { diff --git a/lib/ModelMixins/MappableMixin.ts b/lib/ModelMixins/MappableMixin.ts index 8ad05963e0e..8ab84cd3794 100644 --- a/lib/ModelMixins/MappableMixin.ts +++ b/lib/ModelMixins/MappableMixin.ts @@ -5,8 +5,8 @@ import TerrainProvider from "terriajs-cesium/Source/Core/TerrainProvider"; import DataSource from "terriajs-cesium/Source/DataSources/DataSource"; import Cesium3DTileset from "terriajs-cesium/Source/Scene/Cesium3DTileset"; import ImageryProvider from "terriajs-cesium/Source/Scene/ImageryProvider"; +import AbstractConstructor from "../Core/AbstractConstructor"; import AsyncLoader from "../Core/AsyncLoader"; -import Constructor from "../Core/Constructor"; import Result from "../Core/Result"; import Model from "../Models/Definition/Model"; import MappableTraits from "../Traits/TraitsClasses/MappableTraits"; @@ -60,7 +60,9 @@ export function isDataSource(object: MapItem): object is DataSource { return "entities" in object; } -function MappableMixin>>(Base: T) { +type BaseType = Model; + +function MappableMixin>(Base: T) { abstract class MappableMixin extends Base { initialMessageShown: boolean = false; get isMappable() { diff --git a/lib/ModelMixins/MinMaxLevelMixin.ts b/lib/ModelMixins/MinMaxLevelMixin.ts index 73bbd816977..b3926df615c 100644 --- a/lib/ModelMixins/MinMaxLevelMixin.ts +++ b/lib/ModelMixins/MinMaxLevelMixin.ts @@ -1,15 +1,15 @@ import { observable } from "mobx"; import ImageryProvider from "terriajs-cesium/Source/Scene/ImageryProvider"; -import Constructor from "../Core/Constructor"; +import AbstractConstructor from "../Core/AbstractConstructor"; import isDefined from "../Core/isDefined"; import Model from "../Models/Definition/Model"; import { scaleDenominatorToLevel } from "./../Core/scaleToDenominator"; import CommonStrata from "./../Models/Definition/CommonStrata"; import { MinMaxLevelTraits } from "./../Traits/TraitsClasses/MinMaxLevelTraits"; -function MinMaxLevelMixin>>( - Base: T -) { +type BaseType = Model; + +function MinMaxLevelMixin>(Base: T) { abstract class MinMaxLevelMixin extends Base { @observable notVisible: boolean = false; diff --git a/lib/ModelMixins/ReferenceMixin.ts b/lib/ModelMixins/ReferenceMixin.ts index 148c39ba9e3..1f444710f34 100644 --- a/lib/ModelMixins/ReferenceMixin.ts +++ b/lib/ModelMixins/ReferenceMixin.ts @@ -1,7 +1,7 @@ import { computed, observable, runInAction, untracked } from "mobx"; import DeveloperError from "terriajs-cesium/Source/Core/DeveloperError"; +import AbstractConstructor from "../Core/AbstractConstructor"; import AsyncLoader from "../Core/AsyncLoader"; -import Constructor from "../Core/Constructor"; import Result from "../Core/Result"; import Model, { BaseModel, ModelInterface } from "../Models/Definition/Model"; import ReferenceTraits from "../Traits/TraitsClasses/ReferenceTraits"; @@ -13,6 +13,9 @@ interface ReferenceInterface extends ModelInterface { readonly target: BaseModel | undefined; loadReference(): Promise>; } + +type BaseType = Model; + /** * A mixin for a Model that acts as a "reference" to another Model, which is its "true" * representation. The reference is "dereferenced" to obtain the other model, but only @@ -21,9 +24,7 @@ interface ReferenceInterface extends ModelInterface { * loaded, the `CkanCatalogItem` may be dereferenced to obtain the `WebMapServiceCatalogItem`, * `GeoJsonCatalogItem`, or whatever else representing the dataset. */ -function ReferenceMixin>>( - Base: T -) { +function ReferenceMixin>(Base: T) { abstract class ReferenceMixinClass extends Base implements ReferenceInterface diff --git a/lib/ModelMixins/SearchableItemMixin.ts b/lib/ModelMixins/SearchableItemMixin.ts index 14cdeaa1e06..3936bb59c42 100644 --- a/lib/ModelMixins/SearchableItemMixin.ts +++ b/lib/ModelMixins/SearchableItemMixin.ts @@ -1,14 +1,14 @@ import { action, computed } from "mobx"; -import Constructor from "../Core/Constructor"; +import AbstractConstructor from "../Core/AbstractConstructor"; +import Model from "../Models/Definition/Model"; import ItemSearchProvider, { ItemSearchResult } from "../Models/ItemSearchProviders/ItemSearchProvider"; import { ItemSearchProviders } from "../Models/ItemSearchProviders/ItemSearchProviders"; -import Model from "../Models/Definition/Model"; import MappableTraits from "../Traits/TraitsClasses/MappableTraits"; import SearchableItemTraits from "../Traits/TraitsClasses/SearchableItemTraits"; -type MixinModel = Model; +type BaseType = Model; export type ItemSelectionDisposer = () => void; @@ -16,8 +16,8 @@ export type ItemSelectionDisposer = () => void; * This mixin adds capability for searching a catalog item using an {@link * ItemSearchProvider}. */ -function SearchableItemMixin>(Base: T) { - abstract class Klass extends Base { +function SearchableItemMixin>(Base: T) { + abstract class SearchableItemMixin extends Base { readonly hasSearchableItemMixin = true; /** @@ -66,7 +66,7 @@ function SearchableItemMixin>(Base: T) { return new klass(this.search.providerOptions, this.search.parameters); } } - return Klass; + return SearchableItemMixin; } namespace SearchableItemMixin { diff --git a/lib/ModelMixins/ShadowMixin.ts b/lib/ModelMixins/ShadowMixin.ts index 3df090cd5c4..3e409f50772 100644 --- a/lib/ModelMixins/ShadowMixin.ts +++ b/lib/ModelMixins/ShadowMixin.ts @@ -1,7 +1,7 @@ import i18next from "i18next"; import { computed, runInAction } from "mobx"; import ShadowMode from "terriajs-cesium/Source/Scene/ShadowMode"; -import Constructor from "../Core/Constructor"; +import AbstractConstructor from "../Core/AbstractConstructor"; import Model from "../Models/Definition/Model"; import SelectableDimensions, { SelectableDimension @@ -10,7 +10,7 @@ import ShadowTraits from "../Traits/TraitsClasses/ShadowTraits"; type BaseType = Model & SelectableDimensions; -function ShadowMixin>(Base: T) { +function ShadowMixin>(Base: T) { abstract class ShadowMixin extends Base { get hasShadows() { return true; diff --git a/lib/ModelMixins/TableMixin.ts b/lib/ModelMixins/TableMixin.ts index 5a462aa3860..b8175ef221d 100644 --- a/lib/ModelMixins/TableMixin.ts +++ b/lib/ModelMixins/TableMixin.ts @@ -1,11 +1,5 @@ import i18next from "i18next"; -import { - action, - computed, - isObservableArray, - observable, - runInAction -} from "mobx"; +import { action, computed, observable, runInAction } from "mobx"; import { createTransformer, ITransformer } from "mobx-utils"; import DeveloperError from "terriajs-cesium/Source/Core/DeveloperError"; import JulianDate from "terriajs-cesium/Source/Core/JulianDate"; @@ -14,7 +8,7 @@ import DataSource from "terriajs-cesium/Source/DataSources/DataSource"; import ImageryProvider from "terriajs-cesium/Source/Scene/ImageryProvider"; import { ChartPoint } from "../Charts/ChartData"; import getChartColorForId from "../Charts/getChartColorForId"; -import Constructor from "../Core/Constructor"; +import AbstractConstructor from "../Core/AbstractConstructor"; import filterOutUndefined from "../Core/filterOutUndefined"; import flatten from "../Core/flatten"; import isDefined from "../Core/isDefined"; @@ -50,16 +44,16 @@ import TableStyle from "../Table/TableStyle"; import TableTraits from "../Traits/TraitsClasses/Table/TableTraits"; import CatalogMemberMixin from "./CatalogMemberMixin"; import { calculateDomain, ChartAxis, ChartItem } from "./ChartableMixin"; -import DiscretelyTimeVaryingMixin, { - DiscreteTimeAsJS -} from "./DiscretelyTimeVaryingMixin"; +import DiscretelyTimeVaryingMixin from "./DiscretelyTimeVaryingMixin"; import ExportableMixin, { ExportData } from "./ExportableMixin"; -import { ImageryParts } from "./MappableMixin"; +import MappableMixin, { ImageryParts } from "./MappableMixin"; -function TableMixin>>(Base: T) { +type BaseType = Model; + +function TableMixin>(Base: T) { abstract class TableMixin extends ExportableMixin( - DiscretelyTimeVaryingMixin(CatalogMemberMixin(Base)) + DiscretelyTimeVaryingMixin(MappableMixin(CatalogMemberMixin(Base))) ) implements SelectableDimensions, ViewingControls, FeatureInfoContext { @@ -235,6 +229,11 @@ function TableMixin>>(Base: T) { }); } + @computed + get name() { + return super.name; + } + @computed get disableZoomTo() { // Disable zoom if only showing imagery parts (eg region mapping) and no rectangle is defined diff --git a/lib/ModelMixins/TileErrorHandlerMixin.ts b/lib/ModelMixins/TileErrorHandlerMixin.ts index 15ba4357540..4a712020f5b 100644 --- a/lib/ModelMixins/TileErrorHandlerMixin.ts +++ b/lib/ModelMixins/TileErrorHandlerMixin.ts @@ -6,7 +6,7 @@ import Rectangle from "terriajs-cesium/Source/Core/Rectangle"; import Resource from "terriajs-cesium/Source/Core/Resource"; import TileProviderError from "terriajs-cesium/Source/Core/TileProviderError"; import ImageryProvider from "terriajs-cesium/Source/Scene/ImageryProvider"; -import Constructor from "../Core/Constructor"; +import AbstractConstructor from "../Core/AbstractConstructor"; import TerriaError from "../Core/TerriaError"; import getUrlForImageryTile from "../Map/ImageryProvider/getUrlForImageryTile"; import { ProviderCoords } from "../Map/PickedFeatures/PickedFeatures"; @@ -28,8 +28,10 @@ type ModelType = Model< * A mixin for handling tile errors in raster layers * */ -function TileErrorHandlerMixin>(Base: T) { - abstract class Klass extends Base { +function TileErrorHandlerMixin>( + Base: T +) { + abstract class TileErrorHandlerMixin extends Base { tileFailures = 0; private readonly tileRetriesByMap: Map = new Map(); @@ -362,7 +364,7 @@ function TileErrorHandlerMixin>(Base: T) { return intersection === undefined; } - return Klass; + return TileErrorHandlerMixin; } namespace TileErrorHandlerMixin { diff --git a/lib/ModelMixins/TimeFilterMixin.ts b/lib/ModelMixins/TimeFilterMixin.ts index a78f261c1b7..30139c5a618 100644 --- a/lib/ModelMixins/TimeFilterMixin.ts +++ b/lib/ModelMixins/TimeFilterMixin.ts @@ -3,6 +3,7 @@ import Ellipsoid from "terriajs-cesium/Source/Core/Ellipsoid"; import JulianDate from "terriajs-cesium/Source/Core/JulianDate"; import CesiumMath from "terriajs-cesium/Source/Core/Math"; import Entity from "terriajs-cesium/Source/DataSources/Entity"; +import AbstractConstructor from "../Core/AbstractConstructor"; import Constructor from "../Core/Constructor"; import filterOutUndefined from "../Core/filterOutUndefined"; import LatLonHeight from "../Core/LatLonHeight"; @@ -21,6 +22,8 @@ import DiscretelyTimeVaryingMixin from "./DiscretelyTimeVaryingMixin"; import MappableMixin, { ImageryParts } from "./MappableMixin"; import TimeVarying from "./TimeVarying"; +type BaseType = Model; + /** * A Mixin for filtering the dates for which imagery is available at a location * picked by the user @@ -31,9 +34,7 @@ import TimeVarying from "./TimeVarying"; * Mixin is used to implement the Location filter feature for Satellite * Imagery. */ -function TimeFilterMixin>>( - Base: T -) { +function TimeFilterMixin>(Base: T) { abstract class TimeFilterMixin extends DiscretelyTimeVaryingMixin(Base) { @observable _currentTimeFilterFeature?: Entity; diff --git a/lib/ModelMixins/UrlMixin.ts b/lib/ModelMixins/UrlMixin.ts index ef488d9ff53..049a2626310 100644 --- a/lib/ModelMixins/UrlMixin.ts +++ b/lib/ModelMixins/UrlMixin.ts @@ -1,13 +1,13 @@ import { computed } from "mobx"; import URI from "urijs"; -import Constructor from "../Core/Constructor"; +import AbstractConstructor from "../Core/AbstractConstructor"; import Model from "../Models/Definition/Model"; import UrlTraits from "../Traits/TraitsClasses/UrlTraits"; -type UrlModel = Model; +type BaseType = Model; -function UrlMixin>(Base: T) { - class UrlMixin extends Base { +function UrlMixin>(Base: T) { + abstract class UrlMixin extends Base { get hasUrlMixin() { return true; } diff --git a/lib/ModelMixins/XmlRequestMixin.ts b/lib/ModelMixins/XmlRequestMixin.ts index 572174e9827..6bd29d3c32a 100644 --- a/lib/ModelMixins/XmlRequestMixin.ts +++ b/lib/ModelMixins/XmlRequestMixin.ts @@ -1,12 +1,14 @@ import URI from "urijs"; -import Constructor from "../Core/Constructor"; +import AbstractConstructor from "../Core/AbstractConstructor"; import isDefined from "../Core/isDefined"; const loadXML = require("../Core/loadXML"); const loadWithXhr = require("../Core/loadWithXhr"); -export default function XmlRequestMixin>(Base: T) { - class XmlRequestMixin extends Base { +export default function XmlRequestMixin>( + Base: T +) { + abstract class XmlRequestMixin extends Base { getXml(url: string, parameters?: any) { if (isDefined(parameters)) { url = new URI(url).query(parameters).toString(); diff --git a/lib/Models/Catalog/CatalogItems/ApiTableCatalogItem.ts b/lib/Models/Catalog/CatalogItems/ApiTableCatalogItem.ts index 8b8484cf099..04518f37f2a 100644 --- a/lib/Models/Catalog/CatalogItems/ApiTableCatalogItem.ts +++ b/lib/Models/Catalog/CatalogItems/ApiTableCatalogItem.ts @@ -58,7 +58,7 @@ StratumOrder.addLoadStratum(ApiTableStratum.stratumName); * single API to get positions from. */ export class ApiTableCatalogItem extends AutoRefreshingMixin( - TableMixin(CatalogMemberMixin(CreateModel(ApiTableCatalogItemTraits))) + TableMixin(CreateModel(ApiTableCatalogItemTraits)) ) { static readonly type = "api-table"; diff --git a/lib/Models/Catalog/CatalogItems/Cesium3DTilesCatalogItem.ts b/lib/Models/Catalog/CatalogItems/Cesium3DTilesCatalogItem.ts index c4c3e571892..731d79aa759 100644 --- a/lib/Models/Catalog/CatalogItems/Cesium3DTilesCatalogItem.ts +++ b/lib/Models/Catalog/CatalogItems/Cesium3DTilesCatalogItem.ts @@ -8,7 +8,6 @@ import Cesium3DTile from "terriajs-cesium/Source/Scene/Cesium3DTile"; import Cesium3DTileFeature from "terriajs-cesium/Source/Scene/Cesium3DTileFeature"; import Cesium3DTileset from "terriajs-cesium/Source/Scene/Cesium3DTileset"; import PickedFeatures from "../../../Map/PickedFeatures/PickedFeatures"; -import CatalogMemberMixin from "../../../ModelMixins/CatalogMemberMixin"; import Cesium3dTilesMixin from "../../../ModelMixins/Cesium3dTilesMixin"; import FeatureInfoUrlTemplateMixin from "../../../ModelMixins/FeatureInfoUrlTemplateMixin"; import SearchableItemMixin, { @@ -23,9 +22,7 @@ const SEARCH_RESULT_TAG = "terriajs_search_result"; export default class Cesium3DTilesCatalogItem extends SearchableItemMixin( FeatureInfoUrlTemplateMixin( - Cesium3dTilesMixin( - CatalogMemberMixin(CreateModel(Cesium3DTilesCatalogItemTraits)) - ) + Cesium3dTilesMixin(CreateModel(Cesium3DTilesCatalogItemTraits)) ) ) { static readonly type = "3d-tiles"; diff --git a/lib/Models/Catalog/CatalogItems/CsvCatalogItem.ts b/lib/Models/Catalog/CatalogItems/CsvCatalogItem.ts index 424263abe19..4322a43f9a9 100644 --- a/lib/Models/Catalog/CatalogItems/CsvCatalogItem.ts +++ b/lib/Models/Catalog/CatalogItems/CsvCatalogItem.ts @@ -27,10 +27,8 @@ import proxyCatalogItemUrl from "../proxyCatalogItemUrl"; // - points, no ID, time -> "blips" with a duration (perhaps provided by another column) // export default class CsvCatalogItem - extends TableMixin( - AutoRefreshingMixin( - UrlMixin(CatalogMemberMixin(CreateModel(CsvCatalogItemTraits))) - ) + extends AutoRefreshingMixin( + TableMixin(UrlMixin(CreateModel(CsvCatalogItemTraits))) ) implements HasLocalData { diff --git a/lib/Models/Catalog/CatalogItems/GeoRssCatalogItem.ts b/lib/Models/Catalog/CatalogItems/GeoRssCatalogItem.ts index 81a8d87a362..c1620c4a098 100644 --- a/lib/Models/Catalog/CatalogItems/GeoRssCatalogItem.ts +++ b/lib/Models/Catalog/CatalogItems/GeoRssCatalogItem.ts @@ -124,9 +124,7 @@ class GeoRssStratum extends LoadableStratum(GeoRssCatalogItemTraits) { StratumOrder.addLoadStratum(GeoRssStratum.stratumName); export default class GeoRssCatalogItem - extends GeoJsonMixin( - UrlMixin(CatalogMemberMixin(CreateModel(GeoRssCatalogItemTraits))) - ) + extends GeoJsonMixin(CreateModel(GeoRssCatalogItemTraits)) implements HasLocalData { static readonly type = "georss"; diff --git a/lib/Models/Catalog/CatalogItems/GpxCatalogItem.ts b/lib/Models/Catalog/CatalogItems/GpxCatalogItem.ts index 2b150537902..f3db2afff1a 100644 --- a/lib/Models/Catalog/CatalogItems/GpxCatalogItem.ts +++ b/lib/Models/Catalog/CatalogItems/GpxCatalogItem.ts @@ -5,20 +5,16 @@ import isDefined from "../../../Core/isDefined"; import loadText from "../../../Core/loadText"; import readText from "../../../Core/readText"; import { networkRequestError } from "../../../Core/TerriaError"; -import CatalogMemberMixin from "../../../ModelMixins/CatalogMemberMixin"; import GeoJsonMixin, { FeatureCollectionWithCrs } from "../../../ModelMixins/GeojsonMixin"; -import UrlMixin from "../../../ModelMixins/UrlMixin"; import GpxCatalogItemTraits from "../../../Traits/TraitsClasses/GpxCatalogItemTraits"; import CreateModel from "../../Definition/CreateModel"; import proxyCatalogItemUrl from "../proxyCatalogItemUrl"; const toGeoJSON = require("@mapbox/togeojson"); -class GpxCatalogItem extends GeoJsonMixin( - UrlMixin(CatalogMemberMixin(CreateModel(GpxCatalogItemTraits))) -) { +class GpxCatalogItem extends GeoJsonMixin(CreateModel(GpxCatalogItemTraits)) { static readonly type = "gpx"; get type() { diff --git a/lib/Models/Catalog/CatalogItems/OpenDataSoftCatalogItem.ts b/lib/Models/Catalog/CatalogItems/OpenDataSoftCatalogItem.ts index 1f1be143c5e..d9cf67064c2 100644 --- a/lib/Models/Catalog/CatalogItems/OpenDataSoftCatalogItem.ts +++ b/lib/Models/Catalog/CatalogItems/OpenDataSoftCatalogItem.ts @@ -533,10 +533,8 @@ function getTimeField(dataset: Dataset) { StratumOrder.addLoadStratum(OpenDataSoftDatasetStratum.stratumName); export default class OpenDataSoftCatalogItem - extends TableMixin( - AutoRefreshingMixin( - UrlMixin(CatalogMemberMixin(CreateModel(OpenDataSoftCatalogItemTraits))) - ) + extends AutoRefreshingMixin( + TableMixin(UrlMixin(CreateModel(OpenDataSoftCatalogItemTraits))) ) implements SelectableDimensions { diff --git a/lib/Models/Catalog/CatalogItems/ShapefileCatalogItem.ts b/lib/Models/Catalog/CatalogItems/ShapefileCatalogItem.ts index d439d321c03..d513443ca08 100644 --- a/lib/Models/Catalog/CatalogItems/ShapefileCatalogItem.ts +++ b/lib/Models/Catalog/CatalogItems/ShapefileCatalogItem.ts @@ -28,9 +28,7 @@ export function isJsonArrayOrDeepArrayOfObjects( } class ShapefileCatalogItem - extends GeoJsonMixin( - CatalogMemberMixin(CreateModel(ShapefileCatalogItemTraits)) - ) + extends GeoJsonMixin(CreateModel(ShapefileCatalogItemTraits)) implements HasLocalData { static readonly type = "shp"; diff --git a/lib/Models/Catalog/CatalogItems/SocrataMapViewCatalogItem.ts b/lib/Models/Catalog/CatalogItems/SocrataMapViewCatalogItem.ts index 671bfd0fb18..2d292f0a6df 100644 --- a/lib/Models/Catalog/CatalogItems/SocrataMapViewCatalogItem.ts +++ b/lib/Models/Catalog/CatalogItems/SocrataMapViewCatalogItem.ts @@ -132,7 +132,7 @@ StratumOrder.addLoadStratum(SocrataMapViewStratum.stratumName); * This mimics how Socrata portal map visualisation works - it isn't an official API */ export default class SocrataMapViewCatalogItem extends GeoJsonMixin( - CatalogMemberMixin(CreateModel(SocrataMapViewCatalogItemTraits)) + CreateModel(SocrataMapViewCatalogItemTraits) ) { static readonly type = "socrata-map-item"; diff --git a/lib/Models/Catalog/Esri/ArcGisFeatureServerCatalogItem.ts b/lib/Models/Catalog/Esri/ArcGisFeatureServerCatalogItem.ts index 972c113f1a1..705d22f8d76 100644 --- a/lib/Models/Catalog/Esri/ArcGisFeatureServerCatalogItem.ts +++ b/lib/Models/Catalog/Esri/ArcGisFeatureServerCatalogItem.ts @@ -464,9 +464,7 @@ class FeatureServerStratum extends LoadableStratum( StratumOrder.addLoadStratum(FeatureServerStratum.stratumName); export default class ArcGisFeatureServerCatalogItem extends GeoJsonMixin( - UrlMixin( - CatalogMemberMixin(CreateModel(ArcGisFeatureServerCatalogItemTraits)) - ) + CreateModel(ArcGisFeatureServerCatalogItemTraits) ) { static readonly type = "esri-featureServer"; diff --git a/lib/Models/Catalog/Esri/ArcGisMapServerCatalogItem.ts b/lib/Models/Catalog/Esri/ArcGisMapServerCatalogItem.ts index ee6f8afd418..31b42185954 100644 --- a/lib/Models/Catalog/Esri/ArcGisMapServerCatalogItem.ts +++ b/lib/Models/Catalog/Esri/ArcGisMapServerCatalogItem.ts @@ -364,7 +364,9 @@ StratumOrder.addLoadStratum(MapServerStratum.stratumName); export default class ArcGisMapServerCatalogItem extends UrlMixin( DiscretelyTimeVaryingMixin( MinMaxLevelMixin( - CatalogMemberMixin(CreateModel(ArcGisMapServerCatalogItemTraits)) + CatalogMemberMixin( + MappableMixin(CreateModel(ArcGisMapServerCatalogItemTraits)) + ) ) ) ) { diff --git a/lib/Models/Catalog/Gtfs/GtfsCatalogItem.ts b/lib/Models/Catalog/Gtfs/GtfsCatalogItem.ts index 736c023ccff..0e5521a986c 100644 --- a/lib/Models/Catalog/Gtfs/GtfsCatalogItem.ts +++ b/lib/Models/Catalog/Gtfs/GtfsCatalogItem.ts @@ -84,7 +84,9 @@ StratumOrder.addLoadStratum(GtfsStratum.stratumName); */ export default class GtfsCatalogItem extends MappableMixin( UrlMixin( - AutoRefreshingMixin(CatalogMemberMixin(CreateModel(GtfsCatalogItemTraits))) + AutoRefreshingMixin( + MappableMixin(CatalogMemberMixin(CreateModel(GtfsCatalogItemTraits))) + ) ) ) { disposer: IReactionDisposer | undefined; diff --git a/lib/Models/Catalog/Ows/SensorObservationServiceCatalogItem.ts b/lib/Models/Catalog/Ows/SensorObservationServiceCatalogItem.ts index 99ca2ca49a9..3a519ea04d7 100644 --- a/lib/Models/Catalog/Ows/SensorObservationServiceCatalogItem.ts +++ b/lib/Models/Catalog/Ows/SensorObservationServiceCatalogItem.ts @@ -304,7 +304,7 @@ class GetObservationRequest { } export default class SensorObservationServiceCatalogItem extends TableMixin( - CatalogMemberMixin(CreateModel(SensorObservationServiceCatalogItemTraits)) + CreateModel(SensorObservationServiceCatalogItemTraits) ) { static readonly type = "sos"; static defaultRequestTemplate = require("./SensorObservationServiceRequestTemplate.xml"); diff --git a/lib/Models/Catalog/Ows/WebFeatureServiceCatalogItem.ts b/lib/Models/Catalog/Ows/WebFeatureServiceCatalogItem.ts index b0a399d2b79..c9741bf9019 100644 --- a/lib/Models/Catalog/Ows/WebFeatureServiceCatalogItem.ts +++ b/lib/Models/Catalog/Ows/WebFeatureServiceCatalogItem.ts @@ -303,7 +303,7 @@ export class GetCapabilitiesStratum extends LoadableStratum( } class WebFeatureServiceCatalogItem extends GetCapabilitiesMixin( - UrlMixin(GeoJsonMixin(CreateModel(WebFeatureServiceCatalogItemTraits))) + GeoJsonMixin(CreateModel(WebFeatureServiceCatalogItemTraits)) ) { /** * The collection of strings that indicate an Abstract property should be ignored. If these strings occur anywhere diff --git a/lib/Models/Catalog/Ows/WebMapServiceCatalogItem.ts b/lib/Models/Catalog/Ows/WebMapServiceCatalogItem.ts index 1873a104e56..2b44019d1f1 100644 --- a/lib/Models/Catalog/Ows/WebMapServiceCatalogItem.ts +++ b/lib/Models/Catalog/Ows/WebMapServiceCatalogItem.ts @@ -23,11 +23,12 @@ import TerriaError from "../../../Core/TerriaError"; import CatalogMemberMixin, { getName } from "../../../ModelMixins/CatalogMemberMixin"; -import ChartableMixin from "../../../ModelMixins/ChartableMixin"; import DiffableMixin from "../../../ModelMixins/DiffableMixin"; import ExportWebCoverageServiceMixin from "../../../ModelMixins/ExportWebCoverageServiceMixin"; import GetCapabilitiesMixin from "../../../ModelMixins/GetCapabilitiesMixin"; -import { ImageryParts } from "../../../ModelMixins/MappableMixin"; +import MappableMixin, { + ImageryParts +} from "../../../ModelMixins/MappableMixin"; import MinMaxLevelMixin from "../../../ModelMixins/MinMaxLevelMixin"; import TileErrorHandlerMixin from "../../../ModelMixins/TileErrorHandlerMixin"; import UrlMixin from "../../../ModelMixins/UrlMixin"; @@ -83,7 +84,9 @@ class WebMapServiceCatalogItem MinMaxLevelMixin( GetCapabilitiesMixin( UrlMixin( - CatalogMemberMixin(CreateModel(WebMapServiceCatalogItemTraits)) + MappableMixin( + CatalogMemberMixin(CreateModel(WebMapServiceCatalogItemTraits)) + ) ) ) ) diff --git a/lib/Models/Catalog/Ows/WebProcessingServiceCatalogFunction.ts b/lib/Models/Catalog/Ows/WebProcessingServiceCatalogFunction.ts index 9c684df4fdb..6208f0e65da 100644 --- a/lib/Models/Catalog/Ows/WebProcessingServiceCatalogFunction.ts +++ b/lib/Models/Catalog/Ows/WebProcessingServiceCatalogFunction.ts @@ -85,7 +85,7 @@ export type WpsInputData = { type ParameterConverter = { inputToParameter: ( - catalogFunction: CatalogFunctionMixin, + catalogFunction: CatalogFunctionMixin.Instance, input: Input, options: FunctionParameterOptions ) => FunctionParameter | undefined; @@ -291,7 +291,10 @@ export default class WebProcessingServiceCatalogFunction extends XmlRequestMixin return job; } - convertInputToParameter(catalogFunction: CatalogFunctionMixin, input: Input) { + convertInputToParameter( + catalogFunction: CatalogFunctionMixin.Instance, + input: Input + ) { if (!isDefined(input.Identifier)) { return; } @@ -335,7 +338,7 @@ export default class WebProcessingServiceCatalogFunction extends XmlRequestMixin const LiteralDataConverter = { inputToParameter: function ( - catalogFunction: CatalogFunctionMixin, + catalogFunction: CatalogFunctionMixin.Instance, input: Input, options: FunctionParameterOptions ) { @@ -408,7 +411,7 @@ const LiteralDataConverter = { const ComplexDateConverter = { inputToParameter: function ( - catalogFunction: CatalogFunctionMixin, + catalogFunction: CatalogFunctionMixin.Instance, input: Input, options: FunctionParameterOptions ) { @@ -441,7 +444,7 @@ const ComplexDateConverter = { const ComplexDateTimeConverter = { inputToParameter: function ( - catalogFunction: CatalogFunctionMixin, + catalogFunction: CatalogFunctionMixin.Instance, input: Input, options: FunctionParameterOptions ) { @@ -484,7 +487,7 @@ const PolygonConverter = simpleGeoJsonDataConverter( const RectangleConverter = { inputToParameter: function ( - catalogFunction: CatalogFunctionMixin, + catalogFunction: CatalogFunctionMixin.Instance, input: Input, options: FunctionParameterOptions ) { @@ -573,7 +576,7 @@ const RectangleConverter = { const GeoJsonGeometryConverter = { inputToParameter: function ( - catalogFunction: CatalogFunctionMixin, + catalogFunction: CatalogFunctionMixin.Instance, input: Input, options: FunctionParameterOptions ) { @@ -624,7 +627,7 @@ const GeoJsonGeometryConverter = { function simpleGeoJsonDataConverter(schemaType: string, klass: any) { return { inputToParameter: function ( - catalogFunction: CatalogFunctionMixin, + catalogFunction: CatalogFunctionMixin.Instance, input: Input, options: FunctionParameterOptions ) { diff --git a/lib/Models/Catalog/registerCatalogMembers.ts b/lib/Models/Catalog/registerCatalogMembers.ts index 3dd899be7bf..f6ffa854679 100644 --- a/lib/Models/Catalog/registerCatalogMembers.ts +++ b/lib/Models/Catalog/registerCatalogMembers.ts @@ -1,3 +1,4 @@ +import { uniq } from "lodash-es"; import YDYRCatalogFunction from "./CatalogFunctions/YDYRCatalogFunction"; import YDYRCatalogFunctionJob from "./CatalogFunctions/YDYRCatalogFunctionJob"; import CatalogGroup from "./CatalogGroup"; diff --git a/lib/Models/FunctionParameters/BooleanParameter.ts b/lib/Models/FunctionParameters/BooleanParameter.ts index 9aab3b9388e..04eb52f6118 100644 --- a/lib/Models/FunctionParameters/BooleanParameter.ts +++ b/lib/Models/FunctionParameters/BooleanParameter.ts @@ -36,7 +36,10 @@ export default class BooleanParameter ); } - constructor(catalogFunction: CatalogFunctionMixin, options: Options) { + constructor( + catalogFunction: CatalogFunctionMixin.Instance, + options: Options + ) { super(catalogFunction, options); this.trueName = options.trueName; this.trueDescription = options.trueDescription; diff --git a/lib/Models/FunctionParameters/EnumerationParameter.ts b/lib/Models/FunctionParameters/EnumerationParameter.ts index c21b6dee939..f57c6c34ea3 100644 --- a/lib/Models/FunctionParameters/EnumerationParameter.ts +++ b/lib/Models/FunctionParameters/EnumerationParameter.ts @@ -18,7 +18,10 @@ export default class EnumerationParameter extends FunctionParameter { @observable readonly options: EnumDimensionOption[]; - constructor(catalogFunction: CatalogFunctionMixin, options: Options) { + constructor( + catalogFunction: CatalogFunctionMixin.Instance, + options: Options + ) { super(catalogFunction, options); this.options = options.options; diff --git a/lib/Models/FunctionParameters/FunctionParameter.ts b/lib/Models/FunctionParameters/FunctionParameter.ts index 8f6122806f1..ba03a1ab458 100644 --- a/lib/Models/FunctionParameters/FunctionParameter.ts +++ b/lib/Models/FunctionParameters/FunctionParameter.ts @@ -23,7 +23,7 @@ export default abstract class FunctionParameter< readonly isRequired: boolean; constructor( - protected readonly catalogFunction: CatalogFunctionMixin, + protected readonly catalogFunction: CatalogFunctionMixin.Instance, options: Options ) { this.id = options.id; diff --git a/lib/Models/FunctionParameters/GeoJsonParameter.ts b/lib/Models/FunctionParameters/GeoJsonParameter.ts index e606b5e9c40..3e8b0240581 100644 --- a/lib/Models/FunctionParameters/GeoJsonParameter.ts +++ b/lib/Models/FunctionParameters/GeoJsonParameter.ts @@ -48,7 +48,10 @@ export default class GeoJsonParameter readonly regionParameter: RegionParameter; - constructor(catalogFunction: CatalogFunctionMixin, options: Options) { + constructor( + catalogFunction: CatalogFunctionMixin.Instance, + options: Options + ) { super(catalogFunction, options); this.regionParameter = options.regionParameter; } diff --git a/lib/Models/FunctionParameters/InfoParameter.ts b/lib/Models/FunctionParameters/InfoParameter.ts index 2a5c7a11030..84bd9c467a8 100644 --- a/lib/Models/FunctionParameters/InfoParameter.ts +++ b/lib/Models/FunctionParameters/InfoParameter.ts @@ -20,7 +20,10 @@ export default class InfoParameter extends FunctionParameter { @observable _value: string | undefined; _errorMessage = false; - constructor(catalogFunction: CatalogFunctionMixin, options: Options) { + constructor( + catalogFunction: CatalogFunctionMixin.Instance, + options: Options + ) { super(catalogFunction, options); if (isDefined(options.value)) { diff --git a/lib/Models/FunctionParameters/RectangleParameter.ts b/lib/Models/FunctionParameters/RectangleParameter.ts index 928528ad774..51fc4550f70 100644 --- a/lib/Models/FunctionParameters/RectangleParameter.ts +++ b/lib/Models/FunctionParameters/RectangleParameter.ts @@ -22,7 +22,10 @@ export default class RectangleParameter extends FunctionParameter Date: Sun, 22 Jan 2023 11:24:04 +1100 Subject: [PATCH 061/654] Fix misc TS4.x errors. --- lib/Map/Cesium/CesiumRenderLoopPauser.ts | 2 +- .../ProtomapsImageryProvider.ts | 4 +- lib/ModelMixins/CatalogFunctionJobMixin.ts | 9 +-- lib/ModelMixins/DiffableMixin.ts | 3 +- lib/ModelMixins/DiscretelyTimeVaryingMixin.ts | 2 +- lib/ModelMixins/GroupMixin.ts | 2 +- lib/ModelMixins/MappableMixin.ts | 2 +- lib/ModelMixins/TileErrorHandlerMixin.ts | 2 +- lib/ModelMixins/TimeFilterMixin.ts | 3 +- .../CatalogFunctions/YDYRCatalogFunction.ts | 4 +- .../YDYRCatalogFunctionJob.ts | 4 +- .../SenapsLocationsCatalogItem.ts | 2 +- .../Ows/WebMapTileServiceCapabilities.ts | 2 +- lib/Models/Catalog/addUserCatalogMember.ts | 3 +- lib/Models/Internationalization.ts | 10 ++- .../SearchProviders/CatalogSearchProvider.ts | 2 +- lib/Models/SearchProviders/SearchProvider.ts | 4 +- .../FeatureInfo/FeatureInfoPanel.tsx | 2 +- .../FeatureInfo/FeatureInfoSection.tsx | 4 +- lib/ReactViews/Feedback/FeedbackForm.tsx | 2 +- .../Items/AugmentedVirtualityTool.tsx | 62 +++++++++++-------- .../Map/Navigation/Items/MyLocation.ts | 2 +- lib/ReactViews/Search/SearchBox.jsx | 3 + .../Tools/ItemSearchTool/SearchForm.tsx | 11 +++- lib/Styled/Checkbox/Checkbox.tsx | 18 ++++-- test/ModelMixins/CatalogMemberMixinSpec.ts | 7 +-- test/ModelMixins/DiffableMixinSpec.ts | 5 +- test/ModelMixins/TileErrorHandlerMixinSpec.ts | 2 +- test/ModelMixins/TimeFilterMixinSpec.ts | 5 +- .../YDYRCatalogFunctionJobSpec.ts | 4 +- .../YDYRCatalogFunctionSpec.ts | 6 +- .../CatalogItems/SenapsCatalogItemSpec.ts | 7 +-- ...WebProcessingServiceCatalogFunctionSpec.ts | 8 +-- .../Catalog/createUrlReferenceFromUrlSpec.ts | 2 +- test/Models/ErrorServiceSpec.ts | 2 +- .../IndexedItemSearchProviderSpec.ts | 2 +- .../DimensionSelectorSectionSpec.tsx | 10 ++- 37 files changed, 130 insertions(+), 94 deletions(-) diff --git a/lib/Map/Cesium/CesiumRenderLoopPauser.ts b/lib/Map/Cesium/CesiumRenderLoopPauser.ts index 48fd25fff6f..f0b0b2350df 100644 --- a/lib/Map/Cesium/CesiumRenderLoopPauser.ts +++ b/lib/Map/Cesium/CesiumRenderLoopPauser.ts @@ -96,7 +96,7 @@ export default class CesiumRenderLoopPauser { if ("onwheel" in canvas) { // spec event type this._wheelEvent = "wheel"; - } else if (defined(globalThis.onmousewheel)) { + } else if (defined((globalThis as any).onmousewheel)) { // legacy event type this._wheelEvent = "mousewheel"; } else { diff --git a/lib/Map/ImageryProvider/ProtomapsImageryProvider.ts b/lib/Map/ImageryProvider/ProtomapsImageryProvider.ts index d94d3488faf..7c494a193a2 100644 --- a/lib/Map/ImageryProvider/ProtomapsImageryProvider.ts +++ b/lib/Map/ImageryProvider/ProtomapsImageryProvider.ts @@ -4,7 +4,7 @@ import booleanIntersects from "@turf/boolean-intersects"; import circle from "@turf/circle"; import { Feature } from "@turf/helpers"; import i18next from "i18next"; -import { cloneDeep } from "lodash-es"; +import { cloneDeep, isEmpty } from "lodash-es"; import { action, observable, runInAction } from "mobx"; import { Bbox, @@ -507,7 +507,7 @@ export default class ProtomapsImageryProvider // Only create FeatureInfo for visible features with properties if ( !f.feature.props || - f.feature.props === {} || + isEmpty(f.feature.props) || !renderedLayers.includes(f.layerName) ) return; diff --git a/lib/ModelMixins/CatalogFunctionJobMixin.ts b/lib/ModelMixins/CatalogFunctionJobMixin.ts index 9411ca26b30..3e7a7e8cb43 100644 --- a/lib/ModelMixins/CatalogFunctionJobMixin.ts +++ b/lib/ModelMixins/CatalogFunctionJobMixin.ts @@ -1,10 +1,8 @@ import { action, computed, observable, runInAction } from "mobx"; -import RequestErrorEvent from "terriajs-cesium/Source/Core/RequestErrorEvent"; import Constructor from "../Core/Constructor"; import filterOutUndefined from "../Core/filterOutUndefined"; import isDefined from "../Core/isDefined"; import TerriaError from "../Core/TerriaError"; -import MappableMixin, { MapItem } from "./MappableMixin"; import CommonStrata from "../Models/Definition/CommonStrata"; import createStratumInstance from "../Models/Definition/createStratumInstance"; import LoadableStratum from "../Models/Definition/LoadableStratum"; @@ -15,6 +13,7 @@ import { InfoSectionTraits } from "../Traits/TraitsClasses/CatalogMemberTraits"; import AutoRefreshingMixin from "./AutoRefreshingMixin"; import CatalogMemberMixin from "./CatalogMemberMixin"; import GroupMixin from "./GroupMixin"; +import MappableMixin, { MapItem } from "./MappableMixin"; class FunctionJobStratum extends LoadableStratum(CatalogFunctionJobTraits) { constructor(readonly catalogFunctionJob: CatalogFunctionJobMixin.Instance) { @@ -126,7 +125,7 @@ function CatalogFunctionJobMixin< * * @returns true for FINISHED, false for RUNNING (will then call pollForResults) */ - protected abstract async _invoke(): Promise; + protected abstract _invoke(): Promise; public async invoke() { this.setTrait(CommonStrata.user, "jobStatus", "running"); @@ -245,9 +244,7 @@ function CatalogFunctionJobMixin< * Called in {@link CatalogFunctionJobMixin#onJobFinish} * @returns catalog members to add to workbench */ - abstract async downloadResults(): Promise< - CatalogMemberMixin.Instance[] | void - >; + abstract downloadResults(): Promise; @action protected setOnError(error: unknown, raiseToUser: boolean = true) { diff --git a/lib/ModelMixins/DiffableMixin.ts b/lib/ModelMixins/DiffableMixin.ts index 86d0b2fa475..1071557a543 100644 --- a/lib/ModelMixins/DiffableMixin.ts +++ b/lib/ModelMixins/DiffableMixin.ts @@ -8,6 +8,7 @@ import StratumOrder from "../Models/Definition/StratumOrder"; import { SelectableDimensionEnum } from "../Models/SelectableDimensions/SelectableDimensions"; import DiffableTraits from "../Traits/TraitsClasses/DiffableTraits"; import LegendTraits from "../Traits/TraitsClasses/LegendTraits"; +import MappableMixin from "./MappableMixin"; import TimeFilterMixin from "./TimeFilterMixin"; class DiffStratum extends LoadableStratum(DiffableTraits) { @@ -56,7 +57,7 @@ class DiffStratum extends LoadableStratum(DiffableTraits) { } } -type BaseType = Model; +type BaseType = Model & MappableMixin.Instance; function DiffableMixin>(Base: T) { abstract class DiffableMixin extends TimeFilterMixin(Base) { diff --git a/lib/ModelMixins/DiscretelyTimeVaryingMixin.ts b/lib/ModelMixins/DiscretelyTimeVaryingMixin.ts index 3361c37e0b0..04c504f55aa 100644 --- a/lib/ModelMixins/DiscretelyTimeVaryingMixin.ts +++ b/lib/ModelMixins/DiscretelyTimeVaryingMixin.ts @@ -407,7 +407,7 @@ function toJulianDate(time: string | undefined): JulianDate | undefined { const julianDate = JulianDate.fromIso8601(time); // Don't return an invalid JulianDate - if (julianDate.secondsOfDay === NaN || julianDate.dayNumber === NaN) + if (isNaN(julianDate.secondsOfDay) || isNaN(julianDate.dayNumber)) return undefined; return julianDate; diff --git a/lib/ModelMixins/GroupMixin.ts b/lib/ModelMixins/GroupMixin.ts index e42a2c3a353..bc1a4dc168c 100644 --- a/lib/ModelMixins/GroupMixin.ts +++ b/lib/ModelMixins/GroupMixin.ts @@ -167,7 +167,7 @@ function GroupMixin>(Base: T) { * * {@see AsyncLoader} */ - protected abstract async forceLoadMembers(): Promise; + protected abstract forceLoadMembers(): Promise; @action toggleOpen(stratumId: string) { diff --git a/lib/ModelMixins/MappableMixin.ts b/lib/ModelMixins/MappableMixin.ts index 8ab84cd3794..299f1dfb9b2 100644 --- a/lib/ModelMixins/MappableMixin.ts +++ b/lib/ModelMixins/MappableMixin.ts @@ -164,7 +164,7 @@ function MappableMixin>(Base: T) { * * {@see AsyncLoader} */ - protected abstract async forceLoadMapItems(): Promise; + protected abstract forceLoadMapItems(): Promise; /** * Array of MapItems to show on the map/chart when Catalog Member is shown diff --git a/lib/ModelMixins/TileErrorHandlerMixin.ts b/lib/ModelMixins/TileErrorHandlerMixin.ts index 4a712020f5b..d3bbffd3e17 100644 --- a/lib/ModelMixins/TileErrorHandlerMixin.ts +++ b/lib/ModelMixins/TileErrorHandlerMixin.ts @@ -266,7 +266,7 @@ function TileErrorHandlerMixin>( // - the ImageryCatalogItem looked at the error and said we should try again. tellMapToRetry(); } - } catch (error) { + } catch (error: any) { // This attempt failed. We'll either retry (for 500s) or give up // depending on the status code. const e: Error & { statusCode?: number } = error || {}; diff --git a/lib/ModelMixins/TimeFilterMixin.ts b/lib/ModelMixins/TimeFilterMixin.ts index 30139c5a618..b5136d0c89c 100644 --- a/lib/ModelMixins/TimeFilterMixin.ts +++ b/lib/ModelMixins/TimeFilterMixin.ts @@ -4,7 +4,6 @@ import JulianDate from "terriajs-cesium/Source/Core/JulianDate"; import CesiumMath from "terriajs-cesium/Source/Core/Math"; import Entity from "terriajs-cesium/Source/DataSources/Entity"; import AbstractConstructor from "../Core/AbstractConstructor"; -import Constructor from "../Core/Constructor"; import filterOutUndefined from "../Core/filterOutUndefined"; import LatLonHeight from "../Core/LatLonHeight"; import runLater from "../Core/runLater"; @@ -22,7 +21,7 @@ import DiscretelyTimeVaryingMixin from "./DiscretelyTimeVaryingMixin"; import MappableMixin, { ImageryParts } from "./MappableMixin"; import TimeVarying from "./TimeVarying"; -type BaseType = Model; +type BaseType = Model & MappableMixin.Instance; /** * A Mixin for filtering the dates for which imagery is available at a location diff --git a/lib/Models/Catalog/CatalogFunctions/YDYRCatalogFunction.ts b/lib/Models/Catalog/CatalogFunctions/YDYRCatalogFunction.ts index 5c94c904f19..d16a3d4ae58 100644 --- a/lib/Models/Catalog/CatalogFunctions/YDYRCatalogFunction.ts +++ b/lib/Models/Catalog/CatalogFunctions/YDYRCatalogFunction.ts @@ -183,7 +183,9 @@ export default class YDYRCatalogFunction extends CatalogFunctionMixin( return YDYRCatalogFunction.type; } - readonly typeName = "YourDataYourRegions"; + get typeName(): string { + return "YourDataYourRegions"; + } protected async createJob(id: string) { return new YDYRCatalogFunctionJob(id, this.terria); diff --git a/lib/Models/Catalog/CatalogFunctions/YDYRCatalogFunctionJob.ts b/lib/Models/Catalog/CatalogFunctions/YDYRCatalogFunctionJob.ts index 5dad5b453aa..9cd94b2265a 100644 --- a/lib/Models/Catalog/CatalogFunctions/YDYRCatalogFunctionJob.ts +++ b/lib/Models/Catalog/CatalogFunctions/YDYRCatalogFunctionJob.ts @@ -15,7 +15,9 @@ import { ALGORITHMS, DATASETS } from "./YDYRCatalogFunction"; export default class YDYRCatalogFunctionJob extends CatalogFunctionJobMixin( CreateModel(YDYRCatalogFunctionJobTraits) ) { - readonly typeName = "YourDataYourRegions Job"; + get typeName(): string { + return "YourDataYourRegions Job"; + } static readonly type = "ydyr-job"; get type() { diff --git a/lib/Models/Catalog/CatalogItems/SenapsLocationsCatalogItem.ts b/lib/Models/Catalog/CatalogItems/SenapsLocationsCatalogItem.ts index 7e15677d22a..94a289f9a82 100644 --- a/lib/Models/Catalog/CatalogItems/SenapsLocationsCatalogItem.ts +++ b/lib/Models/Catalog/CatalogItems/SenapsLocationsCatalogItem.ts @@ -211,7 +211,7 @@ export class SenapsLocationsStratum extends LoadableStratum( senapsLocationsCatalogItem, geojsonCatalogItem ); - } catch (e) { + } catch (e: any) { throw TerriaError.from(e, { title: i18next.t("models.senaps.retrieveErrorTitle"), message: i18next.t( diff --git a/lib/Models/Catalog/Ows/WebMapTileServiceCapabilities.ts b/lib/Models/Catalog/Ows/WebMapTileServiceCapabilities.ts index f34ef68df04..4c494292f84 100644 --- a/lib/Models/Catalog/Ows/WebMapTileServiceCapabilities.ts +++ b/lib/Models/Catalog/Ows/WebMapTileServiceCapabilities.ts @@ -2,7 +2,7 @@ import i18next from "i18next"; import { createTransformer } from "mobx-utils"; import defined from "terriajs-cesium/Source/Core/defined"; import loadXML from "../../../Core/loadXML"; -import TerriaError, { networkRequestError } from "../../../Core/TerriaError"; +import { networkRequestError } from "../../../Core/TerriaError"; import xml2json from "../../../ThirdParty/xml2json"; import { BoundingBox, diff --git a/lib/Models/Catalog/addUserCatalogMember.ts b/lib/Models/Catalog/addUserCatalogMember.ts index fbbf9d1c14a..edaef8fb030 100644 --- a/lib/Models/Catalog/addUserCatalogMember.ts +++ b/lib/Models/Catalog/addUserCatalogMember.ts @@ -2,7 +2,6 @@ import i18next from "i18next"; import defaultValue from "terriajs-cesium/Source/Core/defaultValue"; import getDereferencedIfExists from "../../Core/getDereferencedIfExists"; import isDefined from "../../Core/isDefined"; -import TerriaError from "../../Core/TerriaError"; import GroupMixin from "../../ModelMixins/GroupMixin"; import GroupTraits from "../../Traits/TraitsClasses/GroupTraits"; import CommonStrata from "../Definition/CommonStrata"; @@ -58,7 +57,7 @@ export default async function addUserCatalogMember( (await terria.workbench.add(dereferenced)).throwIfError(); } return newCatalogItem; - } catch (e) { + } catch (e: any) { terria.raiseErrorToUser(e, { title: i18next.t("models.userData.addingDataErrorTitle"), message: i18next.t("models.userData.addingDataErrorTitle") diff --git a/lib/Models/Internationalization.ts b/lib/Models/Internationalization.ts index 4b3b4cdd27b..9eef538c265 100644 --- a/lib/Models/Internationalization.ts +++ b/lib/Models/Internationalization.ts @@ -1,6 +1,6 @@ import i18next, { ReactOptions } from "i18next"; import LanguageDetector from "i18next-browser-languagedetector"; -import HttpApi from "i18next-http-backend"; +import HttpApi, { RequestCallback } from "i18next-http-backend"; import { initReactI18next } from "react-i18next"; import isDefined from "../Core/isDefined"; @@ -13,12 +13,16 @@ export interface I18nBackendOptions { * */ crossDomain?: boolean; loadPath?: string; - parse?: (data: any, languages: string | [string], namespaces: string) => void; + parse?: ( + data: any, + languages: string | [string], + namespaces: string + ) => { [key: string]: any }; request?: ( options: any, url: string, payload: any, - callback: () => void + callback: RequestCallback ) => void; } diff --git a/lib/Models/SearchProviders/CatalogSearchProvider.ts b/lib/Models/SearchProviders/CatalogSearchProvider.ts index 5ed8f782c32..54ed2df6f2d 100644 --- a/lib/Models/SearchProviders/CatalogSearchProvider.ts +++ b/lib/Models/SearchProviders/CatalogSearchProvider.ts @@ -50,7 +50,7 @@ export function loadAndSearchCatalogRecursively( runInAction(() => { searchResults.results.push( new SearchResult({ - name: name, + name: modelToSave.name, catalogItem: modelToSave }) ); diff --git a/lib/Models/SearchProviders/SearchProvider.ts b/lib/Models/SearchProviders/SearchProvider.ts index 6e88323164b..e29eef2fc0e 100644 --- a/lib/Models/SearchProviders/SearchProvider.ts +++ b/lib/Models/SearchProviders/SearchProvider.ts @@ -6,7 +6,9 @@ export default abstract class SearchProvider { /** If search results are References to models in terria.models - set this to true. * This is so groups/references are opened and loaded properly */ - readonly resultsAreReferences: boolean = false; + get resultsAreReferences(): boolean { + return false; + } @observable name = "Unknown"; @observable isOpen = true; diff --git a/lib/ReactViews/FeatureInfo/FeatureInfoPanel.tsx b/lib/ReactViews/FeatureInfo/FeatureInfoPanel.tsx index f0e80f36a22..fa93e361067 100644 --- a/lib/ReactViews/FeatureInfo/FeatureInfoPanel.tsx +++ b/lib/ReactViews/FeatureInfo/FeatureInfoPanel.tsx @@ -290,7 +290,7 @@ class FeatureInfoPanel extends React.Component { ? featureMap.get(catalogItem.uniqueId) : undefined) ?? []; return { - catalogItem: catalogItem as TimeFilterMixin.Instance, + catalogItem: catalogItem, feature: isDefined(features[0]) ? features[0] : undefined }; }) diff --git a/lib/ReactViews/FeatureInfo/FeatureInfoSection.tsx b/lib/ReactViews/FeatureInfo/FeatureInfoSection.tsx index ec4f7e9c9b2..f401aa78f4e 100644 --- a/lib/ReactViews/FeatureInfo/FeatureInfoSection.tsx +++ b/lib/ReactViews/FeatureInfo/FeatureInfoSection.tsx @@ -1,6 +1,6 @@ import classNames from "classnames"; import { TFunction } from "i18next"; -import { merge } from "lodash-es"; +import { isEmpty, merge } from "lodash-es"; import { action, computed, observable, reaction, runInAction } from "mobx"; import { observer } from "mobx-react"; import { IDisposer } from "mobx-utils"; @@ -343,7 +343,7 @@ export class FeatureInfoSection extends React.Component { return { data: - this.featureProperties && this.featureProperties !== {} + this.featureProperties && !isEmpty(this.featureProperties) ? this.featureProperties : undefined, fileName diff --git a/lib/ReactViews/Feedback/FeedbackForm.tsx b/lib/ReactViews/Feedback/FeedbackForm.tsx index 48e4f806179..54a68d88045 100644 --- a/lib/ReactViews/Feedback/FeedbackForm.tsx +++ b/lib/ReactViews/Feedback/FeedbackForm.tsx @@ -388,7 +388,7 @@ const StyledLabel: React.FC = (props: StyledLabelProps) => { const childrenWithId = React.Children.map(props.children, (child) => { // checking isValidElement is the safe way and avoids a typescript error too if (React.isValidElement(child)) { - return React.cloneElement(child, { id: id }); + return React.cloneElement(child, { id: id } as any); } return child; }); diff --git a/lib/ReactViews/Map/Navigation/Items/AugmentedVirtualityTool.tsx b/lib/ReactViews/Map/Navigation/Items/AugmentedVirtualityTool.tsx index 0687530186b..29d847970ce 100644 --- a/lib/ReactViews/Map/Navigation/Items/AugmentedVirtualityTool.tsx +++ b/lib/ReactViews/Map/Navigation/Items/AugmentedVirtualityTool.tsx @@ -24,6 +24,26 @@ interface IProps extends IAugmentedVirtuality { export const AR_TOOL_ID = "AR_TOOL"; +async function requestDeviceMotionPermission(): Promise<"granted" | "denied"> { + const requestPermission: () => Promise<"granted" | "denied"> = + window.DeviceMotionEvent && + typeof (DeviceMotionEvent as any).requestPermission === "function" + ? (DeviceMotionEvent as any).requestPermission + : () => Promise.resolve("granted"); + return requestPermission(); +} + +async function requestDeviceOrientationPermission(): Promise< + "granted" | "denied" +> { + const requestPermission: () => Promise<"granted" | "denied"> = + window.DeviceOrientationEvent && + typeof (DeviceOrientationEvent as any).requestPermission === "function" + ? (DeviceOrientationEvent as any).requestPermission + : () => Promise.resolve("granted"); + return requestPermission(); +} + export class AugmentedVirtualityController extends MapNavigationItemController { @observable experimentalWarningShown = false; @@ -51,32 +71,22 @@ export class AugmentedVirtualityController extends MapNavigationItemController { // feature detect for new ios 13 // it seems you don't need to ask for both, but who knows, ios 14 / something // could change again - if ( - window.DeviceMotionEvent && - // exists on window by now? - typeof DeviceMotionEvent.requestPermission === "function" - ) { - DeviceMotionEvent.requestPermission() - .then((permissionState) => { - if (permissionState !== "granted") { - console.error("couldn't get access for motion events"); - } - }) - .catch(console.error); - } - if ( - window.DeviceOrientationEvent && - // exists on window by now? - typeof DeviceOrientationEvent.requestPermission === "function" - ) { - DeviceOrientationEvent.requestPermission() - .then((permissionState) => { - if (permissionState !== "granted") { - console.error("couldn't get access for orientation events"); - } - }) - .catch(console.error); - } + requestDeviceMotionPermission() + .then((permissionState) => { + if (permissionState !== "granted") { + console.error("couldn't get access for motion events"); + } + }) + .catch(console.error); + + requestDeviceOrientationPermission() + .then((permissionState) => { + if (permissionState !== "granted") { + console.error("couldn't get access for orientation events"); + } + }) + .catch(console.error); + const { experimentalWarning = true } = this.props; if (experimentalWarning !== false && !this.experimentalWarningShown) { diff --git a/lib/ReactViews/Map/Navigation/Items/MyLocation.ts b/lib/ReactViews/Map/Navigation/Items/MyLocation.ts index ab744960ec7..75812dcea41 100644 --- a/lib/ReactViews/Map/Navigation/Items/MyLocation.ts +++ b/lib/ReactViews/Map/Navigation/Items/MyLocation.ts @@ -82,7 +82,7 @@ class MyLocation extends MapNavigationItemController { } } - zoomToMyLocation(position: Position) { + zoomToMyLocation(position: GeolocationPosition) { const t = i18next.t.bind(i18next); const longitude = position.coords.longitude; const latitude = position.coords.latitude; diff --git a/lib/ReactViews/Search/SearchBox.jsx b/lib/ReactViews/Search/SearchBox.jsx index a54afe5e1bc..45f758b5824 100644 --- a/lib/ReactViews/Search/SearchBox.jsx +++ b/lib/ReactViews/Search/SearchBox.jsx @@ -50,6 +50,9 @@ export const SearchBox = createReactClass({ theme: PropTypes.object }, + /** + * @returns {any} + */ getDefaultProps() { return { placeholder: "Search", diff --git a/lib/ReactViews/Tools/ItemSearchTool/SearchForm.tsx b/lib/ReactViews/Tools/ItemSearchTool/SearchForm.tsx index 18284145aaf..a86ff8f2081 100644 --- a/lib/ReactViews/Tools/ItemSearchTool/SearchForm.tsx +++ b/lib/ReactViews/Tools/ItemSearchTool/SearchForm.tsx @@ -6,7 +6,11 @@ import { WithTranslation, withTranslation } from "react-i18next"; -import ReactSelect, { ActionMeta, ValueType } from "react-select"; +import ReactSelect, { + ActionMeta, + OptionTypeBase, + ValueType +} from "react-select"; import styled from "styled-components"; import ItemSearchProvider, { EnumItemSearchParameter, @@ -213,7 +217,10 @@ interface EnumParameterProps { disabled: boolean; } -type SelectOnChangeHandler = ( +type SelectOnChangeHandler< + OptionType extends OptionTypeBase, + IsMulti extends boolean +> = ( value: ValueType, actionMeta: ActionMeta ) => void; diff --git a/lib/Styled/Checkbox/Checkbox.tsx b/lib/Styled/Checkbox/Checkbox.tsx index 930311a6b5d..3f1ab8bed19 100644 --- a/lib/Styled/Checkbox/Checkbox.tsx +++ b/lib/Styled/Checkbox/Checkbox.tsx @@ -2,6 +2,7 @@ import React, { ChangeEvent, forwardRef, memo, + ReactElement, Ref, useCallback, useState @@ -57,11 +58,18 @@ const Checkbox = memo( // Checking isValidElement is the safe way and avoids a typescript // error too. if (React.isValidElement(child)) { - return React.cloneElement(child, { - isDisabled, - isChecked, - style: { fontSize: "inherit" } - }); + return React.cloneElement( + child as ReactElement<{ + isDisabled: boolean; + isChecked: boolean; + style: any; + }>, + { + isDisabled, + isChecked, + style: { fontSize: "inherit" } + } + ); } return child; }); diff --git a/test/ModelMixins/CatalogMemberMixinSpec.ts b/test/ModelMixins/CatalogMemberMixinSpec.ts index a686d6ede7c..60f9bb0f305 100644 --- a/test/ModelMixins/CatalogMemberMixinSpec.ts +++ b/test/ModelMixins/CatalogMemberMixinSpec.ts @@ -3,10 +3,7 @@ import WebMapServiceCatalogItem from "../../lib/Models/Catalog/Ows/WebMapService import CommonStrata from "../../lib/Models/Definition/CommonStrata"; import createStratumInstance from "../../lib/Models/Definition/createStratumInstance"; import updateModelFromJson from "../../lib/Models/Definition/updateModelFromJson"; -import { - SelectableDimensionEnum, - isEnum -} from "../../lib/Models/SelectableDimensions/SelectableDimensions"; +import { isEnum } from "../../lib/Models/SelectableDimensions/SelectableDimensions"; import Terria from "../../lib/Models/Terria"; import EnumDimensionTraits, { DimensionOptionTraits @@ -110,7 +107,7 @@ describe("CatalogMemberMixin", function () { let dispose: IReactionDisposer | undefined; // Wait for isLoadingMapItems to be true -> then check isLoadingMetadata and isLoading - await new Promise((resolve) => { + await new Promise((resolve) => { dispose = reaction( () => wmsItem.isLoadingMapItems, () => { diff --git a/test/ModelMixins/DiffableMixinSpec.ts b/test/ModelMixins/DiffableMixinSpec.ts index 7eed0b4f0a8..26b65dc6b9f 100644 --- a/test/ModelMixins/DiffableMixinSpec.ts +++ b/test/ModelMixins/DiffableMixinSpec.ts @@ -1,6 +1,7 @@ import { action, computed } from "mobx"; import JulianDate from "terriajs-cesium/Source/Core/JulianDate"; import DiffableMixin from "../../lib/ModelMixins/DiffableMixin"; +import MappableMixin from "../../lib/ModelMixins/MappableMixin"; import CommonStrata from "../../lib/Models/Definition/CommonStrata"; import CreateModel from "../../lib/Models/Definition/CreateModel"; import Terria from "../../lib/Models/Terria"; @@ -39,7 +40,9 @@ describe("DiffableMixin", function () { }); class TestDiffableItem extends DiffableMixin( - CreateModel(mixTraits(DiffableTraits, CatalogMemberTraits, SplitterTraits)) + MappableMixin( + CreateModel(mixTraits(DiffableTraits, CatalogMemberTraits, SplitterTraits)) + ) ) { protected async forceLoadMapItems() {} styleSelectableDimensions = []; diff --git a/test/ModelMixins/TileErrorHandlerMixinSpec.ts b/test/ModelMixins/TileErrorHandlerMixinSpec.ts index 0f19615cb5f..2c9300e8c2f 100644 --- a/test/ModelMixins/TileErrorHandlerMixinSpec.ts +++ b/test/ModelMixins/TileErrorHandlerMixinSpec.ts @@ -79,7 +79,7 @@ describe("TileErrorHandlerMixin", function () { // that waits for its completion. function onTileLoadError(item: TestCatalogItem, error: TileProviderError) { item.onTileLoadError(error); - return new Promise((resolve, reject) => { + return new Promise((resolve, reject) => { const retry: { then?: any; otherwise: any } = error.retry as any; if (retry && retry.then) { retry.then(resolve).catch(reject); diff --git a/test/ModelMixins/TimeFilterMixinSpec.ts b/test/ModelMixins/TimeFilterMixinSpec.ts index c543ed8c031..527fcb758b5 100644 --- a/test/ModelMixins/TimeFilterMixinSpec.ts +++ b/test/ModelMixins/TimeFilterMixinSpec.ts @@ -1,10 +1,9 @@ import { action, computed } from "mobx"; +import MappableMixin from "../../lib/ModelMixins/MappableMixin"; import TimeFilterMixin from "../../lib/ModelMixins/TimeFilterMixin"; import CommonStrata from "../../lib/Models/Definition/CommonStrata"; import CreateModel from "../../lib/Models/Definition/CreateModel"; import Terria from "../../lib/Models/Terria"; -import DiscretelyTimeVaryingTraits from "../../lib/Traits/TraitsClasses/DiscretelyTimeVaryingTraits"; -import MappableTraits from "../../lib/Traits/TraitsClasses/MappableTraits"; import mixTraits from "../../lib/Traits/mixTraits"; import TimeFilterTraits from "../../lib/Traits/TraitsClasses/TimeFilterTraits"; @@ -34,7 +33,7 @@ describe("TimeFilterMixin", function () { }); class TestTimeFilterableItem extends TimeFilterMixin( - CreateModel(mixTraits(TimeFilterTraits)) + MappableMixin(CreateModel(mixTraits(TimeFilterTraits))) ) { protected async forceLoadMapItems(): Promise {} get discreteTimes() { diff --git a/test/Models/Catalog/CatalogFunctions/YDYRCatalogFunctionJobSpec.ts b/test/Models/Catalog/CatalogFunctions/YDYRCatalogFunctionJobSpec.ts index 7e1365d0a0b..cb243ee2cff 100644 --- a/test/Models/Catalog/CatalogFunctions/YDYRCatalogFunctionJobSpec.ts +++ b/test/Models/Catalog/CatalogFunctions/YDYRCatalogFunctionJobSpec.ts @@ -111,7 +111,7 @@ describe("YDYRCatalogFunctionJob", function () { it("polls twice - and creates 2 log entries", async function () { // Wait until job finished - await new Promise((resolve) => { + await new Promise((resolve) => { reaction( () => job.jobStatus, (status) => (status === "finished" ? resolve() : undefined) @@ -128,7 +128,7 @@ describe("YDYRCatalogFunctionJob", function () { }); it("downloads results and creates CSVCatalogItem", async function () { // Wait until job finished downloading results - await new Promise((resolve) => { + await new Promise((resolve) => { reaction( () => job.downloadedResults, (downloadedResults) => (downloadedResults ? resolve() : undefined) diff --git a/test/Models/Catalog/CatalogFunctions/YDYRCatalogFunctionSpec.ts b/test/Models/Catalog/CatalogFunctions/YDYRCatalogFunctionSpec.ts index 99a4b065a34..2b062b557d6 100644 --- a/test/Models/Catalog/CatalogFunctions/YDYRCatalogFunctionSpec.ts +++ b/test/Models/Catalog/CatalogFunctions/YDYRCatalogFunctionSpec.ts @@ -92,7 +92,7 @@ describe("YDYRCatalogFunction", function () { }); // A few reactions will happen, while setting default values for functionParameters - await new Promise((resolve, reject) => { + await new Promise((resolve, reject) => { reaction( () => ydyr.functionParameters, () => { @@ -168,7 +168,7 @@ describe("YDYRCatalogFunction", function () { it("polls twice - and creates 2 log entries", async function () { // Wait until job finished - await new Promise((resolve) => { + await new Promise((resolve) => { reaction( () => job.jobStatus, (status) => (status === "finished" ? resolve() : undefined) @@ -185,7 +185,7 @@ describe("YDYRCatalogFunction", function () { }); it("downloads results and creates CSVCatalogItem", async function () { // Wait until job finished downloading results - await new Promise((resolve) => { + await new Promise((resolve) => { reaction( () => job.downloadedResults, (downloadedResults) => (downloadedResults ? resolve() : undefined) diff --git a/test/Models/Catalog/CatalogItems/SenapsCatalogItemSpec.ts b/test/Models/Catalog/CatalogItems/SenapsCatalogItemSpec.ts index 7dafa68e175..4e5d2893cf6 100644 --- a/test/Models/Catalog/CatalogItems/SenapsCatalogItemSpec.ts +++ b/test/Models/Catalog/CatalogItems/SenapsCatalogItemSpec.ts @@ -1,12 +1,11 @@ import i18next from "i18next"; import { runInAction } from "mobx"; import _loadWithXhr from "../../../../lib/Core/loadWithXhr"; -import Terria from "../../../../lib/Models/Terria"; import SenapsLocationsCatalogItem, { SenapsFeature, SenapsFeatureCollection } from "../../../../lib/Models/Catalog/CatalogItems/SenapsLocationsCatalogItem"; -import TerriaError from "../../../../lib/Core/TerriaError"; +import Terria from "../../../../lib/Models/Terria"; interface ExtendedLoadWithXhr { (): any; @@ -108,7 +107,7 @@ describe("SenapsLocationsCatalogItem", function () { let errorMessage: string = ""; try { item._constructLocationsUrl(); - } catch (e) { + } catch (e: any) { errorMessage = e.message; } return errorMessage === i18next.t("models.senaps.missingSenapsBaseUrl"); @@ -122,7 +121,7 @@ describe("SenapsLocationsCatalogItem", function () { let errorMessage: string = ""; try { item._constructStreamsUrl("123"); - } catch (e) { + } catch (e: any) { errorMessage = e.message; } return errorMessage === i18next.t("models.senaps.missingSenapsBaseUrl"); diff --git a/test/Models/Catalog/Ows/WebProcessingServiceCatalogFunctionSpec.ts b/test/Models/Catalog/Ows/WebProcessingServiceCatalogFunctionSpec.ts index 6e3a2c8a88c..18a934f3181 100644 --- a/test/Models/Catalog/Ows/WebProcessingServiceCatalogFunctionSpec.ts +++ b/test/Models/Catalog/Ows/WebProcessingServiceCatalogFunctionSpec.ts @@ -145,7 +145,7 @@ describe("WebProcessingServiceCatalogFunction", function () { let dispose: any; job = (await wps.submitJob()) as WebProcessingServiceCatalogFunctionJob; - await new Promise((resolve, reject) => { + await new Promise((resolve, reject) => { dispose = reaction( () => job.downloadedResults, () => { @@ -211,7 +211,7 @@ describe("WebProcessingServiceCatalogFunction", function () { let dispose2: any; // Wait for job to finish polling, then check if finished - await new Promise((resolve, reject) => { + await new Promise((resolve, reject) => { dispose2 = reaction( () => job.refreshEnabled, () => { @@ -289,7 +289,7 @@ describe("WebProcessingServiceCatalogFunction", function () { let dispose2: any; // Wait for job to finish polling, then check if failed - await new Promise((resolve, reject) => { + await new Promise((resolve, reject) => { dispose2 = reaction( () => job.refreshEnabled, () => { @@ -317,7 +317,7 @@ describe("WebProcessingServiceCatalogFunction", function () { try { const job = await wps.submitJob(); expect(job).toBeUndefined(); - } catch (error) { + } catch (error: any) { expect(error).toBeDefined(); expect(error instanceof TerriaError).toBeTruthy(); expect(error.message).toBe( diff --git a/test/Models/Catalog/createUrlReferenceFromUrlSpec.ts b/test/Models/Catalog/createUrlReferenceFromUrlSpec.ts index f22aa59321f..dbb83a5989a 100644 --- a/test/Models/Catalog/createUrlReferenceFromUrlSpec.ts +++ b/test/Models/Catalog/createUrlReferenceFromUrlSpec.ts @@ -75,7 +75,7 @@ describe("createUrlReferenceFromUrl", function () { let file: File = Object.assign(blob, { lastModified: 0, name: "lat_lon_val.csv" - }); + }) as File; const item = await createCatalogItemFromFileOrUrl(terria, viewState, file); expect(item).toBeDefined(); if (item !== undefined) { diff --git a/test/Models/ErrorServiceSpec.ts b/test/Models/ErrorServiceSpec.ts index 5e7d60669a1..eaa5ca9fa7c 100644 --- a/test/Models/ErrorServiceSpec.ts +++ b/test/Models/ErrorServiceSpec.ts @@ -17,7 +17,7 @@ describe("initializeErrorServiceProvider", function () { provider: "foo", configuration: undefined }); - } catch (e) { + } catch (e: any) { error = e; } expect(error.message).toBe(`Unknown error service provider: foo`); diff --git a/test/Models/ItemSearchProviders/IndexedItemSearchProviderSpec.ts b/test/Models/ItemSearchProviders/IndexedItemSearchProviderSpec.ts index 730ac1a585d..adc23583f85 100644 --- a/test/Models/ItemSearchProviders/IndexedItemSearchProviderSpec.ts +++ b/test/Models/ItemSearchProviders/IndexedItemSearchProviderSpec.ts @@ -85,7 +85,7 @@ describe("IndexedItemSearchProvider", function () { let error; try { await provider.initialize(); - } catch (e) { + } catch (e: any) { error = e; } expect(error?.message).toContain( diff --git a/test/ReactViews/DimensionSelectorSectionSpec.tsx b/test/ReactViews/DimensionSelectorSectionSpec.tsx index 5ee20e3ec55..9022477e954 100644 --- a/test/ReactViews/DimensionSelectorSectionSpec.tsx +++ b/test/ReactViews/DimensionSelectorSectionSpec.tsx @@ -29,7 +29,11 @@ export default class TestCatalogItem return "test"; } - selectableDimensions: SelectableDimensionModel[] = [ + get selectableDimensions() { + return this.selectableDimensionsValue; + } + + selectableDimensionsValue: SelectableDimensionModel[] = [ { id: "some-id", name: "Some name", @@ -220,7 +224,7 @@ describe("DimensionSelectorSection", function () { beforeEach(function () { mockItem = new TestCatalogItem("what", terria); - mockItem.selectableDimensions = [ + mockItem.selectableDimensionsValue = [ { id: "checkbox-group1", type: "checkbox-group", @@ -282,7 +286,7 @@ describe("DimensionSelectorSection", function () { beforeEach(function () { mockItem = new TestCatalogItem("what", terria); - mockItem.selectableDimensions = [ + mockItem.selectableDimensionsValue = [ { id: "group", type: "group", From c675ef45052c19fc9a8b18bb8c742433e888c31b Mon Sep 17 00:00:00 2001 From: Nanda Date: Sun, 22 Jan 2023 11:46:57 +1100 Subject: [PATCH 062/654] Fix TS4.x TS2611 errors when overriding traits. --- lib/Traits/TraitsClasses/CatalogMemberTraits.ts | 12 +++++++++++- lib/Traits/TraitsClasses/MappableTraits.ts | 10 +++++++++- lib/Traits/TraitsClasses/UrlTraits.ts | 11 ++++++++++- 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/lib/Traits/TraitsClasses/CatalogMemberTraits.ts b/lib/Traits/TraitsClasses/CatalogMemberTraits.ts index e978b47e0bb..12aa416d709 100644 --- a/lib/Traits/TraitsClasses/CatalogMemberTraits.ts +++ b/lib/Traits/TraitsClasses/CatalogMemberTraits.ts @@ -100,7 +100,15 @@ export class ShortReportTraits extends ModelTraits { show = true; } -export default class CatalogMemberTraits extends ModelTraits { +interface CatalogMemberTraits { + // Add traits here that you want to override from some Mixin or Model class + // without generating TS2611 type error. + name?: string; + shortReport?: string; + description?: string; +} + +class CatalogMemberTraits extends ModelTraits { @primitiveTrait({ type: "string", name: "Name", @@ -231,3 +239,5 @@ export default class CatalogMemberTraits extends ModelTraits { }) disableAboutData: boolean = false; } + +export default CatalogMemberTraits; diff --git a/lib/Traits/TraitsClasses/MappableTraits.ts b/lib/Traits/TraitsClasses/MappableTraits.ts index 07fc891bae2..8c166393b8f 100644 --- a/lib/Traits/TraitsClasses/MappableTraits.ts +++ b/lib/Traits/TraitsClasses/MappableTraits.ts @@ -199,7 +199,13 @@ export class InitialMessageTraits extends ModelTraits { height?: number; } -export default class MappableTraits extends mixTraits(AttributionTraits) { +interface MappableTraits { + // Add traits here that you want to override from some Mixin or Model class + // without generating TS2611 type error. + disableZoomTo: boolean; +} + +class MappableTraits extends mixTraits(AttributionTraits) { @objectTrait({ type: RectangleTraits, name: "Rectangle", @@ -279,3 +285,5 @@ export default class MappableTraits extends mixTraits(AttributionTraits) { }) maximumShownFeatureInfos?: number; } + +export default MappableTraits; diff --git a/lib/Traits/TraitsClasses/UrlTraits.ts b/lib/Traits/TraitsClasses/UrlTraits.ts index 3c12d464497..b2d07468825 100644 --- a/lib/Traits/TraitsClasses/UrlTraits.ts +++ b/lib/Traits/TraitsClasses/UrlTraits.ts @@ -1,7 +1,14 @@ import ModelTraits from "../ModelTraits"; import primitiveTrait from "../Decorators/primitiveTrait"; -export default class UrlTraits extends ModelTraits { +interface UrlTraits { + // Add traits here that you want to override from some Mixin or Model class + // without generating TS2611 type error. + url?: string; + cacheDuration?: string; +} + +class UrlTraits extends ModelTraits { @primitiveTrait({ type: "string", name: "URL", @@ -24,3 +31,5 @@ export default class UrlTraits extends ModelTraits { }) cacheDuration?: string; } + +export default UrlTraits; From 2d9da163e719b40a97b06061566aa863e6933a4b Mon Sep 17 00:00:00 2001 From: Nanda Date: Wed, 25 Jan 2023 14:54:35 +1100 Subject: [PATCH 063/654] Upgrade to mobx6. - Run mobx-undecorate (customized for terriajs) - Use @override for overriding computed getters and actions. --- buildprocess/configureWebpack.js | 14 --- lib/Charts/ChartView.ts | 6 +- lib/Core/AsyncLoader.ts | 6 +- lib/Core/TerriaError.ts | 3 +- lib/Map/Cesium/CesiumSelectionIndicator.ts | 4 +- .../ProtomapsImageryProvider.ts | 4 +- .../ImageryProviderLeafletGridLayer.ts | 4 +- .../ImageryProviderLeafletTileLayer.ts | 3 +- lib/Map/PickedFeatures/PickedFeatures.ts | 6 +- lib/Map/Region/RegionProvider.ts | 3 +- lib/ModelMixins/AccessControlMixin.ts | 7 +- lib/ModelMixins/AutoRefreshingMixin.ts | 4 +- lib/ModelMixins/CatalogFunctionJobMixin.ts | 5 +- lib/ModelMixins/CatalogMemberMixin.ts | 19 +++- lib/ModelMixins/Cesium3dTilesMixin.ts | 19 +++- lib/ModelMixins/ClippingMixin.ts | 9 +- lib/ModelMixins/DiffableMixin.ts | 7 +- lib/ModelMixins/DiscretelyTimeVaryingMixin.ts | 15 ++- .../ExportWebCoverageServiceMixin.ts | 8 +- lib/ModelMixins/ExportableMixin.ts | 7 +- .../FeatureInfoUrlTemplateMixin.ts | 7 +- lib/ModelMixins/GeojsonMixin.ts | 27 +++-- lib/ModelMixins/GetCapabilitiesMixin.ts | 9 +- lib/ModelMixins/GltfMixin.ts | 11 +- lib/ModelMixins/GroupMixin.ts | 7 +- lib/ModelMixins/MappableMixin.ts | 8 +- lib/ModelMixins/MinMaxLevelMixin.ts | 7 +- lib/ModelMixins/ReferenceMixin.ts | 7 +- lib/ModelMixins/SearchableItemMixin.ts | 7 +- lib/ModelMixins/ShadowMixin.ts | 9 +- lib/ModelMixins/TableMixin.ts | 22 +++- lib/ModelMixins/TimeFilterMixin.ts | 13 ++- lib/ModelMixins/UrlMixin.ts | 7 +- lib/Models/AugmentedVirtuality.ts | 6 +- lib/Models/BaseMaps/BaseMapsModel.ts | 8 +- lib/Models/BoxDrawing.ts | 3 +- lib/Models/Catalog/Catalog.ts | 3 +- .../CatalogFunctions/YDYRCatalogFunction.ts | 11 +- .../YDYRCatalogFunctionJob.ts | 8 +- .../CatalogGroups/OpenDataSoftCatalogGroup.ts | 3 +- .../CatalogGroups/SocrataCatalogGroup.ts | 3 +- .../CatalogGroups/ThreddsCatalogGroup.ts | 11 +- .../CatalogItems/ApiTableCatalogItem.ts | 4 +- .../CatalogItems/BingMapsCatalogItem.ts | 8 +- .../CatalogItems/CartoMapV1CatalogItem.ts | 11 +- .../CatalogItems/CartoMapV3CatalogItem.ts | 5 +- .../CatalogItems/Cesium3DTilesCatalogItem.ts | 9 +- .../CatalogItems/CesiumTerrainCatalogItem.ts | 20 +++- .../CatalogItems/CompositeCatalogItem.ts | 8 +- .../Catalog/CatalogItems/CsvCatalogItem.ts | 11 +- .../Catalog/CatalogItems/CzmlCatalogItem.ts | 10 +- .../CatalogItems/GeoJsonCatalogItem.ts | 9 +- .../Catalog/CatalogItems/GeoRssCatalogItem.ts | 10 +- .../Catalog/CatalogItems/GpxCatalogItem.ts | 11 +- .../CatalogItems/IonImageryCatalogItem.ts | 8 +- .../Catalog/CatalogItems/KmlCatalogItem.ts | 12 +- .../CatalogItems/MapboxMapCatalogItem.ts | 8 +- .../CatalogItems/MapboxStyleCatalogItem.ts | 8 +- .../MapboxVectorTileCatalogItem.ts | 23 +++- .../CatalogItems/OpenDataSoftCatalogItem.ts | 7 +- .../CatalogItems/OpenStreetMapCatalogItem.ts | 8 +- .../SenapsLocationsCatalogItem.ts | 8 +- .../CatalogItems/ShapefileCatalogItem.ts | 9 +- .../CatalogItems/SocrataMapViewCatalogItem.ts | 3 +- .../UrlTemplateImageryCatalogItem.ts | 8 +- .../CatalogReferences/MagdaReference.ts | 9 +- lib/Models/Catalog/Ckan/CkanCatalogGroup.ts | 15 ++- lib/Models/Catalog/Ckan/CkanItemReference.ts | 7 +- lib/Models/Catalog/Esri/ArcGisCatalogGroup.ts | 27 +++-- .../Esri/ArcGisFeatureServerCatalogGroup.ts | 3 +- .../Esri/ArcGisFeatureServerCatalogItem.ts | 9 +- .../Esri/ArcGisMapServerCatalogGroup.ts | 23 ++-- .../Esri/ArcGisMapServerCatalogItem.ts | 25 +++-- .../Catalog/Esri/ArcGisPortalCatalogGroup.ts | 30 +++-- .../Catalog/Esri/ArcGisPortalItemReference.ts | 6 +- .../Catalog/Esri/ArcGisTerrainCatalogItem.ts | 8 +- lib/Models/Catalog/Gltf/AssImpCatalogItem.ts | 8 +- lib/Models/Catalog/Gltf/GltfCatalogItem.ts | 8 +- lib/Models/Catalog/Gtfs/GtfsCatalogItem.ts | 18 ++- lib/Models/Catalog/Ows/CswCatalogGroup.ts | 3 +- .../SensorObservationServiceCatalogItem.ts | 27 +++-- .../Ows/WebFeatureServiceCatalogGroup.ts | 3 +- .../Ows/WebFeatureServiceCatalogItem.ts | 17 ++- .../Ows/WebMapServiceCapabilitiesStratum.ts | 3 +- .../Catalog/Ows/WebMapServiceCatalogGroup.ts | 3 +- .../Catalog/Ows/WebMapServiceCatalogItem.ts | 11 +- .../Ows/WebMapTileServiceCatalogGroup.ts | 3 +- .../Ows/WebMapTileServiceCatalogItem.ts | 12 +- .../WebProcessingServiceCatalogFunction.ts | 20 +++- .../WebProcessingServiceCatalogFunctionJob.ts | 14 ++- .../Ows/WebProcessingServiceCatalogGroup.ts | 9 +- .../Catalog/ResultPendingCatalogItem.ts | 15 ++- .../Catalog/SdmxJson/SdmxJsonCatalogItem.ts | 9 +- .../SdmxJson/SdmxJsonDataflowStratum.ts | 3 +- .../Catalog/SdmxJson/SdmxJsonServerStratum.ts | 4 +- lib/Models/Cesium.ts | 14 ++- lib/Models/Definition/CreateModel.ts | 3 +- lib/Models/Definition/Model.ts | 4 + lib/Models/Definition/addModelStrataView.ts | 11 +- lib/Models/Definition/createCombinedModel.ts | 8 +- lib/Models/Feature/Feature.ts | 3 +- .../FunctionParameters/BooleanParameter.ts | 3 +- .../EnumerationParameter.ts | 5 +- .../FunctionParameters/FunctionParameter.ts | 7 +- .../FunctionParameters/GeoJsonParameter.ts | 3 +- .../FunctionParameters/InfoParameter.ts | 8 +- .../FunctionParameters/LineParameter.ts | 13 ++- .../FunctionParameters/PointParameter.ts | 13 ++- .../FunctionParameters/PolygonParameter.ts | 13 ++- .../SelectAPolygonParameter.ts | 13 ++- lib/Models/GlobeOrMap.ts | 13 ++- .../IndexedItemSearchProvider.ts | 3 +- lib/Models/Leaflet.ts | 4 +- lib/Models/LeafletAttribution.ts | 8 +- lib/Models/MapInteractionMode.ts | 103 +++++++++--------- .../SearchProviders/BingMapsSearchProvider.ts | 4 +- lib/Models/SearchProviders/CatalogIndex.ts | 6 +- .../SearchProviders/CatalogSearchProvider.ts | 4 +- lib/Models/SearchProviders/SearchProvider.ts | 6 +- .../SearchProviders/SearchProviderResults.ts | 6 +- lib/Models/SearchProviders/SearchResult.ts | 3 +- lib/Models/Terria.ts | 3 +- lib/Models/TimelineStack.ts | 6 +- lib/Models/UserDrawing.ts | 13 ++- lib/Models/Workbench.ts | 6 +- lib/Models/Workflows/TableStylingWorkflow.ts | 8 +- lib/ReactViewModels/MouseCoords.ts | 3 +- lib/ReactViewModels/NotificationState.ts | 6 +- lib/ReactViewModels/SearchState.ts | 9 +- lib/ReactViewModels/ViewState.ts | 4 +- .../Analytics/BooleanParameterEditor.tsx | 11 +- .../Analytics/EnumerationParameterEditor.tsx | 11 +- .../Analytics/GenericParameterEditor.tsx | 11 +- lib/ReactViews/Analytics/InvokeFunction.jsx | 3 +- .../SelectAPolygonParameterEditor.tsx | 2 +- .../BottomDock/Timeline/DateTimePicker.tsx | 8 +- .../Custom/Chart/BottomDockChart.jsx | 14 ++- .../Chart/ChartExpandAndDownloadButtons.tsx | 7 +- lib/ReactViews/Custom/Chart/ChartPanel.jsx | 7 +- .../Custom/Chart/FeatureInfoPanelChart.jsx | 12 +- .../Custom/Chart/MomentPointsChart.jsx | 7 +- lib/ReactViews/Custom/Chart/PointOnMap.tsx | 7 +- lib/ReactViews/Custom/Chart/Tooltip.jsx | 7 +- lib/ReactViews/DragDropFile.tsx | 7 +- .../ExplorerWindow/Tabs/DataCatalogTab.jsx | 7 +- .../FeatureInfo/FeatureInfoPanel.tsx | 7 +- .../FeatureInfo/FeatureInfoSection.tsx | 7 +- .../Feedback/FeedbackButtonController.ts | 3 +- lib/ReactViews/Guide/SatelliteGuide.jsx | 3 +- .../Items/AugmentedVirtualityTool.tsx | 5 +- .../Map/Navigation/Items/Compass.tsx | 3 +- .../Map/Navigation/Items/MyLocation.ts | 3 +- .../Navigation/Items/ToggleSplitterTool.ts | 3 +- .../Map/Navigation/MapNavigation.tsx | 4 +- lib/ReactViews/Map/Panels/SettingPanel.tsx | 3 +- .../Notification/MapInteractionWindow.tsx | 11 +- lib/ReactViews/Preview/DataPreviewMap.jsx | 12 +- lib/ReactViews/Story/StoryBuilder.tsx | 3 +- lib/ReactViews/Tools/DiffTool/DatePicker.tsx | 7 +- lib/ReactViews/Tools/DiffTool/DiffTool.tsx | 8 +- .../Tools/DiffTool/LocationPicker.tsx | 7 +- .../PedestrianMode/MovementsController.ts | 3 +- lib/ReactViews/Tools/Tool.tsx | 3 +- .../Workbench/Controls/ViewingControls.tsx | 4 +- lib/ReactViews/Workbench/Workbench.tsx | 7 +- lib/ReactViews/Workbench/WorkbenchItem.tsx | 3 +- lib/ReactViews/Workbench/WorkbenchList.tsx | 7 +- lib/Table/ColorStyleLegend.ts | 3 +- lib/Table/MergedStyleMapLegend.ts | 3 +- lib/Table/StyleMapLegend.ts | 3 +- lib/Table/TableAutomaticStylesStratum.ts | 3 +- lib/Table/TableColorMap.ts | 6 +- lib/Table/TableColumn.ts | 29 +++-- lib/Table/TableFeatureInfoStratum.ts | 3 +- lib/Table/TableLegendStratum.ts | 3 +- lib/Table/TableStyle.ts | 6 +- lib/Table/TableStyleMap.ts | 6 +- lib/Traits/ArrayNestedStrataMap.ts | 6 +- .../TraitsClasses/CatalogMemberTraits.ts | 2 +- .../ResultPendingCatalogItemTraits.ts | 10 +- lib/Traits/TraitsClasses/UrlTraits.ts | 3 +- .../CompositeBarItemController.ts | 18 +-- .../CompositeBar/CompositeBarModel.ts | 3 +- .../MapNavigationItemController.ts | 20 +++- .../MapNavigation/MapNavigationModel.ts | 3 +- .../MapNavigation/MapToolbar/ToolButton.ts | 3 +- lib/ViewModels/TerriaViewer.ts | 4 +- package.json | 6 +- 188 files changed, 1209 insertions(+), 430 deletions(-) diff --git a/buildprocess/configureWebpack.js b/buildprocess/configureWebpack.js index 7fa9db79374..ae29ceb7d4d 100644 --- a/buildprocess/configureWebpack.js +++ b/buildprocess/configureWebpack.js @@ -113,20 +113,6 @@ function configureWebpack( path.resolve(terriaJSBasePath, "buildprocess", "patchNetworkRequests.ts") ], use: [ - { - // Replace Babel's super.property getter with one that is MobX aware. - loader: require.resolve("string-replace-loader"), - options: { - // getter code generated by babel-core ^7.16.0 - search: - "function _get\\(\\).*?return _get\\.apply\\(this, arguments\\).*", - replace: - "var _get = require('" + - path.resolve(terriaJSBasePath, "lib").replace(/\\/g, "/") + - "/Core/superGet').default;", - flags: "g" - } - }, { loader: "babel-loader", options: { diff --git a/lib/Charts/ChartView.ts b/lib/Charts/ChartView.ts index 1fea885d1a0..202ef988429 100644 --- a/lib/Charts/ChartView.ts +++ b/lib/Charts/ChartView.ts @@ -1,4 +1,4 @@ -import { computed } from "mobx"; +import { computed, makeObservable } from "mobx"; import ChartableMixin, { axesMatch, ChartItem @@ -10,7 +10,9 @@ import Terria from "../Models/Terria"; * workbench. */ export default class ChartView { - constructor(readonly terria: Terria) {} + constructor(readonly terria: Terria) { + makeObservable(this); + } @computed get chartableItems(): ChartableMixin.Instance[] { diff --git a/lib/Core/AsyncLoader.ts b/lib/Core/AsyncLoader.ts index bac597904dd..23d0b545831 100644 --- a/lib/Core/AsyncLoader.ts +++ b/lib/Core/AsyncLoader.ts @@ -1,4 +1,4 @@ -import { action, computed, observable, runInAction } from "mobx"; +import { action, computed, observable, runInAction, makeObservable } from "mobx"; import Result from "./Result"; import TerriaError from "./TerriaError"; @@ -87,7 +87,9 @@ export default class AsyncLoader { /** {@see AsyncLoader} */ readonly loadCallback: () => Promise, readonly disposeCallback?: () => Promise - ) {} + ) { + makeObservable(this); + } /** * Gets a value indicating whether we are currently loading. diff --git a/lib/Core/TerriaError.ts b/lib/Core/TerriaError.ts index 9f128ad8f74..8a68f916cf7 100644 --- a/lib/Core/TerriaError.ts +++ b/lib/Core/TerriaError.ts @@ -1,7 +1,7 @@ "use strict"; import i18next from "i18next"; -import { observable } from "mobx"; +import { observable, makeObservable } from "mobx"; import RequestErrorEvent from "terriajs-cesium/Source/Core/RequestErrorEvent"; import Terria from "../Models/Terria"; import { Notification } from "../ReactViewModels/NotificationState"; @@ -247,6 +247,7 @@ export default class TerriaError { } constructor(options: TerriaErrorOptions) { + makeObservable(this); this._message = options.message; this._title = options.title ?? { key: "core.terriaError.defaultTitle" }; this.sender = options.sender; diff --git a/lib/Map/Cesium/CesiumSelectionIndicator.ts b/lib/Map/Cesium/CesiumSelectionIndicator.ts index 8e7d99e1349..e4da33cd49c 100644 --- a/lib/Map/Cesium/CesiumSelectionIndicator.ts +++ b/lib/Map/Cesium/CesiumSelectionIndicator.ts @@ -4,7 +4,8 @@ import { computed, IReactionDisposer, observable, - runInAction + runInAction, + makeObservable, } from "mobx"; import Cartesian2 from "terriajs-cesium/Source/Core/Cartesian2"; import Cartesian3 from "terriajs-cesium/Source/Core/Cartesian3"; @@ -65,6 +66,7 @@ export default class CesiumSelectionIndicator { private _disposeAutorun: IReactionDisposer; constructor(cesium: import("../../Models/Cesium").default) { + makeObservable(this); this._cesium = cesium; this._tweens = cesium.scene.tweens; this.container = cesium.cesiumWidget.container; diff --git a/lib/Map/ImageryProvider/ProtomapsImageryProvider.ts b/lib/Map/ImageryProvider/ProtomapsImageryProvider.ts index 7c494a193a2..b4a7a546144 100644 --- a/lib/Map/ImageryProvider/ProtomapsImageryProvider.ts +++ b/lib/Map/ImageryProvider/ProtomapsImageryProvider.ts @@ -5,7 +5,7 @@ import circle from "@turf/circle"; import { Feature } from "@turf/helpers"; import i18next from "i18next"; import { cloneDeep, isEmpty } from "lodash-es"; -import { action, observable, runInAction } from "mobx"; +import { action, observable, runInAction, makeObservable } from "mobx"; import { Bbox, Feature as ProtomapsFeature, @@ -123,6 +123,7 @@ export class GeojsonSource implements TileSource { tileIndex: Promise | undefined; constructor(url: string | FeatureCollectionWithCrs) { + makeObservable(this); this.data = url; if (!(typeof url === "string")) { this.geojsonObject = url; @@ -297,6 +298,7 @@ export default class ProtomapsImageryProvider readonly labelRules: LabelRule[]; constructor(options: Options) { + makeObservable(this); this.data = options.data; this.terria = options.terria; this.tilingScheme = new WebMercatorTilingScheme(); diff --git a/lib/Map/Leaflet/ImageryProviderLeafletGridLayer.ts b/lib/Map/Leaflet/ImageryProviderLeafletGridLayer.ts index 95a60fe0a89..4730192e754 100644 --- a/lib/Map/Leaflet/ImageryProviderLeafletGridLayer.ts +++ b/lib/Map/Leaflet/ImageryProviderLeafletGridLayer.ts @@ -1,5 +1,5 @@ import L, { TileEvent } from "leaflet"; -import { autorun, computed, IReactionDisposer, observable } from "mobx"; +import { autorun, computed, IReactionDisposer, observable, makeObservable } from "mobx"; import Cartographic from "terriajs-cesium/Source/Core/Cartographic"; import CesiumEvent from "terriajs-cesium/Source/Core/Event"; import CesiumMath from "terriajs-cesium/Source/Core/Math"; @@ -40,6 +40,8 @@ export default class ImageryProviderLeafletGridLayer extends L.GridLayer { ) { super(Object.assign(options, { async: true, tileSize: 256 })); + makeObservable(this); + // Handle splitter rection (and disposing reaction) let disposeSplitterReaction: IReactionDisposer | undefined; this.on("add", () => { diff --git a/lib/Map/Leaflet/ImageryProviderLeafletTileLayer.ts b/lib/Map/Leaflet/ImageryProviderLeafletTileLayer.ts index b34af23ef23..b997719b151 100644 --- a/lib/Map/Leaflet/ImageryProviderLeafletTileLayer.ts +++ b/lib/Map/Leaflet/ImageryProviderLeafletTileLayer.ts @@ -1,6 +1,6 @@ import i18next from "i18next"; import L, { TileEvent } from "leaflet"; -import { autorun, computed, IReactionDisposer, observable } from "mobx"; +import { autorun, computed, IReactionDisposer, observable, makeObservable } from "mobx"; import Cartesian2 from "terriajs-cesium/Source/Core/Cartesian2"; import Cartographic from "terriajs-cesium/Source/Core/Cartographic"; import CesiumCredit from "terriajs-cesium/Source/Core/Credit"; @@ -61,6 +61,7 @@ export default class ImageryProviderLeafletTileLayer extends L.TileLayer { ? (imageryProvider as any)._leafletUpdateInterval : 100 }); + makeObservable(this); this.imageryProvider = imageryProvider; // Handle splitter rection (and disposing reaction) diff --git a/lib/Map/PickedFeatures/PickedFeatures.ts b/lib/Map/PickedFeatures/PickedFeatures.ts index ae4ce1e068d..c48c85d9958 100644 --- a/lib/Map/PickedFeatures/PickedFeatures.ts +++ b/lib/Map/PickedFeatures/PickedFeatures.ts @@ -1,4 +1,4 @@ -import { observable } from "mobx"; +import { observable, makeObservable } from "mobx"; import Cartesian3 from "terriajs-cesium/Source/Core/Cartesian3"; import MappableMixin, { ImageryParts } from "../../ModelMixins/MappableMixin"; import { BaseModel } from "../../Models/Definition/Model"; @@ -55,6 +55,10 @@ export default class PickedFeatures { @observable error: string | undefined; providerCoords: ProviderCoordsMap | undefined; + + constructor() { + makeObservable(this); + } } export function featureBelongsToCatalogItem( diff --git a/lib/Map/Region/RegionProvider.ts b/lib/Map/Region/RegionProvider.ts index 9b7b47f4d8b..faffff8d19b 100644 --- a/lib/Map/Region/RegionProvider.ts +++ b/lib/Map/Region/RegionProvider.ts @@ -1,4 +1,4 @@ -import { action, observable, runInAction } from "mobx"; +import { action, observable, runInAction, makeObservable } from "mobx"; import defaultValue from "terriajs-cesium/Source/Core/defaultValue"; import DeveloperError from "terriajs-cesium/Source/Core/DeveloperError"; import CorsProxy from "../../Core/CorsProxy"; @@ -193,6 +193,7 @@ export default class RegionProvider { properties: RegionProvierOptions, corsProxy: CorsProxy ) { + makeObservable(this); this.regionType = regionType; this.corsProxy = corsProxy; diff --git a/lib/ModelMixins/AccessControlMixin.ts b/lib/ModelMixins/AccessControlMixin.ts index 6ac124fd001..d3bc691bd94 100644 --- a/lib/ModelMixins/AccessControlMixin.ts +++ b/lib/ModelMixins/AccessControlMixin.ts @@ -1,4 +1,4 @@ -import { action, computed, observable } from "mobx"; +import { action, computed, observable, makeObservable } from "mobx"; import AbstractConstructor from "../Core/AbstractConstructor"; import Model, { BaseModel } from "../Models/Definition/Model"; import ModelTraits from "../Traits/ModelTraits"; @@ -9,6 +9,11 @@ function AccessControlMixin>(Base: T) { abstract class _AccessControlMixin extends Base { @observable private _accessType: string | undefined; + constructor(...args: any[]) { + super(...args); + makeObservable(this); + } + get hasAccessControlMixin() { return true; } diff --git a/lib/ModelMixins/AutoRefreshingMixin.ts b/lib/ModelMixins/AutoRefreshingMixin.ts index c4ce39330ec..b2eacbafa56 100644 --- a/lib/ModelMixins/AutoRefreshingMixin.ts +++ b/lib/ModelMixins/AutoRefreshingMixin.ts @@ -3,7 +3,8 @@ import { IReactionDisposer, onBecomeObserved, onBecomeUnobserved, - reaction + reaction, + makeObservable, } from "mobx"; import { now } from "mobx-utils"; import AbstractConstructor from "../Core/AbstractConstructor"; @@ -28,6 +29,7 @@ export default function AutoRefreshingMixin< constructor(...args: any[]) { super(...args); + makeObservable(this); // We should only poll when our map items have consumers onBecomeObserved(this, "mapItems", this.startAutoRefresh.bind(this)); onBecomeUnobserved(this, "mapItems", this.stopAutoRefresh.bind(this)); diff --git a/lib/ModelMixins/CatalogFunctionJobMixin.ts b/lib/ModelMixins/CatalogFunctionJobMixin.ts index 3e7a7e8cb43..b4f8e616a70 100644 --- a/lib/ModelMixins/CatalogFunctionJobMixin.ts +++ b/lib/ModelMixins/CatalogFunctionJobMixin.ts @@ -1,4 +1,4 @@ -import { action, computed, observable, runInAction } from "mobx"; +import { action, computed, observable, runInAction, makeObservable } from "mobx"; import Constructor from "../Core/Constructor"; import filterOutUndefined from "../Core/filterOutUndefined"; import isDefined from "../Core/isDefined"; @@ -18,6 +18,7 @@ import MappableMixin, { MapItem } from "./MappableMixin"; class FunctionJobStratum extends LoadableStratum(CatalogFunctionJobTraits) { constructor(readonly catalogFunctionJob: CatalogFunctionJobMixin.Instance) { super(); + makeObservable(this); } duplicateLoadableStratum(model: BaseModel): this { @@ -115,6 +116,8 @@ function CatalogFunctionJobMixin< constructor(...args: any[]) { super(...args); + makeObservable(this); + // Add FunctionJobStratum to strata runInAction(() => { this.strata.set(FunctionJobStratum.name, new FunctionJobStratum(this)); diff --git a/lib/ModelMixins/CatalogMemberMixin.ts b/lib/ModelMixins/CatalogMemberMixin.ts index 7d6fa4b8344..6c0f31ba47c 100644 --- a/lib/ModelMixins/CatalogMemberMixin.ts +++ b/lib/ModelMixins/CatalogMemberMixin.ts @@ -1,4 +1,12 @@ -import { action, computed, isObservableArray, runInAction, toJS } from "mobx"; +import { + action, + computed, + isObservableArray, + runInAction, + toJS, + makeObservable, + override +} from "mobx"; import Mustache from "mustache"; import AbstractConstructor from "../Core/AbstractConstructor"; import AsyncLoader from "../Core/AsyncLoader"; @@ -32,6 +40,11 @@ function CatalogMemberMixin>(Base: T) { // This should be overridden by children of this class. For an example see the WebMapServiceCatalogItem _sourceInfoItemNames: string[] | undefined = undefined; + constructor(...args: any[]) { + super(...args); + makeObservable(this); + } + get typeName(): string | undefined { return; } @@ -98,12 +111,12 @@ function CatalogMemberMixin>(Base: T) { return this.terria.workbench.contains(this); } - @computed + @override get name() { return super.name || this.uniqueId; } - @computed + @override get nameInCatalog(): string | undefined { return super.nameInCatalog || this.name; } diff --git a/lib/ModelMixins/Cesium3dTilesMixin.ts b/lib/ModelMixins/Cesium3dTilesMixin.ts index 9e490ab45c9..ff17939e254 100644 --- a/lib/ModelMixins/Cesium3dTilesMixin.ts +++ b/lib/ModelMixins/Cesium3dTilesMixin.ts @@ -5,7 +5,9 @@ import { isObservableArray, observable, runInAction, - toJS + toJS, + makeObservable, + override } from "mobx"; import Cartesian2 from "terriajs-cesium/Source/Core/Cartesian2"; import Cartesian3 from "terriajs-cesium/Source/Core/Cartesian3"; @@ -45,6 +47,11 @@ import MappableMixin from "./MappableMixin"; import ShadowMixin from "./ShadowMixin"; class Cesium3dTilesStratum extends LoadableStratum(Cesium3dTilesTraits) { + constructor(...args: any[]) { + super(...args); + makeObservable(this); + } + duplicateLoadableStratum(model: BaseModel): this { return new Cesium3dTilesStratum() as this; } @@ -67,6 +74,11 @@ class ObservableCesium3DTileset extends Cesium3DTileset { _catalogItem?: Cesium3DTilesCatalogItemIface; @observable destroyed = false; + constructor(...args: ConstructorParameters) { + super(...args); + makeObservable(this); + } + destroy() { super.destroy(); // TODO: we are running later to prevent this @@ -90,6 +102,7 @@ function Cesium3dTilesMixin>(Base: T) { constructor(...args: any[]) { super(...args); + makeObservable(this); runInAction(() => { this.strata.set(Cesium3dTilesStratum.name, new Cesium3dTilesStratum()); }); @@ -293,7 +306,7 @@ function Cesium3dTilesMixin>(Base: T) { return [this.tileset, ...this.clippingMapItems]; } - @computed + @override get shortReport(): string | undefined { if (this.terria.currentViewer.type === "Leaflet") { return i18next.t("models.commonModelErrors.3dTypeIn2dMode", this); @@ -610,7 +623,7 @@ function Cesium3dTilesMixin>(Base: T) { * The color to use for highlighting features in this catalog item. * */ - @computed + @override get highlightColor(): string { return super.highlightColor || DEFAULT_HIGHLIGHT_COLOR; } diff --git a/lib/ModelMixins/ClippingMixin.ts b/lib/ModelMixins/ClippingMixin.ts index d7ea1a192f3..7ecdd0f77fc 100644 --- a/lib/ModelMixins/ClippingMixin.ts +++ b/lib/ModelMixins/ClippingMixin.ts @@ -1,5 +1,5 @@ import i18next from "i18next"; -import { action, computed, toJS } from "mobx"; +import { action, computed, toJS, makeObservable, override } from "mobx"; import Cartesian3 from "terriajs-cesium/Source/Core/Cartesian3"; import Cartographic from "terriajs-cesium/Source/Core/Cartographic"; import clone from "terriajs-cesium/Source/Core/clone"; @@ -33,6 +33,11 @@ function ClippingMixin>(Base: T) { private clippingPlaneModelMatrix: Matrix4 = Matrix4.IDENTITY.clone(); + constructor(...args: any[]) { + super(...args); + makeObservable(this); + } + @computed get inverseClippingPlanesOriginMatrix(): Matrix4 { return Matrix4.inverse(this.clippingPlanesOriginMatrix(), new Matrix4()); @@ -246,7 +251,7 @@ function ClippingMixin>(Base: T) { return this._clippingBoxDrawing; } - @computed + @override get selectableDimensions(): SelectableDimension[] { if (!this.clippingBox.enableFeature) { return super.selectableDimensions; diff --git a/lib/ModelMixins/DiffableMixin.ts b/lib/ModelMixins/DiffableMixin.ts index 1071557a543..311136f7f7d 100644 --- a/lib/ModelMixins/DiffableMixin.ts +++ b/lib/ModelMixins/DiffableMixin.ts @@ -1,4 +1,4 @@ -import { computed } from "mobx"; +import { computed, makeObservable, override } from "mobx"; import JulianDate from "terriajs-cesium/Source/Core/JulianDate"; import AbstractConstructor from "../Core/AbstractConstructor"; import createStratumInstance from "../Models/Definition/createStratumInstance"; @@ -15,6 +15,7 @@ class DiffStratum extends LoadableStratum(DiffableTraits) { static stratumName = "diffStratum"; constructor(readonly catalogItem: DiffableMixin.Instance) { super(); + makeObservable(this); } duplicateLoadableStratum(model: BaseModel): this { @@ -64,6 +65,8 @@ function DiffableMixin>(Base: T) { constructor(...args: any[]) { super(...args); + makeObservable(this); + const diffStratum = new DiffStratum(this); this.strata.set(DiffStratum.stratumName, diffStratum); } @@ -92,7 +95,7 @@ function DiffableMixin>(Base: T) { secondDate?: JulianDate ): string; - @computed + @override get canFilterTimeByFeature() { // Hides the SatelliteImageryTimeFilterSection for the item if it is // currently showing difference image diff --git a/lib/ModelMixins/DiscretelyTimeVaryingMixin.ts b/lib/ModelMixins/DiscretelyTimeVaryingMixin.ts index 04c504f55aa..10a0fd98cd5 100644 --- a/lib/ModelMixins/DiscretelyTimeVaryingMixin.ts +++ b/lib/ModelMixins/DiscretelyTimeVaryingMixin.ts @@ -1,4 +1,4 @@ -import { action, computed, runInAction } from "mobx"; +import { action, computed, runInAction, makeObservable, override } from "mobx"; import binarySearch from "terriajs-cesium/Source/Core/binarySearch"; import JulianDate from "terriajs-cesium/Source/Core/JulianDate"; import { ChartPoint } from "../Charts/ChartData"; @@ -33,12 +33,17 @@ function DiscretelyTimeVaryingMixin< extends ChartableMixin(Base) implements TimeVarying { + constructor(...args: any[]) { + super(...args); + makeObservable(this); + } + get hasDiscreteTimes() { return true; } abstract get discreteTimes(): DiscreteTimeAsJS[] | undefined; - @computed + @override get currentTime(): string | undefined { const time = super.currentTime; if (time === undefined || time === null) { @@ -234,7 +239,7 @@ function DiscretelyTimeVaryingMixin< return this.nextDiscreteTimeIndex !== undefined; } - @computed + @override get startTime(): string | undefined { const time = super.startTime; if ( @@ -250,7 +255,7 @@ function DiscretelyTimeVaryingMixin< return time; } - @computed + @override get stopTime(): string | undefined { const time = super.stopTime; if ( @@ -271,7 +276,7 @@ function DiscretelyTimeVaryingMixin< /** * Try to calculate a multiplier which results in a new time step every {this.multiplierDefaultDeltaStep} seconds. For example, if {this.multiplierDefaultDeltaStep = 5} it would set the `multiplier` so that a new time step (of this dataset) would appear every five seconds (on average) if the timeline is playing. */ - @computed + @override get multiplier() { if (super.multiplier) return super.multiplier; diff --git a/lib/ModelMixins/ExportWebCoverageServiceMixin.ts b/lib/ModelMixins/ExportWebCoverageServiceMixin.ts index c2d63c23359..c8e0a3d07b7 100644 --- a/lib/ModelMixins/ExportWebCoverageServiceMixin.ts +++ b/lib/ModelMixins/ExportWebCoverageServiceMixin.ts @@ -1,5 +1,5 @@ import i18next from "i18next"; -import { computed, runInAction } from "mobx"; +import { computed, runInAction, makeObservable } from "mobx"; import CesiumMath from "terriajs-cesium/Source/Core/Math"; import Rectangle from "terriajs-cesium/Source/Core/Rectangle"; import RequestErrorEvent from "terriajs-cesium/Source/Core/RequestErrorEvent"; @@ -164,6 +164,7 @@ class WebCoverageServiceDescribeCoverageStratum extends LoadableStratum( } ) { super(); + makeObservable(this); } @computed get linkedWcsParameters() { @@ -193,6 +194,11 @@ function ExportWebCoverageServiceMixin< this.loadWcsDescribeCoverage.bind(this) ); + constructor(...args: any[]) { + super(...args); + makeObservable(this); + } + @computed get isLoadingWcsMetadata(): boolean { return ( diff --git a/lib/ModelMixins/ExportableMixin.ts b/lib/ModelMixins/ExportableMixin.ts index 3e5e18a6dac..7f5f37d0e9e 100644 --- a/lib/ModelMixins/ExportableMixin.ts +++ b/lib/ModelMixins/ExportableMixin.ts @@ -1,4 +1,4 @@ -import { computed } from "mobx"; +import { computed, makeObservable } from "mobx"; import AbstractConstructor from "../Core/AbstractConstructor"; import Model from "../Models/Definition/Model"; import ExportableTraits from "../Traits/TraitsClasses/ExportableTraits"; @@ -11,6 +11,11 @@ function ExportableMixin< abstract class ExportableMixin extends Base { protected abstract get _canExportData(): boolean; + constructor(...args: any[]) { + super(...args); + makeObservable(this); + } + /** * Indicates if model is able to export data (will turn on/off UI elements) */ diff --git a/lib/ModelMixins/FeatureInfoUrlTemplateMixin.ts b/lib/ModelMixins/FeatureInfoUrlTemplateMixin.ts index cf3f9c3ec45..90261b5a13b 100644 --- a/lib/ModelMixins/FeatureInfoUrlTemplateMixin.ts +++ b/lib/ModelMixins/FeatureInfoUrlTemplateMixin.ts @@ -1,4 +1,4 @@ -import { action, runInAction } from "mobx"; +import { action, runInAction, makeObservable } from "mobx"; import Cartesian2 from "terriajs-cesium/Source/Core/Cartesian2"; import JulianDate from "terriajs-cesium/Source/Core/JulianDate"; import Resource from "terriajs-cesium/Source/Core/Resource"; @@ -22,6 +22,11 @@ function FeatureInfoUrlTemplateMixin>( Base: T ) { abstract class FeatureInfoUrlTemplateMixin extends Base { + constructor(...args: any[]) { + super(...args); + makeObservable(this); + } + get hasFeatureInfoUrlTemplateMixin() { return true; } diff --git a/lib/ModelMixins/GeojsonMixin.ts b/lib/ModelMixins/GeojsonMixin.ts index 7715d0c60cb..a104b0e5e20 100644 --- a/lib/ModelMixins/GeojsonMixin.ts +++ b/lib/ModelMixins/GeojsonMixin.ts @@ -23,7 +23,9 @@ import { onBecomeUnobserved, reaction, runInAction, - toJS + toJS, + makeObservable, + override } from "mobx"; import { createTransformer } from "mobx-utils"; import { @@ -142,6 +144,7 @@ class GeoJsonStratum extends LoadableStratum(GeoJsonTraits) { static stratumName = "geojson"; constructor(private readonly _item: GeoJsonMixin.Instance) { super(); + makeObservable(this); } duplicateLoadableStratum(newModel: BaseModel): this { @@ -250,6 +253,7 @@ function GeoJsonMixin>(Base: T) { constructor(...args: any[]) { super(...args); + makeObservable(this); // Add GeoJsonStratum if (this.strata.get(GeoJsonStratum.stratumName) === undefined) { runInAction(() => { @@ -329,14 +333,16 @@ function GeoJsonMixin>(Base: T) { return true; } - @computed get name() { + @override + get name() { if (CatalogMemberMixin.isMixedInto(this.sourceReference)) { return super.name || this.sourceReference.name; } return super.name; } - @computed get cacheDuration(): string { + @override + get cacheDuration(): string { if (isDefined(super.cacheDuration)) { return super.cacheDuration; } @@ -351,7 +357,7 @@ function GeoJsonMixin>(Base: T) { return this._readyData; } - @computed + @override get _canExportData() { return isDefined(this.readyData); } @@ -374,7 +380,8 @@ function GeoJsonMixin>(Base: T) { }); } - @computed get mapItems() { + @override + get mapItems() { if (this.isLoadingMapItems) { return []; } @@ -435,7 +442,8 @@ function GeoJsonMixin>(Base: T) { } /** Remove chart items from TableMixin.chartItems */ - @computed get chartItems() { + @override + get chartItems() { return []; } @@ -1159,7 +1167,7 @@ function GeoJsonMixin>(Base: T) { return dataSource; } - @computed + @override get discreteTimes(): DiscreteTimeAsJS[] | undefined { if (this.readyData === undefined) { return undefined; @@ -1198,7 +1206,7 @@ function GeoJsonMixin>(Base: T) { * This enables all TableMixin functionality - which is used for styling vector tiles. * If this returns an empty array, TableMixin will effectively be disabled */ - @computed + @override get dataColumnMajor() { if (!this.readyData || !this.useTableStylingAndProtomaps) return []; @@ -1253,7 +1261,8 @@ function GeoJsonMixin>(Base: T) { return undefined; } - @computed get viewingControls(): ViewingControl[] { + @override + get viewingControls(): ViewingControl[] { return !this.useTableStylingAndProtomaps ? super.viewingControls.filter( (v) => v.id !== TableStylingWorkflow.type diff --git a/lib/ModelMixins/GetCapabilitiesMixin.ts b/lib/ModelMixins/GetCapabilitiesMixin.ts index 595123de7b1..13e81b4a725 100644 --- a/lib/ModelMixins/GetCapabilitiesMixin.ts +++ b/lib/ModelMixins/GetCapabilitiesMixin.ts @@ -1,4 +1,4 @@ -import { computed } from "mobx"; +import { computed, makeObservable, override } from "mobx"; import AbstractConstructor from "../Core/AbstractConstructor"; import Model from "../Models/Definition/Model"; import StratumOrder from "../Models/Definition/StratumOrder"; @@ -12,7 +12,12 @@ function GetCapabilitiesMixin>( abstract class GetCapabilitiesMixin extends Base { protected abstract get defaultGetCapabilitiesUrl(): string | undefined; - @computed + constructor(...args: any[]) { + super(...args); + makeObservable(this); + } + + @override get getCapabilitiesUrl(): string | undefined { const getCapabilitiesUrl = super.getCapabilitiesUrl; if (getCapabilitiesUrl !== undefined) { diff --git a/lib/ModelMixins/GltfMixin.ts b/lib/ModelMixins/GltfMixin.ts index c08bc824fe6..7214fca8cd8 100644 --- a/lib/ModelMixins/GltfMixin.ts +++ b/lib/ModelMixins/GltfMixin.ts @@ -1,5 +1,5 @@ import i18next from "i18next"; -import { computed } from "mobx"; +import { computed, makeObservable, override } from "mobx"; import Cartesian3 from "terriajs-cesium/Source/Core/Cartesian3"; import HeadingPitchRoll from "terriajs-cesium/Source/Core/HeadingPitchRoll"; import Quaternion from "terriajs-cesium/Source/Core/Quaternion"; @@ -51,11 +51,16 @@ function GltfMixin>(Base: T) { private readonly _dataSource = new CustomDataSource("glTF Model"); private readonly _modelEntity = new Entity({ name: "glTF Model Entity" }); + constructor(...args: any[]) { + super(...args); + makeObservable(this); + } + get hasGltfMixin() { return true; } - @computed + @override get disableZoomTo() { const { latitude, longitude, height } = this.origin; return ( @@ -164,7 +169,7 @@ function GltfMixin>(Base: T) { return Promise.resolve(); } - @computed + @override get shortReport(): string | undefined { if (this.terria.currentViewer.type === "Leaflet") { return i18next.t("models.commonModelErrors.3dTypeIn2dMode", this); diff --git a/lib/ModelMixins/GroupMixin.ts b/lib/ModelMixins/GroupMixin.ts index bc1a4dc168c..55322f1dc70 100644 --- a/lib/ModelMixins/GroupMixin.ts +++ b/lib/ModelMixins/GroupMixin.ts @@ -1,5 +1,5 @@ import { uniq } from "lodash-es"; -import { action, computed, runInAction } from "mobx"; +import { action, computed, runInAction, makeObservable } from "mobx"; import clone from "terriajs-cesium/Source/Core/clone"; import DeveloperError from "terriajs-cesium/Source/Core/DeveloperError"; import AbstractConstructor from "../Core/AbstractConstructor"; @@ -31,6 +31,11 @@ function GroupMixin>(Base: T) { abstract class _GroupMixin extends Base implements Group { private _memberLoader = new AsyncLoader(this.forceLoadMembers.bind(this)); + constructor(...args: any[]) { + super(...args); + makeObservable(this); + } + get isGroup() { return true; } diff --git a/lib/ModelMixins/MappableMixin.ts b/lib/ModelMixins/MappableMixin.ts index 299f1dfb9b2..eabee2ddeec 100644 --- a/lib/ModelMixins/MappableMixin.ts +++ b/lib/ModelMixins/MappableMixin.ts @@ -1,5 +1,5 @@ import i18next from "i18next"; -import { computed, runInAction } from "mobx"; +import { computed, makeObservable, runInAction } from "mobx"; import Rectangle from "terriajs-cesium/Source/Core/Rectangle"; import TerrainProvider from "terriajs-cesium/Source/Core/TerrainProvider"; import DataSource from "terriajs-cesium/Source/DataSources/DataSource"; @@ -65,6 +65,12 @@ type BaseType = Model; function MappableMixin>(Base: T) { abstract class MappableMixin extends Base { initialMessageShown: boolean = false; + + constructor(...args: any[]) { + super(...args); + makeObservable(this); + } + get isMappable() { return true; } diff --git a/lib/ModelMixins/MinMaxLevelMixin.ts b/lib/ModelMixins/MinMaxLevelMixin.ts index b3926df615c..f79a029d50b 100644 --- a/lib/ModelMixins/MinMaxLevelMixin.ts +++ b/lib/ModelMixins/MinMaxLevelMixin.ts @@ -1,4 +1,4 @@ -import { observable } from "mobx"; +import { observable, makeObservable } from "mobx"; import ImageryProvider from "terriajs-cesium/Source/Scene/ImageryProvider"; import AbstractConstructor from "../Core/AbstractConstructor"; import isDefined from "../Core/isDefined"; @@ -13,6 +13,11 @@ function MinMaxLevelMixin>(Base: T) { abstract class MinMaxLevelMixin extends Base { @observable notVisible: boolean = false; + constructor(...args: any[]) { + super(...args); + makeObservable(this); + } + get supportsMinMaxLevel() { return true; } diff --git a/lib/ModelMixins/ReferenceMixin.ts b/lib/ModelMixins/ReferenceMixin.ts index 1f444710f34..120b600bff6 100644 --- a/lib/ModelMixins/ReferenceMixin.ts +++ b/lib/ModelMixins/ReferenceMixin.ts @@ -1,4 +1,4 @@ -import { computed, observable, runInAction, untracked } from "mobx"; +import { computed, observable, runInAction, untracked, makeObservable } from "mobx"; import DeveloperError from "terriajs-cesium/Source/Core/DeveloperError"; import AbstractConstructor from "../Core/AbstractConstructor"; import AsyncLoader from "../Core/AsyncLoader"; @@ -63,6 +63,11 @@ function ReferenceMixin>(Base: T) { }); }); + constructor(...args: any[]) { + super(...args); + makeObservable(this); + } + get loadReferenceResult() { return this._referenceLoader.result; } diff --git a/lib/ModelMixins/SearchableItemMixin.ts b/lib/ModelMixins/SearchableItemMixin.ts index 3936bb59c42..720b2984782 100644 --- a/lib/ModelMixins/SearchableItemMixin.ts +++ b/lib/ModelMixins/SearchableItemMixin.ts @@ -1,4 +1,4 @@ -import { action, computed } from "mobx"; +import { action, computed, makeObservable } from "mobx"; import AbstractConstructor from "../Core/AbstractConstructor"; import Model from "../Models/Definition/Model"; import ItemSearchProvider, { @@ -44,6 +44,11 @@ function SearchableItemMixin>(Base: T) { */ abstract zoomToItemSearchResult(result: ItemSearchResult): void; + constructor(...args: any[]) { + super(...args); + makeObservable(this); + } + /** * Returns true if this item is searchable and has a valid item search provider defined. */ diff --git a/lib/ModelMixins/ShadowMixin.ts b/lib/ModelMixins/ShadowMixin.ts index 3e409f50772..580e4159e60 100644 --- a/lib/ModelMixins/ShadowMixin.ts +++ b/lib/ModelMixins/ShadowMixin.ts @@ -1,5 +1,5 @@ import i18next from "i18next"; -import { computed, runInAction } from "mobx"; +import { computed, runInAction, makeObservable, override } from "mobx"; import ShadowMode from "terriajs-cesium/Source/Scene/ShadowMode"; import AbstractConstructor from "../Core/AbstractConstructor"; import Model from "../Models/Definition/Model"; @@ -12,6 +12,11 @@ type BaseType = Model & SelectableDimensions; function ShadowMixin>(Base: T) { abstract class ShadowMixin extends Base { + constructor(...args: any[]) { + super(...args); + makeObservable(this); + } + get hasShadows() { return true; } @@ -32,7 +37,7 @@ function ShadowMixin>(Base: T) { } /** Shadow SelectableDimension. This has to be added to a catalog member's `selectableDimension` array */ - @computed + @override get selectableDimensions(): SelectableDimension[] { return [ ...super.selectableDimensions, diff --git a/lib/ModelMixins/TableMixin.ts b/lib/ModelMixins/TableMixin.ts index b8175ef221d..08ad30f90ec 100644 --- a/lib/ModelMixins/TableMixin.ts +++ b/lib/ModelMixins/TableMixin.ts @@ -1,5 +1,12 @@ import i18next from "i18next"; -import { action, computed, observable, runInAction } from "mobx"; +import { + action, + computed, + observable, + runInAction, + makeObservable, + override +} from "mobx"; import { createTransformer, ITransformer } from "mobx-utils"; import DeveloperError from "terriajs-cesium/Source/Core/DeveloperError"; import JulianDate from "terriajs-cesium/Source/Core/JulianDate"; @@ -66,6 +73,8 @@ function TableMixin>(Base: T) { constructor(...args: any[]) { super(...args); + makeObservable(this); + // Create default TableStyle and set TableAutomaticLegendStratum this.defaultTableStyle = new TableStyle(this); @@ -229,12 +238,12 @@ function TableMixin>(Base: T) { }); } - @computed + @override get name() { return super.name; } - @computed + @override get disableZoomTo() { // Disable zoom if only showing imagery parts (eg region mapping) and no rectangle is defined if ( @@ -424,7 +433,7 @@ function TableMixin>(Base: T) { ); } - @computed + @override get chartItems() { // Wait for activeTableStyle to be ready if (!this.activeTableStyle.ready || this.isLoadingMapItems) return []; @@ -438,7 +447,8 @@ function TableMixin>(Base: T) { ]); } - @computed get viewingControls(): ViewingControl[] { + @override + get viewingControls(): ViewingControl[] { return filterOutUndefined([ ...super.viewingControls, { @@ -459,7 +469,7 @@ function TableMixin>(Base: T) { return tableFeatureInfoContext(this); } - @computed + @override get selectableDimensions(): SelectableDimension[] { return filterOutUndefined([ this.timeDisableDimension, diff --git a/lib/ModelMixins/TimeFilterMixin.ts b/lib/ModelMixins/TimeFilterMixin.ts index b5136d0c89c..1eb42bd78fc 100644 --- a/lib/ModelMixins/TimeFilterMixin.ts +++ b/lib/ModelMixins/TimeFilterMixin.ts @@ -1,4 +1,11 @@ -import { action, computed, observable, onBecomeObserved } from "mobx"; +import { + action, + computed, + observable, + onBecomeObserved, + makeObservable, + override +} from "mobx"; import Ellipsoid from "terriajs-cesium/Source/Core/Ellipsoid"; import JulianDate from "terriajs-cesium/Source/Core/JulianDate"; import CesiumMath from "terriajs-cesium/Source/Core/Math"; @@ -40,6 +47,8 @@ function TimeFilterMixin>(Base: T) { constructor(...args: any[]) { super(...args); + makeObservable(this); + // Try to resolve the timeFilterFeature from the co-ordinates that might // be stored in the traits. We only have to resolve the time filter // feature once to get the list of times. @@ -134,7 +143,7 @@ function TimeFilterMixin>(Base: T) { ); } - @computed + @override get discreteTimesAsSortedJulianDates() { const featureTimes = this.featureTimesAsJulianDates; if (featureTimes === undefined) { diff --git a/lib/ModelMixins/UrlMixin.ts b/lib/ModelMixins/UrlMixin.ts index 049a2626310..1aa74a9de79 100644 --- a/lib/ModelMixins/UrlMixin.ts +++ b/lib/ModelMixins/UrlMixin.ts @@ -1,4 +1,4 @@ -import { computed } from "mobx"; +import { computed, makeObservable } from "mobx"; import URI from "urijs"; import AbstractConstructor from "../Core/AbstractConstructor"; import Model from "../Models/Definition/Model"; @@ -8,6 +8,11 @@ type BaseType = Model; function UrlMixin>(Base: T) { abstract class UrlMixin extends Base { + constructor(...args: any[]) { + super(...args); + makeObservable(this); + } + get hasUrlMixin() { return true; } diff --git a/lib/Models/AugmentedVirtuality.ts b/lib/Models/AugmentedVirtuality.ts index 4c6db7c91f8..38279aac09a 100644 --- a/lib/Models/AugmentedVirtuality.ts +++ b/lib/Models/AugmentedVirtuality.ts @@ -1,4 +1,4 @@ -import { action, computed, observable, runInAction } from "mobx"; +import { action, computed, observable, runInAction, makeObservable } from "mobx"; import CesiumCartesian3 from "terriajs-cesium/Source/Core/Cartesian3"; import Cartographic from "terriajs-cesium/Source/Core/Cartographic"; import EllipsoidTerrainProvider from "terriajs-cesium/Source/Core/EllipsoidTerrainProvider"; @@ -62,7 +62,9 @@ export default class AugmentedVirtuality { // (and increment) we cycle and go to the first height. @observable hoverLevel = AugmentedVirtuality.PRESET_HEIGHTS.length - 1; - constructor(readonly terria: Terria) {} + constructor(readonly terria: Terria) { + makeObservable(this); + } toggleEnabled() { if (this.active) { diff --git a/lib/Models/BaseMaps/BaseMapsModel.ts b/lib/Models/BaseMaps/BaseMapsModel.ts index 138e1dd016b..1ddcdc2c08c 100644 --- a/lib/Models/BaseMaps/BaseMapsModel.ts +++ b/lib/Models/BaseMaps/BaseMapsModel.ts @@ -1,4 +1,4 @@ -import { action, computed } from "mobx"; +import { action, computed, makeObservable } from "mobx"; import DeveloperError from "terriajs-cesium/Source/Core/DeveloperError"; import isDefined from "../../Core/isDefined"; import { isJsonObject, JsonObject } from "../../Core/Json"; @@ -17,6 +17,7 @@ import ModelPropertiesFromTraits from "../Definition/ModelPropertiesFromTraits"; import updateModelFromJson from "../Definition/updateModelFromJson"; import Terria from "../Terria"; import { defaultBaseMaps } from "./defaultBaseMaps"; +import { ModelConstructorParameters } from "../Definition/Model"; import MappableMixin from "../../ModelMixins/MappableMixin"; export class BaseMapModel extends CreateModel(BaseMapTraits) {} @@ -39,6 +40,11 @@ export interface BaseMapItem { } export class BaseMapsModel extends CreateModel(BaseMapsTraits) { + constructor(...args: ModelConstructorParameters) { + super(...args); + makeObservable(this); + } + /** * List of the basemaps to show in setting panel */ diff --git a/lib/Models/BoxDrawing.ts b/lib/Models/BoxDrawing.ts index 6ab67a3c1b7..f8a315f90b5 100644 --- a/lib/Models/BoxDrawing.ts +++ b/lib/Models/BoxDrawing.ts @@ -1,5 +1,5 @@ import throttle from "lodash-es/throttle"; -import { observable, onBecomeObserved, onBecomeUnobserved } from "mobx"; +import { observable, onBecomeObserved, onBecomeUnobserved, makeObservable } from "mobx"; import ArcType from "terriajs-cesium/Source/Core/ArcType"; import Cartesian2 from "terriajs-cesium/Source/Core/Cartesian2"; import Cartesian3 from "terriajs-cesium/Source/Core/Cartesian3"; @@ -267,6 +267,7 @@ export default class BoxDrawing { transform: Matrix4, options: BoxDrawingOptions ) { + makeObservable(this); this.scene = cesium.scene; this.keepBoxAboveGround = options.keepBoxAboveGround ?? false; this.drawNonUniformScaleGrips = options.drawNonUniformScaleGrips ?? true; diff --git a/lib/Models/Catalog/Catalog.ts b/lib/Models/Catalog/Catalog.ts index 78ce80de884..74f8e66ba53 100644 --- a/lib/Models/Catalog/Catalog.ts +++ b/lib/Models/Catalog/Catalog.ts @@ -1,5 +1,5 @@ import i18next from "i18next"; -import { autorun, observable } from "mobx"; +import { autorun, observable, makeObservable } from "mobx"; import { USER_ADDED_CATEGORY_ID } from "../../Core/addedByUser"; import CatalogGroup from "./CatalogGroup"; import CommonStrata from "../Definition/CommonStrata"; @@ -17,6 +17,7 @@ export default class Catalog { private _disposeCreateUserAddedGroup: () => void; constructor(terria: Terria) { + makeObservable(this); this.terria = terria; this.group = new CatalogGroup("/", this.terria); this.terria.addModel(this.group); diff --git a/lib/Models/Catalog/CatalogFunctions/YDYRCatalogFunction.ts b/lib/Models/Catalog/CatalogFunctions/YDYRCatalogFunction.ts index d16a3d4ae58..48eb4fc73a3 100644 --- a/lib/Models/Catalog/CatalogFunctions/YDYRCatalogFunction.ts +++ b/lib/Models/Catalog/CatalogFunctions/YDYRCatalogFunction.ts @@ -1,4 +1,4 @@ -import { computed } from "mobx"; +import { computed, makeObservable, override } from "mobx"; import filterOutUndefined from "../../../Core/filterOutUndefined"; import isDefined from "../../../Core/isDefined"; import CatalogFunctionMixin from "../../../ModelMixins/CatalogFunctionMixin"; @@ -12,6 +12,7 @@ import EnumerationParameter from "../../FunctionParameters/EnumerationParameter" import FunctionParameter from "../../FunctionParameters/FunctionParameter"; import InfoParameter from "../../FunctionParameters/InfoParameter"; import StringParameter from "../../FunctionParameters/StringParameter"; +import { ModelConstructorParameters } from "../../Definition/Model"; import YDYRCatalogFunctionJob from "./YDYRCatalogFunctionJob"; export const DATASETS: { @@ -179,6 +180,12 @@ export default class YDYRCatalogFunction extends CatalogFunctionMixin( CreateModel(YDYRCatalogFunctionTraits) ) { static readonly type = "ydyr"; + + constructor(...args: ModelConstructorParameters) { + super(...args); + makeObservable(this); + } + get type(): string { return YDYRCatalogFunction.type; } @@ -197,7 +204,7 @@ export default class YDYRCatalogFunction extends CatalogFunctionMixin( // https://github.com/TerriaJS/terriajs/issues/4943 } - @computed + @override get description() { return ( super.description ?? diff --git a/lib/Models/Catalog/CatalogFunctions/YDYRCatalogFunctionJob.ts b/lib/Models/Catalog/CatalogFunctions/YDYRCatalogFunctionJob.ts index 9cd94b2265a..07fadd9dcc6 100644 --- a/lib/Models/Catalog/CatalogFunctions/YDYRCatalogFunctionJob.ts +++ b/lib/Models/Catalog/CatalogFunctions/YDYRCatalogFunctionJob.ts @@ -1,4 +1,4 @@ -import { action, runInAction } from "mobx"; +import { action, runInAction, makeObservable } from "mobx"; import filterOutUndefined from "../../../Core/filterOutUndefined"; import isDefined from "../../../Core/isDefined"; import loadJson from "../../../Core/loadJson"; @@ -10,11 +10,17 @@ import CommonStrata from "../../Definition/CommonStrata"; import CreateModel from "../../Definition/CreateModel"; import CsvCatalogItem from "../CatalogItems/CsvCatalogItem"; import proxyCatalogItemUrl from "../proxyCatalogItemUrl"; +import { ModelConstructorParameters } from "../../Definition/Model"; import { ALGORITHMS, DATASETS } from "./YDYRCatalogFunction"; export default class YDYRCatalogFunctionJob extends CatalogFunctionJobMixin( CreateModel(YDYRCatalogFunctionJobTraits) ) { + constructor(...args: ModelConstructorParameters) { + super(...args); + makeObservable(this); + } + get typeName(): string { return "YourDataYourRegions Job"; } diff --git a/lib/Models/Catalog/CatalogGroups/OpenDataSoftCatalogGroup.ts b/lib/Models/Catalog/CatalogGroups/OpenDataSoftCatalogGroup.ts index 62a5c05969d..651a3dd0761 100644 --- a/lib/Models/Catalog/CatalogGroups/OpenDataSoftCatalogGroup.ts +++ b/lib/Models/Catalog/CatalogGroups/OpenDataSoftCatalogGroup.ts @@ -1,7 +1,7 @@ import { ApiClient, fromCatalog } from "@opendatasoft/api-client"; import { Dataset, Facet } from "@opendatasoft/api-client/dist/client/types"; import i18next from "i18next"; -import { action, computed, runInAction } from "mobx"; +import { action, computed, runInAction, makeObservable } from "mobx"; import URI from "urijs"; import filterOutUndefined from "../../../Core/filterOutUndefined"; import isDefined from "../../../Core/isDefined"; @@ -115,6 +115,7 @@ export class OpenDataSoftCatalogStratum extends LoadableStratum( readonly datasets: ValidDataset[] ) { super(); + makeObservable(this); } @computed diff --git a/lib/Models/Catalog/CatalogGroups/SocrataCatalogGroup.ts b/lib/Models/Catalog/CatalogGroups/SocrataCatalogGroup.ts index a978f808ff1..212c3fa5493 100644 --- a/lib/Models/Catalog/CatalogGroups/SocrataCatalogGroup.ts +++ b/lib/Models/Catalog/CatalogGroups/SocrataCatalogGroup.ts @@ -1,5 +1,5 @@ import i18next from "i18next"; -import { action, computed, runInAction } from "mobx"; +import { action, computed, runInAction, makeObservable } from "mobx"; import URI from "urijs"; import isDefined from "../../../Core/isDefined"; import loadJson from "../../../Core/loadJson"; @@ -209,6 +209,7 @@ export class SocrataCatalogStratum extends LoadableStratum( private readonly results: Result[] ) { super(); + makeObservable(this); } @computed diff --git a/lib/Models/Catalog/CatalogGroups/ThreddsCatalogGroup.ts b/lib/Models/Catalog/CatalogGroups/ThreddsCatalogGroup.ts index 157c3ecdec5..9461235dfb7 100644 --- a/lib/Models/Catalog/CatalogGroups/ThreddsCatalogGroup.ts +++ b/lib/Models/Catalog/CatalogGroups/ThreddsCatalogGroup.ts @@ -1,5 +1,5 @@ import i18next from "i18next"; -import { action, computed, runInAction } from "mobx"; +import { action, computed, runInAction, makeObservable, override } from "mobx"; import threddsCrawler from "thredds-catalog-crawler/src/entryBrowser"; import isDefined from "../../../Core/isDefined"; import CatalogMemberMixin from "../../../ModelMixins/CatalogMemberMixin"; @@ -14,6 +14,7 @@ import LoadableStratum from "../../Definition/LoadableStratum"; import { BaseModel } from "../../Definition/Model"; import { proxyCatalogItemBaseUrl } from "../proxyCatalogItemUrl"; import StratumOrder from "../../Definition/StratumOrder"; +import { ModelConstructorParameters } from "../../Definition/Model"; import ThreddsItemReference from "../CatalogReferences/ThreddsItemReference"; interface ThreddsCatalog { @@ -51,6 +52,7 @@ export class ThreddsStratum extends LoadableStratum(ThreddsCatalogGroupTraits) { constructor(readonly _catalogGroup: ThreddsCatalogGroup) { super(); + makeObservable(this); } duplicateLoadableStratum(model: BaseModel): this { @@ -182,6 +184,11 @@ export default class ThreddsCatalogGroup extends UrlMixin( ) { static readonly type = "thredds-group"; + constructor(...args: ModelConstructorParameters) { + super(...args); + makeObservable(this); + } + get type() { return ThreddsCatalogGroup.type; } @@ -190,7 +197,7 @@ export default class ThreddsCatalogGroup extends UrlMixin( return i18next.t("models.thredds.nameGroup"); } - @computed + @override get cacheDuration(): string { if (isDefined(super.cacheDuration)) { return super.cacheDuration; diff --git a/lib/Models/Catalog/CatalogItems/ApiTableCatalogItem.ts b/lib/Models/Catalog/CatalogItems/ApiTableCatalogItem.ts index 04518f37f2a..79eca606dd6 100644 --- a/lib/Models/Catalog/CatalogItems/ApiTableCatalogItem.ts +++ b/lib/Models/Catalog/CatalogItems/ApiTableCatalogItem.ts @@ -1,6 +1,6 @@ import dateFormat from "dateformat"; import { get as _get, map as _map } from "lodash"; -import { computed, observable, runInAction } from "mobx"; +import { computed, observable, runInAction, makeObservable } from "mobx"; import URI from "urijs"; import isDefined from "../../../Core/isDefined"; import loadJson from "../../../Core/loadJson"; @@ -35,6 +35,7 @@ export class ApiTableStratum extends LoadableStratum( constructor(private readonly catalogItem: ApiTableCatalogItem) { super(); + makeObservable(this); } // Set time id columns to `idKey` @@ -71,6 +72,7 @@ export class ApiTableCatalogItem extends AutoRefreshingMixin( constructor(id: string | undefined, terria: Terria) { super(id, terria); + makeObservable(this); this.strata.set( TableAutomaticStylesStratum.stratumName, new TableAutomaticStylesStratum(this) diff --git a/lib/Models/Catalog/CatalogItems/BingMapsCatalogItem.ts b/lib/Models/Catalog/CatalogItems/BingMapsCatalogItem.ts index 95b0ae4f910..d3d3bc70a82 100644 --- a/lib/Models/Catalog/CatalogItems/BingMapsCatalogItem.ts +++ b/lib/Models/Catalog/CatalogItems/BingMapsCatalogItem.ts @@ -1,9 +1,10 @@ -import { computed } from "mobx"; +import { computed, makeObservable } from "mobx"; import Credit from "terriajs-cesium/Source/Core/Credit"; import BingMapsImageryProvider from "terriajs-cesium/Source/Scene/BingMapsImageryProvider"; import CatalogMemberMixin from "../../../ModelMixins/CatalogMemberMixin"; import MappableMixin, { MapItem } from "../../../ModelMixins/MappableMixin"; import BingMapsCatalogItemTraits from "../../../Traits/TraitsClasses/BingMapsCatalogItemTraits"; +import { ModelConstructorParameters } from "../../Definition/Model"; import CreateModel from "../../Definition/CreateModel"; export default class BingMapsCatalogItem extends MappableMixin( @@ -11,6 +12,11 @@ export default class BingMapsCatalogItem extends MappableMixin( ) { static readonly type = "bing-maps"; + constructor(...args: ModelConstructorParameters) { + super(...args); + makeObservable(this); + } + get type() { return BingMapsCatalogItem.type; } diff --git a/lib/Models/Catalog/CatalogItems/CartoMapV1CatalogItem.ts b/lib/Models/Catalog/CatalogItems/CartoMapV1CatalogItem.ts index 24f3e67e334..061f2635b29 100644 --- a/lib/Models/Catalog/CatalogItems/CartoMapV1CatalogItem.ts +++ b/lib/Models/Catalog/CatalogItems/CartoMapV1CatalogItem.ts @@ -1,4 +1,4 @@ -import { computed, runInAction } from "mobx"; +import { computed, runInAction, makeObservable, override } from "mobx"; import Resource from "terriajs-cesium/Source/Core/Resource"; import UrlTemplateImageryProvider from "terriajs-cesium/Source/Scene/UrlTemplateImageryProvider"; import isDefined from "../../../Core/isDefined"; @@ -11,6 +11,7 @@ import CreateModel from "../../Definition/CreateModel"; import LoadableStratum from "../../Definition/LoadableStratum"; import { BaseModel } from "../../Definition/Model"; import proxyCatalogItemUrl from "../proxyCatalogItemUrl"; +import { ModelConstructorParameters } from "../../Definition/Model"; import StratumOrder from "../../Definition/StratumOrder"; export class CartoLoadableStratum extends LoadableStratum( @@ -107,6 +108,11 @@ export default class CartoMapV1CatalogItem extends MappableMixin( ) { static readonly type = "carto"; + constructor(...args: ModelConstructorParameters) { + super(...args); + makeObservable(this); + } + get type() { return CartoMapV1CatalogItem.type; } @@ -135,7 +141,8 @@ export default class CartoMapV1CatalogItem extends MappableMixin( }); } - @computed get cacheDuration(): string { + @override + get cacheDuration(): string { if (isDefined(super.cacheDuration)) { return super.cacheDuration; } diff --git a/lib/Models/Catalog/CatalogItems/CartoMapV3CatalogItem.ts b/lib/Models/Catalog/CatalogItems/CartoMapV3CatalogItem.ts index 97040dca776..e71af758eb6 100644 --- a/lib/Models/Catalog/CatalogItems/CartoMapV3CatalogItem.ts +++ b/lib/Models/Catalog/CatalogItems/CartoMapV3CatalogItem.ts @@ -1,6 +1,6 @@ import { featureCollection, Geometry, GeometryCollection } from "@turf/helpers"; import i18next from "i18next"; -import { computed, observable, runInAction } from "mobx"; +import { computed, observable, runInAction, makeObservable } from "mobx"; import RequestErrorEvent from "terriajs-cesium/Source/Core/RequestErrorEvent"; import URI from "urijs"; import JsonValue, { @@ -30,6 +30,7 @@ class CartoMapV3Stratum extends LoadableStratum(GeoJsonTraits) { static stratumName = "cartoMapV3Stratum"; constructor(readonly catalogItem: CartoMapV3CatalogItem) { super(); + makeObservable(this); } static load(item: CartoMapV3CatalogItem) { @@ -74,6 +75,8 @@ export default class CartoMapV3CatalogItem extends GeoJsonMixin( ) { super(id, terria, sourceReference); + makeObservable(this); + if (this.strata.get(CartoMapV3Stratum.stratumName) === undefined) { runInAction(() => { this.strata.set( diff --git a/lib/Models/Catalog/CatalogItems/Cesium3DTilesCatalogItem.ts b/lib/Models/Catalog/CatalogItems/Cesium3DTilesCatalogItem.ts index 731d79aa759..1344bf42262 100644 --- a/lib/Models/Catalog/CatalogItems/Cesium3DTilesCatalogItem.ts +++ b/lib/Models/Catalog/CatalogItems/Cesium3DTilesCatalogItem.ts @@ -1,5 +1,5 @@ import i18next from "i18next"; -import { action } from "mobx"; +import { action, makeObservable } from "mobx"; import BoundingSphere from "terriajs-cesium/Source/Core/BoundingSphere"; import Cartesian2 from "terriajs-cesium/Source/Core/Cartesian2"; import Cartographic from "terriajs-cesium/Source/Core/Cartographic"; @@ -15,6 +15,7 @@ import SearchableItemMixin, { } from "../../../ModelMixins/SearchableItemMixin"; import Cesium3DTilesCatalogItemTraits from "../../../Traits/TraitsClasses/Cesium3DTilesCatalogItemTraits"; import CreateModel from "../../Definition/CreateModel"; +import { ModelConstructorParameters } from "../../Definition/Model"; import { ItemSearchResult } from "../../ItemSearchProviders/ItemSearchProvider"; // A property name used for tagging a search result feature for highlighting/hiding. @@ -27,6 +28,12 @@ export default class Cesium3DTilesCatalogItem extends SearchableItemMixin( ) { static readonly type = "3d-tiles"; readonly type = Cesium3DTilesCatalogItem.type; + + constructor(...args: ModelConstructorParameters) { + super(...args); + makeObservable(this); + } + get typeName() { return i18next.t("models.cesiumTerrain.name3D"); } diff --git a/lib/Models/Catalog/CatalogItems/CesiumTerrainCatalogItem.ts b/lib/Models/Catalog/CatalogItems/CesiumTerrainCatalogItem.ts index e166868ef91..15583cd5cc4 100644 --- a/lib/Models/Catalog/CatalogItems/CesiumTerrainCatalogItem.ts +++ b/lib/Models/Catalog/CatalogItems/CesiumTerrainCatalogItem.ts @@ -1,12 +1,19 @@ -import { action, computed, observable, runInAction } from "mobx"; +import { + computed, + makeObservable, + observable, + override, + runInAction +} from "mobx"; import CesiumTerrainProvider from "terriajs-cesium/Source/Core/CesiumTerrainProvider"; import IonResource from "terriajs-cesium/Source/Core/IonResource"; +import TerriaError from "../../../Core/TerriaError"; import CatalogMemberMixin from "../../../ModelMixins/CatalogMemberMixin"; import MappableMixin from "../../../ModelMixins/MappableMixin"; import UrlMixin from "../../../ModelMixins/UrlMixin"; import CesiumTerrainCatalogItemTraits from "../../../Traits/TraitsClasses/CesiumTerrainCatalogItemTraits"; import CreateModel from "../../Definition/CreateModel"; -import TerriaError from "../../../Core/TerriaError"; +import { ModelConstructorParameters } from "../../Definition/Model"; export default class CesiumTerrainCatalogItem extends UrlMixin( MappableMixin(CatalogMemberMixin(CreateModel(CesiumTerrainCatalogItemTraits))) @@ -19,11 +26,16 @@ export default class CesiumTerrainCatalogItem extends UrlMixin( @observable private terrainProvider: CesiumTerrainProvider | undefined = undefined; + constructor(...args: ModelConstructorParameters) { + super(...args); + makeObservable(this); + } + get type() { return CesiumTerrainCatalogItem.type; } - @computed + @override get disableZoomTo() { return true; } @@ -33,7 +45,7 @@ export default class CesiumTerrainCatalogItem extends UrlMixin( return this.terria.terrainProvider === this.terrainProvider; } - @computed + @override get shortReport() { if (super.shortReport === undefined) { const status = this.isTerrainActive ? "In use" : "Not in use"; diff --git a/lib/Models/Catalog/CatalogItems/CompositeCatalogItem.ts b/lib/Models/Catalog/CatalogItems/CompositeCatalogItem.ts index 02ab48c152f..21c204e8c33 100644 --- a/lib/Models/Catalog/CatalogItems/CompositeCatalogItem.ts +++ b/lib/Models/Catalog/CatalogItems/CompositeCatalogItem.ts @@ -1,5 +1,5 @@ import i18next from "i18next"; -import { action, autorun, computed, runInAction } from "mobx"; +import { action, autorun, computed, runInAction, makeObservable } from "mobx"; import DeveloperError from "terriajs-cesium/Source/Core/DeveloperError"; import filterOutUndefined from "../../../Core/filterOutUndefined"; import isDefined from "../../../Core/isDefined"; @@ -10,6 +10,7 @@ import ModelReference from "../../../Traits/ModelReference"; import CompositeCatalogItemTraits from "../../../Traits/TraitsClasses/CompositeCatalogItemTraits"; import CommonStrata from "../../Definition/CommonStrata"; import CreateModel from "../../Definition/CreateModel"; +import { ModelConstructorParameters } from "../../Definition/Model"; import { BaseModel } from "../../Definition/Model"; export default class CompositeCatalogItem extends MappableMixin( @@ -21,6 +22,11 @@ export default class CompositeCatalogItem extends MappableMixin( this.syncVisibilityToMembers(); }); + constructor(...args: ModelConstructorParameters) { + super(...args); + makeObservable(this); + } + get type() { return CompositeCatalogItem.type; } diff --git a/lib/Models/Catalog/CatalogItems/CsvCatalogItem.ts b/lib/Models/Catalog/CatalogItems/CsvCatalogItem.ts index 4322a43f9a9..280bcf836b6 100644 --- a/lib/Models/Catalog/CatalogItems/CsvCatalogItem.ts +++ b/lib/Models/Catalog/CatalogItems/CsvCatalogItem.ts @@ -1,9 +1,8 @@ import i18next from "i18next"; -import { computed, runInAction } from "mobx"; +import { computed, makeObservable, override, runInAction } from "mobx"; import isDefined from "../../../Core/isDefined"; import TerriaError from "../../../Core/TerriaError"; import AutoRefreshingMixin from "../../../ModelMixins/AutoRefreshingMixin"; -import CatalogMemberMixin from "../../../ModelMixins/CatalogMemberMixin"; import TableMixin from "../../../ModelMixins/TableMixin"; import UrlMixin from "../../../ModelMixins/UrlMixin"; import Csv from "../../../Table/Csv"; @@ -44,6 +43,7 @@ export default class CsvCatalogItem sourceReference: BaseModel | undefined ) { super(id, terria, sourceReference); + makeObservable(this); this.strata.set( TableAutomaticStylesStratum.stratumName, new TableAutomaticStylesStratum(this) @@ -63,7 +63,7 @@ export default class CsvCatalogItem return isDefined(this._csvFile); } - @computed + @override get _canExportData() { return ( isDefined(this._csvFile) || @@ -72,7 +72,7 @@ export default class CsvCatalogItem ); } - @computed + @override get cacheDuration() { return super.cacheDuration || "1d"; } @@ -111,7 +111,8 @@ export default class CsvCatalogItem /* * Called by AutoRefreshingMixin to get the polling interval */ - @computed get refreshInterval() { + @override + get refreshInterval() { if (this.refreshUrl) { return this.polling.seconds; } diff --git a/lib/Models/Catalog/CatalogItems/CzmlCatalogItem.ts b/lib/Models/Catalog/CatalogItems/CzmlCatalogItem.ts index f5178429fc2..6be0d08849a 100644 --- a/lib/Models/Catalog/CatalogItems/CzmlCatalogItem.ts +++ b/lib/Models/Catalog/CatalogItems/CzmlCatalogItem.ts @@ -1,5 +1,5 @@ import i18next from "i18next"; -import { action, computed, observable, toJS } from "mobx"; +import { action, computed, observable, toJS, makeObservable } from "mobx"; import JulianDate from "terriajs-cesium/Source/Core/JulianDate"; import CzmlDataSource from "terriajs-cesium/Source/DataSources/CzmlDataSource"; import DataSourceClock from "terriajs-cesium/Source/DataSources/DataSourceClock"; @@ -17,6 +17,7 @@ import LoadableStratum from "../../Definition/LoadableStratum"; import { BaseModel } from "../../Definition/Model"; import StratumOrder from "../../Definition/StratumOrder"; import HasLocalData from "../../HasLocalData"; +import { ModelConstructorParameters } from "../../Definition/Model"; import proxyCatalogItemUrl from "../proxyCatalogItemUrl"; /** @@ -28,6 +29,7 @@ class CzmlTimeVaryingStratum extends LoadableStratum(CzmlCatalogItemTraits) { constructor(readonly catalogItem: CzmlCatalogItem) { super(); + makeObservable(this); } duplicateLoadableStratum(model: BaseModel): this { @@ -74,6 +76,12 @@ export default class CzmlCatalogItem implements TimeVarying, HasLocalData { static readonly type = "czml"; + + constructor(...args: ModelConstructorParameters) { + super(...args); + makeObservable(this); + } + get type() { return CzmlCatalogItem.type; } diff --git a/lib/Models/Catalog/CatalogItems/GeoJsonCatalogItem.ts b/lib/Models/Catalog/CatalogItems/GeoJsonCatalogItem.ts index a22381a993b..83f70fa6ec4 100644 --- a/lib/Models/Catalog/CatalogItems/GeoJsonCatalogItem.ts +++ b/lib/Models/Catalog/CatalogItems/GeoJsonCatalogItem.ts @@ -1,6 +1,6 @@ import i18next from "i18next"; import { get as _get, set as _set } from "lodash"; -import { computed, toJS } from "mobx"; +import { computed, toJS, makeObservable } from "mobx"; import isDefined from "../../../Core/isDefined"; import JsonValue, { isJsonObject } from "../../../Core/Json"; import loadBlob, { isZip, parseZipJsonBlob } from "../../../Core/loadBlob"; @@ -14,6 +14,7 @@ import GeoJsonCatalogItemTraits from "../../../Traits/TraitsClasses/GeoJsonCatal import CreateModel from "../../Definition/CreateModel"; import HasLocalData from "../../HasLocalData"; import Terria from "../../Terria"; +import { ModelConstructorParameters } from "../../Definition/Model"; import proxyCatalogItemUrl from "../proxyCatalogItemUrl"; class GeoJsonCatalogItem @@ -21,6 +22,12 @@ class GeoJsonCatalogItem implements HasLocalData { static readonly type = "geojson"; + + constructor(...args: ModelConstructorParameters) { + super(...args); + makeObservable(this); + } + get type() { return GeoJsonCatalogItem.type; } diff --git a/lib/Models/Catalog/CatalogItems/GeoRssCatalogItem.ts b/lib/Models/Catalog/CatalogItems/GeoRssCatalogItem.ts index c1620c4a098..8192260f216 100644 --- a/lib/Models/Catalog/CatalogItems/GeoRssCatalogItem.ts +++ b/lib/Models/Catalog/CatalogItems/GeoRssCatalogItem.ts @@ -1,5 +1,5 @@ import i18next from "i18next"; -import { computed, runInAction } from "mobx"; +import { computed, runInAction, makeObservable } from "mobx"; import getFilenameFromUri from "terriajs-cesium/Source/Core/getFilenameFromUri"; import RuntimeError from "terriajs-cesium/Source/Core/RuntimeError"; import isDefined from "../../../Core/isDefined"; @@ -23,6 +23,7 @@ import LoadableStratum from "../../Definition/LoadableStratum"; import { BaseModel } from "../../Definition/Model"; import StratumOrder from "../../Definition/StratumOrder"; import HasLocalData from "../../HasLocalData"; +import { ModelConstructorParameters } from "../../Definition/Model"; import proxyCatalogItemUrl from "../proxyCatalogItemUrl"; enum GeoRssFormat { @@ -57,6 +58,7 @@ class GeoRssStratum extends LoadableStratum(GeoRssCatalogItemTraits) { private readonly _feed?: Feed ) { super(); + makeObservable(this); } duplicateLoadableStratum(newModel: BaseModel): this { @@ -128,6 +130,12 @@ export default class GeoRssCatalogItem implements HasLocalData { static readonly type = "georss"; + + constructor(...args: ModelConstructorParameters) { + super(...args); + makeObservable(this); + } + get type() { return GeoRssCatalogItem.type; } diff --git a/lib/Models/Catalog/CatalogItems/GpxCatalogItem.ts b/lib/Models/Catalog/CatalogItems/GpxCatalogItem.ts index f3db2afff1a..a4c0e3b95c1 100644 --- a/lib/Models/Catalog/CatalogItems/GpxCatalogItem.ts +++ b/lib/Models/Catalog/CatalogItems/GpxCatalogItem.ts @@ -1,5 +1,5 @@ import i18next from "i18next"; -import { computed } from "mobx"; +import { computed, makeObservable, override } from "mobx"; import getFilenameFromUri from "terriajs-cesium/Source/Core/getFilenameFromUri"; import isDefined from "../../../Core/isDefined"; import loadText from "../../../Core/loadText"; @@ -10,6 +10,7 @@ import GeoJsonMixin, { } from "../../../ModelMixins/GeojsonMixin"; import GpxCatalogItemTraits from "../../../Traits/TraitsClasses/GpxCatalogItemTraits"; import CreateModel from "../../Definition/CreateModel"; +import { ModelConstructorParameters } from "../../Definition/Model"; import proxyCatalogItemUrl from "../proxyCatalogItemUrl"; const toGeoJSON = require("@mapbox/togeojson"); @@ -17,6 +18,11 @@ const toGeoJSON = require("@mapbox/togeojson"); class GpxCatalogItem extends GeoJsonMixin(CreateModel(GpxCatalogItemTraits)) { static readonly type = "gpx"; + constructor(...args: ModelConstructorParameters) { + super(...args); + makeObservable(this); + } + get type() { return GpxCatalogItem.type; } @@ -68,7 +74,8 @@ class GpxCatalogItem extends GeoJsonMixin(CreateModel(GpxCatalogItemTraits)) { return Promise.resolve(); } - @computed get name() { + @override + get name() { if (this.url && super.name === this.url) { return getFilenameFromUri(this.url); } diff --git a/lib/Models/Catalog/CatalogItems/IonImageryCatalogItem.ts b/lib/Models/Catalog/CatalogItems/IonImageryCatalogItem.ts index b0d8ab2731b..6aaad2aa4e4 100644 --- a/lib/Models/Catalog/CatalogItems/IonImageryCatalogItem.ts +++ b/lib/Models/Catalog/CatalogItems/IonImageryCatalogItem.ts @@ -1,9 +1,10 @@ -import { computed } from "mobx"; +import { computed, makeObservable } from "mobx"; import IonImageryProvider from "terriajs-cesium/Source/Scene/IonImageryProvider"; import isDefined from "../../../Core/isDefined"; import CatalogMemberMixin from "../../../ModelMixins/CatalogMemberMixin"; import MappableMixin, { MapItem } from "../../../ModelMixins/MappableMixin"; import IonImageryCatalogItemTraits from "../../../Traits/TraitsClasses/IonImageryCatalogItemTraits"; +import { ModelConstructorParameters } from "../../Definition/Model"; import CreateModel from "../../Definition/CreateModel"; export default class IonImageryCatalogItem extends MappableMixin( @@ -11,6 +12,11 @@ export default class IonImageryCatalogItem extends MappableMixin( ) { static readonly type = "ion-imagery"; + constructor(...args: ModelConstructorParameters) { + super(...args); + makeObservable(this); + } + get type() { return IonImageryCatalogItem.type; } diff --git a/lib/Models/Catalog/CatalogItems/KmlCatalogItem.ts b/lib/Models/Catalog/CatalogItems/KmlCatalogItem.ts index 9bd32db4109..8d7cc0e0e30 100644 --- a/lib/Models/Catalog/CatalogItems/KmlCatalogItem.ts +++ b/lib/Models/Catalog/CatalogItems/KmlCatalogItem.ts @@ -1,5 +1,5 @@ import i18next from "i18next"; -import { computed } from "mobx"; +import { computed, makeObservable, override } from "mobx"; import Cartesian3 from "terriajs-cesium/Source/Core/Cartesian3"; import Cartographic from "terriajs-cesium/Source/Core/Cartographic"; import Ellipsoid from "terriajs-cesium/Source/Core/Ellipsoid"; @@ -19,6 +19,7 @@ import UrlMixin from "../../../ModelMixins/UrlMixin"; import KmlCatalogItemTraits from "../../../Traits/TraitsClasses/KmlCatalogItemTraits"; import CreateModel from "../../Definition/CreateModel"; import HasLocalData from "../../HasLocalData"; +import { ModelConstructorParameters } from "../../Definition/Model"; import proxyCatalogItemUrl from "../proxyCatalogItemUrl"; const kmzRegex = /\.kmz$/i; @@ -30,6 +31,12 @@ class KmlCatalogItem implements HasLocalData { static readonly type = "kml"; + + constructor(...args: ModelConstructorParameters) { + super(...args); + makeObservable(this); + } + get type() { return KmlCatalogItem.type; } @@ -47,7 +54,8 @@ class KmlCatalogItem return isDefined(this._kmlFile); } - @computed get cacheDuration(): string { + @override + get cacheDuration(): string { if (isDefined(super.cacheDuration)) { return super.cacheDuration; } diff --git a/lib/Models/Catalog/CatalogItems/MapboxMapCatalogItem.ts b/lib/Models/Catalog/CatalogItems/MapboxMapCatalogItem.ts index 19b12c66819..fcbad02e2ee 100644 --- a/lib/Models/Catalog/CatalogItems/MapboxMapCatalogItem.ts +++ b/lib/Models/Catalog/CatalogItems/MapboxMapCatalogItem.ts @@ -1,9 +1,10 @@ -import { computed } from "mobx"; +import { computed, makeObservable } from "mobx"; import MapboxImageryProvider from "terriajs-cesium/Source/Scene/MapboxImageryProvider"; import CatalogMemberMixin from "../../../ModelMixins/CatalogMemberMixin"; import MappableMixin, { MapItem } from "../../../ModelMixins/MappableMixin"; import MapboxMapCatalogItemTraits from "../../../Traits/TraitsClasses/MapboxMapCatalogItemTraits"; import CreateModel from "../../Definition/CreateModel"; +import { ModelConstructorParameters } from "../../Definition/Model"; import proxyCatalogItemUrl from "../proxyCatalogItemUrl"; /** @@ -15,6 +16,11 @@ export default class MapboxMapCatalogItem extends CatalogMemberMixin( static readonly type = "mapbox-map"; readonly type = MapboxMapCatalogItem.type; + constructor(...args: ModelConstructorParameters) { + super(...args); + makeObservable(this); + } + @computed private get imageryProvider(): MapboxImageryProvider | undefined { const mapId = this.mapId; diff --git a/lib/Models/Catalog/CatalogItems/MapboxStyleCatalogItem.ts b/lib/Models/Catalog/CatalogItems/MapboxStyleCatalogItem.ts index ebb5936cf8a..cf4af85718b 100644 --- a/lib/Models/Catalog/CatalogItems/MapboxStyleCatalogItem.ts +++ b/lib/Models/Catalog/CatalogItems/MapboxStyleCatalogItem.ts @@ -1,8 +1,9 @@ -import { computed } from "mobx"; +import { computed, makeObservable } from "mobx"; import MapboxStyleImageryProvider from "terriajs-cesium/Source/Scene/MapboxStyleImageryProvider"; import CatalogMemberMixin from "../../../ModelMixins/CatalogMemberMixin"; import MappableMixin, { MapItem } from "../../../ModelMixins/MappableMixin"; import MapboxStyleCatalogItemTraits from "../../../Traits/TraitsClasses/MapboxStyleCatalogItemTraits"; +import { ModelConstructorParameters } from "../../Definition/Model"; import CreateModel from "../../Definition/CreateModel"; /** @@ -14,6 +15,11 @@ export default class MapboxStyleCatalogItem extends MappableMixin( static readonly type = "mapbox-style"; readonly type = MapboxStyleCatalogItem.type; + constructor(...args: ModelConstructorParameters) { + super(...args); + makeObservable(this); + } + forceLoadMapItems() { return Promise.resolve(); } diff --git a/lib/Models/Catalog/CatalogItems/MapboxVectorTileCatalogItem.ts b/lib/Models/Catalog/CatalogItems/MapboxVectorTileCatalogItem.ts index cbb458f9eb8..7e9ee34aefa 100644 --- a/lib/Models/Catalog/CatalogItems/MapboxVectorTileCatalogItem.ts +++ b/lib/Models/Catalog/CatalogItems/MapboxVectorTileCatalogItem.ts @@ -1,6 +1,12 @@ import bbox from "@turf/bbox"; import i18next from "i18next"; -import { computed, observable, runInAction } from "mobx"; +import { + computed, + observable, + runInAction, + makeObservable, + override +} from "mobx"; import { GeomType, json_style, @@ -28,6 +34,7 @@ import createStratumInstance from "../../Definition/createStratumInstance"; import LoadableStratum from "../../Definition/LoadableStratum"; import { BaseModel } from "../../Definition/Model"; import StratumOrder from "../../Definition/StratumOrder"; +import { ModelConstructorParameters } from "../../Definition/Model"; import proxyCatalogItemUrl from "../proxyCatalogItemUrl"; class MapboxVectorTileLoadableStratum extends LoadableStratum( @@ -40,6 +47,7 @@ class MapboxVectorTileLoadableStratum extends LoadableStratum( readonly styleJson: JsonObject | undefined ) { super(); + makeObservable(this); } duplicateLoadableStratum(newModel: BaseModel): this { @@ -110,11 +118,13 @@ StratumOrder.addLoadStratum(MapboxVectorTileLoadableStratum.stratumName); class MapboxVectorTileCatalogItem extends MappableMixin( UrlMixin(CatalogMemberMixin(CreateModel(MapboxVectorTileCatalogItemTraits))) ) { - @observable - public readonly forceProxy = true; - static readonly type = "mvt"; + constructor(...args: ModelConstructorParameters) { + super(...args); + makeObservable(this); + } + get type() { return MapboxVectorTileCatalogItem.type; } @@ -123,6 +133,11 @@ class MapboxVectorTileCatalogItem extends MappableMixin( return i18next.t("models.mapboxVectorTile.name"); } + @override + get forceProxy() { + return true; + } + async forceLoadMetadata() { const stratum = await MapboxVectorTileLoadableStratum.load(this); runInAction(() => { diff --git a/lib/Models/Catalog/CatalogItems/OpenDataSoftCatalogItem.ts b/lib/Models/Catalog/CatalogItems/OpenDataSoftCatalogItem.ts index d9cf67064c2..eb896ffdd8c 100644 --- a/lib/Models/Catalog/CatalogItems/OpenDataSoftCatalogItem.ts +++ b/lib/Models/Catalog/CatalogItems/OpenDataSoftCatalogItem.ts @@ -1,7 +1,7 @@ import { ApiClient, fromCatalog } from "@opendatasoft/api-client"; import { Dataset } from "@opendatasoft/api-client/dist/client/types"; import i18next from "i18next"; -import { computed, runInAction } from "mobx"; +import { computed, makeObservable, override, runInAction } from "mobx"; import ms from "ms"; import Mustache from "mustache"; import JulianDate from "terriajs-cesium/Source/Core/JulianDate"; @@ -12,7 +12,6 @@ import isDefined from "../../../Core/isDefined"; import { isJsonObject, isJsonString } from "../../../Core/Json"; import TerriaError from "../../../Core/TerriaError"; import AutoRefreshingMixin from "../../../ModelMixins/AutoRefreshingMixin"; -import CatalogMemberMixin from "../../../ModelMixins/CatalogMemberMixin"; import TableMixin from "../../../ModelMixins/TableMixin"; import UrlMixin from "../../../ModelMixins/UrlMixin"; import TableAutomaticStylesStratum from "../../../Table/TableAutomaticStylesStratum"; @@ -143,6 +142,7 @@ export class OpenDataSoftDatasetStratum extends LoadableStratum( private readonly pointTimeSeries?: PointTimeSeries[] ) { super(); + makeObservable(this); } @computed get name() { @@ -546,6 +546,7 @@ export default class OpenDataSoftCatalogItem sourceReference: BaseModel | undefined ) { super(id, terria, sourceReference); + makeObservable(this); this.strata.set( TableAutomaticStylesStratum.stratumName, new TableAutomaticStylesStratum(this) @@ -673,7 +674,7 @@ export default class OpenDataSoftCatalogItem } } - @computed + @override get selectableDimensions() { return filterOutUndefined([ this.availableFieldsDimension, diff --git a/lib/Models/Catalog/CatalogItems/OpenStreetMapCatalogItem.ts b/lib/Models/Catalog/CatalogItems/OpenStreetMapCatalogItem.ts index 8a05bf0daac..7e8525fa607 100644 --- a/lib/Models/Catalog/CatalogItems/OpenStreetMapCatalogItem.ts +++ b/lib/Models/Catalog/CatalogItems/OpenStreetMapCatalogItem.ts @@ -1,4 +1,4 @@ -import { computed } from "mobx"; +import { computed, makeObservable } from "mobx"; import UrlTemplateImageryProvider from "terriajs-cesium/Source/Scene/UrlTemplateImageryProvider"; import URI from "urijs"; import isDefined from "../../../Core/isDefined"; @@ -6,6 +6,7 @@ import CatalogMemberMixin from "../../../ModelMixins/CatalogMemberMixin"; import MappableMixin, { MapItem } from "../../../ModelMixins/MappableMixin"; import OpenStreetMapCatalogItemTraits from "../../../Traits/TraitsClasses/OpenStreetMapCatalogItemTraits"; import CreateModel from "../../Definition/CreateModel"; +import { ModelConstructorParameters } from "../../Definition/Model"; import proxyCatalogItemUrl from "../proxyCatalogItemUrl"; export default class OpenStreetMapCatalogItem extends MappableMixin( @@ -13,6 +14,11 @@ export default class OpenStreetMapCatalogItem extends MappableMixin( ) { static readonly type = "open-street-map"; + constructor(...args: ModelConstructorParameters) { + super(...args); + makeObservable(this); + } + get type() { return OpenStreetMapCatalogItem.type; } diff --git a/lib/Models/Catalog/CatalogItems/SenapsLocationsCatalogItem.ts b/lib/Models/Catalog/CatalogItems/SenapsLocationsCatalogItem.ts index 94a289f9a82..f2673a11e84 100644 --- a/lib/Models/Catalog/CatalogItems/SenapsLocationsCatalogItem.ts +++ b/lib/Models/Catalog/CatalogItems/SenapsLocationsCatalogItem.ts @@ -1,5 +1,5 @@ import i18next from "i18next"; -import { computed, runInAction } from "mobx"; +import { computed, runInAction, makeObservable } from "mobx"; import URI from "urijs"; import isDefined from "../../../Core/isDefined"; import { JsonObject } from "../../../Core/Json"; @@ -17,6 +17,7 @@ import GeoJsonCatalogItem from "./GeoJsonCatalogItem"; import LoadableStratum from "../../Definition/LoadableStratum"; import { BaseModel } from "../../Definition/Model"; import proxyCatalogItemUrl from "../proxyCatalogItemUrl"; +import { ModelConstructorParameters } from "../../Definition/Model"; import StratumOrder from "../../Definition/StratumOrder"; export interface SenapsFeature { @@ -235,6 +236,11 @@ class SenapsLocationsCatalogItem extends MappableMixin( ) { static readonly type = "senaps-locations"; + constructor(...args: ModelConstructorParameters) { + super(...args); + makeObservable(this); + } + get type() { return SenapsLocationsCatalogItem.type; } diff --git a/lib/Models/Catalog/CatalogItems/ShapefileCatalogItem.ts b/lib/Models/Catalog/CatalogItems/ShapefileCatalogItem.ts index d513443ca08..bf031acb262 100644 --- a/lib/Models/Catalog/CatalogItems/ShapefileCatalogItem.ts +++ b/lib/Models/Catalog/CatalogItems/ShapefileCatalogItem.ts @@ -1,6 +1,6 @@ import * as geoJsonMerge from "@mapbox/geojson-merge"; import i18next from "i18next"; -import { computed } from "mobx"; +import { computed, makeObservable } from "mobx"; import * as shp from "shpjs"; import isDefined from "../../../Core/isDefined"; import JsonValue, { isJsonObject, JsonArray } from "../../../Core/Json"; @@ -14,6 +14,7 @@ import ShapefileCatalogItemTraits from "../../../Traits/TraitsClasses/ShapefileC import CreateModel from "../../Definition/CreateModel"; import HasLocalData from "../../HasLocalData"; import proxyCatalogItemUrl from "../proxyCatalogItemUrl"; +import { ModelConstructorParameters } from "../../Definition/Model"; import { fileApiNotSupportedError } from "./GeoJsonCatalogItem"; export function isJsonArrayOrDeepArrayOfObjects( @@ -32,6 +33,12 @@ class ShapefileCatalogItem implements HasLocalData { static readonly type = "shp"; + + constructor(...args: ModelConstructorParameters) { + super(...args); + makeObservable(this); + } + get type() { return ShapefileCatalogItem.type; } diff --git a/lib/Models/Catalog/CatalogItems/SocrataMapViewCatalogItem.ts b/lib/Models/Catalog/CatalogItems/SocrataMapViewCatalogItem.ts index 2d292f0a6df..d969edf0085 100644 --- a/lib/Models/Catalog/CatalogItems/SocrataMapViewCatalogItem.ts +++ b/lib/Models/Catalog/CatalogItems/SocrataMapViewCatalogItem.ts @@ -1,4 +1,4 @@ -import { computed, runInAction } from "mobx"; +import { computed, runInAction, makeObservable } from "mobx"; import loadJson from "../../../Core/loadJson"; import TerriaError from "../../../Core/TerriaError"; import CatalogMemberMixin from "../../../ModelMixins/CatalogMemberMixin"; @@ -122,6 +122,7 @@ export class SocrataMapViewStratum extends LoadableStratum( private readonly view: View ) { super(); + makeObservable(this); } } diff --git a/lib/Models/Catalog/CatalogItems/UrlTemplateImageryCatalogItem.ts b/lib/Models/Catalog/CatalogItems/UrlTemplateImageryCatalogItem.ts index 9c8fcb22bc1..dbd43b4ad9d 100644 --- a/lib/Models/Catalog/CatalogItems/UrlTemplateImageryCatalogItem.ts +++ b/lib/Models/Catalog/CatalogItems/UrlTemplateImageryCatalogItem.ts @@ -1,10 +1,11 @@ -import { computed } from "mobx"; +import { computed, makeObservable } from "mobx"; import UrlTemplateImageryProvider from "terriajs-cesium/Source/Scene/UrlTemplateImageryProvider"; import isDefined from "../../../Core/isDefined"; import CatalogMemberMixin from "../../../ModelMixins/CatalogMemberMixin"; import MappableMixin, { MapItem } from "../../../ModelMixins/MappableMixin"; import UrlTemplateImageryCatalogItemTraits from "../../../Traits/TraitsClasses/UrlTemplateImageryCatalogItemTraits"; import CreateModel from "../../Definition/CreateModel"; +import { ModelConstructorParameters } from "../../Definition/Model"; import proxyCatalogItemUrl from "../proxyCatalogItemUrl"; /** See https://cesium.com/learn/cesiumjs/ref-doc/UrlTemplateImageryProvider.html#url for available keywords: @@ -18,6 +19,11 @@ export default class UrlTemplateImageryCatalogItem extends MappableMixin( ) { static readonly type = "url-template-imagery"; + constructor(...args: ModelConstructorParameters) { + super(...args); + makeObservable(this); + } + get type() { return UrlTemplateImageryCatalogItem.type; } diff --git a/lib/Models/Catalog/CatalogReferences/MagdaReference.ts b/lib/Models/Catalog/CatalogReferences/MagdaReference.ts index ed1ec84caef..f11d0b32c8b 100644 --- a/lib/Models/Catalog/CatalogReferences/MagdaReference.ts +++ b/lib/Models/Catalog/CatalogReferences/MagdaReference.ts @@ -1,5 +1,5 @@ import i18next from "i18next"; -import { computed, toJS } from "mobx"; +import { computed, toJS, makeObservable, override } from "mobx"; import { createTransformer } from "mobx-utils"; import filterOutUndefined from "../../../Core/filterOutUndefined"; import isDefined from "../../../Core/isDefined"; @@ -134,6 +134,8 @@ export default class MagdaReference extends AccessControlMixin( ) { super(id, terria, sourceReference, strata); + makeObservable(this); + this.setTrait( CommonStrata.defaults, "distributionFormats", @@ -158,7 +160,7 @@ export default class MagdaReference extends AccessControlMixin( ); } - @computed + @override get accessType(): string { const access = getAccessTypeFromMagdaRecord(this.magdaRecord); return access || super.accessType; @@ -788,7 +790,8 @@ export default class MagdaReference extends AccessControlMixin( return undefined; } - @computed get cacheDuration(): string { + @override + get cacheDuration(): string { if (isDefined(super.cacheDuration)) { return super.cacheDuration; } diff --git a/lib/Models/Catalog/Ckan/CkanCatalogGroup.ts b/lib/Models/Catalog/Ckan/CkanCatalogGroup.ts index f095c160a0c..589c1bd0bea 100644 --- a/lib/Models/Catalog/Ckan/CkanCatalogGroup.ts +++ b/lib/Models/Catalog/Ckan/CkanCatalogGroup.ts @@ -1,5 +1,12 @@ import i18next from "i18next"; -import { action, computed, observable, runInAction } from "mobx"; +import { + action, + computed, + observable, + runInAction, + makeObservable, + override +} from "mobx"; import URI from "urijs"; import flatten from "../../../Core/flatten"; import isDefined from "../../../Core/isDefined"; @@ -72,6 +79,7 @@ export class CkanServerStratum extends LoadableStratum(CkanCatalogGroupTraits) { private readonly _ckanResponse: CkanServerResponse ) { super(); + makeObservable(this); this.datasets = this.getDatasets(); this.filteredDatasets = this.getFilteredDatasets(); this.groups = this.getGroups(); @@ -427,6 +435,8 @@ export default class CkanCatalogGroup extends UrlMixin( ) { super(uniqueId, terria, sourceReference); + makeObservable(this); + this.strata.set( CkanDefaultFormatsStratum.stratumName, new CkanDefaultFormatsStratum() @@ -441,7 +451,8 @@ export default class CkanCatalogGroup extends UrlMixin( return i18next.t("models.ckan.nameServer"); } - @computed get cacheDuration(): string { + @override + get cacheDuration(): string { if (isDefined(super.cacheDuration)) { return super.cacheDuration; } diff --git a/lib/Models/Catalog/Ckan/CkanItemReference.ts b/lib/Models/Catalog/Ckan/CkanItemReference.ts index f0ac6803c15..388de0beff3 100644 --- a/lib/Models/Catalog/Ckan/CkanItemReference.ts +++ b/lib/Models/Catalog/Ckan/CkanItemReference.ts @@ -1,5 +1,5 @@ import i18next from "i18next"; -import { action, computed, runInAction } from "mobx"; +import { action, computed, makeObservable, override, runInAction } from "mobx"; import { createTransformer } from "mobx-utils"; import URI from "urijs"; import isDefined from "../../../Core/isDefined"; @@ -47,6 +47,7 @@ export class CkanDatasetStratum extends LoadableStratum( private readonly ckanCatalogGroup: CkanCatalogGroup | undefined ) { super(); + makeObservable(this); } duplicateLoadableStratum(newModel: BaseModel): this { @@ -265,6 +266,7 @@ export default class CkanItemReference extends UrlMixin( strata?: Map> ) { super(id, terria, sourceReference, strata); + makeObservable(this); this.strata.set( CkanDefaultFormatsStratum.stratumName, new CkanDefaultFormatsStratum() @@ -314,7 +316,8 @@ export default class CkanItemReference extends UrlMixin( ); } - @computed get cacheDuration(): string { + @override + get cacheDuration(): string { if (isDefined(super.cacheDuration)) { return super.cacheDuration; } diff --git a/lib/Models/Catalog/Esri/ArcGisCatalogGroup.ts b/lib/Models/Catalog/Esri/ArcGisCatalogGroup.ts index f31fb67b7d2..b987db9fbf3 100644 --- a/lib/Models/Catalog/Esri/ArcGisCatalogGroup.ts +++ b/lib/Models/Catalog/Esri/ArcGisCatalogGroup.ts @@ -1,29 +1,29 @@ import i18next from "i18next"; -import { action, computed, runInAction } from "mobx"; +import { action, computed, makeObservable, override, runInAction } from "mobx"; import URI from "urijs"; import filterOutUndefined from "../../../Core/filterOutUndefined"; import isDefined from "../../../Core/isDefined"; import loadJson from "../../../Core/loadJson"; import replaceUnderscores from "../../../Core/replaceUnderscores"; import runLater from "../../../Core/runLater"; -import TerriaError, { networkRequestError } from "../../../Core/TerriaError"; +import { networkRequestError } from "../../../Core/TerriaError"; import CatalogMemberMixin from "../../../ModelMixins/CatalogMemberMixin"; import GroupMixin from "../../../ModelMixins/GroupMixin"; import UrlMixin from "../../../ModelMixins/UrlMixin"; -import ArcGisCatalogGroupTraits from "../../../Traits/TraitsClasses/ArcGisMapServerCatalogGroupTraits"; import ModelReference from "../../../Traits/ModelReference"; +import ArcGisCatalogGroupTraits from "../../../Traits/TraitsClasses/ArcGisMapServerCatalogGroupTraits"; +import CommonStrata from "../../Definition/CommonStrata"; +import CreateModel from "../../Definition/CreateModel"; +import LoadableStratum from "../../Definition/LoadableStratum"; +import { BaseModel, ModelConstructorParameters } from "../../Definition/Model"; +import StratumOrder from "../../Definition/StratumOrder"; +import proxyCatalogItemUrl from "../proxyCatalogItemUrl"; import ArcGisFeatureServerCatalogGroup, { FeatureServerStratum } from "./ArcGisFeatureServerCatalogGroup"; import ArcGisMapServerCatalogGroup, { MapServerStratum } from "./ArcGisMapServerCatalogGroup"; -import CommonStrata from "../../Definition/CommonStrata"; -import CreateModel from "../../Definition/CreateModel"; -import LoadableStratum from "../../Definition/LoadableStratum"; -import { BaseModel } from "../../Definition/Model"; -import proxyCatalogItemUrl from "../proxyCatalogItemUrl"; -import StratumOrder from "../../Definition/StratumOrder"; interface DocumentInfo { Title?: string; @@ -51,6 +51,7 @@ class ArcGisServerStratum extends LoadableStratum(ArcGisCatalogGroupTraits) { private readonly _arcgisServer: ArcGisServer ) { super(); + makeObservable(this); } duplicateLoadableStratum(model: BaseModel): this { @@ -243,6 +244,11 @@ export default class ArcGisCatalogGroup extends UrlMixin( ) { static readonly type = "esri-group"; + constructor(...args: ModelConstructorParameters) { + super(...args); + makeObservable(this); + } + get type() { return ArcGisCatalogGroup.type; } @@ -251,7 +257,8 @@ export default class ArcGisCatalogGroup extends UrlMixin( return i18next.t("models.arcGisService.name"); } - @computed get cacheDuration(): string { + @override + get cacheDuration(): string { if (isDefined(super.cacheDuration)) { return super.cacheDuration; } diff --git a/lib/Models/Catalog/Esri/ArcGisFeatureServerCatalogGroup.ts b/lib/Models/Catalog/Esri/ArcGisFeatureServerCatalogGroup.ts index 09615ce0e6f..d9b7a59bbd2 100644 --- a/lib/Models/Catalog/Esri/ArcGisFeatureServerCatalogGroup.ts +++ b/lib/Models/Catalog/Esri/ArcGisFeatureServerCatalogGroup.ts @@ -1,5 +1,5 @@ import i18next from "i18next"; -import { action, computed, runInAction } from "mobx"; +import { action, computed, runInAction, makeObservable } from "mobx"; import URI from "urijs"; import filterOutUndefined from "../../../Core/filterOutUndefined"; import isDefined from "../../../Core/isDefined"; @@ -55,6 +55,7 @@ export class FeatureServerStratum extends LoadableStratum( private readonly _featureServer: FeatureServer ) { super(); + makeObservable(this); } duplicateLoadableStratum(model: BaseModel): this { diff --git a/lib/Models/Catalog/Esri/ArcGisFeatureServerCatalogItem.ts b/lib/Models/Catalog/Esri/ArcGisFeatureServerCatalogItem.ts index 705d22f8d76..f0d90021fdb 100644 --- a/lib/Models/Catalog/Esri/ArcGisFeatureServerCatalogItem.ts +++ b/lib/Models/Catalog/Esri/ArcGisFeatureServerCatalogItem.ts @@ -1,6 +1,6 @@ import { Geometry, GeometryCollection, Properties } from "@turf/helpers"; import i18next from "i18next"; -import { computed, runInAction } from "mobx"; +import { computed, runInAction, makeObservable } from "mobx"; import Color from "terriajs-cesium/Source/Core/Color"; import URI from "urijs"; import isDefined from "../../../Core/isDefined"; @@ -38,6 +38,7 @@ import LoadableStratum from "../../Definition/LoadableStratum"; import { BaseModel } from "../../Definition/Model"; import StratumFromTraits from "../../Definition/StratumFromTraits"; import StratumOrder from "../../Definition/StratumOrder"; +import { ModelConstructorParameters } from "../../Definition/Model"; import proxyCatalogItemUrl from "../proxyCatalogItemUrl"; const proj4 = require("proj4").default; @@ -183,6 +184,7 @@ class FeatureServerStratum extends LoadableStratum( private _esriJson?: any ) { super(); + makeObservable(this); } duplicateLoadableStratum(newModel: BaseModel): this { @@ -468,6 +470,11 @@ export default class ArcGisFeatureServerCatalogItem extends GeoJsonMixin( ) { static readonly type = "esri-featureServer"; + constructor(...args: ModelConstructorParameters) { + super(...args); + makeObservable(this); + } + get type(): string { return ArcGisFeatureServerCatalogItem.type; } diff --git a/lib/Models/Catalog/Esri/ArcGisMapServerCatalogGroup.ts b/lib/Models/Catalog/Esri/ArcGisMapServerCatalogGroup.ts index 954ceda8d2b..c9e2aab8996 100644 --- a/lib/Models/Catalog/Esri/ArcGisMapServerCatalogGroup.ts +++ b/lib/Models/Catalog/Esri/ArcGisMapServerCatalogGroup.ts @@ -1,27 +1,27 @@ import i18next from "i18next"; -import { action, computed, runInAction } from "mobx"; +import { action, computed, makeObservable, override, runInAction } from "mobx"; import URI from "urijs"; import filterOutUndefined from "../../../Core/filterOutUndefined"; import isDefined from "../../../Core/isDefined"; import loadJson from "../../../Core/loadJson"; import replaceUnderscores from "../../../Core/replaceUnderscores"; import runLater from "../../../Core/runLater"; -import TerriaError, { networkRequestError } from "../../../Core/TerriaError"; +import { networkRequestError } from "../../../Core/TerriaError"; import CatalogMemberMixin from "../../../ModelMixins/CatalogMemberMixin"; import GroupMixin from "../../../ModelMixins/GroupMixin"; import UrlMixin from "../../../ModelMixins/UrlMixin"; +import ModelReference from "../../../Traits/ModelReference"; import ArcGisMapServerCatalogGroupTraits from "../../../Traits/TraitsClasses/ArcGisMapServerCatalogGroupTraits"; import { InfoSectionTraits } from "../../../Traits/TraitsClasses/CatalogMemberTraits"; -import ModelReference from "../../../Traits/ModelReference"; -import ArcGisCatalogGroup from "./ArcGisCatalogGroup"; -import ArcGisMapServerCatalogItem from "./ArcGisMapServerCatalogItem"; import CommonStrata from "../../Definition/CommonStrata"; import CreateModel from "../../Definition/CreateModel"; import createStratumInstance from "../../Definition/createStratumInstance"; import LoadableStratum from "../../Definition/LoadableStratum"; -import { BaseModel } from "../../Definition/Model"; -import proxyCatalogItemUrl from "../proxyCatalogItemUrl"; +import { BaseModel, ModelConstructorParameters } from "../../Definition/Model"; import StratumOrder from "../../Definition/StratumOrder"; +import proxyCatalogItemUrl from "../proxyCatalogItemUrl"; +import ArcGisCatalogGroup from "./ArcGisCatalogGroup"; +import ArcGisMapServerCatalogItem from "./ArcGisMapServerCatalogItem"; interface DocumentInfo { Title?: string; @@ -60,6 +60,7 @@ export class MapServerStratum extends LoadableStratum( private readonly _mapServer: MapServer ) { super(); + makeObservable(this); } duplicateLoadableStratum(model: BaseModel): this { @@ -252,6 +253,11 @@ export default class ArcGisMapServerCatalogGroup extends UrlMixin( ) { static readonly type = "esri-mapServer-group"; + constructor(...args: ModelConstructorParameters) { + super(...args); + makeObservable(this); + } + get type() { return ArcGisMapServerCatalogGroup.type; } @@ -260,7 +266,8 @@ export default class ArcGisMapServerCatalogGroup extends UrlMixin( return i18next.t("models.arcGisMapServerCatalogGroup.name"); } - @computed get cacheDuration(): string { + @override + get cacheDuration(): string { if (isDefined(super.cacheDuration)) { return super.cacheDuration; } diff --git a/lib/Models/Catalog/Esri/ArcGisMapServerCatalogItem.ts b/lib/Models/Catalog/Esri/ArcGisMapServerCatalogItem.ts index 31b42185954..19a78827e15 100644 --- a/lib/Models/Catalog/Esri/ArcGisMapServerCatalogItem.ts +++ b/lib/Models/Catalog/Esri/ArcGisMapServerCatalogItem.ts @@ -1,10 +1,8 @@ import i18next from "i18next"; import uniqWith from "lodash-es/uniqWith"; -import { computed, runInAction } from "mobx"; -import Ellipsoid from "terriajs-cesium/Source/Core/Ellipsoid"; +import { computed, makeObservable, override, runInAction } from "mobx"; import WebMercatorTilingScheme from "terriajs-cesium/Source/Core/WebMercatorTilingScheme"; import ArcGisMapServerImageryProvider from "terriajs-cesium/Source/Scene/ArcGisMapServerImageryProvider"; -import ImageryProvider from "terriajs-cesium/Source/Scene/ImageryProvider"; import URI from "urijs"; import createDiscreteTimesFromIsoSegments from "../../../Core/createDiscreteTimes"; import createTransformerAllowUndefined from "../../../Core/createTransformerAllowUndefined"; @@ -12,6 +10,7 @@ import filterOutUndefined from "../../../Core/filterOutUndefined"; import isDefined from "../../../Core/isDefined"; import loadJson from "../../../Core/loadJson"; import replaceUnderscores from "../../../Core/replaceUnderscores"; +import { scaleDenominatorToLevel } from "../../../Core/scaleToDenominator"; import TerriaError, { networkRequestError } from "../../../Core/TerriaError"; import proj4definitions from "../../../Map/Vector/Proj4Definitions"; import CatalogMemberMixin from "../../../ModelMixins/CatalogMemberMixin"; @@ -29,14 +28,13 @@ import LegendTraits, { import { RectangleTraits } from "../../../Traits/TraitsClasses/MappableTraits"; import CreateModel from "../../Definition/CreateModel"; import createStratumInstance from "../../Definition/createStratumInstance"; -import getToken from "../../getToken"; import LoadableStratum from "../../Definition/LoadableStratum"; -import { BaseModel } from "../../Definition/Model"; -import proxyCatalogItemUrl from "../proxyCatalogItemUrl"; +import { BaseModel, ModelConstructorParameters } from "../../Definition/Model"; import StratumFromTraits from "../../Definition/StratumFromTraits"; import StratumOrder from "../../Definition/StratumOrder"; +import getToken from "../../getToken"; +import proxyCatalogItemUrl from "../proxyCatalogItemUrl"; import MinMaxLevelMixin from "./../../../ModelMixins/MinMaxLevelMixin"; -import { scaleDenominatorToLevel } from "../../../Core/scaleToDenominator"; const proj4 = require("proj4").default; @@ -115,6 +113,7 @@ class MapServerStratum extends LoadableStratum( readonly token: string | undefined ) { super(); + makeObservable(this); } duplicateLoadableStratum(newModel: BaseModel): this { @@ -371,6 +370,12 @@ export default class ArcGisMapServerCatalogItem extends UrlMixin( ) ) { static readonly type = "esri-mapServer"; + + constructor(...args: ModelConstructorParameters) { + super(...args); + makeObservable(this); + } + get typeName() { return i18next.t("models.arcGisMapServerCatalogItem.name"); } @@ -390,7 +395,8 @@ export default class ArcGisMapServerCatalogItem extends UrlMixin( return Promise.resolve(); } - @computed get cacheDuration(): string { + @override + get cacheDuration(): string { if (isDefined(super.cacheDuration)) { return super.cacheDuration; } @@ -512,7 +518,8 @@ export default class ArcGisMapServerCatalogItem extends UrlMixin( return result; } - @computed get layers() { + @override + get layers() { if (super.layers) { return super.layers; } diff --git a/lib/Models/Catalog/Esri/ArcGisPortalCatalogGroup.ts b/lib/Models/Catalog/Esri/ArcGisPortalCatalogGroup.ts index 32a05fb42b5..d856be689c3 100644 --- a/lib/Models/Catalog/Esri/ArcGisPortalCatalogGroup.ts +++ b/lib/Models/Catalog/Esri/ArcGisPortalCatalogGroup.ts @@ -1,16 +1,24 @@ import i18next from "i18next"; -import { action, computed, runInAction } from "mobx"; +import { action, computed, makeObservable, override, runInAction } from "mobx"; import URI from "urijs"; import isDefined from "../../../Core/isDefined"; import loadJson from "../../../Core/loadJson"; import runLater from "../../../Core/runLater"; -import TerriaError, { networkRequestError } from "../../../Core/TerriaError"; +import { networkRequestError } from "../../../Core/TerriaError"; import AccessControlMixin from "../../../ModelMixins/AccessControlMixin"; import CatalogMemberMixin from "../../../ModelMixins/CatalogMemberMixin"; import GroupMixin from "../../../ModelMixins/GroupMixin"; import UrlMixin from "../../../ModelMixins/UrlMixin"; -import ArcGisPortalCatalogGroupTraits from "../../../Traits/TraitsClasses/ArcGisPortalCatalogGroupTraits"; import ModelReference from "../../../Traits/ModelReference"; +import ArcGisPortalCatalogGroupTraits from "../../../Traits/TraitsClasses/ArcGisPortalCatalogGroupTraits"; +import CommonStrata from "../../Definition/CommonStrata"; +import CreateModel from "../../Definition/CreateModel"; +import LoadableStratum from "../../Definition/LoadableStratum"; +import { BaseModel, ModelConstructorParameters } from "../../Definition/Model"; +import StratumOrder from "../../Definition/StratumOrder"; +import Terria from "../../Terria"; +import CatalogGroup from "../CatalogGroup"; +import proxyCatalogItemUrl from "../proxyCatalogItemUrl"; import { ArcGisItem, ArcGisPortalGroup, @@ -18,14 +26,6 @@ import { ArcGisPortalSearchResponse } from "./ArcGisPortalDefinitions"; import ArcGisPortalItemReference from "./ArcGisPortalItemReference"; -import CatalogGroup from "../CatalogGroup"; -import CommonStrata from "../../Definition/CommonStrata"; -import CreateModel from "../../Definition/CreateModel"; -import LoadableStratum from "../../Definition/LoadableStratum"; -import { BaseModel } from "../../Definition/Model"; -import proxyCatalogItemUrl from "../proxyCatalogItemUrl"; -import StratumOrder from "../../Definition/StratumOrder"; -import Terria from "../../Terria"; export class ArcGisPortalStratum extends LoadableStratum( ArcGisPortalCatalogGroupTraits @@ -42,6 +42,7 @@ export class ArcGisPortalStratum extends LoadableStratum( readonly _arcgisGroupResponse: ArcGisPortalGroupSearchResponse | undefined ) { super(); + makeObservable(this); this.datasets = this.getDatasets(); this.filteredDatasets = this.getFilteredDatasets(); this.groups = this.getGroups(); @@ -350,6 +351,11 @@ export default class ArcGisPortalCatalogGroup extends UrlMixin( ) { static readonly type = "arcgis-portal-group"; + constructor(...args: ModelConstructorParameters) { + super(...args); + makeObservable(this); + } + get type() { return ArcGisPortalCatalogGroup.type; } @@ -358,7 +364,7 @@ export default class ArcGisPortalCatalogGroup extends UrlMixin( return i18next.t("models.arcgisPortal.nameGroup"); } - @computed + @override get cacheDuration(): string { if (isDefined(super.cacheDuration)) { return super.cacheDuration; diff --git a/lib/Models/Catalog/Esri/ArcGisPortalItemReference.ts b/lib/Models/Catalog/Esri/ArcGisPortalItemReference.ts index 66e6f839b43..136659b9dd0 100644 --- a/lib/Models/Catalog/Esri/ArcGisPortalItemReference.ts +++ b/lib/Models/Catalog/Esri/ArcGisPortalItemReference.ts @@ -1,6 +1,6 @@ import DOMPurify from "dompurify"; import i18next from "i18next"; -import { computed, runInAction } from "mobx"; +import { computed, runInAction, makeObservable, override } from "mobx"; import { createTransformer } from "mobx-utils"; import URI from "urijs"; import isDefined from "../../../Core/isDefined"; @@ -39,6 +39,7 @@ export class ArcGisPortalItemStratum extends LoadableStratum( | undefined ) { super(); + makeObservable(this); } duplicateLoadableStratum(newModel: BaseModel): this { @@ -233,6 +234,7 @@ export default class ArcGisPortalItemReference extends AccessControlMixin( strata?: Map> ) { super(id, terria, sourceReference, strata); + makeObservable(this); this.setTrait( CommonStrata.defaults, "supportedFormats", @@ -240,7 +242,7 @@ export default class ArcGisPortalItemReference extends AccessControlMixin( ); } - @computed + @override get cacheDuration(): string { if (isDefined(super.cacheDuration)) { return super.cacheDuration; diff --git a/lib/Models/Catalog/Esri/ArcGisTerrainCatalogItem.ts b/lib/Models/Catalog/Esri/ArcGisTerrainCatalogItem.ts index d8aefd2dc9c..a835afdd029 100644 --- a/lib/Models/Catalog/Esri/ArcGisTerrainCatalogItem.ts +++ b/lib/Models/Catalog/Esri/ArcGisTerrainCatalogItem.ts @@ -1,10 +1,11 @@ -import { computed } from "mobx"; +import { computed, makeObservable } from "mobx"; import ArcGISTiledElevationTerrainProvider from "terriajs-cesium/Source/Core/ArcGISTiledElevationTerrainProvider"; import Credit from "terriajs-cesium/Source/Core/Credit"; import MappableMixin from "../../../ModelMixins/MappableMixin"; import CatalogMemberMixin from "../../../ModelMixins/CatalogMemberMixin"; import UrlMixin from "../../../ModelMixins/UrlMixin"; import ArcGisTerrainCatalogItemTraits from "../../../Traits/TraitsClasses/ArcGisTerrainCatalogItemTraits"; +import { ModelConstructorParameters } from "../../Definition/Model"; import CreateModel from "../../Definition/CreateModel"; export default class ArcGisTerrainCatalogItem extends UrlMixin( @@ -12,6 +13,11 @@ export default class ArcGisTerrainCatalogItem extends UrlMixin( ) { static type = "arcgis-terrain"; + constructor(...args: ModelConstructorParameters) { + super(...args); + makeObservable(this); + } + get type() { return ArcGisTerrainCatalogItem.type; } diff --git a/lib/Models/Catalog/Gltf/AssImpCatalogItem.ts b/lib/Models/Catalog/Gltf/AssImpCatalogItem.ts index 5eb2df11f4f..674aa99a986 100644 --- a/lib/Models/Catalog/Gltf/AssImpCatalogItem.ts +++ b/lib/Models/Catalog/Gltf/AssImpCatalogItem.ts @@ -1,4 +1,4 @@ -import { action, observable, runInAction } from "mobx"; +import { action, observable, runInAction, makeObservable } from "mobx"; import URI from "urijs"; import filterOutUndefined from "../../../Core/filterOutUndefined"; import loadArrayBuffer from "../../../Core/loadArrayBuffer"; @@ -11,6 +11,7 @@ import CommonStrata from "../../Definition/CommonStrata"; import CreateModel from "../../Definition/CreateModel"; import HasLocalData from "../../HasLocalData"; import proxyCatalogItemUrl from "../proxyCatalogItemUrl"; +import { ModelConstructorParameters } from "../../Definition/Model"; import { GlTf } from "./GLTF"; // List of supported image formats from https://developer.mozilla.org/en-US/docs/Web/Media/Formats/Image_types @@ -39,6 +40,11 @@ export default class AssImpCatalogItem static readonly type = "assimp"; + constructor(...args: ModelConstructorParameters) { + super(...args); + makeObservable(this); + } + get type() { return AssImpCatalogItem.type; } diff --git a/lib/Models/Catalog/Gltf/GltfCatalogItem.ts b/lib/Models/Catalog/Gltf/GltfCatalogItem.ts index 946e6cd89ef..3722fd3b0f2 100644 --- a/lib/Models/Catalog/Gltf/GltfCatalogItem.ts +++ b/lib/Models/Catalog/Gltf/GltfCatalogItem.ts @@ -1,9 +1,10 @@ -import { action, computed, observable } from "mobx"; +import { action, computed, observable, makeObservable } from "mobx"; import GltfMixin from "../../../ModelMixins/GltfMixin"; import UrlMixin from "../../../ModelMixins/UrlMixin"; import GltfCatalogItemTraits from "../../../Traits/TraitsClasses/GltfCatalogItemTraits"; import CommonStrata from "../../Definition/CommonStrata"; import CreateModel from "../../Definition/CreateModel"; +import { ModelConstructorParameters } from "../../Definition/Model"; import HasLocalData from "../../HasLocalData"; export default class GltfCatalogItem @@ -12,6 +13,11 @@ export default class GltfCatalogItem { static readonly type = "gltf"; + constructor(...args: ModelConstructorParameters) { + super(...args); + makeObservable(this); + } + get type() { return GltfCatalogItem.type; } diff --git a/lib/Models/Catalog/Gtfs/GtfsCatalogItem.ts b/lib/Models/Catalog/Gtfs/GtfsCatalogItem.ts index 0e5521a986c..27883c4e04c 100644 --- a/lib/Models/Catalog/Gtfs/GtfsCatalogItem.ts +++ b/lib/Models/Catalog/Gtfs/GtfsCatalogItem.ts @@ -1,5 +1,11 @@ import { get as _get } from "lodash-es"; -import { computed, IReactionDisposer, observable, runInAction } from "mobx"; +import { + computed, + IReactionDisposer, + makeObservable, + observable, + runInAction +} from "mobx"; import { createTransformer, ITransformer } from "mobx-utils"; import Pbf from "pbf"; import Cartesian3 from "terriajs-cesium/Source/Core/Cartesian3"; @@ -60,6 +66,7 @@ class GtfsStratum extends LoadableStratum(GtfsCatalogItemTraits) { constructor(private readonly _item: GtfsCatalogItem) { super(); + makeObservable(this); } duplicateLoadableStratum(newModel: BaseModel): this { @@ -82,11 +89,9 @@ StratumOrder.addLoadStratum(GtfsStratum.stratumName); * For displaying realtime transport data. See [here](https://developers.google.com/transit/gtfs-realtime/reference/) * for the spec. */ -export default class GtfsCatalogItem extends MappableMixin( - UrlMixin( - AutoRefreshingMixin( - MappableMixin(CatalogMemberMixin(CreateModel(GtfsCatalogItemTraits))) - ) +export default class GtfsCatalogItem extends UrlMixin( + AutoRefreshingMixin( + MappableMixin(CatalogMemberMixin(CreateModel(GtfsCatalogItemTraits))) ) ) { disposer: IReactionDisposer | undefined; @@ -348,6 +353,7 @@ export default class GtfsCatalogItem extends MappableMixin( sourceReference?: BaseModel ) { super(id, terria, sourceReference); + makeObservable(this); } protected forceLoadMetadata(): Promise { diff --git a/lib/Models/Catalog/Ows/CswCatalogGroup.ts b/lib/Models/Catalog/Ows/CswCatalogGroup.ts index ed6f2f454bf..7365e171267 100644 --- a/lib/Models/Catalog/Ows/CswCatalogGroup.ts +++ b/lib/Models/Catalog/Ows/CswCatalogGroup.ts @@ -1,6 +1,6 @@ import i18next from "i18next"; import { flatten } from "lodash-es"; -import { action, computed, runInAction } from "mobx"; +import { action, computed, runInAction, makeObservable } from "mobx"; import URI from "urijs"; import filterOutUndefined from "../../../Core/filterOutUndefined"; import isDefined from "../../../Core/isDefined"; @@ -338,6 +338,7 @@ class CswStratum extends LoadableStratum(CswCatalogGroupTraits) { readonly records: Records ) { super(); + makeObservable(this); } duplicateLoadableStratum(model: BaseModel): this { diff --git a/lib/Models/Catalog/Ows/SensorObservationServiceCatalogItem.ts b/lib/Models/Catalog/Ows/SensorObservationServiceCatalogItem.ts index 3a519ea04d7..02a3620d00e 100644 --- a/lib/Models/Catalog/Ows/SensorObservationServiceCatalogItem.ts +++ b/lib/Models/Catalog/Ows/SensorObservationServiceCatalogItem.ts @@ -1,5 +1,5 @@ import i18next from "i18next"; -import { action, computed, runInAction } from "mobx"; +import { action, computed, makeObservable, override, runInAction } from "mobx"; import Mustache from "mustache"; import DeveloperError from "terriajs-cesium/Source/Core/DeveloperError"; import JulianDate from "terriajs-cesium/Source/Core/JulianDate"; @@ -7,7 +7,6 @@ import filterOutUndefined from "../../../Core/filterOutUndefined"; import isDefined from "../../../Core/isDefined"; import loadWithXhr from "../../../Core/loadWithXhr"; import TerriaError from "../../../Core/TerriaError"; -import CatalogMemberMixin from "../../../ModelMixins/CatalogMemberMixin"; import TableMixin from "../../../ModelMixins/TableMixin"; import TableAutomaticStylesStratum from "../../../Table/TableAutomaticStylesStratum"; import TableColumnType from "../../../Table/TableColumnType"; @@ -82,6 +81,7 @@ StratumOrder.addLoadStratum(TableAutomaticStylesStratum.stratumName); class SosAutomaticStylesStratum extends TableAutomaticStylesStratum { constructor(readonly catalogItem: SensorObservationServiceCatalogItem) { super(catalogItem); + makeObservable(this); } duplicateLoadableStratum( @@ -90,11 +90,12 @@ class SosAutomaticStylesStratum extends TableAutomaticStylesStratum { return new SosAutomaticStylesStratum(newModel) as this; } - @computed get activeStyle() { + @override + get activeStyle() { return this.catalogItem.procedures[0]?.identifier; } - @computed + @override get styles(): StratumFromTraits[] { return this.catalogItem.procedures.map((p) => { return createStratumInstance(TableStyleTraits, { @@ -111,7 +112,7 @@ class SosAutomaticStylesStratum extends TableAutomaticStylesStratum { }); } - @computed + @override get defaultChartStyle() { const timeColumn = this.catalogItem.tableColumns.find( (column) => column.type === TableColumnType.time @@ -140,7 +141,9 @@ class GetFeatureOfInterestRequest { constructor( readonly catalogItem: SensorObservationServiceCatalogItem, readonly requestTemplate: string - ) {} + ) { + makeObservable(this); + } @computed get url() { @@ -192,7 +195,9 @@ class GetObservationRequest { constructor( readonly catalogItem: SensorObservationServiceCatalogItem, readonly foiIdentifier: string - ) {} + ) { + makeObservable(this); + } @computed get url() { @@ -315,6 +320,7 @@ export default class SensorObservationServiceCatalogItem extends TableMixin( sourceReference?: BaseModel ) { super(id, terria, sourceReference); + makeObservable(this); this.strata.set( TableAutomaticStylesStratum.stratumName, new SosAutomaticStylesStratum(this) @@ -336,7 +342,8 @@ export default class SensorObservationServiceCatalogItem extends TableMixin( } } - @computed get cacheDuration(): string { + @override + get cacheDuration(): string { if (isDefined(super.cacheDuration)) { return super.cacheDuration; } @@ -540,7 +547,7 @@ export default class SensorObservationServiceCatalogItem extends TableMixin( return valueTitle; } - @computed + @override get selectableDimensions() { return filterOutUndefined([ // Filter out proceduresSelector - as it duplicates TableMixin.styleDimensions @@ -600,7 +607,7 @@ export default class SensorObservationServiceCatalogItem extends TableMixin( }; } - @computed + @override get selectedObservableId() { return ( super.selectedObservableId || this.observableProperties[0]?.identifier diff --git a/lib/Models/Catalog/Ows/WebFeatureServiceCatalogGroup.ts b/lib/Models/Catalog/Ows/WebFeatureServiceCatalogGroup.ts index 1282a8efbb2..d1f814f5844 100644 --- a/lib/Models/Catalog/Ows/WebFeatureServiceCatalogGroup.ts +++ b/lib/Models/Catalog/Ows/WebFeatureServiceCatalogGroup.ts @@ -1,5 +1,5 @@ import i18next from "i18next"; -import { action, computed, runInAction } from "mobx"; +import { action, computed, runInAction, makeObservable } from "mobx"; import containsAny from "../../../Core/containsAny"; import filterOutUndefined from "../../../Core/filterOutUndefined"; import isDefined from "../../../Core/isDefined"; @@ -58,6 +58,7 @@ class GetCapabilitiesStratum extends LoadableStratum( readonly capabilities: WebFeatureServiceCapabilities ) { super(); + makeObservable(this); } duplicateLoadableStratum(model: BaseModel): this { diff --git a/lib/Models/Catalog/Ows/WebFeatureServiceCatalogItem.ts b/lib/Models/Catalog/Ows/WebFeatureServiceCatalogItem.ts index c9741bf9019..7c77dfeefd4 100644 --- a/lib/Models/Catalog/Ows/WebFeatureServiceCatalogItem.ts +++ b/lib/Models/Catalog/Ows/WebFeatureServiceCatalogItem.ts @@ -1,5 +1,5 @@ import i18next from "i18next"; -import { computed, isObservableArray, runInAction } from "mobx"; +import { computed, makeObservable, override, runInAction } from "mobx"; import combine from "terriajs-cesium/Source/Core/combine"; import containsAny from "../../../Core/containsAny"; import isDefined from "../../../Core/isDefined"; @@ -12,18 +12,17 @@ import GeoJsonMixin, { toFeatureCollection } from "../../../ModelMixins/GeojsonMixin"; import GetCapabilitiesMixin from "../../../ModelMixins/GetCapabilitiesMixin"; -import UrlMixin from "../../../ModelMixins/UrlMixin"; import xml2json from "../../../ThirdParty/xml2json"; import { InfoSectionTraits } from "../../../Traits/TraitsClasses/CatalogMemberTraits"; import { RectangleTraits } from "../../../Traits/TraitsClasses/MappableTraits"; import WebFeatureServiceCatalogItemTraits, { - SUPPORTED_CRS_4326, - SUPPORTED_CRS_3857 + SUPPORTED_CRS_3857, + SUPPORTED_CRS_4326 } from "../../../Traits/TraitsClasses/WebFeatureServiceCatalogItemTraits"; import CreateModel from "../../Definition/CreateModel"; import createStratumInstance from "../../Definition/createStratumInstance"; import LoadableStratum from "../../Definition/LoadableStratum"; -import { BaseModel } from "../../Definition/Model"; +import { BaseModel, ModelConstructorParameters } from "../../Definition/Model"; import StratumFromTraits from "../../Definition/StratumFromTraits"; import proxyCatalogItemUrl from "../proxyCatalogItemUrl"; import WebFeatureServiceCapabilities, { @@ -64,6 +63,7 @@ export class GetCapabilitiesStratum extends LoadableStratum( readonly capabilities: WebFeatureServiceCapabilities ) { super(); + makeObservable(this); } duplicateLoadableStratum(model: BaseModel): this { @@ -322,6 +322,11 @@ class WebFeatureServiceCatalogItem extends GetCapabilitiesMixin( static readonly type = "wfs"; + constructor(...args: ModelConstructorParameters) { + super(...args); + makeObservable(this); + } + get type() { return WebFeatureServiceCatalogItem.type; } @@ -461,7 +466,7 @@ class WebFeatureServiceCatalogItem extends GetCapabilitiesMixin( } } - @computed + @override get shortReport(): string | undefined { // Show notice if reached if ( diff --git a/lib/Models/Catalog/Ows/WebMapServiceCapabilitiesStratum.ts b/lib/Models/Catalog/Ows/WebMapServiceCapabilitiesStratum.ts index c4b15936afb..2460647f578 100644 --- a/lib/Models/Catalog/Ows/WebMapServiceCapabilitiesStratum.ts +++ b/lib/Models/Catalog/Ows/WebMapServiceCapabilitiesStratum.ts @@ -1,5 +1,5 @@ import i18next from "i18next"; -import { computed } from "mobx"; +import { computed, makeObservable } from "mobx"; import CesiumMath from "terriajs-cesium/Source/Core/Math"; import Rectangle from "terriajs-cesium/Source/Core/Rectangle"; import URI from "urijs"; @@ -78,6 +78,7 @@ export default class WebMapServiceCapabilitiesStratum extends LoadableStratum( readonly capabilities: WebMapServiceCapabilities ) { super(); + makeObservable(this); } duplicateLoadableStratum(model: BaseModel): this { diff --git a/lib/Models/Catalog/Ows/WebMapServiceCatalogGroup.ts b/lib/Models/Catalog/Ows/WebMapServiceCatalogGroup.ts index f4f85dd5445..bbaecbcee64 100644 --- a/lib/Models/Catalog/Ows/WebMapServiceCatalogGroup.ts +++ b/lib/Models/Catalog/Ows/WebMapServiceCatalogGroup.ts @@ -1,5 +1,5 @@ import i18next from "i18next"; -import { action, computed, runInAction } from "mobx"; +import { action, computed, runInAction, makeObservable } from "mobx"; import containsAny from "../../../Core/containsAny"; import filterOutUndefined from "../../../Core/filterOutUndefined"; import isDefined from "../../../Core/isDefined"; @@ -56,6 +56,7 @@ class GetCapabilitiesStratum extends LoadableStratum( readonly capabilities: WebMapServiceCapabilities ) { super(); + makeObservable(this); } duplicateLoadableStratum(model: BaseModel): this { diff --git a/lib/Models/Catalog/Ows/WebMapServiceCatalogItem.ts b/lib/Models/Catalog/Ows/WebMapServiceCatalogItem.ts index 2b44019d1f1..3ce6fd42aa7 100644 --- a/lib/Models/Catalog/Ows/WebMapServiceCatalogItem.ts +++ b/lib/Models/Catalog/Ows/WebMapServiceCatalogItem.ts @@ -8,7 +8,7 @@ // Solution: think in terms of pipelines with computed observables, document patterns. // 4. All code for all catalog item types needs to be loaded before we can do anything. import i18next from "i18next"; -import { computed, runInAction } from "mobx"; +import { computed, runInAction, makeObservable, override } from "mobx"; import combine from "terriajs-cesium/Source/Core/combine"; import GeographicTilingScheme from "terriajs-cesium/Source/Core/GeographicTilingScheme"; import JulianDate from "terriajs-cesium/Source/Core/JulianDate"; @@ -57,6 +57,7 @@ export class WebMapServiceUrlStratum extends LoadableStratum( static stratumName = "wms-url-stratum"; constructor(readonly catalogItem: WebMapServiceCatalogItem) { super(); + makeObservable(this); } duplicateLoadableStratum(model: BaseModel): this { @@ -146,6 +147,7 @@ class WebMapServiceCatalogItem sourceReference?: BaseModel | undefined ) { super(id, terria, sourceReference); + makeObservable(this); this.strata.set( WebMapServiceUrlStratum.stratumName, new WebMapServiceUrlStratum(this) @@ -156,7 +158,7 @@ class WebMapServiceCatalogItem return WebMapServiceCatalogItem.type; } - @computed + @override get shortReport(): string | undefined { if ( this.tilingScheme instanceof GeographicTilingScheme && @@ -211,7 +213,8 @@ class WebMapServiceCatalogItem }); } - @computed get cacheDuration(): string { + @override + get cacheDuration(): string { if (isDefined(super.cacheDuration)) { return super.cacheDuration; } @@ -727,7 +730,7 @@ class WebMapServiceCatalogItem return dimensions; } - @computed + @override get selectableDimensions() { if (this.disableDimensionSelectors) { return super.selectableDimensions; diff --git a/lib/Models/Catalog/Ows/WebMapTileServiceCatalogGroup.ts b/lib/Models/Catalog/Ows/WebMapTileServiceCatalogGroup.ts index 69cea83360c..87a720f403d 100644 --- a/lib/Models/Catalog/Ows/WebMapTileServiceCatalogGroup.ts +++ b/lib/Models/Catalog/Ows/WebMapTileServiceCatalogGroup.ts @@ -1,5 +1,5 @@ import i18next from "i18next"; -import { action, computed, runInAction } from "mobx"; +import { action, computed, runInAction, makeObservable } from "mobx"; import containsAny from "../../../Core/containsAny"; import filterOutUndefined from "../../../Core/filterOutUndefined"; import isDefined from "../../../Core/isDefined"; @@ -58,6 +58,7 @@ class GetCapabilitiesStratum extends LoadableStratum( readonly capabilities: WebMapTileServiceCapabilities ) { super(); + makeObservable(this); } duplicateLoadableStratum(model: BaseModel): this { diff --git a/lib/Models/Catalog/Ows/WebMapTileServiceCatalogItem.ts b/lib/Models/Catalog/Ows/WebMapTileServiceCatalogItem.ts index 3de0b8b88c9..57cb6735239 100644 --- a/lib/Models/Catalog/Ows/WebMapTileServiceCatalogItem.ts +++ b/lib/Models/Catalog/Ows/WebMapTileServiceCatalogItem.ts @@ -1,5 +1,5 @@ import i18next from "i18next"; -import { computed, runInAction } from "mobx"; +import { computed, runInAction, makeObservable, override } from "mobx"; import defined from "terriajs-cesium/Source/Core/defined"; import WebMercatorTilingScheme from "terriajs-cesium/Source/Core/WebMercatorTilingScheme"; import WebMapTileServiceImageryProvider from "terriajs-cesium/Source/Scene/WebMapTileServiceImageryProvider"; @@ -25,6 +25,7 @@ import { BaseModel } from "../../Definition/Model"; import { ServiceProvider } from "./OwsInterfaces"; import proxyCatalogItemUrl from "../proxyCatalogItemUrl"; import StratumFromTraits from "../../Definition/StratumFromTraits"; +import { ModelConstructorParameters } from "../../Definition/Model"; import WebMapTileServiceCapabilities, { CapabilitiesStyle, ResourceUrl, @@ -74,6 +75,7 @@ class GetCapabilitiesStratum extends LoadableStratum( readonly capabilities: WebMapTileServiceCapabilities ) { super(); + makeObservable(this); } duplicateLoadableStratum(model: BaseModel): this { @@ -436,6 +438,11 @@ class WebMapTileServiceCatalogItem extends MappableMixin( static readonly type = "wmts"; + constructor(...args: ModelConstructorParameters) { + super(...args); + makeObservable(this); + } + get type() { return WebMapTileServiceCatalogItem.type; } @@ -461,7 +468,8 @@ class WebMapTileServiceCatalogItem extends MappableMixin( }); } - @computed get cacheDuration(): string { + @override + get cacheDuration(): string { if (isDefined(super.cacheDuration)) { return super.cacheDuration; } diff --git a/lib/Models/Catalog/Ows/WebProcessingServiceCatalogFunction.ts b/lib/Models/Catalog/Ows/WebProcessingServiceCatalogFunction.ts index 6208f0e65da..d11037c162b 100644 --- a/lib/Models/Catalog/Ows/WebProcessingServiceCatalogFunction.ts +++ b/lib/Models/Catalog/Ows/WebProcessingServiceCatalogFunction.ts @@ -1,6 +1,13 @@ import i18next from "i18next"; import flatten from "lodash-es/flatten"; -import { action, computed, isObservableArray, runInAction } from "mobx"; +import { + action, + computed, + isObservableArray, + runInAction, + makeObservable, + override +} from "mobx"; import CesiumMath from "terriajs-cesium/Source/Core/Math"; import URI from "urijs"; import filterOutUndefined from "../../../Core/filterOutUndefined"; @@ -35,6 +42,7 @@ import RegionParameter from "../../FunctionParameters/RegionParameter"; import RegionTypeParameter from "../../FunctionParameters/RegionTypeParameter"; import StringParameter from "../../FunctionParameters/StringParameter"; import proxyCatalogItemUrl from "../proxyCatalogItemUrl"; +import { ModelConstructorParameters } from "../../Definition/Model"; import WebProcessingServiceCatalogFunctionJob from "./WebProcessingServiceCatalogFunctionJob"; type AllowedValues = { @@ -103,6 +111,7 @@ class WpsLoadableStratum extends LoadableStratum( readonly processDescription: ProcessDescription ) { super(); + makeObservable(this); } duplicateLoadableStratum(newModel: BaseModel): this { @@ -184,6 +193,12 @@ export default class WebProcessingServiceCatalogFunction extends XmlRequestMixin CatalogFunctionMixin(CreateModel(WebProcessingServiceCatalogFunctionTraits)) ) { static readonly type = "wps"; + + constructor(...args: ModelConstructorParameters) { + super(...args); + makeObservable(this); + } + get type() { return WebProcessingServiceCatalogFunction.type; } @@ -192,7 +207,8 @@ export default class WebProcessingServiceCatalogFunction extends XmlRequestMixin return "Web Processing Service (WPS)"; } - @computed get cacheDuration(): string { + @override + get cacheDuration(): string { if (isDefined(super.cacheDuration)) { return super.cacheDuration; } diff --git a/lib/Models/Catalog/Ows/WebProcessingServiceCatalogFunctionJob.ts b/lib/Models/Catalog/Ows/WebProcessingServiceCatalogFunctionJob.ts index 37a3b27d215..959fb84cf5a 100644 --- a/lib/Models/Catalog/Ows/WebProcessingServiceCatalogFunctionJob.ts +++ b/lib/Models/Catalog/Ows/WebProcessingServiceCatalogFunctionJob.ts @@ -5,7 +5,9 @@ import { isObservableArray, observable, runInAction, - toJS + toJS, + makeObservable, + override } from "mobx"; import Mustache from "mustache"; import URI from "urijs"; @@ -30,6 +32,7 @@ import updateModelFromJson from "../../Definition/updateModelFromJson"; import upsertModelFromJson from "../../Definition/upsertModelFromJson"; import GeoJsonCatalogItem from "../CatalogItems/GeoJsonCatalogItem"; import CatalogMemberFactory from "../CatalogMemberFactory"; +import { ModelConstructorParameters } from "../../Definition/Model"; import proxyCatalogItemUrl from "../proxyCatalogItemUrl"; const executeWpsTemplate = require("./ExecuteWpsTemplate.xml"); @@ -43,6 +46,7 @@ class WpsLoadableStratum extends LoadableStratum( constructor(readonly item: WebProcessingServiceCatalogFunctionJob) { super(); + makeObservable(this); } duplicateLoadableStratum(newModel: BaseModel): this { @@ -145,6 +149,11 @@ export default class WebProcessingServiceCatalogFunctionJob extends XmlRequestMi ) { static readonly type = "wps-result"; + constructor(...args: ModelConstructorParameters) { + super(...args); + makeObservable(this); + } + get type() { return WebProcessingServiceCatalogFunctionJob.type; } @@ -374,7 +383,8 @@ export default class WebProcessingServiceCatalogFunctionJob extends XmlRequestMi return results; } - @computed get mapItems() { + @override + get mapItems() { if (isDefined(this.geoJsonItem)) { return this.geoJsonItem.mapItems.map((mapItem) => { mapItem.show = this.show; diff --git a/lib/Models/Catalog/Ows/WebProcessingServiceCatalogGroup.ts b/lib/Models/Catalog/Ows/WebProcessingServiceCatalogGroup.ts index d5f7fe412e1..d3e3900914a 100644 --- a/lib/Models/Catalog/Ows/WebProcessingServiceCatalogGroup.ts +++ b/lib/Models/Catalog/Ows/WebProcessingServiceCatalogGroup.ts @@ -1,5 +1,5 @@ import i18next from "i18next"; -import { action, computed, runInAction } from "mobx"; +import { action, computed, runInAction, makeObservable } from "mobx"; import URI from "urijs"; import filterOutUndefined from "../../../Core/filterOutUndefined"; import { isJsonObject } from "../../../Core/Json"; @@ -23,6 +23,7 @@ import StratumFromTraits from "../../Definition/StratumFromTraits"; import WebProcessingServiceCapabilities, { Process } from "./WebProcessingServiceCapabilities"; +import { ModelConstructorParameters } from "../../Definition/Model"; import WebProcessingServiceCatalogFunction from "./WebProcessingServiceCatalogFunction"; class GetCapabilitiesStratum extends LoadableStratum( @@ -33,6 +34,7 @@ class GetCapabilitiesStratum extends LoadableStratum( readonly capabilities: WebProcessingServiceCapabilities ) { super(); + makeObservable(this); } duplicateLoadableStratum(model: BaseModel): this { @@ -216,6 +218,11 @@ export default class WebProcessingServiceCatalogGroup extends GroupMixin( ) { static readonly type = "wps-getCapabilities"; + constructor(...args: ModelConstructorParameters) { + super(...args); + makeObservable(this); + } + get type() { return WebProcessingServiceCatalogGroup.type; } diff --git a/lib/Models/Catalog/ResultPendingCatalogItem.ts b/lib/Models/Catalog/ResultPendingCatalogItem.ts index 1d7f6b612b7..e0e14ed1aad 100644 --- a/lib/Models/Catalog/ResultPendingCatalogItem.ts +++ b/lib/Models/Catalog/ResultPendingCatalogItem.ts @@ -1,15 +1,24 @@ -import { observable } from "mobx"; +import { makeObservable, override } from "mobx"; import CatalogMemberMixin from "../../ModelMixins/CatalogMemberMixin"; import ResultPendingCatalogItemTraits from "../../Traits/TraitsClasses/ResultPendingCatalogItemTraits"; import CreateModel from "../Definition/CreateModel"; +import { ModelConstructorParameters } from "../Definition/Model"; export default class ResultPendingCatalogItem extends CatalogMemberMixin( CreateModel(ResultPendingCatalogItemTraits) ) { - @observable disableAboutData = true; - loadPromise: Promise = Promise.resolve(); + constructor(...args: ModelConstructorParameters) { + super(...args); + makeObservable(this); + } + + @override + get disableAboutData() { + return super.disableAboutData ?? true; + } + protected forceLoadMetadata() { return this.loadPromise; } diff --git a/lib/Models/Catalog/SdmxJson/SdmxJsonCatalogItem.ts b/lib/Models/Catalog/SdmxJson/SdmxJsonCatalogItem.ts index 89877a83fe9..356d40e1084 100644 --- a/lib/Models/Catalog/SdmxJson/SdmxJsonCatalogItem.ts +++ b/lib/Models/Catalog/SdmxJson/SdmxJsonCatalogItem.ts @@ -1,5 +1,5 @@ import i18next from "i18next"; -import { computed, runInAction } from "mobx"; +import { computed, runInAction, makeObservable, override } from "mobx"; import RequestErrorEvent from "terriajs-cesium/Source/Core/RequestErrorEvent"; import Resource from "terriajs-cesium/Source/Core/Resource"; import filterOutUndefined from "../../../Core/filterOutUndefined"; @@ -36,6 +36,7 @@ export default class SdmxJsonCatalogItem sourceReference: BaseModel | undefined ) { super(id, terria, sourceReference); + makeObservable(this); this.strata.set( TableAutomaticStylesStratum.stratumName, new TableAutomaticStylesStratum(this) @@ -58,7 +59,7 @@ export default class SdmxJsonCatalogItem return SdmxJsonCatalogItem.type; } - @computed + @override get cacheDuration() { return super.cacheDuration || "1d"; } @@ -97,7 +98,7 @@ export default class SdmxJsonCatalogItem }); } - @computed + @override get selectableDimensions(): SelectableDimension[] { return filterOutUndefined([ ...super.selectableDimensions.filter( @@ -115,7 +116,7 @@ export default class SdmxJsonCatalogItem return super.url; } - @computed + @override get url() { if (!super.url) return; diff --git a/lib/Models/Catalog/SdmxJson/SdmxJsonDataflowStratum.ts b/lib/Models/Catalog/SdmxJson/SdmxJsonDataflowStratum.ts index 9d2918b1ec0..c55283ec3ce 100644 --- a/lib/Models/Catalog/SdmxJson/SdmxJsonDataflowStratum.ts +++ b/lib/Models/Catalog/SdmxJson/SdmxJsonDataflowStratum.ts @@ -1,5 +1,5 @@ import i18next from "i18next"; -import { computed } from "mobx"; +import { computed, makeObservable } from "mobx"; import filterOutUndefined from "../../../Core/filterOutUndefined"; import isDefined from "../../../Core/isDefined"; import { networkRequestError } from "../../../Core/TerriaError"; @@ -135,6 +135,7 @@ export class SdmxJsonDataflowStratum extends LoadableStratum( private readonly sdmxJsonDataflow: SdmxJsonDataflow ) { super(); + makeObservable(this); } @computed diff --git a/lib/Models/Catalog/SdmxJson/SdmxJsonServerStratum.ts b/lib/Models/Catalog/SdmxJson/SdmxJsonServerStratum.ts index 3b55603c9dc..4c66d76e1c2 100644 --- a/lib/Models/Catalog/SdmxJson/SdmxJsonServerStratum.ts +++ b/lib/Models/Catalog/SdmxJson/SdmxJsonServerStratum.ts @@ -1,5 +1,5 @@ import i18next from "i18next"; -import { action, computed } from "mobx"; +import { action, computed, makeObservable } from "mobx"; import RequestErrorEvent from "terriajs-cesium/Source/Core/RequestErrorEvent"; import Resource from "terriajs-cesium/Source/Core/Resource"; import filterOutUndefined from "../../../Core/filterOutUndefined"; @@ -105,6 +105,8 @@ export class SdmxServerStratum extends LoadableStratum(SdmxCatalogGroupTraits) { ) { super(); + makeObservable(this); + // If categorisations exist => organise Dataflows into a tree! if (isDefined(this.sdmxServer.categorisations)) { this.sdmxServer.categorisations.forEach((categorisiation) => { diff --git a/lib/Models/Cesium.ts b/lib/Models/Cesium.ts index cb7938cf9b9..ca53fa65670 100644 --- a/lib/Models/Cesium.ts +++ b/lib/Models/Cesium.ts @@ -6,7 +6,9 @@ import { IObservableArray, observable, reaction, - runInAction + runInAction, + makeObservable, + toJS } from "mobx"; import { computedFn } from "mobx-utils"; import AssociativeArray from "terriajs-cesium/Source/Core/AssociativeArray"; @@ -152,6 +154,8 @@ export default class Cesium extends GlobeOrMap { constructor(terriaViewer: TerriaViewer, container: string | HTMLElement) { super(); + makeObservable(this); + this.terriaViewer = terriaViewer; this.terria = terriaViewer.terria; @@ -482,7 +486,7 @@ export default class Cesium extends GlobeOrMap { }) .map(({ credit }) => credit.html); - if (isEqual(credits, this.cesiumDataAttributions.toJS())) return; + if (isEqual(credits, toJS(this.cesiumDataAttributions))) return; // first remove ones that are not on the map anymore // Iterate backwards because we're removing items. @@ -505,7 +509,11 @@ export default class Cesium extends GlobeOrMap { this.cesiumDataAttributions.splice(index, 0, credit); } else { // it is on the list but not in the right place so we move it - this.cesiumDataAttributions.move(attributionIndex, index); + this.cesiumDataAttributions.splice( + index, + 0, + this.cesiumDataAttributions.splice(attributionIndex, 1)[0] + ); } } }); diff --git a/lib/Models/Definition/CreateModel.ts b/lib/Models/Definition/CreateModel.ts index 7daf0768838..8da248ff587 100644 --- a/lib/Models/Definition/CreateModel.ts +++ b/lib/Models/Definition/CreateModel.ts @@ -1,4 +1,4 @@ -import { action, computed, observable, runInAction, toJS } from "mobx"; +import { action, computed, observable, runInAction, toJS, makeObservable } from "mobx"; import filterOutUndefined from "../../Core/filterOutUndefined"; import flatten from "../../Core/flatten"; import isDefined from "../../Core/isDefined"; @@ -75,6 +75,7 @@ export default function CreateModel>( strata: Map | undefined ) { super(id, terria, sourceReference); + makeObservable(this); this.strata = strata || observable.map(); } diff --git a/lib/Models/Definition/Model.ts b/lib/Models/Definition/Model.ts index 94cc23adce5..1ceecbaa981 100644 --- a/lib/Models/Definition/Model.ts +++ b/lib/Models/Definition/Model.ts @@ -17,6 +17,10 @@ export interface ModelConstructor { TraitsClass: TraitsConstructor; } +export type ModelConstructorParameters = ConstructorParameters< + ModelConstructor +>; + export abstract class BaseModel { abstract get type(): string; abstract get traits(): { diff --git a/lib/Models/Definition/addModelStrataView.ts b/lib/Models/Definition/addModelStrataView.ts index 7d3a51d4121..817a2e60f50 100644 --- a/lib/Models/Definition/addModelStrataView.ts +++ b/lib/Models/Definition/addModelStrataView.ts @@ -1,4 +1,4 @@ -import { computed, decorate } from "mobx"; +import { computed } from "mobx"; import ModelTraits from "../../Traits/ModelTraits"; import Stratified from "../../Traits/Stratified"; import TraitsConstructor from "../../Traits/TraitsConstructor"; @@ -49,3 +49,12 @@ export default function addModelStrataView< return model; } + +function decorate( + target: any, + decorators: { [id: string]: PropertyDecorator } +) { + Object.entries(decorators).forEach(([prop, decorator]) => { + decorator(target.prototype, prop); + }); +} diff --git a/lib/Models/Definition/createCombinedModel.ts b/lib/Models/Definition/createCombinedModel.ts index c566944d81e..a93b6ee5258 100644 --- a/lib/Models/Definition/createCombinedModel.ts +++ b/lib/Models/Definition/createCombinedModel.ts @@ -4,7 +4,7 @@ import DeveloperError from "terriajs-cesium/Source/Core/DeveloperError"; import traitsClassToModelClass from "../../Traits/traitsClassToModelClass"; import StratumFromTraits from "./StratumFromTraits"; import createStratumInstance from "./createStratumInstance"; -import { computed, decorate } from "mobx"; +import { computed, makeObservable } from "mobx"; import TraitsConstructor from "../../Traits/TraitsConstructor"; /** @@ -74,7 +74,9 @@ export function extractBottomModel(model: BaseModel): BaseModel | undefined { } class CombinedStrata implements Map> { - constructor(readonly top: BaseModel, readonly bottom: BaseModel) {} + constructor(readonly top: BaseModel, readonly bottom: BaseModel) { + makeObservable(this); + } clear(): void { this.top.strata.clear(); @@ -229,7 +231,7 @@ function createCombinedStratum( decorators[traitName] = trait.decoratorForFlattened || computed; }); - decorate(result, decorators); + makeObservable(result, decorators); return >(result); } diff --git a/lib/Models/Feature/Feature.ts b/lib/Models/Feature/Feature.ts index c5b0b5412d1..48032eb8cd7 100644 --- a/lib/Models/Feature/Feature.ts +++ b/lib/Models/Feature/Feature.ts @@ -1,4 +1,4 @@ -import { observable } from "mobx"; +import { observable, makeObservable } from "mobx"; import Entity from "terriajs-cesium/Source/DataSources/Entity"; import Cesium3DTileFeature from "terriajs-cesium/Source/Scene/Cesium3DTileFeature"; import Cesium3DTilePointFeature from "terriajs-cesium/Source/Scene/Cesium3DTilePointFeature"; @@ -34,6 +34,7 @@ export default class TerriaFeature extends Entity { constructor(options: Entity.ConstructorOptions) { super(options); + makeObservable(this); addCustomFeatureProperties(this); } diff --git a/lib/Models/FunctionParameters/BooleanParameter.ts b/lib/Models/FunctionParameters/BooleanParameter.ts index 04eb52f6118..f84ec3d32e8 100644 --- a/lib/Models/FunctionParameters/BooleanParameter.ts +++ b/lib/Models/FunctionParameters/BooleanParameter.ts @@ -1,4 +1,4 @@ -import { computed } from "mobx"; +import { computed, makeObservable } from "mobx"; import CatalogFunctionMixin from "../../ModelMixins/CatalogFunctionMixin"; import FunctionParameter, { Options as FunctionParameterOptions @@ -41,6 +41,7 @@ export default class BooleanParameter options: Options ) { super(catalogFunction, options); + makeObservable(this); this.trueName = options.trueName; this.trueDescription = options.trueDescription; this.falseName = options.falseName; diff --git a/lib/Models/FunctionParameters/EnumerationParameter.ts b/lib/Models/FunctionParameters/EnumerationParameter.ts index f57c6c34ea3..b742817225d 100644 --- a/lib/Models/FunctionParameters/EnumerationParameter.ts +++ b/lib/Models/FunctionParameters/EnumerationParameter.ts @@ -1,4 +1,4 @@ -import { computed, observable, reaction } from "mobx"; +import { makeObservable, observable, override, reaction } from "mobx"; import isDefined from "../../Core/isDefined"; import CatalogFunctionMixin from "../../ModelMixins/CatalogFunctionMixin"; import CommonStrata from "../Definition/CommonStrata"; @@ -23,6 +23,7 @@ export default class EnumerationParameter extends FunctionParameter { options: Options ) { super(catalogFunction, options); + makeObservable(this); this.options = options.options; // Set value to something useful if undefined (and a value isRequired) @@ -41,7 +42,7 @@ export default class EnumerationParameter extends FunctionParameter { ); } - @computed + @override get isValid(): boolean { if (!isDefined(this.value)) { return !this.isRequired; diff --git a/lib/Models/FunctionParameters/FunctionParameter.ts b/lib/Models/FunctionParameters/FunctionParameter.ts index ba03a1ab458..20b7f639886 100644 --- a/lib/Models/FunctionParameters/FunctionParameter.ts +++ b/lib/Models/FunctionParameters/FunctionParameter.ts @@ -1,4 +1,4 @@ -import { computed, runInAction } from "mobx"; +import { computed, runInAction, makeObservable } from "mobx"; import combine from "terriajs-cesium/Source/Core/combine"; import isDefined from "../../Core/isDefined"; import JsonValue, { JsonObject } from "../../Core/Json"; @@ -12,6 +12,10 @@ export interface Options { isRequired?: boolean; } +export type FunctionConstructorParameters = ConstructorParameters< + typeof FunctionParameter +>; + export default abstract class FunctionParameter< T extends JsonValue | undefined = JsonValue > { @@ -26,6 +30,7 @@ export default abstract class FunctionParameter< protected readonly catalogFunction: CatalogFunctionMixin.Instance, options: Options ) { + makeObservable(this); this.id = options.id; this.name = options.name || this.id; this.description = options.description || ""; diff --git a/lib/Models/FunctionParameters/GeoJsonParameter.ts b/lib/Models/FunctionParameters/GeoJsonParameter.ts index 3e8b0240581..0a6b21a9bd5 100644 --- a/lib/Models/FunctionParameters/GeoJsonParameter.ts +++ b/lib/Models/FunctionParameters/GeoJsonParameter.ts @@ -1,5 +1,5 @@ import { Feature } from "@turf/helpers"; -import { computed, observable } from "mobx"; +import { computed, observable, makeObservable } from "mobx"; import Cartographic from "terriajs-cesium/Source/Core/Cartographic"; import { JsonObject } from "../../Core/Json"; import CatalogFunctionMixin from "../../ModelMixins/CatalogFunctionMixin"; @@ -53,6 +53,7 @@ export default class GeoJsonParameter options: Options ) { super(catalogFunction, options); + makeObservable(this); this.regionParameter = options.regionParameter; } diff --git a/lib/Models/FunctionParameters/InfoParameter.ts b/lib/Models/FunctionParameters/InfoParameter.ts index 84bd9c467a8..88fa15b9aaf 100644 --- a/lib/Models/FunctionParameters/InfoParameter.ts +++ b/lib/Models/FunctionParameters/InfoParameter.ts @@ -1,4 +1,4 @@ -import { computed, observable } from "mobx"; +import { makeObservable, observable, override } from "mobx"; import isDefined from "../../Core/isDefined"; import CatalogFunctionMixin from "../../ModelMixins/CatalogFunctionMixin"; import FunctionParameter, { @@ -26,6 +26,8 @@ export default class InfoParameter extends FunctionParameter { ) { super(catalogFunction, options); + makeObservable(this); + if (isDefined(options.value)) { this._value = options.value; } @@ -35,12 +37,12 @@ export default class InfoParameter extends FunctionParameter { } } - @computed + @override get isValid() { return !this._errorMessage; } - @computed + @override get value(): string | undefined { return this._value; } diff --git a/lib/Models/FunctionParameters/LineParameter.ts b/lib/Models/FunctionParameters/LineParameter.ts index 242ac0c56f0..fbc9b336c26 100644 --- a/lib/Models/FunctionParameters/LineParameter.ts +++ b/lib/Models/FunctionParameters/LineParameter.ts @@ -1,7 +1,9 @@ import { Feature, LineString } from "@turf/helpers"; -import { computed } from "mobx"; +import { computed, makeObservable } from "mobx"; import isDefined from "../../Core/isDefined"; -import FunctionParameter from "./FunctionParameter"; +import FunctionParameter, { + FunctionConstructorParameters +} from "./FunctionParameter"; import { GeoJsonFunctionParameter } from "./GeoJsonParameter"; type Coordinates = number[]; @@ -14,6 +16,13 @@ export default class LineParameter static readonly type = "line"; readonly type = "line"; + constructor(...args: FunctionConstructorParameters) { + // TODO: [mobx-undecorate] verify the constructor arguments and the arguments of this automatically generated super call + super(...args); + + makeObservable(this); + } + static formatValueForUrl(value: Line) { return JSON.stringify({ type: "FeatureCollection", diff --git a/lib/Models/FunctionParameters/PointParameter.ts b/lib/Models/FunctionParameters/PointParameter.ts index 319db13b7bf..766184d6f17 100644 --- a/lib/Models/FunctionParameters/PointParameter.ts +++ b/lib/Models/FunctionParameters/PointParameter.ts @@ -1,9 +1,11 @@ import { Feature, Point } from "@turf/helpers"; -import { computed } from "mobx"; +import { computed, makeObservable } from "mobx"; import Cartographic from "terriajs-cesium/Source/Core/Cartographic"; import CesiumMath from "terriajs-cesium/Source/Core/Math"; import isDefined from "../../Core/isDefined"; -import FunctionParameter from "./FunctionParameter"; +import FunctionParameter, { + FunctionConstructorParameters +} from "./FunctionParameter"; import { GeoJsonFunctionParameter } from "./GeoJsonParameter"; export type CartographicPoint = { @@ -19,6 +21,13 @@ export default class PointParameter static readonly type = "point"; readonly type = "point"; + constructor(...args: FunctionConstructorParameters) { + // TODO: [mobx-undecorate] verify the constructor arguments and the arguments of this automatically generated super call + super(...args); + + makeObservable(this); + } + /** * Get feature as geojson for display on map. */ diff --git a/lib/Models/FunctionParameters/PolygonParameter.ts b/lib/Models/FunctionParameters/PolygonParameter.ts index 7fe8a57465a..19992fe674e 100644 --- a/lib/Models/FunctionParameters/PolygonParameter.ts +++ b/lib/Models/FunctionParameters/PolygonParameter.ts @@ -1,7 +1,9 @@ import { Feature, Polygon } from "@turf/helpers"; -import { computed } from "mobx"; +import { computed, makeObservable } from "mobx"; import isDefined from "../../Core/isDefined"; -import FunctionParameter from "./FunctionParameter"; +import FunctionParameter, { + FunctionConstructorParameters +} from "./FunctionParameter"; import { GeoJsonFunctionParameter } from "./GeoJsonParameter"; type Coordinates = number[]; @@ -15,6 +17,13 @@ export default class PolygonParameter static readonly type = "polygon"; readonly type = "polygon"; + constructor(...args: FunctionConstructorParameters) { + // TODO: [mobx-undecorate] verify the constructor arguments and the arguments of this automatically generated super call + super(...args); + + makeObservable(this); + } + static formatValueForUrl(value: PolygonCoordinates) { return JSON.stringify({ type: "FeatureCollection", diff --git a/lib/Models/FunctionParameters/SelectAPolygonParameter.ts b/lib/Models/FunctionParameters/SelectAPolygonParameter.ts index b14f4a4793c..fada29529c5 100644 --- a/lib/Models/FunctionParameters/SelectAPolygonParameter.ts +++ b/lib/Models/FunctionParameters/SelectAPolygonParameter.ts @@ -1,7 +1,9 @@ import { Feature, Polygon } from "@turf/helpers"; -import { computed, isObservableArray } from "mobx"; +import { computed, isObservableArray, makeObservable } from "mobx"; import { JsonObject } from "../../Core/Json"; -import FunctionParameter from "./FunctionParameter"; +import FunctionParameter, { + FunctionConstructorParameters +} from "./FunctionParameter"; import { GeoJsonFunctionParameter } from "./GeoJsonParameter"; /** * A parameter that specifies an arbitrary polygon on the globe, which has been selected from a different layer. @@ -12,6 +14,13 @@ export default class SelectAPolygonParameter { readonly type = "polygon"; + constructor(...args: FunctionConstructorParameters) { + // TODO: [mobx-undecorate] verify the constructor arguments and the arguments of this automatically generated super call + super(...args); + + makeObservable(this); + } + static formatValueForUrl(value: Feature[]) { if (!(Array.isArray(value) || isObservableArray(value))) { return undefined; diff --git a/lib/Models/GlobeOrMap.ts b/lib/Models/GlobeOrMap.ts index 2702993ef6e..4368f43c955 100644 --- a/lib/Models/GlobeOrMap.ts +++ b/lib/Models/GlobeOrMap.ts @@ -1,4 +1,10 @@ -import { action, computed, observable, runInAction } from "mobx"; +import { + action, + computed, + observable, + runInAction, + makeObservable +} from "mobx"; import Cartesian2 from "terriajs-cesium/Source/Core/Cartesian2"; import Cartesian3 from "terriajs-cesium/Source/Core/Cartesian3"; import Color from "terriajs-cesium/Source/Core/Color"; @@ -69,6 +75,10 @@ export default abstract class GlobeOrMap { flightDurationSeconds: number ): Promise; + constructor() { + makeObservable(this); + } + /** * Zoom map to a dataset or the given bounds. * @@ -115,7 +125,6 @@ export default abstract class GlobeOrMap { /** * List of the attributions (credits) for data currently displayed on map. */ - @computed get attributions(): string[] { return []; } diff --git a/lib/Models/ItemSearchProviders/IndexedItemSearchProvider.ts b/lib/Models/ItemSearchProviders/IndexedItemSearchProvider.ts index 2545a9f2b7f..e79c6a63ad5 100644 --- a/lib/Models/ItemSearchProviders/IndexedItemSearchProvider.ts +++ b/lib/Models/ItemSearchProviders/IndexedItemSearchProvider.ts @@ -1,5 +1,5 @@ import i18next from "i18next"; -import { action } from "mobx"; +import { action, makeObservable } from "mobx"; import loadCsv from "../../Core/loadCsv"; import loadJson5 from "../../Core/loadJson5"; import { SearchParameterTraits } from "../../Traits/TraitsClasses/SearchableItemTraits"; @@ -32,6 +32,7 @@ export default class IndexedItemSearchProvider extends ItemSearchProvider { */ constructor(options: any, parameterOptions: SearchParameterTraits[]) { super(options, parameterOptions); + makeObservable(this); const indexRootUrl = options?.indexRootUrl; if (typeof indexRootUrl !== "string") throw new Error(t("indexedItemSearchProvider.missingOptionIndexRootUrl")); diff --git a/lib/Models/Leaflet.ts b/lib/Models/Leaflet.ts index cab7b446738..a185c69f9cf 100644 --- a/lib/Models/Leaflet.ts +++ b/lib/Models/Leaflet.ts @@ -6,7 +6,8 @@ import { computed, observable, reaction, - runInAction + runInAction, + makeObservable, } from "mobx"; import { computedFn } from "mobx-utils"; import cesiumCancelAnimationFrame from "terriajs-cesium/Source/Core/cancelAnimationFrame"; @@ -149,6 +150,7 @@ export default class Leaflet extends GlobeOrMap { constructor(terriaViewer: TerriaViewer, container: string | HTMLElement) { super(); + makeObservable(this); this.terria = terriaViewer.terria; this.terriaViewer = terriaViewer; this.map = L.map(container, { diff --git a/lib/Models/LeafletAttribution.ts b/lib/Models/LeafletAttribution.ts index c46b93b9805..6aa02b82526 100644 --- a/lib/Models/LeafletAttribution.ts +++ b/lib/Models/LeafletAttribution.ts @@ -1,4 +1,9 @@ -import { IObservableArray, runInAction, observable } from "mobx"; +import { + IObservableArray, + runInAction, + observable, + makeObservable +} from "mobx"; import L from "leaflet"; import Terria from "./Terria"; @@ -17,6 +22,7 @@ export class LeafletAttribution extends L.Control.Attribution { options.prefix = terria.configParameters.leafletAttributionPrefix; } super(options); + makeObservable(this); this._attributions = {}; this.dataAttributions = observable([]); diff --git a/lib/Models/MapInteractionMode.ts b/lib/Models/MapInteractionMode.ts index 43da63349eb..1d9ce7abacd 100644 --- a/lib/Models/MapInteractionMode.ts +++ b/lib/Models/MapInteractionMode.ts @@ -1,6 +1,6 @@ import defaultValue from "terriajs-cesium/Source/Core/defaultValue"; import PickedFeatures from "../Map/PickedFeatures/PickedFeatures"; -import { observable } from "mobx"; +import { observable, makeObservable } from "mobx"; import ViewState from "../ReactViewModels/ViewState"; export enum UIMode { @@ -44,55 +44,56 @@ export default class MapInteractionMode { onEnable?: (viewState: ViewState) => void; constructor(options: Options) { - /** - * Gets or sets a callback that is invoked when the user cancels the interaction mode. If this property is undefined, - * the interaction mode cannot be canceled. - */ - this.onCancel = options.onCancel; - - /** - * Gets or sets the details of a custom user interface for this map interaction mode. This property is not used by - * the `MapInteractionMode` itself, so it can be anything that is suitable for the user interface. In the standard - * React-based user interface included with TerriaJS, this property is a function that is called with no parameters - * and is expected to return a React component. - */ - this.customUi = options.customUi; - - /** - * Gets or sets the html formatted message displayed on the map when in this mode. - */ - this.message = function () { - return options.message; - }; - - /** - * Gets or sets the react node displayed on the map when in this mode. - */ - this.messageAsNode = function () { - return options.messageAsNode; - }; - - /** - * Set the text of the button for the dialog the message is displayed on. - */ - this.buttonText = defaultValue(options.buttonText, "Cancel"); - - /** - * Gets or sets the features that are currently picked. - */ - this.pickedFeatures = undefined; - - /** - * Gets or sets whether to use the diff tool UI+styles - */ - this.uiMode = defaultValue(options.uiMode, undefined); - - /** - * Determines whether a rectangle will be requested from the user rather than a set of pickedFeatures. - */ - // this.drawRectangle = defaultValue(options.drawRectangle, false); - this.onEnable = options.onEnable; - - this.invisible = defaultValue(options.invisible, false); + makeObservable(this); + /** + * Gets or sets a callback that is invoked when the user cancels the interaction mode. If this property is undefined, + * the interaction mode cannot be canceled. + */ + this.onCancel = options.onCancel; + + /** + * Gets or sets the details of a custom user interface for this map interaction mode. This property is not used by + * the `MapInteractionMode` itself, so it can be anything that is suitable for the user interface. In the standard + * React-based user interface included with TerriaJS, this property is a function that is called with no parameters + * and is expected to return a React component. + */ + this.customUi = options.customUi; + + /** + * Gets or sets the html formatted message displayed on the map when in this mode. + */ + this.message = function () { + return options.message; + }; + + /** + * Gets or sets the react node displayed on the map when in this mode. + */ + this.messageAsNode = function () { + return options.messageAsNode; + }; + + /** + * Set the text of the button for the dialog the message is displayed on. + */ + this.buttonText = defaultValue(options.buttonText, "Cancel"); + + /** + * Gets or sets the features that are currently picked. + */ + this.pickedFeatures = undefined; + + /** + * Gets or sets whether to use the diff tool UI+styles + */ + this.uiMode = defaultValue(options.uiMode, undefined); + + /** + * Determines whether a rectangle will be requested from the user rather than a set of pickedFeatures. + */ + // this.drawRectangle = defaultValue(options.drawRectangle, false); + this.onEnable = options.onEnable; + + this.invisible = defaultValue(options.invisible, false); } } diff --git a/lib/Models/SearchProviders/BingMapsSearchProvider.ts b/lib/Models/SearchProviders/BingMapsSearchProvider.ts index 55b5a9a2258..5a011c5a31c 100644 --- a/lib/Models/SearchProviders/BingMapsSearchProvider.ts +++ b/lib/Models/SearchProviders/BingMapsSearchProvider.ts @@ -1,4 +1,4 @@ -import { observable, runInAction } from "mobx"; +import { observable, runInAction, makeObservable } from "mobx"; import defaultValue from "terriajs-cesium/Source/Core/defaultValue"; import defined from "terriajs-cesium/Source/Core/defined"; import Ellipsoid from "terriajs-cesium/Source/Core/Ellipsoid"; @@ -36,6 +36,8 @@ export default class BingMapsSearchProvider extends SearchProvider { constructor(options: BingMapsSearchProviderOptions) { super(); + makeObservable(this); + this.terria = options.terria; this.name = i18next.t("viewModels.searchLocations"); this.url = defaultValue(options.url, "https://dev.virtualearth.net/"); diff --git a/lib/Models/SearchProviders/CatalogIndex.ts b/lib/Models/SearchProviders/CatalogIndex.ts index 5ff5bb00c9d..5450fdeb2c3 100644 --- a/lib/Models/SearchProviders/CatalogIndex.ts +++ b/lib/Models/SearchProviders/CatalogIndex.ts @@ -1,5 +1,5 @@ import { Document } from "flexsearch"; -import { action, observable, runInAction } from "mobx"; +import { action, observable, runInAction, makeObservable } from "mobx"; import { isJsonObject, isJsonString, isJsonStringArray } from "../../Core/Json"; import loadBlob, { isZip, parseZipJsonBlob } from "../../Core/loadBlob"; import loadJson from "../../Core/loadJson"; @@ -31,7 +31,9 @@ export default class CatalogIndex { @observable private _loadPromise: Promise | undefined; - constructor(private readonly terria: Terria, private readonly url: string) {} + constructor(private readonly terria: Terria, private readonly url: string) { + makeObservable(this); + } get models() { return this._models; diff --git a/lib/Models/SearchProviders/CatalogSearchProvider.ts b/lib/Models/SearchProviders/CatalogSearchProvider.ts index 54ed2df6f2d..eea85161ddd 100644 --- a/lib/Models/SearchProviders/CatalogSearchProvider.ts +++ b/lib/Models/SearchProviders/CatalogSearchProvider.ts @@ -1,4 +1,4 @@ -import { autorun, computed, observable, runInAction } from "mobx"; +import { autorun, computed, observable, runInAction, makeObservable } from "mobx"; import { fromPromise } from "mobx-utils"; import { Category, @@ -111,6 +111,8 @@ export default class CatalogSearchProvider extends SearchProvider { constructor(options: CatalogSearchProviderOptions) { super(); + makeObservable(this); + this.terria = options.terria; this.name = "Catalog Items"; } diff --git a/lib/Models/SearchProviders/SearchProvider.ts b/lib/Models/SearchProviders/SearchProvider.ts index e29eef2fc0e..2af5f6c9081 100644 --- a/lib/Models/SearchProviders/SearchProvider.ts +++ b/lib/Models/SearchProviders/SearchProvider.ts @@ -1,8 +1,12 @@ -import { action, observable } from "mobx"; +import { action, observable, makeObservable } from "mobx"; import { fromPromise } from "mobx-utils"; import SearchProviderResults from "./SearchProviderResults"; export default abstract class SearchProvider { + constructor() { + makeObservable(this); + } + /** If search results are References to models in terria.models - set this to true. * This is so groups/references are opened and loaded properly */ diff --git a/lib/Models/SearchProviders/SearchProviderResults.ts b/lib/Models/SearchProviders/SearchProviderResults.ts index 92ddfd1ddca..ad1c24e95bd 100644 --- a/lib/Models/SearchProviders/SearchProviderResults.ts +++ b/lib/Models/SearchProviders/SearchProviderResults.ts @@ -1,4 +1,4 @@ -import { observable } from "mobx"; +import { observable, makeObservable } from "mobx"; import SearchResult from "./SearchResult"; import { IPromiseBasedObservable, fromPromise } from "mobx-utils"; import SearchProvider from "./SearchProvider"; @@ -11,7 +11,9 @@ export default class SearchProviderResults { Promise.resolve() ); - constructor(readonly searchProvider: SearchProvider) {} + constructor(readonly searchProvider: SearchProvider) { + makeObservable(this); + } get isSearching() { return this.resultsCompletePromise.state === "pending"; diff --git a/lib/Models/SearchProviders/SearchResult.ts b/lib/Models/SearchProviders/SearchResult.ts index b70c92f9e7a..5c1ad61107a 100644 --- a/lib/Models/SearchProviders/SearchResult.ts +++ b/lib/Models/SearchProviders/SearchResult.ts @@ -1,5 +1,5 @@ import { BaseModel } from "../Definition/Model"; -import { observable, action } from "mobx"; +import { observable, action, makeObservable } from "mobx"; import defaultValue from "terriajs-cesium/Source/Core/defaultValue"; import defined from "terriajs-cesium/Source/Core/defined"; import GroupMixin from "../../ModelMixins/GroupMixin"; @@ -24,6 +24,7 @@ export default class SearchResult { @observable location: { longitude: number; latitude: number } | undefined; constructor(options: SearchResultOptions) { + makeObservable(this); this.name = defaultValue(options.name, "Unknown"); this.tooltip = options.tooltip; this.isImportant = defaultValue(options.isImportant, false); diff --git a/lib/Models/Terria.ts b/lib/Models/Terria.ts index f465a0d4ce1..a3601cc60fb 100644 --- a/lib/Models/Terria.ts +++ b/lib/Models/Terria.ts @@ -1,5 +1,5 @@ import i18next from "i18next"; -import { action, computed, observable, runInAction, toJS, when } from "mobx"; +import { action, computed, observable, runInAction, toJS, when, makeObservable } from "mobx"; import { createTransformer } from "mobx-utils"; import buildModuleUrl from "terriajs-cesium/Source/Core/buildModuleUrl"; import Clock from "terriajs-cesium/Source/Core/Clock"; @@ -647,6 +647,7 @@ export default class Terria { errorService: ErrorServiceProvider = new StubErrorServiceProvider(); constructor(options: TerriaOptions = {}) { + makeObservable(this); if (options.appBaseHref) { this.appBaseHref = new URL( options.appBaseHref, diff --git a/lib/Models/TimelineStack.ts b/lib/Models/TimelineStack.ts index b7cf3507ca3..f79f22b5d50 100644 --- a/lib/Models/TimelineStack.ts +++ b/lib/Models/TimelineStack.ts @@ -1,4 +1,4 @@ -import { action, autorun, computed, IReactionDisposer, observable } from "mobx"; +import { action, autorun, computed, IReactionDisposer, observable, makeObservable } from "mobx"; import Clock from "terriajs-cesium/Source/Core/Clock"; import ClockRange from "terriajs-cesium/Source/Core/ClockRange"; import CesiumEvent from "terriajs-cesium/Source/Core/Event"; @@ -33,7 +33,9 @@ export default class TimelineStack { private _disposeClockAutorun: IReactionDisposer | undefined; private _disposeTickSubscription: CesiumEvent.RemoveCallback | undefined; - constructor(readonly terria: Terria, readonly clock: Clock) {} + constructor(readonly terria: Terria, readonly clock: Clock) { + makeObservable(this); + } activate() { // Keep the Cesium clock in sync with the top layer's clock. diff --git a/lib/Models/UserDrawing.ts b/lib/Models/UserDrawing.ts index bcdfa6c486d..87e08392464 100644 --- a/lib/Models/UserDrawing.ts +++ b/lib/Models/UserDrawing.ts @@ -4,7 +4,9 @@ import { IReactionDisposer, observable, reaction, - runInAction + runInAction, + makeObservable, + override } from "mobx"; import Cartesian3 from "terriajs-cesium/Source/Core/Cartesian3"; import Cartographic from "terriajs-cesium/Source/Core/Cartographic"; @@ -81,6 +83,8 @@ export default class UserDrawing extends MappableMixin( constructor(options: Options) { super(createGuid(), options.terria); + makeObservable(this); + /** * Text that appears at the top of the dialog when drawmode is active. */ @@ -186,7 +190,8 @@ export default class UserDrawing extends MappableMixin( return svgDataDeclare + svgString; } - @computed get cesiumRectangle(): Rectangle | undefined { + @override + get cesiumRectangle(): Rectangle | undefined { return this.getRectangleForShape(); } @@ -300,7 +305,7 @@ export default class UserDrawing extends MappableMixin( const pickPointMode = this.addMapInteractionMode(); this.disposePickedFeatureSubscription = reaction( () => pickPointMode.pickedFeatures, - async (pickedFeatures, reaction) => { + async (pickedFeatures, _previousValue, reaction) => { if (isDefined(pickedFeatures)) { if (isDefined(pickedFeatures.allFeaturesAvailablePromise)) { await pickedFeatures.allFeaturesAvailablePromise; @@ -414,7 +419,7 @@ export default class UserDrawing extends MappableMixin( const pickPointMode = this.addMapInteractionMode(); this.disposePickedFeatureSubscription = reaction( () => pickPointMode.pickedFeatures, - async (pickedFeatures, reaction) => { + async (pickedFeatures, _previousValue, reaction) => { if (isDefined(pickedFeatures)) { if (isDefined(pickedFeatures.allFeaturesAvailablePromise)) { await pickedFeatures.allFeaturesAvailablePromise; diff --git a/lib/Models/Workbench.ts b/lib/Models/Workbench.ts index ba0f0586693..c508fee8639 100644 --- a/lib/Models/Workbench.ts +++ b/lib/Models/Workbench.ts @@ -1,5 +1,5 @@ import i18next from "i18next"; -import { action, computed, observable } from "mobx"; +import { action, computed, observable, makeObservable } from "mobx"; import filterOutUndefined from "../Core/filterOutUndefined"; import Result from "../Core/Result"; import TerriaError, { TerriaErrorSeverity } from "../Core/TerriaError"; @@ -22,6 +22,10 @@ const supportsReordering = (model: BaseModel) => export default class Workbench { private readonly _items = observable.array(); + constructor() { + makeObservable(this); + } + /** * Gets or sets the list of items on the workbench. */ diff --git a/lib/Models/Workflows/TableStylingWorkflow.ts b/lib/Models/Workflows/TableStylingWorkflow.ts index 2f51f1b8ccc..2eb67c9a5ef 100644 --- a/lib/Models/Workflows/TableStylingWorkflow.ts +++ b/lib/Models/Workflows/TableStylingWorkflow.ts @@ -5,7 +5,9 @@ import { observable, ObservableMap, reaction, - runInAction + runInAction, + makeObservable, + override } from "mobx"; import filterOutUndefined from "../../Core/filterOutUndefined"; import isDefined from "../../Core/isDefined"; @@ -111,6 +113,7 @@ export default class TableStylingWorkflow private activeStyleDisposer: IReactionDisposer; constructor(readonly item: TableMixin.Instance) { + makeObservable(this); // We need to reset colorSchemeType every time Table.activeStyle changes this.activeStyleDisposer = reaction( () => this.item.activeStyle, @@ -2262,7 +2265,8 @@ export default class TableStylingWorkflow } /** All of the dimensions! */ - @computed get selectableDimensions(): SelectableDimensionWorkflowGroup[] { + @computed + get selectableDimensions(): SelectableDimensionWorkflowGroup[] { return filterOutUndefined([ this.tableStyleSelectableDim, diff --git a/lib/ReactViewModels/MouseCoords.ts b/lib/ReactViewModels/MouseCoords.ts index 4c161b60ea7..24f0ecaf26c 100644 --- a/lib/ReactViewModels/MouseCoords.ts +++ b/lib/ReactViewModels/MouseCoords.ts @@ -1,5 +1,5 @@ import debounce from "lodash-es/debounce"; -import { observable, action, runInAction } from "mobx"; +import { observable, action, runInAction, makeObservable } from "mobx"; import Cartesian2 from "terriajs-cesium/Source/Core/Cartesian2"; import Cartographic from "terriajs-cesium/Source/Core/Cartographic"; import EllipsoidTerrainProvider from "terriajs-cesium/Source/Core/EllipsoidTerrainProvider"; @@ -47,6 +47,7 @@ export default class MouseCoords { @observable useProjection = false; constructor() { + makeObservable(this); this.geoidModel = new EarthGravityModel1996( require("file-loader!../../wwwroot/data/WW15MGH.DAC") ); diff --git a/lib/ReactViewModels/NotificationState.ts b/lib/ReactViewModels/NotificationState.ts index 52f07b358f4..45322bfc2a6 100644 --- a/lib/ReactViewModels/NotificationState.ts +++ b/lib/ReactViewModels/NotificationState.ts @@ -1,4 +1,4 @@ -import { action, computed, observable } from "mobx"; +import { action, computed, observable, makeObservable } from "mobx"; import { ReactNode } from "react"; import ViewState from "./ViewState"; @@ -29,6 +29,10 @@ export default class NotificationState { @observable protected notifications: Notification[] = []; protected alreadyNotifiedKeys: Set = new Set(); + constructor() { + makeObservable(this); + } + @action addNotificationToQueue(notification: Notification) { const alreadyQueued = diff --git a/lib/ReactViewModels/SearchState.ts b/lib/ReactViewModels/SearchState.ts index 92657356823..9e4f379e78b 100644 --- a/lib/ReactViewModels/SearchState.ts +++ b/lib/ReactViewModels/SearchState.ts @@ -1,11 +1,5 @@ // import CatalogItemNameSearchProviderViewModel from "../ViewModels/CatalogItemNameSearchProviderViewModel"; -import { - observable, - reaction, - IReactionDisposer, - computed, - action -} from "mobx"; +import { observable, reaction, IReactionDisposer, computed, action, makeObservable } from "mobx"; import Terria from "../Models/Terria"; import SearchProviderResults from "../Models/SearchProviders/SearchProviderResults"; import SearchProvider from "../Models/SearchProviders/SearchProvider"; @@ -46,6 +40,7 @@ export default class SearchState { private _unifiedSearchDisposer: IReactionDisposer; constructor(options: SearchStateOptions) { + makeObservable(this); this.catalogSearchProvider = options.catalogSearchProvider || new CatalogSearchProvider({ terria: options.terria }); diff --git a/lib/ReactViewModels/ViewState.ts b/lib/ReactViewModels/ViewState.ts index 2119523cb11..67871593c50 100644 --- a/lib/ReactViewModels/ViewState.ts +++ b/lib/ReactViewModels/ViewState.ts @@ -4,7 +4,8 @@ import { IReactionDisposer, observable, reaction, - runInAction + runInAction, + makeObservable, } from "mobx"; import { Ref } from "react"; import defined from "terriajs-cesium/Source/Core/defined"; @@ -370,6 +371,7 @@ export default class ViewState { private _disclaimerHandler: DisclaimerHandler; constructor(options: ViewStateOptions) { + makeObservable(this); const terria = options.terria; this.searchState = new SearchState({ terria: terria, diff --git a/lib/ReactViews/Analytics/BooleanParameterEditor.tsx b/lib/ReactViews/Analytics/BooleanParameterEditor.tsx index dabfd28d130..81fade591ac 100644 --- a/lib/ReactViews/Analytics/BooleanParameterEditor.tsx +++ b/lib/ReactViews/Analytics/BooleanParameterEditor.tsx @@ -1,4 +1,4 @@ -import { action } from "mobx"; +import { action, makeObservable } from "mobx"; import { observer } from "mobx-react"; import React from "react"; import CommonStrata from "../../Models/Definition/CommonStrata"; @@ -10,6 +10,15 @@ import Styles from "./parameter-editors.scss"; export default class BooleanParameterEditor extends React.Component<{ parameter: BooleanParameter; }> { + constructor( + props: { + parameter: BooleanParameter; + } + ) { + super(props); + makeObservable(this); + } + @action onClick() { this.props.parameter.setValue( diff --git a/lib/ReactViews/Analytics/EnumerationParameterEditor.tsx b/lib/ReactViews/Analytics/EnumerationParameterEditor.tsx index 74c53f6a76e..eadf187229f 100644 --- a/lib/ReactViews/Analytics/EnumerationParameterEditor.tsx +++ b/lib/ReactViews/Analytics/EnumerationParameterEditor.tsx @@ -2,7 +2,7 @@ import React from "react"; import { observer } from "mobx-react"; import Styles from "./parameter-editors.scss"; -import { action } from "mobx"; +import { action, makeObservable } from "mobx"; import EnumerationParameter from "../../Models/FunctionParameters/EnumerationParameter"; import CommonStrata from "../../Models/Definition/CommonStrata"; import isDefined from "../../Core/isDefined"; @@ -11,6 +11,15 @@ import isDefined from "../../Core/isDefined"; export default class EnumerationParameterEditor extends React.Component<{ parameter: EnumerationParameter; }> { + constructor( + props: { + parameter: EnumerationParameter; + } + ) { + super(props); + makeObservable(this); + } + @action onChange(e: React.ChangeEvent) { this.props.parameter.setValue(CommonStrata.user, e.target.value); diff --git a/lib/ReactViews/Analytics/GenericParameterEditor.tsx b/lib/ReactViews/Analytics/GenericParameterEditor.tsx index f5d03ce53d4..3afdf3bbdde 100644 --- a/lib/ReactViews/Analytics/GenericParameterEditor.tsx +++ b/lib/ReactViews/Analytics/GenericParameterEditor.tsx @@ -2,7 +2,7 @@ import React from "react"; import Styles from "./parameter-editors.scss"; import FunctionParameter from "../../Models/FunctionParameters/FunctionParameter"; -import { action } from "mobx"; +import { action, makeObservable } from "mobx"; import { observer } from "mobx-react"; import CommonStrata from "../../Models/Definition/CommonStrata"; @@ -10,6 +10,15 @@ import CommonStrata from "../../Models/Definition/CommonStrata"; export default class GenericParameterEditor extends React.Component<{ parameter: FunctionParameter; }> { + constructor( + props: { + parameter: FunctionParameter; + } + ) { + super(props); + makeObservable(this); + } + @action onChange(e: React.ChangeEvent) { this.props.parameter.setValue(CommonStrata.user, e.target.value); diff --git a/lib/ReactViews/Analytics/InvokeFunction.jsx b/lib/ReactViews/Analytics/InvokeFunction.jsx index b1711abb954..db0f3a01666 100644 --- a/lib/ReactViews/Analytics/InvokeFunction.jsx +++ b/lib/ReactViews/Analytics/InvokeFunction.jsx @@ -1,5 +1,5 @@ import createReactClass from "create-react-class"; -import { observable, runInAction } from "mobx"; +import { observable, runInAction, makeObservable } from "mobx"; import { observer } from "mobx-react"; import PropTypes from "prop-types"; import React from "react"; @@ -39,6 +39,7 @@ class ParameterViewModel { wasEverBlurredWhileInvalid = false; constructor(parameter) { + makeObservable(this); this.parameter = parameter; } } diff --git a/lib/ReactViews/Analytics/SelectAPolygonParameterEditor.tsx b/lib/ReactViews/Analytics/SelectAPolygonParameterEditor.tsx index f08bc168836..987e106ee12 100644 --- a/lib/ReactViews/Analytics/SelectAPolygonParameterEditor.tsx +++ b/lib/ReactViews/Analytics/SelectAPolygonParameterEditor.tsx @@ -49,7 +49,7 @@ export function selectOnMap( reaction( () => pickPolygonMode.pickedFeatures, - async (pickedFeatures, reaction) => { + async (pickedFeatures, _previousValue, reaction) => { pickedFeaturesSubscription = reaction; if (pickedFeatures?.allFeaturesAvailablePromise) { await pickedFeatures.allFeaturesAvailablePromise; diff --git a/lib/ReactViews/BottomDock/Timeline/DateTimePicker.tsx b/lib/ReactViews/BottomDock/Timeline/DateTimePicker.tsx index 3e806c39807..fca27e89e30 100644 --- a/lib/ReactViews/BottomDock/Timeline/DateTimePicker.tsx +++ b/lib/ReactViews/BottomDock/Timeline/DateTimePicker.tsx @@ -3,7 +3,8 @@ import { IReactionDisposer, observable, reaction, - runInAction + runInAction, + makeObservable, } from "mobx"; import { observer } from "mobx-react"; import moment from "moment"; @@ -172,6 +173,11 @@ class DateTimePicker extends React.Component { private currentDateAutorunDisposer: IReactionDisposer | undefined; + constructor(props: PropsType) { + super(props); + makeObservable(this); + } + componentWillMount() { const datesObject = this.props.dates; let defaultCentury: number | undefined; diff --git a/lib/ReactViews/Custom/Chart/BottomDockChart.jsx b/lib/ReactViews/Custom/Chart/BottomDockChart.jsx index 3b301c72f65..9dcaf4444b8 100644 --- a/lib/ReactViews/Custom/Chart/BottomDockChart.jsx +++ b/lib/ReactViews/Custom/Chart/BottomDockChart.jsx @@ -1,5 +1,5 @@ import { observer } from "mobx-react"; -import { action, computed, observable } from "mobx"; +import { action, computed, observable, makeObservable } from "mobx"; import { AxisLeft, AxisBottom } from "@visx/axis"; import { RectClipPath } from "@visx/clip-path"; import { localPoint } from "@visx/event"; @@ -72,9 +72,14 @@ class Chart extends React.Component { margin: { left: 20, right: 30, top: 10, bottom: 50 } }; - @observable zoomedXScale; + @observable.ref zoomedXScale; @observable mouseCoords; + constructor(props) { + super(props); + makeObservable(this); + } + @computed get chartItems() { return sortChartItemsByType(this.props.chartItems) @@ -332,6 +337,11 @@ class Plot extends React.Component { zoomedScales: PropTypes.array.isRequired }; + constructor(props) { + super(props); + makeObservable(this); + } + @computed get chartRefs() { return this.props.chartItems.map((_) => React.createRef()); diff --git a/lib/ReactViews/Custom/Chart/ChartExpandAndDownloadButtons.tsx b/lib/ReactViews/Custom/Chart/ChartExpandAndDownloadButtons.tsx index f33bf948679..fb25511c762 100644 --- a/lib/ReactViews/Custom/Chart/ChartExpandAndDownloadButtons.tsx +++ b/lib/ReactViews/Custom/Chart/ChartExpandAndDownloadButtons.tsx @@ -1,6 +1,6 @@ import classNames from "classnames"; import { TFunction } from "i18next"; -import { action, observable, runInAction } from "mobx"; +import { action, observable, runInAction, makeObservable } from "mobx"; import { observer } from "mobx-react"; import React from "react"; import { WithTranslation, withTranslation } from "react-i18next"; @@ -29,6 +29,11 @@ interface PropsType extends WithTranslation { class ChartExpandAndDownloadButtons extends React.Component { @observable sourceItems: ChartableMixin.Instance[] = []; + constructor(props: PropsType) { + super(props); + makeObservable(this); + } + @action.bound private expandButton() { this.expandItem(this.sourceItems.length - 1); diff --git a/lib/ReactViews/Custom/Chart/ChartPanel.jsx b/lib/ReactViews/Custom/Chart/ChartPanel.jsx index 4f4376ceaf0..8f64c08c2d3 100644 --- a/lib/ReactViews/Custom/Chart/ChartPanel.jsx +++ b/lib/ReactViews/Custom/Chart/ChartPanel.jsx @@ -1,6 +1,6 @@ "use strict"; -import { computed } from "mobx"; +import { computed, makeObservable } from "mobx"; import { observer } from "mobx-react"; import PropTypes from "prop-types"; import React from "react"; @@ -29,6 +29,11 @@ class ChartPanel extends React.Component { t: PropTypes.func.isRequired }; + constructor(props) { + super(props); + makeObservable(this); + } + @computed get chartView() { return new ChartView(this.props.terria); diff --git a/lib/ReactViews/Custom/Chart/FeatureInfoPanelChart.jsx b/lib/ReactViews/Custom/Chart/FeatureInfoPanelChart.jsx index 13f868bc8fa..7141ab7ecd7 100644 --- a/lib/ReactViews/Custom/Chart/FeatureInfoPanelChart.jsx +++ b/lib/ReactViews/Custom/Chart/FeatureInfoPanelChart.jsx @@ -2,7 +2,7 @@ import { AxisBottom, AxisLeft } from "@visx/axis"; import { Group } from "@visx/group"; import { withParentSize } from "@visx/responsive"; import { scaleLinear, scaleTime } from "@visx/scale"; -import { computed } from "mobx"; +import { computed, makeObservable } from "mobx"; import { observer } from "mobx-react"; import PropTypes from "prop-types"; import React from "react"; @@ -33,6 +33,11 @@ class FeatureInfoPanelChart extends React.Component { margin: { top: 5, left: 5, right: 5, bottom: 5 } }; + constructor(props) { + super(props); + makeObservable(this); + } + @computed get chartItem() { return this.props.item.chartItems.find( @@ -108,6 +113,11 @@ class Chart extends React.Component { xAxisHeight = 30; yAxisWidth = 10; + constructor(props) { + super(props); + makeObservable(this); + } + @computed get plot() { const { width, height, margin } = this.props; diff --git a/lib/ReactViews/Custom/Chart/MomentPointsChart.jsx b/lib/ReactViews/Custom/Chart/MomentPointsChart.jsx index db2c95df9c9..f44decdb535 100644 --- a/lib/ReactViews/Custom/Chart/MomentPointsChart.jsx +++ b/lib/ReactViews/Custom/Chart/MomentPointsChart.jsx @@ -1,6 +1,6 @@ import { scaleLinear } from "@visx/scale"; import { interpolateNumber as d3InterpolateNumber } from "d3-interpolate"; -import { computed } from "mobx"; +import { computed, makeObservable } from "mobx"; import { observer } from "mobx-react"; import PropTypes from "prop-types"; import React from "react"; @@ -22,6 +22,11 @@ class MomentPointsChart extends React.Component { glyph: "circle" }; + constructor(props) { + super(props); + makeObservable(this); + } + @computed get points() { const { chartItem, basisItem, basisItemScales, scales } = this.props; diff --git a/lib/ReactViews/Custom/Chart/PointOnMap.tsx b/lib/ReactViews/Custom/Chart/PointOnMap.tsx index 36adbc6d537..cfb57dfe459 100644 --- a/lib/ReactViews/Custom/Chart/PointOnMap.tsx +++ b/lib/ReactViews/Custom/Chart/PointOnMap.tsx @@ -1,4 +1,4 @@ -import { action, observable } from "mobx"; +import { action, observable, makeObservable } from "mobx"; import { observer } from "mobx-react"; import React from "react"; import createGuid from "terriajs-cesium/Source/Core/createGuid"; @@ -20,6 +20,11 @@ export default class PointOnMap extends React.Component { @observable pointItem?: GeoJsonCatalogItem; + constructor(props: PropsType) { + super(props); + makeObservable(this); + } + @action componentDidMount() { const props = this.props; diff --git a/lib/ReactViews/Custom/Chart/Tooltip.jsx b/lib/ReactViews/Custom/Chart/Tooltip.jsx index e1e052186b3..75e68e744cd 100644 --- a/lib/ReactViews/Custom/Chart/Tooltip.jsx +++ b/lib/ReactViews/Custom/Chart/Tooltip.jsx @@ -1,5 +1,5 @@ import { observer } from "mobx-react"; -import { computed } from "mobx"; +import { computed, makeObservable } from "mobx"; import { Tooltip as VisxTooltip } from "@visx/tooltip"; import { CSSTransition } from "react-transition-group"; import PropTypes from "prop-types"; @@ -20,6 +20,11 @@ class Tooltip extends React.Component { prevItems = []; + constructor(props) { + super(props); + makeObservable(this); + } + @computed get items() { // When items` is unset, hold on to its last value. We do this because we diff --git a/lib/ReactViews/DragDropFile.tsx b/lib/ReactViews/DragDropFile.tsx index ce6d42990d9..f1ca3ebcc15 100644 --- a/lib/ReactViews/DragDropFile.tsx +++ b/lib/ReactViews/DragDropFile.tsx @@ -1,5 +1,5 @@ import classNames from "classnames"; -import { action, runInAction } from "mobx"; +import { action, runInAction, makeObservable } from "mobx"; import { observer } from "mobx-react"; import React from "react"; import { Trans, withTranslation, WithTranslation } from "react-i18next"; @@ -25,6 +25,11 @@ interface PropsType extends WithTranslation, WithViewState {} class DragDropFile extends React.Component { target: EventTarget | undefined; + constructor(props: PropsType) { + super(props); + makeObservable(this); + } + async handleDrop(e: React.DragEvent) { e.preventDefault(); e.stopPropagation(); diff --git a/lib/ReactViews/ExplorerWindow/Tabs/DataCatalogTab.jsx b/lib/ReactViews/ExplorerWindow/Tabs/DataCatalogTab.jsx index 1874ae86eeb..a5c2cb5ecd8 100644 --- a/lib/ReactViews/ExplorerWindow/Tabs/DataCatalogTab.jsx +++ b/lib/ReactViews/ExplorerWindow/Tabs/DataCatalogTab.jsx @@ -1,4 +1,4 @@ -import { computed, runInAction } from "mobx"; +import { computed, runInAction, makeObservable } from "mobx"; import { observer } from "mobx-react"; import PropTypes from "prop-types"; import React from "react"; @@ -24,6 +24,11 @@ class DataCatalogTab extends React.Component { t: PropTypes.func.isRequired }; + constructor(props) { + super(props); + makeObservable(this); + } + @computed get searchPlaceholder() { const { t } = this.props; diff --git a/lib/ReactViews/FeatureInfo/FeatureInfoPanel.tsx b/lib/ReactViews/FeatureInfo/FeatureInfoPanel.tsx index fa93e361067..656ead4cf06 100644 --- a/lib/ReactViews/FeatureInfo/FeatureInfoPanel.tsx +++ b/lib/ReactViews/FeatureInfo/FeatureInfoPanel.tsx @@ -1,6 +1,6 @@ import classNames from "classnames"; import { TFunction } from "i18next"; -import { action, reaction, runInAction } from "mobx"; +import { action, reaction, runInAction, makeObservable } from "mobx"; import { disposeOnUnmount, observer } from "mobx-react"; import React from "react"; import { withTranslation } from "react-i18next"; @@ -43,6 +43,11 @@ interface Props { @observer class FeatureInfoPanel extends React.Component { + constructor(props: Props) { + super(props); + makeObservable(this); + } + componentDidMount() { const { t } = this.props; const terria = this.props.viewState.terria; diff --git a/lib/ReactViews/FeatureInfo/FeatureInfoSection.tsx b/lib/ReactViews/FeatureInfo/FeatureInfoSection.tsx index f401aa78f4e..a4657306781 100644 --- a/lib/ReactViews/FeatureInfo/FeatureInfoSection.tsx +++ b/lib/ReactViews/FeatureInfo/FeatureInfoSection.tsx @@ -1,7 +1,7 @@ import classNames from "classnames"; import { TFunction } from "i18next"; import { isEmpty, merge } from "lodash-es"; -import { action, computed, observable, reaction, runInAction } from "mobx"; +import { action, computed, observable, reaction, runInAction, makeObservable } from "mobx"; import { observer } from "mobx-react"; import { IDisposer } from "mobx-utils"; import Mustache from "mustache"; @@ -78,6 +78,11 @@ export class FeatureInfoSection extends React.Component { /** See `setFeatureChangedCounter` */ @observable featureChangedCounter = 0; + constructor(props: FeatureInfoProps) { + super(props); + makeObservable(this); + } + componentDidMount() { this.templateReactionDisposer = reaction( () => [ diff --git a/lib/ReactViews/Feedback/FeedbackButtonController.ts b/lib/ReactViews/Feedback/FeedbackButtonController.ts index a0d04a344ea..8d5b99dfcd1 100644 --- a/lib/ReactViews/Feedback/FeedbackButtonController.ts +++ b/lib/ReactViews/Feedback/FeedbackButtonController.ts @@ -1,4 +1,4 @@ -import { action, computed } from "mobx"; +import { action, computed, makeObservable } from "mobx"; import isDefined from "../../Core/isDefined"; import ViewState from "../../ReactViewModels/ViewState"; import { GLYPHS } from "../../Styled/Icon"; @@ -9,6 +9,7 @@ export const FEEDBACK_TOOL_ID = "feedback"; export class FeedbackButtonController extends MapNavigationItemController { constructor(private viewState: ViewState) { super(); + makeObservable(this); } get glyph(): any { return GLYPHS.feedback; diff --git a/lib/ReactViews/Guide/SatelliteGuide.jsx b/lib/ReactViews/Guide/SatelliteGuide.jsx index 5112ad83921..4184b991353 100644 --- a/lib/ReactViews/Guide/SatelliteGuide.jsx +++ b/lib/ReactViews/Guide/SatelliteGuide.jsx @@ -3,7 +3,7 @@ import PropTypes from "prop-types"; import { withTranslation } from "react-i18next"; import Guide from "./Guide.jsx"; import satelliteGuideData from "./satelliteGuideData.js"; -import { action } from "mobx"; +import { action, makeObservable } from "mobx"; import { observer } from "mobx-react"; export const SATELLITE_GUIDE_KEY = "satelliteGuidance"; @@ -18,6 +18,7 @@ class SatelliteGuide extends React.Component { constructor() { super(); + makeObservable(this); } @action.bound diff --git a/lib/ReactViews/Map/Navigation/Items/AugmentedVirtualityTool.tsx b/lib/ReactViews/Map/Navigation/Items/AugmentedVirtualityTool.tsx index 29d847970ce..788ad9d7bc0 100644 --- a/lib/ReactViews/Map/Navigation/Items/AugmentedVirtualityTool.tsx +++ b/lib/ReactViews/Map/Navigation/Items/AugmentedVirtualityTool.tsx @@ -1,5 +1,5 @@ import i18next from "i18next"; -import { action, computed, observable } from "mobx"; +import { action, computed, observable, makeObservable } from "mobx"; import { observer } from "mobx-react"; import React from "react"; import { useTranslation } from "react-i18next"; @@ -49,6 +49,7 @@ export class AugmentedVirtualityController extends MapNavigationItemController { constructor(private props: IProps) { super(); + makeObservable(this); } @computed @@ -113,6 +114,7 @@ export class AugmentedVirtualityRealignController extends MapNavigationItemContr constructor(private props: IProps) { super(); + makeObservable(this); this.augmentedVirtuality = props.augmentedVirtuality; } @@ -201,6 +203,7 @@ export const AugmentedVirtualityRealign: React.FC<{ export class AugmentedVirtualityHoverController extends MapNavigationItemController { constructor(private props: IAugmentedVirtuality) { super(); + makeObservable(this); } get glyph(): { id: string } { diff --git a/lib/ReactViews/Map/Navigation/Items/Compass.tsx b/lib/ReactViews/Map/Navigation/Items/Compass.tsx index 42c6a66509d..fcfa09c7f70 100644 --- a/lib/ReactViews/Map/Navigation/Items/Compass.tsx +++ b/lib/ReactViews/Map/Navigation/Items/Compass.tsx @@ -10,7 +10,7 @@ */ // import { TFunction } from "i18next"; -import { computed, runInAction, when } from "mobx"; +import { computed, runInAction, when, makeObservable } from "mobx"; import React from "react"; import { WithTranslation, withTranslation } from "react-i18next"; import styled, { DefaultTheme, withTheme } from "styled-components"; @@ -176,6 +176,7 @@ class Compass extends React.Component { */ constructor(props: PropTypes) { super(props); + makeObservable(this); this.state = { orbitCursorAngle: 0, heading: 0.0, diff --git a/lib/ReactViews/Map/Navigation/Items/MyLocation.ts b/lib/ReactViews/Map/Navigation/Items/MyLocation.ts index 75812dcea41..317ce92d344 100644 --- a/lib/ReactViews/Map/Navigation/Items/MyLocation.ts +++ b/lib/ReactViews/Map/Navigation/Items/MyLocation.ts @@ -1,5 +1,5 @@ import i18next from "i18next"; -import { action, observable, runInAction } from "mobx"; +import { action, observable, runInAction, makeObservable } from "mobx"; import React from "react"; import CesiumCartographic from "terriajs-cesium/Source/Core/Cartographic"; import createGuid from "terriajs-cesium/Source/Core/createGuid"; @@ -30,6 +30,7 @@ class MyLocation extends MapNavigationItemController { constructor(props: PropTypes) { super(); + makeObservable(this); this.terria = props.terria; this._marker = new GeoJsonCatalogItem(createGuid(), props.terria); this.zoomToMyLocation = this.zoomToMyLocation.bind(this); diff --git a/lib/ReactViews/Map/Navigation/Items/ToggleSplitterTool.ts b/lib/ReactViews/Map/Navigation/Items/ToggleSplitterTool.ts index 0a916eab2ee..1cea3adf8df 100644 --- a/lib/ReactViews/Map/Navigation/Items/ToggleSplitterTool.ts +++ b/lib/ReactViews/Map/Navigation/Items/ToggleSplitterTool.ts @@ -1,4 +1,4 @@ -import { action, computed } from "mobx"; +import { action, computed, makeObservable } from "mobx"; import ViewerMode from "../../../../Models/ViewerMode"; import ViewState from "../../../../ReactViewModels/ViewState"; import Icon from "../../../../Styled/Icon"; @@ -9,6 +9,7 @@ export class ToggleSplitterController extends MapNavigationItemController { constructor(private viewState: ViewState) { super(); + makeObservable(this); } get glyph(): any { diff --git a/lib/ReactViews/Map/Navigation/MapNavigation.tsx b/lib/ReactViews/Map/Navigation/MapNavigation.tsx index 623411b4086..9c94f9c961a 100644 --- a/lib/ReactViews/Map/Navigation/MapNavigation.tsx +++ b/lib/ReactViews/Map/Navigation/MapNavigation.tsx @@ -6,7 +6,8 @@ import { IReactionDisposer, observable, reaction, - runInAction + runInAction, + makeObservable, } from "mobx"; import { observer } from "mobx-react"; import React from "react"; @@ -101,6 +102,7 @@ class MapNavigation extends React.Component { constructor(props: PropTypes) { super(props); + makeObservable(this); registerMapNavigations(props.viewState); this.viewState = props.viewState; this.model = props.viewState.terria.mapNavigationModel; diff --git a/lib/ReactViews/Map/Panels/SettingPanel.tsx b/lib/ReactViews/Map/Panels/SettingPanel.tsx index 8ed5d82d85c..e71ddfb4961 100644 --- a/lib/ReactViews/Map/Panels/SettingPanel.tsx +++ b/lib/ReactViews/Map/Panels/SettingPanel.tsx @@ -1,5 +1,5 @@ import { TFunction } from "i18next"; -import { action, computed, observable, runInAction } from "mobx"; +import { action, computed, observable, runInAction, makeObservable } from "mobx"; import { observer } from "mobx-react"; import Slider from "rc-slider"; import React, { ChangeEvent, ComponentProps, MouseEvent } from "react"; @@ -46,6 +46,7 @@ class SettingPanel extends React.Component { */ constructor(props: PropTypes) { super(props); + makeObservable(this); } @observable _hoverBaseMap = null; diff --git a/lib/ReactViews/Notification/MapInteractionWindow.tsx b/lib/ReactViews/Notification/MapInteractionWindow.tsx index cfa2b572834..e001ef86d3d 100644 --- a/lib/ReactViews/Notification/MapInteractionWindow.tsx +++ b/lib/ReactViews/Notification/MapInteractionWindow.tsx @@ -1,7 +1,7 @@ "use strict"; import classNames from "classnames"; -import { Lambda, observable, reaction } from "mobx"; +import { Lambda, observable, reaction, makeObservable } from "mobx"; import { observer } from "mobx-react"; import PropTypes from "prop-types"; import React from "react"; @@ -40,6 +40,15 @@ class MapInteractionWindow extends React.Component<{ @observable currentInteractionMode?: MapInteractionMode; + constructor( + props: { + viewState: ViewState; + } + ) { + super(props); + makeObservable(this); + } + componentWillUnmount() { // this.removeContextItem(); if (typeof this.currentInteractionMode?.onEnable === "function") { diff --git a/lib/ReactViews/Preview/DataPreviewMap.jsx b/lib/ReactViews/Preview/DataPreviewMap.jsx index 0fcde317353..65c0103ac7c 100644 --- a/lib/ReactViews/Preview/DataPreviewMap.jsx +++ b/lib/ReactViews/Preview/DataPreviewMap.jsx @@ -1,7 +1,6 @@ -"use strict"; - +"use strict";; import classNames from "classnames"; -import { action, autorun, computed, observable, runInAction } from "mobx"; +import { action, autorun, computed, observable, runInAction, makeObservable } from "mobx"; import { observer } from "mobx-react"; import PropTypes from "prop-types"; import React from "react"; @@ -20,6 +19,11 @@ import Styles from "./data-preview-map.scss"; class AdaptForPreviewMap extends MappableMixin(CreateModel(MappableTraits)) { previewed; + constructor(...args) { + super(...args); + makeObservable(this); + } + async forceLoadMapItems() {} // Make all imagery 0 or 100% opacity @@ -91,6 +95,8 @@ class DataPreviewMap extends React.Component { constructor(props) { super(props); + makeObservable(this); + /** * @param {HTMLElement | null} container */ diff --git a/lib/ReactViews/Story/StoryBuilder.tsx b/lib/ReactViews/Story/StoryBuilder.tsx index 60bef61c5a1..4797adccf6e 100644 --- a/lib/ReactViews/Story/StoryBuilder.tsx +++ b/lib/ReactViews/Story/StoryBuilder.tsx @@ -1,4 +1,4 @@ -import { action, toJS } from "mobx"; +import { action, toJS, makeObservable } from "mobx"; import { observer } from "mobx-react"; import React from "react"; import Sortable from "react-anything-sortable"; @@ -74,6 +74,7 @@ class StoryBuilder extends React.Component< props: IProps & MeasureElementProps & WithTranslation & WithViewState ) { super(props); + makeObservable(this); this.state = { editingMode: false, currentStory: undefined, diff --git a/lib/ReactViews/Tools/DiffTool/DatePicker.tsx b/lib/ReactViews/Tools/DiffTool/DatePicker.tsx index 558888f4dd1..af5934d106b 100644 --- a/lib/ReactViews/Tools/DiffTool/DatePicker.tsx +++ b/lib/ReactViews/Tools/DiffTool/DatePicker.tsx @@ -1,4 +1,4 @@ -import { action, computed, observable } from "mobx"; +import { action, computed, observable, makeObservable } from "mobx"; import { observer } from "mobx-react"; import React from "react"; import { WithTranslation, withTranslation } from "react-i18next"; @@ -26,6 +26,11 @@ interface PropsType extends WithTranslation { class DatePicker extends React.Component { @observable private isOpen = false; + constructor(props: PropsType) { + super(props); + makeObservable(this); + } + @computed get currentDate(): Date | undefined { const date = this.props.item.currentDiscreteJulianDate; diff --git a/lib/ReactViews/Tools/DiffTool/DiffTool.tsx b/lib/ReactViews/Tools/DiffTool/DiffTool.tsx index 39840ce103b..c92e619b864 100644 --- a/lib/ReactViews/Tools/DiffTool/DiffTool.tsx +++ b/lib/ReactViews/Tools/DiffTool/DiffTool.tsx @@ -1,6 +1,6 @@ import hoistStatics from "hoist-non-react-statics"; import { TFunction } from "i18next"; -import { action, computed, observable, reaction, runInAction } from "mobx"; +import { action, computed, observable, reaction, runInAction, makeObservable } from "mobx"; import { observer } from "mobx-react"; import { IDisposer } from "mobx-utils"; import React, { useState } from "react"; @@ -67,6 +67,11 @@ class DiffTool extends React.Component { private splitterItemsDisposer?: IDisposer; private originalSettings: any; + constructor(props: PropsType) { + super(props); + makeObservable(this); + } + @computed get sourceItem(): DiffableItem { return this.userSelectedSourceItem || this.props.sourceItem; @@ -189,6 +194,7 @@ class Main extends React.Component { constructor(props: MainPropsType) { super(props); + makeObservable(this); } @computed diff --git a/lib/ReactViews/Tools/DiffTool/LocationPicker.tsx b/lib/ReactViews/Tools/DiffTool/LocationPicker.tsx index 260758446d5..edf91548683 100644 --- a/lib/ReactViews/Tools/DiffTool/LocationPicker.tsx +++ b/lib/ReactViews/Tools/DiffTool/LocationPicker.tsx @@ -1,4 +1,4 @@ -import { action, observable, reaction } from "mobx"; +import { action, observable, reaction, makeObservable } from "mobx"; import { observer } from "mobx-react"; import React from "react"; import Cartesian3 from "terriajs-cesium/Source/Core/Cartesian3"; @@ -27,6 +27,11 @@ export default class LocationPicker extends React.Component { @observable private currentPick?: PickedFeatures; @observable private pickDisposer?: () => void; + constructor(props: PropsType) { + super(props); + makeObservable(this); + } + @action setupPicker() { const { terria, location, onPicking, onPicked } = this.props; diff --git a/lib/ReactViews/Tools/PedestrianMode/MovementsController.ts b/lib/ReactViews/Tools/PedestrianMode/MovementsController.ts index 11512e1987a..3d771321d69 100644 --- a/lib/ReactViews/Tools/PedestrianMode/MovementsController.ts +++ b/lib/ReactViews/Tools/PedestrianMode/MovementsController.ts @@ -1,4 +1,4 @@ -import { action } from "mobx"; +import { action, makeObservable } from "mobx"; import Cartesian2 from "terriajs-cesium/Source/Core/Cartesian2"; import Cartesian3 from "terriajs-cesium/Source/Core/Cartesian3"; import Cartographic from "terriajs-cesium/Source/Core/Cartographic"; @@ -64,6 +64,7 @@ export default class MovementsController { readonly pedestrianHeight: number, readonly maxVerticalLookAngle: number ) { + makeObservable(this); this.currentSurfaceHeightEstimate = this.camera.positionCartographic.height; this.updateSurfaceHeightEstimate(); } diff --git a/lib/ReactViews/Tools/Tool.tsx b/lib/ReactViews/Tools/Tool.tsx index b7f65f90f78..62bb2ba6824 100644 --- a/lib/ReactViews/Tools/Tool.tsx +++ b/lib/ReactViews/Tools/Tool.tsx @@ -1,5 +1,5 @@ import i18next, { WithT } from "i18next"; -import { computed } from "mobx"; +import { computed, makeObservable } from "mobx"; import React, { Suspense, useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; import TerriaError from "../../Core/TerriaError"; @@ -66,6 +66,7 @@ interface ToolButtonProps extends ToolProps { export class ToolButtonController extends MapNavigationItemController { constructor(private props: ToolButtonProps) { super(); + makeObservable(this); } get glyph() { return this.props.icon; diff --git a/lib/ReactViews/Workbench/Controls/ViewingControls.tsx b/lib/ReactViews/Workbench/Controls/ViewingControls.tsx index 22d778f02a2..c89e976e08f 100644 --- a/lib/ReactViews/Workbench/Controls/ViewingControls.tsx +++ b/lib/ReactViews/Workbench/Controls/ViewingControls.tsx @@ -1,5 +1,5 @@ import { sortBy, uniqBy } from "lodash"; -import { action, computed, runInAction } from "mobx"; +import { action, computed, runInAction, makeObservable } from "mobx"; import { observer } from "mobx-react"; import React from "react"; import { withTranslation, WithTranslation } from "react-i18next"; @@ -105,6 +105,8 @@ class ViewingControls extends React.Component< // Required step: always call the parent class' constructor super(props); + makeObservable(this); + // Set the state directly. Use props if necessary. this.state = { isMapZoomingToCatalogItem: false diff --git a/lib/ReactViews/Workbench/Workbench.tsx b/lib/ReactViews/Workbench/Workbench.tsx index 71af56f75e9..ed9c55291f8 100644 --- a/lib/ReactViews/Workbench/Workbench.tsx +++ b/lib/ReactViews/Workbench/Workbench.tsx @@ -1,5 +1,5 @@ import { TFunction } from "i18next"; -import { action, runInAction } from "mobx"; +import { action, runInAction, makeObservable } from "mobx"; import { observer } from "mobx-react"; import React from "react"; import { withTranslation, WithTranslation } from "react-i18next"; @@ -25,6 +25,11 @@ interface IProps extends WithTranslation { @observer class Workbench extends React.Component { + constructor(props: IProps) { + super(props); + makeObservable(this); + } + @action.bound collapseAll() { runInAction(() => { diff --git a/lib/ReactViews/Workbench/WorkbenchItem.tsx b/lib/ReactViews/Workbench/WorkbenchItem.tsx index 3da611b2ce1..d55b4762764 100644 --- a/lib/ReactViews/Workbench/WorkbenchItem.tsx +++ b/lib/ReactViews/Workbench/WorkbenchItem.tsx @@ -1,5 +1,5 @@ import { TFunction } from "i18next"; -import { action, computed } from "mobx"; +import { action, computed, makeObservable } from "mobx"; import { observer } from "mobx-react"; import React from "react"; //@ts-ignore @@ -43,6 +43,7 @@ class WorkbenchItemRaw extends React.Component { static displayName = "WorkbenchItem"; constructor(props: IProps) { super(props); + makeObservable(this); } @action.bound diff --git a/lib/ReactViews/Workbench/WorkbenchList.tsx b/lib/ReactViews/Workbench/WorkbenchList.tsx index 94230baa7c3..0845713f241 100644 --- a/lib/ReactViews/Workbench/WorkbenchList.tsx +++ b/lib/ReactViews/Workbench/WorkbenchList.tsx @@ -1,5 +1,5 @@ import "!!style-loader!css-loader?sourceMap!./sortable.css"; -import { action } from "mobx"; +import { action, makeObservable } from "mobx"; import { observer } from "mobx-react"; import React from "react"; //@ts-ignore @@ -27,6 +27,11 @@ interface IProps { @observer class WorkbenchList extends React.Component { + constructor(props: IProps) { + super(props); + makeObservable(this); + } + @action.bound onSort( sortedArray: any, diff --git a/lib/Table/ColorStyleLegend.ts b/lib/Table/ColorStyleLegend.ts index 0bbf5537ad3..e3017d1bdb2 100644 --- a/lib/Table/ColorStyleLegend.ts +++ b/lib/Table/ColorStyleLegend.ts @@ -1,5 +1,5 @@ import i18next from "i18next"; -import { computed } from "mobx"; +import { computed, makeObservable } from "mobx"; import isDefined from "../Core/isDefined"; import { JsonObject } from "../Core/Json"; import ConstantColorMap from "../Map/ColorMap/ConstantColorMap"; @@ -27,6 +27,7 @@ export class ColorStyleLegend extends LoadableStratum(LegendTraits) { readonly legendItemOverrides: Partial = {} ) { super(); + makeObservable(this); } duplicateLoadableStratum(newModel: BaseModel): this { diff --git a/lib/Table/MergedStyleMapLegend.ts b/lib/Table/MergedStyleMapLegend.ts index acd5a8278b1..271be0c3509 100644 --- a/lib/Table/MergedStyleMapLegend.ts +++ b/lib/Table/MergedStyleMapLegend.ts @@ -1,4 +1,4 @@ -import { computed } from "mobx"; +import { computed, makeObservable } from "mobx"; import isDefined from "../Core/isDefined"; import createStratumInstance from "../Models/Definition/createStratumInstance"; import LoadableStratum from "../Models/Definition/LoadableStratum"; @@ -15,6 +15,7 @@ export class MergedStyleMapLegend extends LoadableStratum(LegendTraits) { readonly legendItemOverrides: Partial = {} ) { super(); + makeObservable(this); } duplicateLoadableStratum(newModel: BaseModel): this { diff --git a/lib/Table/StyleMapLegend.ts b/lib/Table/StyleMapLegend.ts index 1545b3ded02..5d4358de7bf 100644 --- a/lib/Table/StyleMapLegend.ts +++ b/lib/Table/StyleMapLegend.ts @@ -1,4 +1,4 @@ -import { computed } from "mobx"; +import { computed, makeObservable } from "mobx"; import isDefined from "../Core/isDefined"; import { JsonObject } from "../Core/Json"; import TableMixin from "../ModelMixins/TableMixin"; @@ -25,6 +25,7 @@ export class StyleMapLegend< readonly legendItemOverrides: Partial = {} ) { super(); + makeObservable(this); } duplicateLoadableStratum(newModel: BaseModel): this { diff --git a/lib/Table/TableAutomaticStylesStratum.ts b/lib/Table/TableAutomaticStylesStratum.ts index 389c3bc920b..0e111331f89 100644 --- a/lib/Table/TableAutomaticStylesStratum.ts +++ b/lib/Table/TableAutomaticStylesStratum.ts @@ -1,6 +1,6 @@ import i18next from "i18next"; import { uniq } from "lodash-es"; -import { computed } from "mobx"; +import { computed, makeObservable } from "mobx"; import filterOutUndefined from "../Core/filterOutUndefined"; import isDefined from "../Core/isDefined"; import TableMixin from "../ModelMixins/TableMixin"; @@ -30,6 +30,7 @@ export default class TableAutomaticStylesStratum extends LoadableStratum( static stratumName = "automaticTableStyles"; constructor(readonly catalogItem: TableCatalogItem) { super(); + makeObservable(this); } duplicateLoadableStratum(newModel: BaseModel): this { diff --git a/lib/Table/TableColorMap.ts b/lib/Table/TableColorMap.ts index f510c534218..28786d479c8 100644 --- a/lib/Table/TableColorMap.ts +++ b/lib/Table/TableColorMap.ts @@ -1,5 +1,5 @@ import * as d3Scale from "d3-scale-chromatic"; -import { computed } from "mobx"; +import { computed, makeObservable } from "mobx"; import Color from "terriajs-cesium/Source/Core/Color"; import createColorForIdTransformer from "../Core/createColorForIdTransformer"; import filterOutUndefined from "../Core/filterOutUndefined"; @@ -103,7 +103,9 @@ export default class TableColorMap { readonly title: string | undefined, readonly colorColumn: TableColumn | undefined, readonly colorTraits: Model - ) {} + ) { + makeObservable(this); + } @computed get type(): StyleMapType { return this.colorMap instanceof DiscreteColorMap diff --git a/lib/Table/TableColumn.ts b/lib/Table/TableColumn.ts index a7f2a68e148..56072eedd70 100644 --- a/lib/Table/TableColumn.ts +++ b/lib/Table/TableColumn.ts @@ -1,6 +1,6 @@ import countBy from "lodash-es/countBy"; import Mexp from "math-expression-evaluator"; -import { computed } from "mobx"; +import { computed, makeObservable } from "mobx"; import JulianDate from "terriajs-cesium/Source/Core/JulianDate"; import filterOutUndefined from "../Core/filterOutUndefined"; import isDefined from "../Core/isDefined"; @@ -81,6 +81,7 @@ export default class TableColumn { readonly tableModel: TableMixin.Instance; constructor(tableModel: TableMixin.Instance, columnNumber: number) { + makeObservable(this); this.columnNumber = columnNumber; this.tableModel = tableModel; } @@ -604,20 +605,18 @@ export default class TableColumn { @computed get title(): string { - return ( - this.tableModel.columnTitles[this.columnNumber] ?? - this.traits.title ?? - // If no title set, use `name` and: - // - un-camel case - // - remove underscores - // - capitalise - this.name - .replace(/[A-Z][a-z]/g, (letter) => ` ${letter.toLowerCase()}`) - .replace(/_/g, " ") - .trim() - .toLowerCase() - .replace(/(^\w|\s\w)/g, (m) => m.toUpperCase()) - ); + return this.tableModel.columnTitles[this.columnNumber] ?? + this.traits.title ?? + // If no title set, use `name` and: + // - un-camel case + // - remove underscores + // - capitalise + this.name + .replace(/[A-Z][a-z]/g, (letter) => ` ${letter.toLowerCase()}`) + .replace(/_/g, " ") + .trim() + .toLowerCase() + .replace(/(^\w|\s\w)/g, (m) => m.toUpperCase()); } @computed diff --git a/lib/Table/TableFeatureInfoStratum.ts b/lib/Table/TableFeatureInfoStratum.ts index 339189e52ae..e5d178f4434 100644 --- a/lib/Table/TableFeatureInfoStratum.ts +++ b/lib/Table/TableFeatureInfoStratum.ts @@ -2,7 +2,7 @@ import TableMixin from "../ModelMixins/TableMixin"; import LoadableStratum from "../Models/Definition/LoadableStratum"; import { BaseModel } from "../Models/Definition/Model"; import TableTraits from "../Traits/TraitsClasses/Table/TableTraits"; -import { computed } from "mobx"; +import { computed, makeObservable } from "mobx"; import createStratumInstance from "../Models/Definition/createStratumInstance"; import { FeatureInfoTemplateTraits } from "../Traits/TraitsClasses/FeatureInfoTraits"; import StratumOrder from "../Models/Definition/StratumOrder"; @@ -13,6 +13,7 @@ export default class TableFeatureInfoStratum extends LoadableStratum( static stratumName = "tableFeatureInfo"; constructor(readonly catalogItem: TableMixin.Instance) { super(); + makeObservable(this); } static load(item: TableMixin.Instance) { diff --git a/lib/Table/TableLegendStratum.ts b/lib/Table/TableLegendStratum.ts index 8e99fdb6ccf..caf04c6a4f9 100644 --- a/lib/Table/TableLegendStratum.ts +++ b/lib/Table/TableLegendStratum.ts @@ -1,5 +1,5 @@ import { uniq } from "lodash-es"; -import { computed } from "mobx"; +import { computed, makeObservable } from "mobx"; import filterOutUndefined from "../Core/filterOutUndefined"; import ConstantColorMap from "../Map/ColorMap/ConstantColorMap"; import { isMakiIcon } from "../Map/Icons/Maki/MakiIcons"; @@ -26,6 +26,7 @@ export class TableAutomaticLegendStratum extends LoadableStratum( static stratumName = "table-legend"; constructor(private readonly _item: TableMixin.Instance) { super(); + makeObservable(this); } duplicateLoadableStratum(newModel: BaseModel): this { diff --git a/lib/Table/TableStyle.ts b/lib/Table/TableStyle.ts index 202b681b854..e6d26a1b0e2 100644 --- a/lib/Table/TableStyle.ts +++ b/lib/Table/TableStyle.ts @@ -1,6 +1,6 @@ import { BBox } from "@turf/helpers"; import groupBy from "lodash-es/groupBy"; -import { computed } from "mobx"; +import { computed, makeObservable } from "mobx"; import binarySearch from "terriajs-cesium/Source/Core/binarySearch"; import JulianDate from "terriajs-cesium/Source/Core/JulianDate"; import TimeInterval from "terriajs-cesium/Source/Core/TimeInterval"; @@ -45,7 +45,9 @@ export default class TableStyle { constructor( readonly tableModel: TableMixin.Instance, readonly styleNumber?: number | undefined - ) {} + ) { + makeObservable(this); + } /** Is style ready to be used. * This will be false if any of dependent columns are not ready diff --git a/lib/Table/TableStyleMap.ts b/lib/Table/TableStyleMap.ts index 3ce0d8c7d85..67c66793d08 100644 --- a/lib/Table/TableStyleMap.ts +++ b/lib/Table/TableStyleMap.ts @@ -1,4 +1,4 @@ -import { computed } from "mobx"; +import { computed, makeObservable } from "mobx"; import { PickProperties } from "ts-essentials"; import { NotUndefined } from "../Core/TypeModifiers"; import TableMixin from "../ModelMixins/TableMixin"; @@ -53,7 +53,9 @@ export default class TableStyleMap { readonly key: NotUndefined< keyof PickProperties> > - ) {} + ) { + makeObservable(this); + } /** Get traits for TableStyleMapSymbolTraits */ @computed get commonTraits() { diff --git a/lib/Traits/ArrayNestedStrataMap.ts b/lib/Traits/ArrayNestedStrataMap.ts index 6bde7aa79fd..2c4e3c612f2 100644 --- a/lib/Traits/ArrayNestedStrataMap.ts +++ b/lib/Traits/ArrayNestedStrataMap.ts @@ -1,4 +1,4 @@ -import { computed } from "mobx"; +import { computed, makeObservable } from "mobx"; import createStratumInstance from "../Models/Definition/createStratumInstance"; import StratumFromTraits from "../Models/Definition/StratumFromTraits"; import ModelTraits from "./ModelTraits"; @@ -19,7 +19,9 @@ export default class ArrayNestedStrataMap readonly objectIdProperty: string | number | symbol, readonly objectId: string, readonly merge: boolean - ) {} + ) { + makeObservable(this); + } clear(): void { this.parentModel.strata.forEach((value: any, key: string) => { diff --git a/lib/Traits/TraitsClasses/CatalogMemberTraits.ts b/lib/Traits/TraitsClasses/CatalogMemberTraits.ts index 12aa416d709..7528830706c 100644 --- a/lib/Traits/TraitsClasses/CatalogMemberTraits.ts +++ b/lib/Traits/TraitsClasses/CatalogMemberTraits.ts @@ -237,7 +237,7 @@ class CatalogMemberTraits extends ModelTraits { name: "Disable about data", description: "Disables the 'About Data' button in the workbench." }) - disableAboutData: boolean = false; + disableAboutData?: boolean; } export default CatalogMemberTraits; diff --git a/lib/Traits/TraitsClasses/ResultPendingCatalogItemTraits.ts b/lib/Traits/TraitsClasses/ResultPendingCatalogItemTraits.ts index 80bf63b83b0..0bbd85ae98f 100644 --- a/lib/Traits/TraitsClasses/ResultPendingCatalogItemTraits.ts +++ b/lib/Traits/TraitsClasses/ResultPendingCatalogItemTraits.ts @@ -1,6 +1,10 @@ import mixTraits from "../mixTraits"; import CatalogMemberTraits from "./CatalogMemberTraits"; -export default class ResultPendingCatalogItemTraits extends mixTraits( - CatalogMemberTraits -) {} +interface ResultPendingCatalogItemTraits { + disableAboutData: boolean; +} + +class ResultPendingCatalogItemTraits extends mixTraits(CatalogMemberTraits) {} + +export default ResultPendingCatalogItemTraits; diff --git a/lib/Traits/TraitsClasses/UrlTraits.ts b/lib/Traits/TraitsClasses/UrlTraits.ts index b2d07468825..d831952d9de 100644 --- a/lib/Traits/TraitsClasses/UrlTraits.ts +++ b/lib/Traits/TraitsClasses/UrlTraits.ts @@ -6,6 +6,7 @@ interface UrlTraits { // without generating TS2611 type error. url?: string; cacheDuration?: string; + forceProxy?: boolean; } class UrlTraits extends ModelTraits { @@ -21,7 +22,7 @@ class UrlTraits extends ModelTraits { name: "Force proxy", description: "Force the default proxy to be used for all network requests." }) - forceProxy = false; + forceProxy?: boolean; @primitiveTrait({ type: "string", diff --git a/lib/ViewModels/CompositeBar/CompositeBarItemController.ts b/lib/ViewModels/CompositeBar/CompositeBarItemController.ts index e9ebec89d13..eafd147f1cd 100644 --- a/lib/ViewModels/CompositeBar/CompositeBarItemController.ts +++ b/lib/ViewModels/CompositeBar/CompositeBarItemController.ts @@ -1,6 +1,6 @@ -import { computed, observable, action } from "mobx"; -import ViewerMode from "../../Models/ViewerMode"; +import { makeObservable, observable, runInAction } from "mobx"; import React from "react"; +import ViewerMode from "../../Models/ViewerMode"; export interface ICompositeBarItemController { readonly id: string; @@ -20,6 +20,10 @@ export abstract class CompositeBarItemController static id: string; itemRef: React.RefObject = React.createRef(); + constructor() { + makeObservable(this); + } + get id() { return CompositeBarItemController.id; } @@ -34,7 +38,6 @@ export abstract class CompositeBarItemController /** * Gets the {@link this._disabled} */ - @computed get disabled(): boolean { return this._disabled; } @@ -57,7 +60,6 @@ export abstract class CompositeBarItemController /** * Gets the {@this._collapsed} */ - @computed get collapsed(): boolean { return this._collapsed; } @@ -79,7 +81,6 @@ export abstract class CompositeBarItemController /** * Gets the {@link this._active} */ - @computed get active(): boolean { return !this.disabled && this._active; } @@ -94,7 +95,6 @@ export abstract class CompositeBarItemController /** * Gets the {@link this._pinned} */ - @computed get pinned() { return this._pinned; } @@ -116,14 +116,14 @@ export abstract class CompositeBarItemController /** * Gets the {@link this._visible} */ - @computed get visible(): boolean { return this._visible; } - @action setVisible(v: boolean) { - this._visible = v; + runInAction(() => { + this._visible = v; + }); } /** diff --git a/lib/ViewModels/CompositeBar/CompositeBarModel.ts b/lib/ViewModels/CompositeBar/CompositeBarModel.ts index 93aa969f5c7..3c90680e4a3 100644 --- a/lib/ViewModels/CompositeBar/CompositeBarModel.ts +++ b/lib/ViewModels/CompositeBar/CompositeBarModel.ts @@ -1,4 +1,4 @@ -import { action, computed, observable } from "mobx"; +import { action, computed, observable, makeObservable } from "mobx"; import isDefined from "../../Core/isDefined"; import { CompositeBarItemController } from "./CompositeBarItemController"; @@ -39,6 +39,7 @@ export abstract class CompositeBarModel< items?: CompositeBarItem[], options?: ICompositeBarOptions ) { + makeObservable(this); if (options) { this.options = options; } diff --git a/lib/ViewModels/MapNavigation/MapNavigationItemController.ts b/lib/ViewModels/MapNavigation/MapNavigationItemController.ts index e7362ddb53a..02603a56f05 100644 --- a/lib/ViewModels/MapNavigation/MapNavigationItemController.ts +++ b/lib/ViewModels/MapNavigation/MapNavigationItemController.ts @@ -1,4 +1,4 @@ -import { action } from "mobx"; +import { action, makeObservable, runInAction } from "mobx"; import ViewerMode from "../../Models/ViewerMode"; import { CompositeBarItemController, @@ -12,22 +12,31 @@ export interface IMapNavigationItemController } export default abstract class MapNavigationItemController extends CompositeBarItemController { + constructor() { + // TODO: [mobx-undecorate] verify the constructor arguments and the arguments of this automatically generated super call + super(); + + makeObservable(this); + } + /** * Set this item to active state. If used it's recommended to override this method and a proper logic * for activating this item, so it's easier to programmatically control the item from other places. */ - @action activate() { - this._active = true; + runInAction(() => { + this._active = true; + }); } /** * Set this item to inactive state. If used it's recommended to override this method and a proper logic * for deactivating this item, so it's easier to programmatically control the item from other places. */ - @action deactivate() { - this._active = false; + runInAction(() => { + this._active = false; + }); } get width(): number | undefined { @@ -73,6 +82,7 @@ interface IOptions { export class GenericMapNavigationItemController extends MapNavigationItemController { constructor(private options: IOptions) { super(); + makeObservable(this); } get glyph(): { id: string } { diff --git a/lib/ViewModels/MapNavigation/MapNavigationModel.ts b/lib/ViewModels/MapNavigation/MapNavigationModel.ts index d7c194174ef..bbbb71e1652 100644 --- a/lib/ViewModels/MapNavigation/MapNavigationModel.ts +++ b/lib/ViewModels/MapNavigation/MapNavigationModel.ts @@ -1,4 +1,4 @@ -import { action } from "mobx"; +import { action, makeObservable } from "mobx"; import { ReactNode } from "react"; import isDefined from "../../Core/isDefined"; import Terria from "../../Models/Terria"; @@ -26,6 +26,7 @@ export default class MapNavigationModel extends CompositeBarModel ) { super(); + makeObservable(this); } get glyph(): { id: string } { diff --git a/lib/ViewModels/TerriaViewer.ts b/lib/ViewModels/TerriaViewer.ts index baf04701d29..797d1653090 100644 --- a/lib/ViewModels/TerriaViewer.ts +++ b/lib/ViewModels/TerriaViewer.ts @@ -8,7 +8,8 @@ import { observable, reaction, runInAction, - untracked + untracked, + makeObservable, } from "mobx"; import { fromPromise, FULFILLED } from "mobx-utils"; import CesiumEvent from "terriajs-cesium/Source/Core/Event"; @@ -109,6 +110,7 @@ export default class TerriaViewer { readonly afterViewerChanged = new CesiumEvent(); constructor(terria: Terria, items: IComputedValue) { + makeObservable(this); this.terria = terria; this.items = items; diff --git a/package.json b/package.json index 12867fe9cb2..18fa1d10a63 100644 --- a/package.json +++ b/package.json @@ -128,9 +128,9 @@ "math-expression-evaluator": "^1.3.7", "mini-css-extract-plugin": "^0.5.0", "minisearch": "^3.0.2", - "mobx": "^4.15.4", - "mobx-react": "^6.3.1", - "mobx-utils": "^5.4.1", + "mobx": "^6.7.0", + "mobx-react": "na9da/test-mobx-react", + "mobx-utils": "^6.0.5", "moment": "2.24.0", "ms": "^2.1.3", "mustache": "^2.2.1", From a498e19a61905a3747615329f5ed09148e7547c3 Mon Sep 17 00:00:00 2001 From: Nanda Date: Wed, 25 Jan 2023 16:50:41 +1100 Subject: [PATCH 064/654] Fix specs following mobx6 upgrade. --- lib/ModelMixins/CatalogFunctionJobMixin.ts | 8 ++- .../WebProcessingServiceCatalogFunctionJob.ts | 2 +- lib/ReactViewModels/ViewState.ts | 4 +- lib/ReactViews/Custom/Chart/PointOnMap.tsx | 64 ++++++++++--------- .../HOCs/withControlledVisibility.tsx | 2 +- test/ModelMixins/DiffableMixinSpec.ts | 10 ++- test/ModelMixins/GltfMixinSpec.ts | 9 ++- test/ModelMixins/TimeFilterMixinSpec.ts | 10 ++- .../CatalogItems/GeoJsonCatalogItemSpec.ts | 32 +++++----- ...WebProcessingServiceCatalogFunctionSpec.ts | 2 +- test/Models/Experiment.ts | 2 +- .../ItemSearchProviders/CatalogIndexSpec.ts | 6 +- test/ReactViews/FeatureInfoSectionSpec.tsx | 8 ++- test/SpecMain.ts | 7 +- test/Traits/objectArrayTraitSpec.ts | 2 +- test/Traits/objectTraitSpec.ts | 2 +- 16 files changed, 106 insertions(+), 64 deletions(-) diff --git a/lib/ModelMixins/CatalogFunctionJobMixin.ts b/lib/ModelMixins/CatalogFunctionJobMixin.ts index b4f8e616a70..f338ad26464 100644 --- a/lib/ModelMixins/CatalogFunctionJobMixin.ts +++ b/lib/ModelMixins/CatalogFunctionJobMixin.ts @@ -1,4 +1,10 @@ -import { action, computed, observable, runInAction, makeObservable } from "mobx"; +import { + action, + computed, + observable, + runInAction, + makeObservable +} from "mobx"; import Constructor from "../Core/Constructor"; import filterOutUndefined from "../Core/filterOutUndefined"; import isDefined from "../Core/isDefined"; diff --git a/lib/Models/Catalog/Ows/WebProcessingServiceCatalogFunctionJob.ts b/lib/Models/Catalog/Ows/WebProcessingServiceCatalogFunctionJob.ts index 959fb84cf5a..9a6c8cd92a9 100644 --- a/lib/Models/Catalog/Ows/WebProcessingServiceCatalogFunctionJob.ts +++ b/lib/Models/Catalog/Ows/WebProcessingServiceCatalogFunctionJob.ts @@ -357,7 +357,7 @@ export default class WebProcessingServiceCatalogFunctionJob extends XmlRequestMi // Create geojson catalog item for input features const geojsonFeatures = runInAction(() => this.geojsonFeatures); - if (isJsonObject(geojsonFeatures, false)) { + if (Array.isArray(geojsonFeatures) || isObservableArray(geojsonFeatures)) { runInAction(() => { this.geoJsonItem = new GeoJsonCatalogItem(createGuid(), this.terria); updateModelFromJson(this.geoJsonItem, CommonStrata.user, { diff --git a/lib/ReactViewModels/ViewState.ts b/lib/ReactViewModels/ViewState.ts index 67871593c50..caaa9449bcf 100644 --- a/lib/ReactViewModels/ViewState.ts +++ b/lib/ReactViewModels/ViewState.ts @@ -5,7 +5,7 @@ import { observable, reaction, runInAction, - makeObservable, + makeObservable } from "mobx"; import { Ref } from "react"; import defined from "terriajs-cesium/Source/Core/defined"; @@ -245,6 +245,7 @@ export default class ViewState { @observable currentTourIndex: number = -1; @observable showCollapsedNavigation: boolean = false; + @computed get tourPointsWithValidRefs() { // should viewstate.ts reach into document? seems unavoidable if we want // this to be the true source of tourPoints. @@ -252,6 +253,7 @@ export default class ViewState { // properly clean up your refs - so we'll leave that up to the UI to // provide valid refs return this.tourPoints + .slice() .sort((a, b) => { return a.priority - b.priority; }) diff --git a/lib/ReactViews/Custom/Chart/PointOnMap.tsx b/lib/ReactViews/Custom/Chart/PointOnMap.tsx index cfb57dfe459..bffa17bc69f 100644 --- a/lib/ReactViews/Custom/Chart/PointOnMap.tsx +++ b/lib/ReactViews/Custom/Chart/PointOnMap.tsx @@ -1,11 +1,11 @@ -import { action, observable, makeObservable } from "mobx"; +import { makeObservable, observable, runInAction } from "mobx"; import { observer } from "mobx-react"; import React from "react"; import createGuid from "terriajs-cesium/Source/Core/createGuid"; import LatLonHeight from "../../../Core/LatLonHeight"; +import GeoJsonCatalogItem from "../../../Models/Catalog/CatalogItems/GeoJsonCatalogItem"; import CommonStrata from "../../../Models/Definition/CommonStrata"; import createStratumInstance from "../../../Models/Definition/createStratumInstance"; -import GeoJsonCatalogItem from "../../../Models/Catalog/CatalogItems/GeoJsonCatalogItem"; import Terria from "../../../Models/Terria"; import StyleTraits from "../../../Traits/TraitsClasses/StyleTraits"; @@ -25,40 +25,42 @@ export default class PointOnMap extends React.Component { makeObservable(this); } - @action componentDidMount() { - const props = this.props; - const pointItem = new GeoJsonCatalogItem(createGuid(), props.terria); - pointItem.setTrait( - CommonStrata.user, - "style", - createStratumInstance(StyleTraits, { - "stroke-width": 3, - "marker-size": "30", - stroke: "#ffffff", - "marker-color": props.color, - "marker-opacity": 1 - }) - ); - pointItem.setTrait(CommonStrata.user, "geoJsonData", { - type: "Feature", - properties: {}, - geometry: { - type: "Point", - coordinates: [props.point.longitude, props.point.latitude] - } + runInAction(() => { + const props = this.props; + const pointItem = new GeoJsonCatalogItem(createGuid(), props.terria); + pointItem.setTrait( + CommonStrata.user, + "style", + createStratumInstance(StyleTraits, { + "stroke-width": 3, + "marker-size": "30", + stroke: "#ffffff", + "marker-color": props.color, + "marker-opacity": 1 + }) + ); + pointItem.setTrait(CommonStrata.user, "geoJsonData", { + type: "Feature", + properties: {}, + geometry: { + type: "Point", + coordinates: [props.point.longitude, props.point.latitude] + } + }); + props.terria.addModel(pointItem); + props.terria.overlays.add(pointItem); + this.pointItem = pointItem; }); - props.terria.addModel(pointItem); - props.terria.overlays.add(pointItem); - this.pointItem = pointItem; } - @action componentWillUnmount() { - if (this.pointItem) { - this.props.terria.overlays.remove(this.pointItem); - this.props.terria.removeModelReferences(this.pointItem); - } + runInAction(() => { + if (this.pointItem) { + this.props.terria.overlays.remove(this.pointItem); + this.props.terria.removeModelReferences(this.pointItem); + } + }); } render() { diff --git a/lib/ReactViews/HOCs/withControlledVisibility.tsx b/lib/ReactViews/HOCs/withControlledVisibility.tsx index c5359020514..a04b466cd12 100644 --- a/lib/ReactViews/HOCs/withControlledVisibility.tsx +++ b/lib/ReactViews/HOCs/withControlledVisibility.tsx @@ -4,7 +4,7 @@ import PropTypes from "prop-types"; import IElementConfig from "../../Models/IElementConfig"; interface WithControlledVisibilityProps { - elementConfig: IElementConfig | undefined; + elementConfig?: IElementConfig; } /** diff --git a/test/ModelMixins/DiffableMixinSpec.ts b/test/ModelMixins/DiffableMixinSpec.ts index 26b65dc6b9f..15316896d17 100644 --- a/test/ModelMixins/DiffableMixinSpec.ts +++ b/test/ModelMixins/DiffableMixinSpec.ts @@ -1,9 +1,10 @@ -import { action, computed } from "mobx"; +import { action, computed, makeObservable } from "mobx"; import JulianDate from "terriajs-cesium/Source/Core/JulianDate"; import DiffableMixin from "../../lib/ModelMixins/DiffableMixin"; import MappableMixin from "../../lib/ModelMixins/MappableMixin"; import CommonStrata from "../../lib/Models/Definition/CommonStrata"; import CreateModel from "../../lib/Models/Definition/CreateModel"; +import { ModelConstructorParameters } from "../../lib/Models/Definition/Model"; import Terria from "../../lib/Models/Terria"; import mixTraits from "../../lib/Traits/mixTraits"; import CatalogMemberTraits from "../../lib/Traits/TraitsClasses/CatalogMemberTraits"; @@ -44,6 +45,13 @@ class TestDiffableItem extends DiffableMixin( CreateModel(mixTraits(DiffableTraits, CatalogMemberTraits, SplitterTraits)) ) ) { + constructor(...args: ModelConstructorParameters) { + // TODO: [mobx-undecorate] verify the constructor arguments and the arguments of this automatically generated super call + super(...args); + + makeObservable(this); + } + protected async forceLoadMapItems() {} styleSelectableDimensions = []; diff --git a/test/ModelMixins/GltfMixinSpec.ts b/test/ModelMixins/GltfMixinSpec.ts index 424832aeaae..bb9c47c5d99 100644 --- a/test/ModelMixins/GltfMixinSpec.ts +++ b/test/ModelMixins/GltfMixinSpec.ts @@ -1,5 +1,4 @@ -import { action, observable } from "mobx"; -import Cartesian3 from "terriajs-cesium/Source/Core/Cartesian3"; +import { action, makeObservable, observable } from "mobx"; import Cartographic from "terriajs-cesium/Source/Core/Cartographic"; import HeadingPitchRoll from "terriajs-cesium/Source/Core/HeadingPitchRoll"; import JulianDate from "terriajs-cesium/Source/Core/JulianDate"; @@ -7,6 +6,7 @@ import CesiumMath from "terriajs-cesium/Source/Core/Math"; import GltfMixin from "../../lib/ModelMixins/GltfMixin"; import CommonStrata from "../../lib/Models/Definition/CommonStrata"; import CreateModel from "../../lib/Models/Definition/CreateModel"; +import { ModelConstructorParameters } from "../../lib/Models/Definition/Model"; import updateModelFromJson from "../../lib/Models/Definition/updateModelFromJson"; import Terria from "../../lib/Models/Terria"; import GltfTraits from "../../lib/Traits/TraitsClasses/GltfTraits"; @@ -108,4 +108,9 @@ describe("GltfMixin", function () { class TestGltfItem extends GltfMixin(CreateModel(GltfTraits)) { @observable gltfModelUrl: string | undefined = undefined; + + constructor(...args: ModelConstructorParameters) { + super(...args); + makeObservable(this); + } } diff --git a/test/ModelMixins/TimeFilterMixinSpec.ts b/test/ModelMixins/TimeFilterMixinSpec.ts index 527fcb758b5..61a2e295e31 100644 --- a/test/ModelMixins/TimeFilterMixinSpec.ts +++ b/test/ModelMixins/TimeFilterMixinSpec.ts @@ -1,8 +1,9 @@ -import { action, computed } from "mobx"; +import { action, computed, makeObservable } from "mobx"; import MappableMixin from "../../lib/ModelMixins/MappableMixin"; import TimeFilterMixin from "../../lib/ModelMixins/TimeFilterMixin"; import CommonStrata from "../../lib/Models/Definition/CommonStrata"; import CreateModel from "../../lib/Models/Definition/CreateModel"; +import { ModelConstructorParameters } from "../../lib/Models/Definition/Model"; import Terria from "../../lib/Models/Terria"; import mixTraits from "../../lib/Traits/mixTraits"; import TimeFilterTraits from "../../lib/Traits/TraitsClasses/TimeFilterTraits"; @@ -35,6 +36,13 @@ describe("TimeFilterMixin", function () { class TestTimeFilterableItem extends TimeFilterMixin( MappableMixin(CreateModel(mixTraits(TimeFilterTraits))) ) { + constructor(...args: ModelConstructorParameters) { + // TODO: [mobx-undecorate] verify the constructor arguments and the arguments of this automatically generated super call + super(...args); + + makeObservable(this); + } + protected async forceLoadMapItems(): Promise {} get discreteTimes() { return undefined; diff --git a/test/Models/Catalog/CatalogItems/GeoJsonCatalogItemSpec.ts b/test/Models/Catalog/CatalogItems/GeoJsonCatalogItemSpec.ts index e5191ff59b9..a2c62a71caf 100644 --- a/test/Models/Catalog/CatalogItems/GeoJsonCatalogItemSpec.ts +++ b/test/Models/Catalog/CatalogItems/GeoJsonCatalogItemSpec.ts @@ -865,32 +865,32 @@ describe("GeoJsonCatalogItemSpec", () => { await geojson.loadMapItems(); - expect( - "imageryProvider" in geojson.mapItems[0] && - geojson.mapItems[0].imageryProvider instanceof - ProtomapsImageryProvider - ).toBeTruthy(); + runInAction(() => { + expect( + "imageryProvider" in geojson.mapItems[0] && + geojson.mapItems[0].imageryProvider instanceof + ProtomapsImageryProvider + ).toBeTruthy(); - geojson.setTrait("user", "activeStyle", ""); + geojson.setTrait("user", "activeStyle", ""); - expect(geojson.legends.length).toBe(1); - expect(geojson.legends[0].items.length).toBe(1); - expect(geojson.legends[0].items.map((i) => i.color)).toEqual([ - "rgb(102,194,165)" - ]); + expect(geojson.legends.length).toBe(1); + expect(geojson.legends[0].items.length).toBe(1); + expect(geojson.legends[0].items.map((i) => i.color)).toEqual([ + "rgb(102,194,165)" + ]); - runInAction(() => updateModelFromJson(geojson, CommonStrata.definition, { legends: [ { url: "some-url" } ] - }) - ); + }); - expect(geojson.legends.length).toBe(1); - expect(geojson.legends[0].url).toBe("some-url"); + expect(geojson.legends.length).toBe(1); + expect(geojson.legends[0].url).toBe("some-url"); + }); }); it("correctly builds `Feature` from picked Entity", function () { diff --git a/test/Models/Catalog/Ows/WebProcessingServiceCatalogFunctionSpec.ts b/test/Models/Catalog/Ows/WebProcessingServiceCatalogFunctionSpec.ts index 18a934f3181..060c56614db 100644 --- a/test/Models/Catalog/Ows/WebProcessingServiceCatalogFunctionSpec.ts +++ b/test/Models/Catalog/Ows/WebProcessingServiceCatalogFunctionSpec.ts @@ -1,4 +1,4 @@ -import { configure, reaction, runInAction } from "mobx"; +import { action, configure, reaction, runInAction } from "mobx"; import Cartographic from "terriajs-cesium/Source/Core/Cartographic"; import GeoJsonDataSource from "terriajs-cesium/Source/DataSources/GeoJsonDataSource"; import isDefined from "../../../../lib/Core/isDefined"; diff --git a/test/Models/Experiment.ts b/test/Models/Experiment.ts index 2e8c558d682..0a52cab527e 100644 --- a/test/Models/Experiment.ts +++ b/test/Models/Experiment.ts @@ -7,7 +7,7 @@ import WebMapServiceCatalogGroup from "../../lib/Models/Catalog/Ows/WebMapServic import WebMapServiceCatalogItem from "../../lib/Models/Catalog/Ows/WebMapServiceCatalogItem"; configure({ - enforceActions: true, + enforceActions: "always", computedRequiresReaction: true }); diff --git a/test/Models/ItemSearchProviders/CatalogIndexSpec.ts b/test/Models/ItemSearchProviders/CatalogIndexSpec.ts index 80736bbc4d3..0af89c6733c 100644 --- a/test/Models/ItemSearchProviders/CatalogIndexSpec.ts +++ b/test/Models/ItemSearchProviders/CatalogIndexSpec.ts @@ -235,7 +235,9 @@ describe("CatalogIndex - with shareKeys", function () { }); it("loads shareKeys", async function () { - expect(terria.catalogIndex!.shareKeysMap.toJSON()).toEqual({ + expect( + Object.fromEntries(terria.catalogIndex!.shareKeysMap.toJSON()) + ).toEqual({ "test-nested-dynamic-group-sharekey": "test-nested-dynamic-group", "test-item-3-sharekey": "test-item-3", "Test item without ID-sharekey": @@ -260,7 +262,7 @@ describe("CatalogIndex - with shareKeys", function () { ?.loadReference() )?.logError(); - expect(terria.shareKeysMap.toJSON()).toEqual({ + expect(Object.fromEntries(terria.shareKeysMap.toJSON())).toEqual({ "test-nested-dynamic-group-sharekey": "test-nested-dynamic-group", "test-item-3-sharekey": "test-item-3", "Test item without ID-sharekey": diff --git a/test/ReactViews/FeatureInfoSectionSpec.tsx b/test/ReactViews/FeatureInfoSectionSpec.tsx index 0173f6f871d..7718290f109 100644 --- a/test/ReactViews/FeatureInfoSectionSpec.tsx +++ b/test/ReactViews/FeatureInfoSectionSpec.tsx @@ -1,5 +1,5 @@ import i18next from "i18next"; -import { observable } from "mobx"; +import { observable, makeObservable } from "mobx"; import React from "react"; import { ReactTestRenderer } from "react-test-renderer"; import Cartographic from "terriajs-cesium/Source/Core/Cartographic"; @@ -20,6 +20,7 @@ import CzmlCatalogItem from "../../lib/Models/Catalog/CatalogItems/CzmlCatalogIt import CatalogMemberFactory from "../../lib/Models/Catalog/CatalogMemberFactory"; import CommonStrata from "../../lib/Models/Definition/CommonStrata"; import CreateModel from "../../lib/Models/Definition/CreateModel"; +import { ModelConstructorParameters } from "../../lib/Models/Definition/Model"; import upsertModelFromJson from "../../lib/Models/Definition/upsertModelFromJson"; import TerriaFeature from "../../lib/Models/Feature/Feature"; import Terria from "../../lib/Models/Terria"; @@ -1365,6 +1366,11 @@ class TestModelTraits extends mixTraits( class TestModel extends MappableMixin( DiscretelyTimeVaryingMixin(CatalogMemberMixin(CreateModel(TestModelTraits))) ) { + constructor(...args: ModelConstructorParameters) { + super(...args); + makeObservable(this); + } + get mapItems(): MapItem[] { throw new Error("Method not implemented."); } diff --git a/test/SpecMain.ts b/test/SpecMain.ts index a17b67185d1..91c2a16259b 100644 --- a/test/SpecMain.ts +++ b/test/SpecMain.ts @@ -6,9 +6,12 @@ import i18next from "i18next"; import registerCatalogMembers from "../lib/Models/Catalog/registerCatalogMembers"; configure({ - enforceActions: true, + enforceActions: "always", computedRequiresReaction: true, - computedConfigurable: true // so that we can spy on computed items + // Turn off safeDescriptors required for spying on computed items + // TODO: mobx docs says this should only be enabled when need and not globally, + // see if we can remove this global setting + safeDescriptors: false }); registerCatalogMembers(); diff --git a/test/Traits/objectArrayTraitSpec.ts b/test/Traits/objectArrayTraitSpec.ts index c52df70f6a3..9fb6c59e1b2 100644 --- a/test/Traits/objectArrayTraitSpec.ts +++ b/test/Traits/objectArrayTraitSpec.ts @@ -7,7 +7,7 @@ import primitiveTrait from "../../lib/Traits/Decorators/primitiveTrait"; import ModelTraits from "../../lib/Traits/ModelTraits"; configure({ - enforceActions: true, + enforceActions: "always", computedRequiresReaction: true }); diff --git a/test/Traits/objectTraitSpec.ts b/test/Traits/objectTraitSpec.ts index e24789c8794..fced85d8d4e 100644 --- a/test/Traits/objectTraitSpec.ts +++ b/test/Traits/objectTraitSpec.ts @@ -7,7 +7,7 @@ import Terria from "../../lib/Models/Terria"; import createStratumInstance from "../../lib/Models/Definition/createStratumInstance"; configure({ - enforceActions: true, + enforceActions: "always", computedRequiresReaction: true }); From 038fb7044391ee7c1c3fc075977882b2c9e34134 Mon Sep 17 00:00:00 2001 From: Nanda Date: Fri, 27 Jan 2023 13:48:58 +1100 Subject: [PATCH 065/654] Convert a few create-react-class components to React.Component classes. Note that we are only converting the create-react-class components that are wrapped by a mobx observer. This is so that we can upgrade to mobx6 which no longer supports create-react-class components. --- .../Analytics/GeoJsonParameterEditor.jsx | 209 +++++---- .../Analytics/PolygonParameterEditor.jsx | 85 ++-- .../BottomDock/Timeline/Timeline.jsx | 207 +++++---- lib/ReactViews/DataCatalog/DataCatalog.jsx | 13 +- .../DataCatalog/DataCatalogGroup.jsx | 229 +++++----- .../DataCatalog/DataCatalogMember.jsx | 106 +++-- lib/ReactViews/ExplorerWindow/Tabs.jsx | 311 +++++++------- .../Tabs/MyDataTab/MyDataTab.jsx | 335 ++++++++------- lib/ReactViews/Map/Legend/LocationBar.jsx | 132 +++--- lib/ReactViews/Map/ProgressBar.jsx | 180 ++++---- lib/ReactViews/Map/Splitter.jsx | 397 +++++++++--------- lib/ReactViews/Mobile/MobileMenu.jsx | 312 +++++++------- lib/ReactViews/Mobile/MobileModalWindow.jsx | 25 +- lib/ReactViews/Mobile/MobileSearch.jsx | 25 +- lib/ReactViews/Preview/DataPreview.jsx | 19 +- .../Preview/DataPreviewSections.jsx | 17 +- lib/ReactViews/Preview/Description.jsx | 13 +- lib/ReactViews/Preview/GroupPreview.jsx | 15 +- .../Search/LocationSearchResults.jsx | 275 ++++++------ lib/ReactViews/Search/SearchHeader.jsx | 56 ++- .../Search/SideBarDatasetSearchResults.jsx | 88 ---- lib/ReactViews/Search/SidebarSearch.jsx | 87 ---- lib/ReactViews/SidePanel/FullScreenButton.jsx | 169 ++++---- .../StandardUserInterface/MapColumn.jsx | 298 +++++++------ .../Workbench/Controls/FilterSection.jsx | 17 +- .../SatelliteImageryTimeFilterSection.jsx | 31 +- .../Workbench/Controls/TimerSection.jsx | 229 +++++----- 27 files changed, 1795 insertions(+), 2085 deletions(-) delete mode 100644 lib/ReactViews/Search/SideBarDatasetSearchResults.jsx delete mode 100644 lib/ReactViews/Search/SidebarSearch.jsx diff --git a/lib/ReactViews/Analytics/GeoJsonParameterEditor.jsx b/lib/ReactViews/Analytics/GeoJsonParameterEditor.jsx index c54ca017a60..b04ddc5efa8 100644 --- a/lib/ReactViews/Analytics/GeoJsonParameterEditor.jsx +++ b/lib/ReactViews/Analytics/GeoJsonParameterEditor.jsx @@ -17,127 +17,124 @@ import { getDisplayValue as getExistingPolygonParameterDisplayValue } from "./SelectAPolygonParameterEditor"; import { getDisplayValue as getRegionPickerDisplayValue } from "./RegionPicker"; -import createReactClass from "create-react-class"; import GeoJsonParameter from "../../Models/FunctionParameters/GeoJsonParameter"; import { withTranslation } from "react-i18next"; import { observer } from "mobx-react"; import { runInAction } from "mobx"; import CommonStrata from "../../Models/Definition/CommonStrata"; -const GeoJsonParameterEditor = observer( - createReactClass({ - displayName: "GeoJsonParameterEditor", - propTypes: { - previewed: PropTypes.object, - parameter: PropTypes.object, - viewState: PropTypes.object, - t: PropTypes.func.isRequired - }, +@observer +class GeoJsonParameterEditor extends React.Component { + static propTypes = { + previewed: PropTypes.object, + parameter: PropTypes.object, + viewState: PropTypes.object, + t: PropTypes.func.isRequired + }; - onCleanUp() { - this.props.viewState.openAddData(); - }, + onCleanUp() { + this.props.viewState.openAddData(); + } - selectPointOnMap() { - runInAction(() => { - this.props.parameter.setValue(CommonStrata.user, undefined); - selectPointOnMap( - this.props.previewed.terria, - this.props.viewState, - this.props.parameter, - this.props.t("analytics.selectLocation") - ); - this.props.parameter.subtype = GeoJsonParameter.PointType; - }); - }, + selectPointOnMap() { + runInAction(() => { + this.props.parameter.setValue(CommonStrata.user, undefined); + selectPointOnMap( + this.props.previewed.terria, + this.props.viewState, + this.props.parameter, + this.props.t("analytics.selectLocation") + ); + this.props.parameter.subtype = GeoJsonParameter.PointType; + }); + } - selectPolygonOnMap() { - runInAction(() => { - this.props.parameter.setValue(CommonStrata.user, undefined); - selectPolygonOnMap( - this.props.previewed.terria, - this.props.viewState, - this.props.parameter - ); - this.props.parameter.subtype = GeoJsonParameter.PolygonType; - }); - }, + selectPolygonOnMap() { + runInAction(() => { + this.props.parameter.setValue(CommonStrata.user, undefined); + selectPolygonOnMap( + this.props.previewed.terria, + this.props.viewState, + this.props.parameter + ); + this.props.parameter.subtype = GeoJsonParameter.PolygonType; + }); + } - selectExistingPolygonOnMap() { - runInAction(() => { - this.props.parameter.setValue(CommonStrata.user, undefined); - selectExistingPolygonOnMap( - this.props.previewed.terria, - this.props.viewState, - this.props.parameter - ); - this.props.parameter.subtype = GeoJsonParameter.SelectAPolygonType; - }); - }, + selectExistingPolygonOnMap() { + runInAction(() => { + this.props.parameter.setValue(CommonStrata.user, undefined); + selectExistingPolygonOnMap( + this.props.previewed.terria, + this.props.viewState, + this.props.parameter + ); + this.props.parameter.subtype = GeoJsonParameter.SelectAPolygonType; + }); + } - render() { - const { t } = this.props; - return ( + render() { + const { t } = this.props; + return ( +
    -
    - {t("analytics.selectLocation")} -
    -
    {t("analytics.selectLocation")} +
    +
    + - - -
    - - {t("analytics.point")} + + +
    - ); - } - }) -); + + +
    {t("analytics.nothingSelected")}
    +
    +
    + ); + } +} function getDisplayValue(value, parameter) { if (!defined(parameter.subtype)) { diff --git a/lib/ReactViews/Analytics/PolygonParameterEditor.jsx b/lib/ReactViews/Analytics/PolygonParameterEditor.jsx index a6b200e4c2c..5c3d5875b19 100644 --- a/lib/ReactViews/Analytics/PolygonParameterEditor.jsx +++ b/lib/ReactViews/Analytics/PolygonParameterEditor.jsx @@ -2,8 +2,6 @@ import React from "react"; -import createReactClass from "create-react-class"; - import PropTypes from "prop-types"; import defined from "terriajs-cesium/Source/Core/defined"; @@ -18,51 +16,48 @@ import { observer } from "mobx-react"; import { runInAction } from "mobx"; import CommonStrata from "../../Models/Definition/CommonStrata"; -const PolygonParameterEditor = observer( - createReactClass({ - displayName: "PolygonParameterEditor", - - propTypes: { - previewed: PropTypes.object, - parameter: PropTypes.object, - viewState: PropTypes.object, - t: PropTypes.func.isRequired - }, - - setValueFromText(e) { - PolygonParameterEditor.setValueFromText(e, this.props.parameter); - }, +@observer +class PolygonParameterEditor extends React.Component { + static propTypes = { + previewed: PropTypes.object, + parameter: PropTypes.object, + viewState: PropTypes.object, + t: PropTypes.func.isRequired + }; + + setValueFromText(e) { + PolygonParameterEditor.setValueFromText(e, this.props.parameter); + } - selectPolygonOnMap() { - selectOnMap( - this.props.previewed.terria, - this.props.viewState, - this.props.parameter - ); - }, + selectPolygonOnMap() { + selectOnMap( + this.props.previewed.terria, + this.props.viewState, + this.props.parameter + ); + } - render() { - const { t } = this.props; - return ( -
    - - -
    - ); - } - }) -); + render() { + const { t } = this.props; + return ( +
    + + +
    + ); + } +} /** * Triggered when user types value directly into field. diff --git a/lib/ReactViews/BottomDock/Timeline/Timeline.jsx b/lib/ReactViews/BottomDock/Timeline/Timeline.jsx index f2fe5e90b31..055d49cd60c 100644 --- a/lib/ReactViews/BottomDock/Timeline/Timeline.jsx +++ b/lib/ReactViews/BottomDock/Timeline/Timeline.jsx @@ -1,4 +1,3 @@ -import createReactClass from "create-react-class"; import dateFormat from "dateformat"; import { observer } from "mobx-react"; import PropTypes from "prop-types"; @@ -14,125 +13,121 @@ import DateTimePicker from "./DateTimePicker"; import Styles from "./timeline.scss"; import TimelineControls from "./TimelineControls"; -export const Timeline = observer( - createReactClass({ - displayName: "Timeline", +@observer +export class Timeline extends React.Component { + static propTypes = { + terria: PropTypes.object.isRequired, + locale: PropTypes.object, + t: PropTypes.func.isRequired + }; - propTypes: { - terria: PropTypes.object.isRequired, - locale: PropTypes.object, - t: PropTypes.func.isRequired - }, + constructor(props) { + super(props); + this.state = { + isPickerOpen: false + }; + } - getInitialState() { - return { - isPickerOpen: false - }; - }, + componentDidMount() { + this.props.terria.timelineStack.activate(); + } - componentDidMount() { - this.props.terria.timelineStack.activate(); - }, + componentWillUnmount() { + this.props.terria.timelineStack.deactivate(); + } - componentWillUnmount() { - this.props.terria.timelineStack.deactivate(); - }, + changeDateTime(time) { + this.props.terria.timelineClock.currentTime = JulianDate.fromDate( + new Date(time) + ); + this.props.terria.timelineStack.syncToClock(CommonStrata.user); + this.props.terria.currentViewer.notifyRepaintRequired(); + } - changeDateTime(time) { - this.props.terria.timelineClock.currentTime = JulianDate.fromDate( - new Date(time) - ); - this.props.terria.timelineStack.syncToClock(CommonStrata.user); - this.props.terria.currentViewer.notifyRepaintRequired(); - }, - - onOpenPicker() { - this.setState({ - isPickerOpen: true - }); - }, + onOpenPicker() { + this.setState({ + isPickerOpen: true + }); + } - onClosePicker() { - this.setState({ - isPickerOpen: false - }); - }, + onClosePicker() { + this.setState({ + isPickerOpen: false + }); + } - render() { - const terria = this.props.terria; - const catalogItem = terria.timelineStack.top; - if ( - !defined(catalogItem) || - !defined(catalogItem.currentTimeAsJulianDate) - ) { - return null; - } - const { t } = this.props; + render() { + const terria = this.props.terria; + const catalogItem = terria.timelineStack.top; + if ( + !defined(catalogItem) || + !defined(catalogItem.currentTimeAsJulianDate) + ) { + return null; + } + const { t } = this.props; - const jsDate = JulianDate.toDate(catalogItem.currentTimeAsJulianDate); - const timelineStack = this.props.terria.timelineStack; - let currentTime; - if (defined(timelineStack.top) && defined(timelineStack.top.dateFormat)) { - currentTime = dateFormat( - jsDate, - this.props.terria.timelineStack.top.dateFormat - ); - } else { - currentTime = formatDateTime(jsDate, this.props.locale); - } + const jsDate = JulianDate.toDate(catalogItem.currentTimeAsJulianDate); + const timelineStack = this.props.terria.timelineStack; + let currentTime; + if (defined(timelineStack.top) && defined(timelineStack.top.dateFormat)) { + currentTime = dateFormat( + jsDate, + this.props.terria.timelineStack.top.dateFormat + ); + } else { + currentTime = formatDateTime(jsDate, this.props.locale); + } - const discreteTimes = catalogItem.discreteTimesAsSortedJulianDates; - const objectifiedDates = catalogItem.objectifiedDates; - const currentDiscreteJulianDate = catalogItem.currentDiscreteJulianDate; + const discreteTimes = catalogItem.discreteTimesAsSortedJulianDates; + const objectifiedDates = catalogItem.objectifiedDates; + const currentDiscreteJulianDate = catalogItem.currentDiscreteJulianDate; - return ( -
    + return ( +
    +
    p.theme.dark}; + `} + >
    p.theme.dark}; - `} + className={Styles.textCell} + title={t("dateTime.timeline.textCell")} > -
    -
    - {catalogItem.name} -
    - {currentTime} -
    +
    {catalogItem.name}
    + {currentTime}
    -
    - +
    + + + this.changeDateTime()} + openDirection="up" + isOpen={this.state.isPickerOpen} + onOpen={() => this.onOpenPicker()} + onClose={() => this.onClosePicker()} + dateFormat={catalogItem.dateFormat} /> - - - - -
    + +
    - ); - } - }) -); +
    + ); + } +} export default withControlledVisibility(withTranslation()(Timeline)); diff --git a/lib/ReactViews/DataCatalog/DataCatalog.jsx b/lib/ReactViews/DataCatalog/DataCatalog.jsx index 19fe83f855c..0b6c4138c91 100644 --- a/lib/ReactViews/DataCatalog/DataCatalog.jsx +++ b/lib/ReactViews/DataCatalog/DataCatalog.jsx @@ -1,7 +1,6 @@ import React from "react"; import { observer } from "mobx-react"; -import createReactClass from "create-react-class"; import PropTypes from "prop-types"; import { withTranslation } from "react-i18next"; @@ -14,18 +13,17 @@ import SearchHeader from "../Search/SearchHeader"; import Styles from "./data-catalog.scss"; // Displays the data catalog. -export const DataCatalog = observer( - createReactClass({ - displayName: "DataCatalog", +@observer +export class DataCatalog extends React.Component { - propTypes: { + static propTypes = { terria: PropTypes.object, viewState: PropTypes.object, items: PropTypes.array, onActionButtonClicked: PropTypes.func, removable: PropTypes.bool, t: PropTypes.func.isRequired - }, + } render() { const searchState = this.props.viewState.searchState; @@ -73,7 +71,6 @@ export const DataCatalog = observer( ); } - }) -); +} export default withTranslation()(DataCatalog); diff --git a/lib/ReactViews/DataCatalog/DataCatalogGroup.jsx b/lib/ReactViews/DataCatalog/DataCatalogGroup.jsx index 96505514f4c..62ec7dcd5f2 100644 --- a/lib/ReactViews/DataCatalog/DataCatalogGroup.jsx +++ b/lib/ReactViews/DataCatalog/DataCatalogGroup.jsx @@ -1,4 +1,3 @@ -import createReactClass from "create-react-class"; import { comparer, reaction } from "mobx"; import { observer } from "mobx-react"; import PropTypes from "prop-types"; @@ -10,132 +9,128 @@ import removeUserAddedData from "../../Models/Catalog/removeUserAddedData"; import CatalogGroup from "./CatalogGroup"; import DataCatalogMember from "./DataCatalogMember"; -const DataCatalogGroup = observer( - createReactClass({ - displayName: "DataCatalogGroup", +@observer +class DataCatalogGroup extends React.Component { + static propTypes = { + group: PropTypes.object.isRequired, + viewState: PropTypes.object.isRequired, + /** Overrides whether to get the open state of the group from the group model or manage it internally */ + manageIsOpenLocally: PropTypes.bool, + userData: PropTypes.bool, + onActionButtonClicked: PropTypes.func, + removable: PropTypes.bool, + terria: PropTypes.object, + t: PropTypes.func.isRequired, + isTopLevel: PropTypes.bool + }; - propTypes: { - group: PropTypes.object.isRequired, - viewState: PropTypes.object.isRequired, - /** Overrides whether to get the open state of the group from the group model or manage it internally */ - manageIsOpenLocally: PropTypes.bool, - userData: PropTypes.bool, - onActionButtonClicked: PropTypes.func, - removable: PropTypes.bool, - terria: PropTypes.object, - t: PropTypes.func.isRequired, - isTopLevel: PropTypes.bool - }, + static defaultProps = { + manageIsOpenLocally: false, + userData: false + }; - getDefaultProps() { - return { - manageIsOpenLocally: false, - userData: false - }; - }, + constructor(props) { + super(props); + this.state = { + /** Only used if manageIsOpenLocally === true */ + isOpen: false + }; + } - getInitialState() { - return { - /** Only used if manageIsOpenLocally === true */ - isOpen: false - }; - }, - - isOpen() { - if (this.props.manageIsOpenLocally) { - return this.state.isOpen; - } - return this.props.group.isOpen; - }, + isOpen() { + if (this.props.manageIsOpenLocally) { + return this.state.isOpen; + } + return this.props.group.isOpen; + } - async clickGroup() { - if (this.props.manageIsOpenLocally) { - this.setState({ - isOpen: !this.state.isOpen - }); - } + async clickGroup() { + if (this.props.manageIsOpenLocally) { + this.setState({ + isOpen: !this.state.isOpen + }); + } - ( - await this.props.viewState.viewCatalogMember( - this.props.group, - !this.props.group.isOpen - ) - ).raiseError(this.props.viewState.terria); - }, + ( + await this.props.viewState.viewCatalogMember( + this.props.group, + !this.props.group.isOpen + ) + ).raiseError(this.props.viewState.terria); + } - isSelected() { - return addedByUser(this.props.group) - ? this.props.viewState.userDataPreviewedItem === this.props.group - : this.props.viewState.previewedItem === this.props.group; - }, + isSelected() { + return addedByUser(this.props.group) + ? this.props.viewState.userDataPreviewedItem === this.props.group + : this.props.viewState.previewedItem === this.props.group; + } - getNameOrPrettyUrl() { - // Grab a name via nameInCatalog, if it's a blank string, try and generate one from the url - const group = this.props.group; - const nameInCatalog = group.nameInCatalog || ""; - if (nameInCatalog !== "") { - return nameInCatalog; - } + getNameOrPrettyUrl() { + // Grab a name via nameInCatalog, if it's a blank string, try and generate one from the url + const group = this.props.group; + const nameInCatalog = group.nameInCatalog || ""; + if (nameInCatalog !== "") { + return nameInCatalog; + } - const url = group.url || ""; - // strip protocol - return url.replace(/^https?:\/\//, ""); - }, + const url = group.url || ""; + // strip protocol + return url.replace(/^https?:\/\//, ""); + } - componentDidMount() { - this._cleanupLoadMembersReaction = reaction( - () => [this.props.group, this.isOpen()], - ([group, isOpen]) => { - if (isOpen) { - group.loadMembers(); - } - }, - { equals: comparer.shallow, fireImmediately: true } - ); - }, + componentDidMount() { + this._cleanupLoadMembersReaction = reaction( + () => [this.props.group, this.isOpen()], + ([group, isOpen]) => { + if (isOpen) { + group.loadMembers(); + } + }, + { equals: comparer.shallow, fireImmediately: true } + ); + } - componentWillUnmount() { - this._cleanupLoadMembersReaction(); - }, + componentWillUnmount() { + this._cleanupLoadMembersReaction(); + } - render() { - const group = this.props.group; - const { t } = this.props; - return ( - - - - - - - - ); - } - }) -); + render() { + const group = this.props.group; + const { t } = this.props; + return ( + this.clickGroup()} + removable={this.props.removable} + removeUserAddedData={removeUserAddedData.bind( + this, + this.props.terria, + this.props.group + )} + selected={this.isSelected()} + > + + + + + + + ); + } +} module.exports = withTranslation()(DataCatalogGroup); diff --git a/lib/ReactViews/DataCatalog/DataCatalogMember.jsx b/lib/ReactViews/DataCatalog/DataCatalogMember.jsx index bdc6225cf60..c0eb7981366 100644 --- a/lib/ReactViews/DataCatalog/DataCatalogMember.jsx +++ b/lib/ReactViews/DataCatalog/DataCatalogMember.jsx @@ -1,6 +1,5 @@ "use strict"; -import createReactClass from "create-react-class"; import { observer } from "mobx-react"; import PropTypes from "prop-types"; import React from "react"; @@ -13,60 +12,57 @@ import DataCatalogReference from "./DataCatalogReference"; /** * Component that is either a {@link CatalogItem} or a {@link DataCatalogMember} and encapsulated this choosing logic. */ -export default observer( - createReactClass({ - displayName: "DataCatalogMember", +@observer +export default class extends React.Component { + static propTypes = { + member: PropTypes.object.isRequired, + viewState: PropTypes.object.isRequired, + manageIsOpenLocally: PropTypes.bool, + onActionButtonClicked: PropTypes.func, + removable: PropTypes.bool, + terria: PropTypes.object, + isTopLevel: PropTypes.bool + }; - propTypes: { - member: PropTypes.object.isRequired, - viewState: PropTypes.object.isRequired, - manageIsOpenLocally: PropTypes.bool, - onActionButtonClicked: PropTypes.func, - removable: PropTypes.bool, - terria: PropTypes.object, - isTopLevel: PropTypes.bool - }, + render() { + const member = + ReferenceMixin.isMixedInto(this.props.member) && + this.props.member.nestedTarget !== undefined + ? this.props.member.nestedTarget + : this.props.member; - render() { - const member = - ReferenceMixin.isMixedInto(this.props.member) && - this.props.member.nestedTarget !== undefined - ? this.props.member.nestedTarget - : this.props.member; - - if (ReferenceMixin.isMixedInto(member)) { - return ( - - ); - } else if (GroupMixin.isMixedInto(member)) { - return ( - - ); - } else { - return ( - - ); - } + if (ReferenceMixin.isMixedInto(member)) { + return ( + + ); + } else if (GroupMixin.isMixedInto(member)) { + return ( + + ); + } else { + return ( + + ); } - }) -); + } +} diff --git a/lib/ReactViews/ExplorerWindow/Tabs.jsx b/lib/ReactViews/ExplorerWindow/Tabs.jsx index 0a5e1f01501..fc7ec3814cb 100644 --- a/lib/ReactViews/ExplorerWindow/Tabs.jsx +++ b/lib/ReactViews/ExplorerWindow/Tabs.jsx @@ -1,5 +1,4 @@ import classNames from "classnames"; -import createReactClass from "create-react-class"; import { runInAction } from "mobx"; import { observer } from "mobx-react"; import PropTypes from "prop-types"; @@ -12,185 +11,179 @@ import Styles from "./tabs.scss"; import DataCatalogTab from "./Tabs/DataCatalogTab"; import MyDataTab from "./Tabs/MyDataTab/MyDataTab"; -const Tabs = observer( - createReactClass({ - displayName: "Tabs", +@observer +class Tabs extends React.Component { + static propTypes = { + terria: PropTypes.object.isRequired, + viewState: PropTypes.object.isRequired, + tabs: PropTypes.array, + t: PropTypes.func.isRequired + }; - propTypes: { - terria: PropTypes.object.isRequired, - viewState: PropTypes.object.isRequired, - tabs: PropTypes.array, - t: PropTypes.func.isRequired - }, - - async onFileAddFinished(files) { - const file = files.find((f) => MappableMixin.isMixedInto(f)); - if (file) { - const result = await this.props.viewState.viewCatalogMember(file); - if (result.error) { - result.raiseError(this.props.terria); - } else { - if (!file.disableZoomTo) { - this.props.terria.currentViewer.zoomTo(file, 1); - } + async onFileAddFinished(files) { + const file = files.find((f) => MappableMixin.isMixedInto(f)); + if (file) { + const result = await this.props.viewState.viewCatalogMember(file); + if (result.error) { + result.raiseError(this.props.terria); + } else { + if (!file.disableZoomTo) { + this.props.terria.currentViewer.zoomTo(file, 1); } } - this.props.viewState.myDataIsUploadView = false; - }, + } + this.props.viewState.myDataIsUploadView = false; + } - async onUrlAddFinished() { - this.props.viewState.openAddData(); - }, + async onUrlAddFinished() { + this.props.viewState.openAddData(); + } - getTabs() { - const { t } = this.props; - // This can be passed in as prop - if (this.props.tabs) { - return this.props.tabs; - } + getTabs() { + const { t } = this.props; + // This can be passed in as prop + if (this.props.tabs) { + return this.props.tabs; + } - const myDataTab = { - title: "my-data", - name: t("addData.myData"), - category: "my-data", - panel: ( - this.onFileAddFinished(files)} - onUrlAddFinished={this.onUrlAddFinished} - /> - ) - }; + const myDataTab = { + title: "my-data", + name: t("addData.myData"), + category: "my-data", + panel: ( + this.onFileAddFinished(files)} + onUrlAddFinished={() => this.onUrlAddFinished()} + /> + ) + }; - if (this.props.terria.configParameters.tabbedCatalog) { - return [].concat( - this.props.terria.catalog.group.memberModels - .filter( - (member) => - member !== this.props.terria.catalog.userAddedDataGroup - ) - .map((member, i) => ({ - name: member.nameInCatalog, - title: `data-catalog-${member.name}`, - category: "data-catalog", - idInCategory: member.uniqueId, - panel: ( - - ) - })), - [myDataTab] - ); - } else { - return [ - { - name: t("addData.dataCatalogue"), - title: "data-catalog", + if (this.props.terria.configParameters.tabbedCatalog) { + return [].concat( + this.props.terria.catalog.group.memberModels + .filter( + (member) => member !== this.props.terria.catalog.userAddedDataGroup + ) + .map((member, i) => ({ + name: member.nameInCatalog, + title: `data-catalog-${member.name}`, category: "data-catalog", + idInCategory: member.uniqueId, panel: ( ) - }, - myDataTab - ]; - } - }, + })), + [myDataTab] + ); + } else { + return [ + { + name: t("addData.dataCatalogue"), + title: "data-catalog", + category: "data-catalog", + panel: ( + + ) + }, + myDataTab + ]; + } + } - async activateTab(category, idInCategory) { - runInAction(() => { - this.props.viewState.activeTabCategory = category; - if (this.props.terria.configParameters.tabbedCatalog) { - this.props.viewState.activeTabIdInCategory = idInCategory; - if (category === "data-catalog") { - const member = this.props.terria.catalog.group.memberModels.filter( - (m) => m.uniqueId === idInCategory - )[0]; - // If member was found and member can be opened, open it (causes CkanCatalogGroups to fetch etc.) - if (defined(member)) { - this.props.viewState - .viewCatalogMember(member) - .then((result) => - result.raiseError(this.props.viewState.terria) - ); - } + async activateTab(category, idInCategory) { + runInAction(() => { + this.props.viewState.activeTabCategory = category; + if (this.props.terria.configParameters.tabbedCatalog) { + this.props.viewState.activeTabIdInCategory = idInCategory; + if (category === "data-catalog") { + const member = this.props.terria.catalog.group.memberModels.filter( + (m) => m.uniqueId === idInCategory + )[0]; + // If member was found and member can be opened, open it (causes CkanCatalogGroups to fetch etc.) + if (defined(member)) { + this.props.viewState + .viewCatalogMember(member) + .then((result) => result.raiseError(this.props.viewState.terria)); } } - }); - }, + } + }); + } - render() { - const tabs = this.getTabs(); - const sameCategory = tabs.filter( - (t) => t.category === this.props.viewState.activeTabCategory - ); - const currentTab = - sameCategory.filter( - (t) => t.idInCategory === this.props.viewState.activeTabIdInCategory - )[0] || - sameCategory[0] || - tabs[0]; + render() { + const tabs = this.getTabs(); + const sameCategory = tabs.filter( + (t) => t.category === this.props.viewState.activeTabCategory + ); + const currentTab = + sameCategory.filter( + (t) => t.idInCategory === this.props.viewState.activeTabIdInCategory + )[0] || + sameCategory[0] || + tabs[0]; - return ( -
    -
      p.theme.colorPrimary}; - `} - > - - + +
    -
    -
    {currentTab.panel}
    -
    -
    - ); - } - }) -); +
    +
    {currentTab.panel}
    +
    +
    + ); + } +} const ButtonTab = styled.button` ${(props) => ` diff --git a/lib/ReactViews/ExplorerWindow/Tabs/MyDataTab/MyDataTab.jsx b/lib/ReactViews/ExplorerWindow/Tabs/MyDataTab/MyDataTab.jsx index 3147c089585..ad19c7aed2c 100644 --- a/lib/ReactViews/ExplorerWindow/Tabs/MyDataTab/MyDataTab.jsx +++ b/lib/ReactViews/ExplorerWindow/Tabs/MyDataTab/MyDataTab.jsx @@ -2,7 +2,6 @@ import React from "react"; import { observer } from "mobx-react"; import classNames from "classnames"; -import createReactClass from "create-react-class"; import Icon from "../../../../Styled/Icon"; import Box from "../../../../Styled/Box"; import PropTypes from "prop-types"; @@ -15,192 +14,190 @@ import { withTranslation, Trans } from "react-i18next"; import Styles from "./my-data-tab.scss"; // My data tab include Add data section and preview section -const MyDataTab = observer( - createReactClass({ - displayName: "MyDataTab", +@observer +class MyDataTab extends React.Component { + static propTypes = { + terria: PropTypes.object, + viewState: PropTypes.object, + onFileAddFinished: PropTypes.func.isRequired, + onUrlAddFinished: PropTypes.func.isRequired, + localDataTypes: PropTypes.arrayOf(PropTypes.object), + remoteDataTypes: PropTypes.arrayOf(PropTypes.object), + t: PropTypes.func.isRequired + }; - propTypes: { - terria: PropTypes.object, - viewState: PropTypes.object, - onFileAddFinished: PropTypes.func.isRequired, - onUrlAddFinished: PropTypes.func.isRequired, - localDataTypes: PropTypes.arrayOf(PropTypes.object), - remoteDataTypes: PropTypes.arrayOf(PropTypes.object), - t: PropTypes.func.isRequired - }, + constructor(props) { + super(props); + this.state = { + activeTab: null + }; + } - getInitialState() { - return { - activeTab: null - }; - }, + hasUserAddedData() { + return this.props.terria.catalog.userAddedDataGroup.members.length > 0; + } - hasUserAddedData() { - return this.props.terria.catalog.userAddedDataGroup.members.length > 0; - }, + changeTab(active) { + this.setState({ + activeTab: active + }); + } - changeTab(active) { - this.setState({ - activeTab: active - }); - }, + resetTab() { + this.setState({ + activeTab: null + }); + } - resetTab() { - this.setState({ - activeTab: null - }); - }, - - renderTabs() { - const { t } = this.props; - const tabs = [ - { - id: "local", - caption: t("addData.localTitle") - }, - { - id: "web", - caption: t("addData.webTitle") - } - ]; - return ( -
      - -
    • - -
    • -
      -
    - ); - }, - - renderPromptBox() { - if (this.hasUserAddedData()) { - const { t } = this.props; - return ( -
    -
    - - {t("addData.dragDrop")} -
    -
    - ); + renderTabs() { + const { t } = this.props; + const tabs = [ + { + id: "local", + caption: t("addData.localTitle") + }, + { + id: "web", + caption: t("addData.webTitle") } + ]; + return ( +
      + +
    • + +
    • +
      +
    + ); + } + renderPromptBox() { + if (this.hasUserAddedData()) { + const { t } = this.props; return (
    -
    - -
    Drag and drop a file here to view it locally on the map
    -
    (it won’t be saved or uploaded to the internet)
    -
    -
    {this.renderTabs()}
    -
    + {t("addData.dragDrop")}
    ); - }, + } - render() { - const showTwoColumn = this.hasUserAddedData() & !this.state.activeTab; - const { t } = this.props; - return ( - -
    - - - - - - -

    - - Note: Data added in this way is not saved - or made visible to others. - -

    -
    {this.renderTabs()}
    + return ( +
    +
    + +
    Drag and drop a file here to view it locally on the map
    +
    (it won’t be saved or uploaded to the internet)
    +
    +
    {this.renderTabs()}
    +
    +
    + +
    +
    + ); + } -
      - -
    -
    -
    - {this.renderPromptBox()} -
    + render() { + const showTwoColumn = this.hasUserAddedData() & !this.state.activeTab; + const { t } = this.props; + return ( + +
    + + + this.resetTab()} + onFileAddFinished={this.props.onFileAddFinished} + onUrlAddFinished={this.props.onUrlAddFinished} + localDataTypes={this.props.localDataTypes} + remoteDataTypes={this.props.remoteDataTypes} + /> + - - + +

    + + Note: Data added in this way is not saved or + made visible to others. + +

    +
    {this.renderTabs()}
    + +
      + +
    - - ); - } - }) -); + {this.renderPromptBox()} +
    + + + + + +
    + ); + } +} module.exports = withTranslation()(MyDataTab); diff --git a/lib/ReactViews/Map/Legend/LocationBar.jsx b/lib/ReactViews/Map/Legend/LocationBar.jsx index 7580e63a8a1..08c1250a135 100644 --- a/lib/ReactViews/Map/Legend/LocationBar.jsx +++ b/lib/ReactViews/Map/Legend/LocationBar.jsx @@ -1,82 +1,76 @@ "use strict"; import classNames from "classnames"; -import createReactClass from "create-react-class"; import { observer } from "mobx-react"; import PropTypes from "prop-types"; import { withTranslation } from "react-i18next"; import React from "react"; import Styles from "./legend.scss"; -const LocationBar = observer( - createReactClass({ - displayName: "LocationBar", +@observer +class LocationBar extends React.Component { + static propTypes = { + terria: PropTypes.object, + showUtmZone: PropTypes.bool, + mouseCoords: PropTypes.object.isRequired, + t: PropTypes.func.isRequired + }; - propTypes: { - terria: PropTypes.object, - showUtmZone: PropTypes.bool, - mouseCoords: PropTypes.object.isRequired, - t: PropTypes.func.isRequired - }, + static defaultProps = { + showUtmZone: true + }; - getDefaultProps: function () { - return { - showUtmZone: true - }; - }, + toggleUseProjection() { + this.props.mouseCoords.toggleUseProjection(); + } - toggleUseProjection() { - this.props.mouseCoords.toggleUseProjection(); - }, - - render() { - const { t } = this.props; - return ( - - ); - } - }) -); + render() { + const { t } = this.props; + return ( + + ); + } +} module.exports = withTranslation()(LocationBar); diff --git a/lib/ReactViews/Map/ProgressBar.jsx b/lib/ReactViews/Map/ProgressBar.jsx index ea892e7e79f..65cb08c0eaf 100644 --- a/lib/ReactViews/Map/ProgressBar.jsx +++ b/lib/ReactViews/Map/ProgressBar.jsx @@ -1,7 +1,4 @@ -"use strict"; - import classNames from "classnames"; -import createReactClass from "create-react-class"; import { observer } from "mobx-react"; import PropTypes from "prop-types"; import React from "react"; @@ -11,95 +8,92 @@ import { withViewState } from "../StandardUserInterface/ViewStateContext"; import Styles from "./progress-bar.scss"; // The map navigation region -const ProgressBar = observer( - createReactClass({ - displayName: "ProgressBar", - propTypes: { - viewState: PropTypes.object.isRequired, - theme: PropTypes.object.isRequired - }, - - getInitialState() { - return { - visible: "hidden" - }; - }, - - /* eslint-disable-next-line camelcase */ - UNSAFE_componentWillMount() { - this.eventHelper = new EventHelper(); - - this.eventHelper.add( - this.props.viewState.terria.tileLoadProgressEvent, - this.setProgress - ); - - // Also listen for indeterminate data source loading events - this.eventHelper.add( - this.props.viewState.terria.indeterminateTileLoadProgressEvent, - this.setMode - ); - - // TODO - is this actually needed now? load events always get called when - // changing viewer. if still reuqired, - // clear progress when new viewer observed, rather than mounting to a 'current viewer' - - // // Clear progress when the viewer changes so we're not left with an invalid progress bar hanging on the screen. - // this.eventHelper.add( - // this.props.viewState.terria.currentViewer.beforeViewerChanged, - // this.setProgress.bind(this, 0, 0) - // ); - }, - - setProgress(remaining, max) { - const rawPercentage = (1 - remaining / max) * 100; - const sanitisedPercentage = Math.floor( - remaining > 0 ? rawPercentage : 100 - ); - - this.setState({ - percentage: sanitisedPercentage - }); - }, - - setMode(loading) { - this.setState({ loading: loading }); - }, - - componentWillUnmount() { - this.eventHelper.removeAll(); - }, - - /** - * Progress bar is influced by two loading states: - * The base globe where the progress bar shows actual progress, - * Sources where load progress is indeterminate including 3DTilesets where the progress bar is animated. - */ - render() { - const determinateProgress = this.state.percentage + "%"; - const indeterminateStillLoading = this.state.loading; - const allComplete = this.state.percentage === 100 && !this.state.loading; - - // use the baseMapContrastColor to ensure progress bar is visible on light backgrounds. If contrast color is white, use it. If its black, use the primary color of the current theme. - const backgroundColor = - this.props.viewState.terria.baseMapContrastColor === "#ffffff" - ? "#ffffff" - : this.props.theme.colorPrimary; - - return ( -
    - ); - } - }) -); +@observer +class ProgressBar extends React.Component { + static propTypes = { + viewState: PropTypes.object.isRequired, + theme: PropTypes.object.isRequired + }; + + constructor(props) { + super(props); + this.state = { + visible: "hidden" + }; + } + + /* eslint-disable-next-line camelcase */ + UNSAFE_componentWillMount() { + this.eventHelper = new EventHelper(); + + this.eventHelper.add( + this.props.viewState.terria.tileLoadProgressEvent, + this.setProgress.bind(this) + ); + + // Also listen for indeterminate data source loading events + this.eventHelper.add( + this.props.viewState.terria.indeterminateTileLoadProgressEvent, + this.setMode.bind(this) + ); + + // TODO - is this actually needed now? load events always get called when + // changing viewer. if still reuqired, + // clear progress when new viewer observed, rather than mounting to a 'current viewer' + + // // Clear progress when the viewer changes so we're not left with an invalid progress bar hanging on the screen. + // this.eventHelper.add( + // this.props.viewState.terria.currentViewer.beforeViewerChanged, + // this.setProgress.bind(this, 0, 0) + // ); + } + + setProgress(remaining, max) { + const rawPercentage = (1 - remaining / max) * 100; + const sanitisedPercentage = Math.floor(remaining > 0 ? rawPercentage : 100); + + this.setState({ + percentage: sanitisedPercentage + }); + } + + setMode(loading) { + this.setState({ loading: loading }); + } + + componentWillUnmount() { + this.eventHelper.removeAll(); + } + + /** + * Progress bar is influced by two loading states: + * The base globe where the progress bar shows actual progress, + * Sources where load progress is indeterminate including 3DTilesets where the progress bar is animated. + */ + render() { + const determinateProgress = this.state.percentage + "%"; + const indeterminateStillLoading = this.state.loading; + const allComplete = this.state.percentage === 100 && !this.state.loading; + + // use the baseMapContrastColor to ensure progress bar is visible on light backgrounds. If contrast color is white, use it. If its black, use the primary color of the current theme. + const backgroundColor = + this.props.viewState.terria.baseMapContrastColor === "#ffffff" + ? "#ffffff" + : this.props.theme.colorPrimary; + + return ( +
    + ); + } +} export default withViewState(withTheme(ProgressBar)); diff --git a/lib/ReactViews/Map/Splitter.jsx b/lib/ReactViews/Map/Splitter.jsx index 57da1275fd8..e4edbe6dd2b 100644 --- a/lib/ReactViews/Map/Splitter.jsx +++ b/lib/ReactViews/Map/Splitter.jsx @@ -1,5 +1,4 @@ import React from "react"; -import createReactClass from "create-react-class"; import PropTypes from "prop-types"; import { withTranslation } from "react-i18next"; import { GLYPHS, StyledIcon } from "../../Styled/Icon"; @@ -24,207 +23,201 @@ try { const notPassive = passiveSupported ? { passive: false } : false; -const Splitter = observer( - createReactClass({ - displayName: "Splitter", - - propTypes: { - terria: PropTypes.object.isRequired, - viewState: PropTypes.object.isRequired, - thumbSize: PropTypes.number, - padding: PropTypes.number, - t: PropTypes.func.isRequired - }, - - getDefaultProps() { - return { - thumbSize: 42, - padding: 0 - }; - }, - - componentDidMount() { - const that = this; - window.addEventListener("resize", function () { - that.forceRefresh(); - }); - }, - - componentWillUnmount() { - this.unsubscribe(); - }, - - forceRefresh() { - const smallChange = - this.props.terria.splitPosition < 0.5 ? 0.0001 : -0.0001; // Make sure never <0 or >1. - runInAction(() => { - this.props.terria.splitPosition += smallChange; - }); - }, - - startDrag(event) { - const viewer = this.props.terria.currentViewer; - viewer.pauseMapInteraction(); - - // While dragging is in progress, subscribe to document-level movement and up events. - document.addEventListener("mousemove", this.drag, notPassive); - document.addEventListener("touchmove", this.drag, notPassive); - document.addEventListener("mouseup", this.stopDrag, notPassive); - document.addEventListener("touchend", this.stopDrag, notPassive); - - event.preventDefault(); - event.stopPropagation(); - }, - - drag(event) { - let clientX = event.clientX; - let clientY = event.clientY; - if (event.targetTouches && event.targetTouches.length > 0) { - clientX = event.targetTouches.item(0).clientX; - clientY = event.targetTouches.item(0).clientY; - } - - const viewer = this.props.terria.mainViewer.currentViewer; - const container = viewer.getContainer(); - const mapRect = container.getBoundingClientRect(); - - const that = this; - function computeSplitFraction(startBound, endBound, position) { - const difference = endBound - startBound; - const fraction = (position - startBound) / difference; - - const min = - startBound + that.props.padding + that.props.thumbSize * 0.5; - const max = endBound - that.props.padding - that.props.thumbSize * 0.5; - const minFraction = (min - startBound) / difference; - const maxFraction = (max - startBound) / difference; - - return Math.min(maxFraction, Math.max(minFraction, fraction)); - } - let splitFractionX = computeSplitFraction( - mapRect.left, - mapRect.right, - clientX - ); - let splitFractionY = computeSplitFraction( - mapRect.top, - mapRect.bottom, - clientY - ); - - // We compute the maximum and minium windows bounds as a percentage so that we can always apply the bounds - // restriction as a percentage for consistency (we currently use absolute values for X and percentage values for - // Y, but always apply the constraint as a percentage). - // We use absolute pixel values for horizontal restriction because of the fixed UI elements which occupy an - // absolute amount of screen relestate and 100 px seems like a fine amount for the current UI. - const minX = computeSplitFraction( - mapRect.left, - mapRect.right, - mapRect.left + 100 - ); - const maxX = computeSplitFraction( - mapRect.left, - mapRect.right, - mapRect.right - 100 - ); - // Resctrict to within +/-30% of the center vertically (so we don't run into the top and bottom UI elements). - const minY = 0.2; - const maxY = 0.8; - - splitFractionX = Math.min(maxX, Math.max(minX, splitFractionX)); - splitFractionY = Math.min(maxY, Math.max(minY, splitFractionY)); - - runInAction(() => { - this.props.terria.splitPosition = splitFractionX; - this.props.terria.splitPositionVertical = splitFractionY; - }); - - event.preventDefault(); - event.stopPropagation(); - }, - - stopDrag(event) { - this.unsubscribe(); - - const viewer = this.props.terria.currentViewer; - // Ensure splitter stays in sync with map - this.props.viewState.triggerResizeEvent(); - - viewer.resumeMapInteraction(); - - event.preventDefault(); - event.stopPropagation(); - }, - - unsubscribe() { - document.removeEventListener("mousemove", this.drag, notPassive); - document.removeEventListener("touchmove", this.drag, notPassive); - document.removeEventListener("mouseup", this.stopDrag, notPassive); - document.removeEventListener("touchend", this.stopDrag, notPassive); - window.removeEventListener("resize", this.forceRefresh); - }, - - getPosition() { - const canvasWidth = - this.props.terria.currentViewer.getContainer().clientWidth; - const canvasHeight = - this.props.terria.currentViewer.getContainer().clientHeight; - return { - x: this.props.terria.splitPosition * canvasWidth, - y: this.props.terria.splitPositionVertical * canvasHeight - }; - }, - - render() { - if ( - !this.props.terria.showSplitter || - !this.props.terria.currentViewer.canShowSplitter || - !this.props.terria.currentViewer.getContainer() - ) { - return null; - } - - const thumbWidth = this.props.thumbSize; - const position = this.getPosition(); - - const dividerStyle = { - left: position.x + "px", - backgroundColor: this.props.terria.baseMapContrastColor - }; - - const thumbStyle = { - left: position.x + "px", - top: position.y + "px", - width: thumbWidth + "px", - height: thumbWidth + "px", - marginLeft: "-" + thumbWidth * 0.5 + "px", - marginTop: "-" + thumbWidth * 0.5 + "px", - lineHeight: thumbWidth - 2 + "px", - borderRadius: thumbWidth * 0.5 + "px", - fontSize: thumbWidth - 12 + "px" - }; - - const { t } = this.props; - - return ( -
    -
    -
    -
    - -
    - ); +@observer +class Splitter extends React.Component { + static propTypes = { + terria: PropTypes.object.isRequired, + viewState: PropTypes.object.isRequired, + thumbSize: PropTypes.number, + padding: PropTypes.number, + t: PropTypes.func.isRequired + }; + + static defaultProps = { + thumbSize: 42, + padding: 0 + }; + + componentDidMount() { + const that = this; + window.addEventListener("resize", function () { + that.forceRefresh(); + }); + } + + componentWillUnmount() { + this.unsubscribe(); + } + + forceRefresh() { + const smallChange = + this.props.terria.splitPosition < 0.5 ? 0.0001 : -0.0001; // Make sure never <0 or >1. + runInAction(() => { + this.props.terria.splitPosition += smallChange; + }); + } + + startDrag(event) { + const viewer = this.props.terria.currentViewer; + viewer.pauseMapInteraction(); + + // While dragging is in progress, subscribe to document-level movement and up events. + document.addEventListener("mousemove", this.drag, notPassive); + document.addEventListener("touchmove", this.drag, notPassive); + document.addEventListener("mouseup", this.stopDrag, notPassive); + document.addEventListener("touchend", this.stopDrag, notPassive); + + event.preventDefault(); + event.stopPropagation(); + } + + drag(event) { + let clientX = event.clientX; + let clientY = event.clientY; + if (event.targetTouches && event.targetTouches.length > 0) { + clientX = event.targetTouches.item(0).clientX; + clientY = event.targetTouches.item(0).clientY; } - }) -); + + const viewer = this.props.terria.mainViewer.currentViewer; + const container = viewer.getContainer(); + const mapRect = container.getBoundingClientRect(); + + const that = this; + function computeSplitFraction(startBound, endBound, position) { + const difference = endBound - startBound; + const fraction = (position - startBound) / difference; + + const min = startBound + that.props.padding + that.props.thumbSize * 0.5; + const max = endBound - that.props.padding - that.props.thumbSize * 0.5; + const minFraction = (min - startBound) / difference; + const maxFraction = (max - startBound) / difference; + + return Math.min(maxFraction, Math.max(minFraction, fraction)); + } + let splitFractionX = computeSplitFraction( + mapRect.left, + mapRect.right, + clientX + ); + let splitFractionY = computeSplitFraction( + mapRect.top, + mapRect.bottom, + clientY + ); + + // We compute the maximum and minium windows bounds as a percentage so that we can always apply the bounds + // restriction as a percentage for consistency (we currently use absolute values for X and percentage values for + // Y, but always apply the constraint as a percentage). + // We use absolute pixel values for horizontal restriction because of the fixed UI elements which occupy an + // absolute amount of screen relestate and 100 px seems like a fine amount for the current UI. + const minX = computeSplitFraction( + mapRect.left, + mapRect.right, + mapRect.left + 100 + ); + const maxX = computeSplitFraction( + mapRect.left, + mapRect.right, + mapRect.right - 100 + ); + // Resctrict to within +/-30% of the center vertically (so we don't run into the top and bottom UI elements). + const minY = 0.2; + const maxY = 0.8; + + splitFractionX = Math.min(maxX, Math.max(minX, splitFractionX)); + splitFractionY = Math.min(maxY, Math.max(minY, splitFractionY)); + + runInAction(() => { + this.props.terria.splitPosition = splitFractionX; + this.props.terria.splitPositionVertical = splitFractionY; + }); + + event.preventDefault(); + event.stopPropagation(); + } + + stopDrag(event) { + this.unsubscribe(); + + const viewer = this.props.terria.currentViewer; + // Ensure splitter stays in sync with map + this.props.viewState.triggerResizeEvent(); + + viewer.resumeMapInteraction(); + + event.preventDefault(); + event.stopPropagation(); + } + + unsubscribe() { + document.removeEventListener("mousemove", this.drag, notPassive); + document.removeEventListener("touchmove", this.drag, notPassive); + document.removeEventListener("mouseup", this.stopDrag, notPassive); + document.removeEventListener("touchend", this.stopDrag, notPassive); + window.removeEventListener("resize", this.forceRefresh); + } + + getPosition() { + const canvasWidth = + this.props.terria.currentViewer.getContainer().clientWidth; + const canvasHeight = + this.props.terria.currentViewer.getContainer().clientHeight; + return { + x: this.props.terria.splitPosition * canvasWidth, + y: this.props.terria.splitPositionVertical * canvasHeight + }; + } + + render() { + if ( + !this.props.terria.showSplitter || + !this.props.terria.currentViewer.canShowSplitter || + !this.props.terria.currentViewer.getContainer() + ) { + return null; + } + + const thumbWidth = this.props.thumbSize; + const position = this.getPosition(); + + const dividerStyle = { + left: position.x + "px", + backgroundColor: this.props.terria.baseMapContrastColor + }; + + const thumbStyle = { + left: position.x + "px", + top: position.y + "px", + width: thumbWidth + "px", + height: thumbWidth + "px", + marginLeft: "-" + thumbWidth * 0.5 + "px", + marginTop: "-" + thumbWidth * 0.5 + "px", + lineHeight: thumbWidth - 2 + "px", + borderRadius: thumbWidth * 0.5 + "px", + fontSize: thumbWidth - 12 + "px" + }; + + const { t } = this.props; + + return ( +
    +
    +
    +
    + +
    + ); + } +} module.exports = withTranslation()(Splitter); diff --git a/lib/ReactViews/Mobile/MobileMenu.jsx b/lib/ReactViews/Mobile/MobileMenu.jsx index 537df2704a7..698bf95aada 100644 --- a/lib/ReactViews/Mobile/MobileMenu.jsx +++ b/lib/ReactViews/Mobile/MobileMenu.jsx @@ -1,6 +1,5 @@ import React from "react"; import defined from "terriajs-cesium/Source/Core/defined"; -import createReactClass from "create-react-class"; import { observer } from "mobx-react"; import PropTypes from "prop-types"; @@ -17,170 +16,165 @@ import LangPanel from "../Map/Panels/LangPanel/LangPanel"; import { applyTranslationIfExists } from "../../Language/languageHelpers"; import { Category, HelpAction } from "../../Core/AnalyticEvents/analyticEvents"; -const MobileMenu = observer( - createReactClass({ - displayName: "MobileMenu", - - propTypes: { - menuItems: PropTypes.arrayOf(PropTypes.element), - menuLeftItems: PropTypes.arrayOf(PropTypes.element), - viewState: PropTypes.object.isRequired, - showFeedback: PropTypes.bool, - terria: PropTypes.object.isRequired, - i18n: PropTypes.object, - allBaseMaps: PropTypes.array.isRequired, - t: PropTypes.func.isRequired - }, - - getDefaultProps() { - return { - menuItems: [], - showFeedback: false - }; - }, - - toggleMenu() { - runInAction(() => { - this.props.viewState.mobileMenuVisible = - !this.props.viewState.mobileMenuVisible; - }); - }, - - getInitialState() { - return {}; - }, - - onFeedbackFormClick() { - runInAction(() => { - this.props.viewState.feedbackFormIsVisible = true; - this.props.viewState.mobileMenuVisible = false; - }); - }, - - hideMenu() { - runInAction(() => { - this.props.viewState.mobileMenuVisible = false; - }); - }, - - runStories() { - this.props.viewState.runStories(); - }, - - dismissSatelliteGuidanceAction() { - this.props.viewState.toggleFeaturePrompt("mapGuidesLocation", true, true); - }, - - /** - * If the help configuration defines an item named `mapuserguide`, this - * method returns props for showing it in the mobile menu. - */ - mapUserGuide() { - const helpItems = this.props.terria.configParameters.helpContent; - const mapUserGuideItem = helpItems?.find( - ({ itemName }) => itemName === "mapuserguide" - ); - if (!mapUserGuideItem) { - return undefined; +@observer +class MobileMenu extends React.Component { + static propTypes = { + menuItems: PropTypes.arrayOf(PropTypes.element), + menuLeftItems: PropTypes.arrayOf(PropTypes.element), + viewState: PropTypes.object.isRequired, + showFeedback: PropTypes.bool, + terria: PropTypes.object.isRequired, + i18n: PropTypes.object, + allBaseMaps: PropTypes.array.isRequired, + t: PropTypes.func.isRequired + }; + + static defaultProps = { + menuItems: [], + showFeedback: false + }; + + constructor(props) { + super(props); + this.state = {}; + } + + toggleMenu() { + runInAction(() => { + this.props.viewState.mobileMenuVisible = + !this.props.viewState.mobileMenuVisible; + }); + } + + onFeedbackFormClick() { + runInAction(() => { + this.props.viewState.feedbackFormIsVisible = true; + this.props.viewState.mobileMenuVisible = false; + }); + } + + hideMenu() { + runInAction(() => { + this.props.viewState.mobileMenuVisible = false; + }); + } + + runStories() { + this.props.viewState.runStories(); + } + + dismissSatelliteGuidanceAction() { + this.props.viewState.toggleFeaturePrompt("mapGuidesLocation", true, true); + } + + /** + * If the help configuration defines an item named `mapuserguide`, this + * method returns props for showing it in the mobile menu. + */ + mapUserGuide() { + const helpItems = this.props.terria.configParameters.helpContent; + const mapUserGuideItem = helpItems?.find( + ({ itemName }) => itemName === "mapuserguide" + ); + if (!mapUserGuideItem) { + return undefined; + } + const title = applyTranslationIfExists( + mapUserGuideItem.title, + this.props.i18n + ); + return { + href: mapUserGuideItem.url, + caption: title, + onClick: () => { + this.props.terria.analytics?.logEvent( + Category.help, + HelpAction.itemSelected, + title + ); } - const title = applyTranslationIfExists( - mapUserGuideItem.title, - this.props.i18n - ); - return { - href: mapUserGuideItem.url, - caption: title, - onClick: () => { - this.props.terria.analytics?.logEvent( - Category.help, - HelpAction.itemSelected, - title - ); - } - }; - }, - - render() { - const { t } = this.props; - const hasStories = - this.props.terria.configParameters.storyEnabled && - defined(this.props.terria.stories) && - this.props.terria.stories.length > 0; - - const mapUserGuide = this.mapUserGuide(); - - // return this.props.viewState.mobileMenuVisible ? ( - return ( -
    - -
    + }; + } + + render() { + const { t } = this.props; + const hasStories = + this.props.terria.configParameters.storyEnabled && + defined(this.props.terria.stories) && + this.props.terria.stories.length > 0; + + const mapUserGuide = this.mapUserGuide(); + + // return this.props.viewState.mobileMenuVisible ? ( + return ( +
    + +
    this.toggleMenu()} /> + +
    + +
    this.hideMenu()} + key={menuItem ? menuItem.key : undefined} + > + {menuItem} +
    +
    +
    this.hideMenu()}> + +
    +
    this.hideMenu()}> + +
    + +
    this.hideMenu()} + key={menuItem ? menuItem.key : undefined} + > + {menuItem} +
    +
    + {mapUserGuide && } + + this.onFeedbackFormClick()} + caption={t("feedback.feedbackBtnText")} + /> -
    + this.runStories()} + caption={t("story.mobileViewStory", { + storiesLength: this.props.terria.stories.length + })} + /> + + - -
    - {menuItem} -
    -
    -
    - this.hideMenu()}> +
    -
    - -
    - -
    - {menuItem} -
    -
    - {mapUserGuide && } - - - - - - - -
    - -
    -
    -
    +
    - ); - } - }) -); +
    + ); + } +} export default withTranslation()(MobileMenu); diff --git a/lib/ReactViews/Mobile/MobileModalWindow.jsx b/lib/ReactViews/Mobile/MobileModalWindow.jsx index c2fae421f4a..66449fb79c0 100644 --- a/lib/ReactViews/Mobile/MobileModalWindow.jsx +++ b/lib/ReactViews/Mobile/MobileModalWindow.jsx @@ -1,5 +1,4 @@ import classNames from "classnames"; -import createReactClass from "create-react-class"; import { runInAction } from "mobx"; import { observer } from "mobx-react"; import PropTypes from "prop-types"; @@ -13,15 +12,14 @@ import WorkbenchList from "../Workbench/WorkbenchList"; import Styles from "./mobile-modal-window.scss"; import MobileSearch from "./MobileSearch"; -const MobileModalWindow = observer( - createReactClass({ - displayName: "MobileModalWindow", +@observer +class MobileModalWindow extends React.Component { - propTypes: { + static propTypes = { terria: PropTypes.object, viewState: PropTypes.object.isRequired, t: PropTypes.func.isRequired - }, + } renderModalContent() { const viewState = this.props.viewState; @@ -69,7 +67,7 @@ const MobileModalWindow = observer( default: return null; } - }, + } onClearMobileUI() { runInAction(() => { @@ -79,7 +77,7 @@ const MobileModalWindow = observer( this.props.viewState.searchState.showMobileCatalogSearch = false; this.props.viewState.searchState.catalogSearchText = ""; }); - }, + } /* eslint-disable-next-line camelcase */ UNSAFE_componentWillReceiveProps() { @@ -94,13 +92,13 @@ const MobileModalWindow = observer( this.props.viewState.explorerPanelIsVisible = false; }); } - }, + } goBack() { this.props.viewState.switchMobileView( this.props.viewState.mobileViewOptions.data ); - }, + } render() { const modalClass = classNames(Styles.mobileModal, { @@ -123,7 +121,7 @@ const MobileModalWindow = observer( @@ -138,7 +136,7 @@ const MobileModalWindow = observer( mobileView !== this.props.viewState.mobileViewOptions.preview })} - onClick={this.goBack} + onClick={() => this.goBack()} > @@ -149,6 +147,5 @@ const MobileModalWindow = observer(
    ); } - }) -); +} module.exports = withTranslation()(MobileModalWindow); diff --git a/lib/ReactViews/Mobile/MobileSearch.jsx b/lib/ReactViews/Mobile/MobileSearch.jsx index b289035e254..b0b79a1afce 100644 --- a/lib/ReactViews/Mobile/MobileSearch.jsx +++ b/lib/ReactViews/Mobile/MobileSearch.jsx @@ -1,5 +1,4 @@ import React from "react"; -import createReactClass from "create-react-class"; import { runInAction } from "mobx"; import { observer } from "mobx-react"; @@ -12,15 +11,14 @@ import { withTranslation } from "react-i18next"; import Styles from "./mobile-search.scss"; // A Location item when doing Bing map searvh or Gazetter search -const MobileSearch = observer( - createReactClass({ - displayName: "MobileSearch", +@observer +class MobileSearch extends React.Component { - propTypes: { + static propTypes = { viewState: PropTypes.object, terria: PropTypes.object, t: PropTypes.func.isRequired - }, + } onLocationClick(result) { runInAction(() => { @@ -32,7 +30,7 @@ const MobileSearch = observer( this.props.viewState.switchMobileView(null); this.props.viewState.searchState.showMobileLocationSearch = false; }); - }, + } searchInDataCatalog() { const { searchState } = this.props.viewState; @@ -42,7 +40,7 @@ const MobileSearch = observer( searchState.catalogSearchText = searchState.locationSearchText; }); this.props.viewState.searchInCatalog(searchState.locationSearchText); - }, + } render() { const theme = "light"; @@ -54,7 +52,7 @@ const MobileSearch = observer(
    ); - }, + } renderSearchInCatalogLink(theme) { const { t } = this.props; @@ -65,7 +63,7 @@ const MobileSearch = observer(
      {searchState.catalogSearchProvider && ( this.searchInDataCatalog()} icon={null} locationSearchText={searchState.locationSearchText} name={t("search.search", { @@ -78,7 +76,7 @@ const MobileSearch = observer(
    ); - }, + } renderLocationResult(theme) { const searchState = this.props.viewState.searchState; @@ -89,13 +87,12 @@ const MobileSearch = observer( viewState={this.props.viewState} search={search} locationSearchText={searchState.locationSearchText} - onLocationClick={this.onLocationClick} + onLocationClick={this.onLocationClick.bind(this)} isWaitingForSearchToStart={searchState.isWaitingToStartLocationSearch} theme={theme} /> )); } - }) -); +} module.exports = withTranslation()(MobileSearch); diff --git a/lib/ReactViews/Preview/DataPreview.jsx b/lib/ReactViews/Preview/DataPreview.jsx index 307cc812f00..a39a8ec7f5d 100644 --- a/lib/ReactViews/Preview/DataPreview.jsx +++ b/lib/ReactViews/Preview/DataPreview.jsx @@ -1,6 +1,5 @@ "use strict"; // import Chart from "../Custom/Chart/Chart"; -import createReactClass from "create-react-class"; import { runInAction } from "mobx"; import { observer } from "mobx-react"; import PropTypes from "prop-types"; @@ -19,22 +18,21 @@ import WarningBox from "./WarningBox"; /** * Data preview section, for the preview map see DataPreviewMap */ -const DataPreview = observer( - createReactClass({ - displayName: "DataPreview", +@observer +class DataPreview extends React.Component { - propTypes: { + static propTypes = { terria: PropTypes.object.isRequired, viewState: PropTypes.object, previewed: PropTypes.object, t: PropTypes.func.isRequired - }, + } backToMap() { runInAction(() => { this.props.viewState.explorerPanelIsVisible = false; }); - }, + } render() { const { t } = this.props; @@ -114,7 +112,7 @@ const DataPreview = observer(

    - OR -

    @@ -124,7 +122,7 @@ const DataPreview = observer(
    ); - }, + } renderUnloadedReference() { const isLoading = this.props.previewed.isLoadingReference; @@ -157,7 +155,6 @@ const DataPreview = observer(
    ); } - }) -); +} module.exports = withTranslation()(DataPreview); diff --git a/lib/ReactViews/Preview/DataPreviewSections.jsx b/lib/ReactViews/Preview/DataPreviewSections.jsx index 516725d9e5d..17d1de697c0 100644 --- a/lib/ReactViews/Preview/DataPreviewSections.jsx +++ b/lib/ReactViews/Preview/DataPreviewSections.jsx @@ -1,4 +1,3 @@ -import createReactClass from "create-react-class"; import naturalSort from "javascript-natural-sort"; import { runInAction } from "mobx"; import { observer } from "mobx-react"; @@ -24,14 +23,13 @@ Mustache.escape = function (string) { * CatalogItem-defined sections that sit within the preview description. These are ordered according to the catalog item's * order if available. */ -const DataPreviewSections = observer( - createReactClass({ - displayName: "DataPreviewSections", +@observer +class DataPreviewSections extends React.Component { - propTypes: { + static propTypes = { metadataItem: PropTypes.object.isRequired, t: PropTypes.func.isRequired - }, + } sortInfoSections(items) { const infoSectionOrder = this.props.metadataItem.infoSectionOrder; @@ -55,7 +53,7 @@ const DataPreviewSections = observer( (item.content ?? item.contentAsObject) !== null && item.content !== "" ); - }, + } clickInfoSection(reportName, isOpen) { const info = this.props.metadataItem.info; @@ -67,7 +65,7 @@ const DataPreviewSections = observer( }); } return false; - }, + } render() { const metadataItem = this.props.metadataItem; @@ -120,7 +118,6 @@ const DataPreviewSections = observer(
    ); } - }) -); +} export default withTranslation()(DataPreviewSections); diff --git a/lib/ReactViews/Preview/Description.jsx b/lib/ReactViews/Preview/Description.jsx index 7438e17087f..638aee8c68d 100644 --- a/lib/ReactViews/Preview/Description.jsx +++ b/lib/ReactViews/Preview/Description.jsx @@ -1,4 +1,3 @@ -import createReactClass from "create-react-class"; import { observer } from "mobx-react"; import PropTypes from "prop-types"; import React from "react"; @@ -17,15 +16,14 @@ import WarningBox from "./WarningBox"; /** * CatalogItem description. */ -const Description = observer( - createReactClass({ - displayName: "Description", +@observer +class Description extends React.Component { - propTypes: { + static propTypes = { item: PropTypes.object.isRequired, printView: PropTypes.bool, t: PropTypes.func.isRequired - }, + } render() { const { t } = this.props; @@ -296,7 +294,6 @@ const Description = observer(
    ); } - }) -); +} export default withTranslation()(Description); diff --git a/lib/ReactViews/Preview/GroupPreview.jsx b/lib/ReactViews/Preview/GroupPreview.jsx index edf4466f9f3..9e0285bb162 100644 --- a/lib/ReactViews/Preview/GroupPreview.jsx +++ b/lib/ReactViews/Preview/GroupPreview.jsx @@ -1,6 +1,5 @@ import React from "react"; -import createReactClass from "create-react-class"; import PropTypes from "prop-types"; import { observer } from "mobx-react"; @@ -17,21 +16,20 @@ import WarningBox from "./WarningBox"; /** * A "preview" for CatalogGroup. */ -const GroupPreview = observer( - createReactClass({ - displayName: "GroupPreview", +@observer +class GroupPreview extends React.Component { - propTypes: { + static propTypes = { previewed: PropTypes.object.isRequired, terria: PropTypes.object.isRequired, viewState: PropTypes.object.isRequired, widthFromMeasureElementHOC: PropTypes.number, t: PropTypes.func.isRequired - }, + } backToMap() { this.props.viewState.explorerPanelIsVisible = false; - }, + } render() { const metadataItem = @@ -109,7 +107,6 @@ const GroupPreview = observer(
    ); } - }) -); +} export default withTranslation()(measureElement(GroupPreview)); diff --git a/lib/ReactViews/Search/LocationSearchResults.jsx b/lib/ReactViews/Search/LocationSearchResults.jsx index 708d32deea8..d4b3e4bec27 100644 --- a/lib/ReactViews/Search/LocationSearchResults.jsx +++ b/lib/ReactViews/Search/LocationSearchResults.jsx @@ -7,7 +7,6 @@ import { observer } from "mobx-react"; import React from "react"; -import createReactClass from "create-react-class"; import styled from "styled-components"; import PropTypes from "prop-types"; import { withTranslation } from "react-i18next"; @@ -36,158 +35,146 @@ const RawButtonAndHighlight = styled(RawButton)` const MAX_RESULTS_BEFORE_TRUNCATING = 5; -const LocationSearchResults = observer( - createReactClass({ - displayName: "LocationSearchResults", - - propTypes: { - viewState: PropTypes.object.isRequired, - isWaitingForSearchToStart: PropTypes.bool, - terria: PropTypes.object.isRequired, - search: PropTypes.object.isRequired, - onLocationClick: PropTypes.func.isRequired, - theme: PropTypes.string, - locationSearchText: PropTypes.string, - t: PropTypes.func.isRequired - }, - - getInitialState() { - return { - isOpen: true, - isExpanded: false - }; - }, - - getDefaultProps() { - return { - theme: "light" - }; - }, - - toggleIsOpen() { - this.setState({ - isOpen: !this.state.isOpen - }); - }, - - toggleExpand() { - this.setState({ - isExpanded: !this.state.isExpanded - }); - }, - - renderResultsFooter() { - const { t } = this.props; - if (this.state.isExpanded) { - return t("search.viewLess", { - name: this.props.search.searchProvider.name - }); - } - return t("search.viewMore", { +@observer +class LocationSearchResults extends React.Component { + static propTypes = { + viewState: PropTypes.object.isRequired, + isWaitingForSearchToStart: PropTypes.bool, + terria: PropTypes.object.isRequired, + search: PropTypes.object.isRequired, + onLocationClick: PropTypes.func.isRequired, + theme: PropTypes.string, + locationSearchText: PropTypes.string, + t: PropTypes.func.isRequired + }; + + static defaultProps = { + theme: "light" + }; + + constructor(props) { + super(props); + this.state = { + isOpen: true, + isExpanded: false + }; + } + + toggleIsOpen() { + this.setState({ + isOpen: !this.state.isOpen + }); + } + + toggleExpand() { + this.setState({ + isExpanded: !this.state.isExpanded + }); + } + + renderResultsFooter() { + const { t } = this.props; + if (this.state.isExpanded) { + return t("search.viewLess", { name: this.props.search.searchProvider.name }); - }, - - render() { - const search = this.props.search; - const { isOpen, isExpanded } = this.state; - const searchProvider = search.searchProvider; - const locationSearchBoundingBox = - this.props.terria.configParameters.locationSearchBoundingBox; - - const validResults = isDefined(locationSearchBoundingBox) - ? search.results.filter(function (r) { - return ( - r.location.longitude > locationSearchBoundingBox[0] && - r.location.longitude < locationSearchBoundingBox[2] && - r.location.latitude > locationSearchBoundingBox[1] && - r.location.latitude < locationSearchBoundingBox[3] - ); - }) - : search.results; - - const results = - validResults.length > MAX_RESULTS_BEFORE_TRUNCATING - ? isExpanded - ? validResults - : validResults.slice(0, MAX_RESULTS_BEFORE_TRUNCATING) - : validResults; - - return ( -
    locationSearchBoundingBox[0] && + r.location.longitude < locationSearchBoundingBox[2] && + r.location.latitude > locationSearchBoundingBox[1] && + r.location.latitude < locationSearchBoundingBox[3] + ); + }) + : search.results; + + const results = + validResults.length > MAX_RESULTS_BEFORE_TRUNCATING + ? isExpanded + ? validResults + : validResults.slice(0, MAX_RESULTS_BEFORE_TRUNCATING) + : validResults; + + return ( +
    + this.toggleIsOpen()} > - {/* */} - + {`${search.searchProvider.name} (${validResults?.length})`} + + + + + +
      + {results.map((result, i) => ( + + ))} +
    + {isOpen && validResults.length > MAX_RESULTS_BEFORE_TRUNCATING && ( - {`${search.searchProvider.name} (${validResults?.length})`} - + this.toggleExpand()}> + + {this.renderResultsFooter()} + + -
    - - -
      - {results.map((result, i) => ( - - ))} -
    - {isOpen && validResults.length > MAX_RESULTS_BEFORE_TRUNCATING && ( - - - - {this.renderResultsFooter()} - - - - )} -
    -
    - ); - } - }) -); + )} + +
    + ); + } +} module.exports = withTranslation()(LocationSearchResults); diff --git a/lib/ReactViews/Search/SearchHeader.jsx b/lib/ReactViews/Search/SearchHeader.jsx index bbc5f03260c..4938076583a 100644 --- a/lib/ReactViews/Search/SearchHeader.jsx +++ b/lib/ReactViews/Search/SearchHeader.jsx @@ -1,39 +1,35 @@ import Loader from "../Loader"; import { observer } from "mobx-react"; import React from "react"; -import createReactClass from "create-react-class"; import PropTypes from "prop-types"; import Styles from "./search-header.scss"; /** Renders either a loader or a message based off search state. */ -export default observer( - createReactClass({ - displayName: "SearchHeader", +@observer +export default class extends React.Component { + static propTypes = { + searchResults: PropTypes.object.isRequired, + isWaitingForSearchToStart: PropTypes.bool + }; - propTypes: { - searchResults: PropTypes.object.isRequired, - isWaitingForSearchToStart: PropTypes.bool - }, - - render() { - if ( - this.props.searchResults.isSearching || - this.props.isWaitingForSearchToStart - ) { - return ( -
    - -
    - ); - } else if (this.props.searchResults.message) { - return ( -
    - {this.props.searchResults.message} -
    - ); - } else { - return null; - } + render() { + if ( + this.props.searchResults.isSearching || + this.props.isWaitingForSearchToStart + ) { + return ( +
    + +
    + ); + } else if (this.props.searchResults.message) { + return ( +
    + {this.props.searchResults.message} +
    + ); + } else { + return null; } - }) -); + } +} diff --git a/lib/ReactViews/Search/SideBarDatasetSearchResults.jsx b/lib/ReactViews/Search/SideBarDatasetSearchResults.jsx deleted file mode 100644 index d65ca0d9d5e..00000000000 --- a/lib/ReactViews/Search/SideBarDatasetSearchResults.jsx +++ /dev/null @@ -1,88 +0,0 @@ -import React from "react"; -import { runInAction } from "mobx"; -import { observer } from "mobx-react"; -import createReactClass from "create-react-class"; -import PropTypes from "prop-types"; -import SearchResult from "./SearchResult"; -import classNames from "classnames"; -import Icon from "../../Styled/Icon"; -import Styles from "./sidebar-dataset-search-results.scss"; -import { withTranslation } from "react-i18next"; - -const SideBarDatasetSearchResults = observer( - createReactClass({ - displayName: "SideBarDatasetSearchResults", - - propTypes: { - viewState: PropTypes.object.isRequired, - terria: PropTypes.object.isRequired, - theme: PropTypes.string, - t: PropTypes.func.isRequired - }, - - getDefaultProps() { - return { - theme: "light" - }; - }, - - getInitialState() { - return { - isOpen: true - }; - }, - - searchInDataCatalog() { - const { searchState } = this.props.viewState; - runInAction(() => { - // Set text here so that it doesn't get batched up and the catalog - // search text has a chance to set isWaitingToStartCatalogSearch - searchState.catalogSearchText = searchState.locationSearchText; - }); - this.props.viewState.searchInCatalog(searchState.locationSearchText); - }, - - toggleGroup() { - this.setState({ - isOpen: !this.state.isOpen - }); - }, - - render() { - const { t } = this.props; - return ( -
    - -
      - {this.props.viewState.searchState.catalogSearchProvider && ( - - )} -
    -
    - ); - } - }) -); - -module.exports = withTranslation()(SideBarDatasetSearchResults); diff --git a/lib/ReactViews/Search/SidebarSearch.jsx b/lib/ReactViews/Search/SidebarSearch.jsx deleted file mode 100644 index a593d133c2f..00000000000 --- a/lib/ReactViews/Search/SidebarSearch.jsx +++ /dev/null @@ -1,87 +0,0 @@ -import createReactClass from "create-react-class"; -import { observer } from "mobx-react"; -import PropTypes from "prop-types"; -import React from "react"; -import { withTranslation } from "react-i18next"; -import { addMarker } from "../../Models/LocationMarkerUtils"; -import BadgeBar from "../BadgeBar"; -import LocationSearchResults from "./LocationSearchResults"; -import SideBarDatasetSearchResults from "./SideBarDatasetSearchResults"; -import Styles from "./sidebar-search.scss"; -import { runInAction } from "mobx"; - -// Handle any of the three kinds of search based on the props -const SidebarSearch = observer( - createReactClass({ - displayName: "SidebarSearch", - - propTypes: { - viewState: PropTypes.object.isRequired, - isWaitingForSearchToStart: PropTypes.bool, - terria: PropTypes.object.isRequired, - t: PropTypes.func.isRequired - }, - - backToNowViewing() { - runInAction(() => { - this.props.viewState.searchState.showLocationSearchResults = false; - }); - }, - - onLocationClick(result) { - addMarker(this.props.terria, result); - result.clickAction(); - }, - - render() { - const { t } = this.props; - return ( -
    -
    - - - -
    - 0 - } - > - {/* TODO: Put this back once we add a MobX DataCatalogSearch Provider */} - {this.props.viewState.searchState.catalogSearchProvider && ( - - )} - - - - -
    -
    -
    - ); - } - }) -); - -module.exports = withTranslation()(SidebarSearch); diff --git a/lib/ReactViews/SidePanel/FullScreenButton.jsx b/lib/ReactViews/SidePanel/FullScreenButton.jsx index 91fb9427a08..7bff73db311 100644 --- a/lib/ReactViews/SidePanel/FullScreenButton.jsx +++ b/lib/ReactViews/SidePanel/FullScreenButton.jsx @@ -1,6 +1,5 @@ "use strict"; const React = require("react"); -const createReactClass = require("create-react-class"); const PropTypes = require("prop-types"); import classNames from "classnames"; import { observer } from "mobx-react"; @@ -12,99 +11,95 @@ import { withViewState } from "../StandardUserInterface/ViewStateContext"; import Styles from "./full_screen_button.scss"; // The button to make the map full screen and hide the workbench. -const FullScreenButton = observer( - createReactClass({ - displayName: "FullScreenButton", +@observer +class FullScreenButton extends React.Component { + static propTypes = { + viewState: PropTypes.object.isRequired, + btnText: PropTypes.string, + minified: PropTypes.bool, + animationDuration: PropTypes.number, // Defaults to 1 millisecond. + t: PropTypes.func.isRequired + }; - propTypes: { - viewState: PropTypes.object.isRequired, - btnText: PropTypes.string, - minified: PropTypes.bool, - animationDuration: PropTypes.number, // Defaults to 1 millisecond. - t: PropTypes.func.isRequired - }, + constructor(props) { + super(props); + this.state = { + isActive: false + }; + } - getInitialState() { - return { - isActive: false - }; - }, + toggleFullScreen() { + this.props.viewState.setIsMapFullScreen( + !this.props.viewState.isMapFullScreen + ); - toggleFullScreen() { - this.props.viewState.setIsMapFullScreen( - !this.props.viewState.isMapFullScreen - ); + // log a GA event + this.props.viewState.terria.analytics?.logEvent( + Category.view, + this.props.viewState.isMapFullScreen + ? ViewAction.exitFullScreen + : ViewAction.enterFullScreen + ); + } - // log a GA event - this.props.viewState.terria.analytics?.logEvent( - Category.view, - this.props.viewState.isMapFullScreen - ? ViewAction.exitFullScreen - : ViewAction.enterFullScreen - ); - }, - - renderButtonText() { - const btnText = this.props.btnText ? this.props.btnText : null; - if (this.props.minified) { - if (this.props.viewState.isMapFullScreen) { - return ; - } else { - return ; - } + renderButtonText() { + const btnText = this.props.btnText ? this.props.btnText : null; + if (this.props.minified) { + if (this.props.viewState.isMapFullScreen) { + return ; + } else { + return ; } - return ( - <> - {btnText} - - - ); - }, + } + return ( + <> + {btnText} + + + ); + } - render() { - const btnClassName = classNames(Styles.btn, { - [Styles.isActive]: this.props.viewState.isMapFullScreen, - [Styles.minified]: this.props.minified - }); - const { t } = this.props; - return ( -
    + {this.props.minified && ( + + )} + -
    - ); - } - }) -); + {this.renderButtonText()} + +
    + ); + } +} + export default withTranslation()( withViewState(withControlledVisibility(FullScreenButton)) ); diff --git a/lib/ReactViews/StandardUserInterface/MapColumn.jsx b/lib/ReactViews/StandardUserInterface/MapColumn.jsx index d16ab39c16b..1a7411ba12e 100644 --- a/lib/ReactViews/StandardUserInterface/MapColumn.jsx +++ b/lib/ReactViews/StandardUserInterface/MapColumn.jsx @@ -1,5 +1,4 @@ import classNames from "classnames"; -import createReactClass from "create-react-class"; import { observer } from "mobx-react"; import PropTypes from "prop-types"; import React from "react"; @@ -26,122 +25,118 @@ const chromeVersion = FeatureDetection.chromeVersion(); * Right-hand column that contains the map, controls that sit over the map and sometimes the bottom dock containing * the timeline and charts. */ -const MapColumn = observer( - createReactClass({ - displayName: "MapColumn", +@observer +class MapColumn extends React.Component { + static propTypes = { + viewState: PropTypes.object.isRequired, + customFeedbacks: PropTypes.array.isRequired, + allBaseMaps: PropTypes.array.isRequired, + animationDuration: PropTypes.number.isRequired, + customElements: PropTypes.object.isRequired, + t: PropTypes.func.isRequired + }; - propTypes: { - viewState: PropTypes.object.isRequired, - customFeedbacks: PropTypes.array.isRequired, - allBaseMaps: PropTypes.array.isRequired, - animationDuration: PropTypes.number.isRequired, - customElements: PropTypes.object.isRequired, - t: PropTypes.func.isRequired - }, + constructor(props) { + super(props); + this.state = {}; + } - getInitialState() { - return {}; - }, - - render() { - const { customElements } = this.props; - const { t } = this.props; - // TODO: remove? see: https://bugs.chromium.org/p/chromium/issues/detail?id=1001663 - const isAboveChrome75 = - chromeVersion && chromeVersion[0] && Number(chromeVersion[0]) > 75; - const mapCellClass = classNames(Styles.mapCell, { - [Styles.mapCellChrome]: isAboveChrome75 - }); - return ( -
    -
    -
    - -
    - - -
    -
    + render() { + const { customElements } = this.props; + const { t } = this.props; + // TODO: remove? see: https://bugs.chromium.org/p/chromium/issues/detail?id=1001663 + const isAboveChrome75 = + chromeVersion && chromeVersion[0] && Number(chromeVersion[0]) > 75; + const mapCellClass = classNames(Styles.mapCell, { + [Styles.mapCellChrome]: isAboveChrome75 + }); + return ( +
    +
    +
    +
    - +
    - - +
    + +
    + + + + + + + + + +
    + - - - - - - - -
    - - -
    - - {/* TODO: re-implement/support custom feedbacks */} - {/* +
    +
    + {/* TODO: re-implement/support custom feedbacks */} + {/* */} - - -
    {feedbackItem}
    -
    -
    -
    - + +
    {feedbackItem}
    +
    - - - ); - } - }) -); + +
    +
    + +
    +
    +
    +
    + ); + } +} export default withTranslation()(withViewState(MapColumn)); diff --git a/lib/ReactViews/Workbench/Controls/FilterSection.jsx b/lib/ReactViews/Workbench/Controls/FilterSection.jsx index 62cb2ace8cc..fba03c9f955 100644 --- a/lib/ReactViews/Workbench/Controls/FilterSection.jsx +++ b/lib/ReactViews/Workbench/Controls/FilterSection.jsx @@ -1,4 +1,3 @@ -import createReactClass from "create-react-class"; import { runInAction } from "mobx"; import { observer } from "mobx-react"; import PropTypes from "prop-types"; @@ -7,13 +6,12 @@ import React from "react"; import CommonStrata from "../../../Models/Definition/CommonStrata"; import Styles from "./filter-section.scss"; -const FilterSection = observer( - createReactClass({ - displayName: "FilterSection", +@observer +class FilterSection extends React.Component { - propTypes: { + static propTypes = { item: PropTypes.object.isRequired - }, + } change(filter, values) { runInAction(() => { @@ -21,7 +19,7 @@ const FilterSection = observer( filter.setTrait(CommonStrata.user, "maximumShown", values[1]); }); this.props.item.terria.currentViewer.notifyRepaintRequired(); - }, + } render() { const item = this.props.item; @@ -33,7 +31,7 @@ const FilterSection = observer( {item.filters.map(this.renderFilter)}
    ); - }, + } renderFilter(filter) { const values = [filter.minimumShown, filter.maximumShown]; @@ -52,7 +50,6 @@ const FilterSection = observer(
    ); } - }) -); +} export default FilterSection; diff --git a/lib/ReactViews/Workbench/Controls/SatelliteImageryTimeFilterSection.jsx b/lib/ReactViews/Workbench/Controls/SatelliteImageryTimeFilterSection.jsx index b05204cd449..cc8742e98d8 100644 --- a/lib/ReactViews/Workbench/Controls/SatelliteImageryTimeFilterSection.jsx +++ b/lib/ReactViews/Workbench/Controls/SatelliteImageryTimeFilterSection.jsx @@ -1,4 +1,3 @@ -import createReactClass from "create-react-class"; import PropTypes from "prop-types"; import React from "react"; import defined from "terriajs-cesium/Source/Core/defined"; @@ -13,18 +12,17 @@ import { runInAction, reaction } from "mobx"; import Styles from "./satellite-imagery-time-filter-section.scss"; -const SatelliteImageryTimeFilterSection = observer( - createReactClass({ - displayName: "SatelliteImageryTimeFilterSection", +@observer +class SatelliteImageryTimeFilterSection extends React.Component { - propTypes: { + static propTypes = { item: PropTypes.object, t: PropTypes.func.isRequired - }, + } removeFilter() { this.props.item.removeTimeFilterFeature(); - }, + } zoomTo() { const feature = this.props.item.timeFilterFeature; @@ -43,7 +41,7 @@ const SatelliteImageryTimeFilterSection = observer( ) ); } - }, + } newLocation() { const { t } = this.props; @@ -106,7 +104,7 @@ const SatelliteImageryTimeFilterSection = observer( disposer(); } ); - }, + } render() { if (!this.props.item.canFilterTimeByFeature) { @@ -119,20 +117,20 @@ const SatelliteImageryTimeFilterSection = observer( } else { return this.renderFeatureSelected(feature); } - }, + } renderNoFeatureSelected() { const { t } = this.props; return (
    -
    ); - }, + } renderFeatureSelected(feature) { const { t } = this.props; @@ -154,20 +152,19 @@ const SatelliteImageryTimeFilterSection = observer(
    - - -
    ); } - }) -); +} export default withTranslation()(SatelliteImageryTimeFilterSection); diff --git a/lib/ReactViews/Workbench/Controls/TimerSection.jsx b/lib/ReactViews/Workbench/Controls/TimerSection.jsx index 64c042a7ec2..15f638b0a56 100644 --- a/lib/ReactViews/Workbench/Controls/TimerSection.jsx +++ b/lib/ReactViews/Workbench/Controls/TimerSection.jsx @@ -1,140 +1,137 @@ import React from "react"; import PropTypes from "prop-types"; import { observer } from "mobx-react"; -import createReactClass from "create-react-class"; import defined from "terriajs-cesium/Source/Core/defined"; import Timer from "../../Generic/Timer/Timer"; import { withTranslation } from "react-i18next"; import Styles from "./timer-section.scss"; -const TimerSection = observer( - createReactClass({ - displayName: "TimerSection", - - propTypes: { - item: PropTypes.object.isRequired, - t: PropTypes.func.isRequired - }, - - isEnabled() { - return ( - defined(this.props.item) && - this.props.item.isPolling && - defined(this.props.item.nextScheduledUpdateTime) && - this.props.item.refreshInterval < 30 * 60 * 1000 // only show refresh timer for refresh intervals less than 30 minutes - ); - }, - - getInitialState() { - return { - secondsLeft: 0 - }; - }, - - getCountdownDuration() { - // How many seconds until our next update? - return Math.round( - (this.props.item.nextScheduledUpdateTime.getTime() - - new Date().getTime()) / - 1000 - ); - }, - - getTimerStartTime() { - return new Date( - this.props.item.nextScheduledUpdateTime - - this.props.item.refreshInterval * 1000 - ); - }, - - // Ticks down the countdown clock - countdown() { - if (this.state.secondsLeft > 0) { - this.setState(() => { - return { - secondsLeft: this.state.secondsLeft - 1 - }; - }); - } else { - // Stop. - clearInterval(this.interval); - } - }, - - startCountdown() { - this.setState({ - secondsLeft: this.getCountdownDuration() +@observer +class TimerSection extends React.Component { + static propTypes = { + item: PropTypes.object.isRequired, + t: PropTypes.func.isRequired + }; + + constructor(props) { + super(props); + this.state = { + secondsLeft: 0 + }; + } + + isEnabled() { + return ( + defined(this.props.item) && + this.props.item.isPolling && + defined(this.props.item.nextScheduledUpdateTime) && + this.props.item.refreshInterval < 30 * 60 * 1000 // only show refresh timer for refresh intervals less than 30 minutes + ); + } + + getCountdownDuration() { + // How many seconds until our next update? + return Math.round( + (this.props.item.nextScheduledUpdateTime.getTime() - + new Date().getTime()) / + 1000 + ); + } + + getTimerStartTime() { + return new Date( + this.props.item.nextScheduledUpdateTime - + this.props.item.refreshInterval * 1000 + ); + } + + // Ticks down the countdown clock + countdown() { + if (this.state.secondsLeft > 0) { + this.setState(() => { + return { + secondsLeft: this.state.secondsLeft - 1 + }; }); - this.interval = setInterval(this.countdown, 1000); - }, + } else { + // Stop. + clearInterval(this.interval); + } + } - getCountdownString() { - const date = new Date(null); - date.setSeconds(this.state.secondsLeft); + startCountdown() { + this.setState({ + secondsLeft: this.getCountdownDuration() + }); + this.interval = setInterval(this.countdown, 1000); + } - const addLeadingZeroIfRequired = (numString) => - numString.length < 2 ? "0" + numString : numString; + getCountdownString() { + const date = new Date(null); + date.setSeconds(this.state.secondsLeft); - const minutes = addLeadingZeroIfRequired(date.getMinutes().toString()); - const seconds = addLeadingZeroIfRequired(date.getSeconds().toString()); + const addLeadingZeroIfRequired = (numString) => + numString.length < 2 ? "0" + numString : numString; - return `00:${minutes}:${seconds}`; - }, + const minutes = addLeadingZeroIfRequired(date.getMinutes().toString()); + const seconds = addLeadingZeroIfRequired(date.getSeconds().toString()); - componentDidUpdate() { - if (!this.isEnabled()) { - return; - } + return `00:${minutes}:${seconds}`; + } - if (this.nextUpdate !== this.props.item.nextScheduledUpdateTime) { - if (defined(this.interval)) { - clearInterval(this.interval); - } - this.startCountdown(); - this.nextUpdate = this.props.item.nextScheduledUpdateTime; - } - }, + componentDidUpdate() { + if (!this.isEnabled()) { + return; + } - componentDidMount() { - if (!this.isEnabled()) { - return; + if (this.nextUpdate !== this.props.item.nextScheduledUpdateTime) { + if (defined(this.interval)) { + clearInterval(this.interval); } - this.startCountdown(); - }, + this.nextUpdate = this.props.item.nextScheduledUpdateTime; + } + } - componentWillUnmount() { - clearInterval(this.interval); - }, - - render() { - const { t } = this.props; - return ( - <> - -
    -
    - -
    - - {t("timer.nextScheduledUpdateCountdown", { - timeCountdown: this.getCountdownString() + componentDidMount() { + if (!this.isEnabled()) { + return; + } + + this.startCountdown(); + } + + componentWillUnmount() { + clearInterval(this.interval); + } + + render() { + const { t } = this.props; + return ( + <> + +
    +
    + + radius={10} + start={this.getTimerStartTime().getTime()} + stop={this.props.item.nextScheduledUpdateTime.getTime()} + />
    - - - ); - } - }) -); + + {t("timer.nextScheduledUpdateCountdown", { + timeCountdown: this.getCountdownString() + })} + +
    +
    + + ); + } +} export default withTranslation()(TimerSection); From 7292095dbec1356eb67523a0c87a44058b88ae8c Mon Sep 17 00:00:00 2001 From: Nanda Date: Fri, 27 Jan 2023 15:39:02 +1100 Subject: [PATCH 066/654] Fix crash when picking vector features. --- lib/Models/Cesium.ts | 4 +++- lib/ReactViews/FeatureInfo/FeatureInfoSection.tsx | 14 ++++++++++++-- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/lib/Models/Cesium.ts b/lib/Models/Cesium.ts index ca53fa65670..aa1c2043abd 100644 --- a/lib/Models/Cesium.ts +++ b/lib/Models/Cesium.ts @@ -1,13 +1,14 @@ import i18next from "i18next"; import { isEqual } from "lodash-es"; import { + action, autorun, computed, IObservableArray, + makeObservable, observable, reaction, runInAction, - makeObservable, toJS } from "mobx"; import { computedFn } from "mobx-utils"; @@ -1190,6 +1191,7 @@ export default class Cesium extends GlobeOrMap { * specified and set terria.pickedFeatures based on this. * */ + @action pickFromScreenPosition(screenPosition: Cartesian2, ignoreSplitter: boolean) { const pickRay = this.scene.camera.getPickRay(screenPosition); const pickPosition = isDefined(pickRay) diff --git a/lib/ReactViews/FeatureInfo/FeatureInfoSection.tsx b/lib/ReactViews/FeatureInfo/FeatureInfoSection.tsx index a4657306781..6823ac60f62 100644 --- a/lib/ReactViews/FeatureInfo/FeatureInfoSection.tsx +++ b/lib/ReactViews/FeatureInfo/FeatureInfoSection.tsx @@ -1,7 +1,15 @@ import classNames from "classnames"; import { TFunction } from "i18next"; import { isEmpty, merge } from "lodash-es"; -import { action, computed, observable, reaction, runInAction, makeObservable } from "mobx"; +import { + action, + computed, + makeObservable, + observable, + reaction, + runInAction, + toJS +} from "mobx"; import { observer } from "mobx-react"; import { IDisposer } from "mobx-utils"; import Mustache from "mustache"; @@ -477,7 +485,9 @@ export class FeatureInfoSection extends React.Component { ) : ( // Show templated feature info - this.templatedFeatureInfoReactNode + // Calling toJS() because when passing a parsed node to react, + // it calls Object.freeze() on some values which triggers an error from mobx6 + toJS(this.templatedFeatureInfoReactNode) )} { // Show FeatureInfoDownload From 4c22dd3ef1c500dbb2992a1cecc0db0a2454b0fd Mon Sep 17 00:00:00 2001 From: Nanda Date: Fri, 27 Jan 2023 15:44:09 +1100 Subject: [PATCH 067/654] Run prettier. --- lib/ReactViews/DataCatalog/DataCatalog.jsx | 106 ++-- lib/ReactViews/Mobile/MobileModalWindow.jsx | 218 ++++---- lib/ReactViews/Mobile/MobileSearch.jsx | 143 +++--- lib/ReactViews/Preview/DataPreview.jsx | 228 +++++---- .../Preview/DataPreviewSections.jsx | 167 ++++--- lib/ReactViews/Preview/Description.jsx | 465 +++++++++--------- lib/ReactViews/Preview/GroupPreview.jsx | 160 +++--- .../Workbench/Controls/FilterSection.jsx | 75 ++- .../SatelliteImageryTimeFilterSection.jsx | 277 ++++++----- 9 files changed, 911 insertions(+), 928 deletions(-) diff --git a/lib/ReactViews/DataCatalog/DataCatalog.jsx b/lib/ReactViews/DataCatalog/DataCatalog.jsx index 0b6c4138c91..735cc20a62a 100644 --- a/lib/ReactViews/DataCatalog/DataCatalog.jsx +++ b/lib/ReactViews/DataCatalog/DataCatalog.jsx @@ -1,7 +1,6 @@ import React from "react"; import { observer } from "mobx-react"; - import PropTypes from "prop-types"; import { withTranslation } from "react-i18next"; @@ -15,62 +14,61 @@ import Styles from "./data-catalog.scss"; // Displays the data catalog. @observer export class DataCatalog extends React.Component { + static propTypes = { + terria: PropTypes.object, + viewState: PropTypes.object, + items: PropTypes.array, + onActionButtonClicked: PropTypes.func, + removable: PropTypes.bool, + t: PropTypes.func.isRequired + }; - static propTypes = { - terria: PropTypes.object, - viewState: PropTypes.object, - items: PropTypes.array, - onActionButtonClicked: PropTypes.func, - removable: PropTypes.bool, - t: PropTypes.func.isRequired - } - - render() { - const searchState = this.props.viewState.searchState; - const isSearching = searchState.catalogSearchText.length > 0; - const catalogSearchProvider = searchState.catalogSearchProvider; - const unfilteredItems = - isSearching && - catalogSearchProvider && - searchState.catalogSearchResults?.results - ? searchState.catalogSearchResults.results.map( - (result) => result.catalogItem - ) - : this.props.items; - const items = (unfilteredItems || []).filter(defined); - const { t } = this.props; - return ( -
      - - - 0; + const catalogSearchProvider = searchState.catalogSearchProvider; + const unfilteredItems = + isSearching && + catalogSearchProvider && + searchState.catalogSearchResults?.results + ? searchState.catalogSearchResults.results.map( + (result) => result.catalogItem + ) + : this.props.items; + const items = (unfilteredItems || []).filter(defined); + const { t } = this.props; + return ( +
        + + + + + + {item !== this.props.terria.catalog.userAddedDataGroup && ( + - - - {item !== this.props.terria.catalog.userAddedDataGroup && ( - - )} - -
      - ); - } + )} + +
    + ); + } } export default withTranslation()(DataCatalog); diff --git a/lib/ReactViews/Mobile/MobileModalWindow.jsx b/lib/ReactViews/Mobile/MobileModalWindow.jsx index 66449fb79c0..0ebdfc60340 100644 --- a/lib/ReactViews/Mobile/MobileModalWindow.jsx +++ b/lib/ReactViews/Mobile/MobileModalWindow.jsx @@ -14,138 +14,136 @@ import MobileSearch from "./MobileSearch"; @observer class MobileModalWindow extends React.Component { + static propTypes = { + terria: PropTypes.object, + viewState: PropTypes.object.isRequired, + t: PropTypes.func.isRequired + }; - static propTypes = { - terria: PropTypes.object, - viewState: PropTypes.object.isRequired, - t: PropTypes.func.isRequired - } + renderModalContent() { + const viewState = this.props.viewState; + const searchState = viewState.searchState; - renderModalContent() { - const viewState = this.props.viewState; - const searchState = viewState.searchState; + if ( + viewState.mobileView !== viewState.mobileViewOptions.data && + viewState.mobileView !== viewState.mobileViewOptions.preview && + searchState.showMobileLocationSearch && + searchState.locationSearchText.length > 0 + ) { + return ( + + ); + } - if ( - viewState.mobileView !== viewState.mobileViewOptions.data && - viewState.mobileView !== viewState.mobileViewOptions.preview && - searchState.showMobileLocationSearch && - searchState.locationSearchText.length > 0 - ) { + switch (viewState.mobileView) { + case viewState.mobileViewOptions.data: + // No multiple catalogue tabs in mobile return ( - ); - } - - switch (viewState.mobileView) { - case viewState.mobileViewOptions.data: - // No multiple catalogue tabs in mobile - return ( - - ); - case viewState.mobileViewOptions.preview: - return ( - - ); - case viewState.mobileViewOptions.nowViewing: - return ( - - ); - default: - return null; - } + case viewState.mobileViewOptions.preview: + return ( + + ); + case viewState.mobileViewOptions.nowViewing: + return ( + + ); + default: + return null; } + } + + onClearMobileUI() { + runInAction(() => { + this.props.viewState.switchMobileView(null); + this.props.viewState.explorerPanelIsVisible = false; + this.props.viewState.searchState.showMobileLocationSearch = false; + this.props.viewState.searchState.showMobileCatalogSearch = false; + this.props.viewState.searchState.catalogSearchText = ""; + }); + } - onClearMobileUI() { + /* eslint-disable-next-line camelcase */ + UNSAFE_componentWillReceiveProps() { + const numItems = this.props.terria.workbench.items.length; + if ( + (numItems === undefined || numItems === 0) && + this.props.viewState.mobileView === + this.props.viewState.mobileViewOptions.nowViewing + ) { runInAction(() => { this.props.viewState.switchMobileView(null); this.props.viewState.explorerPanelIsVisible = false; - this.props.viewState.searchState.showMobileLocationSearch = false; - this.props.viewState.searchState.showMobileCatalogSearch = false; - this.props.viewState.searchState.catalogSearchText = ""; }); } + } - /* eslint-disable-next-line camelcase */ - UNSAFE_componentWillReceiveProps() { - const numItems = this.props.terria.workbench.items.length; - if ( - (numItems === undefined || numItems === 0) && - this.props.viewState.mobileView === - this.props.viewState.mobileViewOptions.nowViewing - ) { - runInAction(() => { - this.props.viewState.switchMobileView(null); - this.props.viewState.explorerPanelIsVisible = false; - }); - } - } + goBack() { + this.props.viewState.switchMobileView( + this.props.viewState.mobileViewOptions.data + ); + } - goBack() { - this.props.viewState.switchMobileView( - this.props.viewState.mobileViewOptions.data - ); - } - - render() { - const modalClass = classNames(Styles.mobileModal, { - [Styles.isOpen]: - this.props.viewState.explorerPanelIsVisible && - this.props.viewState.mobileView - }); - const mobileView = this.props.viewState.mobileView; - const { t } = this.props; + render() { + const modalClass = classNames(Styles.mobileModal, { + [Styles.isOpen]: + this.props.viewState.explorerPanelIsVisible && + this.props.viewState.mobileView + }); + const mobileView = this.props.viewState.mobileView; + const { t } = this.props; - return ( -
    - -
    - - - + return ( +
    + +
    + -
    + + +
    - {this.renderModalContent()} - -
    - ); - } + {this.renderModalContent()} +
    +
    + ); + } } module.exports = withTranslation()(MobileModalWindow); diff --git a/lib/ReactViews/Mobile/MobileSearch.jsx b/lib/ReactViews/Mobile/MobileSearch.jsx index b0b79a1afce..66b7c122076 100644 --- a/lib/ReactViews/Mobile/MobileSearch.jsx +++ b/lib/ReactViews/Mobile/MobileSearch.jsx @@ -13,86 +13,85 @@ import Styles from "./mobile-search.scss"; // A Location item when doing Bing map searvh or Gazetter search @observer class MobileSearch extends React.Component { + static propTypes = { + viewState: PropTypes.object, + terria: PropTypes.object, + t: PropTypes.func.isRequired + }; - static propTypes = { - viewState: PropTypes.object, - terria: PropTypes.object, - t: PropTypes.func.isRequired - } + onLocationClick(result) { + runInAction(() => { + result.clickAction(); - onLocationClick(result) { - runInAction(() => { - result.clickAction(); + addMarker(this.props.terria, result); - addMarker(this.props.terria, result); + // Close modal window + this.props.viewState.switchMobileView(null); + this.props.viewState.searchState.showMobileLocationSearch = false; + }); + } - // Close modal window - this.props.viewState.switchMobileView(null); - this.props.viewState.searchState.showMobileLocationSearch = false; - }); - } + searchInDataCatalog() { + const { searchState } = this.props.viewState; + runInAction(() => { + // Set text here so that it doesn't get batched up and the catalog + // search text has a chance to set isWaitingToStartCatalogSearch + searchState.catalogSearchText = searchState.locationSearchText; + }); + this.props.viewState.searchInCatalog(searchState.locationSearchText); + } - searchInDataCatalog() { - const { searchState } = this.props.viewState; - runInAction(() => { - // Set text here so that it doesn't get batched up and the catalog - // search text has a chance to set isWaitingToStartCatalogSearch - searchState.catalogSearchText = searchState.locationSearchText; - }); - this.props.viewState.searchInCatalog(searchState.locationSearchText); - } - - render() { - const theme = "light"; - return ( -
    -
    {this.renderSearchInCatalogLink(theme)}
    -
    - {this.renderLocationResult(theme)} -
    + render() { + const theme = "light"; + return ( +
    +
    {this.renderSearchInCatalogLink(theme)}
    +
    + {this.renderLocationResult(theme)}
    - ); - } +
    + ); + } - renderSearchInCatalogLink(theme) { - const { t } = this.props; - const searchState = this.props.viewState.searchState; - return ( - 0}> -
    -
      - {searchState.catalogSearchProvider && ( - this.searchInDataCatalog()} - icon={null} - locationSearchText={searchState.locationSearchText} - name={t("search.search", { - searchText: searchState.locationSearchText - })} - searchResultTheme={theme} - /> - )} -
    -
    -
    - ); - } + renderSearchInCatalogLink(theme) { + const { t } = this.props; + const searchState = this.props.viewState.searchState; + return ( + 0}> +
    +
      + {searchState.catalogSearchProvider && ( + this.searchInDataCatalog()} + icon={null} + locationSearchText={searchState.locationSearchText} + name={t("search.search", { + searchText: searchState.locationSearchText + })} + searchResultTheme={theme} + /> + )} +
    +
    +
    + ); + } - renderLocationResult(theme) { - const searchState = this.props.viewState.searchState; - return searchState.locationSearchResults.map((search) => ( - - )); - } + renderLocationResult(theme) { + const searchState = this.props.viewState.searchState; + return searchState.locationSearchResults.map((search) => ( + + )); + } } module.exports = withTranslation()(MobileSearch); diff --git a/lib/ReactViews/Preview/DataPreview.jsx b/lib/ReactViews/Preview/DataPreview.jsx index a39a8ec7f5d..c86c45a29c0 100644 --- a/lib/ReactViews/Preview/DataPreview.jsx +++ b/lib/ReactViews/Preview/DataPreview.jsx @@ -20,141 +20,137 @@ import WarningBox from "./WarningBox"; */ @observer class DataPreview extends React.Component { + static propTypes = { + terria: PropTypes.object.isRequired, + viewState: PropTypes.object, + previewed: PropTypes.object, + t: PropTypes.func.isRequired + }; - static propTypes = { - terria: PropTypes.object.isRequired, - viewState: PropTypes.object, - previewed: PropTypes.object, - t: PropTypes.func.isRequired - } - - backToMap() { - runInAction(() => { - this.props.viewState.explorerPanelIsVisible = false; - }); - } + backToMap() { + runInAction(() => { + this.props.viewState.explorerPanelIsVisible = false; + }); + } - render() { - const { t } = this.props; - let previewed = this.props.previewed; - if (previewed !== undefined && ReferenceMixin.isMixedInto(previewed)) { - // We are loading the nested target because we could be dealing with a nested reference here - if (previewed.nestedTarget === undefined) { - // Reference is not available yet. - return this.renderUnloadedReference(); - } - previewed = previewed.nestedTarget; + render() { + const { t } = this.props; + let previewed = this.props.previewed; + if (previewed !== undefined && ReferenceMixin.isMixedInto(previewed)) { + // We are loading the nested target because we could be dealing with a nested reference here + if (previewed.nestedTarget === undefined) { + // Reference is not available yet. + return this.renderUnloadedReference(); } + previewed = previewed.nestedTarget; + } - let chartData; - if (previewed && !previewed.isMappable && previewed.tableStructure) { - chartData = previewed.chartData(); - } + let chartData; + if (previewed && !previewed.isMappable && previewed.tableStructure) { + chartData = previewed.chartData(); + } - return ( -
    - - -
    -

    {previewed.name}

    - -
    -
    - -
    - -
    -
    - -
    -

    {previewed.name}

    -

    {t("preview.doesNotContainGeospatialData")}

    -
    - {/* TODO: Show a preview chart + return ( +
    + + +
    +

    {previewed.name}

    + +
    +
    + +
    + +
    +
    + +
    +

    {previewed.name}

    +

    {t("preview.doesNotContainGeospatialData")}

    +
    + {/* TODO: Show a preview chart */} -
    -
    -
    - - +
    + + + + + +
    + - - -
    - -
    -
    - -
    - -

    Select a dataset to see a preview

    -

    - OR -

    - -
    -
    -
    - -
    - ); - } +
    + + +
    + +

    Select a dataset to see a preview

    +

    - OR -

    + +
    +
    +
    + +
    + ); + } - renderUnloadedReference() { - const isLoading = this.props.previewed.isLoadingReference; - const hasTarget = this.props.previewed.target !== undefined; - return ( -
    -
    - {isLoading && } - {!isLoading && !hasTarget && ( - <> -
    -

    Unable to resolve reference

    - {!this.props.previewed.loadReferenceResult?.error ? ( -

    - This reference could not be resolved because it is invalid - or because it points to something that cannot be - visualised. -

    - ) : null} -
    - {this.props.previewed.loadReferenceResult?.error ? ( - + renderUnloadedReference() { + const isLoading = this.props.previewed.isLoadingReference; + const hasTarget = this.props.previewed.target !== undefined; + return ( +
    +
    + {isLoading && } + {!isLoading && !hasTarget && ( + <> +
    +

    Unable to resolve reference

    + {!this.props.previewed.loadReferenceResult?.error ? ( +

    + This reference could not be resolved because it is invalid + or because it points to something that cannot be visualised. +

    ) : null} - - )} -
    +
    + {this.props.previewed.loadReferenceResult?.error ? ( + + ) : null} + + )}
    - ); - } +
    + ); + } } module.exports = withTranslation()(DataPreview); diff --git a/lib/ReactViews/Preview/DataPreviewSections.jsx b/lib/ReactViews/Preview/DataPreviewSections.jsx index 17d1de697c0..d9a1fe6585b 100644 --- a/lib/ReactViews/Preview/DataPreviewSections.jsx +++ b/lib/ReactViews/Preview/DataPreviewSections.jsx @@ -25,99 +25,98 @@ Mustache.escape = function (string) { */ @observer class DataPreviewSections extends React.Component { + static propTypes = { + metadataItem: PropTypes.object.isRequired, + t: PropTypes.func.isRequired + }; - static propTypes = { - metadataItem: PropTypes.object.isRequired, - t: PropTypes.func.isRequired - } - - sortInfoSections(items) { - const infoSectionOrder = this.props.metadataItem.infoSectionOrder; + sortInfoSections(items) { + const infoSectionOrder = this.props.metadataItem.infoSectionOrder; - items.sort(function (a, b) { - const aIndex = infoSectionOrder.indexOf(a.name); - const bIndex = infoSectionOrder.indexOf(b.name); - if (aIndex >= 0 && bIndex < 0) { - return -1; - } else if (aIndex < 0 && bIndex >= 0) { - return 1; - } else if (aIndex < 0 && bIndex < 0) { - return naturalSort(a.name, b.name); - } - return aIndex - bIndex; - }); + items.sort(function (a, b) { + const aIndex = infoSectionOrder.indexOf(a.name); + const bIndex = infoSectionOrder.indexOf(b.name); + if (aIndex >= 0 && bIndex < 0) { + return -1; + } else if (aIndex < 0 && bIndex >= 0) { + return 1; + } else if (aIndex < 0 && bIndex < 0) { + return naturalSort(a.name, b.name); + } + return aIndex - bIndex; + }); - return items.filter( - (item) => - isDefined(item.content ?? item.contentAsObject) && - (item.content ?? item.contentAsObject) !== null && - item.content !== "" - ); - } + return items.filter( + (item) => + isDefined(item.content ?? item.contentAsObject) && + (item.content ?? item.contentAsObject) !== null && + item.content !== "" + ); + } - clickInfoSection(reportName, isOpen) { - const info = this.props.metadataItem.info; - const clickedInfo = info.find((report) => report.name === reportName); + clickInfoSection(reportName, isOpen) { + const info = this.props.metadataItem.info; + const clickedInfo = info.find((report) => report.name === reportName); - if (isDefined(clickedInfo)) { - runInAction(() => { - clickedInfo.setTrait(CommonStrata.user, "show", isOpen); - }); - } - return false; + if (isDefined(clickedInfo)) { + runInAction(() => { + clickedInfo.setTrait(CommonStrata.user, "show", isOpen); + }); } + return false; + } - render() { - const metadataItem = this.props.metadataItem; - const items = metadataItem.hideSource - ? metadataItem.infoWithoutSources - : metadataItem.info.slice(); + render() { + const metadataItem = this.props.metadataItem; + const items = metadataItem.hideSource + ? metadataItem.infoWithoutSources + : metadataItem.info.slice(); - const renderSection = (item) => { - let content = item.content; - try { - content = Mustache.render(content, metadataItem); - } catch (error) { - console.log( - `FAILED to parse info section ${item.name} for ${metadataItem.name}` - ); - console.log(error); - } - return parseCustomMarkdownToReact(content, { - catalogItem: metadataItem - }); - }; + const renderSection = (item) => { + let content = item.content; + try { + content = Mustache.render(content, metadataItem); + } catch (error) { + console.log( + `FAILED to parse info section ${item.name} for ${metadataItem.name}` + ); + console.log(error); + } + return parseCustomMarkdownToReact(content, { + catalogItem: metadataItem + }); + }; - return ( -
    - - - - this.clickInfoSection.bind(this, item.name, show)() - } - bodyTextProps={{ medium: true }} - > - - 0}> - {renderSection(item)} - - - - - - - - - - -
    - ); - } + return ( +
    + + + + this.clickInfoSection.bind(this, item.name, show)() + } + bodyTextProps={{ medium: true }} + > + + 0}> + {renderSection(item)} + + + + + + + + + + +
    + ); + } } export default withTranslation()(DataPreviewSections); diff --git a/lib/ReactViews/Preview/Description.jsx b/lib/ReactViews/Preview/Description.jsx index 638aee8c68d..2b2430fa191 100644 --- a/lib/ReactViews/Preview/Description.jsx +++ b/lib/ReactViews/Preview/Description.jsx @@ -18,190 +18,187 @@ import WarningBox from "./WarningBox"; */ @observer class Description extends React.Component { + static propTypes = { + item: PropTypes.object.isRequired, + printView: PropTypes.bool, + t: PropTypes.func.isRequired + }; - static propTypes = { - item: PropTypes.object.isRequired, - printView: PropTypes.bool, - t: PropTypes.func.isRequired - } + render() { + const { t } = this.props; + const catalogItem = this.props.item; - render() { - const { t } = this.props; - const catalogItem = this.props.item; + // Make sure all data and metadata URLs have `url` set + const metadataUrls = catalogItem.metadataUrls?.filter((m) => m.url); + const dataUrls = catalogItem.dataUrls?.filter((m) => m.url); - // Make sure all data and metadata URLs have `url` set - const metadataUrls = catalogItem.metadataUrls?.filter((m) => m.url); - const dataUrls = catalogItem.dataUrls?.filter((m) => m.url); + return ( +
    p.theme.colorPrimary}; + } + `} + > + + {t("preview.mayBeExperiencingIssues")} + - return ( -
    p.theme.colorPrimary}; - } - `} + 0 + } > - - {t("preview.mayBeExperiencingIssues")} - +
    +

    {t("description.name")}

    + {parseCustomMarkdownToReact(catalogItem.description, { + catalogItem: catalogItem + })} +
    +
    - 0 - } - > -
    -

    {t("description.name")}

    - {parseCustomMarkdownToReact(catalogItem.description, { - catalogItem: catalogItem - })} -
    -
    + +

    {t("description.dataLocal")}

    +
    - -

    {t("description.dataLocal")}

    -
    + +

    {t("description.dataNotLocal")}

    +
    - -

    {t("description.dataNotLocal")}

    -
    + 0}> +

    {t("description.metadataUrls")}

    + + + p.theme.colorPrimary}; + `} + > + + + + {metadataUrl.url} + + + +
    - 0}> -

    {t("description.metadataUrls")}

    - - - p.theme.colorPrimary}; - `} - > - - - - {metadataUrl.url} - - - -
    + - + 0 + } + > +
    +

    {t("description.dataCustodian")}

    + {parseCustomMarkdownToReact(catalogItem.dataCustodian, { + catalogItem: catalogItem + })} +
    +
    - 0 - } - > -
    -

    {t("description.dataCustodian")}

    - {parseCustomMarkdownToReact(catalogItem.dataCustodian, { - catalogItem: catalogItem - })} -
    -
    + + +

    {catalogItem.typeName} URL

    + + +

    + + This is a + + WMS service + + , which generates map images on request. It can be used in + GIS software with this URL: + +

    +
    + +

    + + This is a + + WFS service + + , which transfers raw spatial data on request. It can be + used in GIS software with this URL: + +

    +
    +
    - - -

    {catalogItem.typeName} URL

    - - -

    - - This is a - - WMS service - - , which generates map images on request. It can be used in - GIS software with this URL: - -

    -
    - -

    - - This is a - - WFS service - - , which transfers raw spatial data on request. It can be - used in GIS software with this URL: - -

    -
    -
    + + + {catalogItem.url} + + + e.target.select()} + /> + + - - - {catalogItem.url} - - - e.target.select()} - /> - - + + +

    + {t("description.layerName")} + {(catalogItem.layers || "").split(",").length > 1 ? "s" : ""}:{" "} + {catalogItem.layers} +

    +
    + +

    + {t("description.typeName")} + {(catalogItem.typeNames || "").split(",").length > 1 + ? "s" + : ""} + : {catalogItem.typeNames} +

    +
    +
    +
    + 0}> +

    {t("description.dataUrl")}

    + -

    - {t("description.layerName")} - {(catalogItem.layers || "").split(",").length > 1 - ? "s" - : ""} - : {catalogItem.layers} -

    -
    - -

    - {t("description.typeName")} - {(catalogItem.typeNames || "").split(",").length > 1 - ? "s" - : ""} - : {catalogItem.typeNames} -

    -
    -
    -
    - - 0}> -

    {t("description.dataUrl")}

    - - - - {dataUrl.type?.startsWith("wfs") && - parseCustomMarkdownToReact( - t("description.useLinkBelow", { - link: ` + {dataUrl.type?.startsWith("wfs") && + parseCustomMarkdownToReact( + t("description.useLinkBelow", { + link: ` ` - }) - )} - {dataUrl.type?.startsWith("wcs") && - parseCustomMarkdownToReact( - t("description.useLinkBelow", { - link: ` + }) + )} + {dataUrl.type?.startsWith("wcs") && + parseCustomMarkdownToReact( + t("description.useLinkBelow", { + link: ` ` - }) - )} - - - - p.theme.colorPrimary}; - `} - > - - - - {dataUrl.url} - - - -
    + }) + )} + + + + p.theme.colorPrimary}; + `} + > + + + + {dataUrl.url} + + + +
    + 0 + } > - 0 - } - > -
    - - - -
    -
    - 0 - } - > -
    - - - -
    -
    +
    + + + +
    +
    + 0 + } + > +
    + + + +
    - {!this.props.printView ? ( - - ) : null} -
    - ); - } + + {!this.props.printView ? ( + + ) : null} +
    + ); + } } export default withTranslation()(Description); diff --git a/lib/ReactViews/Preview/GroupPreview.jsx b/lib/ReactViews/Preview/GroupPreview.jsx index 9e0285bb162..590cfcf2d5b 100644 --- a/lib/ReactViews/Preview/GroupPreview.jsx +++ b/lib/ReactViews/Preview/GroupPreview.jsx @@ -1,6 +1,5 @@ import React from "react"; - import PropTypes from "prop-types"; import { observer } from "mobx-react"; @@ -18,95 +17,94 @@ import WarningBox from "./WarningBox"; */ @observer class GroupPreview extends React.Component { + static propTypes = { + previewed: PropTypes.object.isRequired, + terria: PropTypes.object.isRequired, + viewState: PropTypes.object.isRequired, + widthFromMeasureElementHOC: PropTypes.number, + t: PropTypes.func.isRequired + }; - static propTypes = { - previewed: PropTypes.object.isRequired, - terria: PropTypes.object.isRequired, - viewState: PropTypes.object.isRequired, - widthFromMeasureElementHOC: PropTypes.number, - t: PropTypes.func.isRequired - } - - backToMap() { - this.props.viewState.explorerPanelIsVisible = false; - } + backToMap() { + this.props.viewState.explorerPanelIsVisible = false; + } - render() { - const metadataItem = - this.props.previewed.nowViewingCatalogItem || this.props.previewed; - const { t } = this.props; - return ( -
    -
    (this.refToMeasure = component)} - > -

    {this.props.previewed.name}

    -
    - -
    -
    - - - - - +
    (this.refToMeasure = component)} + > +

    {this.props.previewed.name}

    +
    + - -
    -
    - - 0 - } - > -
    -

    {t("description.name")}

    - {parseCustomMarkdownToReact( - this.props.previewed.description, - { catalogItem: this.props.previewed } - )} -
    -
    -
    - - - - -
    -

    {t("preview.dataCustodian")}

    - {parseCustomMarkdownToReact(metadataItem.dataCustodian, { - catalogItem: metadataItem - })} -
    -
    - - +
    + + + + + + +
    +
    + + 0 } > - - -
    +
    +

    {t("description.name")}

    + {parseCustomMarkdownToReact( + this.props.previewed.description, + { catalogItem: this.props.previewed } + )} +
    + + + + + + +
    +

    {t("preview.dataCustodian")}

    + {parseCustomMarkdownToReact(metadataItem.dataCustodian, { + catalogItem: metadataItem + })} +
    +
    + + + +
    - ); - } +
    + ); + } } export default withTranslation()(measureElement(GroupPreview)); diff --git a/lib/ReactViews/Workbench/Controls/FilterSection.jsx b/lib/ReactViews/Workbench/Controls/FilterSection.jsx index fba03c9f955..14cabf8452c 100644 --- a/lib/ReactViews/Workbench/Controls/FilterSection.jsx +++ b/lib/ReactViews/Workbench/Controls/FilterSection.jsx @@ -8,48 +8,47 @@ import Styles from "./filter-section.scss"; @observer class FilterSection extends React.Component { + static propTypes = { + item: PropTypes.object.isRequired + }; - static propTypes = { - item: PropTypes.object.isRequired - } - - change(filter, values) { - runInAction(() => { - filter.setTrait(CommonStrata.user, "minimumShown", values[0]); - filter.setTrait(CommonStrata.user, "maximumShown", values[1]); - }); - this.props.item.terria.currentViewer.notifyRepaintRequired(); - } + change(filter, values) { + runInAction(() => { + filter.setTrait(CommonStrata.user, "minimumShown", values[0]); + filter.setTrait(CommonStrata.user, "maximumShown", values[1]); + }); + this.props.item.terria.currentViewer.notifyRepaintRequired(); + } - render() { - const item = this.props.item; - if (!item.filters || item.filters.length === 0) { - return null; - } - return ( -
    - {item.filters.map(this.renderFilter)} -
    - ); + render() { + const item = this.props.item; + if (!item.filters || item.filters.length === 0) { + return null; } + return ( +
    + {item.filters.map(this.renderFilter)} +
    + ); + } - renderFilter(filter) { - const values = [filter.minimumShown, filter.maximumShown]; - return ( -
    - - -
    - ); - } + renderFilter(filter) { + const values = [filter.minimumShown, filter.maximumShown]; + return ( +
    + + +
    + ); + } } export default FilterSection; diff --git a/lib/ReactViews/Workbench/Controls/SatelliteImageryTimeFilterSection.jsx b/lib/ReactViews/Workbench/Controls/SatelliteImageryTimeFilterSection.jsx index cc8742e98d8..b80022506d1 100644 --- a/lib/ReactViews/Workbench/Controls/SatelliteImageryTimeFilterSection.jsx +++ b/lib/ReactViews/Workbench/Controls/SatelliteImageryTimeFilterSection.jsx @@ -14,157 +14,156 @@ import Styles from "./satellite-imagery-time-filter-section.scss"; @observer class SatelliteImageryTimeFilterSection extends React.Component { - - static propTypes = { - item: PropTypes.object, - t: PropTypes.func.isRequired - } - - removeFilter() { - this.props.item.removeTimeFilterFeature(); - } - - zoomTo() { - const feature = this.props.item.timeFilterFeature; - const position = - feature !== undefined && feature.position !== undefined - ? feature.position.getValue(this.props.item.currentTime) - : undefined; - if (defined(position)) { - const cartographic = Ellipsoid.WGS84.cartesianToCartographic(position); - this.props.item.terria.currentViewer.zoomTo( - new Rectangle( - cartographic.longitude - 0.0005, - cartographic.latitude - 0.0005, - cartographic.longitude + 0.0005, - cartographic.latitude + 0.0005 - ) - ); - } + static propTypes = { + item: PropTypes.object, + t: PropTypes.func.isRequired + }; + + removeFilter() { + this.props.item.removeTimeFilterFeature(); + } + + zoomTo() { + const feature = this.props.item.timeFilterFeature; + const position = + feature !== undefined && feature.position !== undefined + ? feature.position.getValue(this.props.item.currentTime) + : undefined; + if (defined(position)) { + const cartographic = Ellipsoid.WGS84.cartesianToCartographic(position); + this.props.item.terria.currentViewer.zoomTo( + new Rectangle( + cartographic.longitude - 0.0005, + cartographic.latitude - 0.0005, + cartographic.longitude + 0.0005, + cartographic.latitude + 0.0005 + ) + ); } + } + + newLocation() { + const { t } = this.props; + // Cancel any feature picking already in progress. + const terria = this.props.item.terria; + + const pickPointMode = new MapInteractionMode({ + message: t("satellite.pickPoint"), + onCancel: () => runInAction(() => terria.mapInteractionModeStack.pop()) + }); + + runInAction(() => terria.mapInteractionModeStack.push(pickPointMode)); + + // Set up a reaction to observe pickedFeatures and filter the items + // discrete times + const disposer = reaction( + () => pickPointMode.pickedFeatures, + async (pickedFeatures) => { + runInAction(() => { + pickPointMode.customUi = function () { + return ; + }; + }); + + await pickedFeatures.allFeaturesAvailablePromise; + if ( + terria.mapInteractionModeStack[ + terria.mapInteractionModeStack.length - 1 + ] !== pickPointMode + ) { + // already cancelled + disposer(); + return; + } - newLocation() { - const { t } = this.props; - // Cancel any feature picking already in progress. - const terria = this.props.item.terria; - - const pickPointMode = new MapInteractionMode({ - message: t("satellite.pickPoint"), - onCancel: () => runInAction(() => terria.mapInteractionModeStack.pop()) - }); - - runInAction(() => terria.mapInteractionModeStack.push(pickPointMode)); - - // Set up a reaction to observe pickedFeatures and filter the items - // discrete times - const disposer = reaction( - () => pickPointMode.pickedFeatures, - async (pickedFeatures) => { - runInAction(() => { - pickPointMode.customUi = function () { - return ; - }; - }); - - await pickedFeatures.allFeaturesAvailablePromise; - if ( - terria.mapInteractionModeStack[ - terria.mapInteractionModeStack.length - 1 - ] !== pickPointMode - ) { - // already cancelled - disposer(); - return; - } - - const item = this.props.item; - const thisLayerFeature = pickedFeatures.features.filter((feature) => { - return ( - item.mapItems.find( - (mapItem) => - mapItem.imageryProvider && - mapItem.imageryProvider === - feature.imageryLayer?.imageryProvider - ) !== undefined + const item = this.props.item; + const thisLayerFeature = pickedFeatures.features.filter((feature) => { + return ( + item.mapItems.find( + (mapItem) => + mapItem.imageryProvider && + mapItem.imageryProvider === + feature.imageryLayer?.imageryProvider + ) !== undefined + ); + })[0]; + + if (thisLayerFeature !== undefined) { + try { + item.setTimeFilterFeature( + thisLayerFeature, + pickedFeatures.providerCoords ); - })[0]; - - if (thisLayerFeature !== undefined) { - try { - item.setTimeFilterFeature( - thisLayerFeature, - pickedFeatures.providerCoords - ); - } catch (e) { - terria.raiseErrorToUser(e); - } + } catch (e) { + terria.raiseErrorToUser(e); } - - runInAction(() => terria.mapInteractionModeStack.pop()); - disposer(); } - ); - } - render() { - if (!this.props.item.canFilterTimeByFeature) { - return null; + runInAction(() => terria.mapInteractionModeStack.pop()); + disposer(); } + ); + } - const feature = this.props.item.timeFilterFeature; - if (feature === undefined) { - return this.renderNoFeatureSelected(); - } else { - return this.renderFeatureSelected(feature); - } + render() { + if (!this.props.item.canFilterTimeByFeature) { + return null; } - renderNoFeatureSelected() { - const { t } = this.props; - return ( -
    -
    - -
    -
    - ); + const feature = this.props.item.timeFilterFeature; + if (feature === undefined) { + return this.renderNoFeatureSelected(); + } else { + return this.renderFeatureSelected(feature); } - - renderFeatureSelected(feature) { - const { t } = this.props; - // TODO: if the feature itself doesn't have a position, we should be able to use the position the user clicked on. - const position = - feature.position !== undefined - ? feature.position.getValue(this.props.item.currentTime) - : undefined; - - return ( -
    p.theme.colorPrimary}; - `} - > -
    -
    {t("satellite.infoGroup")}
    - -
    -
    - - - -
    + } + + renderNoFeatureSelected() { + const { t } = this.props; + return ( +
    +
    +
    - ); - } +
    + ); + } + + renderFeatureSelected(feature) { + const { t } = this.props; + // TODO: if the feature itself doesn't have a position, we should be able to use the position the user clicked on. + const position = + feature.position !== undefined + ? feature.position.getValue(this.props.item.currentTime) + : undefined; + + return ( +
    p.theme.colorPrimary}; + `} + > +
    +
    {t("satellite.infoGroup")}
    + +
    +
    + + + +
    +
    + ); + } } export default withTranslation()(SatelliteImageryTimeFilterSection); From b91e07f986571cf552f5231f37586c0b3e2e3ee6 Mon Sep 17 00:00:00 2001 From: Nanda Date: Fri, 27 Jan 2023 16:11:22 +1100 Subject: [PATCH 068/654] Rewrite trait override interfaces. --- lib/Traits/TraitsClasses/CatalogMemberTraits.ts | 17 +++++++++-------- lib/Traits/TraitsClasses/MappableTraits.ts | 12 ++++++------ .../ResultPendingCatalogItemTraits.ts | 4 ---- lib/Traits/TraitsClasses/UrlTraits.ts | 16 ++++++++-------- 4 files changed, 23 insertions(+), 26 deletions(-) diff --git a/lib/Traits/TraitsClasses/CatalogMemberTraits.ts b/lib/Traits/TraitsClasses/CatalogMemberTraits.ts index 7528830706c..c073799b775 100644 --- a/lib/Traits/TraitsClasses/CatalogMemberTraits.ts +++ b/lib/Traits/TraitsClasses/CatalogMemberTraits.ts @@ -100,14 +100,6 @@ export class ShortReportTraits extends ModelTraits { show = true; } -interface CatalogMemberTraits { - // Add traits here that you want to override from some Mixin or Model class - // without generating TS2611 type error. - name?: string; - shortReport?: string; - description?: string; -} - class CatalogMemberTraits extends ModelTraits { @primitiveTrait({ type: "string", @@ -240,4 +232,13 @@ class CatalogMemberTraits extends ModelTraits { disableAboutData?: boolean; } +interface CatalogMemberTraits { + // Add traits here that you want to override from some Mixin or Model class + // without generating TS2611 type error. + name?: CatalogMemberTraits["name"]; + shortReport?: CatalogMemberTraits["shortReport"]; + description?: CatalogMemberTraits["description"]; + disableAboutData?: CatalogMemberTraits["disableAboutData"]; +} + export default CatalogMemberTraits; diff --git a/lib/Traits/TraitsClasses/MappableTraits.ts b/lib/Traits/TraitsClasses/MappableTraits.ts index 8c166393b8f..f50d45e7207 100644 --- a/lib/Traits/TraitsClasses/MappableTraits.ts +++ b/lib/Traits/TraitsClasses/MappableTraits.ts @@ -199,12 +199,6 @@ export class InitialMessageTraits extends ModelTraits { height?: number; } -interface MappableTraits { - // Add traits here that you want to override from some Mixin or Model class - // without generating TS2611 type error. - disableZoomTo: boolean; -} - class MappableTraits extends mixTraits(AttributionTraits) { @objectTrait({ type: RectangleTraits, @@ -286,4 +280,10 @@ class MappableTraits extends mixTraits(AttributionTraits) { maximumShownFeatureInfos?: number; } +interface MappableTraits { + // Add traits here that you want to override from some Mixin or Model class + // without generating TS2611 type error. + disableZoomTo: MappableTraits["disableZoomTo"]; +} + export default MappableTraits; diff --git a/lib/Traits/TraitsClasses/ResultPendingCatalogItemTraits.ts b/lib/Traits/TraitsClasses/ResultPendingCatalogItemTraits.ts index 0bbd85ae98f..b3cff259f80 100644 --- a/lib/Traits/TraitsClasses/ResultPendingCatalogItemTraits.ts +++ b/lib/Traits/TraitsClasses/ResultPendingCatalogItemTraits.ts @@ -1,10 +1,6 @@ import mixTraits from "../mixTraits"; import CatalogMemberTraits from "./CatalogMemberTraits"; -interface ResultPendingCatalogItemTraits { - disableAboutData: boolean; -} - class ResultPendingCatalogItemTraits extends mixTraits(CatalogMemberTraits) {} export default ResultPendingCatalogItemTraits; diff --git a/lib/Traits/TraitsClasses/UrlTraits.ts b/lib/Traits/TraitsClasses/UrlTraits.ts index d831952d9de..f878e92a742 100644 --- a/lib/Traits/TraitsClasses/UrlTraits.ts +++ b/lib/Traits/TraitsClasses/UrlTraits.ts @@ -1,14 +1,6 @@ import ModelTraits from "../ModelTraits"; import primitiveTrait from "../Decorators/primitiveTrait"; -interface UrlTraits { - // Add traits here that you want to override from some Mixin or Model class - // without generating TS2611 type error. - url?: string; - cacheDuration?: string; - forceProxy?: boolean; -} - class UrlTraits extends ModelTraits { @primitiveTrait({ type: "string", @@ -33,4 +25,12 @@ class UrlTraits extends ModelTraits { cacheDuration?: string; } +interface UrlTraits { + // Add traits here that you want to override from some Mixin or Model class + // without generating TS2611 type error. + url?: UrlTraits["url"]; + cacheDuration?: UrlTraits["cacheDuration"]; + forceProxy?: UrlTraits["forceProxy"]; +} + export default UrlTraits; From 493c992240458b6fd1f27421b3f5ea8dfefe0ae8 Mon Sep 17 00:00:00 2001 From: Nanda Date: Fri, 27 Jan 2023 16:18:40 +1100 Subject: [PATCH 069/654] Prettier again. --- lib/ReactViews/Preview/Description.jsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/ReactViews/Preview/Description.jsx b/lib/ReactViews/Preview/Description.jsx index 2b2430fa191..cfb32fdd38c 100644 --- a/lib/ReactViews/Preview/Description.jsx +++ b/lib/ReactViews/Preview/Description.jsx @@ -169,8 +169,9 @@ class Description extends React.Component { >

    {t("description.layerName")} - {(catalogItem.layers || "").split(",").length > 1 ? "s" : ""}:{" "} - {catalogItem.layers} + {(catalogItem.layers || "").split(",").length > 1 + ? "s" + : ""}: {catalogItem.layers}

    From 7287e9a198ef54f5d9da8a980ab3c8d8ea45bb11 Mon Sep 17 00:00:00 2001 From: Nanda Date: Fri, 27 Jan 2023 16:41:00 +1100 Subject: [PATCH 070/654] Switch to mobx-react official package. --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 18fa1d10a63..90531d14ece 100644 --- a/package.json +++ b/package.json @@ -129,7 +129,7 @@ "mini-css-extract-plugin": "^0.5.0", "minisearch": "^3.0.2", "mobx": "^6.7.0", - "mobx-react": "na9da/test-mobx-react", + "mobx-react": "7.6.0", "mobx-utils": "^6.0.5", "moment": "2.24.0", "ms": "^2.1.3", From 70c2d68d1a8ed1550756c1629740c4e7c670e520 Mon Sep 17 00:00:00 2001 From: Nanda Date: Fri, 27 Jan 2023 16:46:58 +1100 Subject: [PATCH 071/654] Convert InvokeFunction to React.Component class. --- lib/ReactViews/Analytics/InvokeFunction.jsx | 222 ++++++++++---------- 1 file changed, 109 insertions(+), 113 deletions(-) diff --git a/lib/ReactViews/Analytics/InvokeFunction.jsx b/lib/ReactViews/Analytics/InvokeFunction.jsx index b1711abb954..32e0fcb52e2 100644 --- a/lib/ReactViews/Analytics/InvokeFunction.jsx +++ b/lib/ReactViews/Analytics/InvokeFunction.jsx @@ -43,120 +43,116 @@ class ParameterViewModel { } } -const InvokeFunction = observer( - createReactClass({ - displayName: "InvokeFunction", - - propTypes: { - terria: PropTypes.object, - previewed: PropTypes.object, - viewState: PropTypes.object, - t: PropTypes.func.isRequired - }, - - /* eslint-disable-next-line camelcase */ - UNSAFE_componentWillMount() { - this.parametersViewModel = new FunctionViewModel(this.props.previewed); - }, - - /* eslint-disable-next-line camelcase */ - UNSAFE_componentWillUpdate(nextProps, nextState) { - if (nextProps.previewed !== this.parametersViewModel.catalogFunction) { - // Clear previous parameters view model, because this is a different catalog function. - this.parametersViewModel = new FunctionViewModel(nextProps.previewed); - } - }, - - submit() { - this.props.previewed.submitJob().catch((e) => { - this.props.terria.raiseErrorToUser(e); - }); - - runInAction(() => { - // Close modal window - this.props.viewState.explorerPanelIsVisible = false; - // mobile switch to nowvewing - this.props.viewState.switchMobileView( - this.props.viewState.mobileViewOptions.preview - ); - }); - }, - - getParams() { - // Key should include the previewed item identifier so that - // components are refreshed when different previewed items are - // displayed - return this.props.previewed.functionParameters.map((param, i) => ( - - )); - }, - - validateParameter(parameter) { - if ( - !parameter.isValid || - !this.parametersViewModel.getParameter(parameter).isValueValid - ) { - // Editor says it's not valid, so it's not valid. - return false; - } - - // Verify that required parameters have a value. - if (parameter.isRequired && !defined(parameter.value)) { - return false; - } - - return true; - }, - - render() { - if (this.props.previewed.isLoading) { - return ; - } - - let invalidParameters = false; - if (defined(this.props.previewed.parameters)) { - invalidParameters = !this.props.previewed.functionParameters.every( - this.validateParameter - ); - } - const { t } = this.props; - return ( -
    -
    -

    {this.props.previewed.name}

    - - - -
    - {parseCustomMarkdownToReact(this.props.previewed.description, { - catalogItem: this.props.previewed - })} -
    - {this.getParams()} -
    -
    - -
    -
    +class InvokeFunction extends React.Component { + static propTypes = { + terria: PropTypes.object, + previewed: PropTypes.object, + viewState: PropTypes.object, + t: PropTypes.func.isRequired + }; + + /* eslint-disable-next-line camelcase */ + UNSAFE_componentWillMount() { + this.parametersViewModel = new FunctionViewModel(this.props.previewed); + } + + /* eslint-disable-next-line camelcase */ + UNSAFE_componentWillUpdate(nextProps, nextState) { + if (nextProps.previewed !== this.parametersViewModel.catalogFunction) { + // Clear previous parameters view model, because this is a different catalog function. + this.parametersViewModel = new FunctionViewModel(nextProps.previewed); + } + } + + submit() { + this.props.previewed.submitJob().catch((e) => { + this.props.terria.raiseErrorToUser(e); + }); + + runInAction(() => { + // Close modal window + this.props.viewState.explorerPanelIsVisible = false; + // mobile switch to nowvewing + this.props.viewState.switchMobileView( + this.props.viewState.mobileViewOptions.preview + ); + }); + } + + getParams() { + // Key should include the previewed item identifier so that + // components are refreshed when different previewed items are + // displayed + return this.props.previewed.functionParameters.map((param, i) => ( + + )); + } + + validateParameter(parameter) { + if ( + !parameter.isValid || + !this.parametersViewModel.getParameter(parameter).isValueValid + ) { + // Editor says it's not valid, so it's not valid. + return false; + } + + // Verify that required parameters have a value. + if (parameter.isRequired && !defined(parameter.value)) { + return false; + } + + return true; + } + + render() { + if (this.props.previewed.isLoading) { + return ; + } + + let invalidParameters = false; + if (defined(this.props.previewed.parameters)) { + invalidParameters = !this.props.previewed.functionParameters.every( + this.validateParameter.bind(this) ); } - }) -); + const { t } = this.props; + return ( +
    +
    +

    {this.props.previewed.name}

    + + + +
    + {parseCustomMarkdownToReact(this.props.previewed.description, { + catalogItem: this.props.previewed + })} +
    + {this.getParams()} +
    +
    + +
    +
    + ); + } +} module.exports = withTranslation()(InvokeFunction); From 5c5dc13675b83f0fd30d34631bd84265e0b644b9 Mon Sep 17 00:00:00 2001 From: Nanda Date: Fri, 27 Jan 2023 16:48:16 +1100 Subject: [PATCH 072/654] Use named classes. --- lib/ReactViews/DataCatalog/DataCatalogMember.jsx | 2 +- lib/ReactViews/Search/SearchHeader.jsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/ReactViews/DataCatalog/DataCatalogMember.jsx b/lib/ReactViews/DataCatalog/DataCatalogMember.jsx index c0eb7981366..eb8be23c70a 100644 --- a/lib/ReactViews/DataCatalog/DataCatalogMember.jsx +++ b/lib/ReactViews/DataCatalog/DataCatalogMember.jsx @@ -13,7 +13,7 @@ import DataCatalogReference from "./DataCatalogReference"; * Component that is either a {@link CatalogItem} or a {@link DataCatalogMember} and encapsulated this choosing logic. */ @observer -export default class extends React.Component { +export default class DataCatalogMember extends React.Component { static propTypes = { member: PropTypes.object.isRequired, viewState: PropTypes.object.isRequired, diff --git a/lib/ReactViews/Search/SearchHeader.jsx b/lib/ReactViews/Search/SearchHeader.jsx index 4938076583a..f7f78acf79e 100644 --- a/lib/ReactViews/Search/SearchHeader.jsx +++ b/lib/ReactViews/Search/SearchHeader.jsx @@ -6,7 +6,7 @@ import Styles from "./search-header.scss"; /** Renders either a loader or a message based off search state. */ @observer -export default class extends React.Component { +export default class SearchHeader extends React.Component { static propTypes = { searchResults: PropTypes.object.isRequired, isWaitingForSearchToStart: PropTypes.bool From 52ebff6e57d97d9240c80f9851efe5b268984db8 Mon Sep 17 00:00:00 2001 From: Nanda Date: Fri, 27 Jan 2023 17:11:02 +1100 Subject: [PATCH 073/654] Decorate class with @observer. --- lib/ReactViews/Analytics/InvokeFunction.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/ReactViews/Analytics/InvokeFunction.jsx b/lib/ReactViews/Analytics/InvokeFunction.jsx index 32e0fcb52e2..d3925501dbc 100644 --- a/lib/ReactViews/Analytics/InvokeFunction.jsx +++ b/lib/ReactViews/Analytics/InvokeFunction.jsx @@ -1,4 +1,3 @@ -import createReactClass from "create-react-class"; import { observable, runInAction } from "mobx"; import { observer } from "mobx-react"; import PropTypes from "prop-types"; @@ -43,6 +42,7 @@ class ParameterViewModel { } } +@observer class InvokeFunction extends React.Component { static propTypes = { terria: PropTypes.object, From 7049064f791b938c5fc506da0b2135d02f7378d9 Mon Sep 17 00:00:00 2001 From: Nanda Date: Fri, 27 Jan 2023 17:17:08 +1100 Subject: [PATCH 074/654] Add missing import. --- lib/ReactViews/Analytics/InvokeFunction.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/ReactViews/Analytics/InvokeFunction.jsx b/lib/ReactViews/Analytics/InvokeFunction.jsx index d3925501dbc..143b8a349b9 100644 --- a/lib/ReactViews/Analytics/InvokeFunction.jsx +++ b/lib/ReactViews/Analytics/InvokeFunction.jsx @@ -1,4 +1,4 @@ -import { observable, runInAction } from "mobx"; +import { makeObservable, observable, runInAction } from "mobx"; import { observer } from "mobx-react"; import PropTypes from "prop-types"; import React from "react"; From 8a93d81e9b4b2409ac7fa3f4868c49c97e03d575 Mon Sep 17 00:00:00 2001 From: Nanda Date: Mon, 30 Jan 2023 10:54:16 +1100 Subject: [PATCH 075/654] Upgrade packages. --- package.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 90531d14ece..5dc3ee574d4 100644 --- a/package.json +++ b/package.json @@ -163,7 +163,7 @@ "string-replace-loader": "^2.1.1", "string-replace-webpack-plugin": "^0.1.3", "style-loader": "^0.23.1", - "styled-components": "^5.1.0", + "styled-components": "^5.3.6", "svg-sprite-loader": "4.1.3", "terriajs-cesium": "1.92.0-tile-error-provider-fix-2", "terriajs-html2canvas": "1.0.0-alpha.12-terriajs-1", @@ -185,16 +185,16 @@ "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@types/dateformat": "^3.0.1", "@types/fs-extra": "^7.0.0", - "@types/node": "18.11.9", - "@types/node-fetch": "^2.5.12", + "@types/node": "18.11.18", + "@types/node-fetch": "^2.6.2", "babel-plugin-styled-components": "^1.10.7", "bottleneck": "^2.19.5", "eslint": "^7.20.0", "eslint-plugin-jsx-control-statements": "^2.2.1", "eslint-plugin-react": "^7.19.0", "fetch-mock": "^9.11.0", - "fork-ts-checker-notifier-webpack-plugin": "^3.0.0", - "fork-ts-checker-webpack-plugin": "^5.0.7", + "fork-ts-checker-notifier-webpack-plugin": "^6.0.0", + "fork-ts-checker-webpack-plugin": "^6.0.0", "fs-extra": "^7.0.1", "generate-terriajs-schema": "^1.5.0", "glob-all": "^3.0.1", From e92a146768f574842e71fb29bf55ef601a0e8a8d Mon Sep 17 00:00:00 2001 From: Nanda Date: Mon, 30 Jan 2023 10:55:08 +1100 Subject: [PATCH 076/654] export after @observer. --- lib/ReactViews/BottomDock/Timeline/Timeline.jsx | 2 +- lib/ReactViews/Custom/Chart/Legends.jsx | 4 +++- lib/ReactViews/Custom/Chart/LineChart.jsx | 4 +++- lib/ReactViews/DataCatalog/DataCatalog.jsx | 2 +- lib/ReactViews/DataCatalog/DataCatalogMember.jsx | 4 +++- lib/ReactViews/Search/SearchHeader.jsx | 4 +++- 6 files changed, 14 insertions(+), 6 deletions(-) diff --git a/lib/ReactViews/BottomDock/Timeline/Timeline.jsx b/lib/ReactViews/BottomDock/Timeline/Timeline.jsx index 055d49cd60c..e6b7f827166 100644 --- a/lib/ReactViews/BottomDock/Timeline/Timeline.jsx +++ b/lib/ReactViews/BottomDock/Timeline/Timeline.jsx @@ -14,7 +14,7 @@ import Styles from "./timeline.scss"; import TimelineControls from "./TimelineControls"; @observer -export class Timeline extends React.Component { +class Timeline extends React.Component { static propTypes = { terria: PropTypes.object.isRequired, locale: PropTypes.object, diff --git a/lib/ReactViews/Custom/Chart/Legends.jsx b/lib/ReactViews/Custom/Chart/Legends.jsx index 1b26bd70a35..2d1e5cb2d37 100644 --- a/lib/ReactViews/Custom/Chart/Legends.jsx +++ b/lib/ReactViews/Custom/Chart/Legends.jsx @@ -9,7 +9,7 @@ import styled from "styled-components"; import { observer } from "mobx-react"; @observer -export default class Legends extends React.PureComponent { +class Legends extends React.PureComponent { static propTypes = { chartItems: PropTypes.array.isRequired, width: PropTypes.number.isRequired @@ -42,6 +42,8 @@ export default class Legends extends React.PureComponent { } } +export default Legends; + class Legend extends React.PureComponent { static propTypes = { label: PropTypes.object.isRequired, diff --git a/lib/ReactViews/Custom/Chart/LineChart.jsx b/lib/ReactViews/Custom/Chart/LineChart.jsx index f7f934837e0..3b03fb2b2fc 100644 --- a/lib/ReactViews/Custom/Chart/LineChart.jsx +++ b/lib/ReactViews/Custom/Chart/LineChart.jsx @@ -5,7 +5,7 @@ import React from "react"; import { observer } from "mobx-react"; @observer -export default class LineChart extends React.PureComponent { +class LineChart extends React.PureComponent { static propTypes = { id: PropTypes.string.isRequired, chartItem: PropTypes.object.isRequired, @@ -39,3 +39,5 @@ export default class LineChart extends React.PureComponent { ); } } + +export default LineChart; diff --git a/lib/ReactViews/DataCatalog/DataCatalog.jsx b/lib/ReactViews/DataCatalog/DataCatalog.jsx index 735cc20a62a..65690cef0aa 100644 --- a/lib/ReactViews/DataCatalog/DataCatalog.jsx +++ b/lib/ReactViews/DataCatalog/DataCatalog.jsx @@ -13,7 +13,7 @@ import Styles from "./data-catalog.scss"; // Displays the data catalog. @observer -export class DataCatalog extends React.Component { +class DataCatalog extends React.Component { static propTypes = { terria: PropTypes.object, viewState: PropTypes.object, diff --git a/lib/ReactViews/DataCatalog/DataCatalogMember.jsx b/lib/ReactViews/DataCatalog/DataCatalogMember.jsx index eb8be23c70a..e80a919e861 100644 --- a/lib/ReactViews/DataCatalog/DataCatalogMember.jsx +++ b/lib/ReactViews/DataCatalog/DataCatalogMember.jsx @@ -13,7 +13,7 @@ import DataCatalogReference from "./DataCatalogReference"; * Component that is either a {@link CatalogItem} or a {@link DataCatalogMember} and encapsulated this choosing logic. */ @observer -export default class DataCatalogMember extends React.Component { +class DataCatalogMember extends React.Component { static propTypes = { member: PropTypes.object.isRequired, viewState: PropTypes.object.isRequired, @@ -66,3 +66,5 @@ export default class DataCatalogMember extends React.Component { } } } + +export default DataCatalogMember; diff --git a/lib/ReactViews/Search/SearchHeader.jsx b/lib/ReactViews/Search/SearchHeader.jsx index f7f78acf79e..6856db1931b 100644 --- a/lib/ReactViews/Search/SearchHeader.jsx +++ b/lib/ReactViews/Search/SearchHeader.jsx @@ -6,7 +6,7 @@ import Styles from "./search-header.scss"; /** Renders either a loader or a message based off search state. */ @observer -export default class SearchHeader extends React.Component { +class SearchHeader extends React.Component { static propTypes = { searchResults: PropTypes.object.isRequired, isWaitingForSearchToStart: PropTypes.bool @@ -33,3 +33,5 @@ export default class SearchHeader extends React.Component { } } } + +export default SearchHeader; From 1a2295507cd064e7d14ba9f9c31d9bfce4bb58f8 Mon Sep 17 00:00:00 2001 From: Nanda Date: Mon, 30 Jan 2023 15:14:33 +1100 Subject: [PATCH 077/654] Fix createCombinedModelStratum decorators. --- lib/Models/Definition/createCombinedModel.ts | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/lib/Models/Definition/createCombinedModel.ts b/lib/Models/Definition/createCombinedModel.ts index a93b6ee5258..472aee03fe5 100644 --- a/lib/Models/Definition/createCombinedModel.ts +++ b/lib/Models/Definition/createCombinedModel.ts @@ -231,11 +231,20 @@ function createCombinedStratum( decorators[traitName] = trait.decoratorForFlattened || computed; }); - makeObservable(result, decorators); + decorate(result, decorators); return >(result); } +function decorate( + target: any, + decorators: { [id: string]: PropertyDecorator } +) { + Object.entries(decorators).forEach(([prop, decorator]) => { + decorator(target, prop); + }); +} + function unwrapCombinedStratumFromModel(value: BaseModel) { const nestedTop = value.strata.get("top"); const nestedBottom = value.strata.get("bottom"); From 2bce1ca0151f24c68f169e7196deb79144b762b4 Mon Sep 17 00:00:00 2001 From: Stephen Davies Date: Wed, 15 Feb 2023 18:09:57 +1100 Subject: [PATCH 078/654] Update links to Cloning and Building --- doc/contributing/development-environment.md | 4 ++-- doc/customizing/README.md | 1 + doc/customizing/skinning.md | 8 ++++---- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/doc/contributing/development-environment.md b/doc/contributing/development-environment.md index c00ed0dcd54..4bd61f829b3 100644 --- a/doc/contributing/development-environment.md +++ b/doc/contributing/development-environment.md @@ -1,10 +1,10 @@ -First, read [Getting Started](../getting-started.md). +First, read [Cloning and Building](../customizing/cloning-and-building.md). ## Building a TerriaMap against a modified TerriaJS What if you need to make changes to [TerriaJS](https://github.com/TerriaJS/terriajs) while working on a site that depends on it? -In the process described in [Getting Started](../getting-started.md), the [TerriaJS package](https://www.npmjs.com/package/terriajs) is installed to the `node_modules` directory by `yarn install`. Please do not edit TerriaJS directly in the `node_modules` directory, because changes will be clobbered the next time you run `yarn install`. +In the process described in [Cloning and Building](../customizing/cloning-and-building.md), the [TerriaJS package](https://www.npmjs.com/package/terriajs) is installed to the `node_modules` directory by `yarn install`. Please do not edit TerriaJS directly in the `node_modules` directory, because changes will be clobbered the next time you run `yarn install`. Instead, we want to clone TerriaJS from its [GitHub repo](https://github.com/TerriaJS/terriajs) and use that in our TerriaMap build. Traditionally, `npm link` is the way to do this. However, we do not recommend use of `npm link` because it frequently leads to multiple copies of some libraries being installed, which in turn leads to all sorts of frustrating build problems. Instead, we recommend [yarn](https://yarnpkg.com) and its [workspaces](https://yarnpkg.com/lang/en/docs/workspaces/) feature. `yarn` workspaces let us safely clone a git repo into the `packages` directory and wire it into any other packages that use it. diff --git a/doc/customizing/README.md b/doc/customizing/README.md index 1d086f09882..28ec724c772 100644 --- a/doc/customizing/README.md +++ b/doc/customizing/README.md @@ -6,3 +6,4 @@ This section explains the various ways to customize a TerriaJS application. It a - [Initialization Files](initialization-files.md): TerriaJS init files describe the catalog that will be presented to the user, the initial map view, and more. Init files let you connect TerriaJS to your servers and data. - [Server-side Config](server-side-config.md): Configure which domains the server will proxy for (to avoid [Cross-Origin Resource Sharing (CORS) problems](../connecting-to-data/cross-origin-resource-sharing.md)), persistence of sharing data, and more. - [Skinning](skinning.md): Customize the look and feel of a TerriaJS application. +- [Cloning and Building](cloning-and-building.md): Build TerriaMap locally to customize your application further diff --git a/doc/customizing/skinning.md b/doc/customizing/skinning.md index 93010374471..6a80198e1f1 100644 --- a/doc/customizing/skinning.md +++ b/doc/customizing/skinning.md @@ -12,11 +12,11 @@ Change the `appName`, `brandBarElements`, etc. See [Client-side Config](client-s `lib/Styles/variables.scss` -Uncomment and tweak the SASS variables to set the main colors and fonts used throughout the application. You will need to [rebuild TerriaMap](../getting-started.md#building-terriamap) after changing this file. +Uncomment and tweak the SASS variables to set the main colors and fonts used throughout the application. You will need to [rebuild TerriaMap](./cloning-and-building.md) after changing this file. `lib/Views/global.scss` -**_(The following is no longer supported in version 8. Please discuss alternatives in [this issue](https://github.com/TerriaJS/terriajs/issues/5169))_** ~~In this file, you can override any of TerriaJS's CSS. It contains some commented-out examples of some things you might like to change. You can also use your browser's DOM inspector to look at elements in the TerriaJS UI and which CSS classes they use, and then override those classes as desired in this file. You will need to [rebuild TerriaMap](../getting-started.md#building-terriamap) after changing this file.~~ +**_(The following is no longer supported in version 8. Please discuss alternatives in [this issue](https://github.com/TerriaJS/terriajs/issues/5169))_** ~~In this file, you can override any of TerriaJS's CSS. It contains some commented-out examples of some things you might like to change. You can also use your browser's DOM inspector to look at elements in the TerriaJS UI and which CSS classes they use, and then override those classes as desired in this file. You will need to [rebuild TerriaMap](./cloning-and-building.md) after changing this file.~~ `lib/Views/UserInterface.jsx` @@ -63,8 +63,8 @@ export default function UserInterface(props) { } ``` -You will need to [rebuild TerriaMap](../getting-started.md#building-terriamap) after changing this file. +You will need to [rebuild TerriaMap](./cloning-and-building.md) after changing this file. `index.js` -It's not usually necessary to change this file, but it is the main entry point for TerriaMap, so you can add any extra initialization that your application needs here. You will need to [rebuild TerriaMap](../getting-started.md#building-terriamap) after changing this file. +It's not usually necessary to change this file, but it is the main entry point for TerriaMap, so you can add any extra initialization that your application needs here. You will need to [rebuild TerriaMap](./cloning-and-building.md) after changing this file. From 9190864ac198c0c6417666c57d3c357182ed42bf Mon Sep 17 00:00:00 2001 From: Hiroo Imaki Date: Mon, 13 Feb 2023 19:23:22 +0000 Subject: [PATCH 079/654] Translated using Weblate (Japanese) for TerriaJSNext Currently translated at 100.0% (1215 of 1215 strings) Translation: TerriaJS/TerriaJSNext Translate-URL: https://hosted.weblate.org/projects/terriajs/terriajsnext/ja/ --- wwwroot/languages/ja/translation.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/wwwroot/languages/ja/translation.json b/wwwroot/languages/ja/translation.json index 5483415609a..6dd2bb7f347 100644 --- a/wwwroot/languages/ja/translation.json +++ b/wwwroot/languages/ja/translation.json @@ -1524,7 +1524,9 @@ "failedToObtain": "画像タイル X: {{x}} Y: {{y}} Level: {{level}} の取得に失敗しました。", "devError": "cesiumが必須です。", "stoppedRenderingTitle": "3D地図の描画に失敗しました", - "stoppedRenderingMessage": "先程ワークベンチに追加したデータが原因で問題が起きているかもしれません - データを削除してください。それでも問題が解決しない場合は {{appName}}を再読込してみてください。" + "stoppedRenderingMessage": "先程ワークベンチに追加したデータが原因で問題が起きているかもしれません - データを削除してください。それでも問題が解決しない場合は {{appName}}を再読込してみてください。", + "terrainServerErrorTitle": "地形配信サーバが反応しません", + "terrainServerErrorMessage": " 地形配信サーバが反応しません。 {{appName}} のすべての機能は使えますが、3Dモードで地形が表示できません。 ご迷惑をおかけします。 しばらくしてからもう一度お試し下さい。 もし問題が解決していないようでしたら、以下までメールでご連絡下さい。 {{supportEmail}}." }, "regionProvider": { "csvRegionMappingMessageLoadError": "リージョン{{regionName}}のリージョン境界を読み込めませんでした。{{exception}}", From 381d7d3e923d1698d2ae16d8e73980b669ca9532 Mon Sep 17 00:00:00 2001 From: raf Date: Tue, 14 Feb 2023 09:13:06 +0000 Subject: [PATCH 080/654] Translated using Weblate (Catalan) for TerriaJSNext Currently translated at 100.0% (1215 of 1215 strings) Translation: TerriaJS/TerriaJSNext Translate-URL: https://hosted.weblate.org/projects/terriajs/terriajsnext/ca/ --- wwwroot/languages/ca/translation.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/wwwroot/languages/ca/translation.json b/wwwroot/languages/ca/translation.json index 67b8b45eb23..51ea9e409d7 100644 --- a/wwwroot/languages/ca/translation.json +++ b/wwwroot/languages/ca/translation.json @@ -755,7 +755,9 @@ "notWebMercatorTilingScheme": "Aquest conjunt de dades no es pot mostrar al mapa 2D perquè no admet la projecció Web Mercator (EPSG:3857).", "unusalTilingScheme": "Aquest conjunt de dades no es pot mostrar al mapa 2D perquè utilitza un esquema de mosaic inusual que no és compatible.", "stoppedRenderingTitle": "El mapa 3D no s'ha pogut renderitzar", - "stoppedRenderingMessage": "Això pot haver estat causat per un conjunt de dades que s'acaba d'afegir a l'espai de treball, proveu d'eliminar-lo. Si això no resol el vostre problema, és possible que ho hàgiu de tornar a carregar {{appName}}." + "stoppedRenderingMessage": "Això pot haver estat causat per un conjunt de dades que s'acaba d'afegir a l'espai de treball, proveu d'eliminar-lo. Si això no resol el vostre problema, és possible que ho hàgiu de tornar a carregar {{appName}}.", + "terrainServerErrorMessage": " El servidor de terrenys no respon en aquest moment. Encara podeu utilitzar totes les funcions de {{appName}}, però no hi haurà cap detall del terreny en mode 3D. Lamentem les molèsties. Torneu-ho a provar més tard i el servidor de terrenys hauria de respondre com s'espera. Si el problema continua, poseu-vos en contacte amb nosaltres per correu electrònic a {{supportEmail}}.", + "terrainServerErrorTitle": "El servidor de terrenys no contesta" }, "computeRingWindingOrder": { "devError": "Punts esperats del tipus {x:nombre, y:nombre}" From 138a5353138d2d81b87f18856c81af0cbe8329db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Podhoreck=C3=BD?= Date: Tue, 21 Feb 2023 09:44:12 +0000 Subject: [PATCH 081/654] Translated using Weblate (Czech) for TerriaJSNext Currently translated at 100.0% (1215 of 1215 strings) Translation: TerriaJS/TerriaJSNext Translate-URL: https://hosted.weblate.org/projects/terriajs/terriajsnext/cs/ --- wwwroot/languages/cs/translation.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/wwwroot/languages/cs/translation.json b/wwwroot/languages/cs/translation.json index 5442849b0c7..fec07f85304 100644 --- a/wwwroot/languages/cs/translation.json +++ b/wwwroot/languages/cs/translation.json @@ -785,7 +785,9 @@ "notWebMercatorTilingScheme": "Tuto datovou sadu nelze zobrazit na 2D mapě, protože nepodporuje projekci Web Mercator (EPSG:3857).", "unusalTilingScheme": "Tuto datovou sadu nelze zobrazit na 2D mapě, protože používá neobvyklé schéma dlaždic, které není podporováno.", "stoppedRenderingTitle": "3D mapu se nepodařilo vykreslit", - "stoppedRenderingMessage": "Příčinou může být datová sada právě přidaná do pracovního stolu - zkuste ji odstranit. Pokud se tím problém nevyřeší, bude možná nutné znovu načíst {{appName}}." + "stoppedRenderingMessage": "Příčinou může být datová sada právě přidaná do pracovního stolu - zkuste ji odstranit. Pokud se tím problém nevyřeší, bude možná nutné znovu načíst {{appName}}.", + "terrainServerErrorMessage": " Terrain server momentálně neodpovídá. Stále můžete používat všechny funkce {{appName}}, ale v režimu 3D nebudou k dispozici žádné detaily terénu. Omlouváme se za nepříjemnosti. Zkuste to prosím později a terrain server by měl reagovat podle očekávání. Pokud problém přetrvává, kontaktujte nás prosím e-mailem na adrese {{supportEmail}}.", + "terrainServerErrorTitle": "Terrain Server neodpovídá" }, "displayVariablesConcept": { "defaultName": "Zobrazit proměnnou" From 9b6b04bff556f8d2a260118173c91e6751ffd3a2 Mon Sep 17 00:00:00 2001 From: raf Date: Wed, 22 Feb 2023 09:08:13 +0000 Subject: [PATCH 082/654] Translated using Weblate (Catalan) for TerriaJSNext Currently translated at 100.0% (1217 of 1217 strings) Translation: TerriaJS/TerriaJSNext Translate-URL: https://hosted.weblate.org/projects/terriajs/terriajsnext/ca/ --- wwwroot/languages/ca/translation.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/wwwroot/languages/ca/translation.json b/wwwroot/languages/ca/translation.json index 51ea9e409d7..3585a60022d 100644 --- a/wwwroot/languages/ca/translation.json +++ b/wwwroot/languages/ca/translation.json @@ -972,7 +972,9 @@ "mustHaveType": "Cada element ha de tenir un tipus.", "compositesError": "Els compostos no poden incloure elements compostos.", "convertErrorTitle": "No s'ha pogut actualitzar el catàleg a V8", - "convertErrorMessage": "Aquest arxiu de catàleg es basa en una versió anterior de TerriaJS, el programari que mou aquest mapa web. S'ha produït un error en intentar actualitzar les dades del catàleg per a {{url}}." + "convertErrorMessage": "Aquest arxiu de catàleg es basa en una versió anterior de TerriaJS, el programari que mou aquest mapa web. S'ha produït un error en intentar actualitzar les dades del catàleg per a {{url}}.", + "removeAll": "Elimina-ho tot", + "addAll": "Afegeix-ho tot" }, "userData": { "addingDataErrorTitle": "No s'ha pogut afegir les dades", From 1b61fb2619b41c3f74a0623bc33afa0f60fd9705 Mon Sep 17 00:00:00 2001 From: Mats Henrikson Date: Wed, 1 Mar 2023 13:29:41 +1100 Subject: [PATCH 083/654] Change "Raster Map Quality" to be just "Map Quality". Fixes #6394 --- wwwroot/languages/en/translation.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wwwroot/languages/en/translation.json b/wwwroot/languages/en/translation.json index 0a0e7f4ac8a..25524214000 100644 --- a/wwwroot/languages/en/translation.json +++ b/wwwroot/languages/en/translation.json @@ -264,7 +264,7 @@ "baseMap": "Base Map", "imageOptimisation": "Image Optimisation", "nativeResolutionHeader": "Use native device resolution", - "mapQuality": "Raster Map Quality:", + "mapQuality": "Map Quality:", "qualityLabel": "Quality", "performanceLabel": "Performance", "timeline": { From 7ed450df3aa37bad639bbf686dcf3e29f3a54238 Mon Sep 17 00:00:00 2001 From: Mats Henrikson Date: Wed, 1 Mar 2023 15:32:26 +1100 Subject: [PATCH 084/654] Add changelog entry. --- CHANGES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES.md b/CHANGES.md index 1dfacc57587..8c845123860 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -5,6 +5,7 @@ - Reimplement error message and default to 3d smooth mode when Cesium Ion Access Token is invalid. - Layers shown via a share URL are now logged as a Google Analytics event - Show an Add All / Remove All button for catalog groups when an optional `displayGroup` trait is true +- Rename the Map Settings "Raster Map Quality" slider to be just "Map Quality" as it also affects other things than raster data. - [The next improvement] #### 8.2.23 - 2023-01-06 From cd7543b77ded82b198a8aaadcad44d42c435ff59 Mon Sep 17 00:00:00 2001 From: Nanda Date: Thu, 2 Mar 2023 10:37:38 +1100 Subject: [PATCH 085/654] Add className prop for MyData tab so that it can be styled externally. (#6709) --- .../ExplorerWindow/Tabs/MyDataTab/MyDataTab.jsx | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/lib/ReactViews/ExplorerWindow/Tabs/MyDataTab/MyDataTab.jsx b/lib/ReactViews/ExplorerWindow/Tabs/MyDataTab/MyDataTab.jsx index 3147c089585..07ae7076f2e 100644 --- a/lib/ReactViews/ExplorerWindow/Tabs/MyDataTab/MyDataTab.jsx +++ b/lib/ReactViews/ExplorerWindow/Tabs/MyDataTab/MyDataTab.jsx @@ -26,6 +26,7 @@ const MyDataTab = observer( onUrlAddFinished: PropTypes.func.isRequired, localDataTypes: PropTypes.arrayOf(PropTypes.object), remoteDataTypes: PropTypes.arrayOf(PropTypes.object), + className: PropTypes.string, t: PropTypes.func.isRequired }, @@ -125,9 +126,13 @@ const MyDataTab = observer( render() { const showTwoColumn = this.hasUserAddedData() & !this.state.activeTab; - const { t } = this.props; + const { t, className } = this.props; return ( - +
    Date: Mon, 6 Mar 2023 10:06:54 +1100 Subject: [PATCH 086/654] release v8.2.24 (#6723) * release v8.2.24 * update changes.md --- CHANGES.md | 10 ++++++++-- package.json | 2 +- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 8c845123860..77e22aa35dd 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,12 +1,18 @@ # Change Log -#### next release (8.2.24) +#### next release (8.2.25) + +- [The next improvement] + +#### 8.2.24 - 2023-03-06 - Reimplement error message and default to 3d smooth mode when Cesium Ion Access Token is invalid. - Layers shown via a share URL are now logged as a Google Analytics event - Show an Add All / Remove All button for catalog groups when an optional `displayGroup` trait is true - Rename the Map Settings "Raster Map Quality" slider to be just "Map Quality" as it also affects other things than raster data. -- [The next improvement] +- Dragn-n-drop should respect disableZoomTo setting +- Fixed #6702 Terrain Hides Underground Features not working +- Add className prop for MyData tab so that it can be styled externally #### 8.2.23 - 2023-01-06 diff --git a/package.json b/package.json index 1a6ede54b61..8d4ce0ef3ea 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "terriajs", - "version": "8.2.23", + "version": "8.2.24", "description": "Geospatial data visualization platform.", "license": "Apache-2.0", "engines": { From 6f1482203a5119e9e3070b9476fd254a663cddb4 Mon Sep 17 00:00:00 2001 From: Stephen Davies Date: Tue, 7 Mar 2023 18:12:08 +1100 Subject: [PATCH 087/654] Bind member functions --- lib/ReactViews/Analytics/PolygonParameterEditor.jsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/ReactViews/Analytics/PolygonParameterEditor.jsx b/lib/ReactViews/Analytics/PolygonParameterEditor.jsx index 5c3d5875b19..96c309d4fd5 100644 --- a/lib/ReactViews/Analytics/PolygonParameterEditor.jsx +++ b/lib/ReactViews/Analytics/PolygonParameterEditor.jsx @@ -44,12 +44,12 @@ class PolygonParameterEditor extends React.Component { - ); - } - }) -); - -module.exports = withTranslation()(LocationBar); diff --git a/lib/ReactViews/Map/Legend/LocationBar.tsx b/lib/ReactViews/Map/Legend/LocationBar.tsx new file mode 100644 index 00000000000..b7b0431059d --- /dev/null +++ b/lib/ReactViews/Map/Legend/LocationBar.tsx @@ -0,0 +1,91 @@ +import classNames from "classnames"; +import { observer } from "mobx-react"; +import React, { RefObject, useEffect, useRef } from "react"; +import { useTranslation } from "react-i18next"; +import styled from "styled-components"; +import Terria from "../../../Models/Terria"; +import MouseCoords from "../../../ReactViewModels/MouseCoords"; +import Styles from "./legend.scss"; + +interface PropsType { + terria: Terria; + showUtmZone: boolean; + mouseCoords: MouseCoords; +} + +const LocationBar: React.FC = observer(({ mouseCoords }) => { + const { t } = useTranslation(); + const elevationRef = useRef(null); + const longitudeRef = useRef(null); + const latitudeRef = useRef(null); + const utmZoneRef = useRef(null); + const eastRef = useRef(null); + const northRef = useRef(null); + + useEffect(() => { + const disposer = mouseCoords.updateEvent.addEventListener(() => { + setInnerText(elevationRef, mouseCoords.elevation ?? ""); + setInnerText(longitudeRef, mouseCoords.longitude ?? ""); + setInnerText(latitudeRef, mouseCoords.latitude ?? ""); + setInnerText(utmZoneRef, mouseCoords.utmZone ?? ""); + setInnerText(eastRef, mouseCoords.east ?? ""); + setInnerText(northRef, mouseCoords.north ?? ""); + }); + return disposer; + }); + + return ( + mouseCoords.toggleUseProjection()} + > + {!mouseCoords.useProjection && ( + <> +
    + {t("legend.lat")} + {mouseCoords.latitude} +
    +
    + {t("legend.lon")} + {mouseCoords.longitude} +
    + + )} + {mouseCoords.useProjection && ( + <> +
    + {t("legend.zone")} + {mouseCoords.utmZone} +
    +
    + {t("legend.e")} + {mouseCoords.east} +
    +
    + {t("legend.n")} + {mouseCoords.north} +
    + + )} +
    + {t("legend.elev")} + {mouseCoords.elevation} +
    +
    + ); +}); + +function setInnerText(ref: RefObject, value: string) { + if (ref.current) ref.current.innerText = value; +} + +const LocationButton = styled.button` + &:hover { + background: ${(p) => p.theme.colorPrimary}; + } +`; + +export default LocationBar; diff --git a/lib/ReactViews/Map/Navigation/Items/Compass.tsx b/lib/ReactViews/Map/Navigation/Items/Compass.tsx index 42c6a66509d..4a8884333c2 100644 --- a/lib/ReactViews/Map/Navigation/Items/Compass.tsx +++ b/lib/ReactViews/Map/Navigation/Items/Compass.tsx @@ -31,6 +31,8 @@ import Icon, { StyledIcon } from "../../../../Styled/Icon"; import GyroscopeGuidance from "../../../GyroscopeGuidance/GyroscopeGuidance"; import { withTerriaRef } from "../../../HOCs/withTerriaRef"; import FadeIn from "../../../Transitions/FadeIn/FadeIn"; +import debounce from "lodash-es/debounce"; +import Scene from "terriajs-cesium/Source/Scene/Scene"; const CameraFlightPath = require("terriajs-cesium/Source/Scene/CameraFlightPath").default; @@ -150,7 +152,7 @@ type IStateTypes = { }; // the compass on map -class Compass extends React.Component { +class Compass extends React.PureComponent { _unsubscribeFromPostRender: any; _unsubscribeFromAnimationFrame: any; private _unsubscribeFromViewerChange?: CesiumEvent.RemoveCallback; @@ -757,13 +759,21 @@ function viewerChange(viewModel: Compass) { viewModel._unsubscribeFromPostRender = viewModel.props.terria.cesium.scene.postRender.addEventListener( - function () { - runInAction(() => { - viewModel.setState({ - heading: viewModel.props.terria.cesium!.scene.camera.heading - }); - }); - } + debounce( + function (scene: Scene) { + if ((scene as any).view) { + viewModel.setState({ + heading: scene.camera.heading + }); + } + }, + 200, + { + maxWait: 200, + leading: true, + trailing: true + } + ) ); } else { if (viewModel._unsubscribeFromPostRender) { From d61ca7a30afa459df5ed3e384ca7e2f2a90c28c8 Mon Sep 17 00:00:00 2001 From: Nick Forbes-Smith Date: Wed, 5 Apr 2023 11:50:27 +1000 Subject: [PATCH 120/654] ArcGis MapServer support for singleFusedMapCache `TilesOnly` in groups (#6626) * Start support for singleFusedMapCache * Refactor ArcGisMapServer* to combine interfaces * Add specs and changes * change handling of singleFusedMapCache TilesOnly * handle errors in arcgic specs * log urls * more logging * Remove logs + delete mapserver spec file * re-add mapserver spec file --- CHANGES.md | 2 + lib/Models/Catalog/Esri/ArcGisInterfaces.ts | 55 +++ .../Esri/ArcGisMapServerCatalogGroup.ts | 144 ++++---- .../Esri/ArcGisMapServerCatalogItem.ts | 327 ++++++++---------- .../ArcGisMapServerCatalogItemTraits.ts | 2 +- .../Catalog/esri/ArcGisCatalogGroupSpec.ts | 48 ++- .../esri/ArcGisMapServerCatalogGroupSpec.ts | 33 +- .../esri/ArcGisMapServerCatalogItemSpec.ts | 238 ++++++++++++- wwwroot/languages/en/translation.json | 3 +- .../SingleFusedMapCache/layers.json | 71 ++++ .../SingleFusedMapCache/legend.json | 218 ++++++++++++ .../SingleFusedMapCache/mapserver.json | 256 ++++++++++++++ 12 files changed, 1110 insertions(+), 287 deletions(-) create mode 100644 lib/Models/Catalog/Esri/ArcGisInterfaces.ts create mode 100644 wwwroot/test/ArcGisMapServer/SingleFusedMapCache/layers.json create mode 100644 wwwroot/test/ArcGisMapServer/SingleFusedMapCache/legend.json create mode 100644 wwwroot/test/ArcGisMapServer/SingleFusedMapCache/mapserver.json diff --git a/CHANGES.md b/CHANGES.md index c43a4442de7..0ed9e2fda15 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -10,6 +10,8 @@ - Fix a bug where `BoxDrawing` sometimes causes the map to loose pan and zoom interactivity. - Optimize `LocationBar` component to reduce number of renders on mouse move. - Optimize `Compass` component to reduce renders on each frame. +- Add `children` optional property to StandardUserInterfaceProps interface +- Add support for ArcGis MapServer with `TileOnly` capability - for example layers served from ArcGis Online. This is supported through `ArcGisMapServerCatalogItem`, `ArcGisMapServerCatalogGroup` and `ArcGisCatalogGroup`. - [The next improvement] #### 8.2.26 - 2023-03-21 diff --git a/lib/Models/Catalog/Esri/ArcGisInterfaces.ts b/lib/Models/Catalog/Esri/ArcGisInterfaces.ts new file mode 100644 index 00000000000..06e959da05f --- /dev/null +++ b/lib/Models/Catalog/Esri/ArcGisInterfaces.ts @@ -0,0 +1,55 @@ +interface DocumentInfo { + Title?: string; + Author?: string; +} + +interface SpatialReference { + wkid?: number; + latestWkid?: number; +} + +export interface Extent { + xmin: number; + ymin: number; + xmax: number; + ymax: number; + spatialReference?: SpatialReference; +} + +interface TimeInfo { + timeExtent: [number, number]; +} + +export interface Layer { + id: number; + name?: string; + parentLayerId: number; + // The following is pulled from /layers or / + description?: string; + copyrightText?: string; + type?: string; + subLayerIds?: number[] | null; + maxScale: number; + extent?: Extent; +} + +export interface MapServer { + documentInfo?: DocumentInfo; + name?: string; + serviceDescription?: string; + description?: string; + copyrightText?: string; + layers?: Layer[]; + subLayers?: Layer[]; + /** A single fused cache contains image tiles that are created by grouping all the layers together at each scale, or level of detail. + * If this is true, and `capabilities` states `TilesOnly` - we are unable to request individual layers in a MapServer. + * So instead we create a single item in the group called "All layers" (models.arcGisMapServerCatalogGroup.singleFusedMapCacheLayerName) + */ + singleFusedMapCache?: boolean; + //comma separated list of supported capabilities - e.g. "Map,Query,Data,TilesOnly,Tilemap" + capabilities?: string; + mapName?: string; + timeInfo?: TimeInfo; + fullExtent: Extent; + maxScale?: number; +} diff --git a/lib/Models/Catalog/Esri/ArcGisMapServerCatalogGroup.ts b/lib/Models/Catalog/Esri/ArcGisMapServerCatalogGroup.ts index 954ceda8d2b..579ae6be947 100644 --- a/lib/Models/Catalog/Esri/ArcGisMapServerCatalogGroup.ts +++ b/lib/Models/Catalog/Esri/ArcGisMapServerCatalogGroup.ts @@ -6,47 +6,26 @@ import isDefined from "../../../Core/isDefined"; import loadJson from "../../../Core/loadJson"; import replaceUnderscores from "../../../Core/replaceUnderscores"; import runLater from "../../../Core/runLater"; -import TerriaError, { networkRequestError } from "../../../Core/TerriaError"; +import { networkRequestError } from "../../../Core/TerriaError"; import CatalogMemberMixin from "../../../ModelMixins/CatalogMemberMixin"; import GroupMixin from "../../../ModelMixins/GroupMixin"; import UrlMixin from "../../../ModelMixins/UrlMixin"; +import ModelReference from "../../../Traits/ModelReference"; import ArcGisMapServerCatalogGroupTraits from "../../../Traits/TraitsClasses/ArcGisMapServerCatalogGroupTraits"; import { InfoSectionTraits } from "../../../Traits/TraitsClasses/CatalogMemberTraits"; -import ModelReference from "../../../Traits/ModelReference"; -import ArcGisCatalogGroup from "./ArcGisCatalogGroup"; -import ArcGisMapServerCatalogItem from "./ArcGisMapServerCatalogItem"; import CommonStrata from "../../Definition/CommonStrata"; import CreateModel from "../../Definition/CreateModel"; import createStratumInstance from "../../Definition/createStratumInstance"; import LoadableStratum from "../../Definition/LoadableStratum"; import { BaseModel } from "../../Definition/Model"; -import proxyCatalogItemUrl from "../proxyCatalogItemUrl"; import StratumOrder from "../../Definition/StratumOrder"; +import proxyCatalogItemUrl from "../proxyCatalogItemUrl"; +import ArcGisCatalogGroup from "./ArcGisCatalogGroup"; +import { Layer, MapServer } from "./ArcGisInterfaces"; +import ArcGisMapServerCatalogItem from "./ArcGisMapServerCatalogItem"; -interface DocumentInfo { - Title?: string; - Author?: string; -} - -interface Layer { - id: number; - name?: string; - parentLayerId: number; - description?: string; - copyrightText?: string; - type?: string; - subLayerIds?: number[] | null; -} - -export interface MapServer { - documentInfo?: DocumentInfo; - name?: string; - serviceDescription?: string; - description?: string; - copyrightText?: string; - layers?: Layer[]; - subLayers?: Layer[]; -} +/** The ID we add to our "All layers" ArcGisMapServerCatalogItem if MapServer.singleFusedMapCache is true */ +const SINGLE_FUSED_MAP_CACHE_ID = "all-layers"; export class MapServerStratum extends LoadableStratum( ArcGisMapServerCatalogGroupTraits @@ -69,10 +48,6 @@ export class MapServerStratum extends LoadableStratum( ) as this; } - get mapServerData() { - return this._mapServer; - } - @computed get name() { if ( this._mapServer.documentInfo && @@ -115,40 +90,40 @@ export class MapServerStratum extends LoadableStratum( static async load( catalogGroup: ArcGisMapServerCatalogGroup | ArcGisCatalogGroup ): Promise { - var terria = catalogGroup.terria; - var uri = new URI(catalogGroup.url).addQuery("f", "json"); + const uri = new URI(catalogGroup.url).addQuery("f", "json"); - return loadJson(proxyCatalogItemUrl(catalogGroup, uri.toString())) - .then((mapServer: MapServer) => { - // Is this really a MapServer REST response? - if (!mapServer || (!mapServer.layers && !mapServer.subLayers)) { - throw networkRequestError({ - title: i18next.t( - "models.arcGisMapServerCatalogGroup.invalidServiceTitle" - ), - message: i18next.t( - "models.arcGisMapServerCatalogGroup.invalidServiceMessage" - ) - }); - } - const stratum = new MapServerStratum(catalogGroup, mapServer); - return stratum; - }) - .catch(() => { - throw networkRequestError({ - sender: catalogGroup, - title: i18next.t( - "models.arcGisMapServerCatalogGroup.groupNotAvailableTitle" - ), - message: i18next.t( - "models.arcGisMapServerCatalogGroup.groupNotAvailableMessage" - ) - }); + const mapServer: MapServer | undefined = await loadJson( + proxyCatalogItemUrl(catalogGroup, uri.toString()) + ); + + // Is this really a MapServer REST response? + if (!mapServer || (!mapServer.layers && !mapServer.subLayers)) { + throw networkRequestError({ + title: i18next.t( + "models.arcGisMapServerCatalogGroup.invalidServiceTitle" + ), + message: i18next.t( + "models.arcGisMapServerCatalogGroup.invalidServiceMessage" + ) }); + } + const stratum = new MapServerStratum(catalogGroup, mapServer); + return stratum; + } + + @computed get tilesOnly() { + return ( + this._mapServer.singleFusedMapCache && + this._mapServer.capabilities?.includes("TilesOnly") + ); } @computed get members(): ModelReference[] { + if (this.tilesOnly) { + return [`${this._catalogGroup.uniqueId}/${SINGLE_FUSED_MAP_CACHE_ID}`]; + } + return filterOutUndefined( this.layers .map((layer) => { @@ -168,23 +143,47 @@ export class MapServerStratum extends LoadableStratum( ); } - @computed - get layers(): readonly Layer[] { + private get layers() { return this._mapServer.layers || []; } - @computed - get subLayers(): readonly Layer[] { + private get subLayers() { return this._mapServer.subLayers || []; } @action createMembersFromLayers() { - this.layers.forEach((layer) => this.createMemberFromLayer(layer)); + if (this.tilesOnly) this.createMemberForSingleFusedMapCache(); + else this.layers.forEach((layer) => this.createMemberFromLayer(layer)); } @action - createMemberFromLayer(layer: Layer) { + private createMemberForSingleFusedMapCache() { + const id = `${this._catalogGroup.uniqueId}/${SINGLE_FUSED_MAP_CACHE_ID}`; + let model = this._catalogGroup.terria.getModelById( + ArcGisMapServerCatalogItem, + id + ); + if (model === undefined) { + model = new ArcGisMapServerCatalogItem(id, this._catalogGroup.terria); + this._catalogGroup.terria.addModel(model); + } + + // Replace the stratum inherited from the parent group. + model.strata.delete(CommonStrata.definition); + + model.setTrait( + CommonStrata.definition, + "name", + i18next + .t("models.arcGisMapServerCatalogGroup.singleFusedMapCacheLayerName") + .toString() + ); + model.setTrait(CommonStrata.definition, "url", this._catalogGroup.url); + } + + @action + private createMemberFromLayer(layer: Layer) { if (!isDefined(layer.id)) { return; } @@ -240,7 +239,7 @@ export class MapServerStratum extends LoadableStratum( replaceUnderscores(layer.name) ); - var uri = new URI(this._catalogGroup.url).segment(layer.id + ""); // Convert layer id to string as segment(0) means sthg different. + const uri = new URI(this._catalogGroup.url).segment(layer.id.toString()); // Convert layer id to string as segment(0) means something different. model.setTrait(CommonStrata.definition, "url", uri.toString()); } } @@ -267,11 +266,10 @@ export default class ArcGisMapServerCatalogGroup extends UrlMixin( return "1d"; } - protected forceLoadMetadata(): Promise { - return MapServerStratum.load(this).then((stratum) => { - runInAction(() => { - this.strata.set(MapServerStratum.stratumName, stratum); - }); + protected async forceLoadMetadata(): Promise { + const stratum = await MapServerStratum.load(this); + runInAction(() => { + this.strata.set(MapServerStratum.stratumName, stratum); }); } diff --git a/lib/Models/Catalog/Esri/ArcGisMapServerCatalogItem.ts b/lib/Models/Catalog/Esri/ArcGisMapServerCatalogItem.ts index ee6f8afd418..1b90d5fc6f2 100644 --- a/lib/Models/Catalog/Esri/ArcGisMapServerCatalogItem.ts +++ b/lib/Models/Catalog/Esri/ArcGisMapServerCatalogItem.ts @@ -1,10 +1,8 @@ import i18next from "i18next"; import uniqWith from "lodash-es/uniqWith"; import { computed, runInAction } from "mobx"; -import Ellipsoid from "terriajs-cesium/Source/Core/Ellipsoid"; import WebMercatorTilingScheme from "terriajs-cesium/Source/Core/WebMercatorTilingScheme"; import ArcGisMapServerImageryProvider from "terriajs-cesium/Source/Scene/ArcGisMapServerImageryProvider"; -import ImageryProvider from "terriajs-cesium/Source/Scene/ImageryProvider"; import URI from "urijs"; import createDiscreteTimesFromIsoSegments from "../../../Core/createDiscreteTimes"; import createTransformerAllowUndefined from "../../../Core/createTransformerAllowUndefined"; @@ -12,13 +10,12 @@ import filterOutUndefined from "../../../Core/filterOutUndefined"; import isDefined from "../../../Core/isDefined"; import loadJson from "../../../Core/loadJson"; import replaceUnderscores from "../../../Core/replaceUnderscores"; +import { scaleDenominatorToLevel } from "../../../Core/scaleToDenominator"; import TerriaError, { networkRequestError } from "../../../Core/TerriaError"; import proj4definitions from "../../../Map/Vector/Proj4Definitions"; import CatalogMemberMixin from "../../../ModelMixins/CatalogMemberMixin"; import DiscretelyTimeVaryingMixin from "../../../ModelMixins/DiscretelyTimeVaryingMixin"; -import MappableMixin, { - ImageryParts -} from "../../../ModelMixins/MappableMixin"; +import { ImageryParts } from "../../../ModelMixins/MappableMixin"; import UrlMixin from "../../../ModelMixins/UrlMixin"; import ArcGisMapServerCatalogItemTraits from "../../../Traits/TraitsClasses/ArcGisMapServerCatalogItemTraits"; import { InfoSectionTraits } from "../../../Traits/TraitsClasses/CatalogMemberTraits"; @@ -29,14 +26,14 @@ import LegendTraits, { import { RectangleTraits } from "../../../Traits/TraitsClasses/MappableTraits"; import CreateModel from "../../Definition/CreateModel"; import createStratumInstance from "../../Definition/createStratumInstance"; -import getToken from "../../getToken"; import LoadableStratum from "../../Definition/LoadableStratum"; import { BaseModel } from "../../Definition/Model"; -import proxyCatalogItemUrl from "../proxyCatalogItemUrl"; import StratumFromTraits from "../../Definition/StratumFromTraits"; import StratumOrder from "../../Definition/StratumOrder"; +import getToken from "../../getToken"; +import proxyCatalogItemUrl from "../proxyCatalogItemUrl"; import MinMaxLevelMixin from "./../../../ModelMixins/MinMaxLevelMixin"; -import { scaleDenominatorToLevel } from "../../../Core/scaleToDenominator"; +import { Extent, Layer, MapServer } from "./ArcGisInterfaces"; const proj4 = require("proj4").default; @@ -47,49 +44,6 @@ interface RectangleExtent { north: number; } -interface DocumentInfo { - Author?: string; - Title?: string; -} - -interface TimeInfo { - timeExtent: [number, number]; -} - -interface MapServer { - documentInfo?: DocumentInfo; - description?: string; - copyrightText?: string; - mapName?: string; - timeInfo?: TimeInfo; - layers: Layer[]; - fullExtent: Extent; -} - -interface SpatialReference { - wkid?: number; - latestWkid?: number; -} - -interface Extent { - xmin: number; - ymin: number; - xmax: number; - ymax: number; - spatialReference?: SpatialReference; -} - -interface Layer { - id: number; - name: string; - maxScale: number; - - // The following is pulled from /layers or / - description?: string; - copyrightText?: string; - extent?: Extent; -} - interface Legend { label?: string; contentType: string; @@ -109,8 +63,8 @@ class MapServerStratum extends LoadableStratum( constructor( private readonly _item: ArcGisMapServerCatalogItem, - private readonly _mapServer: MapServer, - private readonly _allLayers: Layer[], + readonly mapServer: MapServer, + readonly allLayers: Layer[], private readonly _legends: Legends | undefined, readonly token: string | undefined ) { @@ -120,17 +74,13 @@ class MapServerStratum extends LoadableStratum( duplicateLoadableStratum(newModel: BaseModel): this { return new MapServerStratum( newModel as ArcGisMapServerCatalogItem, - this._mapServer, - this._allLayers, + this.mapServer, + this.allLayers, this._legends, this.token ) as this; } - get mapServerData() { - return this._mapServer; - } - static async load(item: ArcGisMapServerCatalogItem) { if (!isDefined(item.uri)) { throw new TerriaError({ @@ -164,7 +114,10 @@ class MapServerStratum extends LoadableStratum( } // TODO: if tokenUrl, fetch and pass token as parameter - const serviceMetadata = await getJson(item, serviceUri); + const serviceMetadata: MapServer | undefined = await getJson( + item, + serviceUri + ); if (!isDefined(serviceMetadata)) { throw networkRequestError({ @@ -173,35 +126,43 @@ class MapServerStratum extends LoadableStratum( }); } - let layersMetadataResponse = await getJson(item, layersUri); - const legendMetadata = await getJson(item, legendUri); + const legendMetadata: Legends | undefined = await getJson(item, legendUri); + let layers: Layer[] = []; - // TODO: some error handling on these requests would be nice + // If this MapServer is a single fused map cache - we can't request individual layers + // If it is not - we request layer metadata - let layers: Layer[] | undefined; + if ( + !( + serviceMetadata.singleFusedMapCache && + serviceMetadata.capabilities?.includes("TilesOnly") + ) + ) { + const layersMetadataResponse = await getJson(item, layersUri); - // Use the slightly more basic layer metadata - if (isDefined(serviceMetadata.layers)) { - layers = serviceMetadata.layers; - } + // Use the slightly more basic layer metadata + if (isDefined(serviceMetadata.layers)) { + layers = serviceMetadata.layers; + } - if (isDefined(layersMetadataResponse?.layers)) { - layers = layersMetadataResponse.layers; - // If layersMetadata is only a single layer -> shove into an array - } else if (isDefined(layersMetadataResponse?.id)) { - layers = [layersMetadataResponse]; - } + if (isDefined(layersMetadataResponse?.layers)) { + layers = layersMetadataResponse.layers; + // If layersMetadata is only a single layer -> shove into an array + } else if (isDefined(layersMetadataResponse?.id)) { + layers = [layersMetadataResponse]; + } - if (!isDefined(layers) || layers.length === 0) { - throw networkRequestError({ - title: i18next.t( - "models.arcGisMapServerCatalogItem.noLayersFoundTitle" - ), - message: i18next.t( - "models.arcGisMapServerCatalogItem.noLayersFoundMessage", - item - ) - }); + if (!isDefined(layers) || layers.length === 0) { + throw networkRequestError({ + title: i18next.t( + "models.arcGisMapServerCatalogItem.noLayersFoundTitle" + ), + message: i18next.t( + "models.arcGisMapServerCatalogItem.noLayersFoundMessage", + item + ) + }); + } } const stratum = new MapServerStratum( @@ -214,45 +175,59 @@ class MapServerStratum extends LoadableStratum( return stratum; } - @computed get allLayers() { - return filterOutUndefined(findLayers(this._allLayers, this._item.layers)); - } - @computed get maximumScale() { + if (this._item.layersArray.length === 0) { + return this.mapServer.maxScale; + } + return Math.min( - ...filterOutUndefined(this.allLayers.map(({ maxScale }) => maxScale)) + ...filterOutUndefined( + this._item.layersArray.map(({ maxScale }) => maxScale) + ) ); } + @computed get layers() { + /** Try to pull out MapServer layer from URL + * eg https://exmaple.com/arcgis/rest/services/MapServer/{layer} + */ + if (isDefined(this._item.uri)) { + const lastSegment = this._item.uri.segment(-1); + if (isDefined(lastSegment) && lastSegment.match(/\d+/)) { + return lastSegment; + } + } + } + @computed get name() { // single layer if ( - this.allLayers.length === 1 && - this.allLayers[0].name && - this.allLayers[0].name.length > 0 + this._item.layersArray.length === 1 && + this._item.layersArray[0].name && + this._item.layersArray[0].name.length > 0 ) { - return replaceUnderscores(this.allLayers[0].name); + return replaceUnderscores(this._item.layersArray[0].name); } - // group of layers + // group of layers (or single fused map cache) else if ( - this._mapServer.documentInfo && - this._mapServer.documentInfo.Title && - this._mapServer.documentInfo.Title.length > 0 + this.mapServer.documentInfo && + this.mapServer.documentInfo.Title && + this.mapServer.documentInfo.Title.length > 0 ) { - return replaceUnderscores(this._mapServer.documentInfo.Title); - } else if (this._mapServer.mapName && this._mapServer.mapName.length > 0) { - return replaceUnderscores(this._mapServer.mapName); + return replaceUnderscores(this.mapServer.documentInfo.Title); + } else if (this.mapServer.mapName && this.mapServer.mapName.length > 0) { + return replaceUnderscores(this.mapServer.mapName); } } @computed get dataCustodian() { if ( - this._mapServer.documentInfo && - this._mapServer.documentInfo.Author && - this._mapServer.documentInfo.Author.length > 0 + this.mapServer.documentInfo && + this.mapServer.documentInfo.Author && + this.mapServer.documentInfo.Author.length > 0 ) { - return this._mapServer.documentInfo.Author; + return this.mapServer.documentInfo.Author; } } @@ -263,62 +238,51 @@ class MapServerStratum extends LoadableStratum( east: -Infinity, north: -Infinity }; + // If we only have the summary layer info - if (!("extent" in this._allLayers[0])) { - getRectangleFromLayer(this.mapServerData.fullExtent, rectangle); + if ( + this._item.layersArray.length === 0 || + !("extent" in this._item.layersArray[0]) + ) { + getRectangleFromLayer(this.mapServer.fullExtent, rectangle); } else { - getRectangleFromLayers(rectangle, this._allLayers); + getRectangleFromLayers(rectangle, this._item.layersArray); } - if (rectangle.west === Infinity) return undefined; - return createStratumInstance(RectangleTraits, rectangle); - } - - @computed get discreteTimes() { - if (this._mapServer.timeInfo === undefined) return undefined; - // Add union type - as `time` is always defined - const result: (StratumFromTraits & { - time: string; - })[] = []; - createDiscreteTimesFromIsoSegments( - result, - new Date(this._mapServer.timeInfo.timeExtent[0]).toISOString(), - new Date(this._mapServer.timeInfo.timeExtent[1]).toISOString(), - undefined, - this._item.maxRefreshIntervals - ); - return result; + if (rectangle.west === Infinity) return; + return createStratumInstance(RectangleTraits, rectangle); } @computed get info() { - const layer = this.allLayers[0]; - if (!isDefined(layer)) { - return []; - } - - return [ - createStratumInstance(InfoSectionTraits, { - name: i18next.t("models.arcGisMapServerCatalogItem.dataDescription"), - content: layer.description - }), + // If we are requesting a single layer, use it to populate InfoSections + // If we are requesting multiple layers - we only show MapServer metadata (not metadata per layer) + const singleLayer = + this._item.layersArray.length === 1 + ? this._item.layersArray[0] + : undefined; + + return filterOutUndefined([ + singleLayer + ? createStratumInstance(InfoSectionTraits, { + name: i18next.t( + "models.arcGisMapServerCatalogItem.dataDescription" + ), + content: singleLayer.description + }) + : undefined, createStratumInstance(InfoSectionTraits, { name: i18next.t("models.arcGisMapServerCatalogItem.serviceDescription"), - content: this._mapServer.description + content: this.mapServer.description }), createStratumInstance(InfoSectionTraits, { name: i18next.t("models.arcGisMapServerCatalogItem.copyrightText"), - content: - isDefined(layer.copyrightText) && layer.copyrightText.length > 0 - ? layer.copyrightText - : this._mapServer.copyrightText + content: singleLayer?.copyrightText ?? this.mapServer.copyrightText }) - ]; + ]); } @computed get legends() { - const layers = isDefined(this._item.layers) - ? this._item.layers.split(",") - : []; + const layers = this._item.layersArray; const noDataRegex = /^No[\s_-]?Data$/i; const labelsRegex = /_Labels$/; @@ -330,8 +294,8 @@ class MapServerStratum extends LoadableStratum( } if ( layers.length > 0 && - layers.indexOf(l.layerId.toString()) < 0 && - layers.indexOf(l.layerName) < 0 + !layers.find((layer) => layer.id === l.layerId) && + !layers.find((layer) => layer.name === l.layerName) ) { // layer not selected return; @@ -399,8 +363,22 @@ export default class ArcGisMapServerCatalogItem extends UrlMixin( get discreteTimes() { const mapServerStratum: MapServerStratum | undefined = this.strata.get( MapServerStratum.stratumName - ) as MapServerStratum; - return mapServerStratum?.discreteTimes; + ) as MapServerStratum | undefined; + + if (mapServerStratum?.mapServer.timeInfo === undefined) return undefined; + // Add union type - as `time` is always defined + const result: (StratumFromTraits & { + time: string; + })[] = []; + + createDiscreteTimesFromIsoSegments( + result, + new Date(mapServerStratum.mapServer.timeInfo.timeExtent[0]).toISOString(), + new Date(mapServerStratum.mapServer.timeInfo.timeExtent[1]).toISOString(), + undefined, + this.maxRefreshIntervals + ); + return result; } @computed @@ -472,19 +450,21 @@ export default class ArcGisMapServerCatalogItem extends UrlMixin( true, false ); - const dynamicRequired = this.layers && this.layers.length > 0; - const layers = this.layerIds || this.layers; + const imageryProvider = new ArcGisMapServerImageryProvider({ url: cleanAndProxyUrl(this, getBaseURI(this).toString()), - layers: layers, + layers: this.layersArray.map((l) => l.id).join(","), tilingScheme: new WebMercatorTilingScheme(), maximumLevel: maximumLevel, tileHeight: this.tileHeight, tileWidth: this.tileWidth, parameters: params, enablePickFeatures: this.allowFeaturePicking, - usePreCachedTilesIfAvailable: !dynamicRequired, - mapServerData: stratum.mapServerData, + /** Only used "pre-cached" tiles if we aren't requesting any specific layers + * If the `layersArray` property is specified, we request individual dynamic layers and ignore the fused map cache. + */ + usePreCachedTilesIfAvailable: this.layersArray.length == 0, + mapServerData: stratum.mapServer, token: stratum.token, credit: this.attribution }); @@ -510,45 +490,14 @@ export default class ArcGisMapServerCatalogItem extends UrlMixin( return result; } - @computed get layers() { - if (super.layers) { - return super.layers; - } - - if (isDefined(this.uri)) { - const lastSegment = this.uri.segment(-1); - if (isDefined(lastSegment) && lastSegment.match(/\d+/)) { - return lastSegment; - } - } - } - - @computed - get layerIds(): string | undefined { - const stratum = ( - this.strata.get(MapServerStratum.stratumName) - ); - const ids = stratum ? stratum.allLayers.map((l) => l.id) : []; - return ids.length === 0 ? undefined : ids.join(","); - } - - @computed get allSelectedLayers() { - const stratum = ( + /** Return array of MapServer layers from `layers` trait (which is CSV of layer IDs) - this will only return **valid** MapServer layers.*/ + @computed get layersArray() { + const stratum = ( this.strata.get(MapServerStratum.stratumName) ); - if (!isDefined(stratum)) { - return []; - } + if (!stratum) return []; - if (!isDefined(this.layers)) { - // if no layer is specified, return all layers - return stratum.allLayers; - } - - const layerIds = this.layers.split(","); - return stratum.allLayers.filter(({ id }) => - layerIds.find((x) => x == id.toString()) - ); + return filterOutUndefined(findLayers(stratum.allLayers, this.layers)); } } diff --git a/lib/Traits/TraitsClasses/ArcGisMapServerCatalogItemTraits.ts b/lib/Traits/TraitsClasses/ArcGisMapServerCatalogItemTraits.ts index 4c69f78239c..bb6ccc18224 100644 --- a/lib/Traits/TraitsClasses/ArcGisMapServerCatalogItemTraits.ts +++ b/lib/Traits/TraitsClasses/ArcGisMapServerCatalogItemTraits.ts @@ -23,7 +23,7 @@ export default class ArcGisMapServerCatalogItemTraits extends mixTraits( type: "string", name: "Layer(s)", description: - "The layer or layers to display. This can be a comma seperated string of layer IDs or names." + "The layer or layers to display. This can be a comma separated string of layer IDs or names." }) layers?: string; diff --git a/test/Models/Catalog/esri/ArcGisCatalogGroupSpec.ts b/test/Models/Catalog/esri/ArcGisCatalogGroupSpec.ts index d724d987b1f..2a8df171eed 100644 --- a/test/Models/Catalog/esri/ArcGisCatalogGroupSpec.ts +++ b/test/Models/Catalog/esri/ArcGisCatalogGroupSpec.ts @@ -1,17 +1,16 @@ +import i18next from "i18next"; import { configure, runInAction } from "mobx"; import _loadWithXhr from "../../../../lib/Core/loadWithXhr"; -import Terria from "../../../../lib/Models/Terria"; import ArcGisCatalogGroup from "../../../../lib/Models/Catalog/Esri/ArcGisCatalogGroup"; -import CommonStrata from "../../../../lib/Models/Definition/CommonStrata"; -import i18next from "i18next"; -import ArcGisMapServerCatalogItem from "../../../../lib/Models/Catalog/Esri/ArcGisMapServerCatalogItem"; -import TerriaError from "../../../../lib/Core/TerriaError"; -import ArcGisMapServerCatalogGroup, { - MapServerStratum -} from "../../../../lib/Models/Catalog/Esri/ArcGisMapServerCatalogGroup"; import ArcGisFeatureServerCatalogGroup, { FeatureServerStratum } from "../../../../lib/Models/Catalog/Esri/ArcGisFeatureServerCatalogGroup"; +import ArcGisMapServerCatalogGroup, { + MapServerStratum +} from "../../../../lib/Models/Catalog/Esri/ArcGisMapServerCatalogGroup"; +import ArcGisMapServerCatalogItem from "../../../../lib/Models/Catalog/Esri/ArcGisMapServerCatalogItem"; +import CommonStrata from "../../../../lib/Models/Definition/CommonStrata"; +import Terria from "../../../../lib/Models/Terria"; configure({ enforceActions: "observed", @@ -44,6 +43,7 @@ describe("ArcGisCatalogGroup", function () { // We replace calls to real servers with pre-captured JSON files so our testing is isolated, but reflects real data. spyOn(loadWithXhr, "load").and.callFake(function (...args: any[]) { let url = args[0]; + if (url.match("Redlands_Emergency_Vehicles/MapServer")) { url = url.replace(/^.*\/MapServer/, "MapServer"); url = url.replace(/MapServer\/?\?f=json$/i, "mapServer.json"); @@ -82,6 +82,12 @@ describe("ArcGisCatalogGroup", function () { "CommunityAddressingMS.json" ); args[0] = "test/ArcGisServer/sampleserver6/" + url; + } else if (url.match("SingleFusedMapCache/MapServer")) { + url = url.replace(/^.*\/MapServer/, "MapServer"); + url = url.replace(/MapServer\/?\?.*/i, "mapserver.json"); + url = url.replace(/MapServer\/Legend\/?\?.*/i, "legend.json"); + url = url.replace(/MapServer\/Layers\/?\?.*/i, "layers.json"); + args[0] = "test/ArcGisMapServer/SingleFusedMapCache/" + url; } return realLoadWithXhr(...args); @@ -223,4 +229,30 @@ describe("ArcGisCatalogGroup", function () { expect(arcgisServerStratum instanceof FeatureServerStratum).toBeTruthy(); }); }); + + describe("Supports MapServer with TilesOnly single fused map cache", function () { + beforeEach(async () => { + runInAction(() => { + group.setTrait( + CommonStrata.definition, + "url", + "http://www.example.com/SingleFusedMapCache/MapServer" + ); + }); + (await group.loadMembers()).throwIfError(); + }); + + it('Creates a single item called "models.arcGisMapServerCatalogGroup.singleFusedMapCacheLayerName"', async function () { + expect(group.memberModels.length).toBe(1); + expect( + group.memberModels[0] instanceof ArcGisMapServerCatalogItem + ).toBeTruthy(); + const item = group.memberModels[0] as ArcGisMapServerCatalogItem; + expect(item.name).toBe( + "models.arcGisMapServerCatalogGroup.singleFusedMapCacheLayerName" + ); + expect(item.layers).toBeUndefined(); + expect(item.layersArray.length).toBe(0); + }); + }); }); diff --git a/test/Models/Catalog/esri/ArcGisMapServerCatalogGroupSpec.ts b/test/Models/Catalog/esri/ArcGisMapServerCatalogGroupSpec.ts index be3eb31dde2..06bf70be5f3 100644 --- a/test/Models/Catalog/esri/ArcGisMapServerCatalogGroupSpec.ts +++ b/test/Models/Catalog/esri/ArcGisMapServerCatalogGroupSpec.ts @@ -36,12 +36,17 @@ describe("ArcGisMapServerCatalogGroup", function () { // We replace calls to real servers with pre-captured JSON files so our testing is isolated, but reflects real data. spyOn(loadWithXhr, "load").and.callFake(function (...args: any[]) { let url = args[0]; - if (url.match("Redlands_Emergency_Vehicles/MapServer")) { url = url.replace(/^.*\/MapServer/, "MapServer"); url = url.replace(/MapServer\/?\?f=json$/i, "mapServer.json"); url = url.replace(/MapServer\/17\/?\?.*/i, "17.json"); args[0] = "test/ArcGisMapServer/Redlands_Emergency_Vehicles/" + url; + } else if (url.match("SingleFusedMapCache/MapServer")) { + url = url.replace(/^.*\/MapServer/, "MapServer"); + url = url.replace(/MapServer\/?\?.*/i, "mapserver.json"); + url = url.replace(/MapServer\/Legend\/?\?.*/i, "legend.json"); + url = url.replace(/MapServer\/Layers\/?\?.*/i, "layers.json"); + args[0] = "test/ArcGisMapServer/SingleFusedMapCache/" + url; } return realLoadWithXhr(...args); @@ -154,6 +159,32 @@ describe("ArcGisMapServerCatalogGroup", function () { expect(error).toBeDefined("Load member should error"); }); }); + + describe("Supports MapServer with TilesOnly single fused map cache", function () { + beforeEach(async () => { + runInAction(() => { + group.setTrait( + CommonStrata.definition, + "url", + "http://www.example.com/SingleFusedMapCache/MapServer" + ); + }); + (await group.loadMembers()).throwIfError(); + }); + + it('Creates a single item called "models.arcGisMapServerCatalogGroup.singleFusedMapCacheLayerName"', async function () { + expect(group.memberModels.length).toBe(1); + expect( + group.memberModels[0] instanceof ArcGisMapServerCatalogItem + ).toBeTruthy(); + const item = group.memberModels[0] as ArcGisMapServerCatalogItem; + expect(item.name).toBe( + "models.arcGisMapServerCatalogGroup.singleFusedMapCacheLayerName" + ); + expect(item.layers).toBeUndefined(); + expect(item.layersArray.length).toBe(0); + }); + }); }); describe("ArcGisMapServerCatalogGroup creates its layer members with given traits", function () { diff --git a/test/Models/Catalog/esri/ArcGisMapServerCatalogItemSpec.ts b/test/Models/Catalog/esri/ArcGisMapServerCatalogItemSpec.ts index 68ad803eed9..638e413423b 100644 --- a/test/Models/Catalog/esri/ArcGisMapServerCatalogItemSpec.ts +++ b/test/Models/Catalog/esri/ArcGisMapServerCatalogItemSpec.ts @@ -2,7 +2,6 @@ import i18next from "i18next"; import { configure, runInAction } from "mobx"; import WebMercatorTilingScheme from "terriajs-cesium/Source/Core/WebMercatorTilingScheme"; import ArcGisMapServerImageryProvider from "terriajs-cesium/Source/Scene/ArcGisMapServerImageryProvider"; -import isDefined from "../../../../lib/Core/isDefined"; import _loadWithXhr from "../../../../lib/Core/loadWithXhr"; import ArcGisMapServerCatalogItem from "../../../../lib/Models/Catalog/Esri/ArcGisMapServerCatalogItem"; import Terria from "../../../../lib/Models/Terria"; @@ -23,6 +22,7 @@ const loadWithXhr: ExtendedLoadWithXhr = _loadWithXhr; describe("ArcGisMapServerCatalogItem", function () { const mapServerUrl = "http://www.example.com/Dynamic_National_Map_Hydrography_and_Marine/MapServer"; + const singleLayerUrl = mapServerUrl + "/31"; let item: ArcGisMapServerCatalogItem; @@ -34,6 +34,7 @@ describe("ArcGisMapServerCatalogItem", function () { spyOn(loadWithXhr, "load").and.callFake(function (...args: any[]) { let url = args[0]; url = url.replace("http://example.com/42/", ""); + if (url.match("Dynamic_National_Map_Hydrography_and_Marine/MapServer")) { url = url.replace(/^.*\/MapServer/, "MapServer"); url = url.replace(/MapServer\/?\?.*/i, "mapserver.json"); @@ -43,6 +44,12 @@ describe("ArcGisMapServerCatalogItem", function () { args[0] = "test/ArcGisMapServer/Dynamic_National_Map_Hydrography_and_Marine/" + url; + } else if (url.match("SingleFusedMapCache/MapServer")) { + url = url.replace(/^.*\/MapServer/, "MapServer"); + url = url.replace(/MapServer\/?\?.*/i, "mapserver.json"); + url = url.replace(/MapServer\/Legend\/?\?.*/i, "legend.json"); + url = url.replace(/MapServer\/Layers\/?\?.*/i, "layers.json"); + args[0] = "test/ArcGisMapServer/SingleFusedMapCache/" + url; } else if (url.match("/token")) { args[0] = "test/ArcGisMapServer/Dynamic_National_Map_Hydrography_and_Marine/token.json"; @@ -84,7 +91,7 @@ describe("ArcGisMapServerCatalogItem", function () { item.setTrait(CommonStrata.definition, "url", mapServerUrl); }); await item.loadMapItems(); - expect(item.allSelectedLayers.length).toBe(74); + expect(item.layersArray.length).toBe(74); }); it("can load specific layers", async function () { @@ -94,7 +101,17 @@ describe("ArcGisMapServerCatalogItem", function () { item.setTrait(CommonStrata.definition, "layers", "31,32"); }); await item.loadMapItems(); - expect(item.allSelectedLayers.length).toBe(2); + expect(item.layersArray.length).toBe(2); + }); + + it("can load specific layers - and ignore invalid layers", async function () { + runInAction(() => { + item = new ArcGisMapServerCatalogItem("test", new Terria()); + item.setTrait(CommonStrata.definition, "url", mapServerUrl); + item.setTrait(CommonStrata.definition, "layers", "31,32,ahhhh,200"); + }); + await item.loadMapItems(); + expect(item.layersArray.length).toBe(2); }); it("can load a single layer given in the URL", async function () { @@ -103,7 +120,7 @@ describe("ArcGisMapServerCatalogItem", function () { item.setTrait(CommonStrata.definition, "url", singleLayerUrl); }); await item.loadMapItems(); - expect(item.allSelectedLayers.length).toBe(1); + expect(item.layersArray.length).toBe(1); expect(item.layers).toBe("31"); }); @@ -248,7 +265,22 @@ describe("ArcGisMapServerCatalogItem", function () { }); }); - it("defines the name", function () { + it("defines the name - with no layers specified", function () { + // Using name from MapServer metadata + expect(item.name).toBe( + "Australia 250K Topographic Hydrography and Marine Layers" + ); + }); + + it("defines the name - with single layer specified", function () { + item.setTrait(CommonStrata.definition, "layers", "21"); + // Using name from layer 21 metadata + expect(item.name).toBe("Watercourses All Rivers Labels"); + }); + + it("defines the name - with multiple layers specified", function () { + item.setTrait(CommonStrata.definition, "layers", "21,22"); + // Using name from MapServer metadata - we don't support combining names across multiple layers expect(item.name).toBe( "Australia 250K Topographic Hydrography and Marine Layers" ); @@ -258,7 +290,34 @@ describe("ArcGisMapServerCatalogItem", function () { expect(item.dataCustodian).toBe("Geoscience Australia"); }); - it("defines a rectangle", function () { + it("defines maximum scale - with no layers specified", function () { + // With no layer specified, we expect rectangle to be calculated using all layer metadata + + expect(item.maximumScale).toBeDefined(); + expect(item.maximumScale).toEqual(0); + }); + + it("defines maximum scale - with single layer specified", function () { + // With a single layer specified, we expect rectangle to be calculated using layer metadata + + item.setTrait(CommonStrata.definition, "layers", "3"); + + expect(item.maximumScale).toBeDefined(); + expect(item.maximumScale).toEqual(70000); + }); + + it("defines maximum scale - with multiple layers specified", function () { + // With a multiple layers specified, we expect rectangle to be a union of all calculated rectangles from each layer metadata. + + item.setTrait(CommonStrata.definition, "layers", "19,20"); + + expect(item.maximumScale).toBeDefined(); + expect(item.maximumScale).toEqual(300001); + }); + + it("defines a rectangle - with no layers specified", function () { + // With no layer specified, we expect rectangle to be calculated using MapServer metadata + expect(item.rectangle).toBeDefined(); expect(item.rectangle.west).toEqual(97.90759300700006); expect(item.rectangle.south).toEqual(-54.25906877199998); @@ -266,7 +325,47 @@ describe("ArcGisMapServerCatalogItem", function () { expect(item.rectangle.north).toEqual(0.9835908000000587); }); - it("defines info", function () { + it("defines a rectangle - with single layer specified", function () { + // With a single layer specified, we expect rectangle to be calculated using layer metadata + + item.setTrait(CommonStrata.definition, "layers", "3"); + + expect(item.rectangle).toBeDefined(); + expect(item.rectangle.west).toEqual(113.11904000000004); + expect(item.rectangle.south).toEqual(-43.66633999999999); + expect(item.rectangle.east).toEqual(153.62995); + expect(item.rectangle.north).toEqual(-9.063350000000014); + }); + + it("defines a rectangle - with multiple layers specified", function () { + // With a multiple layers specified, we expect rectangle to be a union of all calculated rectangles from each layer metadata. + + item.setTrait(CommonStrata.definition, "layers", "4,5"); + + expect(item.rectangle).toBeDefined(); + expect(item.rectangle.west).toEqual(112.92034999999998); + expect(item.rectangle.south).toEqual(-43.65735999999998); + expect(item.rectangle.east).toEqual(153.63570000000004); + expect(item.rectangle.north).toEqual(-8.99857000000003); + }); + + it("defines info - no layer specified", function () { + // With no layer specified, we expect to only get description and copyright text from MapServer metadata + expect(item.info.map(({ name, content }) => [name, content])).toEqual([ + [ + i18next.t("models.arcGisMapServerCatalogItem.serviceDescription"), + "This service has been created specifically for display in the National Map and the symbology displayed may not suit other mapping applications. The AusHydro dataset represents the Australia's surface hydrology at a national scale. It includes natural and man-made geographic features such as: watercourse areas, swamps, reservoirs, canals, etc. This product presents hydrology polygon, point and line features which topologically connect and forms a complete flow path network for the entire continent of Australia. The GEODATA 250K data are best suited to graphical applications. These data may vary greatly in quality depending on the method of capture and digitising specifications in place at the time of capture. These features include the culture, drainage, hydrography, waterbodies and marine themes. Some datasets reflects the increasing data from scale to scale. The data is sourced from Geoscience Australia 250K Topographic data and AusHydro_V_2_0 data." + ], + [ + i18next.t("models.arcGisMapServerCatalogItem.copyrightText"), + "Geoscience Australia, AusHydro Contributors (Geoscience Australia, NSW Department Land and Property Information, Queensland Department of National Resources and Mines, Victorian Department of Environment, Land, Water and Planning, South Australia Department for Environment, Water and Natural Resources, Tasmanian Department of Primary Industries, Parks, Water and Environment and Western Australian Land Information Authority (Landgate) )" + ] + ]); + }); + + it("defines info - with single layer specified", function () { + // With a single layer specified, we expect to get description and copyright text from Layer metadata (in addition to description from MapServer metadata) + item.setTrait(CommonStrata.definition, "layers", "0"); expect(item.info.map(({ name, content }) => [name, content])).toEqual([ [ i18next.t("models.arcGisMapServerCatalogItem.dataDescription"), @@ -283,14 +382,71 @@ describe("ArcGisMapServerCatalogItem", function () { ]); }); - it("defines legends", function () { + it("defines info - with multiple layers specified", function () { + // With a multiple layers specified, we expect to only get description and copyright text from MapServer metadata. + // We currently don't support showing description and copyright text if more than 1 layer is specified + item.setTrait(CommonStrata.definition, "layers", "0,1"); + expect(item.info.map(({ name, content }) => [name, content])).toEqual([ + [ + i18next.t("models.arcGisMapServerCatalogItem.serviceDescription"), + "This service has been created specifically for display in the National Map and the symbology displayed may not suit other mapping applications. The AusHydro dataset represents the Australia's surface hydrology at a national scale. It includes natural and man-made geographic features such as: watercourse areas, swamps, reservoirs, canals, etc. This product presents hydrology polygon, point and line features which topologically connect and forms a complete flow path network for the entire continent of Australia. The GEODATA 250K data are best suited to graphical applications. These data may vary greatly in quality depending on the method of capture and digitising specifications in place at the time of capture. These features include the culture, drainage, hydrography, waterbodies and marine themes. Some datasets reflects the increasing data from scale to scale. The data is sourced from Geoscience Australia 250K Topographic data and AusHydro_V_2_0 data." + ], + [ + i18next.t("models.arcGisMapServerCatalogItem.copyrightText"), + "Geoscience Australia, AusHydro Contributors (Geoscience Australia, NSW Department Land and Property Information, Queensland Department of National Resources and Mines, Victorian Department of Environment, Land, Water and Planning, South Australia Department for Environment, Water and Natural Resources, Tasmanian Department of Primary Industries, Parks, Water and Environment and Western Australian Land Information Authority (Landgate) )" + ] + ]); + }); + + it("defines legends - with no layers specified", function () { expect(item.legends).toBeDefined(); - if (isDefined(item.legends)) { - expect(item.legends.length).toBe(1); - if (isDefined(item.legends[0].items)) { - expect(item.legends[0].items.length).toBe(30); - } - } + expect(item.legends?.length).toBe(1); + expect(item.legends[0].items.length).toBe(30); + expect(item.legends[0].items[0].imageUrl).toBe( + "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAMAAACelLz8AAAAAXNSR0IB2cksfwAAAANQTFRF/v//pgZx/wAAAAF0Uk5TAEDm2GYAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAAPSURBVCiRY2AYBaNgqAIAAr4AAU6byIwAAAAASUVORK5CYII=" + ); + }); + + it("defines legends - with single layer specified - with duplicate legends", async function () { + item.setTrait(CommonStrata.definition, "layers", "61"); + + expect(item.legends).toBeDefined(); + + expect(item.legends?.length).toBe(1); + expect(item.legends[0].items.length).toBe(2); // Note we expect 2 legends here instead of 3 because there are two legends with the same imageUrl + expect(item.legends[0].items[0].imageUrl).toBe( + "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAMAAACelLz8AAAAAXNSR0IB2cksfwAAAAlQTFRF/v//dLP/z9roPw4QXgAAAAN0Uk5TAP//RFDWIQAAAAlwSFlzAAAOxAAADsQBlSsOGwAAABxJREFUKJFjYCATMGIFECkmLGBUalQKf7IhAwAAvwYDdd8LbKYAAAAASUVORK5CYII=" + ); + expect(item.legends[0].items[1].imageUrl).toBe( + "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAMAAACelLz8AAAAAXNSR0IB2cksfwAAAAlQTFRF/v//vtL/4+XainG3SQAAAAN0Uk5TAP//RFDWIQAAAAlwSFlzAAAOxAAADsQBlSsOGwAAABxJREFUKJFjYCATMGIFECkmLGBUalQKf7IhAwAAvwYDdd8LbKYAAAAASUVORK5CYII=" + ); + }); + + it("defines legends - with single layer specified - with unique legends", async function () { + item.setTrait(CommonStrata.definition, "layers", "67"); + + expect(item.legends).toBeDefined(); + + expect(item.legends?.length).toBe(1); + expect(item.legends[0].items.length).toBe(2); + expect(item.legends[0].items[0].imageUrl).toBe( + "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAMAAACelLz8AAAAAXNSR0IB2cksfwAAAAZQTFRF/v//a5HBXiVtZwAAAAJ0Uk5TAP9bkSK1AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAFklEQVQokWNgGAVUAIxYASGpUUAhAAA/EgAtc3XmGwAAAABJRU5ErkJggg==" + ); + expect(item.legends[0].items[1].imageUrl).toBe( + "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAMAAACelLz8AAAAAXNSR0IB2cksfwAAAAZQTFRF/v//a5HBXiVtZwAAAAJ0Uk5TAP9bkSK1AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAFUlEQVQokWNgGAW0BYxYwUC7angAAB+/ABeuicGgAAAAAElFTkSuQmCC" + ); + }); + + it("defines legends - with multiple layers specified", async function () { + item.setTrait( + CommonStrata.definition, + "layers", + "58,59,60,61,62,63,64,65,66,67" + ); + + expect(item.legends).toBeDefined(); + expect(item.legends?.length).toBe(1); + expect(item.legends[0].items.length).toBe(6); }); }); @@ -312,4 +468,58 @@ describe("ArcGisMapServerCatalogItem", function () { expect(item.stopTime).toBe("2019-11-03T14:00:00.000000000Z"); }); }); + + describe("TilesOnly + single fused map cache server", function () { + beforeEach(async () => { + runInAction(() => { + item = new ArcGisMapServerCatalogItem("test", new Terria()); + item.setTrait( + CommonStrata.definition, + "url", + "http://www.example.com/SingleFusedMapCache/MapServer" + ); + }); + (await item.loadMapItems()).throwIfError(); + }); + + it("doesn't request specific layers", async function () { + expect(item.layers).toBeUndefined(); + expect(item.layersArray.length).toBe(0); + }); + + it("defines legends", async function () { + expect(item.legends.length).toBe(1); + expect(item.legends[0].items.length).toBe(3); + }); + + it("defines name", async function () { + expect(item.name).toBe("Layers"); + }); + + it("defines info", function () { + expect(item.info.map(({ name, content }) => [name, content])).toEqual([ + [ + i18next.t("models.arcGisMapServerCatalogItem.serviceDescription"), + "Some test description" + ], + [ + i18next.t("models.arcGisMapServerCatalogItem.copyrightText"), + "Some copyright" + ] + ]); + }); + + it("defines maximum scale", function () { + expect(item.maximumScale).toBeDefined(); + expect(item.maximumScale).toEqual(0); + }); + + it("defines a rectangle", function () { + expect(item.rectangle).toBeDefined(); + expect(item.rectangle.west).toEqual(140.9657708472755); + expect(item.rectangle.south).toEqual(-38.86193867467817); + expect(item.rectangle.east).toEqual(149.47499857774622); + expect(item.rectangle.north).toEqual(-34.124254130456116); + }); + }); }); diff --git a/wwwroot/languages/en/translation.json b/wwwroot/languages/en/translation.json index 25524214000..90cede1233a 100644 --- a/wwwroot/languages/en/translation.json +++ b/wwwroot/languages/en/translation.json @@ -881,7 +881,8 @@ "invalidServiceTitle": "Invalid ArcGIS Map Service", "invalidServiceMessage": "An error occurred while invoking the ArcGIS Map Service. The server's response does not appear to be a valid Map Service document.", "groupNotAvailableTitle": "Group is not available", - "groupNotAvailableMessage": "An error occurred while invoking the ArcGIS Map Service." + "groupNotAvailableMessage": "An error occurred while invoking the ArcGIS Map Service.", + "singleFusedMapCacheLayerName": "All layers" }, "arcGisMapServerCatalogItem": { "name": "Esri ArcGIS MapServer", diff --git a/wwwroot/test/ArcGisMapServer/SingleFusedMapCache/layers.json b/wwwroot/test/ArcGisMapServer/SingleFusedMapCache/layers.json new file mode 100644 index 00000000000..fcfada97310 --- /dev/null +++ b/wwwroot/test/ArcGisMapServer/SingleFusedMapCache/layers.json @@ -0,0 +1,71 @@ +{ + "layers": [ + { + "id": 0, + "name": "New Group Layer", + "parentLayerId": -1, + "defaultVisibility": true, + "subLayerIds": [1, 2, 3, 4, 5], + "minScale": 0, + "maxScale": 0, + "type": "Group Layer", + "supportsDynamicLegends": false + }, + { + "id": 1, + "name": "some-raster-layer-1", + "parentLayerId": 0, + "defaultVisibility": true, + "subLayerIds": null, + "minScale": 0, + "maxScale": 0, + "type": "Raster Layer", + "supportsDynamicLegends": true + }, + { + "id": 2, + "name": "some-raster-layer-2", + "parentLayerId": 0, + "defaultVisibility": true, + "subLayerIds": null, + "minScale": 0, + "maxScale": 0, + "type": "Raster Layer", + "supportsDynamicLegends": true + }, + { + "id": 3, + "name": "some-raster-layer-3", + "parentLayerId": 0, + "defaultVisibility": true, + "subLayerIds": null, + "minScale": 0, + "maxScale": 0, + "type": "Raster Layer", + "supportsDynamicLegends": true + }, + { + "id": 4, + "name": "some-raster-layer-4", + "parentLayerId": 0, + "defaultVisibility": true, + "subLayerIds": null, + "minScale": 0, + "maxScale": 0, + "type": "Raster Layer", + "supportsDynamicLegends": true + }, + { + "id": 5, + "name": "some-raster-layer-5", + "parentLayerId": 0, + "defaultVisibility": true, + "subLayerIds": null, + "minScale": 0, + "maxScale": 0, + "type": "Raster Layer", + "supportsDynamicLegends": true + } + ], + "tables": [] +} diff --git a/wwwroot/test/ArcGisMapServer/SingleFusedMapCache/legend.json b/wwwroot/test/ArcGisMapServer/SingleFusedMapCache/legend.json new file mode 100644 index 00000000000..c2b4a153df7 --- /dev/null +++ b/wwwroot/test/ArcGisMapServer/SingleFusedMapCache/legend.json @@ -0,0 +1,218 @@ +{ + "layers": [ + { + "id": 0, + "name": "New Group Layer", + "parentLayerId": -1, + "defaultVisibility": true, + "subLayerIds": [1, 2, 3, 4, 5], + "minScale": 0, + "maxScale": 0, + "type": "Group Layer", + "supportsDynamicLegends": false, + "layerId": 0, + "layerName": "New Group Layer", + "layerType": null + }, + { + "id": 1, + "name": "some-raster-layer-1", + "parentLayerId": 0, + "defaultVisibility": true, + "subLayerIds": null, + "minScale": 0, + "maxScale": 0, + "type": "Raster Layer", + "supportsDynamicLegends": true, + "legend": [ + { + "label": "Red: Red", + "imageData": "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAOklEQVQ4jWNhoDJgoZmB/8GIfMAIRrR0IbUAC9VMgoJRAykHLFQwAwWMGkg5YBnBBjJCyzOqGUgtAABgfwJTnasaYgAAAABJRU5ErkJggg==", + "contentType": "image/png", + "groupId": "0", + "height": 20, + "width": 20 + }, + { + "label": "Green: Green", + "imageData": "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAPElEQVQ4je3UoQ0AMBBCUS5h/5WvpkmDhjr+AE8gIMLxH7hYSxqMgqFY0I4+oRX0Y8CQCvq9De+f5cBQB19+AlPZl25RAAAAAElFTkSuQmCC", + "contentType": "image/png", + "groupId": "0", + "height": 20, + "width": 20 + }, + { + "label": "Blue: Blue", + "imageData": "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAPElEQVQ4jWNhoDJgoaGB//9TZhQjI5qB1AEsowZSDFgoNwIVjBpIOWChghkoYNRAygFSGELKMyoaSB0AAF59AlO8NYpcAAAAAElFTkSuQmCC", + "contentType": "image/png", + "groupId": "0", + "height": 20, + "width": 20 + } + ], + "layerId": 1, + "layerName": "some-raster-layer-1", + "layerType": null + }, + { + "id": 2, + "name": "some-raster-layer-2", + "parentLayerId": 0, + "defaultVisibility": true, + "subLayerIds": null, + "minScale": 0, + "maxScale": 0, + "type": "Raster Layer", + "supportsDynamicLegends": true, + "legend": [ + { + "label": "Red: Red", + "imageData": "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAOklEQVQ4jWNhoDJgoZmB/8GIfMAIRrR0IbUAC9VMgoJRAykHLFQwAwWMGkg5YBnBBjJCyzOqGUgtAABgfwJTnasaYgAAAABJRU5ErkJggg==", + "contentType": "image/png", + "groupId": "0", + "height": 20, + "width": 20 + }, + { + "label": "Green: Green", + "imageData": "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAPElEQVQ4je3UoQ0AMBBCUS5h/5WvpkmDhjr+AE8gIMLxH7hYSxqMgqFY0I4+oRX0Y8CQCvq9De+f5cBQB19+AlPZl25RAAAAAElFTkSuQmCC", + "contentType": "image/png", + "groupId": "0", + "height": 20, + "width": 20 + }, + { + "label": "Blue: Blue", + "imageData": "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAPElEQVQ4jWNhoDJgoaGB//9TZhQjI5qB1AEsowZSDFgoNwIVjBpIOWChghkoYNRAygFSGELKMyoaSB0AAF59AlO8NYpcAAAAAElFTkSuQmCC", + "contentType": "image/png", + "groupId": "0", + "height": 20, + "width": 20 + } + ], + "layerId": 2, + "layerName": "some-raster-layer-2", + "layerType": null + }, + { + "id": 3, + "name": "some-raster-layer-3", + "parentLayerId": 0, + "defaultVisibility": true, + "subLayerIds": null, + "minScale": 0, + "maxScale": 0, + "type": "Raster Layer", + "supportsDynamicLegends": true, + "legend": [ + { + "label": "Red: Red", + "imageData": "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAOklEQVQ4jWNhoDJgoZmB/8GIfMAIRrR0IbUAC9VMgoJRAykHLFQwAwWMGkg5YBnBBjJCyzOqGUgtAABgfwJTnasaYgAAAABJRU5ErkJggg==", + "contentType": "image/png", + "groupId": "0", + "height": 20, + "width": 20 + }, + { + "label": "Green: Green", + "imageData": "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAPElEQVQ4je3UoQ0AMBBCUS5h/5WvpkmDhjr+AE8gIMLxH7hYSxqMgqFY0I4+oRX0Y8CQCvq9De+f5cBQB19+AlPZl25RAAAAAElFTkSuQmCC", + "contentType": "image/png", + "groupId": "0", + "height": 20, + "width": 20 + }, + { + "label": "Blue: Blue", + "imageData": "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAPElEQVQ4jWNhoDJgoaGB//9TZhQjI5qB1AEsowZSDFgoNwIVjBpIOWChghkoYNRAygFSGELKMyoaSB0AAF59AlO8NYpcAAAAAElFTkSuQmCC", + "contentType": "image/png", + "groupId": "0", + "height": 20, + "width": 20 + } + ], + "layerId": 3, + "layerName": "some-raster-layer-3", + "layerType": null + }, + { + "id": 4, + "name": "some-raster-layer-2", + "parentLayerId": 0, + "defaultVisibility": true, + "subLayerIds": null, + "minScale": 0, + "maxScale": 0, + "type": "Raster Layer", + "supportsDynamicLegends": true, + "legend": [ + { + "label": "Red: Red", + "imageData": "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAOklEQVQ4jWNhoDJgoZmB/8GIfMAIRrR0IbUAC9VMgoJRAykHLFQwAwWMGkg5YBnBBjJCyzOqGUgtAABgfwJTnasaYgAAAABJRU5ErkJggg==", + "contentType": "image/png", + "groupId": "0", + "height": 20, + "width": 20 + }, + { + "label": "Green: Green", + "imageData": "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAPElEQVQ4je3UoQ0AMBBCUS5h/5WvpkmDhjr+AE8gIMLxH7hYSxqMgqFY0I4+oRX0Y8CQCvq9De+f5cBQB19+AlPZl25RAAAAAElFTkSuQmCC", + "contentType": "image/png", + "groupId": "0", + "height": 20, + "width": 20 + }, + { + "label": "Blue: Blue", + "imageData": "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAPElEQVQ4jWNhoDJgoaGB//9TZhQjI5qB1AEsowZSDFgoNwIVjBpIOWChghkoYNRAygFSGELKMyoaSB0AAF59AlO8NYpcAAAAAElFTkSuQmCC", + "contentType": "image/png", + "groupId": "0", + "height": 20, + "width": 20 + } + ], + "layerId": 4, + "layerName": "some-raster-layer-4", + "layerType": null + }, + { + "id": 5, + "name": "some-raster-layer-5", + "parentLayerId": 0, + "defaultVisibility": true, + "subLayerIds": null, + "minScale": 0, + "maxScale": 0, + "type": "Raster Layer", + "supportsDynamicLegends": true, + "legend": [ + { + "label": "Red: Red", + "imageData": "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAOklEQVQ4jWNhoDJgoZmB/8GIfMAIRrR0IbUAC9VMgoJRAykHLFQwAwWMGkg5YBnBBjJCyzOqGUgtAABgfwJTnasaYgAAAABJRU5ErkJggg==", + "contentType": "image/png", + "groupId": "0", + "height": 20, + "width": 20 + }, + { + "label": "Green: Green", + "imageData": "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAPElEQVQ4je3UoQ0AMBBCUS5h/5WvpkmDhjr+AE8gIMLxH7hYSxqMgqFY0I4+oRX0Y8CQCvq9De+f5cBQB19+AlPZl25RAAAAAElFTkSuQmCC", + "contentType": "image/png", + "groupId": "0", + "height": 20, + "width": 20 + }, + { + "label": "Blue: Blue", + "imageData": "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAPElEQVQ4jWNhoDJgoaGB//9TZhQjI5qB1AEsowZSDFgoNwIVjBpIOWChghkoYNRAygFSGELKMyoaSB0AAF59AlO8NYpcAAAAAElFTkSuQmCC", + "contentType": "image/png", + "groupId": "0", + "height": 20, + "width": 20 + } + ], + "layerId": 5, + "layerName": "some-raster-layer-5", + "layerType": null + } + ] +} diff --git a/wwwroot/test/ArcGisMapServer/SingleFusedMapCache/mapserver.json b/wwwroot/test/ArcGisMapServer/SingleFusedMapCache/mapserver.json new file mode 100644 index 00000000000..95c2afa0a12 --- /dev/null +++ b/wwwroot/test/ArcGisMapServer/SingleFusedMapCache/mapserver.json @@ -0,0 +1,256 @@ +{ + "id": "some-id", + "name": "some-name", + "capabilities": "Map,TilesOnly,Tilemap", + "description": "Some test description", + "serviceDescription": "Some service description", + "server": "some-server-id", + "type": "MapServer", + "access": "SECURE", + "status": "created", + "singleFusedMapCache": true, + "spatialReference": { + "wkid": 102100, + "latestWkid": 3857 + }, + "initialExtent": { + "xmin": 1.5692237829999998e7, + "ymin": -4701914.7225, + "xmax": 1.6639480728e7, + "ymax": -4045498.547699999, + "spatialReference": { + "wkid": 102100, + "latestWkid": 3857 + } + }, + "fullExtent": { + "xmin": 1.5692237829999998e7, + "ymin": -4701914.7225, + "xmax": 1.6639480728e7, + "ymax": -4045498.547699999, + "spatialReference": { + "wkid": 102100, + "latestWkid": 3857 + } + }, + "minScale": 0.0, + "maxScale": 0.0, + "minLOD": 15, + "maxLOD": 19, + "tileInfo": { + "rows": 256, + "cols": 256, + "dpi": 96, + "format": "PNG8", + "compressionQuality": 0, + "bandCount": 1, + "lercError": 0, + "storageFormat": "esriMapCacheStorageModeCompactV2", + "origin": { + "x": -2.0037508342787e7, + "y": 2.0037508342787e7 + }, + "spatialReference": { + "wkid": 102100, + "latestWkid": 3857 + }, + "lods": [ + { + "level": 0, + "resolution": 156543.033928, + "scale": 5.91657527591555e8 + }, + { + "level": 1, + "resolution": 78271.5169639999, + "scale": 2.95828763795777e8 + }, + { + "level": 2, + "resolution": 39135.7584820001, + "scale": 1.47914381897889e8 + }, + { + "level": 3, + "resolution": 19567.8792409999, + "scale": 7.3957190948944e7 + }, + { + "level": 4, + "resolution": 9783.93962049996, + "scale": 3.6978595474472e7 + }, + { + "level": 5, + "resolution": 4891.96981024998, + "scale": 1.8489297737236e7 + }, + { + "level": 6, + "resolution": 2445.98490512499, + "scale": 9244648.868618 + }, + { + "level": 7, + "resolution": 1222.99245256249, + "scale": 4622324.434309 + }, + { + "level": 8, + "resolution": 611.49622628138, + "scale": 2311162.217155 + }, + { + "level": 9, + "resolution": 305.748113140558, + "scale": 1155581.108577 + }, + { + "level": 10, + "resolution": 152.874056570411, + "scale": 577790.554289 + }, + { + "level": 11, + "resolution": 76.4370282850732, + "scale": 288895.277144 + }, + { + "level": 12, + "resolution": 38.2185141425366, + "scale": 144447.638572 + }, + { + "level": 13, + "resolution": 19.1092570712683, + "scale": 72223.819286 + }, + { + "level": 14, + "resolution": 9.55462853563415, + "scale": 36111.909643 + }, + { + "level": 15, + "resolution": 4.77731426794937, + "scale": 18055.954822 + }, + { + "level": 16, + "resolution": 2.38865713397468, + "scale": 9027.977411 + }, + { + "level": 17, + "resolution": 1.19432856685505, + "scale": 4513.988705 + }, + { + "level": 18, + "resolution": 0.597164283559817, + "scale": 2256.994353 + }, + { + "level": 19, + "resolution": 0.298582141647617, + "scale": 1128.497176 + }, + { + "level": 20, + "resolution": 0.14929107082380833, + "scale": 564.248588 + }, + { + "level": 21, + "resolution": 0.07464553541190416, + "scale": 282.124294 + }, + { + "level": 22, + "resolution": 0.03732276770595208, + "scale": 141.062147 + }, + { + "level": 23, + "resolution": 0.01866138385297604, + "scale": 70.5310735 + } + ] + }, + "documentInfo": { + "title": "Document title", + "author": "Some organisation", + "comments": "", + "subject": "Some document subject", + "category": "", + "keywords": "cool data", + "credits": null + }, + "copyrightText": "Some copyright", + "tileServers": null, + "maxExportTilesCount": 100000, + "exportTilesAllowed": false, + "serviceItemId": "service-item-id", + "mapName": "Layers", + "units": "esriMeters", + "supportedImageFormatTypes": "PNG8", + "layers": [ + { + "id": 0, + "name": "New Group Layer", + "parentLayerId": -1, + "defaultVisibility": true, + "subLayerIds": [1, 2, 3, 4, 5], + "minScale": 0, + "maxScale": 0 + }, + { + "id": 1, + "name": "some-raster-layer-1", + "parentLayerId": 0, + "defaultVisibility": true, + "subLayerIds": null, + "minScale": 0, + "maxScale": 0 + }, + { + "id": 2, + "name": "some-raster-layer-2", + "parentLayerId": 0, + "defaultVisibility": true, + "subLayerIds": null, + "minScale": 0, + "maxScale": 0 + }, + { + "id": 3, + "name": "some-raster-layer-3", + "parentLayerId": 0, + "defaultVisibility": true, + "subLayerIds": null, + "minScale": 0, + "maxScale": 0 + }, + { + "id": 4, + "name": "some-raster-layer-4", + "parentLayerId": 0, + "defaultVisibility": true, + "subLayerIds": null, + "minScale": 0, + "maxScale": 0 + }, + { + "id": 5, + "name": "some-raster-layer-5", + "parentLayerId": 0, + "defaultVisibility": true, + "subLayerIds": null, + "minScale": 0, + "maxScale": 0 + } + ], + "tables": null, + "resampling": true, + "currentVersion": 10.81 +} From 1e9f4acc69635f82fd11d54bbdedef01876b67bf Mon Sep 17 00:00:00 2001 From: Nanda Date: Wed, 5 Apr 2023 13:22:58 +1000 Subject: [PATCH 121/654] Release v8.2.27. --- CHANGES.md | 7 +++++-- package.json | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 0ed9e2fda15..b411c92e1af 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,6 +1,10 @@ # Change Log -#### next release (8.2.27) +#### next release (8.2.28) + +- [The next improvement] + +#### 8.2.27 - 2023-04-05 - Change icon used for display group remove button - Make access control UI compatible to Magda v1 and v2 with v2 overriding v1. @@ -12,7 +16,6 @@ - Optimize `Compass` component to reduce renders on each frame. - Add `children` optional property to StandardUserInterfaceProps interface - Add support for ArcGis MapServer with `TileOnly` capability - for example layers served from ArcGis Online. This is supported through `ArcGisMapServerCatalogItem`, `ArcGisMapServerCatalogGroup` and `ArcGisCatalogGroup`. -- [The next improvement] #### 8.2.26 - 2023-03-21 diff --git a/package.json b/package.json index 95853da5e6d..2efa478449a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "terriajs", - "version": "8.2.26", + "version": "8.2.27", "description": "Geospatial data visualization platform.", "license": "Apache-2.0", "engines": { From dc63b2dddcbe951a7554f706e9bc4429eaee83b1 Mon Sep 17 00:00:00 2001 From: Mats Henrikson Date: Wed, 5 Apr 2023 13:34:28 +1000 Subject: [PATCH 122/654] Update the 3Dtiles init example. --- wwwroot/test/init/cesium3dtiles.json | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/wwwroot/test/init/cesium3dtiles.json b/wwwroot/test/init/cesium3dtiles.json index bfe3c1cf0b2..7efd7679700 100644 --- a/wwwroot/test/init/cesium3dtiles.json +++ b/wwwroot/test/init/cesium3dtiles.json @@ -1,13 +1,16 @@ { "catalog": [ { - "name": "Cesium 3D Tiles", + "name": "Cesium 3D Tiles example", "type": "group", - "items": [ + "description": "This group has Cesium 3DTiles dataset examples", + "isOpen": true, + "members": [ { - "name": "Brisbane 3D city model (aero3Dpro)", + "name": "3DTiles test dataset (click Ideal Zoom to see)", "type": "3d-tiles", - "url": "https://sample.aero3dpro.com.au/BrisbaneCBD/Scene/recon_h_3DTiles.json", + "url": "https://qld.digitaltwin.terria.io/api/v0/data/2eeeadde-42a9-4372-aaec-abba6275a504/NPB/tileset.json", + "zoomOnAddToWorkbench": true, "options": { "maximumScreenSpaceError": 1, "maximumNumberOfLoadedTiles": 1000 From d1990d1cd38095b01ab222da7b542aafc453907a Mon Sep 17 00:00:00 2001 From: Nanda Date: Thu, 6 Apr 2023 14:11:15 +1000 Subject: [PATCH 123/654] Call `makeObservable` on combined result object . --- lib/Models/Definition/createCombinedModel.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/Models/Definition/createCombinedModel.ts b/lib/Models/Definition/createCombinedModel.ts index 472aee03fe5..cb94f03c75b 100644 --- a/lib/Models/Definition/createCombinedModel.ts +++ b/lib/Models/Definition/createCombinedModel.ts @@ -232,6 +232,7 @@ function createCombinedStratum( }); decorate(result, decorators); + makeObservable(result); return >(result); } From 16ace6526a8a127b3db5256359f8fe19000a1453 Mon Sep 17 00:00:00 2001 From: Nanda Date: Thu, 6 Apr 2023 16:29:43 +1000 Subject: [PATCH 124/654] Document function. --- lib/Models/Definition/addModelStrataView.ts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/lib/Models/Definition/addModelStrataView.ts b/lib/Models/Definition/addModelStrataView.ts index 817a2e60f50..42b80538182 100644 --- a/lib/Models/Definition/addModelStrataView.ts +++ b/lib/Models/Definition/addModelStrataView.ts @@ -50,6 +50,15 @@ export default function addModelStrataView< return model; } +/** + * Decorate the target class. + * + * Note that we assume that the class constructor calls `makeObservable(this)` + * to correctly setup the mobx properties. + * + * @param target Target class to decorate + * @param decorators Properties of the class that must be decorated + */ function decorate( target: any, decorators: { [id: string]: PropertyDecorator } From 76a586cc4b0af14d794350c3d938b3c2f5b91e14 Mon Sep 17 00:00:00 2001 From: Nanda Date: Thu, 6 Apr 2023 16:30:05 +1000 Subject: [PATCH 125/654] Remove unused deps. --- package.json | 2 -- 1 file changed, 2 deletions(-) diff --git a/package.json b/package.json index 025f2417555..60b0fc618db 100644 --- a/package.json +++ b/package.json @@ -223,8 +223,6 @@ "react-test-renderer": "^16.3.2", "regenerator-runtime": "^0.13.2", "terriajs-server": "^4.0.0", - "webpack-cli": "^3.3.11", - "webpack-dev-server": "^3.1.14", "yaml": "^1.10.0" }, "scripts": { From 4006433874a994313fa41d17550ca14a9bbbf9c0 Mon Sep 17 00:00:00 2001 From: Nanda Date: Thu, 13 Apr 2023 12:37:23 +1000 Subject: [PATCH 126/654] Enable `useDefineForClassFields` in tsconfig.json. This makes TS emit code that is inline with TC39 proposal. Enabling this options now, makes sure our code is compatible when TS eventually makes this option the default. Also, this is recommended by [mobx6](https://mobx.js.org/installation.html#use-spec-compliant-transpilation-for-class-properties) One gotcha is when a child class re-declares a field. Previously the field could be left un-initialized but now the field has to be either initialized or the `declare` keyword must be used so that TS does not emit code for the field. This commit includes changes to fix this issue in a few trait-classes where we override a trait declaration with a new one. --- .babelrc | 7 +++++-- buildprocess/configureWebpack.js | 7 +++++-- lib/Traits/TraitsClasses/ClippingPlanesTraits.ts | 12 ++++++------ lib/Traits/TraitsClasses/SdmxCommonTraits.ts | 2 +- .../WebFeatureServiceCatalogItemTraits.ts | 2 +- tsconfig.json | 1 + 6 files changed, 19 insertions(+), 12 deletions(-) diff --git a/.babelrc b/.babelrc index 421c6b28640..fd5274b5c29 100644 --- a/.babelrc +++ b/.babelrc @@ -14,10 +14,13 @@ "babel-plugin-jsx-control-statements", "@babel/plugin-transform-modules-commonjs", ["@babel/plugin-proposal-decorators", { "legacy": true }], - "@babel/proposal-class-properties", + "@babel/plugin-proposal-class-properties", "@babel/proposal-object-rest-spread", "babel-plugin-styled-components", "@babel/plugin-syntax-dynamic-import", "babel-plugin-lodash" - ] + ], + assumptions: { + setPublicClassFields: false + } } diff --git a/buildprocess/configureWebpack.js b/buildprocess/configureWebpack.js index ae29ceb7d4d..32320e1d38b 100644 --- a/buildprocess/configureWebpack.js +++ b/buildprocess/configureWebpack.js @@ -133,12 +133,15 @@ function configureWebpack( "babel-plugin-jsx-control-statements", "@babel/plugin-transform-modules-commonjs", ["@babel/plugin-proposal-decorators", { legacy: true }], - "@babel/proposal-class-properties", + "@babel/plugin-proposal-class-properties", "@babel/proposal-object-rest-spread", "babel-plugin-styled-components", require.resolve("@babel/plugin-syntax-dynamic-import"), "babel-plugin-lodash" - ] + ], + assumptions: { + setPublicClassFields: false + } } } // Re-enable this if we need to observe any differences in the diff --git a/lib/Traits/TraitsClasses/ClippingPlanesTraits.ts b/lib/Traits/TraitsClasses/ClippingPlanesTraits.ts index 4419f585c56..ae0ddb24a18 100644 --- a/lib/Traits/TraitsClasses/ClippingPlanesTraits.ts +++ b/lib/Traits/TraitsClasses/ClippingPlanesTraits.ts @@ -1,11 +1,11 @@ -import ModelTraits from "../ModelTraits"; -import primitiveTrait from "../Decorators/primitiveTrait"; -import primitiveArrayTrait from "../Decorators/primitiveArrayTrait"; +import BoxDrawingTraits from "../BoxDrawingTraits"; import objectArrayTrait from "../Decorators/objectArrayTrait"; import objectTrait from "../Decorators/objectTrait"; -import LatLonHeightTraits from "./LatLonHeightTraits"; -import BoxDrawingTraits, { CornerPointsStyleTraits } from "../BoxDrawingTraits"; +import primitiveArrayTrait from "../Decorators/primitiveArrayTrait"; +import primitiveTrait from "../Decorators/primitiveTrait"; import mixTraits from "../mixTraits"; +import ModelTraits from "../ModelTraits"; +import LatLonHeightTraits from "./LatLonHeightTraits"; export class ClippingPlaneDefinitionTraits extends ModelTraits { @primitiveTrait({ @@ -133,7 +133,7 @@ export class ClippingBoxTraits extends mixTraits(BoxDrawingTraits) { description: "Latitude, longitude and height of the clipping box. When not set, the box is positioned at the center of the screen." }) - position?: LatLonHeightTraits; + position?: LatLonHeightTraits = undefined; @objectTrait({ type: ClippingBoxDimensionTraits, diff --git a/lib/Traits/TraitsClasses/SdmxCommonTraits.ts b/lib/Traits/TraitsClasses/SdmxCommonTraits.ts index 24ae7a5f8da..26ca02a47a4 100644 --- a/lib/Traits/TraitsClasses/SdmxCommonTraits.ts +++ b/lib/Traits/TraitsClasses/SdmxCommonTraits.ts @@ -51,7 +51,7 @@ export class ModelOverrideTraits extends mixTraits(EnumDimensionTraits) { description: "Concept ID (full URN form - urn:sdmx:org.sdmx.infomodel.conceptscheme.Concept=ABS:CS_C16_COMMON(1.0.0).REGION)" }) - id?: string; + id?: string = undefined; @primitiveTrait({ type: "string", diff --git a/lib/Traits/TraitsClasses/WebFeatureServiceCatalogItemTraits.ts b/lib/Traits/TraitsClasses/WebFeatureServiceCatalogItemTraits.ts index 538c1461a97..0b38a0d2fd3 100644 --- a/lib/Traits/TraitsClasses/WebFeatureServiceCatalogItemTraits.ts +++ b/lib/Traits/TraitsClasses/WebFeatureServiceCatalogItemTraits.ts @@ -73,5 +73,5 @@ export default class WebFeatureServiceCatalogItemTraits extends mixTraits( description: "Styling rules that follow [simplestyle-spec](https://github.com/mapbox/simplestyle-spec)" }) - style?: StyleTraits; + style?: StyleTraits = undefined; } diff --git a/tsconfig.json b/tsconfig.json index fe75b540cd8..9f9aa63a7f6 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -10,6 +10,7 @@ "jsx": "preserve", "esModuleInterop": true, "allowSyntheticDefaultImports": true, + "useDefineForClassFields": true, "outDir": "ts-out", "resolveJsonModule": true, "typeRoots": ["./lib/ThirdParty/**/*.d.ts"], From 55d8c1fbadfaf9c0e39381d2c17a44508238c233 Mon Sep 17 00:00:00 2001 From: Nanda Date: Fri, 14 Apr 2023 13:13:19 +1000 Subject: [PATCH 127/654] Upgrade to typescript 5.x. --- .../WebProcessingServiceCatalogFunctionJobTraits.ts | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/Traits/TraitsClasses/WebProcessingServiceCatalogFunctionJobTraits.ts b/lib/Traits/TraitsClasses/WebProcessingServiceCatalogFunctionJobTraits.ts index a7dbf11833f..53be50b6968 100644 --- a/lib/Traits/TraitsClasses/WebProcessingServiceCatalogFunctionJobTraits.ts +++ b/lib/Traits/TraitsClasses/WebProcessingServiceCatalogFunctionJobTraits.ts @@ -1,4 +1,4 @@ -import JsonValue, { JsonObject } from "../../Core/Json"; +import { JsonObject } from "../../Core/Json"; import anyTrait from "../Decorators/anyTrait"; import objectArrayTrait from "../Decorators/objectArrayTrait"; import primitiveTrait from "../Decorators/primitiveTrait"; @@ -52,7 +52,7 @@ export default class WebProcessingServiceCatalogJobTraits extends mixTraits( name: "Geojson features", description: "Geojson feature collection of input features." }) - geojsonFeatures?: JsonValue[]; + geojsonFeatures?: JsonObject[]; @primitiveTrait({ type: "string", diff --git a/package.json b/package.json index 60b0fc618db..cd90cf93733 100644 --- a/package.json +++ b/package.json @@ -168,7 +168,7 @@ "ts-essentials": "^5.0.0", "ts-loader": "^5.3.3", "ts-node": "^5.0.1", - "typescript": "^4.9.4", + "typescript": "^5.0.4", "urijs": "^1.18.12", "url-loader": "^1.1.2", "webpack": "~4.46.0", From 4fee03d9f2911e5b16be4e8956d02f7cf1c39eb6 Mon Sep 17 00:00:00 2001 From: Mike Wu <41275384+mwu2018@users.noreply.github.com> Date: Tue, 18 Apr 2023 16:02:00 +1000 Subject: [PATCH 128/654] Issue 6716 (#6724) * Fixed ideal zoom bug for location point. * Update doc. --- CHANGES.md | 1 + lib/ReactViews/Map/Navigation/Items/MyLocation.ts | 12 ++++++++++++ 2 files changed, 13 insertions(+) diff --git a/CHANGES.md b/CHANGES.md index b411c92e1af..17ffc37052b 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -2,6 +2,7 @@ #### next release (8.2.28) +- Fix location point ideal zoom bug in 3D mode map. - [The next improvement] #### 8.2.27 - 2023-04-05 diff --git a/lib/ReactViews/Map/Navigation/Items/MyLocation.ts b/lib/ReactViews/Map/Navigation/Items/MyLocation.ts index ab744960ec7..3234e6ffcf2 100644 --- a/lib/ReactViews/Map/Navigation/Items/MyLocation.ts +++ b/lib/ReactViews/Map/Navigation/Items/MyLocation.ts @@ -125,6 +125,18 @@ class MyLocation extends MapNavigationItemController { latitude: latitude } }); + // Need to specify rectangle for ideal zoom to work properly in 3D map. + const closeUpRange = 0.002; + this._marker.setTrait( + CommonStrata.user, + "rectangle", + new Rectangle( + longitude - closeUpRange, + latitude - closeUpRange, + longitude + closeUpRange, + latitude + closeUpRange + ) + ); this._marker.setTrait( CommonStrata.user, "style", From 51feef62ee2ce3943a77c4f5250173201b4024a8 Mon Sep 17 00:00:00 2001 From: Nanda Date: Wed, 19 Apr 2023 11:51:02 +1000 Subject: [PATCH 129/654] Revert to TS4.9. --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index cd90cf93733..73788d7996f 100644 --- a/package.json +++ b/package.json @@ -168,7 +168,7 @@ "ts-essentials": "^5.0.0", "ts-loader": "^5.3.3", "ts-node": "^5.0.1", - "typescript": "^5.0.4", + "typescript": "^4.9.5", "urijs": "^1.18.12", "url-loader": "^1.1.2", "webpack": "~4.46.0", From 11b856fa3388931ea1e787b0da9bb1f387f1e84f Mon Sep 17 00:00:00 2001 From: Nanda Date: Wed, 19 Apr 2023 13:18:41 +1000 Subject: [PATCH 130/654] Enable `useDefineForClassFields` in tsconfig-node.json --- tsconfig-node.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tsconfig-node.json b/tsconfig-node.json index 354df4a308b..97cf62f2c4f 100644 --- a/tsconfig-node.json +++ b/tsconfig-node.json @@ -12,10 +12,9 @@ "jsx": "react", "esModuleInterop": true, "allowSyntheticDefaultImports": true, + "useDefineForClassFields": true, "outDir": "dist", "resolveJsonModule": true, - // "composite": true, - // "declaration": true, "typeRoots": [ "./lib/ThirdParty" //"./node_modules/@types", From 7e01134c6dc34e7bb0b6a8dbeb05e879a010043b Mon Sep 17 00:00:00 2001 From: Nanda Date: Wed, 19 Apr 2023 13:19:10 +1000 Subject: [PATCH 131/654] Update dependencies. --- package.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 73788d7996f..8a79aa60023 100644 --- a/package.json +++ b/package.json @@ -62,7 +62,6 @@ "@types/react-test-renderer": "^17.0.1", "@types/retry": "^0.12.0", "@types/shpjs": "^3.4.0", - "@types/styled-components": "^5.1.0", "@types/urijs": "1.19.1", "@visx/axis": "^2.1.0", "@visx/clip-path": "^2.1.0", @@ -160,7 +159,7 @@ "string-replace-loader": "^2.1.1", "string-replace-webpack-plugin": "^0.1.3", "style-loader": "^0.23.1", - "styled-components": "^5.3.6", + "styled-components": "^5.3.9", "svg-sprite-loader": "4.1.3", "terriajs-cesium": "1.92.0-tile-error-provider-fix-2", "terriajs-html2canvas": "1.0.0-alpha.12-terriajs-1", @@ -182,8 +181,9 @@ "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@types/dateformat": "^3.0.1", "@types/fs-extra": "^7.0.0", - "@types/node": "18.11.18", + "@types/node": "^18.15.11", "@types/node-fetch": "^2.6.2", + "@types/styled-components": "^5.1.26", "babel-plugin-styled-components": "^1.10.7", "bottleneck": "^2.19.5", "eslint": "^7.20.0", @@ -194,7 +194,7 @@ "fork-ts-checker-webpack-plugin": "^6.0.0", "fs-extra": "^7.0.1", "glob-all": "^3.0.1", - "husky": "^8.0.1", + "husky": "^8.0.3", "istanbul-instrumenter-loader": "^3.0.1", "jasmine-ajax": "^4.0.0", "jasmine-core": "^2.9.1", From f430b5d54a014667c26a0182967aadbc423d9eb8 Mon Sep 17 00:00:00 2001 From: Nanda Date: Wed, 19 Apr 2023 13:19:32 +1000 Subject: [PATCH 132/654] Temporarily use terriamap#ts4-deps for testing CI build. --- buildprocess/ci-deploy.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildprocess/ci-deploy.sh b/buildprocess/ci-deploy.sh index d878ab4b7a3..55fc8d6e9a7 100644 --- a/buildprocess/ci-deploy.sh +++ b/buildprocess/ci-deploy.sh @@ -21,7 +21,7 @@ npm install -g yarn@^1.19.0 # Clone and build TerriaMap, using this version of TerriaJS TERRIAJS_COMMIT_HASH=$(git rev-parse HEAD) -git clone -b main https://github.com/TerriaJS/TerriaMap.git +git clone -b ts4-deps https://github.com/TerriaJS/TerriaMap.git cd TerriaMap TERRIAMAP_COMMIT_HASH=$(git rev-parse HEAD) sed -i -e 's@"terriajs": ".*"@"terriajs": "'$GITHUB_REPOSITORY'#'${GITHUB_BRANCH}'"@g' package.json From 90f8cdaa3540dc5a797a75db1f9760e5f49282b3 Mon Sep 17 00:00:00 2001 From: Nanda Date: Wed, 19 Apr 2023 15:04:04 +1000 Subject: [PATCH 133/654] Pin @types/node to ^18.15.11. We have many dependencies that pull in an older version of @types/node which is not compatible with the TS4.9 (eg: `AbortSignal` errors). --- package.json | 3 +- yarn.lock | 2071 +++++++++----------------------------------------- 2 files changed, 362 insertions(+), 1712 deletions(-) diff --git a/package.json b/package.json index 8a79aa60023..b710cfb5371 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,8 @@ "url": "http://github.com/TerriaJS/terriajs" }, "resolutions": { - "colors": "1.4.0" + "colors": "1.4.0", + "@types/node": "^18.15.11" }, "dependencies": { "@babel/core": "^7.16.0", diff --git a/yarn.lock b/yarn.lock index ce284c605db..41186cfca72 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1040,18 +1040,23 @@ resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.8.0.tgz#bbbff68978fefdbe68ccb533bc8cbe1d1afb5413" integrity sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow== -"@emotion/is-prop-valid@^0.8.8": - version "0.8.8" - resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz#db28b1c4368a259b60a97311d6a952d4fd01ac1a" - integrity sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA== +"@emotion/is-prop-valid@^1.1.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.2.0.tgz#7f2d35c97891669f7e276eb71c83376a5dc44c83" + integrity sha512-3aDpDprjM0AwaxGE09bOPkNxHpBd+kA6jty3RnaEXdweX1DF1U3VQpPYb0g1IStAuK7SVQ1cy+bNBBKp4W3Fjg== dependencies: - "@emotion/memoize" "0.7.4" + "@emotion/memoize" "^0.8.0" "@emotion/memoize@0.7.4": version "0.7.4" resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.4.tgz#19bf0f5af19149111c40d98bb0cf82119f5d9eeb" integrity sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw== +"@emotion/memoize@^0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.8.0.tgz#f580f9beb67176fa57aae70b08ed510e1b18980f" + integrity sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA== + "@emotion/serialize@^0.11.15", "@emotion/serialize@^0.11.16": version "0.11.16" resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-0.11.16.tgz#dee05f9e96ad2fb25a5206b6d759b2d1ed3379ad" @@ -1139,6 +1144,11 @@ resolved "https://registry.yarnpkg.com/@icons/material/-/material-0.2.4.tgz#e90c9f71768b3736e76d7dd6783fc6c2afa88bc8" integrity sha512-QPcGmICAPbGLGb6F/yNf/KzKqvFx8z5qx3D1yFqVAjoFmXK35EgyW+cJ57Te3CNsmzblwtzakLGFqHPqrfb4Tw== +"@juggle/resize-observer@^3.3.1": + version "3.4.0" + resolved "https://registry.yarnpkg.com/@juggle/resize-observer/-/resize-observer-3.4.0.tgz#08d6c5e20cf7e4cc02fd181c4b0c225cd31dbb60" + integrity sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA== + "@mapbox/geojson-merge@^1.1.1": version "1.1.1" resolved "https://registry.yarnpkg.com/@mapbox/geojson-merge/-/geojson-merge-1.1.1.tgz#0848e09ae0e44eeb6ea2f7943f54c76fc2a561ed" @@ -1231,35 +1241,18 @@ resolved "https://registry.yarnpkg.com/@reach/observe-rect/-/observe-rect-1.2.0.tgz#d7a6013b8aafcc64c778a0ccb83355a11204d3b2" integrity sha512-Ba7HmkFgfQxZqqaeIWWkNK0rEhpxVQHIoVyW1YDSkGsGIXzcaW4deC8B0pZrNSSyLTdIk7y+5olKt5+g0GmFIQ== -"@sindresorhus/is@^0.7.0": - version "0.7.0" - resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.7.0.tgz#9a06f4f137ee84d7df0460c1fdb1135ffa6c50fd" - integrity sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow== - "@sindresorhus/is@^2.1.1": version "2.1.1" resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-2.1.1.tgz#ceff6a28a5b4867c2dd4a1ba513de278ccbe8bb1" integrity sha512-/aPsuoj/1Dw/kzhkgz+ES6TxG0zfTMGLwuK2ZG00k/iJzYHTLCE8mVU8EPqEOp/lmxPoq1C1C9RYToRKb2KEfg== -"@sindresorhus/is@^4.0.0": - version "4.2.1" - resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.2.1.tgz#b88b5724283db80b507cd612caee9a1947412a20" - integrity sha512-BrzrgtaqEre0qfvI8sMTaEvx+bayuhPmfe2rfeUGPPHYr/PLxCOqkOe4TQTDPb+qcqgNcsAtXV/Ew74mcDIE8w== - -"@szmarczak/http-timer@^4.0.5": - version "4.0.6" - resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-4.0.6.tgz#b4a914bb62e7c272d4e5989fe4440f812ab1d807" - integrity sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w== - dependencies: - defer-to-connect "^2.0.0" - -"@tinymce/tinymce-react@^4.1.0": - version "4.1.0" - resolved "https://registry.yarnpkg.com/@tinymce/tinymce-react/-/tinymce-react-4.1.0.tgz#e2a5e289dc1af03837365bebe969b1a722bf6d99" - integrity sha512-7qXheXhyY9a8mY5tXQUz3BFq+Z4TQ7zd/OIaKasbVzojkjCw3VWdwFhHOEcwmDDprepgQwECsYqe3AGOtehfFg== +"@tinymce/tinymce-react@^4.3.0": + version "4.3.0" + resolved "https://registry.yarnpkg.com/@tinymce/tinymce-react/-/tinymce-react-4.3.0.tgz#5e2f5a58526a1bba9710f54f5fcf16abd4c742a1" + integrity sha512-iB4cUsYfcJL4NGuKhqCGYuTmFTje3nPxyPv1HxprTsp/YMGuuiiSNWrv3zwI31QX5Cn8qeq9MrMDnbxuRugHyg== dependencies: prop-types "^15.6.2" - tinymce "^6.0.0 || ^5.5.1" + tinymce "^6.3.1" "@tootallnate/once@1": version "1.1.2" @@ -1370,16 +1363,6 @@ resolved "https://registry.yarnpkg.com/@types/arcgis-rest-api/-/arcgis-rest-api-10.4.5.tgz#35a1d6b1b39bb530b36799d679576cbc1f35cc2e" integrity sha512-MhpTj3aaURIFhK6pBRF50yCHW5TpbeuC1E81juovfNesSOshsQnCzludhpBhIr2pNzplTBlfzrT7RKiLZ5F3Tw== -"@types/cacheable-request@^6.0.1": - version "6.0.2" - resolved "https://registry.yarnpkg.com/@types/cacheable-request/-/cacheable-request-6.0.2.tgz#c324da0197de0a98a2312156536ae262429ff6b9" - integrity sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA== - dependencies: - "@types/http-cache-semantics" "*" - "@types/keyv" "*" - "@types/node" "*" - "@types/responselike" "*" - "@types/create-react-class@^15.6.2": version "15.6.3" resolved "https://registry.yarnpkg.com/@types/create-react-class/-/create-react-class-15.6.3.tgz#d9a533441acd1532f2b97d55c24dfb87898d5cc2" @@ -1512,11 +1495,6 @@ "@types/react" "*" hoist-non-react-statics "^3.3.0" -"@types/http-cache-semantics@*": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz#0ea7b61496902b95890dc4c3a116b60cb8dae812" - integrity sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ== - "@types/jasmine-ajax@^3.3.0": version "3.3.3" resolved "https://registry.yarnpkg.com/@types/jasmine-ajax/-/jasmine-ajax-3.3.3.tgz#ec89515434d4aee9772e25a730bd626ecf44260d" @@ -1537,13 +1515,6 @@ resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.30.tgz#44cb52f32a809734ca562e685c6473b5754a7818" integrity sha512-sqm9g7mHlPY/43fcSNrCYfOeX9zkTTK+euO5E6+CVijSMm5tTjkVdwdqRkY3ljjIAf8679vps5jKUoJBCLsMDA== -"@types/keyv@*": - version "3.1.3" - resolved "https://registry.yarnpkg.com/@types/keyv/-/keyv-3.1.3.tgz#1c9aae32872ec1f20dcdaee89a9f3ba88f465e41" - integrity sha512-FXCJgyyN3ivVgRoml4h94G/p3kY+u/B86La+QptcqJaWtBWtmc6TtkNfS40n9bIvyLteHh7zXOtgbobORKPbDg== - dependencies: - "@types/node" "*" - "@types/leaflet@^1.7.10": version "1.7.10" resolved "https://registry.yarnpkg.com/@types/leaflet/-/leaflet-1.7.10.tgz#092f97af29bb870b7d1ed72d516d4b3dde66a6c8" @@ -1558,7 +1529,7 @@ dependencies: "@types/lodash" "*" -"@types/lodash@*", "@types/lodash@^4.14.146", "@types/lodash@^4.14.172": +"@types/lodash@*", "@types/lodash@^4.14.172": version "4.14.178" resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.178.tgz#341f6d2247db528d4a13ddbb374bcdc80406f4f8" integrity sha512-0d5Wd09ItQWH1qFbEyQ7oTQ3GZrMfth5JkbN3EvTKLXcHLRDSXeLnlvlOn0wvxVIwK5o2M8JzP/OWz7T3NRsbw== @@ -1588,18 +1559,18 @@ resolved "https://registry.yarnpkg.com/@types/mustache/-/mustache-0.8.32.tgz#7db3b81f2bf450bd38805f596d20eca97c4ed595" integrity sha512-RTVWV485OOf4+nO2+feurk0chzHkSjkjALiejpHltyuMf/13fGymbbNNFrSKdSSUg1TIwzszXdWsVirxgqYiFA== -"@types/node-fetch@^2.5.12": - version "2.5.12" - resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.5.12.tgz#8a6f779b1d4e60b7a57fb6fd48d84fb545b9cc66" - integrity sha512-MKgC4dlq4kKNa/mYrwpKfzQMB5X3ee5U6fSprkKpToBqBmX4nFZL9cW5jl6sWn+xpRJ7ypWh2yyqqr8UUCstSw== +"@types/node-fetch@^2.6.2": + version "2.6.3" + resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.3.tgz#175d977f5e24d93ad0f57602693c435c57ad7e80" + integrity sha512-ETTL1mOEdq/sxUtgtOhKjyB2Irra4cjxksvcMUR5Zr4n+PxVhsCD9WS46oPbHL3et9Zde7CNRr+WUNlcHvsX+w== dependencies: "@types/node" "*" form-data "^3.0.0" -"@types/node@*": - version "17.0.8" - resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.8.tgz#50d680c8a8a78fe30abe6906453b21ad8ab0ad7b" - integrity sha512-YofkM6fGv4gDJq78g4j0mMuGMkZVxZDgtU0JRdx6FgiJDG+0fY0GKVolOV8WqVmEhLCXkQRjwDdKyPxJp/uucg== +"@types/node@*", "@types/node@^18.15.11": + version "18.15.11" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.15.11.tgz#b3b790f09cb1696cffcec605de025b088fa4225f" + integrity sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q== "@types/normalize-package-data@^2.4.0": version "2.4.1" @@ -1628,20 +1599,6 @@ resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.4.tgz#fcf7205c25dff795ee79af1e30da2c9790808f11" integrity sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ== -"@types/puppeteer-core@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@types/puppeteer-core/-/puppeteer-core-5.4.0.tgz#880a7917b4ede95cbfe2d5e81a558cfcb072c0fb" - integrity sha512-yqRPuv4EFcSkTyin6Yy17pN6Qz2vwVwTCJIDYMXbE3j8vTPhv0nCQlZOl5xfi0WHUkqvQsjAR8hAfjeMCoetwg== - dependencies: - "@types/puppeteer" "*" - -"@types/puppeteer@*": - version "5.4.4" - resolved "https://registry.yarnpkg.com/@types/puppeteer/-/puppeteer-5.4.4.tgz#e92abeccc4f46207c3e1b38934a1246be080ccd0" - integrity sha512-3Nau+qi69CN55VwZb0ATtdUAlYlqOOQ3OfQfq0Hqgc4JMFXiQT/XInlwQ9g6LbicDslE6loIFsXFklGh5XmI6Q== - dependencies: - "@types/node" "*" - "@types/rbush@^3.0.0": version "3.0.0" resolved "https://registry.yarnpkg.com/@types/rbush/-/rbush-3.0.0.tgz#b6887d99b159e87ae23cd14eceff34f139842aa6" @@ -1716,13 +1673,6 @@ dependencies: "@types/react" "*" -"@types/responselike@*", "@types/responselike@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.0.tgz#251f4fe7d154d2bad125abe1b429b23afd262e29" - integrity sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA== - dependencies: - "@types/node" "*" - "@types/retry@^0.12.0": version "0.12.1" resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.1.tgz#d8f1c0d0dc23afad6dc16a9e993a0865774b4065" @@ -1741,36 +1691,62 @@ "@types/geojson" "*" "@types/node" "*" -"@types/styled-components@^5.1.0": - version "5.1.19" - resolved "https://registry.yarnpkg.com/@types/styled-components/-/styled-components-5.1.19.tgz#d76f431ee49d0a222ab4e758dcd540b01987652d" - integrity sha512-hNj14Oamk7Jhb/fMMQG7TUkd3e8uMMgxsCTH+ueJNGdFo/PuhlGDQTPChqyilpZP0WttgBHkc2YyT5UG+yc6Yw== +"@types/source-list-map@*": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@types/source-list-map/-/source-list-map-0.1.2.tgz#0078836063ffaf17412349bba364087e0ac02ec9" + integrity sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA== + +"@types/styled-components@^5.1.26": + version "5.1.26" + resolved "https://registry.yarnpkg.com/@types/styled-components/-/styled-components-5.1.26.tgz#5627e6812ee96d755028a98dae61d28e57c233af" + integrity sha512-KuKJ9Z6xb93uJiIyxo/+ksS7yLjS1KzG6iv5i78dhVg/X3u5t1H7juRWqVmodIdz6wGVaIApo1u01kmFRdJHVw== dependencies: "@types/hoist-non-react-statics" "*" "@types/react" "*" csstype "^3.0.2" +"@types/tapable@^1": + version "1.0.8" + resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.8.tgz#b94a4391c85666c7b73299fd3ad79d4faa435310" + integrity sha512-ipixuVrh2OdNmauvtT51o3d8z12p6LtFW9in7U79der/kwejjdNchQC5UMn5u/KxNoM7VHHOs/l8KS8uHxhODQ== + "@types/trusted-types@*": version "2.0.2" resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.2.tgz#fc25ad9943bcac11cceb8168db4f275e0e72e756" integrity sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg== +"@types/uglify-js@*": + version "3.17.1" + resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.17.1.tgz#e0ffcef756476410e5bce2cb01384ed878a195b5" + integrity sha512-GkewRA4i5oXacU/n4MA9+bLgt5/L3F1mKrYvFGm7r2ouLXhRKjuWwo9XHNnbx6WF3vlGW21S3fCvgqxvxXXc5g== + dependencies: + source-map "^0.6.1" + "@types/urijs@1.19.1": version "1.19.1" resolved "https://registry.yarnpkg.com/@types/urijs/-/urijs-1.19.1.tgz#da69e8479eec0bb4580c7cc218d218f107d2d526" integrity sha512-5waMuQ9z8pH8+5yAyX05bsA7SOl50l5ZkeMripxoOgN2+nSQb4TOSuhWoRlPt7FPIIohk6iBrX/rEktUJa8KfQ== -"@types/which@^1.3.2": - version "1.3.2" - resolved "https://registry.yarnpkg.com/@types/which/-/which-1.3.2.tgz#9c246fc0c93ded311c8512df2891fb41f6227fdf" - integrity sha512-8oDqyLC7eD4HM307boe2QWKyuzdzWBj56xI/imSl2cpL+U3tCMaTAkMJ4ee5JBZ/FsOJlvRGeIShiZDAl1qERA== +"@types/webpack-sources@*": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@types/webpack-sources/-/webpack-sources-3.2.0.tgz#16d759ba096c289034b26553d2df1bf45248d38b" + integrity sha512-Ft7YH3lEVRQ6ls8k4Ff1oB4jN6oy/XmU6tQISKdhfh+1mR+viZFphS6WL0IrtDOzvefmJg5a0s7ZQoRXwqTEFg== + dependencies: + "@types/node" "*" + "@types/source-list-map" "*" + source-map "^0.7.3" -"@types/yauzl@^2.9.1": - version "2.9.2" - resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.9.2.tgz#c48e5d56aff1444409e39fa164b0b4d4552a7b7a" - integrity sha512-8uALY5LTvSuHgloDVUvWP3pIauILm+8/0pDMokuDYIoNsOkSwd5AiHBTSEJjKTDcZr5z8UpgOWZkxBF4iJftoA== +"@types/webpack@4.41.33": + version "4.41.33" + resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.33.tgz#16164845a5be6a306bcbe554a8e67f9cac215ffc" + integrity sha512-PPajH64Ft2vWevkerISMtnZ8rTs4YmRbs+23c402J0INmxDKCrhZNvwZYtzx96gY2wAtXdrK1BS2fiC8MlLr3g== dependencies: "@types/node" "*" + "@types/tapable" "^1" + "@types/uglify-js" "*" + "@types/webpack-sources" "*" + anymatch "^3.0.0" + source-map "^0.6.0" "@visx/axis@^2.1.0": version "2.4.0" @@ -1870,6 +1846,17 @@ resolved "https://registry.yarnpkg.com/@visx/point/-/point-2.1.0.tgz#b3e263826f28b3a170d6604dea8ffa27a4b9ac3b" integrity sha512-vVnfI7oqjjttkn05Xi/ooR0UqQRoGf68lyT3SOl0WPHvIQBGNh3XoVUBHDr15/NUkfErgK6TNlfXY763YncPWg== +"@visx/responsive@^2.10.0": + version "2.17.0" + resolved "https://registry.yarnpkg.com/@visx/responsive/-/responsive-2.17.0.tgz#8a31f016a270234bfecf25fb066f30d19784ddc7" + integrity sha512-3dY2shGbQnoknIRv3Vfnwsy3ZA8Q5Q/rYnTLiokWChYRfNC8NMPoX9mprEeb/gMAxtKjaLn3zcCgd8R+eetxIQ== + dependencies: + "@juggle/resize-observer" "^3.3.1" + "@types/lodash" "^4.14.172" + "@types/react" "*" + lodash "^4.17.21" + prop-types "^15.6.1" + "@visx/scale@2.2.2", "@visx/scale@^2.1.0": version "2.2.2" resolved "https://registry.yarnpkg.com/@visx/scale/-/scale-2.2.2.tgz#b8eafabdcf92bb45ab196058fe184772ad80fd25" @@ -1923,199 +1910,149 @@ prop-types "^15.5.10" react-use-measure "^2.0.4" -"@vx/responsive@^0.0.199": - version "0.0.199" - resolved "https://registry.yarnpkg.com/@vx/responsive/-/responsive-0.0.199.tgz#6f92de0268b36e2f52e1283feb63a1d470761c68" - integrity sha512-ONrmLUAG+8wzD3cn/EmsuZh6JHeyejqup3ZsV25t04VaVJAVQAJukAfNdH8YiwSJu0zSo+txkBTfrnOmFyQLOw== - dependencies: - "@types/lodash" "^4.14.146" - "@types/react" "*" - lodash "^4.17.10" - prop-types "^15.6.1" - resize-observer-polyfill "1.5.1" - -"@wdio/config@6.12.1": - version "6.12.1" - resolved "https://registry.yarnpkg.com/@wdio/config/-/config-6.12.1.tgz#86d987b505d8ca85ec11471830d2ba296dab3bcf" - integrity sha512-V5hTIW5FNlZ1W33smHF4Rd5BKjGW2KeYhyXDQfXHjqLCeRiirZ9fABCo9plaVQDnwWSUMWYaAaIAifV82/oJCQ== - dependencies: - "@wdio/logger" "6.10.10" - deepmerge "^4.0.0" - glob "^7.1.2" - -"@wdio/logger@6.10.10": - version "6.10.10" - resolved "https://registry.yarnpkg.com/@wdio/logger/-/logger-6.10.10.tgz#1e07cf32a69606ddb94fa9fd4b0171cb839a5980" - integrity sha512-2nh0hJz9HeZE0VIEMI+oPgjr/Q37ohrR9iqsl7f7GW5ik+PnKYCT9Eab5mR1GNMG60askwbskgGC1S9ygtvrSw== - dependencies: - chalk "^4.0.0" - loglevel "^1.6.0" - loglevel-plugin-prefix "^0.8.4" - strip-ansi "^6.0.0" - -"@wdio/protocols@6.12.0": - version "6.12.0" - resolved "https://registry.yarnpkg.com/@wdio/protocols/-/protocols-6.12.0.tgz#e40850be62c42c82dd2c486655d6419cd9ec1e3e" - integrity sha512-UhTBZxClCsM3VjaiDp4DoSCnsa7D1QNmI2kqEBfIpyNkT3GcZhJb7L+nL0fTkzCwi7+/uLastb3/aOwH99gt0A== - -"@wdio/repl@6.11.0": - version "6.11.0" - resolved "https://registry.yarnpkg.com/@wdio/repl/-/repl-6.11.0.tgz#5b1eab574b6b89f7f7c383e7295c06af23c3818e" - integrity sha512-FxrFKiTkFyELNGGVEH1uijyvNY7lUpmff6x+FGskFGZB4uSRs0rxkOMaEjxnxw7QP1zgQKr2xC7GyO03gIGRGg== - dependencies: - "@wdio/utils" "6.11.0" - -"@wdio/utils@6.11.0": - version "6.11.0" - resolved "https://registry.yarnpkg.com/@wdio/utils/-/utils-6.11.0.tgz#878c2500efb1a325bf5a66d2ff3d08162f976e8c" - integrity sha512-vf0sOQzd28WbI26d6/ORrQ4XKWTzSlWLm9W/K/eJO0NASKPEzR+E+Q2kaa+MJ4FKXUpjbt+Lxfo+C26TzBk7tg== - dependencies: - "@wdio/logger" "6.10.10" - -"@webassemblyjs/ast@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.8.5.tgz#51b1c5fe6576a34953bf4b253df9f0d490d9e359" - integrity sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ== - dependencies: - "@webassemblyjs/helper-module-context" "1.8.5" - "@webassemblyjs/helper-wasm-bytecode" "1.8.5" - "@webassemblyjs/wast-parser" "1.8.5" - -"@webassemblyjs/floating-point-hex-parser@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz#1ba926a2923613edce496fd5b02e8ce8a5f49721" - integrity sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ== - -"@webassemblyjs/helper-api-error@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz#c49dad22f645227c5edb610bdb9697f1aab721f7" - integrity sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA== - -"@webassemblyjs/helper-buffer@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz#fea93e429863dd5e4338555f42292385a653f204" - integrity sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q== - -"@webassemblyjs/helper-code-frame@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz#9a740ff48e3faa3022b1dff54423df9aa293c25e" - integrity sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ== - dependencies: - "@webassemblyjs/wast-printer" "1.8.5" - -"@webassemblyjs/helper-fsm@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz#ba0b7d3b3f7e4733da6059c9332275d860702452" - integrity sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow== - -"@webassemblyjs/helper-module-context@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz#def4b9927b0101dc8cbbd8d1edb5b7b9c82eb245" - integrity sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g== - dependencies: - "@webassemblyjs/ast" "1.8.5" - mamacro "^0.0.3" - -"@webassemblyjs/helper-wasm-bytecode@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz#537a750eddf5c1e932f3744206551c91c1b93e61" - integrity sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ== - -"@webassemblyjs/helper-wasm-section@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz#74ca6a6bcbe19e50a3b6b462847e69503e6bfcbf" - integrity sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA== - dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/helper-buffer" "1.8.5" - "@webassemblyjs/helper-wasm-bytecode" "1.8.5" - "@webassemblyjs/wasm-gen" "1.8.5" - -"@webassemblyjs/ieee754@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz#712329dbef240f36bf57bd2f7b8fb9bf4154421e" - integrity sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g== +"@webassemblyjs/ast@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964" + integrity sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA== + dependencies: + "@webassemblyjs/helper-module-context" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/wast-parser" "1.9.0" + +"@webassemblyjs/floating-point-hex-parser@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz#3c3d3b271bddfc84deb00f71344438311d52ffb4" + integrity sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA== + +"@webassemblyjs/helper-api-error@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz#203f676e333b96c9da2eeab3ccef33c45928b6a2" + integrity sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw== + +"@webassemblyjs/helper-buffer@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz#a1442d269c5feb23fcbc9ef759dac3547f29de00" + integrity sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA== + +"@webassemblyjs/helper-code-frame@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz#647f8892cd2043a82ac0c8c5e75c36f1d9159f27" + integrity sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA== + dependencies: + "@webassemblyjs/wast-printer" "1.9.0" + +"@webassemblyjs/helper-fsm@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz#c05256b71244214671f4b08ec108ad63b70eddb8" + integrity sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw== + +"@webassemblyjs/helper-module-context@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz#25d8884b76839871a08a6c6f806c3979ef712f07" + integrity sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g== + dependencies: + "@webassemblyjs/ast" "1.9.0" + +"@webassemblyjs/helper-wasm-bytecode@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz#4fed8beac9b8c14f8c58b70d124d549dd1fe5790" + integrity sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw== + +"@webassemblyjs/helper-wasm-section@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz#5a4138d5a6292ba18b04c5ae49717e4167965346" + integrity sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" + +"@webassemblyjs/ieee754@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz#15c7a0fbaae83fb26143bbacf6d6df1702ad39e4" + integrity sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg== dependencies: "@xtuc/ieee754" "^1.2.0" -"@webassemblyjs/leb128@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.8.5.tgz#044edeb34ea679f3e04cd4fd9824d5e35767ae10" - integrity sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A== +"@webassemblyjs/leb128@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.9.0.tgz#f19ca0b76a6dc55623a09cffa769e838fa1e1c95" + integrity sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw== dependencies: "@xtuc/long" "4.2.2" -"@webassemblyjs/utf8@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.8.5.tgz#a8bf3b5d8ffe986c7c1e373ccbdc2a0915f0cedc" - integrity sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw== - -"@webassemblyjs/wasm-edit@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz#962da12aa5acc1c131c81c4232991c82ce56e01a" - integrity sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q== - dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/helper-buffer" "1.8.5" - "@webassemblyjs/helper-wasm-bytecode" "1.8.5" - "@webassemblyjs/helper-wasm-section" "1.8.5" - "@webassemblyjs/wasm-gen" "1.8.5" - "@webassemblyjs/wasm-opt" "1.8.5" - "@webassemblyjs/wasm-parser" "1.8.5" - "@webassemblyjs/wast-printer" "1.8.5" - -"@webassemblyjs/wasm-gen@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz#54840766c2c1002eb64ed1abe720aded714f98bc" - integrity sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg== - dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/helper-wasm-bytecode" "1.8.5" - "@webassemblyjs/ieee754" "1.8.5" - "@webassemblyjs/leb128" "1.8.5" - "@webassemblyjs/utf8" "1.8.5" - -"@webassemblyjs/wasm-opt@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz#b24d9f6ba50394af1349f510afa8ffcb8a63d264" - integrity sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q== - dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/helper-buffer" "1.8.5" - "@webassemblyjs/wasm-gen" "1.8.5" - "@webassemblyjs/wasm-parser" "1.8.5" - -"@webassemblyjs/wasm-parser@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz#21576f0ec88b91427357b8536383668ef7c66b8d" - integrity sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw== - dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/helper-api-error" "1.8.5" - "@webassemblyjs/helper-wasm-bytecode" "1.8.5" - "@webassemblyjs/ieee754" "1.8.5" - "@webassemblyjs/leb128" "1.8.5" - "@webassemblyjs/utf8" "1.8.5" - -"@webassemblyjs/wast-parser@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz#e10eecd542d0e7bd394f6827c49f3df6d4eefb8c" - integrity sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg== - dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/floating-point-hex-parser" "1.8.5" - "@webassemblyjs/helper-api-error" "1.8.5" - "@webassemblyjs/helper-code-frame" "1.8.5" - "@webassemblyjs/helper-fsm" "1.8.5" +"@webassemblyjs/utf8@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.9.0.tgz#04d33b636f78e6a6813227e82402f7637b6229ab" + integrity sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w== + +"@webassemblyjs/wasm-edit@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz#3fe6d79d3f0f922183aa86002c42dd256cfee9cf" + integrity sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/helper-wasm-section" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" + "@webassemblyjs/wasm-opt" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" + "@webassemblyjs/wast-printer" "1.9.0" + +"@webassemblyjs/wasm-gen@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz#50bc70ec68ded8e2763b01a1418bf43491a7a49c" + integrity sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/ieee754" "1.9.0" + "@webassemblyjs/leb128" "1.9.0" + "@webassemblyjs/utf8" "1.9.0" + +"@webassemblyjs/wasm-opt@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz#2211181e5b31326443cc8112eb9f0b9028721a61" + integrity sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" + +"@webassemblyjs/wasm-parser@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz#9d48e44826df4a6598294aa6c87469d642fff65e" + integrity sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-api-error" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/ieee754" "1.9.0" + "@webassemblyjs/leb128" "1.9.0" + "@webassemblyjs/utf8" "1.9.0" + +"@webassemblyjs/wast-parser@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz#3031115d79ac5bd261556cecc3fa90a3ef451914" + integrity sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/floating-point-hex-parser" "1.9.0" + "@webassemblyjs/helper-api-error" "1.9.0" + "@webassemblyjs/helper-code-frame" "1.9.0" + "@webassemblyjs/helper-fsm" "1.9.0" "@xtuc/long" "4.2.2" -"@webassemblyjs/wast-printer@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz#114bbc481fd10ca0e23b3560fa812748b0bae5bc" - integrity sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg== +"@webassemblyjs/wast-printer@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz#4935d54c85fef637b00ce9f52377451d00d47899" + integrity sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA== dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/wast-parser" "1.8.5" + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/wast-parser" "1.9.0" "@xtuc/long" "4.2.2" "@xtuc/ieee754@^1.2.0": @@ -2172,7 +2109,7 @@ acorn-walk@^7.1.1: resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== -acorn@^6.2.1: +acorn@^6.4.1: version "6.4.2" resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== @@ -2348,6 +2285,14 @@ anymatch@^2.0.0: micromatch "^3.1.4" normalize-path "^2.1.1" +anymatch@^3.0.0: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + anymatch@~3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" @@ -2375,47 +2320,6 @@ aproba@^1.0.3, aproba@^1.1.1: resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== -arch@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/arch/-/arch-2.2.0.tgz#1bc47818f305764f23ab3306b0bfc086c5a29d11" - integrity sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ== - -archive-type@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/archive-type/-/archive-type-4.0.0.tgz#f92e72233056dfc6969472749c267bdb046b1d70" - integrity sha1-+S5yIzBW38aWlHJ0nCZ72wRrHXA= - dependencies: - file-type "^4.2.0" - -archiver-utils@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/archiver-utils/-/archiver-utils-2.1.0.tgz#e8a460e94b693c3e3da182a098ca6285ba9249e2" - integrity sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw== - dependencies: - glob "^7.1.4" - graceful-fs "^4.2.0" - lazystream "^1.0.0" - lodash.defaults "^4.2.0" - lodash.difference "^4.5.0" - lodash.flatten "^4.4.0" - lodash.isplainobject "^4.0.6" - lodash.union "^4.6.0" - normalize-path "^3.0.0" - readable-stream "^2.0.0" - -archiver@^5.0.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/archiver/-/archiver-5.3.0.tgz#dd3e097624481741df626267564f7dd8640a45ba" - integrity sha512-iUw+oDwK0fgNpvveEsdQ0Ase6IIKztBJU2U0E9MzszMfmVVUyv1QJhS2ITW9ZCqx8dktAxVAjWWkKehuZE8OPg== - dependencies: - archiver-utils "^2.1.0" - async "^3.2.0" - buffer-crc32 "^0.2.1" - readable-stream "^3.6.0" - readdir-glob "^1.0.0" - tar-stream "^2.2.0" - zip-stream "^4.1.0" - archy@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" @@ -2655,11 +2559,6 @@ async@^2.6.2: dependencies: lodash "^4.17.14" -async@^3.2.0: - version "3.2.3" - resolved "https://registry.yarnpkg.com/async/-/async-3.2.3.tgz#ac53dafd3f4720ee9e8a160628f18ea91df196c9" - integrity sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g== - async@~0.2.10: version "0.2.10" resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" @@ -2946,7 +2845,7 @@ base64-arraybuffer@0.1.5, base64-arraybuffer@^0.1.5: resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad666aa5cd4bf9c6e9ce8" integrity sha1-c5JncZI7Whl0etZmqlzUv5xunOg= -base64-js@^1.0.2, base64-js@^1.3.1: +base64-js@^1.0.2: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== @@ -3005,43 +2904,6 @@ big.js@^5.2.2: resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== -bin-check@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/bin-check/-/bin-check-4.1.0.tgz#fc495970bdc88bb1d5a35fc17e65c4a149fc4a49" - integrity sha512-b6weQyEUKsDGFlACWSIOfveEnImkJyK/FGW6FAG42loyoquvjdtOIqO6yBFzHyqyVVhNgNkQxxx09SFLK28YnA== - dependencies: - execa "^0.7.0" - executable "^4.1.0" - -bin-version-check@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/bin-version-check/-/bin-version-check-4.0.0.tgz#7d819c62496991f80d893e6e02a3032361608f71" - integrity sha512-sR631OrhC+1f8Cvs8WyVWOA33Y8tgwjETNPyyD/myRBXLkfS/vl74FmH/lFcRl9KY3zwGh7jFhvyk9vV3/3ilQ== - dependencies: - bin-version "^3.0.0" - semver "^5.6.0" - semver-truncate "^1.1.2" - -bin-version@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/bin-version/-/bin-version-3.1.0.tgz#5b09eb280752b1bd28f0c9db3f96f2f43b6c0839" - integrity sha512-Mkfm4iE1VFt4xd4vH+gx+0/71esbfus2LsnCGe8Pi4mndSPyT+NGES/Eg99jx8/lUGWfu3z2yuB/bt5UB+iVbQ== - dependencies: - execa "^1.0.0" - find-versions "^3.0.0" - -bin-wrapper@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/bin-wrapper/-/bin-wrapper-4.1.0.tgz#99348f2cf85031e3ef7efce7e5300aeaae960605" - integrity sha512-hfRmo7hWIXPkbpi0ZltboCMVrU+0ClXR/JgbCKKjlDjQf6igXa7OwdqNcFWQZPZTgiY7ZpzE3+LjjkLiTN2T7Q== - dependencies: - bin-check "^4.1.0" - bin-version-check "^4.0.0" - download "^7.1.0" - import-lazy "^3.1.0" - os-filter-obj "^2.0.0" - pify "^4.0.1" - binary-extensions@^1.0.0: version "1.13.1" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" @@ -3059,23 +2921,6 @@ bindings@^1.5.0: dependencies: file-uri-to-path "1.0.0" -bl@^1.0.0: - version "1.2.3" - resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.3.tgz#1e8dd80142eac80d7158c9dccc047fb620e035e7" - integrity sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww== - dependencies: - readable-stream "^2.3.5" - safe-buffer "^5.1.1" - -bl@^4.0.3: - version "4.1.0" - resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" - integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== - dependencies: - buffer "^5.5.0" - inherits "^2.0.4" - readable-stream "^3.4.0" - blob@0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.5.tgz#d680eeef25f8cd91ad533f5b01eed48e64caf683" @@ -3129,11 +2974,6 @@ boolbase@^1.0.0: resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= -boolean@^3.0.1: - version "3.1.4" - resolved "https://registry.yarnpkg.com/boolean/-/boolean-3.1.4.tgz#f51a2fb5838a99e06f9b6ec1edb674de67026435" - integrity sha512-3hx0kwU3uzG6ReQ3pnaFQPSktpBw6RHN3/ivDKEuU8g1XSfafowyvDnadjv1xp8IZqhtSukxlwv9bF6FhX8m0w== - bottleneck@^2.19.5: version "2.19.5" resolved "https://registry.yarnpkg.com/bottleneck/-/bottleneck-2.19.5.tgz#5df0b90f59fd47656ebe63c78a98419205cadd91" @@ -3282,11 +3122,6 @@ buffer-alloc@^1.2.0: buffer-alloc-unsafe "^1.1.0" buffer-fill "^1.0.0" -buffer-crc32@^0.2.1, buffer-crc32@^0.2.13, buffer-crc32@~0.2.3: - version "0.2.13" - resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" - integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= - buffer-equal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-1.0.0.tgz#59616b498304d556abd466966b22eeda3eca5fbe" @@ -3321,14 +3156,6 @@ buffer@4.9.2, buffer@^4.3.0: ieee754 "^1.1.4" isarray "^1.0.0" -buffer@^5.2.1, buffer@^5.5.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" - integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.1.13" - builtin-status-codes@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" @@ -3404,37 +3231,6 @@ cache-base@^1.0.1: union-value "^1.0.0" unset-value "^1.0.0" -cacheable-lookup@^5.0.3: - version "5.0.4" - resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz#5a6b865b2c44357be3d5ebc2a467b032719a7005" - integrity sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA== - -cacheable-request@^2.1.1: - version "2.1.4" - resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-2.1.4.tgz#0d808801b6342ad33c91df9d0b44dc09b91e5c3d" - integrity sha1-DYCIAbY0KtM8kd+dC0TcCbkeXD0= - dependencies: - clone-response "1.0.2" - get-stream "3.0.0" - http-cache-semantics "3.8.1" - keyv "3.0.0" - lowercase-keys "1.0.0" - normalize-url "2.0.1" - responselike "1.0.2" - -cacheable-request@^7.0.2: - version "7.0.2" - resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-7.0.2.tgz#ea0d0b889364a25854757301ca12b2da77f91d27" - integrity sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew== - dependencies: - clone-response "^1.0.2" - get-stream "^5.1.0" - http-cache-semantics "^4.0.0" - keyv "^4.0.0" - lowercase-keys "^2.0.0" - normalize-url "^6.0.1" - responselike "^2.0.0" - call-bind@^1.0.0, call-bind@^1.0.2, call-bind@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" @@ -3461,14 +3257,6 @@ camel-case@3.0.x: no-case "^2.2.0" upper-case "^1.1.1" -camel-case@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a" - integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== - dependencies: - pascal-case "^3.1.2" - tslib "^2.0.3" - camelcase-keys@^6.2.2: version "6.2.2" resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-6.2.2.tgz#5e755d6ba51aa223ec7d3d52f25778210f9dc3c0" @@ -3498,15 +3286,6 @@ caniuse-lite@^1.0.30001286: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001298.tgz#0e690039f62e91c3ea581673d716890512e7ec52" integrity sha512-AcKqikjMLlvghZL/vfTHorlQsLDhGRalYf1+GmWCf5SCMziSGjRYQW/JEksj14NaYHIR6KIhrFAy0HV5C25UzQ== -capital-case@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/capital-case/-/capital-case-1.0.4.tgz#9d130292353c9249f6b00fa5852bee38a717e669" - integrity sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A== - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - upper-case-first "^2.0.2" - caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" @@ -3526,16 +3305,6 @@ catalog-converter@^0.0.9: tslib "^2.3.1" yargs "^15.3.1" -caw@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/caw/-/caw-2.0.1.tgz#6c3ca071fc194720883c2dc5da9b074bfc7e9e95" - integrity sha512-Cg8/ZSBEa8ZVY9HspcGUYaK63d/bN7rqS3CYCzEGUxuYv6UlmcjzDUz2fCFFHyTvUW5Pk0I+3hkA3iXlIj6guA== - dependencies: - get-proxy "^2.0.0" - isurl "^1.0.0-alpha5" - tunnel-agent "^0.6.0" - url-to-options "^1.0.1" - chalk@^1.1.1, chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" @@ -3564,24 +3333,6 @@ chalk@^4.0.0, chalk@^4.1.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -change-case@^4.1.1: - version "4.1.2" - resolved "https://registry.yarnpkg.com/change-case/-/change-case-4.1.2.tgz#fedfc5f136045e2398c0410ee441f95704641e12" - integrity sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A== - dependencies: - camel-case "^4.1.2" - capital-case "^1.0.4" - constant-case "^3.0.4" - dot-case "^3.0.4" - header-case "^2.0.4" - no-case "^3.0.4" - param-case "^3.0.4" - pascal-case "^3.1.2" - path-case "^3.0.4" - sentence-case "^3.0.4" - snake-case "^3.0.4" - tslib "^2.0.3" - chokidar@^2.0.0, chokidar@^2.1.8: version "2.1.8" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" @@ -3616,6 +3367,21 @@ chokidar@^3.0.0, chokidar@^3.4.1: optionalDependencies: fsevents "~2.3.2" +chokidar@^3.4.2: + version "3.5.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + chownr@^1.1.1: version "1.1.4" resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" @@ -3626,18 +3392,6 @@ chownr@^2.0.0: resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== -chrome-launcher@^0.13.1: - version "0.13.4" - resolved "https://registry.yarnpkg.com/chrome-launcher/-/chrome-launcher-0.13.4.tgz#4c7d81333c98282899c4e38256da23e00ed32f73" - integrity sha512-nnzXiDbGKjDSK6t2I+35OAPBy5Pw/39bgkb/ZAFwMhwJbdYBp6aH+vW28ZgtjdU890Q7D+3wN/tB8N66q5Gi2A== - dependencies: - "@types/node" "*" - escape-string-regexp "^1.0.5" - is-wsl "^2.2.0" - lighthouse-logger "^1.0.0" - mkdirp "^0.5.3" - rimraf "^3.0.2" - chrome-trace-event@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" @@ -3721,27 +3475,11 @@ cliui@^6.0.0: strip-ansi "^6.0.0" wrap-ansi "^6.2.0" -cliui@^7.0.2: - version "7.0.4" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" - integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^7.0.0" - clone-buffer@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58" integrity sha1-4+JbIHrE5wGvch4staFnksrD3Fg= -clone-response@1.0.2, clone-response@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" - integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws= - dependencies: - mimic-response "^1.0.0" - clone-stats@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-1.0.0.tgz#b3782dff8bb5474e18b9b6bf0fdfe782f8777680" @@ -3839,7 +3577,7 @@ commander@2.17.x: resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" integrity sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg== -commander@^2.20.0, commander@^2.8.1: +commander@^2.20.0: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== @@ -3886,16 +3624,6 @@ compose-function@3.0.3: dependencies: arity-n "^1.0.4" -compress-commons@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/compress-commons/-/compress-commons-4.1.1.tgz#df2a09a7ed17447642bad10a85cc9a19e5c42a7d" - integrity sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ== - dependencies: - buffer-crc32 "^0.2.13" - crc32-stream "^4.0.2" - normalize-path "^3.0.0" - readable-stream "^3.6.0" - compressible@~2.0.16: version "2.0.18" resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" @@ -3940,14 +3668,6 @@ concat-stream@~1.5.1: readable-stream "~2.0.0" typedarray "~0.0.5" -config-chain@^1.1.11: - version "1.1.13" - resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.13.tgz#fad0795aa6a6cdaff9ed1b68e9dff94372c232f4" - integrity sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ== - dependencies: - ini "^1.3.4" - proto-list "~1.2.1" - connect-history-api-fallback@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc" @@ -3978,21 +3698,12 @@ console-polyfill@0.3.0: resolved "https://registry.yarnpkg.com/console-polyfill/-/console-polyfill-0.3.0.tgz#84900902a18c47a5eba932be75fa44d23e8af861" integrity sha512-w+JSDZS7XML43Xnwo2x5O5vxB0ID7T5BdqDtyqT6uiCAX2kZAgcWxNaGqT97tZfSHzfOcvrfsDAodKcJ3UvnXQ== -constant-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/constant-case/-/constant-case-3.0.4.tgz#3b84a9aeaf4cf31ec45e6bf5de91bdfb0589faf1" - integrity sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ== - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - upper-case "^2.0.2" - constants-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= -content-disposition@0.5.4, content-disposition@^0.5.2: +content-disposition@0.5.4: version "0.5.4" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== @@ -4127,22 +3838,6 @@ cosmiconfig@^6.0.0: path-type "^4.0.0" yaml "^1.7.2" -crc-32@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.0.tgz#cb2db6e29b88508e32d9dd0ec1693e7b41a18208" - integrity sha512-1uBwHxF+Y/4yF5G48fwnKq6QsIXheor3ZLPT80yGBV1oEUwpPojlEhQbWKVw1VwcTQyMGHK1/XMmTjmlsmTTGA== - dependencies: - exit-on-epipe "~1.0.1" - printj "~1.1.0" - -crc32-stream@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/crc32-stream/-/crc32-stream-4.0.2.tgz#c922ad22b38395abe9d3870f02fa8134ed709007" - integrity sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w== - dependencies: - crc-32 "^1.2.0" - readable-stream "^3.4.0" - create-ecdh@^4.0.0: version "4.0.4" resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" @@ -4297,11 +3992,6 @@ css-select@^4.1.3: domutils "^2.8.0" nth-check "^2.0.1" -css-shorthand-properties@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/css-shorthand-properties/-/css-shorthand-properties-1.1.1.tgz#1c808e63553c283f289f2dd56fcee8f3337bd935" - integrity sha512-Md+Juc7M3uOdbAFwOYlTrccIZ7oCFuzrhKYQjdeUEW/sE1hv17Jp/Bws+ReOPpGVBTYCBoYo+G17V5Qo8QQ75A== - css-to-react-native@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/css-to-react-native/-/css-to-react-native-3.0.0.tgz#62dbe678072a824a689bcfee011fc96e02a7d756" @@ -4311,11 +4001,6 @@ css-to-react-native@^3.0.0: css-color-keywords "^1.0.0" postcss-value-parser "^4.0.2" -css-value@^0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/css-value/-/css-value-0.0.1.tgz#5efd6c2eea5ea1fd6b6ac57ec0427b18452424ea" - integrity sha1-Xv1sLupeof1rasV+wEJ7GEUkJOo= - css-what@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/css-what/-/css-what-5.1.0.tgz#3f7b707aadf633baf62c2ceb8579b545bb40f7fe" @@ -4598,7 +4283,7 @@ debounce@^1.2.1: resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.1.tgz#38881d8f4166a5c5848020c11827b834bcb3e0a5" integrity sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug== -debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: +debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== @@ -4656,73 +4341,6 @@ decode-uri-component@^0.2.0: resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= -decompress-response@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" - integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M= - dependencies: - mimic-response "^1.0.0" - -decompress-response@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" - integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== - dependencies: - mimic-response "^3.1.0" - -decompress-tar@^4.0.0, decompress-tar@^4.1.0, decompress-tar@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/decompress-tar/-/decompress-tar-4.1.1.tgz#718cbd3fcb16209716e70a26b84e7ba4592e5af1" - integrity sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ== - dependencies: - file-type "^5.2.0" - is-stream "^1.1.0" - tar-stream "^1.5.2" - -decompress-tarbz2@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz#3082a5b880ea4043816349f378b56c516be1a39b" - integrity sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A== - dependencies: - decompress-tar "^4.1.0" - file-type "^6.1.0" - is-stream "^1.1.0" - seek-bzip "^1.0.5" - unbzip2-stream "^1.0.9" - -decompress-targz@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/decompress-targz/-/decompress-targz-4.1.1.tgz#c09bc35c4d11f3de09f2d2da53e9de23e7ce1eee" - integrity sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w== - dependencies: - decompress-tar "^4.1.1" - file-type "^5.2.0" - is-stream "^1.1.0" - -decompress-unzip@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/decompress-unzip/-/decompress-unzip-4.0.1.tgz#deaaccdfd14aeaf85578f733ae8210f9b4848f69" - integrity sha1-3qrM39FK6vhVePczroIQ+bSEj2k= - dependencies: - file-type "^3.8.0" - get-stream "^2.2.0" - pify "^2.3.0" - yauzl "^2.4.2" - -decompress@^4.2.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/decompress/-/decompress-4.2.1.tgz#007f55cc6a62c055afa37c07eb6a4ee1b773f118" - integrity sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ== - dependencies: - decompress-tar "^4.0.0" - decompress-tarbz2 "^4.0.0" - decompress-targz "^4.0.0" - decompress-unzip "^4.0.1" - graceful-fs "^4.1.10" - make-dir "^1.0.0" - pify "^2.3.0" - strip-dirs "^2.0.0" - deep-equal@^1.0.1, deep-equal@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a" @@ -4745,7 +4363,7 @@ deepmerge@1.3.2: resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-1.3.2.tgz#1663691629d4dbfe364fa12a2a4f0aa86aa3a050" integrity sha1-FmNpFinU2/42T6EqKk8KqGqjoFA= -deepmerge@^4.0.0, deepmerge@^4.2.2: +deepmerge@^4.2.2: version "4.2.2" resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== @@ -4777,11 +4395,6 @@ default-resolution@^2.0.0: resolved "https://registry.yarnpkg.com/default-resolution/-/default-resolution-2.0.0.tgz#bcb82baa72ad79b426a76732f1a81ad6df26d684" integrity sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ= -defer-to-connect@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587" - integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== - define-properties@^1.1.2, define-properties@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" @@ -4884,26 +4497,6 @@ detect-node@^2.0.4: resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== -devtools-protocol@0.0.818844: - version "0.0.818844" - resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.818844.tgz#d1947278ec85b53e4c8ca598f607a28fa785ba9e" - integrity sha512-AD1hi7iVJ8OD0aMLQU5VK0XH9LDlA1+BcPIgrAxPfaibx2DbWucuyOhc4oyQCbnvDDO68nN6/LcKfqTP343Jjg== - -devtools@6.12.1: - version "6.12.1" - resolved "https://registry.yarnpkg.com/devtools/-/devtools-6.12.1.tgz#f0298c6d6f46d8d3b751dd8fa4a0c7bc76e1268f" - integrity sha512-JyG46suEiZmld7/UVeogkCWM0zYGt+2ML/TI+SkEp+bTv9cs46cDb0pKF3glYZJA7wVVL2gC07Ic0iCxyJEnCQ== - dependencies: - "@wdio/config" "6.12.1" - "@wdio/logger" "6.10.10" - "@wdio/protocols" "6.12.0" - "@wdio/utils" "6.11.0" - chrome-launcher "^0.13.1" - edge-paths "^2.1.0" - puppeteer-core "^5.1.0" - ua-parser-js "^0.7.21" - uuid "^8.0.0" - di@^0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/di/-/di-0.0.1.tgz#806649326ceaa7caa3306d75d985ea2748ba913c" @@ -5086,14 +4679,6 @@ domutils@^2.5.2, domutils@^2.8.0: domelementtype "^2.2.0" domhandler "^4.2.0" -dot-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" - integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - dotignore@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/dotignore/-/dotignore-0.1.2.tgz#f942f2200d28c3a76fbdd6f0ee9f3257c8a2e905" @@ -5101,29 +4686,6 @@ dotignore@~0.1.2: dependencies: minimatch "^3.0.4" -download@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/download/-/download-7.1.0.tgz#9059aa9d70b503ee76a132897be6dec8e5587233" - integrity sha512-xqnBTVd/E+GxJVrX5/eUJiLYjCGPwMpdL+jGhGU57BvtcA7wwhtHVbXBeUk51kOpW3S7Jn3BQbN9Q1R1Km2qDQ== - dependencies: - archive-type "^4.0.0" - caw "^2.0.1" - content-disposition "^0.5.2" - decompress "^4.2.0" - ext-name "^5.0.0" - file-type "^8.1.0" - filenamify "^2.0.0" - get-stream "^3.0.0" - got "^8.3.1" - make-dir "^1.2.0" - p-event "^2.1.0" - pify "^3.0.0" - -duplexer3@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" - integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= - duplexer@~0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" @@ -5155,14 +4717,6 @@ ecc-jsbn@~0.1.1: jsbn "~0.1.0" safer-buffer "^2.1.0" -edge-paths@^2.1.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/edge-paths/-/edge-paths-2.2.1.tgz#d2d91513225c06514aeac9843bfce546abbf4391" - integrity sha512-AI5fC7dfDmCdKo3m5y7PkYE8m6bMqR6pvVpgtrZkkhcJXFLelUgkjrhk3kXXx8Kbw2cRaTT4LkOR7hqf39KJdw== - dependencies: - "@types/which" "^1.3.2" - which "^2.0.2" - ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" @@ -5211,7 +4765,7 @@ encodeurl@~1.0.2: resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= -end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.1: +end-of-stream@^1.0.0, end-of-stream@^1.1.0: version "1.4.4" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== @@ -5258,7 +4812,7 @@ engine.io@~3.2.0: engine.io-parser "~2.1.0" ws "~3.3.1" -enhanced-resolve@^4.0.0, enhanced-resolve@^4.1.0, enhanced-resolve@^4.1.1: +enhanced-resolve@^4.0.0, enhanced-resolve@^4.1.1, enhanced-resolve@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz#2f3cfd84dbe3b487f18f2db2ef1e064a571ca5ec" integrity sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg== @@ -5369,11 +4923,6 @@ es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.50: es6-symbol "~3.1.3" next-tick "~1.0.0" -es6-error@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" - integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== - es6-iterator@2.0.3, es6-iterator@^2.0.1, es6-iterator@^2.0.3, es6-iterator@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" @@ -5640,19 +5189,6 @@ evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: md5.js "^1.3.4" safe-buffer "^5.1.1" -execa@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" - integrity sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c= - dependencies: - cross-spawn "^5.0.1" - get-stream "^3.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - execa@^0.8.0: version "0.8.0" resolved "https://registry.yarnpkg.com/execa/-/execa-0.8.0.tgz#d8d76bbc1b55217ed190fd6dd49d3c774ecfc8da" @@ -5679,18 +5215,6 @@ execa@^1.0.0: signal-exit "^3.0.0" strip-eof "^1.0.0" -executable@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/executable/-/executable-4.1.1.tgz#41532bff361d3e57af4d763b70582db18f5d133c" - integrity sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg== - dependencies: - pify "^2.2.0" - -exit-on-epipe@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz#0bdd92e87d5285d267daa8171d0eb06159689692" - integrity sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw== - expand-brackets@^2.1.4: version "2.1.4" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" @@ -5755,21 +5279,6 @@ express@^4.17.1, express@^4.8.0: utils-merge "1.0.1" vary "~1.1.2" -ext-list@^2.0.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/ext-list/-/ext-list-2.2.2.tgz#0b98e64ed82f5acf0f2931babf69212ef52ddd37" - integrity sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA== - dependencies: - mime-db "^1.28.0" - -ext-name@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/ext-name/-/ext-name-5.0.0.tgz#70781981d183ee15d13993c8822045c506c8f0a6" - integrity sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ== - dependencies: - ext-list "^2.0.0" - sort-keys-length "^1.0.0" - ext@^1.1.2: version "1.6.0" resolved "https://registry.yarnpkg.com/ext/-/ext-1.6.0.tgz#3871d50641e874cc172e2b53f919842d19db4c52" @@ -5811,17 +5320,6 @@ extglob@^2.0.2, extglob@^2.0.4: snapdragon "^0.8.1" to-regex "^3.0.1" -extract-zip@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a" - integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== - dependencies: - debug "^4.1.1" - get-stream "^5.1.0" - yauzl "^2.10.0" - optionalDependencies: - "@types/yauzl" "^2.9.1" - extsprintf@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" @@ -5847,11 +5345,6 @@ fast-deep-equal@^1.0.0: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" integrity sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ= -fast-deep-equal@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" - integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= - fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" @@ -5904,13 +5397,6 @@ faye-websocket@^0.11.3: dependencies: websocket-driver ">=0.5.1" -fd-slicer@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" - integrity sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4= - dependencies: - pend "~1.2.0" - fetch-mock@^9.11.0: version "9.11.0" resolved "https://registry.yarnpkg.com/fetch-mock/-/fetch-mock-9.11.0.tgz#371c6fb7d45584d2ae4a18ee6824e7ad4b637a3f" @@ -5959,50 +5445,11 @@ file-saver@^1.3.8: resolved "https://registry.yarnpkg.com/file-saver/-/file-saver-1.3.8.tgz#e68a30c7cb044e2fb362b428469feb291c2e09d8" integrity sha512-spKHSBQIxxS81N/O21WmuXA2F6wppUCsutpzenOeZzOCCJ5gEfcbqJP983IrpLXzYmXnMUa6J03SubcNPdKrlg== -file-type@^3.8.0: - version "3.9.0" - resolved "https://registry.yarnpkg.com/file-type/-/file-type-3.9.0.tgz#257a078384d1db8087bc449d107d52a52672b9e9" - integrity sha1-JXoHg4TR24CHvESdEH1SpSZyuek= - -file-type@^4.2.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/file-type/-/file-type-4.4.0.tgz#1b600e5fca1fbdc6e80c0a70c71c8dba5f7906c5" - integrity sha1-G2AOX8ofvcboDApwxxyNul95BsU= - -file-type@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/file-type/-/file-type-5.2.0.tgz#2ddbea7c73ffe36368dfae49dc338c058c2b8ad6" - integrity sha1-LdvqfHP/42No365J3DOMBYwritY= - -file-type@^6.1.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/file-type/-/file-type-6.2.0.tgz#e50cd75d356ffed4e306dc4f5bcf52a79903a919" - integrity sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg== - -file-type@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/file-type/-/file-type-8.1.0.tgz#244f3b7ef641bbe0cca196c7276e4b332399f68c" - integrity sha512-qyQ0pzAy78gVoJsmYeNgl8uH8yKhr1lVhW7JbzJmnlRi0I4R2eEDEJZVKG8agpDnLpacwNbDhLNG/LMdxHD2YQ== - file-uri-to-path@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== -filename-reserved-regex@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz#abf73dfab735d045440abfea2d91f389ebbfa229" - integrity sha1-q/c9+rc10EVECr/qLZHzieu/oik= - -filenamify@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/filenamify/-/filenamify-2.1.0.tgz#88faf495fb1b47abfd612300002a16228c677ee9" - integrity sha512-ICw7NTT6RsDp2rnYKVd8Fu4cr6ITzGy3+u4vUujPkabyaz+03F24NWEX7fs5fp+kBonlaqPH8fAO2NM+SXt/JA== - dependencies: - filename-reserved-regex "^2.0.0" - strip-outer "^1.0.0" - trim-repeated "^1.0.0" - fileset@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/fileset/-/fileset-2.0.3.tgz#8e7548a96d3cc2327ee5e674168723a333bba2a0" @@ -6094,13 +5541,6 @@ find-up@^4.0.0, find-up@^4.1.0: locate-path "^5.0.0" path-exists "^4.0.0" -find-versions@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/find-versions/-/find-versions-3.2.0.tgz#10297f98030a786829681690545ef659ed1d254e" - integrity sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww== - dependencies: - semver-regex "^2.0.0" - find@^0.2.4: version "0.2.9" resolved "https://registry.yarnpkg.com/find/-/find-0.2.9.tgz#4b73f1ff9e56ad91b76e716407fe5ffe6554bb8c" @@ -6209,24 +5649,26 @@ forever-agent@~0.6.1: resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= -fork-ts-checker-notifier-webpack-plugin@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/fork-ts-checker-notifier-webpack-plugin/-/fork-ts-checker-notifier-webpack-plugin-3.0.0.tgz#931da838f2351a5dd0c2d1eb4eaf6ddfc541fbf0" - integrity sha512-jTO+/Dz+7zK/2Cu+ujeBMKx01657+BkefH2b+i1c4iH/tByT0+MrcSzj56975XQQ3zaMiBvNH9sRXe7Vi53weA== +fork-ts-checker-notifier-webpack-plugin@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/fork-ts-checker-notifier-webpack-plugin/-/fork-ts-checker-notifier-webpack-plugin-6.0.0.tgz#d42447c3b02e734098cde7fa9fd02031e24adec8" + integrity sha512-Gzop95yFefJu9P68BBQ+Gsu5hjF7DQQTCcEM0Ns0WaXKD9CR0qqCJkjRrE+2gZG7PhdK8ccfxiexFvPZHbb4Tg== dependencies: - node-notifier "^6.0.0" + node-notifier "^8.0.2" -fork-ts-checker-webpack-plugin@^5.0.7: - version "5.2.1" - resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-5.2.1.tgz#79326d869797906fa8b24e2abcf9421fc805450d" - integrity sha512-SVi+ZAQOGbtAsUWrZvGzz38ga2YqjWvca1pXQFUArIVXqli0lLoDQ8uS0wg0kSpcwpZmaW5jVCZXQebkyUQSsw== +fork-ts-checker-webpack-plugin@^6.0.0: + version "6.5.3" + resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz#eda2eff6e22476a2688d10661688c47f611b37f3" + integrity sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ== dependencies: "@babel/code-frame" "^7.8.3" "@types/json-schema" "^7.0.5" chalk "^4.1.0" + chokidar "^3.4.2" cosmiconfig "^6.0.0" deepmerge "^4.2.2" fs-extra "^9.0.0" + glob "^7.1.6" memfs "^3.1.2" minimatch "^3.0.4" schema-utils "2.7.0" @@ -6282,7 +5724,7 @@ fresh@0.5.2: resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= -from2@^2.1.0, from2@^2.1.1: +from2@^2.1.0: version "2.3.0" resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= @@ -6302,11 +5744,6 @@ fs-access@^1.0.0: dependencies: null-check "^1.0.0" -fs-constants@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" - integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== - fs-extra@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" @@ -6316,7 +5753,7 @@ fs-extra@^7.0.1: jsonfile "^4.0.0" universalify "^0.1.0" -fs-extra@^9.0.0, fs-extra@^9.0.1: +fs-extra@^9.0.0: version "9.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== @@ -6444,7 +5881,7 @@ get-caller-file@^1.0.1: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== -get-caller-file@^2.0.1, get-caller-file@^2.0.5: +get-caller-file@^2.0.1: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== @@ -6467,36 +5904,16 @@ get-intrinsic@^1.1.3: has "^1.0.3" has-symbols "^1.0.3" -get-port@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/get-port/-/get-port-5.1.1.tgz#0469ed07563479de6efb986baf053dcd7d4e3193" - integrity sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ== - -get-proxy@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/get-proxy/-/get-proxy-2.1.0.tgz#349f2b4d91d44c4d4d4e9cba2ad90143fac5ef93" - integrity sha512-zmZIaQTWnNQb4R4fJUEp/FC51eZsc6EkErspy3xtIYStaq8EB/hDIWipxsal+E8rz0qD7f2sL/NA9Xee4RInJw== - dependencies: - npm-conf "^1.1.0" - get-stdin@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4= -get-stream@3.0.0, get-stream@^3.0.0: +get-stream@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= -get-stream@^2.2.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-2.3.1.tgz#5f38f93f346009666ee0150a054167f91bdd95de" - integrity sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4= - dependencies: - object-assign "^4.0.1" - pinkie-promise "^2.0.0" - get-stream@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" @@ -6504,13 +5921,6 @@ get-stream@^4.0.0: dependencies: pump "^3.0.0" -get-stream@^5.1.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" - integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== - dependencies: - pump "^3.0.0" - get-symbol-description@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" @@ -6600,6 +6010,18 @@ glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, gl once "^1.3.0" path-is-absolute "^1.0.0" +glob@^7.1.6: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + glob@~7.1.1, glob@~7.1.7: version "7.1.7" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" @@ -6612,19 +6034,6 @@ glob@~7.1.1, glob@~7.1.7: once "^1.3.0" path-is-absolute "^1.0.0" -global-agent@^2.1.12: - version "2.2.0" - resolved "https://registry.yarnpkg.com/global-agent/-/global-agent-2.2.0.tgz#566331b0646e6bf79429a16877685c4a1fbf76dc" - integrity sha512-+20KpaW6DDLqhG7JDiJpD1JvNvb8ts+TNl7BPOYcURqCrXqnN1Vf+XVOrkKJAFPqfX+oEhsdzOj1hLWkBTdNJg== - dependencies: - boolean "^3.0.1" - core-js "^3.6.5" - es6-error "^4.1.1" - matcher "^3.0.0" - roarr "^2.15.3" - semver "^7.3.2" - serialize-error "^7.0.1" - global-modules@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" @@ -6678,13 +6087,6 @@ globals@^9.18.0: resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== -globalthis@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.2.tgz#2a235d34f4d8036219f7e34929b5de9e18166b8b" - integrity sha512-ZQnSFO1la8P7auIOQECnm0sSuoMeaSq0EEdXMBFF2QJO4uNcwbyhSgG3MruWNbFTqCLmxVwGOl7LZ9kASvHdeQ== - dependencies: - define-properties "^1.1.3" - globby@^11.0.1: version "11.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" @@ -6738,56 +6140,11 @@ gopd@^1.0.1: dependencies: get-intrinsic "^1.1.3" -got@^11.0.2, got@^11.7.0: - version "11.8.3" - resolved "https://registry.yarnpkg.com/got/-/got-11.8.3.tgz#f496c8fdda5d729a90b4905d2b07dbd148170770" - integrity sha512-7gtQ5KiPh1RtGS9/Jbv1ofDpBFuq42gyfEib+ejaRBJuj/3tQFeR5+gw57e4ipaU8c/rCjvX6fkQz2lyDlGAOg== - dependencies: - "@sindresorhus/is" "^4.0.0" - "@szmarczak/http-timer" "^4.0.5" - "@types/cacheable-request" "^6.0.1" - "@types/responselike" "^1.0.0" - cacheable-lookup "^5.0.3" - cacheable-request "^7.0.2" - decompress-response "^6.0.0" - http2-wrapper "^1.0.0-beta.5.2" - lowercase-keys "^2.0.0" - p-cancelable "^2.0.0" - responselike "^2.0.0" - -got@^8.3.1: - version "8.3.2" - resolved "https://registry.yarnpkg.com/got/-/got-8.3.2.tgz#1d23f64390e97f776cac52e5b936e5f514d2e937" - integrity sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw== - dependencies: - "@sindresorhus/is" "^0.7.0" - cacheable-request "^2.1.1" - decompress-response "^3.3.0" - duplexer3 "^0.1.4" - get-stream "^3.0.0" - into-stream "^3.1.0" - is-retry-allowed "^1.1.0" - isurl "^1.0.0-alpha5" - lowercase-keys "^1.0.0" - mimic-response "^1.0.0" - p-cancelable "^0.4.0" - p-timeout "^2.0.1" - pify "^3.0.0" - safe-buffer "^5.1.1" - timed-out "^4.0.1" - url-parse-lax "^3.0.0" - url-to-options "^1.0.1" - -graceful-fs@^4.0.0, graceful-fs@^4.1.10, graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.3: +graceful-fs@^4.0.0, graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.3: version "4.2.9" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96" integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ== -grapheme-splitter@^1.0.2: - version "1.0.4" - resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" - integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== - growly@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" @@ -6901,11 +6258,6 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-symbol-support-x@^1.4.1: - version "1.4.2" - resolved "https://registry.yarnpkg.com/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz#1409f98bc00247da45da67cee0a36f282ff26455" - integrity sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw== - has-symbols@^1.0.1, has-symbols@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" @@ -6916,13 +6268,6 @@ has-symbols@^1.0.3: resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== -has-to-string-tag-x@^1.2.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz#a045ab383d7b4b2012a00148ab0aa5f290044d4d" - integrity sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw== - dependencies: - has-symbol-support-x "^1.4.1" - has-tostringtag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" @@ -6982,7 +6327,7 @@ hash-base@^3.0.0: readable-stream "^3.6.0" safe-buffer "^5.2.0" -hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: +hash.js@^1.0.0, hash.js@^1.0.3: version "1.1.7" resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== @@ -6995,14 +6340,6 @@ he@1.2.x, he@^1.1.1: resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== -header-case@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/header-case/-/header-case-2.0.4.tgz#5a42e63b55177349cf405beb8d775acabb92c063" - integrity sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q== - dependencies: - capital-case "^1.0.4" - tslib "^2.0.3" - hmac-drbg@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" @@ -7140,16 +6477,6 @@ htmlparser2@^7.0: domutils "^2.8.0" entities "^3.0.1" -http-cache-semantics@3.8.1: - version "3.8.1" - resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz#39b0e16add9b605bf0a9ef3d9daaf4843b4cacd2" - integrity sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w== - -http-cache-semantics@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" - integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== - http-deceiver@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" @@ -7218,14 +6545,6 @@ http-signature@~1.2.0: jsprim "^1.2.2" sshpk "^1.7.0" -http2-wrapper@^1.0.0-beta.5.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-1.0.3.tgz#b8f55e0c1f25d4ebd08b3b0c2c079f9590800b3d" - integrity sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg== - dependencies: - quick-lru "^5.1.1" - resolve-alpn "^1.0.0" - https-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" @@ -7255,10 +6574,10 @@ https-proxy-agent@^5.0.0: agent-base "6" debug "4" -husky@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/husky/-/husky-8.0.1.tgz#511cb3e57de3e3190514ae49ed50f6bc3f50b3e9" - integrity sha512-xs7/chUH/CKdOCs7Zy0Aev9e/dKOMZf3K1Az1nar3tzlv0jfqnYtu235bstsWTmXOR0EfINrPa97yy4Lz6RiKw== +husky@^8.0.3: + version "8.0.3" + resolved "https://registry.yarnpkg.com/husky/-/husky-8.0.3.tgz#4936d7212e46d1dea28fef29bb3a108872cd9184" + integrity sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg== hyphenate-style-name@^1.0.0: version "1.0.4" @@ -7310,7 +6629,7 @@ ieee754@1.1.13: resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== -ieee754@^1.1.12, ieee754@^1.1.13, ieee754@^1.1.4: +ieee754@^1.1.12, ieee754@^1.1.4: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== @@ -7358,11 +6677,6 @@ import-fresh@^3.0.0, import-fresh@^3.1.0, import-fresh@^3.2.1: parent-module "^1.0.0" resolve-from "^4.0.0" -import-lazy@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-3.1.0.tgz#891279202c8a2280fdbd6674dbd8da1a1dfc67cc" - integrity sha512-8/gvXvX2JMn0F+CDlSC4l6kOmVaLOO3XLkksI7CI3Ud95KDYJuYur2b9P/PUt/i/pDAMd/DulQsNbbbmRRsDIQ== - import-local@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" @@ -7464,14 +6778,6 @@ interpret@^1.4.0: resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== -into-stream@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/into-stream/-/into-stream-3.1.0.tgz#96fb0a936c12babd6ff1752a17d05616abd094c6" - integrity sha1-lvsKk2wSur1v8XUqF9BWFqvQlMY= - dependencies: - from2 "^2.1.1" - p-is-promise "^1.1.0" - invariant@^2.2.2: version "2.2.4" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" @@ -7699,11 +7005,6 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: dependencies: is-extglob "^2.1.1" -is-natural-number@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/is-natural-number/-/is-natural-number-4.0.1.tgz#ab9d76e1db4ced51e35de0c72ebecf09f734cde8" - integrity sha1-q5124dtM7VHjXeDHLr7PCfc0zeg= - is-negated-glob@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-negated-glob/-/is-negated-glob-1.0.0.tgz#6910bca5da8c95e784b5751b976cf5a10fee36d2" @@ -7738,11 +7039,6 @@ is-number@^7.0.0: resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== -is-object@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.2.tgz#a56552e1c665c9e950b4a025461da87e72f86fcf" - integrity sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA== - is-path-cwd@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" @@ -7762,7 +7058,7 @@ is-path-inside@^2.1.0: dependencies: path-is-inside "^1.0.2" -is-plain-obj@^1.0.0, is-plain-obj@^1.1, is-plain-obj@^1.1.0: +is-plain-obj@^1.1, is-plain-obj@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= @@ -7799,11 +7095,6 @@ is-relative@^1.0.0: dependencies: is-unc-path "^1.0.0" -is-retry-allowed@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4" - integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg== - is-running@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-running/-/is-running-2.1.0.tgz#30a73ff5cc3854e4fc25490809e9f5abf8de09e0" @@ -7888,7 +7179,7 @@ is-wsl@^1.1.0: resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= -is-wsl@^2.1.0, is-wsl@^2.1.1, is-wsl@^2.2.0: +is-wsl@^2.1.0, is-wsl@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== @@ -8038,14 +7329,6 @@ istanbul-reports@^2.2.5: dependencies: html-escaper "^2.0.0" -isurl@^1.0.0-alpha5: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isurl/-/isurl-1.0.0.tgz#b27f4f49f3cdaa3ea44a0a5b7f3462e6edc39d67" - integrity sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w== - dependencies: - has-to-string-tag-x "^1.2.0" - is-object "^1.0.1" - jasmine-ajax@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/jasmine-ajax/-/jasmine-ajax-4.0.0.tgz#7d8ba7e47e3f7e780e155fe9aa563faafa7e1a26" @@ -8147,16 +7430,6 @@ jsesc@~0.5.0: resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= -json-buffer@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" - integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg= - -json-buffer@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" - integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== - json-parse-better-errors@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" @@ -8192,7 +7465,7 @@ json-stable-stringify-without-jsonify@^1.0.1: resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= -json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.0, json-stringify-safe@~5.0.1: +json-stringify-safe@~5.0.0, json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= @@ -8333,15 +7606,6 @@ karma-safari-launcher@^1.0.0: resolved "https://registry.yarnpkg.com/karma-safari-launcher/-/karma-safari-launcher-1.0.0.tgz#96982a2cc47d066aae71c553babb28319115a2ce" integrity sha1-lpgqLMR9BmquccVTursoMZEVos4= -karma-sauce-launcher@^4.3.4: - version "4.3.6" - resolved "https://registry.yarnpkg.com/karma-sauce-launcher/-/karma-sauce-launcher-4.3.6.tgz#274f999ce5a3bc76577a438839cb0dbbf2746a48" - integrity sha512-Ej62q4mUPFktyAm8g0g8J5qhwEkXwdHrwtiV4pZjKNHNnSs+4qgDyzs3VkpOy3AmNTsTqQXUN/lpiy0tZpDJZQ== - dependencies: - global-agent "^2.1.12" - saucelabs "^4.6.3" - webdriverio "^6.7.0" - karma-spec-reporter@^0.0.32: version "0.0.32" resolved "https://registry.yarnpkg.com/karma-spec-reporter/-/karma-spec-reporter-0.0.32.tgz#2e9c7207ea726771260259f82becb543209e440a" @@ -8381,20 +7645,6 @@ karma@^4.0.0: tmp "0.0.33" useragent "2.3.0" -keyv@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.0.0.tgz#44923ba39e68b12a7cec7df6c3268c031f2ef373" - integrity sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA== - dependencies: - json-buffer "3.0.0" - -keyv@^4.0.0: - version "4.0.5" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.0.5.tgz#bb12b467aba372fab2a44d4420c00d3c4ebd484c" - integrity sha512-531pkGLqV3BMg0eDqqJFI0R1mkK1Nm5xIP2mM6keP5P8WfFtCkg2IOwplTUmlGoTgIg9yQYZ/kdihhz89XH3vA== - dependencies: - json-buffer "3.0.1" - killable@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892" @@ -8509,16 +7759,8 @@ liftoff@^3.1.0: flagged-respawn "^1.0.0" is-plain-object "^2.0.4" object.map "^1.0.0" - rechoir "^0.6.2" - resolve "^1.1.7" - -lighthouse-logger@^1.0.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/lighthouse-logger/-/lighthouse-logger-1.3.0.tgz#ba6303e739307c4eee18f08249524e7dafd510db" - integrity sha512-BbqAKApLb9ywUli+0a+PcV04SyJ/N1q/8qgCNe6U97KbPCS1BTksEuHFLYdvc8DltuhfxIUBqDZsC0bBGtl3lA== - dependencies: - debug "^2.6.9" - marky "^1.2.2" + rechoir "^0.6.2" + resolve "^1.1.7" line-diff@^2.0.1: version "2.1.1" @@ -8632,47 +7874,17 @@ lodash.camelcase@^4.3.0: resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY= -lodash.clonedeep@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" - integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= - lodash.debounce@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= -lodash.defaults@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" - integrity sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw= - -lodash.difference@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.difference/-/lodash.difference-4.5.0.tgz#9ccb4e505d486b91651345772885a2df27fd017c" - integrity sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw= - -lodash.flatten@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" - integrity sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8= - lodash.isequal@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" integrity sha1-QVxEePK8wwEgwizhDtMib30+GOA= -lodash.isobject@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/lodash.isobject/-/lodash.isobject-3.0.2.tgz#3c8fb8d5b5bf4bf90ae06e14f2a530a4ed935e1d" - integrity sha1-PI+41bW/S/kK4G4U8qUwpO2TXh0= - -lodash.isplainobject@^4.0.6: - version "4.0.6" - resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" - integrity sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs= - -lodash.merge@^4.6.1, lodash.merge@^4.6.2: +lodash.merge@^4.6.2: version "4.6.2" resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== @@ -8687,16 +7899,6 @@ lodash.truncate@^4.4.2: resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM= -lodash.union@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.union/-/lodash.union-4.6.0.tgz#48bb5088409f16f1821666641c44dd1aaae3cd88" - integrity sha1-SLtQiECfFvGCFmZkHETdGqrjzYg= - -lodash.zip@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.zip/-/lodash.zip-4.2.0.tgz#ec6662e4896408ed4ab6c542a3990b72cc080020" - integrity sha1-7GZi5IlkCO1KtsVCo5kLcswIACA= - lodash@^4.0.0, lodash@^4.0.1, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.6.1, lodash@~4.17.10: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" @@ -8713,12 +7915,7 @@ log4js@^4.0.0: rfdc "^1.1.4" streamroller "^1.0.6" -loglevel-plugin-prefix@^0.8.4: - version "0.8.4" - resolved "https://registry.yarnpkg.com/loglevel-plugin-prefix/-/loglevel-plugin-prefix-0.8.4.tgz#2fe0e05f1a820317d98d8c123e634c1bd84ff644" - integrity sha512-WpG9CcFAOjz/FtNht+QJeGpvVl/cdR6P0z6OcXSkr8wFJOsV2GRj2j10JLfjuA4aYkcKCNIEqRGCyTife9R8/g== - -loglevel@^1.6.0, loglevel@^1.6.8: +loglevel@^1.6.8: version "1.8.0" resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.8.0.tgz#e7ec73a57e1e7b419cb6c6ac06bf050b67356114" integrity sha512-G6A/nJLRgWOuuwdNuA6koovfEV1YpqqAG4pRUlFaz3jj2QNZ8M4vBqnVA+HBTmU/AMNUtlOsMmSpF6NyOjztbA== @@ -8740,28 +7937,6 @@ lower-case@^1.1.1: resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" integrity sha1-miyr0bno4K6ZOkv31YdcOcQujqw= -lower-case@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" - integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== - dependencies: - tslib "^2.0.3" - -lowercase-keys@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306" - integrity sha1-TjNms55/VFfjXxMkvfb4jQv8cwY= - -lowercase-keys@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" - integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== - -lowercase-keys@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" - integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== - lru-cache@4.1.x, lru-cache@^4.0.1: version "4.1.5" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" @@ -8794,13 +7969,6 @@ lru-cache@~2.2.1: resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.2.4.tgz#6c658619becf14031d0d0b594b16042ce4dc063d" integrity sha1-bGWGGb7PFAMdDQtZSxYELOTcBj0= -make-dir@^1.0.0, make-dir@^1.2.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" - integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ== - dependencies: - pify "^3.0.0" - make-dir@^2.0.0, make-dir@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" @@ -8828,11 +7996,6 @@ make-iterator@^1.0.0: dependencies: kind-of "^6.0.2" -mamacro@^0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/mamacro/-/mamacro-0.0.3.tgz#ad2c9576197c9f1abf308d0787865bd975a3f3e4" - integrity sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA== - map-cache@^0.2.0, map-cache@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" @@ -8871,11 +8034,6 @@ markdown-it@^11.0.0: mdurl "^1.0.1" uc.micro "^1.0.5" -marky@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/marky/-/marky-1.2.2.tgz#4456765b4de307a13d263a69b0c79bf226e68323" - integrity sha512-k1dB2HNeaNyORco8ulVEhctyEGkKHb2YWAhDsxeFlW2nROIirsctBYzKwwS3Vza+sKTS1zO4Z+n9/+9WbGLIxQ== - matchdep@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/matchdep/-/matchdep-2.0.0.tgz#c6f34834a0d8dbc3b37c27ee8bbcb27c7775582e" @@ -8886,13 +8044,6 @@ matchdep@^2.0.0: resolve "^1.4.0" stack-trace "0.0.10" -matcher@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/matcher/-/matcher-3.0.0.tgz#bd9060f4c5b70aa8041ccc6f80368760994f30ca" - integrity sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng== - dependencies: - escape-string-regexp "^4.0.0" - matchmediaquery@^0.3.0: version "0.3.1" resolved "https://registry.yarnpkg.com/matchmediaquery/-/matchmediaquery-0.3.1.tgz#8247edc47e499ebb7c58f62a9ff9ccf5b815c6d7" @@ -9056,7 +8207,7 @@ miller-rabin@^4.0.0: bn.js "^4.0.0" brorand "^1.0.1" -mime-db@1.51.0, "mime-db@>= 1.43.0 < 2", mime-db@^1.28.0: +mime-db@1.51.0, "mime-db@>= 1.43.0 < 2": version "1.51.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.51.0.tgz#d9ff62451859b18342d960850dc3cfb77e63fb0c" integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g== @@ -9078,16 +8229,6 @@ mime@^2.0.3, mime@^2.3.1, mime@^2.4.4: resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== -mimic-response@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" - integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== - -mimic-response@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" - integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== - min-indent@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" @@ -9119,6 +8260,13 @@ minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4, minimatch@~3.0.2: dependencies: brace-expansion "^1.1.7" +minimatch@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + minimist-options@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" @@ -9225,11 +8373,6 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" -mkdirp-classic@^0.5.2: - version "0.5.3" - resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" - integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== - mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.5: version "0.5.5" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" @@ -9242,27 +8385,27 @@ mkdirp@^1.0.3, mkdirp@^1.0.4: resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== -mobx-react-lite@^2.2.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/mobx-react-lite/-/mobx-react-lite-2.2.2.tgz#87c217dc72b4e47b22493daf155daf3759f868a6" - integrity sha512-2SlXALHIkyUPDsV4VTKVR9DW7K3Ksh1aaIv3NrNJygTbhXe2A9GrcKHZ2ovIiOp/BXilOcTYemfHHZubP431dg== +mobx-react-lite@^3.4.0: + version "3.4.3" + resolved "https://registry.yarnpkg.com/mobx-react-lite/-/mobx-react-lite-3.4.3.tgz#3a4c22c30bfaa8b1b2aa48d12b2ba811c0947ab7" + integrity sha512-NkJREyFTSUXR772Qaai51BnE1voWx56LOL80xG7qkZr6vo8vEaLF3sz1JNUVh+rxmUzxYaqOhfuxTfqUh0FXUg== -mobx-react@^6.3.1: - version "6.3.1" - resolved "https://registry.yarnpkg.com/mobx-react/-/mobx-react-6.3.1.tgz#204f9756e42e19d91cb6598837063b7e7de87c52" - integrity sha512-IOxdJGnRSNSJrL2uGpWO5w9JH5q5HoxEqwOF4gye1gmZYdjoYkkMzSGMDnRCUpN/BNzZcFoMdHXrjvkwO7KgaQ== +mobx-react@7.6.0: + version "7.6.0" + resolved "https://registry.yarnpkg.com/mobx-react/-/mobx-react-7.6.0.tgz#ebf0456728a9bd2e5c24fdcf9b36e285a222a7d6" + integrity sha512-+HQUNuh7AoQ9ZnU6c4rvbiVVl+wEkb9WqYsVDzGLng+Dqj1XntHu79PvEWKtSMoMj67vFp/ZPXcElosuJO8ckA== dependencies: - mobx-react-lite "^2.2.0" + mobx-react-lite "^3.4.0" -mobx-utils@^5.4.1: - version "5.6.2" - resolved "https://registry.yarnpkg.com/mobx-utils/-/mobx-utils-5.6.2.tgz#4858acbdb03f0470e260854f87e8c2ba916ebaec" - integrity sha512-a/WlXyGkp6F12b01sTarENpxbmlRgPHFyR1Xv2bsSjQBm5dcOtd16ONb40/vOqck8L99NHpI+C9MXQ+SZ8f+yw== +mobx-utils@^6.0.5: + version "6.0.6" + resolved "https://registry.yarnpkg.com/mobx-utils/-/mobx-utils-6.0.6.tgz#99a2e0d54e958e4c9de4b35729e0c3768b6afc43" + integrity sha512-lzJtxOWgj3Dp2HeXviInV3ZRY4YhThzRHXuy90oKXDH2g+ymJGIts4bdjb7NQuSi34V25cMZoQX7TkHJQuKLOQ== -mobx@^4.15.4: - version "4.15.7" - resolved "https://registry.yarnpkg.com/mobx/-/mobx-4.15.7.tgz#933281268c3b4658b6cf2526e872cf78ea48ab95" - integrity sha512-X4uQvuf2zYKHVO5kRT5Utmr+J9fDnRgxWWnSqJ4oiccPTQU38YG+/O3nPmOhUy4jeHexl7XJJpWDBgEnEfp+8w== +mobx@^6.7.0: + version "6.9.0" + resolved "https://registry.yarnpkg.com/mobx/-/mobx-6.9.0.tgz#8a894c26417c05bed2cf7499322e589ee9787397" + integrity sha512-HdKewQEREEJgsWnErClfbFoVebze6rGazxFLU/XUyrII8dORfVszN1V0BMRnQSzcgsNNtkX8DHj3nC6cdWE9YQ== moment@2.24.0: version "2.24.0" @@ -9404,14 +8547,6 @@ no-case@^2.2.0: dependencies: lower-case "^1.1.1" -no-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" - integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== - dependencies: - lower-case "^2.0.2" - tslib "^2.0.3" - node-fetch@2.6.7: version "2.6.7" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" @@ -9487,16 +8622,17 @@ node-notifier@^5.1.2: shellwords "^0.1.1" which "^1.3.0" -node-notifier@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-6.0.0.tgz#cea319e06baa16deec8ce5cd7f133c4a46b68e12" - integrity sha512-SVfQ/wMw+DesunOm5cKqr6yDcvUTDl/yc97ybGHMrteNEY6oekXpNpS3lZwgLlwz0FLgHoiW28ZpmBHUDg37cw== +node-notifier@^8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-8.0.2.tgz#f3167a38ef0d2c8a866a83e318c1ba0efeb702c5" + integrity sha512-oJP/9NAdd9+x2Q+rfphB2RJCHjod70RcRLjosiPMMu5gjIfwVnOUGq2nbTjTUbmy0DJ/tFIVT30+Qe3nzl4TJg== dependencies: growly "^1.3.0" - is-wsl "^2.1.1" - semver "^6.3.0" + is-wsl "^2.2.0" + semver "^7.3.2" shellwords "^0.1.1" - which "^1.3.1" + uuid "^8.3.0" + which "^2.0.2" node-releases@^2.0.1: version "2.0.1" @@ -9563,20 +8699,6 @@ normalize-path@^3.0.0, normalize-path@~3.0.0: resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== -normalize-url@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-2.0.1.tgz#835a9da1551fa26f70e92329069a23aa6574d7e6" - integrity sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw== - dependencies: - prepend-http "^2.0.0" - query-string "^5.0.1" - sort-keys "^2.0.0" - -normalize-url@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" - integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== - now-and-later@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/now-and-later/-/now-and-later-2.0.1.tgz#8e579c8685764a7cc02cb680380e94f43ccb1f7c" @@ -9584,14 +8706,6 @@ now-and-later@^2.0.0: dependencies: once "^1.3.2" -npm-conf@^1.1.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/npm-conf/-/npm-conf-1.1.3.tgz#256cc47bd0e218c259c4e9550bf413bc2192aff9" - integrity sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw== - dependencies: - config-chain "^1.1.11" - pify "^3.0.0" - npm-run-path@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" @@ -9854,13 +8968,6 @@ os-browserify@^0.3.0: resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= -os-filter-obj@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/os-filter-obj/-/os-filter-obj-2.0.0.tgz#1c0b62d5f3a2442749a2d139e6dddee6e81d8d16" - integrity sha512-uksVLsqG3pVdzzPvmAHpBK0wKxYItuzZr7SziusRPoz67tGV8rL1szZ6IdeUrbqLjGDwApBtN29eEE3IqGHOjg== - dependencies: - arch "^2.1.0" - os-locale@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" @@ -9873,33 +8980,11 @@ os-tmpdir@~1.0.2: resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= -p-cancelable@^0.4.0: - version "0.4.1" - resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.4.1.tgz#35f363d67d52081c8d9585e37bcceb7e0bbcb2a0" - integrity sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ== - -p-cancelable@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.1.1.tgz#aab7fbd416582fa32a3db49859c122487c5ed2cf" - integrity sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg== - -p-event@^2.1.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/p-event/-/p-event-2.3.1.tgz#596279ef169ab2c3e0cae88c1cfbb08079993ef6" - integrity sha512-NQCqOFhbpVTMX4qMe8PF8lbGtzZ+LCiN7pcNrb/413Na7+TRoe1xkKUzuWa/YEJdGQ0FvKtj35EEbDoVPO2kbA== - dependencies: - p-timeout "^2.0.1" - p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= -p-is-promise@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-1.1.0.tgz#9c9456989e9f6588017b0434d56097675c3da05e" - integrity sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4= - p-limit@^1.1.0: version "1.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" @@ -9961,13 +9046,6 @@ p-retry@^3.0.1: dependencies: retry "^0.12.0" -p-timeout@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-2.0.1.tgz#d8dd1979595d2dc0139e1fe46b8b646cb3cdf038" - integrity sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA== - dependencies: - p-finally "^1.0.0" - p-try@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" @@ -10004,14 +9082,6 @@ param-case@2.1.x: dependencies: no-case "^2.2.0" -param-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" - integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== - dependencies: - dot-case "^3.0.4" - tslib "^2.0.3" - parent-module@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" @@ -10098,14 +9168,6 @@ parseurl@~1.3.2, parseurl@~1.3.3: resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== -pascal-case@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb" - integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - pascalcase@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" @@ -10116,14 +9178,6 @@ path-browserify@0.0.1: resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== -path-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/path-case/-/path-case-3.0.4.tgz#9168645334eb942658375c56f80b4c0cb5f82c6f" - integrity sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg== - dependencies: - dot-case "^3.0.4" - tslib "^2.0.3" - path-dirname@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" @@ -10233,11 +9287,6 @@ pbkdf2@^3.0.3: safe-buffer "^5.0.1" sha.js "^2.4.8" -pend@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" - integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA= - performance-now@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" @@ -10258,16 +9307,11 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== -pify@^2.0.0, pify@^2.2.0, pify@^2.3.0: +pify@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= -pify@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" - integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= - pify@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" @@ -10292,7 +9336,7 @@ pkg-dir@^3.0.0: dependencies: find-up "^3.0.0" -pkg-dir@^4.1.0, pkg-dir@^4.2.0: +pkg-dir@^4.1.0: version "4.2.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== @@ -10480,11 +9524,6 @@ prelude-ls@~1.1.2: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= -prepend-http@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" - integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= - prettier@2.7.1: version "2.7.1" resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.7.1.tgz#e235806850d057f97bb08368a4f7d899f7760c64" @@ -10515,11 +9554,6 @@ pretty-quick@^1.10.0: mri "^1.1.0" multimatch "^3.0.0" -printj@~1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/printj/-/printj-1.1.2.tgz#d90deb2975a8b9f600fb3a1c94e3f4c53c78a222" - integrity sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ== - process-nextick-args@^2.0.0, process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" @@ -10535,7 +9569,7 @@ process@^0.11.10: resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= -progress@^2.0.0, progress@^2.0.1: +progress@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== @@ -10574,11 +9608,6 @@ prop-types@^15.5.10, prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.1, object-assign "^4.1.1" react-is "^16.13.1" -proto-list@~1.2.1: - version "1.2.4" - resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" - integrity sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk= - protocol-buffers-schema@^3.3.1: version "3.6.0" resolved "https://registry.yarnpkg.com/protocol-buffers-schema/-/protocol-buffers-schema-3.6.0.tgz#77bc75a48b2ff142c1ad5b5b90c94cd0fa2efd03" @@ -10609,11 +9638,6 @@ proxy-addr@~2.0.7: forwarded "0.2.0" ipaddr.js "1.9.1" -proxy-from-env@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" - integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== - prr@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" @@ -10688,24 +9712,6 @@ punycode@^2.1.0, punycode@^2.1.1: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== -puppeteer-core@^5.1.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/puppeteer-core/-/puppeteer-core-5.5.0.tgz#dfb6266efe5a933cbf1a368d27025a6fd4f5a884" - integrity sha512-tlA+1n+ziW/Db03hVV+bAecDKse8ihFRXYiEypBe9IlLRvOCzYFG6qrCMBYK34HO/Q/Ecjc+tvkHRAfLVH+NgQ== - dependencies: - debug "^4.1.0" - devtools-protocol "0.0.818844" - extract-zip "^2.0.0" - https-proxy-agent "^4.0.0" - node-fetch "^2.6.1" - pkg-dir "^4.2.0" - progress "^2.0.1" - proxy-from-env "^1.0.0" - rimraf "^3.0.2" - tar-fs "^2.0.0" - unbzip2-stream "^1.3.3" - ws "^7.2.3" - q@~1.5.0: version "1.5.1" resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" @@ -10734,15 +9740,6 @@ query-string@^4.3.2: object-assign "^4.1.0" strict-uri-encode "^1.0.0" -query-string@^5.0.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-5.1.1.tgz#a78c012b71c17e05f2e3fa2319dd330682efb3cb" - integrity sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw== - dependencies: - decode-uri-component "^0.2.0" - object-assign "^4.1.0" - strict-uri-encode "^1.0.0" - querystring-es3@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" @@ -10773,11 +9770,6 @@ quick-lru@^4.0.1: resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== -quick-lru@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" - integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== - quickselect@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/quickselect/-/quickselect-2.0.0.tgz#f19680a486a5eefb581303e023e98faaf25dd018" @@ -11105,7 +10097,7 @@ read-pkg@^5.2.0: parse-json "^5.0.0" type-fest "^0.6.0" -"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.0, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6: +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6: version "2.3.7" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== @@ -11118,7 +10110,7 @@ read-pkg@^5.2.0: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: +readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== @@ -11139,13 +10131,6 @@ readable-stream@~2.0.0: string_decoder "~0.10.x" util-deprecate "~1.0.1" -readdir-glob@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/readdir-glob/-/readdir-glob-1.1.1.tgz#f0e10bb7bf7bfa7e0add8baffdc54c3f7dbee6c4" - integrity sha512-91/k1EzZwDx6HbERR+zucygRFfiPl2zkIYZtv3Jjr6Mn7SkKcVct8aVO+sSRiGMc6fLf72du3d92/uY63YPdEA== - dependencies: - minimatch "^3.0.4" - readdirp@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" @@ -11421,16 +10406,11 @@ requires-port@^1.0.0: resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= -resize-observer-polyfill@1.5.1, resize-observer-polyfill@^1.5.1: +resize-observer-polyfill@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464" integrity sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg== -resolve-alpn@^1.0.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz#b7adbdac3546aaaec20b45e7d8265927072726f9" - integrity sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g== - resolve-cwd@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" @@ -11516,27 +10496,6 @@ resolve@~1.20.0: is-core-module "^2.2.0" path-parse "^1.0.6" -responselike@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" - integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec= - dependencies: - lowercase-keys "^1.0.0" - -responselike@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/responselike/-/responselike-2.0.0.tgz#26391bcc3174f750f9a79eacc40a12a5c42d7723" - integrity sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw== - dependencies: - lowercase-keys "^2.0.0" - -resq@^1.9.1: - version "1.10.2" - resolved "https://registry.yarnpkg.com/resq/-/resq-1.10.2.tgz#cedf4f20d53f6e574b1e12afbda446ad9576c193" - integrity sha512-HmgVS3j+FLrEDBTDYysPdPVF9/hioDMJ/otOiQDKqk77YfZeeLOj0qi34yObumcud1gBpk+wpBTEg4kMicD++A== - dependencies: - fast-deep-equal "^2.0.1" - resumer@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/resumer/-/resumer-0.0.0.tgz#f1e8f461e4064ba39e82af3cdc2a8c893d076759" @@ -11577,11 +10536,6 @@ rfdc@^1.1.4: resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== -rgb2hex@0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/rgb2hex/-/rgb2hex-0.2.3.tgz#8aa464c517b8a26c7a79d767dabaec2b49ee78ec" - integrity sha512-clEe0m1xv+Tva1B/TOepuIcvLAxP0U+sCDfgt1SX1HmI2Ahr5/Cd/nzJM1e78NKVtWdoo0s33YehpFA8UfIShQ== - rimraf@^2.5.4, rimraf@^2.6.0, rimraf@^2.6.3: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" @@ -11611,18 +10565,6 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: hash-base "^3.0.0" inherits "^2.0.1" -roarr@^2.15.3: - version "2.15.4" - resolved "https://registry.yarnpkg.com/roarr/-/roarr-2.15.4.tgz#f5fe795b7b838ccfe35dc608e0282b9eba2e7afd" - integrity sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A== - dependencies: - boolean "^3.0.1" - detect-node "^2.0.4" - globalthis "^1.0.1" - json-stringify-safe "^5.0.1" - semver-compare "^1.0.0" - sprintf-js "^1.1.2" - rollbar@^2.24.0: version "2.24.0" resolved "https://registry.yarnpkg.com/rollbar/-/rollbar-2.24.0.tgz#3e0986ee6600d06d3abd4d85f471bcbc11fafc99" @@ -11696,19 +10638,6 @@ sass-loader@^10: schema-utils "^3.0.0" semver "^7.3.2" -saucelabs@^4.6.3: - version "4.7.8" - resolved "https://registry.yarnpkg.com/saucelabs/-/saucelabs-4.7.8.tgz#099a7ddacee297b34420acd5ddc155eb1ad0efde" - integrity sha512-K2qaRUixc7+8JiAwpTvEsIQVzzUkYwa0mAfs0akGagRlWXUR1JrsmgJRyz28qkwpERW1KDuByn3Ju96BuW1V7Q== - dependencies: - bin-wrapper "^4.1.0" - change-case "^4.1.1" - form-data "^3.0.0" - got "^11.7.0" - hash.js "^1.1.7" - tunnel "0.0.6" - yargs "^16.0.3" - sax@1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.1.tgz#7b8e656190b228e81a66aea748480d828cd2d37a" @@ -11793,13 +10722,6 @@ scss-tokenizer@^0.2.3: js-base64 "^2.1.8" source-map "^0.4.2" -seek-bzip@^1.0.5: - version "1.0.6" - resolved "https://registry.yarnpkg.com/seek-bzip/-/seek-bzip-1.0.6.tgz#35c4171f55a680916b52a07859ecf3b5857f21c4" - integrity sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ== - dependencies: - commander "^2.8.1" - select-hose@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" @@ -11817,11 +10739,6 @@ selfsigned@^1.10.8: dependencies: node-forge "^0.10.0" -semver-compare@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" - integrity sha1-De4hahyUGrN+nvsXiPavxf9VN/w= - semver-greatest-satisfied-range@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz#13e8c2658ab9691cb0cd71093240280d36f77a5b" @@ -11829,18 +10746,6 @@ semver-greatest-satisfied-range@^1.1.0: dependencies: sver-compat "^1.5.0" -semver-regex@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/semver-regex/-/semver-regex-2.0.0.tgz#a93c2c5844539a770233379107b38c7b4ac9d338" - integrity sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw== - -semver-truncate@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/semver-truncate/-/semver-truncate-1.1.2.tgz#57f41de69707a62709a7e0104ba2117109ea47e8" - integrity sha1-V/Qd5pcHpicJp+AQS6IRcQnqR+g= - dependencies: - semver "^5.3.0" - "semver@2 || 3 || 4 || 5", semver@^5.0.1, semver@^5.3.0, semver@^5.5.0, semver@^5.6.0: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" @@ -11889,29 +10794,6 @@ send@0.17.2: range-parser "~1.2.1" statuses "~1.5.0" -sentence-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/sentence-case/-/sentence-case-3.0.4.tgz#3645a7b8c117c787fde8702056225bb62a45131f" - integrity sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg== - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - upper-case-first "^2.0.2" - -serialize-error@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-7.0.1.tgz#f1360b0447f61ffb483ec4157c737fab7d778e18" - integrity sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw== - dependencies: - type-fest "^0.13.1" - -serialize-error@^8.0.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-8.1.0.tgz#3a069970c712f78634942ddd50fbbc0eaebe2f67" - integrity sha512-3NnuWfM6vBYoy5gZFvHiYsVbafvI9vZv/+jlIigFn4oP4zjNPK3LhcY0xSCgeb1a5L8jO71Mit9LlNoi2UfDDQ== - dependencies: - type-fest "^0.20.2" - serialize-javascript@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" @@ -12065,14 +10947,6 @@ slice-ansi@^4.0.0: astral-regex "^2.0.0" is-fullwidth-code-point "^3.0.0" -snake-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-3.0.4.tgz#4f2bbd568e9935abdfd593f34c691dadb49c452c" - integrity sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg== - dependencies: - dot-case "^3.0.4" - tslib "^2.0.3" - snapdragon-node@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" @@ -12170,27 +11044,6 @@ sockjs@^0.3.21: uuid "^8.3.2" websocket-driver "^0.7.4" -sort-keys-length@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/sort-keys-length/-/sort-keys-length-1.0.1.tgz#9cb6f4f4e9e48155a6aa0671edd336ff1479a188" - integrity sha1-nLb09OnkgVWmqgZx7dM2/xR5oYg= - dependencies: - sort-keys "^1.0.0" - -sort-keys@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" - integrity sha1-RBttTTRnmPG05J6JIK37oOVD+a0= - dependencies: - is-plain-obj "^1.0.0" - -sort-keys@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-2.0.0.tgz#658535584861ec97d730d6cf41822e1f56684128" - integrity sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg= - dependencies: - is-plain-obj "^1.0.0" - source-list-map@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" @@ -12237,6 +11090,11 @@ source-map@^0.5.0, source-map@^0.5.6, source-map@^0.5.7: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= +source-map@^0.7.3: + version "0.7.4" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" + integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== + source-map@~0.1.38: version "0.1.43" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346" @@ -12312,11 +11170,6 @@ split@0.3: dependencies: through "2" -sprintf-js@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673" - integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug== - sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" @@ -12589,13 +11442,6 @@ strip-bom@^3.0.0: resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= -strip-dirs@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/strip-dirs/-/strip-dirs-2.1.0.tgz#4987736264fc344cf20f6c34aca9d13d1d4ed6c5" - integrity sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g== - dependencies: - is-natural-number "^4.0.1" - strip-eof@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" @@ -12613,13 +11459,6 @@ strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -strip-outer@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/strip-outer/-/strip-outer-1.0.1.tgz#b2fd2abf6604b9d1e6013057195df836b8a9d631" - integrity sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg== - dependencies: - escape-string-regexp "^1.0.2" - strnum@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/strnum/-/strnum-1.0.5.tgz#5c4e829fe15ad4ff0d20c3db5ac97b73c9b072db" @@ -12640,14 +11479,14 @@ style-loader@^0.8.3: dependencies: loader-utils "^0.2.5" -styled-components@^5.1.0: - version "5.3.3" - resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-5.3.3.tgz#312a3d9a549f4708f0fb0edc829eb34bde032743" - integrity sha512-++4iHwBM7ZN+x6DtPPWkCI4vdtwumQ+inA/DdAsqYd4SVgUKJie5vXyzotA00ttcFdQkCng7zc6grwlfIfw+lw== +styled-components@^5.3.9: + version "5.3.9" + resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-5.3.9.tgz#641af2a8bb89904de708c71b439caa9633e8f0ba" + integrity sha512-Aj3kb13B75DQBo2oRwRa/APdB5rSmwUfN5exyarpX+x/tlM/rwZA2vVk2vQgVSP6WKaZJHWwiFrzgHt+CLtB4A== dependencies: "@babel/helper-module-imports" "^7.0.0" "@babel/traverse" "^7.4.5" - "@emotion/is-prop-valid" "^0.8.8" + "@emotion/is-prop-valid" "^1.1.0" "@emotion/stylis" "^0.8.4" "@emotion/unitless" "^0.7.4" babel-plugin-styled-components ">= 1.12.0" @@ -12787,40 +11626,6 @@ tape@^4.9.0: string.prototype.trim "~1.2.4" through "~2.3.8" -tar-fs@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784" - integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng== - dependencies: - chownr "^1.1.1" - mkdirp-classic "^0.5.2" - pump "^3.0.0" - tar-stream "^2.1.4" - -tar-stream@^1.5.2: - version "1.6.2" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.2.tgz#8ea55dab37972253d9a9af90fdcd559ae435c555" - integrity sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A== - dependencies: - bl "^1.0.0" - buffer-alloc "^1.2.0" - end-of-stream "^1.0.0" - fs-constants "^1.0.0" - readable-stream "^2.3.0" - to-buffer "^1.1.1" - xtend "^4.0.0" - -tar-stream@^2.1.4, tar-stream@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" - integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== - dependencies: - bl "^4.0.3" - end-of-stream "^1.4.1" - fs-constants "^1.0.0" - inherits "^2.0.3" - readable-stream "^3.1.1" - tar@^6.0.2: version "6.1.11" resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.11.tgz#6760a38f003afa1b2ffd0ffe9e9abbd0eab3d621" @@ -12876,7 +11681,7 @@ terriajs-server@^4.0.0: request-promise "^4.0.1" yargs "^13.2.4" -terser-webpack-plugin@^1.4.1: +terser-webpack-plugin@^1.4.3: version "1.4.5" resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz#a217aefaea330e734ffacb6120ec1fa312d6040b" integrity sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw== @@ -12934,7 +11739,7 @@ through2@^2.0.0, through2@^2.0.3, through2@~2.0.0: readable-stream "~2.3.6" xtend "~4.0.1" -through@2, "through@>=2.2.7 <3", through@^2.3.4, through@^2.3.8, through@~2.3, through@~2.3.1, through@~2.3.4, through@~2.3.8: +through@2, "through@>=2.2.7 <3", through@^2.3.4, through@~2.3, through@~2.3.1, through@~2.3.4, through@~2.3.8: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= @@ -12949,11 +11754,6 @@ time-stamp@^1.0.0: resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.1.0.tgz#764a5a11af50561921b133f3b44e618687e0f5c3" integrity sha1-dkpaEa9QVhkhsTPztE5hhofg9cM= -timed-out@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" - integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= - timers-browserify@^2.0.4: version "2.0.12" resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.12.tgz#44a45c11fbf407f34f97bccd1577c652361b00ee" @@ -12971,10 +11771,10 @@ tinycolor2@^1.4.1: resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.4.2.tgz#3f6a4d1071ad07676d7fa472e1fac40a719d8803" integrity sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA== -"tinymce@^6.0.0 || ^5.5.1": - version "6.0.3" - resolved "https://registry.yarnpkg.com/tinymce/-/tinymce-6.0.3.tgz#993db09afa473a764ad8b594cdaf744b2c7e2e74" - integrity sha512-4cu80kWF7nRGhviE10poZtjTkl3jNL+lycilCMfdm3KU5V7FtiQQrKbEo6GInXT05RY78Ha/NFP0gOBELcSpfg== +tinymce@^6.3.1: + version "6.4.1" + resolved "https://registry.yarnpkg.com/tinymce/-/tinymce-6.4.1.tgz#9c28f798074668d53371805fb6f1c68e582a4549" + integrity sha512-+/cS2AM9l6p72IBs2uolHbGsBUztLs0WslqNgFaTXtmMksTNUOhh8p08xtA/fa03UGlWEC6/EJoeV95/QDXa2A== tinyqueue@^2.0.3: version "2.0.3" @@ -13006,11 +11806,6 @@ to-arraybuffer@^1.0.0: resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= -to-buffer@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80" - integrity sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg== - to-fast-properties@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" @@ -13128,13 +11923,6 @@ trim-newlines@^3.0.0: resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144" integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw== -trim-repeated@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/trim-repeated/-/trim-repeated-1.0.0.tgz#e3646a2ea4e891312bf7eace6cfb05380bc01c21" - integrity sha1-42RqLqTokTEr9+rObPsFOAvAHCE= - dependencies: - escape-string-regexp "^1.0.2" - trim-right@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" @@ -13187,7 +11975,7 @@ tslib@^1.10.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.0.3, tslib@^2.3.1: +tslib@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== @@ -13204,11 +11992,6 @@ tunnel-agent@^0.6.0: dependencies: safe-buffer "^5.0.1" -tunnel@0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/tunnel/-/tunnel-0.0.6.tgz#72f1314b34a5b192db012324df2cc587ca47f92c" - integrity sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg== - tweetnacl@^0.14.3, tweetnacl@~0.14.0: version "0.14.5" resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" @@ -13228,11 +12011,6 @@ type-check@~0.3.2: dependencies: prelude-ls "~1.1.2" -type-fest@^0.13.1: - version "0.13.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.13.1.tgz#0172cb5bce80b0bd542ea348db50c7e21834d934" - integrity sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg== - type-fest@^0.18.0: version "0.18.1" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.18.1.tgz#db4bc151a4a2cf4eebf9add5db75508db6cc841f" @@ -13276,15 +12054,10 @@ typedarray@^0.0.6, typedarray@~0.0.5: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= -typescript@^3.9.2: - version "3.9.10" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.10.tgz#70f3910ac7a51ed6bef79da7800690b19bf778b8" - integrity sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q== - -ua-parser-js@^0.7.21: - version "0.7.31" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.31.tgz#649a656b191dffab4f21d5e053e27ca17cbff5c6" - integrity sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ== +typescript@^4.9.5: + version "4.9.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" + integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== uc.micro@^1.0.1, uc.micro@^1.0.5: version "1.0.6" @@ -13314,14 +12087,6 @@ unbox-primitive@^1.0.1: has-symbols "^1.0.2" which-boxed-primitive "^1.0.2" -unbzip2-stream@^1.0.9, unbzip2-stream@^1.3.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz#b0da04c4371311df771cdc215e87f2130991ace7" - integrity sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg== - dependencies: - buffer "^5.2.1" - through "^2.3.8" - unc-path-regex@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" @@ -13441,25 +12206,11 @@ upath@^1.1.1: resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== -upper-case-first@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/upper-case-first/-/upper-case-first-2.0.2.tgz#992c3273f882abd19d1e02894cc147117f844324" - integrity sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg== - dependencies: - tslib "^2.0.3" - upper-case@^1.1.1: version "1.1.3" resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598" integrity sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg= -upper-case@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-2.0.2.tgz#d89810823faab1df1549b7d97a76f8662bae6f7a" - integrity sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg== - dependencies: - tslib "^2.0.3" - uri-js@^4.2.2: version "4.4.1" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" @@ -13486,13 +12237,6 @@ url-loader@^1.1.2: mime "^2.0.3" schema-utils "^1.0.0" -url-parse-lax@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" - integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww= - dependencies: - prepend-http "^2.0.0" - url-parse@^1.4.3, url-parse@^1.5.3: version "1.5.4" resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.4.tgz#e4f645a7e2a0852cc8a66b14b292a3e9a11a97fd" @@ -13508,11 +12252,6 @@ url-slug@2.0.0: dependencies: unidecode "0.1.8" -url-to-options@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/url-to-options/-/url-to-options-1.0.1.tgz#1505a03a289a48cbd7a434efbaeec5055f5633a9" - integrity sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k= - url@0.10.3: version "0.10.3" resolved "https://registry.yarnpkg.com/url/-/url-0.10.3.tgz#021e4d9c7705f21bbf37d03ceb58767402774c64" @@ -13605,7 +12344,7 @@ uuid@^3.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== -uuid@^8.0.0, uuid@^8.3.2: +uuid@^8.3.0, uuid@^8.3.2: version "8.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== @@ -13733,7 +12472,7 @@ watchpack-chokidar2@^2.0.1: dependencies: chokidar "^2.1.8" -watchpack@^1.6.0: +watchpack@^1.7.4: version "1.7.5" resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.7.5.tgz#1267e6c55e0b9b5be44c2023aed5437a2c26c453" integrity sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ== @@ -13751,47 +12490,6 @@ wbuf@^1.1.0, wbuf@^1.7.3: dependencies: minimalistic-assert "^1.0.0" -webdriver@6.12.1: - version "6.12.1" - resolved "https://registry.yarnpkg.com/webdriver/-/webdriver-6.12.1.tgz#30eee65340ea5124aa564f99a4dbc7d2f965b308" - integrity sha512-3rZgAj9o2XHp16FDTzvUYaHelPMSPbO1TpLIMUT06DfdZjNYIzZiItpIb/NbQDTPmNhzd9cuGmdI56WFBGY2BA== - dependencies: - "@wdio/config" "6.12.1" - "@wdio/logger" "6.10.10" - "@wdio/protocols" "6.12.0" - "@wdio/utils" "6.11.0" - got "^11.0.2" - lodash.merge "^4.6.1" - -webdriverio@^6.7.0: - version "6.12.1" - resolved "https://registry.yarnpkg.com/webdriverio/-/webdriverio-6.12.1.tgz#5b6f1167373bd7a154419d8a930ef1ffda9d0537" - integrity sha512-Nx7ge0vTWHVIRUbZCT+IuMwB5Q0Q5nLlYdgnmmJviUKLuc3XtaEBkYPTbhHWHgSBXsPZMIc023vZKNkn+6iyeQ== - dependencies: - "@types/puppeteer-core" "^5.4.0" - "@wdio/config" "6.12.1" - "@wdio/logger" "6.10.10" - "@wdio/repl" "6.11.0" - "@wdio/utils" "6.11.0" - archiver "^5.0.0" - atob "^2.1.2" - css-shorthand-properties "^1.1.1" - css-value "^0.0.1" - devtools "6.12.1" - fs-extra "^9.0.1" - get-port "^5.1.1" - grapheme-splitter "^1.0.2" - lodash.clonedeep "^4.5.0" - lodash.isobject "^3.0.2" - lodash.isplainobject "^4.0.6" - lodash.zip "^4.2.0" - minimatch "^3.0.4" - puppeteer-core "^5.1.0" - resq "^1.9.1" - rgb2hex "0.2.3" - serialize-error "^8.0.0" - webdriver "6.12.1" - webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" @@ -13900,33 +12598,33 @@ webpack-sources@^1.1.0, webpack-sources@^1.4.0, webpack-sources@^1.4.1, webpack- source-list-map "^2.0.0" source-map "~0.6.1" -webpack@~4.39.0: - version "4.39.3" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.39.3.tgz#a02179d1032156b713b6ec2da7e0df9d037def50" - integrity sha512-BXSI9M211JyCVc3JxHWDpze85CvjC842EvpRsVTc/d15YJGlox7GIDd38kJgWrb3ZluyvIjgenbLDMBQPDcxYQ== +webpack@~4.46.0: + version "4.46.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.46.0.tgz#bf9b4404ea20a073605e0a011d188d77cb6ad542" + integrity sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q== dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/helper-module-context" "1.8.5" - "@webassemblyjs/wasm-edit" "1.8.5" - "@webassemblyjs/wasm-parser" "1.8.5" - acorn "^6.2.1" + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-module-context" "1.9.0" + "@webassemblyjs/wasm-edit" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" + acorn "^6.4.1" ajv "^6.10.2" ajv-keywords "^3.4.1" chrome-trace-event "^1.0.2" - enhanced-resolve "^4.1.0" + enhanced-resolve "^4.5.0" eslint-scope "^4.0.3" json-parse-better-errors "^1.0.2" loader-runner "^2.4.0" loader-utils "^1.2.3" memory-fs "^0.4.1" micromatch "^3.1.10" - mkdirp "^0.5.1" + mkdirp "^0.5.3" neo-async "^2.6.1" node-libs-browser "^2.2.1" schema-utils "^1.0.0" tapable "^1.1.3" - terser-webpack-plugin "^1.4.1" - watchpack "^1.6.0" + terser-webpack-plugin "^1.4.3" + watchpack "^1.7.4" webpack-sources "^1.4.1" websocket-driver@>=0.5.1, websocket-driver@^0.7.4: @@ -14103,15 +12801,6 @@ wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" @@ -14124,11 +12813,6 @@ ws@^6.2.1: dependencies: async-limiter "~1.0.0" -ws@^7.2.3: - version "7.5.6" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.6.tgz#e59fc509fb15ddfb65487ee9765c5a51dec5fe7b" - integrity sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA== - ws@^8.0.0: version "8.4.0" resolved "https://registry.yarnpkg.com/ws/-/ws-8.4.0.tgz#f05e982a0a88c604080e8581576e2a063802bed6" @@ -14196,11 +12880,6 @@ y18n@^4.0.0: resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - yallist@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" @@ -14237,7 +12916,7 @@ yargs-parser@^18.1.2: camelcase "^5.0.0" decamelize "^1.2.0" -yargs-parser@^20.2.2, yargs-parser@^20.2.3: +yargs-parser@^20.2.3: version "20.2.9" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== @@ -14283,19 +12962,6 @@ yargs@^15.3.1: y18n "^4.0.0" yargs-parser "^18.1.2" -yargs@^16.0.3: - version "16.2.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" - integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== - dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.0" - y18n "^5.0.5" - yargs-parser "^20.2.2" - yargs@^7.1.0: version "7.1.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.2.tgz#63a0a5d42143879fdbb30370741374e0641d55db" @@ -14315,14 +12981,6 @@ yargs@^7.1.0: y18n "^3.2.1" yargs-parser "^5.0.1" -yauzl@^2.10.0, yauzl@^2.4.2: - version "2.10.0" - resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" - integrity sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk= - dependencies: - buffer-crc32 "~0.2.3" - fd-slicer "~1.1.0" - yeast@0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419" @@ -14337,12 +12995,3 @@ yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== - -zip-stream@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-4.1.0.tgz#51dd326571544e36aa3f756430b313576dc8fc79" - integrity sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A== - dependencies: - archiver-utils "^2.1.0" - compress-commons "^4.1.0" - readable-stream "^3.6.0" From 2d30fd3a6be027e5cb4cb3f61613cf67b8c58e3a Mon Sep 17 00:00:00 2001 From: Nanda Date: Wed, 19 Apr 2023 15:14:16 +1000 Subject: [PATCH 134/654] Prettier fix. --- .babelrc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.babelrc b/.babelrc index fd5274b5c29..36ddeb06e18 100644 --- a/.babelrc +++ b/.babelrc @@ -20,7 +20,7 @@ "@babel/plugin-syntax-dynamic-import", "babel-plugin-lodash" ], - assumptions: { - setPublicClassFields: false + "assumptions": { + "setPublicClassFields": false } } From 5718f2138ad3237080dbaa0aed713bf748f49980 Mon Sep 17 00:00:00 2001 From: Nanda Date: Wed, 19 Apr 2023 16:15:14 +1000 Subject: [PATCH 135/654] Move back @types/styled-components under dependencies. --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b710cfb5371..260b78fd52a 100644 --- a/package.json +++ b/package.json @@ -44,6 +44,7 @@ "@types/dompurify": "^2.3.1", "@types/file-saver": "^1.3.0", "@types/flexsearch": "^0.7.1", + "@types/styled-components": "^5.1.26", "@types/jasmine": "^2.8.8", "@types/jasmine-ajax": "^3.3.0", "@types/json5": "^0.0.30", @@ -184,7 +185,6 @@ "@types/fs-extra": "^7.0.0", "@types/node": "^18.15.11", "@types/node-fetch": "^2.6.2", - "@types/styled-components": "^5.1.26", "babel-plugin-styled-components": "^1.10.7", "bottleneck": "^2.19.5", "eslint": "^7.20.0", From 932422e99a5e33d77c275872f9ef22ead378df98 Mon Sep 17 00:00:00 2001 From: Nanda Date: Wed, 19 Apr 2023 16:19:15 +1000 Subject: [PATCH 136/654] Try building CI with `main` branch. --- buildprocess/ci-deploy.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildprocess/ci-deploy.sh b/buildprocess/ci-deploy.sh index 55fc8d6e9a7..d878ab4b7a3 100644 --- a/buildprocess/ci-deploy.sh +++ b/buildprocess/ci-deploy.sh @@ -21,7 +21,7 @@ npm install -g yarn@^1.19.0 # Clone and build TerriaMap, using this version of TerriaJS TERRIAJS_COMMIT_HASH=$(git rev-parse HEAD) -git clone -b ts4-deps https://github.com/TerriaJS/TerriaMap.git +git clone -b main https://github.com/TerriaJS/TerriaMap.git cd TerriaMap TERRIAMAP_COMMIT_HASH=$(git rev-parse HEAD) sed -i -e 's@"terriajs": ".*"@"terriajs": "'$GITHUB_REPOSITORY'#'${GITHUB_BRANCH}'"@g' package.json From 414173738cf965b810608be2671ee42ef531178b Mon Sep 17 00:00:00 2001 From: Nanda Date: Wed, 19 Apr 2023 18:41:52 +1000 Subject: [PATCH 137/654] Add comment on why we need 'useDefineForClassFields'. --- tsconfig-node.json | 2 +- tsconfig.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tsconfig-node.json b/tsconfig-node.json index 97cf62f2c4f..81d91c9ee3e 100644 --- a/tsconfig-node.json +++ b/tsconfig-node.json @@ -12,7 +12,7 @@ "jsx": "react", "esModuleInterop": true, "allowSyntheticDefaultImports": true, - "useDefineForClassFields": true, + "useDefineForClassFields": true, // required for mobx6 - https://mobx.js.org/installation.html#use-spec-compliant-transpilation-for-class-properties "outDir": "dist", "resolveJsonModule": true, "typeRoots": [ diff --git a/tsconfig.json b/tsconfig.json index 9f9aa63a7f6..cdf2ea1f355 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -10,7 +10,7 @@ "jsx": "preserve", "esModuleInterop": true, "allowSyntheticDefaultImports": true, - "useDefineForClassFields": true, + "useDefineForClassFields": true, // required for mobx6 - https://mobx.js.org/installation.html#use-spec-compliant-transpilation-for-class-properties "outDir": "ts-out", "resolveJsonModule": true, "typeRoots": ["./lib/ThirdParty/**/*.d.ts"], From 947f62804008aff0b957ee09e78cfe143189c2b0 Mon Sep 17 00:00:00 2001 From: Nanda Date: Wed, 19 Apr 2023 18:42:23 +1000 Subject: [PATCH 138/654] Move more deps under `dependencies`. --- package.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 260b78fd52a..9795a061dee 100644 --- a/package.json +++ b/package.json @@ -65,6 +65,8 @@ "@types/retry": "^0.12.0", "@types/shpjs": "^3.4.0", "@types/urijs": "1.19.1", + "@types/node-fetch": "^2.6.2", + "@types/fs-extra": "^7.0.0", "@visx/axis": "^2.1.0", "@visx/clip-path": "^2.1.0", "@visx/event": "^2.1.0", @@ -175,25 +177,24 @@ "webpack": "~4.46.0", "webpack-cli": "^3.3.11", "webpack-dev-server": "^3.1.14", - "worker-loader": "^2.0.0" + "worker-loader": "^2.0.0", + "fetch-mock": "^9.11.0", + "fs-extra": "^7.0.1", + "node-fetch": "^2.6.1" }, "devDependencies": { "@types/webpack": "4.41.33", "@babel/eslint-parser": "^7.12.16", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@types/dateformat": "^3.0.1", - "@types/fs-extra": "^7.0.0", "@types/node": "^18.15.11", - "@types/node-fetch": "^2.6.2", "babel-plugin-styled-components": "^1.10.7", "bottleneck": "^2.19.5", "eslint": "^7.20.0", "eslint-plugin-jsx-control-statements": "^2.2.1", "eslint-plugin-react": "^7.19.0", - "fetch-mock": "^9.11.0", "fork-ts-checker-notifier-webpack-plugin": "^6.0.0", "fork-ts-checker-webpack-plugin": "^6.0.0", - "fs-extra": "^7.0.1", "glob-all": "^3.0.1", "husky": "^8.0.3", "istanbul-instrumenter-loader": "^3.0.1", @@ -214,7 +215,6 @@ "karma-spec-reporter": "^0.0.32", "klaw-sync": "^4.0.0", "minimist": "^1.2.8", - "node-fetch": "^2.6.1", "node-notifier": "^5.1.2", "node-sass": "^6.0.1", "plugin-error": "^1.0.1", From 4757b9e04397ab3177fa5bd00f7a767fc4daae4e Mon Sep 17 00:00:00 2001 From: Nanda Date: Wed, 19 Apr 2023 18:47:52 +1000 Subject: [PATCH 139/654] Move some more deps under `dependencies'. --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 9795a061dee..3949ec686dd 100644 --- a/package.json +++ b/package.json @@ -180,7 +180,8 @@ "worker-loader": "^2.0.0", "fetch-mock": "^9.11.0", "fs-extra": "^7.0.1", - "node-fetch": "^2.6.1" + "node-fetch": "^2.6.1", + "bottleneck": "^2.19.5" }, "devDependencies": { "@types/webpack": "4.41.33", @@ -189,7 +190,6 @@ "@types/dateformat": "^3.0.1", "@types/node": "^18.15.11", "babel-plugin-styled-components": "^1.10.7", - "bottleneck": "^2.19.5", "eslint": "^7.20.0", "eslint-plugin-jsx-control-statements": "^2.2.1", "eslint-plugin-react": "^7.19.0", From 1d209bd8f2cb0d9d10ca7964d7b8dbae21aebb3d Mon Sep 17 00:00:00 2001 From: Mats Henrikson Date: Thu, 20 Apr 2023 10:40:58 +1000 Subject: [PATCH 140/654] Add 3dtiles styling examples to show specific floors or areas. --- wwwroot/test/init/cesium3dtiles.json | 156 ++++++++++++++++++++++++++- 1 file changed, 154 insertions(+), 2 deletions(-) diff --git a/wwwroot/test/init/cesium3dtiles.json b/wwwroot/test/init/cesium3dtiles.json index 7efd7679700..e65b2e96ae6 100644 --- a/wwwroot/test/init/cesium3dtiles.json +++ b/wwwroot/test/init/cesium3dtiles.json @@ -14,9 +14,161 @@ "options": { "maximumScreenSpaceError": 1, "maximumNumberOfLoadedTiles": 1000 - } + }, + "modelDimensions": [ + { + "name": "Select Floor", + "selectedId": "Show all", + "options": [ + { + "id": "Show all", + "value": { + "style": { + "show": "true" + } + } + }, + { + "id": "Floor O", + "value": { + "style": { + "show": "${Level} === 'O'" + } + } + }, + { + "id": "Floor N", + "value": { + "style": { + "show": "${Level} === 'N'" + } + } + }, + { + "id": "Floor M", + "value": { + "style": { + "show": "${Level} === 'M'" + } + } + }, + { + "id": "Floor L", + "value": { + "style": { + "show": "${Level} === 'L'" + } + } + }, + { + "id": "Floor K", + "value": { + "style": { + "show": "${Level} === 'K'" + } + } + }, + { + "id": "Floor J", + "value": { + "style": { + "show": "${Level} === 'J'" + } + } + }, + { + "id": "Floor I", + "value": { + "style": { + "show": "${Level} === 'I'" + } + } + }, + { + "id": "Floor H", + "value": { + "style": { + "show": "${Level} === 'H'" + } + } + }, + { + "id": "Floor G", + "value": { + "style": { + "show": "${Level} === 'G'" + } + } + }, + { + "id": "Floor F", + "value": { + "style": { + "show": "${Level} === 'F'" + } + } + }, + { + "id": "Floor E", + "value": { + "style": { + "show": "${Level} === 'E'" + } + } + }, + { + "id": "Floor D", + "value": { + "style": { + "show": "${Level} === 'D'" + } + } + }, + { + "id": "Floor C", + "value": { + "style": { + "show": "${Level} === 'C'" + } + } + }, + { + "id": "Floor B", + "value": { + "style": { + "show": "${Level} === 'B'" + } + } + }, + { + "id": "Floor A", + "value": { + "style": { + "show": "${Level} === 'A'" + } + } + }, + { + "id": "Only Underground (A and B)", + "value": { + "style": { + "show": "${Level} === 'A' || ${Level} === 'B'" + } + } + }, + { + "id": "Common property, Lifts, and Stairs", + "value": { + "style": { + "show": "${Room} === 'Common property' || ${Room} === 'Lifts' || ${Room} === 'Stairs' " + } + } + } + ] + } + ] } ] } ] -} +} \ No newline at end of file From e29d62788c11ec2939182e2cc24797fa3d11d2fd Mon Sep 17 00:00:00 2001 From: Mats Henrikson Date: Thu, 20 Apr 2023 11:19:44 +1000 Subject: [PATCH 141/654] Prettier wants a newline. --- wwwroot/test/init/cesium3dtiles.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wwwroot/test/init/cesium3dtiles.json b/wwwroot/test/init/cesium3dtiles.json index e65b2e96ae6..034fb503bb7 100644 --- a/wwwroot/test/init/cesium3dtiles.json +++ b/wwwroot/test/init/cesium3dtiles.json @@ -171,4 +171,4 @@ ] } ] -} \ No newline at end of file +} From c4aa816fea352662371ba133e0a9b22a3c5eca7f Mon Sep 17 00:00:00 2001 From: Peter Hassall Date: Thu, 20 Apr 2023 11:22:43 +1000 Subject: [PATCH 142/654] Update ingress spec --- buildprocess/ci-cleanup.js | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/buildprocess/ci-cleanup.js b/buildprocess/ci-cleanup.js index 46ae6b88c78..9de16b4a66b 100644 --- a/buildprocess/ci-cleanup.js +++ b/buildprocess/ci-cleanup.js @@ -56,12 +56,11 @@ function makeSafeName(name) { function createIngress(branches) { return { - apiVersion: "networking.k8s.io/v1beta1", + apiVersion: "networking.k8s.io/v1", kind: "Ingress", metadata: { - name: "terriajs-ci", + name: "terriajs-ci-ing", annotations: { - "kubernetes.io/ingress.class": "nginx", "ingress.kubernetes.io/ssl-redirect": "false", "ingress.kubernetes.io/force-ssl-redirect": "false", "ingress.kubernetes.io/rewrite-target": "/" @@ -73,10 +72,12 @@ function createIngress(branches) { http: { paths: branches.map((branch) => ({ path: "/" + branch.name + "/", + pathType: "ImplementationSpecific", backend: { - serviceName: - "terriajs-" + makeSafeName(branch.name) + "-terriamap", - servicePort: "http" + service: { + name: "terriajs-" + makeSafeName(branch.name) + "-terriamap", + port: "http" + } } })) } From da85e2d79f076888dcff72ffcd2926ef95f108a6 Mon Sep 17 00:00:00 2001 From: Peter Hassall Date: Thu, 20 Apr 2023 11:46:07 +1000 Subject: [PATCH 143/654] Update ingress spec --- buildprocess/ci-cleanup.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/buildprocess/ci-cleanup.js b/buildprocess/ci-cleanup.js index 9de16b4a66b..0aa21a073f0 100644 --- a/buildprocess/ci-cleanup.js +++ b/buildprocess/ci-cleanup.js @@ -76,7 +76,9 @@ function createIngress(branches) { backend: { service: { name: "terriajs-" + makeSafeName(branch.name) + "-terriamap", - port: "http" + port: { + name: "http" + } } } })) From 12204901c89f08c953feddef360732ca185fdb7e Mon Sep 17 00:00:00 2001 From: Peter Hassall Date: Thu, 20 Apr 2023 11:58:44 +1000 Subject: [PATCH 144/654] Update ingress spec --- buildprocess/ci-cleanup.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/buildprocess/ci-cleanup.js b/buildprocess/ci-cleanup.js index 0aa21a073f0..b635ad5e4a4 100644 --- a/buildprocess/ci-cleanup.js +++ b/buildprocess/ci-cleanup.js @@ -59,7 +59,7 @@ function createIngress(branches) { apiVersion: "networking.k8s.io/v1", kind: "Ingress", metadata: { - name: "terriajs-ci-ing", + name: "ci-terria-io", annotations: { "ingress.kubernetes.io/ssl-redirect": "false", "ingress.kubernetes.io/force-ssl-redirect": "false", @@ -69,6 +69,7 @@ function createIngress(branches) { spec: { rules: [ { + host: "ci.terria.io", http: { paths: branches.map((branch) => ({ path: "/" + branch.name + "/", From ef731ce4df236cfb64dab0b5732abcc255cc01ef Mon Sep 17 00:00:00 2001 From: Peter Hassall Date: Thu, 20 Apr 2023 12:41:12 +1000 Subject: [PATCH 145/654] Update ingress spec --- buildprocess/ci-cleanup.js | 1 + 1 file changed, 1 insertion(+) diff --git a/buildprocess/ci-cleanup.js b/buildprocess/ci-cleanup.js index b635ad5e4a4..64bc702dd7c 100644 --- a/buildprocess/ci-cleanup.js +++ b/buildprocess/ci-cleanup.js @@ -67,6 +67,7 @@ function createIngress(branches) { } }, spec: { + ingressClassName: "nginx-two", rules: [ { host: "ci.terria.io", From 857257e4ba3ba92b4545745ddb2ebab7e0345674 Mon Sep 17 00:00:00 2001 From: Peter Hassall Date: Thu, 20 Apr 2023 13:02:02 +1000 Subject: [PATCH 146/654] Update ingress spec --- buildprocess/ci-cleanup.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/buildprocess/ci-cleanup.js b/buildprocess/ci-cleanup.js index 64bc702dd7c..750c37f9851 100644 --- a/buildprocess/ci-cleanup.js +++ b/buildprocess/ci-cleanup.js @@ -63,7 +63,7 @@ function createIngress(branches) { annotations: { "ingress.kubernetes.io/ssl-redirect": "false", "ingress.kubernetes.io/force-ssl-redirect": "false", - "ingress.kubernetes.io/rewrite-target": "/" + "ingress.kubernetes.io/rewrite-target": "/$2" } }, spec: { @@ -73,7 +73,7 @@ function createIngress(branches) { host: "ci.terria.io", http: { paths: branches.map((branch) => ({ - path: "/" + branch.name + "/", + path: "/" + branch.name + "(/|$)(.*)", pathType: "ImplementationSpecific", backend: { service: { From 3e2034de33f602cfd85ebcb1fb559e516e0e1d82 Mon Sep 17 00:00:00 2001 From: Peter Hassall Date: Thu, 20 Apr 2023 13:28:57 +1000 Subject: [PATCH 147/654] Update ingress spec --- buildprocess/ci-cleanup.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/buildprocess/ci-cleanup.js b/buildprocess/ci-cleanup.js index 750c37f9851..97b4df5f41d 100644 --- a/buildprocess/ci-cleanup.js +++ b/buildprocess/ci-cleanup.js @@ -63,7 +63,8 @@ function createIngress(branches) { annotations: { "ingress.kubernetes.io/ssl-redirect": "false", "ingress.kubernetes.io/force-ssl-redirect": "false", - "ingress.kubernetes.io/rewrite-target": "/$2" + "nginx.ingress.kubernetes.io/use-regex": "true", + "nginx.ingress.kubernetes.io/rewrite-target": "/$2" } }, spec: { From 7d8c57b2949b3e5c08cee04fee45cacfeb8bd827 Mon Sep 17 00:00:00 2001 From: Peter Hassall Date: Thu, 20 Apr 2023 13:29:42 +1000 Subject: [PATCH 148/654] Update ingress spec --- buildprocess/ci-cleanup.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildprocess/ci-cleanup.js b/buildprocess/ci-cleanup.js index 97b4df5f41d..176e60aa5d1 100644 --- a/buildprocess/ci-cleanup.js +++ b/buildprocess/ci-cleanup.js @@ -71,7 +71,7 @@ function createIngress(branches) { ingressClassName: "nginx-two", rules: [ { - host: "ci.terria.io", + host: "ci-two.terria.io", http: { paths: branches.map((branch) => ({ path: "/" + branch.name + "(/|$)(.*)", From 32b587e86434799bb38fc330df6619a59eb49791 Mon Sep 17 00:00:00 2001 From: Peter Hassall Date: Thu, 20 Apr 2023 14:34:16 +1000 Subject: [PATCH 149/654] Update ingress spec --- buildprocess/ci-cleanup.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/buildprocess/ci-cleanup.js b/buildprocess/ci-cleanup.js index 176e60aa5d1..be06458c747 100644 --- a/buildprocess/ci-cleanup.js +++ b/buildprocess/ci-cleanup.js @@ -68,10 +68,9 @@ function createIngress(branches) { } }, spec: { - ingressClassName: "nginx-two", rules: [ { - host: "ci-two.terria.io", + host: "ci.terria.io", http: { paths: branches.map((branch) => ({ path: "/" + branch.name + "(/|$)(.*)", From 252a98e7cbecd6852403af2506cd50ad90891bb1 Mon Sep 17 00:00:00 2001 From: Nanda Date: Thu, 20 Apr 2023 15:40:02 +1000 Subject: [PATCH 150/654] Remove unnecessary cast to `any`. --- lib/Models/Catalog/Esri/ArcGisMapServerCatalogItem.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/Models/Catalog/Esri/ArcGisMapServerCatalogItem.ts b/lib/Models/Catalog/Esri/ArcGisMapServerCatalogItem.ts index ef728949d57..7145105deae 100644 --- a/lib/Models/Catalog/Esri/ArcGisMapServerCatalogItem.ts +++ b/lib/Models/Catalog/Esri/ArcGisMapServerCatalogItem.ts @@ -568,11 +568,11 @@ function getRectangleFromLayer(extent: Extent, rectangle: RectangleExtent) { const wkid = "EPSG:" + wkidCode; - if (!isDefined((Proj4Definitions as any)[wkid])) { + if (!isDefined(Proj4Definitions[wkid])) { return; } - const source = new proj4.Proj((Proj4Definitions as any)[wkid]); + const source = new proj4.Proj(Proj4Definitions[wkid]); const dest = new proj4.Proj("EPSG:4326"); let p = proj4(source, dest, [extent.xmin, extent.ymin]); From 56ca5290a03d320a93c5547c4d9d207b755c5cc7 Mon Sep 17 00:00:00 2001 From: Nanda Date: Thu, 20 Apr 2023 15:40:27 +1000 Subject: [PATCH 151/654] Update CHANGES.md. --- CHANGES.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGES.md b/CHANGES.md index 17ffc37052b..dc90132c91e 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -3,6 +3,8 @@ #### next release (8.2.28) - Fix location point ideal zoom bug in 3D mode map. +- Add `EPSG:7844` to `Proj4Definitions`. +- TSify `Proj4Definitions` and `Reproject` modules. - [The next improvement] #### 8.2.27 - 2023-04-05 From 6770828f42f585746d04e3a7f4d8a651531fea5f Mon Sep 17 00:00:00 2001 From: Jacky Jiang Date: Fri, 21 Apr 2023 11:56:49 +1000 Subject: [PATCH 152/654] update docs for excludeMembers group/item `id` is also supported --- lib/Traits/TraitsClasses/GroupTraits.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Traits/TraitsClasses/GroupTraits.ts b/lib/Traits/TraitsClasses/GroupTraits.ts index 58fa97193e5..1b80f14913b 100644 --- a/lib/Traits/TraitsClasses/GroupTraits.ts +++ b/lib/Traits/TraitsClasses/GroupTraits.ts @@ -10,7 +10,7 @@ export default class GroupTraits extends mixTraits(ItemPropertiesTraits) { @primitiveArrayTrait({ name: "Exclude members", type: "string", - description: `An array of strings of excluded group and item names. A group or item name that appears in this list will not be shown to the user. This is case-insensitive and will also apply to all child/nested groups` + description: `An array of strings of excluded group and item names (or ids). A group or item name (or id) that appears in this list will not be shown to the user. This is case-insensitive and will also apply to all child/nested groups` }) excludeMembers?: string[]; From 33ae9e74c948542fec080ec86b12946db144d9a2 Mon Sep 17 00:00:00 2001 From: Jacky Jiang Date: Fri, 21 Apr 2023 12:07:17 +1000 Subject: [PATCH 153/654] Update CHANGES.md --- CHANGES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES.md b/CHANGES.md index dc90132c91e..fda92c7db9e 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -5,6 +5,7 @@ - Fix location point ideal zoom bug in 3D mode map. - Add `EPSG:7844` to `Proj4Definitions`. - TSify `Proj4Definitions` and `Reproject` modules. +- Update the docs for `excludeMembers`: mention the group/item id support - [The next improvement] #### 8.2.27 - 2023-04-05 From 0fd7506a87a1ea4f9d0864b569d819309b54587d Mon Sep 17 00:00:00 2001 From: Felipe Nogueira Date: Thu, 2 Mar 2023 23:39:36 +0000 Subject: [PATCH 154/654] Translated using Weblate (Portuguese (Brazil)) for TerriaJSNext Currently translated at 99.2% (1208 of 1217 strings) Translation: TerriaJS/TerriaJSNext Translate-URL: https://hosted.weblate.org/projects/terriajs/terriajsnext/pt_BR/ --- wwwroot/languages/pt_BR/translation.json | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/wwwroot/languages/pt_BR/translation.json b/wwwroot/languages/pt_BR/translation.json index 250d431f161..11cc118d2b6 100644 --- a/wwwroot/languages/pt_BR/translation.json +++ b/wwwroot/languages/pt_BR/translation.json @@ -236,9 +236,9 @@ "dataCatalogue": "Catálogo de Dados", "searchPlaceholder": "Pesquise o catálogo", "localAdd": "Adicionar arquivo local", - "localFileType": "<0> Etapa 1: Selecione o tipo de arquivo (opcional)", + "localFileType": "<0>Etapa 1: Selecione o tipo de arquivo", "webAdd": "Adicionar dados da web", - "webFileType": "<0> Etapa 1: Selecione o tipo de arquivo (opcional)", + "webFileType": "<0>Etapa 1: Selecione arquivo ou tipo de serviço web", "urlInputBtn": "Adic.", "localTitle": "Adicionar dados locais", "dragDrop": "Arrastar e Soltar", @@ -655,15 +655,15 @@ "dataType": { "kml": "KML ou KMZ", "czml": "CZML", - "shp": "Shapefile (zip)", + "shp": "Shapefile", "sdmx-group": "SDMX-JSON", "geojson": "GeoJSON", "open-street-map": "Servidor Open Street Map", "gpx": "GPX", "geoRss": "GeoRSS", "csv": "CSV", - "carto": "Carto", - "auto": "Detecção automática (recomendada)", + "carto": "Carto V1", + "auto": "Tipo de arquivo", "wms-group": "Servidor do Serviço de Mapas Web (WMS)", "wmts-group": "Servidor Web Map Tile Service (WMTS)", "wfs-group": "Servidor WFS (Web Feature Service, serviço de recursos da Web)", @@ -673,7 +673,7 @@ "esri-featureServer": "Esri ArcGIS FeatureServer (camada única)", "3d-tiles": "3D Tiles", "opendatasoft-group": "Portal Opendatasoft", - "json": "JSON", + "json": "Catálogo Terria", "gltf": "glTF", "other": "Outro (usar serviço de conversão)", "socrata-group": "Servidor Socrata", @@ -681,7 +681,8 @@ "assimp-remote-description": "**Aviso:** o conversor de arquivos 3D é experimental.\nVeja a lista de [formatos suportados](https://github.com/assimp/assimp/blob/master/doc/Fileformats.md).\nArquivos zip também são suportados", "ifc": "IFC", "assimp-local-description": "**Aviso:** o conversor de arquivos 3D é experimental.\nVeja a lista de [formatos suportados](https://github.com/assimp/assimp/blob/master/doc/Fileformats.md).\nOs arquivos devem ser compactados.", - "assimp-remote": "Conversor de arquivos 3D (experimental)" + "assimp-remote": "Conversor de arquivos 3D (experimental)", + "carto-v3": "Carto V3" }, "printWindow": { "onbeforeprint": "onbeforeprint", @@ -726,7 +727,12 @@ "tooDeepAddedByUser": "Atingiu 100 itens de catálogo ao verificar AddedByUser e pousou em ID: \"{{memberId}}\"? Verifique se você não tem um grupo de catálogo recursivo." }, "userAddedData": "Dados adicionados pelo usuário", - "chartData": "Dados do gráfico" + "chartData": "Dados do gráfico", + "unverifiedExternalLink": { + "title": "Alerta: link não verificado", + "denyText": "Cancelar", + "confirmText": "Abrir em uma nova aba" + } }, "analytics": { "point": "Ponto (lat/lon)", From 019bb95b8466bc54d08981370f9107b41d61006f Mon Sep 17 00:00:00 2001 From: raf Date: Fri, 3 Mar 2023 06:27:55 +0000 Subject: [PATCH 155/654] Translated using Weblate (Catalan) for TerriaJSNext Currently translated at 100.0% (1217 of 1217 strings) Translation: TerriaJS/TerriaJSNext Translate-URL: https://hosted.weblate.org/projects/terriajs/terriajsnext/ca/ --- wwwroot/languages/ca/translation.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wwwroot/languages/ca/translation.json b/wwwroot/languages/ca/translation.json index 3585a60022d..ca498edbb1a 100644 --- a/wwwroot/languages/ca/translation.json +++ b/wwwroot/languages/ca/translation.json @@ -262,7 +262,7 @@ "baseMap": "Mapa Base", "imageOptimisation": "Optimització de la imatge", "nativeResolutionHeader": "Utilitzeu la resolució original del dispositiu", - "mapQuality": "Qualitat del mapa ràster:", + "mapQuality": "Qualitat del mapa:", "timeline": { "title": "Cronologia", "alwaysShow": "Mostra sempre", From 4cc41fa04639c9ee327656bc7a96048e4cf09ace Mon Sep 17 00:00:00 2001 From: Felipe Nogueira Date: Fri, 3 Mar 2023 03:41:57 +0000 Subject: [PATCH 156/654] Translated using Weblate (Portuguese (Brazil)) for TerriaJSNext Currently translated at 99.4% (1210 of 1217 strings) Translation: TerriaJS/TerriaJSNext Translate-URL: https://hosted.weblate.org/projects/terriajs/terriajsnext/pt_BR/ --- wwwroot/languages/pt_BR/translation.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/wwwroot/languages/pt_BR/translation.json b/wwwroot/languages/pt_BR/translation.json index 11cc118d2b6..53c0dd42b4d 100644 --- a/wwwroot/languages/pt_BR/translation.json +++ b/wwwroot/languages/pt_BR/translation.json @@ -390,7 +390,7 @@ "nativeResolutionHeader": "Use a resolução nativa do dispositivo", "qualityLabel": "Qualidade", "nativeResolutionLabel": "Pressione para parar de usar a resolução {{resolution1}} e começar a usar a resolução {{resolution2}}", - "mapQuality": "Qualidade do mapa raster:" + "mapQuality": "Qualidade do mapa:" }, "toolsPanel": { "btnText": "Ferramenta", @@ -924,7 +924,9 @@ "useConversion": "Usar serviço de conversão?", "compositesError": "Os compostos não podem incluir itens compostos.", "convertErrorTitle": "Não foi possível atualizar o catálogo para V8", - "convertErrorMessage": "Este arquivo de catálogo é baseado em uma versão mais antiga do TerriaJS - o software que alimenta este mapa web. Ocorreu um erro ao tentar atualizar os dados do catálogo para {{url}}." + "convertErrorMessage": "Este arquivo de catálogo é baseado em uma versão mais antiga do TerriaJS - o software que alimenta este mapa web. Ocorreu um erro ao tentar atualizar os dados do catálogo para {{url}}.", + "addAll": "Adicionar todos", + "removeAll": "Remover todos" }, "ckan": { "idsNotSpecifiedTitle": "id de recursos ou conjunto de dados devem ser especificados", From 7bc9bdc00f005872941fcd50a542686d676c0346 Mon Sep 17 00:00:00 2001 From: Felipe Nogueira Date: Mon, 20 Mar 2023 10:38:04 +0000 Subject: [PATCH 157/654] Translated using Weblate (Portuguese (Brazil)) for TerriaJSNext Currently translated at 99.5% (1211 of 1217 strings) Translation: TerriaJS/TerriaJSNext Translate-URL: https://hosted.weblate.org/projects/terriajs/terriajsnext/pt_BR/ --- wwwroot/languages/pt_BR/translation.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/wwwroot/languages/pt_BR/translation.json b/wwwroot/languages/pt_BR/translation.json index 53c0dd42b4d..c6f0327192c 100644 --- a/wwwroot/languages/pt_BR/translation.json +++ b/wwwroot/languages/pt_BR/translation.json @@ -817,7 +817,8 @@ "devError": "cesium é necessário.", "failedToObtain": "Falha ao obter o bloco de imagem X: {{x}} Y: {{y}} Nível: {{level}}.", "notWebMercatorTilingScheme": "Este conjunto de dados não pode ser exibido no mapa 2D porque não suporta a projeção Web Mercator (EPSG: 3857).", - "unusalTilingScheme": "Este conjunto de dados não pode ser exibido no mapa 2D porque ele usa um esquema de tiling incomum que não é compatível." + "unusalTilingScheme": "Este conjunto de dados não pode ser exibido no mapa 2D porque ele usa um esquema de tiling incomum que não é compatível.", + "terrainServerErrorTitle": "Servidor Terrain não está respondendo" }, "computeRingWindingOrder": { "devError": "Pontos esperados do tipo {x: número, y: número}" From 78d65ae43cb5f16d7a616454fda6882d853b5cea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Podhoreck=C3=BD?= Date: Mon, 27 Mar 2023 16:57:59 +0000 Subject: [PATCH 158/654] Translated using Weblate (Czech) for TerriaJSNext Currently translated at 100.0% (1217 of 1217 strings) Translation: TerriaJS/TerriaJSNext Translate-URL: https://hosted.weblate.org/projects/terriajs/terriajsnext/cs/ --- wwwroot/languages/cs/translation.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/wwwroot/languages/cs/translation.json b/wwwroot/languages/cs/translation.json index fec07f85304..91a51bb8b42 100644 --- a/wwwroot/languages/cs/translation.json +++ b/wwwroot/languages/cs/translation.json @@ -264,7 +264,7 @@ "baseMap": "Základní mapa", "imageOptimisation": "Optimalizace obrázků", "nativeResolutionHeader": "Použití nativního rozlišení zařízení", - "mapQuality": "Kvalita rastrové mapy:", + "mapQuality": "Kvalita mapy:", "qualityLabel": "Kvalita", "performanceLabel": "Výkon", "timeline": { @@ -1006,7 +1006,9 @@ "unsupportedFileTypeMessage": "Tento formát souboru aplikace {{appName}} nepodporuje. Mezi podporované formáty souborů patří:
    • .geojson
    • .kml, .kmz
    • .csv (v {{link}})
    • Shapefile (.zip)
    ", "compositesError": "Kompozity nemohou obsahovat složené položky.", "mustHaveType": "Každá položka musí mít typ.", - "convertErrorMessage": "Tento katalogový soubor je založen na starší verzi softwaru TerriaJS, který pohání tuto webovou mapu. Při pokusu o aktualizaci katalogových dat pro {{url}} došlo k chybě." + "convertErrorMessage": "Tento katalogový soubor je založen na starší verzi softwaru TerriaJS, který pohání tuto webovou mapu. Při pokusu o aktualizaci katalogových dat pro {{url}} došlo k chybě.", + "addAll": "Přidat vše", + "removeAll": "Odstranit vše" }, "createParameter": { "unsupportedErrorTitle": "Nepodporovaný typ parametru funkce", From 11db195d251cf83e7f25d07aa6f0e496c1dadd30 Mon Sep 17 00:00:00 2001 From: raf Date: Wed, 12 Apr 2023 10:05:40 +0000 Subject: [PATCH 159/654] Translated using Weblate (Catalan) for TerriaJSNext Currently translated at 100.0% (1218 of 1218 strings) Translation: TerriaJS/TerriaJSNext Translate-URL: https://hosted.weblate.org/projects/terriajs/terriajsnext/ca/ --- wwwroot/languages/ca/translation.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/wwwroot/languages/ca/translation.json b/wwwroot/languages/ca/translation.json index ca498edbb1a..94d8e55aa4c 100644 --- a/wwwroot/languages/ca/translation.json +++ b/wwwroot/languages/ca/translation.json @@ -883,7 +883,8 @@ "copyrightText": "Text dels drets d'autor", "invalidServiceTitle": "Servei de mapes d'ArcGIS no vàlid", "invalidServiceMessage": "Error en invocar el servei de mapes d'ArcGIS. La resposta del servidor no sembla ser un document vàlid del servei de mapes.", - "groupNotAvailableMessage": "Error en invocar el servei de mapes d'ArcGIS." + "groupNotAvailableMessage": "Error en invocar el servei de mapes d'ArcGIS.", + "singleFusedMapCacheLayerName": "Totes les capes" }, "arcGisMapServerCatalogItem": { "invalidUrlMessage": "No s'ha pogut carregar el punt d'accés de l'ArcGis MapServer perquè l'element del catàleg no té una \"url\".", From b7f57aaf75b3cdbdb9d504f7f930166346c04315 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Podhoreck=C3=BD?= Date: Tue, 18 Apr 2023 16:26:33 +0000 Subject: [PATCH 160/654] Translated using Weblate (Czech) for TerriaJSNext Currently translated at 100.0% (1218 of 1218 strings) Translation: TerriaJS/TerriaJSNext Translate-URL: https://hosted.weblate.org/projects/terriajs/terriajsnext/cs/ --- wwwroot/languages/cs/translation.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/wwwroot/languages/cs/translation.json b/wwwroot/languages/cs/translation.json index 91a51bb8b42..c92f8682641 100644 --- a/wwwroot/languages/cs/translation.json +++ b/wwwroot/languages/cs/translation.json @@ -901,7 +901,8 @@ "invalidServiceTitle": "Neplatná mapová služba ArcGIS", "groupNotAvailableTitle": "Skupina není k dispozici", "groupNotAvailableMessage": "Při vyvolání mapové služby ArcGIS došlo k chybě.", - "invalidServiceMessage": "Při vyvolání mapové služby ArcGIS došlo k chybě. Odpověď serveru se nezdá být platným dokumentem mapové služby." + "invalidServiceMessage": "Při vyvolání mapové služby ArcGIS došlo k chybě. Odpověď serveru se nezdá být platným dokumentem mapové služby.", + "singleFusedMapCacheLayerName": "Všechny vrstvy" }, "arcGisMapServerCatalogItem": { "name": "Esri ArcGIS MapServer", From cd810d5c0737bbb1de4dfc6d7f04f3bce4233037 Mon Sep 17 00:00:00 2001 From: Nanda Date: Thu, 27 Apr 2023 14:54:04 +1000 Subject: [PATCH 161/654] Simplifies MapToolbar API. --- lib/ViewModels/MapNavigation/MapToolbar.ts | 250 ++++++++++++++++ .../MapNavigation/MapToolbar/Buttons.ts | 280 ------------------ .../MapNavigation/MapToolbar/ToolButton.ts | 150 ---------- .../MapNavigation/MapToolbar/index.ts | 2 - .../MapNavigation/MapToolbarSpec.ts | 253 +++++++--------- 5 files changed, 357 insertions(+), 578 deletions(-) create mode 100644 lib/ViewModels/MapNavigation/MapToolbar.ts delete mode 100644 lib/ViewModels/MapNavigation/MapToolbar/Buttons.ts delete mode 100644 lib/ViewModels/MapNavigation/MapToolbar/ToolButton.ts delete mode 100644 lib/ViewModels/MapNavigation/MapToolbar/index.ts diff --git a/lib/ViewModels/MapNavigation/MapToolbar.ts b/lib/ViewModels/MapNavigation/MapToolbar.ts new file mode 100644 index 00000000000..1a36d0196bf --- /dev/null +++ b/lib/ViewModels/MapNavigation/MapToolbar.ts @@ -0,0 +1,250 @@ +import { action, computed } from "mobx"; +import React from "react"; +import createGuid from "terriajs-cesium/Source/Core/createGuid"; +import TerriaError from "../../Core/TerriaError"; +import ViewerMode from "../../Models/ViewerMode"; +import ViewState from "../../ReactViewModels/ViewState"; +import { IconGlyph } from "../../Styled/Icon"; +import MapNavigationItemController from "./MapNavigationItemController"; +import { NavigationItemLocation } from "./MapNavigationModel"; + +export interface ToolConfig { + /** + * Optional `id` for the tool. If no `id` is passed we generate a random + * one and return it as the result of the `addTool()` call. + * + * `id` is required for other operations on the tool like opening, closing or + * removing it from the toolbar. + */ + id?: string; + + /** + * A human readable name for the tool. + */ + name: string; + + /** + * A loader function returning the react component module to mount when user activates the tool. + * + * example: ``` + * { + * toolComponentLoader: () => import("./MyToolModule.tsx"), + * } + * ``` + */ + toolComponentLoader: () => Promise<{ default: React.ComponentType }>; + + /** + * The tool button configuration + */ + toolButton: ToolButton; + + /** + * Shows the tool button only for the specified map viewer mode. Defaults to + * showing the tool button in both Cesium (3D) and Leaflet (2D) modes. + * + * eg: Setting this to `ViewerMode.Cesium` will result in the tool button + * being shown only when the map is in Cesium 3D mode. + */ + viewerMode?: ViewerMode; +} + +export interface ToolButton { + /** + * Tool button text + */ + text: string; + + /** + * Tool button icon + */ + icon: IconGlyph; + + /** + * Tooltip to show when hovering over the tool button + */ + tooltip?: string; + + /** + * The toolBarSection to place the tool button. Defaults to `TOP`. + * + * The toolbar has 2 sections - TOP and BOTTOM + * TOP - contains the compass and other buttons + * BOTTOM - contains the feedback button + */ + section?: ToolbarSection; + + /** + * A number used to determine the order of the button in the toolbar + */ + order?: number; +} + +export type ToolbarSection = NavigationItemLocation; + +export { default as ViewerMode } from "../../Models/ViewerMode"; + +/** + * Adds a new tool to the map toolbar + * + * @param viewState The {@link ViewState} instance + * @param config The tool configuration + * @returns `id` of the tool. This will be the same as `config.id` if it was set. Otherwise, a random `id` is generated and returned. + * + * Example: + * const toolId = addTool(viewState, { + * toolComponent: React.lazy(() => import("./XTool.tsx")), + * toolButton: { + * text: "Open X tool", + * tooltip: "X Tool", + * icon: X_ICON + * } + * }) + */ +export function addTool(viewState: ViewState, config: ToolConfig): string { + const id = config.id ?? createGuid(); + const controller = new ToolController(viewState, id, config); + const terria = viewState.terria; + terria.mapNavigationModel.addItem({ + id, + name: config.toolButton.text, + title: config.toolButton.tooltip, + location: config.toolButton.section ?? "TOP", + order: config.toolButton.order, + controller + }); + return id; +} + +/** + * Function to programatically open the tool with given ID. + * + * Note that in normal operation, a tool will be opened when user clicks the + * tool button in the map toolbar. This function is useful in situations where + * the tool needs to be opened through other means - like clicking a workbench + * viewing-controls button. + * + * If no tool exists with the given `toolId` then this function does nothing + * and returns `false`. The caller can also check if the call was successful + * by checking the result of {@link isToolOpen()}. + * + * @param viewState The `ViewState` instance. + * @param toolId ID of the tool to open. See {@link addTool}. + * @param props Optional props to pass to the Tool component when activating it. + * @returns `true` if the tool was successfully opened. + */ +export function openTool(viewState: ViewState, toolId: string, props?: any) { + const controller = findToolController(viewState, toolId); + controller?.openTool(props); + return controller?.isToolOpen === true; +} + +/** + * Closes the tool with given id. + * + * @param viewState The `ViewState` instance. + * @param toolId ID of the tool to close. + */ +export function closeTool(viewState: ViewState, toolId: string) { + findToolController(viewState, toolId)?.closeTool(); +} + +/** + * Check if tool with given `id` is currently open. + * + * @param viewState The `ViewState` instance. + * @param toolId ID of the tool to check. + * @returns `true` if the tool is currently open, otherwise returns `false`. + */ +export function isToolOpen(viewState: ViewState, toolId: string): boolean { + return findToolController(viewState, toolId)?.active === true; +} + +/** + * Removes the tool with the given id from the toolbar. + * + * @param viewState The `ViewState` instance. + * @param toolId ID of the tool to close. + */ +export function removeTool(viewState: ViewState, toolId: string) { + viewState.terria.mapNavigationModel.remove(toolId); +} + +/** + * Find `ToolController` by id. + */ +function findToolController( + viewState: ViewState, + toolId: string +): ToolController | undefined { + const navItem = viewState.terria.mapNavigationModel.items.find( + (it) => it.id === toolId + ); + return navItem?.controller instanceof ToolController + ? navItem.controller + : undefined; +} + +export class ToolController extends MapNavigationItemController { + constructor( + readonly viewState: ViewState, + readonly toolId: string, + readonly toolConfig: ToolConfig + ) { + super(); + } + + get glyph(): { id: string } { + return this.toolConfig.toolButton.icon; + } + + get viewerMode(): ViewerMode | undefined { + return this.toolConfig.viewerMode; + } + + @computed + get isToolOpen() { + return this.viewState.currentTool?.toolName === this.toolConfig.name; + } + + @computed + get active(): boolean { + return super.active && this.isToolOpen; + } + + openTool(props: any = {}) { + const toolConfig = this.toolConfig; + const toolId = this.toolId; + try { + this.viewState.openTool({ + toolName: toolConfig.name, + getToolComponent: () => + toolConfig.toolComponentLoader().then((m) => m.default), + params: { + ...props, + // Pass toolId as an extra prop to the component. + // TODO: Maybe we should use react contexts to do this instead of a magic prop? + toolId + }, + showCloseButton: true + }); + } catch (err) { + this.viewState.terria.raiseErrorToUser(TerriaError.from(err)); + } + super.activate(); + } + + activate() { + this.openTool(); + } + + deactivate() { + this.closeTool(); + } + + @action + closeTool() { + if (this.isToolOpen) this.viewState.closeTool(); + super.deactivate(); + } +} diff --git a/lib/ViewModels/MapNavigation/MapToolbar/Buttons.ts b/lib/ViewModels/MapNavigation/MapToolbar/Buttons.ts deleted file mode 100644 index 747a6d2aad7..00000000000 --- a/lib/ViewModels/MapNavigation/MapToolbar/Buttons.ts +++ /dev/null @@ -1,280 +0,0 @@ -import createGuid from "terriajs-cesium/Source/Core/createGuid"; -import TerriaError from "../../../Core/TerriaError"; -import Terria from "../../../Models/Terria"; -import ViewerMode from "../../../Models/ViewerMode"; -import ViewState from "../../../ReactViewModels/ViewState"; -import { IconGlyph } from "../../../Styled/Icon"; -import MapNavigationItemController from "../MapNavigationItemController"; -import { NavigationItemLocation } from "../MapNavigationModel"; - -interface SimpleButton { - /** - * Removes the button from the toolbar - */ - removeButton: () => void; -} - -interface SimpleButtonOptions extends BaseButtonOptions { - /** - * Called when user clicks the button - */ - onClick: () => void; -} - -interface ModeButton { - /** - * Removes the button from the toolbar - */ - removeButton: () => void; - - /** - * Closes the mode if it is open - */ - closeMode: () => void; -} - -interface ModeButtonOptions extends BaseButtonOptions { - /** - * Called when user enters the mode - */ - onUserEnterMode: () => void; - - /** - * Called when user leaves the mode by toggling the mode button - */ - onUserCloseMode: () => void; -} - -export interface BaseButtonOptions { - /** - * Button text - */ - text: string; - - /** - * Button icon - */ - icon: IconGlyph; - - /** - * Button tooltip - */ - tooltip?: string; - - /** - * The toolbar has 2 groups, TOP and BOTTOM (BOTTOM is where you will find the feedback button) - * `position` indicates where to place the button. - */ - position?: NavigationItemLocation; - - /** - * A numeric order of the button - */ - order?: number; - - /** - * Whether the button should be visible in 2d, 3d or otherwise any map mode. - */ - mapMode?: ButtonMapMode; -} - -/** - * The map modes in which a nav buttons will be visible - */ -export type ButtonMapMode = "2d" | "3d" | "any"; - -/** - * Add a simple clickable button to the map toolbar. This button is useful for performing some action when the user clicks on it. - * - * @param viewState - The {@link ViewState} instance - * @param options - Options for the simple clickable button - * @returns A simple button instance with a method to remove the button from the toolbar. - * - * @example - * ```ts - * const locationButton = MapToolbar.addButton(viewState, { - * text: "My location", - * tooltip: "Mark your current location on the map", - * icon: Icon.GLYPH.location, - * onClick: () => { - * // code to show marker - * } - * }) - * // and later - * locationButton.removeButton(); - * ``` - */ -export function addButton( - viewState: ViewState, - options: SimpleButtonOptions -): SimpleButton { - const terria = viewState.terria; - const id = createGuid(); - const { icon, mapMode, onClick } = options; - const controller = new SimpleButtonController(terria, { - icon, - mapMode, - onClick - }); - - terria.mapNavigationModel.addItem({ - id, - name: options.text, - title: options.tooltip, - location: options.position ?? "TOP", - order: options.order ?? terria.mapNavigationModel.items.length, - controller - }); - - return { - removeButton: () => terria.mapNavigationModel.remove(id) - }; -} - -/** - * Add a mode button to the map toolbar. This button is useful for launching tools that have an open and close mode. - * - * @param viewState - The {@link ViewState} instance - * @param options - Options for the simple mode button - * @returns A mode button instance with a method to remove the button from the toolbar. - * - * @example - * ```ts - * const pedestrianButton = MapToolbar.addModeButton(viewState, { - * text: "Pedestrian mode", - * tooltip: "Use keyboard navigation to walk and fly around the map", - * icon: Icon.GLYPH.pedestrian, - * onUserEnterMode: () => { - * // code to put the map in pedestrian mode - * }, - * onUserCloseMode: () => { - * // code to run when user closes the mode by toggling the button - * } - * }) - * // and later, to close the mode from some other part of the UI - * pedestrianButton.closeMode(); - * ``` - */ -export function addModeButton( - viewState: ViewState, - options: ModeButtonOptions -): ModeButton { - const terria = viewState.terria; - const id = createGuid(); - const { icon, mapMode, onUserEnterMode, onUserCloseMode } = options; - const controller = new ModalButtonController(terria, { - icon, - mapMode, - onUserEnterMode, - onUserCloseMode - }); - - terria.mapNavigationModel.addItem({ - id, - name: options.text, - title: options.tooltip, - location: options.position ?? "TOP", - order: options.order, - controller - }); - - return { - removeButton: () => terria.mapNavigationModel.remove(id), - closeMode: () => controller.closeMode() - }; -} - -interface SimpleButtonControllerOptions { - icon: IconGlyph; - mapMode?: ButtonMapMode; - onClick: () => void; -} - -/** - * A simple button controller - */ -class SimpleButtonController extends MapNavigationItemController { - constructor( - readonly terria: Terria, - readonly options: SimpleButtonControllerOptions - ) { - super(); - } - - get glyph(): { id: string } { - return this.options.icon; - } - - get viewerMode(): ViewerMode | undefined { - const mapMode = this.options.mapMode; - return mapMode === "2d" - ? ViewerMode.Leaflet - : mapMode === "3d" - ? ViewerMode.Cesium - : undefined; - } - - handleClick() { - try { - this.options.onClick(); - } catch (err) { - this.terria.raiseErrorToUser(TerriaError.from(err)); - } - super.handleClick(); - } -} - -interface ModalButtonControllerOptions { - icon: IconGlyph; - mapMode?: ButtonMapMode; - onUserEnterMode: () => void; - onUserCloseMode: () => void; -} - -/** - * A modal button controller - */ -class ModalButtonController extends MapNavigationItemController { - constructor( - readonly terria: Terria, - readonly options: ModalButtonControllerOptions - ) { - super(); - } - - get glyph(): { id: string } { - return this.options.icon; - } - - get viewerMode(): ViewerMode | undefined { - const mapMode = this.options.mapMode; - return mapMode === "2d" - ? ViewerMode.Leaflet - : mapMode === "3d" - ? ViewerMode.Cesium - : undefined; - } - - activate() { - try { - this.options.onUserEnterMode(); - } catch (err) { - this.terria.raiseErrorToUser(TerriaError.from(err)); - return; - } - super.activate(); - } - - deactivate() { - try { - this.options.onUserCloseMode(); - } catch (err) { - this.terria.raiseErrorToUser(TerriaError.from(err)); - } - super.deactivate(); - } - - closeMode() { - super.deactivate(); - } -} diff --git a/lib/ViewModels/MapNavigation/MapToolbar/ToolButton.ts b/lib/ViewModels/MapNavigation/MapToolbar/ToolButton.ts deleted file mode 100644 index fb1672e5c11..00000000000 --- a/lib/ViewModels/MapNavigation/MapToolbar/ToolButton.ts +++ /dev/null @@ -1,150 +0,0 @@ -import { action, computed } from "mobx"; -import createGuid from "terriajs-cesium/Source/Core/createGuid"; -import TerriaError from "../../../Core/TerriaError"; -import ViewerMode from "../../../Models/ViewerMode"; -import ViewState from "../../../ReactViewModels/ViewState"; -import MapNavigationItemController from "../MapNavigationItemController"; -import { BaseButtonOptions } from "./Buttons"; - -export interface ToolButtonOptions extends BaseButtonOptions { - tool: { - name: string; - component: () => - | React.ComponentType - | Promise>; - props?: ToolProps; - }; -} - -/** - * ToolButton - * - */ -export interface ToolButton { - /** - * Removes the button from the toolbar - */ - removeButton: () => void; - - /** - * Closes the tool if it is open - */ - closeTool: () => void; - - /** - * Can be used to programatically open the tool - * - * @param props Additional Props to pass to the tool. This is useful, for - * example, if you want to open the tool in a specific mode. - */ - openTool: (props?: Partial) => void; -} - -/** - * Add a button to open a Tool UI to the map navigation menu. - * - * This is useful for external plugins to add buttons to the navigation menu that launches some custom work flow. - * - * @param viewState The ViewState instance - * @param buttonOptionsGenerator A function that when called, returns {@link ToolButtonOptions} for the new button - * @returns A {@link ToolButton} instance - */ -export function addToolButton( - viewState: ViewState, - buttonOptionsGenerator: ( - button: ToolButton - ) => ToolButtonOptions -): ToolButton { - const terria = viewState.terria; - const getController = () => { - // Retreive controller through mapNavigationModel to ensure the button hasn't been removed - const controller = terria.mapNavigationModel.findItem(id)?.controller; - return controller instanceof ToolButtonController ? controller : undefined; - }; - - const toolButton = { - removeButton: () => terria.mapNavigationModel.remove(id), - closeTool: () => getController()?.closeTool(), - openTool: (props?: Partial) => getController()?.openTool(props) - }; - const options = buttonOptionsGenerator(toolButton); - const controller = new ToolButtonController(viewState, options); - const id = createGuid(); - - terria.mapNavigationModel.addItem({ - id, - name: options.text, - title: options.tooltip, - location: options.position ?? "TOP", - order: options.order, - controller - }); - - return toolButton; -} - -export class ToolButtonController< - ToolProps = {} -> extends MapNavigationItemController { - constructor( - readonly viewState: ViewState, - readonly options: ToolButtonOptions - ) { - super(); - } - - get glyph(): { id: string } { - return this.options.icon; - } - - get viewerMode(): ViewerMode | undefined { - const mapMode = this.options.mapMode; - return mapMode === "2d" - ? ViewerMode.Leaflet - : mapMode === "3d" - ? ViewerMode.Cesium - : undefined; - } - - @computed - get isToolOpen() { - return this.viewState.currentTool?.toolName === this.options.tool.name; - } - - @computed - get active(): boolean { - return super.active && this.isToolOpen; - } - - openTool(props: any = {}) { - try { - this.viewState.openTool({ - toolName: this.options.tool.name, - getToolComponent: this.options.tool.component, - params: { - ...this.options.tool.props, - ...props, - closeTool: () => this.closeTool() - }, - showCloseButton: true - }); - } catch (err) { - this.viewState.terria.raiseErrorToUser(TerriaError.from(err)); - } - super.activate(); - } - - activate() { - this.openTool(); - } - - deactivate() { - this.closeTool(); - } - - @action - closeTool() { - if (this.isToolOpen) this.viewState.closeTool(); - super.deactivate(); - } -} diff --git a/lib/ViewModels/MapNavigation/MapToolbar/index.ts b/lib/ViewModels/MapNavigation/MapToolbar/index.ts deleted file mode 100644 index 0d0a72dbc3a..00000000000 --- a/lib/ViewModels/MapNavigation/MapToolbar/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { addButton, addModeButton, ButtonMapMode } from "./Buttons"; -export { addToolButton, ToolButton, ToolButtonOptions } from "./ToolButton"; diff --git a/test/ViewModels/MapNavigation/MapToolbarSpec.ts b/test/ViewModels/MapNavigation/MapToolbarSpec.ts index 80c07beb33b..3df9e1a316e 100644 --- a/test/ViewModels/MapNavigation/MapToolbarSpec.ts +++ b/test/ViewModels/MapNavigation/MapToolbarSpec.ts @@ -1,7 +1,7 @@ -import * as MapToolbar from "../../../lib/ViewModels/MapNavigation/MapToolbar"; import Terria from "../../../lib/Models/Terria"; import ViewState from "../../../lib/ReactViewModels/ViewState"; import Icon from "../../../lib/Styled/Icon"; +import * as MapToolbar from "../../../lib/ViewModels/MapNavigation/MapToolbar"; describe("MapToolbar", function () { let viewState: ViewState; @@ -16,179 +16,140 @@ describe("MapToolbar", function () { }); }); - describe("simple click button", function () { - it("can be added to the toolbar", function () { + describe("addTool", function () { + it("adds the new tool button to toolbar", function () { expect(terria.mapNavigationModel.items.length).toBe(0); - MapToolbar.addButton(viewState, { - text: "Simple button", - icon: Icon.GLYPHS.eye, - onClick: () => {} + const toolId = MapToolbar.addTool(viewState, { + id: "x-tool-id", + name: "X Tool", + toolComponentLoader: () => Promise.resolve({ default: () => null }), + toolButton: { + text: "Open X tool", + icon: Icon.GLYPHS.bulb + } }); + expect(toolId).toBe("x-tool-id"); // returns the tool id expect(terria.mapNavigationModel.items.length).toBe(1); - expect(terria.mapNavigationModel.items[0].name).toBe("Simple button"); + expect(terria.mapNavigationModel.items[0].name).toBe("Open X tool"); }); - it("calls `onClick` when clicked", function () { - const onClickSpy = jasmine.createSpy("onClick"); - MapToolbar.addButton(viewState, { - text: "Simple button", - icon: Icon.GLYPHS.eye, - onClick: onClickSpy + it("generates a random id when called without an `id`", function () { + const toolId = MapToolbar.addTool(viewState, { + name: "X Tool", + toolComponentLoader: () => Promise.resolve({ default: () => null }), + toolButton: { + text: "Open X tool", + icon: Icon.GLYPHS.bulb + } }); - const navItem = terria.mapNavigationModel.items[0]; - expect(navItem).toBeDefined(); - navItem.controller.handleClick(); - expect(onClickSpy).toHaveBeenCalledTimes(1); + expect(toolId).toBeDefined(); }); }); - describe("mode button", function () { - it("can be added to the toolbar", function () { - expect(terria.mapNavigationModel.items.length).toBe(0); - MapToolbar.addModeButton(viewState, { - text: "Mode button", - icon: Icon.GLYPHS.pedestrian, - onUserEnterMode: () => {}, - onUserCloseMode: () => {} + describe("openTool", function () { + let toolId = "x-tool-id"; + beforeEach(function () { + MapToolbar.addTool(viewState, { + id: toolId, + name: "X Tool", + toolComponentLoader: () => Promise.resolve({ default: () => null }), + toolButton: { + text: "Open X tool", + icon: Icon.GLYPHS.bulb + } }); - expect(terria.mapNavigationModel.items.length).toBe(1); - expect(terria.mapNavigationModel.items[0].name).toBe("Mode button"); }); - describe("onUserEnterMode", function () { - it("is called once when user activates the mode button", function () { - const onUserEnterModeSpy = jasmine.createSpy("onUserEnterMode"); - MapToolbar.addModeButton(viewState, { - text: "Mode button", - icon: Icon.GLYPHS.pedestrian, - onUserEnterMode: onUserEnterModeSpy, - onUserCloseMode: () => {} - }); - const navItem = terria.mapNavigationModel.items[0]; - expect(navItem).toBeDefined(); - - expect(onUserEnterModeSpy).toHaveBeenCalledTimes(0); - navItem.controller.activate(); - expect(onUserEnterModeSpy).toHaveBeenCalledTimes(1); - }); - - it("raises any callback errors to the user", function () { - MapToolbar.addModeButton(viewState, { - text: "Mode button", - icon: Icon.GLYPHS.pedestrian, - onUserEnterMode: () => { - throw "onUserEnterMode error"; - }, - onUserCloseMode: () => {} - }); - - const raiseErrorToUserSpy = spyOn(terria, "raiseErrorToUser"); - const navItem = terria.mapNavigationModel.items[0]; - expect(navItem).toBeDefined(); - expect(raiseErrorToUserSpy).toHaveBeenCalledTimes(0); - navItem.controller.activate(); - expect(raiseErrorToUserSpy).toHaveBeenCalledTimes(1); - }); + it("activates the tool", function () { + const isOpen = MapToolbar.openTool(viewState, toolId); + expect(isOpen).toBe(true); + const navItem = terria.mapNavigationModel.items[0]; + expect(navItem.controller.active).toBe(true); }); - describe("onUserCloseMode", function () { - it("is called once when user deactivates the mode button", function () { - const onUserCloseModeSpy = jasmine.createSpy("onUserCloseMode"); - MapToolbar.addModeButton(viewState, { - text: "Mode button", - icon: Icon.GLYPHS.pedestrian, - onUserEnterMode: () => {}, - onUserCloseMode: onUserCloseModeSpy - }); - const navItem = terria.mapNavigationModel.items[0]; - expect(navItem).toBeDefined(); + it("returns false if there is no tool with given id", function () { + const isOpen = MapToolbar.openTool(viewState, "no-such-tool"); + expect(isOpen).toBe(false); + }); + }); - expect(onUserCloseModeSpy).toHaveBeenCalledTimes(0); - navItem.controller.deactivate(); - expect(onUserCloseModeSpy).toHaveBeenCalledTimes(1); + describe("closeTool", function () { + it("closes the tool", function () { + const toolId = MapToolbar.addTool(viewState, { + name: "X Tool", + toolComponentLoader: () => Promise.resolve({ default: () => null }), + toolButton: { + text: "Open X tool", + icon: Icon.GLYPHS.bulb + } }); - it("raises any callback errors to the user", function () { - MapToolbar.addModeButton(viewState, { - text: "Mode button", - icon: Icon.GLYPHS.pedestrian, - onUserEnterMode: () => {}, - onUserCloseMode: () => { - throw "onUserCloseMode error"; - } - }); - - const raiseErrorToUserSpy = spyOn(terria, "raiseErrorToUser"); - const navItem = terria.mapNavigationModel.items[0]; - expect(navItem).toBeDefined(); - expect(raiseErrorToUserSpy).toHaveBeenCalledTimes(0); - navItem.controller.deactivate(); - expect(raiseErrorToUserSpy).toHaveBeenCalledTimes(1); - }); + const isOpen = MapToolbar.openTool(viewState, toolId); + expect(isOpen).toBe(true); + MapToolbar.closeTool(viewState, toolId); + const navItem = terria.mapNavigationModel.items[0]; + expect(navItem.controller.active).toBe(false); }); }); - describe("tool button", function () { - it("can be added to the toolbar", function () { - expect(terria.mapNavigationModel.items.length).toBe(0); - MapToolbar.addToolButton(viewState, () => ({ - text: "Light bulb", - icon: Icon.GLYPHS.bulb, - tool: { - name: "Light bulb", - component: () => () => null + describe("isToolOpen", function () { + let toolId = "x-tool-id"; + beforeEach(function () { + MapToolbar.addTool(viewState, { + id: toolId, + name: "X Tool", + toolComponentLoader: () => Promise.resolve({ default: () => null }), + toolButton: { + text: "Open X tool", + icon: Icon.GLYPHS.bulb } - })); - expect(terria.mapNavigationModel.items.length).toBe(1); - expect(terria.mapNavigationModel.items[0].name).toBe("Light bulb"); + }); }); - it("can be removed from the toolbar", function () { - expect(terria.mapNavigationModel.items.length).toBe(0); - const toolButton = MapToolbar.addToolButton(viewState, () => ({ - text: "Light bulb", - icon: Icon.GLYPHS.bulb, - tool: { - name: "Light bulb", - component: () => () => null - } - })); - expect(terria.mapNavigationModel.items.length).toBe(1); - toolButton.removeButton(); - expect(terria.mapNavigationModel.items.length).toBe(0); + it("returns true if the tool is open", function () { + MapToolbar.openTool(viewState, toolId); + expect(MapToolbar.isToolOpen(viewState, toolId)).toBe(true); }); - it("is activated when opening the tool", function () { - const toolButton = MapToolbar.addToolButton(viewState, () => ({ - text: "Light bulb", - icon: Icon.GLYPHS.bulb, - tool: { - name: "Light bulb", - component: () => () => null - } - })); - const navItem = terria.mapNavigationModel.items[0]; - expect(navItem.controller.active).toBe(false); - toolButton.openTool(); - expect(navItem.controller.active).toBe(true); + it("otherwise, returns false", function () { + expect(MapToolbar.isToolOpen(viewState, toolId)).toBe(false); }); + }); - it("is deactivated when the tool is closed through other means", function () { - const toolButton = MapToolbar.addToolButton(viewState, () => ({ - text: "Light bulb", - icon: Icon.GLYPHS.bulb, - tool: { - name: "Light bulb", - component: () => () => null + describe("removeTool", function () { + it("removes the tool from the toolbar", function () { + const toolId = MapToolbar.addTool(viewState, { + name: "X Tool", + toolComponentLoader: () => Promise.resolve({ default: () => null }), + toolButton: { + text: "Open X tool", + icon: Icon.GLYPHS.bulb } - })); - const navItem = terria.mapNavigationModel.items[0]; - toolButton.openTool(); - expect(navItem.controller.active).toBe(true); - // The tool can be closed by other means, not nessecarily by calling toolButton.closeTool() - // It should deactivate correctly even in that case. - viewState.closeTool(); - expect(navItem.controller.active).toBe(false); + }); + + let navItem = terria.mapNavigationModel.items[0]; + expect(navItem.name).toBe("Open X tool"); + MapToolbar.removeTool(viewState, toolId); + navItem = terria.mapNavigationModel.items[0]; + expect(navItem).toBeUndefined(); + }); + }); + + it("is correctly deactivated even when the tool is closed through other means", function () { + const toolId = MapToolbar.addTool(viewState, { + name: "X Tool", + toolComponentLoader: () => Promise.resolve({ default: () => null }), + toolButton: { + text: "Open X tool", + icon: Icon.GLYPHS.bulb + } }); + const navItem = terria.mapNavigationModel.items[0]; + MapToolbar.openTool(viewState, toolId); + expect(navItem.controller.active).toBe(true); + // The tool can be closed by other means, not nessecarily by calling toolButton.closeTool() + // It should still deactivate correctly. + viewState.closeTool(); + expect(navItem.controller.active).toBe(false); }); }); From beb7c2b8e5b9b18a1c27003e9a215806eb7d6958 Mon Sep 17 00:00:00 2001 From: Nanda Date: Thu, 27 Apr 2023 15:12:26 +1000 Subject: [PATCH 162/654] Update CHANGES.md. --- CHANGES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES.md b/CHANGES.md index fda92c7db9e..dab0c95ba50 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -6,6 +6,7 @@ - Add `EPSG:7844` to `Proj4Definitions`. - TSify `Proj4Definitions` and `Reproject` modules. - Update the docs for `excludeMembers`: mention the group/item id support +- Simplifies `MapToolbar` API. - [The next improvement] #### 8.2.27 - 2023-04-05 From 0aed3a92d3d2bfeb7bac9e886e6f0c692ef89ea0 Mon Sep 17 00:00:00 2001 From: Nanda Date: Thu, 27 Apr 2023 15:14:33 +1000 Subject: [PATCH 163/654] Update example code. --- lib/ViewModels/MapNavigation/MapToolbar.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/ViewModels/MapNavigation/MapToolbar.ts b/lib/ViewModels/MapNavigation/MapToolbar.ts index 1a36d0196bf..f59ce7d1b90 100644 --- a/lib/ViewModels/MapNavigation/MapToolbar.ts +++ b/lib/ViewModels/MapNavigation/MapToolbar.ts @@ -93,7 +93,8 @@ export { default as ViewerMode } from "../../Models/ViewerMode"; * * Example: * const toolId = addTool(viewState, { - * toolComponent: React.lazy(() => import("./XTool.tsx")), + * name: "X Tool", + * toolComponentLoader: () => import("./XTool.tsx"), * toolButton: { * text: "Open X tool", * tooltip: "X Tool", From 04085d7161f1d105f9cbe86bef10d4ecb28125ff Mon Sep 17 00:00:00 2001 From: Nanda Date: Thu, 27 Apr 2023 15:21:20 +1000 Subject: [PATCH 164/654] Update CHANGES.md --- CHANGES.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGES.md b/CHANGES.md index dab0c95ba50..bcc7d84cc0f 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -6,7 +6,7 @@ - Add `EPSG:7844` to `Proj4Definitions`. - TSify `Proj4Definitions` and `Reproject` modules. - Update the docs for `excludeMembers`: mention the group/item id support -- Simplifies `MapToolbar` API. +- Simplified `MapToolbar` API. - [The next improvement] #### 8.2.27 - 2023-04-05 From 2c2f61d5fc81553992728748975bdfe00bbcecf5 Mon Sep 17 00:00:00 2001 From: Nanda Date: Fri, 28 Apr 2023 13:52:44 +1000 Subject: [PATCH 165/654] Release version to 8.2.28. Release ticket: https://github.com/TerriaJS/terriajs/issues/6757 --- CHANGES.md | 7 +++++-- package.json | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index eeb78f38e6e..67e2a80eeac 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,6 +1,10 @@ # Change Log -#### next release (8.2.28) +#### next release (8.2.29) + +- [The next improvement] + +#### 8.2.28 - 2023-04-28 - Refactored TerriaViewer to expose a promise `terriaViewer.viewerLoadPromise` for async loading of viewers. - Fix location point ideal zoom bug in 3D mode map. @@ -8,7 +12,6 @@ - TSify `Proj4Definitions` and `Reproject` modules. - Update the docs for `excludeMembers`: mention the group/item id support - Simplified `MapToolbar` API. -- [The next improvement] #### 8.2.27 - 2023-04-05 diff --git a/package.json b/package.json index 2efa478449a..09e990aae63 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "terriajs", - "version": "8.2.27", + "version": "8.2.28", "description": "Geospatial data visualization platform.", "license": "Apache-2.0", "engines": { From 6ea35c81eb9a4d1718433fcfc63c912d84c644db Mon Sep 17 00:00:00 2001 From: Nanda Date: Tue, 2 May 2023 12:20:26 +1000 Subject: [PATCH 166/654] Fix app crash when rendering feature info with a custom title. --- CHANGES.md | 1 + .../FeatureInfo/FeatureInfoSection.tsx | 3 ++- test/ReactViews/FeatureInfoSectionSpec.tsx | 22 +++++++++++++++++++ 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/CHANGES.md b/CHANGES.md index 67e2a80eeac..6ad458a4de1 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -2,6 +2,7 @@ #### next release (8.2.29) +- Fix app crash when rendering feature info with a custom title. - [The next improvement] #### 8.2.28 - 2023-04-28 diff --git a/lib/ReactViews/FeatureInfo/FeatureInfoSection.tsx b/lib/ReactViews/FeatureInfo/FeatureInfoSection.tsx index ec4f7e9c9b2..652ea15fa03 100644 --- a/lib/ReactViews/FeatureInfo/FeatureInfoSection.tsx +++ b/lib/ReactViews/FeatureInfo/FeatureInfoSection.tsx @@ -396,7 +396,8 @@ export class FeatureInfoSection extends React.Component { if (this.props.catalogItem.featureInfoTemplate.name) { title = Mustache.render( this.props.catalogItem.featureInfoTemplate.name, - this.featureProperties + this.mustacheContextData, + this.props.catalogItem.featureInfoTemplate.partials ); } else title = diff --git a/test/ReactViews/FeatureInfoSectionSpec.tsx b/test/ReactViews/FeatureInfoSectionSpec.tsx index 0173f6f871d..dd6e959fad5 100644 --- a/test/ReactViews/FeatureInfoSectionSpec.tsx +++ b/test/ReactViews/FeatureInfoSectionSpec.tsx @@ -305,6 +305,7 @@ describe("FeatureInfoSection", function () { feature = new Entity({ name: "Vapid" }); + const section = ( {}} + /> + ); + const result = createWithContexts(viewState, section); + expect(findWithText(result, "Title ").length).toEqual(1); + }); + it("shows properties if no description", function () { // Tests both static and potentially time-varying properties. feature = new Entity({ From 88cf8f6e309ff561f8a940e1b4b22f45adbe99f9 Mon Sep 17 00:00:00 2001 From: Zoran Kokeza Date: Thu, 4 May 2023 13:14:42 +0200 Subject: [PATCH 167/654] organize imports --- lib/ReactViews/Map/BottomBar/BottomBar.tsx | 4 ++-- lib/ReactViews/Map/BottomBar/LocationBar.tsx | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/lib/ReactViews/Map/BottomBar/BottomBar.tsx b/lib/ReactViews/Map/BottomBar/BottomBar.tsx index 5e04dc4b151..1ce3331cefe 100644 --- a/lib/ReactViews/Map/BottomBar/BottomBar.tsx +++ b/lib/ReactViews/Map/BottomBar/BottomBar.tsx @@ -1,7 +1,7 @@ -import React, { VFC } from "react"; +import { VFC } from "react"; import Box from "../../../Styled/Box"; -import { MapCredits } from "./Credits"; import { useViewState } from "../../Context"; +import { MapCredits } from "./Credits"; import { DistanceLegend } from "./DistanceLegend"; import { LocationBar } from "./LocationBar"; diff --git a/lib/ReactViews/Map/BottomBar/LocationBar.tsx b/lib/ReactViews/Map/BottomBar/LocationBar.tsx index 4d5e0d869b9..0eb8b42a2c7 100644 --- a/lib/ReactViews/Map/BottomBar/LocationBar.tsx +++ b/lib/ReactViews/Map/BottomBar/LocationBar.tsx @@ -1,11 +1,10 @@ import { observer } from "mobx-react"; -import React, { FC, RefObject, useEffect, useRef } from "react"; +import { FC, RefObject, useEffect, useRef } from "react"; import { useTranslation } from "react-i18next"; import styled, { useTheme } from "styled-components"; import MouseCoords from "../../../ReactViewModels/MouseCoords"; import Box from "../../../Styled/Box"; import { RawButton } from "../../../Styled/Button"; -import { TextSpan } from "../../../Styled/Text"; interface ILocationBarProps { mouseCoords: MouseCoords; From 4f9c4b8f3546179e5dfc6681933b8e4f766baa40 Mon Sep 17 00:00:00 2001 From: Nanda Date: Mon, 8 May 2023 15:21:34 +1000 Subject: [PATCH 168/654] Fix call to `setInterval()`. --- lib/ReactViews/Workbench/Controls/TimerSection.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/ReactViews/Workbench/Controls/TimerSection.jsx b/lib/ReactViews/Workbench/Controls/TimerSection.jsx index 15f638b0a56..2ec752317f9 100644 --- a/lib/ReactViews/Workbench/Controls/TimerSection.jsx +++ b/lib/ReactViews/Workbench/Controls/TimerSection.jsx @@ -64,7 +64,7 @@ class TimerSection extends React.Component { this.setState({ secondsLeft: this.getCountdownDuration() }); - this.interval = setInterval(this.countdown, 1000); + this.interval = setInterval(() => this.countdown, 1000); } getCountdownString() { From 66a2b742056c7173b5085013ad082897d66b4682 Mon Sep 17 00:00:00 2001 From: Nanda Date: Mon, 8 May 2023 15:49:09 +1000 Subject: [PATCH 169/654] Fix `TimerSection` (again). --- lib/ReactViews/Workbench/Controls/TimerSection.jsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/ReactViews/Workbench/Controls/TimerSection.jsx b/lib/ReactViews/Workbench/Controls/TimerSection.jsx index 2ec752317f9..e6a0d07399f 100644 --- a/lib/ReactViews/Workbench/Controls/TimerSection.jsx +++ b/lib/ReactViews/Workbench/Controls/TimerSection.jsx @@ -49,9 +49,9 @@ class TimerSection extends React.Component { // Ticks down the countdown clock countdown() { if (this.state.secondsLeft > 0) { - this.setState(() => { + this.setState((state) => { return { - secondsLeft: this.state.secondsLeft - 1 + secondsLeft: state.secondsLeft - 1 }; }); } else { @@ -64,7 +64,7 @@ class TimerSection extends React.Component { this.setState({ secondsLeft: this.getCountdownDuration() }); - this.interval = setInterval(() => this.countdown, 1000); + this.interval = setInterval(() => this.countdown(), 1000); } getCountdownString() { From 1f36b7a1ee885ddb9446b13c10f75f52c99fd4e3 Mon Sep 17 00:00:00 2001 From: Nanda Date: Wed, 3 May 2023 13:44:16 +1000 Subject: [PATCH 170/654] Add a template trait for generating custom ckan resource-id. This can be useful when the resource id from the CKAN service is unstable and we want to define the ID in terms of some other attribute that is more stable. --- lib/Models/Catalog/Ckan/CkanCatalogGroup.ts | 55 +++++++++++- .../TraitsClasses/CkanCatalogGroupTraits.ts | 17 ++++ .../Catalog/Ckan/CkanCatalogGroupSpec.ts | 85 +++++++++++++++++++ 3 files changed, 154 insertions(+), 3 deletions(-) diff --git a/lib/Models/Catalog/Ckan/CkanCatalogGroup.ts b/lib/Models/Catalog/Ckan/CkanCatalogGroup.ts index f095c160a0c..f7279c7765e 100644 --- a/lib/Models/Catalog/Ckan/CkanCatalogGroup.ts +++ b/lib/Models/Catalog/Ckan/CkanCatalogGroup.ts @@ -1,5 +1,12 @@ import i18next from "i18next"; -import { action, computed, observable, runInAction } from "mobx"; +import { + action, + computed, + observable, + runInAction, + isObservableArray +} from "mobx"; +import Mustache from "mustache"; import URI from "urijs"; import flatten from "../../../Core/flatten"; import isDefined from "../../../Core/isDefined"; @@ -346,7 +353,6 @@ export class CkanServerStratum extends LoadableStratum(CkanCatalogGroupTraits) { const { resource, format } = filteredResources[i]; const itemId = this.getItemId(ckanDataset, resource); - let item = this._catalogGroup.terria.getModelById( CkanItemReference, itemId @@ -409,7 +415,50 @@ export class CkanServerStratum extends LoadableStratum(CkanCatalogGroupTraits) { @action getItemId(ckanDataset: CkanDataset, resource: CkanResource) { - return `${this._catalogGroup.uniqueId}/${ckanDataset.id}/${resource.id}`; + const resourceId = this.buildResourceId(ckanDataset, resource); + return `${this._catalogGroup.uniqueId}/${ckanDataset.id}/${resourceId}`; + } + + /** + * Build an ID for the given resource using the `resourceIdTemplate` if available. + */ + private buildResourceId(ckanDataset: CkanDataset, resource: CkanResource) { + const resourceIdTemplate = this.resourceIdTemplateForOrg( + ckanDataset.organization?.name + ); + const resourceId = resourceIdTemplate + ? // Use mustache to construct the resource id from template. Also delete any `/` + // character in the resulting ID to avoid conflict with the path separator. + Mustache.render(resourceIdTemplate, { resource }).replace("/", "") + : resource.id; + return resourceId; + } + + /** + * Returns a template for constructing alternate resourceId for the given + * organisation or `undefined` when no template is defined. + */ + private resourceIdTemplateForOrg( + orgName: string | undefined + ): string | undefined { + const template = this._catalogGroup.resourceIdTemplate; + // No template defined + if (!template) { + return undefined; + } + + const restrictedOrgNames = + this._catalogGroup.restrictResourceIdTemplateToOrgsWithNames; + if ( + Array.isArray(restrictedOrgNames) || + isObservableArray(restrictedOrgNames) + ) { + // Use of template restricted by org names - return template only if this org is in the list + return restrictedOrgNames.includes(orgName) ? template : undefined; + } + + // Template usage has no restrictions - return template for any org + return template; } } diff --git a/lib/Traits/TraitsClasses/CkanCatalogGroupTraits.ts b/lib/Traits/TraitsClasses/CkanCatalogGroupTraits.ts index 2566339852f..9e8e485abb9 100644 --- a/lib/Traits/TraitsClasses/CkanCatalogGroupTraits.ts +++ b/lib/Traits/TraitsClasses/CkanCatalogGroupTraits.ts @@ -7,6 +7,7 @@ import CkanSharedTraits from "./CkanSharedTraits"; import GroupTraits from "./GroupTraits"; import LegendOwnerTraits from "./LegendOwnerTraits"; import UrlTraits from "./UrlTraits"; +import primitiveArrayTrait from "../Decorators/primitiveArrayTrait"; export default class CkanCatalogGroupTraits extends mixTraits( GroupTraits, @@ -68,4 +69,20 @@ export default class CkanCatalogGroupTraits extends mixTraits( description: `True to remove inactive datasets. Where \`state = "deleted"\` (CKAN official), \`state === "draft"\` (CKAN official) or \`data_state === "inactive"\` (Data.gov.au CKAN).` }) excludeInactiveDatasets: boolean = true; + + @primitiveTrait({ + type: "string", + name: "Resource ID template string.", + description: + "A Mustache formatted template string for generating a custom resource id from resource description. By default we use `resource.id` as the ID of the CKAN item but some CKAN services change their resource IDs frequently which can break terria features link share links or catalog search indexing. You can use `customResourceIdTemplate` to instruct terria to construct a different ID instead of the default `resource.id`. The template string will receive the entire `resource` as a template variable. Example usage: '{{resource.name}}-{{resource.format}}'." + }) + resourceIdTemplate?: string; + + @primitiveArrayTrait({ + type: "string", + name: "Restrict resource id template to organization with names", + description: + "Names of organisations for which `customResourceIdTemplate` should be used." + }) + restrictResourceIdTemplateToOrgsWithNames?: string[]; } diff --git a/test/Models/Catalog/Ckan/CkanCatalogGroupSpec.ts b/test/Models/Catalog/Ckan/CkanCatalogGroupSpec.ts index 6ac9665349f..b631625e1a4 100644 --- a/test/Models/Catalog/Ckan/CkanCatalogGroupSpec.ts +++ b/test/Models/Catalog/Ckan/CkanCatalogGroupSpec.ts @@ -1,8 +1,10 @@ import i18next from "i18next"; import { configure, runInAction } from "mobx"; +import { CatalogMemberMixin } from "terriajs-plugin-api"; import URI from "urijs"; import { JsonObject } from "../../../../lib/Core/Json"; import _loadWithXhr from "../../../../lib/Core/loadWithXhr"; +import GroupMixin from "../../../../lib/ModelMixins/GroupMixin"; import CatalogGroup from "../../../../lib/Models/Catalog/CatalogGroup"; import CkanCatalogGroup, { CkanServerStratum @@ -610,4 +612,87 @@ describe("CkanCatalogGroup", function () { expect(group1.memberModels.length).toBe(13); }); }); + + describe("when `resourceIdTemplate` is given", function () { + beforeEach(async function () { + runInAction(() => { + ckanCatalogGroup.setTrait( + "definition", + "url", + "test/CKAN/search-result.json" + ); + }); + }); + + it("uses it for generating a custom item id for the resource item", async function () { + ckanCatalogGroup.setTrait( + CommonStrata.definition, + "resourceIdTemplate", + "{{resource.name}}-{{resource.format}}" + ); + await ckanCatalogGroup.loadMembers(); + const group = ckanCatalogGroup.memberModels[0] as GroupMixin.Instance; + expect(group.memberModels[0].uniqueId).toBe( + "test/3245ad6c-cc00-4404-ba1f-476c07b5f762/WMS (OGC)-WMS" + ); + }); + + describe("when `restrictResourceIdTemplateToOrgsWithNames` is given", function () { + it("uses `resourceIdTemplate` for generating resource id for organizations in the list", async function () { + ckanCatalogGroup.setTrait( + CommonStrata.definition, + "resourceIdTemplate", + "{{resource.name}}-{{resource.format}}" + ); + ckanCatalogGroup.setTrait( + CommonStrata.definition, + "restrictResourceIdTemplateToOrgsWithNames", + ["doee"] // apply template only for DOEE org + ); + ckanCatalogGroup.setTrait("definition", "groupBy", "organization"); + await ckanCatalogGroup.loadMembers(); + + const doeeGroup = ckanCatalogGroup + .memberModels[0] as GroupMixin.Instance & CatalogMemberMixin.Instance; + expect(doeeGroup).toBeDefined(); + expect(doeeGroup.name).toBe("Department of the Environment and Energy"); + // Template used for generating ID for DOEE resource + expect(doeeGroup.memberModels[0].uniqueId).toBe( + "test/3245ad6c-cc00-4404-ba1f-476c07b5f762/WMS (OGC)-WMS" + ); + const anotherGroup = ckanCatalogGroup + .memberModels[1] as GroupMixin.Instance & CatalogMemberMixin.Instance; + expect(anotherGroup).toBeDefined(); + // Template not used for generating ID for MDBA resource + expect(anotherGroup.name).toBe("Murray-Darling Basin Authority"); + expect(anotherGroup.memberModels[0].uniqueId).toBe( + "test/7b0c274f-7f12-4062-9e54-5b8227ca20c4/49e8da1c-1ce6-4008-bdcb-af8552a305c2" + ); + }); + + it("does NOT uses `resourceIdTemplate` for generating resource id for organizations NOT in the list", async function () { + ckanCatalogGroup.setTrait( + CommonStrata.definition, + "resourceIdTemplate", + "{{resource.name}}-{{resource.format}}" + ); + ckanCatalogGroup.setTrait( + CommonStrata.definition, + "restrictResourceIdTemplateToOrgsWithNames", + ["doee"] // apply template only for DOEE org + ); + ckanCatalogGroup.setTrait("definition", "groupBy", "organization"); + await ckanCatalogGroup.loadMembers(); + + const mdbaGroup = ckanCatalogGroup + .memberModels[1] as GroupMixin.Instance & CatalogMemberMixin.Instance; + expect(mdbaGroup).toBeDefined(); + // Template not used for generating ID for MDBA resource + expect(mdbaGroup.name).toBe("Murray-Darling Basin Authority"); + expect(mdbaGroup.memberModels[0].uniqueId).toBe( + "test/7b0c274f-7f12-4062-9e54-5b8227ca20c4/49e8da1c-1ce6-4008-bdcb-af8552a305c2" + ); + }); + }); + }); }); From 17464b042b1926f20ecacbf3a89d6a11a7bc5b13 Mon Sep 17 00:00:00 2001 From: Nanda Date: Wed, 10 May 2023 13:39:35 +1000 Subject: [PATCH 171/654] Decorating componentDidMount with action causes mobx to throw an error. Need further investigation of the root cause. --- lib/ReactViews/Tools/DiffTool/DiffTool.tsx | 33 +++++++++++----------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/lib/ReactViews/Tools/DiffTool/DiffTool.tsx b/lib/ReactViews/Tools/DiffTool/DiffTool.tsx index 66d8b0f3feb..60ad3919660 100644 --- a/lib/ReactViews/Tools/DiffTool/DiffTool.tsx +++ b/lib/ReactViews/Tools/DiffTool/DiffTool.tsx @@ -464,23 +464,24 @@ class Main extends React.Component { } } - @action - async componentDidMount() { - if (this.location === undefined) { - const { latitude, longitude, height } = - this.diffItem.timeFilterCoordinates; - if (latitude !== undefined && longitude !== undefined) { - this.location = { - latitude, - longitude, - height - }; - // remove any active search location marker to avoid showing two markers - removeMarker(this.props.terria); - } else { - await this.setLocationFromActiveSearch(); + componentDidMount() { + runInAction(() => { + if (this.location === undefined) { + const { latitude, longitude, height } = + this.diffItem.timeFilterCoordinates; + if (latitude !== undefined && longitude !== undefined) { + this.location = { + latitude, + longitude, + height + }; + // remove any active search location marker to avoid showing two markers + removeMarker(this.props.terria); + } else { + this.setLocationFromActiveSearch(); + } } - } + }); } // i want to restructure the render so that there's 2 distinct "showing diff" From 6940b0d685e8256e0aa3fba1cf08fcd79e75d7d6 Mon Sep 17 00:00:00 2001 From: Nanda Date: Thu, 11 May 2023 13:16:52 +1000 Subject: [PATCH 172/654] Add test case to ensure stripping '/' char from resource id. --- test/Models/Catalog/Ckan/CkanCatalogGroupSpec.ts | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/test/Models/Catalog/Ckan/CkanCatalogGroupSpec.ts b/test/Models/Catalog/Ckan/CkanCatalogGroupSpec.ts index b631625e1a4..7b65cef0c66 100644 --- a/test/Models/Catalog/Ckan/CkanCatalogGroupSpec.ts +++ b/test/Models/Catalog/Ckan/CkanCatalogGroupSpec.ts @@ -637,6 +637,19 @@ describe("CkanCatalogGroup", function () { ); }); + it("ensures that the generated resource-id does not contain `/` character (to avoid clashing with id path character)", async function () { + ckanCatalogGroup.setTrait( + CommonStrata.definition, + "resourceIdTemplate", + "{{resource.name}}-{{resource.format}}/something" + ); + await ckanCatalogGroup.loadMembers(); + const group = ckanCatalogGroup.memberModels[0] as GroupMixin.Instance; + expect(group.memberModels[0].uniqueId).toBe( + "test/3245ad6c-cc00-4404-ba1f-476c07b5f762/WMS (OGC)-WMSsomething" + ); + }); + describe("when `restrictResourceIdTemplateToOrgsWithNames` is given", function () { it("uses `resourceIdTemplate` for generating resource id for organizations in the list", async function () { ckanCatalogGroup.setTrait( From d66cac722a8d54499c4fe439cc823af165dbeb5c Mon Sep 17 00:00:00 2001 From: Staf Smith Date: Thu, 11 May 2023 11:31:41 +0800 Subject: [PATCH 173/654] Return valid camera def when no horizon visible --- lib/Models/Cesium.ts | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/lib/Models/Cesium.ts b/lib/Models/Cesium.ts index 040dc8a48a7..f9ec685f16e 100644 --- a/lib/Models/Cesium.ts +++ b/lib/Models/Cesium.ts @@ -1004,13 +1004,23 @@ export default class Cesium extends GlobeOrMap { const centerOfScreen = new Cartesian2(width / 2.0, height / 2.0); const pickRay = scene.camera.getPickRay(centerOfScreen); const center = isDefined(pickRay) - ? scene.globe.pick(pickRay, scene) + ? scene.globe.pick(pickRay, scene) // will be undefined if we are facing above the horizon : undefined; if (!center) { - // TODO: binary search to find the horizon point and use that as the center. - return this.terriaViewer.homeCamera; // This is just a random rectangle. Replace it when there's a home view available - // return this.terria.homeView.rectangle; + /** TODO: binary search to find the horizon point and use that as the center. + This will give a real `center` for camera views where the horizon is visible. + But this will not be possible if camera is facing upwards and the horizon is not visible. + So we need to return a useful CameraView that works in 3D mode and 2D mode. + In this case return the correct definition for the cesium camera, with position, direction, and up, + but for the required `rectangle` property, that will only be used when switching to 2D mode, provide the homeCamera view extent. + **/ + return new CameraView( + this.terriaViewer.homeCamera.rectangle, + camera.positionWC, + camera.directionWC, + camera.upWC + ); } const ellipsoid = this.scene.globe.ellipsoid; From 40b05f56dbab1861fe270502a5b21bff5b53a7f7 Mon Sep 17 00:00:00 2001 From: Nanda Date: Thu, 11 May 2023 13:36:53 +1000 Subject: [PATCH 174/654] Fix import path. --- test/Models/Catalog/Ckan/CkanCatalogGroupSpec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/Models/Catalog/Ckan/CkanCatalogGroupSpec.ts b/test/Models/Catalog/Ckan/CkanCatalogGroupSpec.ts index 7b65cef0c66..05fc1141218 100644 --- a/test/Models/Catalog/Ckan/CkanCatalogGroupSpec.ts +++ b/test/Models/Catalog/Ckan/CkanCatalogGroupSpec.ts @@ -1,9 +1,9 @@ import i18next from "i18next"; import { configure, runInAction } from "mobx"; -import { CatalogMemberMixin } from "terriajs-plugin-api"; import URI from "urijs"; import { JsonObject } from "../../../../lib/Core/Json"; import _loadWithXhr from "../../../../lib/Core/loadWithXhr"; +import CatalogMemberMixin from "../../../../lib/ModelMixins/CatalogMemberMixin"; import GroupMixin from "../../../../lib/ModelMixins/GroupMixin"; import CatalogGroup from "../../../../lib/Models/Catalog/CatalogGroup"; import CkanCatalogGroup, { From f269b9586400565730fa88334e8662a360052937 Mon Sep 17 00:00:00 2001 From: Nanda Date: Thu, 11 May 2023 13:38:20 +1000 Subject: [PATCH 175/654] Update CHANGES.md. --- CHANGES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES.md b/CHANGES.md index 6ad458a4de1..06fab8ad76a 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -3,6 +3,7 @@ #### next release (8.2.29) - Fix app crash when rendering feature info with a custom title. +- Added new `CkanCatalogGroup` traits `resourceIdTemplate` and `restrictResourceIdTemplateToOrgsWithNames` to generate custom resource IDs for CKAN resources with unstable IDs. - [The next improvement] #### 8.2.28 - 2023-04-28 From e043699682c4aeb49a9a924e6bb0a474f57c97de Mon Sep 17 00:00:00 2001 From: Staf Smith Date: Thu, 11 May 2023 11:59:32 +0800 Subject: [PATCH 176/654] Update changelog --- CHANGES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES.md b/CHANGES.md index 6ad458a4de1..a1a36187237 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -3,6 +3,7 @@ #### next release (8.2.29) - Fix app crash when rendering feature info with a custom title. +- Fixed bug where sharelinks created with no visible horizon would default to homeCamera view - [The next improvement] #### 8.2.28 - 2023-04-28 From 53541ba1d4cab42ab172f3f9c627f1937b1b783d Mon Sep 17 00:00:00 2001 From: Stephen Davies Date: Thu, 11 May 2023 16:31:07 +0930 Subject: [PATCH 177/654] Swap out removed function isObservableArray --- lib/ReactViews/Preview/MetadataTable.jsx | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/lib/ReactViews/Preview/MetadataTable.jsx b/lib/ReactViews/Preview/MetadataTable.jsx index 803a2aad5b8..89ba5d80ba4 100644 --- a/lib/ReactViews/Preview/MetadataTable.jsx +++ b/lib/ReactViews/Preview/MetadataTable.jsx @@ -1,5 +1,5 @@ import React from "react"; -import { isArrayLike } from "mobx"; +import { isObservableArray } from "mobx"; import createReactClass from "create-react-class"; import PropTypes from "prop-types"; @@ -19,7 +19,8 @@ const MetadataTable = createReactClass({ render() { const metadataItem = this.props.metadataItem; const keys = Object.keys(metadataItem); - const isArr = isArrayLike(metadataItem); + const isArr = + Array.isArray(metadataItem) || isObservableArray(metadataItem); if (keys.length === 0 && !isArr) return null; return ( @@ -47,7 +48,12 @@ const MetadataTable = createReactClass({ - + 0 && From c33e958fea86ff05e342c6e3b5dac0831c205ce9 Mon Sep 17 00:00:00 2001 From: Nanda Date: Fri, 12 May 2023 12:05:08 +1000 Subject: [PATCH 178/654] Fix accessType resolution for MagdaReference. This change ensures that when `magdaRecord` is not set use the default Terria accessType resolution implemented by AccessControlMixin. --- lib/ModelMixins/AccessControlMixin.ts | 40 +++++++++++++++---- .../CatalogReferences/MagdaReference.ts | 14 +++++-- test/Models/MagdaReferenceSpec.ts | 28 +++++++++++-- 3 files changed, 67 insertions(+), 15 deletions(-) diff --git a/lib/ModelMixins/AccessControlMixin.ts b/lib/ModelMixins/AccessControlMixin.ts index 721edcf11bc..c1ae7f5d7fb 100644 --- a/lib/ModelMixins/AccessControlMixin.ts +++ b/lib/ModelMixins/AccessControlMixin.ts @@ -5,6 +5,18 @@ import ModelTraits from "../Traits/ModelTraits"; type AccessControlModel = Model; +/** + * API for setting an access type for the model. Note that the intended use of + * this mixin is just to flag public and private models differently in the UI + * and does not provide any security guarantees. + * + * The implementation is a bit fluid and maybe that makes it a bit hard to + * reason about because we are not strongly typing the possible values for + * `accessType`. For use in frontend, we formally recognizes only one acessType + * which is "public". All other access type values are treated as "private". The + * models overriding this mixin are free to choose any other string valued + * access type for their own purpose. + */ function AccessControlMixin>( Base: T ) { @@ -16,20 +28,25 @@ function AccessControlMixin>( } /** - * Returns the accessType for this model, default is public - * Models can override this method to return access type differently + * Resolve accessType for this model in the following order: + * 1. Return the access type that was set on this model by explicitly calling setAccessType() + * 2. If this model is referenced by another, return the access type of the referrer + * 3. Return the access type of a parent with valid access type + * 4. If none of the above works - return "public" */ @computed get accessType(): string { - if (this._accessType) return this._accessType; + // Return the explicitly set accessType + if (this._accessType) { + return this._accessType; + } + // Return the accessType of the referrer. if (AccessControlMixin.isMixedInto(this.sourceReference)) { - // This item is the target of a reference item, return the accessType - // of the reference item. return this.sourceReference.accessType; } - // Try and return the parents accessType + // Try and return any ancestor's accessType if (this.knownContainerUniqueIds.length > 0) { const parentId = this.knownContainerUniqueIds[0]; const parent = @@ -39,21 +56,28 @@ function AccessControlMixin>( } } - // default + // Default return "public"; } - /* TODO: check if we actually need provision to explcitly set accessType */ @action setAccessType(accessType: string) { this._accessType = accessType; } + /** + * Returns true if this model public. + */ @computed get isPublic() { return this.accessType === "public"; } + /** + * Returns true if this model is private. + * + * Note that any accessType other than "public" is treated as private. + */ @computed get isPrivate() { return this.accessType !== "public"; diff --git a/lib/Models/Catalog/CatalogReferences/MagdaReference.ts b/lib/Models/Catalog/CatalogReferences/MagdaReference.ts index 70bef75e050..32da3c14f05 100644 --- a/lib/Models/Catalog/CatalogReferences/MagdaReference.ts +++ b/lib/Models/Catalog/CatalogReferences/MagdaReference.ts @@ -160,8 +160,14 @@ export default class MagdaReference extends AccessControlMixin( @computed get accessType(): string { - const access = getAccessTypeFromMagdaRecord(this.magdaRecord); - return access || super.accessType; + return this.magdaRecordAcessType ?? super.accessType; + } + + @computed + private get magdaRecordAcessType(): string | undefined { + return this.magdaRecord + ? getAccessTypeFromMagdaRecord(this.magdaRecord) + : undefined; } protected async forceLoadReference( @@ -861,7 +867,9 @@ const prepareDistributionFormat = createTransformer( } ); -function getAccessTypeFromMagdaRecord(magdaRecord: any): string { +function getAccessTypeFromMagdaRecord( + magdaRecord: Record +): string { const record = toJS(magdaRecord); // Magda V2 access control has higher priority. diff --git a/test/Models/MagdaReferenceSpec.ts b/test/Models/MagdaReferenceSpec.ts index 6ea857556f7..58646bba3d6 100644 --- a/test/Models/MagdaReferenceSpec.ts +++ b/test/Models/MagdaReferenceSpec.ts @@ -1,14 +1,12 @@ import { runInAction } from "mobx"; import CatalogGroup from "../../lib/Models/Catalog/CatalogGroup"; -import CommonStrata from "../../lib/Models/Definition/CommonStrata"; import CsvCatalogItem from "../../lib/Models/Catalog/CatalogItems/CsvCatalogItem"; import GeoJsonCatalogItem from "../../lib/Models/Catalog/CatalogItems/GeoJsonCatalogItem"; import MagdaReference from "../../lib/Models/Catalog/CatalogReferences/MagdaReference"; -import Terria from "../../lib/Models/Terria"; import WebMapServiceCatalogGroup from "../../lib/Models/Catalog/Ows/WebMapServiceCatalogGroup"; +import CommonStrata from "../../lib/Models/Definition/CommonStrata"; import updateModelFromJson from "../../lib/Models/Definition/updateModelFromJson"; -import upsertModelFromJson from "../../lib/Models/Definition/upsertModelFromJson"; -import CatalogMemberFactory from "../../lib/Models/Catalog/CatalogMemberFactory"; +import Terria from "../../lib/Models/Terria"; describe("MagdaReference", function () { const recordGroupWithOneCsv = { @@ -565,5 +563,27 @@ describe("MagdaReference", function () { expect(reference.accessType === "public").toBeTruthy(); done(); }); + + it("returns `super.accessType` when magdaRecord is unset", function () { + const terria = new Terria(); + const reference = new MagdaReference("magda-reference", terria); + reference.setAccessType("foo-doesnt-matter"); + reference.setTrait(CommonStrata.definition, "recordId", "test id"); + reference.setTrait(CommonStrata.definition, "magdaRecord", { + id: "test id", + name: "Test", + aspects: { + "access-control": { + orgUnitId: "some org id", + constraintExemption: false + } + } + }); + // Picks up the access type from magdaRecord settings + expect(reference.accessType).toBe("non-public"); + reference.setTrait(CommonStrata.definition, "magdaRecord", undefined); + // Reverts to whatever accessType value is returned by super.accessType + expect(reference.accessType).toBe("foo-doesnt-matter"); + }); }); }); From aa70e64f629881897ef3e6c091bb233365ef0e86 Mon Sep 17 00:00:00 2001 From: Nanda Date: Fri, 12 May 2023 12:09:32 +1000 Subject: [PATCH 179/654] Update CHANGES.md. --- CHANGES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES.md b/CHANGES.md index 6ad458a4de1..5b8bd7e6086 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -3,6 +3,7 @@ #### next release (8.2.29) - Fix app crash when rendering feature info with a custom title. +- Fix `acessType` resolution for `MagdaReference` so that it uses the default terria resolution strategy when `magdaRecord` is not defined. - [The next improvement] #### 8.2.28 - 2023-04-28 From 9f33e7254239dd82a742784bb095fa7a0451228f Mon Sep 17 00:00:00 2001 From: Staf Smith Date: Fri, 12 May 2023 11:54:40 +0800 Subject: [PATCH 180/654] Clone camera, point down, calc view --- lib/Models/Cesium.ts | 37 ++++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/lib/Models/Cesium.ts b/lib/Models/Cesium.ts index f9ec685f16e..bffaa49d946 100644 --- a/lib/Models/Cesium.ts +++ b/lib/Models/Cesium.ts @@ -88,6 +88,7 @@ import GlobeOrMap from "./GlobeOrMap"; import Terria from "./Terria"; import UserDrawing from "./UserDrawing"; import { setViewerMode } from "./ViewerMode"; +import { clone } from "terriajs-cesium"; //import Cesium3DTilesInspector from "terriajs-cesium/Source/Widgets/Cesium3DTilesInspector/Cesium3DTilesInspector"; @@ -994,6 +995,22 @@ export default class Cesium extends GlobeOrMap { }; } + /** + * Helper method to clone a camera object + * @param camera + * @returns Camera + */ + cloneCamera(camera: Camera): Camera { + let result = new Camera(this.scene); + Cartesian3.clone(camera.position, result.position); + Cartesian3.clone(camera.direction, result.direction); + Cartesian3.clone(camera.up, result.up); + Cartesian3.clone(camera.right, result.right); + Matrix4.clone(camera.transform, result.transform); + result.frustum = camera.frustum.clone(); + return result; + } + getCurrentCameraView(): CameraView { const scene = this.scene; const camera = scene.camera; @@ -1015,8 +1032,26 @@ export default class Cesium extends GlobeOrMap { In this case return the correct definition for the cesium camera, with position, direction, and up, but for the required `rectangle` property, that will only be used when switching to 2D mode, provide the homeCamera view extent. **/ + + // Create a dummy Camera + const cameraClone = this.cloneCamera(camera); + + // Rotate Camera straight down + cameraClone.setView({ + orientation: { + heading: 0.0, + pitch: -CesiumMath.PI_OVER_TWO, + roll: 0.0 + } + }); + + // Compute the bounding box on the ellipsoid + const rectangleFor2dView = cameraClone.computeViewRectangle( + this.scene.globe.ellipsoid + ); + return new CameraView( - this.terriaViewer.homeCamera.rectangle, + rectangleFor2dView || this.terriaViewer.homeCamera.rectangle, //TODO: Is this fallback appropriate? camera.positionWC, camera.directionWC, camera.upWC From 456ac57ed46e2a15a25fd46fed7d1b5dcc9f0e25 Mon Sep 17 00:00:00 2001 From: Staf Smith Date: Mon, 15 May 2023 13:08:19 +0800 Subject: [PATCH 181/654] Add comments --- lib/Models/Cesium.ts | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/lib/Models/Cesium.ts b/lib/Models/Cesium.ts index bffaa49d946..0d67f6aa784 100644 --- a/lib/Models/Cesium.ts +++ b/lib/Models/Cesium.ts @@ -1025,18 +1025,19 @@ export default class Cesium extends GlobeOrMap { : undefined; if (!center) { - /** TODO: binary search to find the horizon point and use that as the center. - This will give a real `center` for camera views where the horizon is visible. - But this will not be possible if camera is facing upwards and the horizon is not visible. - So we need to return a useful CameraView that works in 3D mode and 2D mode. - In this case return the correct definition for the cesium camera, with position, direction, and up, - but for the required `rectangle` property, that will only be used when switching to 2D mode, provide the homeCamera view extent. + debugger; + /** In cases where the horizon is not visible, we cannot calculate a center using a pick ray, + but we need to return a useful CameraView that works in 3D mode and 2D mode. + In this case we can return the correct definition for the cesium camera, with position, direction, and up, + but we need to calculate a bounding box on the ellipsoid too to be used in 2D mode. + + To do this we clone the camera, rotate it to point straight down, and project the camera view from that position onto the ellipsoid. **/ - // Create a dummy Camera + // Clone the camera const cameraClone = this.cloneCamera(camera); - // Rotate Camera straight down + // Rotate camera straight down cameraClone.setView({ orientation: { heading: 0.0, @@ -1050,6 +1051,7 @@ export default class Cesium extends GlobeOrMap { this.scene.globe.ellipsoid ); + // Return the combined CameraView object return new CameraView( rectangleFor2dView || this.terriaViewer.homeCamera.rectangle, //TODO: Is this fallback appropriate? camera.positionWC, From cbcdda2e848717cc8cd21a443c8eab7b1fa7e445 Mon Sep 17 00:00:00 2001 From: Staf Smith Date: Mon, 15 May 2023 13:09:04 +0800 Subject: [PATCH 182/654] Update changes --- CHANGES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES.md b/CHANGES.md index a1a36187237..8c349038c1d 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -4,6 +4,7 @@ - Fix app crash when rendering feature info with a custom title. - Fixed bug where sharelinks created with no visible horizon would default to homeCamera view +- Improved calculation of 2D view from 3D view when no horizon visible - [The next improvement] #### 8.2.28 - 2023-04-28 From df2c9c2c6c4cdc0e8fca0f284d2ef6956e7ddd3f Mon Sep 17 00:00:00 2001 From: Nanda Date: Fri, 12 May 2023 12:05:08 +1000 Subject: [PATCH 183/654] Fix accessType resolution for MagdaReference. This change ensures that when `magdaRecord` is not set use the default Terria accessType resolution implemented by AccessControlMixin. --- lib/ModelMixins/AccessControlMixin.ts | 40 +++++++++++++++---- .../CatalogReferences/MagdaReference.ts | 14 +++++-- test/Models/MagdaReferenceSpec.ts | 28 +++++++++++-- 3 files changed, 67 insertions(+), 15 deletions(-) diff --git a/lib/ModelMixins/AccessControlMixin.ts b/lib/ModelMixins/AccessControlMixin.ts index 721edcf11bc..c1ae7f5d7fb 100644 --- a/lib/ModelMixins/AccessControlMixin.ts +++ b/lib/ModelMixins/AccessControlMixin.ts @@ -5,6 +5,18 @@ import ModelTraits from "../Traits/ModelTraits"; type AccessControlModel = Model; +/** + * API for setting an access type for the model. Note that the intended use of + * this mixin is just to flag public and private models differently in the UI + * and does not provide any security guarantees. + * + * The implementation is a bit fluid and maybe that makes it a bit hard to + * reason about because we are not strongly typing the possible values for + * `accessType`. For use in frontend, we formally recognizes only one acessType + * which is "public". All other access type values are treated as "private". The + * models overriding this mixin are free to choose any other string valued + * access type for their own purpose. + */ function AccessControlMixin>( Base: T ) { @@ -16,20 +28,25 @@ function AccessControlMixin>( } /** - * Returns the accessType for this model, default is public - * Models can override this method to return access type differently + * Resolve accessType for this model in the following order: + * 1. Return the access type that was set on this model by explicitly calling setAccessType() + * 2. If this model is referenced by another, return the access type of the referrer + * 3. Return the access type of a parent with valid access type + * 4. If none of the above works - return "public" */ @computed get accessType(): string { - if (this._accessType) return this._accessType; + // Return the explicitly set accessType + if (this._accessType) { + return this._accessType; + } + // Return the accessType of the referrer. if (AccessControlMixin.isMixedInto(this.sourceReference)) { - // This item is the target of a reference item, return the accessType - // of the reference item. return this.sourceReference.accessType; } - // Try and return the parents accessType + // Try and return any ancestor's accessType if (this.knownContainerUniqueIds.length > 0) { const parentId = this.knownContainerUniqueIds[0]; const parent = @@ -39,21 +56,28 @@ function AccessControlMixin>( } } - // default + // Default return "public"; } - /* TODO: check if we actually need provision to explcitly set accessType */ @action setAccessType(accessType: string) { this._accessType = accessType; } + /** + * Returns true if this model public. + */ @computed get isPublic() { return this.accessType === "public"; } + /** + * Returns true if this model is private. + * + * Note that any accessType other than "public" is treated as private. + */ @computed get isPrivate() { return this.accessType !== "public"; diff --git a/lib/Models/Catalog/CatalogReferences/MagdaReference.ts b/lib/Models/Catalog/CatalogReferences/MagdaReference.ts index 70bef75e050..32da3c14f05 100644 --- a/lib/Models/Catalog/CatalogReferences/MagdaReference.ts +++ b/lib/Models/Catalog/CatalogReferences/MagdaReference.ts @@ -160,8 +160,14 @@ export default class MagdaReference extends AccessControlMixin( @computed get accessType(): string { - const access = getAccessTypeFromMagdaRecord(this.magdaRecord); - return access || super.accessType; + return this.magdaRecordAcessType ?? super.accessType; + } + + @computed + private get magdaRecordAcessType(): string | undefined { + return this.magdaRecord + ? getAccessTypeFromMagdaRecord(this.magdaRecord) + : undefined; } protected async forceLoadReference( @@ -861,7 +867,9 @@ const prepareDistributionFormat = createTransformer( } ); -function getAccessTypeFromMagdaRecord(magdaRecord: any): string { +function getAccessTypeFromMagdaRecord( + magdaRecord: Record +): string { const record = toJS(magdaRecord); // Magda V2 access control has higher priority. diff --git a/test/Models/MagdaReferenceSpec.ts b/test/Models/MagdaReferenceSpec.ts index 6ea857556f7..58646bba3d6 100644 --- a/test/Models/MagdaReferenceSpec.ts +++ b/test/Models/MagdaReferenceSpec.ts @@ -1,14 +1,12 @@ import { runInAction } from "mobx"; import CatalogGroup from "../../lib/Models/Catalog/CatalogGroup"; -import CommonStrata from "../../lib/Models/Definition/CommonStrata"; import CsvCatalogItem from "../../lib/Models/Catalog/CatalogItems/CsvCatalogItem"; import GeoJsonCatalogItem from "../../lib/Models/Catalog/CatalogItems/GeoJsonCatalogItem"; import MagdaReference from "../../lib/Models/Catalog/CatalogReferences/MagdaReference"; -import Terria from "../../lib/Models/Terria"; import WebMapServiceCatalogGroup from "../../lib/Models/Catalog/Ows/WebMapServiceCatalogGroup"; +import CommonStrata from "../../lib/Models/Definition/CommonStrata"; import updateModelFromJson from "../../lib/Models/Definition/updateModelFromJson"; -import upsertModelFromJson from "../../lib/Models/Definition/upsertModelFromJson"; -import CatalogMemberFactory from "../../lib/Models/Catalog/CatalogMemberFactory"; +import Terria from "../../lib/Models/Terria"; describe("MagdaReference", function () { const recordGroupWithOneCsv = { @@ -565,5 +563,27 @@ describe("MagdaReference", function () { expect(reference.accessType === "public").toBeTruthy(); done(); }); + + it("returns `super.accessType` when magdaRecord is unset", function () { + const terria = new Terria(); + const reference = new MagdaReference("magda-reference", terria); + reference.setAccessType("foo-doesnt-matter"); + reference.setTrait(CommonStrata.definition, "recordId", "test id"); + reference.setTrait(CommonStrata.definition, "magdaRecord", { + id: "test id", + name: "Test", + aspects: { + "access-control": { + orgUnitId: "some org id", + constraintExemption: false + } + } + }); + // Picks up the access type from magdaRecord settings + expect(reference.accessType).toBe("non-public"); + reference.setTrait(CommonStrata.definition, "magdaRecord", undefined); + // Reverts to whatever accessType value is returned by super.accessType + expect(reference.accessType).toBe("foo-doesnt-matter"); + }); }); }); From e811b5e48287d6159d5ee4e10146ec89018b8b96 Mon Sep 17 00:00:00 2001 From: Nanda Date: Fri, 12 May 2023 12:09:32 +1000 Subject: [PATCH 184/654] Update CHANGES.md. --- CHANGES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES.md b/CHANGES.md index 8c349038c1d..7a404f08a41 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -5,6 +5,7 @@ - Fix app crash when rendering feature info with a custom title. - Fixed bug where sharelinks created with no visible horizon would default to homeCamera view - Improved calculation of 2D view from 3D view when no horizon visible +- Fix `acessType` resolution for `MagdaReference` so that it uses the default terria resolution strategy when `magdaRecord` is not defined. - [The next improvement] #### 8.2.28 - 2023-04-28 From 80e0aee6bc22e61145e4dad0bdcac016f6d9b02e Mon Sep 17 00:00:00 2001 From: Nanda Date: Thu, 18 May 2023 13:06:19 +1000 Subject: [PATCH 185/654] Bump version to 8.2.29. --- CHANGES.md | 7 +++++-- package.json | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 10d3051ab50..229b85e6b9a 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,11 +1,14 @@ # Change Log -#### next release (8.2.29) +#### next release (8.2.30) + +- [The next improvement] + +#### 8.2.29 - 2023-05-18 - Fix app crash when rendering feature info with a custom title. - Added new `CkanCatalogGroup` traits `resourceIdTemplate` and `restrictResourceIdTemplateToOrgsWithNames` to generate custom resource IDs for CKAN resources with unstable IDs. - Fix `acessType` resolution for `MagdaReference` so that it uses the default terria resolution strategy when `magdaRecord` is not defined. -- [The next improvement] #### 8.2.28 - 2023-04-28 diff --git a/package.json b/package.json index 09e990aae63..0767afe97d4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "terriajs", - "version": "8.2.28", + "version": "8.2.29", "description": "Geospatial data visualization platform.", "license": "Apache-2.0", "engines": { From cfeed3ff40868c4b8a0682b833f3162974163c18 Mon Sep 17 00:00:00 2001 From: Nanda Date: Mon, 22 May 2023 13:45:16 +1000 Subject: [PATCH 186/654] Update CHANGES.md. --- CHANGES.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGES.md b/CHANGES.md index 229b85e6b9a..36433bc7061 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -2,6 +2,10 @@ #### next release (8.2.30) +- **Breaking changes:** + - **Upgraded Mobx to version 6.7.x** + - **Upgrade Typescript to version 4.9.x** + These may require changes to the your custom fork of terriajs or terriamap. - [The next improvement] #### 8.2.29 - 2023-05-18 From f948352e0ad131b2c9012886373f6e4fbfbece57 Mon Sep 17 00:00:00 2001 From: Nanda Date: Mon, 22 May 2023 13:49:05 +1000 Subject: [PATCH 187/654] Update CHANGES.md --- CHANGES.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGES.md b/CHANGES.md index 36433bc7061..5c6845a8fa1 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -5,7 +5,8 @@ - **Breaking changes:** - **Upgraded Mobx to version 6.7.x** - **Upgrade Typescript to version 4.9.x** - These may require changes to the your custom fork of terriajs or terriamap. + + These changes may require modifications to the your custom fork of terriajs or terriamap. - [The next improvement] #### 8.2.29 - 2023-05-18 From fa2047d81cae67237338d6341e876559f4da17c5 Mon Sep 17 00:00:00 2001 From: Nanda Date: Mon, 22 May 2023 13:54:44 +1000 Subject: [PATCH 188/654] Prettier CHANGES.md. --- CHANGES.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 5c6845a8fa1..ac9ee71689d 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -3,10 +3,10 @@ #### next release (8.2.30) - **Breaking changes:** + - **Upgraded Mobx to version 6.7.x** - **Upgrade Typescript to version 4.9.x** - - These changes may require modifications to the your custom fork of terriajs or terriamap. + - [The next improvement] #### 8.2.29 - 2023-05-18 From 4a398d61f401b2a01abda7011a6e311bfa714a27 Mon Sep 17 00:00:00 2001 From: Nanda Date: Mon, 22 May 2023 14:12:06 +1000 Subject: [PATCH 189/654] Update CHANGES.md Fix typo --- CHANGES.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGES.md b/CHANGES.md index ac9ee71689d..ff4ec3e8bca 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -5,7 +5,7 @@ - **Breaking changes:** - **Upgraded Mobx to version 6.7.x** - - **Upgrade Typescript to version 4.9.x** + - **Upgraded Typescript to version 4.9.x** - [The next improvement] From 781405cd735c487498e9fe0f11634af8fff569e7 Mon Sep 17 00:00:00 2001 From: Nanda Date: Mon, 22 May 2023 14:41:24 +1000 Subject: [PATCH 190/654] Bump version to 8.3.0. --- CHANGES.md | 8 +++++--- package.json | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index ff4ec3e8bca..2507f2936a2 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,14 +1,16 @@ # Change Log -#### next release (8.2.30) +#### next release (8.3.1) + +- [The next improvement] + +#### 8.3.0 - 2023-05-22 - **Breaking changes:** - **Upgraded Mobx to version 6.7.x** - **Upgraded Typescript to version 4.9.x** -- [The next improvement] - #### 8.2.29 - 2023-05-18 - Fix app crash when rendering feature info with a custom title. diff --git a/package.json b/package.json index 2ab19129039..549632d4575 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "terriajs", - "version": "8.2.29", + "version": "8.3.0", "description": "Geospatial data visualization platform.", "license": "Apache-2.0", "engines": { From 7ea3db29ba77c8e3302a42fd66f2f857ce49bd99 Mon Sep 17 00:00:00 2001 From: Stephen Davies Date: Wed, 24 May 2023 15:04:13 +1000 Subject: [PATCH 191/654] Fix/improve some error messages for WFS and update translation strings to match parameters used --- .../Ows/WebFeatureServiceCatalogItem.ts | 23 ++++++++++++++----- wwwroot/languages/en/translation.json | 6 ++--- 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/lib/Models/Catalog/Ows/WebFeatureServiceCatalogItem.ts b/lib/Models/Catalog/Ows/WebFeatureServiceCatalogItem.ts index 7c77dfeefd4..f9e3f8b0308 100644 --- a/lib/Models/Catalog/Ows/WebFeatureServiceCatalogItem.ts +++ b/lib/Models/Catalog/Ows/WebFeatureServiceCatalogItem.ts @@ -1,12 +1,13 @@ import i18next from "i18next"; import { computed, makeObservable, override, runInAction } from "mobx"; import combine from "terriajs-cesium/Source/Core/combine"; +import TerriaError from "../../../Core/TerriaError"; import containsAny from "../../../Core/containsAny"; import isDefined from "../../../Core/isDefined"; import isReadOnlyArray from "../../../Core/isReadOnlyArray"; import loadText from "../../../Core/loadText"; -import TerriaError from "../../../Core/TerriaError"; import gmlToGeoJson from "../../../Map/Vector/gmlToGeoJson"; +import { getName } from "../../../ModelMixins/CatalogMemberMixin"; import GeoJsonMixin, { FeatureCollectionWithCrs, toFeatureCollection @@ -20,10 +21,10 @@ import WebFeatureServiceCatalogItemTraits, { SUPPORTED_CRS_4326 } from "../../../Traits/TraitsClasses/WebFeatureServiceCatalogItemTraits"; import CreateModel from "../../Definition/CreateModel"; -import createStratumInstance from "../../Definition/createStratumInstance"; import LoadableStratum from "../../Definition/LoadableStratum"; import { BaseModel, ModelConstructorParameters } from "../../Definition/Model"; import StratumFromTraits from "../../Definition/StratumFromTraits"; +import createStratumInstance from "../../Definition/createStratumInstance"; import proxyCatalogItemUrl from "../proxyCatalogItemUrl"; import WebFeatureServiceCapabilities, { FeatureType, @@ -386,7 +387,8 @@ class WebFeatureServiceCatalogItem extends GetCapabilitiesMixin( // Check if layers exist const missingLayers = this.typeNamesArray.filter( - (layer) => !getCapabilitiesStratum.capabilitiesFeatureTypes.has(layer) + (layer) => + !isDefined(getCapabilitiesStratum.capabilitiesFeatureTypes.get(layer)) ); if (missingLayers.length > 0) { throw new TerriaError({ @@ -396,7 +398,7 @@ class WebFeatureServiceCatalogItem extends GetCapabilitiesMixin( ), message: i18next.t( "models.webFeatureServiceCatalogItem.noLayerFoundMessage", - this + { name: getName(this), typeNames: missingLayers.join(", ") } ) }); } @@ -431,6 +433,14 @@ class WebFeatureServiceCatalogItem extends GetCapabilitiesMixin( errorMessage = xml2json(getFeatureResponse).Exception?.ExceptionText; } catch {} + const originalError = isDefined(errorMessage) + ? new TerriaError({ + sender: this, + title: "Exception from service", + message: errorMessage + }) + : undefined; + throw new TerriaError({ sender: this, title: i18next.t( @@ -438,8 +448,9 @@ class WebFeatureServiceCatalogItem extends GetCapabilitiesMixin( ), message: `${i18next.t( "models.webFeatureServiceCatalogItem.missingDataMessage", - this - )} ${isDefined(errorMessage) ? `
    Error: ${errorMessage}` : ""}` + { name: getName(this) } + )}`, + originalError }); } diff --git a/wwwroot/languages/en/translation.json b/wwwroot/languages/en/translation.json index 90cede1233a..34483aa0e9c 100644 --- a/wwwroot/languages/en/translation.json +++ b/wwwroot/languages/en/translation.json @@ -1385,9 +1385,9 @@ "serviceContact": "Service Contact", "getCapabilitiesUrl": "GetCapabilities URL", "noLayerFoundTitle": "No layer found", - "noLayerFoundMessage": "The WFS dataset '{{name}}' has no layers matching '{{typeNames}}'. {{suggested}} {{line}}{{line}}Either the catalog file has been set up incorrectly, or the WFS server has changed.", + "noLayerFoundMessage": "The WFS dataset '{{name}}' has no layers matching '{{typeNames}}'. Either the catalog file has been set up incorrectly, or the WFS server has changed.", "missingDataTitle": "Missing data", - "missingDataMessage": "The WFS dataset '{{name}}' did not return any data.{{line}}{{line}}Either the catalog file has been set up incorrectly, or the server address has changed.", + "missingDataMessage": "The WFS dataset '{{name}}' did not return any data. Either the catalog file has been set up incorrectly, or the server address has changed.", "missingUrlTitle": "Unable to load GetCapabilities", "missingUrlMessage": "Could not load the Web Feature Service (WFS) GetCapabilities document because the catalog item does not have a `url`.", "reachedMaxFeatureLimit": "Warning: This layer has reached the WFS feature limit ({{maxFeatures}})" @@ -1414,7 +1414,7 @@ "getCapabilitiesUrl": "GetCapabilities URL", "defaultStyleLabel": "Default style", "noLayerFoundTitle": "No layer found", - "noLayerFoundMessage": "The WMS dataset '{{name}}' has no layers matching '{{layers}}'. {{suggested}} {{line}}{{line}}Either the catalog file has been set up incorrectly, or the WMS server has changed.", + "noLayerFoundMessage": "The WMS dataset '{{name}}' has no layers matching '{{layers}}'. Either the catalog file has been set up incorrectly, or the WMS server has changed.", "badlyFormatedTitle": "Badly formatted periodicity", "badlyFormatedMessage": "The '{{name}}' dataset has a badly formed periodicity, '{{isoSegments}}'. Click the dataset's Info button for more information about the dataset and the data custodian.", "missingDataTitle": "Missing data", From ca14b44be91615f72d4e886bbe2f5d1b7201ddc3 Mon Sep 17 00:00:00 2001 From: Stephen Davies Date: Wed, 24 May 2023 15:22:22 +1000 Subject: [PATCH 192/654] Update changelog --- CHANGES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES.md b/CHANGES.md index 2507f2936a2..9cd18aab8e6 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -2,6 +2,7 @@ #### next release (8.3.1) +- Improve WMS and WFS error messages when requested layer names or type names are not present in GetCapabilities. - [The next improvement] #### 8.3.0 - 2023-05-22 From ccd229665794dcd91f023cb0a01e8bc6a4bd6a3d Mon Sep 17 00:00:00 2001 From: "Weblate (bot)" Date: Wed, 24 May 2023 08:55:51 +0200 Subject: [PATCH 193/654] Translated using Weblate (Japanese) for TerriaJSNext (#6773) Currently translated at 100.0% (1218 of 1218 strings) Translation: TerriaJS/TerriaJSNext Translate-URL: https://hosted.weblate.org/projects/terriajs/terriajsnext/ja/ Co-authored-by: Hiroo Imaki --- wwwroot/languages/ja/translation.json | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/wwwroot/languages/ja/translation.json b/wwwroot/languages/ja/translation.json index 6dd2bb7f347..f57519dc40a 100644 --- a/wwwroot/languages/ja/translation.json +++ b/wwwroot/languages/ja/translation.json @@ -435,7 +435,7 @@ "settingPanel": { "performanceLabel": "パフォーマンス", "qualityLabel": "質", - "mapQuality": "ラスターデータの質:", + "mapQuality": "地図の質:", "nativeResolutionHeader": "デバイスの解像度を適用", "imageOptimisation": "画像の最適化", "baseMap": "ベースマップ", @@ -811,7 +811,9 @@ "readyToUpload": "{{appName}}の変換サービスにアップロードする準備はできていますか?", "getConfirmationMessage": "このファイルは{{appName}}では直接サポートされていません。\n\n{{appName}}の変換サービスにアップロードしますか?ファイルサイズが小さく、かつzip化されたEsri ShapeファイルやMapInfo Tabファイルであればこの方法で表示できる可能性があります。", "unsupportedFileTypeMessageII": "このファイルフォーマットは{{appName}}ではサポートされていません。直接サポートされているフォーマットは
    • .geojson
    • .kml, .kmz
    • .csv (in {{link}})
    です。オンライン変換サービスを通してサポートされているファイルフォーマットは
    • Shapefile (.zip)
    • MapInfo TAB (.zip)
    • その他の {{linkII}}
    などです。", - "stubCreationFailure": "カタログアイテム {{item}} を消すことができません" + "stubCreationFailure": "カタログアイテム {{item}} を消すことができません", + "addAll": "全てを追加", + "removeAll": "全てを削除" }, "ckan": { "idsNotSpecifiedMessage": "CkanCatalogItemではresourceIdかdatasetIdのどちらかが指定されている必要があります。", @@ -952,7 +954,8 @@ "invalidServiceTitle": "無効なArcGISマップサービス", "name": "ArcGIS マップサーバーグループ", "groupNotAvailableMessage": "ArcGIS Map Serviceの呼び出し中にエラーが発生しました。", - "invalidServiceMessage": "ArcGIS Map Serviceの呼び出し中にエラーが発生しました。サーバーの応答が有効なMap Serviceドキュメントではないようです。" + "invalidServiceMessage": "ArcGIS Map Serviceの呼び出し中にエラーが発生しました。サーバーの応答が有効なMap Serviceドキュメントではないようです。", + "singleFusedMapCacheLayerName": "全レイヤ" }, "georss": { "copyrightText": "著作権", @@ -1467,7 +1470,7 @@ "loadingInitSourceError2Message": "以下から初期化情報を読み込む際にエラー発生: \n*`{{loadSource}}`*.", "loadingInitSourceErrorMessage": "`{{fragment}}` から初期化情報を読み込めませんでした。initFragmentPaths が定義されていません。", "loadingInitSourceErrorTitle": "初期化リソース読み込み時エラー", - "loadingInitSourcesErrorMessage": "{{appName}} 地図設定の読み込み時エラー — ただ指示表示されないかもしれません。地図を再読み込みしてください。もし問題が解決しない場合、 {{email}} にエラーを報告しするか、下のボタンを押してください。", + "loadingInitSourcesErrorMessage": "{{appName}} 地図設定の読み込み時エラー — 正しく表示されないかもしれません。地図を再読み込みしてください。もし問題が解決しない場合、 {{email}} にエラーを報告するか、下のボタンを押してください。", "loadingInitSourcesErrorTitle": "地図設定読み込み時のエラー", "loadingMagdaInitSourceErrorMessage": "Magda レコード `{{url}}` から初期化情報を読み込み時にエラー発生。", "loadingMagdaInitSourceErrorTitle": "Magdaの初期化ソース読み込み時のエラー", From 1ffb75926b1ae9a5e02d5c8489b10411fba9ddaf Mon Sep 17 00:00:00 2001 From: Nanda Date: Wed, 31 May 2023 16:13:55 +1000 Subject: [PATCH 194/654] Fix catalog index reference loading to correctly load deeply nested references. --- lib/ModelMixins/ReferenceMixin.ts | 25 +++++++ .../CatalogIndexReference.ts | 8 ++- .../CatalogIndexReferenceSpec.ts | 70 +++++++++++++++++++ 3 files changed, 101 insertions(+), 2 deletions(-) create mode 100644 test/Models/Catalog/CatalogReferences/CatalogIndexReferenceSpec.ts diff --git a/lib/ModelMixins/ReferenceMixin.ts b/lib/ModelMixins/ReferenceMixin.ts index a6b0269a5c9..2833984f24f 100644 --- a/lib/ModelMixins/ReferenceMixin.ts +++ b/lib/ModelMixins/ReferenceMixin.ts @@ -9,6 +9,7 @@ import DeveloperError from "terriajs-cesium/Source/Core/DeveloperError"; import AbstractConstructor from "../Core/AbstractConstructor"; import AsyncLoader from "../Core/AsyncLoader"; import Result from "../Core/Result"; +import TerriaError from "../Core/TerriaError"; import Model, { BaseModel, ModelInterface } from "../Models/Definition/Model"; import ReferenceTraits from "../Traits/TraitsClasses/ReferenceTraits"; import { getName } from "./CatalogMemberMixin"; @@ -135,6 +136,30 @@ function ReferenceMixin>(Base: T) { return result; } + /** + * Recursively load a nested chain of references till the given maxDepth. + * + * If this reference points to another reference and so on.. then this + * method will load them all up to the given depth. + * + * @param maxDepth The maximum depth up to which the references should be resolved. + * @returns A promise that is fulfilled with a Result value when all the references have been loaded. + */ + async recursivelyLoadReference(depth: number): Promise> { + let currentTarget: BaseModel | undefined = this; + const errors: TerriaError[] = []; + while (depth > 0 && ReferenceMixin.isMixedInto(currentTarget)) { + (await currentTarget.loadReference()).pushErrorTo(errors); + currentTarget = currentTarget.target; + depth -= 1; + } + const result = TerriaError.combine( + errors, + "Failed to recursively load reference `${this.uniqueId}`" + ); + return Result.error(result); + } + /** * Forces load of the reference. This method does _not_ need to consider * whether the reference is already loaded. diff --git a/lib/Models/Catalog/CatalogReferences/CatalogIndexReference.ts b/lib/Models/Catalog/CatalogReferences/CatalogIndexReference.ts index d75ab7bf843..ba88d1a821b 100644 --- a/lib/Models/Catalog/CatalogReferences/CatalogIndexReference.ts +++ b/lib/Models/Catalog/CatalogReferences/CatalogIndexReference.ts @@ -71,11 +71,15 @@ export default class CatalogIndexReference extends ReferenceMixin( } if (ReferenceMixin.isMixedInto(container)) { - (await container.loadReference()).pushErrorTo( + // Recursively load references up to a depth of 5. This is so that we + // correctly resolve the final target item when we have a chain of + // references like: MagdaReference -> TerriaReference -> ... -> SomeItem + // We limit to a depth of 5 to avoid looping forever. + (await container.recursivelyLoadReference(5)).pushErrorTo( errors, `Failed to load reference ${container.uniqueId}` ); - container = container.target ?? container; + container = container.nestedTarget ?? container; } if (GroupMixin.isMixedInto(container)) { diff --git a/test/Models/Catalog/CatalogReferences/CatalogIndexReferenceSpec.ts b/test/Models/Catalog/CatalogReferences/CatalogIndexReferenceSpec.ts new file mode 100644 index 00000000000..ddd21836a77 --- /dev/null +++ b/test/Models/Catalog/CatalogReferences/CatalogIndexReferenceSpec.ts @@ -0,0 +1,70 @@ +import { CommonStrata, updateModelFromJson } from "terriajs-plugin-api"; +import CatalogIndexReference from "../../../../lib/Models/Catalog/CatalogReferences/CatalogIndexReference"; +import MagdaReference from "../../../../lib/Models/Catalog/CatalogReferences/MagdaReference"; +import Terria from "../../../../lib/Models/Terria"; + +describe("CatalogIndexReference", function () { + let terria: Terria; + + beforeEach(function () { + terria = new Terria(); + }); + + describe("loadReference", function () { + describe("when a parent container is a deeply nested reference", function () { + beforeEach(function () { + jasmine.Ajax.install(); + }); + + afterEach(function () { + jasmine.Ajax.uninstall(); + }); + + it("recursively loads all the references to fully expand the references", async function () { + // We are setting up the following hierarchy: MagdaReference -> TerriaReference -> Group -> Leaf + // and asserting that we load the reference containers all the way down to the Leaf node + + // Setup parent magda reference item + const parent = new MagdaReference("parent", terria); + parent.setTrait(CommonStrata.definition, "magdaRecord", { + // the parent points to another reference of type terria-reference + aspects: { + terria: { + definition: { + name: "Group", + description: "Group", + url: "example.org/catalog.json" + }, + id: "some-group", + type: "terria-reference" + } + }, + id: "some-group", + name: "Group" + }); + + // The terria-reference points to a group containg a 'leaf' node. + jasmine.Ajax.stubRequest("example.org/catalog.json").andReturn({ + responseJSON: { + catalog: [ + { + type: "group", + name: "Group", + members: [{ id: "leaf", type: "csv", name: "leaf" }] + } + ] + } + }); + + const leafIndex = new CatalogIndexReference("leaf", terria); + terria.addModel(parent); + updateModelFromJson(leafIndex, CommonStrata.defaults, { + memberKnownContainerUniqueIds: ["parent"] + }); + await leafIndex.loadReference(); + // Ensure then index reference is correctly resolved to the leaf node + expect(leafIndex.nestedTarget?.uniqueId).toBe("leaf"); + }); + }); + }); +}); From dbf5ebfdd90aa4f6998b34031d2b1556e101c147 Mon Sep 17 00:00:00 2001 From: Nanda Date: Wed, 31 May 2023 16:24:06 +1000 Subject: [PATCH 195/654] Fix imports. --- .../Catalog/CatalogReferences/CatalogIndexReferenceSpec.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/Models/Catalog/CatalogReferences/CatalogIndexReferenceSpec.ts b/test/Models/Catalog/CatalogReferences/CatalogIndexReferenceSpec.ts index ddd21836a77..54c5dc20d12 100644 --- a/test/Models/Catalog/CatalogReferences/CatalogIndexReferenceSpec.ts +++ b/test/Models/Catalog/CatalogReferences/CatalogIndexReferenceSpec.ts @@ -1,6 +1,7 @@ -import { CommonStrata, updateModelFromJson } from "terriajs-plugin-api"; import CatalogIndexReference from "../../../../lib/Models/Catalog/CatalogReferences/CatalogIndexReference"; import MagdaReference from "../../../../lib/Models/Catalog/CatalogReferences/MagdaReference"; +import CommonStrata from "../../../../lib/Models/Definition/CommonStrata"; +import updateModelFromJson from "../../../../lib/Models/Definition/updateModelFromJson"; import Terria from "../../../../lib/Models/Terria"; describe("CatalogIndexReference", function () { From 0df7f2dd1b6755d1ff0968d735d8e0dcc8f8dc68 Mon Sep 17 00:00:00 2001 From: Nanda Date: Thu, 1 Jun 2023 09:58:54 +1000 Subject: [PATCH 196/654] Add @babel/plugin-proposal-class-properties as a direct dependency. --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index 549632d4575..8bc8065a9d8 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "@babel/core": "^7.16.0", "@babel/parser": "^7.12.14", "@babel/plugin-proposal-decorators": "^7.10.4", + "@babel/plugin-proposal-class-properties": "^7.18.6", "@babel/preset-env": "^7.10.4", "@babel/preset-react": "^7.0.0", "@babel/preset-typescript": "^7.10.4", From b78a716283f7b25921f3dcb7e0e2428c16adbebc Mon Sep 17 00:00:00 2001 From: Nanda Date: Thu, 1 Jun 2023 10:12:20 +1000 Subject: [PATCH 197/654] Add @babel/plugin-proposal-object-rest-spread as direct dependency. --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index 8bc8065a9d8..26381b029a6 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,7 @@ "@babel/parser": "^7.12.14", "@babel/plugin-proposal-decorators": "^7.10.4", "@babel/plugin-proposal-class-properties": "^7.18.6", + "@babel/plugin-proposal-object-rest-spread": "^7.20.7", "@babel/preset-env": "^7.10.4", "@babel/preset-react": "^7.0.0", "@babel/preset-typescript": "^7.10.4", From c694c0eec8c603b34ef4aac4e8fc0d80a9715edd Mon Sep 17 00:00:00 2001 From: Nanda Date: Thu, 1 Jun 2023 10:41:43 +1000 Subject: [PATCH 198/654] Change parameter name. --- lib/ModelMixins/ReferenceMixin.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/ModelMixins/ReferenceMixin.ts b/lib/ModelMixins/ReferenceMixin.ts index 2833984f24f..9849ace7c63 100644 --- a/lib/ModelMixins/ReferenceMixin.ts +++ b/lib/ModelMixins/ReferenceMixin.ts @@ -145,13 +145,13 @@ function ReferenceMixin>(Base: T) { * @param maxDepth The maximum depth up to which the references should be resolved. * @returns A promise that is fulfilled with a Result value when all the references have been loaded. */ - async recursivelyLoadReference(depth: number): Promise> { + async recursivelyLoadReference(maxDepth: number): Promise> { let currentTarget: BaseModel | undefined = this; const errors: TerriaError[] = []; - while (depth > 0 && ReferenceMixin.isMixedInto(currentTarget)) { + while (maxDepth > 0 && ReferenceMixin.isMixedInto(currentTarget)) { (await currentTarget.loadReference()).pushErrorTo(errors); currentTarget = currentTarget.target; - depth -= 1; + maxDepth -= 1; } const result = TerriaError.combine( errors, From 15a01978fd4ca244a196d17101954d928c63a8cc Mon Sep 17 00:00:00 2001 From: Nanda Date: Thu, 1 Jun 2023 10:43:20 +1000 Subject: [PATCH 199/654] Update CHANGES.md. --- CHANGES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES.md b/CHANGES.md index 2507f2936a2..a0a50a40c82 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -2,6 +2,7 @@ #### next release (8.3.1) +- Fix error when adding deeply nested references in search results. - [The next improvement] #### 8.3.0 - 2023-05-22 From 0be3fcefd037fd6e6748306e5b0a4d1b88715ada Mon Sep 17 00:00:00 2001 From: Stephen Davies Date: Fri, 2 Jun 2023 02:50:08 +1000 Subject: [PATCH 200/654] Small improvements to doc build process. You can now use gulp render-guide to avoid rebuilding terriajs when working on docs. --- doc/{index-built.html => index-redirect.html} | 0 gulpfile.js | 50 ++++++++++++------- 2 files changed, 32 insertions(+), 18 deletions(-) rename doc/{index-built.html => index-redirect.html} (100%) diff --git a/doc/index-built.html b/doc/index-redirect.html similarity index 100% rename from doc/index-built.html rename to doc/index-redirect.html diff --git a/gulpfile.js b/gulpfile.js index 363ad4ac7f0..1389dac0c91 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -158,19 +158,21 @@ gulp.task("build-for-doc-generation", function buildForDocGeneration(done) { }); gulp.task( - "user-guide", + "render-guide", gulp.series( - gulp.parallel("code-attribution", "build-for-doc-generation"), - function userGuide(done) { - var fse = require("fs-extra"); - var PluginError = require("plugin-error"); - var spawnSync = require("child_process").spawnSync; - + function copyToBuild(done) { + const fse = require("fs-extra"); fse.copySync("doc", "build/doc"); + done(); + }, + function generateMemberPages(done) { + const fse = require("fs-extra"); + const PluginError = require("plugin-error"); + const spawnSync = require("child_process").spawnSync; fse.mkdirpSync("build/doc/connecting-to-data/catalog-type-details"); - var result = spawnSync("node", ["generateDocs.js"], { + const result = spawnSync("node", ["generateDocs.js"], { cwd: "build", stdio: "inherit", shell: false @@ -183,8 +185,13 @@ gulp.task( { showStack: false } ); } + done(); + }, + function mkdocs(done) { + const PluginError = require("plugin-error"); + const spawnSync = require("child_process").spawnSync; - result = spawnSync( + const result = spawnSync( "mkdocs", ["build", "--clean", "--config-file", "mkdocs.yml"], { @@ -194,11 +201,14 @@ gulp.task( } ); if (result.status !== 0) { - throw new PluginError("user-doc", "Mkdocs exited with an error.", { - showStack: false - }); + throw new PluginError( + "user-doc", + `Mkdocs exited with an error. Maybe you didn't install mkdocs and other python dependencies in requirements.txt - see https://docs.terria.io/guide/contributing/development-environment/#documentation?`, + { + showStack: false + } + ); } - done(); } ) @@ -206,11 +216,15 @@ gulp.task( gulp.task( "docs", - gulp.series("user-guide", function docs(done) { - var fse = require("fs-extra"); - fse.copySync("doc/index-built.html", "wwwroot/doc/index.html"); - done(); - }) + gulp.series( + gulp.parallel("code-attribution", "build-for-doc-generation"), + "render-guide", + function docs(done) { + var fse = require("fs-extra"); + fse.copySync("doc/index-redirect.html", "wwwroot/doc/index.html"); + done(); + } + ) ); gulp.task("terriajs-server", function (done) { From d6fe2e563a43b8998cf1937c20dba62d3d7b0c06 Mon Sep 17 00:00:00 2001 From: Stephen Davies Date: Fri, 2 Jun 2023 16:49:02 +1000 Subject: [PATCH 201/654] Further docs improvements --- doc/README.md | 8 +- doc/contributing/development-environment.md | 2 +- doc/contributing/feature-picking.md | 2 +- doc/contributing/traits-in-depth.md | 2 +- doc/customizing/without-docker.md | 103 -------------------- doc/getting-started.md | 6 +- 6 files changed, 8 insertions(+), 115 deletions(-) delete mode 100644 doc/customizing/without-docker.md diff --git a/doc/README.md b/doc/README.md index 3d2a80fb20e..367a1b6b43c 100644 --- a/doc/README.md +++ b/doc/README.md @@ -6,15 +6,13 @@ - [Deploying](deploying/README.md): Deploy a TerriaJS application in simple and advanced scenarios. - [Contributing](contributing/README.md): Add new features to TerriaJS, be part of the TerriaJS development team, set up a development environment, write tests, and perform code reviews. -Looking for help using a TerriaJS-based site? Try the [Terria Platforms User Guide](https://userguide.terria.io/). - !!! note - The documentation on this site is for applications using TerriaJS version 8. If you are still maintaining an application using TerriaJS version 7 or lower go to [docs-v7.terria.io](https://docs-v7.terria.io). + Looking for help using a TerriaJS-based site? Try the [Terria Platforms User Guide](https://userguide.terria.io/). -This documentation is maintained at [github.com/TerriaJS/TerriaJS/tree/main/doc](https://github.com/TerriaJS/TerriaJS/tree/main/doc). +_The documentation on this site is for applications using TerriaJS version 8. If you are still maintaining an application using TerriaJS version 7 or lower go to [docs-v7.terria.io](https://docs-v7.terria.io)._ -It can be viewed at [docs.terria.io](https://docs.terria.io). +_This documentation is maintained at [github.com/TerriaJS/TerriaJS/tree/main/doc](https://github.com/TerriaJS/TerriaJS/tree/main/doc). It can be viewed at [docs.terria.io](https://docs.terria.io)._ Deploys by Netlify diff --git a/doc/contributing/development-environment.md b/doc/contributing/development-environment.md index 4bd61f829b3..6dbbac4979c 100644 --- a/doc/contributing/development-environment.md +++ b/doc/contributing/development-environment.md @@ -107,7 +107,7 @@ The `package.json` in the `main` branch of TerriaMap should point to official re You need a standalone install of MkDocs and the `mkdocs-material` theme in order to build the user guide. Install these by running: ``` -pip install -r doc/requirements.txt +pip install -r requirements.txt ``` Documentation is automatically generated from the source via JSDoc (reference) and MkDocs (user guide) by running: diff --git a/doc/contributing/feature-picking.md b/doc/contributing/feature-picking.md index 2301a5c2360..8f457b6214a 100644 --- a/doc/contributing/feature-picking.md +++ b/doc/contributing/feature-picking.md @@ -12,7 +12,7 @@ It is a work in progress. ## Related docs -- [Feature Info Template](../../doc/connecting-to-data/customizing-data-appearance/feature-info-template.md) +- [Feature Info Template](../connecting-to-data/customizing-data-appearance/feature-info-template.md) ## Outline diff --git a/doc/contributing/traits-in-depth.md b/doc/contributing/traits-in-depth.md index 249622e471b..61351839b2c 100644 --- a/doc/contributing/traits-in-depth.md +++ b/doc/contributing/traits-in-depth.md @@ -127,4 +127,4 @@ As the computed value is updated, other parts of the UI that observe that value ## Strata examples -See [doc/contributing/strata-examples.md](../../doc/contributing/strata-examples.md) +See [doc/contributing/strata-examples.md](./strata-examples.md) diff --git a/doc/customizing/without-docker.md b/doc/customizing/without-docker.md deleted file mode 100644 index 75055a7108e..00000000000 --- a/doc/customizing/without-docker.md +++ /dev/null @@ -1,103 +0,0 @@ -### Quick Start - -If you've done this sort of thing before, you'll find it easy to clone and build TerriaMap with these quick instructions: - -```bash -git clone https://github.com/TerriaJS/TerriaMap.git - -cd TerriaMap - -export NODE_OPTIONS=--max_old_space_size=4096 - -npm install -g yarn - -yarn install && yarn gulp && yarn start - -# Open at http://localhost:3001 -``` - -If you run into trouble or want more explanation, read on. - -### Prerequisites - -TerriaJS can be built and run on almost any macOS, Linux, or Windows system. The following are required to build TerriaJS: - -- The Bash command shell. On macOS or Linux you almost certainly already have this. On Windows, you can easily get it by installing [Git for Windows](https://gitforwindows.org/). In the instructions below, we assume you're using a Bash command prompt. -- [Node.js](https://nodejs.org) v12.0 or later. You can check your node version by running `node --version` on the command-line. -- [npm](https://www.npmjs.com/) v6.0 or later. npm is usually installed automatically alongside the above. You can check your npm version by running `npm --version`. -- [yarn](https://yarnpkg.com/) v1.19.0 or later. This can be installed using `npm install -g yarn@^1.19.0` - -### Cloning TerriaMap - -The latest version of TerriaMap is on [GitHub](https://github.com), and the preferred way to get it is by using `git`: - -```bash -git clone https://github.com/TerriaJS/TerriaMap.git - -cd TerriaMap -``` - -If you're unable to use git, you can also [download a ZIP file](https://github.com/TerriaJS/TerriaMap/archive/main.zip) and extract it somewhere on your system. We recommend using git, though, because it makes it much easier to update to later versions in the future. - -### Increase NodeJS memory limit - -To avoid running out of memory when installing dependencies and building TerriaMap, increase the memory limit of node: - -```bash -export NODE_OPTIONS=--max_old_space_size=4096 -``` - -### Installing Dependencies - -All of the dependencies required to build and run TerriaMap, other than the prerequisites listed above, are installed using `yarn`: - -```bash -yarn install -``` - -The dependencies are installed in the `node_modules` subdirectory. No global changes are made to your system. - -### Building TerriaMap - -Do a standard build of TerriaMap with: - -```bash -yarn gulp -``` - -Or, you can create a minified release build with: - -```bash -yarn gulp release -``` - -To watch for changes and automatically do an incremental build when any are detected, use: - -```bash -yarn gulp watch -``` - -`yarn gulp` simply runs `gulp`, so you can use that directly if you prefer (run `npm install -g gulp-cli` to install it globally). - -The full set of `gulp` tasks can be found on the [Development Environment](contributing/development-environment.md#terriamap-gulp-tasks) page. - -### Running TerriaMap - -TerriaMap includes a simple Node.js-based web server, called [terriajs-server](https://github.com/TerriaJS/terriajs-server). To start it, run: - -```bash -yarn start -``` - -Then, open a web browser on `http://localhost:3001` to use TerriaMap. - -### Keeping up with Updates - -If you're building an application by using TerriaMap as a starting point, you will want to keep in sync as TerriaMap is improved and updated to use new versions of TerriaJS. Forking the TerriaMap repo and using git to keep it in sync is outside the scope of this document, but GitHub has a [nice explanation](https://help.github.com/articles/fork-a-repo/). - -After pulling new changes, you will need to run `yarn install` again to pick up any changed dependencies and then build TerriaMap. If you have problems building or running, it is sometimes helpful to remove and reinstall the dependencies from npm: - -```bash -rm -rf node_modules -yarn install -``` diff --git a/doc/getting-started.md b/doc/getting-started.md index 620e9cabfd7..69c4169359d 100644 --- a/doc/getting-started.md +++ b/doc/getting-started.md @@ -32,10 +32,8 @@ Some more advanced customizations will require rebuilding TerriaMap. To do these ### Deploying TerriaMap -Deploy the container you've made using Docker Compose, Kubernetes, or a cloud provider service that will run containers. +Deploy the container you've made using Kubernetes, and/or a cloud provider service that will run containers. -TODO: Update above sentence after updating Deploying section (and point to new section) - -## Without Docker +### Without Docker Follow the [Cloning and Building](customizing/cloning-and-building.md) guide to get started with TerriaMap without docker. From 17130fc775a807dc606154f8542a2924adc48f97 Mon Sep 17 00:00:00 2001 From: Nanda Date: Tue, 6 Jun 2023 10:59:47 +1000 Subject: [PATCH 202/654] Fix `Result` to correctly handle both error or non-error results. --- lib/ModelMixins/ReferenceMixin.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/ModelMixins/ReferenceMixin.ts b/lib/ModelMixins/ReferenceMixin.ts index 9849ace7c63..750166b13fa 100644 --- a/lib/ModelMixins/ReferenceMixin.ts +++ b/lib/ModelMixins/ReferenceMixin.ts @@ -153,11 +153,11 @@ function ReferenceMixin>(Base: T) { currentTarget = currentTarget.target; maxDepth -= 1; } - const result = TerriaError.combine( + const maybeError = TerriaError.combine( errors, "Failed to recursively load reference `${this.uniqueId}`" ); - return Result.error(result); + return Result.none(maybeError); } /** From a8271e0a35e40839944bdbe80bf4e4695685506b Mon Sep 17 00:00:00 2001 From: Tisham Dhar Date: Fri, 26 May 2023 06:31:11 +0200 Subject: [PATCH 203/654] Added translation using Weblate (Swahili) for TerriaJSNext --- wwwroot/languages/sw/translation.json | 1 + 1 file changed, 1 insertion(+) create mode 100644 wwwroot/languages/sw/translation.json diff --git a/wwwroot/languages/sw/translation.json b/wwwroot/languages/sw/translation.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/wwwroot/languages/sw/translation.json @@ -0,0 +1 @@ +{} From 585ea892c8dfdf40f5d650a306e683662e4d5929 Mon Sep 17 00:00:00 2001 From: Tisham Dhar Date: Fri, 26 May 2023 04:35:18 +0000 Subject: [PATCH 204/654] Translated using Weblate (Swahili) for TerriaJSNext Currently translated at 1.6% (20 of 1218 strings) Translation: TerriaJS/TerriaJSNext Translate-URL: https://hosted.weblate.org/projects/terriajs/terriajsnext/sw/ --- wwwroot/languages/sw/translation.json | 33 ++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/wwwroot/languages/sw/translation.json b/wwwroot/languages/sw/translation.json index 0967ef424bc..fbe7fbf0f4a 100644 --- a/wwwroot/languages/sw/translation.json +++ b/wwwroot/languages/sw/translation.json @@ -1 +1,32 @@ -{} +{ + "general": { + "close": "Funga", + "open": "Fungua", + "prev": "Kilichotangulia", + "next": "Kinachofuata", + "back": "Rudia", + "skip": "Rukia", + "delete": "Ondoa", + "cancel": "Katisha", + "confirm": "Thibitisha" + }, + "browsers": { + "chrome": "Google Chrome", + "firefox": "Mozilla Firefox", + "edge": "Microsoft Edge", + "safari": "Apple Safari" + }, + "trainer": { + "showAllSteps": "Onyesha kila hatua", + "hideAllSteps": "Ficha kila hatua", + "expandTrainer": "Onyesha maelesho zaidi", + "collapseTrainer": "Ficha maelesho zaidi" + }, + "tour": { + "preface": { + "title": "Chukua safari", + "start": "Anza safari" + }, + "finish": "Maliza" + } +} From a9ab6396936ff19f2dd5673fb488f49a5aa20445 Mon Sep 17 00:00:00 2001 From: Tisham Dhar Date: Fri, 2 Jun 2023 01:06:49 +0000 Subject: [PATCH 205/654] Translated using Weblate (French) for TerriaJSNext Currently translated at 90.8% (1106 of 1218 strings) Translation: TerriaJS/TerriaJSNext Translate-URL: https://hosted.weblate.org/projects/terriajs/terriajsnext/fr/ --- wwwroot/languages/fr/translation.json | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/wwwroot/languages/fr/translation.json b/wwwroot/languages/fr/translation.json index 3595cc0d838..b260d94c1a8 100644 --- a/wwwroot/languages/fr/translation.json +++ b/wwwroot/languages/fr/translation.json @@ -248,7 +248,9 @@ "title": "Faites glisser vers la gauche ou la droite pour ajuster les vues", "toggleSplitterTool": "Activer la comparaison côte à côte entre deux ensembles de données différents", "toggleSplitterToolDisabled": "Veuillez désactiver les autres fonctionnalités de comparaison côte à côte afin d'activer la comparaison standard", - "toggleSplitterToolTitle": "Comparer" + "toggleSplitterToolTitle": "Comparer", + "duplicateModelErrorMessage": "Une erreur s'est produite lors du fractionnement de l'élément de catalogue `\"{{name}}\"`. Cet élément ne peut pas supporter la fonctionnalité \"compare\" peut etre", + "errorTitle": "Impossible de comparer l'élément de catalogue." }, "location": { "centreMap": "Centrer la carte sur votre position actuelle", @@ -1567,5 +1569,11 @@ "pickLocation": "Pour visualiser les images disponibles, veuillez sélectionner le lieu qui vous intéresse sur la carte ci-contre.", "description": "Cet outil permet de visualiser la différence entre des images capturées à deux moments distincts dans le temps.", "titlePrefix": "Détection de changement" + }, + "browsers": { + "firefox": "Mozilla Firefox", + "chrome": "Google Chrome", + "edge": "Microsoft Edge", + "safari": "Apple Safari" } } From fc03046a098164da9f4035547fe0a1d4895361c4 Mon Sep 17 00:00:00 2001 From: Tisham Dhar Date: Fri, 2 Jun 2023 00:47:28 +0000 Subject: [PATCH 206/654] Translated using Weblate (Swahili) for TerriaJSNext Currently translated at 1.8% (23 of 1218 strings) Translation: TerriaJS/TerriaJSNext Translate-URL: https://hosted.weblate.org/projects/terriajs/terriajsnext/sw/ --- wwwroot/languages/sw/translation.json | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/wwwroot/languages/sw/translation.json b/wwwroot/languages/sw/translation.json index fbe7fbf0f4a..4c29bc8be2d 100644 --- a/wwwroot/languages/sw/translation.json +++ b/wwwroot/languages/sw/translation.json @@ -25,8 +25,15 @@ "tour": { "preface": { "title": "Chukua safari", - "start": "Anza safari" + "start": "Anza safari", + "close": "Labda baadae" }, - "finish": "Maliza" + "finish": "Maliza", + "locationSearchInput": { + "content": "## Tafuta mahali\n\nWeka mahali au anwani ili kupata eneo bila shida kwenye ramani." + }, + "exploreMapDataButton": { + "content": "## Chagua ramani\n\nVinjaria katlogi kwa kupata data na ongeza kwenye ramani hapa. Unaweza kuongeza data zaidi ya moja kwa wakati mmoja, na utaona zinaonyeshwa chini ndani ya Benchi la kazi (Workbench)." + } } } From 9907adc4fda9882387cbf2512ded0de32691b1e4 Mon Sep 17 00:00:00 2001 From: Stephen Davies Date: Wed, 7 Jun 2023 01:09:45 +1000 Subject: [PATCH 207/654] Improve deployment documentation --- doc/customizing/cloning-and-building.md | 4 +++ doc/deploying/README.md | 7 +++-- doc/deploying/deploying-terriamap.md | 20 +++++++++---- doc/deploying/deploying-with-kubernetes.md | 35 +++++++++++----------- doc/getting-started.md | 4 +-- 5 files changed, 43 insertions(+), 27 deletions(-) diff --git a/doc/customizing/cloning-and-building.md b/doc/customizing/cloning-and-building.md index 69e6104885b..caf32c26e74 100644 --- a/doc/customizing/cloning-and-building.md +++ b/doc/customizing/cloning-and-building.md @@ -103,3 +103,7 @@ yarn install ### Having trouble? Checkout the [Problems and Solutions](../contributing/problems-and-solutions.md) page to see if we have them covered. You are also welcome to post your problem on the [TerriaJS Discussions](https://github.com/TerriaJS/terriajs/discussions) forum and we'll be happy to help! + +### Next Steps + +Now that you have a working local build of TerriaMap, you may want to [customize it](customizing/README.md) or [deploy it](deploying/README.md) for others to use. diff --git a/doc/deploying/README.md b/doc/deploying/README.md index 0bf4c996963..409776e2d1b 100644 --- a/doc/deploying/README.md +++ b/doc/deploying/README.md @@ -1,9 +1,11 @@ -This section explains how to deploy and maintain production (and production-ish) versions of TerriaJS applications like TerriaMap. Before tackling this section, read [Getting Started](../getting-started.md) to learn how to build and run TerriaMap locally. +This section explains how to deploy and maintain production (and production-ish) versions of TerriaJS applications like TerriaMap. Before tackling this section, read [Getting Started](../getting-started.md) and [Cloning and Building](../customizing/cloning-and-building.md) to learn how to build and run TerriaMap locally. + +The simplest way to deploy a production ready TerriaMap is to use a cloud provider container service or Kubernetes. Deploying TerriaMap itself: -- [Deploying TerriaMap](deploying-terriamap.md): General instructions for deploying TerriaMap in almost any environment. - [Deploying with Kubernetes](deploying-with-kubernetes.md): Deploy TerriaMap using [Docker](https://www.docker.com/) and [Kubernetes](https://kubernetes.io/). +- [Deploying TerriaMap](deploying-terriamap.md): General instructions for deploying TerriaMap in almost any environment. Deploying other services for use with TerriaJS: @@ -12,7 +14,6 @@ Deploying other services for use with TerriaJS: Using a TerriaMap in other applications: -- [Using as a CKAN Previewer](using-as-a-ckan-previewer.md): Use TerriaJS as a previewer for geospatial data in a [CKAN](http://ckan.org/) site. - [Controlling with URL Parameters](controlling-with-url-parameters.md): Control a TerriaJS application by passing it URL parameters. This is powerful because it enables another site to launch or embed a customized map with little or no code to write. - [Controlling in an <iframe> or Popup](controlling-in-an-iframe-or-popup.md): Embed a TerriaJS application in iframe or pop it up in a separate window, and control it by posting it cross-window messages. diff --git a/doc/deploying/deploying-terriamap.md b/doc/deploying/deploying-terriamap.md index 49aaf6b5e30..e6089b7fa66 100644 --- a/doc/deploying/deploying-terriamap.md +++ b/doc/deploying/deploying-terriamap.md @@ -12,26 +12,36 @@ Then, you can host your TerriaMap using either the included Node.js-based web se ### Using the included Node.js-based web server -The easiest way to deploy your TerriaMap is to use the included Node.js-based web server, called [terriajs-server](https://github.com/TerriaJS/terriajs-server). You'll need Node.js 8.0+ installed on the server in order to run terriajs-server. +The easiest way to deploy your TerriaMap is to use the included Node.js-based web server, called [terriajs-server](https://github.com/TerriaJS/terriajs-server). You'll need Node.js 14.0+ installed on the server in order to run terriajs-server. Then, copy the following files and directories from your local system where you built TerriaMap onto the server: - `wwwroot` - `node_modules` (note: this can take a long time, be patient) - `devserverconfig.json` but rename this to `productionserverconfig.json` (and add any private access keys/passwords/secrets) -- `ecosystem.config.js` -- `ecosystem-production.config.js` And on the server, change to the directory where you copied those files and directories and run: ``` -./node_modules/.bin/pm2 start ecosystem-production.config.js --update-env --env production +NODE_ENV=production node ./node_modules/terriajs-server/terriajs-server.js --config-file productionserverconfig.json ``` -The server will start on port 3001. You can specify a different port by adding ` --port 1234` to the end of [the `args` configuration string](https://github.com/TerriaJS/TerriaMap/blob/f3c0b5e2a6ecd264b975beb155f9db84acca48df/ecosystem-production.config.js#L16) in `ecosystem-production.config.js`. +The server will start on port 3001. You can specify a different port by adding ` --port 1234`. It is usually a good idea to run another web server, such as [nginx](https://nginx.org/en/) on port 80 and then reverse-proxy to the Node.js server, rather than running terriajs-server on port 80 directly. NGINX is available as a package on Ubuntu via `sudo apt-get install -y nginx`. Using a separate web server such as such as [nginx](https://nginx.org/en/) will enable more security features, allow you to serve TerriaMap over HTTPS, and allow caching if you intend to [setup Geoserver](https://docs.terria.io/guide/deploying/setting-up-geoserver/) or other backend services. +### Production ready TerriaMap + +While we recommend using Docker or [Kubernetes](./deploying-with-kubernetes.md) to run a production ready TerriaMap, other tools such as [PM2](https://pm2.keymetrics.io/docs/usage/quick-start/) can be used to run terriajs-server as a production ready web application. + +An example PM2 Ecosystem File can be found at `deploy/ecosystem-example.config.js`. + +```bash +npm install -g pm2@latest + +pm2 start deploy/ecosystem-example.config.js --update-env --env production +``` + ### Using any web server [terriajs-server](https://github.com/TerriaJS/terriajs-server), described above, only does a few things: diff --git a/doc/deploying/deploying-with-kubernetes.md b/doc/deploying/deploying-with-kubernetes.md index 15c9d624116..371b2571e0c 100644 --- a/doc/deploying/deploying-with-kubernetes.md +++ b/doc/deploying/deploying-with-kubernetes.md @@ -5,9 +5,6 @@ This has been tested on Google Kubernetes Engine - it should work with other clu From within TerriaMap... ```bash -kubectl create serviceaccount tiller --namespace kube-system -kubectl apply -f deploy/kubernetes/rbac-config.yaml -helm init --service-account tiller helm upgrade --install -f deploy/helm/example-prod.yml terria deploy/helm/terria ``` @@ -22,7 +19,7 @@ global: rollingUpdate: maxUnavailable: 1 image: - tag: "0.0.1" + tag: "0.0.6" terriamap: clientConfig: parameters: @@ -40,25 +37,29 @@ terriamap: # Building Your Own Image -You can build your own TerriaMap image by changing the `config.docker.name` key in `package.json`, then running `yarn docker-build-prod`. +You can build your own TerriaMap image + +```bash +docker build -t app-name:tag . +``` # Working Locally -If you want to run a local version of TerriaMap then you can use [minikube](https://kubernetes.io/docs/getting-started-guides/minikube/). +If you want to run a local version of TerriaMap using Kubernetes then you can try one of these applications: -```bash -minikube start -eval $(minikube docker-env) +- [Docker Desktop](https://www.docker.com/products/docker-desktop/): Application with embedded Kubernetes setup for fast and easy app development, [requiring a subscription licence](https://docs.docker.com/subscription/desktop-license/) in most cases for commercial use +- [Rancher Desktop](https://rancherdesktop.io/): Apache-2.0 alternative to Docker Desktop -helm init -helm repo add incubator http://storage.googleapis.com/kubernetes-charts-incubator -helm repo update -helm install --name docker-registry -f deploy/helm/docker-registry.yml stable/docker-registry -helm install --name kube-registry-proxy -f deploy/helm/kube-registry-proxy.yml incubator/kube-registry-proxy +Or try a tool recommended in the [official Kuberntes setup documentation](https://kubernetes.io/docs/setup/). -yarn docker-build-local +Then run: -helm upgrade --install -f deploy/helm/example-prod.yml terria deploy/helm/terria +```bash +docker build -t app-name:tag . + +helm upgrade --install -f deploy/helm/example-prod.yml terria deploy/helm/terria --set terriamap.image.full=app-name:tag --set global.image.pullPolicy=Never ``` -This will set you up with helm on your local minikube instance, install a local docker registry that will be pushed to with `yarn docker-build-local` and then installs a chart for terria that will use that docker image. You can keep running `yarn docker-build-local` and deleting the terria-server pod to update it. Keep in mind that you have to run `yarn gulp` to rebuild each time you redeploy. You can modify or copy `example-prod.yml` to change the config. +using the same `app-name` & `tag` in both. + +You can repeat the command `docker build -t app-name:tag .` and delete the terria-terriamap pod to update it, and you can run the above `helm upgrade` command after modifying or copying `example-prod.yml` to change the config. diff --git a/doc/getting-started.md b/doc/getting-started.md index 69c4169359d..9b7a82bf5de 100644 --- a/doc/getting-started.md +++ b/doc/getting-started.md @@ -1,6 +1,6 @@ The easiest way to get started with TerriaJS is to use [TerriaMap](https://github.com/TerriaJS/TerriaMap). TerriaMap is a full-featured application built on TerriaJS, ready to be customized with your own branding and catalog. It is also a great starting point for more in-depth customization. -Use docker to start a TerriaMap container: +Use [Docker](https://www.docker.com/) to start a TerriaMap container: ```bash docker run -d -p 3001:3001 ghcr.io/terriajs/terriamap @@ -32,7 +32,7 @@ Some more advanced customizations will require rebuilding TerriaMap. To do these ### Deploying TerriaMap -Deploy the container you've made using Kubernetes, and/or a cloud provider service that will run containers. +You can deploy the container you've made using a container service from a cloud provider or Kubernetes. See [Deploying TerriaMap](deploying/README.md) for more information. ### Without Docker From 00a299dcaa7814a94b1dd6f21d49b2257b6dd286 Mon Sep 17 00:00:00 2001 From: Stephen Davies Date: Thu, 15 Jun 2023 13:47:22 +1000 Subject: [PATCH 208/654] Update .editorconfig --- .editorconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.editorconfig b/.editorconfig index 972635b2b8d..82f1a5b1446 100644 --- a/.editorconfig +++ b/.editorconfig @@ -12,7 +12,7 @@ insert_final_newline = true trim_trailing_whitespace = false [doc/**.md] -# mkdocs requires 4 spaces +# mkdocs requires 4 spaces. With 2 space indents, nested lists do not work indent_size = 4 [*.scss] From 32eadfc32fdba80f93014e4471dd6d9e4be24cb2 Mon Sep 17 00:00:00 2001 From: Nanda Date: Fri, 16 Jun 2023 13:46:49 +1000 Subject: [PATCH 209/654] Add option `focusWorkbenchItems` to `initialCamera` setting. When set, we automatically zoom the map to focus on the workbench items after map load. --- CHANGES.md | 1 + doc/customizing/initialization-files.md | 6 +- lib/Models/InitSource.ts | 3 +- lib/Models/NoViewer.ts | 4 +- lib/Models/Terria.ts | 68 ++++++++- test/Models/TerriaSpec.ts | 179 +++++++++++++++++++++++- 6 files changed, 254 insertions(+), 7 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index a0a50a40c82..0e061f43abf 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -3,6 +3,7 @@ #### next release (8.3.1) - Fix error when adding deeply nested references in search results. +- Add new option `focusWorkbenchItems` to `initialCamera` setting to focus the camera on workbench items when the app loads. - [The next improvement] #### 8.3.0 - 2023-05-22 diff --git a/doc/customizing/initialization-files.md b/doc/customizing/initialization-files.md index 0ac2f44efbd..a851add3e9c 100644 --- a/doc/customizing/initialization-files.md +++ b/doc/customizing/initialization-files.md @@ -75,7 +75,7 @@ Init files can be edited two ways: | ----------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `corsDomains` | no | **string[]** | | By default, TerriaJS proxies all requests within the proxy whitelist specified in the [Server-side Config](server-side-config.md), making the assumption that the servers do not support CORS. You can add hosts that are known to support CORS to this property to avoid proxying them. | | `catalog` | no | [**`CatalogItem[]`**](../connecting-to-data/catalog-items.md), [**`CatalogGroup[]`**](../connecting-to-data/catalog-groups.md), [**`CatalogFunction[]`**](../connecting-to-data/catalog-functions.md) | | An array of catalog items, groups and functions. Check example above. | -| `initialCamera` | no | [**`CameraPosition`**](#CameraPosition) | | The location when the map first displays. | +| `initialCamera` | no | [**`InitialCamera`**](#InitialCamera) | | The location when the map first displays. | | `stories` | no | [**`Story[]`**](#story) | | An array of stories to be loaded. | | `viewerMode` | no | **`"3d"`** or **`"3dSmooth"`** or **`"2D"`** | `"3d"` | The id of the viewer mode to be shown initialy. | | `homeCamera` | yes | [**`CameraPosition`**](#CameraPosition) | | Where the camera goes when you click the "home" button between the zoom-in and zoom-out buttons. | @@ -86,6 +86,10 @@ Init files can be edited two ways: | `previewedItemId` | no | **`string`** | | ID of the catalog member that is currently being previewed. | | `settings` | no | [**`settings`**](#advanced-settings) | | Additional (more advanced) settings. | +### InitialCamera + +Either [CameraPosition](#CameraPosition) or an object **`{"focusWorkbenchItems": true}`**. When `focusWorkbenchItems` is `true`, we make a best effort to focus the camera so that the workbench items are visible. + ### CameraPosition #### Option 1: `north`, `south`, `east`, `west` diff --git a/lib/Models/InitSource.ts b/lib/Models/InitSource.ts index 61ce0e703eb..cde41507f80 100644 --- a/lib/Models/InitSource.ts +++ b/lib/Models/InitSource.ts @@ -55,7 +55,8 @@ export interface InitSourceData { viewerMode?: ViewModeJson; baseMaps?: BaseMapsJson; homeCamera?: JsonObject; - initialCamera?: JsonObject; + /* Either a `CameraView` instance or a flag for focusing the camera on the workbench items */ + initialCamera?: JsonObject | { focusWorkbenchItems: boolean }; showSplitter?: boolean; splitPosition?: number; workbench?: string[]; diff --git a/lib/Models/NoViewer.ts b/lib/Models/NoViewer.ts index 4f17fb991b0..1a55b88997b 100644 --- a/lib/Models/NoViewer.ts +++ b/lib/Models/NoViewer.ts @@ -13,7 +13,9 @@ import GlobeOrMap from "./GlobeOrMap"; import Terria from "./Terria"; class NoViewer extends GlobeOrMap { - readonly type = "none"; + static readonly type = "none"; + readonly type = NoViewer.type; + readonly terria: Terria; readonly canShowSplitter = false; private _currentView: CameraView = new CameraView(Rectangle.MAX_VALUE); diff --git a/lib/Models/Terria.ts b/lib/Models/Terria.ts index 4b8d25591e5..2739ff991da 100644 --- a/lib/Models/Terria.ts +++ b/lib/Models/Terria.ts @@ -577,6 +577,16 @@ export default class Terria { @observable selectableDimensionWorkflow?: SelectableDimensionWorkflow; + /** + * Flag for zooming to workbench items after all init sources have been loaded. + * + * This is automatically enabled when your init file has the following settings: + * ``` + * {"initialCamera": {"focusWorkbenchItems": true}} + * ``` + */ + private focusWorkbenchItemsAfterLoadingInitSources: boolean = false; + @computed get baseMapContrastColor() { return ( @@ -1053,6 +1063,38 @@ export default class Terria { this.loadPersistedMapSettings(); } + /** + * Zoom to workbench items if `focusWorkbenchItemsAfterLoadingInitSources` is `true`. + * + * Note that the current behaviour is to zoom to the first item of the + * workbench, however in the future we should modify it to zoom to a view + * which shows all the workbench items. + * + * If a Cesium or Leaflet viewer is not available, + * we wait for it to load before triggering the zoom. + */ + private async doZoomToWorkbenchItems() { + if (!this.focusWorkbenchItemsAfterLoadingInitSources) { + return; + } + + // TODO: modify this to zoom to a view that shows all workbench items + // instead of just zooming to the first workbench item! + const firstMappableItem = this.workbench.items.find((item) => + MappableMixin.isMixedInto(item) + ) as MappableMixin.Instance | undefined; + if (firstMappableItem) { + // When the app loads, Cesium/Leaflet viewers are loaded + // asynchronously. Until they become available, a stub viewer called + // `NoViewer` is used. `NoViewer` does not implement zooming to mappable + // items. So here wait for a valid viewer to become available before + // attempting to zoom to the mappable item. + const isViewerAvailable = () => this.currentViewer.type !== NoViewer.type; + await when(isViewerAvailable); + await this.currentViewer.zoomTo(firstMappableItem, 0.0); + } + } + loadPersistedMapSettings(): void { const persistViewerMode = this.configParameters.persistViewerMode; const hashViewerMode = this.userProperties.get("map"); @@ -1339,6 +1381,11 @@ export default class Terria { } }); + // Zoom to workbench items if any of the init sources specifically requested it + if (this.focusWorkbenchItemsAfterLoadingInitSources) { + this.doZoomToWorkbenchItems(); + } + if (errors.length > 0) { // Note - this will get wrapped up in a Result object because it is called in AsyncLoader throw TerriaError.combine(errors, { @@ -1638,8 +1685,25 @@ export default class Terria { } if (isJsonObject(initData.initialCamera)) { - const initialCamera = CameraView.fromJson(initData.initialCamera); - this.currentViewer.zoomTo(initialCamera, 2.0); + // When initialCamera is set: + // - try to construct a CameraView and zoom to it + // - otherwise, if `initialCamera.focusWorkbenchItems` is `true` flag it + // so that we can zoom after the workbench items are loaded. + // - If there are multiple initSources, the setting from the last source takes effect + try { + const initialCamera = CameraView.fromJson(initData.initialCamera); + this.currentViewer.zoomTo(initialCamera, 2.0); + // reset in case this was enabled by a previous initSource + this.focusWorkbenchItemsAfterLoadingInitSources = false; + } catch (error) { + // Not a CameraView but does it specify focusWorkbenchItems? + if (typeof initData.initialCamera.focusWorkbenchItems === "boolean") { + this.focusWorkbenchItemsAfterLoadingInitSources = + initData.initialCamera.focusWorkbenchItems; + } else { + throw error; + } + } } if (isJsonBoolean(initData.showSplitter)) { diff --git a/test/Models/TerriaSpec.ts b/test/Models/TerriaSpec.ts index f93c305add4..d48ccf7526a 100644 --- a/test/Models/TerriaSpec.ts +++ b/test/Models/TerriaSpec.ts @@ -1,5 +1,6 @@ -import { action, runInAction, toJS } from "mobx"; +import { action, runInAction, toJS, when } from "mobx"; import buildModuleUrl from "terriajs-cesium/Source/Core/buildModuleUrl"; +import CesiumMath from "terriajs-cesium/Source/Core/Math"; import RequestScheduler from "terriajs-cesium/Source/Core/RequestScheduler"; import CustomDataSource from "terriajs-cesium/Source/DataSources/CustomDataSource"; import Entity from "terriajs-cesium/Source/DataSources/Entity"; @@ -19,7 +20,6 @@ import ArcGisFeatureServerCatalogItem from "../../lib/Models/Catalog/Esri/ArcGis import ArcGisMapServerCatalogItem from "../../lib/Models/Catalog/Esri/ArcGisMapServerCatalogItem"; import WebMapServiceCatalogGroup from "../../lib/Models/Catalog/Ows/WebMapServiceCatalogGroup"; import WebMapServiceCatalogItem from "../../lib/Models/Catalog/Ows/WebMapServiceCatalogItem"; -import Cesium from "../../lib/Models/Cesium"; import CommonStrata from "../../lib/Models/Definition/CommonStrata"; import { BaseModel } from "../../lib/Models/Definition/Model"; import TerriaFeature from "../../lib/Models/Feature/Feature"; @@ -1611,6 +1611,7 @@ describe("Terria", function () { }); it("sets the pickCoords", async function () { + const Cesium = (await import("../../lib/Models/Cesium")).default; expect(terria.currentViewer instanceof Cesium).toBeTruthy(); await terria.loadPickedFeatures({ pickCoords: { @@ -1681,4 +1682,178 @@ describe("Terria", function () { await terria.start({ configUrl, i18nOptions }); expect(RequestScheduler.requestsByServer["test.domain:333"]).toBe(12); }); + + describe("initial zoom", function () { + describe("behaviour of `initialCamera.focusWorkbenchItems`", function () { + let container: HTMLElement; + + beforeEach(async function () { + jasmine.Ajax.install(); + + // Attach cesium viewer and wait for it to be loaded + container = document.createElement("div"); + document.body.appendChild(container); + terria.mainViewer.viewerOptions.useTerrain = false; + terria.mainViewer.attach(container); + + const configJson = JSON.stringify({ + initializationUrls: ["focus-workbench-items.json"] + }); + + // An init source with a pre-loaded workbench item + const initJson = JSON.stringify({ + initialCamera: { focusWorkbenchItems: true }, + catalog: [ + { + id: "points", + type: "geojson", + name: "Points", + geoJsonData: { + type: "Feature", + bbox: [-10.0, -10.0, 10.0, 10.0], + properties: { + foo: "hi", + bar: "bye" + }, + geometry: { + type: "Polygon", + coordinates: [ + [ + [100.0, 0.0], + [101.0, 0.0], + [101.0, 1.0], + [100.0, 1.0], + [100.0, 0.0] + ], + [ + [100.2, 0.2], + [100.8, 0.2], + [100.8, 0.8], + [100.2, 0.8], + [100.2, 0.2] + ] + ] + } + } + } + ], + workbench: ["points"] + }); + jasmine.Ajax.stubRequest("serverconfig/").andReturn({ + responseText: "{}" + }); + jasmine.Ajax.stubRequest("test-config.json").andReturn({ + responseText: configJson + }); + jasmine.Ajax.stubRequest("focus-workbench-items.json").andReturn({ + responseText: initJson + }); + }); + + afterEach(() => { + terria.mainViewer.destroy(); + document.body.removeChild(container); + jasmine.Ajax.uninstall(); + }); + + it("zooms the map to focus on the workbench items", async function () { + await terria.start({ configUrl: "test-config.json" }); + await terria.loadInitSources(); + await when(() => terria.currentViewer.type === "Cesium"); + + const cameraPos = terria.cesium?.scene.camera.positionCartographic; + expect(cameraPos).toBeDefined(); + const { longitude, latitude, height } = cameraPos!; + expect(CesiumMath.toDegrees(longitude)).toBeCloseTo(100.5); + expect(CesiumMath.toDegrees(latitude)).toBeCloseTo(0.5); + expect(height).toBeCloseTo(191276.7939); + }); + + it("works correctly even when there is a delay in a Cesium/Leaflet viewer becoming available", async function () { + // Start with NoViewer + runInAction(() => { + terria.mainViewer.viewerMode = undefined; + }); + await terria.start({ configUrl: "test-config.json" }); + await terria.loadInitSources(); + expect(terria.currentViewer.type).toEqual("none"); + // Switch to Cesium viewer + runInAction(() => { + terria.mainViewer.viewerMode = ViewerMode.Cesium; + }); + // Wait for the switch to happen + await when(() => terria.mainViewer.currentViewer.type === "Cesium"); + // Ensure that the camera position is correctly updated after the switch + const cameraPos = terria.cesium?.scene.camera.positionCartographic; + const { longitude, latitude, height } = cameraPos!; + expect(CesiumMath.toDegrees(longitude)).toBeCloseTo(100.5); + expect(CesiumMath.toDegrees(latitude)).toBeCloseTo(0.5); + expect(height).toBeCloseTo(191276.7939); + }); + + it("is not applied if subsequent init sources override the initialCamera settings", async function () { + await terria.start({ configUrl: "test-config.json" }); + terria.initSources.push({ + data: { + initialCamera: { + west: 42, + east: 44, + north: 44, + south: 42, + zoomDuration: 0 + } + } + }); + + // Terria uses a 2 second flight duration when zooming to CameraView. + // Here we re-define zoomTo() to ignore duration and zoom to the target + // immediately so that we can observe the effects without delay. + const originalZoomTo = terria.currentViewer.zoomTo.bind( + terria.currentViewer + ); + terria.currentViewer.zoomTo = (target, _duration) => + originalZoomTo(target, 0.0); + + await terria.loadInitSources(); + await when(() => terria.currentViewer.type === "Cesium"); + + const cameraPos = terria.cesium?.scene.camera.positionCartographic; + expect(cameraPos).toBeDefined(); + const { longitude, latitude, height } = cameraPos!; + expect(CesiumMath.toDegrees(longitude)).toBeCloseTo(43); + expect(CesiumMath.toDegrees(latitude)).toBeCloseTo(43); + expect(height).toBeCloseTo(384989.3092); + }); + + it("is not applied when share URL specifies a different initialCamera setting", async function () { + // Terria uses a 2 second flight duration when zooming to CameraView. + // Here we re-define zoomTo() to ignore duration and zoom to the target + // immediately so that we can observe the effects without delay. + await when(() => terria.currentViewer.type === "Cesium"); + const originalZoomTo = terria.currentViewer.zoomTo.bind( + terria.currentViewer + ); + terria.currentViewer.zoomTo = (target, _duration) => + originalZoomTo(target, 0.0); + + await terria.start({ + configUrl: "test-config.json", + applicationUrl: { + // A share URL with a different `initialCamera` setting + href: "http://localhost:3001/#start=%7B%22version%22%3A%228.0.0%22%2C%22initSources%22%3A%5B%7B%22stratum%22%3A%22user%22%2C%22initialCamera%22%3A%7B%22east%22%3A80.48324442836365%2C%22west%22%3A74.16912021554141%2C%22north%22%3A10.82936711956377%2C%22south%22%3A7.882086009700934%7D%2C%22workbench%22%3A%5B%22points%22%5D%7D%5D%7D" + } as Location + }); + + await terria.loadInitSources(); + await when(() => terria.currentViewer.type === "Cesium"); + + const cameraPos = terria.cesium?.scene.camera.positionCartographic; + expect(cameraPos).toBeDefined(); + const { longitude, latitude, height } = cameraPos!; + expect(CesiumMath.toDegrees(longitude)).toBeCloseTo(77.3261); + expect(CesiumMath.toDegrees(latitude)).toBeCloseTo(9.3557); + expect(height).toBeCloseTo(591140.7251); + }); + }); + }); }); From c55cdc1a20cf2d62b743bb54821dbe0dbc0c237f Mon Sep 17 00:00:00 2001 From: Nanda Date: Fri, 16 Jun 2023 14:08:50 +1000 Subject: [PATCH 210/654] Make prettier doc. --- doc/customizing/initialization-files.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/customizing/initialization-files.md b/doc/customizing/initialization-files.md index a851add3e9c..939a019ff6a 100644 --- a/doc/customizing/initialization-files.md +++ b/doc/customizing/initialization-files.md @@ -75,7 +75,7 @@ Init files can be edited two ways: | ----------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `corsDomains` | no | **string[]** | | By default, TerriaJS proxies all requests within the proxy whitelist specified in the [Server-side Config](server-side-config.md), making the assumption that the servers do not support CORS. You can add hosts that are known to support CORS to this property to avoid proxying them. | | `catalog` | no | [**`CatalogItem[]`**](../connecting-to-data/catalog-items.md), [**`CatalogGroup[]`**](../connecting-to-data/catalog-groups.md), [**`CatalogFunction[]`**](../connecting-to-data/catalog-functions.md) | | An array of catalog items, groups and functions. Check example above. | -| `initialCamera` | no | [**`InitialCamera`**](#InitialCamera) | | The location when the map first displays. | +| `initialCamera` | no | [**`InitialCamera`**](#InitialCamera) | | The location when the map first displays. | | `stories` | no | [**`Story[]`**](#story) | | An array of stories to be loaded. | | `viewerMode` | no | **`"3d"`** or **`"3dSmooth"`** or **`"2D"`** | `"3d"` | The id of the viewer mode to be shown initialy. | | `homeCamera` | yes | [**`CameraPosition`**](#CameraPosition) | | Where the camera goes when you click the "home" button between the zoom-in and zoom-out buttons. | From d56bc5af187f85b19daa631ce75690449aaa1b83 Mon Sep 17 00:00:00 2001 From: Staf Smith Date: Tue, 20 Jun 2023 08:18:00 +0800 Subject: [PATCH 211/654] make method private and remove debugger --- lib/Models/Cesium.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/lib/Models/Cesium.ts b/lib/Models/Cesium.ts index 6328910fb73..2d0582fd45a 100644 --- a/lib/Models/Cesium.ts +++ b/lib/Models/Cesium.ts @@ -91,7 +91,6 @@ import GlobeOrMap from "./GlobeOrMap"; import Terria from "./Terria"; import UserDrawing from "./UserDrawing"; import { setViewerMode } from "./ViewerMode"; -import { clone } from "terriajs-cesium"; //import Cesium3DTilesInspector from "terriajs-cesium/Source/Widgets/Cesium3DTilesInspector/Cesium3DTilesInspector"; @@ -1009,7 +1008,7 @@ export default class Cesium extends GlobeOrMap { * @param camera * @returns Camera */ - cloneCamera(camera: Camera): Camera { + private cloneCamera(camera: Camera): Camera { let result = new Camera(this.scene); Cartesian3.clone(camera.position, result.position); Cartesian3.clone(camera.direction, result.direction); @@ -1034,7 +1033,6 @@ export default class Cesium extends GlobeOrMap { : undefined; if (!center) { - debugger; /** In cases where the horizon is not visible, we cannot calculate a center using a pick ray, but we need to return a useful CameraView that works in 3D mode and 2D mode. In this case we can return the correct definition for the cesium camera, with position, direction, and up, From f43a3106ba860d7200f2b90f1a1cfef9a371dc6f Mon Sep 17 00:00:00 2001 From: Stephen Davies Date: Tue, 27 Jun 2023 15:07:26 +1000 Subject: [PATCH 212/654] Update GoogleAnalytics to use GA4 Tsify GoogleAnalytics and switch to using ReactGA.send to avoid errant capitalisation Turn off automatic page_view, but leave explicit pageview --- CHANGES.md | 2 ++ lib/Core/GoogleAnalytics.js | 63 ------------------------------------- lib/Core/GoogleAnalytics.ts | 55 ++++++++++++++++++++++++++++++++ lib/Models/Terria.ts | 6 ++-- package.json | 1 + 5 files changed, 61 insertions(+), 66 deletions(-) delete mode 100644 lib/Core/GoogleAnalytics.js create mode 100644 lib/Core/GoogleAnalytics.ts diff --git a/CHANGES.md b/CHANGES.md index 3f868a25731..965f6be35e7 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -2,6 +2,8 @@ #### next release (8.3.1) +- **Breaking changes:** + - Switched GoogleAnalytics to use Google Analytics 4 properties. Google's Universal properties no longer accept data from 01/07/2023, so migration is necessary anyway. - Fix error when adding deeply nested references in search results. - Fixed bug where sharelinks created with no visible horizon would default to homeCamera view - Improved calculation of 2D view from 3D view when no horizon visible diff --git a/lib/Core/GoogleAnalytics.js b/lib/Core/GoogleAnalytics.js deleted file mode 100644 index 4c3ef6d2269..00000000000 --- a/lib/Core/GoogleAnalytics.js +++ /dev/null @@ -1,63 +0,0 @@ -"use strict"; - -/*global ga*/ -var defaultValue = require("terriajs-cesium/Source/Core/defaultValue").default; -var defined = require("terriajs-cesium/Source/Core/defined").default; -const i18next = require("i18next").default; - -var GoogleAnalytics = function () { - this.key = undefined; - this.options = undefined; -}; - -GoogleAnalytics.prototype.start = function (configParameters) { - this.key = configParameters.googleAnalyticsKey; - this.options = configParameters.googleAnalyticsOptions; - - if (process.env.NODE_ENV === "development") { - console.log(i18next.t("core.googleAnalytics.logEnabledOnDevelopment")); - } -}; - -GoogleAnalytics.prototype.logEvent = function (category, action, label, value) { - initializeGoogleAnalytics(this); - ga("send", "event", category, action, label, value); -}; - -function initializeGoogleAnalytics(that) { - if (defined(window.ga)) { - return; - } - - if (!defined(that.key)) { - console.log(i18next.t("core.googleAnalytics.log")); - window.ga = function () {}; - return; - } - - (function (i, s, o, g, r, a, m) { - i["GoogleAnalyticsObject"] = r; - i[r] = - i[r] || - function () { - (i[r].q = i[r].q || []).push(arguments); - }; - i[r].l = 1 * new Date(); - a = s.createElement(o); - m = s.getElementsByTagName(o)[0]; - a.async = 1; - a.src = g; - m.parentNode.insertBefore(a, m); - })( - window, - document, - "script", - "https://www.google-analytics.com/analytics.js", - "ga" - ); - ga("create", that.key, defaultValue(that.options, "auto")); - ga("set", "anonymizeIp", true); - ga("send", "pageview"); -} - -module.exports = GoogleAnalytics; diff --git a/lib/Core/GoogleAnalytics.ts b/lib/Core/GoogleAnalytics.ts new file mode 100644 index 00000000000..9929f72f6f9 --- /dev/null +++ b/lib/Core/GoogleAnalytics.ts @@ -0,0 +1,55 @@ +"use strict"; + +import i18next from "i18next"; +import ReactGA from "react-ga4"; +import { Analytics, ConfigParameters } from "../Models/Terria"; +import isDefined from "./isDefined"; + +type GoogleAnalyticsConfigParameters = Pick< + ConfigParameters, + "enableConsoleAnalytics" | "googleAnalyticsKey" | "googleAnalyticsOptions" +>; + +export default class GoogleAnalytics implements Analytics { + key: string | undefined = undefined; + options: any = undefined; + + start(configParameters: GoogleAnalyticsConfigParameters) { + this.key = configParameters.googleAnalyticsKey; + this.options = configParameters.googleAnalyticsOptions; + + if (process.env.NODE_ENV === "development") { + console.log(i18next.t("core.googleAnalytics.logEnabledOnDevelopment")); + } + initializeGoogleAnalytics(this); + } + + logEvent(category: string, action: string, label?: string, value?: number) { + const fieldObject: any = { + hitType: "event", + eventCategory: category, + eventAction: action + }; + if (label) { + fieldObject.eventLabel = label; + } + if (isDefined(value)) { + fieldObject.value = value; + } + ReactGA.send(fieldObject); + } +} + +function initializeGoogleAnalytics(that: GoogleAnalytics) { + if (!isDefined(that.key)) { + console.log(i18next.t("core.googleAnalytics.log")); + return; + } + ReactGA.initialize(that.key, { + gaOptions: { anonymizeIp: true, ...(that.options ?? {}) }, + gtagOptions: { + send_page_view: false + } + }); + ReactGA.send({ hitType: "pageview" }); +} diff --git a/lib/Models/Terria.ts b/lib/Models/Terria.ts index 4b8d25591e5..d72f7cb6d9a 100644 --- a/lib/Models/Terria.ts +++ b/lib/Models/Terria.ts @@ -126,7 +126,7 @@ import SelectableDimensionWorkflow from "./Workflows/SelectableDimensionWorkflow // import overrides from "../Overrides/defaults.jsx"; -interface ConfigParameters { +export interface ConfigParameters { /** * TerriaJS uses this name whenever it needs to display the name of the application. */ @@ -364,7 +364,7 @@ interface StartOptions { beforeRestoreAppState?: () => Promise | void; } -interface Analytics { +export interface Analytics { start: ( configParameters: Partial<{ enableConsoleAnalytics: boolean; @@ -376,7 +376,7 @@ interface Analytics { category: string, action: string, label?: string, - value?: string + value?: number ) => void; } diff --git a/package.json b/package.json index 26381b029a6..41937c75fc4 100644 --- a/package.json +++ b/package.json @@ -149,6 +149,7 @@ "react-color": "^2.19.3", "react-datepicker": "0.53.0", "react-dom": "^16.14.0", + "react-ga4": "^2.1.0", "react-i18next": "^11.18.0", "react-responsive": "^5.0.0", "react-select": "^3.1.1", From e5e1e5f72ac52429ad0349112fa9f766ce99ae85 Mon Sep 17 00:00:00 2001 From: Nanda Date: Thu, 29 Jun 2023 14:16:37 +1000 Subject: [PATCH 213/654] Add note on hanging promise --- lib/Models/Terria.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/Models/Terria.ts b/lib/Models/Terria.ts index 2739ff991da..42e92263d29 100644 --- a/lib/Models/Terria.ts +++ b/lib/Models/Terria.ts @@ -1090,6 +1090,9 @@ export default class Terria { // items. So here wait for a valid viewer to become available before // attempting to zoom to the mappable item. const isViewerAvailable = () => this.currentViewer.type !== NoViewer.type; + // Note: In some situations the following use of when() can result in + // a hanging promise if a valid viewer never becomes available, + // for eg: when react is not rendered - `currentViewer` will always be `NoViewer`. await when(isViewerAvailable); await this.currentViewer.zoomTo(firstMappableItem, 0.0); } From f4a3f097bcec390601d45f73947d001be009ac54 Mon Sep 17 00:00:00 2001 From: Nanda Date: Thu, 29 Jun 2023 14:37:48 +1000 Subject: [PATCH 214/654] Make prettier. --- lib/Models/Terria.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Models/Terria.ts b/lib/Models/Terria.ts index 7bbdb410376..81f8cc049aa 100644 --- a/lib/Models/Terria.ts +++ b/lib/Models/Terria.ts @@ -1091,7 +1091,7 @@ export default class Terria { // attempting to zoom to the mappable item. const isViewerAvailable = () => this.currentViewer.type !== NoViewer.type; // Note: In some situations the following use of when() can result in - // a hanging promise if a valid viewer never becomes available, + // a hanging promise if a valid viewer never becomes available, // for eg: when react is not rendered - `currentViewer` will always be `NoViewer`. await when(isViewerAvailable); await this.currentViewer.zoomTo(firstMappableItem, 0.0); From 0722037a62b4dabc8f943f1127b05ea6af7dbf98 Mon Sep 17 00:00:00 2001 From: Mike Wu <41275384+mwu2018@users.noreply.github.com> Date: Thu, 29 Jun 2023 16:04:11 +1000 Subject: [PATCH 215/654] Release v831 (#6814) Bump version to 8.3.1. --- CHANGES.md | 7 +++++-- package.json | 22 +++++++++++----------- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 8ed5095ea7b..c6b8162a93e 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,6 +1,10 @@ # Change Log -#### next release (8.3.1) +#### next release (8.3.2) + +- [The next improvement] + +#### 8.3.1 - 2023-06-29 - **Breaking changes:** - Switched GoogleAnalytics to use Google Analytics 4 properties. Google's Universal properties no longer accept data from 01/07/2023, so migration is necessary anyway. @@ -9,7 +13,6 @@ - Fixed bug where sharelinks created with no visible horizon would default to homeCamera view - Improved calculation of 2D view from 3D view when no horizon visible - Improve WMS and WFS error messages when requested layer names or type names are not present in GetCapabilities. -- [The next improvement] #### 8.3.0 - 2023-05-22 diff --git a/package.json b/package.json index 41937c75fc4..1a75ca3ee35 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "terriajs", - "version": "8.3.0", + "version": "8.3.1", "description": "Geospatial data visualization platform.", "license": "Apache-2.0", "engines": { @@ -17,8 +17,8 @@ "dependencies": { "@babel/core": "^7.16.0", "@babel/parser": "^7.12.14", - "@babel/plugin-proposal-decorators": "^7.10.4", "@babel/plugin-proposal-class-properties": "^7.18.6", + "@babel/plugin-proposal-decorators": "^7.10.4", "@babel/plugin-proposal-object-rest-spread": "^7.20.7", "@babel/preset-env": "^7.10.4", "@babel/preset-react": "^7.0.0", @@ -46,7 +46,7 @@ "@types/dompurify": "^2.3.1", "@types/file-saver": "^1.3.0", "@types/flexsearch": "^0.7.1", - "@types/styled-components": "^5.1.26", + "@types/fs-extra": "^7.0.0", "@types/jasmine": "^2.8.8", "@types/jasmine-ajax": "^3.3.0", "@types/json5": "^0.0.30", @@ -55,6 +55,7 @@ "@types/math-expression-evaluator": "^1.2.0", "@types/ms": "^0.7.31", "@types/mustache": "^0.8.32", + "@types/node-fetch": "^2.6.2", "@types/papaparse": "^4.5.9", "@types/pbf": "^3.0.1", "@types/rbush": "^3.0.0", @@ -66,9 +67,8 @@ "@types/react-test-renderer": "^17.0.1", "@types/retry": "^0.12.0", "@types/shpjs": "^3.4.0", + "@types/styled-components": "^5.1.26", "@types/urijs": "1.19.1", - "@types/node-fetch": "^2.6.2", - "@types/fs-extra": "^7.0.0", "@visx/axis": "^2.1.0", "@visx/clip-path": "^2.1.0", "@visx/event": "^2.1.0", @@ -84,6 +84,7 @@ "babel-loader": "^8.2.3", "babel-plugin-jsx-control-statements": "^4.0.0", "babel-plugin-lodash": "^3.3.4", + "bottleneck": "^2.19.5", "catalog-converter": "^0.0.9", "class-list": "^0.1.1", "classnames": "^2.3.1", @@ -107,9 +108,11 @@ "d3-zoom": "^1.8.3", "dateformat": "^3.0.3", "dompurify": "^2.3.3", + "fetch-mock": "^9.11.0", "file-loader": "^3.0.1", "file-saver": "^1.3.8", "flexsearch": "0.7.21", + "fs-extra": "^7.0.1", "geojson-vt": "^3.2.1", "gulp": "^4.0.0", "hammerjs": "^2.0.6", @@ -136,6 +139,7 @@ "moment": "2.24.0", "ms": "^2.1.3", "mustache": "^2.2.1", + "node-fetch": "^2.6.1", "papaparse": "^5.2.0", "pbf": "^3.0.1", "point-in-polygon": "^1.0.1", @@ -180,18 +184,14 @@ "webpack": "~4.46.0", "webpack-cli": "^3.3.11", "webpack-dev-server": "^3.1.14", - "worker-loader": "^2.0.0", - "fetch-mock": "^9.11.0", - "fs-extra": "^7.0.1", - "node-fetch": "^2.6.1", - "bottleneck": "^2.19.5" + "worker-loader": "^2.0.0" }, "devDependencies": { - "@types/webpack": "4.41.33", "@babel/eslint-parser": "^7.12.16", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@types/dateformat": "^3.0.1", "@types/node": "^18.15.11", + "@types/webpack": "4.41.33", "babel-plugin-styled-components": "^1.10.7", "eslint": "^7.20.0", "eslint-plugin-jsx-control-statements": "^2.2.1", From f7dcffdbbdf1a53cabbb5908a8f1dfd728c7fde6 Mon Sep 17 00:00:00 2001 From: Sven Wiemers Date: Tue, 20 Jun 2023 14:47:56 +0000 Subject: [PATCH 216/654] Translated using Weblate (German) for TerriaJSNext Currently translated at 54.2% (661 of 1218 strings) Translation: TerriaJS/TerriaJSNext Translate-URL: https://hosted.weblate.org/projects/terriajs/terriajsnext/de/ --- wwwroot/languages/de/translation.json | 860 +++++++++++++++++++++++++- 1 file changed, 843 insertions(+), 17 deletions(-) diff --git a/wwwroot/languages/de/translation.json b/wwwroot/languages/de/translation.json index 91c3a52b747..3d7bd6f6608 100644 --- a/wwwroot/languages/de/translation.json +++ b/wwwroot/languages/de/translation.json @@ -3,7 +3,7 @@ "native": "nativ", "performanceLabel": "Leistung", "qualityLabel": "Qualität", - "mapQuality": "Qualität der Rasterkarte:", + "mapQuality": "Qualität der Kartendarstellung:", "nativeResolutionHeader": "Native Geräteauflösung verwenden", "imageOptimisation": "Bild-Optimierung", "baseMap": "Basis-Karte", @@ -18,13 +18,29 @@ }, "viewerModeLabels": { "Leaflet": "2D", - "CesiumEllipsoid": "3D Smooth", + "CesiumEllipsoid": "", "CesiumTerrain": "3D-Gelände" }, - "none": "(Keine)" + "none": "(Keine)", + "terrain": { + "sideLabel": "Gelände anzeigen auf der", + "hideUnderground": "Das Gelände verbirgt unterirdische Merkmale", + "showUndergroundFeatures": "Klicken Sie hier, um die unter der Geländeoberfläche befindlichen Elemente anzuzeigen", + "hideUndergroundFeatures": "Klicken Sie hier, um Merkmale die sich unter der Geländeoberfläche befinden auszublenden", + "right": "Rechts", + "left": "links", + "both": "APK und Daten" + }, + "btnText": "Karteneinstellungen", + "timeline": { + "title": "Chronik", + "alwaysShowLabel": "Klicken Sie hier, um die Zeitleiste nur anzuzeigen, wenn sich zeitlich veränderliche Datensätze im Arbeitsbereich befinden", + "hideLabel": "Klicken Sie hier, um die Zeitleiste immer anzuzeigen, auch wenn sich keine zeitlich veränderliche Datensätze im Arbeitsbereich befinden", + "alwaysShow": "Immer anzeigen" + } }, "featureInfo": { - "latLon": "Lat / Lon ", + "latLon": "", "siteData": "Standortdaten", "noInfoAvailable": "Keine Informationen verfügbar", "locationMarker": "Standortmarker", @@ -32,7 +48,7 @@ "btnCloseFeature": "Datenfeld schließen", "catalogItem": { "moreThanMax": "Es wurden mehr als {{maximum}} {{catalogItemName}} Features gefunden.", - "featuresFound": "Es wurden {{featCount}} {catalogItemName} Features gefunden.", + "featuresFound": "Es wurden {{featCount}} {{catalogItemName}} Features gefunden.", "featureInfoShown": "Die ersten {{maximum}} werden unten angezeigt." }, "panelHeading": "Informationen zum Features", @@ -73,8 +89,10 @@ "commentQuestion": "Kommentar oder Frage", "yourName": "Ihr Name (optional)", "close": "Feedback schließen", - "title": "Feedback", - "feedbackPreamble": "Wir würden uns freuen, von Ihnen zu hören!" + "title": "", + "feedbackPreamble": "Wir würden uns freuen, von Ihnen zu hören!", + "email": "E-Mail Adresse (optional)
    Ohne können wir Sie nicht kontaktieren!", + "minLength": "Die Mindestlänge eines Feedbacks beträgt {{minLength}}" }, "toolsPanel": { "btnTitle": "Erweiterte Werkzeuge", @@ -88,7 +106,10 @@ "totals": "
    Der Katalog enthält {{items}} Artikel in {{groups}} Gruppen.
    ", "countingMessage": "Berechnung, bitte warten…", "loadError": "konnte nicht geladen werden.", - "btnText": "Start" + "btnText": "Start", + "noMapDataEnabled": "Keine Kartendaten aktiviert", + "mapDataState": "{{count}} Datensatz auf Karte aktiviert", + "mapDataState_plural": "{{count}} Datensätze auf Karte aktiviert" }, "share": { "btnMapShareTitle": "Teilen Sie Ihre Karte mit anderen", @@ -98,7 +119,7 @@ "btnStoryShareText": "Teilen", "btnCatalogShareText": "Teilen", "shortenUsingService": "Kürzen der Freigabe-URL mit Hilfe eines Webdienstes", - "embedTitle": "Zum Einbetten kopieren Sie diesen Code, um diese Karte in eine HTML-Seite einzubetten:", + "embedTitle": "Karte einbetten", "btnAdvanced": "Erweiterte Optionen", "creatingPrintView": "Druckansicht anzeigen…", "printViewButton": "Druckansicht anzeigen", @@ -108,17 +129,31 @@ "generatingUrl": "Freigabe-URL generieren…", "shortLinkError": "Beim Versuch, die URL zu kürzen, ist ein Fehler aufgetreten. Bitte überprüfen Sie Ihre Internetverbindung und versuchen Sie es erneut.", "shortLinkShortening": "URL kürzen…", - "browserPrint": "Für bessere Druckergebnisse verwenden Sie bitte die Schaltfläche \"Drucken\" von {{appName}} anstelle der Druckfunktion Ihres Webbrowsers." + "browserPrint": "Für bessere Druckergebnisse verwenden Sie bitte die Schaltfläche \"Drucken\" von {{appName}} anstelle der Druckfunktion Ihres Webbrowsers.", + "embedDescription": "Zum Einbetten kopieren Sie diesen Code, um diese Karte in eine HTML-Seite einzubetten:", + "convertNotificationWarningsTitle": "Technische Details", + "convertNotificationFeedback": "Für Fragen oder Feedback klicken Sie bitte hier.", + "convertErrorTitle": "Freigabelink konnte nicht auf Version 8 aktualisiert werden", + "convertErrorMessage": "Dieser Freigabelink basiert auf einer älteren Version von TerriaJS - der Software, die diese Webkarte betreibt. Beim Versuch, die Freigabedaten zu aktualisieren, ist ein Fehler aufgetreten.", + "convertNotificationHelp": "Wenn Sie den Freigabelink erstellt haben, finden Sie im Hilfemenü Tipps zum Aktualisieren des Freigabelinks.", + "localDataNote": "<0><0>Hinweis:<1>Die folgenden Datenquellen werden NICHT freigegeben, da sie Daten aus diesem lokalen System enthalten. Um diese Datenquellen gemeinsam zu nutzen, veröffentlichen Sie ihre Daten auf einem Webserver und <2>fügen Sie sie mit einer URL ein.", + "convertNotificationTitle": "Hinweis: Freigabelink aktualisiert", + "getShareSaveHelpMessage": "Lesezeichen für Freigabelink setzen", + "convertNotificationMessage": "Dieser Freigabelink basiert auf einer älteren Version von TerriaJS - der Software, die dieses Geoportal betreibt. Obwohl wir uns bemühen, den Link zu erhalten, kann es zu Problemen bei der Visualisierung der Daten kommen.\n\nKlicken Sie auf OK, damit die Warnmeldung verschwindet und Sie mit dem Zugriff auf die Daten fortfahren können.", + "downloadMap": "Karte downloaden (png)" }, "location": { "location": "Standort", "browserCannotProvide": "Ihr Browser kann Ihren Standort nicht zur Verfügung stellen.", "errorGettingLocation": "Fehler beim Abrufen des Standorts", - "myLocation": "Mein Standort" + "myLocation": "Mein Standort", + "originError": "Ihr Browser kann Ihren Standort nur übermitteln, wenn Sie https verwenden. Möglicherweise können Sie stattdessen {{secureUrl}} verwenden.", + "centreMap": "Karte an Ihrem aktuellen Standort zentrieren" }, "measure": { "measureDistance": "Abstand zwischen Standorten messen", - "measureTool": "Messwerkzeug" + "measureTool": "Messwerkzeug", + "measureToolTitle": "Linie messen" }, "general": { "cancel": "Abbrechen", @@ -127,12 +162,27 @@ "next": "Nächster", "prev": "Vorheriger", "open": "Öffnen", - "close": "Schließen" + "close": "Schließen", + "back": "Zurück", + "confirm": "Bestätigen" }, "splitterTool": { "workbench": { - "goright": "Rechts" - } + "goright": "Rechts", + "goleft": "links", + "gorightTitle": "Auf der rechten Seite anzeigen", + "both": "Beide", + "goleftTitle": "Auf der linken Seite anzeigen", + "bothTitle": "Auf beiden Seiten anzeigen", + "copyName": "{{name}} (kopieren)" + }, + "toggleSplitterToolTitle": "Vergleichen", + "toggleSplitterToolDisabled": "Bitte deaktivieren Sie andere Funktionen für den Side-by-Side-Vergleich, um den Standardvergleich zu aktivieren", + "toggleSplitterTool": "Ermöglicht einen Seite-an-Seite-Vergleich zwischen zwei verschiedenen Datensätzen", + "title": "Ziehen Sie nach links oder rechts, um die Ansichten anzupassen", + "errorTitle": "Der Vergleich von Katalogeinträgen ist fehlgeschlagen.", + "modelNotFoundErrorMessage": "Modell-ID `\"{{id}}\"` konnte nicht gefunden werden", + "duplicateModelErrorMessage": "Beim Aufteilen des Katalogeintrags `\"{{name}}\"` ist ein Fehler aufgetreten. Dieser Katalogeintrag unterstützt möglicherweise nicht die Funktion \"Vergleichen\"" }, "AR": { "manualAlignmentTitle": "Manueller Abgleich", @@ -141,14 +191,790 @@ "arTool": "Augmented-Reality-Tool", "manualAlignmentMessage": "Richten Sie Ihr mobiles Gerät so aus, dass es mit der aktuellen Ausrichtung der Karte übereinstimmt, und klicken Sie dann auf den blinkenden Kompass. Wenn derzeit keine Landmarken zum Ausrichten auf der Karte sichtbar sind, können Sie die Karte durch Ziehen und Aufziehen verschieben, bis eine erkennbare Landmarke sichtbar ist, bevor Sie das Gerät an der Karte ausrichten.
    {{img}}

    Tipp: Die Sonne oder der Mond sind oft gute Orientierungspunkte, an denen Sie sich ausrichten können, wenn Sie sich an einem Ort befinden, mit dem Sie nicht vertraut sind (achten Sie darauf, nicht in die Sonne zu schauen - sie kann Ihren Augen schaden).", "confirmText": "Verstanden", - "experimentalFeatureMessage": "Der Augmented Reality-Modus befindet sich derzeit in der Betaphase. Dieser Modus ist nur für die Verwendung auf den neuesten High-End-Mobilgeräten vorgesehen.

    WARNUNG: Dieser Modus kann eine Menge Daten verbrauchen, bitte beachten Sie die Datennutzungsgebühren Ihres Netzbetreibers.

    Die Genauigkeit dieses Modus hängt von der Genauigkeit des internen Kompasses Ihres Mobilgeräts ab." + "experimentalFeatureMessage": "Der Augmented Reality-Modus befindet sich derzeit in der Betaphase. Dieser Modus ist nur für die Verwendung auf den neuesten High-End-Mobilgeräten vorgesehen.

    WARNUNG: Dieser Modus kann eine Menge Daten verbrauchen, bitte beachten Sie die Datennutzungsgebühren Ihres Netzbetreibers.

    Die Genauigkeit dieses Modus hängt von der Genauigkeit des internen Kompasses Ihres Mobilgeräts ab.", + "resetAlignmentTitle": "Ausrichtung zurücksetzen", + "btnHover": "Höhe des Schwebebalken umschalten", + "resetAlignmentMessage": "Kalibrierung der Kompassausrichtung. Wenn die Ausrichtung nicht mit der realen Welt übereinstimmt, versuchen Sie, Ihr Gerät in einer Achterbewegung zu bewegen, um es neu zu kalibrieren. Dies ist jederzeit möglich.

    Vermeiden Sie Orte mit Magnetfeldern oder Metallobjekten, da diese den Kompass des Geräts aus dem Gleichgewicht bringen können.", + "btnRealign": "manuelle Ausrichtung umschalten" }, "legend": { - "e": "O" + "e": "O", + "lat": "Lat", + "n": "N", + "lon": "Lon", + "elev": "Höhe" }, "zoomCotrol": { "zoomOut": "Herauszoomen", "zoomReset": "Zoom zurücksetzen", "zoomIn": "Heranzoomen" + }, + "models": { + "ckan": { + "metadata_created": "Erstellt", + "metadata_modified": "Geändert", + "update_freq": "Aktualisierungsfrequenz", + "dataDescription": "Datenbeschreibung", + "contact_point": "Kontakt", + "licence": "Lizenz", + "author": "Autor" + }, + "arcgisPortal": { + "licence": "Lizenz" + }, + "csw": { + "links": "Links" + }, + "feedback": { + "thanksTitle": "Vielen Dank für Ihr Feedback!", + "thanksMessage": "Ihr Feedback hilft, {{appName}} besser zu machen", + "unableToSendTitle": "Feedback konnte nicht gesendet werden", + "unableToSendMessage": "Das ist etwas peinlich, aber beim Versuch, Ihr Feedback zu senden, ist ein Fehler aufgetreten. Bitte senden Sie es stattdessen per E-Mail an {{email}}." + }, + "sensorObservationService": { + "noMatchingFeatures": "Der Sensorbeobachtungsdienst hat keine Merkmale gefunden, die Ihrer Anfrage entsprechen.", + "alreadyLoadingTitle": "Daten bereits geladen", + "property": "Eigenschaft", + "unknownError": "Der Server meldete einen unbekannten Fehler.", + "exceptionMessage": "Der Server hat einen Fehler gemeldet: \n\n {{exceptionText}}", + "procedure": "Prozedur", + "missingBody": "Der Server antwortete mit einem leeren Body.", + "alreadyLoadingMessage": "Ihre Daten werden hochgeladen. Sie können die Anzeige ändern, sobald sie vollständig hochgeladen sind", + "noFeatures": "Es gibt keine Merkmale, die Ihrer Anfrage entsprechen.", + "unknownFormat": "Der Server antwortete mit einem unbekannten Feature-Format." + }, + "socrataServer": { + "attributes": "Attribute", + "tags": "Schlagwörter", + "licence": "Lizenz", + "description": "Beschreibung", + "retrieveErrorMessage": "Es konnten keine Pakete von diesem Socrata-Server abgerufen werden." + }, + "sdmxCatalogItem": { + "noResultsWithDimensions": "Es wurden keine Ergebnisse gefunden. Bitte wählen Sie im Arbeitsbereich andere Dimensionswerte als die folgenden: \n\n{{dimensions}}", + "viewBy": { + "title": "Ansicht nach", + "time": "Zeitreihen" + }, + "loadDataErrorMessage": "Ungültige Antwort von {{csvUrl}}", + "loadDataErrorTitle": "SDMX-Daten für {{name}} konnten nicht geladen werden" + }, + "sdmxJsonDataflowStratum": { + "loadDataErrorTitle": "SDMX-Datenfluss konnte nicht geladen werden", + "loadDataErrorMessage": { + "noDataflow": "Datenfluss {{catalogItem.dataflowId}} ist ungültig", + "invalidResponse": "Ungültiges JSON-Objekt", + "noDatastructure": "Es konnten keine Datenstrukturen für den Datenfluss {{catalogItem.dataflowId}} gefunden werden" + }, + "defaultUnitMeasure": "Einheiten" + }, + "shareData": { + "generateErrorTitle": "Kurz-URL konnte nicht generiert werden.", + "expandErrorTitle": "URL konnte nicht erweitert werden", + "expandErrorMessage": "Der zum Starten von {{appName}} verwendete Freigabedienst wurde nicht gefunden. Dies kann auf einen Fehler im Link hinweisen oder darauf, dass der Dienst derzeit nicht verfügbar ist.", + "generateErrorMessage": "Beim Versuch, mit dem Datenfreigabedienst eine Kurz-URL zu erzeugen, ist etwas schief gegangen." + }, + "spatialDetailing": { + "name": "Räumliche Detaillierung", + "description": "Vorhersage der Merkmale feinkörniger Regionen durch Lernen und Ausnutzen von Korrelationen zwischen grobkörnigen Daten und Zählungsmerkmalen.", + "regionTypeToPredictName": "Regionstyp für die Vorhersage", + "aggregationFalseDescription": "Die Werte der groben Region sind die Summe der Stichproben in der Region. Zum Beispiel: Gesamtbevölkerung.", + "aggregationTrueName": "Durchschnittliche Aggregation", + "characteristicToPredictName": "Vorauszusagendes Merkmal", + "aggregationName": "", + "aggregationTrueDescription": "Die Werte der groben Region sind der Mittelwert der Stichproben in der Region. Zum Beispiel das durchschnittliche Haushaltseinkommen.", + "aggregationFalseName": "Summenaggregation", + "wrongNumberOfElements": "Die Liste der Werte und die Liste der Regionalcodes enthalten nicht die gleiche Anzahl von Elementen", + "regionTypeToPredictDescription": "Die Art der Region, für die Merkmale vorhergesagt werden sollen.", + "coarseDataRegionTypeName": "Grobdaten Regionstyp", + "aggregationDescription": "Gibt an, wie die Werte der groben Region aggregiert wurden. True, wenn der Wert der Mittelwert der Werte in der Region ist, oder False, wenn der Wert die Summe der Werte in der Region ist.", + "coarseDataRegionTypeDescription": "Die Art der Region, mit der die grobkörnigen Eingabemerkmale verbunden sind.", + "characteristicToPredictDescription": "Das Merkmal, das für jede Region vorhergesagt werden soll.", + "spatialDetailingOf": "Räumliche Detaillierung von {{of}} bei {{at}}" + }, + "tableData": { + "legendNullLabel": "(Kein Wert)", + "bulkGeocoderInfo2Message": "{{nullAddresses}} Adressen fehlen in der CSV-Datei.", + "timeDimensionDisabled": "Zeit deaktiviert (zum Aktivieren anklicken)", + "zFilterDisabled": "Extremwerte erkannt (zum Ausblenden anklicken)", + "bulkGeocoderErrorTitle": "Bulk Geocoder Fehler", + "bulkGeocoderInfoMessage": "Die CSV-Datei enthält Adressen, aber die {{number}} kann nicht auf der Karte gefunden werden: ", + "unsupportedCharactersMessage": "Konnte Längen- und Breitengradpaar {{longitude}},{{latitude}} nicht interpretieren", + "noData": "Keine Daten anzuzeigen", + "unsupportedCharactersTitle": "Ungültige Zeichen in Spalten für Breiten- und Längengrad (lat/lon)", + "bulkGeocoderInfoTitle": "Bulk-Geocoder-Informationen", + "styleDisabledLabel": "Stil deaktivieren", + "zFilterEnabled": "Extremwerte ausgeblendet (zum Anzeigen anklicken)", + "timeDimensionEnabled": "Zeit aktiviert (zum Deaktivieren anklicken)", + "bulkGeocoderErrorMessage": "Die Zuordnung von Adressen zu Längen-Breiten-Koordinaten ist nicht möglich, da beim Abrufen der Adresskoordinaten ein Fehler aufgetreten ist. Bitte überprüfen Sie Ihre Internetverbindung oder versuchen Sie es später noch einmal.", + "legendZFilterLabel": "Extremwerte" + }, + "terria": { + "loadingInitSourcesErrorTitle": "Fehler beim Laden der Kartenkonfiguration", + "loadingInitSourceErrorTitle": "Fehler beim Laden der Initialisierungsquelle", + "loadingInitSourceErrorMessage": "Es konnten keine Initialisierungsinformationen von \"{{fragment}}\" geladen werden, da keine initFragmentPaths definiert sind.", + "initErrorTitle": "Dienste konnten nicht initialisiert werden", + "buttonTitleConfirm": "Ich bin einverstanden", + "loadingInitSourcesErrorMessage": "Beim Laden der {{appName}} Kartenkonfiguration ist ein Fehler aufgetreten — sie wird möglicherweise nicht korrekt angezeigt. Versuchen Sie bitte, die Karte neu zu laden. Wenn das Problem weiterhin besteht, melden Sie es bitte per E-Mail an {{email}}, oder drücken Sie die Schaltfläche unten.", + "loadingBaseMapErrorTitle": "Fehler beim Laden der Basiskarte: `{{name}}`", + "loadConfigErrorTitle": "Terria Map Konfiguration konnte nicht geladen werden", + "initErrorMessage": "Es ist ein Problem mit dem Terria-Server aufgetreten. Dies kann dazu führen, dass einige Ebenen oder der Konvertierungsdienst nicht mehr verfügbar sind.", + "loadingMagdaInitSourceErrorTitle": "Fehler beim Laden der Magda-Initialisierungsquelle", + "loadingInitSourceError2Message": "Es ist ein Fehler beim Laden von Initialisierungsinformationen von aufgetreten: \n*\"{{loadSource}}\"*.", + "parsingStartDataErrorMessage": "Beim Parsen der Startdaten JSON ist ein Fehler aufgetreten.", + "loadingInitJsonMessage": "Beim Laden der JSON-Datei {{url}} ist ein Fehler aufgetreten.", + "loadingBaseMapsErrorTitle": "Fehler beim Laden von Basiskarten", + "loadingWorkbenchItemErrorTitle": "Fehler beim Laden des Datensatzes in den Arbeitsbereich: \"{{name}}\"", + "loadingShareDataErrorTitle": "Fehler beim Laden von Daten", + "disclaimer": "Haftungsausschluss", + "proxyableDomainsDeprecation": "`proxyableDomainsUrl` wird in v8 nicht mehr unterstützt", + "loadingMagdaInitSourceErrorMessage": "Beim Laden von Initialisierungsinformationen aus dem Magda-Datensatz \"{{url}}\" ist ein Fehler aufgetreten.", + "urlLoadErrorTitle": "Problem beim Laden der URL", + "urlLoadErrorMessage": "Bei der Initialisierung von Terria mit URL-Parametern ist ein Problem aufgetreten.", + "loadModelErrorMessage": "Beim Laden des Modells \"{{model}}\" ist ein Fehler aufgetreten." + }, + "terriaJSONcatalog": { + "loadingInitSourceErrorMessage": "Fehler beim Laden der Initialisierungsquelle {{fragment}}, da keine initFragmentPaths definiert sind.", + "name": "Terria JSON Katalogfunktion", + "misconfiguredErrorTitle": "Falsch konfigurierte Init-Datei", + "serviceResponseErrorMessage": "TerriaJsonCatalogFunction sollte einen JSON-String empfangen, erhielt aber {{xhr}}", + "loadingInitSourceError2Message": "Es ist ein Fehler beim Laden von Initialisierungsinformationen von aufgetreten: \n*`{{loadSource}}`*.", + "buttonTitleConfirm": "Ich bin einverstanden", + "misconfiguredErrorMessage": "Dienst nicht konfiguriert für TerriaJsonCatalogFunction HTTP 202.", + "misconfiguredError2Message": "HTTP 202 Konfiguration {{url}} nicht in Antwort vorhanden {{xhr}}", + "requestFailedTitle": "Anforderung fehlgeschlagen", + "serviceResponseErrorTitle": "Dienstantwort ist kein JSON-String", + "requestFailedMessage": "Anfrage mit Statuscode {{status}} fehlgeschlagen.", + "asyncResultDescription": "Dies ist das Ergebnis des Aufrufs des Prozesses oder Dienstes {{name}} zum {{timestamp}} mit den unten stehenden Eingabeparametern.", + "disclaimer": "Haftungsausschluss", + "loadingInitSourceErrorTitle": "Fehler beim Laden der Initialisierungsdaten" + }, + "webFeatureServiceCatalogGroup": { + "invalidWFSServerMessage": "Beim Aufrufen von GetCapabilities auf dem WFS-Server ist ein Fehler aufgetreten. Die Antwort des Servers scheint kein gültiges GetCapabilities-Dokument zu sein.", + "groupNotAvailableTitle": "Gruppe ist nicht verfügbar", + "groupNotAvailableMessage": "Beim Aufrufen von GetCapabilities auf dem WFS-Server ist ein Fehler aufgetreten.", + "accessConstraints": "Web Feature Service Zugriffsbeschränkungen", + "invalidWFSServerTitle": "Ungültiger WFS-Server", + "fees": "Web Feature Service Gebühren", + "abstract": "Web Feature Service Beschreibung" + }, + "webFeatureServiceCatalogItem": { + "noLayerFoundTitle": "Kein Layer gefunden", + "missingUrlTitle": "GetCapabilities konnte nicht geladen werden", + "missingUrlMessage": "Das Dokument GetCapabilities des Web Feature Service (WFS) konnte nicht geladen werden, da das Katalogelement keine `url` hat.", + "serviceDescription": "Dienstbeschreibung", + "dataDescription": "Datenbeschreibung", + "abstract": "Web Feature Service Beschreibung", + "accessConstraints": "Zugriffsbeschränkungen", + "serviceContact": "Servicekontakt", + "missingDataTitle": "Fehlende Daten", + "missingDataMessage": "Der WFS-Datensatz '{{name}}' hat keine Daten zurückgegeben.{{line}}{{line}}Die Katalogdatei wurde entweder falsch eingerichtet oder die Serveradresse hat sich geändert.", + "reachedMaxFeatureLimit": "Warnung: Diese Ebene hat das WFS-Feature-Limit erreicht ({{maxFeatures}})", + "noLayerFoundMessage": "Der WFS-Datensatz '{{name}}' hat keine Layer, die zu '{{typeNames}}' passen. {{suggested}} {{line}}{{line}}Entweder wurde die Katalogdatei falsch eingerichtet oder der WFS-Server hat sich geändert." + }, + "webMapTileServiceCatalogGroup": { + "accessConstraints": "Web Map Service Zugriffsbeschränkungen", + "groupNotAvailableTitle": "Gruppe ist nicht verfügbar", + "invalidWMTSServerTitle": "Ungültiger WMTS-Server", + "fees": "Web Map Service Gebühren", + "abstract": "Web Map Service Beschreibung", + "invalidCapabilitiesTitle": "Ungültige GetCapabilities", + "groupNotAvailableMessage": "Beim Aufrufen von GetCapabilities auf dem WMTS-Server ist ein Fehler aufgetreten.", + "invalidWMTSServerMessage": "Beim Aufrufen von GetCapabilities auf dem WMTS-Server ist ein Fehler aufgetreten. Die Antwort des Servers scheint kein gültiges GetCapabilities-Dokument zu sein.", + "invalidCapabilitiesMessage": "Die URL {{url}} wurde erfolgreich abgerufen, aber es scheint sich nicht um ein gültiges Web Map Tile Service (WMTS) GetCapabilities-Dokument zu handeln. \n\nEntweder wurde die Katalogdatei falsch eingerichtet, oder die Serveradresse hat sich geändert." + }, + "webMapTileServiceCatalogItem": { + "accessConstraints": "Zugriffsbeschränkungen", + "fees": "Web Map Tile Service Gebühren", + "missingUrlMessage": "Das Dokument \"GetCapabilities\" des Web Map Tile Service (WMTS) konnte nicht geladen werden, da das Katalogelement keine `url` hat.", + "serviceContact": "Servicekontakt", + "missingUrlTitle": "GetCapabilities konnte nicht geladen werden", + "serviceDescription": "Dienstbeschreibung", + "noUsableTileMatrixTitle": "Warnung", + "dataDescription": "Datenbeschreibung", + "noUsableTileMatrixMessage": "Diese WMTS-Ebene hat keine Web-Mercator-Kachelmatrix eingestellt - sie wird möglicherweise nicht korrekt angezeigt" + }, + "webProcessingServiceCatalogGroup": { + "invalidCapabilitiesTitle": "Ungültige GetCapabilities", + "invalidServerMessage": "Beim Aufrufen von GetCapabilities auf dem WPS-Server ist ein Fehler aufgetreten. Die Antwort des Servers scheint kein gültiges GetCapabilities-Dokument zu sein.", + "fees": "Web Processing Service Gebühren", + "abstract": "Web Processing Service Beschreibung", + "missingUrlMessage": "Das GetCapabilities-Dokument des Web Processing Service (WPS) konnte nicht geladen werden, da das Katalogelement keine `url` hat.", + "invalidCapabilitiesMessage": "Die URL {{url}} wurde erfolgreich abgerufen, aber es scheint sich nicht um ein gültiges GetCapabilities-Dokument des Web Processing Service (WPS) zu handeln. \n\nEntweder wurde die Katalogdatei falsch eingerichtet, oder die Serveradresse hat sich geändert.", + "accessConstraints": "Web Processing Service Zugriffsbeschränkungen", + "invalidServerTitle": "Ungültiger WPS-Server", + "providerSite": "Web Processing Service Anbieter Webseite", + "missingUrlTitle": "GetCapabilities konnte nicht geladen werden", + "providerName": "Web Processing Service Anbieter" + }, + "webProcessingService": { + "regionTypeDescription": "Art der zu analysierenden Region.", + "invalidWPSServerTitle": "Ungültiger WPS-Server", + "processDescriptionErrorTitle": "Der Prozess hat keine Prozessbeschreibung", + "processDescriptionErrorMessage": "Die WPS DescribeProcess für diesen Prozess enthält keine ProcessDescription.", + "processInputErrorTitle": "Prozess hat keine Eingaben", + "processInputErrorMessage": "Dieser WPS-Prozess sieht keine Eingaben vor.", + "unsupportedParameterErrorMessage": "Der Parameter {{identifier}} ist ein nicht unterstützter Parametertyp.", + "failureReasonUnknowError": "Der Grund des Fehlers ist unbekannt.", + "invalidResponseError2Message": "Die Antwort des WPS-Servers enthält kein Status-Element.", + "regionTypeName": "Region Typ", + "regionParameterName": "", + "invalidResponseErrorTitle": "Ungültige Antwort des WPS-Servers", + "errorDetails": "Fehlerdetails", + "asyncShortReportFailed": "Der Aufruf des Webverarbeitungsdienstes ist fehlgeschlagen. Weitere Details finden Sie auf dem Info-Panel.", + "wpsResult": "Web Processing Service Ergebnis", + "invalidWPSServerMessage": "Beim Aufruf von {{endpoint}} auf dem WPS-Server für Prozessname {{name}} ist ein Fehler aufgetreten. Die Antwort des Servers scheint kein gültiges {{endpoint}}-Dokument zu sein.", + "invalidResponseError2Title": "Ungültige Antwort vom WPS-Server", + "unsupportedParameterErrorTitle": "Nicht unterstützter Parametertyp", + "invalidResponseErrorMessage": "Beim Zugriff auf den Statusort auf dem WPS-Server für den Prozessnamen {{name}} ist ein Fehler aufgetreten.", + "resultPendingDescription": "Dies ist das Ergebnis des Aufrufs des Prozesses oder Dienstes {{name}} zum {{timestamp}} mit den unten stehenden Eingabeparametern." + }, + "georss": { + "description": "Beschreibung", + "link": "Link", + "author": "Autor", + "category": "Kategorie", + "updated": "Aktualisiert", + "subtitle": "Untertitel" + }, + "placesLikeMe": { + "regionsLikeThisName": "Regionen wie diese", + "characteristics": "Merkmale", + "name": "Orte wie ich", + "likenessesError": "Die Liste der Ähnlichkeiten und die Liste der Regionalcodes enthalten nicht die gleiche Anzahl von Elementen.", + "placesLike": "Orte wie {{regionName}}", + "regionTypeDescription": "Art der zu analysierenden Region.", + "regionTypeName": "Art der Region", + "regionDescription": "Die zu analysierende Region. Bei der Analyse wird ermittelt, welche Regionen dieser Region am ähnlichsten sind.", + "regioNotSelectedName": "Region nicht ausgewählt", + "characteristicsDescription": "Die Merkmale der Region, die in die Analyse einbezogen werden sollen.", + "regionsLikeThisDescription": "Identifiziert Regionen, die einer bestimmten Region anhand einer Reihe von Merkmalen _am ähnlichsten_ sind.", + "regioNotSelectedDescription": "Sie müssen eine Region auswählen." + }, + "regionMapping": { + "notRecognisedText": "nicht erkannt", + "moreThanOneValue": "Diese Regionen hatten {{moreThanOneValueText}}", + "moreThanOneValueText": "mehr als einen Wert", + "invalidServerTypeTitle": "Ungültiger ServerTyp {{serverType}} in regionMapping.json", + "noDataForDate": "Keine Daten für das ausgewählte Datum.", + "msg": "Unter {{link}} erfahren Sie, wie Sie die Datei formatieren können.", + "notRecognised": "Diese Regionsnamen waren {{notRecognisedText}} ", + "noDataForRegion": "Keine Daten für die ausgewählte Region.", + "outdatedBrowserTitle": "Veralteter Webbrowser", + "outdatedBrowserMessage": "Sie verwenden einen sehr alten Webbrowser, der \"region mapped\"-Datensätze wie diesen nicht anzeigen kann. Bitte aktualisieren Sie so bald wie möglich auf die neueste Version von $t(browsers.chrome), $t(browsers.firefox), $t(browsers.edge), oder $t(browsers.safari).", + "invalidServerTypeMessage": "Erwartet wurde \"WMS\" oder \"vector\", angegeben wurde jedoch \"{{serverType}}\"", + "csvSpecification": "CSV-geo-au Spezifikation", + "issuesLoadingTitle": "Probleme beim Laden von {{name}}" + }, + "webMapServiceCatalogGroup": { + "groupNotAvailableMessage": "Beim Aufrufen von GetCapabilities auf dem WMS-Server ist ein Fehler aufgetreten.", + "invalidWMSServerTitle": "Ungültiger WMS-Server", + "missingUrlTitle": "GetCapabilities konnte nicht geladen werden", + "groupNotAvailableTitle": "Gruppe ist nicht verfügbar", + "abstract": "Web Map Service Beschreibung", + "accessConstraints": "Web Map Service Zugriffsbeschränkungen", + "fees": "Web Map Service Gebühren", + "invalidWMSServerMessage": "Beim Aufrufen von GetCapabilities auf dem WMS-Server ist ein Fehler aufgetreten. Die Antwort des Servers scheint kein gültiges GetCapabilities-Dokument zu sein.", + "missingUrlMessage": "Das Dokument GetCapabilities des Web Map Service (WMS) konnte nicht geladen werden, da das Katalogelement keine `url` hat." + }, + "webMapServiceCatalogItem": { + "defaultStyleLabel": "Standard-Stil", + "noLayerFoundTitle": "Kein Layer gefunden", + "noLayerFoundMessage": "Der WMS-Datensatz '{{name}}' hat keine Layer, die zu '{{layers}}' passen. {{suggested}} {{line}}{{line}}Die Katalogdatei wurde entweder falsch eingerichtet, oder der WMS-Server hat sich geändert.", + "missingDataTitle": "Fehlende Daten", + "badlyFormatedTitle": "Fehlerhaft formatierte Periodizität", + "badlyFormatedMessage": "Der Datensatz '{{name}}' hat eine schlecht geformte Periodizität, '{{isoSegments}}'. Klicken Sie auf die Schaltfläche \"Info\" des Datensatzes, um weitere Informationen über den Datensatz und den Datenverwalter zu erhalten.", + "missingUrlMessage": "Das Dokument \"GetCapabilities\" des Web Map Service (WMS) konnte nicht geladen werden, da das Katalogelement keine `url` hat.", + "dataDescription": "Datenbeschreibung", + "accessConstraints": "Zugriffsbeschränkungen", + "missingUrlTitle": "GetCapabilities konnte nicht geladen werden", + "missingDataMessage": "Der WMS-Datensatz '{{name}}' hat keine Daten zurückgegeben.{{line}}{{line}}Die Katalogdatei wurde entweder falsch eingerichtet, oder die Serveradresse hat sich geändert.", + "serviceContact": "Servicekontakt", + "serviceDescription": "Dienstbeschreibung" + }, + "userDrawing": { + "btnCancel": "Abbruch", + "otherEntities": "Linien und Polygone", + "pointEntities": "Punkte", + "messageHeader": "Auf Karte zeichnen", + "line": "Linie", + "clickToRedrawRectangle": "Klicken Sie auf einen anderen Punkt, um das Rechteck neu zu zeichnen", + "anotherPoint": "Weiterer Punkt", + "userPolygon": "Benutzer Polygon", + "clickToAddAnotherPoint": "Klicken, um weiteren Punkt hinzuzufügen", + "btnDone": "Fertig", + "devError": "Terria-Instanz ist erforderlich.", + "firstPoint": "Erster Punkt", + "clickToAddFirstPoint": "Klicken, um Punkt hinzuzufügen" + }, + "shadow": { + "options": { + "none": "Keine" + }, + "name": "Schatten" + }, + "arcGisMapServerCatalogGroup": { + "serviceDescription": "Dienstbeschreibung", + "dataDescription": "Datenbeschreibung", + "groupNotAvailableTitle": "Gruppe ist nicht verfügbar" + }, + "sdmxServerStratum": { + "sdmxStructureLoadErrorTitle": "SDMX-Strukturanforderung fehlgeschlagen", + "loadDataErrorTitle": "SDMX-Gruppe konnte nicht geladen werden", + "loadDataErrorMessage": "Der Server hat keine Datenfluss" + }, + "arcGisFeatureServerCatalogItem": { + "serviceDescription": "Dienstbeschreibung", + "dataDescription": "Datenbeschreibung" + }, + "arcGisMapServerCatalogItem": { + "serviceDescription": "Dienstbeschreibung", + "dataDescription": "Datenbeschreibung" + }, + "arcGisService": { + "groupNotAvailableTitle": "Gruppe ist nicht verfügbar" + }, + "arcGisFeatureServerCatalogGroup": { + "groupNotAvailableTitle": "Gruppe ist nicht verfügbar", + "dataDescription": "Datenbeschreibung", + "serviceDescription": "Dienstbeschreibung" + }, + "catalog": { + "unsupportedFileTypeTitle": "Nicht unterstützter Dateityp", + "group": "Gruppe", + "unsupportedTypeTitle": "Unbekannter Typ" + }, + "senaps": { + "availableStreamsHeadingFeatureInfo": "Verfügbare Streams", + "locationHeadingFeatureInfo": "Standort", + "noStreamsMessageFeatureInfo": "An diesem Ort sind keine Streams verfügbar.", + "missingKeyErrorMessage": "Ein Senaps API-Schlüssel sollte mit der Option appendParamToQueryString zur terriajs-server-Konfiguration hinzugefügt werden", + "missingSenapsBaseUrl": "Senaps Basis-URL nicht angegeben. Sind Sie angemeldet?", + "generalErrorMessage": "Bei der Verarbeitung von Senaps-Daten ist ein Fehler aufgetreten" + }, + "time": { + "invalidDate": "Ungültiges Datum", + "invalidInitialTimeSource": "Ungültige initialTimeSource in der Konfigurationsdatei angegeben: {{initialTimeSource}}" + }, + "getToken": { + "errorTitle": "Token-Fehler" + }, + "raiseError": { + "developerDetails": "Entwickler Details", + "errorTitle": "Ein Fehler ist aufgetreten", + "notificationFeedbackEmail": "Bei Fragen oder Anregungen wenden Sie sich bitte an {{email}}", + "notificationFeedback": "Für Fragen oder Feedback klicken Sie bitte hier." + }, + "threddsItem": { + "name": "THREDDS Elementbezeichnung" + }, + "wfsFeatures": { + "featuresGroup": "Gruppe von Merkmalen in einem Web Feature Service (WFS) Server", + "groupNotAvailableTitle": "Gruppe ist nicht verfügbar" + }, + "resultPending": { + "name": "Ergebnis ausstehend" + }, + "openDataSoft": { + "viewDatasetPage": "Seite \"Datensatz\" anzeigen" + }, + "thredds": { + "nameGroup": "THREDDS Katalog Gruppe" + }, + "gltf": { + "error": "Fehler" + }, + "arcGisFeatureServer": { + "groupNotAvailableTitle": "Gruppe ist nicht verfügbar" + }, + "terrainCatalog": { + "notSupportedErrorTitle": "Nicht in 2D unterstützt", + "notSupportedErrorMessage": "{{name}} kann in der 2D-Ansicht nicht angezeigt werden. Wechseln Sie zu 3D und versuchen Sie es erneut" + } + }, + "itemSearchTool": { + "resetBtnText": "Eingabe löschen", + "searching": "Suchen", + "backBtnText": "Weiter suchen", + "searchBtnText": "Suche" + }, + "compare": { + "dateButton": { + "right": "Rechts" + }, + "dateLocationFilter": { + "mouseTooltipMessage": "Rechtsklick zum Abbrechen", + "cancel": "Abbruch", + "mouseTooltipTitle": "Ort auswählen" + }, + "info": "Vergleichen Sie Datensätze aus Ihrem Arbeitsbereich nebeneinander auf der Karte." + }, + "workbench": { + "diffImageTitle": "Bildunterschiede zwischen zwei Daten anzeigen", + "colorScaleUpdateRange": "Aktualisieren", + "previewItem": "Dateninformationen", + "colorScaleRange": "Farbskala-Bereich", + "colorScaleRangeTitle": "Ungültiger Farbskalenbereich", + "colorScaleRangeMin": "Der Minimalwert muss eine Zahl sein.", + "colorScaleRangeMax": "Der Maximalwert muss eine Zahl sein.", + "addItemErrorMessage": "Beim Laden des Katalogeintrags ist ein Fehler aufgetreten.", + "splitScreenMode": "SPLITSCREEN-MODUS", + "openFeature": "Zoomen auf", + "splitItem": "Vergleichen", + "removeAll": "Alle entfernen", + "expandAll": "Alle ausklappen", + "colorScaleRangeMinSmallerThanMax": "Der Minimalwert des Farbskalenbereichs muss kleiner als der Höchstwert sein.", + "splitItemTitle": "Duplizieren und Splitter anzeigen", + "removeFromMapTitle": "Entfernen der Daten", + "toggleVisibility": "Daten ein-/ausblenden", + "addItemErrorTitle": "Katalogeintrag konnte nicht zum Arbeitsbereich hinzugefügt werden.", + "opacity": "Deckkraft: {{opacity}} %", + "zoomToTitle": "Zoom auf Ausdehnung", + "diffImage": "Differenz", + "exportDataTitle": "Kartendaten exportieren", + "collapseAll": "Alles einklappen", + "dimensionsSelector": { + "undefinedLabel": "Keine Angabe" + }, + "removeFromMap": "Entfernen", + "showMoreActionsTitle": "Weitere Aktionen anzeigen", + "rangeMin": "Minimum:", + "searchItemTitle": "Suche", + "exportData": "Exportieren", + "label": "Datensätze", + "searchItem": "Suche", + "previewItemTitle": "Dateninformationen", + "rangeMax": "Maximum:", + "displayPercent": "Anzeige als Prozentsatz der regionalen Gesamtsumme", + "zoomTo": "Idealer Zoom", + "openFeatureTitle": "Auf Daten zoomen" + }, + "trainer": { + "expandTrainer": "Mehr Details zum Schritt anzeigen", + "collapseTrainer": "Schrittdetail ausblenden", + "showAllSteps": "Alle Schritte anzeigen", + "hideAllSteps": "Alle Schritte ausblenden" + }, + "tour": { + "preface": { + "title": "Starte die Tour", + "content": "Sie wissen nicht, wo Sie anfangen sollen? Machen Sie einen kurzen Rundgang durch die Hauptmerkmale unserer Software und lernen Sie einige der wichtigsten Funktionen kennen, die Ihnen den Einstieg erleichtern.", + "close": "Vielleicht später", + "start": "Tour Starten" + }, + "finish": "Beenden", + "locationSearchInput": { + "content": "## Standortsuche\n\nGeben Sie einen Ort oder eine Adresse ein, um einen Punkt von Interesse auf der Karte zu finden." + }, + "menuBarMapSettingsButton": { + "content": "## Karteneinstellungen\n\nPassen Sie Karteneinstellungen wie Basiskarten, 2D/3D-Gelände und Kartenbildqualität an, um die Leistung zu verbessern." + }, + "mapNavigationCompassOuterRing": { + "content": "## Karten Steuerung\n\nHier können Sie die Darstellung der Karte ändern. Mit dem äußeren Ring können Sie die Ausrichtung der Darstellung ändern, und mit dem inneren Ring können Sie den Kamerawinkel neigen. Doppelklicken Sie, um die Ansicht zurückzusetzen." + }, + "sidePanelUploadButton": { + "content": "## Upload von Daten\n\nSie können Ihre eigenen Daten auf die Karte hochladen, um sie mit anderen Datensätzen anzuzeigen. Laden Sie eine Datei oder einen Link zu einem bestehenden Online-Datensatz oder Datendienst hoch. Zu den unterstützten Datenformaten gehören CSV, GeoJSON, KML, GPX und CZML." + }, + "menuBarStoryButton": { + "content": "## Stories\n\nMit Stories können Sie einem Datensatz kontextbezogene Informationen hinzufügen, um eine Geschichte zum Leben zu erwecken. Erstellen Sie Ihre eigene Datenstory mit dem Story-Editor und teilen Sie sie über das Bedienfeld \"Teilen\", sobald Sie fertig sind." + }, + "mapNavigationSplitterIcon": { + "content": "## Vergleichen\n\nEine leistungsstarke Funktion von Terria ist die Möglichkeit, Datensätze in einer geteilten Bildschirmansicht zu vergleichen. Bei Datensätzen mit einer Zeitserienkomponente, wie z. B. Satellitenbildern, können Sie die Daten vorwärts und rückwärts vergleichen, indem Sie auf den Datumsauswahlschalter klicken." + }, + "exploreMapDataButton": { + "content": "## Datenkatalog\n\nDurchsuchen Sie den Katalog der verfügbaren Daten und fügen Sie sie hier zur Karte hinzu. Sie können mehrere Datensätze gleichzeitig hinzufügen. Sie werden unten im Arbeitsbereich aufgelistet." + } + }, + "compass": { + "guidance": { + "innerCircleTitle": "Innerer Kreis", + "ctrlDragDescription": "Sie können die Karte auch neigen und drehen, indem Sie die STRG-Taste gedrückt halten und die Karte verschieben.", + "dismissText": "Schließen und nicht mehr anzeigen", + "title": "Gyroskop-Steuerungen", + "innerCircleDescription1": "Klicken Sie in die Mitte und ziehen Sie langsam nach oben, unten, links oder rechts, um die Karte zu kippen und gleichzeitig zu drehen.", + "innerCircleDescription2": "Doppelklicken Sie hier, um die Ansicht auf ihren Standardzustand zurückzusetzen.", + "outerRingTitle": "Äußerer Kreis", + "outerRingDescription": "Ziehen Sie den äußeren Ring in einer kreisförmigen Bewegung, um die Kartenansicht um 360˚ zu drehen." + }, + "description": "Ziehen Sie den äußeren Ring: drehen Sie die Ansicht.\nInneres Gyroskop ziehen: freie Umlaufbahn.\nDoppelklick: Ansicht zurücksetzen.\nTIPP: Sie können den Orbit auch freigeben, indem Sie die STRG-Taste gedrückt halten und die Karte ziehen.", + "title": "Klicken und ziehen, um die Kamera zu drehen", + "guidanceBtnTitle": "Gyroskop-Lenkung", + "guidanceBtnText": "Detaillierte Anweisungen zur Verwendung des Kompasses anzeigen" + }, + "tool": { + "loadingError": { + "title": "Fehler beim Laden des {{toolName}} Tools", + "message": "Beim Versuch, dieses Tool vom Server zu laden, ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut." + }, + "button": { + "open": "Schließe {{toolNameLowerCase}}" + }, + "closeButtonTitle": "Schließe {{toolName}} Tool", + "exitBtnTitle": "Schließen" + }, + "diffTool": { + "title": "Differenz", + "instructions": { + "setDateA": "Setze Datum A", + "setDateB": "Setze Datum B", + "changeDates": "Datum ändern", + "paneDescription": "Visualisieren und vergleichen Sie die Differenz zwischen zwei Datensätzen an einem Standort." + }, + "exit": "Schließen", + "labels": { + "area": "Gebiet", + "dates": "Daten", + "areaFilterSelection": "Auswahl des Gebietsfilters", + "sourceDataset": "Quelldatensatz", + "dateComparisonB": "Datumsvergleich B", + "disabledButtonPrompt": "Bitte beachten Sie: Es müssen ein Ort und ein Datum ausgewählt werden, um mit der Änderungserkennung fortzufahren", + "dateComparisonA": "Datumsvergleich A", + "previewStyle": "Vorschaustil", + "differenceOutput": "Differenz-Output", + "generateDiffButtonText": "Änderungserkennung generieren" + }, + "locationDisplay": { + "noLocationSelected": { + "title": "Kein Standort gewählt", + "description": "Um die Datumsauswahl nach Ort zu filtern, wählen Sie bitte einen Punkt auf der Karte" + }, + "locationSelected": { + "title": "Standort ausgewählt & Daten gefiltert", + "description": "Zum Ändern klicken Sie auf einen anderen Punkt auf der Karte" + } + }, + "locationPicker": { + "initialMessages": { + "title": "Wählen Sie einen genauen Standort", + "beforePick": "Dies wird benötigt, um den Prozess zur Erkennung von Änderungen durchzuführen.", + "afterPick": "Klicken Sie auf einen anderen Punkt, um die ausgewählte Region zu ändern" + }, + "nextMessages": { + "beforePick": "Klicken Sie auf einen anderen Punkt, um die Auswahl zu ändern", + "afterPick": "Klicken Sie auf einen anderen Punkt, um die Auswahl zu ändern", + "title": "Sie haben den Standort {{latitude}} {{longitude}} ausgewählt" + }, + "errorMessages": { + "afterPick": "Klicken Sie auf einen anderen Punkt, um die Auswahl zu ändern", + "title": "Wählen Sie einen genauen Standort", + "beforePick": "Bilder am Standort konnten nicht aufgelöst werden! Bitte wählen Sie einen anderen Standort oder eine andere Zoomstufe." + } + }, + "datePicker": { + "previousDateTitle": "Vorheriges Datum", + "dateButtonTitle": "Wählen Sie ein Datum", + "back": "Zurück", + "nextDateTitle": "Nächstes Datum" + }, + "choosePreview": "Wählen Sie den Stil des Vorschaumodus", + "differenceResultsTitle": "Ergebnisse der Veränderungserkennung", + "chooseDifference": "Wählen Sie eine Differenz-Output" + }, + "story": { + "removeAllStories": "Alle entfernen", + "editor": { + "saveBtn": "speichern", + "saveStory": "Speichern", + "cancelEditing": "Abbruch", + "cancelBtn": "abbrechen" + }, + "story": "", + "storyEditor": "", + "view": "Darstellung", + "editStory": "bearbeiten", + "edit": "Bearbeiten", + "recapture": "Erneut aufnehmen", + "deleteStory": "löschen", + "delete": "Löschen", + "prev": "Vorheriger", + "panelTitle": "Story Editor", + "play": "Abspielen", + "gettingStarted": "Erste Schritte", + "next": "Nächster", + "gettingStartedTitle": "Erste Schritte", + "badgeBarLabel": "Szenen", + "share": "Teilen", + "viewStory": "darstellen" + }, + "addData": { + "addDataBtnText": "Datenkatalog", + "dragDrop": "", + "infoText": "<0>Ziehen Sie eine Datei hierher, um sie lokal auf der Karte anzuzeigen<1>(sie wird nicht gespeichert oder ins Internet hochgeladen)", + "back": "Zurück", + "myData": "Meine Daten", + "browse": "Durchsuchen...", + "btnHide": "Ausblenden", + "done": "Fertig", + "urlInputBtn": "Hinzufügen", + "closeDataPanel": "Datenfeld schließen" + }, + "clipboard": { + "shareURL": "URL teilen", + "success": "In Zwischenablage kopiert", + "copy": "Kopieren" + }, + "emptyWorkbench": { + "emptyArea": "Ihre Arbeitsbereich ist leer", + "helpfulHintsOne": "Durchsuchen Sie die verfügbaren Daten, indem Sie den \"Datenkatalog\" auswählen, oder klicken Sie auf \"Upload\", um der Karte Ihre eigenen Daten hinzuzufügen.", + "helpfulHintsTwo": "Sobald Sie der Karte Daten hinzugefügt haben, werden Ihre aktiven Datensätze hier in Ihrem Arbeitsbereich aufgeführt. Der Arbeitsbereich hilft Ihnen bei der Interaktion mit den Daten.", + "helpfulHintsThree": "Im Arbeitsbereich können Sie Datensätze ein- und ausschalten, ihre Deckkraft ändern, den Vergleich im Splitscreen-Modus aktivieren, Stile ändern und durch Datums- und Zeitangaben navigieren, sofern die Daten diese Funktion unterstützen.", + "helpfulHints": "Nützliche Hinweise" + }, + "map": { + "drawExtentHelper": { + "extent": "Ausdehnung" + }, + "gnafAddressGeocoder": { + "score": "Bewertung", + "suburb": "Vorort", + "state": "Zustand", + "postcode": "Postleitzahl", + "lon": "" + }, + "cesium": { + "stoppedRenderingMessage": "Dies kann durch einen Datensatz verursacht worden sein, der gerade zum Arbeitsbereich hinzugefügt wurde. Bitte versuchen Sie, diesen zu entfernen. Wenn das Problem dadurch nicht behoben wird, müssen Sie möglicherweise {{appName}} neu laden." + }, + "extraCreditLinks": { + "disclaimer": "Haftungsausschluss" + } + }, + "helpPanel": { + "btnText": "Hilfe", + "dismissText": "Verstanden, danke!", + "promptMessage": "Die Tour, Anleitungsvideos und andere Hilfsinhalte finden Sie hier", + "takeTour": "Starten Sie die Tour", + "mapUserGuide": "Benutzerhandbuch der Karte", + "menuPaneBody": "Nützliche Tipps zur Verwendung von TerriaJS finden Sie entweder in den folgenden Anleitungen oder Sie können das Team unter [{{supportEmail}}]({{supportEmail}}) kontaktieren", + "menuPaneTitle": "Wir sind für Sie da" + }, + "search": { + "resultsLabel": "Suchergebnisse", + "data": "Daten", + "done": "Fertig" + }, + "mobile": { + "addDataBtnText": "Daten", + "doneBtnText": "Fertig", + "toggleNavigation": "Navigation" + }, + "preview": { + "disclaimer": "Haftungsausschluss", + "dataDescription": "Datenbeschreibung", + "author": "Autor", + "contact": "Kontakt", + "serviceDescription": "Dienstbeschreibung", + "created": "Erstellt", + "modified": "Verändert", + "licence": "Lizenz", + "accessConstraints": "Zugriffsbeschränkungen", + "fees": "Gebühren", + "updateFrequency": "Aktualisierungsfrequenz" + }, + "description": { + "layerName": "Layername", + "typeName": "Typenname", + "name": "Beschreibung" + }, + "concept": { + "active": { + "edit": "Bedingung bearbeiten", + "remove": "Bedingung entfernen" + }, + "inactive": { + "cancel": "Abbruch" + }, + "summary": { + "addMoreText": "Bedingung hinzufügen" + } + }, + "dataCatalog": { + "groupRemove": "Gruppe löschen" + }, + "catalogItem": { + "remove": "Entfernen", + "add": "Hinzufügen", + "loading": "Laden..." + }, + "chart": { + "closePanel": "Panel schließen", + "expand": "Erweitern", + "download": "Herunterladen", + "sectionLabel": "Diagramme" + }, + "emptyWorkbenchMessage": "<0><0>Ihr Arbeitsbereich ist leer<1>Klicken Sie oben auf '$t(addData.addDataBtnText)'<2><0>Durchsuchen Sie den Datenkatalog<1>Laden Sie Ihre eigenen Daten in die Karte<3><0>Hinweis.<2>Alle Ihre aktiven Datensätze werden hier aufgelistet", + "welcomeMessage": { + "exploreDataBtnText": "Datenkatalog", + "searchBtnText": "Nach einem Ort suchen" + }, + "satelliteGuidance": { + "prevI": "Nein danke", + "bodyIII": "Um historische Bilder zu laden, wählen Sie in Ihrem Arbeitsbereich das Erfassungsdatum über das Dropdown-Menü für einen der verfügbaren Zeitpunkte aus.", + "bodyV": "Sie können eine Reihe von Stilen, wie z. B. Falschfarben, auf Satellitenbilder anwenden, indem Sie auf das Dropdown-Menü \"Stile\" in Ihrem Arbeitsbereich klicken.", + "bodyIV": "Satellitenbilder sind möglicherweise nicht immer zu dem von Ihnen gewünschten Zeitpunkt und an dem von Ihnen gewünschten Ortverfügbar. Wenn Sie nur Bilder für einen bestimmten Ort anzeigen möchten, klicken Sie in Ihrem Arbeitsbereich auf \"Nach Ort filtern\"." + }, + "satellite": { + "zoomTo": "Zoomen auf", + "removeFilter": "Filter löschen", + "newLocation": "Neue Standortsuche" + }, + "analytics": { + "selectLocation": "Ort wählen", + "polygon": "Polygon", + "regionName": "Regionsname" + }, + "core": { + "dataType": { + "sdmx-group": "SDMX-JSON", + "csv": "CSV", + "gpx": "", + "czml": "CZML", + "json": "Terria Katalog", + "carto": "", + "gltf": "" + }, + "terriaError": { + "defaultMessage": "Unbekannter Fehler", + "defaultTitle": "Ein Fehler ist aufgetreten" + }, + "unverifiedExternalLink": { + "denyText": "Abbruch" + } + }, + "browsers": { + "safari": "", + "chrome": "", + "firefox": "", + "edge": "" + }, + "deltaTool": { + "cancelBtn": "Abbruch" + }, + "notification": { + "title": "Nachricht" + }, + "printView": { + "loading": "Druckansicht anzeigen…" + }, + "pedestrianMode": { + "controls": { + "title": "Steuerungen" + } + }, + "viewModels": { + "searchAddresses": "Adressen", + "searchLocations": "Orte" + }, + "languagePanel": { + "changeLanguage": "Sprache ändern" + }, + "dateTime": { + "back": "Zurück", + "timeline": { + "gotoStart": "Gehe zum Anfang", + "togglePlay": "Abspielen" + } + }, + "loader": { + "loadingMessage": "Laden" } } From f8efd9fa2a87dad3fd644985d18d9943a2a60259 Mon Sep 17 00:00:00 2001 From: Sven Wiemers Date: Wed, 21 Jun 2023 13:18:25 +0000 Subject: [PATCH 217/654] Translated using Weblate (German) for TerriaJSNext Currently translated at 100.0% (1218 of 1218 strings) Translation: TerriaJS/TerriaJSNext Translate-URL: https://hosted.weblate.org/projects/terriajs/terriajsnext/de/ --- wwwroot/languages/de/translation.json | 827 +++++++++++++++++++++++--- 1 file changed, 747 insertions(+), 80 deletions(-) diff --git a/wwwroot/languages/de/translation.json b/wwwroot/languages/de/translation.json index 3d7bd6f6608..3903156ba9e 100644 --- a/wwwroot/languages/de/translation.json +++ b/wwwroot/languages/de/translation.json @@ -18,7 +18,7 @@ }, "viewerModeLabels": { "Leaflet": "2D", - "CesiumEllipsoid": "", + "CesiumEllipsoid": "3D Smooth", "CesiumTerrain": "3D-Gelände" }, "none": "(Keine)", @@ -40,7 +40,7 @@ } }, "featureInfo": { - "latLon": "", + "latLon": "Lat / Lon ", "siteData": "Standortdaten", "noInfoAvailable": "Keine Informationen verfügbar", "locationMarker": "Standortmarker", @@ -57,7 +57,9 @@ "noDataAvailable": "An diesem Standort sind keine Daten verfügbar - versuchen Sie einen anderen Standort.", "clickMap": "Klicken Sie auf die Karte, um mehr über einen Standort zu erfahren", "pickLocation": "Standort wählen", - "download": "Diese Tabelle herunterladen" + "download": "Diese Tabelle herunterladen", + "showRawData": "Rohdaten anzeigen", + "showCuratedData": "Kuratierte Daten anzeigen" }, "sui": { "hideWorkbench": "Arbeitsbereich ausblenden", @@ -89,7 +91,7 @@ "commentQuestion": "Kommentar oder Frage", "yourName": "Ihr Name (optional)", "close": "Feedback schließen", - "title": "", + "title": "Feedback", "feedbackPreamble": "Wir würden uns freuen, von Ihnen zu hören!", "email": "E-Mail Adresse (optional)
    Ohne können wir Sie nicht kontaktieren!", "minLength": "Die Mindestlänge eines Feedbacks beträgt {{minLength}}" @@ -202,7 +204,8 @@ "lat": "Lat", "n": "N", "lon": "Lon", - "elev": "Höhe" + "elev": "Höhe", + "zone": "ZONE" }, "zoomCotrol": { "zoomOut": "Herauszoomen", @@ -217,13 +220,61 @@ "dataDescription": "Datenbeschreibung", "contact_point": "Kontakt", "licence": "Lizenz", - "author": "Autor" + "author": "Autor", + "datasetDescription": "Beschreibung des Datensatzes", + "corsErrorMessage": "Es konnten keine Pakete von diesem CKAN-Server abgerufen werden.", + "serviceErrorMessage": "Zu diesem Dienst sind keine Einzelheiten verfügbar.", + "notCompatibleMessageII": "Der CKAN-Datensatz verfügt über keine Ressourcen mit einem unterstützten Format.", + "name": "CKAN Ressource", + "errorLoadingTitle": "Fehler beim Laden des CKAN-Katalogs", + "nameServer": "CKAN Server", + "datasetCustodian": "Herausgeber", + "resourceDescription": "Beschreibung der Ressource", + "errorRetrievingUrlMessage": "URL konnte nicht als JSON abgerufen werden: {{url}}.", + "errorRetrievingUrlTitle": "Fehler beim Abrufen der CKAN-URL", + "idsNotSpecifiedTitle": "resourceId oder datasetId muss angegeben werden", + "errorLoadingMessage": "Die Definition für diesen CKAN-Katalog hat keine gültige Filterabfrage.", + "notCompatibleMessageI": "Der CKAN-Datensatz verfügt nicht über eine Ressource mit der ID {{resourceId}} oder hat kein unterstütztes Format.", + "dataSourceErrorMessage": "Zu dieser Datenquelle sind keine Details verfügbar.", + "idsNotSpecifiedMessage": "Bei CkanCatalogItem muss entweder resourceId oder datasetId angegeben werden.", + "invalidCkanTitle": "Ungültige CKAN JSON-Ressource", + "invalidCkanMessage": "Die vom CKAN-Server zurückgegebene Ressource scheint keine package_id zu haben.", + "notCompatibleTitle": "Keine kompatiblen Ressourcen gefunden" }, "arcgisPortal": { - "licence": "Lizenz" + "licence": "Lizenz", + "datasetDescription": "Beschreibung des Datensatzes", + "nameGroup": "ArcGIS Portal Gruppe", + "name": "ArcGIS Portal Element", + "serviceErrorMessage": "Zu diesem Dienst sind keine Einzelheiten verfügbar.", + "openInPortal": "Im ArcGIS Portal öffnen", + "idsNotSpecifiedTitle": "resourceId oder datasetId muss angegeben werden", + "idsNotSpecifiedMessage": "ArcGIS Portal Item benötigt eine itemId, die angegeben werden muss.", + "errorRetrievingUrlTitle": "Fehler beim Abrufen der ArcGIS Portal URL", + "dataSourceErrorMessage": "Zu dieser Datenquelle sind keine Details verfügbar.", + "errorLoadingTitle": "Fehler beim Laden des ArcGIS Portal-Katalogs", + "corsErrorMessage": "Es konnten keine Pakete von diesem ArcGIS Portal-Server abgerufen werden. ", + "errorLoadingMessage": "Die Definition für diesen ArcGIS Portal Katalog hat keine gültige Filterabfrage.", + "errorRetrievingUrlMessage": "URL konnte nicht als JSON abgerufen werden: {{url}}." }, "csw": { - "links": "Links" + "links": "Links", + "unknownError": "Der CSW-Server hat einen unbekannten Fehler gemeldet.", + "errorLoadingTitle": "CSW konnte nicht geladen werden", + "notUseableTitle": "Der Katalogdienst ist nicht verwendbar. \n\n {{message}}", + "dataResponsibility": "Ansprechpartner", + "missingUrlTitle": "Katalogdienst (CSW) kann nicht geladen werden", + "name": "Catalogue Service (CSW)", + "exceptionMessage": "Der CSW-Server hat einen Fehler gemeldet:\n\n {{exceptionText}}", + "notUseableMessage": "Ungültige Antwort beim Aufruf von GetDomain auf dem CSW-Server.", + "checkCORSRecords": "GetRecords konnte auf diesem CSW-Server nicht ausgeführt werden.", + "missingUrlMessage": "Der Katalogdienst (CSW) konnte nicht geladen werden, da die Kataloggruppe keine `url` hat.", + "errorLoadingRecordsTitle": "CSW-Datensätze konnten nicht geladen werden.", + "checkCORSDomain": "GetDomain konnte auf diesem CSW-Server nicht ausgeführt werden.", + "errorLoadingRecordsMessage": "Ungültige Antwort beim Aufruf von GetRecords auf der CSW", + "checkCORS": "GetRecords konnte auf diesem CSW-Server nicht ausgeführt werden.", + "metadataURL": "URL des Metadatensatzes", + "cors": "CORS" }, "feedback": { "thanksTitle": "Vielen Dank für Ihr Feedback!", @@ -241,20 +292,23 @@ "missingBody": "Der Server antwortete mit einem leeren Body.", "alreadyLoadingMessage": "Ihre Daten werden hochgeladen. Sie können die Anzeige ändern, sobald sie vollständig hochgeladen sind", "noFeatures": "Es gibt keine Merkmale, die Ihrer Anfrage entsprechen.", - "unknownFormat": "Der Server antwortete mit einem unbekannten Feature-Format." + "unknownFormat": "Der Server antwortete mit einem unbekannten Feature-Format.", + "sos": "SOS" }, "socrataServer": { "attributes": "Attribute", "tags": "Schlagwörter", "licence": "Lizenz", "description": "Beschreibung", - "retrieveErrorMessage": "Es konnten keine Pakete von diesem Socrata-Server abgerufen werden." + "retrieveErrorMessage": "Es konnten keine Pakete von diesem Socrata-Server abgerufen werden.", + "name": "Socrata Server" }, "sdmxCatalogItem": { "noResultsWithDimensions": "Es wurden keine Ergebnisse gefunden. Bitte wählen Sie im Arbeitsbereich andere Dimensionswerte als die folgenden: \n\n{{dimensions}}", "viewBy": { "title": "Ansicht nach", - "time": "Zeitreihen" + "time": "Zeitreihen", + "region": "Region" }, "loadDataErrorMessage": "Ungültige Antwort von {{csvUrl}}", "loadDataErrorTitle": "SDMX-Daten für {{name}} konnten nicht geladen werden" @@ -281,7 +335,7 @@ "aggregationFalseDescription": "Die Werte der groben Region sind die Summe der Stichproben in der Region. Zum Beispiel: Gesamtbevölkerung.", "aggregationTrueName": "Durchschnittliche Aggregation", "characteristicToPredictName": "Vorauszusagendes Merkmal", - "aggregationName": "", + "aggregationName": "Aggregation", "aggregationTrueDescription": "Die Werte der groben Region sind der Mittelwert der Stichproben in der Region. Zum Beispiel das durchschnittliche Haushaltseinkommen.", "aggregationFalseName": "Summenaggregation", "wrongNumberOfElements": "Die Liste der Werte und die Liste der Regionalcodes enthalten nicht die gleiche Anzahl von Elementen", @@ -356,7 +410,8 @@ "accessConstraints": "Web Feature Service Zugriffsbeschränkungen", "invalidWFSServerTitle": "Ungültiger WFS-Server", "fees": "Web Feature Service Gebühren", - "abstract": "Web Feature Service Beschreibung" + "abstract": "Web Feature Service Beschreibung", + "wfsServer": "Web Feature Service (WFS) Server" }, "webFeatureServiceCatalogItem": { "noLayerFoundTitle": "Kein Layer gefunden", @@ -370,7 +425,10 @@ "missingDataTitle": "Fehlende Daten", "missingDataMessage": "Der WFS-Datensatz '{{name}}' hat keine Daten zurückgegeben.{{line}}{{line}}Die Katalogdatei wurde entweder falsch eingerichtet oder die Serveradresse hat sich geändert.", "reachedMaxFeatureLimit": "Warnung: Diese Ebene hat das WFS-Feature-Limit erreicht ({{maxFeatures}})", - "noLayerFoundMessage": "Der WFS-Datensatz '{{name}}' hat keine Layer, die zu '{{typeNames}}' passen. {{suggested}} {{line}}{{line}}Entweder wurde die Katalogdatei falsch eingerichtet oder der WFS-Server hat sich geändert." + "noLayerFoundMessage": "Der WFS-Datensatz '{{name}}' hat keine Layer, die zu '{{typeNames}}' passen. {{suggested}} {{line}}{{line}}Entweder wurde die Katalogdatei falsch eingerichtet oder der WFS-Server hat sich geändert.", + "wfs": "Web Feature Service (WFS)", + "getCapabilitiesUrl": "GetCapabilities URL", + "metadataUrls": "Links zu Metadaten" }, "webMapTileServiceCatalogGroup": { "accessConstraints": "Web Map Service Zugriffsbeschränkungen", @@ -381,7 +439,8 @@ "invalidCapabilitiesTitle": "Ungültige GetCapabilities", "groupNotAvailableMessage": "Beim Aufrufen von GetCapabilities auf dem WMTS-Server ist ein Fehler aufgetreten.", "invalidWMTSServerMessage": "Beim Aufrufen von GetCapabilities auf dem WMTS-Server ist ein Fehler aufgetreten. Die Antwort des Servers scheint kein gültiges GetCapabilities-Dokument zu sein.", - "invalidCapabilitiesMessage": "Die URL {{url}} wurde erfolgreich abgerufen, aber es scheint sich nicht um ein gültiges Web Map Tile Service (WMTS) GetCapabilities-Dokument zu handeln. \n\nEntweder wurde die Katalogdatei falsch eingerichtet, oder die Serveradresse hat sich geändert." + "invalidCapabilitiesMessage": "Die URL {{url}} wurde erfolgreich abgerufen, aber es scheint sich nicht um ein gültiges Web Map Tile Service (WMTS) GetCapabilities-Dokument zu handeln. \n\nEntweder wurde die Katalogdatei falsch eingerichtet, oder die Serveradresse hat sich geändert.", + "wmtsServer": "Web Map Tile Service (WMTS) Server" }, "webMapTileServiceCatalogItem": { "accessConstraints": "Zugriffsbeschränkungen", @@ -392,7 +451,9 @@ "serviceDescription": "Dienstbeschreibung", "noUsableTileMatrixTitle": "Warnung", "dataDescription": "Datenbeschreibung", - "noUsableTileMatrixMessage": "Diese WMTS-Ebene hat keine Web-Mercator-Kachelmatrix eingestellt - sie wird möglicherweise nicht korrekt angezeigt" + "noUsableTileMatrixMessage": "Diese WMTS-Ebene hat keine Web-Mercator-Kachelmatrix eingestellt - sie wird möglicherweise nicht korrekt angezeigt", + "wmts": "Web Map Tile Service (WMTS)", + "getCapabilitiesUrl": "GetCapabilities URL" }, "webProcessingServiceCatalogGroup": { "invalidCapabilitiesTitle": "Ungültige GetCapabilities", @@ -405,7 +466,8 @@ "invalidServerTitle": "Ungültiger WPS-Server", "providerSite": "Web Processing Service Anbieter Webseite", "missingUrlTitle": "GetCapabilities konnte nicht geladen werden", - "providerName": "Web Processing Service Anbieter" + "providerName": "Web Processing Service Anbieter", + "typeName": "Web Processing Service (WPS) Server" }, "webProcessingService": { "regionTypeDescription": "Art der zu analysierenden Region.", @@ -418,7 +480,7 @@ "failureReasonUnknowError": "Der Grund des Fehlers ist unbekannt.", "invalidResponseError2Message": "Die Antwort des WPS-Servers enthält kein Status-Element.", "regionTypeName": "Region Typ", - "regionParameterName": "", + "regionParameterName": "Region Parameter", "invalidResponseErrorTitle": "Ungültige Antwort des WPS-Servers", "errorDetails": "Fehlerdetails", "asyncShortReportFailed": "Der Aufruf des Webverarbeitungsdienstes ist fehlgeschlagen. Weitere Details finden Sie auf dem Info-Panel.", @@ -427,7 +489,9 @@ "invalidResponseError2Title": "Ungültige Antwort vom WPS-Server", "unsupportedParameterErrorTitle": "Nicht unterstützter Parametertyp", "invalidResponseErrorMessage": "Beim Zugriff auf den Statusort auf dem WPS-Server für den Prozessnamen {{name}} ist ein Fehler aufgetreten.", - "resultPendingDescription": "Dies ist das Ergebnis des Aufrufs des Prozesses oder Dienstes {{name}} zum {{timestamp}} mit den unten stehenden Eingabeparametern." + "resultPendingDescription": "Dies ist das Ergebnis des Aufrufs des Prozesses oder Dienstes {{name}} zum {{timestamp}} mit den unten stehenden Eingabeparametern.", + "wpsServer": "Web Processing Service (WPS) Server", + "wps": "Web Processing Service (WPS)" }, "georss": { "description": "Beschreibung", @@ -435,7 +499,13 @@ "author": "Autor", "category": "Kategorie", "updated": "Aktualisiert", - "subtitle": "Untertitel" + "subtitle": "Untertitel", + "name": "GeoRSS", + "errorLoadingTitle": "GeoRSS konnte nicht geladen werden", + "errorLoadingMessage": "Beim Laden einer GeoRSS-Datei ist ein Fehler aufgetreten.", + "unableToLoadItemTitle": "Kein GeoRSS verfügbar", + "copyrightText": "Copyright Text", + "unableToLoadItemMessage": "Der GeoRSS-Katalogeintrag kann nicht geladen werden, da er nicht mit einer `url`- oder `geoRss`-Eigenschaft konfiguriert wurde." }, "placesLikeMe": { "regionsLikeThisName": "Regionen wie diese", @@ -449,7 +519,8 @@ "regioNotSelectedName": "Region nicht ausgewählt", "characteristicsDescription": "Die Merkmale der Region, die in die Analyse einbezogen werden sollen.", "regionsLikeThisDescription": "Identifiziert Regionen, die einer bestimmten Region anhand einer Reihe von Merkmalen _am ähnlichsten_ sind.", - "regioNotSelectedDescription": "Sie müssen eine Region auswählen." + "regioNotSelectedDescription": "Sie müssen eine Region auswählen.", + "regionName": "Region" }, "regionMapping": { "notRecognisedText": "nicht erkannt", @@ -475,7 +546,8 @@ "accessConstraints": "Web Map Service Zugriffsbeschränkungen", "fees": "Web Map Service Gebühren", "invalidWMSServerMessage": "Beim Aufrufen von GetCapabilities auf dem WMS-Server ist ein Fehler aufgetreten. Die Antwort des Servers scheint kein gültiges GetCapabilities-Dokument zu sein.", - "missingUrlMessage": "Das Dokument GetCapabilities des Web Map Service (WMS) konnte nicht geladen werden, da das Katalogelement keine `url` hat." + "missingUrlMessage": "Das Dokument GetCapabilities des Web Map Service (WMS) konnte nicht geladen werden, da das Katalogelement keine `url` hat.", + "wmsServer": "Web Map Service (WMS) Server" }, "webMapServiceCatalogItem": { "defaultStyleLabel": "Standard-Stil", @@ -490,7 +562,10 @@ "missingUrlTitle": "GetCapabilities konnte nicht geladen werden", "missingDataMessage": "Der WMS-Datensatz '{{name}}' hat keine Daten zurückgegeben.{{line}}{{line}}Die Katalogdatei wurde entweder falsch eingerichtet, oder die Serveradresse hat sich geändert.", "serviceContact": "Servicekontakt", - "serviceDescription": "Dienstbeschreibung" + "serviceDescription": "Dienstbeschreibung", + "wms": "Web Map Service (WMS)", + "getCapabilitiesUrl": "GetCapabilities URL", + "metadataUrls": "Links zu Metadaten" }, "userDrawing": { "btnCancel": "Abbruch", @@ -509,14 +584,23 @@ }, "shadow": { "options": { - "none": "Keine" + "none": "Keine", + "both": "Abgeben und Empfangen", + "receive": "Nur Empfangen", + "cast": "Nur Abgeben" }, "name": "Schatten" }, "arcGisMapServerCatalogGroup": { "serviceDescription": "Dienstbeschreibung", "dataDescription": "Datenbeschreibung", - "groupNotAvailableTitle": "Gruppe ist nicht verfügbar" + "groupNotAvailableTitle": "Gruppe ist nicht verfügbar", + "singleFusedMapCacheLayerName": "Alle Layer", + "copyrightText": "Copyright Text", + "invalidServiceMessage": "Beim Aufrufen des ArcGIS Kartendienstes ist ein Fehler aufgetreten. Die Antwort des Servers scheint kein gültiges Map Service Dokument zu sein.", + "name": "ArcGIS Map Server Group", + "invalidServiceTitle": "Ungültiger ArcGIS Map Service", + "groupNotAvailableMessage": "Beim Aufrufen des ArcGIS Kartendienstes ist ein Fehler aufgetreten." }, "sdmxServerStratum": { "sdmxStructureLoadErrorTitle": "SDMX-Strukturanforderung fehlgeschlagen", @@ -525,24 +609,65 @@ }, "arcGisFeatureServerCatalogItem": { "serviceDescription": "Dienstbeschreibung", - "dataDescription": "Datenbeschreibung" + "dataDescription": "Datenbeschreibung", + "name": "Esri ArcGIS FeatureServer", + "invalidServiceTitle": "Ungültiger ArcGIS Feature Service Layer", + "invalidServiceMessage": "Beim Aufrufen des ArcGIS Feature Service ist ein Fehler aufgetreten. Die Antwort des Servers scheint kein gültiger Feature Service Layer zu sein.", + "missingUrlMessage": "Der ArcGis FeatureServer Endpunkt konnte nicht geladen werden, da das Katalogelement keine `url` hat.", + "copyrightText": "Copyright Text", + "missingUrlTitle": "FeatureServer kann nicht geladen werden", + "reachedMaxFeatureLimit": "Warnung: Dieser Layer hat die FeatureService-Featuregrenze ({{maxFeatures}}) erreicht." }, "arcGisMapServerCatalogItem": { "serviceDescription": "Dienstbeschreibung", - "dataDescription": "Datenbeschreibung" + "dataDescription": "Datenbeschreibung", + "invalidUrlMessage": "Der ArcGis MapServer Endpunkt konnte nicht geladen werden, da das Katalogelement keine `url` hat.", + "noLayersFoundTitle": "ArcGIS MapServer konnte nicht geladen werden.", + "copyrightText": "Copyright Text", + "noLayersFoundMessage": "Der Esri ArcGIS MapServer '{{name}}' hat keine anzuzeigenden Layer.", + "invalidUrlTitle": "MapServer konnte nicht geladen werden", + "name": "Esri ArcGIS MapServer" }, "arcGisService": { - "groupNotAvailableTitle": "Gruppe ist nicht verfügbar" + "groupNotAvailableTitle": "Gruppe ist nicht verfügbar", + "invalidServerTitle": "Ungültiger ArcGIS Server", + "invalidServerMessage": "Beim Aufrufen des ArcGIS REST-Dienstes ist ein Fehler aufgetreten. Die Antwort des Servers scheint kein gültiges ArcGIS REST-Dokument zu sein.", + "name": "ArcGIS Service Group", + "groupNotAvailableMessage": "Beim Aufrufen des ArcGIS REST-Dienstes ist ein Fehler aufgetreten." }, "arcGisFeatureServerCatalogGroup": { "groupNotAvailableTitle": "Gruppe ist nicht verfügbar", "dataDescription": "Datenbeschreibung", - "serviceDescription": "Dienstbeschreibung" + "serviceDescription": "Dienstbeschreibung", + "groupNotAvailableMessage": "Beim Aufrufen des ArcGIS Feature Service ist ein Fehler aufgetreten.", + "invalidServiceMessage": "Beim Aufrufen des ArcGIS Feature Service ist ein Fehler aufgetreten. Die Antwort des Servers scheint kein gültiges Feature Service Dokument zu sein.", + "name": "ArcGIS Feature Server Group", + "copyrightText": "Copyright Text", + "invalidServiceTitle": "Ungültiger ArcGIS Feature Service" }, "catalog": { "unsupportedFileTypeTitle": "Nicht unterstützter Dateityp", "group": "Gruppe", - "unsupportedTypeTitle": "Unbekannter Typ" + "unsupportedTypeTitle": "Unbekannter Typ", + "name": "Unbenanntes Element", + "idForMatchingErrorMessage": "Modellobjekte müssen eine Eigenschaft `id`, `localId` oder `name` besitzen.", + "userAddedDataGroup": "Gruppe für Daten, die vom Benutzer über das Bedienfeld Daten hinzufügen hinzugefügt wurden.", + "convertErrorTitle": "Katalog kann nicht auf V8 aktualisiert werden", + "upload": "Upload", + "catalogMemberMustHaveName": "Ein neu erstellter Katalogeintrag muss einen Namen besitzen.", + "catalogMemberMustHaveType": "Ein Katalogeintrag muss einen Typ besitzen.", + "idForMatchingErrorTitle": "Fehlende Eigenschaften", + "mustHaveType": "Jedes Element muss einen Typ besitzen.", + "serviceErrorMessage": "Zu diesem Dienst sind keine Einzelheiten verfügbar.", + "stubCreationFailure": "Katalogelement {{item}} konnte nicht gelöscht werden", + "addAll": "Alle hinzufügen", + "removeAll": "Alle entfernen", + "unsupportedFileTypeMessage": "Dieses Dateiformat wird nicht unterstützt von {{appName}}. Folgende Dateiformate werden unterstützt:
    • .geojson
    • .kml, .kmz
    • .csv (in {{link}})
    • Shapefile (.zip)
    ", + "convertErrorMessage": "Diese Katalogdatei basiert auf einer älteren Version von TerriaJS - der Software, die diese Webkarte betreibt. Beim Versuch, die Katalogdaten für {{url}} zu aktualisieren, ist ein Fehler aufgetreten.", + "chartDataGroup": "Gruppe für Diagrammdaten.", + "dataSourceErrorMessage": "Zu dieser Datenquelle sind keine Details verfügbar.", + "unsupportedTypeMessage": "Unbekannter Modelltyp {{type}} konnte nicht erstellt werden.", + "compositesError": "Zusammengesetzte Elemente können keine zusammengesetzten Elemente enthalten." }, "senaps": { "availableStreamsHeadingFeatureInfo": "Verfügbare Streams", @@ -550,14 +675,18 @@ "noStreamsMessageFeatureInfo": "An diesem Ort sind keine Streams verfügbar.", "missingKeyErrorMessage": "Ein Senaps API-Schlüssel sollte mit der Option appendParamToQueryString zur terriajs-server-Konfiguration hinzugefügt werden", "missingSenapsBaseUrl": "Senaps Basis-URL nicht angegeben. Sind Sie angemeldet?", - "generalErrorMessage": "Bei der Verarbeitung von Senaps-Daten ist ein Fehler aufgetreten" + "generalErrorMessage": "Bei der Verarbeitung von Senaps-Daten ist ein Fehler aufgetreten", + "retrieveErrorTitle": "Fehler bei der Verarbeitung von Senaps-Katalogelementen", + "name": "Senaps Standorte" }, "time": { "invalidDate": "Ungültiges Datum", "invalidInitialTimeSource": "Ungültige initialTimeSource in der Konfigurationsdatei angegeben: {{initialTimeSource}}" }, "getToken": { - "errorTitle": "Token-Fehler" + "errorTitle": "Token-Fehler", + "invalidToken": "

    Der Token-Server hat mit einem ungültigen Token geantwortet.

    Bitte melden Sie dies, indem Sie eine E-Mail an {{email}} senden

    ", + "unableToRequest": "

    Es ist nicht möglich, ein Token vom Token-Server anzufordern.

    Bitte melden Sie dies, indem Sie eine E-Mail an {{email}} senden

    " }, "raiseError": { "developerDetails": "Entwickler Details", @@ -570,7 +699,10 @@ }, "wfsFeatures": { "featuresGroup": "Gruppe von Merkmalen in einem Web Feature Service (WFS) Server", - "groupNotAvailableTitle": "Gruppe ist nicht verfügbar" + "groupNotAvailableTitle": "Gruppe ist nicht verfügbar", + "groupNotAvailableMessage": "Beim Aufrufen von GetFeature auf dem WFS-Server ist ein Fehler aufgetreten.", + "queryErrorTitle": "Fehler bei der Abfrage des WFS-Servers", + "queryErrorMessage": "Beim Aufrufen von GetFeature auf dem WFS-Server ist ein Fehler aufgetreten. Die Antwort des Servers scheint kein gültiges GeoJSON-Dokument zu sein." }, "resultPending": { "name": "Ergebnis ausstehend" @@ -582,32 +714,254 @@ "nameGroup": "THREDDS Katalog Gruppe" }, "gltf": { - "error": "Fehler" + "error": "Fehler", + "notSupportedErrorMessage": "\"{{name}}\" kann in der 2D-Ansicht nicht angezeigt werden. Wechseln Sie zu 3D und versuchen Sie es erneut.", + "serviceErrorMessage": "Zu diesem Dienst sind keine Einzelheiten verfügbar.", + "name": "GL Transmission Format (glTF)", + "dataSourceErrorMessage": "Zu dieser Datenquelle sind keine Details verfügbar.", + "notSupportedErrorTitle": "Nicht in 2D unterstützt", + "unableToRetrieve": "Feature-Details können nicht abgerufen werden von:\n\n{{url}}" }, "arcGisFeatureServer": { - "groupNotAvailableTitle": "Gruppe ist nicht verfügbar" + "groupNotAvailableTitle": "Gruppe ist nicht verfügbar", + "nameGroup": "ArcGIS Feature Server Group", + "invalidServiceMessage": "Beim Aufrufen des ArcGIS Feature Service ist ein Fehler aufgetreten. Die Antwort des Servers scheint kein gültiges Feature Service Dokument zu sein.", + "name": "ArcGIS Feature Server", + "invalidServiceTitle": "Ungültiger ArcGIS Feature Service", + "groupNotAvailableMessage": "Beim Aufrufen des ArcGIS Feature Service ist ein Fehler aufgetreten." }, "terrainCatalog": { "notSupportedErrorTitle": "Nicht in 2D unterstützt", "notSupportedErrorMessage": "{{name}} kann in der 2D-Ansicht nicht angezeigt werden. Wechseln Sie zu 3D und versuchen Sie es erneut" + }, + "bing": { + "name": "Bing Maps" + }, + "csv": { + "unexpectedTypeMessage": "Es wird erwartet, dass die CsvCatalogItem-Daten ein \"Blob\", ein \"File\" oder ein \"String\" ist, aber es war keine von ihnen.", + "unableToLoadItemMessage": "Das CSV-Katalogelement kann nicht geladen werden, da es nicht mit einer `url`- oder `csvString`-Eigenschaft konfiguriert wurde.", + "unexpectedTypeTitle": "Unerwarteter Typ von CSV-Daten", + "name": "Comma-Separated Values (CSV)", + "dataSourceErrorMessage": "Zu dieser Datenquelle sind keine Details verfügbar.", + "serviceErrorMessage": "Zu dieser Datenquelle sind keine Details verfügbar.", + "unableToLoadItemTitle": "Keine CSV verfügbar", + "unableToLoadTitle": "CSV-Datei konnte nicht geladen werden", + "unableToLoadMessage": "Siehe
    csv-geo-au Spezifikation für unterstützte CSV-Formate.\n\n {{message}}" + }, + "createParameter": { + "unsupportedErrorMessage": "Unbekannter Funktionsparametertyp: {{type}}.", + "unsupportedErrorTitle": "Nicht unterstützter Funktionsparametertyp" + }, + "czml": { + "serviceErrorMessage": "Zu diesem Dienst sind keine Einzelheiten verfügbar.", + "errorLoadingMessage": "Beim Laden einer CZML-Datei ist ein Fehler aufgetreten.", + "name": "Cesium Language (CZML)", + "dataSourceErrorMessage": "Zu dieser Datenquelle sind keine Details verfügbar.", + "errorLoadingTitle": "CZML konnte nicht geladen werden", + "unableToLoadItemTitle": "Keine CZML verfügbar", + "unableToLoadItemMessage": "Das CZML-Katalogelement kann nicht geladen werden, da es nicht mit einer Eigenschaft \"URL\", \"CzmlData\" oder \"CzmlString\" konfiguriert wurde." + }, + "geoJson": { + "unableToLoadItemMessage": "Das GeoJSON-Katalogelement kann nicht geladen werden, da es nicht mit der Eigenschaft `url`, `geoJsonData` oder `geoJsonString` konfiguriert wurde.", + "errorLoadingMessage": "Beim Laden einer GeoJSON-Datei ist ein Fehler aufgetreten. Dies kann bedeuten, dass die Datei ungültig ist oder nicht unterstützt wird.", + "errorParsingMessage": "Beim Parsen der angegebenen Daten als JSON ist ein Fehler aufgetreten. Dies kann bedeuten, dass die Datei ungültig ist oder nicht unterstützt wird.", + "dataSourceErrorMessage": "Zu dieser Datenquelle sind keine Details verfügbar.", + "unsupportedBrowserTitle": "Nicht unterstützter Webbrowser", + "couldNotLoadTitle": "JSON konnte nicht geladen werden", + "name": "GeoJSON", + "serviceErrorMessage": "Zu diesem Dienst sind keine Einzelheiten verfügbar.", + "unableToLoadItemTitle": "Kein GeoJSON verfügbar", + "errorLoadingTitle": "Fehler beim Laden von GeoJSON", + "unsupportedBrowserMessage": "Ihr Webbrowser unterstützt leider die Datei-API nicht, die {{appName}} benötigt, um diesen Datensatz zu laden. Bitte aktualisieren Sie Ihren Webbrowser. Für ein optimales Erlebnis empfehlen wir die neuesten Versionen von $t(browsers.chrome) oder $t(browsers.firefox) oder $t(browsers.edge) oder $t(browsers.safari).", + "couldNotLoadMessage": "Beim Abrufen von JSON-Daten von dem angegebenen Link ist ein CORS-Fehler aufgetreten." + }, + "imageryLayer": { + "accessingCatalogItemErrorMessage": "Beim Versuch, Kacheln für einen Katalogelement herunterzuladen, ist ein Fehler aufgetreten:

    {{name}}

    Das Katalogelement wurde aus der Karte ausgeblendet. Sie können es im Fenster \"Jetzt anzeigen\" erneut einblenden, um es erneut zu versuchen.", + "unableToShowLocMessage": "{{name}} kann an dieser Stelle nicht angezeigt werden, da die verfügbaren Aufnahmezeiten unbekannt sind. Die Eigenschaft {{featureTimesProperty}} wurde nicht gefunden.", + "unableToShowLocTitle": "Kann an diesem Ort nicht angezeigt werden", + "unknownTileErrorTitle": "Unbekannter Kachelfehler", + "intervalSupportErrorTitle": "Intervalle werden nicht unterstützt", + "accessingCatalogItemErrorTitle": "Fehler beim Zugriff auf ein Katalogelement", + "tileErrorMessageII": "Ich habe eine 200 (OK) Antwort von URL:\n{{url}}\naber es konnte nicht als Bild geladen werden.", + "resolvingAvailability": "Verfügbarkeit der Auflösungen an einem Ort...", + "accessingBaseMapErrorTitle": "Fehler beim Zugriff auf die Basiskarte", + "tileErrorTitle": "Kachelfehler", + "tileErrorMessage": "Die Kachel mit der URL:\n{{url}}\n war erfolgreich, wenn sie mit XMLHttpRequest geladen wurde, schlug aber mehrfach fehl, wenn sie direkt von Cesium oder Leaflet geladen wurde.\n Dies kann darauf hindeuten, dass der Server sehr empfindlich auf die angegebenen Request-Header reagiert oder einfach unzuverlässig ist.", + "unableToDisplayMessage": "{{name}} kann nicht in 2D angezeigt werden, da es die Standard Web Mercator (EPSG:3857) Projektion nicht unterstützt. Bitte wechseln Sie zu 3D, wenn dies auf Ihrem System unterstützt wird, aktualisieren Sie den Datensatz, um die Projektion zu unterstützen, oder verwenden Sie einen anderen Datensatz.", + "intervalSupportErrorMessage": "Entschuldigung, {{typeName}} ({{type}}) Katalogeinträge können derzeit nicht durch Angabe der Eigenschaft \"Intervalle\" zeitlich variabel gemacht werden.", + "accessingBaseMapErrorMessage": "Beim Versuch, Kacheln für die Basiskarte herunterzuladen, ist ein Fehler aufgetreten:

    {{name}}

    Bitte wählen Sie eine andere Basiskarte über die Schaltfläche Karte in der oberen rechten Ecke.", + "unknownTileErrorMessage": "Beim Zugriff auf die URL:\n{{url}}\nDies weist wahrscheinlich auf einen der folgenden Punkte hin:\n* Der Hostname des Servers konnte nicht aufgelöst werden,\n* Der Server hat nicht auf die Anfrage geantwortet oder\n* Der Server verweigert den Zugriff auf diese URL durch Cross-Origin Resource Sharing (CORS) (siehe https://docs.terria.io/guide/connecting-to-data/cross-origin-resource-sharing/).", + "unableToDisplayTitle": "Datensatz kann nicht angezeigt werden" + }, + "gpx": { + "name": "GPX", + "serviceErrorMessage": "Zu diesem Dienst sind keine Einzelheiten verfügbar.", + "errorLoadingMessage": "Beim Laden einer GPX-Datei ist ein Fehler aufgetreten. Dies kann darauf hinweisen, dass die Datei ungültig ist oder von {{appName}} nicht unterstützt wird.", + "dataSourceErrorMessage": "Zu dieser Datenquelle sind keine Details verfügbar.", + "errorLoadingTitle": "Fehler beim Laden von GPX" + }, + "kml": { + "unexpectedTypeMessage": "KmlCatalogItem.data sollte ein XML-Dokument, ein Blob oder eine Datei sein, aber es war keines davon. Dies kann auf einen Fehler in {{appName}} oder eine falsche Verwendung der {{appName}} API.", + "unexpectedTypeTitle": "Unerwarteter Typ der KML-Daten", + "errorLoadingTitle": "Fehler beim Laden von KML oder KMZ", + "dataSourceErrorMessage": "Zu dieser Datenquelle sind keine Details verfügbar.", + "name": "KML oder KMZ", + "serviceErrorMessage": "Zu diesem Dienst sind keine Einzelheiten verfügbar.", + "errorLoadingMessage": "Beim Laden einer KML- oder KMZ-Datei ist ein Fehler aufgetreten. Dies kann darauf hinweisen, dass die Datei ungültig ist oder von {{appName}} nicht unterstützt wird.", + "unableToLoadItemTitle": "Keine KML verfügbar", + "unableToLoadItemMessage": "Das KML/KMZ-Katalogelement kann nicht geladen werden, da es nicht mit einer Eigenschaft \"URL\", \"kmlData\" oder \"kmlString\" konfiguriert wurde." + }, + "invokeAnalyticsService": { + "invocationFailedMessage": "Beim Berechnen von {{invocationName}} ist auf dem Server ein Fehler aufgetreten.", + "invocationFailedTitle": "Dienstaufruf fehlgeschlagen" + }, + "magda": { + "notCompatibleMessageI": "Der MAGDA-Datensatz hat keine Verteilung mit der ID {{distributionId}} oder er hat kein unterstütztes Format.", + "serviceErrorMessage": "Zu diesem Dienst sind keine Einzelheiten verfügbar.", + "distributionDesc": "Distribution Beschreibung", + "idsNotSpecifiedMessage": "MagdaReference erfordert die Angabe von recordId.", + "retrieveErrorMessage": "Keine Verteilung oder Dataset-ID angegeben", + "idsNotSpecifiedTitle": "recordId muss angegeben werden", + "notCompatibleTitle": "Keine kompatiblen Distributionen gefunden", + "retrieveErrorTitle": "Fehler beim Abrufen des MAGDA-Datensatzes", + "dataSourceErrorMessage": "Zu dieser Datenquelle sind keine Details verfügbar.", + "notCompatibleMessageII": "Für den MAGDA-Datensatz gibt es keine Verteilungen mit einem unterstützten Format.", + "name": "MAGDA Distribution" + }, + "wcs": { + "asyncResultDescription": "Dies ist das Ergebnis des Exports von Daten aus dem Dienst {{name}} zum {{timestamp}} mit den unten stehenden Eingabeparametern.", + "exportFailedMessageII": "Der Web Coverage Service ist fehlgeschlagen: {{error}}", + "exportFailedTitle": "Datenexport fehlgeschlagen", + "asyncPendingDescription": "WCS lädt:\n{{name}} Dienst um {{timestamp}}.\n\n*Laden der Abdeckung*", + "asyncResultLoadingMetadata": "WCS lädt:\n{{name}} Dienst um {{timestamp}}.\n\n*Laden von Metadaten (`DescribeCoverage`)*", + "exportFailedMessage": "Der Web Coverage Service ist fehlgeschlagen" + }, + "function": { + "unknownFormaterTitle": "Unbekannte Formatierungsrichtlinie", + "unknownFormaterMessage": "Der Funktionsparameter formatter {{formatter}} ist unbekannt.\n\nGültige Formatierer sind:\n\n" + }, + "clippingBox": { + "keepBoxAboveGround": "Nur oberirdisch", + "clipDirection": { + "name": "Zuschneiderichtung", + "options": { + "outside": "Zuschneiden außerhalb der Box", + "inside": "Zuschneiden innerhalb der Box" + } + }, + "clipModel": "Zuschneide Model", + "showClippingBox": "Ausschnittbox anzeigen", + "groupName": "Ausschnittbox" + }, + "mapboxMap": { + "name": "Mapbox Karte" + }, + "terria-reference": { + "failedToLoadTarget": "Mitglied konnte nicht aus externem Katalog geladen werden" + }, + "mapboxVectorTile": { + "name": "Mapbox Vector Tile" + }, + "openStreetMap": { + "name": "Open Street Map" + }, + "shapefile": { + "name": "Shapefile" + }, + "cartoMap": { + "name": "Carto Map", + "noUrlMessage": "Es konnte keine verwendbare URL für die Carto Map-Ebene gefunden werden.", + "noUrlTitle": "Keine URL" + }, + "mapboxStyle": { + "name": "Mapbox Style" + }, + "cesiumTerrain": { + "name3D": "Cesium 3D Tiles", + "notSupportedErrorTitle": "Nicht in 2D unterstützt", + "name": "Cesium Terrain", + "notSupportedErrorMessage": "\"{{name}}\" kann in der 2D-Ansicht nicht angezeigt werden. Wechseln Sie zu 3D und versuchen Sie es erneut.", + "errorRenderingTitle": "Fehler beim Rendern in 3D", + "errorRenderingMessage": "Beim Rendern in 3D ist ein Fehler aufgetreten. Dies deutet wahrscheinlich auf einen Fehler in {{appName}} oder eine Inkompatibilität mit Ihrem System oder Webbrowser hin. Wir schalten Sie jetzt auf 2D um, damit Sie Ihre Arbeit fortsetzen können." + }, + "scaleDatasetNotVisible": { + "scaleZoomOut": "Der Datensatz ist in diesem Maßstab nicht verfügbar, zoomen Sie heraus, um ihn zu sehen", + "scaleZoomIn": "Der Datensatz ist in diesem Maßstab nicht verfügbar, zoomen Sie hinein, um ihn zu sehen" + }, + "commonModelErrors": { + "3dTypeIn2dMode": "**Hinweis:** Dieser Datensatz kann nicht im 2D-Viewer angezeigt werden. Wechseln Sie zu einem der 3D-Kartenmodi." + }, + "userData": { + "addingDataErrorMessage": "Die angegebenen Daten konnten nicht hinzugefügt werden, weil sie ungültig sind oder nicht das erwartete Format haben.", + "fileApiNotSupportedTitle": "Datei-API nicht unterstützt", + "fileApiNotSupportedMessage": "Ihr Webbrowser unterstützt leider nicht die Datei-API, die {{appName}} benötigt, um Daten aus einer Datei auf Ihrem System hinzuzufügen. Bitte aktualisieren Sie Ihren Webbrowser. Für ein optimales Erlebnis empfehlen wir die neueste Version von {{chrome}}, {{firefox}} oder {{edge}}.", + "addingDataErrorTitle": "Daten konnten nicht hinzugefügt werden" + }, + "urlTemplateMapServer": { + "name": "URL Template Map Server" + }, + "ionImagery": { + "name": "Cesium Ion Imagery" } }, "itemSearchTool": { "resetBtnText": "Eingabe löschen", "searching": "Suchen", "backBtnText": "Weiter suchen", - "searchBtnText": "Suche" + "searchBtnText": "Suche", + "numericParameter": { + "maximum": "Maximum", + "minimum": "Minimum" + }, + "loading": "Laden der Suchparameter", + "resultsCount": "{{count}} Übereinstimmung gefunden", + "resultsCount_plural": "{{count}} Übereinstimmungen gefunden", + "actions": { + "highlightAll": "Alle hervorheben", + "showMatchingOnly": "Nur Übereinstimmung anzeigen" + }, + "loadError": "Fehler beim Laden der Suchparameter. Prüfen Sie die Konsole auf detaillierte Fehler.", + "toolLoadError": "Fehler beim Laden des Suchtools.", + "noParameters": "Keine suchbaren Parameter gefunden", + "searchError": "Suche fehlgeschlagen. Prüfen Sie die Konsole auf detaillierte Fehler.", + "title": "Suche {{itemName}}" }, "compare": { "dateButton": { - "right": "Rechts" + "right": "Rechts", + "select": "Datum wählen", + "left": "links" }, "dateLocationFilter": { "mouseTooltipMessage": "Rechtsklick zum Abbrechen", "cancel": "Abbruch", - "mouseTooltipTitle": "Ort auswählen" + "mouseTooltipTitle": "Ort auswählen", + "location": "Zeigt jetzt verfügbares Bildmaterial für {{latitude}}, {{longitude}}", + "filter": "Datum nach Ort filtern", + "loading": "Filter laden..." }, - "info": "Vergleichen Sie Datensätze aus Ihrem Arbeitsbereich nebeneinander auf der Karte." + "info": "Vergleichen Sie Datensätze aus Ihrem Arbeitsbereich nebeneinander auf der Karte.", + "rightPanel": "Rechtes Panel", + "done": "Fertig", + "leftPanel": "Linkes Panel", + "entireMap": { + "emptyText": "Fügen Sie über das gepunktete Menü oben neue Daten hinzu, die auf der gesamten Karte angezeigt werden sollen.", + "title": "Gesamte Karte" + }, + "entireMapMenu": { + "browse": "Kartendaten durchsuchen", + "sendAllToFront": "Alle in den Vordergrund", + "sendAllToBack": "Alle in den Hintergrund", + "hideAll": "Alle ausblenden" + }, + "title": "Vergleichen", + "dataset": { + "label": "Datensatz", + "selectOne": "Datensatz wählen" + }, + "dimensionSelector": { + "undefinedLabel": "Keine Angabe" + } }, "workbench": { "diffImageTitle": "Bildunterschiede zwischen zwei Daten anzeigen", @@ -657,7 +1011,7 @@ }, "tour": { "preface": { - "title": "Starte die Tour", + "title": "Starten den Tour", "content": "Sie wissen nicht, wo Sie anfangen sollen? Machen Sie einen kurzen Rundgang durch die Hauptmerkmale unserer Software und lernen Sie einige der wichtigsten Funktionen kennen, die Ihnen den Einstieg erleichtern.", "close": "Vielleicht später", "start": "Tour Starten" @@ -707,7 +1061,8 @@ "message": "Beim Versuch, dieses Tool vom Server zu laden, ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut." }, "button": { - "open": "Schließe {{toolNameLowerCase}}" + "open": "Schließe {{toolNameLowerCase}}", + "closed": "{{toolName}}" }, "closeButtonTitle": "Schließe {{toolName}} Tool", "exitBtnTitle": "Schließen" @@ -776,10 +1131,11 @@ "saveBtn": "speichern", "saveStory": "Speichern", "cancelEditing": "Abbruch", - "cancelBtn": "abbrechen" + "cancelBtn": "abbrechen", + "placeholder": "Geben Sie einen Titel ein" }, - "story": "", - "storyEditor": "", + "story": "Story", + "storyEditor": "Story Editor", "view": "Darstellung", "editStory": "bearbeiten", "edit": "Bearbeiten", @@ -794,11 +1150,39 @@ "gettingStartedTitle": "Erste Schritte", "badgeBarLabel": "Szenen", "share": "Teilen", - "viewStory": "darstellen" + "viewStory": "darstellen", + "preview": "Vorschau Stories", + "locationBtn": "Szene zentrieren", + "navBtnMobile": "zur Story {{title}} wechseln", + "promptHtml2": "<0><0>Einführung<1>Stories<2>Erstellen und teilen Sie interaktive Geschichten direkt aus Ihrer Karte.", + "dismissText": "Verstanden, danke!", + "mobileViewStory": "Stories anzeigen {{storiesLength}}", + "hideStoryPanel": "Story Builder ausblenden", + "loadSceneErrorTitle": "Fehler beim Laden der Story-Szene", + "loadSceneErrorMessage": "Beim Laden der Daten für die Story-Szene ist ein Fehler aufgetreten: `{{title}}`.", + "collapse": "Zusammenklappen", + "recaptureStory": "Erneut aufnehmen", + "previousBtn": "zur vorherigen Szene wechseln", + "untitledScene": "unbenannte Szene", + "removeStoryDialog": "Sind Sie sicher, dass Sie '<1>{{storyName}}' löschen möchten?", + "doesNotExist": "Story existiert nicht", + "navBtn": "zur Story {{title}} wechseln", + "nextBtn": "zur nächsten Szene wechseln", + "restart": "Neustart", + "captureScene": "Szene aufnehmen", + "playStory": "Story", + "removeAllStoriesDialog": "Sind Sie sicher, dass Sie die Szene {{ count }} löschen möchten?", + "removeAllStoriesDialog_plural": "Sind Sie sicher, dass Sie die Szenen {{ count }} löschen möchten?", + "captureSceneTitle": "aktuelle Szene aufnehmen", + "expand": "Erweitern", + "panelBody": "Erstellen und teilen Sie interaktive Geschichten direkt von Ihrer Karte aus", + "exitBtn": "Story verlassen", + "untitled": "unbenannte Szene", + "promptHtml1": "<0>Sie können jederzeit Stories ansehen und erstellen, indem Sie hier klicken." }, "addData": { "addDataBtnText": "Datenkatalog", - "dragDrop": "", + "dragDrop": "Drag and Drop", "infoText": "<0>Ziehen Sie eine Datei hierher, um sie lokal auf der Karte anzuzeigen<1>(sie wird nicht gespeichert oder ins Internet hochgeladen)", "back": "Zurück", "myData": "Meine Daten", @@ -806,12 +1190,27 @@ "btnHide": "Ausblenden", "done": "Fertig", "urlInputBtn": "Hinzufügen", - "closeDataPanel": "Datenfeld schließen" + "closeDataPanel": "Datenfeld schließen", + "webFile": "<0>Schritt 2: Geben Sie die URL der Datendatei oder des Webdienstes ein", + "localTitle": "Lokale Daten hinzufügen", + "webTitle": "Webbasierte Daten hinzufügen", + "note": "<0>Hinweis: Die auf diese Weise hinzugefügten Daten werden nicht gespeichert oder für andere sichtbar gemacht.", + "load": "Laden lokaler/webbasierter Daten", + "dataCatalogue": "Datenkatalog", + "localFileType": "<0>Schritt 1: Dateityp auswählen", + "webAdd": "Webbasierte Daten hinzufügen", + "localFile": "<0>Schritt 2: Datei auswählen", + "searchPlaceholder": "Katalog durchsuchen", + "localAdd": "Lokale Datei hinzufügen", + "searchPlaceholderWhole": "Gesamten Katalog durchsuchen", + "webFileType": "<0>Schritt 1: Wählen Sie den Typ der Datei oder des Webdienstes" }, "clipboard": { "shareURL": "URL teilen", "success": "In Zwischenablage kopiert", - "copy": "Kopieren" + "copy": "Kopieren", + "unsuccessful": "Kopieren nicht erfolgreich...", + "shareExplanation": "Jeder, der diese URL hat, kann auf diese Karte zugreifen." }, "emptyWorkbench": { "emptyArea": "Ihre Arbeitsbereich ist leer", @@ -822,27 +1221,80 @@ }, "map": { "drawExtentHelper": { - "extent": "Ausdehnung" + "extent": "Ausdehnung", + "drawExtent": "Ausdehnung zeichnen" }, "gnafAddressGeocoder": { "score": "Bewertung", "suburb": "Vorort", "state": "Zustand", "postcode": "Postleitzahl", - "lon": "" + "lon": "Lon", + "noAddresses": "Diese tableStructure hat keine Adressen!", + "matchedAddresses": "Übereinstimmende Adresse", + "noAddresses2": "Obwohl die tableStructure meldet, dass sie eine Adressspalte hat, hat sie keine Adressen", + "lat": "Lat", + "poBox": "Postfach", + "postOfficeBox": "Postfach" }, "cesium": { - "stoppedRenderingMessage": "Dies kann durch einen Datensatz verursacht worden sein, der gerade zum Arbeitsbereich hinzugefügt wurde. Bitte versuchen Sie, diesen zu entfernen. Wenn das Problem dadurch nicht behoben wird, müssen Sie möglicherweise {{appName}} neu laden." + "stoppedRenderingMessage": "Dies kann durch einen Datensatz verursacht worden sein, der gerade zum Arbeitsbereich hinzugefügt wurde. Bitte versuchen Sie, diesen zu entfernen. Wenn das Problem dadurch nicht behoben wird, müssen Sie möglicherweise {{appName}} neu laden.", + "devError": "cesium erforderlich.", + "failedToObtain": "Bildkachel konnte nicht abgerufen werden X: {{x}} Y: {{y}} Ebene: {{level}}.", + "notWebMercatorTilingScheme": "Dieser Datensatz kann nicht auf der 2D-Karte angezeigt werden, da er nicht die Web-Mercator-Projektion (EPSG:3857) unterstütz.", + "terrainServerErrorMessage": " Der Geländeserver reagiert im Moment nicht. Sie können weiterhin alle Funktionen von {{appName}} nutzen, aber im 3D-Modus werden keine Geländedetails angezeigt. Wir entschuldigen uns für die Unannehmlichkeiten. Bitte versuchen Sie es später noch einmal, dann sollte der Terrain-Server wieder wie erwartet reagieren. Sollte das Problem weiterhin bestehen, kontaktieren Sie uns bitte per E-Mail an {{supportEmail}}.", + "terrainServerErrorTitle": "Terrain Server antwortet nicht", + "stoppedRenderingTitle": "3D-Karte konnte nicht gerendert werden", + "unusalTilingScheme": "Dieser Datensatz kann nicht auf der 2D-Karte angezeigt werden, da er ein ungewöhnliches Kachelschema verwendet, das nicht unterstützt wird." }, "extraCreditLinks": { - "disclaimer": "Haftungsausschluss" + "disclaimer": "Haftungsausschluss", + "dataProvider": "Daten herausgegeben von:", + "dataAttribution": "Nutzungsbedingungen", + "basemap": "Basiskarte" + }, + "gmlToGeoJson": { + "missingPos": "Dem GML-Punktelement fehlt ein Pos-Element.", + "missingExteriorRing": "Dem GML-Polygon fehlt der äußere Ring.", + "missingPosList": "Dem äußeren Ring des GML-Polygons fehlt eine posList.", + "containsUnsupportedFeatureType": "GML enthält nicht unterstützten Feature-Typ: {{type}}" + }, + "addressGeocoder": { + "devError": "bulkConvertAddresses muss in der abgeleiteten Klasse implementiert werden." + }, + "displayVariablesConcept": { + "defaultName": "Variable Anzeige" + }, + "w3cToGeoJson": { + "containsUnsupportedFeatureType": "GeoRSS mit W3C-Geometrie enthält nicht unterstützten Feature-Typ: {{type}}" + }, + "mapboxVectorTileImageryProvider": { + "moreThanFourTiles": "Das Rechteck des Bildanbieters und minimumLevel zeigen an, dass es {{tileCount}} Kacheln auf der Mindestebene gibt. Bildanbieter mit mehr als vier Kacheln auf der Mindestebene werden nicht unterstützt.", + "requireLayerName": "MapboxVectorTileImageryProvider benötigt einen Layernamen, der als options.layerName übergeben wird", + "maxLevelError": "Maximalwert zu hoch für den Datensatz", + "requireStyles": "MapboxVectorTileImageryProvider benötigt eine Styling-Funktion, die als options.styleFunc übergeben wird" + }, + "computeRingWindingOrder": { + "devError": "Erwartete Punkte des Typs {x:number, y:number}" + }, + "geoRssToGeoJson": { + "containsUnsupportedFeatureType": "GeoRSS enthält einen nicht unterstützten Feature-Typ: {{type}}" + }, + "imageryProviderHooks": { + "devError": "Kein Kontext für die Bildneueinfärbung." + }, + "regionProvider": { + "csvRegionMappingTitle": "CSV-Regionszuordnung", + "csvRegionMappingMessageZeroFound": "Keine Regionsnamen für Regionstyp {{regionType}} gefunden", + "csvRegionMappingMessageZeroBoundariesFound": "Keine Regionsgrenzen für die Region {{regionName}} gefunden", + "csvRegionMappingMessageLoadError": "Konnte die Regionsgrenzen für die Region {{regionName}} nicht laden {{exception}}" } }, "helpPanel": { "btnText": "Hilfe", "dismissText": "Verstanden, danke!", "promptMessage": "Die Tour, Anleitungsvideos und andere Hilfsinhalte finden Sie hier", - "takeTour": "Starten Sie die Tour", + "takeTour": "Starten den Tour", "mapUserGuide": "Benutzerhandbuch der Karte", "menuPaneBody": "Nützliche Tipps zur Verwendung von TerriaJS finden Sie entweder in den folgenden Anleitungen oder Sie können das Team unter [{{supportEmail}}]({{supportEmail}}) kontaktieren", "menuPaneTitle": "Wir sind für Sie da" @@ -850,7 +1302,13 @@ "search": { "resultsLabel": "Suchergebnisse", "data": "Daten", - "done": "Fertig" + "done": "Fertig", + "searchInDataCatalog": "Suche <1>'{{locationSearchText}}' im Datenkatalog", + "search": "Suche '{{searchText}}' im Datenkatalog", + "viewLess": "Weniger {{name}} Ergebnisse anzeigen", + "viewMore": "Weitere {{name}} Ergebnisse anzeigen", + "placeholder": "Suche nach Orten", + "searchCatalogue": "Katalog durchsuchen" }, "mobile": { "addDataBtnText": "Daten", @@ -868,12 +1326,42 @@ "licence": "Lizenz", "accessConstraints": "Zugriffsbeschränkungen", "fees": "Gebühren", - "updateFrequency": "Aktualisierungsfrequenz" + "updateFrequency": "Aktualisierungsfrequenz", + "previewItemErrorTitle": "Katalogelement konnte nicht in der Vorschau angezeigt werden.", + "previewItemErrorMessage": "Beim Laden des Katalogeintrags ist ein Fehler aufgetreten.", + "dataPreview": "DATENVORSCHAU", + "datasetDescription": "Beschreibung des Datensatzes", + "doesNotContainGeospatialData": "Die Datei enthält keine Geodaten.", + "preview": "{{appName}} Vorschau", + "removeFromMap": "Von der Karte entfernen", + "dataPreviewLoading": "LADEN DER DATENVORSCHAU...", + "dataCustodian": "Herausgeber", + "selectToPreview": "<0>Wählen Sie einen Datensatz aus, um eine Vorschau zu sehen <1>- ODER -<2>Gehen Sie zur Karte", + "loading": "VORSCHAU LADEN...", + "noPreviewAvailable": "KEINE VORSCHAU VERFÜGBAR", + "resourceDescription": "Beschreibung der Ressource", + "dataPreviewError": "FEHLER BEI DER DATENVORSCHAU", + "addToMap": "Zur Karte hinzufügen", + "mayBeExperiencingIssues": "Bei diesem Datensatz können derzeit Probleme auftreten" }, "description": { "layerName": "Layername", "typeName": "Typenname", - "name": "Beschreibung" + "name": "Beschreibung", + "dataCustodian": "Herausgeber", + "downloadData": "Daten downloaden", + "wfs": "Dies ist ein <1>WFS-Dienst, der auf Anfrage räumliche Rohdaten überträgt. Er kann in einer GIS-Software mit dieser URL verwendet werden:", + "dataSourceDetails": "Angaben zur Datenquelle", + "dataServiceDetails": "Angaben zum Datendienst", + "dataLocal": "Diese Datei existiert nur in Ihrem Browser. Um sie weiterzugeben, müssen Sie sie auf einen öffentlichen Webserver laden.", + "useTheLinkToDownload": "Über den unten stehenden Link können Sie die Daten direkt herunterladen.", + "useLinkBelow": "Verwenden Sie den unten stehenden Link, um die Daten herunterzuladen. Weitere Informationen zur Anpassung der URL-Abfrageparameter finden Sie unter {{link}}.", + "downloadInFormat": "Herunterladen der aktuell ausgewählten Daten im Format {{format}}", + "dataNotLocal": "Bitte wenden Sie sich an den Anbieter dieser Daten, um weitere Informationen zu erhalten, einschließlich Informationen über Nutzungsrechte und -beschränkungen.", + "wms": "Dies ist ein <1>WMS-Dienst, der auf Anfrage Kartenbilder erzeugt. Er kann in einer GIS-Software mit dieser URL verwendet werden:", + "downloadNotSupported": "Leider unterstützt Ihr Browser nicht die Funktionen, die zum Herunterladen dieser Daten als Datei erforderlich sind. Bitte verwenden Sie $t(browsers.chrome), $t(browsers.firefox), $t(browsers.edge), $t(browsers.safari) oder einen anderen geeigneten Browser, um diese Daten herunterzuladen.", + "metadataUrls": "Links zu Metadaten", + "dataUrl": "Links zu Daten" }, "concept": { "active": { @@ -881,73 +1369,199 @@ "remove": "Bedingung entfernen" }, "inactive": { - "cancel": "Abbruch" + "cancel": "Abbruch", + "newText": "Neue Bedingung" }, "summary": { - "addMoreText": "Bedingung hinzufügen" + "addMoreText": "Bedingung hinzufügen", + "addFirstText": "Neue Bedingung hinzufügen" } }, "dataCatalog": { - "groupRemove": "Gruppe löschen" + "groupRemove": "Gruppe löschen", + "groupEmpty": "Gruppe ist leer" }, "catalogItem": { "remove": "Entfernen", "add": "Hinzufügen", - "loading": "Laden..." + "loading": "Laden...", + "trash": "Aus dem Katalog entfernen", + "privateIndicatorTitle": "Privater Datensatz", + "preview": "Vorschau", + "removeFromMap": "Von der Karte entfernen" }, "chart": { "closePanel": "Panel schließen", "expand": "Erweitern", "download": "Herunterladen", - "sectionLabel": "Diagramme" + "sectionLabel": "Diagramme", + "loading": "Laden der Diagrammdaten...", + "noData": "Keine geeigneten Daten gefunden.", + "showItemInChart": "Zeige {{value}} im Diagramm" }, "emptyWorkbenchMessage": "<0><0>Ihr Arbeitsbereich ist leer<1>Klicken Sie oben auf '$t(addData.addDataBtnText)'<2><0>Durchsuchen Sie den Datenkatalog<1>Laden Sie Ihre eigenen Daten in die Karte<3><0>Hinweis.<2>Alle Ihre aktiven Datensätze werden hier aufgelistet", "welcomeMessage": { "exploreDataBtnText": "Datenkatalog", - "searchBtnText": "Nach einem Ort suchen" + "searchBtnText": "Nach einem Ort suchen", + "title": "So fangen Sie an", + "welcomeMessageOnMobile": "Interessieren Sie sich für die Entdeckung und Erforschung von Daten?", + "helpBtnText": "Ich benötige Hilfe", + "dismissText": "Schließen die Nachricht und zeigen sie nicht mehr an", + "welcomeMessage": "Interessieren Sie sich für die Erkundung und Erforschung von Daten?
    Stürzen Sie sich hinein und fangen Sie an oder schauen Sie sich die folgenden Hilfsoptionen an.", + "tourBtnText": "Starten den Tour" }, "satelliteGuidance": { "prevI": "Nein danke", "bodyIII": "Um historische Bilder zu laden, wählen Sie in Ihrem Arbeitsbereich das Erfassungsdatum über das Dropdown-Menü für einen der verfügbaren Zeitpunkte aus.", "bodyV": "Sie können eine Reihe von Stilen, wie z. B. Falschfarben, auf Satellitenbilder anwenden, indem Sie auf das Dropdown-Menü \"Stile\" in Ihrem Arbeitsbereich klicken.", - "bodyIV": "Satellitenbilder sind möglicherweise nicht immer zu dem von Ihnen gewünschten Zeitpunkt und an dem von Ihnen gewünschten Ortverfügbar. Wenn Sie nur Bilder für einen bestimmten Ort anzeigen möchten, klicken Sie in Ihrem Arbeitsbereich auf \"Nach Ort filtern\"." + "bodyIV": "Satellitenbilder sind möglicherweise nicht immer zu dem von Ihnen gewünschten Zeitpunkt und an dem von Ihnen gewünschten Ortverfügbar. Wenn Sie nur Bilder für einen bestimmten Ort anzeigen möchten, klicken Sie in Ihrem Arbeitsbereich auf \"Nach Ort filtern\".", + "titleI": "Satellitenbilder: Wie kann ich...?", + "nextI": "Anleitung ansehen", + "dismissText": "Verstanden, danke!", + "menuTitle": "Sie können jederzeit über das <2>Hilfemenü auf Kartenanleitungen zugreifen.", + "titleII": "Wo ist mein Satellitenbild?", + "bodyII": "Möglicherweise müssen Sie Ihre Zoomstufe anpassen, damit die Satellitenbilder auf der Karte sichtbar werden.", + "titleIV": "Filtern von Bildmaterial nach Ort", + "titleV": "Wie kann ich Falschfarbenbilder anzeigen?", + "bodyI": "Ein superkurzer Leitfaden, um das Beste aus historischen Satellitenbildern herauszuholen.", + "titleIII": "Laden von historischem Bildmaterial" }, "satellite": { "zoomTo": "Zoomen auf", "removeFilter": "Filter löschen", - "newLocation": "Neue Standortsuche" + "newLocation": "Neue Standortsuche", + "filterByLocation": "Nach Ort filtern", + "infoGroup": "Es werden nur verfügbare Aufnahmezeiten für angezeigt:", + "querying": "Position abfragen...", + "pickPoint": "Wählen Sie einen Punkt aus, indem Sie auf die Karte klicken." }, "analytics": { "selectLocation": "Ort wählen", "polygon": "Polygon", - "regionName": "Regionsname" + "regionName": "Regionsname", + "point": "Punkt (lat/lon)", + "enterValidCoords": "Bitte geben Sie gültige Koordinaten ein (z. B. 131,0361, -25,3450).", + "runAnalysis": "Analyse starten", + "clickToDrawLine": "Klicken, um Linie zu zeichnen", + "selectedPolygon": "Ausgewähltes Polygon", + "shiftToDrawRectangle": "Drücken Sie die SHIFT-Taste und halten Sie die linke Maustaste gedrückt, um ein Rechteck zu zeichnen", + "clickToDrawRectangle": "Klicken, um ein Rechteck zu zeichnen", + "clickToDrawPolygon": "Klicken, um Polygon zu zeichnen", + "selectExistingPolygon": "Vorhandenes Polygon auswählen", + "existingPolygon": "Bestehendes Polygon", + "nothingSelected": "Es wurde noch nichts ausgewählt, bitte verwenden Sie die Schaltflächen oben, um eine Auswahl zu treffen.", + "selectPoint": "Wählen Sie einen Punkt aus, indem Sie auf die Karte klicken." }, "core": { "dataType": { "sdmx-group": "SDMX-JSON", "csv": "CSV", - "gpx": "", + "gpx": "GPX", "czml": "CZML", "json": "Terria Katalog", - "carto": "", - "gltf": "" + "carto": "Carto V1", + "gltf": "glTF", + "assimp-local-description": "**Warnung:** 3D-Dateikonverter ist experimentell. \nSiehe Liste der [unterstützten Formate] (https://github.com/assimp/assimp/blob/master/doc/Fileformats.md). \nDateien müssen gezippt werden.", + "assimp-remote-description": "**Warnung:** 3D-Dateikonverter ist experimentell. \nSiehe Liste der [unterstützten Formate] (https://github.com/assimp/assimp/blob/master/doc/Fileformats.md). \nZip-Dateien werden auch unterstützt", + "esri-featureServer": "Esri ArcGIS FeatureServer (single layer)", + "3d-tiles": "3D Tiles", + "open-street-map": "Open Street Map Server", + "wfs-group": "Web Feature Service (WFS) Server", + "wps-getCapabilities": "Web Processing Service (WPS) Server", + "esri-mapServer": "Esri ArcGIS MapServer (single layer)", + "geojson": "GeoJSON", + "ifc": "IFC", + "carto-v3": "Carto V3", + "shp": "Shapefile", + "auto": "Dateityp", + "socrata-group": "Socrata Server", + "wms-group": "Web Map Service (WMS) Server", + "wmts-group": "Web Map Tile Service (WMTS) Server", + "esri-group": "Esri ArcGIS Server", + "opendatasoft-group": "Opendatasoft Portal", + "geoRss": "GeoRSS", + "kml": "KML or KMZ", + "assimp-local": "3D-Dateikonverter (zip) (experimentell)", + "assimp-remote": "3D-Dateikonverter (experimentell)" }, "terriaError": { "defaultMessage": "Unbekannter Fehler", - "defaultTitle": "Ein Fehler ist aufgetreten" + "defaultTitle": "Ein Fehler ist aufgetreten", + "defaultCombineTitle": "Mehrere Fehler sind aufgetreten", + "defaultCombineMessage": "Einzelheiten zu den Fehlern sind nachstehend aufgeführt", + "networkRequestTitle": "Ein Netzwerkanforderungsfehler ist aufgetreten", + "networkRequestMessage": "Die Daten sind möglicherweise nicht verfügbar oder werden nicht korrekt angezeigt, weil der Dienst des Herausgebers ausgefallen ist. Bitte versuchen Sie, die Karte neu zu laden, die Daten zu einem späteren Zeitpunkt abzurufen oder einen anderen Datensatz auszuwählen. ", + "networkRequestMessageDetailed": "Dies kann eine der folgenden Ursachen haben:\n\n* Der Hostname des Servers konnte nicht aufgelöst werden\n* Der Server hat nicht auf die Anfrage geantwortet - oder ist vorübergehend nicht verfügbar\n* Der Server verweigert den [Cross-Origin Resource Sharing (CORS)](https://docs.terria.io/guide/connecting-to-data/cross-origin-resource-sharing/) Zugriff auf diese URL\n* Es gibt ein Problem mit Ihrer Internetverbindung\n\nWenn Sie den Link manuell eingegeben haben, überprüfen Sie bitte, ob der Link korrekt ist." }, "unverifiedExternalLink": { - "denyText": "Abbruch" - } + "denyText": "Abbruch", + "title": "Warnung: nicht verifizierter Link", + "message": "Sie sind dabei zu öffnen: \n\n`{{url}}` \n\nDieser Link ist nicht verifiziert und könnte unsicher sein.", + "confirmText": "In neuem Tab öffnen" + }, + "printWindow": { + "onbeforeprint": "onbeforeprint", + "errorTitle": "Fehler beim Drucken", + "onafterprint": "onafterprint", + "errorMessage": "Der Druckvorgang wurde nicht innerhalb von 10 Sekunden gestartet. Vielleicht unterstützt dieser Webbrowser das Drucken nicht?", + "printMediaStart": "Druckmedienstart", + "printMediaEnd": "Druckmedienende" + }, + "readXml": { + "xmlError": "Die Datei enthält kein gültiges XML." + }, + "dataUri": { + "errorTitle": "Browser unterstützt keinen Daten-Download", + "errorMessage": "Leider unterstützen Microsoft-Browser (einschließlich aller Versionen von Internet Explorer und Edge) nicht die Daten-URI-Funktionalität, die zum Herunterladen von Daten als Datei erforderlich ist. Zum Herunterladen kopieren Sie die folgende uri in einen anderen Browser wie $t(browsers.chrome), $t(browsers.firefox) oder $t(browsers.safari): {{href}}" + }, + "consoleAnalytics": { + "started": "ConsoleAnalytics wurde gestartet.", + "logStartedWithGAParameters": "ConsoleAnalytics wurde gestartet, aber ein `googleAnalyticsKey` oder `googleAnalyticsOptions` Schlüssel wurde auf `configParameters` beobachtet", + "startedNoenableConsoleAnalytics": "ConsoleAnalytics wurde gestartet, aber `configParameters.enableConsoleAnalytics` wurde nicht definiert oder auf false gesetzt." + }, + "readText": { + "fileRequired": "Datei ist erforderlich" + }, + "serverConfig": { + "failedToGet": "Die Serverkonfiguration konnte nicht von {{serverConfigUrl}} abgerufen werden. Dies bedeutet, dass Dienste wie Proxy, Konvertierung und URL-Verkürzung möglicherweise nicht funktionieren." + }, + "errors": { + "tooDeepAddedByUser": "Sie haben 100 Katalogeinträge erreicht, wenn Sie addedByUser prüfen und bei der ID \"{{memberId}}\" landen? Prüfen Sie, ob Sie eine rekursive Kataloggruppe haben." + }, + "userAddedData": "Benutzerdefinierte Daten", + "googleAnalytics": { + "log": "Google Analytics-Tracking ist deaktiviert, weil terria.configParameters.googleAnalyticsKey nicht angegeben ist", + "logEnabledOnDevelopment": "Google Analytics wurde in einer \"Entwicklungsumgebung\" initialisiert" + }, + "chartData": "Diagrammdaten" }, "browsers": { - "safari": "", - "chrome": "", - "firefox": "", - "edge": "" + "safari": "Apple Safari", + "chrome": "Google Chrome", + "firefox": "Mozilla Firefox", + "edge": "Microsoft Edge" }, "deltaTool": { - "cancelBtn": "Abbruch" + "cancelBtn": "Abbruch", + "pickLocation": "Um die verfügbaren Bilder zu sehen, wählen Sie bitte auf der nebenstehenden Karte den Ort aus, der Sie interessiert.", + "primaryImage": "Primäres Bild", + "secondaryImage": "Sekundäres Bild", + "loadingError": { + "message": "Beim Versuch, das Deltatool vom Server zu laden, ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut.", + "title": "Fehler beim Laden des Delta Tools" + }, + "pickerMessage": { + "pickAnother": "Klicken Sie auf einen anderen Punkt, um die Auswahl zu ändern", + "pickFirst": "Wählen Sie einen Punkt aus, indem Sie auf die Karte klicken", + "pickError": "Fehler beim Versuch, Bilder am gewählten Ort aufzulösen! Bitte wählen Sie erneut einen Punkt aus, indem Sie auf die Karte klicken." + }, + "generateDeltaBtn": "Differenzkarte generieren", + "selectedLocation": "Ausgewählter Ort", + "titlePrefix": "Änderungserkennung", + "description": "Dieses Tool visualisiert den Unterschied zwischen Bildern, die zu zwei verschiedenen Zeitpunkten aufgenommen wurden.", + "catalogItem": { + "description": "Diese Ebene visualisiert den Unterschied zwischen Bildern, die zu zwei verschiedenen Zeitpunkten aufgenommen wurden" + } }, "notification": { "title": "Nachricht" @@ -958,11 +1572,21 @@ "pedestrianMode": { "controls": { "title": "Steuerungen" - } + }, + "dropPedestrianTooltipMessage": "Linkklick zur Auswahl des Ortes
    Rechtsklick / Esc um abzubrechen", + "toolButtonTitle": "Fußgängermodus" }, "viewModels": { "searchAddresses": "Adressen", - "searchLocations": "Orte" + "searchLocations": "Orte", + "inDataCatalogue": "Im Datenkatalog", + "searchPlaceNames": "Offizielle Ortsnamen", + "searchNoPlaceNames": "Leider entsprechen keine offiziellen Ortsnamen Ihrer Suchanfrage.", + "inMultipleLocations": "An mehreren Standorten, darunter: ", + "searchCatalogueItem": "Katalogelemente", + "searchNoCatalogueItem": "Leider entsprechen keine Katalogartikel Ihrer Suchanfrage.", + "searchNoLocations": "Leider entsprechen keine Orte Ihrer Suchanfrage.", + "searchErrorOccurred": "Bei der Suche ist ein Fehler aufgetreten. Bitte überprüfen Sie Ihre Internetverbindung oder versuchen Sie es später noch einmal." }, "languagePanel": { "changeLanguage": "Sprache ändern" @@ -971,10 +1595,53 @@ "back": "Zurück", "timeline": { "gotoStart": "Gehe zum Anfang", - "togglePlay": "Abspielen" - } + "togglePlay": "Abspielen", + "textCell": "Name des Datensatzes, dessen Zeitbereich angezeigt wird", + "playSlower": "Langsamer abspielen", + "playFaster": "Schneller abspielen" + }, + "selectorLabel": "Zeit:", + "useTimeline": "Zeitleiste verwenden", + "availableTimeChart": "Verfügbare Zeiten im Diagramm anzeigen", + "next": "Nächste Zeit", + "previous": "Vorherige Zeit", + "selectTime": "Zeit auswählen", + "outOfRange": "Zurzeit außerhalb des Bereichs." }, "loader": { "loadingMessage": "Laden" + }, + "indexedItemSearchProvider": { + "missingOptionIndexRootUrl": "Die Option `indexRootUrl` fehlt in der Suchkonfiguration des Elements.", + "errorParsingIndexRoot": "Fehler beim Parsen der indexRoot-Datei: {{indexRootUrl}}." + }, + "toast": { + "mapIsZooming": "Idealen Zoom laden..." + }, + "terriaViewer": { + "webGLNotSupportedTitle": "WebGL wird nicht unterstützt", + "slowWebGLAvailableTitle": "Schlechte WebGL-Performance", + "slowWebGLAvailableMessage": "Ihr Webbrowser meldet, dass er Leistungsprobleme bei der Anzeige von {{appName}} in 3D hat, so dass Sie nur eine eingeschränkte 2D-Darstellung sehen werden. Um das volle 3D-Erlebnis zu erhalten, verwenden Sie bitte einen anderen Webbrowser, aktualisieren Sie Ihre Grafiktreiber oder aktualisieren Sie Ihr Betriebssystem.", + "webGLNotSupportedOrSlowTitle": "WebGL nicht unterstützt oder zu langsam", + "slowWebGLAvailableMessageII": "{{appName}} funktioniert am besten mit einem Webbrowser, der {{webGL}} unterstützt, einschließlich der neuesten Versionen von $t(browsers.chrome), $t(browsers.firefox), $t(browsers.edge) und $t(browsers.safari). Ihr Webbrowser scheint WebGL nicht zu unterstützen, so dass Sie eine eingeschränkte, reine 2D-Darstellung sehen werden.", + "webGLNotSupportedOrSlowMessage": "Ihr Webbrowser kann die Karte nicht in 3D anzeigen, entweder weil er WebGL nicht unterstützt oder weil Ihr Webbrowser gemeldet hat, dass WebGL extrem langsam ist. Bitte versuchen Sie einen anderen Webbrowser, wie z.B. die neueste Version von $t(browsers.chrome), $t(browsers.firefox), $t(browsers.edge) oder $t(browsers.safari). In einigen Fällen müssen Sie möglicherweise den Grafiktreiber oder das Betriebssystem Ihres Computers aktualisieren, um die 3D-Ansicht in {{appName}} zu erhalten." + }, + "timer": { + "nextScheduledUpdateTime": "Nächste Datenaktualisierung um {{scheduledUpdateTime}}", + "nextScheduledUpdateCountdown": "Nächste Datenaktualisierung in {{timeCountdown}}" + }, + "dragDrop": { + "not": "<0>bbbb", + "text": "<0>Drag & Drop<1>Ihre Daten überall auf der Karte anzeigen<1>" + }, + "term": { + "missingContent": "fehlender Inhalt" + }, + "mapNavigation": { + "additionalToolsTitle": "Zusätzliche Tools öffnen", + "additionalTools": "Zusätzliche Tools" + }, + "includeStory": { + "message": "Story in Freigabe einbeziehen" } } From c52c96398064cdd38618adcf801d9d474c9e5788 Mon Sep 17 00:00:00 2001 From: Sven Wiemers Date: Wed, 21 Jun 2023 15:45:16 +0000 Subject: [PATCH 218/654] Translated using Weblate (German) for TerriaJSNext Currently translated at 100.0% (1218 of 1218 strings) Translation: TerriaJS/TerriaJSNext Translate-URL: https://hosted.weblate.org/projects/terriajs/terriajsnext/de/ --- wwwroot/languages/de/translation.json | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/wwwroot/languages/de/translation.json b/wwwroot/languages/de/translation.json index 3903156ba9e..0b8862c34ed 100644 --- a/wwwroot/languages/de/translation.json +++ b/wwwroot/languages/de/translation.json @@ -178,7 +178,7 @@ "bothTitle": "Auf beiden Seiten anzeigen", "copyName": "{{name}} (kopieren)" }, - "toggleSplitterToolTitle": "Vergleichen", + "toggleSplitterToolTitle": "Vergleich", "toggleSplitterToolDisabled": "Bitte deaktivieren Sie andere Funktionen für den Side-by-Side-Vergleich, um den Standardvergleich zu aktivieren", "toggleSplitterTool": "Ermöglicht einen Seite-an-Seite-Vergleich zwischen zwei verschiedenen Datensätzen", "title": "Ziehen Sie nach links oder rechts, um die Ansichten anzupassen", @@ -661,7 +661,7 @@ "serviceErrorMessage": "Zu diesem Dienst sind keine Einzelheiten verfügbar.", "stubCreationFailure": "Katalogelement {{item}} konnte nicht gelöscht werden", "addAll": "Alle hinzufügen", - "removeAll": "Alle entfernen", + "removeAll": "Entferne alle", "unsupportedFileTypeMessage": "Dieses Dateiformat wird nicht unterstützt von {{appName}}. Folgende Dateiformate werden unterstützt:
    • .geojson
    • .kml, .kmz
    • .csv (in {{link}})
    • Shapefile (.zip)
    ", "convertErrorMessage": "Diese Katalogdatei basiert auf einer älteren Version von TerriaJS - der Software, die diese Webkarte betreibt. Beim Versuch, die Katalogdaten für {{url}} zu aktualisieren, ist ein Fehler aufgetreten.", "chartDataGroup": "Gruppe für Diagrammdaten.", @@ -966,7 +966,7 @@ "workbench": { "diffImageTitle": "Bildunterschiede zwischen zwei Daten anzeigen", "colorScaleUpdateRange": "Aktualisieren", - "previewItem": "Dateninformationen", + "previewItem": "Informationen", "colorScaleRange": "Farbskala-Bereich", "colorScaleRangeTitle": "Ungültiger Farbskalenbereich", "colorScaleRangeMin": "Der Minimalwert muss eine Zahl sein.", @@ -975,7 +975,7 @@ "splitScreenMode": "SPLITSCREEN-MODUS", "openFeature": "Zoomen auf", "splitItem": "Vergleichen", - "removeAll": "Alle entfernen", + "removeAll": "Entferne alle", "expandAll": "Alle ausklappen", "colorScaleRangeMinSmallerThanMax": "Der Minimalwert des Farbskalenbereichs muss kleiner als der Höchstwert sein.", "splitItemTitle": "Duplizieren und Splitter anzeigen", @@ -986,7 +986,7 @@ "zoomToTitle": "Zoom auf Ausdehnung", "diffImage": "Differenz", "exportDataTitle": "Kartendaten exportieren", - "collapseAll": "Alles einklappen", + "collapseAll": "Alle einklappen", "dimensionsSelector": { "undefinedLabel": "Keine Angabe" }, @@ -997,10 +997,10 @@ "exportData": "Exportieren", "label": "Datensätze", "searchItem": "Suche", - "previewItemTitle": "Dateninformationen", + "previewItemTitle": "Informationen", "rangeMax": "Maximum:", "displayPercent": "Anzeige als Prozentsatz der regionalen Gesamtsumme", - "zoomTo": "Idealer Zoom", + "zoomTo": "Zoom", "openFeatureTitle": "Auf Daten zoomen" }, "trainer": { @@ -1126,7 +1126,7 @@ "chooseDifference": "Wählen Sie eine Differenz-Output" }, "story": { - "removeAllStories": "Alle entfernen", + "removeAllStories": "Entfernen alle", "editor": { "saveBtn": "speichern", "saveStory": "Speichern", From ebef1b462a0bcb91591970f9719308f246b2e230 Mon Sep 17 00:00:00 2001 From: Sven Wiemers Date: Wed, 21 Jun 2023 15:59:11 +0000 Subject: [PATCH 219/654] Translated using Weblate (German) for TerriaJSNext Currently translated at 100.0% (1218 of 1218 strings) Translation: TerriaJS/TerriaJSNext Translate-URL: https://hosted.weblate.org/projects/terriajs/terriajsnext/de/ --- wwwroot/languages/de/translation.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/wwwroot/languages/de/translation.json b/wwwroot/languages/de/translation.json index 0b8862c34ed..b94d4d499c5 100644 --- a/wwwroot/languages/de/translation.json +++ b/wwwroot/languages/de/translation.json @@ -170,10 +170,10 @@ }, "splitterTool": { "workbench": { - "goright": "Rechts", + "goright": "rechts", "goleft": "links", "gorightTitle": "Auf der rechten Seite anzeigen", - "both": "Beide", + "both": "beide", "goleftTitle": "Auf der linken Seite anzeigen", "bothTitle": "Auf beiden Seiten anzeigen", "copyName": "{{name}} (kopieren)" @@ -928,7 +928,7 @@ }, "compare": { "dateButton": { - "right": "Rechts", + "right": "rechts", "select": "Datum wählen", "left": "links" }, @@ -954,7 +954,7 @@ "sendAllToBack": "Alle in den Hintergrund", "hideAll": "Alle ausblenden" }, - "title": "Vergleichen", + "title": "Vergleich", "dataset": { "label": "Datensatz", "selectOne": "Datensatz wählen" @@ -1011,7 +1011,7 @@ }, "tour": { "preface": { - "title": "Starten den Tour", + "title": "Starten der Tour", "content": "Sie wissen nicht, wo Sie anfangen sollen? Machen Sie einen kurzen Rundgang durch die Hauptmerkmale unserer Software und lernen Sie einige der wichtigsten Funktionen kennen, die Ihnen den Einstieg erleichtern.", "close": "Vielleicht später", "start": "Tour Starten" @@ -1294,7 +1294,7 @@ "btnText": "Hilfe", "dismissText": "Verstanden, danke!", "promptMessage": "Die Tour, Anleitungsvideos und andere Hilfsinhalte finden Sie hier", - "takeTour": "Starten den Tour", + "takeTour": "Starten der Tour", "mapUserGuide": "Benutzerhandbuch der Karte", "menuPaneBody": "Nützliche Tipps zur Verwendung von TerriaJS finden Sie entweder in den folgenden Anleitungen oder Sie können das Team unter [{{supportEmail}}]({{supportEmail}}) kontaktieren", "menuPaneTitle": "Wir sind für Sie da" @@ -1408,7 +1408,7 @@ "helpBtnText": "Ich benötige Hilfe", "dismissText": "Schließen die Nachricht und zeigen sie nicht mehr an", "welcomeMessage": "Interessieren Sie sich für die Erkundung und Erforschung von Daten?
    Stürzen Sie sich hinein und fangen Sie an oder schauen Sie sich die folgenden Hilfsoptionen an.", - "tourBtnText": "Starten den Tour" + "tourBtnText": "Starten der Tour" }, "satelliteGuidance": { "prevI": "Nein danke", From 69ce7cc87a354d2a5440510cc474474a80b3d974 Mon Sep 17 00:00:00 2001 From: Tisham Dhar Date: Thu, 22 Jun 2023 06:52:01 +0000 Subject: [PATCH 220/654] Translated using Weblate (Swahili) for TerriaJSNext Currently translated at 2.3% (29 of 1218 strings) Translation: TerriaJS/TerriaJSNext Translate-URL: https://hosted.weblate.org/projects/terriajs/terriajsnext/sw/ --- wwwroot/languages/sw/translation.json | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/wwwroot/languages/sw/translation.json b/wwwroot/languages/sw/translation.json index 4c29bc8be2d..809d3e372c5 100644 --- a/wwwroot/languages/sw/translation.json +++ b/wwwroot/languages/sw/translation.json @@ -35,5 +35,15 @@ "exploreMapDataButton": { "content": "## Chagua ramani\n\nVinjaria katlogi kwa kupata data na ongeza kwenye ramani hapa. Unaweza kuongeza data zaidi ya moja kwa wakati mmoja, na utaona zinaonyeshwa chini ndani ya Benchi la kazi (Workbench)." } + }, + "measure": { + "measureTool": "Zana ya kupima", + "measureToolTitle": "Pima Mstari", + "measureDistance": "Pima umbali kati ya maeneo" + }, + "location": { + "location": "Mahali", + "errorGettingLocation": "Kosa kupata maeneo", + "myLocation": "Mahali yangu" } } From 695f9a625051709aa43a67c7e83a2423358ff500 Mon Sep 17 00:00:00 2001 From: Hiroo Imaki Date: Sun, 25 Jun 2023 05:53:21 +0000 Subject: [PATCH 221/654] Translated using Weblate (Japanese) for TerriaJSNext Currently translated at 100.0% (1218 of 1218 strings) Translation: TerriaJS/TerriaJSNext Translate-URL: https://hosted.weblate.org/projects/terriajs/terriajsnext/ja/ --- wwwroot/languages/ja/translation.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/wwwroot/languages/ja/translation.json b/wwwroot/languages/ja/translation.json index f57519dc40a..f56687b37ca 100644 --- a/wwwroot/languages/ja/translation.json +++ b/wwwroot/languages/ja/translation.json @@ -907,7 +907,7 @@ "badlyFormatedMessage": "'{{name}}' データセットは、周期性の点で正しくフォーマットされていません '{{isoSegments}}'。データセットの情報ボタンをクリックするとデータセットとデータを管理する主体の情報が得られます。", "badlyFormatedTitle": "周期性が正しくフォーマットされていません", "datasetScaleErrorTitle": "このスケールではデータセットは表示されません", - "noLayerFoundMessage": "WMS データセット'{{name}}' に '{{layers}}'に該当するレイヤがありません。 {{suggested}} {{line}}{{line}}カタログファイルが正しく設定されていないかWMSサーバーが変更された可能性があります。", + "noLayerFoundMessage": "WMS データセット'{{name}}' に '{{layers}}'に該当するレイヤがありません。 カタログファイルが正しく設定されていないかWMSサーバーが変更された可能性があります。", "noLayerFoundTitle": "レイヤが一つも見つかりません", "defaultStyleLabel": "デフォルトのスタイル", "getCapabilitiesUrl": "GetCapabilities URL", @@ -922,9 +922,9 @@ "reachedMaxFeatureLimit": "警告: このレイヤはWFSフィーチャの限度 ({{maxFeatures}}) に達しました", "missingUrlMessage": "Web Feature Service (WFS) の GetCapabilities ドキュメントを読めませんでした。語るぐアイテムに `url`がないためです。", "missingUrlTitle": "GetCapabilities を読めませんでした", - "missingDataMessage": "WFS データセット '{{name}}' は何もデータを返しません。{{line}}{{line}}カタログが正しく設定されていないかサーバーのアドレスが変わったかもしれません。", + "missingDataMessage": "WFS データセット '{{name}}' は何もデータを返しません。カタログが正しく設定されていないかサーバーのアドレスが変わったかもしれません。", "missingDataTitle": "見つからないデータ", - "noLayerFoundMessage": "WFS データセット'{{name}}' には '{{typeNames}}' に該当するレイヤがありません。 {{suggested}} {{line}}{{line}}カタログファイルが正しく設定されていないか、WFSサーバーが変更されたと思われます。", + "noLayerFoundMessage": "WFS データセット'{{name}}' には '{{typeNames}}' に該当するレイヤがありません。 カタログファイルが正しく設定されていないか、WFSサーバーが変更されたと思われます。", "noLayerFoundTitle": "レイヤがありません", "getCapabilitiesUrl": "GetCapabilities URL", "serviceContact": "サービスに関する連絡先", From 872a6709ff979f1545678293dfedb1ffdb4bcc39 Mon Sep 17 00:00:00 2001 From: raf Date: Tue, 27 Jun 2023 10:29:55 +0000 Subject: [PATCH 222/654] Translated using Weblate (Catalan) for TerriaJSNext Currently translated at 100.0% (1218 of 1218 strings) Translation: TerriaJS/TerriaJSNext Translate-URL: https://hosted.weblate.org/projects/terriajs/terriajsnext/ca/ --- wwwroot/languages/ca/translation.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/wwwroot/languages/ca/translation.json b/wwwroot/languages/ca/translation.json index 94d8e55aa4c..e48d6cb323d 100644 --- a/wwwroot/languages/ca/translation.json +++ b/wwwroot/languages/ca/translation.json @@ -1428,9 +1428,9 @@ "accessConstraints": "Restriccions d'accés", "serviceContact": "Contacte del servei", "getCapabilitiesUrl": "URL del GetCapabilities", - "noLayerFoundMessage": "El conjunt de dades WFS \"{{name}}\" no té capes que coincideixin amb \"{{typeNames}}\". {{suggested}} {{line}}{{line}}O el fitxer de catàleg s'ha configurat incorrectament o el servidor WFS ha canviat.", + "noLayerFoundMessage": "El conjunt de dades WFS '{{name}}' no té capes que coincideixin amb '{{typeNames}}'. O bé el fitxer de catàleg s'ha configurat incorrectament o bé el servidor WFS ha canviat.", "missingDataTitle": "Falten dades", - "missingDataMessage": "El conjunt de dades WFS '{{name}}' no ha retornat cap dada.{{line}}{{line}}O el fitxer de catàleg s'ha configurat incorrectament o l'adreça del servidor ha canviat.", + "missingDataMessage": "El conjunt de dades WFS '{{name}}' no ha retornat cap dada. O bé el fitxer de catàleg s'ha configurat incorrectament o bé l'adreça del servidor ha canviat.", "missingUrlTitle": "No es pot carregar GetCapabilities", "missingUrlMessage": "No s'ha pogut carregar el document GetCapabilities del Web Feature Service (WFS) perquè l'element del catàleg no té una \"url\".", "noLayerFoundTitle": "No s'ha trobat cap capa", @@ -1456,7 +1456,7 @@ "getCapabilitiesUrl": "URL GetCapabilities", "defaultStyleLabel": "Estil per defecte", "noLayerFoundTitle": "No s'ha trobat cap capa", - "noLayerFoundMessage": "El conjunt de dades WMS \"{{name}}\" no té capes que coincideixin amb \"{{layers}}\". {{suggested}} {{line}}{{line}}O el fitxer de catàleg s'ha configurat incorrectament o el servidor WMS ha canviat.", + "noLayerFoundMessage": "El conjunt de dades WMS '{{name}}' no té capes que coincideixin amb '{{layers}}'. O bé el fitxer de catàleg s'ha configurat incorrectament o bé el servidor WMS ha canviat.", "badlyFormatedTitle": "Periodicitat mal formatada", "missingDataTitle": "Falten dades", "missingDataMessage": "El conjunt de dades WMS \"{{name}}\" no ha retornat cap dada.{{line}}{{line}}O el fitxer de catàleg s'ha configurat incorrectament o l'adreça del servidor ha canviat.", From fce46f7b5b3b314062169fa431f63ed38827477a Mon Sep 17 00:00:00 2001 From: "Dr.Loy" Date: Wed, 28 Jun 2023 05:09:48 +0000 Subject: [PATCH 223/654] Translated using Weblate (Khmer (Central)) for TerriaJSNext Currently translated at 66.9% (815 of 1218 strings) Translation: TerriaJS/TerriaJSNext Translate-URL: https://hosted.weblate.org/projects/terriajs/terriajsnext/km/ --- wwwroot/languages/km/translation.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wwwroot/languages/km/translation.json b/wwwroot/languages/km/translation.json index f2fad46e5f3..2a4aadc39bd 100644 --- a/wwwroot/languages/km/translation.json +++ b/wwwroot/languages/km/translation.json @@ -1130,7 +1130,7 @@ "dateComparisonB": "ការប្រៀបធៀបកាលបរិច្ឆេទ B", "sourceDataset": "ប្រភពសំណុំទិន្នន័យ", "previewStyle": "ម៉ូតមុន", - "area": "តំបន់", + "area": "ផ្ទៃ", "disabledButtonPrompt": "សូមចំណាំ៖ ទីតាំង និងកាលបរិច្ឆេទត្រូវតែត្រូវបានជ្រើសរើស ដើម្បីបន្តការរកឃើញការផ្លាស់ប្តូរ" }, "locationPicker": { From 2506b9333c2d228196354edcd703f3b102c13781 Mon Sep 17 00:00:00 2001 From: Tisham Dhar Date: Fri, 30 Jun 2023 07:48:00 +0000 Subject: [PATCH 224/654] Translated using Weblate (Swahili) for TerriaJSNext Currently translated at 4.6% (57 of 1218 strings) Translation: TerriaJS/TerriaJSNext Translate-URL: https://hosted.weblate.org/projects/terriajs/terriajsnext/sw/ --- wwwroot/languages/sw/translation.json | 70 ++++++++++++++++++++++++++- 1 file changed, 68 insertions(+), 2 deletions(-) diff --git a/wwwroot/languages/sw/translation.json b/wwwroot/languages/sw/translation.json index 809d3e372c5..ea003fdb7ad 100644 --- a/wwwroot/languages/sw/translation.json +++ b/wwwroot/languages/sw/translation.json @@ -26,7 +26,8 @@ "preface": { "title": "Chukua safari", "start": "Anza safari", - "close": "Labda baadae" + "close": "Labda baadae", + "content": "Umeshindwa mahali ya kuanza ? Chukua safari ya haraka ya huduma kuu za programu yetu, na ujifunze kuhusu baadhi ya kazi muhimu kukusaidia kupata njia yako." }, "finish": "Maliza", "locationSearchInput": { @@ -44,6 +45,71 @@ "location": { "location": "Mahali", "errorGettingLocation": "Kosa kupata maeneo", - "myLocation": "Mahali yangu" + "myLocation": "Mahali yangu", + "browserCannotProvide": "Kivinjari chako hakiwezi kutoa mahali pako.", + "originError": "Kivinjari chako kinaweza kutoa mahali kutumia https. Tafadhali ujaribu {{secureUrl}} badala yake.", + "centreMap": "Songeza ramani katika eneo lako la sasa" + }, + "core": { + "unverifiedExternalLink": { + "denyText": "Katisha" + } + }, + "helpPanel": { + "takeTour": "Chukua safari" + }, + "sui": { + "notifications": { + "denyText": "Labda baadae" + } + }, + "story": { + "next": "Kinachofuata", + "deleteStory": "Ondoa", + "editor": { + "cancelBtn": "Katisha", + "cancelEditing": "Katisha" + }, + "delete": "Ondoa", + "prev": "Kilichotangulia" + }, + "models": { + "userDrawing": { + "btnCancel": "Katisha" + } + }, + "splitterTool": { + "workbench": { + "bothTitle": "Onyesha kwa pande zote", + "goleftTitle": "Onyesha kwa upande wa kushoto", + "goleft": "Kushoto", + "both": "Vyote", + "gorightTitle": "Onyesha kwa upande wa kulia", + "goright": "Kulia" + }, + "toggleSplitterTool": "Wezesha kulinganisha upande kwa upande seti mbili tofauti za data", + "title": "Vuruta kushoto au kulia ili kurekebisha maoni" + }, + "feedback": { + "cancel": "Katisha" + }, + "welcomeMessage": { + "tourBtnText": "Chukua safari" + }, + "addData": { + "back": "Rudia" + }, + "concept": { + "inactive": { + "cancel": "Katisha" + } + }, + "deltaTool": { + "cancelBtn": "Katisha" + }, + "compare": { + "dateLocationFilter": { + "cancel": "Katisha" + } } } From 7298376b1c41cc72b9a10e9d1efebc8b4a03c0f1 Mon Sep 17 00:00:00 2001 From: "Dr.Loy" Date: Wed, 5 Jul 2023 04:26:30 +0000 Subject: [PATCH 225/654] Translated using Weblate (Khmer (Central)) for TerriaJSNext Currently translated at 67.0% (817 of 1218 strings) Translation: TerriaJS/TerriaJSNext Translate-URL: https://hosted.weblate.org/projects/terriajs/terriajsnext/km/ --- wwwroot/languages/km/translation.json | 34 +++++++++++++-------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/wwwroot/languages/km/translation.json b/wwwroot/languages/km/translation.json index 2a4aadc39bd..a58041306f2 100644 --- a/wwwroot/languages/km/translation.json +++ b/wwwroot/languages/km/translation.json @@ -93,8 +93,8 @@ "postOfficeBox": "ប្រអប់ប្រៃសណីយ៍", "poBox": "ប្រអប់ប្រៃសណីយ៍", "score": "ពិន្ទុ", - "lat": "Lat", - "lon": "Lon", + "lat": "រយៈទទឹង", + "lon": "រយះបណ្តោយ", "postcode": "លេខកូដប្រៃសណីយ៍", "state": "រដ្ឋ", "suburb": "ជាយក្រុង", @@ -134,8 +134,8 @@ "printMediaStart": "បោះពុម្ពការចាប់ផ្តើមមេឌៀ", "errorMessage": "ការបោះពុម្ពមិនបានចាប់ផ្តើមក្នុងរយៈពេល ១០ វិនាទីទេ។ ប្រហែលជាកម្មវិធីរុករកគេហទំព័រនេះមិនគាំទ្រការបោះពុម្ពទេ?", "errorTitle": "មានបញ្ហាក្នុងការបោះពុម្ព", - "onbeforeprint": "onbeforeprint", - "onafterprint": "onafterprint" + "onbeforeprint": "មុនបោះពុម្ព", + "onafterprint": "បោះពុម្ពរួច" }, "dataType": { "json": "JSON", @@ -297,7 +297,7 @@ "btnHover": "បិទ/បើកកម្ពស់", "experimentalFeatureMessage": "មុខងារ Augmented Reality (AR) បច្ចុប្បន្នស្ថិតនៅក្នុង BETA នៅឡើយ។ មុខងារនេះត្រូវបានបង្កើតឡើងសម្រាប់ប្រើនៅលើឧបករណ៍ចល័តទំនើបចុងក្រោយបំផុត។

    សម្គាល់៖ មុខងារនេះអាចនឹងត្រូវការអ៊ីនធឺណេតខ្លាំង ដូច្នេះសូមមេត្តាគិតគូរពីតម្លៃសេវាអ៊ីនធឺណេតដែលអ្នកនឹងត្រូវបង់ទៅកាន់អ្នកផ្តល់បណ្តាញរបស់អ្នក។

    ភាពត្រឹមត្រូវនៃមុខងារនេះគឺអាស្រ័យលើភាពត្រឹមត្រូវនៃត្រីវិស័យខាងក្នុងនៃឧបករណ៍ចល័តរបស់អ្នក។", "manualAlignmentMessage": "តម្រងឧបករណ៍ចល័តរបស់អ្នក ដើម្បីឱ្យវាត្រូវគ្នានឹងផែនទីបច្ចុប្បន្ន បន្ទាប់មកចុចលើត្រីវិស័យដែលលោតភ្លឹបភ្លែតៗ។ ប្រសិនបើមិនមានសញ្ញាសម្គាល់ដើម្បីតម្រង់ជាមួយនឹងនៅលើផែនទីទេ អ្នកអាចផ្លាស់ទីផែនទីដោយប្រើសកម្មភាពទាញនិងអូសនៅលើអេក្រង់រហូតដល់កន្លែងសម្គាល់មួយបានអាចបង្ហាញឡើង មុនពេលអ្នកតម្រង់ឧបករណ៍ជាមួយនឹងផែនទី។
    {{img}}

    គន្លឺះ៖ ព្រះអាទិត្យឬព្រះចន្ទជាទីសម្គាល់ដ៏ល្អ ដើម្បីតម្រង់ជាមួយឧបករណ៍របស់អ្នក ប្រសិនបើអ្នកស្ថិតនៅទីតាំងដែលអ្នកមិនស្គាល់ (ប្រយ័ត្នកុំមើលព្រះអាទិត្យ វាអាចប៉ះពាល់ដល់ភ្នែករបស់អ្នក) ។", - "resetAlignmentMessage": "កំណត់ការតម្រឹមត្រីវិស័យឡើងវិញ។ ប្រសិនបើការតម្រឹមមិនត្រូវនឹងពិភពពិតទេ សូមព្យាយាមគ្រវីឧបករណ៍របស់អ្នកជាចលនាលេខ ៨ ដើម្បីគណនាវាឡើងវិញ។ នេះអាចធ្វើបានគ្រប់ពេលវេលា។

    ជៀសវាងពីវាលម៉ាញេទិកនិងវត្ថុលោហៈព្រោះវត្ថុទាំងនេះអាចធ្វើឱ្យត្រីវិស័យរបស់អ្នកដំណើរការមិនប្រក្រដី។" + "resetAlignmentMessage": "កំណត់ការតម្រឹមត្រីវិស័យឡើងវិញ។ ប្រសិនបើការតម្រឹមមិនត្រូវនឹងពិភពពិតទេ សូមព្យាយាមគ្រវីឧបករណ៍របស់អ្នកជាចលនាលេខ ៨ ដើម្បីគណនាវាឡើងវិញ។ នេះអាចធ្វើបានគ្រប់ពេលវេលា។.

    ជៀសវាងពីវាលម៉ាញេទិកនិងវត្ថុលោហៈព្រោះវត្ថុទាំងនេះអាចធ្វើឱ្យត្រីវិស័យរបស់អ្នកដំណើរការមិនប្រក្រដី។" }, "viewModels": { "inDataCatalogue": "នៅក្នុងកាតាឡុកទិន្នន័យ", @@ -447,7 +447,7 @@ "download": "ទាញយកតារាងនេះ", "catalogItem": { "featureInfoShown": "{{maximum}} ដំបូងត្រូវបានបង្ហាញដូចខាងក្រោម។", - "featuresFound": "{{featCount}} នៃធាតុ {catalogItemName} ត្រូវបានរកឃើញ។", + "featuresFound": "{{featCount}} នៃធាតុ{{catalogItemName}} ត្រូវបានរកឃើញ។", "moreThanMax": "ច្រើនជាង {{maximum}} នៃធាតុ{{catalogItemName}}ត្រូវបានរកឃើញ។" } }, @@ -487,7 +487,7 @@ "settingPanel": { "performanceLabel": "កម្រិតដំណើរការ", "qualityLabel": "គុណភាព", - "mapQuality": "គុណភាពផែនទីរ៉ាស្ទ័រ៖", + "mapQuality": "គុណភាពផែនទី៖", "nativeResolutionHeader": "ប្រើរេសូលូសិនពីឧបករណ៍ដើម", "imageOptimisation": "ការបង្កើនគុណភាពរូបភាព", "baseMap": "ផែនទីគោល", @@ -563,12 +563,12 @@ "convertErrorTitle": "មិនអាចដំឡើងតំណចែករំលែកទៅ V8 បានទេ" }, "legend": { - "elev": "Elev", + "elev": "រយៈកំពស់", "n": "N", "e": "E", "zone": "Zone", - "lon": "Lon", - "lat": "Lat" + "lon": "រយៈបណ្តោយ", + "lat": "រយៈទទឹង" }, "models": { "ckan": { @@ -630,22 +630,22 @@ "groupNotAvailableTitle": "ចំណាត់ក្រុមមិនមានទេ", "invalidServiceTitle": "សេវាកម្មផែនទី ArcGIS Map Service មិនត្រឹមត្រូវ", "name": "ក្រុមម៉ាស៊ីនមេសេវាកម្មផែនទី ArcGIS Map Server", - "groupNotAvailableMessage": "កំហុសមួយបានកើតឡើងខណៈពេលហៅ សេវាកម្មផែនទី ArcGIS Map Service ។

    ប្រសិនបើអ្នកបានបញ្ចូលតំណភ្ជាប់ដោយដៃសូមបញ្ជាក់ថាតំណភ្ជាប់ត្រឹមត្រូវ។

    កំហុសនេះក៏អាចបង្ហាញថាម៉ាស៊ីនមេមិនគាំទ្រ {{cors}}ទេ ។ ប្រសិនបើនេះជាម៉ាស៊ីនមេរបស់អ្នក សូមផ្ទៀងផ្ទាត់ថា CORS ត្រូវបានបើក ហើយបើកវាប្រសិនបើវាមិនបានបើកទេ។ ប្រសិនបើអ្នកមិនគ្រប់គ្រងម៉ាស៊ីនមេទេ សូមទាក់ទងអ្នកគ្រប់គ្រងម៉ាស៊ីនមេហើយស្នើសុំឱ្យពួកគេបើក CORS ។ ឬទាក់ទងក្រុម {{appName}} ដោយផ្ញើអ៊ីមែលទៅកាន់{email} ហើយស្នើសុំឱ្យយើងបន្ថែមម៉ាស៊ីនមេនេះទៅក្នុងបញ្ជីនៃម៉ាស៊ីនមេដែលមិនគាំទ្រដល់ CORS ដែលអាចត្រូវបានប្រូកស៊ីដោយ {{appName}} ។

    ប្រសិនបើអ្នកមិនបានបញ្ចូលតំណភ្ជាប់នេះដោយដៃទេ កំហុសនេះអាចបង្ហាញថាក្រុមដែលអ្នកបានបើកដំណើរការមិនមានជាបណ្តោះអាសន្ន ឬមានបញ្ហាជាមួយនឹងការភ្ជាប់អ៊ីធឺណិតរបស់អ្នក។ ព្យាយាមបើកក្រុមម្តងទៀត ហើយប្រសិនបើបញ្ហានៅតែកើតមានសូមរាយការណ៍វាដោយផ្ញើអ៊ីមែលទៅកាន់{{email}} ។

    ", - "invalidServiceMessage": "កំហុសឆ្គងមួយបានកើតឡើងខណៈពេលហៅសេវាកម្មផែនទី ArcGIS Map Service ។ ការឆ្លើយតបរបស់ម៉ាស៊ីនមេហាក់ដូចជាឯកសារ Map Service ដែលមិនមានសុពលភាព។

    ប្រសិនបើអ្នកបានបញ្ចូលតំណភ្ជាប់ដោយដៃ សូមបញ្ជាក់ថាតំណភ្ជាប់ត្រឹមត្រូវ។

    ប្រសិនបើអ្នកមិនបានបញ្ចូលបណ្តាញភ្ជាប់នេះដោយដៃទេ កំហុសនេះអាចបង្ហាញថាក្រុមដែលអ្នកបានបើកមិនមានជាបណ្តោះអាសន្ន ឬមានបញ្ហាជាមួយនឹងការភ្ជាប់អ៊ីនធឺណិតរបស់អ្នក។ ព្យាយាមបើកក្រុមម្តងទៀតហើយប្រសិនបើបញ្ហានៅតែកើតមានសូមរាយការណ៍វាដោយផ្ញើអ៊ីមែលទៅកាន់{{email}}។

    " + "groupNotAvailableMessage": "កំហុសមួយបានកើតឡើងខណៈពេលហៅ សេវាកម្ម ArcGIS Map Service ។", + "invalidServiceMessage": "កំហុសឆ្គងមួយបានកើតឡើងខណៈពេលហៅសេវាកម្មផែនទី ArcGIS Map Service ។ ការឆ្លើយតបរបស់ម៉ាស៊ីនមេហាក់ដូចជាឯកសារ Map Service ដែលមិនមានសុពលភាព។" }, "arcGisFeatureServer": { "groupNotAvailableTitle": "ចំណាត់ក្រុមមិនមានទេ", "invalidServiceTitle": "ម៉ាស៊ីនមេសេវាកម្មផែនទី ArcGIS Feature Service មិនត្រឹមត្រូវ", "nameGroup": "ក្រុមម៉ាស៊ីនមេសេវាកម្មផែនទី ArcGIS Feature Server", "name": "ម៉ាស៊ីនមេសេវាកម្មផែនទី ArcGIS", - "invalidServiceMessage": "កំហុសមួយបានកើតឡើងខណៈពេលហៅសេវាកម្មផែនទី ArcGIS Feature Service ។ ការឆ្លើយតបរបស់ម៉ាស៊ីនមេហាក់ដូចជាឯកសារ ArcGIS REST មិនមានសុពលភាព។

    ប្រសិនបើអ្នកបានបញ្ចូលតំណភ្ជាប់ដោយដៃ សូមបញ្ជាក់ថាតំណភ្ជាប់នោះត្រឹមត្រូវ។

    ប្រសិនបើអ្នកមិនបានបញ្ចូលតំណភ្ជាប់នេះដោយដៃទេ កំហុសនេះអាចបង្ហាញថាក្រុមដែលអ្នកបានបើកមិនមានជាបណ្តោះអាសន្ន ឬមានបញ្ហាជាមួយនឹងការភ្ជាប់អ៊ីនធឺណិតរបស់អ្នក។ ព្យាយាមបើកក្រុមម្តងទៀតហើយប្រសិនបើបញ្ហានៅតែកើតមាន សូមរាយការណ៍វាដោយផ្ញើអ៊ីមែលទៅកាន់{{email}}។

    " + "invalidServiceMessage": "កំហុសមួយបានកើតឡើងខណៈពេលហៅសេវាកម្មផែនទី ArcGIS Feature Service ។ ការឆ្លើយតបរបស់ម៉ាស៊ីនមេហាក់ដូចជាឯកសារ ArcGIS REST មិនមានសុពលភាព។" }, "arcGisService": { - "invalidServerMessage": "កំហុសមួយបានកើតឡើងខណៈពេលហៅសេវាកម្ម ArcGIS REST ។ ការឆ្លើយតបរបស់ម៉ាស៊ីនមេហាក់ដូចជាឯកសារ ArcGIS REST ដែលមិនមានសុពលភាព។

    ប្រសិនបើអ្នកបានបញ្ចូលតំណភ្ជាប់ដោយដៃ សូមបញ្ជាក់ថាតំណភ្ជាប់ត្រឹមត្រូវ។

    ប្រសិនបើអ្នកមិនបានបញ្ចូលបណ្តាញភ្ជាប់នេះដោយដៃទេ កំហុសនេះអាចបង្ហាញថាក្រុមដែលអ្នកបានបើកមិនមានជាបណ្តោះអាសន្ន ឬមានបញ្ហាជាមួយនឹងការភ្ជាប់អ៊ីនធឺណិតរបស់អ្នក។ ព្យាយាមបើកក្រុមម្តងទៀតហើយប្រសិនបើបញ្ហានៅតែកើតមានសូមរាយការណ៍វាដោយផ្ញើអ៊ីមែលទៅកាន់{{email}}។

    ", + "invalidServerMessage": "កំហុសមួយបានកើតឡើងខណៈពេលហៅសេវាកម្ម ArcGIS REST។ ការឆ្លើយតបរបស់ម៉ាស៊ីនមេហាក់ដូចជាមិនមែនជាឯកសារត្រឹមត្រូវ ArcGIS REST ។", "name": "ក្រុមសេវាកម្មផែនទី ArcGIS", "groupNotAvailableTitle": "ចំណាត់ក្រុមមិនមានទេ", "invalidServerTitle": "ម៉ាស៊ីនមេ ArcGIS មិនត្រឹមត្រូវ", - "groupNotAvailableMessage": "កំហុសឆ្គងមួយបានកើតឡើងខណៈពេលហៅសេវាកម្ម ArcGIS REST ។

    ប្រសិនបើអ្នកបានបញ្ចូលតំណភ្ជាប់ដោយដៃសូមបញ្ជាក់ថាតំណភ្ជាប់ពិតជាត្រឹមត្រូវ។

    កំហុសឆ្គងនេះក៏អាចបង្ហាញថាម៉ាស៊ីនមេមិនគាំទ្រ {{cors}} ។ ប្រសិនបើនេះជាម៉ាស៊ីនមេរបស់អ្នកសូមផ្ទៀងផ្ទាត់ថា CORS ត្រូវបានបើកនិងបើកវាប្រសិនបើវាមិនបានបើក។ ប្រសិនបើអ្នកមិនគ្រប់គ្រងម៉ាស៊ីនមេសូមទាក់ទងអ្នកគ្រប់គ្រងម៉ាស៊ីនមេហើយស្នើសុំឱ្យពួកគេបើក CORS ។ ឬទាក់ទង {{appName}} ក្រុមការងារតាមរយៈអ៊ីម៉ែល {{email}} ហើយស្នើសុំឱ្យយើងបន្ថែមម៉ាស៊ីនមេនេះទៅក្នុងបញ្ជីនៃម៉ាស៊ីនមេដែលមិនគាំទ្រដល់ CORS ដែលអាចត្រូវបាន បានធ្វើប្រូកស៊ីដោយ {{appName}} ។

    ប្រសិនបើអ្នកមិនបានបញ្ចូលតំណភ្ជាប់នេះដោយដៃទេកំហុសនេះអាចបង្ហាញថាក្រុមដែលអ្នកបានបើកដំណើរការមិនមានជាបណ្តោះអាសន្ន ឬមានបញ្ហាជាមួយនឹងការភ្ជាប់អ៊ីធឺណិតរបស់អ្នក។ ព្យាយាមបើកក្រុមម្តងទៀតហើយប្រសិនបើបញ្ហានៅតែកើតមានសូមរាយការណ៍ដោយផ្ញើអ៊ីមែលទៅ {{email}} ។

    " + "groupNotAvailableMessage": "កំហុសឆ្គងមួយបានកើតឡើងខណៈពេលហៅសេវាកម្ម ArcGIS REST ។" }, "abs": { "groupNotAvailableMessage": "កំហុសឆ្គងមួយបានកើតឡើងខណៈពេលកំពុងហៅGetCodeListValueនៅលើម៉ាស៊ីនមេ ABS ITT ។

    កំហុសនេះអាចបង្ហាញថាក្រុមដែលអ្នកបានបើកគឺមិនមានជាបណ្តោះអាសន្នទេ ឬមានបញ្ហាក្នុងការភ្ជាប់អ៊ីនធឺណិតរបស់អ្នក។ ព្យាយាមបើកក្រុមម្តងទៀត ហើយប្រសិនបើបញ្ហានៅតែកើតមានសូមរាយការណ៍វាដោយផ្ញើអ៊ីមែលទៅកាន់{{email}}។

    ", @@ -1043,7 +1043,7 @@ } }, "mobile": { - "toggleNavigation": "toggle navigation" + "toggleNavigation": "បិទបើកការរុករក" }, "deltaTool": { "titlePrefix": "ការបង្ហាញពីការប្រែប្រួល", @@ -1137,7 +1137,7 @@ "initialMessages": { "title": "ជ្រើសរើសទីតាំងច្បាស់លាស់", "beforePick": "យើងត្រូវការវាដើម្បីដំណើរការរកឃើញការប្រែប្រួល។", - "afterPick": "ចុចលើចំណុចផ្សេងទៀតដើម្បីផ្លាស់ប្តូរជម្រើស" + "afterPick": "ចុចលើចំណុចផ្សេងទៀតដើម្បីផ្លាស់ប្តូរទីតាំង" }, "nextMessages": { "title": "អ្នកបានជ្រើរើសទីតាំង {{latitude}} {{longitude}}", From ec738b2fef25109daf767ade97fb10f0172db861 Mon Sep 17 00:00:00 2001 From: Staf Smith Date: Fri, 14 Jul 2023 10:53:54 +0800 Subject: [PATCH 226/654] Add react imports to ix errors --- lib/ReactViews/Map/BottomBar/BottomBar.tsx | 1 + lib/ReactViews/Map/BottomBar/LocationBar.tsx | 1 + 2 files changed, 2 insertions(+) diff --git a/lib/ReactViews/Map/BottomBar/BottomBar.tsx b/lib/ReactViews/Map/BottomBar/BottomBar.tsx index 1ce3331cefe..cd903ba6e3c 100644 --- a/lib/ReactViews/Map/BottomBar/BottomBar.tsx +++ b/lib/ReactViews/Map/BottomBar/BottomBar.tsx @@ -4,6 +4,7 @@ import { useViewState } from "../../Context"; import { MapCredits } from "./Credits"; import { DistanceLegend } from "./DistanceLegend"; import { LocationBar } from "./LocationBar"; +import React from "react"; export const BottomBar: VFC = () => { const viewState = useViewState(); diff --git a/lib/ReactViews/Map/BottomBar/LocationBar.tsx b/lib/ReactViews/Map/BottomBar/LocationBar.tsx index 0eb8b42a2c7..a8b99e2133c 100644 --- a/lib/ReactViews/Map/BottomBar/LocationBar.tsx +++ b/lib/ReactViews/Map/BottomBar/LocationBar.tsx @@ -1,3 +1,4 @@ +import React from "react"; import { observer } from "mobx-react"; import { FC, RefObject, useEffect, useRef } from "react"; import { useTranslation } from "react-i18next"; From 7d9f5b4309854f25151dfff75d4efe1efb05bee8 Mon Sep 17 00:00:00 2001 From: Staf Smith Date: Mon, 17 Jul 2023 15:43:15 +0800 Subject: [PATCH 227/654] Fix import in test --- test/ReactViews/Map/Navigation/Compass/CompassSpec.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/ReactViews/Map/Navigation/Compass/CompassSpec.tsx b/test/ReactViews/Map/Navigation/Compass/CompassSpec.tsx index ec3d1e2afc7..d88e6da7f4f 100644 --- a/test/ReactViews/Map/Navigation/Compass/CompassSpec.tsx +++ b/test/ReactViews/Map/Navigation/Compass/CompassSpec.tsx @@ -6,7 +6,7 @@ import Terria from "../../../../../lib/Models/Terria"; import ViewState from "../../../../../lib/ReactViewModels/ViewState"; import { ThemeProvider } from "styled-components"; import { terriaTheme } from "../../../../../lib/ReactViews/StandardUserInterface"; -import { Compass } from "../../../../../lib/ReactViews/Map/MapNavigation/Items/Compass/Compass"; +import Compass from "../../../../../lib/ReactViews/Map/MapNavigation/Items/Compass/Compass"; import { StyledIcon } from "../../../../../lib/Styled/Icon"; describe("Compass", function () { From 053c27fcff5fbcb6e39a3c197b517fbcced76ef2 Mon Sep 17 00:00:00 2001 From: Staf Smith Date: Mon, 17 Jul 2023 16:01:16 +0800 Subject: [PATCH 228/654] Rem Splitter.jsx after checking Splitter.tsx --- lib/ReactViews/Map/Splitter.jsx | 231 -------------------------------- 1 file changed, 231 deletions(-) delete mode 100644 lib/ReactViews/Map/Splitter.jsx diff --git a/lib/ReactViews/Map/Splitter.jsx b/lib/ReactViews/Map/Splitter.jsx deleted file mode 100644 index 9031e37bd44..00000000000 --- a/lib/ReactViews/Map/Splitter.jsx +++ /dev/null @@ -1,231 +0,0 @@ -import React from "react"; -import PropTypes from "prop-types"; -import { withTranslation } from "react-i18next"; -import { GLYPHS, StyledIcon } from "../../Styled/Icon"; -import Styles from "./splitter.scss"; -import { observer } from "mobx-react"; -import { runInAction } from "mobx"; - -// Feature detect support for passive: true in event subscriptions. -// See https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Safely_detecting_option_support -let passiveSupported = false; -try { - const options = Object.defineProperty({}, "passive", { - get: function () { - passiveSupported = true; - return true; - } - }); - - window.addEventListener("test", null, options); - window.removeEventListener("test", null, options); -} catch (err) {} - -const notPassive = passiveSupported ? { passive: false } : false; - -@observer -class Splitter extends React.Component { - static propTypes = { - terria: PropTypes.object.isRequired, - viewState: PropTypes.object.isRequired, - thumbSize: PropTypes.number, - padding: PropTypes.number, - t: PropTypes.func.isRequired - }; - - static defaultProps = { - thumbSize: 42, - padding: 0 - }; - - constructor(props) { - super(props); - this.forceRefresh = this.forceRefresh.bind(this); - this.drag = this.drag.bind(this); - this.startDrag = this.startDrag.bind(this); - this.stopDrag = this.stopDrag.bind(this); - } - - componentDidMount() { - const that = this; - window.addEventListener("resize", function () { - that.forceRefresh(); - }); - } - - componentWillUnmount() { - this.unsubscribe(); - } - - forceRefresh() { - const smallChange = - this.props.terria.splitPosition < 0.5 ? 0.0001 : -0.0001; // Make sure never <0 or >1. - runInAction(() => { - this.props.terria.splitPosition += smallChange; - }); - } - - startDrag(event) { - const viewer = this.props.terria.currentViewer; - viewer.pauseMapInteraction(); - - // While dragging is in progress, subscribe to document-level movement and up events. - document.addEventListener("mousemove", this.drag, notPassive); - document.addEventListener("touchmove", this.drag, notPassive); - document.addEventListener("mouseup", this.stopDrag, notPassive); - document.addEventListener("touchend", this.stopDrag, notPassive); - - event.preventDefault(); - event.stopPropagation(); - } - - drag(event) { - let clientX = event.clientX; - let clientY = event.clientY; - if (event.targetTouches && event.targetTouches.length > 0) { - clientX = event.targetTouches.item(0).clientX; - clientY = event.targetTouches.item(0).clientY; - } - - const viewer = this.props.terria.mainViewer.currentViewer; - const container = viewer.getContainer(); - const mapRect = container.getBoundingClientRect(); - - const that = this; - function computeSplitFraction(startBound, endBound, position) { - const difference = endBound - startBound; - const fraction = (position - startBound) / difference; - - const min = startBound + that.props.padding + that.props.thumbSize * 0.5; - const max = endBound - that.props.padding - that.props.thumbSize * 0.5; - const minFraction = (min - startBound) / difference; - const maxFraction = (max - startBound) / difference; - - return Math.min(maxFraction, Math.max(minFraction, fraction)); - } - let splitFractionX = computeSplitFraction( - mapRect.left, - mapRect.right, - clientX - ); - let splitFractionY = computeSplitFraction( - mapRect.top, - mapRect.bottom, - clientY - ); - - // We compute the maximum and minium windows bounds as a percentage so that we can always apply the bounds - // restriction as a percentage for consistency (we currently use absolute values for X and percentage values for - // Y, but always apply the constraint as a percentage). - // We use absolute pixel values for horizontal restriction because of the fixed UI elements which occupy an - // absolute amount of screen relestate and 100 px seems like a fine amount for the current UI. - const minX = computeSplitFraction( - mapRect.left, - mapRect.right, - mapRect.left + 100 - ); - const maxX = computeSplitFraction( - mapRect.left, - mapRect.right, - mapRect.right - 100 - ); - // Resctrict to within +/-30% of the center vertically (so we don't run into the top and bottom UI elements). - const minY = 0.2; - const maxY = 0.8; - - splitFractionX = Math.min(maxX, Math.max(minX, splitFractionX)); - splitFractionY = Math.min(maxY, Math.max(minY, splitFractionY)); - - runInAction(() => { - this.props.terria.splitPosition = splitFractionX; - this.props.terria.splitPositionVertical = splitFractionY; - }); - - event.preventDefault(); - event.stopPropagation(); - } - - stopDrag(event) { - this.unsubscribe(); - - const viewer = this.props.terria.currentViewer; - // Ensure splitter stays in sync with map - this.props.viewState.triggerResizeEvent(); - - viewer.resumeMapInteraction(); - - event.preventDefault(); - event.stopPropagation(); - } - - unsubscribe() { - document.removeEventListener("mousemove", this.drag, notPassive); - document.removeEventListener("touchmove", this.drag, notPassive); - document.removeEventListener("mouseup", this.stopDrag, notPassive); - document.removeEventListener("touchend", this.stopDrag, notPassive); - window.removeEventListener("resize", this.forceRefresh); - } - - getPosition() { - const canvasWidth = - this.props.terria.currentViewer.getContainer().clientWidth; - const canvasHeight = - this.props.terria.currentViewer.getContainer().clientHeight; - return { - x: this.props.terria.splitPosition * canvasWidth, - y: this.props.terria.splitPositionVertical * canvasHeight - }; - } - - render() { - if ( - !this.props.terria.showSplitter || - !this.props.terria.currentViewer.canShowSplitter || - !this.props.terria.currentViewer.getContainer() - ) { - return null; - } - - const thumbWidth = this.props.thumbSize; - const position = this.getPosition(); - - const dividerStyle = { - left: position.x + "px", - backgroundColor: this.props.terria.baseMapContrastColor - }; - - const thumbStyle = { - left: position.x + "px", - top: position.y + "px", - width: thumbWidth + "px", - height: thumbWidth + "px", - marginLeft: "-" + thumbWidth * 0.5 + "px", - marginTop: "-" + thumbWidth * 0.5 + "px", - lineHeight: thumbWidth - 2 + "px", - borderRadius: thumbWidth * 0.5 + "px", - fontSize: thumbWidth - 12 + "px" - }; - - const { t } = this.props; - - return ( -
    -
    -
    -
    - -
    - ); - } -} - -module.exports = withTranslation()(Splitter); From dd4f9901c7b1da473d6f5eafc94dc38d27a64570 Mon Sep 17 00:00:00 2001 From: Staf Smith Date: Tue, 18 Jul 2023 13:22:32 +0800 Subject: [PATCH 229/654] Small changes to ProgressBar.tsx --- lib/ReactViews/Map/ProgressBar.tsx | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/lib/ReactViews/Map/ProgressBar.tsx b/lib/ReactViews/Map/ProgressBar.tsx index 694079a4748..9fcc5359d60 100644 --- a/lib/ReactViews/Map/ProgressBar.tsx +++ b/lib/ReactViews/Map/ProgressBar.tsx @@ -1,5 +1,5 @@ import React, { VFC, useCallback, useEffect, useMemo, useState } from "react"; -import styled, { keyframes, useTheme } from "styled-components"; +import styled, { css, keyframes, useTheme } from "styled-components"; import EventHelper from "terriajs-cesium/Source/Core/EventHelper"; import { useViewState } from "../Context"; @@ -16,7 +16,7 @@ export const ProgressBar: VFC = () => { setLoadPercentage(sanitisedPercentage); }, []); - const setMode = (mode: any) => { + const setMode = (mode: boolean) => { setIndeterminateLoading(mode); }; @@ -37,7 +37,7 @@ export const ProgressBar: VFC = () => { terria.baseMapContrastColor === "#ffffff" ? "#ffffff" : theme.colorPrimary, - [] + [terria.baseMapContrastColor] ); const allComplete = loadPercentage === 100 && !indeterminateLoading; @@ -70,11 +70,11 @@ const StyledProgressBar = styled.div` ${(props) => props.indeterminate && - ` - width: 100%; - animation: ${indeterminateAnimation} 1.2s infinite linear; - transform-origin: 0% 50%; - `} + css` + width: 100%; + animation: ${indeterminateAnimation} 1.2s infinite linear; + transform-origin: 0% 50%; + `} `; const indeterminateAnimation = keyframes` From f62bfafb3919ed8ac0499b32c9e0e30e9f3b16dc Mon Sep 17 00:00:00 2001 From: Staf Smith Date: Tue, 18 Jul 2023 13:23:21 +0800 Subject: [PATCH 230/654] Delete ProgressBar.jsx after checking TS version --- lib/ReactViews/Map/ProgressBar.jsx | 99 ------------------------------ 1 file changed, 99 deletions(-) delete mode 100644 lib/ReactViews/Map/ProgressBar.jsx diff --git a/lib/ReactViews/Map/ProgressBar.jsx b/lib/ReactViews/Map/ProgressBar.jsx deleted file mode 100644 index 65cb08c0eaf..00000000000 --- a/lib/ReactViews/Map/ProgressBar.jsx +++ /dev/null @@ -1,99 +0,0 @@ -import classNames from "classnames"; -import { observer } from "mobx-react"; -import PropTypes from "prop-types"; -import React from "react"; -import { withTheme } from "styled-components"; -import EventHelper from "terriajs-cesium/Source/Core/EventHelper"; -import { withViewState } from "../StandardUserInterface/ViewStateContext"; -import Styles from "./progress-bar.scss"; - -// The map navigation region -@observer -class ProgressBar extends React.Component { - static propTypes = { - viewState: PropTypes.object.isRequired, - theme: PropTypes.object.isRequired - }; - - constructor(props) { - super(props); - this.state = { - visible: "hidden" - }; - } - - /* eslint-disable-next-line camelcase */ - UNSAFE_componentWillMount() { - this.eventHelper = new EventHelper(); - - this.eventHelper.add( - this.props.viewState.terria.tileLoadProgressEvent, - this.setProgress.bind(this) - ); - - // Also listen for indeterminate data source loading events - this.eventHelper.add( - this.props.viewState.terria.indeterminateTileLoadProgressEvent, - this.setMode.bind(this) - ); - - // TODO - is this actually needed now? load events always get called when - // changing viewer. if still reuqired, - // clear progress when new viewer observed, rather than mounting to a 'current viewer' - - // // Clear progress when the viewer changes so we're not left with an invalid progress bar hanging on the screen. - // this.eventHelper.add( - // this.props.viewState.terria.currentViewer.beforeViewerChanged, - // this.setProgress.bind(this, 0, 0) - // ); - } - - setProgress(remaining, max) { - const rawPercentage = (1 - remaining / max) * 100; - const sanitisedPercentage = Math.floor(remaining > 0 ? rawPercentage : 100); - - this.setState({ - percentage: sanitisedPercentage - }); - } - - setMode(loading) { - this.setState({ loading: loading }); - } - - componentWillUnmount() { - this.eventHelper.removeAll(); - } - - /** - * Progress bar is influced by two loading states: - * The base globe where the progress bar shows actual progress, - * Sources where load progress is indeterminate including 3DTilesets where the progress bar is animated. - */ - render() { - const determinateProgress = this.state.percentage + "%"; - const indeterminateStillLoading = this.state.loading; - const allComplete = this.state.percentage === 100 && !this.state.loading; - - // use the baseMapContrastColor to ensure progress bar is visible on light backgrounds. If contrast color is white, use it. If its black, use the primary color of the current theme. - const backgroundColor = - this.props.viewState.terria.baseMapContrastColor === "#ffffff" - ? "#ffffff" - : this.props.theme.colorPrimary; - - return ( -
    - ); - } -} - -export default withViewState(withTheme(ProgressBar)); From 67237d991bfef5b0fb1598777e61a0ea8eacf6d7 Mon Sep 17 00:00:00 2001 From: Staf Smith Date: Tue, 18 Jul 2023 15:00:46 +0800 Subject: [PATCH 231/654] Delete MapColumn.jsx after checking TS version --- .../StandardUserInterface/MapColumn.jsx | 215 ------------------ 1 file changed, 215 deletions(-) delete mode 100644 lib/ReactViews/StandardUserInterface/MapColumn.jsx diff --git a/lib/ReactViews/StandardUserInterface/MapColumn.jsx b/lib/ReactViews/StandardUserInterface/MapColumn.jsx deleted file mode 100644 index 1a7411ba12e..00000000000 --- a/lib/ReactViews/StandardUserInterface/MapColumn.jsx +++ /dev/null @@ -1,215 +0,0 @@ -import classNames from "classnames"; -import { observer } from "mobx-react"; -import PropTypes from "prop-types"; -import React from "react"; -import { withTranslation } from "react-i18next"; -import FeatureDetection from "terriajs-cesium/Source/Core/FeatureDetection"; -import ActionBarPortal from "../ActionBar/ActionBarPortal"; -import BottomDock from "../BottomDock/BottomDock"; -import { MapCredits } from "../Credits"; -import Loader from "../Loader"; -import BottomLeftBar from "../Map/BottomLeftBar/BottomLeftBar"; -import DistanceLegend from "../Map/Legend/DistanceLegend"; -import LocationBar from "../Map/Legend/LocationBar"; -import MenuBar from "../Map/MenuBar"; -import MapNavigation from "../Map/Navigation/MapNavigation"; -import TerriaViewerWrapper from "../Map/TerriaViewerWrapper"; -import SlideUpFadeIn from "../Transitions/SlideUpFadeIn/SlideUpFadeIn"; -import Styles from "./map-column.scss"; -import Toast from "./Toast"; -import { withViewState } from "./ViewStateContext"; - -const chromeVersion = FeatureDetection.chromeVersion(); - -/** - * Right-hand column that contains the map, controls that sit over the map and sometimes the bottom dock containing - * the timeline and charts. - */ -@observer -class MapColumn extends React.Component { - static propTypes = { - viewState: PropTypes.object.isRequired, - customFeedbacks: PropTypes.array.isRequired, - allBaseMaps: PropTypes.array.isRequired, - animationDuration: PropTypes.number.isRequired, - customElements: PropTypes.object.isRequired, - t: PropTypes.func.isRequired - }; - - constructor(props) { - super(props); - this.state = {}; - } - - render() { - const { customElements } = this.props; - const { t } = this.props; - // TODO: remove? see: https://bugs.chromium.org/p/chromium/issues/detail?id=1001663 - const isAboveChrome75 = - chromeVersion && chromeVersion[0] && Number(chromeVersion[0]) > 75; - const mapCellClass = classNames(Styles.mapCell, { - [Styles.mapCellChrome]: isAboveChrome75 - }); - return ( -
    -
    -
    - -
    - - -
    -
    -
    - -
    - - - - - - - - - -
    - - -
    -
    - {/* TODO: re-implement/support custom feedbacks */} - {/* -
    - -
    -
    */} - - - -
    {feedbackItem}
    -
    -
    -
    - - - -
    - -
    -
    - -
    -
    -
    -
    - ); - } -} - -export default withTranslation()(withViewState(MapColumn)); From ce30a1bc32085f893f9406da873c36afd94963ca Mon Sep 17 00:00:00 2001 From: Stephen Davies Date: Mon, 31 Jul 2023 06:56:03 +1000 Subject: [PATCH 232/654] Upgrade babel packages to fix Unexpected token errors Errors were sporadically occurring in PolygonParameter.ts, PointParameter.ts, GeoJsonParameter.ts, etc. and seem to be fixed by upgrading @babel/preset-typescript --- package.json | 12 +- yarn.lock | 1810 ++++++++++++++++++++++++++------------------------ 2 files changed, 937 insertions(+), 885 deletions(-) diff --git a/package.json b/package.json index 1a75ca3ee35..9fefd15fd29 100644 --- a/package.json +++ b/package.json @@ -15,14 +15,14 @@ "@types/node": "^18.15.11" }, "dependencies": { - "@babel/core": "^7.16.0", - "@babel/parser": "^7.12.14", + "@babel/core": "^7.22.9", + "@babel/parser": "^7.22.7", "@babel/plugin-proposal-class-properties": "^7.18.6", - "@babel/plugin-proposal-decorators": "^7.10.4", + "@babel/plugin-proposal-decorators": "^7.22.7", "@babel/plugin-proposal-object-rest-spread": "^7.20.7", - "@babel/preset-env": "^7.10.4", - "@babel/preset-react": "^7.0.0", - "@babel/preset-typescript": "^7.10.4", + "@babel/preset-env": "^7.22.9", + "@babel/preset-react": "^7.22.5", + "@babel/preset-typescript": "^7.22.5", "@mapbox/geojson-merge": "^1.1.1", "@mapbox/point-geometry": "^0.1.0", "@mapbox/togeojson": "^0.16.0", diff --git a/yarn.lock b/yarn.lock index 41186cfca72..6d398c7b81b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,14 @@ # yarn lockfile v1 +"@ampproject/remapping@^2.2.0": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" + integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + "@babel/code-frame@7.12.11": version "7.12.11" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" @@ -9,38 +17,38 @@ dependencies: "@babel/highlight" "^7.10.4" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.16.7", "@babel/code-frame@^7.8.3": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.7.tgz#44416b6bd7624b998f5b1af5d470856c40138789" - integrity sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg== - dependencies: - "@babel/highlight" "^7.16.7" - -"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.16.4": - version "7.16.4" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.16.4.tgz#081d6bbc336ec5c2435c6346b2ae1fb98b5ac68e" - integrity sha512-1o/jo7D+kC9ZjHX5v+EHrdjl3PhxMrLSOTGsOdHJ+KL8HCaEK6ehrVL2RS6oHDZp+L7xLirLrPmQtEng769J/Q== - -"@babel/core@^7.0.0", "@babel/core@^7.1.2", "@babel/core@^7.16.0": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.16.7.tgz#db990f931f6d40cb9b87a0dc7d2adc749f1dcbcf" - integrity sha512-aeLaqcqThRNZYmbMqtulsetOQZ/5gbR/dWruUCJcpas4Qoyy+QeagfDsPdMrqwsPRDNxJvBlRiZxxX7THO7qtA== - dependencies: - "@babel/code-frame" "^7.16.7" - "@babel/generator" "^7.16.7" - "@babel/helper-compilation-targets" "^7.16.7" - "@babel/helper-module-transforms" "^7.16.7" - "@babel/helpers" "^7.16.7" - "@babel/parser" "^7.16.7" - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.16.7" - "@babel/types" "^7.16.7" +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.16.7", "@babel/code-frame@^7.22.5", "@babel/code-frame@^7.8.3": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.5.tgz#234d98e1551960604f1246e6475891a570ad5658" + integrity sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ== + dependencies: + "@babel/highlight" "^7.22.5" + +"@babel/compat-data@^7.16.4", "@babel/compat-data@^7.20.5", "@babel/compat-data@^7.22.5", "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.22.9": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.9.tgz#71cdb00a1ce3a329ce4cbec3a44f9fef35669730" + integrity sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ== + +"@babel/core@^7.0.0", "@babel/core@^7.1.2", "@babel/core@^7.22.9": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.9.tgz#bd96492c68822198f33e8a256061da3cf391f58f" + integrity sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.22.5" + "@babel/generator" "^7.22.9" + "@babel/helper-compilation-targets" "^7.22.9" + "@babel/helper-module-transforms" "^7.22.9" + "@babel/helpers" "^7.22.6" + "@babel/parser" "^7.22.7" + "@babel/template" "^7.22.5" + "@babel/traverse" "^7.22.8" + "@babel/types" "^7.22.5" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" - json5 "^2.1.2" - semver "^6.3.0" - source-map "^0.5.0" + json5 "^2.2.2" + semver "^6.3.1" "@babel/eslint-parser@^7.12.16": version "7.16.5" @@ -51,97 +59,88 @@ eslint-visitor-keys "^2.1.0" semver "^6.3.0" -"@babel/generator@^7.16.7", "@babel/generator@^7.4.0": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.16.7.tgz#b42bf46a3079fa65e1544135f32e7958f048adbb" - integrity sha512-/ST3Sg8MLGY5HVYmrjOgL60ENux/HfO/CsUh7y4MalThufhE/Ff/6EibFDHi4jiDCaWfJKoqbE6oTh21c5hrRg== +"@babel/generator@^7.16.7", "@babel/generator@^7.22.7", "@babel/generator@^7.22.9", "@babel/generator@^7.4.0": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.9.tgz#572ecfa7a31002fa1de2a9d91621fd895da8493d" + integrity sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw== dependencies: - "@babel/types" "^7.16.7" + "@babel/types" "^7.22.5" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" - source-map "^0.5.0" -"@babel/helper-annotate-as-pure@^7.15.4", "@babel/helper-annotate-as-pure@^7.16.0", "@babel/helper-annotate-as-pure@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz#bb2339a7534a9c128e3102024c60760a3a7f3862" - integrity sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw== +"@babel/helper-annotate-as-pure@^7.15.4", "@babel/helper-annotate-as-pure@^7.16.0", "@babel/helper-annotate-as-pure@^7.16.7", "@babel/helper-annotate-as-pure@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz#e7f06737b197d580a01edf75d97e2c8be99d3882" + integrity sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg== dependencies: - "@babel/types" "^7.16.7" + "@babel/types" "^7.22.5" -"@babel/helper-builder-binary-assignment-operator-visitor@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz#38d138561ea207f0f69eb1626a418e4f7e6a580b" - integrity sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA== +"@babel/helper-builder-binary-assignment-operator-visitor@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.5.tgz#a3f4758efdd0190d8927fcffd261755937c71878" + integrity sha512-m1EP3lVOPptR+2DwD125gziZNcmoNSHGmJROKoy87loWUQyJaVXDgpmruWqDARZSmtYQ+Dl25okU8+qhVzuykw== dependencies: - "@babel/helper-explode-assignable-expression" "^7.16.7" - "@babel/types" "^7.16.7" + "@babel/types" "^7.22.5" -"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz#06e66c5f299601e6c7da350049315e83209d551b" - integrity sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA== +"@babel/helper-compilation-targets@^7.16.7", "@babel/helper-compilation-targets@^7.20.7", "@babel/helper-compilation-targets@^7.22.5", "@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.22.9": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.9.tgz#f9d0a7aaaa7cd32a3f31c9316a69f5a9bcacb892" + integrity sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw== dependencies: - "@babel/compat-data" "^7.16.4" - "@babel/helper-validator-option" "^7.16.7" - browserslist "^4.17.5" - semver "^6.3.0" - -"@babel/helper-create-class-features-plugin@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.7.tgz#9c5b34b53a01f2097daf10678d65135c1b9f84ba" - integrity sha512-kIFozAvVfK05DM4EVQYKK+zteWvY85BFdGBRQBytRyY3y+6PX0DkDOn/CZ3lEuczCfrCxEzwt0YtP/87YPTWSw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - "@babel/helper-environment-visitor" "^7.16.7" - "@babel/helper-function-name" "^7.16.7" - "@babel/helper-member-expression-to-functions" "^7.16.7" - "@babel/helper-optimise-call-expression" "^7.16.7" - "@babel/helper-replace-supers" "^7.16.7" - "@babel/helper-split-export-declaration" "^7.16.7" - -"@babel/helper-create-regexp-features-plugin@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.16.7.tgz#0cb82b9bac358eb73bfbd73985a776bfa6b14d48" - integrity sha512-fk5A6ymfp+O5+p2yCkXAu5Kyj6v0xh0RBeNcAkYUMDvvAAoxvSKXn+Jb37t/yWFiQVDFK1ELpUTD8/aLhCPu+g== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - regexpu-core "^4.7.1" - -"@babel/helper-define-polyfill-provider@^0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.0.tgz#c5b10cf4b324ff840140bb07e05b8564af2ae971" - integrity sha512-7hfT8lUljl/tM3h+izTX/pO3W3frz2ok6Pk+gzys8iJqDfZrZy2pXjRTZAvG2YmfHun1X4q8/UZRLatMfqc5Tg== + "@babel/compat-data" "^7.22.9" + "@babel/helper-validator-option" "^7.22.5" + browserslist "^4.21.9" + lru-cache "^5.1.1" + semver "^6.3.1" + +"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.22.5", "@babel/helper-create-class-features-plugin@^7.22.6", "@babel/helper-create-class-features-plugin@^7.22.9": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.9.tgz#c36ea240bb3348f942f08b0fbe28d6d979fab236" + integrity sha512-Pwyi89uO4YrGKxL/eNJ8lfEH55DnRloGPOseaA8NFNL6jAUnn+KccaISiFazCj5IolPPDjGSdzQzXVzODVRqUQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-member-expression-to-functions" "^7.22.5" + "@babel/helper-optimise-call-expression" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + semver "^6.3.1" + +"@babel/helper-create-regexp-features-plugin@^7.16.7", "@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.5": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.9.tgz#9d8e61a8d9366fe66198f57c40565663de0825f6" + integrity sha512-+svjVa/tFwsNSG4NEy1h85+HQ5imbT92Q5/bgtS7P0GTQlP8WuFdqsiABmQouhiFGyV66oGxZFpeYHza1rNsKw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + regexpu-core "^5.3.1" + semver "^6.3.1" + +"@babel/helper-define-polyfill-provider@^0.4.2": + version "0.4.2" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.2.tgz#82c825cadeeeee7aad237618ebbe8fa1710015d7" + integrity sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw== dependencies: - "@babel/helper-compilation-targets" "^7.13.0" - "@babel/helper-module-imports" "^7.12.13" - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/traverse" "^7.13.0" + "@babel/helper-compilation-targets" "^7.22.6" + "@babel/helper-plugin-utils" "^7.22.5" debug "^4.1.1" lodash.debounce "^4.0.8" resolve "^1.14.2" - semver "^6.1.2" -"@babel/helper-environment-visitor@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz#ff484094a839bde9d89cd63cba017d7aae80ecd7" - integrity sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag== - dependencies: - "@babel/types" "^7.16.7" +"@babel/helper-environment-visitor@^7.16.7", "@babel/helper-environment-visitor@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz#f06dd41b7c1f44e1f8da6c4055b41ab3a09a7e98" + integrity sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q== -"@babel/helper-explode-assignable-expression@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz#12a6d8522fdd834f194e868af6354e8650242b7a" - integrity sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ== +"@babel/helper-function-name@^7.16.7", "@babel/helper-function-name@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz#ede300828905bb15e582c037162f99d5183af1be" + integrity sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ== dependencies: - "@babel/types" "^7.16.7" - -"@babel/helper-function-name@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz#f1ec51551fb1c8956bc8dd95f38523b6cf375f8f" - integrity sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA== - dependencies: - "@babel/helper-get-function-arity" "^7.16.7" - "@babel/template" "^7.16.7" - "@babel/types" "^7.16.7" + "@babel/template" "^7.22.5" + "@babel/types" "^7.22.5" "@babel/helper-get-function-arity@^7.16.7": version "7.16.7" @@ -150,283 +149,188 @@ dependencies: "@babel/types" "^7.16.7" -"@babel/helper-hoist-variables@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz#86bcb19a77a509c7b77d0e22323ef588fa58c246" - integrity sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg== +"@babel/helper-hoist-variables@^7.16.7", "@babel/helper-hoist-variables@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" + integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== dependencies: - "@babel/types" "^7.16.7" + "@babel/types" "^7.22.5" -"@babel/helper-member-expression-to-functions@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.7.tgz#42b9ca4b2b200123c3b7e726b0ae5153924905b0" - integrity sha512-VtJ/65tYiU/6AbMTDwyoXGPKHgTsfRarivm+YbB5uAzKUyuPjgZSgAFeG87FCigc7KNHu2Pegh1XIT3lXjvz3Q== +"@babel/helper-member-expression-to-functions@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.5.tgz#0a7c56117cad3372fbf8d2fb4bf8f8d64a1e76b2" + integrity sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ== dependencies: - "@babel/types" "^7.16.7" + "@babel/types" "^7.22.5" -"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.0.0-beta.49", "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.15.4", "@babel/helper-module-imports@^7.16.0", "@babel/helper-module-imports@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz#25612a8091a999704461c8a222d0efec5d091437" - integrity sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg== - dependencies: - "@babel/types" "^7.16.7" +"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.0.0-beta.49", "@babel/helper-module-imports@^7.15.4", "@babel/helper-module-imports@^7.16.0", "@babel/helper-module-imports@^7.16.7", "@babel/helper-module-imports@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz#1a8f4c9f4027d23f520bd76b364d44434a72660c" + integrity sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg== + dependencies: + "@babel/types" "^7.22.5" -"@babel/helper-module-transforms@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.16.7.tgz#7665faeb721a01ca5327ddc6bba15a5cb34b6a41" - integrity sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng== - dependencies: - "@babel/helper-environment-visitor" "^7.16.7" - "@babel/helper-module-imports" "^7.16.7" - "@babel/helper-simple-access" "^7.16.7" - "@babel/helper-split-export-declaration" "^7.16.7" - "@babel/helper-validator-identifier" "^7.16.7" - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.16.7" - "@babel/types" "^7.16.7" +"@babel/helper-module-transforms@^7.16.7", "@babel/helper-module-transforms@^7.22.5", "@babel/helper-module-transforms@^7.22.9": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz#92dfcb1fbbb2bc62529024f72d942a8c97142129" + integrity sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ== + dependencies: + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-simple-access" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/helper-validator-identifier" "^7.22.5" -"@babel/helper-optimise-call-expression@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz#a34e3560605abbd31a18546bd2aad3e6d9a174f2" - integrity sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w== +"@babel/helper-optimise-call-expression@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz#f21531a9ccbff644fdd156b4077c16ff0c3f609e" + integrity sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw== dependencies: - "@babel/types" "^7.16.7" + "@babel/types" "^7.22.5" -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz#aa3a8ab4c3cceff8e65eb9e73d87dc4ff320b2f5" - integrity sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA== +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" + integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== -"@babel/helper-remap-async-to-generator@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.7.tgz#5ce2416990d55eb6e099128338848ae8ffa58a9a" - integrity sha512-C3o117GnP/j/N2OWo+oepeWbFEKRfNaay+F1Eo5Mj3A1SRjyx+qaFhm23nlipub7Cjv2azdUUiDH+VlpdwUFRg== +"@babel/helper-remap-async-to-generator@^7.22.5": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.9.tgz#53a25b7484e722d7efb9c350c75c032d4628de82" + integrity sha512-8WWC4oR4Px+tr+Fp0X3RHDVfINGpF3ad1HIbrc8A77epiR6eMMc6jsgozkzT2uDiOOdoS9cLIQ+XD2XvI2WSmQ== dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - "@babel/helper-wrap-function" "^7.16.7" - "@babel/types" "^7.16.7" + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-wrap-function" "^7.22.9" -"@babel/helper-replace-supers@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz#e9f5f5f32ac90429c1a4bdec0f231ef0c2838ab1" - integrity sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw== +"@babel/helper-replace-supers@^7.22.5", "@babel/helper-replace-supers@^7.22.9": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.9.tgz#cbdc27d6d8d18cd22c81ae4293765a5d9afd0779" + integrity sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg== dependencies: - "@babel/helper-environment-visitor" "^7.16.7" - "@babel/helper-member-expression-to-functions" "^7.16.7" - "@babel/helper-optimise-call-expression" "^7.16.7" - "@babel/traverse" "^7.16.7" - "@babel/types" "^7.16.7" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-member-expression-to-functions" "^7.22.5" + "@babel/helper-optimise-call-expression" "^7.22.5" -"@babel/helper-simple-access@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz#d656654b9ea08dbb9659b69d61063ccd343ff0f7" - integrity sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g== +"@babel/helper-simple-access@^7.16.7", "@babel/helper-simple-access@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" + integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== dependencies: - "@babel/types" "^7.16.7" + "@babel/types" "^7.22.5" -"@babel/helper-skip-transparent-expression-wrappers@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz#0ee3388070147c3ae051e487eca3ebb0e2e8bb09" - integrity sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw== +"@babel/helper-skip-transparent-expression-wrappers@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz#007f15240b5751c537c40e77abb4e89eeaaa8847" + integrity sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q== dependencies: - "@babel/types" "^7.16.0" + "@babel/types" "^7.22.5" -"@babel/helper-split-export-declaration@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz#0b648c0c42da9d3920d85ad585f2778620b8726b" - integrity sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw== +"@babel/helper-split-export-declaration@^7.16.7", "@babel/helper-split-export-declaration@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" + integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== dependencies: - "@babel/types" "^7.16.7" + "@babel/types" "^7.22.5" -"@babel/helper-validator-identifier@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad" - integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw== +"@babel/helper-string-parser@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" + integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== -"@babel/helper-validator-option@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz#b203ce62ce5fe153899b617c08957de860de4d23" - integrity sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ== - -"@babel/helper-wrap-function@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.16.7.tgz#8ddf9eaa770ed43de4bc3687f3f3b0d6d5ecf014" - integrity sha512-7a9sABeVwcunnztZZ7WTgSw6jVYLzM1wua0Z4HIXm9S3/HC96WKQTkFgGEaj5W06SHHihPJ6Le6HzS5cGOQMNw== - dependencies: - "@babel/helper-function-name" "^7.16.7" - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.16.7" - "@babel/types" "^7.16.7" +"@babel/helper-validator-identifier@^7.16.7", "@babel/helper-validator-identifier@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz#9544ef6a33999343c8740fa51350f30eeaaaf193" + integrity sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ== -"@babel/helpers@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.16.7.tgz#7e3504d708d50344112767c3542fc5e357fffefc" - integrity sha512-9ZDoqtfY7AuEOt3cxchfii6C7GDyyMBffktR5B2jvWv8u2+efwvpnVKXMWzNehqy68tKgAfSwfdw/lWpthS2bw== - dependencies: - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.16.7" - "@babel/types" "^7.16.7" +"@babel/helper-validator-option@^7.16.7", "@babel/helper-validator-option@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz#de52000a15a177413c8234fa3a8af4ee8102d0ac" + integrity sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw== -"@babel/highlight@^7.10.4", "@babel/highlight@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.16.7.tgz#81a01d7d675046f0d96f82450d9d9578bdfd6b0b" - integrity sha512-aKpPMfLvGO3Q97V0qhw/V2SWNWlwfJknuwAunU7wZLSfrM4xTBvg7E5opUVi1kJTBKihE38CPg4nBiqX83PWYw== +"@babel/helper-wrap-function@^7.22.9": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.9.tgz#189937248c45b0182c1dcf32f3444ca153944cb9" + integrity sha512-sZ+QzfauuUEfxSEjKFmi3qDSHgLsTPK/pEpoD/qonZKOtTPTLbf59oabPQ4rKekt9lFcj/hTZaOhWwFYrgjk+Q== + dependencies: + "@babel/helper-function-name" "^7.22.5" + "@babel/template" "^7.22.5" + "@babel/types" "^7.22.5" + +"@babel/helpers@^7.16.7", "@babel/helpers@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.6.tgz#8e61d3395a4f0c5a8060f309fb008200969b5ecd" + integrity sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA== dependencies: - "@babel/helper-validator-identifier" "^7.16.7" + "@babel/template" "^7.22.5" + "@babel/traverse" "^7.22.6" + "@babel/types" "^7.22.5" + +"@babel/highlight@^7.10.4", "@babel/highlight@^7.16.7", "@babel/highlight@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.5.tgz#aa6c05c5407a67ebce408162b7ede789b4d22031" + integrity sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw== + dependencies: + "@babel/helper-validator-identifier" "^7.22.5" chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.12.14", "@babel/parser@^7.16.7", "@babel/parser@^7.4.3": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.16.7.tgz#d372dda9c89fcec340a82630a9f533f2fe15877e" - integrity sha512-sR4eaSrnM7BV7QPzGfEX5paG/6wrZM3I0HDzfIAK06ESvo9oy3xBuVBxE3MbQaKNhvg8g/ixjMWo2CGpzpHsDA== +"@babel/parser@^7.16.7", "@babel/parser@^7.22.5", "@babel/parser@^7.22.7", "@babel/parser@^7.4.3": + version "7.22.7" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.7.tgz#df8cf085ce92ddbdbf668a7f186ce848c9036cae" + integrity sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q== -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.7.tgz#4eda6d6c2a0aa79c70fa7b6da67763dfe2141050" - integrity sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg== +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.5.tgz#87245a21cd69a73b0b81bcda98d443d6df08f05e" + integrity sha512-NP1M5Rf+u2Gw9qfSO4ihjcTGW5zXTi36ITLd4/EoAcEhIZ0yjMqmftDNl3QC19CX7olhrjpyU454g/2W7X0jvQ== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.7.tgz#cc001234dfc139ac45f6bcf801866198c8c72ff9" - integrity sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw== +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.5.tgz#fef09f9499b1f1c930da8a0c419db42167d792ca" + integrity sha512-31Bb65aZaUwqCbWMnZPduIZxCBngHFlzyN6Dq6KAJjtx+lx6ohKHubc61OomYi7XwVD4Ol0XCVz4h+pYFR048g== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" - "@babel/plugin-proposal-optional-chaining" "^7.16.7" - -"@babel/plugin-proposal-async-generator-functions@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.7.tgz#739adc1212a9e4892de440cd7dfffb06172df78d" - integrity sha512-TTXBT3A5c11eqRzaC6beO6rlFT3Mo9C2e8eB44tTr52ESXSK2CIc2fOp1ynpAwQA8HhBMho+WXhMHWlAe3xkpw== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-remap-async-to-generator" "^7.16.7" - "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/plugin-transform-optional-chaining" "^7.22.5" -"@babel/plugin-proposal-class-properties@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz#925cad7b3b1a2fcea7e59ecc8eb5954f961f91b0" - integrity sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-proposal-class-static-block@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.16.7.tgz#712357570b612106ef5426d13dc433ce0f200c2a" - integrity sha512-dgqJJrcZoG/4CkMopzhPJjGxsIe9A8RlkQLnL/Vhhx8AA9ZuaRwGSlscSh42hazc7WSrya/IK7mTeoF0DP9tEw== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - -"@babel/plugin-proposal-decorators@^7.10.4": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.16.7.tgz#922907d2e3e327f5b07d2246bcfc0bd438f360d2" - integrity sha512-DoEpnuXK14XV9btI1k8tzNGCutMclpj4yru8aXKoHlVmbO1s+2A+g2+h4JhcjrxkFJqzbymnLG6j/niOf3iFXQ== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-decorators" "^7.16.7" - -"@babel/plugin-proposal-dynamic-import@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz#c19c897eaa46b27634a00fee9fb7d829158704b2" - integrity sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - -"@babel/plugin-proposal-export-namespace-from@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz#09de09df18445a5786a305681423ae63507a6163" - integrity sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - -"@babel/plugin-proposal-json-strings@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.7.tgz#9732cb1d17d9a2626a08c5be25186c195b6fa6e8" - integrity sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-json-strings" "^7.8.3" - -"@babel/plugin-proposal-logical-assignment-operators@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz#be23c0ba74deec1922e639832904be0bea73cdea" - integrity sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - -"@babel/plugin-proposal-nullish-coalescing-operator@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz#141fc20b6857e59459d430c850a0011e36561d99" - integrity sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - -"@babel/plugin-proposal-numeric-separator@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz#d6b69f4af63fb38b6ca2558442a7fb191236eba9" - integrity sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - -"@babel/plugin-proposal-object-rest-spread@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.16.7.tgz#94593ef1ddf37021a25bdcb5754c4a8d534b01d8" - integrity sha512-3O0Y4+dw94HA86qSg9IHfyPktgR7q3gpNVAeiKQd+8jBKFaU5NQS1Yatgo4wY+UFNuLjvxcSmzcsHqrhgTyBUA== - dependencies: - "@babel/compat-data" "^7.16.4" - "@babel/helper-compilation-targets" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" +"@babel/plugin-proposal-class-properties@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3" + integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-proposal-decorators@^7.22.7": + version "7.22.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.22.7.tgz#9b5b73c2e404f0869ef8a8a53765f8203c5467a7" + integrity sha512-omXqPF7Onq4Bb7wHxXjM3jSMSJvUUbvDvmmds7KI5n9Cq6Ln5I05I1W2nRlRof1rGdiUxJrxwe285WF96XlBXQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.6" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/plugin-syntax-decorators" "^7.22.5" + +"@babel/plugin-proposal-object-rest-spread@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz#aa662940ef425779c75534a5c41e9d936edc390a" + integrity sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg== + dependencies: + "@babel/compat-data" "^7.20.5" + "@babel/helper-compilation-targets" "^7.20.7" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.16.7" + "@babel/plugin-transform-parameters" "^7.20.7" -"@babel/plugin-proposal-optional-catch-binding@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz#c623a430674ffc4ab732fd0a0ae7722b67cb74cf" - integrity sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" +"@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": + version "7.21.0-placeholder-for-preset-env.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz#7844f9289546efa9febac2de4cfe358a050bd703" + integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w== -"@babel/plugin-proposal-optional-chaining@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz#7cd629564724816c0e8a969535551f943c64c39a" - integrity sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - -"@babel/plugin-proposal-private-methods@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.7.tgz#e418e3aa6f86edd6d327ce84eff188e479f571e0" - integrity sha512-7twV3pzhrRxSwHeIvFE6coPgvo+exNDOiGUMg39o2LiLo1Y+4aKpfkcLGcg1UHonzorCt7SNXnoMyCnnIOA8Sw== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-proposal-private-property-in-object@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.7.tgz#b0b8cef543c2c3d57e59e2c611994861d46a3fce" - integrity sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - "@babel/helper-create-class-features-plugin" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - -"@babel/plugin-proposal-unicode-property-regex@^7.16.7", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": +"@babel/plugin-proposal-unicode-property-regex@^7.4.4": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.7.tgz#635d18eb10c6214210ffc5ff4932552de08188a2" integrity sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg== @@ -455,12 +359,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-decorators@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.16.7.tgz#f66a0199f16de7c1ef5192160ccf5d069739e3d3" - integrity sha512-vQ+PxL+srA7g6Rx6I1e15m55gftknl2X8GCUW1JTlkTaXZLJOS0UcaY0eK9jYT7IYf4awn6qwyghVHLDz1WyMw== +"@babel/plugin-syntax-decorators@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.22.5.tgz#329fe2907c73de184033775637dbbc507f09116a" + integrity sha512-avpUOBS7IU6al8MmF1XpAyj9QYeLPuSDJI5D4pVMSMdL7xQokKqJPYQC67RCT0aCTashUXPiGwMJ0DEXXCEmMA== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-dynamic-import@^7.8.3": version "7.8.3" @@ -476,6 +380,27 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" +"@babel/plugin-syntax-import-assertions@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz#07d252e2aa0bc6125567f742cd58619cb14dce98" + integrity sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-import-attributes@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz#ab840248d834410b829f569f5262b9e517555ecb" + integrity sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-import-meta@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" + integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-json-strings@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" @@ -483,12 +408,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-jsx@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.7.tgz#50b6571d13f764266a113d77c82b4a6508bbe665" - integrity sha512-Esxmk7YjA8QysKeT3VhTXvF6y77f/a91SIs4pWb4H2eWGQkCKFgQaG6hdoEVZtGsrAcb2K5BW66XsOErD4WU3Q== +"@babel/plugin-syntax-jsx@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz#a6b68e84fb76e759fc3b93e901876ffabbe1d918" + integrity sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-logical-assignment-operators@^7.10.4": version "7.10.4" @@ -546,336 +471,472 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-typescript@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.7.tgz#39c9b55ee153151990fb038651d58d3fd03f98f8" - integrity sha512-YhUIJHHGkqPgEcMYkPCKTyGUdoGKWtopIycQyjJH8OjvRgOYsXsaKehLVPScKJWAULPxMa4N1vCe6szREFlZ7A== +"@babel/plugin-syntax-typescript@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz#aac8d383b062c5072c647a31ef990c1d0af90272" + integrity sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-arrow-functions@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz#44125e653d94b98db76369de9c396dc14bef4154" - integrity sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ== +"@babel/plugin-syntax-unicode-sets-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz#d49a3b3e6b52e5be6740022317580234a6a47357" + integrity sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-async-to-generator@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.7.tgz#646e1262ac341b587ff5449844d4492dbb10ac4b" - integrity sha512-pFEfjnK4DfXCfAlA5I98BYdDJD8NltMzx19gt6DAmfE+2lXRfPUoa0/5SUjT4+TDE1W/rcxU/1lgN55vpAjjdg== +"@babel/plugin-transform-arrow-functions@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz#e5ba566d0c58a5b2ba2a8b795450641950b71958" + integrity sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw== dependencies: - "@babel/helper-module-imports" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-remap-async-to-generator" "^7.16.7" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-block-scoped-functions@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz#4d0d57d9632ef6062cdf354bb717102ee042a620" - integrity sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg== +"@babel/plugin-transform-async-generator-functions@^7.22.7": + version "7.22.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.7.tgz#053e76c0a903b72b573cb1ab7d6882174d460a1b" + integrity sha512-7HmE7pk/Fmke45TODvxvkxRMV9RazV+ZZzhOL9AG8G29TLrr3jkjwF7uJfxZ30EoXpO+LJkq4oA8NjO2DTnEDg== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-remap-async-to-generator" "^7.22.5" + "@babel/plugin-syntax-async-generators" "^7.8.4" -"@babel/plugin-transform-block-scoping@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz#f50664ab99ddeaee5bc681b8f3a6ea9d72ab4f87" - integrity sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ== +"@babel/plugin-transform-async-to-generator@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz#c7a85f44e46f8952f6d27fe57c2ed3cc084c3775" + integrity sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-remap-async-to-generator" "^7.22.5" -"@babel/plugin-transform-classes@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.7.tgz#8f4b9562850cd973de3b498f1218796eb181ce00" - integrity sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ== +"@babel/plugin-transform-block-scoped-functions@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz#27978075bfaeb9fa586d3cb63a3d30c1de580024" + integrity sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA== dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - "@babel/helper-environment-visitor" "^7.16.7" - "@babel/helper-function-name" "^7.16.7" - "@babel/helper-optimise-call-expression" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-replace-supers" "^7.16.7" - "@babel/helper-split-export-declaration" "^7.16.7" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-block-scoping@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.5.tgz#8bfc793b3a4b2742c0983fadc1480d843ecea31b" + integrity sha512-EcACl1i5fSQ6bt+YGuU/XGCeZKStLmyVGytWkpyhCLeQVA0eu6Wtiw92V+I1T/hnezUv7j74dA/Ro69gWcU+hg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-class-properties@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz#97a56e31ad8c9dc06a0b3710ce7803d5a48cca77" + integrity sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-class-static-block@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.5.tgz#3e40c46f048403472d6f4183116d5e46b1bff5ba" + integrity sha512-SPToJ5eYZLxlnp1UzdARpOGeC2GbHvr9d/UV0EukuVx8atktg194oe+C5BqQ8jRTkgLRVOPYeXRSBg1IlMoVRA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + +"@babel/plugin-transform-classes@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.6.tgz#e04d7d804ed5b8501311293d1a0e6d43e94c3363" + integrity sha512-58EgM6nuPNG6Py4Z3zSuu0xWu2VfodiMi72Jt5Kj2FECmaYk1RrTXA45z6KBFsu9tRgwQDwIiY4FXTt+YsSFAQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-compilation-targets" "^7.22.6" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-optimise-call-expression" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.7.tgz#66dee12e46f61d2aae7a73710f591eb3df616470" - integrity sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw== +"@babel/plugin-transform-computed-properties@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz#cd1e994bf9f316bd1c2dafcd02063ec261bb3869" + integrity sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/template" "^7.22.5" -"@babel/plugin-transform-destructuring@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.16.7.tgz#ca9588ae2d63978a4c29d3f33282d8603f618e23" - integrity sha512-VqAwhTHBnu5xBVDCvrvqJbtLUa++qZaWC0Fgr2mqokBlulZARGyIvZDoqbPlPaKImQ9dKAcCzbv+ul//uqu70A== +"@babel/plugin-transform-destructuring@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.5.tgz#d3aca7438f6c26c78cdd0b0ba920a336001b27cc" + integrity sha512-GfqcFuGW8vnEqTUBM7UtPd5A4q797LTvvwKxXTgRsFjoqaJiEg9deBG6kWeQYkVEL569NpnmpC0Pkr/8BLKGnQ== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-dotall-regex@^7.16.7", "@babel/plugin-transform-dotall-regex@^7.4.4": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz#6b2d67686fab15fb6a7fd4bd895d5982cfc81241" - integrity sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ== +"@babel/plugin-transform-dotall-regex@^7.22.5", "@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz#dbb4f0e45766eb544e193fb00e65a1dd3b2a4165" + integrity sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-duplicate-keys@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.7.tgz#2207e9ca8f82a0d36a5a67b6536e7ef8b08823c9" - integrity sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw== +"@babel/plugin-transform-duplicate-keys@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz#b6e6428d9416f5f0bba19c70d1e6e7e0b88ab285" + integrity sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-exponentiation-operator@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz#efa9862ef97e9e9e5f653f6ddc7b665e8536fe9b" - integrity sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA== +"@babel/plugin-transform-dynamic-import@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.5.tgz#d6908a8916a810468c4edff73b5b75bda6ad393e" + integrity sha512-0MC3ppTB1AMxd8fXjSrbPa7LT9hrImt+/fcj+Pg5YMD7UQyWp/02+JWpdnCymmsXwIx5Z+sYn1bwCn4ZJNvhqQ== dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" -"@babel/plugin-transform-for-of@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.7.tgz#649d639d4617dff502a9a158c479b3b556728d8c" - integrity sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg== +"@babel/plugin-transform-exponentiation-operator@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz#402432ad544a1f9a480da865fda26be653e48f6a" + integrity sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-function-name@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz#5ab34375c64d61d083d7d2f05c38d90b97ec65cf" - integrity sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA== +"@babel/plugin-transform-export-namespace-from@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.5.tgz#57c41cb1d0613d22f548fddd8b288eedb9973a5b" + integrity sha512-X4hhm7FRnPgd4nDA4b/5V280xCx6oL7Oob5+9qVS5C13Zq4bh1qq7LU0GgRU6b5dBWBvhGaXYVB4AcN6+ol6vg== dependencies: - "@babel/helper-compilation-targets" "^7.16.7" - "@babel/helper-function-name" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" -"@babel/plugin-transform-literals@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.7.tgz#254c9618c5ff749e87cb0c0cef1a0a050c0bdab1" - integrity sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ== +"@babel/plugin-transform-for-of@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.5.tgz#ab1b8a200a8f990137aff9a084f8de4099ab173f" + integrity sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-member-expression-literals@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz#6e5dcf906ef8a098e630149d14c867dd28f92384" - integrity sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw== +"@babel/plugin-transform-function-name@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz#935189af68b01898e0d6d99658db6b164205c143" + integrity sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-compilation-targets" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-modules-amd@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.7.tgz#b28d323016a7daaae8609781d1f8c9da42b13186" - integrity sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g== +"@babel/plugin-transform-json-strings@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.5.tgz#14b64352fdf7e1f737eed68de1a1468bd2a77ec0" + integrity sha512-DuCRB7fu8MyTLbEQd1ew3R85nx/88yMoqo2uPSjevMj3yoN7CDM8jkgrY0wmVxfJZyJ/B9fE1iq7EQppWQmR5A== dependencies: - "@babel/helper-module-transforms" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - babel-plugin-dynamic-import-node "^2.3.3" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-json-strings" "^7.8.3" -"@babel/plugin-transform-modules-commonjs@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.7.tgz#fd119e6a433c527d368425b45df361e1e95d3c1a" - integrity sha512-h2RP2kE7He1ZWKyAlanMZrAbdv+Acw1pA8dQZhE025WJZE2z0xzFADAinXA9fxd5bn7JnM+SdOGcndGx1ARs9w== +"@babel/plugin-transform-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz#e9341f4b5a167952576e23db8d435849b1dd7920" + integrity sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g== dependencies: - "@babel/helper-module-transforms" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-simple-access" "^7.16.7" - babel-plugin-dynamic-import-node "^2.3.3" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-modules-systemjs@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.7.tgz#887cefaef88e684d29558c2b13ee0563e287c2d7" - integrity sha512-DuK5E3k+QQmnOqBR9UkusByy5WZWGRxfzV529s9nPra1GE7olmxfqO2FHobEOYSPIjPBTr4p66YDcjQnt8cBmw== +"@babel/plugin-transform-logical-assignment-operators@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.5.tgz#66ae5f068fd5a9a5dc570df16f56c2a8462a9d6c" + integrity sha512-MQQOUW1KL8X0cDWfbwYP+TbVbZm16QmQXJQ+vndPtH/BoO0lOKpVoEDMI7+PskYxH+IiE0tS8xZye0qr1lGzSA== dependencies: - "@babel/helper-hoist-variables" "^7.16.7" - "@babel/helper-module-transforms" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-validator-identifier" "^7.16.7" - babel-plugin-dynamic-import-node "^2.3.3" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" -"@babel/plugin-transform-modules-umd@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.7.tgz#23dad479fa585283dbd22215bff12719171e7618" - integrity sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ== +"@babel/plugin-transform-member-expression-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz#4fcc9050eded981a468347dd374539ed3e058def" + integrity sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew== dependencies: - "@babel/helper-module-transforms" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-named-capturing-groups-regex@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.7.tgz#749d90d94e73cf62c60a0cc8d6b94d29305a81f2" - integrity sha512-kFy35VwmwIQwCjwrAQhl3+c/kr292i4KdLPKp5lPH03Ltc51qnFlIADoyPxc/6Naz3ok3WdYKg+KK6AH+D4utg== +"@babel/plugin-transform-modules-amd@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.22.5.tgz#4e045f55dcf98afd00f85691a68fc0780704f526" + integrity sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.16.7" + "@babel/helper-module-transforms" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-new-target@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.7.tgz#9967d89a5c243818e0800fdad89db22c5f514244" - integrity sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg== +"@babel/plugin-transform-modules-commonjs@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.5.tgz#7d9875908d19b8c0536085af7b053fd5bd651bfa" + integrity sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-module-transforms" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-simple-access" "^7.22.5" -"@babel/plugin-transform-object-super@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz#ac359cf8d32cf4354d27a46867999490b6c32a94" - integrity sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw== +"@babel/plugin-transform-modules-systemjs@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.5.tgz#18c31410b5e579a0092638f95c896c2a98a5d496" + integrity sha512-emtEpoaTMsOs6Tzz+nbmcePl6AKVtS1yC4YNAeMun9U8YCsgadPNxnOPQ8GhHFB2qdx+LZu9LgoC0Lthuu05DQ== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-replace-supers" "^7.16.7" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-module-transforms" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.5" -"@babel/plugin-transform-parameters@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.7.tgz#a1721f55b99b736511cb7e0152f61f17688f331f" - integrity sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw== +"@babel/plugin-transform-modules-umd@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz#4694ae40a87b1745e3775b6a7fe96400315d4f98" + integrity sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-module-transforms" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-property-literals@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz#2dadac85155436f22c696c4827730e0fe1057a55" - integrity sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw== +"@babel/plugin-transform-named-capturing-groups-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz#67fe18ee8ce02d57c855185e27e3dc959b2e991f" + integrity sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-react-display-name@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.16.7.tgz#7b6d40d232f4c0f550ea348593db3b21e2404340" - integrity sha512-qgIg8BcZgd0G/Cz916D5+9kqX0c7nPZyXaP8R2tLNN5tkyIZdG5fEwBrxwplzSnjC1jvQmyMNVwUCZPcbGY7Pg== +"@babel/plugin-transform-new-target@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz#1b248acea54ce44ea06dfd37247ba089fcf9758d" + integrity sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-react-jsx-development@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.16.7.tgz#43a00724a3ed2557ed3f276a01a929e6686ac7b8" - integrity sha512-RMvQWvpla+xy6MlBpPlrKZCMRs2AGiHOGHY3xRwl0pEeim348dDyxeH4xBsMPbIMhujeq7ihE702eM2Ew0Wo+A== +"@babel/plugin-transform-nullish-coalescing-operator@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.5.tgz#f8872c65776e0b552e0849d7596cddd416c3e381" + integrity sha512-6CF8g6z1dNYZ/VXok5uYkkBBICHZPiGEl7oDnAx2Mt1hlHVHOSIKWJaXHjQJA5VB43KZnXZDIexMchY4y2PGdA== dependencies: - "@babel/plugin-transform-react-jsx" "^7.16.7" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" -"@babel/plugin-transform-react-jsx@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.16.7.tgz#86a6a220552afd0e4e1f0388a68a372be7add0d4" - integrity sha512-8D16ye66fxiE8m890w0BpPpngG9o9OVBBy0gH2E+2AR7qMR2ZpTYJEqLxAsoroenMId0p/wMW+Blc0meDgu0Ag== +"@babel/plugin-transform-numeric-separator@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.5.tgz#57226a2ed9e512b9b446517ab6fa2d17abb83f58" + integrity sha512-NbslED1/6M+sXiwwtcAB/nieypGw02Ejf4KtDeMkCEpP6gWFMX1wI9WKYua+4oBneCCEmulOkRpwywypVZzs/g== dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - "@babel/helper-module-imports" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-jsx" "^7.16.7" - "@babel/types" "^7.16.7" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-transform-react-pure-annotations@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.16.7.tgz#232bfd2f12eb551d6d7d01d13fe3f86b45eb9c67" - integrity sha512-hs71ToC97k3QWxswh2ElzMFABXHvGiJ01IB1TbYQDGeWRKWz/MPUTh5jGExdHvosYKpnJW5Pm3S4+TA3FyX+GA== +"@babel/plugin-transform-object-rest-spread@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.5.tgz#9686dc3447df4753b0b2a2fae7e8bc33cdc1f2e1" + integrity sha512-Kk3lyDmEslH9DnvCDA1s1kkd3YWQITiBOHngOtDL9Pt6BZjzqb6hiOlb8VfjiiQJ2unmegBqZu0rx5RxJb5vmQ== dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/compat-data" "^7.22.5" + "@babel/helper-compilation-targets" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.22.5" -"@babel/plugin-transform-regenerator@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.7.tgz#9e7576dc476cb89ccc5096fff7af659243b4adeb" - integrity sha512-mF7jOgGYCkSJagJ6XCujSQg+6xC1M77/03K2oBmVJWoFGNUtnVJO4WHKJk3dnPC8HCcj4xBQP1Egm8DWh3Pb3Q== +"@babel/plugin-transform-object-super@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz#794a8d2fcb5d0835af722173c1a9d704f44e218c" + integrity sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw== dependencies: - regenerator-transform "^0.14.2" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.5" -"@babel/plugin-transform-reserved-words@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.7.tgz#1d798e078f7c5958eec952059c460b220a63f586" - integrity sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg== +"@babel/plugin-transform-optional-catch-binding@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.5.tgz#842080be3076703be0eaf32ead6ac8174edee333" + integrity sha512-pH8orJahy+hzZje5b8e2QIlBWQvGpelS76C63Z+jhZKsmzfNaPQ+LaW6dcJ9bxTpo1mtXbgHwy765Ro3jftmUg== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -"@babel/plugin-transform-shorthand-properties@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz#e8549ae4afcf8382f711794c0c7b6b934c5fbd2a" - integrity sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg== +"@babel/plugin-transform-optional-chaining@^7.22.5", "@babel/plugin-transform-optional-chaining@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.6.tgz#4bacfe37001fe1901117672875e931d439811564" + integrity sha512-Vd5HiWml0mDVtcLHIoEU5sw6HOUW/Zk0acLs/SAeuLzkGNOPc9DB4nkUajemhCmTIz3eiaKREZn2hQQqF79YTg== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" -"@babel/plugin-transform-spread@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.7.tgz#a303e2122f9f12e0105daeedd0f30fb197d8ff44" - integrity sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg== +"@babel/plugin-transform-parameters@^7.20.7", "@babel/plugin-transform-parameters@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.5.tgz#c3542dd3c39b42c8069936e48717a8d179d63a18" + integrity sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-sticky-regex@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz#c84741d4f4a38072b9a1e2e3fd56d359552e8660" - integrity sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw== +"@babel/plugin-transform-private-methods@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz#21c8af791f76674420a147ae62e9935d790f8722" + integrity sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-template-literals@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.7.tgz#f3d1c45d28967c8e80f53666fc9c3e50618217ab" - integrity sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA== +"@babel/plugin-transform-private-property-in-object@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.5.tgz#07a77f28cbb251546a43d175a1dda4cf3ef83e32" + integrity sha512-/9xnaTTJcVoBtSSmrVyhtSvO3kbqS2ODoh2juEU72c3aYonNF0OMGiaz2gjukyKM2wBBYJP38S4JiE0Wfb5VMQ== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" -"@babel/plugin-transform-typeof-symbol@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.7.tgz#9cdbe622582c21368bd482b660ba87d5545d4f7e" - integrity sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ== +"@babel/plugin-transform-property-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz#b5ddabd73a4f7f26cd0e20f5db48290b88732766" + integrity sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-typescript@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.16.7.tgz#33f8c2c890fbfdc4ef82446e9abb8de8211a3ff3" - integrity sha512-Hzx1lvBtOCWuCEwMmYOfpQpO7joFeXLgoPuzZZBtTxXqSqUGUubvFGZv2ygo1tB5Bp9q6PXV3H0E/kf7KM0RLA== +"@babel/plugin-transform-react-display-name@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.22.5.tgz#3c4326f9fce31c7968d6cb9debcaf32d9e279a2b" + integrity sha512-PVk3WPYudRF5z4GKMEYUrLjPl38fJSKNaEOkFuoprioowGuWN6w2RKznuFNSlJx7pzzXXStPUnNSOEO0jL5EVw== dependencies: - "@babel/helper-create-class-features-plugin" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-typescript" "^7.16.7" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-unicode-escapes@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz#da8717de7b3287a2c6d659750c964f302b31ece3" - integrity sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q== +"@babel/plugin-transform-react-jsx-development@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz#e716b6edbef972a92165cd69d92f1255f7e73e87" + integrity sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-transform-react-jsx" "^7.22.5" -"@babel/plugin-transform-unicode-regex@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz#0f7aa4a501198976e25e82702574c34cfebe9ef2" - integrity sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q== +"@babel/plugin-transform-react-jsx@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.5.tgz#932c291eb6dd1153359e2a90cb5e557dcf068416" + integrity sha512-rog5gZaVbUip5iWDMTYbVM15XQq+RkUKhET/IHR6oizR+JEoN6CAfTTuHcK4vwUyzca30qqHqEpzBOnaRMWYMA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-jsx" "^7.22.5" + "@babel/types" "^7.22.5" -"@babel/preset-env@^7.10.4": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.16.7.tgz#c491088856d0b3177822a2bf06cb74d76327aa56" - integrity sha512-urX3Cee4aOZbRWOSa3mKPk0aqDikfILuo+C7qq7HY0InylGNZ1fekq9jmlr3pLWwZHF4yD7heQooc2Pow2KMyQ== +"@babel/plugin-transform-react-pure-annotations@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.22.5.tgz#1f58363eef6626d6fa517b95ac66fe94685e32c0" + integrity sha512-gP4k85wx09q+brArVinTXhWiyzLl9UpmGva0+mWyKxk6JZequ05x3eUcIUE+FyttPKJFRRVtAvQaJ6YF9h1ZpA== dependencies: - "@babel/compat-data" "^7.16.4" - "@babel/helper-compilation-targets" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-validator-option" "^7.16.7" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.16.7" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.16.7" - "@babel/plugin-proposal-async-generator-functions" "^7.16.7" - "@babel/plugin-proposal-class-properties" "^7.16.7" - "@babel/plugin-proposal-class-static-block" "^7.16.7" - "@babel/plugin-proposal-dynamic-import" "^7.16.7" - "@babel/plugin-proposal-export-namespace-from" "^7.16.7" - "@babel/plugin-proposal-json-strings" "^7.16.7" - "@babel/plugin-proposal-logical-assignment-operators" "^7.16.7" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.16.7" - "@babel/plugin-proposal-numeric-separator" "^7.16.7" - "@babel/plugin-proposal-object-rest-spread" "^7.16.7" - "@babel/plugin-proposal-optional-catch-binding" "^7.16.7" - "@babel/plugin-proposal-optional-chaining" "^7.16.7" - "@babel/plugin-proposal-private-methods" "^7.16.7" - "@babel/plugin-proposal-private-property-in-object" "^7.16.7" - "@babel/plugin-proposal-unicode-property-regex" "^7.16.7" + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-regenerator@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.5.tgz#cd8a68b228a5f75fa01420e8cc2fc400f0fc32aa" + integrity sha512-rR7KePOE7gfEtNTh9Qw+iO3Q/e4DEsoQ+hdvM6QUDH7JRJ5qxq5AA52ZzBWbI5i9lfNuvySgOGP8ZN7LAmaiPw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + regenerator-transform "^0.15.1" + +"@babel/plugin-transform-reserved-words@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz#832cd35b81c287c4bcd09ce03e22199641f964fb" + integrity sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-shorthand-properties@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz#6e277654be82b5559fc4b9f58088507c24f0c624" + integrity sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-spread@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz#6487fd29f229c95e284ba6c98d65eafb893fea6b" + integrity sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + +"@babel/plugin-transform-sticky-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz#295aba1595bfc8197abd02eae5fc288c0deb26aa" + integrity sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-template-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz#8f38cf291e5f7a8e60e9f733193f0bcc10909bff" + integrity sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-typeof-symbol@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz#5e2ba478da4b603af8673ff7c54f75a97b716b34" + integrity sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-typescript@^7.22.5": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.9.tgz#91e08ad1eb1028ecc62662a842e93ecfbf3c7234" + integrity sha512-BnVR1CpKiuD0iobHPaM1iLvcwPYN2uVFAqoLVSpEDKWuOikoCv5HbKLxclhKYUXlWkX86DoZGtqI4XhbOsyrMg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.22.9" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-typescript" "^7.22.5" + +"@babel/plugin-transform-unicode-escapes@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.5.tgz#ce0c248522b1cb22c7c992d88301a5ead70e806c" + integrity sha512-biEmVg1IYB/raUO5wT1tgfacCef15Fbzhkx493D3urBI++6hpJ+RFG4SrWMn0NEZLfvilqKf3QDrRVZHo08FYg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-unicode-property-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz#098898f74d5c1e86660dc112057b2d11227f1c81" + integrity sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-unicode-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz#ce7e7bb3ef208c4ff67e02a22816656256d7a183" + integrity sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-unicode-sets-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz#77788060e511b708ffc7d42fdfbc5b37c3004e91" + integrity sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/preset-env@^7.22.9": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.22.9.tgz#57f17108eb5dfd4c5c25a44c1977eba1df310ac7" + integrity sha512-wNi5H/Emkhll/bqPjsjQorSykrlfY5OWakd6AulLvMEytpKasMVUpVy8RL4qBIBs5Ac6/5i0/Rv0b/Fg6Eag/g== + dependencies: + "@babel/compat-data" "^7.22.9" + "@babel/helper-compilation-targets" "^7.22.9" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-option" "^7.22.5" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.22.5" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.22.5" + "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-syntax-class-properties" "^7.12.13" "@babel/plugin-syntax-class-static-block" "^7.14.5" "@babel/plugin-syntax-dynamic-import" "^7.8.3" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-syntax-import-assertions" "^7.22.5" + "@babel/plugin-syntax-import-attributes" "^7.22.5" + "@babel/plugin-syntax-import-meta" "^7.10.4" "@babel/plugin-syntax-json-strings" "^7.8.3" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" @@ -885,45 +946,62 @@ "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" "@babel/plugin-syntax-top-level-await" "^7.14.5" - "@babel/plugin-transform-arrow-functions" "^7.16.7" - "@babel/plugin-transform-async-to-generator" "^7.16.7" - "@babel/plugin-transform-block-scoped-functions" "^7.16.7" - "@babel/plugin-transform-block-scoping" "^7.16.7" - "@babel/plugin-transform-classes" "^7.16.7" - "@babel/plugin-transform-computed-properties" "^7.16.7" - "@babel/plugin-transform-destructuring" "^7.16.7" - "@babel/plugin-transform-dotall-regex" "^7.16.7" - "@babel/plugin-transform-duplicate-keys" "^7.16.7" - "@babel/plugin-transform-exponentiation-operator" "^7.16.7" - "@babel/plugin-transform-for-of" "^7.16.7" - "@babel/plugin-transform-function-name" "^7.16.7" - "@babel/plugin-transform-literals" "^7.16.7" - "@babel/plugin-transform-member-expression-literals" "^7.16.7" - "@babel/plugin-transform-modules-amd" "^7.16.7" - "@babel/plugin-transform-modules-commonjs" "^7.16.7" - "@babel/plugin-transform-modules-systemjs" "^7.16.7" - "@babel/plugin-transform-modules-umd" "^7.16.7" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.16.7" - "@babel/plugin-transform-new-target" "^7.16.7" - "@babel/plugin-transform-object-super" "^7.16.7" - "@babel/plugin-transform-parameters" "^7.16.7" - "@babel/plugin-transform-property-literals" "^7.16.7" - "@babel/plugin-transform-regenerator" "^7.16.7" - "@babel/plugin-transform-reserved-words" "^7.16.7" - "@babel/plugin-transform-shorthand-properties" "^7.16.7" - "@babel/plugin-transform-spread" "^7.16.7" - "@babel/plugin-transform-sticky-regex" "^7.16.7" - "@babel/plugin-transform-template-literals" "^7.16.7" - "@babel/plugin-transform-typeof-symbol" "^7.16.7" - "@babel/plugin-transform-unicode-escapes" "^7.16.7" - "@babel/plugin-transform-unicode-regex" "^7.16.7" + "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" + "@babel/plugin-transform-arrow-functions" "^7.22.5" + "@babel/plugin-transform-async-generator-functions" "^7.22.7" + "@babel/plugin-transform-async-to-generator" "^7.22.5" + "@babel/plugin-transform-block-scoped-functions" "^7.22.5" + "@babel/plugin-transform-block-scoping" "^7.22.5" + "@babel/plugin-transform-class-properties" "^7.22.5" + "@babel/plugin-transform-class-static-block" "^7.22.5" + "@babel/plugin-transform-classes" "^7.22.6" + "@babel/plugin-transform-computed-properties" "^7.22.5" + "@babel/plugin-transform-destructuring" "^7.22.5" + "@babel/plugin-transform-dotall-regex" "^7.22.5" + "@babel/plugin-transform-duplicate-keys" "^7.22.5" + "@babel/plugin-transform-dynamic-import" "^7.22.5" + "@babel/plugin-transform-exponentiation-operator" "^7.22.5" + "@babel/plugin-transform-export-namespace-from" "^7.22.5" + "@babel/plugin-transform-for-of" "^7.22.5" + "@babel/plugin-transform-function-name" "^7.22.5" + "@babel/plugin-transform-json-strings" "^7.22.5" + "@babel/plugin-transform-literals" "^7.22.5" + "@babel/plugin-transform-logical-assignment-operators" "^7.22.5" + "@babel/plugin-transform-member-expression-literals" "^7.22.5" + "@babel/plugin-transform-modules-amd" "^7.22.5" + "@babel/plugin-transform-modules-commonjs" "^7.22.5" + "@babel/plugin-transform-modules-systemjs" "^7.22.5" + "@babel/plugin-transform-modules-umd" "^7.22.5" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.22.5" + "@babel/plugin-transform-new-target" "^7.22.5" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.22.5" + "@babel/plugin-transform-numeric-separator" "^7.22.5" + "@babel/plugin-transform-object-rest-spread" "^7.22.5" + "@babel/plugin-transform-object-super" "^7.22.5" + "@babel/plugin-transform-optional-catch-binding" "^7.22.5" + "@babel/plugin-transform-optional-chaining" "^7.22.6" + "@babel/plugin-transform-parameters" "^7.22.5" + "@babel/plugin-transform-private-methods" "^7.22.5" + "@babel/plugin-transform-private-property-in-object" "^7.22.5" + "@babel/plugin-transform-property-literals" "^7.22.5" + "@babel/plugin-transform-regenerator" "^7.22.5" + "@babel/plugin-transform-reserved-words" "^7.22.5" + "@babel/plugin-transform-shorthand-properties" "^7.22.5" + "@babel/plugin-transform-spread" "^7.22.5" + "@babel/plugin-transform-sticky-regex" "^7.22.5" + "@babel/plugin-transform-template-literals" "^7.22.5" + "@babel/plugin-transform-typeof-symbol" "^7.22.5" + "@babel/plugin-transform-unicode-escapes" "^7.22.5" + "@babel/plugin-transform-unicode-property-regex" "^7.22.5" + "@babel/plugin-transform-unicode-regex" "^7.22.5" + "@babel/plugin-transform-unicode-sets-regex" "^7.22.5" "@babel/preset-modules" "^0.1.5" - "@babel/types" "^7.16.7" - babel-plugin-polyfill-corejs2 "^0.3.0" - babel-plugin-polyfill-corejs3 "^0.4.0" - babel-plugin-polyfill-regenerator "^0.3.0" - core-js-compat "^3.19.1" - semver "^6.3.0" + "@babel/types" "^7.22.5" + babel-plugin-polyfill-corejs2 "^0.4.4" + babel-plugin-polyfill-corejs3 "^0.8.2" + babel-plugin-polyfill-regenerator "^0.5.1" + core-js-compat "^3.31.0" + semver "^6.3.1" "@babel/preset-modules@^0.1.5": version "0.1.5" @@ -936,72 +1014,73 @@ "@babel/types" "^7.4.4" esutils "^2.0.2" -"@babel/preset-react@^7.0.0": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.16.7.tgz#4c18150491edc69c183ff818f9f2aecbe5d93852" - integrity sha512-fWpyI8UM/HE6DfPBzD8LnhQ/OcH8AgTaqcqP2nGOXEUV+VKBR5JRN9hCk9ai+zQQ57vtm9oWeXguBCPNUjytgA== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-validator-option" "^7.16.7" - "@babel/plugin-transform-react-display-name" "^7.16.7" - "@babel/plugin-transform-react-jsx" "^7.16.7" - "@babel/plugin-transform-react-jsx-development" "^7.16.7" - "@babel/plugin-transform-react-pure-annotations" "^7.16.7" - -"@babel/preset-typescript@^7.10.4": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.16.7.tgz#ab114d68bb2020afc069cd51b37ff98a046a70b9" - integrity sha512-WbVEmgXdIyvzB77AQjGBEyYPZx+8tTsO50XtfozQrkW8QB2rLJpH2lgx0TRw5EJrBxOZQ+wCcyPVQvS8tjEHpQ== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-validator-option" "^7.16.7" - "@babel/plugin-transform-typescript" "^7.16.7" - -"@babel/runtime@^7.0.0", "@babel/runtime@^7.10.1", "@babel/runtime@^7.11.1", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.14.5", "@babel/runtime@^7.4.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.16.7.tgz#03ff99f64106588c9c403c6ecb8c3bafbbdff1fa" - integrity sha512-9E9FJowqAsytyOY6LG+1KuueckRL+aQW+mKvXRXnuFGyRAyepJPmEo9vgMfXUA6O9u3IeEdv9MAkppFcaQwogQ== - dependencies: - regenerator-runtime "^0.13.4" +"@babel/preset-react@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.22.5.tgz#c4d6058fbf80bccad02dd8c313a9aaa67e3c3dd6" + integrity sha512-M+Is3WikOpEJHgR385HbuCITPTaPRaNkibTEa9oiofmJvIsrceb4yp9RL9Kb+TE8LznmeyZqpP+Lopwcx59xPQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-option" "^7.22.5" + "@babel/plugin-transform-react-display-name" "^7.22.5" + "@babel/plugin-transform-react-jsx" "^7.22.5" + "@babel/plugin-transform-react-jsx-development" "^7.22.5" + "@babel/plugin-transform-react-pure-annotations" "^7.22.5" + +"@babel/preset-typescript@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.22.5.tgz#16367d8b01d640e9a507577ed4ee54e0101e51c8" + integrity sha512-YbPaal9LxztSGhmndR46FmAbkJ/1fAsw293tSU+I5E5h+cnJ3d4GTwyUgGYmOXJYdGA+uNePle4qbaRzj2NISQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-option" "^7.22.5" + "@babel/plugin-syntax-jsx" "^7.22.5" + "@babel/plugin-transform-modules-commonjs" "^7.22.5" + "@babel/plugin-transform-typescript" "^7.22.5" + +"@babel/regjsgen@^0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" + integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== -"@babel/runtime@^7.14.6", "@babel/runtime@^7.17.2": +"@babel/runtime@^7.0.0", "@babel/runtime@^7.10.1", "@babel/runtime@^7.11.1", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.14.5", "@babel/runtime@^7.14.6", "@babel/runtime@^7.17.2", "@babel/runtime@^7.4.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.18.6.tgz#6a1ef59f838debd670421f8c7f2cbb8da9751580" integrity sha512-t9wi7/AW6XtKahAe20Yw0/mMljKq0B1r2fPdvaAdV/KPDZewFXdaaa6K7lxmZBZ8FBNpCiAT6iHPmd6QO9bKfQ== dependencies: regenerator-runtime "^0.13.4" -"@babel/template@^7.16.7", "@babel/template@^7.4.0": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.7.tgz#8d126c8701fde4d66b264b3eba3d96f07666d155" - integrity sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w== - dependencies: - "@babel/code-frame" "^7.16.7" - "@babel/parser" "^7.16.7" - "@babel/types" "^7.16.7" - -"@babel/traverse@^7.13.0", "@babel/traverse@^7.16.7", "@babel/traverse@^7.4.3", "@babel/traverse@^7.4.5": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.16.7.tgz#dac01236a72c2560073658dd1a285fe4e0865d76" - integrity sha512-8KWJPIb8c2VvY8AJrydh6+fVRo2ODx1wYBU2398xJVq0JomuLBZmVQzLPBblJgHIGYG4znCpUZUZ0Pt2vdmVYQ== - dependencies: - "@babel/code-frame" "^7.16.7" - "@babel/generator" "^7.16.7" - "@babel/helper-environment-visitor" "^7.16.7" - "@babel/helper-function-name" "^7.16.7" - "@babel/helper-hoist-variables" "^7.16.7" - "@babel/helper-split-export-declaration" "^7.16.7" - "@babel/parser" "^7.16.7" - "@babel/types" "^7.16.7" +"@babel/template@^7.16.7", "@babel/template@^7.22.5", "@babel/template@^7.4.0": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.5.tgz#0c8c4d944509875849bd0344ff0050756eefc6ec" + integrity sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw== + dependencies: + "@babel/code-frame" "^7.22.5" + "@babel/parser" "^7.22.5" + "@babel/types" "^7.22.5" + +"@babel/traverse@^7.16.7", "@babel/traverse@^7.22.6", "@babel/traverse@^7.22.8", "@babel/traverse@^7.4.3", "@babel/traverse@^7.4.5": + version "7.22.8" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.8.tgz#4d4451d31bc34efeae01eac222b514a77aa4000e" + integrity sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw== + dependencies: + "@babel/code-frame" "^7.22.5" + "@babel/generator" "^7.22.7" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/parser" "^7.22.7" + "@babel/types" "^7.22.5" debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.0.0-beta.49", "@babel/types@^7.16.0", "@babel/types@^7.16.7", "@babel/types@^7.4.0", "@babel/types@^7.4.4": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.16.7.tgz#4ed19d51f840ed4bd5645be6ce40775fecf03159" - integrity sha512-E8HuV7FO9qLpx6OtoGfUQ2cjIYnbFwvZWYBS+87EwtdMvmUPJSwykpovFB+8insbpF0uJcpr8KMUi64XZntZcg== +"@babel/types@^7.0.0-beta.49", "@babel/types@^7.16.7", "@babel/types@^7.22.5", "@babel/types@^7.4.0", "@babel/types@^7.4.4": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.5.tgz#cd93eeaab025880a3a47ec881f4b096a5b786fbe" + integrity sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA== dependencies: - "@babel/helper-validator-identifier" "^7.16.7" + "@babel/helper-string-parser" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.5" to-fast-properties "^2.0.0" "@emotion/cache@^10.0.27", "@emotion/cache@^10.0.9": @@ -1144,6 +1223,43 @@ resolved "https://registry.yarnpkg.com/@icons/material/-/material-0.2.4.tgz#e90c9f71768b3736e76d7dd6783fc6c2afa88bc8" integrity sha512-QPcGmICAPbGLGb6F/yNf/KzKqvFx8z5qx3D1yFqVAjoFmXK35EgyW+cJ57Te3CNsmzblwtzakLGFqHPqrfb4Tw== +"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" + integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/resolve-uri@3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" + integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== + +"@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + +"@jridgewell/sourcemap-codec@1.4.14": + version "1.4.14" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== + +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + +"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.18" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz#25783b2086daf6ff1dcb53c9249ae480e4dd4cd6" + integrity sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA== + dependencies: + "@jridgewell/resolve-uri" "3.1.0" + "@jridgewell/sourcemap-codec" "1.4.14" + "@juggle/resize-observer@^3.3.1": version "3.4.0" resolved "https://registry.yarnpkg.com/@juggle/resize-observer/-/resize-observer-3.4.0.tgz#08d6c5e20cf7e4cc02fd181c4b0c225cd31dbb60" @@ -2285,7 +2401,7 @@ anymatch@^2.0.0: micromatch "^3.1.4" normalize-path "^2.1.1" -anymatch@^3.0.0: +anymatch@^3.0.0, anymatch@~3.1.2: version "3.1.3" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== @@ -2293,14 +2409,6 @@ anymatch@^3.0.0: normalize-path "^3.0.0" picomatch "^2.0.4" -anymatch@~3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" - integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - append-buffer@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/append-buffer/-/append-buffer-1.0.2.tgz#d8220cf466081525efea50614f3de6514dfa58f1" @@ -2655,13 +2763,6 @@ babel-messages@^6.23.0: dependencies: babel-runtime "^6.22.0" -babel-plugin-dynamic-import-node@^2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" - integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== - dependencies: - object.assign "^4.1.0" - babel-plugin-emotion@^10.0.27: version "10.2.2" resolved "https://registry.yarnpkg.com/babel-plugin-emotion/-/babel-plugin-emotion-10.2.2.tgz#a1fe3503cff80abfd0bdda14abd2e8e57a79d17d" @@ -2705,29 +2806,29 @@ babel-plugin-macros@^2.0.0: cosmiconfig "^6.0.0" resolve "^1.12.0" -babel-plugin-polyfill-corejs2@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.0.tgz#407082d0d355ba565af24126fb6cb8e9115251fd" - integrity sha512-wMDoBJ6uG4u4PNFh72Ty6t3EgfA91puCuAwKIazbQlci+ENb/UU9A3xG5lutjUIiXCIn1CY5L15r9LimiJyrSA== +babel-plugin-polyfill-corejs2@^0.4.4: + version "0.4.5" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.5.tgz#8097b4cb4af5b64a1d11332b6fb72ef5e64a054c" + integrity sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg== dependencies: - "@babel/compat-data" "^7.13.11" - "@babel/helper-define-polyfill-provider" "^0.3.0" - semver "^6.1.1" + "@babel/compat-data" "^7.22.6" + "@babel/helper-define-polyfill-provider" "^0.4.2" + semver "^6.3.1" -babel-plugin-polyfill-corejs3@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.4.0.tgz#0b571f4cf3d67f911512f5c04842a7b8e8263087" - integrity sha512-YxFreYwUfglYKdLUGvIF2nJEsGwj+RhWSX/ije3D2vQPOXuyMLMtg/cCGMDpOA7Nd+MwlNdnGODbd2EwUZPlsw== +babel-plugin-polyfill-corejs3@^0.8.2: + version "0.8.3" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.3.tgz#b4f719d0ad9bb8e0c23e3e630c0c8ec6dd7a1c52" + integrity sha512-z41XaniZL26WLrvjy7soabMXrfPWARN25PZoriDEiLMxAp50AUW3t35BGQUMg5xK3UrpVTtagIDklxYa+MhiNA== dependencies: - "@babel/helper-define-polyfill-provider" "^0.3.0" - core-js-compat "^3.18.0" + "@babel/helper-define-polyfill-provider" "^0.4.2" + core-js-compat "^3.31.0" -babel-plugin-polyfill-regenerator@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.0.tgz#9ebbcd7186e1a33e21c5e20cae4e7983949533be" - integrity sha512-dhAPTDLGoMW5/84wkgwiLRwMnio2i1fUe53EuvtKMv0pn2p3S8OCoV1xAzfJPl0KOX7IB89s2ib85vbYiea3jg== +babel-plugin-polyfill-regenerator@^0.5.1: + version "0.5.2" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.2.tgz#80d0f3e1098c080c8b5a65f41e9427af692dc326" + integrity sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA== dependencies: - "@babel/helper-define-polyfill-provider" "^0.3.0" + "@babel/helper-define-polyfill-provider" "^0.4.2" "babel-plugin-styled-components@>= 1.12.0": version "2.0.2" @@ -3081,16 +3182,15 @@ browserify-zlib@^0.2.0: dependencies: pako "~1.0.5" -browserslist@^4.17.5, browserslist@^4.19.1: - version "4.19.1" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.19.1.tgz#4ac0435b35ab655896c31d53018b6dd5e9e4c9a3" - integrity sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A== +browserslist@^4.17.5, browserslist@^4.21.9: + version "4.21.9" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.9.tgz#e11bdd3c313d7e2a9e87e8b4b0c7872b13897635" + integrity sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg== dependencies: - caniuse-lite "^1.0.30001286" - electron-to-chromium "^1.4.17" - escalade "^3.1.1" - node-releases "^2.0.1" - picocolors "^1.0.0" + caniuse-lite "^1.0.30001503" + electron-to-chromium "^1.4.431" + node-releases "^2.0.12" + update-browserslist-db "^1.0.11" browserstack-local@^1.3.7: version "1.4.8" @@ -3281,10 +3381,10 @@ camelize@^1.0.0: resolved "https://registry.yarnpkg.com/camelize/-/camelize-1.0.0.tgz#164a5483e630fa4321e5af07020e531831b2609b" integrity sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs= -caniuse-lite@^1.0.30001286: - version "1.0.30001298" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001298.tgz#0e690039f62e91c3ea581673d716890512e7ec52" - integrity sha512-AcKqikjMLlvghZL/vfTHorlQsLDhGRalYf1+GmWCf5SCMziSGjRYQW/JEksj14NaYHIR6KIhrFAy0HV5C25UzQ== +caniuse-lite@^1.0.30001286, caniuse-lite@^1.0.30001503: + version "1.0.30001517" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001517.tgz#90fabae294215c3495807eb24fc809e11dc2f0a8" + integrity sha512-Vdhm5S11DaFVLlyiKu4hiUTkpZu+y1KA/rZZqVQfOD5YdDT/eQKlkt7NaE0WGOFgX32diqt9MiP9CAiFeRklaA== caseless@~0.12.0: version "0.12.0" @@ -3352,22 +3452,7 @@ chokidar@^2.0.0, chokidar@^2.1.8: optionalDependencies: fsevents "^1.2.7" -chokidar@^3.0.0, chokidar@^3.4.1: - version "3.5.2" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75" - integrity sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ== - dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" - optionalDependencies: - fsevents "~2.3.2" - -chokidar@^3.4.2: +chokidar@^3.0.0, chokidar@^3.4.1, chokidar@^3.4.2: version "3.5.3" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== @@ -3791,13 +3876,12 @@ copy-webpack-plugin@^6.4.0: serialize-javascript "^5.0.1" webpack-sources "^1.4.3" -core-js-compat@^3.18.0, core-js-compat@^3.19.1: - version "3.20.2" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.20.2.tgz#d1ff6936c7330959b46b2e08b122a8b14e26140b" - integrity sha512-qZEzVQ+5Qh6cROaTPFLNS4lkvQ6mBzE3R6A6EEpssj7Zr2egMHgsy4XapdifqJDGC9CBiNv7s+ejI96rLNQFdg== +core-js-compat@^3.31.0: + version "3.32.0" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.32.0.tgz#f41574b6893ab15ddb0ac1693681bd56c8550a90" + integrity sha512-7a9a3D1k4UCVKnLhrgALyFcP7YCsLOQIxPd0dKjf/6GuPcgyiGP70ewWdCGrSK7evyhymi0qO4EqCmSJofDeYw== dependencies: - browserslist "^4.19.1" - semver "7.0.0" + browserslist "^4.21.9" core-js@^2.4.0: version "2.6.12" @@ -4633,26 +4717,14 @@ domhandler@^2.3.0: dependencies: domelementtype "1" -domhandler@^4.0, domhandler@^4.2.2: +domhandler@^4.0, domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.2.2, domhandler@^4.3.0: version "4.3.1" resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.1.tgz#8d792033416f59d68bc03a5aa7b018c1ca89279c" integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ== dependencies: domelementtype "^2.2.0" -domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.0.tgz#16c658c626cf966967e306f966b431f77d4a5626" - integrity sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g== - dependencies: - domelementtype "^2.2.0" - -dompurify@^2.0.7: - version "2.3.4" - resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.3.4.tgz#1cf5cf0105ccb4debdf6db162525bd41e6ddacc6" - integrity sha512-6BVcgOAVFXjI0JTjEvZy901Rghm+7fDQOrNIcxB4+gdhj6Kwp6T9VBhBY/AbagKHJocRkDYGd6wvI+p4/10xtQ== - -dompurify@^2.3.3: +dompurify@^2.0.7, dompurify@^2.3.3: version "2.3.5" resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.3.5.tgz#c83ed5a3ae5ce23e52efe654ea052ffb358dd7e3" integrity sha512-kD+f8qEaa42+mjdOpKeztu9Mfx5bv9gVLO6K9jRx4uGvh6Wv06Srn4jr1wPNY2OOUGGSKHNFN+A8MA3v0E0QAQ== @@ -4722,10 +4794,10 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -electron-to-chromium@^1.4.17: - version "1.4.38" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.38.tgz#10ea58d73d36b13e78d5024f3b74a352d3958d01" - integrity sha512-WhHt3sZazKj0KK/UpgsbGQnUUoFeAHVishzHFExMxagpZgjiGYSC9S0ZlbhCfSH2L2i+2A1yyqOIliTctMx7KQ== +electron-to-chromium@^1.4.17, electron-to-chromium@^1.4.431: + version "1.4.477" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.477.tgz#05669aa6f161ee9076a6805457e9bd9fe6d0dfd1" + integrity sha512-shUVy6Eawp33dFBFIoYbIwLHrX0IZ857AlH9ug2o4rvbWmpaCUdBpQ5Zw39HRrfzAFm4APJE9V+E2A/WB0YqJw== elliptic@^6.5.3: version "6.5.4" @@ -5886,16 +5958,7 @@ get-caller-file@^2.0.1: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" - integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== - dependencies: - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.1" - -get-intrinsic@^1.1.3: +get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3: version "1.2.0" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.0.tgz#7ad1dc0535f3a2904bba075772763e5051f6d05f" integrity sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q== @@ -5998,19 +6061,7 @@ glob-watcher@^5.0.3: normalize-path "^3.0.0" object.defaults "^1.1.0" -glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4: - version "7.2.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" - integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@^7.1.6: +glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== @@ -6258,12 +6309,7 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-symbols@^1.0.1, has-symbols@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" - integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== - -has-symbols@^1.0.3: +has-symbols@^1.0.1, has-symbols@^1.0.2, has-symbols@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== @@ -7487,12 +7533,10 @@ json5@^1.0.1: dependencies: minimist "^1.2.0" -json5@^2.1.0, json5@^2.1.2, json5@^2.1.3: - version "2.2.0" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" - integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA== - dependencies: - minimist "^1.2.5" +json5@^2.1.0, json5@^2.1.2, json5@^2.1.3, json5@^2.2.2: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== jsonfile@^4.0.0: version "4.0.0" @@ -8253,20 +8297,20 @@ minimalistic-crypto-utils@^1.0.1: resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= -minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4, minimatch@~3.0.2: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== - dependencies: - brace-expansion "^1.1.7" - -minimatch@^3.1.1: +minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4, minimatch@^3.1.1: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" +minimatch@~3.0.2: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + minimist-options@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" @@ -8281,12 +8325,7 @@ minimist@1.2.0: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= -minimist@^1.2.0, minimist@^1.2.5, minimist@~1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" - integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== - -minimist@^1.2.8: +minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.8, minimist@~1.2.5: version "1.2.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== @@ -8317,14 +8356,7 @@ minipass-pipeline@^1.2.2: dependencies: minipass "^3.0.0" -minipass@^3.0.0: - version "3.1.6" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.6.tgz#3b8150aa688a711a1521af5e8779c1d3bb4f45ee" - integrity sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ== - dependencies: - yallist "^4.0.0" - -minipass@^3.1.1: +minipass@^3.0.0, minipass@^3.1.1: version "3.3.4" resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.4.tgz#ca99f95dd77c43c7a76bf51e6d200025eee0ffae" integrity sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw== @@ -8547,20 +8579,13 @@ no-case@^2.2.0: dependencies: lower-case "^1.1.1" -node-fetch@2.6.7: +node-fetch@2.6.7, node-fetch@^2.6.1: version "2.6.7" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== dependencies: whatwg-url "^5.0.0" -node-fetch@^2.6.1: - version "2.6.6" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.6.tgz#1751a7c01834e8e1697758732e9efb6eeadfaf89" - integrity sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA== - dependencies: - whatwg-url "^5.0.0" - node-forge@^0.10.0: version "0.10.0" resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.10.0.tgz#32dea2afb3e9926f02ee5ce8794902691a676bf3" @@ -8634,10 +8659,10 @@ node-notifier@^8.0.2: uuid "^8.3.0" which "^2.0.2" -node-releases@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.1.tgz#3d1d395f204f1f2f29a54358b9fb678765ad2fc5" - integrity sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA== +node-releases@^2.0.1, node-releases@^2.0.12: + version "2.0.13" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.13.tgz#d5ed1627c23e3461e819b02e57b75e4899b1c81d" + integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ== node-sass@^6.0.1: version "6.0.1" @@ -9935,6 +9960,11 @@ react-dom@^16.14.0: prop-types "^15.6.2" scheduler "^0.19.1" +react-ga4@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/react-ga4/-/react-ga4-2.1.0.tgz#56601f59d95c08466ebd6edfbf8dede55c4678f9" + integrity sha512-ZKS7PGNFqqMd3PJ6+C2Jtz/o1iU9ggiy8Y8nUeksgVuvNISbmrQtJiZNvC/TjDsqD0QlU5Wkgs7i+w9+OjHhhQ== + react-i18next@^11.18.0: version "11.18.0" resolved "https://registry.yarnpkg.com/react-i18next/-/react-i18next-11.18.0.tgz#38ec26e07f030f7f0109b3665759954dad2cc7f9" @@ -10178,6 +10208,13 @@ reduce-function-call@^1.0.1: dependencies: balanced-match "^1.0.0" +regenerate-unicode-properties@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz#7c3192cab6dd24e21cb4461e5ddd7dd24fa8374c" + integrity sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ== + dependencies: + regenerate "^1.4.2" + regenerate-unicode-properties@^9.0.0: version "9.0.0" resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz#54d09c7115e1f53dc2314a974b32c1c344efe326" @@ -10200,10 +10237,10 @@ regenerator-runtime@^0.13.2, regenerator-runtime@^0.13.4: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== -regenerator-transform@^0.14.2: - version "0.14.5" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.5.tgz#c98da154683671c9c4dcb16ece736517e1b7feb4" - integrity sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw== +regenerator-transform@^0.15.1: + version "0.15.1" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.1.tgz#f6c4e99fc1b4591f780db2586328e4d9a9d8dc56" + integrity sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg== dependencies: "@babel/runtime" "^7.8.4" @@ -10245,6 +10282,18 @@ regexpu-core@^4.7.1: unicode-match-property-ecmascript "^2.0.0" unicode-match-property-value-ecmascript "^2.0.0" +regexpu-core@^5.3.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.3.2.tgz#11a2b06884f3527aec3e93dbbf4a3b958a95546b" + integrity sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ== + dependencies: + "@babel/regjsgen" "^0.8.0" + regenerate "^1.4.2" + regenerate-unicode-properties "^10.1.0" + regjsparser "^0.9.1" + unicode-match-property-ecmascript "^2.0.0" + unicode-match-property-value-ecmascript "^2.1.0" + regjsgen@^0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.2.tgz#92ff295fb1deecbf6ecdab2543d207e91aa33733" @@ -10257,6 +10306,13 @@ regjsparser@^0.7.0: dependencies: jsesc "~0.5.0" +regjsparser@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709" + integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ== + dependencies: + jsesc "~0.5.0" + relateurl@0.2.x: version "0.2.7" resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" @@ -10751,24 +10807,12 @@ semver-greatest-satisfied-range@^1.1.0: resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -semver@7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" - integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== - -semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== - -semver@^7.2.1, semver@^7.3.2, semver@^7.3.4: - version "7.3.5" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" - integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== - dependencies: - lru-cache "^6.0.0" +semver@^6.0.0, semver@^6.3.0, semver@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.3.5: +semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5: version "7.3.7" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== @@ -12131,10 +12175,10 @@ unicode-match-property-ecmascript@^2.0.0: unicode-canonical-property-names-ecmascript "^2.0.0" unicode-property-aliases-ecmascript "^2.0.0" -unicode-match-property-value-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz#1a01aa57247c14c568b89775a54938788189a714" - integrity sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw== +unicode-match-property-value-ecmascript@^2.0.0, unicode-match-property-value-ecmascript@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz#cb5fffdcd16a05124f5a4b0bf7c3770208acbbe0" + integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA== unicode-property-aliases-ecmascript@^2.0.0: version "2.0.0" @@ -12206,6 +12250,14 @@ upath@^1.1.1: resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== +update-browserslist-db@^1.0.11: + version "1.0.11" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz#9a2a641ad2907ae7b3616506f4b977851db5b940" + integrity sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + upper-case@^1.1.1: version "1.1.3" resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598" From dab991175a9b38f0f2ade26c6ed9018e10d72eec Mon Sep 17 00:00:00 2001 From: Nanda Date: Tue, 1 Aug 2023 13:34:39 +1000 Subject: [PATCH 233/654] Fix timefilter bug. --- lib/ModelMixins/TimeFilterMixin.ts | 138 +++++++---- lib/Models/Cesium.ts | 38 --- lib/Models/Feature/Feature.ts | 22 +- lib/Models/GlobeOrMap.ts | 21 +- lib/Models/Leaflet.ts | 46 +--- lib/Models/NoViewer.ts | 13 - test/ModelMixins/TimeFilterMixinSpec.ts | 300 +++++++++++++++++++++++- 7 files changed, 409 insertions(+), 169 deletions(-) diff --git a/lib/ModelMixins/TimeFilterMixin.ts b/lib/ModelMixins/TimeFilterMixin.ts index 1eb42bd78fc..1bed1a49b5f 100644 --- a/lib/ModelMixins/TimeFilterMixin.ts +++ b/lib/ModelMixins/TimeFilterMixin.ts @@ -6,10 +6,13 @@ import { makeObservable, override } from "mobx"; +import Cartographic from "terriajs-cesium/Source/Core/Cartographic"; import Ellipsoid from "terriajs-cesium/Source/Core/Ellipsoid"; import JulianDate from "terriajs-cesium/Source/Core/JulianDate"; import CesiumMath from "terriajs-cesium/Source/Core/Math"; import Entity from "terriajs-cesium/Source/DataSources/Entity"; +import ImageryLayerFeatureInfo from "terriajs-cesium/Source/Scene/ImageryLayerFeatureInfo"; +import ImageryProvider from "terriajs-cesium/Source/Scene/ImageryProvider"; import AbstractConstructor from "../Core/AbstractConstructor"; import filterOutUndefined from "../Core/filterOutUndefined"; import LatLonHeight from "../Core/LatLonHeight"; @@ -21,6 +24,7 @@ import { import CommonStrata from "../Models/Definition/CommonStrata"; import createStratumInstance from "../Models/Definition/createStratumInstance"; import Model from "../Models/Definition/Model"; +import TerriaFeature from "../Models/Feature/Feature"; import TimeFilterTraits, { TimeFilterCoordinates } from "../Traits/TraitsClasses/TimeFilterTraits"; @@ -70,28 +74,78 @@ function TimeFilterMixin>(Base: T) { }); } + /** + * Loads the time filter by querying the imagery layers at the given + * co-ordinates. + * + * @param coordinates.position The lat, lon, height of the location to pick in degrees + * @param coordinates.tileCoords the x, y, level co-ordinates of the tile to pick + * @returns Promise that fulfills when the picking is complete. + * The promise resolves to `false` if the filter could not be set for some reason. + */ @action async setTimeFilterFromLocation(coordinates: { position: LatLonHeight; tileCoords: ProviderCoords; }): Promise { - const propertyName = this.timeFilterPropertyName; - if (propertyName === undefined || !MappableMixin.isMixedInto(this)) { + const timeProperty = this.timeFilterPropertyName; + if ( + this.terria.allowFeatureInfoRequests === false || + timeProperty === undefined || + !MappableMixin.isMixedInto(this) + ) { return false; } - const resolved = await resolveFeature( - this, - propertyName, - coordinates.position, - coordinates.tileCoords + const pickTileCoordinates = coordinates.tileCoords; + const pickCartographicPosition = Cartographic.fromDegrees( + coordinates.position.longitude, + coordinates.position.latitude, + coordinates.position.height + ); + + // Pick all imagery provider for this item + const imageryProviders = filterOutUndefined( + this.mapItems.map((mapItem) => + ImageryParts.is(mapItem) ? mapItem.imageryProvider : undefined + ) + ); + const picks = await pickImageryProviders( + imageryProviders, + pickTileCoordinates, + pickCartographicPosition ); - if (resolved) { - this.setTimeFilterFeature(resolved.feature, resolved.providers); - return true; + // Find the first imageryProvider and feature with a matching time property + let timeFeature: TerriaFeature | undefined; + let imageryUrl: string | undefined; + for (let i = 0; i < picks.length; i++) { + const pick = picks[i]; + const imageryFeature = pick.imageryFeatures.find( + (f) => f.properties[timeProperty] !== undefined + ); + imageryUrl = (pick.imageryProvider as any).url; + if (imageryFeature && imageryUrl) { + imageryFeature.position = + imageryFeature.position ?? pickCartographicPosition; + timeFeature = + TerriaFeature.fromImageryLayerFeatureInfo(imageryFeature); + break; + } + } + + if (!timeFeature || !imageryUrl) { + return false; } - return false; + + // Update time filter + this.setTimeFilterFeature(timeFeature, { + [imageryUrl]: { + ...coordinates.position, + ...coordinates.tileCoords + } + }); + return true; } get hasTimeFilterMixin() { @@ -213,43 +267,35 @@ namespace TimeFilterMixin { } /** - * Return the feature at position containing the time filter property. + * Picks all the imagery providers at the given coordinates and return a + * promise that resolves to the (imageryProvider, imageryFeatures) pairs. */ -const resolveFeature = action(async function ( - model: MappableMixin.Instance & TimeVarying, - propertyName: string, - position: LatLonHeight, - tileCoords: ProviderCoords -) { - const { latitude, longitude, height } = position; - const { x, y, level } = tileCoords; - const providers: ProviderCoordsMap = {}; - model.mapItems.forEach((mapItem) => { - if (ImageryParts.is(mapItem)) { - // @ts-ignore - providers[mapItem.imageryProvider.url] = { x, y, level }; - } - }); - const viewer = model.terria.mainViewer.currentViewer; - const features = await viewer.getFeaturesAtLocation( - { latitude, longitude, height }, - providers +async function pickImageryProviders( + imageryProviders: ImageryProvider[], + pickCoordinates: ProviderCoords, + pickPosition: Cartographic +): Promise< + { + imageryProvider: ImageryProvider; + imageryFeatures: ImageryLayerFeatureInfo[]; + }[] +> { + return filterOutUndefined( + await Promise.all( + imageryProviders.map((imageryProvider) => + imageryProvider + .pickFeatures( + pickCoordinates.x, + pickCoordinates.y, + pickCoordinates.level, + pickPosition.longitude, + pickPosition.latitude + ) + ?.then((imageryFeatures) => ({ imageryProvider, imageryFeatures })) + ) + ) ); - - const feature = (features || []).find((feature) => { - if (!feature.properties) { - return false; - } - - const prop = feature.properties[propertyName]; - const times = prop?.getValue(model.currentTimeAsJulianDate); - return Array.isArray(times) && times.length > 0; - }); - - if (feature) { - return { feature, providers }; - } -}); +} function coordinatesFromTraits(traits: Model) { const { diff --git a/lib/Models/Cesium.ts b/lib/Models/Cesium.ts index 2d0582fd45a..4ddda5ab67a 100644 --- a/lib/Models/Cesium.ts +++ b/lib/Models/Cesium.ts @@ -1358,44 +1358,6 @@ export default class Cesium extends GlobeOrMap { } } - /** - * Return features at a latitude, longitude and (optionally) height for the given imagery layers. - * @param latLngHeight The position on the earth to pick - * @param tileCoords A map of imagery provider urls to the tile coords used to get features for those imagery - * @returns A flat array of all the features for the given tiles that are currently on the map - */ - async getFeaturesAtLocation( - latLngHeight: LatLonHeight, - providerCoords: ProviderCoordsMap, - existingFeatures: TerriaFeature[] = [] - ) { - const pickPosition = this.scene.globe.ellipsoid.cartographicToCartesian( - Cartographic.fromDegrees( - latLngHeight.longitude, - latLngHeight.latitude, - latLngHeight.height - ) - ); - const pickPositionCartographic = - Ellipsoid.WGS84.cartesianToCartographic(pickPosition); - - const promises = this.terria.allowFeatureInfoRequests - ? this.pickImageryLayerFeatures(pickPositionCartographic, providerCoords) - : []; - - const pickedFeatures = this._buildPickedFeatures( - providerCoords, - pickPosition, - existingFeatures, - filterOutUndefined(promises), - pickPositionCartographic.height, - false - ); - - await pickedFeatures.allFeaturesAvailablePromise; - return pickedFeatures.features; - } - private pickImageryLayerFeatures( pickPosition: Cartographic, providerCoords: ProviderCoordsMap diff --git a/lib/Models/Feature/Feature.ts b/lib/Models/Feature/Feature.ts index 48032eb8cd7..a8f8c431d98 100644 --- a/lib/Models/Feature/Feature.ts +++ b/lib/Models/Feature/Feature.ts @@ -1,8 +1,11 @@ -import { observable, makeObservable } from "mobx"; +import { makeObservable, observable } from "mobx"; +import Ellipsoid from "terriajs-cesium/Source/Core/Ellipsoid"; +import ConstantPositionProperty from "terriajs-cesium/Source/DataSources/ConstantPositionProperty"; import Entity from "terriajs-cesium/Source/DataSources/Entity"; import Cesium3DTileFeature from "terriajs-cesium/Source/Scene/Cesium3DTileFeature"; import Cesium3DTilePointFeature from "terriajs-cesium/Source/Scene/Cesium3DTilePointFeature"; import ImageryLayer from "terriajs-cesium/Source/Scene/ImageryLayer"; +import ImageryLayerFeatureInfo from "terriajs-cesium/Source/Scene/ImageryLayerFeatureInfo"; import { JsonObject } from "../../Core/Json"; import { BaseModel } from "../Definition/Model"; import { TerriaFeatureData } from "./FeatureData"; @@ -73,6 +76,23 @@ export default class TerriaFeature extends Entity { } return feature; } + + static fromImageryLayerFeatureInfo(imageryFeature: ImageryLayerFeatureInfo) { + const feature = new TerriaFeature({ + id: imageryFeature.name, + name: imageryFeature.name, + description: imageryFeature.description, + properties: imageryFeature.properties + }); + feature.data = imageryFeature.data; + feature.imageryLayer = imageryFeature.imageryLayer; + if (imageryFeature.position) { + feature.position = new ConstantPositionProperty( + Ellipsoid.WGS84.cartographicToCartesian(imageryFeature.position) + ); + } + return feature; + } } // Features have 'entityCollection', 'properties' and 'data' properties, which we must add to the entity's property list, diff --git a/lib/Models/GlobeOrMap.ts b/lib/Models/GlobeOrMap.ts index a9c1f80d578..4b60ab3bf65 100644 --- a/lib/Models/GlobeOrMap.ts +++ b/lib/Models/GlobeOrMap.ts @@ -1,10 +1,4 @@ -import { - action, - computed, - observable, - runInAction, - makeObservable -} from "mobx"; +import { action, makeObservable, observable, runInAction } from "mobx"; import Cartesian2 from "terriajs-cesium/Source/Core/Cartesian2"; import Cartesian3 from "terriajs-cesium/Source/Core/Cartesian3"; import Color from "terriajs-cesium/Source/Core/Color"; @@ -15,9 +9,7 @@ import Rectangle from "terriajs-cesium/Source/Core/Rectangle"; import ColorMaterialProperty from "terriajs-cesium/Source/DataSources/ColorMaterialProperty"; import ConstantPositionProperty from "terriajs-cesium/Source/DataSources/ConstantPositionProperty"; import ConstantProperty from "terriajs-cesium/Source/DataSources/ConstantProperty"; -import Entity from "terriajs-cesium/Source/DataSources/Entity"; import ImageryLayerFeatureInfo from "terriajs-cesium/Source/Scene/ImageryLayerFeatureInfo"; -import ImageryProvider from "terriajs-cesium/Source/Scene/ImageryProvider"; import SplitDirection from "terriajs-cesium/Source/Scene/SplitDirection"; import isDefined from "../Core/isDefined"; import { isJsonObject } from "../Core/Json"; @@ -141,17 +133,6 @@ export default abstract class GlobeOrMap { existingFeatures: TerriaFeature[] ): void; - /** - * Return features at a latitude, longitude and (optionally) height for the given imagery layers. - * @param latLngHeight The position on the earth to pick - * @param providerCoords A map of imagery provider urls to the tile coords used to get features for those imagery - * @returns A flat array of all the features for the given tiles that are currently on the map - */ - abstract getFeaturesAtLocation( - latLngHeight: LatLonHeight, - providerCoords: ProviderCoordsMap - ): Promise | void; - /** * Creates a {@see Feature} (based on an {@see Entity}) from a {@see ImageryLayerFeatureInfo}. * @param imageryFeature The imagery layer feature for which to create an entity-based feature. diff --git a/lib/Models/Leaflet.ts b/lib/Models/Leaflet.ts index ea67c99fdbc..84af5588269 100644 --- a/lib/Models/Leaflet.ts +++ b/lib/Models/Leaflet.ts @@ -1,13 +1,12 @@ -import i18next from "i18next"; import { GridLayer } from "leaflet"; import { action, autorun, computed, + makeObservable, observable, reaction, - runInAction, - makeObservable + runInAction } from "mobx"; import { computedFn } from "mobx-utils"; import cesiumCancelAnimationFrame from "terriajs-cesium/Source/Core/cancelAnimationFrame"; @@ -61,7 +60,6 @@ import hasTraits from "./Definition/hasTraits"; import TerriaFeature from "./Feature/Feature"; import GlobeOrMap from "./GlobeOrMap"; import { LeafletAttribution } from "./LeafletAttribution"; -import MapInteractionMode from "./MapInteractionMode"; import Terria from "./Terria"; // We want TS to look at the type declared in lib/ThirdParty/terriajs-cesium-extra/index.d.ts @@ -583,46 +581,6 @@ export default class Leaflet extends GlobeOrMap { ); } - /** - * Return features at a latitude, longitude and (optionally) height for the given imageryLayer. - * @param latLngHeight The position on the earth to pick - * @param providerCoords A map of imagery provider urls to the tile coords used to get features for those imagery - * @returns A flat array of all the features for the given tiles that are currently on the map - */ - @action - async getFeaturesAtLocation( - latLngHeight: LatLonHeight, - providerCoords: ProviderCoordsMap - ) { - const pickMode = new MapInteractionMode({ - message: i18next.t("models.imageryLayer.resolvingAvailability"), - onCancel: () => { - this.terria.mapInteractionModeStack.pop(); - } - }); - this.terria.mapInteractionModeStack.push(pickMode); - this._pickFeatures( - L.latLng({ - lat: latLngHeight.latitude, - lng: latLngHeight.longitude, - alt: latLngHeight.height - }), - providerCoords, - [], - true - ); - - if (pickMode.pickedFeatures) { - const pickedFeatures = pickMode.pickedFeatures; - await pickedFeatures.allFeaturesAvailablePromise; - } - - return runInAction(() => { - this.terria.mapInteractionModeStack.pop(); - return pickMode.pickedFeatures?.features; - }); - } - /* * There are two "listeners" for clicks which are set up in our constructor. * - One fires for any click: `map.on('click', ...`. It calls `pickFeatures`. diff --git a/lib/Models/NoViewer.ts b/lib/Models/NoViewer.ts index 1a55b88997b..6b546e1da86 100644 --- a/lib/Models/NoViewer.ts +++ b/lib/Models/NoViewer.ts @@ -1,5 +1,3 @@ -"use strict"; - import Rectangle from "terriajs-cesium/Source/Core/Rectangle"; import LatLonHeight from "../Core/LatLonHeight"; import MapboxVectorTileImageryProvider from "../Map/ImageryProvider/MapboxVectorTileImageryProvider"; @@ -47,17 +45,6 @@ class NoViewer extends GlobeOrMap { existingFeatures: TerriaFeature[] ) {} - /** - * Return features at a latitude, longitude and (optionally) height for the given imageryLayer - * @param latLngHeight The position on the earth to pick - * @param providerCoords A map of imagery provider urls to the tile coords used to get features for those imagery - * @returns A flat array of all the features for the given tiles that are currently on the map - */ - getFeaturesAtLocation( - latLngHeight: LatLonHeight, - providerCoords: ProviderCoordsMap - ) {} - getCurrentCameraView(): CameraView { return this._currentView; } diff --git a/test/ModelMixins/TimeFilterMixinSpec.ts b/test/ModelMixins/TimeFilterMixinSpec.ts index 25157c44cbb..673ef80e9c7 100644 --- a/test/ModelMixins/TimeFilterMixinSpec.ts +++ b/test/ModelMixins/TimeFilterMixinSpec.ts @@ -1,4 +1,14 @@ -import { action, computed, makeObservable } from "mobx"; +import { + action, + computed, + makeObservable, + observable, + runInAction +} from "mobx"; +import ImageryLayerFeatureInfo from "terriajs-cesium/Source/Scene/ImageryLayerFeatureInfo"; +import ImageryProvider from "terriajs-cesium/Source/Scene/ImageryProvider"; +import WebMapServiceImageryProvider from "terriajs-cesium/Source/Scene/WebMapServiceImageryProvider"; +import { DiscreteTimeAsJS } from "../../lib/ModelMixins/DiscretelyTimeVaryingMixin"; import MappableMixin from "../../lib/ModelMixins/MappableMixin"; import TimeFilterMixin from "../../lib/ModelMixins/TimeFilterMixin"; import CommonStrata from "../../lib/Models/Definition/CommonStrata"; @@ -9,11 +19,17 @@ import mixTraits from "../../lib/Traits/mixTraits"; import TimeFilterTraits from "../../lib/Traits/TraitsClasses/TimeFilterTraits"; describe("TimeFilterMixin", function () { + let terria: Terria; + + beforeEach(function () { + terria = new Terria(); + }); + describe("canFilterTimeByFeature", function () { it( "returns false if timeFilterPropertyName is not set", action(function () { - const testItem = new TestTimeFilterableItem("test", new Terria()); + const testItem = new TestTimeFilterableItem("test", terria); expect(testItem.canFilterTimeByFeature).toBe(false); }) ); @@ -21,7 +37,7 @@ describe("TimeFilterMixin", function () { it( "returns true if timeFilterPropertyName is set", action(function () { - const testItem = new TestTimeFilterableItem("test", new Terria()); + const testItem = new TestTimeFilterableItem("test", terria); testItem.setTrait( CommonStrata.user, "timeFilterPropertyName", @@ -31,23 +47,293 @@ describe("TimeFilterMixin", function () { }) ); }); + + describe("setTimeFilterFromLocation", function () { + let item: TestTimeFilterableItem; + let imageryProvider: ImageryProvider; + + beforeEach(function () { + item = new TestTimeFilterableItem("test", terria); + item.setTrait( + CommonStrata.user, + "timeFilterPropertyName", + "availabilityAtLocation" + ); + + imageryProvider = new WebMapServiceImageryProvider({ + url: "test", + layers: "testlayer" + }); + item.imageryProviders = [imageryProvider]; + + const fullAvailability = [ + "2023-01-01", + "2023-01-02", + "2023-01-03", + "2023-01-04", + "2023-01-05" + ]; + + item.discreteTimes = fullAvailability.map((time) => ({ + time, + tag: undefined + })); + }); + + it( + "loads the filter with dates available for the given location and updates the timeFilterCoordinates traits", + action(async function () { + // Set filter property to provide 2 dates from the available set + const fakeImageryFeature = new ImageryLayerFeatureInfo(); + fakeImageryFeature.properties = { + availabilityAtLocation: ["2023-01-02", "2023-01-03"] + }; + spyOn(imageryProvider, "pickFeatures").and.returnValue( + Promise.resolve([fakeImageryFeature]) + ); + + await item.setTimeFilterFromLocation({ + // Position to pick + position: { + // in degrees + latitude: -37.831, + longitude: 144.973 + }, + // Coordinates of the tiles + tileCoords: { + x: 1, + y: 2, + level: 3 + } + }); + + expect( + runInAction(() => item.discreteTimesAsSortedJulianDates)?.map((dt) => + dt.time.toString() + ) + ).toEqual(["2023-01-02T00:00:00Z", "2023-01-03T00:00:00Z"]); + }) + ); + + it("should correctly update the timeFilterCoordinates", async function () { + // Set filter property to provide 2 dates from the available set + const fakeImageryFeature = new ImageryLayerFeatureInfo(); + fakeImageryFeature.properties = { + availabilityAtLocation: ["2023-01-02", "2023-01-03"] + }; + spyOn(imageryProvider, "pickFeatures").and.returnValue( + Promise.resolve([fakeImageryFeature]) + ); + + await item.setTimeFilterFromLocation({ + // Position to pick + position: { + // in degrees + latitude: -37.831, + longitude: 144.973 + }, + // Coordinates of the tiles + tileCoords: { + x: 1, + y: 2, + level: 3 + } + }); + + const { + tile: { x, y, level }, + latitude, + longitude, + height + } = runInAction(() => item.timeFilterCoordinates); + expect({ x, y, level }).toEqual({ x: 1, y: 2, level: 3 }); + expect({ latitude, longitude, height }).toEqual({ + longitude: 144.973, + latitude: -37.831, + height: 0 + }); + }); + + describe("when there are multiple imageryProviders", function () { + it("queries all of them", async function () { + item.imageryProviders = [ + new WebMapServiceImageryProvider({ + url: "test1", + layers: "layer1" + }), + new WebMapServiceImageryProvider({ + url: "test2", + layers: "layer2" + }) + ]; + const spy0 = spyOn( + item.imageryProviders[0], + "pickFeatures" + ).and.returnValue(undefined); + const spy1 = spyOn( + item.imageryProviders[1], + "pickFeatures" + ).and.returnValue(undefined); + + await item.setTimeFilterFromLocation({ + // Position to pick + position: { + // in degrees + latitude: -37.831, + longitude: 144.973 + }, + // Coordinates of the tiles + tileCoords: { + x: 1, + y: 2, + level: 3 + } + }); + + expect(spy0).toHaveBeenCalledTimes(1); + expect(spy1).toHaveBeenCalledTimes(1); + }); + + it( + "sets the time filter from the first imageryProvider that returns a valid pick result", + action(async function () { + item.imageryProviders = [ + new WebMapServiceImageryProvider({ + url: "test1", + layers: "layer1" + }), + new WebMapServiceImageryProvider({ + url: "test2", + layers: "layer2" + }) + ]; + + const featureInfo1 = new ImageryLayerFeatureInfo(); + featureInfo1.properties = { + someprop: ["2023-01-01"] + }; + + const featureInfo2 = new ImageryLayerFeatureInfo(); + featureInfo2.properties = { + timeprop: ["2023-01-04"] + }; + + item.setTrait( + CommonStrata.user, + "timeFilterPropertyName", + "timeprop" + ); + + const spy0 = spyOn( + item.imageryProviders[0], + "pickFeatures" + ).and.returnValue(Promise.resolve([featureInfo1])); + const spy1 = spyOn( + item.imageryProviders[1], + "pickFeatures" + ).and.returnValue(Promise.resolve([featureInfo2])); + + await item.setTimeFilterFromLocation({ + // Position to pick + position: { + // in degrees + latitude: -37.831, + longitude: 144.973 + }, + // Coordinates of the tiles + tileCoords: { + x: 1, + y: 2, + level: 3 + } + }); + + expect(spy0).toHaveBeenCalledTimes(1); + expect(spy1).toHaveBeenCalledTimes(1); + + expect( + (item.discreteTimesAsSortedJulianDates ?? []).map((dt) => + dt.time.toString() + ) + ).toEqual(["2023-01-04T00:00:00Z"]); + }) + ); + }); + + it("passes the correct arguments when picking the imagery provider", async function () { + const spy = spyOn(imageryProvider, "pickFeatures").and.returnValue( + undefined + ); + + await item.setTimeFilterFromLocation({ + // Position to pick + position: { + // in degrees + latitude: -37.831, + longitude: 144.973 + }, + // Coordinates of the tiles + tileCoords: { + x: 1, + y: 2, + level: 3 + } + }); + + const [x, y, level, longitude, latitude] = spy.calls.mostRecent().args; + expect([x, y, level]).toEqual([1, 2, 3]); + expect(longitude).toBeCloseTo(2.5302); + expect(latitude).toBeCloseTo(-0.6602); + }); + + it("does nothing when terria.allowFeatureInfoRequests is set to `false`", async function () { + const pickFeatures = spyOn( + imageryProvider, + "pickFeatures" + ).and.returnValue(undefined); + + terria.allowFeatureInfoRequests = false; + await item.setTimeFilterFromLocation({ + // Position to pick + position: { + // in degrees + latitude: -37.831, + longitude: 144.973 + }, + // Coordinates of the tiles + tileCoords: { + x: 1, + y: 2, + level: 3 + } + }); + expect(pickFeatures).not.toHaveBeenCalled(); + }); + }); }); class TestTimeFilterableItem extends TimeFilterMixin( MappableMixin(CreateModel(mixTraits(TimeFilterTraits))) ) { + @observable discreteTimes: DiscreteTimeAsJS[] = []; + + @observable + imageryProviders: ImageryProvider[] = []; + constructor(...args: ModelConstructorParameters) { super(...args); makeObservable(this); } protected async forceLoadMapItems(): Promise {} - get discreteTimes() { - return undefined; - } @computed get mapItems() { - return []; + return this.imageryProviders.map((imageryProvider) => ({ + imageryProvider, + alpha: 1.0, + show: true, + clippingRectangle: imageryProvider.rectangle + })); } } From 91335393a83e1d260c8bad9f153fb920802eabec Mon Sep 17 00:00:00 2001 From: Staf Smith Date: Wed, 2 Aug 2023 10:44:36 +0800 Subject: [PATCH 234/654] Redo hide bottom dock with mapUI --- lib/ReactViews/Map/MapColumn.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/ReactViews/Map/MapColumn.tsx b/lib/ReactViews/Map/MapColumn.tsx index a947682cbee..a412cf1e58c 100644 --- a/lib/ReactViews/Map/MapColumn.tsx +++ b/lib/ReactViews/Map/MapColumn.tsx @@ -120,7 +120,7 @@ export const MapColumn: FC = observer( )}
    - {true && ( + {!viewState.hideMapUi && ( Date: Wed, 2 Aug 2023 11:04:53 +0800 Subject: [PATCH 235/654] re-implement conditional opacity --- lib/ReactViews/Map/MapColumn.tsx | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/lib/ReactViews/Map/MapColumn.tsx b/lib/ReactViews/Map/MapColumn.tsx index a412cf1e58c..eb33ebc28c8 100644 --- a/lib/ReactViews/Map/MapColumn.tsx +++ b/lib/ReactViews/Map/MapColumn.tsx @@ -54,7 +54,11 @@ export const MapColumn: FC = observer(
    {!viewState.hideMapUi && ( - <> +
    = observer( navItems={customElements.nav} elementConfig={viewState.terria.elements.get("map-navigation")} /> - +
    )} Date: Thu, 3 Aug 2023 12:05:10 +1000 Subject: [PATCH 236/654] Ensure exception isn't thrown and set strict mode --- doc/js/rewrite-links.js | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/doc/js/rewrite-links.js b/doc/js/rewrite-links.js index 84bfb4d03ff..09007119df2 100644 --- a/doc/js/rewrite-links.js +++ b/doc/js/rewrite-links.js @@ -1,11 +1,15 @@ +"use strict"; document.querySelectorAll("a").forEach(function (a) { // For links in doc markdown pages like "/lib/Models..." or "../../lib/ReactViews/..." // rewrite them and point to GitHub - if (document.location.hostname !== new URL(a.href).hostname) return; - m = a.href.match("/lib/(.+)$"); - if (m) { - a.href = "https://github.com/TerriaJS/terriajs/blob/main/lib/" + m[1]; - a.target = "_blank"; - a.rel = "noreferrer noopener"; - } + try { + // Wrap use of URL constructor in try catch + if (document.location.hostname !== new URL(a).hostname) return; + const m = a.href.match("/lib/(.+)$"); + if (m) { + a.href = "https://github.com/TerriaJS/terriajs/blob/main/lib/" + m[1]; + a.target = "_blank"; + a.rel = "noreferrer noopener"; + } + } catch {} }); From e837445f63141cfde52dc301a2bf1df3679cd447 Mon Sep 17 00:00:00 2001 From: Stephen Davies Date: Thu, 3 Aug 2023 12:05:20 +1000 Subject: [PATCH 237/654] Fix links --- doc/customizing/cloning-and-building.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/customizing/cloning-and-building.md b/doc/customizing/cloning-and-building.md index caf32c26e74..133711c5a01 100644 --- a/doc/customizing/cloning-and-building.md +++ b/doc/customizing/cloning-and-building.md @@ -106,4 +106,4 @@ Checkout the [Problems and Solutions](../contributing/problems-and-solutions.md) ### Next Steps -Now that you have a working local build of TerriaMap, you may want to [customize it](customizing/README.md) or [deploy it](deploying/README.md) for others to use. +Now that you have a working local build of TerriaMap, you may want to [customize it](./README.md) or [deploy it](../deploying/README.md) for others to use. From 83a181ee53321b2da682eb444eb63a407b0d98c4 Mon Sep 17 00:00:00 2001 From: Stephen Davies Date: Thu, 3 Aug 2023 12:05:27 +1000 Subject: [PATCH 238/654] Updatre attributions --- doc/acknowledgements/attributions.md | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/doc/acknowledgements/attributions.md b/doc/acknowledgements/attributions.md index daaeb4165fb..257841e3d6b 100644 --- a/doc/acknowledgements/attributions.md +++ b/doc/acknowledgements/attributions.md @@ -2,7 +2,7 @@ THE FOLLOWING SETS FORTH ATTRIBUTION NOTICES FOR THIRD PARTY SOFTWARE THAT MAY B ----- -The following software may be included in this product: @babel/code-frame, @babel/compat-data, @babel/core, @babel/eslint-parser, @babel/generator, @babel/helper-annotate-as-pure, @babel/helper-builder-binary-assignment-operator-visitor, @babel/helper-compilation-targets, @babel/helper-create-class-features-plugin, @babel/helper-create-regexp-features-plugin, @babel/helper-environment-visitor, @babel/helper-explode-assignable-expression, @babel/helper-function-name, @babel/helper-get-function-arity, @babel/helper-hoist-variables, @babel/helper-member-expression-to-functions, @babel/helper-module-imports, @babel/helper-module-transforms, @babel/helper-optimise-call-expression, @babel/helper-plugin-utils, @babel/helper-remap-async-to-generator, @babel/helper-replace-supers, @babel/helper-simple-access, @babel/helper-skip-transparent-expression-wrappers, @babel/helper-split-export-declaration, @babel/helper-validator-identifier, @babel/helper-validator-option, @babel/helper-wrap-function, @babel/helpers, @babel/highlight, @babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression, @babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining, @babel/plugin-proposal-async-generator-functions, @babel/plugin-proposal-class-properties, @babel/plugin-proposal-class-static-block, @babel/plugin-proposal-decorators, @babel/plugin-proposal-dynamic-import, @babel/plugin-proposal-export-namespace-from, @babel/plugin-proposal-json-strings, @babel/plugin-proposal-logical-assignment-operators, @babel/plugin-proposal-nullish-coalescing-operator, @babel/plugin-proposal-numeric-separator, @babel/plugin-proposal-object-rest-spread, @babel/plugin-proposal-optional-catch-binding, @babel/plugin-proposal-optional-chaining, @babel/plugin-proposal-private-methods, @babel/plugin-proposal-private-property-in-object, @babel/plugin-proposal-unicode-property-regex, @babel/plugin-syntax-async-generators, @babel/plugin-syntax-class-properties, @babel/plugin-syntax-class-static-block, @babel/plugin-syntax-decorators, @babel/plugin-syntax-dynamic-import, @babel/plugin-syntax-export-namespace-from, @babel/plugin-syntax-json-strings, @babel/plugin-syntax-jsx, @babel/plugin-syntax-logical-assignment-operators, @babel/plugin-syntax-nullish-coalescing-operator, @babel/plugin-syntax-numeric-separator, @babel/plugin-syntax-object-rest-spread, @babel/plugin-syntax-optional-catch-binding, @babel/plugin-syntax-optional-chaining, @babel/plugin-syntax-private-property-in-object, @babel/plugin-syntax-top-level-await, @babel/plugin-syntax-typescript, @babel/plugin-transform-arrow-functions, @babel/plugin-transform-async-to-generator, @babel/plugin-transform-block-scoped-functions, @babel/plugin-transform-block-scoping, @babel/plugin-transform-classes, @babel/plugin-transform-computed-properties, @babel/plugin-transform-destructuring, @babel/plugin-transform-dotall-regex, @babel/plugin-transform-duplicate-keys, @babel/plugin-transform-exponentiation-operator, @babel/plugin-transform-for-of, @babel/plugin-transform-function-name, @babel/plugin-transform-literals, @babel/plugin-transform-member-expression-literals, @babel/plugin-transform-modules-amd, @babel/plugin-transform-modules-commonjs, @babel/plugin-transform-modules-systemjs, @babel/plugin-transform-modules-umd, @babel/plugin-transform-named-capturing-groups-regex, @babel/plugin-transform-new-target, @babel/plugin-transform-object-super, @babel/plugin-transform-parameters, @babel/plugin-transform-property-literals, @babel/plugin-transform-react-display-name, @babel/plugin-transform-react-jsx, @babel/plugin-transform-react-jsx-development, @babel/plugin-transform-react-pure-annotations, @babel/plugin-transform-regenerator, @babel/plugin-transform-reserved-words, @babel/plugin-transform-shorthand-properties, @babel/plugin-transform-spread, @babel/plugin-transform-sticky-regex, @babel/plugin-transform-template-literals, @babel/plugin-transform-typeof-symbol, @babel/plugin-transform-typescript, @babel/plugin-transform-unicode-escapes, @babel/plugin-transform-unicode-regex, @babel/preset-env, @babel/preset-react, @babel/preset-typescript, @babel/runtime, @babel/template, @babel/traverse, @babel/types. A copy of the source code may be downloaded from https://github.com/babel/babel.git (@babel/code-frame), https://github.com/babel/babel.git (@babel/compat-data), https://github.com/babel/babel.git (@babel/core), https://github.com/babel/babel.git (@babel/eslint-parser), https://github.com/babel/babel.git (@babel/generator), https://github.com/babel/babel.git (@babel/helper-annotate-as-pure), https://github.com/babel/babel.git (@babel/helper-builder-binary-assignment-operator-visitor), https://github.com/babel/babel.git (@babel/helper-compilation-targets), https://github.com/babel/babel.git (@babel/helper-create-class-features-plugin), https://github.com/babel/babel.git (@babel/helper-create-regexp-features-plugin), https://github.com/babel/babel.git (@babel/helper-environment-visitor), https://github.com/babel/babel.git (@babel/helper-explode-assignable-expression), https://github.com/babel/babel.git (@babel/helper-function-name), https://github.com/babel/babel.git (@babel/helper-get-function-arity), https://github.com/babel/babel.git (@babel/helper-hoist-variables), https://github.com/babel/babel.git (@babel/helper-member-expression-to-functions), https://github.com/babel/babel.git (@babel/helper-module-imports), https://github.com/babel/babel.git (@babel/helper-module-transforms), https://github.com/babel/babel.git (@babel/helper-optimise-call-expression), https://github.com/babel/babel.git (@babel/helper-plugin-utils), https://github.com/babel/babel.git (@babel/helper-remap-async-to-generator), https://github.com/babel/babel.git (@babel/helper-replace-supers), https://github.com/babel/babel.git (@babel/helper-simple-access), https://github.com/babel/babel.git (@babel/helper-skip-transparent-expression-wrappers), https://github.com/babel/babel.git (@babel/helper-split-export-declaration), https://github.com/babel/babel.git (@babel/helper-validator-identifier), https://github.com/babel/babel.git (@babel/helper-validator-option), https://github.com/babel/babel.git (@babel/helper-wrap-function), https://github.com/babel/babel.git (@babel/helpers), https://github.com/babel/babel.git (@babel/highlight), https://github.com/babel/babel.git (@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression), https://github.com/babel/babel.git (@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining), https://github.com/babel/babel.git (@babel/plugin-proposal-async-generator-functions), https://github.com/babel/babel.git (@babel/plugin-proposal-class-properties), https://github.com/babel/babel.git (@babel/plugin-proposal-class-static-block), https://github.com/babel/babel.git (@babel/plugin-proposal-decorators), https://github.com/babel/babel.git (@babel/plugin-proposal-dynamic-import), https://github.com/babel/babel.git (@babel/plugin-proposal-export-namespace-from), https://github.com/babel/babel.git (@babel/plugin-proposal-json-strings), https://github.com/babel/babel.git (@babel/plugin-proposal-logical-assignment-operators), https://github.com/babel/babel.git (@babel/plugin-proposal-nullish-coalescing-operator), https://github.com/babel/babel.git (@babel/plugin-proposal-numeric-separator), https://github.com/babel/babel.git (@babel/plugin-proposal-object-rest-spread), https://github.com/babel/babel.git (@babel/plugin-proposal-optional-catch-binding), https://github.com/babel/babel.git (@babel/plugin-proposal-optional-chaining), https://github.com/babel/babel.git (@babel/plugin-proposal-private-methods), https://github.com/babel/babel.git (@babel/plugin-proposal-private-property-in-object), https://github.com/babel/babel.git (@babel/plugin-proposal-unicode-property-regex), https://github.com/babel/babel/tree/master/packages/babel-plugin-syntax-async-generators (@babel/plugin-syntax-async-generators), https://github.com/babel/babel.git (@babel/plugin-syntax-class-properties), https://github.com/babel/babel.git (@babel/plugin-syntax-class-static-block), https://github.com/babel/babel.git (@babel/plugin-syntax-decorators), https://github.com/babel/babel/tree/master/packages/babel-plugin-syntax-dynamic-import (@babel/plugin-syntax-dynamic-import), https://github.com/babel/babel/tree/master/packages/babel-plugin-syntax-export-namespace-from (@babel/plugin-syntax-export-namespace-from), https://github.com/babel/babel/tree/master/packages/babel-plugin-syntax-json-strings (@babel/plugin-syntax-json-strings), https://github.com/babel/babel.git (@babel/plugin-syntax-jsx), https://github.com/babel/babel.git (@babel/plugin-syntax-logical-assignment-operators), https://github.com/babel/babel/tree/master/packages/babel-plugin-syntax-nullish-coalescing-operator (@babel/plugin-syntax-nullish-coalescing-operator), https://github.com/babel/babel.git (@babel/plugin-syntax-numeric-separator), https://github.com/babel/babel/tree/master/packages/babel-plugin-syntax-object-rest-spread (@babel/plugin-syntax-object-rest-spread), https://github.com/babel/babel/tree/master/packages/babel-plugin-syntax-optional-catch-binding (@babel/plugin-syntax-optional-catch-binding), https://github.com/babel/babel/tree/master/packages/babel-plugin-syntax-optional-chaining (@babel/plugin-syntax-optional-chaining), https://github.com/babel/babel.git (@babel/plugin-syntax-private-property-in-object), https://github.com/babel/babel.git (@babel/plugin-syntax-top-level-await), https://github.com/babel/babel.git (@babel/plugin-syntax-typescript), https://github.com/babel/babel.git (@babel/plugin-transform-arrow-functions), https://github.com/babel/babel.git (@babel/plugin-transform-async-to-generator), https://github.com/babel/babel.git (@babel/plugin-transform-block-scoped-functions), https://github.com/babel/babel.git (@babel/plugin-transform-block-scoping), https://github.com/babel/babel.git (@babel/plugin-transform-classes), https://github.com/babel/babel.git (@babel/plugin-transform-computed-properties), https://github.com/babel/babel.git (@babel/plugin-transform-destructuring), https://github.com/babel/babel.git (@babel/plugin-transform-dotall-regex), https://github.com/babel/babel.git (@babel/plugin-transform-duplicate-keys), https://github.com/babel/babel.git (@babel/plugin-transform-exponentiation-operator), https://github.com/babel/babel.git (@babel/plugin-transform-for-of), https://github.com/babel/babel.git (@babel/plugin-transform-function-name), https://github.com/babel/babel.git (@babel/plugin-transform-literals), https://github.com/babel/babel.git (@babel/plugin-transform-member-expression-literals), https://github.com/babel/babel.git (@babel/plugin-transform-modules-amd), https://github.com/babel/babel.git (@babel/plugin-transform-modules-commonjs), https://github.com/babel/babel.git (@babel/plugin-transform-modules-systemjs), https://github.com/babel/babel.git (@babel/plugin-transform-modules-umd), https://github.com/babel/babel.git (@babel/plugin-transform-named-capturing-groups-regex), https://github.com/babel/babel.git (@babel/plugin-transform-new-target), https://github.com/babel/babel.git (@babel/plugin-transform-object-super), https://github.com/babel/babel.git (@babel/plugin-transform-parameters), https://github.com/babel/babel.git (@babel/plugin-transform-property-literals), https://github.com/babel/babel.git (@babel/plugin-transform-react-display-name), https://github.com/babel/babel.git (@babel/plugin-transform-react-jsx), https://github.com/babel/babel.git (@babel/plugin-transform-react-jsx-development), https://github.com/babel/babel.git (@babel/plugin-transform-react-pure-annotations), https://github.com/babel/babel.git (@babel/plugin-transform-regenerator), https://github.com/babel/babel.git (@babel/plugin-transform-reserved-words), https://github.com/babel/babel.git (@babel/plugin-transform-shorthand-properties), https://github.com/babel/babel.git (@babel/plugin-transform-spread), https://github.com/babel/babel.git (@babel/plugin-transform-sticky-regex), https://github.com/babel/babel.git (@babel/plugin-transform-template-literals), https://github.com/babel/babel.git (@babel/plugin-transform-typeof-symbol), https://github.com/babel/babel.git (@babel/plugin-transform-typescript), https://github.com/babel/babel.git (@babel/plugin-transform-unicode-escapes), https://github.com/babel/babel.git (@babel/plugin-transform-unicode-regex), https://github.com/babel/babel.git (@babel/preset-env), https://github.com/babel/babel.git (@babel/preset-react), https://github.com/babel/babel.git (@babel/preset-typescript), https://github.com/babel/babel.git (@babel/runtime), https://github.com/babel/babel.git (@babel/template), https://github.com/babel/babel.git (@babel/traverse), https://github.com/babel/babel.git (@babel/types). This software contains the following license and notice below: +The following software may be included in this product: @babel/code-frame, @babel/compat-data, @babel/core, @babel/eslint-parser, @babel/generator, @babel/helper-annotate-as-pure, @babel/helper-builder-binary-assignment-operator-visitor, @babel/helper-compilation-targets, @babel/helper-create-class-features-plugin, @babel/helper-create-regexp-features-plugin, @babel/helper-environment-visitor, @babel/helper-explode-assignable-expression, @babel/helper-function-name, @babel/helper-get-function-arity, @babel/helper-hoist-variables, @babel/helper-member-expression-to-functions, @babel/helper-module-imports, @babel/helper-module-transforms, @babel/helper-optimise-call-expression, @babel/helper-plugin-utils, @babel/helper-remap-async-to-generator, @babel/helper-replace-supers, @babel/helper-simple-access, @babel/helper-skip-transparent-expression-wrappers, @babel/helper-split-export-declaration, @babel/helper-string-parser, @babel/helper-validator-identifier, @babel/helper-validator-option, @babel/helper-wrap-function, @babel/helpers, @babel/highlight, @babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression, @babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining, @babel/plugin-proposal-async-generator-functions, @babel/plugin-proposal-class-properties, @babel/plugin-proposal-class-static-block, @babel/plugin-proposal-decorators, @babel/plugin-proposal-dynamic-import, @babel/plugin-proposal-export-namespace-from, @babel/plugin-proposal-json-strings, @babel/plugin-proposal-logical-assignment-operators, @babel/plugin-proposal-nullish-coalescing-operator, @babel/plugin-proposal-numeric-separator, @babel/plugin-proposal-object-rest-spread, @babel/plugin-proposal-optional-catch-binding, @babel/plugin-proposal-optional-chaining, @babel/plugin-proposal-private-methods, @babel/plugin-proposal-private-property-in-object, @babel/plugin-proposal-unicode-property-regex, @babel/plugin-syntax-async-generators, @babel/plugin-syntax-class-properties, @babel/plugin-syntax-class-static-block, @babel/plugin-syntax-decorators, @babel/plugin-syntax-dynamic-import, @babel/plugin-syntax-export-namespace-from, @babel/plugin-syntax-json-strings, @babel/plugin-syntax-jsx, @babel/plugin-syntax-logical-assignment-operators, @babel/plugin-syntax-nullish-coalescing-operator, @babel/plugin-syntax-numeric-separator, @babel/plugin-syntax-object-rest-spread, @babel/plugin-syntax-optional-catch-binding, @babel/plugin-syntax-optional-chaining, @babel/plugin-syntax-private-property-in-object, @babel/plugin-syntax-top-level-await, @babel/plugin-syntax-typescript, @babel/plugin-transform-arrow-functions, @babel/plugin-transform-async-to-generator, @babel/plugin-transform-block-scoped-functions, @babel/plugin-transform-block-scoping, @babel/plugin-transform-classes, @babel/plugin-transform-computed-properties, @babel/plugin-transform-destructuring, @babel/plugin-transform-dotall-regex, @babel/plugin-transform-duplicate-keys, @babel/plugin-transform-exponentiation-operator, @babel/plugin-transform-for-of, @babel/plugin-transform-function-name, @babel/plugin-transform-literals, @babel/plugin-transform-member-expression-literals, @babel/plugin-transform-modules-amd, @babel/plugin-transform-modules-commonjs, @babel/plugin-transform-modules-systemjs, @babel/plugin-transform-modules-umd, @babel/plugin-transform-named-capturing-groups-regex, @babel/plugin-transform-new-target, @babel/plugin-transform-object-super, @babel/plugin-transform-parameters, @babel/plugin-transform-property-literals, @babel/plugin-transform-react-display-name, @babel/plugin-transform-react-jsx, @babel/plugin-transform-react-jsx-development, @babel/plugin-transform-react-pure-annotations, @babel/plugin-transform-regenerator, @babel/plugin-transform-reserved-words, @babel/plugin-transform-shorthand-properties, @babel/plugin-transform-spread, @babel/plugin-transform-sticky-regex, @babel/plugin-transform-template-literals, @babel/plugin-transform-typeof-symbol, @babel/plugin-transform-typescript, @babel/plugin-transform-unicode-escapes, @babel/plugin-transform-unicode-regex, @babel/preset-env, @babel/preset-react, @babel/preset-typescript, @babel/runtime, @babel/template, @babel/traverse, @babel/types. A copy of the source code may be downloaded from https://github.com/babel/babel.git (@babel/code-frame), https://github.com/babel/babel.git (@babel/compat-data), https://github.com/babel/babel.git (@babel/core), https://github.com/babel/babel.git (@babel/eslint-parser), https://github.com/babel/babel.git (@babel/generator), https://github.com/babel/babel.git (@babel/helper-annotate-as-pure), https://github.com/babel/babel.git (@babel/helper-builder-binary-assignment-operator-visitor), https://github.com/babel/babel.git (@babel/helper-compilation-targets), https://github.com/babel/babel.git (@babel/helper-create-class-features-plugin), https://github.com/babel/babel.git (@babel/helper-create-regexp-features-plugin), https://github.com/babel/babel.git (@babel/helper-environment-visitor), https://github.com/babel/babel.git (@babel/helper-explode-assignable-expression), https://github.com/babel/babel.git (@babel/helper-function-name), https://github.com/babel/babel.git (@babel/helper-get-function-arity), https://github.com/babel/babel.git (@babel/helper-hoist-variables), https://github.com/babel/babel.git (@babel/helper-member-expression-to-functions), https://github.com/babel/babel.git (@babel/helper-module-imports), https://github.com/babel/babel.git (@babel/helper-module-transforms), https://github.com/babel/babel.git (@babel/helper-optimise-call-expression), https://github.com/babel/babel.git (@babel/helper-plugin-utils), https://github.com/babel/babel.git (@babel/helper-remap-async-to-generator), https://github.com/babel/babel.git (@babel/helper-replace-supers), https://github.com/babel/babel.git (@babel/helper-simple-access), https://github.com/babel/babel.git (@babel/helper-skip-transparent-expression-wrappers), https://github.com/babel/babel.git (@babel/helper-split-export-declaration), https://github.com/babel/babel.git (@babel/helper-string-parser), https://github.com/babel/babel.git (@babel/helper-validator-identifier), https://github.com/babel/babel.git (@babel/helper-validator-option), https://github.com/babel/babel.git (@babel/helper-wrap-function), https://github.com/babel/babel.git (@babel/helpers), https://github.com/babel/babel.git (@babel/highlight), https://github.com/babel/babel.git (@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression), https://github.com/babel/babel.git (@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining), https://github.com/babel/babel.git (@babel/plugin-proposal-async-generator-functions), https://github.com/babel/babel.git (@babel/plugin-proposal-class-properties), https://github.com/babel/babel.git (@babel/plugin-proposal-class-static-block), https://github.com/babel/babel.git (@babel/plugin-proposal-decorators), https://github.com/babel/babel.git (@babel/plugin-proposal-dynamic-import), https://github.com/babel/babel.git (@babel/plugin-proposal-export-namespace-from), https://github.com/babel/babel.git (@babel/plugin-proposal-json-strings), https://github.com/babel/babel.git (@babel/plugin-proposal-logical-assignment-operators), https://github.com/babel/babel.git (@babel/plugin-proposal-nullish-coalescing-operator), https://github.com/babel/babel.git (@babel/plugin-proposal-numeric-separator), https://github.com/babel/babel.git (@babel/plugin-proposal-object-rest-spread), https://github.com/babel/babel.git (@babel/plugin-proposal-optional-catch-binding), https://github.com/babel/babel.git (@babel/plugin-proposal-optional-chaining), https://github.com/babel/babel.git (@babel/plugin-proposal-private-methods), https://github.com/babel/babel.git (@babel/plugin-proposal-private-property-in-object), https://github.com/babel/babel.git (@babel/plugin-proposal-unicode-property-regex), https://github.com/babel/babel/tree/master/packages/babel-plugin-syntax-async-generators (@babel/plugin-syntax-async-generators), https://github.com/babel/babel.git (@babel/plugin-syntax-class-properties), https://github.com/babel/babel.git (@babel/plugin-syntax-class-static-block), https://github.com/babel/babel.git (@babel/plugin-syntax-decorators), https://github.com/babel/babel/tree/master/packages/babel-plugin-syntax-dynamic-import (@babel/plugin-syntax-dynamic-import), https://github.com/babel/babel/tree/master/packages/babel-plugin-syntax-export-namespace-from (@babel/plugin-syntax-export-namespace-from), https://github.com/babel/babel/tree/master/packages/babel-plugin-syntax-json-strings (@babel/plugin-syntax-json-strings), https://github.com/babel/babel.git (@babel/plugin-syntax-jsx), https://github.com/babel/babel.git (@babel/plugin-syntax-logical-assignment-operators), https://github.com/babel/babel/tree/master/packages/babel-plugin-syntax-nullish-coalescing-operator (@babel/plugin-syntax-nullish-coalescing-operator), https://github.com/babel/babel.git (@babel/plugin-syntax-numeric-separator), https://github.com/babel/babel/tree/master/packages/babel-plugin-syntax-object-rest-spread (@babel/plugin-syntax-object-rest-spread), https://github.com/babel/babel/tree/master/packages/babel-plugin-syntax-optional-catch-binding (@babel/plugin-syntax-optional-catch-binding), https://github.com/babel/babel/tree/master/packages/babel-plugin-syntax-optional-chaining (@babel/plugin-syntax-optional-chaining), https://github.com/babel/babel.git (@babel/plugin-syntax-private-property-in-object), https://github.com/babel/babel.git (@babel/plugin-syntax-top-level-await), https://github.com/babel/babel.git (@babel/plugin-syntax-typescript), https://github.com/babel/babel.git (@babel/plugin-transform-arrow-functions), https://github.com/babel/babel.git (@babel/plugin-transform-async-to-generator), https://github.com/babel/babel.git (@babel/plugin-transform-block-scoped-functions), https://github.com/babel/babel.git (@babel/plugin-transform-block-scoping), https://github.com/babel/babel.git (@babel/plugin-transform-classes), https://github.com/babel/babel.git (@babel/plugin-transform-computed-properties), https://github.com/babel/babel.git (@babel/plugin-transform-destructuring), https://github.com/babel/babel.git (@babel/plugin-transform-dotall-regex), https://github.com/babel/babel.git (@babel/plugin-transform-duplicate-keys), https://github.com/babel/babel.git (@babel/plugin-transform-exponentiation-operator), https://github.com/babel/babel.git (@babel/plugin-transform-for-of), https://github.com/babel/babel.git (@babel/plugin-transform-function-name), https://github.com/babel/babel.git (@babel/plugin-transform-literals), https://github.com/babel/babel.git (@babel/plugin-transform-member-expression-literals), https://github.com/babel/babel.git (@babel/plugin-transform-modules-amd), https://github.com/babel/babel.git (@babel/plugin-transform-modules-commonjs), https://github.com/babel/babel.git (@babel/plugin-transform-modules-systemjs), https://github.com/babel/babel.git (@babel/plugin-transform-modules-umd), https://github.com/babel/babel.git (@babel/plugin-transform-named-capturing-groups-regex), https://github.com/babel/babel.git (@babel/plugin-transform-new-target), https://github.com/babel/babel.git (@babel/plugin-transform-object-super), https://github.com/babel/babel.git (@babel/plugin-transform-parameters), https://github.com/babel/babel.git (@babel/plugin-transform-property-literals), https://github.com/babel/babel.git (@babel/plugin-transform-react-display-name), https://github.com/babel/babel.git (@babel/plugin-transform-react-jsx), https://github.com/babel/babel.git (@babel/plugin-transform-react-jsx-development), https://github.com/babel/babel.git (@babel/plugin-transform-react-pure-annotations), https://github.com/babel/babel.git (@babel/plugin-transform-regenerator), https://github.com/babel/babel.git (@babel/plugin-transform-reserved-words), https://github.com/babel/babel.git (@babel/plugin-transform-shorthand-properties), https://github.com/babel/babel.git (@babel/plugin-transform-spread), https://github.com/babel/babel.git (@babel/plugin-transform-sticky-regex), https://github.com/babel/babel.git (@babel/plugin-transform-template-literals), https://github.com/babel/babel.git (@babel/plugin-transform-typeof-symbol), https://github.com/babel/babel.git (@babel/plugin-transform-typescript), https://github.com/babel/babel.git (@babel/plugin-transform-unicode-escapes), https://github.com/babel/babel.git (@babel/plugin-transform-unicode-regex), https://github.com/babel/babel.git (@babel/preset-env), https://github.com/babel/babel.git (@babel/preset-react), https://github.com/babel/babel.git (@babel/preset-typescript), https://github.com/babel/babel.git (@babel/runtime), https://github.com/babel/babel.git (@babel/template), https://github.com/babel/babel.git (@babel/traverse), https://github.com/babel/babel.git (@babel/types). This software contains the following license and notice below: MIT License @@ -28941,6 +28941,31 @@ OTHER DEALINGS IN THE SOFTWARE. ----- +The following software may be included in this product: update-browserslist-db. A copy of the source code may be downloaded from https://github.com/browserslist/update-db.git. This software contains the following license and notice below: + +The MIT License (MIT) + +Copyright 2022 Andrey Sitnik and other contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +----- + The following software may be included in this product: uri-js. A copy of the source code may be downloaded from http://github.com/garycourt/uri-js. This software contains the following license and notice below: Copyright 2011 Gary Court. All rights reserved. From 23d2a97125060ab547288f457e71c13f8b6d7bf0 Mon Sep 17 00:00:00 2001 From: Nanda Date: Fri, 4 Aug 2023 13:06:50 +1000 Subject: [PATCH 239/654] Update CHANGES.md --- CHANGES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES.md b/CHANGES.md index c6b8162a93e..5f18ee2619b 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -2,6 +2,7 @@ #### next release (8.3.2) +- Fixed a bug when restoring timefilter from a share link having more than one imagery item with the same base URL (but different layer names). - [The next improvement] #### 8.3.1 - 2023-06-29 From 8176f1301144cd6a57dde933e69a5138b651618d Mon Sep 17 00:00:00 2001 From: Brendon Ward Date: Mon, 7 Aug 2023 14:56:12 +1000 Subject: [PATCH 240/654] Wps results fix (#6826) * remove duplicate items from the Workbench items * prevent duplicate items from being added to the workbench.items * update CHANGES * use set to de dupe the workbench items in the set method * response to PR feedback * correct the changes doc --- CHANGES.md | 3 ++- lib/Models/Workbench.ts | 8 +++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 5f18ee2619b..9349c642442 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,8 +1,9 @@ # Change Log -#### next release (8.3.2) +#### next release 8.3.2 - Fixed a bug when restoring timefilter from a share link having more than one imagery item with the same base URL (but different layer names). +- Fix WPS duplicate display of analysis results when loaded through a share URL - [The next improvement] #### 8.3.1 - 2023-06-29 diff --git a/lib/Models/Workbench.ts b/lib/Models/Workbench.ts index c508fee8639..f1d5b90b8ce 100644 --- a/lib/Models/Workbench.ts +++ b/lib/Models/Workbench.ts @@ -34,7 +34,13 @@ export default class Workbench { return this._items.map(dereferenceModel); } set items(items: readonly BaseModel[]) { - this._items.spliceWithArray(0, this._items.length, items.slice()); + // Run items through a set to remove duplicates. + const setItems = new Set(items); + this._items.spliceWithArray( + 0, + this._items.length, + Array.from(setItems).slice() + ); } /** From 19d5aba3561f504d84ac6698d3dc7980542c66f3 Mon Sep 17 00:00:00 2001 From: Nanda Date: Tue, 8 Aug 2023 10:10:36 +1000 Subject: [PATCH 241/654] Implement feature for zooming to clipping box. --- lib/ModelMixins/ClippingMixin.ts | 266 ++++++++++++------ .../SelectableDimensions.ts | 4 +- .../SelectableDimensions/Button.tsx | 20 +- .../TraitsClasses/ClippingPlanesTraits.ts | 2 +- 4 files changed, 198 insertions(+), 94 deletions(-) diff --git a/lib/ModelMixins/ClippingMixin.ts b/lib/ModelMixins/ClippingMixin.ts index 7ecdd0f77fc..caedecd2dc6 100644 --- a/lib/ModelMixins/ClippingMixin.ts +++ b/lib/ModelMixins/ClippingMixin.ts @@ -1,5 +1,13 @@ import i18next from "i18next"; -import { action, computed, toJS, makeObservable, override } from "mobx"; +import { + action, + computed, + toJS, + makeObservable, + override, + runInAction, + observable +} from "mobx"; import Cartesian3 from "terriajs-cesium/Source/Core/Cartesian3"; import Cartographic from "terriajs-cesium/Source/Core/Cartographic"; import clone from "terriajs-cesium/Source/Core/clone"; @@ -9,17 +17,22 @@ import Matrix3 from "terriajs-cesium/Source/Core/Matrix3"; import Matrix4 from "terriajs-cesium/Source/Core/Matrix4"; import Transforms from "terriajs-cesium/Source/Core/Transforms"; import CustomDataSource from "terriajs-cesium/Source/DataSources/CustomDataSource"; +import DataSource from "terriajs-cesium/Source/DataSources/DataSource"; import ClippingPlane from "terriajs-cesium/Source/Scene/ClippingPlane"; import ClippingPlaneCollection from "terriajs-cesium/Source/Scene/ClippingPlaneCollection"; import AbstractConstructor from "../Core/AbstractConstructor"; import filterOutUndefined from "../Core/filterOutUndefined"; +import runLater from "../Core/runLater"; import BoxDrawing from "../Models/BoxDrawing"; +import Cesium from "../Models/Cesium"; import CommonStrata from "../Models/Definition/CommonStrata"; import Model from "../Models/Definition/Model"; import updateModelFromJson from "../Models/Definition/updateModelFromJson"; import SelectableDimensions, { - SelectableDimension + SelectableDimension, + SelectableDimensionCheckboxGroup } from "../Models/SelectableDimensions/SelectableDimensions"; +import Icon from "../Styled/Icon"; import ClippingPlanesTraits from "../Traits/TraitsClasses/ClippingPlanesTraits"; import HeadingPitchRollTraits from "../Traits/TraitsClasses/HeadingPitchRollTraits"; import LatLonHeightTraits from "../Traits/TraitsClasses/LatLonHeightTraits"; @@ -29,6 +42,10 @@ type BaseType = Model & SelectableDimensions; function ClippingMixin>(Base: T) { abstract class ClippingMixin extends Base { private _clippingBoxDrawing?: BoxDrawing; + + @observable + _isZoomingToClippingBox: boolean = false; + abstract clippingPlanesOriginMatrix(): Matrix4; private clippingPlaneModelMatrix: Matrix4 = Matrix4.IDENTITY.clone(); @@ -257,107 +274,194 @@ function ClippingMixin>(Base: T) { return super.selectableDimensions; } + const checkboxGroupInputs: SelectableDimensionCheckboxGroup["selectableDimensions"] = + [ + { + // Checkbox to show/hide clipping box + id: "show-clip-editor-ui", + type: "checkbox", + selectedId: this.clippingBox.showClippingBox ? "true" : "false", + disable: this.clippingBox.clipModel === false, + options: [ + { + id: "true", + name: i18next.t("models.clippingBox.showClippingBox") + }, + { + id: "false", + name: i18next.t("models.clippingBox.showClippingBox") + } + ], + setDimensionValue: (stratumId, value) => { + this.clippingBox.setTrait( + stratumId, + "showClippingBox", + value === "true" + ); + } + }, + { + // Checkbox to clamp/unclamp box to ground + id: "clamp-box-to-ground", + type: "checkbox", + selectedId: this.clippingBox.keepBoxAboveGround ? "true" : "false", + disable: + this.clippingBox.clipModel === false || + this.clippingBox.showClippingBox === false, + options: [ + { + id: "true", + name: i18next.t("models.clippingBox.keepBoxAboveGround") + }, + { + id: "false", + name: i18next.t("models.clippingBox.keepBoxAboveGround") + } + ], + setDimensionValue: (stratumId, value) => { + this.clippingBox.setTrait( + stratumId, + "keepBoxAboveGround", + value === "true" + ); + } + }, + { + // Dropdown to change the clipping direction + id: "clip-direction", + name: i18next.t("models.clippingBox.clipDirection.name"), + type: "select", + selectedId: this.clippingBox.clipDirection, + disable: this.clippingBox.clipModel === false, + options: [ + { + id: "inside", + name: i18next.t( + "models.clippingBox.clipDirection.options.inside" + ) + }, + { + id: "outside", + name: i18next.t( + "models.clippingBox.clipDirection.options.outside" + ) + } + ], + setDimensionValue: (stratumId, value) => { + this.clippingBox.setTrait(stratumId, "clipDirection", value); + } + }, + { + // Button to zoom to clipping box + id: "zoom-to-clipping-box-button", + type: "button", + value: "Zoom to clipping box", + icon: this._isZoomingToClippingBox + ? "spinner" + : Icon.GLYPHS.geolocation, + disable: + this.clippingBox.clipModel === false || + this.clippingBoxDrawing === undefined, + setDimensionValue: () => { + if (!this._isZoomingToClippingBox) { + this._zoomToClippingBox(); + } + } + } + ]; + return [ ...super.selectableDimensions, { + // Checkbox group that also enables/disables the clipping behaviour altogether type: "checkbox-group", id: "clipping-box", selectedId: this.clippingBox.clipModel ? "true" : "false", options: [ { id: "true", - name: i18next.t("models.clippingBox.clipModel") + name: `${i18next.t("models.clippingBox.clipModel")}` }, { id: "false", name: i18next.t("models.clippingBox.clipModel") } ], - setDimensionValue: (stratumId, value) => { - this.clippingBox.setTrait(stratumId, "clipModel", value === "true"); - }, - selectableDimensions: [ - { - id: "show-clip-editor-ui", - type: "checkbox", - selectedId: this.clippingBox.showClippingBox ? "true" : "false", - disable: this.clippingBox.clipModel === false, - options: [ - { - id: "true", - name: i18next.t("models.clippingBox.showClippingBox") - }, - { - id: "false", - name: i18next.t("models.clippingBox.showClippingBox") - } - ], - setDimensionValue: (stratumId, value) => { - this.clippingBox.setTrait( - stratumId, - "showClippingBox", - value === "true" - ); - } - }, - { - id: "clamp-box-to-ground", - type: "checkbox", - selectedId: this.clippingBox.keepBoxAboveGround - ? "true" - : "false", - disable: - this.clippingBox.clipModel === false || - this.clippingBox.showClippingBox === false, - options: [ - { - id: "true", - name: i18next.t("models.clippingBox.keepBoxAboveGround") - }, - { - id: "false", - name: i18next.t("models.clippingBox.keepBoxAboveGround") - } - ], - setDimensionValue: (stratumId, value) => { - this.clippingBox.setTrait( - stratumId, - "keepBoxAboveGround", - value === "true" - ); - } - }, - { - id: "clip-direction", - name: i18next.t("models.clippingBox.clipDirection.name"), - type: "select", - selectedId: this.clippingBox.clipDirection, - disable: this.clippingBox.clipModel === false, - options: [ - { - id: "inside", - name: i18next.t( - "models.clippingBox.clipDirection.options.inside" - ) - }, - { - id: "outside", - name: i18next.t( - "models.clippingBox.clipDirection.options.outside" - ) - } - ], - setDimensionValue: (stratumId, value) => { - this.clippingBox.setTrait(stratumId, "clipDirection", value); - } + setDimensionValue: action((stratumId, value) => { + const clipModel = value === "true"; + this.clippingBox.setTrait(stratumId, "clipModel", clipModel); + if (clipModel) { + this._zoomToClippingBox(); } - ] + }), + selectableDimensions: checkboxGroupInputs } ]; } + + /** + * Initiates zooming to the clipping box if it is rendered on the map. + * Times out in 3 seconds if zooming is not possible. + * + * Also sets the observable variable `_isZoomingToClippingBox` to indicate the + * zooming status. + */ + _zoomToClippingBox() { + const dataSource = this.clippingBoxDrawing?.dataSource; + const cesium = this.terria.cesium; + if (!dataSource || !cesium) { + return; + } + + this._isZoomingToClippingBox = true; + zoomToDataSourceWithTimeout( + dataSource, + 3000, // timeout after 3 seconds if we cannot zoom for some reason + cesium + ) + .catch(() => { + /* ignore errors */ + }) + .finally( + action(() => { + this._isZoomingToClippingBox = false; + }) + ); + } } return ClippingMixin; } +/** + * Zooms to the given dataSource and returns a promise that fullfills when the + * zoom action is complete. If the dataSource has not been rendered on the map, + * we wait for `timeoutMilliseconds` before rejecting the promise. + */ +function zoomToDataSourceWithTimeout( + dataSource: DataSource, + timeoutMilliseconds: number, + cesium: Cesium +): Promise { + // DataSources rendered on the map + const renderedDataSources = cesium.dataSources; + if (renderedDataSources.contains(dataSource)) { + return cesium.doZoomTo(dataSource); + } else { + // Create a promise that waits for the dataSource to be added to map or + // timeout to complete whichever happens first + return new Promise((resolve, reject) => { + let removeListener = renderedDataSources.dataSourceAdded.addEventListener( + (_, added) => { + if (added === dataSource) { + removeListener(); + resolve(cesium.doZoomTo(dataSource)); + } + } + ); + runLater(removeListener, timeoutMilliseconds).then(reject); + }); + } +} + export default ClippingMixin; diff --git a/lib/Models/SelectableDimensions/SelectableDimensions.ts b/lib/Models/SelectableDimensions/SelectableDimensions.ts index 341535a1085..24135452ecb 100644 --- a/lib/Models/SelectableDimensions/SelectableDimensions.ts +++ b/lib/Models/SelectableDimensions/SelectableDimensions.ts @@ -53,7 +53,9 @@ export interface ColorDimension extends Dimension { export interface ButtonDimension extends Dimension { readonly value?: string; - readonly icon?: IconGlyph; + readonly icon?: + | IconGlyph // Any Icon glyph + | "spinner"; // Animated spinner icon } export type SelectableDimensionType = diff --git a/lib/ReactViews/SelectableDimensions/Button.tsx b/lib/ReactViews/SelectableDimensions/Button.tsx index d4f6a504af5..5657be1280a 100644 --- a/lib/ReactViews/SelectableDimensions/Button.tsx +++ b/lib/ReactViews/SelectableDimensions/Button.tsx @@ -6,12 +6,14 @@ import { StyledIcon } from "../../Styled/Icon"; import Text from "../../Styled/Text"; import { parseCustomMarkdownToReactWithOptions } from "../Custom/parseCustomMarkdownToReact"; import Button from "../../Styled/Button"; +import AnimatedSpinnerIcon from "../../Styled/AnimatedSpinnerIcon"; export const SelectableDimensionButton: React.FC<{ id: string; dim: SelectableDimensionButtonModel; }> = ({ id, dim }) => { - const icon = dim.icon; + const iconGlyph = dim.icon; + const iconProps = { light: true, styledWidth: "16px", styledHeight: "16px" }; return ( - + )} - + {props.open && (
      {props.children}
    -
    + )} ); } diff --git a/lib/ReactViews/DataCatalog/DataCatalog.jsx b/lib/ReactViews/DataCatalog/DataCatalog.jsx index 65690cef0aa..cf0fe0a197b 100644 --- a/lib/ReactViews/DataCatalog/DataCatalog.jsx +++ b/lib/ReactViews/DataCatalog/DataCatalog.jsx @@ -39,15 +39,17 @@ class DataCatalog extends React.Component { const { t } = this.props; return (
      - - - - + {isSearching && catalogSearchProvider && ( + <> + + + + )} {item !== this.props.terria.catalog.userAddedDataGroup && ( - + {this.isOpen() && ( - + )} ); } diff --git a/lib/ReactViews/ExplorerWindow/Tabs/MyDataTab/AddData.jsx b/lib/ReactViews/ExplorerWindow/Tabs/MyDataTab/AddData.jsx index c1c148943e3..10d48f53479 100644 --- a/lib/ReactViews/ExplorerWindow/Tabs/MyDataTab/AddData.jsx +++ b/lib/ReactViews/ExplorerWindow/Tabs/MyDataTab/AddData.jsx @@ -216,83 +216,87 @@ const AddData = createReactClass({ return (
      - -
      {t("addData.localAdd")}
      -
      - - - {this.state.localDataType?.description - ? parseCustomMarkdownToReactWithOptions( - this.state.localDataType?.description - ) - : null} - - - {this.state.isLoading && } -
      -
      - -
      {t("addData.webAdd")}
      -
      - - - {this.state.remoteDataType?.description - ? parseCustomMarkdownToReactWithOptions( - this.state.remoteDataType?.description - ) - : null} - -
      - +
      {t("addData.localAdd")}
      +
      + + + {this.state.localDataType?.description + ? parseCustomMarkdownToReactWithOptions( + this.state.localDataType?.description + ) + : null} + + - {this.state.isLoading && } - -
      - +
      + + )} + {this.props.activeTab === "web" && ( + <> +
      {t("addData.webAdd")}
      +
      + + + {this.state.remoteDataType?.description + ? parseCustomMarkdownToReactWithOptions( + this.state.remoteDataType?.description + ) + : null} + +
      + + + {this.state.isLoading && } + +
      + + )}
      ); }, diff --git a/lib/ReactViews/ExplorerWindow/Tabs/MyDataTab/MyDataTab.jsx b/lib/ReactViews/ExplorerWindow/Tabs/MyDataTab/MyDataTab.jsx index 2331e66977b..de13e91044f 100644 --- a/lib/ReactViews/ExplorerWindow/Tabs/MyDataTab/MyDataTab.jsx +++ b/lib/ReactViews/ExplorerWindow/Tabs/MyDataTab/MyDataTab.jsx @@ -137,37 +137,39 @@ class MyDataTab extends React.Component { [Styles.oneCol]: !showTwoColumn })} > - - - this.resetTab()} - onFileAddFinished={this.props.onFileAddFinished} - onUrlAddFinished={this.props.onUrlAddFinished} - localDataTypes={this.props.localDataTypes} - remoteDataTypes={this.props.remoteDataTypes} - /> - - + {this.state.activeTab && ( + <> + + this.resetTab()} + onFileAddFinished={this.props.onFileAddFinished} + onUrlAddFinished={this.props.onUrlAddFinished} + localDataTypes={this.props.localDataTypes} + remoteDataTypes={this.props.remoteDataTypes} + /> + + )} + {showTwoColumn && (

      @@ -188,10 +190,10 @@ class MyDataTab extends React.Component { />

    - - {this.renderPromptBox()} + )} + {!this.state.activeTab && this.renderPromptBox()}
    - + {showTwoColumn && ( - + )} ); } diff --git a/lib/ReactViews/Map/MenuBar/MenuBar.jsx b/lib/ReactViews/Map/MenuBar/MenuBar.jsx index 51466898134..80831e80cc2 100644 --- a/lib/ReactViews/Map/MenuBar/MenuBar.jsx +++ b/lib/ReactViews/Map/MenuBar/MenuBar.jsx @@ -56,13 +56,13 @@ const MenuBar = observer((props) => { )} - + {!viewState.useSmallScreenInterface && (
  • {element}
  • -
    + )}
    @@ -83,7 +83,7 @@ const MenuBar = observer((props) => { ) : null} - + {storyEnabled && (
    • { />
    -
    + )}
    • { />
    - + {!viewState.useSmallScreenInterface && (
  • {element}
  • -
    + )}
    ); diff --git a/lib/ReactViews/Map/Panels/DropdownPanel.jsx b/lib/ReactViews/Map/Panels/DropdownPanel.jsx index de08a135ec0..2ecd9bbc4fa 100644 --- a/lib/ReactViews/Map/Panels/DropdownPanel.jsx +++ b/lib/ReactViews/Map/Panels/DropdownPanel.jsx @@ -111,14 +111,10 @@ const DropdownPanel = createReactClass({ }`} `} > - - - - - {this.props.btnText} - + {this.props.theme.icon && } + {this.props.btnText && {this.props.btnText}} - + {this.isOpen() && ( {this.props.children} - + )}
    ); } diff --git a/lib/ReactViews/Map/Panels/HelpPanel/HelpVideoPanel.jsx b/lib/ReactViews/Map/Panels/HelpPanel/HelpVideoPanel.jsx index 1a4aac2c5e5..93101fe8cfc 100644 --- a/lib/ReactViews/Map/Panels/HelpPanel/HelpVideoPanel.jsx +++ b/lib/ReactViews/Map/Panels/HelpPanel/HelpVideoPanel.jsx @@ -76,50 +76,52 @@ class HelpVideoPanel extends React.Component { `} scroll > - - {this.props.videoUrl && this.props.placeholderImage && ( -
    -
    - + +
    +
    - -
    - )} - {this.props.markdownContent && ( - - )} - - + )} + {this.props.markdownContent && ( + + )} + + )} + {helpItemType === "slider" && ( - - + )} + {helpItemType === "trainer" && ( - + )}
    ) diff --git a/lib/ReactViews/Map/Panels/InnerPanel.jsx b/lib/ReactViews/Map/Panels/InnerPanel.jsx index 5eec2290d3b..c2594e35187 100644 --- a/lib/ReactViews/Map/Panels/InnerPanel.jsx +++ b/lib/ReactViews/Map/Panels/InnerPanel.jsx @@ -161,11 +161,7 @@ const InnerPanel = createReactClass({ > - + {defined(this.props.caretOffset) && !this.props.showDropdownAsModal && ( p.theme.dark}; `} /> - + )}
    {this.props.children}
    ); diff --git a/lib/ReactViews/Map/Panels/MobilePanel.jsx b/lib/ReactViews/Map/Panels/MobilePanel.jsx index bf5f1f72189..39c2e0220ce 100644 --- a/lib/ReactViews/Map/Panels/MobilePanel.jsx +++ b/lib/ReactViews/Map/Panels/MobilePanel.jsx @@ -29,20 +29,22 @@ const MobilePanel = createReactClass({ caption={this.props.btnText} icon={this.props.mobileIcon} /> - - {/* The overlay doesn't actually need to do anything except block clicks, as InnerPanel will listen to the window */} -
    - - - {this.props.children} - - + {this.isOpen() && ( + <> + {/* The overlay doesn't actually need to do anything except block clicks, as InnerPanel will listen to the window */} +
    + + + {this.props.children} + + + )}
    ); } diff --git a/lib/ReactViews/Map/Panels/SharePanel/StorySharePanel.jsx b/lib/ReactViews/Map/Panels/SharePanel/StorySharePanel.jsx index 084178915bf..9b80b1c78fc 100644 --- a/lib/ReactViews/Map/Panels/SharePanel/StorySharePanel.jsx +++ b/lib/ReactViews/Map/Panels/SharePanel/StorySharePanel.jsx @@ -76,7 +76,7 @@ const StorySharePanel = createReactClass({ > {this.props.btnText ? this.props.btnText : ""} - + {this.isOpen() && (
    -
    + )} ); } diff --git a/lib/ReactViews/Map/Panels/ToolsPanel/ToolsPanel.jsx b/lib/ReactViews/Map/Panels/ToolsPanel/ToolsPanel.jsx index 397c7e51cf3..634f6ac8165 100644 --- a/lib/ReactViews/Map/Panels/ToolsPanel/ToolsPanel.jsx +++ b/lib/ReactViews/Map/Panels/ToolsPanel/ToolsPanel.jsx @@ -30,13 +30,13 @@ const ToolsPanel = observer(() => { isOpen={isOpen} smallScreen={viewState.useSmallScreenInterface} > - + {isOpen && (
    -
    + )}
    diff --git a/lib/ReactViews/Mobile/MobileHeader.jsx b/lib/ReactViews/Mobile/MobileHeader.jsx index 63800fa92a2..0c24824cace 100644 --- a/lib/ReactViews/Mobile/MobileHeader.jsx +++ b/lib/ReactViews/Mobile/MobileHeader.jsx @@ -194,7 +194,7 @@ class MobileHeader extends React.Component { styledHeight="20px" /> - 0}> + {nowViewingLength > 0 && ( - + )} - + )}
    - + {denyText && ( - + )} diff --git a/lib/ReactViews/Preview/DataPreviewUrl.jsx b/lib/ReactViews/Preview/DataPreviewUrl.jsx index 83ae3bbc605..420d29b98ec 100644 --- a/lib/ReactViews/Preview/DataPreviewUrl.jsx +++ b/lib/ReactViews/Preview/DataPreviewUrl.jsx @@ -23,7 +23,7 @@ const DataPreviewUrl = createReactClass({ return (

    {this.props.metadataItem.typeName} URL

    - + {this.props.metadataItem.type === "wms" && (

    This is a @@ -38,8 +38,8 @@ const DataPreviewUrl = createReactClass({ software with this URL:

    -
    - + )} + {this.props.metadataItem.type === "wfs" && (

    This is a @@ -54,7 +54,7 @@ const DataPreviewUrl = createReactClass({ GIS software with this URL:

    -
    + )} - + {(this.props.metadataItem.type === "wms" || + (this.props.metadataItem.type === "esri-mapServer" && + this.props.metadataItem.layers)) && (

    Layer name {this.props.metadataItem.layers.split(",").length > 1 ? "s" : ""}: {this.props.metadataItem.layers}

    -
    - + )} + {this.props.metadataItem.type === "wfs" && (

    Type name {this.props.metadataItem.typeNames.split(",").length > 1 ? "s" : ""} : {this.props.metadataItem.typeNames}

    -
    + )}
    ); } diff --git a/lib/ReactViews/Preview/Description.jsx b/lib/ReactViews/Preview/Description.jsx index cfb32fdd38c..444b71a5316 100644 --- a/lib/ReactViews/Preview/Description.jsx +++ b/lib/ReactViews/Preview/Description.jsx @@ -42,164 +42,159 @@ class Description extends React.Component { } `} > - + {catalogItem.isExperiencingIssues && ( {t("preview.mayBeExperiencingIssues")} - + )} - 0 - } - > + {catalogItem.description && catalogItem.description.length > 0 && (

    {t("description.name")}

    {parseCustomMarkdownToReact(catalogItem.description, { catalogItem: catalogItem })}
    -
    + )} - -

    {t("description.dataLocal")}

    -
    + {catalogItem.hasLocalData &&

    {t("description.dataLocal")}

    } - + {!catalogItem.hasLocalData && !catalogItem.hasDescription && (

    {t("description.dataNotLocal")}

    -
    + )} - 0}> -

    {t("description.metadataUrls")}

    - - - p.theme.colorPrimary}; - `} - > - - - - {metadataUrl.url} - - - -
    + {metadataUrls && metadataUrls.length > 0 && ( + <> +

    {t("description.metadataUrls")}

    + + + p.theme.colorPrimary}; + `} + > + {metadataUrl.title && ( + + )} + {!metadataUrl.title ? metadataUrl.url : null} + + + + + )} - 0 - } - > + {catalogItem.dataCustodian && catalogItem.dataCustodian.length > 0 && (

    {t("description.dataCustodian")}

    {parseCustomMarkdownToReact(catalogItem.dataCustodian, { catalogItem: catalogItem })}
    -
    + )} - - -

    {catalogItem.typeName} URL

    - - -

    - - This is a - - WMS service - - , which generates map images on request. It can be used in - GIS software with this URL: - -

    -
    - -

    - - This is a - - WFS service - - , which transfers raw spatial data on request. It can be - used in GIS software with this URL: - -

    -
    -
    + {!catalogItem.hideSource && ( + <> + {catalogItem.url && ( + <> +

    {catalogItem.typeName} URL

    + + +

    + + This is a + + WMS service + + , which generates map images on request. It can be used + in GIS software with this URL: + +

    +
    + +

    + + This is a + + WFS service + + , which transfers raw spatial data on request. It can be + used in GIS software with this URL: + +

    +
    +
    - - - {catalogItem.url} - - - e.target.select()} - /> - - + + + {catalogItem.url} + + + e.target.select()} + /> + + - - -

    - {t("description.layerName")} - {(catalogItem.layers || "").split(",").length > 1 - ? "s" - : ""}: {catalogItem.layers} -

    -
    - -

    - {t("description.typeName")} - {(catalogItem.typeNames || "").split(",").length > 1 - ? "s" - : ""} - : {catalogItem.typeNames} -

    -
    -
    -
    + + +

    + {t("description.layerName")} + {(catalogItem.layers || "").split(",").length > 1 + ? "s" + : ""} + : {catalogItem.layers} +

    +
    + +

    + {t("description.typeName")} + {(catalogItem.typeNames || "").split(",").length > 1 + ? "s" + : ""} + : {catalogItem.typeNames} +

    +
    +
    + + )} - 0}> -

    {t("description.dataUrl")}

    - - - - {dataUrl.type?.startsWith("wfs") && - parseCustomMarkdownToReact( - t("description.useLinkBelow", { - link: ` + {dataUrls && dataUrls.length > 0 && ( + <> +

    {t("description.dataUrl")}

    + + + + {dataUrl.type?.startsWith("wfs") && + parseCustomMarkdownToReact( + t("description.useLinkBelow", { + link: ` ` - }) - )} - {dataUrl.type?.startsWith("wcs") && - parseCustomMarkdownToReact( - t("description.useLinkBelow", { - link: ` + }) + )} + {dataUrl.type?.startsWith("wcs") && + parseCustomMarkdownToReact( + t("description.useLinkBelow", { + link: ` ` - }) - )} - - - - p.theme.colorPrimary}; - `} - > - - - - {dataUrl.url} - - - -
    + }) + )} + + + + p.theme.colorPrimary}; + `} + > + {dataUrl.title && ( + + )} + {!dataUrl.title ? dataUrl.url : null} + + + + + )} - - 0 - } - > -
    - - - -
    -
    - 0 - } - > -
    - - - -
    -
    -
    -
    + {!this.props.printView && defined(catalogItem.metadata) && ( + <> + {defined(catalogItem.metadata.dataSourceMetadata) && + catalogItem.metadata.dataSourceMetadata.items.length > 0 && ( +
    + + + +
    + )} + {defined(catalogItem.metadata.dataSourceMetadata) && + catalogItem.metadata.dataSourceMetadata.items.length > 0 && ( +
    + + + +
    + )} + + )} + + )} {!this.props.printView ? ( ) : null} diff --git a/lib/ReactViews/Preview/GroupPreview.jsx b/lib/ReactViews/Preview/GroupPreview.jsx index c412a96ca37..65f49d82c88 100644 --- a/lib/ReactViews/Preview/GroupPreview.jsx +++ b/lib/ReactViews/Preview/GroupPreview.jsx @@ -74,18 +74,18 @@ class GroupPreview extends React.Component { />
    - + {this.props.previewed.loadMetadataResult?.error && ( - - + )} + {this.props.previewed.loadMembersResult?.error && ( - + )}
    @@ -107,24 +107,20 @@ class GroupPreview extends React.Component { - + {metadataItem.dataCustodian && (

    {t("preview.dataCustodian")}

    {parseCustomMarkdownToReact(metadataItem.dataCustodian, { catalogItem: metadataItem })}
    -
    + )} - - - + {metadataItem.url && + metadataItem.url.length && + !metadataItem.hideSource && ( + + )}
    diff --git a/lib/ReactViews/Preview/MappablePreview.jsx b/lib/ReactViews/Preview/MappablePreview.jsx index 61b7a8c3541..2d21f3d34b5 100644 --- a/lib/ReactViews/Preview/MappablePreview.jsx +++ b/lib/ReactViews/Preview/MappablePreview.jsx @@ -66,21 +66,17 @@ class MappablePreview extends React.Component { const catalogItem = this.props.previewed; return (
    - - - + {MappableMixin.isMixedInto(catalogItem) && + !catalogItem.disablePreview && ( + + )}
    - + {catalogItem.loadMetadataResult?.error && ( - - + )} + {catalogItem.loadMapItemsResult?.error && ( - + )}
    diff --git a/lib/ReactViews/Preview/MetadataTable.jsx b/lib/ReactViews/Preview/MetadataTable.jsx index 89ba5d80ba4..1f270582971 100644 --- a/lib/ReactViews/Preview/MetadataTable.jsx +++ b/lib/ReactViews/Preview/MetadataTable.jsx @@ -29,15 +29,11 @@ const MetadataTable = createReactClass({ - 0 && isJoinable(metadataItem) - } - > + {metadataItem.length > 0 && isJoinable(metadataItem) && ( {metadataItem.join(", ")} - + )} 0 && !isArr}> @@ -54,14 +50,10 @@ const MetadataTable = createReactClass({ isObservableArray(metadataItem[key]) } > - 0 && - isJoinable(metadataItem[key]) - } - > - {metadataItem[key].join(", ")} - + {metadataItem[key].length > 0 && + isJoinable(metadataItem[key]) + ? metadataItem[key].join(", ") + : null} {metadataItem[key]} diff --git a/lib/ReactViews/Search/Breadcrumbs.jsx b/lib/ReactViews/Search/Breadcrumbs.jsx index c70435a7b3d..c863f43054d 100644 --- a/lib/ReactViews/Search/Breadcrumbs.jsx +++ b/lib/ReactViews/Search/Breadcrumbs.jsx @@ -99,13 +99,13 @@ class Breadcrumbs extends React.Component { - + {i !== parentGroups.length - 1 && ( {">"} - + )} )} diff --git a/lib/ReactViews/Search/SearchBoxAndResults.jsx b/lib/ReactViews/Search/SearchBoxAndResults.jsx index 36f5fd82645..73de17a905e 100644 --- a/lib/ReactViews/Search/SearchBoxAndResults.jsx +++ b/lib/ReactViews/Search/SearchBoxAndResults.jsx @@ -165,7 +165,7 @@ export class SearchBoxAndResultsRaw extends React.Component { /> {/* Results */} - + {shouldShowResults && ( - + )} ); diff --git a/lib/ReactViews/WelcomeMessage/WelcomeMessage.jsx b/lib/ReactViews/WelcomeMessage/WelcomeMessage.jsx index 5ef747bb44f..1df80969196 100644 --- a/lib/ReactViews/WelcomeMessage/WelcomeMessage.jsx +++ b/lib/ReactViews/WelcomeMessage/WelcomeMessage.jsx @@ -241,72 +241,78 @@ export const WelcomeMessagePure = (props) => { - - - { - viewState.terria.configParameters.welcomeMessageVideo - .videoTitle - } - - - - - - + + { viewState.terria.configParameters.welcomeMessageVideo - .placeholderImage + .videoTitle } - backgroundBlackOverlay={"50%"} - > - - viewState.setVideoGuideVisible(WELCOME_MESSAGE_VIDEO) + + + + )} + + {!viewState.useSmallScreenInterface && ( + <> + - - - - - + + viewState.setVideoGuideVisible(WELCOME_MESSAGE_VIDEO) + } + > + + + + + + )} - - { - handleClose(false); - // not sure if we should wait for the exit animation, - // if we don't, we have a flicker due to the difference - // in overlay darkness - but if we wait, it goes - // dark -> light -> dark anyway.. - setShouldTakeTour(true); - viewState.setTourIndex(0); - viewState.setShowTour(true); - viewState.setTopElement(TourPortalDisplayName); - }} - buttonText={t("welcomeMessage.tourBtnText")} - buttonIcon={Icon.GLYPHS.tour} - /> - - { - handleClose(false); - setShouldOpenHelp(true); - }} - /> - + {!viewState.useSmallScreenInterface && ( + <> + { + handleClose(false); + // not sure if we should wait for the exit animation, + // if we don't, we have a flicker due to the difference + // in overlay darkness - but if we wait, it goes + // dark -> light -> dark anyway.. + setShouldTakeTour(true); + viewState.setTourIndex(0); + viewState.setShowTour(true); + viewState.setTopElement(TourPortalDisplayName); + }} + buttonText={t("welcomeMessage.tourBtnText")} + buttonIcon={Icon.GLYPHS.tour} + /> + + { + handleClose(false); + setShouldOpenHelp(true); + }} + /> + + )} { )} - - - + {!viewState.useSmallScreenInterface && } diff --git a/lib/ReactViews/Workbench/Controls/TimerSection.jsx b/lib/ReactViews/Workbench/Controls/TimerSection.jsx index e6a0d07399f..f72abafe627 100644 --- a/lib/ReactViews/Workbench/Controls/TimerSection.jsx +++ b/lib/ReactViews/Workbench/Controls/TimerSection.jsx @@ -110,7 +110,7 @@ class TimerSection extends React.Component { const { t } = this.props; return ( <> - + {this.isEnabled() && (
    - + )} ); } From 611fdee03d9885a615be117c9a006ffbfcf99ab3 Mon Sep 17 00:00:00 2001 From: Nanda Date: Thu, 5 Oct 2023 17:44:08 +1100 Subject: [PATCH 301/654] Clipping box: - reposition box - improved cursors - bug fixes --- lib/ModelMixins/ClippingMixin.ts | 269 +++++++++-------- lib/Models/BoxDrawing.ts | 270 ++++++++++++++---- lib/Models/BoxDrawing/cursors.ts | 38 +++ .../SelectableDimensions.ts | 5 + lib/ReactViews/SelectableDimensions/Group.tsx | 86 +++--- .../ClippingBox/ClippingBoxToolLauncher.tsx | 6 +- .../ClippingBox/RepositionClippingBox.tsx | 28 +- .../Tools/ClippingBox/featureFlags.ts | 11 - wwwroot/models/Box.glb | Bin 1664 -> 0 bytes 9 files changed, 476 insertions(+), 237 deletions(-) create mode 100644 lib/Models/BoxDrawing/cursors.ts delete mode 100644 lib/ReactViews/Tools/ClippingBox/featureFlags.ts delete mode 100644 wwwroot/models/Box.glb diff --git a/lib/ModelMixins/ClippingMixin.ts b/lib/ModelMixins/ClippingMixin.ts index 56bd89a95bc..bed517d695a 100644 --- a/lib/ModelMixins/ClippingMixin.ts +++ b/lib/ModelMixins/ClippingMixin.ts @@ -5,12 +5,14 @@ import { makeObservable, observable, override, - toJS + toJS, + untracked } from "mobx"; import Cartesian3 from "terriajs-cesium/Source/Core/Cartesian3"; import Cartographic from "terriajs-cesium/Source/Core/Cartographic"; import clone from "terriajs-cesium/Source/Core/clone"; import Color from "terriajs-cesium/Source/Core/Color"; +import Ellipsoid from "terriajs-cesium/Source/Core/Ellipsoid"; import HeadingPitchRoll from "terriajs-cesium/Source/Core/HeadingPitchRoll"; import Matrix3 from "terriajs-cesium/Source/Core/Matrix3"; import Matrix4 from "terriajs-cesium/Source/Core/Matrix4"; @@ -31,7 +33,6 @@ import SelectableDimensions, { SelectableDimension, SelectableDimensionCheckboxGroup } from "../Models/SelectableDimensions/SelectableDimensions"; -import { zoomAndRepositioningEnabled } from "../ReactViews/Tools/ClippingBox/featureFlags"; import Icon from "../Styled/Icon"; import ClippingPlanesTraits from "../Traits/TraitsClasses/ClippingPlanesTraits"; import HeadingPitchRollTraits from "../Traits/TraitsClasses/HeadingPitchRollTraits"; @@ -140,6 +141,14 @@ function ClippingMixin>(Base: T) { unionClippingRegions: this.clippingBox.clipDirection === "outside", enabled: this.clippingBox.clipModel }); + + untracked(() => { + Matrix4.multiply( + this.inverseClippingPlanesOriginMatrix, + this.clippingBoxTransform, + this.clippingPlaneModelMatrix + ); + }); clippingPlaneCollection.modelMatrix = this.clippingPlaneModelMatrix; return clippingPlaneCollection; } @@ -157,29 +166,28 @@ function ClippingMixin>(Base: T) { } @computed - get clippingBoxDrawing(): BoxDrawing | undefined { - const options = this.clippingBox; - const cesium = this.terria.cesium; - if ( - !cesium || - !options.enableFeature || - !options.clipModel || - !options.showClippingBox - ) { - if (this._clippingBoxDrawing) { - this._clippingBoxDrawing = undefined; - } - return; - } - - const clippingPlanesOriginMatrix = this.clippingPlanesOriginMatrix(); - + private get clippingBoxDimensions(): Cartesian3 { const dimensions = new Cartesian3( this.clippingBox.dimensions.length ?? 100, this.clippingBox.dimensions.width ?? 100, this.clippingBox.dimensions.height ?? 100 ); + return dimensions; + } + + @computed + private get clippingBoxHpr(): HeadingPitchRoll | undefined { + const { heading, pitch, roll } = this.clippingBox.rotation; + return heading !== undefined && pitch !== undefined && roll !== undefined + ? HeadingPitchRoll.fromDegrees(heading, pitch, roll) + : undefined; + } + + @computed + private get clippingBoxPosition(): Cartesian3 { + const dimensions = this.clippingBoxDimensions; + const clippingPlanesOriginMatrix = this.clippingPlanesOriginMatrix(); let position = LatLonHeightTraits.toCartesian(this.clippingBox.position); if (!position) { // Use clipping plane origin as position but height set to 0 so that the box is grounded. @@ -190,9 +198,8 @@ function ClippingMixin>(Base: T) { // Although it is not reflected in the typescript type. if (cartographic) { cartographic.height = dimensions.z / 2; - position = Cartographic.toCartesian( + position = Ellipsoid.WGS84.cartographicToCartesian( cartographic, - cesium.scene.globe.ellipsoid, new Cartesian3() ); } @@ -200,20 +207,14 @@ function ClippingMixin>(Base: T) { // Nothing we can do - assign to zero position ??= Cartesian3.ZERO.clone(); + return position; + } - let hpr: HeadingPitchRoll | undefined; - if ( - this.clippingBox.rotation.heading !== undefined && - this.clippingBox.rotation.pitch !== undefined && - this.clippingBox.rotation.roll !== undefined - ) { - hpr = HeadingPitchRoll.fromDegrees( - this.clippingBox.rotation.heading, - this.clippingBox.rotation.pitch, - this.clippingBox.rotation.roll - ); - } - + @computed + private get clippingBoxTransform(): Matrix4 { + const hpr = this.clippingBoxHpr; + const position = this.clippingBoxPosition; + const dimensions = this.clippingBoxDimensions; const boxTransform = Matrix4.multiply( hpr ? Matrix4.fromRotationTranslation( @@ -224,7 +225,26 @@ function ClippingMixin>(Base: T) { Matrix4.fromScale(dimensions, new Matrix4()), new Matrix4() ); + return boxTransform; + } + @computed + get clippingBoxDrawing(): BoxDrawing | undefined { + const options = this.clippingBox; + const cesium = this.terria.cesium; + if ( + !cesium || + !options.enableFeature || + !options.clipModel || + !options.showClippingBox + ) { + if (this._clippingBoxDrawing) { + this._clippingBoxDrawing = undefined; + } + return; + } + + const boxTransform = this.clippingBoxTransform; Matrix4.multiply( this.inverseClippingPlanesOriginMatrix, boxTransform, @@ -288,6 +308,16 @@ function ClippingMixin>(Base: T) { return this._clippingBoxDrawing; } + @computed + private get isClippingBoxPlaced() { + const { longitude, latitude, height } = this.clippingBox.position; + return ( + longitude !== undefined && + latitude !== undefined && + height !== undefined + ); + } + @override get selectableDimensions(): SelectableDimension[] { if (!this.clippingBox.enableFeature) { @@ -295,84 +325,92 @@ function ClippingMixin>(Base: T) { } const checkboxGroupInputs: SelectableDimensionCheckboxGroup["selectableDimensions"] = - [ - { - // Checkbox to show/hide clipping box - id: "show-clip-editor-ui", - type: "checkbox", - selectedId: this.clippingBox.showClippingBox ? "true" : "false", - disable: this.clippingBox.clipModel === false, - options: [ + this.repositionClippingBoxTrigger + ? [ + /* don't show options when repositioning clipping box */ + ] + : [ { - id: "true", - name: i18next.t("models.clippingBox.showClippingBox") + // Checkbox to show/hide clipping box + id: "show-clip-editor-ui", + type: "checkbox", + selectedId: this.clippingBox.showClippingBox ? "true" : "false", + disable: this.clippingBox.clipModel === false, + options: [ + { + id: "true", + name: i18next.t("models.clippingBox.showClippingBox") + }, + { + id: "false", + name: i18next.t("models.clippingBox.showClippingBox") + } + ], + setDimensionValue: (stratumId, value) => { + this.clippingBox.setTrait( + stratumId, + "showClippingBox", + value === "true" + ); + } }, { - id: "false", - name: i18next.t("models.clippingBox.showClippingBox") - } - ], - setDimensionValue: (stratumId, value) => { - this.clippingBox.setTrait( - stratumId, - "showClippingBox", - value === "true" - ); - } - }, - { - // Checkbox to clamp/unclamp box to ground - id: "clamp-box-to-ground", - type: "checkbox", - selectedId: this.clippingBox.keepBoxAboveGround ? "true" : "false", - disable: - this.clippingBox.clipModel === false || - this.clippingBox.showClippingBox === false, - options: [ - { - id: "true", - name: i18next.t("models.clippingBox.keepBoxAboveGround") + // Checkbox to clamp/unclamp box to ground + id: "clamp-box-to-ground", + type: "checkbox", + selectedId: this.clippingBox.keepBoxAboveGround + ? "true" + : "false", + disable: + this.clippingBox.clipModel === false || + this.clippingBox.showClippingBox === false, + options: [ + { + id: "true", + name: i18next.t("models.clippingBox.keepBoxAboveGround") + }, + { + id: "false", + name: i18next.t("models.clippingBox.keepBoxAboveGround") + } + ], + setDimensionValue: (stratumId, value) => { + this.clippingBox.setTrait( + stratumId, + "keepBoxAboveGround", + value === "true" + ); + } }, { - id: "false", - name: i18next.t("models.clippingBox.keepBoxAboveGround") - } - ], - setDimensionValue: (stratumId, value) => { - this.clippingBox.setTrait( - stratumId, - "keepBoxAboveGround", - value === "true" - ); - } - }, - { - // Dropdown to change the clipping direction - id: "clip-direction", - name: i18next.t("models.clippingBox.clipDirection.name"), - type: "select", - selectedId: this.clippingBox.clipDirection, - disable: this.clippingBox.clipModel === false, - options: [ - { - id: "inside", - name: i18next.t( - "models.clippingBox.clipDirection.options.inside" - ) + // Dropdown to change the clipping direction + id: "clip-direction", + name: i18next.t("models.clippingBox.clipDirection.name"), + type: "select", + selectedId: this.clippingBox.clipDirection, + disable: + this.clippingBox.clipModel === false || + this.clippingBox.showClippingBox === false, + options: [ + { + id: "inside", + name: i18next.t( + "models.clippingBox.clipDirection.options.inside" + ) + }, + { + id: "outside", + name: i18next.t( + "models.clippingBox.clipDirection.options.outside" + ) + } + ], + setDimensionValue: (stratumId, value) => { + this.clippingBox.setTrait(stratumId, "clipDirection", value); + } }, - { - id: "outside", - name: i18next.t( - "models.clippingBox.clipDirection.options.outside" - ) - } - ], - setDimensionValue: (stratumId, value) => { - this.clippingBox.setTrait(stratumId, "clipDirection", value); - } - }, - ...this.repositioningAndZoomingDimensions - ]; + ...this.repositioningAndZoomingDimensions + ]; return [ ...super.selectableDimensions, @@ -391,15 +429,14 @@ function ClippingMixin>(Base: T) { name: i18next.t("models.clippingBox.clipModel") } ], + emptyText: "Click on map to position clipping box", setDimensionValue: action((stratumId, value) => { const clipModel = value === "true"; this.clippingBox.setTrait(stratumId, "clipModel", clipModel); // Trigger clipping box repositioning UI if the feature is enabled // and a box position is not already set. - const triggerClippingBoxRepositioning = - zoomAndRepositioningEnabled(this.terria) && - this.clippingBox.position.longitude === undefined; + const triggerClippingBoxRepositioning = !this.isClippingBoxPlaced; if (triggerClippingBoxRepositioning) { this.repositionClippingBoxTrigger = true; @@ -418,20 +455,14 @@ function ClippingMixin>(Base: T) { */ @computed private get repositioningAndZoomingDimensions(): SelectableDimensionCheckboxGroup["selectableDimensions"] { - if (!zoomAndRepositioningEnabled(this.terria)) { - return []; - } - const repositioningAndZoomingInputs: SelectableDimensionCheckboxGroup["selectableDimensions"] = [ { // Button to zoom to clipping box id: "zoom-to-clipping-box-button", type: "button", - value: "Zoom to clipping box    ", - icon: this._isZoomingToClippingBox - ? "spinner" - : Icon.GLYPHS.geolocation, + value: "Zoom to   ", + icon: this._isZoomingToClippingBox ? "spinner" : Icon.GLYPHS.search, disable: this.clippingBox.clipModel === false || this.clippingBoxDrawing === undefined, @@ -444,8 +475,8 @@ function ClippingMixin>(Base: T) { { id: "reposition-clipping-box", type: "button", - value: "Reposition clipping box", - icon: Icon.GLYPHS.cube, + value: "Reposition", + icon: Icon.GLYPHS.geolocation, disable: this.clippingBox.clipModel === false || this.clippingBoxDrawing === undefined, diff --git a/lib/Models/BoxDrawing.ts b/lib/Models/BoxDrawing.ts index 13fe723c9f1..886a81f9f6c 100644 --- a/lib/Models/BoxDrawing.ts +++ b/lib/Models/BoxDrawing.ts @@ -1,11 +1,12 @@ import throttle from "lodash-es/throttle"; import { + makeObservable, observable, onBecomeObserved, - onBecomeUnobserved, - makeObservable + onBecomeUnobserved } from "mobx"; import ArcType from "terriajs-cesium/Source/Core/ArcType"; +import BoundingSphere from "terriajs-cesium/Source/Core/BoundingSphere"; import Cartesian2 from "terriajs-cesium/Source/Core/Cartesian2"; import Cartesian3 from "terriajs-cesium/Source/Core/Cartesian3"; import Cartographic from "terriajs-cesium/Source/Core/Cartographic"; @@ -16,6 +17,7 @@ import HeadingPitchRoll from "terriajs-cesium/Source/Core/HeadingPitchRoll"; import IntersectionTests from "terriajs-cesium/Source/Core/IntersectionTests"; import JulianDate from "terriajs-cesium/Source/Core/JulianDate"; import KeyboardEventModifier from "terriajs-cesium/Source/Core/KeyboardEventModifier"; +import CesiumMath from "terriajs-cesium/Source/Core/Math"; import Matrix3 from "terriajs-cesium/Source/Core/Matrix3"; import Matrix4 from "terriajs-cesium/Source/Core/Matrix4"; import Plane from "terriajs-cesium/Source/Core/Plane"; @@ -30,15 +32,13 @@ import CallbackProperty from "terriajs-cesium/Source/DataSources/CallbackPropert import ColorMaterialProperty from "terriajs-cesium/Source/DataSources/ColorMaterialProperty"; import CustomDataSource from "terriajs-cesium/Source/DataSources/CustomDataSource"; import Entity from "terriajs-cesium/Source/DataSources/Entity"; -import ModelGraphics from "terriajs-cesium/Source/DataSources/ModelGraphics"; import PlaneGraphics from "terriajs-cesium/Source/DataSources/PlaneGraphics"; import PolylineDashMaterialProperty from "terriajs-cesium/Source/DataSources/PolylineDashMaterialProperty"; import PositionProperty from "terriajs-cesium/Source/DataSources/PositionProperty"; import Axis from "terriajs-cesium/Source/Scene/Axis"; -import ColorBlendMode from "terriajs-cesium/Source/Scene/ColorBlendMode"; import Scene from "terriajs-cesium/Source/Scene/Scene"; -import ShadowMode from "terriajs-cesium/Source/Scene/ShadowMode"; import isDefined from "../Core/isDefined"; +import { CustomCursorType, getCustomCssCursor } from "./BoxDrawing/cursors"; import Cesium from "./Cesium"; export type ChangeEvent = { @@ -112,7 +112,6 @@ type ScalePoint = Entity & Interactable & CameraAware & { position: PositionProperty; - model: ModelGraphics; oppositeScalePoint: ScalePoint; axisLine: Entity; }; @@ -244,7 +243,7 @@ export default class BoxDrawing { @observable public dataSource: CustomDataSource; - public keepBoxAboveGround: boolean; + private _keepBoxAboveGround = false; private drawNonUniformScaleGrips: boolean; @@ -274,9 +273,17 @@ export default class BoxDrawing { // Scale points on the box defined as cesium entities with additional properties private readonly scalePoints: ScalePoint[] = []; + private readonly edges: Edge[] = []; + private isHeightUpdateInProgress: boolean = false; private terrainHeightEstimate: number = 0; + // Flag to turn scaling interaction on or off + private _enableScaling = true; + + // Flag to turn rotation interaction on or off + private _enableRotation = true; + /** * A private constructor. Use {@link BoxDrawing.fromTransform} or {@link BoxDrawing.fromTranslationRotationScale} to create instances. */ @@ -369,6 +376,43 @@ export default class BoxDrawing { this.updateBox(); } + get keepBoxAboveGround() { + return this._keepBoxAboveGround; + } + + set keepBoxAboveGround(value: boolean) { + if (this._keepBoxAboveGround === value) { + return; + } + + this._keepBoxAboveGround = value; + this.setBoxAboveGround().then(() => { + this.onChange?.({ + modelMatrix: this.modelMatrix, + translationRotationScale: this.trs, + isFinished: true + }); + }); + } + + get enableScaling() { + return this._enableScaling; + } + + set enableScaling(enable: boolean) { + this._enableScaling = enable; + this.scalePoints.forEach((scalePoint) => (scalePoint.show = enable)); + } + + get enableRotation() { + return this._enableRotation; + } + + set enableRotation(enable: boolean) { + this._enableRotation = enable; + this.edges.forEach((edge) => (edge.show = enable)); + } + /** * Moves the box by the provided moveStep with optional clamping applied so that the * box does not go underground. @@ -444,12 +488,21 @@ export default class BoxDrawing { return; } + const boxCenter = + this.trs.translation && + Cartographic.fromCartesian( + this.trs.translation, + undefined, + scratchBoxCenter + ); + + if (!boxCenter) { + this.terrainHeightEstimate = 0; + return; + } + this.isHeightUpdateInProgress = true; - const boxCenter = Cartographic.fromCartesian( - this.trs.translation, - undefined, - scratchBoxCenter - ); + try { const [floor] = await sampleTerrainMostDetailed(terrainProvider, [ Cartographic.clone(boxCenter, scratchFloor) @@ -463,13 +516,13 @@ export default class BoxDrawing { }; })(); - setBoxAboveGround() { + async setBoxAboveGround(): Promise { if (!this.keepBoxAboveGround) { return; } // Get the latest terrain height estimate and update the box position - this.updateTerrainHeightEstimate(true).then(() => { + return this.updateTerrainHeightEstimate(true).then(() => { this.moveBoxWithClamping(Cartesian3.ZERO); this.updateBox(); }); @@ -575,6 +628,10 @@ export default class BoxDrawing { return; } + if (state.is === "picked") { + handleRelease(click); + } + if (state.is === "hovering") { state.entity.onMouseOut({ startPosition: click.position, @@ -724,7 +781,7 @@ export default class BoxDrawing { localEdges.forEach((localEdge) => { const edge = this.createEdge(localEdge); this.dataSource.entities.add(edge); - //this.edges.push(edge); + this.edges.push(edge); }); } @@ -744,8 +801,20 @@ export default class BoxDrawing { -1, new Cartesian3() ); - const scalePoint1 = this.createScalePoint(pointLocal1); - const scalePoint2 = this.createScalePoint(pointLocal2); + const scalePoint1 = this.createScalePoint( + pointLocal1, + Cartesian3.normalize( + Cartesian3.subtract(pointLocal1, pointLocal2, new Cartesian3()), + new Cartesian3() + ) + ); + const scalePoint2 = this.createScalePoint( + pointLocal2, + Cartesian3.normalize( + Cartesian3.subtract(pointLocal2, pointLocal1, new Cartesian3()), + new Cartesian3() + ) + ); scalePoint1.oppositeScalePoint = scalePoint2; scalePoint2.oppositeScalePoint = scalePoint1; const axisLine = this.createScaleAxisLine(scalePoint1, scalePoint2); @@ -777,7 +846,7 @@ export default class BoxDrawing { const style: Readonly = { fillColor: Color.WHITE.withAlpha(0.1), outlineColor: Color.WHITE, - highlightFillColor: Color.WHITE.withAlpha(0.1), + highlightFillColor: Color.WHITE.withAlpha(0.2), highlightOutlineColor: Color.CYAN }; let isHighlighted = false; @@ -838,6 +907,7 @@ export default class BoxDrawing { const scratchMoveStep = new Cartesian3(); const scratchPickPosition = new Cartesian3(); + const isTopOrBottomSide = axis === Axis.Z; const moveStartPos = new Cartesian2(); const pickedPointOffset = new Cartesian3(); let dragStart = false; @@ -1038,7 +1108,9 @@ export default class BoxDrawing { const onMouseOver = () => { highlightAllSides(); - setCanvasCursor(scene, "grab"); + isTopOrBottomSide + ? setCanvasCursor(scene, "n-resize") + : setCustomCanvasCursor(scene, "grab", "ew-resize"); }; const onMouseOut = () => { @@ -1050,7 +1122,9 @@ export default class BoxDrawing { Cartesian2.clone(click.position, moveStartPos); dragStart = true; highlightAllSides(); - setCanvasCursor(scene, "grabbing"); + isTopOrBottomSide + ? setCanvasCursor(scene, "n-resize") + : setCustomCanvasCursor(scene, "grabbing", "ew-resize"); }; const onPickDisabled = () => { @@ -1084,8 +1158,6 @@ export default class BoxDrawing { Cartesian3.dot(normalWc, scene.camera.direction) >= 0; }; - const isTopOrBottomSide = axis === Axis.Z; - // Call enabledFn only if movement is is allowed for this side, otherwise call disabledFn const ifActionEnabled = ( enabledFn: (...args: any[]) => any, @@ -1153,7 +1225,7 @@ export default class BoxDrawing { const onMouseOver = () => { if (isDraggableEdge) { isHighlighted = true; - setCanvasCursor(scene, "pointer"); + setCustomCanvasCursor(scene, "rotate", "pointer"); } }; @@ -1167,7 +1239,7 @@ export default class BoxDrawing { const onPick = () => { if (isDraggableEdge) { isHighlighted = true; - setCanvasCursor(scene, "pointer"); + setCustomCanvasCursor(scene, "rotate", "pointer"); } }; @@ -1229,12 +1301,16 @@ export default class BoxDrawing { * @param pointLocal The scale point in local coordinates. * @returns ScalePoint A cesium entity representing the scale point. */ - private createScalePoint(pointLocal: Cartesian3): ScalePoint { + private createScalePoint( + pointLocal: Cartesian3, + direction: Cartesian3 + ): ScalePoint { const scene = this.scene; const position = new Cartesian3(); + const offsetPosition = new Cartesian3(); const style: Readonly = { - cornerPointColor: Color.RED, - facePointColor: Color.BLUE, + cornerPointColor: Color.RED.brighten(0.5, new Color()), + facePointColor: Color.BLUE.brighten(0.5, new Color()), dimPointColor: Color.GREY.withAlpha(0.2) }; let isFacingCamera = false; @@ -1247,29 +1323,85 @@ export default class BoxDrawing { : style.dimPointColor; }; + const scalePointRadii = new Cartesian3(); + const scratchBoundingSphere = new BoundingSphere(); + const updateScalePointRadii = ( + position: Cartesian3, + boxScale: Cartesian3 + ) => { + // Get size of a pixel in metres at the position of the bounding shpere + position.clone(scratchBoundingSphere.center); + scratchBoundingSphere.radius = 1; + const pixelSize = scene.camera.getPixelSize( + scratchBoundingSphere, + scene.drawingBufferWidth, + scene.drawingBufferHeight + ); + + const maxBoxScale = Cartesian3.maximumComponent(boxScale); + + // Compute radius equivalent to 10 pixels or 0.1 times the box scale whichever is smaller + const radius = Math.min(pixelSize * 10, maxBoxScale * 0.1); + scalePointRadii.x = radius; + scalePointRadii.y = radius; + scalePointRadii.z = radius; + return scalePointRadii; + }; + + const scratchOffset = new Cartesian3(); + const scratchMatrix = new Matrix4(); const update = () => { + // Update grip position Matrix4.multiplyByPoint(this.modelMatrix, pointLocal, position); + + // Update the size of scale points + updateScalePointRadii(position, this.trs.scale); + + // Compute an offset for grips that lie on a face. Without the offset, + // half of the grip will be inside the box thus reducing the clickable + // surface area and creating a bad user experience. So, we want to push + // most of the grip outside the box. Here we compute an offset 0.9 times + // the radius of the point and in an outward direction from the center of + // the box. + const offset = isCornerPoint + ? Cartesian3.ZERO // skip for corner points + : Cartesian3.multiplyByScalar( + // Transform the direction into world co-ordinates, but ignore the scaling + Matrix4.multiplyByPointAsVector( + Matrix4.setScale(this.modelMatrix, Cartesian3.ONE, scratchMatrix), + direction, + scratchOffset + ), + // assuming the grip point has uniform radii + scalePointRadii.x * 0.9, + scratchOffset + ); + + Cartesian3.add(position, offset, offsetPosition); }; + let isHighlighted = false; + const scratchColor = new Color(); const scalePoint: ScalePoint = new Entity({ - position: new CallbackProperty(() => position, false) as any, + position: new CallbackProperty(() => offsetPosition, false) as any, orientation: new CallbackProperty( () => Quaternion.IDENTITY, false ) as any, - model: { - uri: require("file-loader!../../wwwroot/models/Box.glb"), - minimumPixelSize: 12, - maximumScale: new CallbackProperty( - // Clamp the maximum size of the scale grip to the 0.15 times the - // size of the minimum side - () => 0.15 * Cartesian3.minimumComponent(this.trs.scale), + + // Sphere for the scale point + ellipsoid: { + radii: new CallbackProperty( + // update scale point radii to reflect camera distance changes + () => updateScalePointRadii(position, this.trs.scale), false ), - shadows: ShadowMode.DISABLED, - color: new CallbackProperty(() => getColor(), false), - // Forces the above color ignoring the color specified in gltf material - colorBlendMode: ColorBlendMode.REPLACE + material: new ColorMaterialProperty( + new CallbackProperty( + () => getColor().brighten(isHighlighted ? -0.5 : 0.0, scratchColor), + false + ) + ) } }) as ScalePoint; @@ -1278,26 +1410,40 @@ export default class BoxDrawing { const xDot = Math.abs(Cartesian3.dot(new Cartesian3(1, 0, 0), axisLocal)); const yDot = Math.abs(Cartesian3.dot(new Cartesian3(0, 1, 0), axisLocal)); const zDot = Math.abs(Cartesian3.dot(new Cartesian3(0, 0, 1), axisLocal)); - const cursorDirection = - xDot === 1 || yDot === 1 - ? "ew-resize" - : zDot === 1 - ? "ns-resize" - : "nesw-resize"; - const isCornerPoint = xDot && yDot && zDot; const isProportionalScaling = isCornerPoint; - const onMouseOver = () => { + // Return the angle in clockwise direction to rotate the mouse + // cursor so that it points towards the center of the box. + const getCursorRotation = (mousePos: Cartesian2) => { + const boxCenter = scene.cartesianToCanvasCoordinates( + this.trs.translation + ); + // mouse coords relative to the box center + const x = mousePos.x - boxCenter.x; + const y = mousePos.y - boxCenter.y; + + // Math.atan2 gives the angle the (x, y) point makes with the positive + // x-axes in the clockwise direction + const angle = CesiumMath.toDegrees(Math.atan2(y, x)); + return angle; + }; + + const onMouseOver = (mouseMove: MouseMove) => { scalePoint.axisLine.show = true; highlightScalePoint(); - setCanvasCursor(scene, cursorDirection); + //cursor(mouseMove.endPosition); + //setCanvasCursor(scene, cursorDirection); + const cursorRotation = getCursorRotation(mouseMove.endPosition); + setCustomCanvasCursor(scene, "resize", "ew-resize", cursorRotation); }; - const onPick = () => { + const onPick = (mouseClick: MouseClick) => { scalePoint.axisLine.show = true; highlightScalePoint(); - setCanvasCursor(scene, cursorDirection); + + const cursorRotation = getCursorRotation(mouseClick.position); + setCustomCanvasCursor(scene, "resize", "ew-resize", cursorRotation); }; const onRelease = () => { @@ -1446,15 +1592,11 @@ export default class BoxDrawing { }; const highlightScalePoint = () => { - const model = scalePoint.model; - model.silhouetteColor = Color.YELLOW as any; - model.silhouetteSize = 1 as any; + isHighlighted = true; }; const unHighlightScalePoint = () => { - const model = scalePoint.model; - model.silhouetteColor = undefined; - model.silhouetteSize = 0 as any; + isHighlighted = false; }; scalePoint.onPick = onPick; @@ -1723,6 +1865,22 @@ function setCanvasCursor(scene: Scene, cursorType: string) { scene.canvas.style.cursor = cursorType; } +/** + * Set canvas cursor to the custom cursor also applying the rotation on the cursor + * + * @param type Custom cursor type + * @param fallback The standard cusrsor to use as fallback (See https://developer.mozilla.org/en-US/docs/Web/CSS/cursor) + * @param rotation Then angle in clockwise direction to rotate the custom cursor + */ +function setCustomCanvasCursor( + scene: Scene, + type: CustomCursorType, + fallback: string, + rotation = 0 +) { + setCanvasCursor(scene, getCustomCssCursor({ type, fallback, rotation })); +} + /** * Returns the Cartesian position for the window position. */ diff --git a/lib/Models/BoxDrawing/cursors.ts b/lib/Models/BoxDrawing/cursors.ts new file mode 100644 index 00000000000..4d8efbbe76a --- /dev/null +++ b/lib/Models/BoxDrawing/cursors.ts @@ -0,0 +1,38 @@ +/** + * Define only the SVG geometry for individual custom cursors + */ +const CUSTOM_CURSOR_GEOMETRIES = { + rotate: ``, + + resize: ``, + + grabbing: ``, + + grab: `` +}; + +export type CustomCursorType = keyof typeof CUSTOM_CURSOR_GEOMETRIES; + +/** + * Return the CSS value for a custom cursor with rotation applied. + * + * The returned value can be set like: element.style.cursor = getCustomCssCursor(...) + * + * @param name Name of the custom cursor + * @param rotation The clockwise angle in degrees to rotate the cursor + * @param The CSS value to set. + */ +export function getCustomCssCursor(opts: { + type: CustomCursorType; + rotation: number; + fallback: string; +}): string { + const { type, rotation, fallback } = opts; + const geometry = CUSTOM_CURSOR_GEOMETRIES[type]; + + // Build a complete SVG element with rotation applied + const svg = `${geometry}`; + const dataUrl = `data:image/svg+xml,${svg}`; + const cursor = `url("${dataUrl}") 32 32, ${fallback}`; + return cursor; +} diff --git a/lib/Models/SelectableDimensions/SelectableDimensions.ts b/lib/Models/SelectableDimensions/SelectableDimensions.ts index 24135452ecb..b3632662699 100644 --- a/lib/Models/SelectableDimensions/SelectableDimensions.ts +++ b/lib/Models/SelectableDimensions/SelectableDimensions.ts @@ -119,6 +119,11 @@ export interface SelectableDimensionCheckboxGroup EnumDimension<"true" | "false"> { type: "checkbox-group"; + /** + * Text to show if the group is empty + */ + emptyText?: string; + // We don't allow nested groups for now to keep the UI simple readonly selectableDimensions: Exclude< SelectableDimension, diff --git a/lib/ReactViews/SelectableDimensions/Group.tsx b/lib/ReactViews/SelectableDimensions/Group.tsx index 95bb258c24b..4e191eb6755 100644 --- a/lib/ReactViews/SelectableDimensions/Group.tsx +++ b/lib/ReactViews/SelectableDimensions/Group.tsx @@ -1,12 +1,15 @@ import React from "react"; +import styled from "styled-components"; import CommonStrata from "../../Models/Definition/CommonStrata"; import { filterSelectableDimensions, + isCheckboxGroup, isGroup, SelectableDimensionCheckboxGroup as SelectableDimensionCheckboxGroupModel, SelectableDimensionGroup as SelectableDimensionGroupModel } from "../../Models/SelectableDimensions/SelectableDimensions"; import Box from "../../Styled/Box"; +import Text from "../../Styled/Text"; import Collapsible from "../Custom/Collapsible/Collapsible"; import SelectableDimension from "./SelectableDimension"; @@ -24,41 +27,52 @@ export const SelectableDimensionGroup: React.FC<{ // We still show checkbox groups with empty children as they are stateful. if (isGroup(dim) && childDims.length === 0) return null; return ( - opt.id === dim.selectedId)?.name ?? - (dim.selectedId === "true" ? "Enabled" : "Disabled") - } - bodyBoxProps={{ - displayInlineBlock: true, - fullWidth: true - }} - bodyTextProps={{ large: true }} - isOpen={dim.type === "group" ? dim.isOpen : dim.selectedId === "true"} - onToggle={ - dim.type === "group" - ? dim.onToggle - : (isOpen) => - dim.setDimensionValue( - CommonStrata.user, - isOpen ? "true" : "false" - ) - } - btnStyle={dim.type === "checkbox-group" ? "checkbox" : undefined} - btnRight={dim.type === "group"} - > - - {/* recursively render nested dimensions */} - {childDims.map((nestedDim) => ( - - ))} - - + + opt.id === dim.selectedId)?.name ?? + (dim.selectedId === "true" ? "Enabled" : "Disabled") + } + bodyBoxProps={{ + displayInlineBlock: true, + fullWidth: true + }} + bodyTextProps={{ large: true }} + isOpen={dim.type === "group" ? dim.isOpen : dim.selectedId === "true"} + onToggle={ + dim.type === "group" + ? dim.onToggle + : (isOpen) => + dim.setDimensionValue( + CommonStrata.user, + isOpen ? "true" : "false" + ) + } + btnStyle={dim.type === "checkbox-group" ? "checkbox" : undefined} + btnRight={dim.type === "group"} + > + + {isCheckboxGroup(dim) && childDims.length === 0 && dim.emptyText && ( + {dim.emptyText} + )} + {/* recursively render nested dimensions */} + {childDims.map((nestedDim) => ( + + ))} + + + ); }; + +const GroupContainer = styled.div` + padding: 10px 12px; + border-radius: 6px; + background: ${(p) => p.theme.overlay}; +`; diff --git a/lib/ReactViews/Tools/ClippingBox/ClippingBoxToolLauncher.tsx b/lib/ReactViews/Tools/ClippingBox/ClippingBoxToolLauncher.tsx index 26e42109c50..0cf499a6e04 100644 --- a/lib/ReactViews/Tools/ClippingBox/ClippingBoxToolLauncher.tsx +++ b/lib/ReactViews/Tools/ClippingBox/ClippingBoxToolLauncher.tsx @@ -5,7 +5,6 @@ import ClippingMixin from "../../../ModelMixins/ClippingMixin"; import BoxDrawing from "../../../Models/BoxDrawing"; import Workbench from "../../../Models/Workbench"; import ViewState from "../../../ReactViewModels/ViewState"; -import { zoomAndRepositioningEnabled } from "./featureFlags"; import RepositionClippingBox from "./RepositionClippingBox"; interface PropsType { @@ -20,10 +19,7 @@ const TOOL_NAME = "reposition-clipping-box"; */ const ClippingBoxToolLauncher: React.FC = observer( ({ viewState }) => { - const item = zoomAndRepositioningEnabled(viewState.terria) - ? findItemRequiringRepositioning(viewState.terria.workbench) - : undefined; - + const item = findItemRequiringRepositioning(viewState.terria.workbench); const cesium = viewState.terria.cesium; useEffect( function init() { diff --git a/lib/ReactViews/Tools/ClippingBox/RepositionClippingBox.tsx b/lib/ReactViews/Tools/ClippingBox/RepositionClippingBox.tsx index 142b261c514..2b2bf0f012d 100644 --- a/lib/ReactViews/Tools/ClippingBox/RepositionClippingBox.tsx +++ b/lib/ReactViews/Tools/ClippingBox/RepositionClippingBox.tsx @@ -122,8 +122,13 @@ const RepositionClippingBox: React.FC = observer( useEffect( action(function init() { const canvas = cesium.scene.canvas; - (item.clippingBoxDrawing as any).stopInteractions(); - setCursor(canvas, "move"); + + const boxDrawing = item.clippingBoxDrawing; + (boxDrawing as any).stopInteractions(); + boxDrawing.enableScaling = false; + boxDrawing.enableRotation = false; + + setCursor(canvas, "crosshair"); cesium.isFeaturePickingPaused = true; if (promptRef.current) setCursor(promptRef.current, "grabbing"); @@ -146,7 +151,7 @@ const RepositionClippingBox: React.FC = observer( inputHandler.destroy(); setCursor(canvas, "auto"); if (promptRef.current) setCursor(promptRef.current, "auto"); - if (item.clippingBoxDrawing.dataSource.show) { + if (item.clippingBoxDrawing?.dataSource?.show) { (item.clippingBoxDrawing as any).startInteractions(); } document.removeEventListener("keydown", escapeKeyHandler); @@ -159,13 +164,14 @@ const RepositionClippingBox: React.FC = observer( const initialX = window.innerWidth / 2; const initualY = window.innerHeight / 2; - const name = truncate(item.name ?? "", 10); return ( - - Click on map to place clipping box for model "{name}" + + Click on map to position clipping box + + + Press ESC to cancel - (Press Esc to cancel) ); } @@ -186,9 +192,11 @@ const CursorPrompt = styled.div.attrs(({ x, y }) => ({ overflow: visible; white-space: nowrap; max-width: 500px; - background-color: rgba(255, 165, 0, 0.7); - padding: 7px; - border: 1px solid white; + background-color: #2563eb; + color: white; + padding: 12px; + border-radius: 6px; + box-shadow: 0px 10px 15px -3px #0000001a; `; function setCursor(el: HTMLElement, cursorName: string) { diff --git a/lib/ReactViews/Tools/ClippingBox/featureFlags.ts b/lib/ReactViews/Tools/ClippingBox/featureFlags.ts deleted file mode 100644 index bc7778b7b99..00000000000 --- a/lib/ReactViews/Tools/ClippingBox/featureFlags.ts +++ /dev/null @@ -1,11 +0,0 @@ -import Terria from "../../../Models/Terria"; - -/** - * Returns `true` if clipping box zooming and repositioning features are - * enabled for this map. - */ -export function zoomAndRepositioningEnabled(terria: Terria) { - const featureFlag = (terria.elements.get("clipping-box") as any) - ?.zoomAndRepositioningEnabled; - return featureFlag === true; -} diff --git a/wwwroot/models/Box.glb b/wwwroot/models/Box.glb deleted file mode 100644 index 95ec886b6b92b134291fd41d34ac9d5349306e0a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1664 zcmb7EOK;jh5S}DW+O$p6v`u^8GeNd_1bm4oEftl43Q#VHgE0$OGB&bJ+Q_oRvHz-n zq(7!Jix*Y|3Dweg=e6_A%bt4u#xVe_&H(fXY|f(@CPIkBiUbn22;I3GyAPRY#|SxE#v~@J z-RZV!7Blr6`_bt&`^`?9nFdzn`eWB2AFOMR#W1rd(&eFRdl`st&r#1>1WTZ{gEyie zT(@AfoJ@Fl@A97_$mlWVoykNr7-KrYd=dEEkNb}c3{ujK0x6e1_PSp7z%Cj)?0>TUa1Jlw h71BAph6{KDmq-`z7OvnOyhpl%4{!}1;S Date: Fri, 6 Oct 2023 19:00:03 +1100 Subject: [PATCH 302/654] prettier --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 93be5308d3c..259c43d6926 100644 --- a/package.json +++ b/package.json @@ -245,4 +245,4 @@ "build-for-node": "tsc -b tsconfig-node.json", "prepare": "yarn build-for-node && husky install" } -} \ No newline at end of file +} From f52e5fb2261da79b508906f7082cb9f74a13c037 Mon Sep 17 00:00:00 2001 From: Nick Forbes-Smith Date: Fri, 6 Oct 2023 20:00:27 +1100 Subject: [PATCH 303/654] Update changes --- CHANGES.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGES.md b/CHANGES.md index 490d3bb5d76..591658a6da6 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -2,6 +2,8 @@ #### next release (8.3.7) +- **Breaking change:** Replaced `node-sass` with (dart) `sass` + - You will need to update your `TerriaMap` to use `sass` instead of `node-sass`. - [The next improvement] #### 8.3.6 - 2023-10-03 From 56b742456eee120cd2b1360f2db08928b549438a Mon Sep 17 00:00:00 2001 From: Nick Forbes-Smith Date: Fri, 6 Oct 2023 20:35:24 +1100 Subject: [PATCH 304/654] remove node-sass docs --- doc/contributing/problems-and-solutions.md | 21 --------------------- 1 file changed, 21 deletions(-) diff --git a/doc/contributing/problems-and-solutions.md b/doc/contributing/problems-and-solutions.md index f389e97ef33..002ae4db8fb 100644 --- a/doc/contributing/problems-and-solutions.md +++ b/doc/contributing/problems-and-solutions.md @@ -79,24 +79,3 @@ Then run the following to install NodeJS v16 and use it: nvm install 16 nvm use 16 ``` - ---- - -### Problem - -Python errors when building NodeJS dependencies (eg `node-sass`). This is common on M1/M2 macs. - -### Solution - -You may need to install Python2 to build NodeJS dependencies (like `node-sass`) - -We recommend using [`pyenv`](https://github.com/pyenv/pyenv#installation) to install Python2. - -Follow installation instructions [here](https://github.com/pyenv/pyenv#installation). - -Then run the following to install Python 2.7.18 and use it: - -```bash -pyenv install 2.7.18 -pyenv shell 2.7.18 -``` From 33dc01bda6f79fc1b26cacc644121ed0963a7808 Mon Sep 17 00:00:00 2001 From: Nick Forbes-Smith Date: Fri, 6 Oct 2023 21:02:48 +1100 Subject: [PATCH 305/654] Fix WMS allowFeaturePicking --- CHANGES.md | 1 + .../Catalog/Ows/WebMapServiceCatalogItem.ts | 9 ++- .../Ows/WebMapServiceCatalogItemSpec.ts | 81 +++++++++++++++++++ 3 files changed, 88 insertions(+), 3 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 490d3bb5d76..839f0941e5f 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -2,6 +2,7 @@ #### next release (8.3.7) +- Fix `WebMapServiceCatalogItem` `allowFeaturePicking` - [The next improvement] #### 8.3.6 - 2023-10-03 diff --git a/lib/Models/Catalog/Ows/WebMapServiceCatalogItem.ts b/lib/Models/Catalog/Ows/WebMapServiceCatalogItem.ts index 3ce6fd42aa7..0ef921f6ff3 100644 --- a/lib/Models/Catalog/Ows/WebMapServiceCatalogItem.ts +++ b/lib/Models/Catalog/Ows/WebMapServiceCatalogItem.ts @@ -398,7 +398,9 @@ class WebMapServiceCatalogItem return undefined; } - imageryProvider.enablePickFeatures = true; + // Reset feature picking for the current imagery layer. + // We disable feature picking for the next imagery layer. + imageryProvider.enablePickFeatures = this.allowFeaturePicking; return { imageryProvider, @@ -422,6 +424,7 @@ class WebMapServiceCatalogItem return undefined; } + // Disable feature picking for the next imagery layer. imageryProvider.enablePickFeatures = false; return { @@ -574,8 +577,8 @@ class WebMapServiceCatalogItem tilingScheme: this.tilingScheme, maximumLevel: this.getMaximumLevel(true) ?? this.maximumLevel, minimumLevel: this.minimumLevel, - credit: this.attribution, - enablePickFeatures: this.allowFeaturePicking + credit: this.attribution + // Note: we set enablePickFeatures in _currentImageryParts and _nextImageryParts }; if (isDefined(this.getFeatureInfoFormat?.type)) { diff --git a/test/Models/Catalog/Ows/WebMapServiceCatalogItemSpec.ts b/test/Models/Catalog/Ows/WebMapServiceCatalogItemSpec.ts index 05541195379..925f094bd5a 100644 --- a/test/Models/Catalog/Ows/WebMapServiceCatalogItemSpec.ts +++ b/test/Models/Catalog/Ows/WebMapServiceCatalogItemSpec.ts @@ -562,6 +562,87 @@ describe("WebMapServiceCatalogItem", function () { ); }); + it('creates "next" imagery provider when animating', async function () { + const terria = new Terria(); + const wmsItem = new WebMapServiceCatalogItem("some-layer", terria); + runInAction(() => { + wmsItem.setTrait(CommonStrata.definition, "url", "http://example.com"); + wmsItem.setTrait( + CommonStrata.definition, + "getCapabilitiesUrl", + "test/WMS/styles_and_dimensions.xml" + ); + wmsItem.setTrait(CommonStrata.definition, "layers", "C"); + wmsItem.setTrait( + CommonStrata.definition, + "currentTime", + "2002-01-01T00:00:00.000Z" + ); + }); + + terria.timelineStack.addToTop(wmsItem); + terria.timelineStack.activate(); + + (await wmsItem.loadMapItems()).throwIfError(); + + expect(wmsItem.mapItems.length).toBe(1); + expect(wmsItem.isPaused).toBe(true); + + runInAction(() => { + wmsItem.setTrait(CommonStrata.definition, "isPaused", false); + }); + + expect(wmsItem.mapItems.length).toBe(2); + expect(wmsItem.isPaused).toBe(false); + + const currentImageryProvider = wmsItem.mapItems[0].imageryProvider; + expect(currentImageryProvider instanceof WebMapServiceImageryProvider).toBe( + true + ); + if (currentImageryProvider instanceof WebMapServiceImageryProvider) { + expect(currentImageryProvider.enablePickFeatures).toBe(true); + } + + const nextMapItem = wmsItem.mapItems[1]; + const nextImageryProvider = nextMapItem.imageryProvider; + expect(nextImageryProvider instanceof WebMapServiceImageryProvider).toBe( + true + ); + if (nextImageryProvider instanceof WebMapServiceImageryProvider) { + expect(nextImageryProvider.enablePickFeatures).toBe(false); + expect(nextMapItem.alpha).toBe(0); + expect(nextMapItem.show).toBe(true); + } + }); + + it("sets enableFeaturePicking to false", async function () { + const terria = new Terria(); + const wmsItem = new WebMapServiceCatalogItem("some-layer", terria); + runInAction(() => { + wmsItem.setTrait(CommonStrata.definition, "url", "http://example.com"); + wmsItem.setTrait(CommonStrata.definition, "allowFeaturePicking", false); + wmsItem.setTrait( + CommonStrata.definition, + "getCapabilitiesUrl", + "test/WMS/styles_and_dimensions.xml" + ); + wmsItem.setTrait(CommonStrata.definition, "layers", "C"); + }); + + (await wmsItem.loadMetadata()).throwIfError(); + + expect(wmsItem.mapItems.length).toBe(1); + expect(wmsItem.allowFeaturePicking).toBe(false); + + const imageryProvider = wmsItem.mapItems[0].imageryProvider; + expect( + imageryProvider instanceof WebMapServiceImageryProvider + ).toBeTruthy(); + if (imageryProvider instanceof WebMapServiceImageryProvider) { + expect(imageryProvider.enablePickFeatures).toBe(false); + } + }); + it("dimensions and styles for a 'real' WMS layer", function (done) { const terria = new Terria(); const wmsItem = new WebMapServiceCatalogItem("some-layer", terria); From a7dccddc479b3a19703222136f4ce6f0adb272d4 Mon Sep 17 00:00:00 2001 From: Kevin Ring Date: Sun, 8 Oct 2023 23:05:52 +1100 Subject: [PATCH 306/654] Remove some old code, eliminate knockout. --- lib/Core/loadView.js | 35 --- lib/Core/overrideProperty.js | 35 --- .../FunctionParameters/RegionDataParameter.js | 191 ------------- lib/ReactViewModels/HelpViewState.js | 48 ---- lib/ReactViews/Analytics/ParameterEditor.jsx | 22 -- .../Analytics/RectangleParameterEditor.jsx | 133 --------- .../Analytics/RegionDataParameterEditor.jsx | 254 ------------------ lib/ReactViews/Analytics/RegionPicker.jsx | 10 +- 8 files changed, 9 insertions(+), 719 deletions(-) delete mode 100644 lib/Core/loadView.js delete mode 100644 lib/Core/overrideProperty.js delete mode 100644 lib/Models/FunctionParameters/RegionDataParameter.js delete mode 100644 lib/ReactViewModels/HelpViewState.js delete mode 100644 lib/ReactViews/Analytics/RectangleParameterEditor.jsx delete mode 100644 lib/ReactViews/Analytics/RegionDataParameterEditor.jsx diff --git a/lib/Core/loadView.js b/lib/Core/loadView.js deleted file mode 100644 index b78153a879f..00000000000 --- a/lib/Core/loadView.js +++ /dev/null @@ -1,35 +0,0 @@ -"use strict"; - -var getElement = require("terriajs-cesium/Source/Widgets/getElement").default; -var knockout = require("terriajs-cesium/Source/ThirdParty/knockout").default; - -var createFragmentFromTemplate = require("./createFragmentFromTemplate"); - -var loadView = function (htmlString, container, viewModel) { - container = getElement(container); - - var fragment = createFragmentFromTemplate(htmlString); - - // Sadly, fragment.childNodes doesn't have a slice function. - // This code could be replaced with Array.prototype.slice.call(fragment.childNodes) - // but that seems slightly error prone. - var nodes = []; - - var i; - for (i = 0; i < fragment.childNodes.length; ++i) { - nodes.push(fragment.childNodes[i]); - } - - container.appendChild(fragment); - - for (i = 0; i < nodes.length; ++i) { - var node = nodes[i]; - if (node.nodeType === 1 || node.nodeType === 8) { - knockout.applyBindings(viewModel, node); - } - } - - return nodes; -}; - -module.exports = loadView; diff --git a/lib/Core/overrideProperty.js b/lib/Core/overrideProperty.js deleted file mode 100644 index f062e840b32..00000000000 --- a/lib/Core/overrideProperty.js +++ /dev/null @@ -1,35 +0,0 @@ -"use strict"; - -var defined = require("terriajs-cesium/Source/Core/defined").default; -var knockout = require("terriajs-cesium/Source/ThirdParty/knockout").default; - -/** - * Overrides a Knockout property definition. Change notification is raised on the old property, if any, to encourage - * listeners to subscribe to the new one. - * - * @param {Object} owner The owner of the property. - * @param {String} propertyName The name of the property. - * @param {Object} descriptor The property descriptor, just like the one that would be passed to `knockout.defineProperty` - * or `Object.defineProperty`. - */ -var overrideProperty = function (owner, propertyName, descriptor) { - // Get the existing observable with this name, if any, and delete it. - var overridden = knockout.getObservable(owner, propertyName); - if (defined(overridden)) { - delete owner.__knockoutObservables[propertyName]; - } - - // Delete the existing property on the owner, if any. - delete owner[propertyName]; - - // Define the new property. - knockout.defineProperty(owner, propertyName, descriptor); - - if (defined(overridden)) { - // Notify subscribers to the old property that it has changed. - // This is a hacky way of getting most subscribers to now subscribe to the new property. - overridden.notifySubscribers(); - } -}; - -module.exports = overrideProperty; diff --git a/lib/Models/FunctionParameters/RegionDataParameter.js b/lib/Models/FunctionParameters/RegionDataParameter.js deleted file mode 100644 index d7e57ff05b2..00000000000 --- a/lib/Models/FunctionParameters/RegionDataParameter.js +++ /dev/null @@ -1,191 +0,0 @@ -"use strict"; - -var defaultValue = require("terriajs-cesium/Source/Core/defaultValue").default; -var defined = require("terriajs-cesium/Source/Core/defined").default; - -var DeveloperError = - require("terriajs-cesium/Source/Core/DeveloperError").default; -var FunctionParameter = require("./FunctionParameter"); -var inherit = require("../../Core/inherit"); -var knockout = require("terriajs-cesium/Source/ThirdParty/knockout").default; -var RegionDataValue = require("./RegionDataValue"); -var RegionTypeParameter = require("./RegionTypeParameter"); - -/** - * A parameter that specifies a set of characteristics for regions of a particular type. - * - * @alias RegionDataParameter - * @constructor - * @extends FunctionParameter - * - * @param {CatalogFunctionMixin} [catalogFuction] Catalog function: - * @param {Object} [options] Object with the following properties: - * @param {Terria} options.terria The Terria instance. - * @param {String} options.id The unique ID of this parameter. - * @param {String} [options.name] The name of this parameter. If not specified, the ID is used as the name. - * @param {String} [options.description] The description of the parameter. - * @param {RegionProvider|RegionTypeParameter} options.regionProvider The {@link RegionProvider} from which a region may be selected. This may also - * be a {@link RegionTypeParameter} that specifies the type of region. - * @param {Boolean} [options.singleSelect] True if only one characteristic may be selected; false if any number of characteristics may be selected. - */ -var RegionDataParameter = function (catalogFuction, options) { - if (!defined(options) || !defined(options.regionProvider)) { - throw new DeveloperError("options.regionProvider is required."); - } - - FunctionParameter.call(this, catalogFuction, options); - - this._regionProvider = options.regionProvider; - this.singleSelect = defaultValue(options.singleSelect, false); - - knockout.track(this, ["_regionProvider"]); -}; - -inherit(FunctionParameter, RegionDataParameter); - -Object.defineProperties(RegionDataParameter.prototype, { - /** - * Gets the type of this parameter. - * @memberof RegionDataParameter.prototype - * @type {String} - */ - type: { - get: function () { - return "regionData"; - } - }, - - /** - * Gets or sets the value of this parameter. The value is an object where the keys are column names and - * the values are arrays containing the data values in that column. - * @memberof RegionDataParameter.prototype - * @member {Object} value - */ - - /** - * Gets the region provider indicating the type of region that this property holds data for. - * @memberof RegionDataParameter.prototype - * @type {RegionProvider} - */ - regionProvider: { - get: function () { - return RegionTypeParameter.resolveRegionProvider(this._regionProvider); - } - } -}); - -RegionDataParameter.prototype.getEnabledItemsWithMatchingRegionType = - function () { - var result = []; - - var nowViewingItems = this.terria.nowViewing.items; - var regionProvider = this.regionProvider; - - for (var i = 0; i < nowViewingItems.length; ++i) { - var item = nowViewingItems[i]; - if ( - defined(item.regionMapping) && - defined(item.regionMapping.regionDetails) && - item.regionMapping.regionDetails.length > 0 && - item.regionMapping.regionDetails[0].regionProvider === regionProvider - ) { - result.push(item); - } - } - - return result; - }; - -/** - * Gets the selected region codes, column headings, and data table for this parameter. - * - * @return {RegionDataValue} The value. - */ -RegionDataParameter.prototype.getRegionDataValue = function () { - var regionProvider = this.regionProvider; - - var regionCodes = []; - var regionCodeHash = {}; - var columns = []; - - var columnData; - var regionRow; - var regions; - - var value = this.value; - - for (var columnName in value) { - if (Object.prototype.hasOwnProperty.call(value, columnName)) { - columnData = value[columnName]; - if (!columnData || columnData.regionProvider !== regionProvider) { - continue; - } - - columns.push(columnName); - - regions = columnData.regionColumn.values; - - for (var i = 0; i < regions.length; ++i) { - regionRow = regionCodeHash[regions[i]]; - if (!defined(regionRow)) { - regionRow = regionCodeHash[regions[i]] = regionCodes.length; - regionCodes.push(regions[i]); - } - } - } - } - - var table; - var singleSelectValues; - var columnIndex; - var rowIndex; - var regionColumn; - var valueColumn; - var values; - - if (this.singleSelect) { - singleSelectValues = []; - for (columnIndex = 0; columnIndex < columns.length; ++columnIndex) { - columnData = value[columns[columnIndex]]; - if (!columnData || columnData.regionProvider !== regionProvider) { - continue; - } - - regionColumn = columnData.regionColumn; - regions = regionColumn.values; - valueColumn = columnData.valueColumn; - values = valueColumn.values; - - for (rowIndex = 0; rowIndex < regionCodes.length; ++rowIndex) { - regionRow = regionCodeHash[regions[rowIndex]]; - singleSelectValues[regionRow] = values[rowIndex] || 0.0; // TODO: don't replace nulls with 0.0 - } - } - } else { - table = []; - for (columnIndex = 0; columnIndex < columns.length; ++columnIndex) { - columnData = value[columns[columnIndex]]; - if (!columnData) { - continue; - } - - regionColumn = columnData.regionColumn; - regions = regionColumn.values; - valueColumn = columnData.valueColumn; - values = valueColumn.values; - - for (rowIndex = 0; rowIndex < regionCodes.length; ++rowIndex) { - regionRow = regionCodeHash[regions[rowIndex]]; - var row = table[regionRow]; - if (!defined(row)) { - row = table[regionRow] = []; - } - row[columnIndex] = values[rowIndex] || 0.0; // TODO: don't replace nulls with 0.0 - } - } - } - - return new RegionDataValue(regionCodes, columns, table, singleSelectValues); -}; - -module.exports = RegionDataParameter; diff --git a/lib/ReactViewModels/HelpViewState.js b/lib/ReactViewModels/HelpViewState.js deleted file mode 100644 index 5f053bc6037..00000000000 --- a/lib/ReactViewModels/HelpViewState.js +++ /dev/null @@ -1,48 +0,0 @@ -"use strict"; - -var knockout = require("terriajs-cesium/Source/ThirdParty/knockout").default; - -// Position of HelpScreen relative to highlighted element. -var RelativePosition = { - RECT_LEFT: 0, - RECT_RIGHT: 1, - RECT_TOP: 2, - RECT_BOTTOM: 3 -}; - -/** - * State of the help view, such as which screen of which sequence is displayed. - * - * @alias HelpViewState - * @constructor - **/ -var HelpViewState = function () { - /** - * Which screen is currently displayed. - * @type {HelpScreen} - */ - this.currentScreen = undefined; - - /** - * Which sequence is currently displayed. - * @type {HelpSequence} - */ - this.currentSequence = undefined; - - /** - * Whether to cancel help mode. - * @type {Boolean} - */ - this.cancel = false; - - /** - * Whether to go to next screen in help mode. - * @type {Boolean} - */ - this.advance = false; - - knockout.track(this, ["currentScreen", "currentSequence"]); -}; - -HelpViewState.RelativePosition = RelativePosition; -module.exports = HelpViewState; diff --git a/lib/ReactViews/Analytics/ParameterEditor.jsx b/lib/ReactViews/Analytics/ParameterEditor.jsx index efd9ce3a684..d9e5f156bf8 100644 --- a/lib/ReactViews/Analytics/ParameterEditor.jsx +++ b/lib/ReactViews/Analytics/ParameterEditor.jsx @@ -8,11 +8,9 @@ import PropTypes from "prop-types"; import PointParameterEditor from "./PointParameterEditor"; import LineParameterEditor from "./LineParameterEditor"; -// import RectangleParameterEditor from "./RectangleParameterEditor"; import PolygonParameterEditor from "./PolygonParameterEditor"; import RegionParameterEditor from "./RegionParameterEditor"; import RegionTypeParameterEditor from "./RegionTypeParameterEditor"; -import RegionDataParameterEditor from "./RegionDataParameterEditor"; import BooleanParameterEditor from "./BooleanParameterEditor"; import BooleanParameterGroupEditor from "./BooleanParameterGroupEditor"; import DateParameterEditor from "./DateParameterEditor"; @@ -281,26 +279,6 @@ ParameterEditor.parameterTypeConverters = [ } } }, - { - id: "regionData", - parameterTypeToDiv: function RegionDataParameterToDiv( - type, - parameterEditor - ) { - if (type === this.id) { - return ( -
    - {parameterEditor.renderLabel()} - -
    - ); - } - } - }, { id: "boolean", parameterTypeToDiv: function BooleanParameterToDiv(type, parameterEditor) { diff --git a/lib/ReactViews/Analytics/RectangleParameterEditor.jsx b/lib/ReactViews/Analytics/RectangleParameterEditor.jsx deleted file mode 100644 index c38c01a90e5..00000000000 --- a/lib/ReactViews/Analytics/RectangleParameterEditor.jsx +++ /dev/null @@ -1,133 +0,0 @@ -// import React from "react"; - -// import createReactClass from "create-react-class"; - -// import PropTypes from "prop-types"; - -// import Cartographic from "terriajs-cesium/Source/Core/Cartographic"; -// import CesiumMath from "terriajs-cesium/Source/Core/Math"; -// import defined from "terriajs-cesium/Source/Core/defined"; -// import Rectangle from "terriajs-cesium/Source/Core/Rectangle"; -// import knockout from "terriajs-cesium/Source/ThirdParty/knockout"; - -// import MapInteractionMode from "../../Models/MapInteractionMode"; -// import { withTranslation } from "react-i18next"; - -// import Styles from "./parameter-editors.scss"; - -// const RectangleParameterEditor = createReactClass({ -// displayName: "RectangleParameterEditor", - -// propTypes: { -// previewed: PropTypes.object, -// parameter: PropTypes.object, -// viewState: PropTypes.object, -// t: PropTypes.func.isRequired -// }, - -// getInitialState() { -// return { -// value: this.getValue() -// }; -// }, - -// onTextChange(e) { -// this.setValue(e.target.value); -// this.setState({ -// value: e.target.value -// }); -// }, - -// getValue() { -// const rect = this.props.parameter.value; -// if (defined(rect)) { -// return ( -// this.outputDegrees(Rectangle.southwest(rect).longitude) + -// "," + -// this.outputDegrees(Rectangle.southwest(rect).latitude) + -// " " + -// this.outputDegrees(Rectangle.northeast(rect).longitude) + -// "," + -// this.outputDegrees(Rectangle.northeast(rect).latitude) -// ); -// } else { -// return ""; -// } -// }, - -// outputDegrees(radian) { -// return CesiumMath.toDegrees(radian).toFixed(2); -// }, - -// setValue(value) { -// const coordPair = value.split(" "); -// const coords = []; -// for (let i = 0; i < coordPair.length; i++) { -// const coordinates = coordPair[i].split(","); -// if (coordinates.length >= 2) { -// coords.push( -// Cartographic.fromDegrees( -// parseFloat(coordinates[0]), -// parseFloat(coordinates[1]) -// ) -// ); -// } -// } -// this.props.parameter.value = Rectangle.fromCartographicArray(coords); -// }, - -// selectRectangleOnMap() { -// const terria = this.props.previewed.terria; -// const that = this; -// // Cancel any feature picking already in progress. -// terria.pickedFeatures = undefined; -// const { t } = this.props; -// const pickPointMode = new MapInteractionMode({ -// message: t("analytics.shiftToDrawRectangle"), -// drawRectangle: true, -// onCancel: function() { -// terria.mapInteractionModeStack.pop(); -// terria.selectBox = false; -// that.props.viewState.openAddData(); -// } -// }); -// terria.selectBox = true; -// terria.mapInteractionModeStack.push(pickPointMode); - -// knockout -// .getObservable(pickPointMode, "pickedFeatures") -// .subscribe(function(pickedFeatures) { -// if (pickedFeatures instanceof Rectangle) { -// that.props.parameter.value = pickedFeatures; -// terria.mapInteractionModeStack.pop(); -// terria.selectBox = false; -// that.props.viewState.openAddData(); -// } -// }); - -// that.props.viewState.explorerPanelIsVisible = false; -// }, - -// render() { -// const { t } = this.props; -// return ( -//
    -// -// -//
    -// ); -// } -// }); - -// module.exports = withTranslation()(RectangleParameterEditor); diff --git a/lib/ReactViews/Analytics/RegionDataParameterEditor.jsx b/lib/ReactViews/Analytics/RegionDataParameterEditor.jsx deleted file mode 100644 index e9879f8075a..00000000000 --- a/lib/ReactViews/Analytics/RegionDataParameterEditor.jsx +++ /dev/null @@ -1,254 +0,0 @@ -import React from "react"; - -import createReactClass from "create-react-class"; - -import PropTypes from "prop-types"; - -import defined from "terriajs-cesium/Source/Core/defined"; -import knockout from "terriajs-cesium/Source/ThirdParty/knockout"; -import VarType from "../../Map/VarType"; -import CatalogItem from "../DataCatalog/CatalogItem"; -import CatalogGroup from "../DataCatalog/CatalogGroup"; - -import Styles from "./parameter-editors.scss"; -import CommonStrata from "../../Models/Definition/CommonStrata"; - -const RegionDataParameterEditor = createReactClass({ - displayName: "RegionDataParameterEditor", - - propTypes: { - previewed: PropTypes.object, - parameter: PropTypes.object - }, - - /* eslint-disable-next-line camelcase */ - UNSAFE_componentWillMount() { - this.catalogItemDetails = {}; - }, - - /* eslint-disable-next-line camelcase */ - UNSAFE_componentWillReceiveProps(nextProps) { - this.catalogItemDetails = {}; - }, - - getValue() { - return this.props.parameter.value; - }, - - setValue(value) { - this.props.parameter.setValue(CommonStrata.user, value); - }, - - regionProvider() { - return this.props.parameter.regionProvider; - }, - - catalogItemsWithMatchingRegion() { - return this.props.parameter.getEnabledItemsWithMatchingRegionType(); - }, - - toggleActive(catalogItem, column) { - const value = this.getValue(); - const newValue = !this.isActive(catalogItem, column); - - if (newValue) { - value[column.name] = { - regionProvider: this.regionProvider(), - regionColumn: - catalogItem.regionMapping.tableStructure.getColumnWithNameOrId( - catalogItem.regionMapping.regionDetails[0].columnName - ), - valueColumn: column - }; - - // If only one dataset can be active at a time, deactivate all others. - if (this.props.parameter.singleSelect) { - for (const columnName in value) { - if ( - Object.prototype.hasOwnProperty.call(value, columnName) && - columnName !== column.name - ) { - value[columnName] = false; - } - } - } - } else { - value[column.name] = false; - this.getCatalogItemDetails( - this.catalogItemDetails, - catalogItem - ).isEntirelyActive = false; - } - }, - - isActive(catalogItem, column) { - let value = this.getValue(); - - if (!defined(value)) { - value = {}; - this.setValue(value); - } - - if (!defined(value[column.name])) { - value[column.name] = false; - knockout.track(value, [column.name]); - - if ( - !this.props.parameter.singleSelect || - Object.keys(value).length === 1 - ) { - value[column.name] = { - regionProvider: this.regionProvider(), - regionColumn: - catalogItem.regionMapping.tableStructure.getColumnWithNameOrId( - catalogItem.regionMapping.regionDetails[0].columnName - ), - valueColumn: column - }; - } - } - - return ( - defined(value[column.name]) && - value[column.name] && - value[column.name].regionColumn === - catalogItem.regionMapping.tableStructure.getColumnWithNameOrId( - catalogItem.regionMapping.regionDetails[0].columnName - ) && - value[column.name].valueColumn === column - ); - }, - - getCatalogItemDetails(catalogItemDetails, catalogItem) { - if (!defined(catalogItemDetails[catalogItem.uniqueId])) { - catalogItemDetails[catalogItem.uniqueId] = { - isOpen: true, - isEntirelyActive: true - }; - knockout.track(catalogItemDetails, [catalogItem.uniqueId]); - knockout.track(catalogItemDetails[catalogItem.uniqueId], [ - "isOpen", - "isEntirelyActive" - ]); - } - - return catalogItemDetails[catalogItem.uniqueId]; - }, - - toggleEntireCatalogItem(catalogItem) { - const details = this.getCatalogItemDetails( - this.catalogItemDetails, - catalogItem - ); - details.isEntirelyActive = !details.isEntirelyActive; - - const columns = catalogItem.regionMapping.tableStructure.columns; - for (let i = 0; i < columns.length; ++i) { - const column = columns[i]; - if (this.columnIsScalar(catalogItem, column)) { - const isActive = this.isActive(catalogItem, column); - if ( - (!isActive && details.isEntirelyActive) || - (isActive && !details.isEntirelyActive) - ) { - this.toggleActive(catalogItem, column); - } - } - } - }, - - catalogItemIsOpen(catalogItem) { - const details = this.getCatalogItemDetails( - this.catalogItemDetails, - catalogItem - ); - return details.isOpen; - }, - - toggleOpenCatalogItem(catalogItem) { - const details = this.getCatalogItemDetails( - this.catalogItemDetails, - catalogItem - ); - details.isOpen = !details.isOpen; - }, - - isEntireCatalogItemActive(catalogItem) { - const details = this.getCatalogItemDetails( - this.catalogItemDetails, - catalogItem - ); - return details.isEntirelyActive; - }, - - render() { - return
    {this.renderContent()}
    ; - }, - - renderContent() { - if (this.catalogItemsWithMatchingRegion().length > 0) { - return ( -
    -
      - - - {this.renderItemChildren(catalogItem)} - - -
    -
    - ); - } - return ( - // Don't break the lines around the link to csv-geo-au, or whitespace stripping will ruin the formatting in - // the rendered version. -
    - No characteristics are available because you have not added any data to - the map for this region type,{" "} - {this.regionProvider() ? this.regionProvider().regionType : "None"}. You - may use your own data with this analysis by creating a CSV following the{" "} - - csv-geo-au - {" "} - guidelines and dragging and dropping it onto the map. -
    - ); - }, - - renderItemChildren(catalogItem) { - return ( -
      - {catalogItem.regionMapping.tableStructure.columns.map((column, i) => { - if (column.type === VarType.SCALAR) { - return ( - - ); - } - })} -
    - ); - } -}); -module.exports = RegionDataParameterEditor; diff --git a/lib/ReactViews/Analytics/RegionPicker.jsx b/lib/ReactViews/Analytics/RegionPicker.jsx index 710740b4a8c..693c7316278 100644 --- a/lib/ReactViews/Analytics/RegionPicker.jsx +++ b/lib/ReactViews/Analytics/RegionPicker.jsx @@ -8,7 +8,6 @@ import createReactClass from "create-react-class"; import PropTypes from "prop-types"; import defined from "terriajs-cesium/Source/Core/defined"; -import knockout from "terriajs-cesium/Source/ThirdParty/knockout"; import GeoJsonCatalogItem from "../../Models/Catalog/CatalogItems/GeoJsonCatalogItem"; import WebMapServiceCatalogItem from "../../Models/Catalog/Ows/WebMapServiceCatalogItem"; @@ -18,6 +17,15 @@ import RegionTypeParameterEditor from "./RegionTypeParameterEditor"; import Styles from "./parameter-editors.scss"; import CommonStrata from "../../Models/Definition/CommonStrata"; +const knockout = { + defineProperty() { + throw new Error("This component needs to be fixed to not use Knockout."); + }, + getObservable() { + throw new Error("This component needs to be fixed to not use Knockout."); + } +}; + const RegionPicker = createReactClass({ displayName: "RegionPicker", From 9e60763c71273038491e00b46d93ccfe6ca385b6 Mon Sep 17 00:00:00 2001 From: Kevin Ring Date: Sun, 8 Oct 2023 23:36:12 +1100 Subject: [PATCH 307/654] Get TerriaMap compiling with new Cesium. --- buildprocess/configureWebpack.js | 23 ++++++++++++++++++- lib/Models/Cesium.ts | 2 +- .../BottomDock/Timeline/CesiumTimeline.jsx | 2 +- .../Map/MapNavigation/Items/ZoomControl.tsx | 3 +-- .../terriajs-cesium-extra/index.d.ts | 2 ++ package.json | 2 ++ 6 files changed, 29 insertions(+), 5 deletions(-) diff --git a/buildprocess/configureWebpack.js b/buildprocess/configureWebpack.js index 2c3f33c22c5..d5b7bd31b88 100644 --- a/buildprocess/configureWebpack.js +++ b/buildprocess/configureWebpack.js @@ -36,7 +36,12 @@ function configureWebpack( ".tsx" ]; config.resolve.extensions.push(".jsx"); - config.resolve.alias = config.resolve.alias || {}; + config.resolve.alias = { + // @cesium/widgets will import from @cesium/engine. We need to make sure it ends up with + // the terriajs-cesium fork instead of upstream cesium. + "@cesium/engine": path.resolve(require.resolve("terriajs-cesium/package.json"), ".."), + ...config.resolve.alias + }; config.resolve.modules = config.resolve.modules || []; config.resolve.modules.push(path.resolve(terriaJSBasePath, "wwwroot")); @@ -103,6 +108,22 @@ function configureWebpack( }) }); + const zipJsDir = path.dirname( + require.resolve("@zip.js/zip.js/package.json") + ); + + config.module.rules.push({ + test: /\.js$/, + include: zipJsDir, + loader: require.resolve('@open-wc/webpack-import-meta-loader'), + }); + + config.module.rules.push({ + test: /buildModuleUrl.js$/, + include: path.resolve(cesiumDir, "Source", "Core"), + loader: require.resolve('@open-wc/webpack-import-meta-loader'), + }); + const babelLoader = { loader: "babel-loader", options: { diff --git a/lib/Models/Cesium.ts b/lib/Models/Cesium.ts index efc875f40f9..8b637da618f 100644 --- a/lib/Models/Cesium.ts +++ b/lib/Models/Cesium.ts @@ -57,7 +57,7 @@ import SceneTransforms from "terriajs-cesium/Source/Scene/SceneTransforms"; import SingleTileImageryProvider from "terriajs-cesium/Source/Scene/SingleTileImageryProvider"; import SplitDirection from "terriajs-cesium/Source/Scene/SplitDirection"; import CesiumWidget from "terriajs-cesium/Source/Widget/CesiumWidget"; -import getElement from "terriajs-cesium/Source/Widgets/getElement"; +import getElement from "terriajs-cesium/Source/DataSources/getElement"; import filterOutUndefined from "../Core/filterOutUndefined"; import flatten from "../Core/flatten"; import isDefined from "../Core/isDefined"; diff --git a/lib/ReactViews/BottomDock/Timeline/CesiumTimeline.jsx b/lib/ReactViews/BottomDock/Timeline/CesiumTimeline.jsx index abc47b5765f..bd253190735 100644 --- a/lib/ReactViews/BottomDock/Timeline/CesiumTimeline.jsx +++ b/lib/ReactViews/BottomDock/Timeline/CesiumTimeline.jsx @@ -8,7 +8,7 @@ import PropTypes from "prop-types"; import React from "react"; import defined from "terriajs-cesium/Source/Core/defined"; import JulianDate from "terriajs-cesium/Source/Core/JulianDate"; -import WrappedTimeline from "terriajs-cesium/Source/Widgets/Timeline/Timeline"; +import WrappedTimeline from "terriajs-cesium-widgets/Source/Timeline/Timeline"; import CommonStrata from "../../../Models/Definition/CommonStrata"; import { formatDate, formatDateTime, formatTime } from "./DateFormats"; diff --git a/lib/ReactViews/Map/MapNavigation/Items/ZoomControl.tsx b/lib/ReactViews/Map/MapNavigation/Items/ZoomControl.tsx index 61aa2971de0..fa8e9386e74 100644 --- a/lib/ReactViews/Map/MapNavigation/Items/ZoomControl.tsx +++ b/lib/ReactViews/Map/MapNavigation/Items/ZoomControl.tsx @@ -18,8 +18,7 @@ import { RawButton } from "../../../../Styled/Button"; import Icon, { GLYPHS } from "../../../../Styled/Icon"; import Ul, { Li } from "../../../../Styled/List"; import Terria from "../../../../Models/Terria"; - -const Tween = require("terriajs-cesium/Source/ThirdParty/Tween").default; +import Tween from "@tweenjs/tween.js"; interface PropTypes extends WithTranslation { terria: Terria; diff --git a/lib/ThirdParty/terriajs-cesium-extra/index.d.ts b/lib/ThirdParty/terriajs-cesium-extra/index.d.ts index 3f2af27f152..f08bc80076b 100644 --- a/lib/ThirdParty/terriajs-cesium-extra/index.d.ts +++ b/lib/ThirdParty/terriajs-cesium-extra/index.d.ts @@ -42,6 +42,8 @@ declare module "terriajs-cesium/Source/Widgets/getElement" { declare module "terriajs-cesium/Source/Core/PolygonGeometryLibrary"; +declare module "terriajs-cesium/Source/DataSources/getElement"; + declare interface Axis { X: number; Y: number; diff --git a/package.json b/package.json index 86fb9fe7858..70444ad8cd2 100644 --- a/package.json +++ b/package.json @@ -28,6 +28,7 @@ "@mapbox/togeojson": "^0.16.0", "@mapbox/vector-tile": "^1.3.0", "@opendatasoft/api-client": "^0.1.0", + "@open-wc/webpack-import-meta-loader": "^0.4.7", "@tinymce/tinymce-react": "^4.3.0", "@turf/bbox": "^6.5.0", "@turf/boolean-intersects": "^6.5.0", @@ -173,6 +174,7 @@ "styled-components": "^5.3.9", "svg-sprite-loader": "4.1.3", "terriajs-cesium": "4.0.0", + "terriajs-cesium-widgets": "4.0.0", "terriajs-html2canvas": "1.0.0-alpha.12-terriajs-1", "thredds-catalog-crawler": "0.0.5", "ts-essentials": "^5.0.0", From 62971b139b9c506118637ff282401bb70ff11fa7 Mon Sep 17 00:00:00 2001 From: Kevin Ring Date: Mon, 9 Oct 2023 09:41:24 +1100 Subject: [PATCH 308/654] Copy Cesium-built workers to the appropriate location. --- gulpfile.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gulpfile.js b/gulpfile.js index 1389dac0c91..7824069aab9 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -78,13 +78,13 @@ gulp.task("copy-cesium-assets", function () { var cesiumPackage = require.resolve("terriajs-cesium/package.json"); var cesiumRoot = path.dirname(cesiumPackage); - var cesiumWebRoot = path.join(cesiumRoot, "wwwroot"); + var cesiumWebRoot = path.join(cesiumRoot, "Build", "Workers"); return gulp .src([path.join(cesiumWebRoot, "**")], { base: cesiumWebRoot }) - .pipe(gulp.dest("wwwroot/build/Cesium")); + .pipe(gulp.dest("wwwroot/build/Cesium/build/Workers")); }); gulp.task("test-browserstack", function (done) { From dc7e602d8ae5f9058dd4c6b68f4e768c93fa3342 Mon Sep 17 00:00:00 2001 From: Yusuke Kiuchi <4221178-yusuke.kiuchi@users.noreply.gitlab.com> Date: Tue, 10 Oct 2023 13:58:33 +0900 Subject: [PATCH 309/654] Fix erratic translation keys --- lib/Models/Workflows/TableStylingWorkflow.ts | 6 +++--- wwwroot/languages/en/translation.json | 10 +++++++--- wwwroot/languages/ja/translation.json | 10 +++++++--- 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/lib/Models/Workflows/TableStylingWorkflow.ts b/lib/Models/Workflows/TableStylingWorkflow.ts index 4eeaf228f68..68e627c28b5 100644 --- a/lib/Models/Workflows/TableStylingWorkflow.ts +++ b/lib/Models/Workflows/TableStylingWorkflow.ts @@ -521,7 +521,7 @@ export default class TableStylingWorkflow id: "table-style", name: i18next.t( - "models.tableStyling.data.selectableDimensions.tableStyle.dataset" + "models.tableStyling.data.selectableDimensions.tableStyle.name" ), selectedId: this.tableStyle.id, options: this.item.tableStyles.map((style) => ({ @@ -2287,7 +2287,7 @@ export default class TableStylingWorkflow id: `${id}-color`, name: i18next.t( - "models.tableStyling.outline.selectableDimensions.color" + "models.tableStyling.outline.selectableDimensions.color.name" ), allowUndefined: true, value: outlineTraits.color ?? nullValues.color, @@ -2300,7 +2300,7 @@ export default class TableStylingWorkflow id: `${id}-width`, name: i18next.t( - "models.tableStyling.outline.selectableDimensions.width" + "models.tableStyling.outline.selectableDimensions.width.name" ), value: outlineTraits.width ?? nullValues.width, setDimensionValue: (stratumId, value) => { diff --git a/wwwroot/languages/en/translation.json b/wwwroot/languages/en/translation.json index 8810fd7529a..0e7d6bce3c4 100644 --- a/wwwroot/languages/en/translation.json +++ b/wwwroot/languages/en/translation.json @@ -1536,7 +1536,7 @@ "name": "Dataset" }, "tableStyle": { - "dataset": "Style" + "name": "Style" }, "tableStyleType": { "name": "Symbology", @@ -1897,8 +1897,12 @@ "outline": { "name": "Outline style", "selectableDimensions": { - "color": "Color", - "width": "Width" + "color": { + "name": "Color" + }, + "width": { + "name": "Width" + } } }, "label": { diff --git a/wwwroot/languages/ja/translation.json b/wwwroot/languages/ja/translation.json index f6e4628150b..fd99b4dd3e7 100644 --- a/wwwroot/languages/ja/translation.json +++ b/wwwroot/languages/ja/translation.json @@ -1535,7 +1535,7 @@ "name": "データセット" }, "tableStyle": { - "dataset": "スタイル" + "name": "スタイル" }, "tableStyleType": { "name": "シンボル設定", @@ -1896,8 +1896,12 @@ "outline": { "name": "線", "selectableDimensions": { - "color": "色", - "width": "太さ" + "color": { + "name": "色" + }, + "width": { + "name": "太さ" + } } }, "label": { From 271396bfaf94e3d43fdb3922f7b641454d7a4a4b Mon Sep 17 00:00:00 2001 From: Nick Forbes-Smith Date: Wed, 11 Oct 2023 20:11:48 +1100 Subject: [PATCH 310/654] Tweak ArcGis WMS getFeatureInfoFormat --- CHANGES.md | 4 + .../Ows/WebMapServiceCapabilitiesStratum.ts | 21 +- .../Ows/WebMapServiceCatalogItemSpec.ts | 54 +++ wwwroot/test/WMS/wms_esri.xml | 150 ++++++++ wwwroot/test/WMS/wms_esri_2.xml | 328 ++++++++++++++++++ 5 files changed, 555 insertions(+), 2 deletions(-) create mode 100644 wwwroot/test/WMS/wms_esri.xml create mode 100644 wwwroot/test/WMS/wms_esri_2.xml diff --git a/CHANGES.md b/CHANGES.md index 47acbcbb217..047dd022636 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -4,6 +4,10 @@ - Allow translation of TableStylingWorkflow. - Fix "Remove all" not removing selected/picked features +- WMS `isEsri` default value will now check for case-insensitive `mapserver/wmsserver` (instead of `MapServer/WMSServer`) +- Tweak ArcGis MapServer WMS `GetFeatureInfo` default behaviour + - Add `application/geo+json` and `application/vnd.geo+json` default `GetFeatureInfo` (after `application/json` in priority list) + - Add `application/xml` default `GetFeatureInfo`. (if `isEsri` is true, then this will be used before `text/html`) - [The next improvement] #### 8.3.6 - 2023-10-03 diff --git a/lib/Models/Catalog/Ows/WebMapServiceCapabilitiesStratum.ts b/lib/Models/Catalog/Ows/WebMapServiceCapabilitiesStratum.ts index 8cb7bff5b01..32b8737cc18 100644 --- a/lib/Models/Catalog/Ows/WebMapServiceCapabilitiesStratum.ts +++ b/lib/Models/Catalog/Ows/WebMapServiceCapabilitiesStratum.ts @@ -712,7 +712,9 @@ export default class WebMapServiceCapabilitiesStratum extends LoadableStratum( @computed get isEsri(): boolean { if (this.catalogItem.url !== undefined) - return this.catalogItem.url.indexOf("MapServer/WMSServer") > -1; + return ( + this.catalogItem.url.toLowerCase().indexOf("mapserver/wmsserver") > -1 + ); return false; } @@ -831,9 +833,11 @@ export default class WebMapServiceCapabilitiesStratum extends LoadableStratum( } /** Prioritize format of GetFeatureInfo: - * - JSON + * - JSON/GeoJSON + * - If ESRI, then we prioritise XML next * - HTML * - GML + * - XML * - Plain text * * If no matching format can be found in GetCapabilities, then Cesium will use defaults (see `WebMapServiceImageryProvider.DefaultGetFeatureInfoFormats`) @@ -852,10 +856,23 @@ export default class WebMapServiceCapabilitiesStratum extends LoadableStratum( if (formatsArray.includes("application/json")) return { format: "application/json", type: "json" }; + if (formatsArray.includes("application/geo+json")) + return { format: "application/geo+json", type: "json" }; + if (formatsArray.includes("application/vnd.geo+json")) + return { format: "application/vnd.geo+json", type: "json" }; + + // Special case for Esri WMS, use XML before HTML + // as HTML includes with rowbg that is hard to read + if (this.isEsri && formatsArray.includes("text/xml")) { + return { format: "text/xml", type: "xml" }; + } if (formatsArray.includes("text/html")) return { format: "text/html", type: "html" }; if (formatsArray.includes("application/vnd.ogc.gml")) return { format: "application/vnd.ogc.gml", type: "xml" }; + if (formatsArray.includes("text/xml")) { + return { format: "text/xml", type: "xml" }; + } if (formatsArray.includes("text/plain")) return { format: "text/plain", type: "text" }; } diff --git a/test/Models/Catalog/Ows/WebMapServiceCatalogItemSpec.ts b/test/Models/Catalog/Ows/WebMapServiceCatalogItemSpec.ts index 05541195379..a037149fa86 100644 --- a/test/Models/Catalog/Ows/WebMapServiceCatalogItemSpec.ts +++ b/test/Models/Catalog/Ows/WebMapServiceCatalogItemSpec.ts @@ -836,6 +836,60 @@ describe("WebMapServiceCatalogItem", function () { .catch(done.fail); }); + it("sets isEsri from URL", async function () { + let wms: WebMapServiceCatalogItem; + const terria = new Terria(); + wms = new WebMapServiceCatalogItem("test", terria); + runInAction(() => { + wms.setTrait( + CommonStrata.definition, + "url", + "http://gaservices.ga.gov.au/site_1/services/Geomorphology_Landform_Type_WM/MapServer/WMSServer?request=GetCapabilities&service=WMS" + ); + wms.setTrait( + CommonStrata.definition, + "getCapabilitiesUrl", + "test/WMS/wms_esri.xml" + ); + wms.setTrait(CommonStrata.definition, "layers", "0"); + }); + + await wms.loadMetadata(); + + expect(wms.isEsri).toBe(true); + expect(wms.getFeatureInfoFormat.type).toBe("json"); + expect(wms.getFeatureInfoFormat.format).toBe("application/geo+json"); + }); + + it("sets isEsri from URL - and uses XML over HTML", async function () { + let wms: WebMapServiceCatalogItem; + const terria = new Terria(); + wms = new WebMapServiceCatalogItem("test", terria); + runInAction(() => { + wms.setTrait( + CommonStrata.definition, + "url", + "http://gaservices.ga.gov.au/site_1/services/Geomorphology_Landform_Type_WM/MapServer/WMSServer?request=GetCapabilities&service=WMS" + ); + wms.setTrait( + CommonStrata.definition, + "getCapabilitiesUrl", + "test/WMS/wms_esri_2.xml" + ); + wms.setTrait( + CommonStrata.definition, + "layers", + "Topographic_Maps_Index_100k" + ); + }); + + await wms.loadMetadata(); + + expect(wms.isEsri).toBe(true); + expect(wms.getFeatureInfoFormat.type).toBe("xml"); + expect(wms.getFeatureInfoFormat.format).toBe("text/xml"); + }); + describe("imageryProvider", () => { let item: WebMapServiceCatalogItem; let imageryProvider: WebMapServiceImageryProvider; diff --git a/wwwroot/test/WMS/wms_esri.xml b/wwwroot/test/WMS/wms_esri.xml new file mode 100644 index 00000000000..69855cc3b20 --- /dev/null +++ b/wwwroot/test/WMS/wms_esri.xml @@ -0,0 +1,150 @@ + + + + + WMS + WMS + + + + + + + + + + + + +
    + + + + +
    + + + +
    + + + 4096 + 4096 +
    + + + + application/vnd.ogc.wms_xml + text/xml + + + + + + + + + + image/bmp + image/jpeg + image/tiff + image/png + image/png8 + image/png24 + image/png32 + image/gif + image/svg+xml + + + + + + + + + + application/vnd.esri.wms_raw_xml + application/vnd.esri.wms_featureinfo_xml + application/vnd.ogc.wms_xml + application/geo+json + text/xml + text/html + text/plain + + + + + + + + + + application/vnd.ogc.sld+xml + + + + + + + + + + + application/vnd.ogc.se_xml + application/vnd.ogc.se_inimage + application/vnd.ogc.se_blank + text/xml + XML + + + <![CDATA[National Broadband Network - Connections by technology type – July 2020]]> + CRS:84 + EPSG:4326 + EPSG:3857 + + EPSG:102100 + + 96.807660 + 168.005803 + -43.751975 + -9.210950 + + + + + + + 0 + <![CDATA[NBN - Satellite]]> + Test Abstract + CRS:84 + EPSG:4326 + EPSG:3857 + + EPSG:102100 + + 96.807660 + 168.005803 + -43.751975 + -9.210950 + + + + + + + + + +
    diff --git a/wwwroot/test/WMS/wms_esri_2.xml b/wwwroot/test/WMS/wms_esri_2.xml new file mode 100644 index 00000000000..685f116e8f8 --- /dev/null +++ b/wwwroot/test/WMS/wms_esri_2.xml @@ -0,0 +1,328 @@ + + + + + WMS + Topographic Map Indexes + Test Abstract + + + Map Index + topographic + 250k + 100k + 1 Million + web service + Australia + + + + + + Geoscience Australia + + + + Postal +
    GPO Box 378
    + Canberra + ACT + 2601 + Australia +
    + +61 2 6249 9111 + + clientservices@ga.gov.au +
    + NONE + © Commonwealth of Australia (Geoscience Australia) 2023. This product is released under the Creative Commons Attribution 4.0 International Licence. http://creativecommons.org/licenses/by/4.0/legalcode + 4096 + 4096 +
    + + + + application/vnd.ogc.wms_xml + text/xml + + + + + + + + + + image/bmp + image/jpeg + image/tiff + image/png + image/png8 + image/png24 + image/png32 + image/gif + image/svg+xml + + + + + + + + + + application/vnd.esri.wms_raw_xml + application/vnd.esri.wms_featureinfo_xml + application/vnd.ogc.wms_xml + text/xml + text/html + text/plain + + + + + + + + + + application/vnd.ogc.sld+xml + + + + + + + + + + + application/vnd.ogc.se_xml + application/vnd.ogc.se_inimage + application/vnd.ogc.se_blank + text/xml + XML + + + Topographic Map Indexes + EPSG:4283 + EPSG:4326 + CRS:84 + EPSG:3857 + EPSG:28348 + EPSG:28349 + EPSG:28350 + EPSG:28351 + EPSG:28352 + EPSG:28353 + EPSG:28354 + EPSG:28355 + EPSG:28356 + EPSG:28357 + EPSG:28358 + EPSG:32748 + EPSG:32749 + EPSG:32750 + EPSG:32751 + EPSG:32752 + EPSG:32753 + EPSG:32754 + EPSG:32755 + EPSG:32756 + EPSG:32757 + EPSG:32758 + EPSG:3031 + EPSG:3032 + EPSG:102100 + + + 108.000001 + 155.999999 + -43.999988 + -7.999985 + + + + + + + Topographic_Maps_Index_100k + Topographic Maps Index 100k + + EPSG:4283 + EPSG:4326 + CRS:84 + EPSG:3857 + EPSG:28348 + EPSG:28349 + EPSG:28350 + EPSG:28351 + EPSG:28352 + EPSG:28353 + EPSG:28354 + EPSG:28355 + EPSG:28356 + EPSG:28357 + EPSG:28358 + EPSG:32748 + EPSG:32749 + EPSG:32750 + EPSG:32751 + EPSG:32752 + EPSG:32753 + EPSG:32754 + EPSG:32755 + EPSG:32756 + EPSG:32757 + EPSG:32758 + EPSG:3031 + EPSG:3032 + EPSG:102100 + + + 112.500009 + 154.000008 + -43.849986 + -8.999986 + + + + + + + text/html + + + + 14174107.142857 + + + Topographic_Maps_Index_250k + Topographic Maps Index 250k + + EPSG:4283 + EPSG:4326 + CRS:84 + EPSG:3857 + EPSG:28348 + EPSG:28349 + EPSG:28350 + EPSG:28351 + EPSG:28352 + EPSG:28353 + EPSG:28354 + EPSG:28355 + EPSG:28356 + EPSG:28357 + EPSG:28358 + EPSG:32748 + EPSG:32749 + EPSG:32750 + EPSG:32751 + EPSG:32752 + EPSG:32753 + EPSG:32754 + EPSG:32755 + EPSG:32756 + EPSG:32757 + EPSG:32758 + EPSG:3031 + EPSG:3032 + EPSG:102100 + + + 112.883339 + 154.100008 + -43.999985 + -8.933316 + + + + + + + text/html + + + + 566964.285714 + + + AUSTopo_Australian_Digital_Map_Series_Index_250k + AUSTopo Australian Digital Map Series Index 250k + + Test Abstract + + EPSG:4283 + EPSG:4326 + CRS:84 + EPSG:3857 + EPSG:28348 + EPSG:28349 + EPSG:28350 + EPSG:28351 + EPSG:28352 + EPSG:28353 + EPSG:28354 + EPSG:28355 + EPSG:28356 + EPSG:28357 + EPSG:28358 + EPSG:32748 + EPSG:32749 + EPSG:32750 + EPSG:32751 + EPSG:32752 + EPSG:32753 + EPSG:32754 + EPSG:32755 + EPSG:32756 + EPSG:32757 + EPSG:32758 + EPSG:3031 + EPSG:3032 + EPSG:102100 + + + 112.883339 + 154.000008 + -43.999988 + -8.999986 + + + + + + + text/html + + + + 566964.285714 + + + +
    From 2d4b00bc18f0b0df6b7b6d0173435a984263dfa7 Mon Sep 17 00:00:00 2001 From: Nick Forbes-Smith Date: Wed, 11 Oct 2023 21:01:27 +1100 Subject: [PATCH 311/654] Add changes and update spec --- CHANGES.md | 1 + .../Catalog/Ows/WebMapServiceCatalogItemSpec.ts | 13 +++++++++++++ 2 files changed, 14 insertions(+) diff --git a/CHANGES.md b/CHANGES.md index 47acbcbb217..6d958bd6891 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -4,6 +4,7 @@ - Allow translation of TableStylingWorkflow. - Fix "Remove all" not removing selected/picked features +- Fix WMS `GetMap`/`GetFeatureInfo` requests not having `styles` parameter (will use empty string instead of `undefined`) - [The next improvement] #### 8.3.6 - 2023-10-03 diff --git a/test/Models/Catalog/Ows/WebMapServiceCatalogItemSpec.ts b/test/Models/Catalog/Ows/WebMapServiceCatalogItemSpec.ts index 05541195379..2c7b4bbb999 100644 --- a/test/Models/Catalog/Ows/WebMapServiceCatalogItemSpec.ts +++ b/test/Models/Catalog/Ows/WebMapServiceCatalogItemSpec.ts @@ -153,6 +153,7 @@ describe("WebMapServiceCatalogItem", function () { expect(tileProviderResource.queryParameters.request).toBe("GetMap"); expect(tileProviderResource.queryParameters.transparent).toBeTruthy(); expect(tileProviderResource.queryParameters.format).toBe("image/png"); + expect(tileProviderResource.queryParameters.styles).toBe(""); const getFeatureInfoResource: Resource = ( mapItems[0].imageryProvider as any @@ -168,6 +169,7 @@ describe("WebMapServiceCatalogItem", function () { expect(getFeatureInfoResource.queryParameters.feature_count).toBe( terria.configParameters.defaultMaximumShownFeatureInfos + 1 ); + expect(getFeatureInfoResource.queryParameters.styles).toBe(""); expect(mapItems[0].imageryProvider.tileHeight).toBe(256); expect(mapItems[0].imageryProvider.tileWidth).toBe(256); @@ -214,6 +216,7 @@ describe("WebMapServiceCatalogItem", function () { expect(tileProviderResource.queryParameters.format).toBe("image/png"); expect(tileProviderResource.queryParameters.tiled).toBeTruthy(); expect(tileProviderResource.queryParameters.transparent).toBeTruthy(); + expect(tileProviderResource.queryParameters.styles).toBe(""); const getFeatureInfoResource: Resource = ( mapItems[0].imageryProvider as any @@ -232,6 +235,7 @@ describe("WebMapServiceCatalogItem", function () { expect(getFeatureInfoResource.queryParameters.feature_count).toBe( terria.configParameters.defaultMaximumShownFeatureInfos + 1 ); + expect(getFeatureInfoResource.queryParameters.styles).toBe(""); expect(mapItems[0].imageryProvider.tileHeight).toBe(256); expect(mapItems[0].imageryProvider.tileWidth).toBe(256); @@ -248,6 +252,7 @@ describe("WebMapServiceCatalogItem", function () { runInAction(() => { wms.setTrait("definition", "url", "test/WMS/single_metadata_url.xml"); wms.setTrait("definition", "layers", "single_period"); + wms.setTrait("definition", "styles", "jet"); wms.setTrait("definition", "parameters", { some: "thing", another: "value" @@ -284,6 +289,10 @@ describe("WebMapServiceCatalogItem", function () { expect(tileProviderResource.queryParameters.request).toBe("GetMap"); expect(tileProviderResource.queryParameters.transparent).toBeTruthy(); expect(tileProviderResource.queryParameters.format).toBe("image/png"); + expect(tileProviderResource.queryParameters.layers).toBe( + "single_period" + ); + expect(tileProviderResource.queryParameters.styles).toBe("jet"); expect(tileProviderResource.queryParameters.some).toBe("thing"); expect(tileProviderResource.queryParameters.another).toBe("value"); @@ -301,6 +310,10 @@ describe("WebMapServiceCatalogItem", function () { expect(getFeatureInfoResource.queryParameters.feature_count).toBe( terria.configParameters.defaultMaximumShownFeatureInfos + 1 ); + expect(getFeatureInfoResource.queryParameters.layers).toBe( + "single_period" + ); + expect(getFeatureInfoResource.queryParameters.styles).toBe("jet"); expect(getFeatureInfoResource.queryParameters.some).toBe("thing else"); expect(getFeatureInfoResource.queryParameters.another).toBe("value"); From 41419db579a6701c2762578bc8c8253fcc2695fb Mon Sep 17 00:00:00 2001 From: Nick Forbes-Smith Date: Thu, 12 Oct 2023 12:19:06 +1100 Subject: [PATCH 312/654] make test more robust --- .../Ows/WebMapServiceCatalogItemSpec.ts | 26 +++++++++---------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/test/Models/Catalog/Ows/WebMapServiceCatalogItemSpec.ts b/test/Models/Catalog/Ows/WebMapServiceCatalogItemSpec.ts index 925f094bd5a..75f6289d816 100644 --- a/test/Models/Catalog/Ows/WebMapServiceCatalogItemSpec.ts +++ b/test/Models/Catalog/Ows/WebMapServiceCatalogItemSpec.ts @@ -595,24 +595,22 @@ describe("WebMapServiceCatalogItem", function () { expect(wmsItem.mapItems.length).toBe(2); expect(wmsItem.isPaused).toBe(false); - const currentImageryProvider = wmsItem.mapItems[0].imageryProvider; + const currentImageryProvider = wmsItem.mapItems[0] + .imageryProvider as WebMapServiceImageryProvider; expect(currentImageryProvider instanceof WebMapServiceImageryProvider).toBe( true ); - if (currentImageryProvider instanceof WebMapServiceImageryProvider) { - expect(currentImageryProvider.enablePickFeatures).toBe(true); - } + expect(currentImageryProvider.enablePickFeatures).toBe(false); const nextMapItem = wmsItem.mapItems[1]; - const nextImageryProvider = nextMapItem.imageryProvider; + const nextImageryProvider = + nextMapItem.imageryProvider as WebMapServiceImageryProvider; expect(nextImageryProvider instanceof WebMapServiceImageryProvider).toBe( true ); - if (nextImageryProvider instanceof WebMapServiceImageryProvider) { - expect(nextImageryProvider.enablePickFeatures).toBe(false); - expect(nextMapItem.alpha).toBe(0); - expect(nextMapItem.show).toBe(true); - } + expect(nextImageryProvider.enablePickFeatures).toBe(false); + expect(nextMapItem.alpha).toBe(0); + expect(nextMapItem.show).toBe(true); }); it("sets enableFeaturePicking to false", async function () { @@ -634,13 +632,13 @@ describe("WebMapServiceCatalogItem", function () { expect(wmsItem.mapItems.length).toBe(1); expect(wmsItem.allowFeaturePicking).toBe(false); - const imageryProvider = wmsItem.mapItems[0].imageryProvider; + const imageryProvider = wmsItem.mapItems[0] + .imageryProvider as WebMapServiceImageryProvider; expect( imageryProvider instanceof WebMapServiceImageryProvider ).toBeTruthy(); - if (imageryProvider instanceof WebMapServiceImageryProvider) { - expect(imageryProvider.enablePickFeatures).toBe(false); - } + + expect(imageryProvider.enablePickFeatures).toBe(false); }); it("dimensions and styles for a 'real' WMS layer", function (done) { From 34490a64774846ba76cb42c3e031d3e9a8795a8a Mon Sep 17 00:00:00 2001 From: Nick Forbes-Smith Date: Thu, 12 Oct 2023 13:11:44 +1100 Subject: [PATCH 313/654] fix test --- test/Models/Catalog/Ows/WebMapServiceCatalogItemSpec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/Models/Catalog/Ows/WebMapServiceCatalogItemSpec.ts b/test/Models/Catalog/Ows/WebMapServiceCatalogItemSpec.ts index 75f6289d816..54284a78533 100644 --- a/test/Models/Catalog/Ows/WebMapServiceCatalogItemSpec.ts +++ b/test/Models/Catalog/Ows/WebMapServiceCatalogItemSpec.ts @@ -600,7 +600,7 @@ describe("WebMapServiceCatalogItem", function () { expect(currentImageryProvider instanceof WebMapServiceImageryProvider).toBe( true ); - expect(currentImageryProvider.enablePickFeatures).toBe(false); + expect(currentImageryProvider.enablePickFeatures).toBe(true); const nextMapItem = wmsItem.mapItems[1]; const nextImageryProvider = From 5dc00330a5859b056e34f80f6544a2ffdbe2048e Mon Sep 17 00:00:00 2001 From: Lawrence Owen Date: Thu, 5 Oct 2023 15:21:45 +1000 Subject: [PATCH 314/654] Replace usages of construct --- .../Analytics/RegionDataParameterEditor.jsx | 8 +- .../Custom/Chart/BottomDockChart.jsx | 8 +- .../Custom/Chart/MomentPointsChart.jsx | 4 +- lib/ReactViews/Custom/Chart/Tooltip.jsx | 8 +- lib/ReactViews/DataCatalog/DataCatalog.jsx | 37 ++++---- .../DataCatalog/DataCatalogGroup.jsx | 7 +- lib/ReactViews/ExplorerWindow/Tabs.jsx | 4 +- .../Tabs/MyDataTab/MyDataTab.jsx | 4 +- lib/ReactViews/Generic/Dropdown.jsx | 6 +- lib/ReactViews/Map/MenuBar/MenuBar.jsx | 14 ++- .../Map/Panels/HelpPanel/HelpPanel.jsx | 7 +- .../Map/Panels/HelpPanel/StyledHtml.jsx | 90 +++++++++---------- lib/ReactViews/Mobile/MobileMenu.jsx | 8 +- .../Preview/DataPreviewSections.jsx | 4 +- lib/ReactViews/Preview/Description.jsx | 82 ++++++++--------- lib/ReactViews/Preview/MetadataTable.jsx | 4 +- lib/ReactViews/Search/Breadcrumbs.jsx | 75 ++++++++-------- lib/ReactViews/Search/SearchBoxAndResults.jsx | 43 +++++---- 18 files changed, 203 insertions(+), 210 deletions(-) diff --git a/lib/ReactViews/Analytics/RegionDataParameterEditor.jsx b/lib/ReactViews/Analytics/RegionDataParameterEditor.jsx index e9879f8075a..ff35de5c814 100644 --- a/lib/ReactViews/Analytics/RegionDataParameterEditor.jsx +++ b/lib/ReactViews/Analytics/RegionDataParameterEditor.jsx @@ -190,11 +190,7 @@ const RegionDataParameterEditor = createReactClass({ return (
      - + {this.catalogItemsWithMatchingRegion().map((catalogItem, i) => ( {this.renderItemChildren(catalogItem)} - + ))}
    ); diff --git a/lib/ReactViews/Custom/Chart/BottomDockChart.jsx b/lib/ReactViews/Custom/Chart/BottomDockChart.jsx index 9dcaf4444b8..b46ff3e545e 100644 --- a/lib/ReactViews/Custom/Chart/BottomDockChart.jsx +++ b/lib/ReactViews/Custom/Chart/BottomDockChart.jsx @@ -281,15 +281,15 @@ class Chart extends React.Component { scale={this.xScale} label={xAxis.units || (xAxis.scale === "time" && "Date")} /> - + {this.yAxes.map((y, i) => ( 1 ? y.color : defaultGridColor} offset={i * 50} /> - - + ))} + {this.yAxes.map((y, i) => ( 1 ? y.color : defaultGridColor} lineStyle={{ opacity: 0.3 }} /> - + ))} - + {this.points.map((p, i) => ( - + ))} ); } diff --git a/lib/ReactViews/Custom/Chart/Tooltip.jsx b/lib/ReactViews/Custom/Chart/Tooltip.jsx index 75e68e744cd..35288c9565c 100644 --- a/lib/ReactViews/Custom/Chart/Tooltip.jsx +++ b/lib/ReactViews/Custom/Chart/Tooltip.jsx @@ -94,13 +94,13 @@ class Tooltip extends React.Component { >
    {this.title}
    - + {this.groups.map((group) => ( 1 ? group.name : undefined} items={group.items} /> - + ))}
    @@ -119,9 +119,9 @@ class TooltipGroup extends React.PureComponent { return (
    {name &&
    {name}
    } - + {items.map((item) => ( - + ))}
    ); } diff --git a/lib/ReactViews/DataCatalog/DataCatalog.jsx b/lib/ReactViews/DataCatalog/DataCatalog.jsx index cf0fe0a197b..e0f10c0cc9f 100644 --- a/lib/ReactViews/DataCatalog/DataCatalog.jsx +++ b/lib/ReactViews/DataCatalog/DataCatalog.jsx @@ -50,24 +50,25 @@ class DataCatalog extends React.Component { /> )} - - {item !== this.props.terria.catalog.userAddedDataGroup && ( - - )} - + {items.map( + (item) => + item !== this.props.terria.catalog.userAddedDataGroup && ( + + ) + )} ); } diff --git a/lib/ReactViews/DataCatalog/DataCatalogGroup.jsx b/lib/ReactViews/DataCatalog/DataCatalogGroup.jsx index 95a4eb54c8b..db6135185f5 100644 --- a/lib/ReactViews/DataCatalog/DataCatalogGroup.jsx +++ b/lib/ReactViews/DataCatalog/DataCatalogGroup.jsx @@ -134,8 +134,8 @@ class DataCatalogGroup extends React.Component { this.props.terria )} > - {this.isOpen() && ( - + {this.isOpen() && + group.memberModels.map((item) => ( - - )} + ))} ); } diff --git a/lib/ReactViews/ExplorerWindow/Tabs.jsx b/lib/ReactViews/ExplorerWindow/Tabs.jsx index fc7ec3814cb..021414241ca 100644 --- a/lib/ReactViews/ExplorerWindow/Tabs.jsx +++ b/lib/ReactViews/ExplorerWindow/Tabs.jsx @@ -143,7 +143,7 @@ class Tabs extends React.Component { background-color: ${(p) => p.theme.colorPrimary}; `} > - + {tabs.map((item, i) => (
  • -
    + ))}
    - + {tabs.map((tab) => (
  • -
    + ))} ); } diff --git a/lib/ReactViews/Generic/Dropdown.jsx b/lib/ReactViews/Generic/Dropdown.jsx index a5b43dc16b7..f352d1422e4 100644 --- a/lib/ReactViews/Generic/Dropdown.jsx +++ b/lib/ReactViews/Generic/Dropdown.jsx @@ -138,7 +138,7 @@ const Dropdown = createReactClass({ [isOpenStyle]: this.state.isOpen })} > - + {this.props.options.map((option, i) => (
  • @@ -164,14 +164,14 @@ const Dropdown = createReactClass({ this.props.theme.btnOption || "", { [Styles.isSelected]: option === this.props.selected } )} - onClick={() => this.select(option, index)} + onClick={() => this.select(option, i)} > {option[this.props.textProperty]}
  • -
    + ))} ); diff --git a/lib/ReactViews/Map/MenuBar/MenuBar.jsx b/lib/ReactViews/Map/MenuBar/MenuBar.jsx index 80831e80cc2..52d6ab42eeb 100644 --- a/lib/ReactViews/Map/MenuBar/MenuBar.jsx +++ b/lib/ReactViews/Map/MenuBar/MenuBar.jsx @@ -56,13 +56,12 @@ const MenuBar = observer((props) => { )} - {!viewState.useSmallScreenInterface && ( - + {!viewState.useSmallScreenInterface && + props.menuLeftItems.map((element, i) => (
  • {element}
  • -
    - )} + ))}
    @@ -103,13 +102,12 @@ const MenuBar = observer((props) => { /> - {!viewState.useSmallScreenInterface && ( - + {!viewState.useSmallScreenInterface && + menuItems.map((element, i) => (
  • {element}
  • -
    - )} + ))}
    ); diff --git a/lib/ReactViews/Map/Panels/HelpPanel/HelpPanel.jsx b/lib/ReactViews/Map/Panels/HelpPanel/HelpPanel.jsx index aa6e72ee181..6d31dba92ab 100644 --- a/lib/ReactViews/Map/Panels/HelpPanel/HelpPanel.jsx +++ b/lib/ReactViews/Map/Panels/HelpPanel/HelpPanel.jsx @@ -139,16 +139,15 @@ class HelpPanel extends React.Component { - {helpItems && ( - + {helpItems && + helpItems.map((item, i) => ( - - )} + ))} ); diff --git a/lib/ReactViews/Map/Panels/HelpPanel/StyledHtml.jsx b/lib/ReactViews/Map/Panels/HelpPanel/StyledHtml.jsx index 88c4fb495b3..496cd6bf9b2 100644 --- a/lib/ReactViews/Map/Panels/HelpPanel/StyledHtml.jsx +++ b/lib/ReactViews/Map/Panels/HelpPanel/StyledHtml.jsx @@ -20,21 +20,19 @@ const Numbers = styled(Text)` `; const renderOrderedList = function (contents) { - return ( - - - - - {i + 1} - - - - - {content} - + return contents.map((content, i) => ( + + + + {i + 1} + + - - ); + + {content} + + + )); }; export class StyledHtmlRaw extends React.Component { @@ -73,42 +71,42 @@ export class StyledHtmlRaw extends React.Component { return (
    - {content?.map && ( - - {item && ( - - {/* Either a header or paragraph tag */} - - - {item.props.children} - - - - {renderOrderedList( - item.props.children.map((point) => point.props.children) - )} - - - - {/* If it's none of the above tags, just render as + {content?.map && + content.map( + (item, i) => + item && ( + + {/* Either a header or paragraph tag */} + + + {item.props.children} + + + + {renderOrderedList( + item.props.children.map((point) => point.props.children) + )} + + + + {/* If it's none of the above tags, just render as {/* If it's none of the above tags, just render as {/* If it's none of the above tags, just render as normal html but with the same text formatting. We can style more tags as necessary */} - - {item} - - - - )} - - )} + + {item} + + + + ) + )}
    ); } diff --git a/lib/ReactViews/Mobile/MobileMenu.jsx b/lib/ReactViews/Mobile/MobileMenu.jsx index 35ed2de201c..319aabeace5 100644 --- a/lib/ReactViews/Mobile/MobileMenu.jsx +++ b/lib/ReactViews/Mobile/MobileMenu.jsx @@ -116,14 +116,14 @@ class MobileMenu extends React.Component { [Styles.mobileNavHidden]: !this.props.viewState.mobileMenuVisible })} > - + {this.props.menuLeftItems.map((menuItem) => (
    this.hideMenu()} key={menuItem ? menuItem.key : undefined} > {menuItem}
    -
    + ))}
    this.hideMenu()}>
    - + {this.props.menuItems.map((menuItem) => (
    this.hideMenu()} key={menuItem ? menuItem.key : undefined} > {menuItem}
    -
    + ))} {mapUserGuide && } {this.props.showFeedback && ( - + {this.sortInfoSections(items).map((item, i) => ( - + ))} ); } diff --git a/lib/ReactViews/Preview/Description.jsx b/lib/ReactViews/Preview/Description.jsx index 444b71a5316..c98208321b4 100644 --- a/lib/ReactViews/Preview/Description.jsx +++ b/lib/ReactViews/Preview/Description.jsx @@ -64,7 +64,7 @@ class Description extends React.Component { {metadataUrls && metadataUrls.length > 0 && ( <>

    {t("description.metadataUrls")}

    - + {metadataUrls.map((metadataUrl, i) => ( - + ))} )} @@ -183,18 +183,19 @@ class Description extends React.Component { {dataUrls && dataUrls.length > 0 && ( <>

    {t("description.dataUrl")}

    - - - - {dataUrl.type?.startsWith("wfs") && - parseCustomMarkdownToReact( - t("description.useLinkBelow", { - link: ` + {dataUrls.map((dataUrl, i) => ( + <> + + + {dataUrl.type?.startsWith("wfs") && + parseCustomMarkdownToReact( + t("description.useLinkBelow", { + link: `
    ` - }) - )} - {dataUrl.type?.startsWith("wcs") && - parseCustomMarkdownToReact( - t("description.useLinkBelow", { - link: ` + }) + )} + {dataUrl.type?.startsWith("wcs") && + parseCustomMarkdownToReact( + t("description.useLinkBelow", { + link: ` ` - }) + }) + )} + + + + p.theme.colorPrimary}; + `} + > + {dataUrl.title && ( + )} - - - - p.theme.colorPrimary}; - `} - > - {dataUrl.title && ( - - )} - {!dataUrl.title ? dataUrl.url : null} - - -
    + {!dataUrl.title ? dataUrl.url : null} + + {" "} + + ))} )} diff --git a/lib/ReactViews/Preview/MetadataTable.jsx b/lib/ReactViews/Preview/MetadataTable.jsx index 1f270582971..7ca9cbba847 100644 --- a/lib/ReactViews/Preview/MetadataTable.jsx +++ b/lib/ReactViews/Preview/MetadataTable.jsx @@ -36,7 +36,7 @@ const MetadataTable = createReactClass({ )} 0 && !isArr}> - + {keys.map((key, i) => (
    - + ))} diff --git a/lib/ReactViews/Search/Breadcrumbs.jsx b/lib/ReactViews/Search/Breadcrumbs.jsx index c863f43054d..12b464daeef 100644 --- a/lib/ReactViews/Search/Breadcrumbs.jsx +++ b/lib/ReactViews/Search/Breadcrumbs.jsx @@ -69,45 +69,46 @@ class Breadcrumbs extends React.Component { /> - {parentGroups && ( - - - {/* No link when it's the current member */} - - - {parent} - - - {/* The first and last two groups use the full name */} - = parentGroups.length - 2}> - - this.openInCatalog(ancestors.slice(i, i + 1)) - } - > - + {parentGroups && + parentGroups.map((parent, i) => ( + <> + + {/* No link when it's the current member */} + + {parent} - - - - {/* The remainder are just '..' to prevent/minimise overflowing */} - 1 && i < parentGroups.length - 2}> - - {"..."} - - - + + + {/* The first and last two groups use the full name */} + = parentGroups.length - 2}> + + this.openInCatalog(ancestors.slice(i, i + 1)) + } + > + + {parent} + + + + {/* The remainder are just '..' to prevent/minimise overflowing */} + 1 && i < parentGroups.length - 2}> + + {"..."} + + + - {i !== parentGroups.length - 1 && ( - - - {">"} - - - )} - - )} + {i !== parentGroups.length - 1 && ( + + + {">"} + + + )} + + ))} ); diff --git a/lib/ReactViews/Search/SearchBoxAndResults.jsx b/lib/ReactViews/Search/SearchBoxAndResults.jsx index 73de17a905e..2116884da06 100644 --- a/lib/ReactViews/Search/SearchBoxAndResults.jsx +++ b/lib/ReactViews/Search/SearchBoxAndResults.jsx @@ -197,28 +197,27 @@ export class SearchBoxAndResultsRaw extends React.Component { overflow-y: auto; `} > - - { - addMarker(this.props.terria, result); - result.clickAction(); - runInAction(() => { - searchState.showLocationSearchResults = false; - }); - }} - isWaitingForSearchToStart={ - searchState.isWaitingToStartLocationSearch - } - /> - + {this.props.viewState.searchState.locationSearchResults.map( + (search) => ( + { + addMarker(this.props.terria, result); + result.clickAction(); + runInAction(() => { + searchState.showLocationSearchResults = false; + }); + }} + isWaitingForSearchToStart={ + searchState.isWaitingToStartLocationSearch + } + /> + ) + )} )} From 7e53ae0852257f249ada5880a23a16b6ca5ea542 Mon Sep 17 00:00:00 2001 From: Lawrence Owen Date: Thu, 5 Oct 2023 16:54:36 +1000 Subject: [PATCH 315/654] Remove unused import --- lib/ReactViews/Preview/DataPreviewSections.jsx | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/ReactViews/Preview/DataPreviewSections.jsx b/lib/ReactViews/Preview/DataPreviewSections.jsx index 4cae014bd95..f7f3e8277b3 100644 --- a/lib/ReactViews/Preview/DataPreviewSections.jsx +++ b/lib/ReactViews/Preview/DataPreviewSections.jsx @@ -8,7 +8,6 @@ import { withTranslation } from "react-i18next"; import isDefined from "../../Core/isDefined"; import CommonStrata from "../../Models/Definition/CommonStrata"; import Box from "../../Styled/Box"; -import { item } from "../Custom/Chart/tooltip.scss"; import Collapsible from "../Custom/Collapsible/Collapsible"; import parseCustomMarkdownToReact from "../Custom/parseCustomMarkdownToReact"; import MetadataTable from "./MetadataTable"; From 7df27d749660fc23d84e9dece4980247c7dc3eda Mon Sep 17 00:00:00 2001 From: Lawrence Owen Date: Thu, 12 Oct 2023 15:46:25 +1000 Subject: [PATCH 316/654] Deprecate use of - Add unit test for CatalogGroup component Where single path or exclusive conditions replace with && Where two paths use ternary operator ? : For more paths extract out into sub render function --- lib/ReactViews/DataCatalog/CatalogGroup.jsx | 19 +- lib/ReactViews/Disclaimer.jsx | 13 +- lib/ReactViews/Generic/Dropdown.jsx | 57 +++-- .../Map/Panels/HelpPanel/StyledHtml.jsx | 69 +++--- lib/ReactViews/Mobile/MobileHeader.jsx | 76 ++++--- lib/ReactViews/Preview/DataPreview.jsx | 137 ++++++------ lib/ReactViews/Preview/DataPreviewMap.jsx | 24 +-- .../Preview/DataPreviewSections.jsx | 17 +- lib/ReactViews/Preview/Description.jsx | 200 +++++++++--------- lib/ReactViews/Preview/GroupPreview.jsx | 13 +- lib/ReactViews/Preview/MetadataTable.jsx | 73 +++---- lib/ReactViews/Search/Breadcrumbs.jsx | 69 +++--- .../customizable/ResponsiveSwitch.jsx | 13 +- .../DataCatalog/CatalogGroupSpec.tsx | 53 +++++ 14 files changed, 428 insertions(+), 405 deletions(-) create mode 100644 test/ReactViews/DataCatalog/CatalogGroupSpec.tsx diff --git a/lib/ReactViews/DataCatalog/CatalogGroup.jsx b/lib/ReactViews/DataCatalog/CatalogGroup.jsx index 8307c38d53e..4028e0f082b 100644 --- a/lib/ReactViews/DataCatalog/CatalogGroup.jsx +++ b/lib/ReactViews/DataCatalog/CatalogGroup.jsx @@ -124,21 +124,22 @@ function CatalogGroup(props) { [Styles.catalogGroupLowerLevel]: !props.topLevel })} > - - -
  • - -
  • -
    - + {props.loading && ( +
  • + +
  • + )} + {props.loading === false && + props.children.length === 0 && + props.emptyMessage && (
  • {props.emptyMessage}
  • -
    -
    + )} + {props.children} )} diff --git a/lib/ReactViews/Disclaimer.jsx b/lib/ReactViews/Disclaimer.jsx index 656ec1ef8f7..a6b4479c0f1 100644 --- a/lib/ReactViews/Disclaimer.jsx +++ b/lib/ReactViews/Disclaimer.jsx @@ -144,14 +144,11 @@ class Disclaimer extends React.Component { {disclaimerDeny} )} - - - - - - - - + {useSmallScreenInterface ? ( + + ) : ( + + )} this.confirm(disclaimer.confirmAction)} fullWidth={useSmallScreenInterface || !renderDenyButton} diff --git a/lib/ReactViews/Generic/Dropdown.jsx b/lib/ReactViews/Generic/Dropdown.jsx index f352d1422e4..8fa71647881 100644 --- a/lib/ReactViews/Generic/Dropdown.jsx +++ b/lib/ReactViews/Generic/Dropdown.jsx @@ -140,36 +140,33 @@ const Dropdown = createReactClass({ > {this.props.options.map((option, i) => (
  • - - - - {option[this.props.textProperty]} - - - - - - + {option.href ? ( + + {option[this.props.textProperty]} + + ) : ( + + )}
  • ))} diff --git a/lib/ReactViews/Map/Panels/HelpPanel/StyledHtml.jsx b/lib/ReactViews/Map/Panels/HelpPanel/StyledHtml.jsx index 496cd6bf9b2..f1a019e774f 100644 --- a/lib/ReactViews/Map/Panels/HelpPanel/StyledHtml.jsx +++ b/lib/ReactViews/Map/Panels/HelpPanel/StyledHtml.jsx @@ -72,41 +72,42 @@ export class StyledHtmlRaw extends React.Component { return (
    {content?.map && - content.map( - (item, i) => - item && ( - - {/* Either a header or paragraph tag */} - - - {item.props.children} - - - - {renderOrderedList( - item.props.children.map((point) => point.props.children) - )} - - - - {/* If it's none of the above tags, just render as - {/* If it's none of the above tags, just render as - {/* If it's none of the above tags, just render as + content.map((item, i) => { + if (!item) return null; + + /* Either a header or paragraph tag */ + if (/(h[0-6]|p)/i.test(item.type)) { + return ( + + {item.props.children} + + ); + } else if (item.type === "ol") { + return ( + <> + {renderOrderedList( + item.props.children.map((point) => point.props.children) + )} + + + ); + /* If it's none of the above tags, just render as normal html but with the same text formatting. - We can style more tags as necessary */} - - {item} - - - - ) - )} + We can style more tags as necessary */ + } else { + return ( + + {item} + + ); + } + })}
    ); } diff --git a/lib/ReactViews/Mobile/MobileHeader.jsx b/lib/ReactViews/Mobile/MobileHeader.jsx index 0c24824cace..b95adb30105 100644 --- a/lib/ReactViews/Mobile/MobileHeader.jsx +++ b/lib/ReactViews/Mobile/MobileHeader.jsx @@ -126,6 +126,35 @@ class MobileHeader extends React.Component { }); } + renderSearch() { + const { t } = this.props; + + const searchState = this.props.viewState.searchState; +
    + {searchState.showMobileLocationSearch && ( + + )} + {searchState.showMobileCatalogSearch && ( + + )} +
    ; + } + render() { const searchState = this.props.viewState.searchState; const { t } = this.props; @@ -143,13 +172,9 @@ class MobileHeader extends React.Component { paddedRatio={1} backgroundColor={this.props.theme.dark} > - - + {!searchState.showMobileLocationSearch && + !searchState.showMobileCatalogSearch ? ( + <> - - -
    - - - - - - - - -
    -
    -
    + + ) : ( + this.renderSearch() + )} - - -
    -

    {previewed.name}

    - -
    -
    - -
    - -
    -
    - -
    -

    {previewed.name}

    -

    {t("preview.doesNotContainGeospatialData")}

    -
    - {/* TODO: Show a preview chart - - */} -
    - -
    -
    - +

    {previewed.name}

    + + + ); + } else if (previewed && previewed.isMappable) { + return ( +
    + +
    + ); + } else if (chartData) { +
    +

    {previewed.name}

    +

    {t("preview.doesNotContainGeospatialData")}

    +
    + {/* TODO: Show a preview chart + + */} +
    + +
    ; + } else if (previewed && CatalogFunctionMixin.isMixedInto(previewed)) { + return ( + + ); + } else if (previewed && previewed.isGroup) { + return ( +
    + +
    + ); + } else { +
    + +

    Select a dataset to see a preview

    +

    - OR -

    + -
    -
    - -
    - - ); + Go to the map + + + ; + } + } + + render() { + return
    {this.renderInner()}
    ; } renderUnloadedReference() { diff --git a/lib/ReactViews/Preview/DataPreviewMap.jsx b/lib/ReactViews/Preview/DataPreviewMap.jsx index 0886628e410..19381be68a7 100644 --- a/lib/ReactViews/Preview/DataPreviewMap.jsx +++ b/lib/ReactViews/Preview/DataPreviewMap.jsx @@ -271,20 +271,16 @@ class DataPreviewMap extends React.Component { }; return (
    - - -
    - - -
    - - - + {this.props.showMap ? ( +
    + ) : ( +
    + )} diff --git a/lib/ReactViews/Preview/DataPreviewSections.jsx b/lib/ReactViews/Preview/DataPreviewSections.jsx index f7f3e8277b3..5f8d52f88e5 100644 --- a/lib/ReactViews/Preview/DataPreviewSections.jsx +++ b/lib/ReactViews/Preview/DataPreviewSections.jsx @@ -100,16 +100,13 @@ class DataPreviewSections extends React.Component { } bodyTextProps={{ medium: true }} > - - 0}> - {renderSection(item)} - - - - - - - + {item.content?.length > 0 + ? renderSection(item) + : item.contentAsObject !== undefined && ( + + + + )} ))} diff --git a/lib/ReactViews/Preview/Description.jsx b/lib/ReactViews/Preview/Description.jsx index c98208321b4..60b36068698 100644 --- a/lib/ReactViews/Preview/Description.jsx +++ b/lib/ReactViews/Preview/Description.jsx @@ -24,6 +24,45 @@ class Description extends React.Component { t: PropTypes.func.isRequired }; + renderDescription(catalogItem) { + if (catalogItem.type === "wms") { + return ( +

    + + This is a + + WMS service + + , which generates map images on request. It can be used in GIS + software with this URL: + +

    + ); + } else if (catalogItem.type === "wfs") { + return ( +

    + + This is a + + WFS service + + , which transfers raw spatial data on request. It can be used in GIS + software with this URL: + +

    + ); + } + return null; + } + render() { const { t } = this.props; const catalogItem = this.props.item; @@ -101,97 +140,53 @@ class Description extends React.Component { {catalogItem.url && ( <>

    {catalogItem.typeName} URL

    - - -

    - - This is a - - WMS service - - , which generates map images on request. It can be used - in GIS software with this URL: - -

    -
    - -

    - - This is a - - WFS service - - , which transfers raw spatial data on request. It can be - used in GIS software with this URL: - -

    -
    -
    - - - {catalogItem.url} - - - e.target.select()} - /> - - + {this.renderDescription(catalogItem)} + + {this.props.printView ? ( + {catalogItem.url} + ) : ( + e.target.select()} + /> + )} - - -

    - {t("description.layerName")} - {(catalogItem.layers || "").split(",").length > 1 - ? "s" - : ""} - : {catalogItem.layers} -

    -
    - -

    - {t("description.typeName")} - {(catalogItem.typeNames || "").split(",").length > 1 - ? "s" - : ""} - : {catalogItem.typeNames} -

    -
    -
    + {catalogItem.type === "wms" || + (catalogItem.type === "esri-mapServer" && + defined(catalogItem.layers) && ( +

    + {t("description.layerName")} + {(catalogItem.layers || "").split(",").length > 1 + ? "s" + : ""} + : {catalogItem.layers} +

    + ))} + + {catalogItem.type === "wfs" && ( +

    + {t("description.typeName")} + {(catalogItem.typeNames || "").split(",").length > 1 + ? "s" + : ""} + : {catalogItem.typeNames} +

    + )} )} {dataUrls && dataUrls.length > 0 && ( <>

    {t("description.dataUrl")}

    - {dataUrls.map((dataUrl, i) => ( - <> - - + {dataUrls.map( + (dataUrl, i) => + (dataUrl.type?.startsWith("wfs") || + dataUrl.type?.startsWith("wcs")) && ( + <> {dataUrl.type?.startsWith("wfs") && parseCustomMarkdownToReact( t("description.useLinkBelow", { @@ -222,26 +217,25 @@ class Description extends React.Component { ` }) )} - - - - p.theme.colorPrimary}; - `} - > - {dataUrl.title && ( - - )} - {!dataUrl.title ? dataUrl.url : null} - - {" "} - - ))} + + p.theme.colorPrimary}; + `} + > + {dataUrl.title && ( + + )} + {!dataUrl.title ? dataUrl.url : null} + + {" "} + + ) + )} )} diff --git a/lib/ReactViews/Preview/GroupPreview.jsx b/lib/ReactViews/Preview/GroupPreview.jsx index 65f49d82c88..38b0c80442d 100644 --- a/lib/ReactViews/Preview/GroupPreview.jsx +++ b/lib/ReactViews/Preview/GroupPreview.jsx @@ -88,13 +88,8 @@ class GroupPreview extends React.Component { )}
    - - 0 - } - > + {this.props.previewed.description && + this.props.previewed.description.length > 0 && (

    {t("description.name")}

    {parseCustomMarkdownToReact( @@ -102,9 +97,7 @@ class GroupPreview extends React.Component { { catalogItem: this.props.previewed } )}
    -
    -
    - + )} {metadataItem.dataCustodian && ( diff --git a/lib/ReactViews/Preview/MetadataTable.jsx b/lib/ReactViews/Preview/MetadataTable.jsx index 7ca9cbba847..4dbafe69c60 100644 --- a/lib/ReactViews/Preview/MetadataTable.jsx +++ b/lib/ReactViews/Preview/MetadataTable.jsx @@ -1,9 +1,7 @@ import React from "react"; -import { isObservableArray } from "mobx"; import createReactClass from "create-react-class"; - +import { isObservableArray } from "mobx"; import PropTypes from "prop-types"; - import Styles from "./metadata-table.scss"; /** @@ -16,6 +14,31 @@ const MetadataTable = createReactClass({ metadataItem: PropTypes.object.isRequired // A MetadataItem instance. }, + renderDataCell(metadataItem, key) { + if (typeof metadataItem[key] === "object") { + return ; + } else if ( + Array.isArray(metadataItem[key]) || + isObservableArray(metadataItem[key]) + ) { + return metadataItem[key].length > 0 && isJoinable(metadataItem[key]) + ? metadataItem[key].join(", ") + : null; + } else return metadataItem[key]; + }, + + renderObjectItemRow(key, i) { + const metadataItem = this.props.metadataItem; + return ( +
    + + + + ); + }, + render() { const metadataItem = this.props.metadataItem; const keys = Object.keys(metadataItem); @@ -27,41 +50,15 @@ const MetadataTable = createReactClass({
    {key} @@ -59,7 +59,7 @@ const MetadataTable = createReactClass({
    {key} + {this.renderDataCell(metadataItem, key)} +
    - - - {metadataItem.length > 0 && isJoinable(metadataItem) && ( - - - - )} - - 0 && !isArr}> - {keys.map((key, i) => ( - - - - - ))} - - + {isArr && metadataItem.length > 0 && isJoinable(metadataItem) && ( + + + + )} + + {!isArr && + keys.length > 0 && + keys.map((key, i) => this.renderObjectItemRow(key, i))}
    {metadataItem.join(", ")}
    {key} - - - - - - {metadataItem[key].length > 0 && - isJoinable(metadataItem[key]) - ? metadataItem[key].join(", ") - : null} - - {metadataItem[key]} - -
    {metadataItem.join(", ")}
    diff --git a/lib/ReactViews/Search/Breadcrumbs.jsx b/lib/ReactViews/Search/Breadcrumbs.jsx index 12b464daeef..c13284549be 100644 --- a/lib/ReactViews/Search/Breadcrumbs.jsx +++ b/lib/ReactViews/Search/Breadcrumbs.jsx @@ -44,13 +44,47 @@ class Breadcrumbs extends React.Component { this.props.viewState.changeSearchState(""); } + renderCrumb(parent, i, parentGroups) { + const ancestors = getAncestors(this.props.previewed).map((ancestor) => + getDereferencedIfExists(ancestor) + ); + + /* No link when it's the current member */ + if (i === parentGroups.length - 1) { + return ( + + {parent} + + ); + /* The first and last two groups use the full name */ + } else if (i <= 1 || i >= parentGroups.length - 2) { + return ( + this.openInCatalog(ancestors.slice(i, i + 1))} + > + + {parent} + + + ); + /* The remainder are just '..' to prevent/minimise overflowing */ + } else if (i > 1 && i < parentGroups.length - 2) { + return ( + + {"..."} + + ); + } + + return null; + } + render() { const parentGroups = this.props.previewed ? getParentGroups(this.props.previewed) : undefined; - const ancestors = getAncestors(this.props.previewed).map((ancestor) => - getDereferencedIfExists(ancestor) - ); + return ( // Note: should it reset the text if a person deletes current search and starts a new search? ( <> - - {/* No link when it's the current member */} - - - {parent} - - - {/* The first and last two groups use the full name */} - = parentGroups.length - 2}> - - this.openInCatalog(ancestors.slice(i, i + 1)) - } - > - - {parent} - - - - {/* The remainder are just '..' to prevent/minimise overflowing */} - 1 && i < parentGroups.length - 2}> - - {"..."} - - - - + {this.renderCrumb(parent, i, parentGroups)} {i !== parentGroups.length - 1 && ( diff --git a/lib/ReactViews/StandardUserInterface/customizable/ResponsiveSwitch.jsx b/lib/ReactViews/StandardUserInterface/customizable/ResponsiveSwitch.jsx index 0952345bc37..5414458697c 100644 --- a/lib/ReactViews/StandardUserInterface/customizable/ResponsiveSwitch.jsx +++ b/lib/ReactViews/StandardUserInterface/customizable/ResponsiveSwitch.jsx @@ -9,15 +9,10 @@ import PropTypes from "prop-types"; export default (LargeScreenComponent, SmallScreenComponent) => { // eslint-disable-next-line require-jsdoc function ResponsiveSwitch(props) { - return ( - - - - - - - - + return props.smallScreen ? ( + + ) : ( + ); } diff --git a/test/ReactViews/DataCatalog/CatalogGroupSpec.tsx b/test/ReactViews/DataCatalog/CatalogGroupSpec.tsx new file mode 100644 index 00000000000..8aa83fb516c --- /dev/null +++ b/test/ReactViews/DataCatalog/CatalogGroupSpec.tsx @@ -0,0 +1,53 @@ +import React from "react"; +import CatalogGroup from "../../../lib/ReactViews/DataCatalog/CatalogGroup"; +import Loader from "../../../lib/ReactViews/Loader"; +import { ThemeProvider } from "styled-components"; +import { terriaTheme } from "../../../lib/ReactViews/StandardUserInterface"; +import { create } from "react-test-renderer"; +import { act } from "react-dom/test-utils"; + +fdescribe("CatalogGroup", () => { + let testRenderer: ReturnType; + + describe("Loading", () => { + it("Shows loader", () => { + act(() => { + testRenderer = create( + + {}} + loading={true} + > + + ); + }); + expect(testRenderer.root.findByType(Loader)).toBeTruthy(); + expect(testRenderer.root.findAllByProps({ key: "empty" }).length).toEqual( + 0 + ); + }); + }); + describe("Empty", () => { + it("Shows empty message", () => { + act(() => { + testRenderer = create( + {}} + open={true} + emptyMessage="nothing here" + loading={false} + children={[]} + > + ); + }); + + expect( + testRenderer.root + .findAllByType("li") + .some((e) => e.children[0] === "nothing here") + ).toBe(true); + expect(testRenderer.root.findAllByType(Loader).length).toBe(0); + }); + }); +}); From d9d7473256c29d5286327ecba33379bdff793d3b Mon Sep 17 00:00:00 2001 From: Stephen Davies Date: Mon, 16 Oct 2023 12:52:26 +1100 Subject: [PATCH 317/654] Fix truncating branch name not working --- buildprocess/ci-deploy.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildprocess/ci-deploy.sh b/buildprocess/ci-deploy.sh index d878ab4b7a3..22d951cad0a 100644 --- a/buildprocess/ci-deploy.sh +++ b/buildprocess/ci-deploy.sh @@ -10,7 +10,7 @@ if [[ $GITHUB_BRANCH =~ ^greenkeeper/ ]]; then fi # A version of the branch name that can be used as a DNS name once we prepend and append some stuff. -SAFE_BRANCH_NAME=$(printf '%s' "${GITHUB_BRANCH,,:0:40}" | sed 's/[^-a-z0-9]/-/g') +SAFE_BRANCH_NAME=$(printf '%s' "${GITHUB_BRANCH:0:40}" | sed -e 's/./\L&/g' -e 's/[^-a-z0-9]/-/g') gh api /repos/${GITHUB_REPOSITORY}/statuses/${GITHUB_SHA} -f state=pending -f context=deployment -f target_url=${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID} From 67e87b6f649bc8264946ce2091a6e0c7fd17bcb1 Mon Sep 17 00:00:00 2001 From: Stephen Davies Date: Mon, 16 Oct 2023 14:48:12 +1100 Subject: [PATCH 318/654] Change branch name substring length to 32 as 40 character branch names still have problems --- buildprocess/ci-cleanup.js | 2 +- buildprocess/ci-deploy.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/buildprocess/ci-cleanup.js b/buildprocess/ci-cleanup.js index be06458c747..0fd6099c280 100644 --- a/buildprocess/ci-cleanup.js +++ b/buildprocess/ci-cleanup.js @@ -51,7 +51,7 @@ function makeSafeName(name) { return name .toLowerCase() .replace(/[^-a-z0-9]/g, "-") - .substring(0, 40); + .substring(0, 32); } function createIngress(branches) { diff --git a/buildprocess/ci-deploy.sh b/buildprocess/ci-deploy.sh index 22d951cad0a..b2c217782ba 100644 --- a/buildprocess/ci-deploy.sh +++ b/buildprocess/ci-deploy.sh @@ -10,7 +10,7 @@ if [[ $GITHUB_BRANCH =~ ^greenkeeper/ ]]; then fi # A version of the branch name that can be used as a DNS name once we prepend and append some stuff. -SAFE_BRANCH_NAME=$(printf '%s' "${GITHUB_BRANCH:0:40}" | sed -e 's/./\L&/g' -e 's/[^-a-z0-9]/-/g') +SAFE_BRANCH_NAME=$(printf '%s' "${GITHUB_BRANCH:0:32}" | sed -e 's/./\L&/g' -e 's/[^-a-z0-9]/-/g') gh api /repos/${GITHUB_REPOSITORY}/statuses/${GITHUB_SHA} -f state=pending -f context=deployment -f target_url=${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID} From 76b2a0b7831898c835af68280f849a6a442cd2c4 Mon Sep 17 00:00:00 2001 From: Stephen Davies Date: Mon, 16 Oct 2023 15:17:14 +1100 Subject: [PATCH 319/654] Remove trailing dashes --- buildprocess/ci-cleanup.js | 3 ++- buildprocess/ci-deploy.sh | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/buildprocess/ci-cleanup.js b/buildprocess/ci-cleanup.js index 0fd6099c280..071c11cf2df 100644 --- a/buildprocess/ci-cleanup.js +++ b/buildprocess/ci-cleanup.js @@ -51,7 +51,8 @@ function makeSafeName(name) { return name .toLowerCase() .replace(/[^-a-z0-9]/g, "-") - .substring(0, 32); + .substring(0, 32) + .replace(/-*$/, ""); } function createIngress(branches) { diff --git a/buildprocess/ci-deploy.sh b/buildprocess/ci-deploy.sh index b2c217782ba..c356eebc2d4 100644 --- a/buildprocess/ci-deploy.sh +++ b/buildprocess/ci-deploy.sh @@ -10,7 +10,7 @@ if [[ $GITHUB_BRANCH =~ ^greenkeeper/ ]]; then fi # A version of the branch name that can be used as a DNS name once we prepend and append some stuff. -SAFE_BRANCH_NAME=$(printf '%s' "${GITHUB_BRANCH:0:32}" | sed -e 's/./\L&/g' -e 's/[^-a-z0-9]/-/g') +SAFE_BRANCH_NAME=$(printf '%s' "${GITHUB_BRANCH:0:32}" | sed -e 's/./\L&/g' -e 's/[^-a-z0-9]/-/g' -e 's/-*$//') gh api /repos/${GITHUB_REPOSITORY}/statuses/${GITHUB_SHA} -f state=pending -f context=deployment -f target_url=${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID} From c5fd9b7911e81e6354b296f69204ee5599c806cc Mon Sep 17 00:00:00 2001 From: Stephen Davies Date: Mon, 16 Oct 2023 16:33:57 +1100 Subject: [PATCH 320/654] Fix CI links for unsafe branch names --- buildprocess/ci-cleanup.js | 2 +- buildprocess/ci-deploy.sh | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/buildprocess/ci-cleanup.js b/buildprocess/ci-cleanup.js index 071c11cf2df..325a265b1ac 100644 --- a/buildprocess/ci-cleanup.js +++ b/buildprocess/ci-cleanup.js @@ -74,7 +74,7 @@ function createIngress(branches) { host: "ci.terria.io", http: { paths: branches.map((branch) => ({ - path: "/" + branch.name + "(/|$)(.*)", + path: "/" + makeSafeName(branch.name) + "(/|$)(.*)", pathType: "ImplementationSpecific", backend: { service: { diff --git a/buildprocess/ci-deploy.sh b/buildprocess/ci-deploy.sh index c356eebc2d4..06ff60bc1b0 100644 --- a/buildprocess/ci-deploy.sh +++ b/buildprocess/ci-deploy.sh @@ -12,6 +12,8 @@ fi # A version of the branch name that can be used as a DNS name once we prepend and append some stuff. SAFE_BRANCH_NAME=$(printf '%s' "${GITHUB_BRANCH:0:32}" | sed -e 's/./\L&/g' -e 's/[^-a-z0-9]/-/g' -e 's/-*$//') +[[ $SAFE_BRANCH_NAME != $GITHUB_BRANCH ]] && echo "::warning file=buildprocess/ci-deploy.sh::Branch name sanitised to '${SAFE_BRANCH_NAME}' for kubernetes resources. This may work, however using branch names less than 32 characters long with [a-z0-9] and hyphen separators are preferred" + gh api /repos/${GITHUB_REPOSITORY}/statuses/${GITHUB_SHA} -f state=pending -f context=deployment -f target_url=${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID} # Install some tools we need from npm From 76dae0b0732c0916abd8ccc07354b37df9a275d0 Mon Sep 17 00:00:00 2001 From: Lawrence Owen Date: Thu, 12 Oct 2023 16:21:09 +1000 Subject: [PATCH 321/654] Remove jsx-control-flow-statements - Breadcrumbs.jsx: Fix missing key in Fragment - DataCatalogGroup.jsx: Explicit null to pass propType validation --- .babelrc | 1 - .eslintrc | 9 ++----- CHANGES.md | 1 + architecture/0001-babel-and-ts-loader.md | 2 +- buildprocess/configureWebpack.js | 1 - doc/contributing/frontend-style-guide.md | 2 -- .../DataCatalog/DataCatalogGroup.jsx | 25 ++++++++++--------- lib/ReactViews/Search/Breadcrumbs.jsx | 4 +-- package.json | 2 -- 9 files changed, 19 insertions(+), 28 deletions(-) diff --git a/.babelrc b/.babelrc index 36ddeb06e18..fcc5468eca1 100644 --- a/.babelrc +++ b/.babelrc @@ -11,7 +11,6 @@ ["@babel/typescript", { "allowNamespaces": true }] ], "plugins": [ - "babel-plugin-jsx-control-statements", "@babel/plugin-transform-modules-commonjs", ["@babel/plugin-proposal-decorators", { "legacy": true }], "@babel/plugin-proposal-class-properties", diff --git a/.eslintrc b/.eslintrc index 76596bb585b..c0d2b2cc5f3 100644 --- a/.eslintrc +++ b/.eslintrc @@ -1,9 +1,5 @@ { - "extends": [ - "eslint:recommended", - "plugin:react/recommended", - "plugin:jsx-control-statements/recommended" - ], + "extends": ["eslint:recommended", "plugin:react/recommended"], "parser": "@babel/eslint-parser", "parserOptions": { "requireConfigFile": false, @@ -19,7 +15,7 @@ "commonjs": true, "es6": true }, - "plugins": ["react", "jsx-control-statements"], + "plugins": ["react"], "globals": { "process": true }, @@ -29,7 +25,6 @@ } }, "rules": { - "jsx-control-statements/jsx-use-if-tag": 0, "react/jsx-no-undef": 0, /*Possible Errors */ diff --git a/CHANGES.md b/CHANGES.md index 490d3bb5d76..77f44582a37 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -3,6 +3,7 @@ #### next release (8.3.7) - [The next improvement] +- Remove `jsx-control-statements` dependency #### 8.3.6 - 2023-10-03 diff --git a/architecture/0001-babel-and-ts-loader.md b/architecture/0001-babel-and-ts-loader.md index 6f1688c6011..457ab66f66e 100644 --- a/architecture/0001-babel-and-ts-loader.md +++ b/architecture/0001-babel-and-ts-loader.md @@ -24,7 +24,7 @@ support for it covers everything we need to use it in terriajs, including build times. - Using _only_ ts-loader is out of the question, as we rely on tools inside the - babel ecosystem including jsx-control-statements & styled-components to name a + babel ecosystem including styled-components to name a few. - Using _only_ babel - Using babel _with_ ts-loader in `transpileOnly` mode, if there are TypeScript diff --git a/buildprocess/configureWebpack.js b/buildprocess/configureWebpack.js index 32320e1d38b..b4ca392a087 100644 --- a/buildprocess/configureWebpack.js +++ b/buildprocess/configureWebpack.js @@ -130,7 +130,6 @@ function configureWebpack( ["@babel/typescript", { allowNamespaces: true }] ], plugins: [ - "babel-plugin-jsx-control-statements", "@babel/plugin-transform-modules-commonjs", ["@babel/plugin-proposal-decorators", { legacy: true }], "@babel/plugin-proposal-class-properties", diff --git a/doc/contributing/frontend-style-guide.md b/doc/contributing/frontend-style-guide.md index 4e78d106dc4..afcd37c2eff 100644 --- a/doc/contributing/frontend-style-guide.md +++ b/doc/contributing/frontend-style-guide.md @@ -167,5 +167,3 @@ const BoxSpan: any = require("../../../Styled/Box").BoxSpan; Components written in TypeScript will not need `PropTypes` defined on them, as type errors on props will be caught at compilation rather than a runtime check. - -All jsx-control-statements should be removed when migrating a .jsx file to .tsx. diff --git a/lib/ReactViews/DataCatalog/DataCatalogGroup.jsx b/lib/ReactViews/DataCatalog/DataCatalogGroup.jsx index db6135185f5..626069488e0 100644 --- a/lib/ReactViews/DataCatalog/DataCatalogGroup.jsx +++ b/lib/ReactViews/DataCatalog/DataCatalogGroup.jsx @@ -134,18 +134,19 @@ class DataCatalogGroup extends React.Component { this.props.terria )} > - {this.isOpen() && - group.memberModels.map((item) => ( - - ))} + {this.isOpen() + ? group.memberModels.map((item) => ( + + )) + : null} ); } diff --git a/lib/ReactViews/Search/Breadcrumbs.jsx b/lib/ReactViews/Search/Breadcrumbs.jsx index c13284549be..90d8c0c2e20 100644 --- a/lib/ReactViews/Search/Breadcrumbs.jsx +++ b/lib/ReactViews/Search/Breadcrumbs.jsx @@ -105,7 +105,7 @@ class Breadcrumbs extends React.Component { {parentGroups && parentGroups.map((parent, i) => ( - <> + {this.renderCrumb(parent, i, parentGroups)} {i !== parentGroups.length - 1 && ( @@ -114,7 +114,7 @@ class Breadcrumbs extends React.Component { )} - + ))}
    diff --git a/package.json b/package.json index 35fc2b61343..0b982e71840 100644 --- a/package.json +++ b/package.json @@ -82,7 +82,6 @@ "@visx/tooltip": "^2.1.0", "assimpjs": "^0.0.7", "babel-loader": "^8.2.3", - "babel-plugin-jsx-control-statements": "^4.0.0", "babel-plugin-lodash": "^3.3.4", "bottleneck": "^2.19.5", "catalog-converter": "^0.0.9", @@ -194,7 +193,6 @@ "@types/webpack": "4.41.33", "babel-plugin-styled-components": "^1.10.7", "eslint": "^7.20.0", - "eslint-plugin-jsx-control-statements": "^2.2.1", "eslint-plugin-react": "^7.19.0", "fork-ts-checker-notifier-webpack-plugin": "^6.0.0", "fork-ts-checker-webpack-plugin": "^6.0.0", From 49d259f97bd56216051313b7312cd9170beef7b0 Mon Sep 17 00:00:00 2001 From: Lawrence Owen Date: Tue, 17 Oct 2023 10:39:49 +1000 Subject: [PATCH 322/654] Update architecture/0001-babel-and-ts-loader.md Co-authored-by: Stephen Davies --- architecture/0001-babel-and-ts-loader.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/architecture/0001-babel-and-ts-loader.md b/architecture/0001-babel-and-ts-loader.md index 457ab66f66e..4e2255ee8c1 100644 --- a/architecture/0001-babel-and-ts-loader.md +++ b/architecture/0001-babel-and-ts-loader.md @@ -24,7 +24,7 @@ support for it covers everything we need to use it in terriajs, including build times. - Using _only_ ts-loader is out of the question, as we rely on tools inside the - babel ecosystem including styled-components to name a + babel ecosystem including ~jsx-control-statements~ (removed 2023-10-16) & styled-components to name a few. - Using _only_ babel - Using babel _with_ ts-loader in `transpileOnly` mode, if there are TypeScript From 18e8eb0a6a07305766ccb2878133bccc3a290924 Mon Sep 17 00:00:00 2001 From: Lawrence Owen Date: Tue, 17 Oct 2023 10:47:32 +1000 Subject: [PATCH 323/654] Fix: nullish check on loading prop --- lib/ReactViews/DataCatalog/CatalogGroup.jsx | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/lib/ReactViews/DataCatalog/CatalogGroup.jsx b/lib/ReactViews/DataCatalog/CatalogGroup.jsx index 4028e0f082b..ceddfb2a093 100644 --- a/lib/ReactViews/DataCatalog/CatalogGroup.jsx +++ b/lib/ReactViews/DataCatalog/CatalogGroup.jsx @@ -129,16 +129,14 @@ function CatalogGroup(props) { )} - {props.loading === false && - props.children.length === 0 && - props.emptyMessage && ( -
  • - {props.emptyMessage} -
  • - )} + {!props.loading && props.children.length === 0 && props.emptyMessage && ( +
  • + {props.emptyMessage} +
  • + )} {props.children} From b5a84aa1a755736e598806c0471db8ce25b57fe6 Mon Sep 17 00:00:00 2001 From: Kevin Ring Date: Sun, 22 Oct 2023 10:10:05 +1100 Subject: [PATCH 324/654] Fix TS errors in non-test code. --- lib/Map/Cesium/CesiumRenderLoopPauser.ts | 2 +- lib/ModelMixins/TimeFilterMixin.ts | 1 + .../Ows/WebMapTileServiceCatalogItem.ts | 3 +- lib/Models/Leaflet.ts | 6 ++-- lib/Models/UserDrawing.ts | 7 +++-- .../Map/MapNavigation/Items/MeasureTool.ts | 30 +++++++++++-------- .../terriajs-cesium-extra/index.d.ts | 6 ++++ 7 files changed, 37 insertions(+), 18 deletions(-) diff --git a/lib/Map/Cesium/CesiumRenderLoopPauser.ts b/lib/Map/Cesium/CesiumRenderLoopPauser.ts index f0b0b2350df..8ba10d30e5e 100644 --- a/lib/Map/Cesium/CesiumRenderLoopPauser.ts +++ b/lib/Map/Cesium/CesiumRenderLoopPauser.ts @@ -5,7 +5,7 @@ import getTimestamp from "terriajs-cesium/Source/Core/getTimestamp"; import JulianDate from "terriajs-cesium/Source/Core/JulianDate"; import Matrix4 from "terriajs-cesium/Source/Core/Matrix4"; import TaskProcessor from "terriajs-cesium/Source/Core/TaskProcessor"; -import CesiumWidget from "terriajs-cesium/Source/Widgets/CesiumWidget/CesiumWidget"; +import CesiumWidget from "terriajs-cesium/Source/Widget/CesiumWidget"; import loadWithXhr from "../../Core/loadWithXhr"; export default class CesiumRenderLoopPauser { diff --git a/lib/ModelMixins/TimeFilterMixin.ts b/lib/ModelMixins/TimeFilterMixin.ts index 1bed1a49b5f..05a26dbd09f 100644 --- a/lib/ModelMixins/TimeFilterMixin.ts +++ b/lib/ModelMixins/TimeFilterMixin.ts @@ -228,6 +228,7 @@ function TimeFilterMixin>(Base: T) { } const position = feature.position.getValue(this.currentTimeAsJulianDate); + if (position === undefined) return; const cartographic = Ellipsoid.WGS84.cartesianToCartographic(position); const featureImageryUrl = this.imageryUrls.find( (url) => providerCoords[url] diff --git a/lib/Models/Catalog/Ows/WebMapTileServiceCatalogItem.ts b/lib/Models/Catalog/Ows/WebMapTileServiceCatalogItem.ts index 57cb6735239..f94c874617a 100644 --- a/lib/Models/Catalog/Ows/WebMapTileServiceCatalogItem.ts +++ b/lib/Models/Catalog/Ows/WebMapTileServiceCatalogItem.ts @@ -551,7 +551,8 @@ class WebMapTileServiceCatalogItem extends MappableMixin( tilingScheme: new WebMercatorTilingScheme(), format, credit: this.attribution, - enablePickFeatures: this.allowFeaturePicking + // TODO: implement picking for WebMapTileServiceImageryProvider + //enablePickFeatures: this.allowFeaturePicking }); return imageryProvider; } diff --git a/lib/Models/Leaflet.ts b/lib/Models/Leaflet.ts index c5b189816a2..13063a6b968 100644 --- a/lib/Models/Leaflet.ts +++ b/lib/Models/Leaflet.ts @@ -126,6 +126,8 @@ export default class Leaflet extends GlobeOrMap { parts: ImageryParts, item: MappableMixin.Instance ) { + if (parts.imageryProvider === undefined) return undefined; + if (TileErrorHandlerMixin.isMixedInto(item)) { // because this code path can run multiple times, make sure we remove the // handler if it is already registered @@ -436,7 +438,7 @@ export default class Leaflet extends GlobeOrMap { // Add layer and update its zIndex let zIndex = 100; // Start at an arbitrary value allImagery.reverse().forEach(({ parts, layer }) => { - if (parts.show) { + if (layer && parts.show) { layer.setOpacity(parts.alpha); layer.setZIndex(zIndex); zIndex++; @@ -444,7 +446,7 @@ export default class Leaflet extends GlobeOrMap { if (!this.map.hasLayer(layer)) { this.map.addLayer(layer); } - } else { + } else if (layer) { this.map.removeLayer(layer); } }); diff --git a/lib/Models/UserDrawing.ts b/lib/Models/UserDrawing.ts index b2ea987192e..df1d5ff6c6b 100644 --- a/lib/Models/UserDrawing.ts +++ b/lib/Models/UserDrawing.ts @@ -22,6 +22,7 @@ import CustomDataSource from "terriajs-cesium/Source/DataSources/CustomDataSourc import DataSource from "terriajs-cesium/Source/DataSources/DataSource"; import Entity from "terriajs-cesium/Source/DataSources/Entity"; import PolylineGlowMaterialProperty from "terriajs-cesium/Source/DataSources/PolylineGlowMaterialProperty"; +import filterOutUndefined from "../Core/filterOutUndefined"; import isDefined from "../Core/isDefined"; import DragPoints from "../Map/DragPoints/DragPoints"; import MappableMixin from "../ModelMixins/MappableMixin"; @@ -370,7 +371,7 @@ export default class UserDrawing extends MappableMixin( if (isDrawingComplete && points) { this.onDrawingComplete({ - points, + points: filterOutUndefined(points), rectangle: this.getRectangleForShape() }); } @@ -605,7 +606,9 @@ export default class UserDrawing extends MappableMixin( const position = obj.position.getValue( this.terria.timelineClock.currentTime ); - pos.push(position); + if (position !== undefined) { + pos.push(position); + } } } return pos; diff --git a/lib/ReactViews/Map/MapNavigation/Items/MeasureTool.ts b/lib/ReactViews/Map/MapNavigation/Items/MeasureTool.ts index d84a06c0ce4..d56632bbcb0 100644 --- a/lib/ReactViews/Map/MapNavigation/Items/MeasureTool.ts +++ b/lib/ReactViews/Map/MapNavigation/Items/MeasureTool.ts @@ -1,6 +1,7 @@ "use strict"; import i18next from "i18next"; import React from "react"; +import ArcType from "terriajs-cesium/Source/Core/ArcType"; import Cartesian3 from "terriajs-cesium/Source/Core/Cartesian3"; import Ellipsoid from "terriajs-cesium/Source/Core/Ellipsoid"; import EllipsoidGeodesic from "terriajs-cesium/Source/Core/EllipsoidGeodesic"; @@ -89,15 +90,19 @@ export class MeasureTool extends MapNavigationItemController { return; } - const prevPoint = pointEntities.entities.values[0]; - let prevPointPos = prevPoint.position!.getValue( - this.terria.timelineClock.currentTime - ); - for (let i = 1; i < pointEntities.entities.values.length; i++) { + let firstPointPos: Cartesian3 | undefined; + let prevPointPos: Cartesian3 | undefined; + for (let i = 0; i < pointEntities.entities.values.length; i++) { const currentPoint = pointEntities.entities.values[i]; const currentPointPos = currentPoint.position!.getValue( this.terria.timelineClock.currentTime ); + if (currentPointPos === undefined) continue; + if (prevPointPos === undefined) { + prevPointPos = currentPointPos; + firstPointPos = prevPointPos; + continue; + } this.totalDistanceMetres = this.totalDistanceMetres + @@ -105,11 +110,7 @@ export class MeasureTool extends MapNavigationItemController { prevPointPos = currentPointPos; } - if (this.userDrawing.closeLoop) { - const firstPoint = pointEntities.entities.values[0]; - const firstPointPos = firstPoint.position!.getValue( - this.terria.timelineClock.currentTime - ); + if (prevPointPos && firstPointPos && this.userDrawing.closeLoop) { this.totalDistanceMetres = this.totalDistanceMetres + this.getGeodesicDistance(prevPointPos, firstPointPos); @@ -133,7 +134,9 @@ export class MeasureTool extends MapNavigationItemController { const currentPointPos = currentPoint.position!.getValue( this.terria.timelineClock.currentTime ); - positions.push(currentPointPos); + if (currentPointPos !== undefined) { + positions.push(currentPointPos); + } } // Request the triangles that make up the polygon from Cesium. @@ -143,6 +146,7 @@ export class MeasureTool extends MapNavigationItemController { ); const polygons = PolygonGeometryLibrary.polygonsFromHierarchy( new PolygonHierarchy(positions), + false, tangentPlane.projectPointsOntoPlane.bind(tangentPlane), !perPositionHeight, Ellipsoid.WGS84 @@ -151,9 +155,11 @@ export class MeasureTool extends MapNavigationItemController { const geom = PolygonGeometryLibrary.createGeometryFromPositions( Ellipsoid.WGS84, polygons.polygons[0], + undefined, CesiumMath.RADIANS_PER_DEGREE, perPositionHeight, - VertexFormat.POSITION_ONLY + VertexFormat.POSITION_ONLY, + ArcType.GEODESIC ); if ( geom.indices.length % 3 !== 0 || diff --git a/lib/ThirdParty/terriajs-cesium-extra/index.d.ts b/lib/ThirdParty/terriajs-cesium-extra/index.d.ts index f08bc80076b..4b795b854aa 100644 --- a/lib/ThirdParty/terriajs-cesium-extra/index.d.ts +++ b/lib/ThirdParty/terriajs-cesium-extra/index.d.ts @@ -58,6 +58,12 @@ declare interface FeatureDetection { chromeVersion(): number[]; } +// This is a workaround for Cesium's incorrect type declaration for raiseEvent. +declare module "terriajs-cesium" { + export interface Event { + raiseEvent(...arguments: any[]): void; + } +} // Begin Generated Declarations declare module "terriajs-cesium/Source/Core/ArcGISTiledElevationTerrainProvider" { import { ArcGISTiledElevationTerrainProvider } from 'terriajs-cesium'; export default ArcGISTiledElevationTerrainProvider; } From 8e832f58351aa204d7888732bcac605c6ffc9ff4 Mon Sep 17 00:00:00 2001 From: Kevin Ring Date: Sun, 22 Oct 2023 11:01:38 +1100 Subject: [PATCH 325/654] Fix TS errors in tests by bringing over esbuild branch changes. --- test/Map/PickedFeaturesSpec.ts | 2 +- test/ModelMixins/Cesium3dTilesMixinSpec.ts | 1 - .../Cesium3DTilesCatalogItemSpec.ts | 2 +- .../CatalogItems/GeoJsonCatalogItemSpec.ts | 4 +- test/Models/CesiumSpec.ts | 142 +++++++++++------- 5 files changed, 89 insertions(+), 62 deletions(-) diff --git a/test/Map/PickedFeaturesSpec.ts b/test/Map/PickedFeaturesSpec.ts index 155d8850e7a..b3a096be327 100644 --- a/test/Map/PickedFeaturesSpec.ts +++ b/test/Map/PickedFeaturesSpec.ts @@ -32,7 +32,7 @@ describe("featureBelongsToCatalogItem", function () { url: "test", layers: "test" }); - feature.imageryLayer = new ImageryLayer(imageryProvider); + feature.imageryLayer = new ImageryLayer(imageryProvider, {}); expect(featureBelongsToCatalogItem(feature, item)).toBe(false); item.mapItems = [ diff --git a/test/ModelMixins/Cesium3dTilesMixinSpec.ts b/test/ModelMixins/Cesium3dTilesMixinSpec.ts index 4fa1c8af2aa..e2447fadb6e 100644 --- a/test/ModelMixins/Cesium3dTilesMixinSpec.ts +++ b/test/ModelMixins/Cesium3dTilesMixinSpec.ts @@ -119,7 +119,6 @@ describe("Cesium3dTilesMixin", function () { filter?.setTrait(CommonStrata.user, "maximumShown", 20); await cesium3dTiles.loadMapItems(); const tileset = cesium3dTiles.mapItems[0] as Cesium3DTileset; - await tileset.readyPromise; const show = tileset.style?.show; const expr = (show as any)?.expression as string; expect(expr).toBeDefined(); diff --git a/test/Models/Catalog/CatalogItems/Cesium3DTilesCatalogItemSpec.ts b/test/Models/Catalog/CatalogItems/Cesium3DTilesCatalogItemSpec.ts index e4f8683a3c1..b7ff702bb99 100644 --- a/test/Models/Catalog/CatalogItems/Cesium3DTilesCatalogItemSpec.ts +++ b/test/Models/Catalog/CatalogItems/Cesium3DTilesCatalogItemSpec.ts @@ -312,7 +312,7 @@ describe("Cesium3DTilesCatalogItemSpec", function () { it("correctly builds `Feature` from picked Cesium3DTileFeature", function () { const picked = new Cesium3DTileFeature(); - spyOn(picked, "getPropertyNames").and.returnValue([]); + spyOn(picked, "getPropertyIds").and.returnValue([]); const feature = item.buildFeatureFromPickResult(Cartesian2.ZERO, picked); expect(feature).toBeDefined(); if (feature) { diff --git a/test/Models/Catalog/CatalogItems/GeoJsonCatalogItemSpec.ts b/test/Models/Catalog/CatalogItems/GeoJsonCatalogItemSpec.ts index a2c62a71caf..9169d3eca1c 100644 --- a/test/Models/Catalog/CatalogItems/GeoJsonCatalogItemSpec.ts +++ b/test/Models/Catalog/CatalogItems/GeoJsonCatalogItemSpec.ts @@ -98,7 +98,7 @@ describe("GeoJsonCatalogItemSpec", () => { expect( (geojson.mapItems[0] as GeoJsonDataSource).entities.values[0].position ?.getValue(JulianDate.now()) - .equalsEpsilon(Cartesian3.fromDegrees(148.0, -31.3), 0.0001) + ?.equalsEpsilon(Cartesian3.fromDegrees(148.0, -31.3), 0.0001) ).toBeTruthy("Doesn't match first location"); geojson.setTrait( @@ -117,7 +117,7 @@ describe("GeoJsonCatalogItemSpec", () => { expect( (geojson.mapItems[0] as GeoJsonDataSource).entities.values[0].position ?.getValue(JulianDate.now()) - .equalsEpsilon(Cartesian3.fromDegrees(151.0, -33.8), 0.0001) + ?.equalsEpsilon(Cartesian3.fromDegrees(151.0, -33.8), 0.0001) ).toBeTruthy("Doesn't match updated location"); }); }); diff --git a/test/Models/CesiumSpec.ts b/test/Models/CesiumSpec.ts index 2285e94599b..63678a6e756 100644 --- a/test/Models/CesiumSpec.ts +++ b/test/Models/CesiumSpec.ts @@ -1,5 +1,5 @@ import range from "lodash-es/range"; -import { action, computed, observable, runInAction } from "mobx"; +import { action, computed, observable, runInAction, when } from "mobx"; import Cartesian3 from "terriajs-cesium/Source/Core/Cartesian3"; import CesiumTerrainProvider from "terriajs-cesium/Source/Core/CesiumTerrainProvider"; import EllipsoidTerrainProvider from "terriajs-cesium/Source/Core/EllipsoidTerrainProvider"; @@ -10,7 +10,7 @@ import Scene from "terriajs-cesium/Source/Scene/Scene"; import WebMapServiceImageryProvider from "terriajs-cesium/Source/Scene/WebMapServiceImageryProvider"; import filterOutUndefined from "../../lib/Core/filterOutUndefined"; import runLater from "../../lib/Core/runLater"; -import MappableMixin from "../../lib/ModelMixins/MappableMixin"; +import MappableMixin, { MapItem } from "../../lib/ModelMixins/MappableMixin"; import CesiumTerrainCatalogItem from "../../lib/Models/Catalog/CatalogItems/CesiumTerrainCatalogItem"; import CatalogMemberFactory from "../../lib/Models/Catalog/CatalogMemberFactory"; import WebMapServiceCatalogItem from "../../lib/Models/Catalog/Ows/WebMapServiceCatalogItem"; @@ -122,10 +122,15 @@ describeIfSupported("Cesium Model", function () { }); it("correctly removes all the primitives from the scene when they are removed from the viewer", async function () { + const tilesets = [ + await Cesium3DTileset.fromUrl("test/Cesium3DTiles/tileset.json?id=1"), + await Cesium3DTileset.fromUrl("test/Cesium3DTiles/tileset.json?id=2"), + await Cesium3DTileset.fromUrl("test/Cesium3DTiles/tileset.json?id=3") + ]; const items = observable([ - new MappablePrimitiveItem("1", terria), - new MappablePrimitiveItem("2", terria), - new MappablePrimitiveItem("3", terria) + new MappablePrimitiveItem("1", terria, tilesets[0]), + new MappablePrimitiveItem("2", terria, tilesets[1]), + new MappablePrimitiveItem("3", terria, tilesets[2]) ]); const container2 = document.createElement("div"); @@ -168,7 +173,11 @@ describeIfSupported("Cesium Model", function () { // Test that we have added the correct items expect(dataSourceNames()).toEqual(["ds1", "ds2", "ds3"]); - expect(tilesetUrls()).toEqual(["prim1", "prim2", "prim3"]); + expect(tilesetUrls()).toEqual([ + "test/Cesium3DTiles/tileset.json?id=1", + "test/Cesium3DTiles/tileset.json?id=2", + "test/Cesium3DTiles/tileset.json?id=3" + ]); expect(imageryProviderUrls()).toEqual(["img1", "img2", "img3"]); runInAction(() => items.splice(0, 2)); @@ -176,7 +185,7 @@ describeIfSupported("Cesium Model", function () { // Test that we have removed the correct items expect(dataSourceNames()).toEqual(["ds3"]); - expect(tilesetUrls()).toEqual(["prim3"]); + expect(tilesetUrls()).toEqual(["test/Cesium3DTiles/tileset.json?id=3"]); expect(imageryProviderUrls()).toEqual(["img3"]); } finally { cesium2.destroy(); @@ -217,20 +226,16 @@ describeIfSupported("Cesium Model", function () { spyOn( workbenchTerrainItem as any, "loadTerrainProvider" - ).and.returnValue( - Promise.resolve(new CesiumTerrainProvider({ url: "some/url" })) - ); + ).and.returnValue(Promise.resolve(new CesiumTerrainProvider())); (await terria.workbench.add(workbenchTerrainItem)).throwIfError(); }) ); - it("should use Elliposidal/3d-smooth terrain when `useTerrain` is `false`", function () { - expect(scene.terrainProvider instanceof EllipsoidTerrainProvider).toBe( - false - ); + it("should use Elliposidal/3d-smooth terrain when `useTerrain` is `false`", async function () { runInAction(() => { cesium.terriaViewer.viewerOptions.useTerrain = false; }); + await terrainLoadPromise(cesium); expect(scene.terrainProvider instanceof EllipsoidTerrainProvider).toBe( true ); @@ -239,65 +244,81 @@ describeIfSupported("Cesium Model", function () { it( "should otherwise use the first terrain provider from the workbench or overlay", action(async function () { + runInAction(() => { + cesium.terriaViewer.viewerOptions.useTerrain = true; + }); + await terrainLoadPromise(cesium); expect(scene.terrainProvider).toBe(workbenchTerrainItem.mapItems[0]); }) ); - it("should otherwise use the ION terrain specified by configParameters.cesiumTerrainAssetId", function () { + it("should otherwise use the ION terrain specified by configParameters.cesiumTerrainAssetId", async function () { + const fakeIonTerrainProvider = new CesiumTerrainProvider(); + fakeIonTerrainProvider.availability; const createSpy = spyOn( cesium as any, "createTerrainProviderFromIonAssetId" - ).and.callThrough(); - runInAction(() => terria.workbench.removeAll()); + ).and.returnValue(Promise.resolve(fakeIonTerrainProvider)); + + runInAction(() => { + cesium.terriaViewer.viewerOptions.useTerrain = true; + terria.workbench.removeAll(); + }); + + await terrainLoadPromise(cesium); expect(createSpy).toHaveBeenCalledTimes(1); - const ionAssetTerrainProvider = createSpy.calls.mostRecent().returnValue; - expect(scene.terrainProvider).toEqual(ionAssetTerrainProvider); + expect(scene.terrainProvider).toEqual(fakeIonTerrainProvider); }); - it("should otherwise use the terrain specified by configParameters.cesiumTerrainUrl", function () { + it("should otherwise use the terrain specified by configParameters.cesiumTerrainUrl", async function () { + const fakeUrlTerrainProvider = new CesiumTerrainProvider(); const createSpy = spyOn( cesium as any, "createTerrainProviderFromUrl" - ).and.callThrough(); + ).and.returnValue(Promise.resolve(fakeUrlTerrainProvider)); runInAction(() => { + cesium.terriaViewer.viewerOptions.useTerrain = true; terria.workbench.removeAll(); terria.configParameters.cesiumTerrainAssetId = undefined; }); + await terrainLoadPromise(cesium); expect(createSpy).toHaveBeenCalledTimes(1); - const urlTerrainProvider = createSpy.calls.mostRecent().returnValue; - expect(scene.terrainProvider).toEqual(urlTerrainProvider); + expect(scene.terrainProvider).toEqual(fakeUrlTerrainProvider); }); - it("should otherwise use cesium-world-terrain when `configParameters.useCesiumIonTerrain` is true", function () { + it("should otherwise use cesium-world-terrain when `configParameters.useCesiumIonTerrain` is true", async function () { + const fakeCesiumWorldTerrainProvider = new CesiumTerrainProvider(); const createSpy = spyOn( cesium as any, "createWorldTerrain" - ).and.callThrough(); + ).and.returnValue(Promise.resolve(fakeCesiumWorldTerrainProvider)); runInAction(() => { + cesium.terriaViewer.viewerOptions.useTerrain = true; terria.workbench.removeAll(); terria.configParameters.cesiumTerrainAssetId = undefined; terria.configParameters.cesiumTerrainUrl = undefined; }); + await terrainLoadPromise(cesium); expect(terria.configParameters.useCesiumIonTerrain).toBe(true); expect(createSpy).toHaveBeenCalledTimes(1); - const cesiumWorldTerrainProvider = - createSpy.calls.mostRecent().returnValue; - expect(scene.terrainProvider).toEqual(cesiumWorldTerrainProvider); + expect(scene.terrainProvider).toEqual(fakeCesiumWorldTerrainProvider); }); - it("should otherwise fallback to Elliposidal/3d-smooth", function () { + it("should otherwise fallback to Elliposidal/3d-smooth", async function () { runInAction(() => { + cesium.terriaViewer.viewerOptions.useTerrain = true; terria.workbench.removeAll(); terria.configParameters.cesiumTerrainAssetId = undefined; terria.configParameters.cesiumTerrainUrl = undefined; terria.configParameters.useCesiumIonTerrain = false; }); + await terrainLoadPromise(cesium); expect(scene.terrainProvider instanceof EllipsoidTerrainProvider).toBe( true ); @@ -329,7 +350,7 @@ describeIfSupported("Cesium Model", function () { document.body.removeChild(container2); }); - it("should thow a warning when cesiumIonAccessToken is invalid", async function () { + it("should throw a warning when cesiumIonAccessToken is invalid", async function () { runInAction(() => { // Set an invalid token for the test terria2.configParameters.cesiumIonAccessToken = "expired_token"; @@ -337,9 +358,10 @@ describeIfSupported("Cesium Model", function () { // Instantiate Cesium object with the invalid token cesium2 = new Cesium(terriaViewer2, container2); - await cesium2.terrainProvider.readyPromise.catch(() => {}); // Wait a few ticks to allow for delay in adding event listener to terrainProvider in Cesium.ts - await runLater(() => {}, 5); + await when( + () => terria2.notificationState.currentNotification !== undefined + ); // We should then get an error about the terrain server const currentNotificationTitle = @@ -353,6 +375,7 @@ describeIfSupported("Cesium Model", function () { }); it("should revert to 3dSmooth mode when cesiumIonAccessToken is invalid", async function () { + expect(terriaViewer2.viewerOptions.useTerrain).toBe(true, "1"); runInAction(() => { // Set an invalid token for the test terria2.configParameters.cesiumIonAccessToken = "expired_token"; @@ -361,17 +384,15 @@ describeIfSupported("Cesium Model", function () { // Instantiate Cesium object with the invalid token cesium2 = new Cesium(terriaViewer2, container2); - await cesium2.terrainProvider.readyPromise.catch(() => {}); - // Wait a few ticks to allow for delay in adding event listener to terrainProvider in Cesium.ts - await runLater(() => {}, 5); + await terrainLoadPromise(cesium2); - expect(terriaViewer2.viewerOptions.useTerrain).toBe(false); + expect(terriaViewer2.viewerOptions.useTerrain).toBe(false, "2"); expect( cesium2.scene.terrainProvider instanceof EllipsoidTerrainProvider - ).toBe(true); + ).toBe(true, "3"); }); - it("should thow a warning when `cesiumIonAccessToken` is invalid and `cesiumTerrainAssetId` is present", async function () { + it("should throw a warning when `cesiumIonAccessToken` is invalid and `cesiumTerrainAssetId` is present", async function () { runInAction(() => { // Set an invalid token for the test terria2.configParameters.cesiumIonAccessToken = "expired_token"; @@ -381,9 +402,7 @@ describeIfSupported("Cesium Model", function () { // Instantiate Cesium object with the invalid token and valid asset id cesium2 = new Cesium(terriaViewer2, container2); - await cesium2.terrainProvider.readyPromise.catch(() => {}); - // Wait a few ticks to allow for delay in adding event listener to terrainProvider in Cesium.ts - await runLater(() => {}, 5); + await terrainLoadPromise(cesium2); // We should then get an error about the terrain server const currentNotificationTitle = @@ -404,9 +423,7 @@ describeIfSupported("Cesium Model", function () { // Instantiate Cesium object with the invalid terrain url cesium2 = new Cesium(terriaViewer2, container2); - await cesium2.terrainProvider.readyPromise.catch(() => {}); - // Wait a few ticks to allow for delay in adding event listener to terrainProvider in Cesium.ts - await runLater(() => {}, 5); + await terrainLoadPromise(cesium2); // We should then get an error about the terrain server const currentNotificationTitle = @@ -426,21 +443,32 @@ describeIfSupported("Cesium Model", function () { * items. */ class MappablePrimitiveItem extends MappableMixin(CreateModel(MappableTraits)) { + constructor(id: string, terria: Terria, readonly tileset: Cesium3DTileset) { + super(id, terria); + } + async forceLoadMapItems() {} get mapItems() { - return [ - new Cesium3DTileset({ url: `prim${this.uniqueId}` }), - new GeoJsonDataSource(`ds${this.uniqueId}`), - { - alpha: 1, - imageryProvider: new WebMapServiceImageryProvider({ - url: `img${this.uniqueId}`, - layers: this.uniqueId! - }), - show: true, - clippingRectangle: undefined - } - ]; + const result: MapItem[] = []; + result.push(this.tileset); + result.push(new GeoJsonDataSource(`ds${this.uniqueId}`)); + result.push({ + alpha: 1, + imageryProvider: new WebMapServiceImageryProvider({ + url: `img${this.uniqueId}`, + layers: this.uniqueId! + }), + show: true, + clippingRectangle: undefined + }); + return result; } } + +/** + * Returns a promise that fulfills when terrain provider has finished loading. + */ +async function terrainLoadPromise(cesium: Cesium): Promise { + return when(() => cesium.isTerrainLoading === false); +} From ece081eb07f0bd597ca3088b2af2ec79a47c4054 Mon Sep 17 00:00:00 2001 From: Kevin Ring Date: Sun, 22 Oct 2023 22:40:56 +1100 Subject: [PATCH 326/654] Fix TS errors in tests by merging more changes from esbuild branch. --- .../OpenStreetMapCatalogItemSpec.ts | 41 ++++++++++--------- test/Models/UserDrawingSpec.ts | 12 +++--- 2 files changed, 28 insertions(+), 25 deletions(-) diff --git a/test/Models/Catalog/CatalogItems/OpenStreetMapCatalogItemSpec.ts b/test/Models/Catalog/CatalogItems/OpenStreetMapCatalogItemSpec.ts index 18b6e449678..85acd70b911 100644 --- a/test/Models/Catalog/CatalogItems/OpenStreetMapCatalogItemSpec.ts +++ b/test/Models/Catalog/CatalogItems/OpenStreetMapCatalogItemSpec.ts @@ -126,25 +126,28 @@ describe("OpenStreetMapCatalogItem", function () { if (!ImageryParts.is(item.mapItems[0])) throw new Error("MapItem is not an ImageryParts"); let imageryProvider = item.mapItems[0].imageryProvider; - expect({ - url: (imageryProvider as any).url, - attribution: imageryProvider.credit.html, - tilingScheme: imageryProvider.tilingScheme, - tileWidth: imageryProvider.tileWidth, - tileHeight: imageryProvider.tileHeight, - minimumLevel: imageryProvider.minimumLevel, - maximumLevel: imageryProvider.maximumLevel, - subdomains: (imageryProvider)._subdomains - }).toEqual({ - url: "https://{s}.example.com/ooo/{z}/{x}/{y}.png", - attribution: "foo bar baz", - tilingScheme: new WebMercatorTilingScheme(), - tileWidth: 256, - tileHeight: 256, - minimumLevel: 0, - maximumLevel: 25, - subdomains: ["a"] - }); + expect(imageryProvider).not.toBeUndefined(); + if (imageryProvider) { + expect({ + url: (imageryProvider as any).url, + attribution: imageryProvider.credit.html, + tilingScheme: imageryProvider.tilingScheme, + tileWidth: imageryProvider.tileWidth, + tileHeight: imageryProvider.tileHeight, + minimumLevel: imageryProvider.minimumLevel, + maximumLevel: imageryProvider.maximumLevel, + subdomains: (imageryProvider)._subdomains + }).toEqual({ + url: "https://{s}.example.com/ooo/{z}/{x}/{y}.png", + attribution: "foo bar baz", + tilingScheme: new WebMercatorTilingScheme(), + tileWidth: 256, + tileHeight: 256, + minimumLevel: 0, + maximumLevel: 25, + subdomains: ["a"] + }); + } }); }); }); diff --git a/test/Models/UserDrawingSpec.ts b/test/Models/UserDrawingSpec.ts index ce4d2c3ec49..0a2fdca352d 100644 --- a/test/Models/UserDrawingSpec.ts +++ b/test/Models/UserDrawingSpec.ts @@ -173,9 +173,9 @@ describe("UserDrawing", function () { let currentPointPos = currentPoint.position.getValue( terria.timelineClock.currentTime ); - expect(currentPointPos.x).toEqual(x); - expect(currentPointPos.y).toEqual(y); - expect(currentPointPos.z).toEqual(z); + expect(currentPointPos?.x).toEqual(x); + expect(currentPointPos?.y).toEqual(y); + expect(currentPointPos?.z).toEqual(z); } // Check line as well @@ -213,9 +213,9 @@ describe("UserDrawing", function () { let newPointPos = newPoint.position.getValue( terria.timelineClock.currentTime ); - expect(newPointPos.x).toEqual(newX); - expect(newPointPos.y).toEqual(newY); - expect(newPointPos.z).toEqual(newZ); + expect(newPointPos?.x).toEqual(newX); + expect(newPointPos?.y).toEqual(newY); + expect(newPointPos?.z).toEqual(newZ); } // Check line as well From 6b095a94b91ca43e187008c8ced1a9dfc1b00d26 Mon Sep 17 00:00:00 2001 From: Kevin Ring Date: Sun, 22 Oct 2023 23:41:10 +1100 Subject: [PATCH 327/654] Fix some test failures. --- .../CatalogItems/IonImageryCatalogItemSpec.ts | 43 ++++++++++++++++++- .../esri/ArcGisMapServerCatalogItemSpec.ts | 6 ++- 2 files changed, 45 insertions(+), 4 deletions(-) diff --git a/test/Models/Catalog/CatalogItems/IonImageryCatalogItemSpec.ts b/test/Models/Catalog/CatalogItems/IonImageryCatalogItemSpec.ts index e909ffa11de..8d27e680773 100644 --- a/test/Models/Catalog/CatalogItems/IonImageryCatalogItemSpec.ts +++ b/test/Models/Catalog/CatalogItems/IonImageryCatalogItemSpec.ts @@ -12,12 +12,51 @@ describe("IonImageryCatalogItem", function () { }); describe("the mapItem", function () { - beforeEach(function () { + beforeEach(async function () { + jasmine.Ajax.install(); + jasmine.Ajax.stubRequest( + "https://example.com/v1/assets/12345/endpoint?access_token=fakeAccessToken" + ).andReturn({ + responseText: JSON.stringify({ + type: "IMAGERY", + url: "https://example.com", + attributions: [] + }) + }); + + const validSampleXmlString = + '' + + " NE2_HR_LC_SR_W_DR_recolored.tif" + + " " + + " EPSG:4326" + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + " " + + ""; + + jasmine.Ajax.stubRequest( + "https://example.com/tilemapresource.xml" + ).andReturn({ + responseText: validSampleXmlString, + contentType: "text/xml" + }); + runInAction(() => { item.setTrait("definition", "ionAssetId", 12345); item.setTrait("definition", "ionAccessToken", "fakeAccessToken"); - item.setTrait("definition", "ionServer", "fakeServer"); + item.setTrait("definition", "ionServer", "https://example.com"); }); + await item.loadMapItems(); + }); + + afterEach(function () { + jasmine.Ajax.uninstall(); }); it("correctly sets the `alpha` value", function () { diff --git a/test/Models/Catalog/esri/ArcGisMapServerCatalogItemSpec.ts b/test/Models/Catalog/esri/ArcGisMapServerCatalogItemSpec.ts index be483fc3108..8ac82106c58 100644 --- a/test/Models/Catalog/esri/ArcGisMapServerCatalogItemSpec.ts +++ b/test/Models/Catalog/esri/ArcGisMapServerCatalogItemSpec.ts @@ -191,7 +191,7 @@ describe("ArcGisMapServerCatalogItem", function () { describe("imageryProvider", function () { let imageryProvider: ArcGisMapServerImageryProvider; - beforeEach(function () { + beforeEach(async function () { runInAction(() => { item.setTrait(CommonStrata.definition, "layers", "31"); item.setTrait(CommonStrata.definition, "parameters", { @@ -205,6 +205,7 @@ describe("ArcGisMapServerCatalogItem", function () { ); }); + await item.loadMapItems(); imageryProvider = item.mapItems[0] .imageryProvider as ArcGisMapServerImageryProvider; }); @@ -223,12 +224,13 @@ describe("ArcGisMapServerCatalogItem", function () { expect(imageryProvider.layers).toBe("31"); }); - it("converts layer names to layer ids when constructing imagery provider", function () { + it("converts layer names to layer ids when constructing imagery provider", async function () { item.setTrait( CommonStrata.definition, "layers", "Offshore_Rocks_And_Wrecks" ); + await item.loadMapItems(); const imageryProvider = item.mapItems[0] .imageryProvider as ArcGisMapServerImageryProvider; expect(imageryProvider.layers).toBe("31"); From 490bf7e99d29a919ffed62523e88042a1c2edbc1 Mon Sep 17 00:00:00 2001 From: Kevin Ring Date: Sun, 22 Oct 2023 23:46:38 +1100 Subject: [PATCH 328/654] Fix import. --- lib/Map/pickTriangle.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Map/pickTriangle.ts b/lib/Map/pickTriangle.ts index a80c2c51758..09ba2564aa9 100644 --- a/lib/Map/pickTriangle.ts +++ b/lib/Map/pickTriangle.ts @@ -8,7 +8,7 @@ import { Ray, Scene, SceneMode -} from "cesium"; +} from "terriajs-cesium"; type Tile = any; type GlobeSurfaceTile = any; From 1e970fb2727303d396b4ee3ae7930f6590fa4eb5 Mon Sep 17 00:00:00 2001 From: Kevin Ring Date: Mon, 23 Oct 2023 09:33:29 +1100 Subject: [PATCH 329/654] Fix remaining test failures. --- lib/Map/Cesium/CesiumRenderLoopPauser.ts | 5 ++- ...WebProcessingServiceCatalogFunctionSpec.ts | 39 ++++++++++++++----- test/Models/CesiumSpec.ts | 2 +- 3 files changed, 35 insertions(+), 11 deletions(-) diff --git a/lib/Map/Cesium/CesiumRenderLoopPauser.ts b/lib/Map/Cesium/CesiumRenderLoopPauser.ts index 8ba10d30e5e..430ca6d2b38 100644 --- a/lib/Map/Cesium/CesiumRenderLoopPauser.ts +++ b/lib/Map/Cesium/CesiumRenderLoopPauser.ts @@ -162,7 +162,10 @@ export default class CesiumRenderLoopPauser { transferableObjects ); - if (!defined(this._originalWorkerMessageSinkRepaint)) { + if ( + !defined(this._originalWorkerMessageSinkRepaint) && + defined(this._worker.onmessage) + ) { this._originalWorkerMessageSinkRepaint = this._worker.onmessage; var taskProcessor = this; diff --git a/test/Models/Catalog/Ows/WebProcessingServiceCatalogFunctionSpec.ts b/test/Models/Catalog/Ows/WebProcessingServiceCatalogFunctionSpec.ts index 060c56614db..4a308690030 100644 --- a/test/Models/Catalog/Ows/WebProcessingServiceCatalogFunctionSpec.ts +++ b/test/Models/Catalog/Ows/WebProcessingServiceCatalogFunctionSpec.ts @@ -49,15 +49,18 @@ describe("WebProcessingServiceCatalogFunction", function () { jasmine.Ajax.install(); jasmine.Ajax.stubRequest( "http://example.com/wps?service=WPS&request=DescribeProcess&version=1.0.0&Identifier=someId" - ).andReturn({ responseText: processDescriptionsXml }); + ).andReturn({ + responseText: processDescriptionsXml, + contentType: "text/xml" + }); jasmine.Ajax.stubRequest( "http://example.com/wps?service=WPS&request=Execute&version=1.0.0" - ).andReturn({ responseText: executeResponseXml }); + ).andReturn({ responseText: executeResponseXml, contentType: "text/xml" }); jasmine.Ajax.stubRequest( "http://example.com/wps?service=WPS&request=Execute&version=1.0.0&Identifier=someId&DataInputs=geometry%3D%7B%22type%22%3A%22FeatureCollection%22%2C%22features%22%3A%5B%7B%22type%22%3A%22Feature%22%2C%22geometry%22%3A%7B%22type%22%3A%22Point%22%2C%22coordinates%22%3A%5B144.97227858979468%2C-37.771379205590165%2C-1196.8235676901866%5D%7D%2C%22properties%22%3A%7B%7D%7D%5D%7D&storeExecuteResponse=true&status=true" - ).andReturn({ responseText: executeResponseXml }); + ).andReturn({ responseText: executeResponseXml, contentType: "text/xml" }); jasmine.Ajax.stubRequest( "build/TerriaJS/data/regionMapping.json" @@ -193,11 +196,17 @@ describe("WebProcessingServiceCatalogFunction", function () { it("polls the statusLocation for the result", async function () { jasmine.Ajax.stubRequest( "http://example.com/wps?service=WPS&request=Execute&version=1.0.0" - ).andReturn({ responseText: pendingExecuteResponseXml }); + ).andReturn({ + responseText: pendingExecuteResponseXml, + contentType: "text/xml" + }); jasmine.Ajax.stubRequest( "http://example.com/ows?check_status/123" - ).andReturn({ responseText: executeResponseXml }); + ).andReturn({ + responseText: executeResponseXml, + contentType: "text/xml" + }); const job = await wps.submitJob(); @@ -234,7 +243,10 @@ describe("WebProcessingServiceCatalogFunction", function () { ); // do nothing jasmine.Ajax.stubRequest( "http://example.com/wps?service=WPS&request=Execute&version=1.0.0" - ).andReturn({ responseText: pendingExecuteResponseXml }); + ).andReturn({ + responseText: pendingExecuteResponseXml, + contentType: "text/xml" + }); // Note: we don't stubRequest "http://example.com/ows?check_status/123" here - so an error will be thrown if the job polls for a result @@ -272,11 +284,17 @@ describe("WebProcessingServiceCatalogFunction", function () { it("marks the ResultPendingCatalogItem as failed - for polling results", async function () { jasmine.Ajax.stubRequest( "http://example.com/wps?service=WPS&request=Execute&version=1.0.0" - ).andReturn({ responseText: pendingExecuteResponseXml }); + ).andReturn({ + responseText: pendingExecuteResponseXml, + contentType: "text/xml" + }); jasmine.Ajax.stubRequest( "http://example.com/ows?check_status/123" - ).andReturn({ responseText: failedExecuteResponseXml }); + ).andReturn({ + responseText: failedExecuteResponseXml, + contentType: "text/xml" + }); const job = (await wps.submitJob()) as WebProcessingServiceCatalogFunctionJob; @@ -312,7 +330,10 @@ describe("WebProcessingServiceCatalogFunction", function () { it("marks the ResultPendingCatalogItem as failed", async function () { jasmine.Ajax.stubRequest( "http://example.com/wps?service=WPS&request=Execute&version=1.0.0" - ).andReturn({ responseText: failedExecuteResponseXml }); + ).andReturn({ + responseText: failedExecuteResponseXml, + contentType: "text/xml" + }); try { const job = await wps.submitJob(); diff --git a/test/Models/CesiumSpec.ts b/test/Models/CesiumSpec.ts index 63678a6e756..3d67d0b4df5 100644 --- a/test/Models/CesiumSpec.ts +++ b/test/Models/CesiumSpec.ts @@ -226,7 +226,7 @@ describeIfSupported("Cesium Model", function () { spyOn( workbenchTerrainItem as any, "loadTerrainProvider" - ).and.returnValue(Promise.resolve(new CesiumTerrainProvider())); + ).and.returnValue(new CesiumTerrainProvider()); (await terria.workbench.add(workbenchTerrainItem)).throwIfError(); }) ); From 930f79cb18fee66d451dc34aca4565f8e4953246 Mon Sep 17 00:00:00 2001 From: Kevin Ring Date: Mon, 23 Oct 2023 09:43:27 +1100 Subject: [PATCH 330/654] Fix mouse hover location display. --- lib/Map/Cesium/pickTriangle.ts | 223 +++++++++++++++++++++++++++++ lib/ReactViewModels/MouseCoords.ts | 10 +- 2 files changed, 232 insertions(+), 1 deletion(-) create mode 100644 lib/Map/Cesium/pickTriangle.ts diff --git a/lib/Map/Cesium/pickTriangle.ts b/lib/Map/Cesium/pickTriangle.ts new file mode 100644 index 00000000000..a80c2c51758 --- /dev/null +++ b/lib/Map/Cesium/pickTriangle.ts @@ -0,0 +1,223 @@ +import { + BoundingSphere, + Cartesian3, + Cartographic, + defined, + IntersectionTests, + MapProjection, + Ray, + Scene, + SceneMode +} from "cesium"; + +type Tile = any; +type GlobeSurfaceTile = any; +type TerrainEncoding = any; + +export interface PickTriangleResult + extends PickTriangleFromGlobeSurfaceTileResult { + tile: Tile; +} + +const scratchArray: Tile[] = []; +const scratchSphereIntersectionResult = { + start: 0.0, + stop: 0.0 +}; + +// This is adapted from CesiumJS's `Globe.pick` function, but extended +// to return more information. +export default function pickTriangle( + ray: Ray, + scene: Scene, + cullBackFaces: boolean, + result: PickTriangleResult +): PickTriangleResult | undefined { + const mode = scene.mode; + const projection = scene.mapProjection; + + const sphereIntersections = scratchArray; + sphereIntersections.length = 0; + + const globeAny: any = scene.globe; + const surface = globeAny._surface; + + const tilesToRender = surface._tilesToRender; + let length = tilesToRender.length; + + let tile; + let i; + + for (i = 0; i < length; ++i) { + tile = tilesToRender[i]; + const surfaceTile = tile.data; + + if (!defined(surfaceTile)) { + continue; + } + + let boundingVolume = surfaceTile.pickBoundingSphere; + if (mode !== SceneMode.SCENE3D) { + surfaceTile.pickBoundingSphere = boundingVolume = + BoundingSphere.fromRectangleWithHeights2D( + tile.rectangle, + projection, + surfaceTile.tileBoundingRegion.minimumHeight, + surfaceTile.tileBoundingRegion.maximumHeight, + boundingVolume + ); + Cartesian3.fromElements( + boundingVolume.center.z, + boundingVolume.center.x, + boundingVolume.center.y, + boundingVolume.center + ); + } else if (defined(surfaceTile.renderedMesh)) { + BoundingSphere.clone( + surfaceTile.tileBoundingRegion.boundingSphere, + boundingVolume + ); + } else { + // So wait how did we render this thing then? It shouldn't be possible to get here. + continue; + } + + const boundingSphereIntersection = IntersectionTests.raySphere( + ray, + boundingVolume, + scratchSphereIntersectionResult + ); + if (defined(boundingSphereIntersection)) { + sphereIntersections.push(tile); + } + } + + sphereIntersections.sort(createComparePickTileFunction(ray.origin)); + + let intersection; + length = sphereIntersections.length; + for (i = 0; i < length; ++i) { + intersection = pickTriangleFromGlobeSurfaceTile( + sphereIntersections[i].data, + ray, + scene.mode, + scene.mapProjection, + cullBackFaces, + result + ); + if (intersection !== undefined) { + result.tile = sphereIntersections[i]; + break; + } + } + + return intersection === undefined ? undefined : result; +} + +function createComparePickTileFunction(rayOrigin: Cartesian3) { + return function (a: Tile, b: Tile) { + const aDist = BoundingSphere.distanceSquaredTo( + a.data.pickBoundingSphere, + rayOrigin + ); + const bDist = BoundingSphere.distanceSquaredTo( + b.data.pickBoundingSphere, + rayOrigin + ); + + return aDist - bDist; + }; +} + +const scratchCartographic = new Cartographic(); + +function getPosition( + encoding: TerrainEncoding, + mode: SceneMode, + projection: MapProjection, + vertices: any, + index: number, + result: Cartesian3 +) { + let position = encoding.getExaggeratedPosition(vertices, index, result); + + if (defined(mode) && mode !== SceneMode.SCENE3D) { + const ellipsoid = projection.ellipsoid; + const positionCartographic = ellipsoid.cartesianToCartographic( + position, + scratchCartographic + ); + position = projection.project(positionCartographic, result); + position = Cartesian3.fromElements( + position.z, + position.x, + position.y, + result + ); + } + + return position; +} + +const scratchV0 = new Cartesian3(); +const scratchV1 = new Cartesian3(); +const scratchV2 = new Cartesian3(); + +export interface PickTriangleFromGlobeSurfaceTileResult { + intersection: Cartesian3; + v0: Cartesian3; + v1: Cartesian3; + v2: Cartesian3; +} + +function pickTriangleFromGlobeSurfaceTile( + globeSurfaceTile: GlobeSurfaceTile, + ray: Ray, + mode: SceneMode, + projection: MapProjection, + cullBackFaces: boolean, + result: PickTriangleFromGlobeSurfaceTileResult +): PickTriangleFromGlobeSurfaceTileResult | undefined { + var mesh = globeSurfaceTile.renderedMesh; + if (!defined(mesh)) { + return undefined; + } + + var vertices = mesh.vertices; + var indices = mesh.indices; + var encoding = mesh.encoding; + var indicesLength = indices.length; + + let minT = Number.MAX_VALUE; + + for (var i = 0; i < indicesLength; i += 3) { + var i0 = indices[i]; + var i1 = indices[i + 1]; + var i2 = indices[i + 2]; + + const v0 = getPosition(encoding, mode, projection, vertices, i0, scratchV0); + const v1 = getPosition(encoding, mode, projection, vertices, i1, scratchV1); + const v2 = getPosition(encoding, mode, projection, vertices, i2, scratchV2); + + var t = IntersectionTests.rayTriangleParametric( + ray, + v0, + v1, + v2, + cullBackFaces + ); + if (defined(t) && t < minT && t >= 0.0) { + minT = t; + Cartesian3.clone(v0, result.v0); + Cartesian3.clone(v1, result.v1); + Cartesian3.clone(v2, result.v2); + } + } + + if (minT === Number.MAX_VALUE) { + return undefined; + } + + Ray.getPoint(ray, minT, result.intersection); + return result; +} diff --git a/lib/ReactViewModels/MouseCoords.ts b/lib/ReactViewModels/MouseCoords.ts index f68381192b2..615f87ebcca 100644 --- a/lib/ReactViewModels/MouseCoords.ts +++ b/lib/ReactViewModels/MouseCoords.ts @@ -11,6 +11,7 @@ import Ray from "terriajs-cesium/Source/Core/Ray"; import TerrainProvider from "terriajs-cesium/Source/Core/TerrainProvider"; import isDefined from "../Core/isDefined"; import JSEarthGravityModel1996 from "../Map/Vector/EarthGravityModel1996"; +import pickTriangle, { PickTriangleResult } from "../Map/Cesium/pickTriangle"; import prettifyCoordinates from "../Map/Vector/prettifyCoordinates"; import prettifyProjection from "../Map/Vector/prettifyProjection"; import Terria from "../Models/Terria"; @@ -34,6 +35,13 @@ const scratchV2 = new Cartographic(); const scratchIntersection = new Cartographic(); const scratchBarycentric = new Cartesian3(); const scratchCartographic = new Cartographic(); +const pickedTriangleScratch: PickTriangleResult = { + tile: undefined, + intersection: new Cartesian3(), + v0: new Cartesian3(), + v1: new Cartesian3(), + v2: new Cartesian3() +}; export default class MouseCoords { readonly geoidModel: EarthGravityModel1996; @@ -96,7 +104,7 @@ export default class MouseCoords { const pickRay = camera.getPickRay(position, scratchRay); const globe = scene.globe; const pickedTriangle = isDefined(pickRay) - ? (globe).pickTriangle(pickRay, scene) + ? pickTriangle(pickRay, scene, true, pickedTriangleScratch) : undefined; if (isDefined(pickedTriangle)) { // Get a fast, accurate-ish height every time the mouse moves. From 77cbb52e74baa9241e23975cf1bb8068e44f56f3 Mon Sep 17 00:00:00 2001 From: Kevin Ring Date: Mon, 23 Oct 2023 10:25:39 +1100 Subject: [PATCH 331/654] Upgrade to Cesium 1.110. --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 70444ad8cd2..637f2c8b8ef 100644 --- a/package.json +++ b/package.json @@ -173,8 +173,8 @@ "style-loader": "^0.23.1", "styled-components": "^5.3.9", "svg-sprite-loader": "4.1.3", - "terriajs-cesium": "4.0.0", - "terriajs-cesium-widgets": "4.0.0", + "terriajs-cesium": "5.0.0", + "terriajs-cesium-widgets": "4.1.0", "terriajs-html2canvas": "1.0.0-alpha.12-terriajs-1", "thredds-catalog-crawler": "0.0.5", "ts-essentials": "^5.0.0", From 94b9d1bc62d8a461add8ea87ac360a4d3bf8c064 Mon Sep 17 00:00:00 2001 From: Kevin Ring Date: Mon, 23 Oct 2023 10:33:56 +1100 Subject: [PATCH 332/654] Remove extra file, fix the correct one. --- lib/Map/Cesium/pickTriangle.ts | 2 +- lib/Map/pickTriangle.ts | 223 --------------------------------- 2 files changed, 1 insertion(+), 224 deletions(-) delete mode 100644 lib/Map/pickTriangle.ts diff --git a/lib/Map/Cesium/pickTriangle.ts b/lib/Map/Cesium/pickTriangle.ts index a80c2c51758..09ba2564aa9 100644 --- a/lib/Map/Cesium/pickTriangle.ts +++ b/lib/Map/Cesium/pickTriangle.ts @@ -8,7 +8,7 @@ import { Ray, Scene, SceneMode -} from "cesium"; +} from "terriajs-cesium"; type Tile = any; type GlobeSurfaceTile = any; diff --git a/lib/Map/pickTriangle.ts b/lib/Map/pickTriangle.ts deleted file mode 100644 index 09ba2564aa9..00000000000 --- a/lib/Map/pickTriangle.ts +++ /dev/null @@ -1,223 +0,0 @@ -import { - BoundingSphere, - Cartesian3, - Cartographic, - defined, - IntersectionTests, - MapProjection, - Ray, - Scene, - SceneMode -} from "terriajs-cesium"; - -type Tile = any; -type GlobeSurfaceTile = any; -type TerrainEncoding = any; - -export interface PickTriangleResult - extends PickTriangleFromGlobeSurfaceTileResult { - tile: Tile; -} - -const scratchArray: Tile[] = []; -const scratchSphereIntersectionResult = { - start: 0.0, - stop: 0.0 -}; - -// This is adapted from CesiumJS's `Globe.pick` function, but extended -// to return more information. -export default function pickTriangle( - ray: Ray, - scene: Scene, - cullBackFaces: boolean, - result: PickTriangleResult -): PickTriangleResult | undefined { - const mode = scene.mode; - const projection = scene.mapProjection; - - const sphereIntersections = scratchArray; - sphereIntersections.length = 0; - - const globeAny: any = scene.globe; - const surface = globeAny._surface; - - const tilesToRender = surface._tilesToRender; - let length = tilesToRender.length; - - let tile; - let i; - - for (i = 0; i < length; ++i) { - tile = tilesToRender[i]; - const surfaceTile = tile.data; - - if (!defined(surfaceTile)) { - continue; - } - - let boundingVolume = surfaceTile.pickBoundingSphere; - if (mode !== SceneMode.SCENE3D) { - surfaceTile.pickBoundingSphere = boundingVolume = - BoundingSphere.fromRectangleWithHeights2D( - tile.rectangle, - projection, - surfaceTile.tileBoundingRegion.minimumHeight, - surfaceTile.tileBoundingRegion.maximumHeight, - boundingVolume - ); - Cartesian3.fromElements( - boundingVolume.center.z, - boundingVolume.center.x, - boundingVolume.center.y, - boundingVolume.center - ); - } else if (defined(surfaceTile.renderedMesh)) { - BoundingSphere.clone( - surfaceTile.tileBoundingRegion.boundingSphere, - boundingVolume - ); - } else { - // So wait how did we render this thing then? It shouldn't be possible to get here. - continue; - } - - const boundingSphereIntersection = IntersectionTests.raySphere( - ray, - boundingVolume, - scratchSphereIntersectionResult - ); - if (defined(boundingSphereIntersection)) { - sphereIntersections.push(tile); - } - } - - sphereIntersections.sort(createComparePickTileFunction(ray.origin)); - - let intersection; - length = sphereIntersections.length; - for (i = 0; i < length; ++i) { - intersection = pickTriangleFromGlobeSurfaceTile( - sphereIntersections[i].data, - ray, - scene.mode, - scene.mapProjection, - cullBackFaces, - result - ); - if (intersection !== undefined) { - result.tile = sphereIntersections[i]; - break; - } - } - - return intersection === undefined ? undefined : result; -} - -function createComparePickTileFunction(rayOrigin: Cartesian3) { - return function (a: Tile, b: Tile) { - const aDist = BoundingSphere.distanceSquaredTo( - a.data.pickBoundingSphere, - rayOrigin - ); - const bDist = BoundingSphere.distanceSquaredTo( - b.data.pickBoundingSphere, - rayOrigin - ); - - return aDist - bDist; - }; -} - -const scratchCartographic = new Cartographic(); - -function getPosition( - encoding: TerrainEncoding, - mode: SceneMode, - projection: MapProjection, - vertices: any, - index: number, - result: Cartesian3 -) { - let position = encoding.getExaggeratedPosition(vertices, index, result); - - if (defined(mode) && mode !== SceneMode.SCENE3D) { - const ellipsoid = projection.ellipsoid; - const positionCartographic = ellipsoid.cartesianToCartographic( - position, - scratchCartographic - ); - position = projection.project(positionCartographic, result); - position = Cartesian3.fromElements( - position.z, - position.x, - position.y, - result - ); - } - - return position; -} - -const scratchV0 = new Cartesian3(); -const scratchV1 = new Cartesian3(); -const scratchV2 = new Cartesian3(); - -export interface PickTriangleFromGlobeSurfaceTileResult { - intersection: Cartesian3; - v0: Cartesian3; - v1: Cartesian3; - v2: Cartesian3; -} - -function pickTriangleFromGlobeSurfaceTile( - globeSurfaceTile: GlobeSurfaceTile, - ray: Ray, - mode: SceneMode, - projection: MapProjection, - cullBackFaces: boolean, - result: PickTriangleFromGlobeSurfaceTileResult -): PickTriangleFromGlobeSurfaceTileResult | undefined { - var mesh = globeSurfaceTile.renderedMesh; - if (!defined(mesh)) { - return undefined; - } - - var vertices = mesh.vertices; - var indices = mesh.indices; - var encoding = mesh.encoding; - var indicesLength = indices.length; - - let minT = Number.MAX_VALUE; - - for (var i = 0; i < indicesLength; i += 3) { - var i0 = indices[i]; - var i1 = indices[i + 1]; - var i2 = indices[i + 2]; - - const v0 = getPosition(encoding, mode, projection, vertices, i0, scratchV0); - const v1 = getPosition(encoding, mode, projection, vertices, i1, scratchV1); - const v2 = getPosition(encoding, mode, projection, vertices, i2, scratchV2); - - var t = IntersectionTests.rayTriangleParametric( - ray, - v0, - v1, - v2, - cullBackFaces - ); - if (defined(t) && t < minT && t >= 0.0) { - minT = t; - Cartesian3.clone(v0, result.v0); - Cartesian3.clone(v1, result.v1); - Cartesian3.clone(v2, result.v2); - } - } - - if (minT === Number.MAX_VALUE) { - return undefined; - } - - Ray.getPoint(ray, minT, result.intersection); - return result; -} From 7d21c7cf7a8537efa1a414256ad0de3028728e55 Mon Sep 17 00:00:00 2001 From: Kevin Ring Date: Mon, 23 Oct 2023 10:43:05 +1100 Subject: [PATCH 333/654] Prettier. --- buildprocess/configureWebpack.js | 18 +- .../CatalogItems/CesiumTerrainCatalogItem.ts | 4 +- .../Ows/WebMapTileServiceCatalogItem.ts | 2 +- lib/ReactViewModels/MouseCoords.ts | 2 +- .../terriajs-cesium-extra/index.d.ts | 2290 +++++++++++++---- 5 files changed, 1843 insertions(+), 473 deletions(-) diff --git a/buildprocess/configureWebpack.js b/buildprocess/configureWebpack.js index d5b7bd31b88..71dfa07ac63 100644 --- a/buildprocess/configureWebpack.js +++ b/buildprocess/configureWebpack.js @@ -39,7 +39,10 @@ function configureWebpack( config.resolve.alias = { // @cesium/widgets will import from @cesium/engine. We need to make sure it ends up with // the terriajs-cesium fork instead of upstream cesium. - "@cesium/engine": path.resolve(require.resolve("terriajs-cesium/package.json"), ".."), + "@cesium/engine": path.resolve( + require.resolve("terriajs-cesium/package.json"), + ".." + ), ...config.resolve.alias }; config.resolve.modules = config.resolve.modules || []; @@ -108,20 +111,18 @@ function configureWebpack( }) }); - const zipJsDir = path.dirname( - require.resolve("@zip.js/zip.js/package.json") - ); + const zipJsDir = path.dirname(require.resolve("@zip.js/zip.js/package.json")); config.module.rules.push({ test: /\.js$/, include: zipJsDir, - loader: require.resolve('@open-wc/webpack-import-meta-loader'), + loader: require.resolve("@open-wc/webpack-import-meta-loader") }); config.module.rules.push({ test: /buildModuleUrl.js$/, include: path.resolve(cesiumDir, "Source", "Core"), - loader: require.resolve('@open-wc/webpack-import-meta-loader'), + loader: require.resolve("@open-wc/webpack-import-meta-loader") }); const babelLoader = { @@ -225,10 +226,7 @@ function configureWebpack( path.dirname(require.resolve("terriajs-cesium/package.json")), "Source" ), - use: [ - babelLoader, - require.resolve("./removeCesiumDebugPragmas") - ] + use: [babelLoader, require.resolve("./removeCesiumDebugPragmas")] }); // Don't let Cesium's `buildModuleUrl` see require - only the AMD version is relevant. diff --git a/lib/Models/Catalog/CatalogItems/CesiumTerrainCatalogItem.ts b/lib/Models/Catalog/CatalogItems/CesiumTerrainCatalogItem.ts index 0f6e66b01e9..d69418c7f6c 100644 --- a/lib/Models/Catalog/CatalogItems/CesiumTerrainCatalogItem.ts +++ b/lib/Models/Catalog/CatalogItems/CesiumTerrainCatalogItem.ts @@ -57,9 +57,7 @@ export default class CesiumTerrainCatalogItem extends UrlMixin( /** * Returns a Promise to load the terrain provider */ - private loadTerrainProvider(): Promise< - CesiumTerrainProvider | undefined - > { + private loadTerrainProvider(): Promise { const resource = this.ionAssetId !== undefined ? IonResource.fromAssetId(this.ionAssetId, { diff --git a/lib/Models/Catalog/Ows/WebMapTileServiceCatalogItem.ts b/lib/Models/Catalog/Ows/WebMapTileServiceCatalogItem.ts index f94c874617a..70b9b7631f5 100644 --- a/lib/Models/Catalog/Ows/WebMapTileServiceCatalogItem.ts +++ b/lib/Models/Catalog/Ows/WebMapTileServiceCatalogItem.ts @@ -550,7 +550,7 @@ class WebMapTileServiceCatalogItem extends MappableMixin( this.tileHeight ?? this.minimumLevel ?? tileMatrixSet.tileHeight, tilingScheme: new WebMercatorTilingScheme(), format, - credit: this.attribution, + credit: this.attribution // TODO: implement picking for WebMapTileServiceImageryProvider //enablePickFeatures: this.allowFeaturePicking }); diff --git a/lib/ReactViewModels/MouseCoords.ts b/lib/ReactViewModels/MouseCoords.ts index 615f87ebcca..86e2fcf52ca 100644 --- a/lib/ReactViewModels/MouseCoords.ts +++ b/lib/ReactViewModels/MouseCoords.ts @@ -104,7 +104,7 @@ export default class MouseCoords { const pickRay = camera.getPickRay(position, scratchRay); const globe = scene.globe; const pickedTriangle = isDefined(pickRay) - ? pickTriangle(pickRay, scene, true, pickedTriangleScratch) + ? pickTriangle(pickRay, scene, true, pickedTriangleScratch) : undefined; if (isDefined(pickedTriangle)) { // Get a fast, accurate-ish height every time the mouse moves. diff --git a/lib/ThirdParty/terriajs-cesium-extra/index.d.ts b/lib/ThirdParty/terriajs-cesium-extra/index.d.ts index 4b795b854aa..0fabbcee06a 100644 --- a/lib/ThirdParty/terriajs-cesium-extra/index.d.ts +++ b/lib/ThirdParty/terriajs-cesium-extra/index.d.ts @@ -66,462 +66,1836 @@ declare module "terriajs-cesium" { } // Begin Generated Declarations -declare module "terriajs-cesium/Source/Core/ArcGISTiledElevationTerrainProvider" { import { ArcGISTiledElevationTerrainProvider } from 'terriajs-cesium'; export default ArcGISTiledElevationTerrainProvider; } -declare module "terriajs-cesium/Source/Core/ArcType" { import { ArcType } from 'terriajs-cesium'; export default ArcType; } -declare module "terriajs-cesium/Source/Core/AssociativeArray" { import { AssociativeArray } from 'terriajs-cesium'; export default AssociativeArray; } -declare module "terriajs-cesium/Source/Core/AxisAlignedBoundingBox" { import { AxisAlignedBoundingBox } from 'terriajs-cesium'; export default AxisAlignedBoundingBox; } -declare module "terriajs-cesium/Source/Core/barycentricCoordinates" { import { barycentricCoordinates } from 'terriajs-cesium'; export default barycentricCoordinates; } -declare module "terriajs-cesium/Source/Core/binarySearch" { import { binarySearch } from 'terriajs-cesium'; export default binarySearch; } -declare module "terriajs-cesium/Source/Core/BingMapsGeocoderService" { import { BingMapsGeocoderService } from 'terriajs-cesium'; export default BingMapsGeocoderService; } -declare module "terriajs-cesium/Source/Core/BoundingRectangle" { import { BoundingRectangle } from 'terriajs-cesium'; export default BoundingRectangle; } -declare module "terriajs-cesium/Source/Core/BoundingSphere" { import { BoundingSphere } from 'terriajs-cesium'; export default BoundingSphere; } -declare module "terriajs-cesium/Source/Core/BoxGeometry" { import { BoxGeometry } from 'terriajs-cesium'; export default BoxGeometry; } -declare module "terriajs-cesium/Source/Core/BoxOutlineGeometry" { import { BoxOutlineGeometry } from 'terriajs-cesium'; export default BoxOutlineGeometry; } -declare module "terriajs-cesium/Source/Core/buildModuleUrl" { import { buildModuleUrl } from 'terriajs-cesium'; export default buildModuleUrl; } -declare module "terriajs-cesium/Source/Core/Cartesian2" { import { Cartesian2 } from 'terriajs-cesium'; export default Cartesian2; } -declare module "terriajs-cesium/Source/Core/Cartesian3" { import { Cartesian3 } from 'terriajs-cesium'; export default Cartesian3; } -declare module "terriajs-cesium/Source/Core/Cartesian4" { import { Cartesian4 } from 'terriajs-cesium'; export default Cartesian4; } -declare module "terriajs-cesium/Source/Core/Cartographic" { import { Cartographic } from 'terriajs-cesium'; export default Cartographic; } -declare module "terriajs-cesium/Source/Core/CartographicGeocoderService" { import { CartographicGeocoderService } from 'terriajs-cesium'; export default CartographicGeocoderService; } -declare module "terriajs-cesium/Source/Core/CatmullRomSpline" { import { CatmullRomSpline } from 'terriajs-cesium'; export default CatmullRomSpline; } -declare module "terriajs-cesium/Source/Core/CesiumTerrainProvider" { import { CesiumTerrainProvider } from 'terriajs-cesium'; export default CesiumTerrainProvider; } -declare module "terriajs-cesium/Source/Core/CircleGeometry" { import { CircleGeometry } from 'terriajs-cesium'; export default CircleGeometry; } -declare module "terriajs-cesium/Source/Core/CircleOutlineGeometry" { import { CircleOutlineGeometry } from 'terriajs-cesium'; export default CircleOutlineGeometry; } -declare module "terriajs-cesium/Source/Core/Clock" { import { Clock } from 'terriajs-cesium'; export default Clock; } -declare module "terriajs-cesium/Source/Core/ClockRange" { import { ClockRange } from 'terriajs-cesium'; export default ClockRange; } -declare module "terriajs-cesium/Source/Core/ClockStep" { import { ClockStep } from 'terriajs-cesium'; export default ClockStep; } -declare module "terriajs-cesium/Source/Core/clone" { import { clone } from 'terriajs-cesium'; export default clone; } -declare module "terriajs-cesium/Source/Core/Color" { import { Color } from 'terriajs-cesium'; export default Color; } -declare module "terriajs-cesium/Source/Core/ColorGeometryInstanceAttribute" { import { ColorGeometryInstanceAttribute } from 'terriajs-cesium'; export default ColorGeometryInstanceAttribute; } -declare module "terriajs-cesium/Source/Core/combine" { import { combine } from 'terriajs-cesium'; export default combine; } -declare module "terriajs-cesium/Source/Core/ComponentDatatype" { import { ComponentDatatype } from 'terriajs-cesium'; export default ComponentDatatype; } -declare module "terriajs-cesium/Source/Core/CompressedTextureBuffer" { import { CompressedTextureBuffer } from 'terriajs-cesium'; export default CompressedTextureBuffer; } -declare module "terriajs-cesium/Source/Core/ConstantSpline" { import { ConstantSpline } from 'terriajs-cesium'; export default ConstantSpline; } -declare module "terriajs-cesium/Source/Core/CoplanarPolygonGeometry" { import { CoplanarPolygonGeometry } from 'terriajs-cesium'; export default CoplanarPolygonGeometry; } -declare module "terriajs-cesium/Source/Core/CoplanarPolygonOutlineGeometry" { import { CoplanarPolygonOutlineGeometry } from 'terriajs-cesium'; export default CoplanarPolygonOutlineGeometry; } -declare module "terriajs-cesium/Source/Core/CornerType" { import { CornerType } from 'terriajs-cesium'; export default CornerType; } -declare module "terriajs-cesium/Source/Core/CorridorGeometry" { import { CorridorGeometry } from 'terriajs-cesium'; export default CorridorGeometry; } -declare module "terriajs-cesium/Source/Core/CorridorOutlineGeometry" { import { CorridorOutlineGeometry } from 'terriajs-cesium'; export default CorridorOutlineGeometry; } -declare module "terriajs-cesium/Source/Core/createGuid" { import { createGuid } from 'terriajs-cesium'; export default createGuid; } -declare module "terriajs-cesium/Source/Core/createWorldTerrainAsync" { import { createWorldTerrainAsync } from 'terriajs-cesium'; export default createWorldTerrainAsync; } -declare module "terriajs-cesium/Source/Core/Credit" { import { Credit } from 'terriajs-cesium'; export default Credit; } -declare module "terriajs-cesium/Source/Core/CubicRealPolynomial" { import { CubicRealPolynomial } from 'terriajs-cesium'; export default CubicRealPolynomial; } -declare module "terriajs-cesium/Source/Core/CullingVolume" { import { CullingVolume } from 'terriajs-cesium'; export default CullingVolume; } -declare module "terriajs-cesium/Source/Core/CustomHeightmapTerrainProvider" { import { CustomHeightmapTerrainProvider } from 'terriajs-cesium'; export default CustomHeightmapTerrainProvider; } -declare module "terriajs-cesium/Source/Core/CylinderGeometry" { import { CylinderGeometry } from 'terriajs-cesium'; export default CylinderGeometry; } -declare module "terriajs-cesium/Source/Core/CylinderOutlineGeometry" { import { CylinderOutlineGeometry } from 'terriajs-cesium'; export default CylinderOutlineGeometry; } -declare module "terriajs-cesium/Source/Core/DefaultProxy" { import { DefaultProxy } from 'terriajs-cesium'; export default DefaultProxy; } -declare module "terriajs-cesium/Source/Core/defaultValue" { import { defaultValue } from 'terriajs-cesium'; export default defaultValue; } -declare module "terriajs-cesium/Source/Core/defined" { import { defined } from 'terriajs-cesium'; export default defined; } -declare module "terriajs-cesium/Source/Core/destroyObject" { import { destroyObject } from 'terriajs-cesium'; export default destroyObject; } -declare module "terriajs-cesium/Source/Core/DeveloperError" { import { DeveloperError } from 'terriajs-cesium'; export default DeveloperError; } -declare module "terriajs-cesium/Source/Core/DistanceDisplayCondition" { import { DistanceDisplayCondition } from 'terriajs-cesium'; export default DistanceDisplayCondition; } -declare module "terriajs-cesium/Source/Core/DistanceDisplayConditionGeometryInstanceAttribute" { import { DistanceDisplayConditionGeometryInstanceAttribute } from 'terriajs-cesium'; export default DistanceDisplayConditionGeometryInstanceAttribute; } -declare module "terriajs-cesium/Source/Core/EasingFunction" { import { EasingFunction } from 'terriajs-cesium'; export default EasingFunction; } -declare module "terriajs-cesium/Source/Core/EllipseGeometry" { import { EllipseGeometry } from 'terriajs-cesium'; export default EllipseGeometry; } -declare module "terriajs-cesium/Source/Core/EllipseOutlineGeometry" { import { EllipseOutlineGeometry } from 'terriajs-cesium'; export default EllipseOutlineGeometry; } -declare module "terriajs-cesium/Source/Core/Ellipsoid" { import { Ellipsoid } from 'terriajs-cesium'; export default Ellipsoid; } -declare module "terriajs-cesium/Source/Core/EllipsoidGeodesic" { import { EllipsoidGeodesic } from 'terriajs-cesium'; export default EllipsoidGeodesic; } -declare module "terriajs-cesium/Source/Core/EllipsoidGeometry" { import { EllipsoidGeometry } from 'terriajs-cesium'; export default EllipsoidGeometry; } -declare module "terriajs-cesium/Source/Core/EllipsoidOutlineGeometry" { import { EllipsoidOutlineGeometry } from 'terriajs-cesium'; export default EllipsoidOutlineGeometry; } -declare module "terriajs-cesium/Source/Core/EllipsoidRhumbLine" { import { EllipsoidRhumbLine } from 'terriajs-cesium'; export default EllipsoidRhumbLine; } -declare module "terriajs-cesium/Source/Core/EllipsoidTangentPlane" { import { EllipsoidTangentPlane } from 'terriajs-cesium'; export default EllipsoidTangentPlane; } -declare module "terriajs-cesium/Source/Core/EllipsoidTerrainProvider" { import { EllipsoidTerrainProvider } from 'terriajs-cesium'; export default EllipsoidTerrainProvider; } -declare module "terriajs-cesium/Source/Core/Event" { import { Event } from 'terriajs-cesium'; export default Event; } -declare module "terriajs-cesium/Source/Core/EventHelper" { import { EventHelper } from 'terriajs-cesium'; export default EventHelper; } -declare module "terriajs-cesium/Source/Core/ExtrapolationType" { import { ExtrapolationType } from 'terriajs-cesium'; export default ExtrapolationType; } -declare module "terriajs-cesium/Source/Core/FeatureDetection" { import { FeatureDetection } from 'terriajs-cesium'; export default FeatureDetection; } -declare module "terriajs-cesium/Source/Core/formatError" { import { formatError } from 'terriajs-cesium'; export default formatError; } -declare module "terriajs-cesium/Source/Core/FrustumGeometry" { import { FrustumGeometry } from 'terriajs-cesium'; export default FrustumGeometry; } -declare module "terriajs-cesium/Source/Core/FrustumOutlineGeometry" { import { FrustumOutlineGeometry } from 'terriajs-cesium'; export default FrustumOutlineGeometry; } -declare module "terriajs-cesium/Source/Core/Fullscreen" { import { Fullscreen } from 'terriajs-cesium'; export default Fullscreen; } -declare module "terriajs-cesium/Source/Core/GeocoderService" { import { GeocoderService } from 'terriajs-cesium'; export default GeocoderService; } -declare module "terriajs-cesium/Source/Core/GeocodeType" { import { GeocodeType } from 'terriajs-cesium'; export default GeocodeType; } -declare module "terriajs-cesium/Source/Core/GeographicProjection" { import { GeographicProjection } from 'terriajs-cesium'; export default GeographicProjection; } -declare module "terriajs-cesium/Source/Core/GeographicTilingScheme" { import { GeographicTilingScheme } from 'terriajs-cesium'; export default GeographicTilingScheme; } -declare module "terriajs-cesium/Source/Core/Geometry" { import { Geometry } from 'terriajs-cesium'; export default Geometry; } -declare module "terriajs-cesium/Source/Core/GeometryAttribute" { import { GeometryAttribute } from 'terriajs-cesium'; export default GeometryAttribute; } -declare module "terriajs-cesium/Source/Core/GeometryAttributes" { import { GeometryAttributes } from 'terriajs-cesium'; export default GeometryAttributes; } -declare module "terriajs-cesium/Source/Core/GeometryFactory" { import { GeometryFactory } from 'terriajs-cesium'; export default GeometryFactory; } -declare module "terriajs-cesium/Source/Core/GeometryInstance" { import { GeometryInstance } from 'terriajs-cesium'; export default GeometryInstance; } -declare module "terriajs-cesium/Source/Core/GeometryInstanceAttribute" { import { GeometryInstanceAttribute } from 'terriajs-cesium'; export default GeometryInstanceAttribute; } -declare module "terriajs-cesium/Source/Core/GeometryPipeline" { import { GeometryPipeline } from 'terriajs-cesium'; export default GeometryPipeline; } -declare module "terriajs-cesium/Source/Core/getAbsoluteUri" { import { getAbsoluteUri } from 'terriajs-cesium'; export default getAbsoluteUri; } -declare module "terriajs-cesium/Source/Core/getBaseUri" { import { getBaseUri } from 'terriajs-cesium'; export default getBaseUri; } -declare module "terriajs-cesium/Source/Core/getExtensionFromUri" { import { getExtensionFromUri } from 'terriajs-cesium'; export default getExtensionFromUri; } -declare module "terriajs-cesium/Source/Core/getFilenameFromUri" { import { getFilenameFromUri } from 'terriajs-cesium'; export default getFilenameFromUri; } -declare module "terriajs-cesium/Source/Core/getImagePixels" { import { getImagePixels } from 'terriajs-cesium'; export default getImagePixels; } -declare module "terriajs-cesium/Source/Core/getTimestamp" { import { getTimestamp } from 'terriajs-cesium'; export default getTimestamp; } -declare module "terriajs-cesium/Source/Core/GoogleEarthEnterpriseMetadata" { import { GoogleEarthEnterpriseMetadata } from 'terriajs-cesium'; export default GoogleEarthEnterpriseMetadata; } -declare module "terriajs-cesium/Source/Core/GoogleEarthEnterpriseTerrainData" { import { GoogleEarthEnterpriseTerrainData } from 'terriajs-cesium'; export default GoogleEarthEnterpriseTerrainData; } -declare module "terriajs-cesium/Source/Core/GoogleEarthEnterpriseTerrainProvider" { import { GoogleEarthEnterpriseTerrainProvider } from 'terriajs-cesium'; export default GoogleEarthEnterpriseTerrainProvider; } -declare module "terriajs-cesium/Source/Core/GoogleMaps" { import { GoogleMaps } from 'terriajs-cesium'; export default GoogleMaps; } -declare module "terriajs-cesium/Source/Core/GregorianDate" { import { GregorianDate } from 'terriajs-cesium'; export default GregorianDate; } -declare module "terriajs-cesium/Source/Core/GroundPolylineGeometry" { import { GroundPolylineGeometry } from 'terriajs-cesium'; export default GroundPolylineGeometry; } -declare module "terriajs-cesium/Source/Core/HeadingPitchRange" { import { HeadingPitchRange } from 'terriajs-cesium'; export default HeadingPitchRange; } -declare module "terriajs-cesium/Source/Core/HeadingPitchRoll" { import { HeadingPitchRoll } from 'terriajs-cesium'; export default HeadingPitchRoll; } -declare module "terriajs-cesium/Source/Core/HeightmapEncoding" { import { HeightmapEncoding } from 'terriajs-cesium'; export default HeightmapEncoding; } -declare module "terriajs-cesium/Source/Core/HeightmapTerrainData" { import { HeightmapTerrainData } from 'terriajs-cesium'; export default HeightmapTerrainData; } -declare module "terriajs-cesium/Source/Core/HermitePolynomialApproximation" { import { HermitePolynomialApproximation } from 'terriajs-cesium'; export default HermitePolynomialApproximation; } -declare module "terriajs-cesium/Source/Core/HermiteSpline" { import { HermiteSpline } from 'terriajs-cesium'; export default HermiteSpline; } -declare module "terriajs-cesium/Source/Core/HilbertOrder" { import { HilbertOrder } from 'terriajs-cesium'; export default HilbertOrder; } -declare module "terriajs-cesium/Source/Core/IndexDatatype" { import { IndexDatatype } from 'terriajs-cesium'; export default IndexDatatype; } -declare module "terriajs-cesium/Source/Core/InterpolationAlgorithm" { import { InterpolationAlgorithm } from 'terriajs-cesium'; export default InterpolationAlgorithm; } -declare module "terriajs-cesium/Source/Core/Intersect" { import { Intersect } from 'terriajs-cesium'; export default Intersect; } -declare module "terriajs-cesium/Source/Core/Intersections2D" { import { Intersections2D } from 'terriajs-cesium'; export default Intersections2D; } -declare module "terriajs-cesium/Source/Core/IntersectionTests" { import { IntersectionTests } from 'terriajs-cesium'; export default IntersectionTests; } -declare module "terriajs-cesium/Source/Core/Interval" { import { Interval } from 'terriajs-cesium'; export default Interval; } -declare module "terriajs-cesium/Source/Core/Ion" { import { Ion } from 'terriajs-cesium'; export default Ion; } -declare module "terriajs-cesium/Source/Core/IonGeocoderService" { import { IonGeocoderService } from 'terriajs-cesium'; export default IonGeocoderService; } -declare module "terriajs-cesium/Source/Core/IonResource" { import { IonResource } from 'terriajs-cesium'; export default IonResource; } -declare module "terriajs-cesium/Source/Core/isLeapYear" { import { isLeapYear } from 'terriajs-cesium'; export default isLeapYear; } -declare module "terriajs-cesium/Source/Core/Iso8601" { import { Iso8601 } from 'terriajs-cesium'; export default Iso8601; } -declare module "terriajs-cesium/Source/Core/JulianDate" { import { JulianDate } from 'terriajs-cesium'; export default JulianDate; } -declare module "terriajs-cesium/Source/Core/KeyboardEventModifier" { import { KeyboardEventModifier } from 'terriajs-cesium'; export default KeyboardEventModifier; } -declare module "terriajs-cesium/Source/Core/LagrangePolynomialApproximation" { import { LagrangePolynomialApproximation } from 'terriajs-cesium'; export default LagrangePolynomialApproximation; } -declare module "terriajs-cesium/Source/Core/LeapSecond" { import { LeapSecond } from 'terriajs-cesium'; export default LeapSecond; } -declare module "terriajs-cesium/Source/Core/LinearApproximation" { import { LinearApproximation } from 'terriajs-cesium'; export default LinearApproximation; } -declare module "terriajs-cesium/Source/Core/LinearSpline" { import { LinearSpline } from 'terriajs-cesium'; export default LinearSpline; } -declare module "terriajs-cesium/Source/Core/MapProjection" { import { MapProjection } from 'terriajs-cesium'; export default MapProjection; } -declare module "terriajs-cesium/Source/Core/Math" { import { Math } from 'terriajs-cesium'; export default Math; } -declare module "terriajs-cesium/Source/Core/Matrix2" { import { Matrix2 } from 'terriajs-cesium'; export default Matrix2; } -declare module "terriajs-cesium/Source/Core/Matrix3" { import { Matrix3 } from 'terriajs-cesium'; export default Matrix3; } -declare module "terriajs-cesium/Source/Core/Matrix4" { import { Matrix4 } from 'terriajs-cesium'; export default Matrix4; } -declare module "terriajs-cesium/Source/Core/mergeSort" { import { mergeSort } from 'terriajs-cesium'; export default mergeSort; } -declare module "terriajs-cesium/Source/Core/MorphWeightSpline" { import { MorphWeightSpline } from 'terriajs-cesium'; export default MorphWeightSpline; } -declare module "terriajs-cesium/Source/Core/NearFarScalar" { import { NearFarScalar } from 'terriajs-cesium'; export default NearFarScalar; } -declare module "terriajs-cesium/Source/Core/objectToQuery" { import { objectToQuery } from 'terriajs-cesium'; export default objectToQuery; } -declare module "terriajs-cesium/Source/Core/Occluder" { import { Occluder } from 'terriajs-cesium'; export default Occluder; } -declare module "terriajs-cesium/Source/Core/OpenCageGeocoderService" { import { OpenCageGeocoderService } from 'terriajs-cesium'; export default OpenCageGeocoderService; } -declare module "terriajs-cesium/Source/Core/OrientedBoundingBox" { import { OrientedBoundingBox } from 'terriajs-cesium'; export default OrientedBoundingBox; } -declare module "terriajs-cesium/Source/Core/OrthographicFrustum" { import { OrthographicFrustum } from 'terriajs-cesium'; export default OrthographicFrustum; } -declare module "terriajs-cesium/Source/Core/OrthographicOffCenterFrustum" { import { OrthographicOffCenterFrustum } from 'terriajs-cesium'; export default OrthographicOffCenterFrustum; } -declare module "terriajs-cesium/Source/Core/Packable" { import { Packable } from 'terriajs-cesium'; export default Packable; } -declare module "terriajs-cesium/Source/Core/PackableForInterpolation" { import { PackableForInterpolation } from 'terriajs-cesium'; export default PackableForInterpolation; } -declare module "terriajs-cesium/Source/Core/PeliasGeocoderService" { import { PeliasGeocoderService } from 'terriajs-cesium'; export default PeliasGeocoderService; } -declare module "terriajs-cesium/Source/Core/PerspectiveFrustum" { import { PerspectiveFrustum } from 'terriajs-cesium'; export default PerspectiveFrustum; } -declare module "terriajs-cesium/Source/Core/PerspectiveOffCenterFrustum" { import { PerspectiveOffCenterFrustum } from 'terriajs-cesium'; export default PerspectiveOffCenterFrustum; } -declare module "terriajs-cesium/Source/Core/PinBuilder" { import { PinBuilder } from 'terriajs-cesium'; export default PinBuilder; } -declare module "terriajs-cesium/Source/Core/PixelFormat" { import { PixelFormat } from 'terriajs-cesium'; export default PixelFormat; } -declare module "terriajs-cesium/Source/Core/Plane" { import { Plane } from 'terriajs-cesium'; export default Plane; } -declare module "terriajs-cesium/Source/Core/PlaneGeometry" { import { PlaneGeometry } from 'terriajs-cesium'; export default PlaneGeometry; } -declare module "terriajs-cesium/Source/Core/PlaneOutlineGeometry" { import { PlaneOutlineGeometry } from 'terriajs-cesium'; export default PlaneOutlineGeometry; } -declare module "terriajs-cesium/Source/Core/pointInsideTriangle" { import { pointInsideTriangle } from 'terriajs-cesium'; export default pointInsideTriangle; } -declare module "terriajs-cesium/Source/Core/PolygonGeometry" { import { PolygonGeometry } from 'terriajs-cesium'; export default PolygonGeometry; } -declare module "terriajs-cesium/Source/Core/PolygonHierarchy" { import { PolygonHierarchy } from 'terriajs-cesium'; export default PolygonHierarchy; } -declare module "terriajs-cesium/Source/Core/PolygonOutlineGeometry" { import { PolygonOutlineGeometry } from 'terriajs-cesium'; export default PolygonOutlineGeometry; } -declare module "terriajs-cesium/Source/Core/PolylineGeometry" { import { PolylineGeometry } from 'terriajs-cesium'; export default PolylineGeometry; } -declare module "terriajs-cesium/Source/Core/PolylineVolumeGeometry" { import { PolylineVolumeGeometry } from 'terriajs-cesium'; export default PolylineVolumeGeometry; } -declare module "terriajs-cesium/Source/Core/PolylineVolumeOutlineGeometry" { import { PolylineVolumeOutlineGeometry } from 'terriajs-cesium'; export default PolylineVolumeOutlineGeometry; } -declare module "terriajs-cesium/Source/Core/PrimitiveType" { import { PrimitiveType } from 'terriajs-cesium'; export default PrimitiveType; } -declare module "terriajs-cesium/Source/Core/Proxy" { import { Proxy } from 'terriajs-cesium'; export default Proxy; } -declare module "terriajs-cesium/Source/Core/QuadraticRealPolynomial" { import { QuadraticRealPolynomial } from 'terriajs-cesium'; export default QuadraticRealPolynomial; } -declare module "terriajs-cesium/Source/Core/QuantizedMeshTerrainData" { import { QuantizedMeshTerrainData } from 'terriajs-cesium'; export default QuantizedMeshTerrainData; } -declare module "terriajs-cesium/Source/Core/QuarticRealPolynomial" { import { QuarticRealPolynomial } from 'terriajs-cesium'; export default QuarticRealPolynomial; } -declare module "terriajs-cesium/Source/Core/Quaternion" { import { Quaternion } from 'terriajs-cesium'; export default Quaternion; } -declare module "terriajs-cesium/Source/Core/QuaternionSpline" { import { QuaternionSpline } from 'terriajs-cesium'; export default QuaternionSpline; } -declare module "terriajs-cesium/Source/Core/queryToObject" { import { queryToObject } from 'terriajs-cesium'; export default queryToObject; } -declare module "terriajs-cesium/Source/Core/Queue" { import { Queue } from 'terriajs-cesium'; export default Queue; } -declare module "terriajs-cesium/Source/Core/Ray" { import { Ray } from 'terriajs-cesium'; export default Ray; } -declare module "terriajs-cesium/Source/Core/Rectangle" { import { Rectangle } from 'terriajs-cesium'; export default Rectangle; } -declare module "terriajs-cesium/Source/Core/RectangleGeometry" { import { RectangleGeometry } from 'terriajs-cesium'; export default RectangleGeometry; } -declare module "terriajs-cesium/Source/Core/RectangleOutlineGeometry" { import { RectangleOutlineGeometry } from 'terriajs-cesium'; export default RectangleOutlineGeometry; } -declare module "terriajs-cesium/Source/Core/ReferenceFrame" { import { ReferenceFrame } from 'terriajs-cesium'; export default ReferenceFrame; } -declare module "terriajs-cesium/Source/Core/Request" { import { Request } from 'terriajs-cesium'; export default Request; } -declare module "terriajs-cesium/Source/Core/RequestErrorEvent" { import { RequestErrorEvent } from 'terriajs-cesium'; export default RequestErrorEvent; } -declare module "terriajs-cesium/Source/Core/RequestScheduler" { import { RequestScheduler } from 'terriajs-cesium'; export default RequestScheduler; } -declare module "terriajs-cesium/Source/Core/RequestState" { import { RequestState } from 'terriajs-cesium'; export default RequestState; } -declare module "terriajs-cesium/Source/Core/RequestType" { import { RequestType } from 'terriajs-cesium'; export default RequestType; } -declare module "terriajs-cesium/Source/Core/Resource" { import { Resource } from 'terriajs-cesium'; export default Resource; } -declare module "terriajs-cesium/Source/Core/RuntimeError" { import { RuntimeError } from 'terriajs-cesium'; export default RuntimeError; } -declare module "terriajs-cesium/Source/Core/sampleTerrain" { import { sampleTerrain } from 'terriajs-cesium'; export default sampleTerrain; } -declare module "terriajs-cesium/Source/Core/sampleTerrainMostDetailed" { import { sampleTerrainMostDetailed } from 'terriajs-cesium'; export default sampleTerrainMostDetailed; } -declare module "terriajs-cesium/Source/Core/ScreenSpaceEventHandler" { import { ScreenSpaceEventHandler } from 'terriajs-cesium'; export default ScreenSpaceEventHandler; } -declare module "terriajs-cesium/Source/Core/ScreenSpaceEventType" { import { ScreenSpaceEventType } from 'terriajs-cesium'; export default ScreenSpaceEventType; } -declare module "terriajs-cesium/Source/Core/ShowGeometryInstanceAttribute" { import { ShowGeometryInstanceAttribute } from 'terriajs-cesium'; export default ShowGeometryInstanceAttribute; } -declare module "terriajs-cesium/Source/Core/Simon1994PlanetaryPositions" { import { Simon1994PlanetaryPositions } from 'terriajs-cesium'; export default Simon1994PlanetaryPositions; } -declare module "terriajs-cesium/Source/Core/SimplePolylineGeometry" { import { SimplePolylineGeometry } from 'terriajs-cesium'; export default SimplePolylineGeometry; } -declare module "terriajs-cesium/Source/Core/SphereGeometry" { import { SphereGeometry } from 'terriajs-cesium'; export default SphereGeometry; } -declare module "terriajs-cesium/Source/Core/SphereOutlineGeometry" { import { SphereOutlineGeometry } from 'terriajs-cesium'; export default SphereOutlineGeometry; } -declare module "terriajs-cesium/Source/Core/Spherical" { import { Spherical } from 'terriajs-cesium'; export default Spherical; } -declare module "terriajs-cesium/Source/Core/Spline" { import { Spline } from 'terriajs-cesium'; export default Spline; } -declare module "terriajs-cesium/Source/Core/SteppedSpline" { import { SteppedSpline } from 'terriajs-cesium'; export default SteppedSpline; } -declare module "terriajs-cesium/Source/Core/subdivideArray" { import { subdivideArray } from 'terriajs-cesium'; export default subdivideArray; } -declare module "terriajs-cesium/Source/Core/TaskProcessor" { import { TaskProcessor } from 'terriajs-cesium'; export default TaskProcessor; } -declare module "terriajs-cesium/Source/Core/TerrainData" { import { TerrainData } from 'terriajs-cesium'; export default TerrainData; } -declare module "terriajs-cesium/Source/Core/TerrainProvider" { import { TerrainProvider } from 'terriajs-cesium'; export default TerrainProvider; } -declare module "terriajs-cesium/Source/Core/TileAvailability" { import { TileAvailability } from 'terriajs-cesium'; export default TileAvailability; } -declare module "terriajs-cesium/Source/Core/TileProviderError" { import { TileProviderError } from 'terriajs-cesium'; export default TileProviderError; } -declare module "terriajs-cesium/Source/Core/TilingScheme" { import { TilingScheme } from 'terriajs-cesium'; export default TilingScheme; } -declare module "terriajs-cesium/Source/Core/TimeInterval" { import { TimeInterval } from 'terriajs-cesium'; export default TimeInterval; } -declare module "terriajs-cesium/Source/Core/TimeIntervalCollection" { import { TimeIntervalCollection } from 'terriajs-cesium'; export default TimeIntervalCollection; } -declare module "terriajs-cesium/Source/Core/TimeStandard" { import { TimeStandard } from 'terriajs-cesium'; export default TimeStandard; } -declare module "terriajs-cesium/Source/Core/Transforms" { import { Transforms } from 'terriajs-cesium'; export default Transforms; } -declare module "terriajs-cesium/Source/Core/TranslationRotationScale" { import { TranslationRotationScale } from 'terriajs-cesium'; export default TranslationRotationScale; } -declare module "terriajs-cesium/Source/Core/TridiagonalSystemSolver" { import { TridiagonalSystemSolver } from 'terriajs-cesium'; export default TridiagonalSystemSolver; } -declare module "terriajs-cesium/Source/Core/TrustedServers" { import { TrustedServers } from 'terriajs-cesium'; export default TrustedServers; } -declare module "terriajs-cesium/Source/Core/VertexFormat" { import { VertexFormat } from 'terriajs-cesium'; export default VertexFormat; } -declare module "terriajs-cesium/Source/Core/VideoSynchronizer" { import { VideoSynchronizer } from 'terriajs-cesium'; export default VideoSynchronizer; } -declare module "terriajs-cesium/Source/Core/Visibility" { import { Visibility } from 'terriajs-cesium'; export default Visibility; } -declare module "terriajs-cesium/Source/Core/VRTheWorldTerrainProvider" { import { VRTheWorldTerrainProvider } from 'terriajs-cesium'; export default VRTheWorldTerrainProvider; } -declare module "terriajs-cesium/Source/Core/WallGeometry" { import { WallGeometry } from 'terriajs-cesium'; export default WallGeometry; } -declare module "terriajs-cesium/Source/Core/WallOutlineGeometry" { import { WallOutlineGeometry } from 'terriajs-cesium'; export default WallOutlineGeometry; } -declare module "terriajs-cesium/Source/Core/WebGLConstants" { import { WebGLConstants } from 'terriajs-cesium'; export default WebGLConstants; } -declare module "terriajs-cesium/Source/Core/WebMercatorProjection" { import { WebMercatorProjection } from 'terriajs-cesium'; export default WebMercatorProjection; } -declare module "terriajs-cesium/Source/Core/WebMercatorTilingScheme" { import { WebMercatorTilingScheme } from 'terriajs-cesium'; export default WebMercatorTilingScheme; } -declare module "terriajs-cesium/Source/Core/WindingOrder" { import { WindingOrder } from 'terriajs-cesium'; export default WindingOrder; } -declare module "terriajs-cesium/Source/Core/writeTextToCanvas" { import { writeTextToCanvas } from 'terriajs-cesium'; export default writeTextToCanvas; } -declare module "terriajs-cesium/Source/DataSources/BillboardGraphics" { import { BillboardGraphics } from 'terriajs-cesium'; export default BillboardGraphics; } -declare module "terriajs-cesium/Source/DataSources/BillboardVisualizer" { import { BillboardVisualizer } from 'terriajs-cesium'; export default BillboardVisualizer; } -declare module "terriajs-cesium/Source/DataSources/BoxGeometryUpdater" { import { BoxGeometryUpdater } from 'terriajs-cesium'; export default BoxGeometryUpdater; } -declare module "terriajs-cesium/Source/DataSources/BoxGraphics" { import { BoxGraphics } from 'terriajs-cesium'; export default BoxGraphics; } -declare module "terriajs-cesium/Source/DataSources/CallbackProperty" { import { CallbackProperty } from 'terriajs-cesium'; export default CallbackProperty; } -declare module "terriajs-cesium/Source/DataSources/Cesium3DTilesetGraphics" { import { Cesium3DTilesetGraphics } from 'terriajs-cesium'; export default Cesium3DTilesetGraphics; } -declare module "terriajs-cesium/Source/DataSources/Cesium3DTilesetVisualizer" { import { Cesium3DTilesetVisualizer } from 'terriajs-cesium'; export default Cesium3DTilesetVisualizer; } -declare module "terriajs-cesium/Source/DataSources/CheckerboardMaterialProperty" { import { CheckerboardMaterialProperty } from 'terriajs-cesium'; export default CheckerboardMaterialProperty; } -declare module "terriajs-cesium/Source/DataSources/ColorMaterialProperty" { import { ColorMaterialProperty } from 'terriajs-cesium'; export default ColorMaterialProperty; } -declare module "terriajs-cesium/Source/DataSources/CompositeEntityCollection" { import { CompositeEntityCollection } from 'terriajs-cesium'; export default CompositeEntityCollection; } -declare module "terriajs-cesium/Source/DataSources/CompositeMaterialProperty" { import { CompositeMaterialProperty } from 'terriajs-cesium'; export default CompositeMaterialProperty; } -declare module "terriajs-cesium/Source/DataSources/CompositePositionProperty" { import { CompositePositionProperty } from 'terriajs-cesium'; export default CompositePositionProperty; } -declare module "terriajs-cesium/Source/DataSources/CompositeProperty" { import { CompositeProperty } from 'terriajs-cesium'; export default CompositeProperty; } -declare module "terriajs-cesium/Source/DataSources/ConstantPositionProperty" { import { ConstantPositionProperty } from 'terriajs-cesium'; export default ConstantPositionProperty; } -declare module "terriajs-cesium/Source/DataSources/ConstantProperty" { import { ConstantProperty } from 'terriajs-cesium'; export default ConstantProperty; } -declare module "terriajs-cesium/Source/DataSources/CorridorGeometryUpdater" { import { CorridorGeometryUpdater } from 'terriajs-cesium'; export default CorridorGeometryUpdater; } -declare module "terriajs-cesium/Source/DataSources/CorridorGraphics" { import { CorridorGraphics } from 'terriajs-cesium'; export default CorridorGraphics; } -declare module "terriajs-cesium/Source/DataSources/CustomDataSource" { import { CustomDataSource } from 'terriajs-cesium'; export default CustomDataSource; } -declare module "terriajs-cesium/Source/DataSources/CylinderGeometryUpdater" { import { CylinderGeometryUpdater } from 'terriajs-cesium'; export default CylinderGeometryUpdater; } -declare module "terriajs-cesium/Source/DataSources/CylinderGraphics" { import { CylinderGraphics } from 'terriajs-cesium'; export default CylinderGraphics; } -declare module "terriajs-cesium/Source/DataSources/CzmlDataSource" { import { CzmlDataSource } from 'terriajs-cesium'; export default CzmlDataSource; } -declare module "terriajs-cesium/Source/DataSources/DataSource" { import { DataSource } from 'terriajs-cesium'; export default DataSource; } -declare module "terriajs-cesium/Source/DataSources/DataSourceClock" { import { DataSourceClock } from 'terriajs-cesium'; export default DataSourceClock; } -declare module "terriajs-cesium/Source/DataSources/DataSourceCollection" { import { DataSourceCollection } from 'terriajs-cesium'; export default DataSourceCollection; } -declare module "terriajs-cesium/Source/DataSources/DataSourceDisplay" { import { DataSourceDisplay } from 'terriajs-cesium'; export default DataSourceDisplay; } -declare module "terriajs-cesium/Source/DataSources/EllipseGeometryUpdater" { import { EllipseGeometryUpdater } from 'terriajs-cesium'; export default EllipseGeometryUpdater; } -declare module "terriajs-cesium/Source/DataSources/EllipseGraphics" { import { EllipseGraphics } from 'terriajs-cesium'; export default EllipseGraphics; } -declare module "terriajs-cesium/Source/DataSources/EllipsoidGeometryUpdater" { import { EllipsoidGeometryUpdater } from 'terriajs-cesium'; export default EllipsoidGeometryUpdater; } -declare module "terriajs-cesium/Source/DataSources/EllipsoidGraphics" { import { EllipsoidGraphics } from 'terriajs-cesium'; export default EllipsoidGraphics; } -declare module "terriajs-cesium/Source/DataSources/Entity" { import { Entity } from 'terriajs-cesium'; export default Entity; } -declare module "terriajs-cesium/Source/DataSources/EntityCluster" { import { EntityCluster } from 'terriajs-cesium'; export default EntityCluster; } -declare module "terriajs-cesium/Source/DataSources/EntityCollection" { import { EntityCollection } from 'terriajs-cesium'; export default EntityCollection; } -declare module "terriajs-cesium/Source/DataSources/EntityView" { import { EntityView } from 'terriajs-cesium'; export default EntityView; } -declare module "terriajs-cesium/Source/DataSources/exportKml" { import { exportKml } from 'terriajs-cesium'; export default exportKml; } -declare module "terriajs-cesium/Source/DataSources/GeoJsonDataSource" { import { GeoJsonDataSource } from 'terriajs-cesium'; export default GeoJsonDataSource; } -declare module "terriajs-cesium/Source/DataSources/GeometryUpdater" { import { GeometryUpdater } from 'terriajs-cesium'; export default GeometryUpdater; } -declare module "terriajs-cesium/Source/DataSources/GeometryVisualizer" { import { GeometryVisualizer } from 'terriajs-cesium'; export default GeometryVisualizer; } -declare module "terriajs-cesium/Source/DataSources/GpxDataSource" { import { GpxDataSource } from 'terriajs-cesium'; export default GpxDataSource; } -declare module "terriajs-cesium/Source/DataSources/GridMaterialProperty" { import { GridMaterialProperty } from 'terriajs-cesium'; export default GridMaterialProperty; } -declare module "terriajs-cesium/Source/DataSources/GroundGeometryUpdater" { import { GroundGeometryUpdater } from 'terriajs-cesium'; export default GroundGeometryUpdater; } -declare module "terriajs-cesium/Source/DataSources/ImageMaterialProperty" { import { ImageMaterialProperty } from 'terriajs-cesium'; export default ImageMaterialProperty; } -declare module "terriajs-cesium/Source/DataSources/KmlCamera" { import { KmlCamera } from 'terriajs-cesium'; export default KmlCamera; } -declare module "terriajs-cesium/Source/DataSources/KmlDataSource" { import { KmlDataSource } from 'terriajs-cesium'; export default KmlDataSource; } -declare module "terriajs-cesium/Source/DataSources/KmlLookAt" { import { KmlLookAt } from 'terriajs-cesium'; export default KmlLookAt; } -declare module "terriajs-cesium/Source/DataSources/KmlTour" { import { KmlTour } from 'terriajs-cesium'; export default KmlTour; } -declare module "terriajs-cesium/Source/DataSources/KmlTourFlyTo" { import { KmlTourFlyTo } from 'terriajs-cesium'; export default KmlTourFlyTo; } -declare module "terriajs-cesium/Source/DataSources/KmlTourWait" { import { KmlTourWait } from 'terriajs-cesium'; export default KmlTourWait; } -declare module "terriajs-cesium/Source/DataSources/LabelGraphics" { import { LabelGraphics } from 'terriajs-cesium'; export default LabelGraphics; } -declare module "terriajs-cesium/Source/DataSources/LabelVisualizer" { import { LabelVisualizer } from 'terriajs-cesium'; export default LabelVisualizer; } -declare module "terriajs-cesium/Source/DataSources/MaterialProperty" { import { MaterialProperty } from 'terriajs-cesium'; export default MaterialProperty; } -declare module "terriajs-cesium/Source/DataSources/ModelGraphics" { import { ModelGraphics } from 'terriajs-cesium'; export default ModelGraphics; } -declare module "terriajs-cesium/Source/DataSources/ModelVisualizer" { import { ModelVisualizer } from 'terriajs-cesium'; export default ModelVisualizer; } -declare module "terriajs-cesium/Source/DataSources/NodeTransformationProperty" { import { NodeTransformationProperty } from 'terriajs-cesium'; export default NodeTransformationProperty; } -declare module "terriajs-cesium/Source/DataSources/PathGraphics" { import { PathGraphics } from 'terriajs-cesium'; export default PathGraphics; } -declare module "terriajs-cesium/Source/DataSources/PathVisualizer" { import { PathVisualizer } from 'terriajs-cesium'; export default PathVisualizer; } -declare module "terriajs-cesium/Source/DataSources/PlaneGeometryUpdater" { import { PlaneGeometryUpdater } from 'terriajs-cesium'; export default PlaneGeometryUpdater; } -declare module "terriajs-cesium/Source/DataSources/PlaneGraphics" { import { PlaneGraphics } from 'terriajs-cesium'; export default PlaneGraphics; } -declare module "terriajs-cesium/Source/DataSources/PointGraphics" { import { PointGraphics } from 'terriajs-cesium'; export default PointGraphics; } -declare module "terriajs-cesium/Source/DataSources/PointVisualizer" { import { PointVisualizer } from 'terriajs-cesium'; export default PointVisualizer; } -declare module "terriajs-cesium/Source/DataSources/PolygonGeometryUpdater" { import { PolygonGeometryUpdater } from 'terriajs-cesium'; export default PolygonGeometryUpdater; } -declare module "terriajs-cesium/Source/DataSources/PolygonGraphics" { import { PolygonGraphics } from 'terriajs-cesium'; export default PolygonGraphics; } -declare module "terriajs-cesium/Source/DataSources/PolylineArrowMaterialProperty" { import { PolylineArrowMaterialProperty } from 'terriajs-cesium'; export default PolylineArrowMaterialProperty; } -declare module "terriajs-cesium/Source/DataSources/PolylineDashMaterialProperty" { import { PolylineDashMaterialProperty } from 'terriajs-cesium'; export default PolylineDashMaterialProperty; } -declare module "terriajs-cesium/Source/DataSources/PolylineGeometryUpdater" { import { PolylineGeometryUpdater } from 'terriajs-cesium'; export default PolylineGeometryUpdater; } -declare module "terriajs-cesium/Source/DataSources/PolylineGlowMaterialProperty" { import { PolylineGlowMaterialProperty } from 'terriajs-cesium'; export default PolylineGlowMaterialProperty; } -declare module "terriajs-cesium/Source/DataSources/PolylineGraphics" { import { PolylineGraphics } from 'terriajs-cesium'; export default PolylineGraphics; } -declare module "terriajs-cesium/Source/DataSources/PolylineOutlineMaterialProperty" { import { PolylineOutlineMaterialProperty } from 'terriajs-cesium'; export default PolylineOutlineMaterialProperty; } -declare module "terriajs-cesium/Source/DataSources/PolylineVisualizer" { import { PolylineVisualizer } from 'terriajs-cesium'; export default PolylineVisualizer; } -declare module "terriajs-cesium/Source/DataSources/PolylineVolumeGeometryUpdater" { import { PolylineVolumeGeometryUpdater } from 'terriajs-cesium'; export default PolylineVolumeGeometryUpdater; } -declare module "terriajs-cesium/Source/DataSources/PolylineVolumeGraphics" { import { PolylineVolumeGraphics } from 'terriajs-cesium'; export default PolylineVolumeGraphics; } -declare module "terriajs-cesium/Source/DataSources/PositionProperty" { import { PositionProperty } from 'terriajs-cesium'; export default PositionProperty; } -declare module "terriajs-cesium/Source/DataSources/PositionPropertyArray" { import { PositionPropertyArray } from 'terriajs-cesium'; export default PositionPropertyArray; } -declare module "terriajs-cesium/Source/DataSources/Property" { import { Property } from 'terriajs-cesium'; export default Property; } -declare module "terriajs-cesium/Source/DataSources/PropertyArray" { import { PropertyArray } from 'terriajs-cesium'; export default PropertyArray; } -declare module "terriajs-cesium/Source/DataSources/PropertyBag" { import { PropertyBag } from 'terriajs-cesium'; export default PropertyBag; } -declare module "terriajs-cesium/Source/DataSources/RectangleGeometryUpdater" { import { RectangleGeometryUpdater } from 'terriajs-cesium'; export default RectangleGeometryUpdater; } -declare module "terriajs-cesium/Source/DataSources/RectangleGraphics" { import { RectangleGraphics } from 'terriajs-cesium'; export default RectangleGraphics; } -declare module "terriajs-cesium/Source/DataSources/ReferenceProperty" { import { ReferenceProperty } from 'terriajs-cesium'; export default ReferenceProperty; } -declare module "terriajs-cesium/Source/DataSources/Rotation" { import { Rotation } from 'terriajs-cesium'; export default Rotation; } -declare module "terriajs-cesium/Source/DataSources/SampledPositionProperty" { import { SampledPositionProperty } from 'terriajs-cesium'; export default SampledPositionProperty; } -declare module "terriajs-cesium/Source/DataSources/SampledProperty" { import { SampledProperty } from 'terriajs-cesium'; export default SampledProperty; } -declare module "terriajs-cesium/Source/DataSources/StripeMaterialProperty" { import { StripeMaterialProperty } from 'terriajs-cesium'; export default StripeMaterialProperty; } -declare module "terriajs-cesium/Source/DataSources/StripeOrientation" { import { StripeOrientation } from 'terriajs-cesium'; export default StripeOrientation; } -declare module "terriajs-cesium/Source/DataSources/TimeIntervalCollectionPositionProperty" { import { TimeIntervalCollectionPositionProperty } from 'terriajs-cesium'; export default TimeIntervalCollectionPositionProperty; } -declare module "terriajs-cesium/Source/DataSources/TimeIntervalCollectionProperty" { import { TimeIntervalCollectionProperty } from 'terriajs-cesium'; export default TimeIntervalCollectionProperty; } -declare module "terriajs-cesium/Source/DataSources/VelocityOrientationProperty" { import { VelocityOrientationProperty } from 'terriajs-cesium'; export default VelocityOrientationProperty; } -declare module "terriajs-cesium/Source/DataSources/VelocityVectorProperty" { import { VelocityVectorProperty } from 'terriajs-cesium'; export default VelocityVectorProperty; } -declare module "terriajs-cesium/Source/DataSources/Visualizer" { import { Visualizer } from 'terriajs-cesium'; export default Visualizer; } -declare module "terriajs-cesium/Source/DataSources/WallGeometryUpdater" { import { WallGeometryUpdater } from 'terriajs-cesium'; export default WallGeometryUpdater; } -declare module "terriajs-cesium/Source/DataSources/WallGraphics" { import { WallGraphics } from 'terriajs-cesium'; export default WallGraphics; } -declare module "terriajs-cesium/Source/Renderer/PixelDatatype" { import { PixelDatatype } from 'terriajs-cesium'; export default PixelDatatype; } -declare module "terriajs-cesium/Source/Renderer/TextureMagnificationFilter" { import { TextureMagnificationFilter } from 'terriajs-cesium'; export default TextureMagnificationFilter; } -declare module "terriajs-cesium/Source/Renderer/TextureMinificationFilter" { import { TextureMinificationFilter } from 'terriajs-cesium'; export default TextureMinificationFilter; } -declare module "terriajs-cesium/Source/Scene/Appearance" { import { Appearance } from 'terriajs-cesium'; export default Appearance; } -declare module "terriajs-cesium/Source/Scene/ArcGisBaseMapType" { import { ArcGisBaseMapType } from 'terriajs-cesium'; export default ArcGisBaseMapType; } -declare module "terriajs-cesium/Source/Scene/ArcGisMapServerImageryProvider" { import { ArcGisMapServerImageryProvider } from 'terriajs-cesium'; export default ArcGisMapServerImageryProvider; } -declare module "terriajs-cesium/Source/Scene/ArcGisMapService" { import { ArcGisMapService } from 'terriajs-cesium'; export default ArcGisMapService; } -declare module "terriajs-cesium/Source/Scene/Axis" { import { Axis } from 'terriajs-cesium'; export default Axis; } -declare module "terriajs-cesium/Source/Scene/Billboard" { import { Billboard } from 'terriajs-cesium'; export default Billboard; } -declare module "terriajs-cesium/Source/Scene/BillboardCollection" { import { BillboardCollection } from 'terriajs-cesium'; export default BillboardCollection; } -declare module "terriajs-cesium/Source/Scene/BingMapsImageryProvider" { import { BingMapsImageryProvider } from 'terriajs-cesium'; export default BingMapsImageryProvider; } -declare module "terriajs-cesium/Source/Scene/BingMapsStyle" { import { BingMapsStyle } from 'terriajs-cesium'; export default BingMapsStyle; } -declare module "terriajs-cesium/Source/Scene/BlendEquation" { import { BlendEquation } from 'terriajs-cesium'; export default BlendEquation; } -declare module "terriajs-cesium/Source/Scene/BlendFunction" { import { BlendFunction } from 'terriajs-cesium'; export default BlendFunction; } -declare module "terriajs-cesium/Source/Scene/BlendingState" { import { BlendingState } from 'terriajs-cesium'; export default BlendingState; } -declare module "terriajs-cesium/Source/Scene/BlendOption" { import { BlendOption } from 'terriajs-cesium'; export default BlendOption; } -declare module "terriajs-cesium/Source/Scene/BoxEmitter" { import { BoxEmitter } from 'terriajs-cesium'; export default BoxEmitter; } -declare module "terriajs-cesium/Source/Scene/Camera" { import { Camera } from 'terriajs-cesium'; export default Camera; } -declare module "terriajs-cesium/Source/Scene/CameraEventAggregator" { import { CameraEventAggregator } from 'terriajs-cesium'; export default CameraEventAggregator; } -declare module "terriajs-cesium/Source/Scene/CameraEventType" { import { CameraEventType } from 'terriajs-cesium'; export default CameraEventType; } -declare module "terriajs-cesium/Source/Scene/Cesium3DTile" { import { Cesium3DTile } from 'terriajs-cesium'; export default Cesium3DTile; } -declare module "terriajs-cesium/Source/Scene/Cesium3DTileColorBlendMode" { import { Cesium3DTileColorBlendMode } from 'terriajs-cesium'; export default Cesium3DTileColorBlendMode; } -declare module "terriajs-cesium/Source/Scene/Cesium3DTileContent" { import { Cesium3DTileContent } from 'terriajs-cesium'; export default Cesium3DTileContent; } -declare module "terriajs-cesium/Source/Scene/Cesium3DTileFeature" { import { Cesium3DTileFeature } from 'terriajs-cesium'; export default Cesium3DTileFeature; } -declare module "terriajs-cesium/Source/Scene/Cesium3DTilePointFeature" { import { Cesium3DTilePointFeature } from 'terriajs-cesium'; export default Cesium3DTilePointFeature; } -declare module "terriajs-cesium/Source/Scene/Cesium3DTileset" { import { Cesium3DTileset } from 'terriajs-cesium'; export default Cesium3DTileset; } -declare module "terriajs-cesium/Source/Scene/Cesium3DTileStyle" { import { Cesium3DTileStyle } from 'terriajs-cesium'; export default Cesium3DTileStyle; } -declare module "terriajs-cesium/Source/Scene/Cesium3DTilesVoxelProvider" { import { Cesium3DTilesVoxelProvider } from 'terriajs-cesium'; export default Cesium3DTilesVoxelProvider; } -declare module "terriajs-cesium/Source/Scene/CircleEmitter" { import { CircleEmitter } from 'terriajs-cesium'; export default CircleEmitter; } -declare module "terriajs-cesium/Source/Scene/ClassificationPrimitive" { import { ClassificationPrimitive } from 'terriajs-cesium'; export default ClassificationPrimitive; } -declare module "terriajs-cesium/Source/Scene/ClassificationType" { import { ClassificationType } from 'terriajs-cesium'; export default ClassificationType; } -declare module "terriajs-cesium/Source/Scene/ClippingPlane" { import { ClippingPlane } from 'terriajs-cesium'; export default ClippingPlane; } -declare module "terriajs-cesium/Source/Scene/ClippingPlaneCollection" { import { ClippingPlaneCollection } from 'terriajs-cesium'; export default ClippingPlaneCollection; } -declare module "terriajs-cesium/Source/Scene/CloudCollection" { import { CloudCollection } from 'terriajs-cesium'; export default CloudCollection; } -declare module "terriajs-cesium/Source/Scene/CloudType" { import { CloudType } from 'terriajs-cesium'; export default CloudType; } -declare module "terriajs-cesium/Source/Scene/ColorBlendMode" { import { ColorBlendMode } from 'terriajs-cesium'; export default ColorBlendMode; } -declare module "terriajs-cesium/Source/Scene/ConditionsExpression" { import { ConditionsExpression } from 'terriajs-cesium'; export default ConditionsExpression; } -declare module "terriajs-cesium/Source/Scene/ConeEmitter" { import { ConeEmitter } from 'terriajs-cesium'; export default ConeEmitter; } -declare module "terriajs-cesium/Source/Scene/createElevationBandMaterial" { import { createElevationBandMaterial } from 'terriajs-cesium'; export default createElevationBandMaterial; } -declare module "terriajs-cesium/Source/Scene/createGooglePhotorealistic3DTileset" { import { createGooglePhotorealistic3DTileset } from 'terriajs-cesium'; export default createGooglePhotorealistic3DTileset; } -declare module "terriajs-cesium/Source/Scene/createOsmBuildingsAsync" { import { createOsmBuildingsAsync } from 'terriajs-cesium'; export default createOsmBuildingsAsync; } -declare module "terriajs-cesium/Source/Scene/createTangentSpaceDebugPrimitive" { import { createTangentSpaceDebugPrimitive } from 'terriajs-cesium'; export default createTangentSpaceDebugPrimitive; } -declare module "terriajs-cesium/Source/Scene/createWorldImageryAsync" { import { createWorldImageryAsync } from 'terriajs-cesium'; export default createWorldImageryAsync; } -declare module "terriajs-cesium/Source/Scene/CreditDisplay" { import { CreditDisplay } from 'terriajs-cesium'; export default CreditDisplay; } -declare module "terriajs-cesium/Source/Scene/CullFace" { import { CullFace } from 'terriajs-cesium'; export default CullFace; } -declare module "terriajs-cesium/Source/Scene/CumulusCloud" { import { CumulusCloud } from 'terriajs-cesium'; export default CumulusCloud; } -declare module "terriajs-cesium/Source/Scene/DebugAppearance" { import { DebugAppearance } from 'terriajs-cesium'; export default DebugAppearance; } -declare module "terriajs-cesium/Source/Scene/DebugCameraPrimitive" { import { DebugCameraPrimitive } from 'terriajs-cesium'; export default DebugCameraPrimitive; } -declare module "terriajs-cesium/Source/Scene/DebugModelMatrixPrimitive" { import { DebugModelMatrixPrimitive } from 'terriajs-cesium'; export default DebugModelMatrixPrimitive; } -declare module "terriajs-cesium/Source/Scene/DepthFunction" { import { DepthFunction } from 'terriajs-cesium'; export default DepthFunction; } -declare module "terriajs-cesium/Source/Scene/DirectionalLight" { import { DirectionalLight } from 'terriajs-cesium'; export default DirectionalLight; } -declare module "terriajs-cesium/Source/Scene/DiscardEmptyTileImagePolicy" { import { DiscardEmptyTileImagePolicy } from 'terriajs-cesium'; export default DiscardEmptyTileImagePolicy; } -declare module "terriajs-cesium/Source/Scene/DiscardMissingTileImagePolicy" { import { DiscardMissingTileImagePolicy } from 'terriajs-cesium'; export default DiscardMissingTileImagePolicy; } -declare module "terriajs-cesium/Source/Scene/EllipsoidSurfaceAppearance" { import { EllipsoidSurfaceAppearance } from 'terriajs-cesium'; export default EllipsoidSurfaceAppearance; } -declare module "terriajs-cesium/Source/Scene/Expression" { import { Expression } from 'terriajs-cesium'; export default Expression; } -declare module "terriajs-cesium/Source/Scene/Fog" { import { Fog } from 'terriajs-cesium'; export default Fog; } -declare module "terriajs-cesium/Source/Scene/FrameRateMonitor" { import { FrameRateMonitor } from 'terriajs-cesium'; export default FrameRateMonitor; } -declare module "terriajs-cesium/Source/Scene/GetFeatureInfoFormat" { import { GetFeatureInfoFormat } from 'terriajs-cesium'; export default GetFeatureInfoFormat; } -declare module "terriajs-cesium/Source/Scene/Globe" { import { Globe } from 'terriajs-cesium'; export default Globe; } -declare module "terriajs-cesium/Source/Scene/GlobeTranslucency" { import { GlobeTranslucency } from 'terriajs-cesium'; export default GlobeTranslucency; } -declare module "terriajs-cesium/Source/Scene/GltfPipeline/removeExtension" { import { removeExtension } from 'terriajs-cesium'; export default removeExtension; } -declare module "terriajs-cesium/Source/Scene/GoogleEarthEnterpriseImageryProvider" { import { GoogleEarthEnterpriseImageryProvider } from 'terriajs-cesium'; export default GoogleEarthEnterpriseImageryProvider; } -declare module "terriajs-cesium/Source/Scene/GoogleEarthEnterpriseMapsProvider" { import { GoogleEarthEnterpriseMapsProvider } from 'terriajs-cesium'; export default GoogleEarthEnterpriseMapsProvider; } -declare module "terriajs-cesium/Source/Scene/GridImageryProvider" { import { GridImageryProvider } from 'terriajs-cesium'; export default GridImageryProvider; } -declare module "terriajs-cesium/Source/Scene/GroundPolylinePrimitive" { import { GroundPolylinePrimitive } from 'terriajs-cesium'; export default GroundPolylinePrimitive; } -declare module "terriajs-cesium/Source/Scene/GroundPrimitive" { import { GroundPrimitive } from 'terriajs-cesium'; export default GroundPrimitive; } -declare module "terriajs-cesium/Source/Scene/HeightReference" { import { HeightReference } from 'terriajs-cesium'; export default HeightReference; } -declare module "terriajs-cesium/Source/Scene/HorizontalOrigin" { import { HorizontalOrigin } from 'terriajs-cesium'; export default HorizontalOrigin; } -declare module "terriajs-cesium/Source/Scene/I3SDataProvider" { import { I3SDataProvider } from 'terriajs-cesium'; export default I3SDataProvider; } -declare module "terriajs-cesium/Source/Scene/I3SFeature" { import { I3SFeature } from 'terriajs-cesium'; export default I3SFeature; } -declare module "terriajs-cesium/Source/Scene/I3SField" { import { I3SField } from 'terriajs-cesium'; export default I3SField; } -declare module "terriajs-cesium/Source/Scene/I3SGeometry" { import { I3SGeometry } from 'terriajs-cesium'; export default I3SGeometry; } -declare module "terriajs-cesium/Source/Scene/I3SLayer" { import { I3SLayer } from 'terriajs-cesium'; export default I3SLayer; } -declare module "terriajs-cesium/Source/Scene/I3SNode" { import { I3SNode } from 'terriajs-cesium'; export default I3SNode; } -declare module "terriajs-cesium/Source/Scene/ImageBasedLighting" { import { ImageBasedLighting } from 'terriajs-cesium'; export default ImageBasedLighting; } -declare module "terriajs-cesium/Source/Scene/ImageryLayer" { import { ImageryLayer } from 'terriajs-cesium'; export default ImageryLayer; } -declare module "terriajs-cesium/Source/Scene/ImageryLayerCollection" { import { ImageryLayerCollection } from 'terriajs-cesium'; export default ImageryLayerCollection; } -declare module "terriajs-cesium/Source/Scene/ImageryLayerFeatureInfo" { import { ImageryLayerFeatureInfo } from 'terriajs-cesium'; export default ImageryLayerFeatureInfo; } -declare module "terriajs-cesium/Source/Scene/ImageryProvider" { import { ImageryProvider } from 'terriajs-cesium'; export default ImageryProvider; } -declare module "terriajs-cesium/Source/Scene/IonImageryProvider" { import { IonImageryProvider } from 'terriajs-cesium'; export default IonImageryProvider; } -declare module "terriajs-cesium/Source/Scene/IonWorldImageryStyle" { import { IonWorldImageryStyle } from 'terriajs-cesium'; export default IonWorldImageryStyle; } -declare module "terriajs-cesium/Source/Scene/Label" { import { Label } from 'terriajs-cesium'; export default Label; } -declare module "terriajs-cesium/Source/Scene/LabelCollection" { import { LabelCollection } from 'terriajs-cesium'; export default LabelCollection; } -declare module "terriajs-cesium/Source/Scene/LabelStyle" { import { LabelStyle } from 'terriajs-cesium'; export default LabelStyle; } -declare module "terriajs-cesium/Source/Scene/Light" { import { Light } from 'terriajs-cesium'; export default Light; } -declare module "terriajs-cesium/Source/Scene/MapboxImageryProvider" { import { MapboxImageryProvider } from 'terriajs-cesium'; export default MapboxImageryProvider; } -declare module "terriajs-cesium/Source/Scene/MapboxStyleImageryProvider" { import { MapboxStyleImageryProvider } from 'terriajs-cesium'; export default MapboxStyleImageryProvider; } -declare module "terriajs-cesium/Source/Scene/MapMode2D" { import { MapMode2D } from 'terriajs-cesium'; export default MapMode2D; } -declare module "terriajs-cesium/Source/Scene/Material" { import { Material } from 'terriajs-cesium'; export default Material; } -declare module "terriajs-cesium/Source/Scene/MaterialAppearance" { import { MaterialAppearance } from 'terriajs-cesium'; export default MaterialAppearance; } -declare module "terriajs-cesium/Source/Scene/MetadataClass" { import { MetadataClass } from 'terriajs-cesium'; export default MetadataClass; } -declare module "terriajs-cesium/Source/Scene/MetadataClassProperty" { import { MetadataClassProperty } from 'terriajs-cesium'; export default MetadataClassProperty; } -declare module "terriajs-cesium/Source/Scene/MetadataComponentType" { import { MetadataComponentType } from 'terriajs-cesium'; export default MetadataComponentType; } -declare module "terriajs-cesium/Source/Scene/MetadataEnum" { import { MetadataEnum } from 'terriajs-cesium'; export default MetadataEnum; } -declare module "terriajs-cesium/Source/Scene/MetadataEnumValue" { import { MetadataEnumValue } from 'terriajs-cesium'; export default MetadataEnumValue; } -declare module "terriajs-cesium/Source/Scene/MetadataSchema" { import { MetadataSchema } from 'terriajs-cesium'; export default MetadataSchema; } -declare module "terriajs-cesium/Source/Scene/MetadataType" { import { MetadataType } from 'terriajs-cesium'; export default MetadataType; } -declare module "terriajs-cesium/Source/Scene/Model/CustomShader" { import { CustomShader } from 'terriajs-cesium'; export default CustomShader; } -declare module "terriajs-cesium/Source/Scene/Model/CustomShaderMode" { import { CustomShaderMode } from 'terriajs-cesium'; export default CustomShaderMode; } -declare module "terriajs-cesium/Source/Scene/Model/CustomShaderTranslucencyMode" { import { CustomShaderTranslucencyMode } from 'terriajs-cesium'; export default CustomShaderTranslucencyMode; } -declare module "terriajs-cesium/Source/Scene/Model/LightingModel" { import { LightingModel } from 'terriajs-cesium'; export default LightingModel; } -declare module "terriajs-cesium/Source/Scene/Model/Model" { import { Model } from 'terriajs-cesium'; export default Model; } -declare module "terriajs-cesium/Source/Scene/Model/ModelAnimation" { import { ModelAnimation } from 'terriajs-cesium'; export default ModelAnimation; } -declare module "terriajs-cesium/Source/Scene/Model/ModelAnimationCollection" { import { ModelAnimationCollection } from 'terriajs-cesium'; export default ModelAnimationCollection; } -declare module "terriajs-cesium/Source/Scene/Model/ModelFeature" { import { ModelFeature } from 'terriajs-cesium'; export default ModelFeature; } -declare module "terriajs-cesium/Source/Scene/Model/ModelNode" { import { ModelNode } from 'terriajs-cesium'; export default ModelNode; } -declare module "terriajs-cesium/Source/Scene/Model/TextureUniform" { import { TextureUniform } from 'terriajs-cesium'; export default TextureUniform; } -declare module "terriajs-cesium/Source/Scene/Model/UniformType" { import { UniformType } from 'terriajs-cesium'; export default UniformType; } -declare module "terriajs-cesium/Source/Scene/Model/VaryingType" { import { VaryingType } from 'terriajs-cesium'; export default VaryingType; } -declare module "terriajs-cesium/Source/Scene/ModelAnimationLoop" { import { ModelAnimationLoop } from 'terriajs-cesium'; export default ModelAnimationLoop; } -declare module "terriajs-cesium/Source/Scene/Moon" { import { Moon } from 'terriajs-cesium'; export default Moon; } -declare module "terriajs-cesium/Source/Scene/NeverTileDiscardPolicy" { import { NeverTileDiscardPolicy } from 'terriajs-cesium'; export default NeverTileDiscardPolicy; } -declare module "terriajs-cesium/Source/Scene/OpenStreetMapImageryProvider" { import { OpenStreetMapImageryProvider } from 'terriajs-cesium'; export default OpenStreetMapImageryProvider; } -declare module "terriajs-cesium/Source/Scene/Particle" { import { Particle } from 'terriajs-cesium'; export default Particle; } -declare module "terriajs-cesium/Source/Scene/ParticleBurst" { import { ParticleBurst } from 'terriajs-cesium'; export default ParticleBurst; } -declare module "terriajs-cesium/Source/Scene/ParticleEmitter" { import { ParticleEmitter } from 'terriajs-cesium'; export default ParticleEmitter; } -declare module "terriajs-cesium/Source/Scene/ParticleSystem" { import { ParticleSystem } from 'terriajs-cesium'; export default ParticleSystem; } -declare module "terriajs-cesium/Source/Scene/PerInstanceColorAppearance" { import { PerInstanceColorAppearance } from 'terriajs-cesium'; export default PerInstanceColorAppearance; } -declare module "terriajs-cesium/Source/Scene/PointCloudShading" { import { PointCloudShading } from 'terriajs-cesium'; export default PointCloudShading; } -declare module "terriajs-cesium/Source/Scene/PointPrimitive" { import { PointPrimitive } from 'terriajs-cesium'; export default PointPrimitive; } -declare module "terriajs-cesium/Source/Scene/PointPrimitiveCollection" { import { PointPrimitiveCollection } from 'terriajs-cesium'; export default PointPrimitiveCollection; } -declare module "terriajs-cesium/Source/Scene/Polyline" { import { Polyline } from 'terriajs-cesium'; export default Polyline; } -declare module "terriajs-cesium/Source/Scene/PolylineCollection" { import { PolylineCollection } from 'terriajs-cesium'; export default PolylineCollection; } -declare module "terriajs-cesium/Source/Scene/PolylineColorAppearance" { import { PolylineColorAppearance } from 'terriajs-cesium'; export default PolylineColorAppearance; } -declare module "terriajs-cesium/Source/Scene/PolylineMaterialAppearance" { import { PolylineMaterialAppearance } from 'terriajs-cesium'; export default PolylineMaterialAppearance; } -declare module "terriajs-cesium/Source/Scene/PostProcessStage" { import { PostProcessStage } from 'terriajs-cesium'; export default PostProcessStage; } -declare module "terriajs-cesium/Source/Scene/PostProcessStageCollection" { import { PostProcessStageCollection } from 'terriajs-cesium'; export default PostProcessStageCollection; } -declare module "terriajs-cesium/Source/Scene/PostProcessStageComposite" { import { PostProcessStageComposite } from 'terriajs-cesium'; export default PostProcessStageComposite; } -declare module "terriajs-cesium/Source/Scene/PostProcessStageLibrary" { import { PostProcessStageLibrary } from 'terriajs-cesium'; export default PostProcessStageLibrary; } -declare module "terriajs-cesium/Source/Scene/PostProcessStageSampleMode" { import { PostProcessStageSampleMode } from 'terriajs-cesium'; export default PostProcessStageSampleMode; } -declare module "terriajs-cesium/Source/Scene/Primitive" { import { Primitive } from 'terriajs-cesium'; export default Primitive; } -declare module "terriajs-cesium/Source/Scene/PrimitiveCollection" { import { PrimitiveCollection } from 'terriajs-cesium'; export default PrimitiveCollection; } -declare module "terriajs-cesium/Source/Scene/Scene" { import { Scene } from 'terriajs-cesium'; export default Scene; } -declare module "terriajs-cesium/Source/Scene/SceneMode" { import { SceneMode } from 'terriajs-cesium'; export default SceneMode; } -declare module "terriajs-cesium/Source/Scene/SceneTransforms" { import { SceneTransforms } from 'terriajs-cesium'; export default SceneTransforms; } -declare module "terriajs-cesium/Source/Scene/ScreenSpaceCameraController" { import { ScreenSpaceCameraController } from 'terriajs-cesium'; export default ScreenSpaceCameraController; } -declare module "terriajs-cesium/Source/Scene/ShadowMap" { import { ShadowMap } from 'terriajs-cesium'; export default ShadowMap; } -declare module "terriajs-cesium/Source/Scene/ShadowMode" { import { ShadowMode } from 'terriajs-cesium'; export default ShadowMode; } -declare module "terriajs-cesium/Source/Scene/SingleTileImageryProvider" { import { SingleTileImageryProvider } from 'terriajs-cesium'; export default SingleTileImageryProvider; } -declare module "terriajs-cesium/Source/Scene/SkyAtmosphere" { import { SkyAtmosphere } from 'terriajs-cesium'; export default SkyAtmosphere; } -declare module "terriajs-cesium/Source/Scene/SkyBox" { import { SkyBox } from 'terriajs-cesium'; export default SkyBox; } -declare module "terriajs-cesium/Source/Scene/SphereEmitter" { import { SphereEmitter } from 'terriajs-cesium'; export default SphereEmitter; } -declare module "terriajs-cesium/Source/Scene/SplitDirection" { import { SplitDirection } from 'terriajs-cesium'; export default SplitDirection; } -declare module "terriajs-cesium/Source/Scene/StencilFunction" { import { StencilFunction } from 'terriajs-cesium'; export default StencilFunction; } -declare module "terriajs-cesium/Source/Scene/StencilOperation" { import { StencilOperation } from 'terriajs-cesium'; export default StencilOperation; } -declare module "terriajs-cesium/Source/Scene/StyleExpression" { import { StyleExpression } from 'terriajs-cesium'; export default StyleExpression; } -declare module "terriajs-cesium/Source/Scene/Sun" { import { Sun } from 'terriajs-cesium'; export default Sun; } -declare module "terriajs-cesium/Source/Scene/SunLight" { import { SunLight } from 'terriajs-cesium'; export default SunLight; } -declare module "terriajs-cesium/Source/Scene/Terrain" { import { Terrain } from 'terriajs-cesium'; export default Terrain; } -declare module "terriajs-cesium/Source/Scene/TileCoordinatesImageryProvider" { import { TileCoordinatesImageryProvider } from 'terriajs-cesium'; export default TileCoordinatesImageryProvider; } -declare module "terriajs-cesium/Source/Scene/TileDiscardPolicy" { import { TileDiscardPolicy } from 'terriajs-cesium'; export default TileDiscardPolicy; } -declare module "terriajs-cesium/Source/Scene/TileMapServiceImageryProvider" { import { TileMapServiceImageryProvider } from 'terriajs-cesium'; export default TileMapServiceImageryProvider; } -declare module "terriajs-cesium/Source/Scene/TimeDynamicImagery" { import { TimeDynamicImagery } from 'terriajs-cesium'; export default TimeDynamicImagery; } -declare module "terriajs-cesium/Source/Scene/TimeDynamicPointCloud" { import { TimeDynamicPointCloud } from 'terriajs-cesium'; export default TimeDynamicPointCloud; } -declare module "terriajs-cesium/Source/Scene/UrlTemplateImageryProvider" { import { UrlTemplateImageryProvider } from 'terriajs-cesium'; export default UrlTemplateImageryProvider; } -declare module "terriajs-cesium/Source/Scene/VerticalOrigin" { import { VerticalOrigin } from 'terriajs-cesium'; export default VerticalOrigin; } -declare module "terriajs-cesium/Source/Scene/ViewportQuad" { import { ViewportQuad } from 'terriajs-cesium'; export default ViewportQuad; } -declare module "terriajs-cesium/Source/Scene/VoxelPrimitive" { import { VoxelPrimitive } from 'terriajs-cesium'; export default VoxelPrimitive; } -declare module "terriajs-cesium/Source/Scene/VoxelProvider" { import { VoxelProvider } from 'terriajs-cesium'; export default VoxelProvider; } -declare module "terriajs-cesium/Source/Scene/VoxelShapeType" { import { VoxelShapeType } from 'terriajs-cesium'; export default VoxelShapeType; } -declare module "terriajs-cesium/Source/Scene/WebMapServiceImageryProvider" { import { WebMapServiceImageryProvider } from 'terriajs-cesium'; export default WebMapServiceImageryProvider; } -declare module "terriajs-cesium/Source/Scene/WebMapTileServiceImageryProvider" { import { WebMapTileServiceImageryProvider } from 'terriajs-cesium'; export default WebMapTileServiceImageryProvider; } -declare module "terriajs-cesium/Source/Widget/CesiumWidget" { import { CesiumWidget } from 'terriajs-cesium'; export default CesiumWidget; } +declare module "terriajs-cesium/Source/Core/ArcGISTiledElevationTerrainProvider" { + import { ArcGISTiledElevationTerrainProvider } from "terriajs-cesium"; + export default ArcGISTiledElevationTerrainProvider; +} +declare module "terriajs-cesium/Source/Core/ArcType" { + import { ArcType } from "terriajs-cesium"; + export default ArcType; +} +declare module "terriajs-cesium/Source/Core/AssociativeArray" { + import { AssociativeArray } from "terriajs-cesium"; + export default AssociativeArray; +} +declare module "terriajs-cesium/Source/Core/AxisAlignedBoundingBox" { + import { AxisAlignedBoundingBox } from "terriajs-cesium"; + export default AxisAlignedBoundingBox; +} +declare module "terriajs-cesium/Source/Core/barycentricCoordinates" { + import { barycentricCoordinates } from "terriajs-cesium"; + export default barycentricCoordinates; +} +declare module "terriajs-cesium/Source/Core/binarySearch" { + import { binarySearch } from "terriajs-cesium"; + export default binarySearch; +} +declare module "terriajs-cesium/Source/Core/BingMapsGeocoderService" { + import { BingMapsGeocoderService } from "terriajs-cesium"; + export default BingMapsGeocoderService; +} +declare module "terriajs-cesium/Source/Core/BoundingRectangle" { + import { BoundingRectangle } from "terriajs-cesium"; + export default BoundingRectangle; +} +declare module "terriajs-cesium/Source/Core/BoundingSphere" { + import { BoundingSphere } from "terriajs-cesium"; + export default BoundingSphere; +} +declare module "terriajs-cesium/Source/Core/BoxGeometry" { + import { BoxGeometry } from "terriajs-cesium"; + export default BoxGeometry; +} +declare module "terriajs-cesium/Source/Core/BoxOutlineGeometry" { + import { BoxOutlineGeometry } from "terriajs-cesium"; + export default BoxOutlineGeometry; +} +declare module "terriajs-cesium/Source/Core/buildModuleUrl" { + import { buildModuleUrl } from "terriajs-cesium"; + export default buildModuleUrl; +} +declare module "terriajs-cesium/Source/Core/Cartesian2" { + import { Cartesian2 } from "terriajs-cesium"; + export default Cartesian2; +} +declare module "terriajs-cesium/Source/Core/Cartesian3" { + import { Cartesian3 } from "terriajs-cesium"; + export default Cartesian3; +} +declare module "terriajs-cesium/Source/Core/Cartesian4" { + import { Cartesian4 } from "terriajs-cesium"; + export default Cartesian4; +} +declare module "terriajs-cesium/Source/Core/Cartographic" { + import { Cartographic } from "terriajs-cesium"; + export default Cartographic; +} +declare module "terriajs-cesium/Source/Core/CartographicGeocoderService" { + import { CartographicGeocoderService } from "terriajs-cesium"; + export default CartographicGeocoderService; +} +declare module "terriajs-cesium/Source/Core/CatmullRomSpline" { + import { CatmullRomSpline } from "terriajs-cesium"; + export default CatmullRomSpline; +} +declare module "terriajs-cesium/Source/Core/CesiumTerrainProvider" { + import { CesiumTerrainProvider } from "terriajs-cesium"; + export default CesiumTerrainProvider; +} +declare module "terriajs-cesium/Source/Core/CircleGeometry" { + import { CircleGeometry } from "terriajs-cesium"; + export default CircleGeometry; +} +declare module "terriajs-cesium/Source/Core/CircleOutlineGeometry" { + import { CircleOutlineGeometry } from "terriajs-cesium"; + export default CircleOutlineGeometry; +} +declare module "terriajs-cesium/Source/Core/Clock" { + import { Clock } from "terriajs-cesium"; + export default Clock; +} +declare module "terriajs-cesium/Source/Core/ClockRange" { + import { ClockRange } from "terriajs-cesium"; + export default ClockRange; +} +declare module "terriajs-cesium/Source/Core/ClockStep" { + import { ClockStep } from "terriajs-cesium"; + export default ClockStep; +} +declare module "terriajs-cesium/Source/Core/clone" { + import { clone } from "terriajs-cesium"; + export default clone; +} +declare module "terriajs-cesium/Source/Core/Color" { + import { Color } from "terriajs-cesium"; + export default Color; +} +declare module "terriajs-cesium/Source/Core/ColorGeometryInstanceAttribute" { + import { ColorGeometryInstanceAttribute } from "terriajs-cesium"; + export default ColorGeometryInstanceAttribute; +} +declare module "terriajs-cesium/Source/Core/combine" { + import { combine } from "terriajs-cesium"; + export default combine; +} +declare module "terriajs-cesium/Source/Core/ComponentDatatype" { + import { ComponentDatatype } from "terriajs-cesium"; + export default ComponentDatatype; +} +declare module "terriajs-cesium/Source/Core/CompressedTextureBuffer" { + import { CompressedTextureBuffer } from "terriajs-cesium"; + export default CompressedTextureBuffer; +} +declare module "terriajs-cesium/Source/Core/ConstantSpline" { + import { ConstantSpline } from "terriajs-cesium"; + export default ConstantSpline; +} +declare module "terriajs-cesium/Source/Core/CoplanarPolygonGeometry" { + import { CoplanarPolygonGeometry } from "terriajs-cesium"; + export default CoplanarPolygonGeometry; +} +declare module "terriajs-cesium/Source/Core/CoplanarPolygonOutlineGeometry" { + import { CoplanarPolygonOutlineGeometry } from "terriajs-cesium"; + export default CoplanarPolygonOutlineGeometry; +} +declare module "terriajs-cesium/Source/Core/CornerType" { + import { CornerType } from "terriajs-cesium"; + export default CornerType; +} +declare module "terriajs-cesium/Source/Core/CorridorGeometry" { + import { CorridorGeometry } from "terriajs-cesium"; + export default CorridorGeometry; +} +declare module "terriajs-cesium/Source/Core/CorridorOutlineGeometry" { + import { CorridorOutlineGeometry } from "terriajs-cesium"; + export default CorridorOutlineGeometry; +} +declare module "terriajs-cesium/Source/Core/createGuid" { + import { createGuid } from "terriajs-cesium"; + export default createGuid; +} +declare module "terriajs-cesium/Source/Core/createWorldTerrainAsync" { + import { createWorldTerrainAsync } from "terriajs-cesium"; + export default createWorldTerrainAsync; +} +declare module "terriajs-cesium/Source/Core/Credit" { + import { Credit } from "terriajs-cesium"; + export default Credit; +} +declare module "terriajs-cesium/Source/Core/CubicRealPolynomial" { + import { CubicRealPolynomial } from "terriajs-cesium"; + export default CubicRealPolynomial; +} +declare module "terriajs-cesium/Source/Core/CullingVolume" { + import { CullingVolume } from "terriajs-cesium"; + export default CullingVolume; +} +declare module "terriajs-cesium/Source/Core/CustomHeightmapTerrainProvider" { + import { CustomHeightmapTerrainProvider } from "terriajs-cesium"; + export default CustomHeightmapTerrainProvider; +} +declare module "terriajs-cesium/Source/Core/CylinderGeometry" { + import { CylinderGeometry } from "terriajs-cesium"; + export default CylinderGeometry; +} +declare module "terriajs-cesium/Source/Core/CylinderOutlineGeometry" { + import { CylinderOutlineGeometry } from "terriajs-cesium"; + export default CylinderOutlineGeometry; +} +declare module "terriajs-cesium/Source/Core/DefaultProxy" { + import { DefaultProxy } from "terriajs-cesium"; + export default DefaultProxy; +} +declare module "terriajs-cesium/Source/Core/defaultValue" { + import { defaultValue } from "terriajs-cesium"; + export default defaultValue; +} +declare module "terriajs-cesium/Source/Core/defined" { + import { defined } from "terriajs-cesium"; + export default defined; +} +declare module "terriajs-cesium/Source/Core/destroyObject" { + import { destroyObject } from "terriajs-cesium"; + export default destroyObject; +} +declare module "terriajs-cesium/Source/Core/DeveloperError" { + import { DeveloperError } from "terriajs-cesium"; + export default DeveloperError; +} +declare module "terriajs-cesium/Source/Core/DistanceDisplayCondition" { + import { DistanceDisplayCondition } from "terriajs-cesium"; + export default DistanceDisplayCondition; +} +declare module "terriajs-cesium/Source/Core/DistanceDisplayConditionGeometryInstanceAttribute" { + import { DistanceDisplayConditionGeometryInstanceAttribute } from "terriajs-cesium"; + export default DistanceDisplayConditionGeometryInstanceAttribute; +} +declare module "terriajs-cesium/Source/Core/EasingFunction" { + import { EasingFunction } from "terriajs-cesium"; + export default EasingFunction; +} +declare module "terriajs-cesium/Source/Core/EllipseGeometry" { + import { EllipseGeometry } from "terriajs-cesium"; + export default EllipseGeometry; +} +declare module "terriajs-cesium/Source/Core/EllipseOutlineGeometry" { + import { EllipseOutlineGeometry } from "terriajs-cesium"; + export default EllipseOutlineGeometry; +} +declare module "terriajs-cesium/Source/Core/Ellipsoid" { + import { Ellipsoid } from "terriajs-cesium"; + export default Ellipsoid; +} +declare module "terriajs-cesium/Source/Core/EllipsoidGeodesic" { + import { EllipsoidGeodesic } from "terriajs-cesium"; + export default EllipsoidGeodesic; +} +declare module "terriajs-cesium/Source/Core/EllipsoidGeometry" { + import { EllipsoidGeometry } from "terriajs-cesium"; + export default EllipsoidGeometry; +} +declare module "terriajs-cesium/Source/Core/EllipsoidOutlineGeometry" { + import { EllipsoidOutlineGeometry } from "terriajs-cesium"; + export default EllipsoidOutlineGeometry; +} +declare module "terriajs-cesium/Source/Core/EllipsoidRhumbLine" { + import { EllipsoidRhumbLine } from "terriajs-cesium"; + export default EllipsoidRhumbLine; +} +declare module "terriajs-cesium/Source/Core/EllipsoidTangentPlane" { + import { EllipsoidTangentPlane } from "terriajs-cesium"; + export default EllipsoidTangentPlane; +} +declare module "terriajs-cesium/Source/Core/EllipsoidTerrainProvider" { + import { EllipsoidTerrainProvider } from "terriajs-cesium"; + export default EllipsoidTerrainProvider; +} +declare module "terriajs-cesium/Source/Core/Event" { + import { Event } from "terriajs-cesium"; + export default Event; +} +declare module "terriajs-cesium/Source/Core/EventHelper" { + import { EventHelper } from "terriajs-cesium"; + export default EventHelper; +} +declare module "terriajs-cesium/Source/Core/ExtrapolationType" { + import { ExtrapolationType } from "terriajs-cesium"; + export default ExtrapolationType; +} +declare module "terriajs-cesium/Source/Core/FeatureDetection" { + import { FeatureDetection } from "terriajs-cesium"; + export default FeatureDetection; +} +declare module "terriajs-cesium/Source/Core/formatError" { + import { formatError } from "terriajs-cesium"; + export default formatError; +} +declare module "terriajs-cesium/Source/Core/FrustumGeometry" { + import { FrustumGeometry } from "terriajs-cesium"; + export default FrustumGeometry; +} +declare module "terriajs-cesium/Source/Core/FrustumOutlineGeometry" { + import { FrustumOutlineGeometry } from "terriajs-cesium"; + export default FrustumOutlineGeometry; +} +declare module "terriajs-cesium/Source/Core/Fullscreen" { + import { Fullscreen } from "terriajs-cesium"; + export default Fullscreen; +} +declare module "terriajs-cesium/Source/Core/GeocoderService" { + import { GeocoderService } from "terriajs-cesium"; + export default GeocoderService; +} +declare module "terriajs-cesium/Source/Core/GeocodeType" { + import { GeocodeType } from "terriajs-cesium"; + export default GeocodeType; +} +declare module "terriajs-cesium/Source/Core/GeographicProjection" { + import { GeographicProjection } from "terriajs-cesium"; + export default GeographicProjection; +} +declare module "terriajs-cesium/Source/Core/GeographicTilingScheme" { + import { GeographicTilingScheme } from "terriajs-cesium"; + export default GeographicTilingScheme; +} +declare module "terriajs-cesium/Source/Core/Geometry" { + import { Geometry } from "terriajs-cesium"; + export default Geometry; +} +declare module "terriajs-cesium/Source/Core/GeometryAttribute" { + import { GeometryAttribute } from "terriajs-cesium"; + export default GeometryAttribute; +} +declare module "terriajs-cesium/Source/Core/GeometryAttributes" { + import { GeometryAttributes } from "terriajs-cesium"; + export default GeometryAttributes; +} +declare module "terriajs-cesium/Source/Core/GeometryFactory" { + import { GeometryFactory } from "terriajs-cesium"; + export default GeometryFactory; +} +declare module "terriajs-cesium/Source/Core/GeometryInstance" { + import { GeometryInstance } from "terriajs-cesium"; + export default GeometryInstance; +} +declare module "terriajs-cesium/Source/Core/GeometryInstanceAttribute" { + import { GeometryInstanceAttribute } from "terriajs-cesium"; + export default GeometryInstanceAttribute; +} +declare module "terriajs-cesium/Source/Core/GeometryPipeline" { + import { GeometryPipeline } from "terriajs-cesium"; + export default GeometryPipeline; +} +declare module "terriajs-cesium/Source/Core/getAbsoluteUri" { + import { getAbsoluteUri } from "terriajs-cesium"; + export default getAbsoluteUri; +} +declare module "terriajs-cesium/Source/Core/getBaseUri" { + import { getBaseUri } from "terriajs-cesium"; + export default getBaseUri; +} +declare module "terriajs-cesium/Source/Core/getExtensionFromUri" { + import { getExtensionFromUri } from "terriajs-cesium"; + export default getExtensionFromUri; +} +declare module "terriajs-cesium/Source/Core/getFilenameFromUri" { + import { getFilenameFromUri } from "terriajs-cesium"; + export default getFilenameFromUri; +} +declare module "terriajs-cesium/Source/Core/getImagePixels" { + import { getImagePixels } from "terriajs-cesium"; + export default getImagePixels; +} +declare module "terriajs-cesium/Source/Core/getTimestamp" { + import { getTimestamp } from "terriajs-cesium"; + export default getTimestamp; +} +declare module "terriajs-cesium/Source/Core/GoogleEarthEnterpriseMetadata" { + import { GoogleEarthEnterpriseMetadata } from "terriajs-cesium"; + export default GoogleEarthEnterpriseMetadata; +} +declare module "terriajs-cesium/Source/Core/GoogleEarthEnterpriseTerrainData" { + import { GoogleEarthEnterpriseTerrainData } from "terriajs-cesium"; + export default GoogleEarthEnterpriseTerrainData; +} +declare module "terriajs-cesium/Source/Core/GoogleEarthEnterpriseTerrainProvider" { + import { GoogleEarthEnterpriseTerrainProvider } from "terriajs-cesium"; + export default GoogleEarthEnterpriseTerrainProvider; +} +declare module "terriajs-cesium/Source/Core/GoogleMaps" { + import { GoogleMaps } from "terriajs-cesium"; + export default GoogleMaps; +} +declare module "terriajs-cesium/Source/Core/GregorianDate" { + import { GregorianDate } from "terriajs-cesium"; + export default GregorianDate; +} +declare module "terriajs-cesium/Source/Core/GroundPolylineGeometry" { + import { GroundPolylineGeometry } from "terriajs-cesium"; + export default GroundPolylineGeometry; +} +declare module "terriajs-cesium/Source/Core/HeadingPitchRange" { + import { HeadingPitchRange } from "terriajs-cesium"; + export default HeadingPitchRange; +} +declare module "terriajs-cesium/Source/Core/HeadingPitchRoll" { + import { HeadingPitchRoll } from "terriajs-cesium"; + export default HeadingPitchRoll; +} +declare module "terriajs-cesium/Source/Core/HeightmapEncoding" { + import { HeightmapEncoding } from "terriajs-cesium"; + export default HeightmapEncoding; +} +declare module "terriajs-cesium/Source/Core/HeightmapTerrainData" { + import { HeightmapTerrainData } from "terriajs-cesium"; + export default HeightmapTerrainData; +} +declare module "terriajs-cesium/Source/Core/HermitePolynomialApproximation" { + import { HermitePolynomialApproximation } from "terriajs-cesium"; + export default HermitePolynomialApproximation; +} +declare module "terriajs-cesium/Source/Core/HermiteSpline" { + import { HermiteSpline } from "terriajs-cesium"; + export default HermiteSpline; +} +declare module "terriajs-cesium/Source/Core/HilbertOrder" { + import { HilbertOrder } from "terriajs-cesium"; + export default HilbertOrder; +} +declare module "terriajs-cesium/Source/Core/IndexDatatype" { + import { IndexDatatype } from "terriajs-cesium"; + export default IndexDatatype; +} +declare module "terriajs-cesium/Source/Core/InterpolationAlgorithm" { + import { InterpolationAlgorithm } from "terriajs-cesium"; + export default InterpolationAlgorithm; +} +declare module "terriajs-cesium/Source/Core/Intersect" { + import { Intersect } from "terriajs-cesium"; + export default Intersect; +} +declare module "terriajs-cesium/Source/Core/Intersections2D" { + import { Intersections2D } from "terriajs-cesium"; + export default Intersections2D; +} +declare module "terriajs-cesium/Source/Core/IntersectionTests" { + import { IntersectionTests } from "terriajs-cesium"; + export default IntersectionTests; +} +declare module "terriajs-cesium/Source/Core/Interval" { + import { Interval } from "terriajs-cesium"; + export default Interval; +} +declare module "terriajs-cesium/Source/Core/Ion" { + import { Ion } from "terriajs-cesium"; + export default Ion; +} +declare module "terriajs-cesium/Source/Core/IonGeocoderService" { + import { IonGeocoderService } from "terriajs-cesium"; + export default IonGeocoderService; +} +declare module "terriajs-cesium/Source/Core/IonResource" { + import { IonResource } from "terriajs-cesium"; + export default IonResource; +} +declare module "terriajs-cesium/Source/Core/isLeapYear" { + import { isLeapYear } from "terriajs-cesium"; + export default isLeapYear; +} +declare module "terriajs-cesium/Source/Core/Iso8601" { + import { Iso8601 } from "terriajs-cesium"; + export default Iso8601; +} +declare module "terriajs-cesium/Source/Core/JulianDate" { + import { JulianDate } from "terriajs-cesium"; + export default JulianDate; +} +declare module "terriajs-cesium/Source/Core/KeyboardEventModifier" { + import { KeyboardEventModifier } from "terriajs-cesium"; + export default KeyboardEventModifier; +} +declare module "terriajs-cesium/Source/Core/LagrangePolynomialApproximation" { + import { LagrangePolynomialApproximation } from "terriajs-cesium"; + export default LagrangePolynomialApproximation; +} +declare module "terriajs-cesium/Source/Core/LeapSecond" { + import { LeapSecond } from "terriajs-cesium"; + export default LeapSecond; +} +declare module "terriajs-cesium/Source/Core/LinearApproximation" { + import { LinearApproximation } from "terriajs-cesium"; + export default LinearApproximation; +} +declare module "terriajs-cesium/Source/Core/LinearSpline" { + import { LinearSpline } from "terriajs-cesium"; + export default LinearSpline; +} +declare module "terriajs-cesium/Source/Core/MapProjection" { + import { MapProjection } from "terriajs-cesium"; + export default MapProjection; +} +declare module "terriajs-cesium/Source/Core/Math" { + import { Math } from "terriajs-cesium"; + export default Math; +} +declare module "terriajs-cesium/Source/Core/Matrix2" { + import { Matrix2 } from "terriajs-cesium"; + export default Matrix2; +} +declare module "terriajs-cesium/Source/Core/Matrix3" { + import { Matrix3 } from "terriajs-cesium"; + export default Matrix3; +} +declare module "terriajs-cesium/Source/Core/Matrix4" { + import { Matrix4 } from "terriajs-cesium"; + export default Matrix4; +} +declare module "terriajs-cesium/Source/Core/mergeSort" { + import { mergeSort } from "terriajs-cesium"; + export default mergeSort; +} +declare module "terriajs-cesium/Source/Core/MorphWeightSpline" { + import { MorphWeightSpline } from "terriajs-cesium"; + export default MorphWeightSpline; +} +declare module "terriajs-cesium/Source/Core/NearFarScalar" { + import { NearFarScalar } from "terriajs-cesium"; + export default NearFarScalar; +} +declare module "terriajs-cesium/Source/Core/objectToQuery" { + import { objectToQuery } from "terriajs-cesium"; + export default objectToQuery; +} +declare module "terriajs-cesium/Source/Core/Occluder" { + import { Occluder } from "terriajs-cesium"; + export default Occluder; +} +declare module "terriajs-cesium/Source/Core/OpenCageGeocoderService" { + import { OpenCageGeocoderService } from "terriajs-cesium"; + export default OpenCageGeocoderService; +} +declare module "terriajs-cesium/Source/Core/OrientedBoundingBox" { + import { OrientedBoundingBox } from "terriajs-cesium"; + export default OrientedBoundingBox; +} +declare module "terriajs-cesium/Source/Core/OrthographicFrustum" { + import { OrthographicFrustum } from "terriajs-cesium"; + export default OrthographicFrustum; +} +declare module "terriajs-cesium/Source/Core/OrthographicOffCenterFrustum" { + import { OrthographicOffCenterFrustum } from "terriajs-cesium"; + export default OrthographicOffCenterFrustum; +} +declare module "terriajs-cesium/Source/Core/Packable" { + import { Packable } from "terriajs-cesium"; + export default Packable; +} +declare module "terriajs-cesium/Source/Core/PackableForInterpolation" { + import { PackableForInterpolation } from "terriajs-cesium"; + export default PackableForInterpolation; +} +declare module "terriajs-cesium/Source/Core/PeliasGeocoderService" { + import { PeliasGeocoderService } from "terriajs-cesium"; + export default PeliasGeocoderService; +} +declare module "terriajs-cesium/Source/Core/PerspectiveFrustum" { + import { PerspectiveFrustum } from "terriajs-cesium"; + export default PerspectiveFrustum; +} +declare module "terriajs-cesium/Source/Core/PerspectiveOffCenterFrustum" { + import { PerspectiveOffCenterFrustum } from "terriajs-cesium"; + export default PerspectiveOffCenterFrustum; +} +declare module "terriajs-cesium/Source/Core/PinBuilder" { + import { PinBuilder } from "terriajs-cesium"; + export default PinBuilder; +} +declare module "terriajs-cesium/Source/Core/PixelFormat" { + import { PixelFormat } from "terriajs-cesium"; + export default PixelFormat; +} +declare module "terriajs-cesium/Source/Core/Plane" { + import { Plane } from "terriajs-cesium"; + export default Plane; +} +declare module "terriajs-cesium/Source/Core/PlaneGeometry" { + import { PlaneGeometry } from "terriajs-cesium"; + export default PlaneGeometry; +} +declare module "terriajs-cesium/Source/Core/PlaneOutlineGeometry" { + import { PlaneOutlineGeometry } from "terriajs-cesium"; + export default PlaneOutlineGeometry; +} +declare module "terriajs-cesium/Source/Core/pointInsideTriangle" { + import { pointInsideTriangle } from "terriajs-cesium"; + export default pointInsideTriangle; +} +declare module "terriajs-cesium/Source/Core/PolygonGeometry" { + import { PolygonGeometry } from "terriajs-cesium"; + export default PolygonGeometry; +} +declare module "terriajs-cesium/Source/Core/PolygonHierarchy" { + import { PolygonHierarchy } from "terriajs-cesium"; + export default PolygonHierarchy; +} +declare module "terriajs-cesium/Source/Core/PolygonOutlineGeometry" { + import { PolygonOutlineGeometry } from "terriajs-cesium"; + export default PolygonOutlineGeometry; +} +declare module "terriajs-cesium/Source/Core/PolylineGeometry" { + import { PolylineGeometry } from "terriajs-cesium"; + export default PolylineGeometry; +} +declare module "terriajs-cesium/Source/Core/PolylineVolumeGeometry" { + import { PolylineVolumeGeometry } from "terriajs-cesium"; + export default PolylineVolumeGeometry; +} +declare module "terriajs-cesium/Source/Core/PolylineVolumeOutlineGeometry" { + import { PolylineVolumeOutlineGeometry } from "terriajs-cesium"; + export default PolylineVolumeOutlineGeometry; +} +declare module "terriajs-cesium/Source/Core/PrimitiveType" { + import { PrimitiveType } from "terriajs-cesium"; + export default PrimitiveType; +} +declare module "terriajs-cesium/Source/Core/Proxy" { + import { Proxy } from "terriajs-cesium"; + export default Proxy; +} +declare module "terriajs-cesium/Source/Core/QuadraticRealPolynomial" { + import { QuadraticRealPolynomial } from "terriajs-cesium"; + export default QuadraticRealPolynomial; +} +declare module "terriajs-cesium/Source/Core/QuantizedMeshTerrainData" { + import { QuantizedMeshTerrainData } from "terriajs-cesium"; + export default QuantizedMeshTerrainData; +} +declare module "terriajs-cesium/Source/Core/QuarticRealPolynomial" { + import { QuarticRealPolynomial } from "terriajs-cesium"; + export default QuarticRealPolynomial; +} +declare module "terriajs-cesium/Source/Core/Quaternion" { + import { Quaternion } from "terriajs-cesium"; + export default Quaternion; +} +declare module "terriajs-cesium/Source/Core/QuaternionSpline" { + import { QuaternionSpline } from "terriajs-cesium"; + export default QuaternionSpline; +} +declare module "terriajs-cesium/Source/Core/queryToObject" { + import { queryToObject } from "terriajs-cesium"; + export default queryToObject; +} +declare module "terriajs-cesium/Source/Core/Queue" { + import { Queue } from "terriajs-cesium"; + export default Queue; +} +declare module "terriajs-cesium/Source/Core/Ray" { + import { Ray } from "terriajs-cesium"; + export default Ray; +} +declare module "terriajs-cesium/Source/Core/Rectangle" { + import { Rectangle } from "terriajs-cesium"; + export default Rectangle; +} +declare module "terriajs-cesium/Source/Core/RectangleGeometry" { + import { RectangleGeometry } from "terriajs-cesium"; + export default RectangleGeometry; +} +declare module "terriajs-cesium/Source/Core/RectangleOutlineGeometry" { + import { RectangleOutlineGeometry } from "terriajs-cesium"; + export default RectangleOutlineGeometry; +} +declare module "terriajs-cesium/Source/Core/ReferenceFrame" { + import { ReferenceFrame } from "terriajs-cesium"; + export default ReferenceFrame; +} +declare module "terriajs-cesium/Source/Core/Request" { + import { Request } from "terriajs-cesium"; + export default Request; +} +declare module "terriajs-cesium/Source/Core/RequestErrorEvent" { + import { RequestErrorEvent } from "terriajs-cesium"; + export default RequestErrorEvent; +} +declare module "terriajs-cesium/Source/Core/RequestScheduler" { + import { RequestScheduler } from "terriajs-cesium"; + export default RequestScheduler; +} +declare module "terriajs-cesium/Source/Core/RequestState" { + import { RequestState } from "terriajs-cesium"; + export default RequestState; +} +declare module "terriajs-cesium/Source/Core/RequestType" { + import { RequestType } from "terriajs-cesium"; + export default RequestType; +} +declare module "terriajs-cesium/Source/Core/Resource" { + import { Resource } from "terriajs-cesium"; + export default Resource; +} +declare module "terriajs-cesium/Source/Core/RuntimeError" { + import { RuntimeError } from "terriajs-cesium"; + export default RuntimeError; +} +declare module "terriajs-cesium/Source/Core/sampleTerrain" { + import { sampleTerrain } from "terriajs-cesium"; + export default sampleTerrain; +} +declare module "terriajs-cesium/Source/Core/sampleTerrainMostDetailed" { + import { sampleTerrainMostDetailed } from "terriajs-cesium"; + export default sampleTerrainMostDetailed; +} +declare module "terriajs-cesium/Source/Core/ScreenSpaceEventHandler" { + import { ScreenSpaceEventHandler } from "terriajs-cesium"; + export default ScreenSpaceEventHandler; +} +declare module "terriajs-cesium/Source/Core/ScreenSpaceEventType" { + import { ScreenSpaceEventType } from "terriajs-cesium"; + export default ScreenSpaceEventType; +} +declare module "terriajs-cesium/Source/Core/ShowGeometryInstanceAttribute" { + import { ShowGeometryInstanceAttribute } from "terriajs-cesium"; + export default ShowGeometryInstanceAttribute; +} +declare module "terriajs-cesium/Source/Core/Simon1994PlanetaryPositions" { + import { Simon1994PlanetaryPositions } from "terriajs-cesium"; + export default Simon1994PlanetaryPositions; +} +declare module "terriajs-cesium/Source/Core/SimplePolylineGeometry" { + import { SimplePolylineGeometry } from "terriajs-cesium"; + export default SimplePolylineGeometry; +} +declare module "terriajs-cesium/Source/Core/SphereGeometry" { + import { SphereGeometry } from "terriajs-cesium"; + export default SphereGeometry; +} +declare module "terriajs-cesium/Source/Core/SphereOutlineGeometry" { + import { SphereOutlineGeometry } from "terriajs-cesium"; + export default SphereOutlineGeometry; +} +declare module "terriajs-cesium/Source/Core/Spherical" { + import { Spherical } from "terriajs-cesium"; + export default Spherical; +} +declare module "terriajs-cesium/Source/Core/Spline" { + import { Spline } from "terriajs-cesium"; + export default Spline; +} +declare module "terriajs-cesium/Source/Core/SteppedSpline" { + import { SteppedSpline } from "terriajs-cesium"; + export default SteppedSpline; +} +declare module "terriajs-cesium/Source/Core/subdivideArray" { + import { subdivideArray } from "terriajs-cesium"; + export default subdivideArray; +} +declare module "terriajs-cesium/Source/Core/TaskProcessor" { + import { TaskProcessor } from "terriajs-cesium"; + export default TaskProcessor; +} +declare module "terriajs-cesium/Source/Core/TerrainData" { + import { TerrainData } from "terriajs-cesium"; + export default TerrainData; +} +declare module "terriajs-cesium/Source/Core/TerrainProvider" { + import { TerrainProvider } from "terriajs-cesium"; + export default TerrainProvider; +} +declare module "terriajs-cesium/Source/Core/TileAvailability" { + import { TileAvailability } from "terriajs-cesium"; + export default TileAvailability; +} +declare module "terriajs-cesium/Source/Core/TileProviderError" { + import { TileProviderError } from "terriajs-cesium"; + export default TileProviderError; +} +declare module "terriajs-cesium/Source/Core/TilingScheme" { + import { TilingScheme } from "terriajs-cesium"; + export default TilingScheme; +} +declare module "terriajs-cesium/Source/Core/TimeInterval" { + import { TimeInterval } from "terriajs-cesium"; + export default TimeInterval; +} +declare module "terriajs-cesium/Source/Core/TimeIntervalCollection" { + import { TimeIntervalCollection } from "terriajs-cesium"; + export default TimeIntervalCollection; +} +declare module "terriajs-cesium/Source/Core/TimeStandard" { + import { TimeStandard } from "terriajs-cesium"; + export default TimeStandard; +} +declare module "terriajs-cesium/Source/Core/Transforms" { + import { Transforms } from "terriajs-cesium"; + export default Transforms; +} +declare module "terriajs-cesium/Source/Core/TranslationRotationScale" { + import { TranslationRotationScale } from "terriajs-cesium"; + export default TranslationRotationScale; +} +declare module "terriajs-cesium/Source/Core/TridiagonalSystemSolver" { + import { TridiagonalSystemSolver } from "terriajs-cesium"; + export default TridiagonalSystemSolver; +} +declare module "terriajs-cesium/Source/Core/TrustedServers" { + import { TrustedServers } from "terriajs-cesium"; + export default TrustedServers; +} +declare module "terriajs-cesium/Source/Core/VertexFormat" { + import { VertexFormat } from "terriajs-cesium"; + export default VertexFormat; +} +declare module "terriajs-cesium/Source/Core/VideoSynchronizer" { + import { VideoSynchronizer } from "terriajs-cesium"; + export default VideoSynchronizer; +} +declare module "terriajs-cesium/Source/Core/Visibility" { + import { Visibility } from "terriajs-cesium"; + export default Visibility; +} +declare module "terriajs-cesium/Source/Core/VRTheWorldTerrainProvider" { + import { VRTheWorldTerrainProvider } from "terriajs-cesium"; + export default VRTheWorldTerrainProvider; +} +declare module "terriajs-cesium/Source/Core/WallGeometry" { + import { WallGeometry } from "terriajs-cesium"; + export default WallGeometry; +} +declare module "terriajs-cesium/Source/Core/WallOutlineGeometry" { + import { WallOutlineGeometry } from "terriajs-cesium"; + export default WallOutlineGeometry; +} +declare module "terriajs-cesium/Source/Core/WebGLConstants" { + import { WebGLConstants } from "terriajs-cesium"; + export default WebGLConstants; +} +declare module "terriajs-cesium/Source/Core/WebMercatorProjection" { + import { WebMercatorProjection } from "terriajs-cesium"; + export default WebMercatorProjection; +} +declare module "terriajs-cesium/Source/Core/WebMercatorTilingScheme" { + import { WebMercatorTilingScheme } from "terriajs-cesium"; + export default WebMercatorTilingScheme; +} +declare module "terriajs-cesium/Source/Core/WindingOrder" { + import { WindingOrder } from "terriajs-cesium"; + export default WindingOrder; +} +declare module "terriajs-cesium/Source/Core/writeTextToCanvas" { + import { writeTextToCanvas } from "terriajs-cesium"; + export default writeTextToCanvas; +} +declare module "terriajs-cesium/Source/DataSources/BillboardGraphics" { + import { BillboardGraphics } from "terriajs-cesium"; + export default BillboardGraphics; +} +declare module "terriajs-cesium/Source/DataSources/BillboardVisualizer" { + import { BillboardVisualizer } from "terriajs-cesium"; + export default BillboardVisualizer; +} +declare module "terriajs-cesium/Source/DataSources/BoxGeometryUpdater" { + import { BoxGeometryUpdater } from "terriajs-cesium"; + export default BoxGeometryUpdater; +} +declare module "terriajs-cesium/Source/DataSources/BoxGraphics" { + import { BoxGraphics } from "terriajs-cesium"; + export default BoxGraphics; +} +declare module "terriajs-cesium/Source/DataSources/CallbackProperty" { + import { CallbackProperty } from "terriajs-cesium"; + export default CallbackProperty; +} +declare module "terriajs-cesium/Source/DataSources/Cesium3DTilesetGraphics" { + import { Cesium3DTilesetGraphics } from "terriajs-cesium"; + export default Cesium3DTilesetGraphics; +} +declare module "terriajs-cesium/Source/DataSources/Cesium3DTilesetVisualizer" { + import { Cesium3DTilesetVisualizer } from "terriajs-cesium"; + export default Cesium3DTilesetVisualizer; +} +declare module "terriajs-cesium/Source/DataSources/CheckerboardMaterialProperty" { + import { CheckerboardMaterialProperty } from "terriajs-cesium"; + export default CheckerboardMaterialProperty; +} +declare module "terriajs-cesium/Source/DataSources/ColorMaterialProperty" { + import { ColorMaterialProperty } from "terriajs-cesium"; + export default ColorMaterialProperty; +} +declare module "terriajs-cesium/Source/DataSources/CompositeEntityCollection" { + import { CompositeEntityCollection } from "terriajs-cesium"; + export default CompositeEntityCollection; +} +declare module "terriajs-cesium/Source/DataSources/CompositeMaterialProperty" { + import { CompositeMaterialProperty } from "terriajs-cesium"; + export default CompositeMaterialProperty; +} +declare module "terriajs-cesium/Source/DataSources/CompositePositionProperty" { + import { CompositePositionProperty } from "terriajs-cesium"; + export default CompositePositionProperty; +} +declare module "terriajs-cesium/Source/DataSources/CompositeProperty" { + import { CompositeProperty } from "terriajs-cesium"; + export default CompositeProperty; +} +declare module "terriajs-cesium/Source/DataSources/ConstantPositionProperty" { + import { ConstantPositionProperty } from "terriajs-cesium"; + export default ConstantPositionProperty; +} +declare module "terriajs-cesium/Source/DataSources/ConstantProperty" { + import { ConstantProperty } from "terriajs-cesium"; + export default ConstantProperty; +} +declare module "terriajs-cesium/Source/DataSources/CorridorGeometryUpdater" { + import { CorridorGeometryUpdater } from "terriajs-cesium"; + export default CorridorGeometryUpdater; +} +declare module "terriajs-cesium/Source/DataSources/CorridorGraphics" { + import { CorridorGraphics } from "terriajs-cesium"; + export default CorridorGraphics; +} +declare module "terriajs-cesium/Source/DataSources/CustomDataSource" { + import { CustomDataSource } from "terriajs-cesium"; + export default CustomDataSource; +} +declare module "terriajs-cesium/Source/DataSources/CylinderGeometryUpdater" { + import { CylinderGeometryUpdater } from "terriajs-cesium"; + export default CylinderGeometryUpdater; +} +declare module "terriajs-cesium/Source/DataSources/CylinderGraphics" { + import { CylinderGraphics } from "terriajs-cesium"; + export default CylinderGraphics; +} +declare module "terriajs-cesium/Source/DataSources/CzmlDataSource" { + import { CzmlDataSource } from "terriajs-cesium"; + export default CzmlDataSource; +} +declare module "terriajs-cesium/Source/DataSources/DataSource" { + import { DataSource } from "terriajs-cesium"; + export default DataSource; +} +declare module "terriajs-cesium/Source/DataSources/DataSourceClock" { + import { DataSourceClock } from "terriajs-cesium"; + export default DataSourceClock; +} +declare module "terriajs-cesium/Source/DataSources/DataSourceCollection" { + import { DataSourceCollection } from "terriajs-cesium"; + export default DataSourceCollection; +} +declare module "terriajs-cesium/Source/DataSources/DataSourceDisplay" { + import { DataSourceDisplay } from "terriajs-cesium"; + export default DataSourceDisplay; +} +declare module "terriajs-cesium/Source/DataSources/EllipseGeometryUpdater" { + import { EllipseGeometryUpdater } from "terriajs-cesium"; + export default EllipseGeometryUpdater; +} +declare module "terriajs-cesium/Source/DataSources/EllipseGraphics" { + import { EllipseGraphics } from "terriajs-cesium"; + export default EllipseGraphics; +} +declare module "terriajs-cesium/Source/DataSources/EllipsoidGeometryUpdater" { + import { EllipsoidGeometryUpdater } from "terriajs-cesium"; + export default EllipsoidGeometryUpdater; +} +declare module "terriajs-cesium/Source/DataSources/EllipsoidGraphics" { + import { EllipsoidGraphics } from "terriajs-cesium"; + export default EllipsoidGraphics; +} +declare module "terriajs-cesium/Source/DataSources/Entity" { + import { Entity } from "terriajs-cesium"; + export default Entity; +} +declare module "terriajs-cesium/Source/DataSources/EntityCluster" { + import { EntityCluster } from "terriajs-cesium"; + export default EntityCluster; +} +declare module "terriajs-cesium/Source/DataSources/EntityCollection" { + import { EntityCollection } from "terriajs-cesium"; + export default EntityCollection; +} +declare module "terriajs-cesium/Source/DataSources/EntityView" { + import { EntityView } from "terriajs-cesium"; + export default EntityView; +} +declare module "terriajs-cesium/Source/DataSources/exportKml" { + import { exportKml } from "terriajs-cesium"; + export default exportKml; +} +declare module "terriajs-cesium/Source/DataSources/GeoJsonDataSource" { + import { GeoJsonDataSource } from "terriajs-cesium"; + export default GeoJsonDataSource; +} +declare module "terriajs-cesium/Source/DataSources/GeometryUpdater" { + import { GeometryUpdater } from "terriajs-cesium"; + export default GeometryUpdater; +} +declare module "terriajs-cesium/Source/DataSources/GeometryVisualizer" { + import { GeometryVisualizer } from "terriajs-cesium"; + export default GeometryVisualizer; +} +declare module "terriajs-cesium/Source/DataSources/GpxDataSource" { + import { GpxDataSource } from "terriajs-cesium"; + export default GpxDataSource; +} +declare module "terriajs-cesium/Source/DataSources/GridMaterialProperty" { + import { GridMaterialProperty } from "terriajs-cesium"; + export default GridMaterialProperty; +} +declare module "terriajs-cesium/Source/DataSources/GroundGeometryUpdater" { + import { GroundGeometryUpdater } from "terriajs-cesium"; + export default GroundGeometryUpdater; +} +declare module "terriajs-cesium/Source/DataSources/ImageMaterialProperty" { + import { ImageMaterialProperty } from "terriajs-cesium"; + export default ImageMaterialProperty; +} +declare module "terriajs-cesium/Source/DataSources/KmlCamera" { + import { KmlCamera } from "terriajs-cesium"; + export default KmlCamera; +} +declare module "terriajs-cesium/Source/DataSources/KmlDataSource" { + import { KmlDataSource } from "terriajs-cesium"; + export default KmlDataSource; +} +declare module "terriajs-cesium/Source/DataSources/KmlLookAt" { + import { KmlLookAt } from "terriajs-cesium"; + export default KmlLookAt; +} +declare module "terriajs-cesium/Source/DataSources/KmlTour" { + import { KmlTour } from "terriajs-cesium"; + export default KmlTour; +} +declare module "terriajs-cesium/Source/DataSources/KmlTourFlyTo" { + import { KmlTourFlyTo } from "terriajs-cesium"; + export default KmlTourFlyTo; +} +declare module "terriajs-cesium/Source/DataSources/KmlTourWait" { + import { KmlTourWait } from "terriajs-cesium"; + export default KmlTourWait; +} +declare module "terriajs-cesium/Source/DataSources/LabelGraphics" { + import { LabelGraphics } from "terriajs-cesium"; + export default LabelGraphics; +} +declare module "terriajs-cesium/Source/DataSources/LabelVisualizer" { + import { LabelVisualizer } from "terriajs-cesium"; + export default LabelVisualizer; +} +declare module "terriajs-cesium/Source/DataSources/MaterialProperty" { + import { MaterialProperty } from "terriajs-cesium"; + export default MaterialProperty; +} +declare module "terriajs-cesium/Source/DataSources/ModelGraphics" { + import { ModelGraphics } from "terriajs-cesium"; + export default ModelGraphics; +} +declare module "terriajs-cesium/Source/DataSources/ModelVisualizer" { + import { ModelVisualizer } from "terriajs-cesium"; + export default ModelVisualizer; +} +declare module "terriajs-cesium/Source/DataSources/NodeTransformationProperty" { + import { NodeTransformationProperty } from "terriajs-cesium"; + export default NodeTransformationProperty; +} +declare module "terriajs-cesium/Source/DataSources/PathGraphics" { + import { PathGraphics } from "terriajs-cesium"; + export default PathGraphics; +} +declare module "terriajs-cesium/Source/DataSources/PathVisualizer" { + import { PathVisualizer } from "terriajs-cesium"; + export default PathVisualizer; +} +declare module "terriajs-cesium/Source/DataSources/PlaneGeometryUpdater" { + import { PlaneGeometryUpdater } from "terriajs-cesium"; + export default PlaneGeometryUpdater; +} +declare module "terriajs-cesium/Source/DataSources/PlaneGraphics" { + import { PlaneGraphics } from "terriajs-cesium"; + export default PlaneGraphics; +} +declare module "terriajs-cesium/Source/DataSources/PointGraphics" { + import { PointGraphics } from "terriajs-cesium"; + export default PointGraphics; +} +declare module "terriajs-cesium/Source/DataSources/PointVisualizer" { + import { PointVisualizer } from "terriajs-cesium"; + export default PointVisualizer; +} +declare module "terriajs-cesium/Source/DataSources/PolygonGeometryUpdater" { + import { PolygonGeometryUpdater } from "terriajs-cesium"; + export default PolygonGeometryUpdater; +} +declare module "terriajs-cesium/Source/DataSources/PolygonGraphics" { + import { PolygonGraphics } from "terriajs-cesium"; + export default PolygonGraphics; +} +declare module "terriajs-cesium/Source/DataSources/PolylineArrowMaterialProperty" { + import { PolylineArrowMaterialProperty } from "terriajs-cesium"; + export default PolylineArrowMaterialProperty; +} +declare module "terriajs-cesium/Source/DataSources/PolylineDashMaterialProperty" { + import { PolylineDashMaterialProperty } from "terriajs-cesium"; + export default PolylineDashMaterialProperty; +} +declare module "terriajs-cesium/Source/DataSources/PolylineGeometryUpdater" { + import { PolylineGeometryUpdater } from "terriajs-cesium"; + export default PolylineGeometryUpdater; +} +declare module "terriajs-cesium/Source/DataSources/PolylineGlowMaterialProperty" { + import { PolylineGlowMaterialProperty } from "terriajs-cesium"; + export default PolylineGlowMaterialProperty; +} +declare module "terriajs-cesium/Source/DataSources/PolylineGraphics" { + import { PolylineGraphics } from "terriajs-cesium"; + export default PolylineGraphics; +} +declare module "terriajs-cesium/Source/DataSources/PolylineOutlineMaterialProperty" { + import { PolylineOutlineMaterialProperty } from "terriajs-cesium"; + export default PolylineOutlineMaterialProperty; +} +declare module "terriajs-cesium/Source/DataSources/PolylineVisualizer" { + import { PolylineVisualizer } from "terriajs-cesium"; + export default PolylineVisualizer; +} +declare module "terriajs-cesium/Source/DataSources/PolylineVolumeGeometryUpdater" { + import { PolylineVolumeGeometryUpdater } from "terriajs-cesium"; + export default PolylineVolumeGeometryUpdater; +} +declare module "terriajs-cesium/Source/DataSources/PolylineVolumeGraphics" { + import { PolylineVolumeGraphics } from "terriajs-cesium"; + export default PolylineVolumeGraphics; +} +declare module "terriajs-cesium/Source/DataSources/PositionProperty" { + import { PositionProperty } from "terriajs-cesium"; + export default PositionProperty; +} +declare module "terriajs-cesium/Source/DataSources/PositionPropertyArray" { + import { PositionPropertyArray } from "terriajs-cesium"; + export default PositionPropertyArray; +} +declare module "terriajs-cesium/Source/DataSources/Property" { + import { Property } from "terriajs-cesium"; + export default Property; +} +declare module "terriajs-cesium/Source/DataSources/PropertyArray" { + import { PropertyArray } from "terriajs-cesium"; + export default PropertyArray; +} +declare module "terriajs-cesium/Source/DataSources/PropertyBag" { + import { PropertyBag } from "terriajs-cesium"; + export default PropertyBag; +} +declare module "terriajs-cesium/Source/DataSources/RectangleGeometryUpdater" { + import { RectangleGeometryUpdater } from "terriajs-cesium"; + export default RectangleGeometryUpdater; +} +declare module "terriajs-cesium/Source/DataSources/RectangleGraphics" { + import { RectangleGraphics } from "terriajs-cesium"; + export default RectangleGraphics; +} +declare module "terriajs-cesium/Source/DataSources/ReferenceProperty" { + import { ReferenceProperty } from "terriajs-cesium"; + export default ReferenceProperty; +} +declare module "terriajs-cesium/Source/DataSources/Rotation" { + import { Rotation } from "terriajs-cesium"; + export default Rotation; +} +declare module "terriajs-cesium/Source/DataSources/SampledPositionProperty" { + import { SampledPositionProperty } from "terriajs-cesium"; + export default SampledPositionProperty; +} +declare module "terriajs-cesium/Source/DataSources/SampledProperty" { + import { SampledProperty } from "terriajs-cesium"; + export default SampledProperty; +} +declare module "terriajs-cesium/Source/DataSources/StripeMaterialProperty" { + import { StripeMaterialProperty } from "terriajs-cesium"; + export default StripeMaterialProperty; +} +declare module "terriajs-cesium/Source/DataSources/StripeOrientation" { + import { StripeOrientation } from "terriajs-cesium"; + export default StripeOrientation; +} +declare module "terriajs-cesium/Source/DataSources/TimeIntervalCollectionPositionProperty" { + import { TimeIntervalCollectionPositionProperty } from "terriajs-cesium"; + export default TimeIntervalCollectionPositionProperty; +} +declare module "terriajs-cesium/Source/DataSources/TimeIntervalCollectionProperty" { + import { TimeIntervalCollectionProperty } from "terriajs-cesium"; + export default TimeIntervalCollectionProperty; +} +declare module "terriajs-cesium/Source/DataSources/VelocityOrientationProperty" { + import { VelocityOrientationProperty } from "terriajs-cesium"; + export default VelocityOrientationProperty; +} +declare module "terriajs-cesium/Source/DataSources/VelocityVectorProperty" { + import { VelocityVectorProperty } from "terriajs-cesium"; + export default VelocityVectorProperty; +} +declare module "terriajs-cesium/Source/DataSources/Visualizer" { + import { Visualizer } from "terriajs-cesium"; + export default Visualizer; +} +declare module "terriajs-cesium/Source/DataSources/WallGeometryUpdater" { + import { WallGeometryUpdater } from "terriajs-cesium"; + export default WallGeometryUpdater; +} +declare module "terriajs-cesium/Source/DataSources/WallGraphics" { + import { WallGraphics } from "terriajs-cesium"; + export default WallGraphics; +} +declare module "terriajs-cesium/Source/Renderer/PixelDatatype" { + import { PixelDatatype } from "terriajs-cesium"; + export default PixelDatatype; +} +declare module "terriajs-cesium/Source/Renderer/TextureMagnificationFilter" { + import { TextureMagnificationFilter } from "terriajs-cesium"; + export default TextureMagnificationFilter; +} +declare module "terriajs-cesium/Source/Renderer/TextureMinificationFilter" { + import { TextureMinificationFilter } from "terriajs-cesium"; + export default TextureMinificationFilter; +} +declare module "terriajs-cesium/Source/Scene/Appearance" { + import { Appearance } from "terriajs-cesium"; + export default Appearance; +} +declare module "terriajs-cesium/Source/Scene/ArcGisBaseMapType" { + import { ArcGisBaseMapType } from "terriajs-cesium"; + export default ArcGisBaseMapType; +} +declare module "terriajs-cesium/Source/Scene/ArcGisMapServerImageryProvider" { + import { ArcGisMapServerImageryProvider } from "terriajs-cesium"; + export default ArcGisMapServerImageryProvider; +} +declare module "terriajs-cesium/Source/Scene/ArcGisMapService" { + import { ArcGisMapService } from "terriajs-cesium"; + export default ArcGisMapService; +} +declare module "terriajs-cesium/Source/Scene/Axis" { + import { Axis } from "terriajs-cesium"; + export default Axis; +} +declare module "terriajs-cesium/Source/Scene/Billboard" { + import { Billboard } from "terriajs-cesium"; + export default Billboard; +} +declare module "terriajs-cesium/Source/Scene/BillboardCollection" { + import { BillboardCollection } from "terriajs-cesium"; + export default BillboardCollection; +} +declare module "terriajs-cesium/Source/Scene/BingMapsImageryProvider" { + import { BingMapsImageryProvider } from "terriajs-cesium"; + export default BingMapsImageryProvider; +} +declare module "terriajs-cesium/Source/Scene/BingMapsStyle" { + import { BingMapsStyle } from "terriajs-cesium"; + export default BingMapsStyle; +} +declare module "terriajs-cesium/Source/Scene/BlendEquation" { + import { BlendEquation } from "terriajs-cesium"; + export default BlendEquation; +} +declare module "terriajs-cesium/Source/Scene/BlendFunction" { + import { BlendFunction } from "terriajs-cesium"; + export default BlendFunction; +} +declare module "terriajs-cesium/Source/Scene/BlendingState" { + import { BlendingState } from "terriajs-cesium"; + export default BlendingState; +} +declare module "terriajs-cesium/Source/Scene/BlendOption" { + import { BlendOption } from "terriajs-cesium"; + export default BlendOption; +} +declare module "terriajs-cesium/Source/Scene/BoxEmitter" { + import { BoxEmitter } from "terriajs-cesium"; + export default BoxEmitter; +} +declare module "terriajs-cesium/Source/Scene/Camera" { + import { Camera } from "terriajs-cesium"; + export default Camera; +} +declare module "terriajs-cesium/Source/Scene/CameraEventAggregator" { + import { CameraEventAggregator } from "terriajs-cesium"; + export default CameraEventAggregator; +} +declare module "terriajs-cesium/Source/Scene/CameraEventType" { + import { CameraEventType } from "terriajs-cesium"; + export default CameraEventType; +} +declare module "terriajs-cesium/Source/Scene/Cesium3DTile" { + import { Cesium3DTile } from "terriajs-cesium"; + export default Cesium3DTile; +} +declare module "terriajs-cesium/Source/Scene/Cesium3DTileColorBlendMode" { + import { Cesium3DTileColorBlendMode } from "terriajs-cesium"; + export default Cesium3DTileColorBlendMode; +} +declare module "terriajs-cesium/Source/Scene/Cesium3DTileContent" { + import { Cesium3DTileContent } from "terriajs-cesium"; + export default Cesium3DTileContent; +} +declare module "terriajs-cesium/Source/Scene/Cesium3DTileFeature" { + import { Cesium3DTileFeature } from "terriajs-cesium"; + export default Cesium3DTileFeature; +} +declare module "terriajs-cesium/Source/Scene/Cesium3DTilePointFeature" { + import { Cesium3DTilePointFeature } from "terriajs-cesium"; + export default Cesium3DTilePointFeature; +} +declare module "terriajs-cesium/Source/Scene/Cesium3DTileset" { + import { Cesium3DTileset } from "terriajs-cesium"; + export default Cesium3DTileset; +} +declare module "terriajs-cesium/Source/Scene/Cesium3DTileStyle" { + import { Cesium3DTileStyle } from "terriajs-cesium"; + export default Cesium3DTileStyle; +} +declare module "terriajs-cesium/Source/Scene/Cesium3DTilesVoxelProvider" { + import { Cesium3DTilesVoxelProvider } from "terriajs-cesium"; + export default Cesium3DTilesVoxelProvider; +} +declare module "terriajs-cesium/Source/Scene/CircleEmitter" { + import { CircleEmitter } from "terriajs-cesium"; + export default CircleEmitter; +} +declare module "terriajs-cesium/Source/Scene/ClassificationPrimitive" { + import { ClassificationPrimitive } from "terriajs-cesium"; + export default ClassificationPrimitive; +} +declare module "terriajs-cesium/Source/Scene/ClassificationType" { + import { ClassificationType } from "terriajs-cesium"; + export default ClassificationType; +} +declare module "terriajs-cesium/Source/Scene/ClippingPlane" { + import { ClippingPlane } from "terriajs-cesium"; + export default ClippingPlane; +} +declare module "terriajs-cesium/Source/Scene/ClippingPlaneCollection" { + import { ClippingPlaneCollection } from "terriajs-cesium"; + export default ClippingPlaneCollection; +} +declare module "terriajs-cesium/Source/Scene/CloudCollection" { + import { CloudCollection } from "terriajs-cesium"; + export default CloudCollection; +} +declare module "terriajs-cesium/Source/Scene/CloudType" { + import { CloudType } from "terriajs-cesium"; + export default CloudType; +} +declare module "terriajs-cesium/Source/Scene/ColorBlendMode" { + import { ColorBlendMode } from "terriajs-cesium"; + export default ColorBlendMode; +} +declare module "terriajs-cesium/Source/Scene/ConditionsExpression" { + import { ConditionsExpression } from "terriajs-cesium"; + export default ConditionsExpression; +} +declare module "terriajs-cesium/Source/Scene/ConeEmitter" { + import { ConeEmitter } from "terriajs-cesium"; + export default ConeEmitter; +} +declare module "terriajs-cesium/Source/Scene/createElevationBandMaterial" { + import { createElevationBandMaterial } from "terriajs-cesium"; + export default createElevationBandMaterial; +} +declare module "terriajs-cesium/Source/Scene/createGooglePhotorealistic3DTileset" { + import { createGooglePhotorealistic3DTileset } from "terriajs-cesium"; + export default createGooglePhotorealistic3DTileset; +} +declare module "terriajs-cesium/Source/Scene/createOsmBuildingsAsync" { + import { createOsmBuildingsAsync } from "terriajs-cesium"; + export default createOsmBuildingsAsync; +} +declare module "terriajs-cesium/Source/Scene/createTangentSpaceDebugPrimitive" { + import { createTangentSpaceDebugPrimitive } from "terriajs-cesium"; + export default createTangentSpaceDebugPrimitive; +} +declare module "terriajs-cesium/Source/Scene/createWorldImageryAsync" { + import { createWorldImageryAsync } from "terriajs-cesium"; + export default createWorldImageryAsync; +} +declare module "terriajs-cesium/Source/Scene/CreditDisplay" { + import { CreditDisplay } from "terriajs-cesium"; + export default CreditDisplay; +} +declare module "terriajs-cesium/Source/Scene/CullFace" { + import { CullFace } from "terriajs-cesium"; + export default CullFace; +} +declare module "terriajs-cesium/Source/Scene/CumulusCloud" { + import { CumulusCloud } from "terriajs-cesium"; + export default CumulusCloud; +} +declare module "terriajs-cesium/Source/Scene/DebugAppearance" { + import { DebugAppearance } from "terriajs-cesium"; + export default DebugAppearance; +} +declare module "terriajs-cesium/Source/Scene/DebugCameraPrimitive" { + import { DebugCameraPrimitive } from "terriajs-cesium"; + export default DebugCameraPrimitive; +} +declare module "terriajs-cesium/Source/Scene/DebugModelMatrixPrimitive" { + import { DebugModelMatrixPrimitive } from "terriajs-cesium"; + export default DebugModelMatrixPrimitive; +} +declare module "terriajs-cesium/Source/Scene/DepthFunction" { + import { DepthFunction } from "terriajs-cesium"; + export default DepthFunction; +} +declare module "terriajs-cesium/Source/Scene/DirectionalLight" { + import { DirectionalLight } from "terriajs-cesium"; + export default DirectionalLight; +} +declare module "terriajs-cesium/Source/Scene/DiscardEmptyTileImagePolicy" { + import { DiscardEmptyTileImagePolicy } from "terriajs-cesium"; + export default DiscardEmptyTileImagePolicy; +} +declare module "terriajs-cesium/Source/Scene/DiscardMissingTileImagePolicy" { + import { DiscardMissingTileImagePolicy } from "terriajs-cesium"; + export default DiscardMissingTileImagePolicy; +} +declare module "terriajs-cesium/Source/Scene/EllipsoidSurfaceAppearance" { + import { EllipsoidSurfaceAppearance } from "terriajs-cesium"; + export default EllipsoidSurfaceAppearance; +} +declare module "terriajs-cesium/Source/Scene/Expression" { + import { Expression } from "terriajs-cesium"; + export default Expression; +} +declare module "terriajs-cesium/Source/Scene/Fog" { + import { Fog } from "terriajs-cesium"; + export default Fog; +} +declare module "terriajs-cesium/Source/Scene/FrameRateMonitor" { + import { FrameRateMonitor } from "terriajs-cesium"; + export default FrameRateMonitor; +} +declare module "terriajs-cesium/Source/Scene/GetFeatureInfoFormat" { + import { GetFeatureInfoFormat } from "terriajs-cesium"; + export default GetFeatureInfoFormat; +} +declare module "terriajs-cesium/Source/Scene/Globe" { + import { Globe } from "terriajs-cesium"; + export default Globe; +} +declare module "terriajs-cesium/Source/Scene/GlobeTranslucency" { + import { GlobeTranslucency } from "terriajs-cesium"; + export default GlobeTranslucency; +} +declare module "terriajs-cesium/Source/Scene/GltfPipeline/removeExtension" { + import { removeExtension } from "terriajs-cesium"; + export default removeExtension; +} +declare module "terriajs-cesium/Source/Scene/GoogleEarthEnterpriseImageryProvider" { + import { GoogleEarthEnterpriseImageryProvider } from "terriajs-cesium"; + export default GoogleEarthEnterpriseImageryProvider; +} +declare module "terriajs-cesium/Source/Scene/GoogleEarthEnterpriseMapsProvider" { + import { GoogleEarthEnterpriseMapsProvider } from "terriajs-cesium"; + export default GoogleEarthEnterpriseMapsProvider; +} +declare module "terriajs-cesium/Source/Scene/GridImageryProvider" { + import { GridImageryProvider } from "terriajs-cesium"; + export default GridImageryProvider; +} +declare module "terriajs-cesium/Source/Scene/GroundPolylinePrimitive" { + import { GroundPolylinePrimitive } from "terriajs-cesium"; + export default GroundPolylinePrimitive; +} +declare module "terriajs-cesium/Source/Scene/GroundPrimitive" { + import { GroundPrimitive } from "terriajs-cesium"; + export default GroundPrimitive; +} +declare module "terriajs-cesium/Source/Scene/HeightReference" { + import { HeightReference } from "terriajs-cesium"; + export default HeightReference; +} +declare module "terriajs-cesium/Source/Scene/HorizontalOrigin" { + import { HorizontalOrigin } from "terriajs-cesium"; + export default HorizontalOrigin; +} +declare module "terriajs-cesium/Source/Scene/I3SDataProvider" { + import { I3SDataProvider } from "terriajs-cesium"; + export default I3SDataProvider; +} +declare module "terriajs-cesium/Source/Scene/I3SFeature" { + import { I3SFeature } from "terriajs-cesium"; + export default I3SFeature; +} +declare module "terriajs-cesium/Source/Scene/I3SField" { + import { I3SField } from "terriajs-cesium"; + export default I3SField; +} +declare module "terriajs-cesium/Source/Scene/I3SGeometry" { + import { I3SGeometry } from "terriajs-cesium"; + export default I3SGeometry; +} +declare module "terriajs-cesium/Source/Scene/I3SLayer" { + import { I3SLayer } from "terriajs-cesium"; + export default I3SLayer; +} +declare module "terriajs-cesium/Source/Scene/I3SNode" { + import { I3SNode } from "terriajs-cesium"; + export default I3SNode; +} +declare module "terriajs-cesium/Source/Scene/ImageBasedLighting" { + import { ImageBasedLighting } from "terriajs-cesium"; + export default ImageBasedLighting; +} +declare module "terriajs-cesium/Source/Scene/ImageryLayer" { + import { ImageryLayer } from "terriajs-cesium"; + export default ImageryLayer; +} +declare module "terriajs-cesium/Source/Scene/ImageryLayerCollection" { + import { ImageryLayerCollection } from "terriajs-cesium"; + export default ImageryLayerCollection; +} +declare module "terriajs-cesium/Source/Scene/ImageryLayerFeatureInfo" { + import { ImageryLayerFeatureInfo } from "terriajs-cesium"; + export default ImageryLayerFeatureInfo; +} +declare module "terriajs-cesium/Source/Scene/ImageryProvider" { + import { ImageryProvider } from "terriajs-cesium"; + export default ImageryProvider; +} +declare module "terriajs-cesium/Source/Scene/IonImageryProvider" { + import { IonImageryProvider } from "terriajs-cesium"; + export default IonImageryProvider; +} +declare module "terriajs-cesium/Source/Scene/IonWorldImageryStyle" { + import { IonWorldImageryStyle } from "terriajs-cesium"; + export default IonWorldImageryStyle; +} +declare module "terriajs-cesium/Source/Scene/Label" { + import { Label } from "terriajs-cesium"; + export default Label; +} +declare module "terriajs-cesium/Source/Scene/LabelCollection" { + import { LabelCollection } from "terriajs-cesium"; + export default LabelCollection; +} +declare module "terriajs-cesium/Source/Scene/LabelStyle" { + import { LabelStyle } from "terriajs-cesium"; + export default LabelStyle; +} +declare module "terriajs-cesium/Source/Scene/Light" { + import { Light } from "terriajs-cesium"; + export default Light; +} +declare module "terriajs-cesium/Source/Scene/MapboxImageryProvider" { + import { MapboxImageryProvider } from "terriajs-cesium"; + export default MapboxImageryProvider; +} +declare module "terriajs-cesium/Source/Scene/MapboxStyleImageryProvider" { + import { MapboxStyleImageryProvider } from "terriajs-cesium"; + export default MapboxStyleImageryProvider; +} +declare module "terriajs-cesium/Source/Scene/MapMode2D" { + import { MapMode2D } from "terriajs-cesium"; + export default MapMode2D; +} +declare module "terriajs-cesium/Source/Scene/Material" { + import { Material } from "terriajs-cesium"; + export default Material; +} +declare module "terriajs-cesium/Source/Scene/MaterialAppearance" { + import { MaterialAppearance } from "terriajs-cesium"; + export default MaterialAppearance; +} +declare module "terriajs-cesium/Source/Scene/MetadataClass" { + import { MetadataClass } from "terriajs-cesium"; + export default MetadataClass; +} +declare module "terriajs-cesium/Source/Scene/MetadataClassProperty" { + import { MetadataClassProperty } from "terriajs-cesium"; + export default MetadataClassProperty; +} +declare module "terriajs-cesium/Source/Scene/MetadataComponentType" { + import { MetadataComponentType } from "terriajs-cesium"; + export default MetadataComponentType; +} +declare module "terriajs-cesium/Source/Scene/MetadataEnum" { + import { MetadataEnum } from "terriajs-cesium"; + export default MetadataEnum; +} +declare module "terriajs-cesium/Source/Scene/MetadataEnumValue" { + import { MetadataEnumValue } from "terriajs-cesium"; + export default MetadataEnumValue; +} +declare module "terriajs-cesium/Source/Scene/MetadataSchema" { + import { MetadataSchema } from "terriajs-cesium"; + export default MetadataSchema; +} +declare module "terriajs-cesium/Source/Scene/MetadataType" { + import { MetadataType } from "terriajs-cesium"; + export default MetadataType; +} +declare module "terriajs-cesium/Source/Scene/Model/CustomShader" { + import { CustomShader } from "terriajs-cesium"; + export default CustomShader; +} +declare module "terriajs-cesium/Source/Scene/Model/CustomShaderMode" { + import { CustomShaderMode } from "terriajs-cesium"; + export default CustomShaderMode; +} +declare module "terriajs-cesium/Source/Scene/Model/CustomShaderTranslucencyMode" { + import { CustomShaderTranslucencyMode } from "terriajs-cesium"; + export default CustomShaderTranslucencyMode; +} +declare module "terriajs-cesium/Source/Scene/Model/LightingModel" { + import { LightingModel } from "terriajs-cesium"; + export default LightingModel; +} +declare module "terriajs-cesium/Source/Scene/Model/Model" { + import { Model } from "terriajs-cesium"; + export default Model; +} +declare module "terriajs-cesium/Source/Scene/Model/ModelAnimation" { + import { ModelAnimation } from "terriajs-cesium"; + export default ModelAnimation; +} +declare module "terriajs-cesium/Source/Scene/Model/ModelAnimationCollection" { + import { ModelAnimationCollection } from "terriajs-cesium"; + export default ModelAnimationCollection; +} +declare module "terriajs-cesium/Source/Scene/Model/ModelFeature" { + import { ModelFeature } from "terriajs-cesium"; + export default ModelFeature; +} +declare module "terriajs-cesium/Source/Scene/Model/ModelNode" { + import { ModelNode } from "terriajs-cesium"; + export default ModelNode; +} +declare module "terriajs-cesium/Source/Scene/Model/TextureUniform" { + import { TextureUniform } from "terriajs-cesium"; + export default TextureUniform; +} +declare module "terriajs-cesium/Source/Scene/Model/UniformType" { + import { UniformType } from "terriajs-cesium"; + export default UniformType; +} +declare module "terriajs-cesium/Source/Scene/Model/VaryingType" { + import { VaryingType } from "terriajs-cesium"; + export default VaryingType; +} +declare module "terriajs-cesium/Source/Scene/ModelAnimationLoop" { + import { ModelAnimationLoop } from "terriajs-cesium"; + export default ModelAnimationLoop; +} +declare module "terriajs-cesium/Source/Scene/Moon" { + import { Moon } from "terriajs-cesium"; + export default Moon; +} +declare module "terriajs-cesium/Source/Scene/NeverTileDiscardPolicy" { + import { NeverTileDiscardPolicy } from "terriajs-cesium"; + export default NeverTileDiscardPolicy; +} +declare module "terriajs-cesium/Source/Scene/OpenStreetMapImageryProvider" { + import { OpenStreetMapImageryProvider } from "terriajs-cesium"; + export default OpenStreetMapImageryProvider; +} +declare module "terriajs-cesium/Source/Scene/Particle" { + import { Particle } from "terriajs-cesium"; + export default Particle; +} +declare module "terriajs-cesium/Source/Scene/ParticleBurst" { + import { ParticleBurst } from "terriajs-cesium"; + export default ParticleBurst; +} +declare module "terriajs-cesium/Source/Scene/ParticleEmitter" { + import { ParticleEmitter } from "terriajs-cesium"; + export default ParticleEmitter; +} +declare module "terriajs-cesium/Source/Scene/ParticleSystem" { + import { ParticleSystem } from "terriajs-cesium"; + export default ParticleSystem; +} +declare module "terriajs-cesium/Source/Scene/PerInstanceColorAppearance" { + import { PerInstanceColorAppearance } from "terriajs-cesium"; + export default PerInstanceColorAppearance; +} +declare module "terriajs-cesium/Source/Scene/PointCloudShading" { + import { PointCloudShading } from "terriajs-cesium"; + export default PointCloudShading; +} +declare module "terriajs-cesium/Source/Scene/PointPrimitive" { + import { PointPrimitive } from "terriajs-cesium"; + export default PointPrimitive; +} +declare module "terriajs-cesium/Source/Scene/PointPrimitiveCollection" { + import { PointPrimitiveCollection } from "terriajs-cesium"; + export default PointPrimitiveCollection; +} +declare module "terriajs-cesium/Source/Scene/Polyline" { + import { Polyline } from "terriajs-cesium"; + export default Polyline; +} +declare module "terriajs-cesium/Source/Scene/PolylineCollection" { + import { PolylineCollection } from "terriajs-cesium"; + export default PolylineCollection; +} +declare module "terriajs-cesium/Source/Scene/PolylineColorAppearance" { + import { PolylineColorAppearance } from "terriajs-cesium"; + export default PolylineColorAppearance; +} +declare module "terriajs-cesium/Source/Scene/PolylineMaterialAppearance" { + import { PolylineMaterialAppearance } from "terriajs-cesium"; + export default PolylineMaterialAppearance; +} +declare module "terriajs-cesium/Source/Scene/PostProcessStage" { + import { PostProcessStage } from "terriajs-cesium"; + export default PostProcessStage; +} +declare module "terriajs-cesium/Source/Scene/PostProcessStageCollection" { + import { PostProcessStageCollection } from "terriajs-cesium"; + export default PostProcessStageCollection; +} +declare module "terriajs-cesium/Source/Scene/PostProcessStageComposite" { + import { PostProcessStageComposite } from "terriajs-cesium"; + export default PostProcessStageComposite; +} +declare module "terriajs-cesium/Source/Scene/PostProcessStageLibrary" { + import { PostProcessStageLibrary } from "terriajs-cesium"; + export default PostProcessStageLibrary; +} +declare module "terriajs-cesium/Source/Scene/PostProcessStageSampleMode" { + import { PostProcessStageSampleMode } from "terriajs-cesium"; + export default PostProcessStageSampleMode; +} +declare module "terriajs-cesium/Source/Scene/Primitive" { + import { Primitive } from "terriajs-cesium"; + export default Primitive; +} +declare module "terriajs-cesium/Source/Scene/PrimitiveCollection" { + import { PrimitiveCollection } from "terriajs-cesium"; + export default PrimitiveCollection; +} +declare module "terriajs-cesium/Source/Scene/Scene" { + import { Scene } from "terriajs-cesium"; + export default Scene; +} +declare module "terriajs-cesium/Source/Scene/SceneMode" { + import { SceneMode } from "terriajs-cesium"; + export default SceneMode; +} +declare module "terriajs-cesium/Source/Scene/SceneTransforms" { + import { SceneTransforms } from "terriajs-cesium"; + export default SceneTransforms; +} +declare module "terriajs-cesium/Source/Scene/ScreenSpaceCameraController" { + import { ScreenSpaceCameraController } from "terriajs-cesium"; + export default ScreenSpaceCameraController; +} +declare module "terriajs-cesium/Source/Scene/ShadowMap" { + import { ShadowMap } from "terriajs-cesium"; + export default ShadowMap; +} +declare module "terriajs-cesium/Source/Scene/ShadowMode" { + import { ShadowMode } from "terriajs-cesium"; + export default ShadowMode; +} +declare module "terriajs-cesium/Source/Scene/SingleTileImageryProvider" { + import { SingleTileImageryProvider } from "terriajs-cesium"; + export default SingleTileImageryProvider; +} +declare module "terriajs-cesium/Source/Scene/SkyAtmosphere" { + import { SkyAtmosphere } from "terriajs-cesium"; + export default SkyAtmosphere; +} +declare module "terriajs-cesium/Source/Scene/SkyBox" { + import { SkyBox } from "terriajs-cesium"; + export default SkyBox; +} +declare module "terriajs-cesium/Source/Scene/SphereEmitter" { + import { SphereEmitter } from "terriajs-cesium"; + export default SphereEmitter; +} +declare module "terriajs-cesium/Source/Scene/SplitDirection" { + import { SplitDirection } from "terriajs-cesium"; + export default SplitDirection; +} +declare module "terriajs-cesium/Source/Scene/StencilFunction" { + import { StencilFunction } from "terriajs-cesium"; + export default StencilFunction; +} +declare module "terriajs-cesium/Source/Scene/StencilOperation" { + import { StencilOperation } from "terriajs-cesium"; + export default StencilOperation; +} +declare module "terriajs-cesium/Source/Scene/StyleExpression" { + import { StyleExpression } from "terriajs-cesium"; + export default StyleExpression; +} +declare module "terriajs-cesium/Source/Scene/Sun" { + import { Sun } from "terriajs-cesium"; + export default Sun; +} +declare module "terriajs-cesium/Source/Scene/SunLight" { + import { SunLight } from "terriajs-cesium"; + export default SunLight; +} +declare module "terriajs-cesium/Source/Scene/Terrain" { + import { Terrain } from "terriajs-cesium"; + export default Terrain; +} +declare module "terriajs-cesium/Source/Scene/TileCoordinatesImageryProvider" { + import { TileCoordinatesImageryProvider } from "terriajs-cesium"; + export default TileCoordinatesImageryProvider; +} +declare module "terriajs-cesium/Source/Scene/TileDiscardPolicy" { + import { TileDiscardPolicy } from "terriajs-cesium"; + export default TileDiscardPolicy; +} +declare module "terriajs-cesium/Source/Scene/TileMapServiceImageryProvider" { + import { TileMapServiceImageryProvider } from "terriajs-cesium"; + export default TileMapServiceImageryProvider; +} +declare module "terriajs-cesium/Source/Scene/TimeDynamicImagery" { + import { TimeDynamicImagery } from "terriajs-cesium"; + export default TimeDynamicImagery; +} +declare module "terriajs-cesium/Source/Scene/TimeDynamicPointCloud" { + import { TimeDynamicPointCloud } from "terriajs-cesium"; + export default TimeDynamicPointCloud; +} +declare module "terriajs-cesium/Source/Scene/UrlTemplateImageryProvider" { + import { UrlTemplateImageryProvider } from "terriajs-cesium"; + export default UrlTemplateImageryProvider; +} +declare module "terriajs-cesium/Source/Scene/VerticalOrigin" { + import { VerticalOrigin } from "terriajs-cesium"; + export default VerticalOrigin; +} +declare module "terriajs-cesium/Source/Scene/ViewportQuad" { + import { ViewportQuad } from "terriajs-cesium"; + export default ViewportQuad; +} +declare module "terriajs-cesium/Source/Scene/VoxelPrimitive" { + import { VoxelPrimitive } from "terriajs-cesium"; + export default VoxelPrimitive; +} +declare module "terriajs-cesium/Source/Scene/VoxelProvider" { + import { VoxelProvider } from "terriajs-cesium"; + export default VoxelProvider; +} +declare module "terriajs-cesium/Source/Scene/VoxelShapeType" { + import { VoxelShapeType } from "terriajs-cesium"; + export default VoxelShapeType; +} +declare module "terriajs-cesium/Source/Scene/WebMapServiceImageryProvider" { + import { WebMapServiceImageryProvider } from "terriajs-cesium"; + export default WebMapServiceImageryProvider; +} +declare module "terriajs-cesium/Source/Scene/WebMapTileServiceImageryProvider" { + import { WebMapTileServiceImageryProvider } from "terriajs-cesium"; + export default WebMapTileServiceImageryProvider; +} +declare module "terriajs-cesium/Source/Widget/CesiumWidget" { + import { CesiumWidget } from "terriajs-cesium"; + export default CesiumWidget; +} // End Generated Declarations From 64adde35e4f1616b23b2877b3a82eda3b9716017 Mon Sep 17 00:00:00 2001 From: Kevin Ring Date: Mon, 23 Oct 2023 10:53:52 +1100 Subject: [PATCH 334/654] Copy Cesium assets in addition to workers. --- gulpfile.js | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/gulpfile.js b/gulpfile.js index 7824069aab9..e08512484ec 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -73,20 +73,34 @@ gulp.task("reference-guide", function (done) { done(); }); -gulp.task("copy-cesium-assets", function () { +gulp.task("copy-cesium-workers", function () { var path = require("path"); var cesiumPackage = require.resolve("terriajs-cesium/package.json"); var cesiumRoot = path.dirname(cesiumPackage); - var cesiumWebRoot = path.join(cesiumRoot, "Build", "Workers"); + var cesiumWorkersRoot = path.join(cesiumRoot, "Build", "Workers"); return gulp - .src([path.join(cesiumWebRoot, "**")], { - base: cesiumWebRoot + .src([path.join(cesiumWorkersRoot, "**")], { + base: cesiumWorkersRoot }) .pipe(gulp.dest("wwwroot/build/Cesium/build/Workers")); }); +gulp.task("copy-cesium-source-assets", function () { + var path = require("path"); + + var cesiumPackage = require.resolve("terriajs-cesium/package.json"); + var cesiumRoot = path.dirname(cesiumPackage); + var cesiumAssetsRoot = path.join(cesiumRoot, "Source", "Assets"); + + return gulp + .src([path.join(cesiumAssetsRoot, "**")], { + base: cesiumAssetsRoot + }) + .pipe(gulp.dest("wwwroot/build/Cesium/build/Assets")); +}); + gulp.task("test-browserstack", function (done) { runKarma("./buildprocess/karma-browserstack.conf.js", done); }); @@ -286,6 +300,7 @@ gulp.task("terriajs-server", function (done) { }); }); +gulp.task("copy-cesium-assets", gulp.series("copy-cesium-source-assets", "copy-cesium-workers")); gulp.task("build", gulp.series("copy-cesium-assets", "build-specs")); gulp.task("release", gulp.series("copy-cesium-assets", "release-specs")); gulp.task("watch", gulp.series("copy-cesium-assets", "watch-specs")); From 59d1e29c696eba72971c84a96889a10ec143a3e9 Mon Sep 17 00:00:00 2001 From: Kevin Ring Date: Mon, 23 Oct 2023 10:57:34 +1100 Subject: [PATCH 335/654] Prettier. --- gulpfile.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/gulpfile.js b/gulpfile.js index e08512484ec..6d87f73ddad 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -300,7 +300,10 @@ gulp.task("terriajs-server", function (done) { }); }); -gulp.task("copy-cesium-assets", gulp.series("copy-cesium-source-assets", "copy-cesium-workers")); +gulp.task( + "copy-cesium-assets", + gulp.series("copy-cesium-source-assets", "copy-cesium-workers") +); gulp.task("build", gulp.series("copy-cesium-assets", "build-specs")); gulp.task("release", gulp.series("copy-cesium-assets", "release-specs")); gulp.task("watch", gulp.series("copy-cesium-assets", "watch-specs")); From 7cf9bf78ddd6bf9e87d0a75fef404e0106a95641 Mon Sep 17 00:00:00 2001 From: Kevin Ring Date: Mon, 23 Oct 2023 11:06:11 +1100 Subject: [PATCH 336/654] Copy third party assets, too. --- gulpfile.js | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/gulpfile.js b/gulpfile.js index 6d87f73ddad..bee47c8d506 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -87,6 +87,20 @@ gulp.task("copy-cesium-workers", function () { .pipe(gulp.dest("wwwroot/build/Cesium/build/Workers")); }); +gulp.task("copy-cesium-thirdparty", function () { + var path = require("path"); + + var cesiumPackage = require.resolve("terriajs-cesium/package.json"); + var cesiumRoot = path.dirname(cesiumPackage); + var cesiumThirdPartyRoot = path.join(cesiumRoot, "Build", "ThirdParty"); + + return gulp + .src([path.join(cesiumThirdPartyRoot, "**")], { + base: cesiumThirdPartyRoot + }) + .pipe(gulp.dest("wwwroot/build/Cesium/build/ThirdParty")); +}); + gulp.task("copy-cesium-source-assets", function () { var path = require("path"); @@ -302,7 +316,11 @@ gulp.task("terriajs-server", function (done) { gulp.task( "copy-cesium-assets", - gulp.series("copy-cesium-source-assets", "copy-cesium-workers") + gulp.series( + "copy-cesium-source-assets", + "copy-cesium-workers", + "copy-cesium-thirdparty" + ) ); gulp.task("build", gulp.series("copy-cesium-assets", "build-specs")); gulp.task("release", gulp.series("copy-cesium-assets", "release-specs")); From d6074d6085a800023a9dceb6b28db040ce688f7d Mon Sep 17 00:00:00 2001 From: Nick Forbes-Smith Date: Mon, 23 Oct 2023 21:28:26 +1100 Subject: [PATCH 337/654] Add geojson/protomaps time-series support --- CHANGES.md | 3 + .../ProtomapsImageryProvider.ts | 90 +++++++++++-------- lib/ModelMixins/GeojsonMixin.ts | 69 +++++++++++--- lib/Table/TableStyle.ts | 33 ++++--- 4 files changed, 135 insertions(+), 60 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index e3233e787d2..f382297869f 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -5,6 +5,9 @@ - Fix `WebMapServiceCatalogItem` `allowFeaturePicking` - Allow translation of TableStylingWorkflow. - Fix "Remove all" not removing selected/picked features +- Fix crash on empty GeoJSON features +- Add `tableFeatureInfoContext` support to `GeoJsonMixin.createProtomapsImageryProvider` +- Fix `GeoJsonMixin` timeline animation for lines/polygons - [The next improvement] #### 8.3.6 - 2023-10-03 diff --git a/lib/Map/ImageryProvider/ProtomapsImageryProvider.ts b/lib/Map/ImageryProvider/ProtomapsImageryProvider.ts index b4a7a546144..cf29e8f651a 100644 --- a/lib/Map/ImageryProvider/ProtomapsImageryProvider.ts +++ b/lib/Map/ImageryProvider/ProtomapsImageryProvider.ts @@ -96,6 +96,10 @@ interface Options { /** The name of the property that is a unique ID for features */ idProperty?: string; + + processPickedFeatures?: ( + features: ImageryLayerFeatureInfo[] + ) => Promise; } /** Buffer (in pixels) used when rendering (and generating - through geojson-vt) vector tiles */ @@ -288,11 +292,14 @@ export default class ProtomapsImageryProvider // Protomaps properties /** Data object from constructor options (this is transformed into `source`) */ private readonly data: ProtomapsData; - readonly maximumNativeZoom: number; private readonly labelers: Labelers; private readonly view: View | undefined; - readonly idProperty: string; + private readonly processPickedFeatures?: ( + features: ImageryLayerFeatureInfo[] + ) => Promise; + readonly maximumNativeZoom: number; + readonly idProperty: string; readonly source: Source; readonly paintRules: PaintRule[]; readonly labelRules: LabelRule[]; @@ -399,6 +406,8 @@ export default class ProtomapsImageryProvider 16, () => undefined ); + + this.processPickedFeatures = options.processPickedFeatures; } getTileCredits(x: number, y: number, level: number): Credit[] { @@ -490,6 +499,7 @@ export default class ProtomapsImageryProvider longitude: number, latitude: number ): Promise { + const featureInfos: ImageryLayerFeatureInfo[] = []; // If view is set - this means we are using actual vector tiles (that is not GeoJson object) // So we use this.view.queryFeatures if (this.view) { @@ -498,37 +508,36 @@ export default class ProtomapsImageryProvider (r) => r.dataLayer ); - return filterOutUndefined( - this.view - .queryFeatures( - CesiumMath.toDegrees(longitude), - CesiumMath.toDegrees(latitude), - level + this.view + .queryFeatures( + CesiumMath.toDegrees(longitude), + CesiumMath.toDegrees(latitude), + level + ) + .forEach((f) => { + // Only create FeatureInfo for visible features with properties + if ( + !f.feature.props || + isEmpty(f.feature.props) || + !renderedLayers.includes(f.layerName) ) - .map((f) => { - // Only create FeatureInfo for visible features with properties - if ( - !f.feature.props || - isEmpty(f.feature.props) || - !renderedLayers.includes(f.layerName) - ) - return; - - const featureInfo = new ImageryLayerFeatureInfo(); - - // Add Layer name property - featureInfo.properties = Object.assign( - { [LAYER_NAME_PROP]: f.layerName }, - f.feature.props ?? {} - ); - featureInfo.position = new Cartographic(longitude, latitude); + return; - featureInfo.configureDescriptionFromProperties(f.feature.props); - featureInfo.configureNameFromProperties(f.feature.props); + const featureInfo = new ImageryLayerFeatureInfo(); + + // Add Layer name property + featureInfo.properties = Object.assign( + { [LAYER_NAME_PROP]: f.layerName }, + f.feature.props ?? {} + ); + featureInfo.position = new Cartographic(longitude, latitude); + + featureInfo.configureDescriptionFromProperties(f.feature.props); + featureInfo.configureNameFromProperties(f.feature.props); + + featureInfos.push(featureInfo); + }); - return featureInfo; - }) - ); // No view is set and we have geoJSON object // So we pick features manually } else if ( @@ -556,12 +565,12 @@ export default class ProtomapsImageryProvider const bufferBbox = bbox(buffer); // Get array of all features - let features: Feature[] = this.source.geojsonObject.features; + let geojsonFeatures: Feature[] = this.source.geojsonObject.features; const pickedFeatures: Feature[] = []; - for (let index = 0; index < features.length; index++) { - const feature = features[index]; + for (let index = 0; index < geojsonFeatures.length; index++) { + const feature = geojsonFeatures[index]; if (!feature.bbox) { feature.bbox = bbox(feature); } @@ -591,7 +600,7 @@ export default class ProtomapsImageryProvider } // Convert pickedFeatures to ImageryLayerFeatureInfos - return pickedFeatures.map((f) => { + pickedFeatures.forEach((f) => { const featureInfo = new ImageryLayerFeatureInfo(); featureInfo.data = f; @@ -611,10 +620,15 @@ export default class ProtomapsImageryProvider featureInfo.configureDescriptionFromProperties(f.properties); featureInfo.configureNameFromProperties(f.properties); - return featureInfo; + featureInfos.push(featureInfo); }); } - return []; + + if (this.processPickedFeatures) { + return await this.processPickedFeatures(featureInfos); + } + + return featureInfos; } private clone(options?: Partial) { @@ -655,7 +669,9 @@ export default class ProtomapsImageryProvider rectangle: options?.rectangle ?? this.rectangle, credit: options?.credit ?? this.credit, paintRules: options?.paintRules ?? this.paintRules, - labelRules: options?.labelRules ?? this.labelRules + labelRules: options?.labelRules ?? this.labelRules, + processPickedFeatures: + options?.processPickedFeatures ?? this.processPickedFeatures }); } diff --git a/lib/ModelMixins/GeojsonMixin.ts b/lib/ModelMixins/GeojsonMixin.ts index 902b133fa09..6ce753bd160 100644 --- a/lib/ModelMixins/GeojsonMixin.ts +++ b/lib/ModelMixins/GeojsonMixin.ts @@ -18,21 +18,21 @@ import { action, computed, IReactionDisposer, + makeObservable, observable, onBecomeObserved, onBecomeUnobserved, + override, reaction, runInAction, - toJS, - makeObservable, - override + toJS } from "mobx"; import { createTransformer } from "mobx-utils"; import { - Feature as ProtomapsFeature, GeomType, LineSymbolizer, - PolygonSymbolizer + PolygonSymbolizer, + Feature as ProtomapsFeature } from "protomaps"; import Cartesian2 from "terriajs-cesium/Source/Core/Cartesian2"; import Cartesian3 from "terriajs-cesium/Source/Core/Cartesian3"; @@ -58,12 +58,14 @@ import PolygonGraphics from "terriajs-cesium/Source/DataSources/PolygonGraphics" import PolylineGraphics from "terriajs-cesium/Source/DataSources/PolylineGraphics"; import Property from "terriajs-cesium/Source/DataSources/Property"; import HeightReference from "terriajs-cesium/Source/Scene/HeightReference"; +import ImageryLayerFeatureInfo from "terriajs-cesium/Source/Scene/ImageryLayerFeatureInfo"; import AbstractConstructor from "../Core/AbstractConstructor"; import filterOutUndefined from "../Core/filterOutUndefined"; import formatPropertyValue from "../Core/formatPropertyValue"; import hashFromString from "../Core/hashFromString"; import isDefined from "../Core/isDefined"; import { + isJsonArray, isJsonNumber, isJsonObject, isJsonString, @@ -73,8 +75,8 @@ import { isJson } from "../Core/loadBlob"; import StandardCssColors from "../Core/StandardCssColors"; import TerriaError, { networkRequestError } from "../Core/TerriaError"; import ProtomapsImageryProvider, { - GeojsonSource, GEOJSON_SOURCE_LAYER_NAME, + GeojsonSource, ProtomapsData } from "../Map/ImageryProvider/ProtomapsImageryProvider"; import Reproject from "../Map/Vector/Reproject"; @@ -90,7 +92,7 @@ import { ViewingControl } from "../Models/ViewingControls"; import TableStylingWorkflow from "../Models/Workflows/TableStylingWorkflow"; import createLongitudeLatitudeFeaturePerRow from "../Table/createLongitudeLatitudeFeaturePerRow"; import TableAutomaticStylesStratum from "../Table/TableAutomaticStylesStratum"; -import TableStyle from "../Table/TableStyle"; +import TableStyle, { createRowGroupId } from "../Table/TableStyle"; import { isConstantStyleMap } from "../Table/TableStyleMap"; import { GeoJsonTraits } from "../Traits/TraitsClasses/GeoJsonTraits"; import { RectangleTraits } from "../Traits/TraitsClasses/MappableTraits"; @@ -100,6 +102,7 @@ import { ExportData } from "./ExportableMixin"; import FeatureInfoUrlTemplateMixin from "./FeatureInfoUrlTemplateMixin"; import { isDataSource } from "./MappableMixin"; import TableMixin from "./TableMixin"; +import { TerriaFeatureData } from "../Models/Feature/FeatureData"; export const FEATURE_ID_PROP = "_id_"; @@ -295,7 +298,7 @@ function GeoJsonMixin>(Base: T) { () => [ this.useTableStylingAndProtomaps, this.readyData, - this.currentTimeAsJulianDate, + this.currentDiscreteTimeIndex, this.activeTableStyle.timeIntervals, this.activeTableStyle.colorMap, this.activeTableStyle.pointSizeMap, @@ -502,6 +505,7 @@ function GeoJsonMixin>(Base: T) { const features = geoJsonWgs84.features; geoJsonWgs84.features = []; + let currentFeatureId = 0; for (let i = 0; i < features.length; i++) { const feature = features[i]; @@ -509,6 +513,13 @@ function GeoJsonMixin>(Base: T) { if (!isJsonObject(feature.geometry, false) || !feature.geometry.type) continue; + // Ignore features with invalid coordinates + if ( + !isJsonArray(feature.geometry.coordinates, false) || + feature.geometry.coordinates.length === 0 + ) + continue; + if (!feature.properties) { feature.properties = {}; } @@ -528,7 +539,7 @@ function GeoJsonMixin>(Base: T) { // Add feature index to FEATURE_ID_PROP ("_id_") feature property // This is used to refer to each feature in TableMixin (as row ID) const properties = feature.properties!; - properties[FEATURE_ID_PROP] = i; + properties[FEATURE_ID_PROP] = currentFeatureId; // Count features types if (feature.geometry.type === "Point") { @@ -553,11 +564,17 @@ function GeoJsonMixin>(Base: T) { } featureCounts.total++; + // Note it is important to increment currentFeatureId only if we are including the feature - as this needs to match the row ID in TableMixin (through dataColumnMajor) + currentFeatureId++; } runInAction(() => { this.featureCounts = featureCounts; - this._readyData = geoJsonWgs84; + if (featureCounts.total === 0) { + this._readyData = undefined; + } else { + this._readyData = geoJsonWgs84; + } }); if (isDefined(czmlTemplate)) { @@ -800,7 +817,37 @@ function GeoJsonMixin>(Base: T) { } // See `createPoints` for Point features - they are handled by Cesium ], - labelRules: [] + labelRules: [], + + // Process picked features to add terriaFeatureData (with rowIds) + // This is used by tableFeatureInfoContext to add time-series chart + processPickedFeatures: async (features) => { + if (!currentTimeRows) return features; + const processedFeatures: ImageryLayerFeatureInfo[] = []; + features.forEach((f) => { + const rowId = f.properties?.[FEATURE_ID_PROP]; + + if (isDefined(rowId) && currentTimeRows?.includes(rowId)) { + // To find rowIds for all features in a row group: + // re-create the rowGroupId and then look up in the activeTableStyle.rowGroups + const rowGroupId = createRowGroupId( + rowId, + this.activeTableStyle.groupByColumns + ); + const terriaFeatureData: TerriaFeatureData = { + ...f.data, + type: "terriaFeatureData", + rowIds: this.activeTableStyle.rowGroups.find( + (group) => group[0] === rowGroupId + )?.[1] + }; + f.data = terriaFeatureData; + + processedFeatures.push(f); + } + }); + return processedFeatures; + } }); provider = this.wrapImageryPickFeatures(provider); diff --git a/lib/Table/TableStyle.ts b/lib/Table/TableStyle.ts index e6d26a1b0e2..77a7bd6dc41 100644 --- a/lib/Table/TableStyle.ts +++ b/lib/Table/TableStyle.ts @@ -605,9 +605,9 @@ export default class TableStyle { return finishDates; } - /** Get rows grouped by id. Id will be calculated using idColumns, latitude/longitude columns or region column + /** Columns used in rowGroups - idColumns, latitude/longitude columns or region column */ - @computed get rowGroups() { + @computed get groupByColumns() { let groupByCols = this.idColumns; if (!groupByCols) { @@ -618,22 +618,18 @@ export default class TableStyle { } else if (this.regionColumn) groupByCols = [this.regionColumn]; } - if (!groupByCols) groupByCols = []; + return groupByCols ?? []; + } + /** Get rows grouped by id. + */ + @computed get rowGroups() { const tableRowIds = this.tableModel.rowIds; return ( Object.entries( groupBy(tableRowIds, (rowId) => - groupByCols! - .map((col) => { - // If using region column as ID - only use valid regions - if (col.type === TableColumnType.region) { - return col.valuesAsRegions.regionIds[rowId]; - } - return col.values[rowId]; - }) - .join("-") + createRowGroupId(rowId, this.groupByColumns) ) ) // Filter out bad IDs @@ -746,6 +742,19 @@ export default class TableStyle { } } +/** Create row group ID by concatenating values for columns */ +export function createRowGroupId(rowId: number, columns: TableColumn[]) { + return columns + .map((col) => { + // If using region column as ID - only use valid regions + if (col.type === TableColumnType.region) { + return col.valuesAsRegions.regionIds[rowId]; + } + return col.values[rowId]; + }) + .join("-"); +} + /** * Returns an array of sorted unique dates */ From fca4c8e511cec9356c191f709a98c4afdfceaa17 Mon Sep 17 00:00:00 2001 From: Nick Forbes-Smith Date: Mon, 23 Oct 2023 21:36:05 +1100 Subject: [PATCH 338/654] add to changes --- CHANGES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES.md b/CHANGES.md index f382297869f..c97179ae786 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -8,6 +8,7 @@ - Fix crash on empty GeoJSON features - Add `tableFeatureInfoContext` support to `GeoJsonMixin.createProtomapsImageryProvider` - Fix `GeoJsonMixin` timeline animation for lines/polygons +- Fix bug in mismatched GeoJSON Feature `_id_` and TableMixin `rowId` - this was causing incorrect styling when using `filterByProperties` or features had `null` geometry - [The next improvement] #### 8.3.6 - 2023-10-03 From f98b8d7121a8c262d46d93d3819e1a26b7ab04a2 Mon Sep 17 00:00:00 2001 From: Nick Forbes-Smith Date: Tue, 24 Oct 2023 13:52:02 +1100 Subject: [PATCH 339/654] Fix geojson splitter --- CHANGES.md | 1 + lib/Table/TableAutomaticStylesStratum.ts | 5 ++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index c97179ae786..b435f7cf136 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -9,6 +9,7 @@ - Add `tableFeatureInfoContext` support to `GeoJsonMixin.createProtomapsImageryProvider` - Fix `GeoJsonMixin` timeline animation for lines/polygons - Fix bug in mismatched GeoJSON Feature `_id_` and TableMixin `rowId` - this was causing incorrect styling when using `filterByProperties` or features had `null` geometry +- Fix splitter for `GeoJsonMixin` (lines and polygon features only) - [The next improvement] #### 8.3.6 - 2023-10-03 diff --git a/lib/Table/TableAutomaticStylesStratum.ts b/lib/Table/TableAutomaticStylesStratum.ts index 0e111331f89..6c4705efe4e 100644 --- a/lib/Table/TableAutomaticStylesStratum.ts +++ b/lib/Table/TableAutomaticStylesStratum.ts @@ -18,6 +18,7 @@ import TableStyleTraits from "../Traits/TraitsClasses/Table/StyleTraits"; import TableTimeStyleTraits from "../Traits/TraitsClasses/Table/TimeStyleTraits"; import TableTraits from "../Traits/TraitsClasses/Table/TableTraits"; import TableColumnType from "./TableColumnType"; +import { ImageryParts } from "../ModelMixins/MappableMixin"; const DEFAULT_ID_COLUMN = "id"; @@ -55,9 +56,7 @@ export default class TableAutomaticStylesStratum extends LoadableStratum( @computed get disableSplitter() { - return !isDefined(this.catalogItem.activeTableStyle.regionColumn) - ? true - : undefined; + return !this.catalogItem.mapItems.find(ImageryParts.is) ? true : undefined; } /** From 5154c420baf1842cf9e191b81a80bcdc96df1ca0 Mon Sep 17 00:00:00 2001 From: Nick Forbes-Smith Date: Tue, 24 Oct 2023 16:28:56 +1100 Subject: [PATCH 340/654] Add tests --- .../CatalogItems/GeoJsonCatalogItemSpec.ts | 292 +++++++++++++++++- wwwroot/test/GeoJSON/empty-geoms.geojson | 124 ++++++++ .../time-based-automatic-styles.geojson | 220 ++++++++++--- 3 files changed, 577 insertions(+), 59 deletions(-) create mode 100644 wwwroot/test/GeoJSON/empty-geoms.geojson diff --git a/test/Models/Catalog/CatalogItems/GeoJsonCatalogItemSpec.ts b/test/Models/Catalog/CatalogItems/GeoJsonCatalogItemSpec.ts index a2c62a71caf..3326b0705d4 100644 --- a/test/Models/Catalog/CatalogItems/GeoJsonCatalogItemSpec.ts +++ b/test/Models/Catalog/CatalogItems/GeoJsonCatalogItemSpec.ts @@ -1,11 +1,11 @@ -import { runInAction } from "mobx"; +import { reaction, runInAction } from "mobx"; import { GeomType, LineSymbolizer, PolygonSymbolizer } from "protomaps"; import { CustomDataSource } from "terriajs-cesium"; import Cartesian2 from "terriajs-cesium/Source/Core/Cartesian2"; import Cartesian3 from "terriajs-cesium/Source/Core/Cartesian3"; -import createGuid from "terriajs-cesium/Source/Core/createGuid"; import Iso8601 from "terriajs-cesium/Source/Core/Iso8601"; import JulianDate from "terriajs-cesium/Source/Core/JulianDate"; +import createGuid from "terriajs-cesium/Source/Core/createGuid"; import Entity from "terriajs-cesium/Source/DataSources/Entity"; import GeoJsonDataSource from "terriajs-cesium/Source/DataSources/GeoJsonDataSource"; import HeightReference from "terriajs-cesium/Source/Scene/HeightReference"; @@ -20,12 +20,19 @@ import { FEATURE_ID_PROP, getColor } from "../../../../lib/ModelMixins/GeojsonMixin"; -import { isDataSource } from "../../../../lib/ModelMixins/MappableMixin"; +import { + ImageryParts, + isDataSource +} from "../../../../lib/ModelMixins/MappableMixin"; import GeoJsonCatalogItem from "../../../../lib/Models/Catalog/CatalogItems/GeoJsonCatalogItem"; import SplitItemReference from "../../../../lib/Models/Catalog/CatalogReferences/SplitItemReference"; import CommonStrata from "../../../../lib/Models/Definition/CommonStrata"; import updateModelFromJson from "../../../../lib/Models/Definition/updateModelFromJson"; import TerriaFeature from "../../../../lib/Models/Feature/Feature"; +import { + TerriaFeatureData, + isTerriaFeatureData +} from "../../../../lib/Models/Feature/FeatureData"; import Terria from "../../../../lib/Models/Terria"; describe("GeoJsonCatalogItemSpec", () => { @@ -497,9 +504,7 @@ describe("GeoJsonCatalogItemSpec", () => { expect(entities.length).toEqual(1); const entity1 = entities[0]; - console.log( - entity1.properties?.getValue(terria.timelineClock.currentTime).year - ); + expect( entity1.properties?.getValue(terria.timelineClock.currentTime).year ).toBe(2019); @@ -823,6 +828,8 @@ describe("GeoJsonCatalogItemSpec", () => { ?.getValue(terria.timelineClock.currentTime) ?.toCssColorString() ).toBe("rgb(103,0,13)"); + + expect(geojson.disableSplitter).toBeTruthy(); }); it("Supports LegendOwnerTraits to override TableMixin.legends", async () => { @@ -922,12 +929,13 @@ describe("GeoJsonCatalogItemSpec", () => { geojson.setTrait( CommonStrata.user, "geoJsonString", - `{"type":"FeatureCollection","features":[{"type":"Feature","properties":{"stroke":"#555555","stroke-width":2,"stroke-opacity":1,"fill":"#ff0051","fill-opacity":0.5},"geometry":{"type":"Polygon","coordinates":[[[35.859375,53.54030739150022],[11.25,40.17887331434696],[15.1171875,14.604847155053898],[53.4375,44.84029065139799],[35.859375,53.54030739150022]]]}},{"type":"Feature","properties":{},"geometry":{"type":"Polygon","coordinates":[[[85.4296875,66.93006025862448],[53.4375,43.83452678223682],[89.296875,34.88593094075317],[91.40625,50.958426723359935],[85.4296875,66.93006025862448]]]}},{"type":"Feature","properties":{},"geometry":{"type":"Polygon","coordinates":[[[119.17968749999999,66.79190947341796],[100.1953125,53.74871079689897],[109.3359375,47.517200697839414],[119.17968749999999,66.79190947341796]]]}},{"type":"Feature","properties":{},"geometry":{"type":"Point","coordinates":[30.585937499999996,-2.108898659243126]}},{"type":"Feature","properties":{},"geometry":{"type":"Polygon","coordinates":[[[71.015625,-2.811371193331128],[99.49218749999999,-2.811371193331128],[99.49218749999999,18.646245142670608],[71.015625,18.646245142670608],[71.015625,-2.811371193331128]]]}},{"type":"Feature","properties":{},"geometry":{"type":"LineString","coordinates":[[140.9765625,19.642587534013032],[134.296875,-17.978733095556155],[88.9453125,-36.597889133070204],[119.53125,15.961329081596647],[130.078125,27.371767300523047]]}}]}` + `{"type":"FeatureCollection","features":[{"type":"Feature","properties":{"stroke":"#555555","stroke-width":2,"stroke-opacity":1,"fill":"#ff0051","fill-opacity":0.5},"geometry":{"type":"Polygon","coordinates":[[[35.859375,53.54030739150022],[11.25,40.17887331434696],[15.1171875,14.604847155053898],[53.4375,44.84029065139799],[35.859375,53.54030739150022]]]}},{"type":"Feature","properties":{},"geometry":{"type":"Polygon","coordinates":[[[85.4296875,66.93006025862448],[53.4375,43.83452678223682],[89.296875,34.88593094075317],[91.40625,50.958426723359935],[85.4296875,66.93006025862448]]]}},{"type":"Feature","properties":{},"geometry":{"type":"Polygon","coordinates":[[[119.17968749999999,66.79190947341796],[100.1953125,53.74871079689897],[109.3359375,47.517200697839414],[119.17968749999999,66.79190947341796]]]}},{"type":"Feature","properties":{},"geometry":{"type":"Polygon","coordinates":[[[71.015625,-2.811371193331128],[99.49218749999999,-2.811371193331128],[99.49218749999999,18.646245142670608],[71.015625,18.646245142670608],[71.015625,-2.811371193331128]]]}},{"type":"Feature","properties":{},"geometry":{"type":"LineString","coordinates":[[140.9765625,19.642587534013032],[134.296875,-17.978733095556155],[88.9453125,-36.597889133070204],[119.53125,15.961329081596647],[130.078125,27.371767300523047]]}}]}` ); await geojson.loadMapItems(); expect(geojson.mapItems[0] instanceof GeoJsonDataSource).toBeFalsy(); expect(geojson.useTableStylingAndProtomaps).toBeTruthy(); expect(geojson.legends.length).toBe(1); + expect(geojson.disableSplitter).toBeFalsy(); }); it("Disabled protomaps - More than 50% features detected", async () => { @@ -942,6 +950,143 @@ describe("GeoJsonCatalogItemSpec", () => { expect(geojson.useTableStylingAndProtomaps).toBeFalsy(); expect(geojson.legends.length).toBe(0); + expect(geojson.disableSplitter).toBeTruthy(); + }); + + it("correctly matches feature _id_ with table rowId - with features with empty geoms", async () => { + geojson.setTrait( + CommonStrata.user, + "url", + "test/GeoJSON/empty-geoms.geojson" + ); + + await geojson.loadMapItems(); + expect(geojson.readyData?.features.length).toBe(4); + // Check _id_ vs rowIds + expect( + geojson.readyData?.features.map((f) => f.properties?.[FEATURE_ID_PROP]) + ).toEqual(geojson.rowIds); + // Check "someOtherProp" column + expect( + geojson.readyData?.features.map((f) => f.properties?.someOtherProp) + ).toEqual( + geojson.tableColumns.find((c) => c.name === "someOtherProp") + ?.values as string[] + ); + }); + + it("correctly matches feature _id_ with table rowId - with filterByProperties", async () => { + geojson.setTrait( + CommonStrata.user, + "url", + "test/GeoJSON/time-based.geojson" + ); + geojson.setTrait(CommonStrata.user, "filterByProperties", { + year: 2019 + }); + await geojson.loadMapItems(); + + expect(geojson.readyData?.features.length).toBe(1); + expect( + geojson.readyData?.features.map((f) => f.properties?.[FEATURE_ID_PROP]) + ).toEqual(geojson.rowIds); + }); + + it("supports time", async function () { + geojson.setTrait( + CommonStrata.definition, + "url", + "test/GeoJSON/time-based-automatic-styles.geojson" + ); + + updateModelFromJson(geojson, CommonStrata.definition, { + currentTime: "2018-01-01", + defaultStyle: { + time: { timeColumn: "date", idColumns: ["idProperty"] } + } + }); + + const observeMapItems = reaction( + () => [geojson.mapItems], + () => {} + ); + + (await geojson.loadMapItems()).throwIfError(); + + expect(geojson.activeTableStyle.timeColumn?.name).toBe("date"); + + const firstProtomapsImageryProvider = + "imageryProvider" in geojson.mapItems[0] + ? (geojson.mapItems[0].imageryProvider as ProtomapsImageryProvider) + : undefined; + + if (!firstProtomapsImageryProvider) throw "protomaps should be defined"; + + const testFeature = { + props: {}, + geomType: GeomType.Polygon, + numVertices: 0, + geom: [], + bbox: { minX: 0, minY: 0, maxX: 0, maxY: 0 } + }; + + const firstFilter = firstProtomapsImageryProvider.paintRules[0].filter; + + if (!firstFilter) { + throw "filter should be defined"; + } + + // Current time is 2018-01-01 + // First feature maps to 2018-01-01 + testFeature.props = { [FEATURE_ID_PROP]: 0 }; + expect(firstFilter(0, testFeature)).toBeTruthy(); + + // Second feature maps to 2019-01-01 + testFeature.props = { [FEATURE_ID_PROP]: 1 }; + expect(firstFilter(0, testFeature)).toBeFalsy(); + + // Change time to 2019-01-01 + geojson.setTrait(CommonStrata.definition, "currentTime", "2019-01-01"); + + // Check new imagery provider + const nextProtomapsImageryProvider = + "imageryProvider" in geojson.mapItems[0] + ? (geojson.mapItems[0].imageryProvider as ProtomapsImageryProvider) + : undefined; + + if (!nextProtomapsImageryProvider) throw "protomaps should be defined"; + + const nextFilter = nextProtomapsImageryProvider.paintRules[0].filter; + + if (!nextFilter) { + throw "filter should be defined"; + } + + testFeature.props = { [FEATURE_ID_PROP]: 0 }; + expect(nextFilter(0, testFeature)).toBeFalsy(); + testFeature.props = { [FEATURE_ID_PROP]: 1 }; + expect(nextFilter(0, testFeature)).toBeTruthy(); + + expect( + firstProtomapsImageryProvider === nextProtomapsImageryProvider + ).toBeFalsy(); + + // Now change the currentTime to 2019- g01-02 - this should not trigger a new imagery provider - as it within the current time interval + geojson.setTrait(CommonStrata.definition, "currentTime", "2019-01-02"); + + // Check new imagery provider + const lastProtomapsImageryProvider = + "imageryProvider" in geojson.mapItems[0] + ? (geojson.mapItems[0].imageryProvider as ProtomapsImageryProvider) + : undefined; + + if (!lastProtomapsImageryProvider) throw "protomaps should be defined"; + + expect( + nextProtomapsImageryProvider === lastProtomapsImageryProvider + ).toBeTruthy(); + + observeMapItems(); }); }); @@ -986,12 +1131,14 @@ describe("GeoJsonCatalogItemSpec", () => { geojson = new GeoJsonCatalogItem("test-geojson", terria); }); - it("protomaps-mvt", async function () { + it("protomaps-mvt - polygons/lines", async function () { terria.addModel(geojson); - const geojsonString = await loadText("test/GeoJSON/cemeteries.geojson"); + const geojsonString = await loadText("test/GeoJSON/time-based.geojson"); geojson.setTrait(CommonStrata.user, "geoJsonString", geojsonString); await geojson.loadMapItems(); + expect(geojson.disableSplitter).toBeFalsy(); + const split = new SplitItemReference(createGuid(), terria); split.setTrait( CommonStrata.definition, @@ -1009,6 +1156,15 @@ describe("GeoJsonCatalogItemSpec", () => { (await (split.target as GeoJsonCatalogItem).loadMapItems()).error ).toBeUndefined(); }); + + it("cesium - points - splitter disabled", async function () { + terria.addModel(geojson); + const geojsonString = await loadText("test/GeoJSON/cemeteries.geojson"); + geojson.setTrait(CommonStrata.user, "geoJsonString", geojsonString); + await geojson.loadMapItems(); + + expect(geojson.disableSplitter).toBeTruthy(); + }); }); describe("geojson handles reprojection", function () { @@ -1218,5 +1374,123 @@ describe("GeoJsonCatalogItemSpec", () => { throw "Invalid geojson.mapItems"; } }); + + it("ProtomapsImageryProvider pickFeatures", async function () { + const geojsonData = { + type: "FeatureCollection", + features: [ + { + type: "Feature", + properties: {}, + geometry: { + type: "Polygon", + coordinates: [ + [ + [145.5908203125, -40.17887331434695], + [143.349609375, -42.08191667830631], + [146.35986328124997, -44.040218713142124], + [149.08447265625, -42.859859815062784], + [148.55712890625, -41.36031866306708], + [145.5908203125, -40.17887331434695] + ] + ] + } + }, + { + type: "Feature", + properties: {}, + geometry: { + type: "Polygon", + coordinates: [ + [ + [75.9375, 51.069016659603896], + [59.94140624999999, 39.095962936305476], + [79.453125, 42.032974332441405], + [80.15625, 46.800059446787316], + [75.673828125, 51.45400691005982], + [75.9375, 51.069016659603896] + ] + ] + } + } + ] + }; + geojson.setTrait( + CommonStrata.definition, + "geoJsonString", + JSON.stringify(geojsonData) + ); + + (await geojson.loadMapItems()).throwIfError(); + + const imagery = geojson.mapItems[0] as ImageryParts; + + expect( + imagery.imageryProvider instanceof ProtomapsImageryProvider + ).toBeTruthy(); + + const spyOnProcessPickedFeatures = spyOn( + imagery.imageryProvider, + "pickFeatures" + ).and.callThrough(); + + const features = + (await imagery.imageryProvider.pickFeatures( + 1, + 1, + 3, + 1.2946797849754814, + 0.7826107094181278 + )) ?? []; + + expect(spyOnProcessPickedFeatures).toHaveBeenCalledTimes(1); + expect(features.length).toBe(1); + expect(features[0].data.geometry).toEqual( + geojsonData.features[1].geometry + ); + }); + + it("ProtomapsImageryProvider pickFeatures - with time", async function () { + geojson.setTrait( + CommonStrata.definition, + "url", + "test/GeoJSON/time-based-automatic-styles.geojson" + ); + + updateModelFromJson(geojson, CommonStrata.definition, { + defaultStyle: { + time: { timeColumn: "date", idColumns: ["idProperty"] } + } + }); + + (await geojson.loadMapItems()).throwIfError(); + + const imagery = geojson.mapItems[0] as ImageryParts; + + expect( + imagery.imageryProvider instanceof ProtomapsImageryProvider + ).toBeTruthy(); + + const spyOnProcessPickedFeatures = spyOn( + imagery.imageryProvider, + "pickFeatures" + ).and.callThrough(); + + const features = + (await imagery.imageryProvider.pickFeatures( + 59166, + 40202, + 16, + 2.5309053894540012, + -0.6590723957845167 + )) ?? []; + + expect(spyOnProcessPickedFeatures).toHaveBeenCalledTimes(1); + expect(features.length).toBe(1); + expect(isTerriaFeatureData(features[0].data)).toBeTruthy(); + + const terriaFeatureData = features[0].data as TerriaFeatureData; + expect(terriaFeatureData.rowIds).toEqual([4, 5, 6, 7, 8]); + }); }); }); diff --git a/wwwroot/test/GeoJSON/empty-geoms.geojson b/wwwroot/test/GeoJSON/empty-geoms.geojson new file mode 100644 index 00000000000..ea0050ec794 --- /dev/null +++ b/wwwroot/test/GeoJSON/empty-geoms.geojson @@ -0,0 +1,124 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "height": 10, + "radius": 10, + "someOtherProp": "what" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 144.91734981536865, + -37.824700770115996 + ] + } + }, + { + "type": "Feature", + "properties": { + "height": 20, + "radius": 5, + "someOtherProp": "ok" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 144.92305755615234, + -37.82453127776299 + ] + } + }, + { + "type": "Feature", + "properties": { + "someProperty": 10, + "someOtherProp": "hey" + }, + "geometry": { + "type": "Polygon", + "coordinates": [] + } + }, + { + "type": "Feature", + "properties": { + "someProperty": 10, + "someOtherProp": "yo" + }, + "geometry": null + }, + { + "type": "Feature", + "properties": { + "someProperty": 20, + "someOtherProp": "what" + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 145.0100040435791, + -37.76080849651723 + ], + [ + 145.00873804092407, + -37.76342088777352 + ], + [ + 145.0157332420349, + -37.76292895101701 + ], + [ + 145.0100040435791, + -37.76080849651723 + ] + ] + ] + } + }, + { + "type": "Feature", + "bbox": [ + -10.0, + -10.0, + 10.0, + 10.0 + ], + "properties": { + "foo": "hi", + "bar": "bye", + "stroke-width": 1, + "someOtherProp": "is" + }, + "geometry": { + "type": "MultiLineString", + "coordinates": [ + [ + [ + 100.0, + 0.0 + ], + [ + 101.0, + 1.0 + ] + ], + [ + [ + 102.0, + 2.0 + ], + [ + 103.0, + 3.0 + ] + ] + ] + } + } + ] +} \ No newline at end of file diff --git a/wwwroot/test/GeoJSON/time-based-automatic-styles.geojson b/wwwroot/test/GeoJSON/time-based-automatic-styles.geojson index cda41a1888a..4e9d8791a9d 100644 --- a/wwwroot/test/GeoJSON/time-based-automatic-styles.geojson +++ b/wwwroot/test/GeoJSON/time-based-automatic-styles.geojson @@ -6,17 +6,32 @@ "properties": { "date": 2018, "someProperty": 3, - "id": 0 + "idProperty": 0 }, "geometry": { "type": "Polygon", "coordinates": [ [ - [145.0130295753479, -37.77042639061412], - [145.0200891494751, -37.77042639061412], - [145.0200891494751, -37.76543949054887], - [145.0130295753479, -37.76543949054887], - [145.0130295753479, -37.77042639061412] + [ + 145.0130295753479, + -37.77042639061412 + ], + [ + 145.0200891494751, + -37.77042639061412 + ], + [ + 145.0200891494751, + -37.76543949054887 + ], + [ + 145.0130295753479, + -37.76543949054887 + ], + [ + 145.0130295753479, + -37.77042639061412 + ] ] ] } @@ -26,17 +41,32 @@ "properties": { "date": 2019, "someProperty": 6, - "id": 0 + "idProperty": 0 }, "geometry": { "type": "Polygon", "coordinates": [ [ - [145.0130295753479, -37.77042639061412], - [145.0200891494751, -37.77042639061412], - [145.0200891494751, -37.76543949054887], - [145.0130295753479, -37.76543949054887], - [145.0130295753479, -37.77042639061412] + [ + 145.0130295753479, + -37.77042639061412 + ], + [ + 145.0200891494751, + -37.77042639061412 + ], + [ + 145.0200891494751, + -37.76543949054887 + ], + [ + 145.0130295753479, + -37.76543949054887 + ], + [ + 145.0130295753479, + -37.77042639061412 + ] ] ] } @@ -46,17 +76,32 @@ "properties": { "date": 2020, "someProperty": 10, - "id": 0 + "idProperty": 0 }, "geometry": { "type": "Polygon", "coordinates": [ [ - [145.0130295753479, -37.77042639061412], - [145.0200891494751, -37.77042639061412], - [145.0200891494751, -37.76543949054887], - [145.0130295753479, -37.76543949054887], - [145.0130295753479, -37.77042639061412] + [ + 145.0130295753479, + -37.77042639061412 + ], + [ + 145.0200891494751, + -37.77042639061412 + ], + [ + 145.0200891494751, + -37.76543949054887 + ], + [ + 145.0130295753479, + -37.76543949054887 + ], + [ + 145.0130295753479, + -37.77042639061412 + ] ] ] } @@ -66,17 +111,32 @@ "properties": { "date": 2021, "someProperty": 0, - "id": 0 + "idProperty": 0 }, "geometry": { "type": "Polygon", "coordinates": [ [ - [145.0130295753479, -37.77042639061412], - [145.0200891494751, -37.77042639061412], - [145.0200891494751, -37.76543949054887], - [145.0130295753479, -37.76543949054887], - [145.0130295753479, -37.77042639061412] + [ + 145.0130295753479, + -37.77042639061412 + ], + [ + 145.0200891494751, + -37.77042639061412 + ], + [ + 145.0200891494751, + -37.76543949054887 + ], + [ + 145.0130295753479, + -37.76543949054887 + ], + [ + 145.0130295753479, + -37.77042639061412 + ] ] ] } @@ -86,16 +146,28 @@ "properties": { "date": 2018, "someProperty": 3, - "id": 1 + "idProperty": 1 }, "geometry": { "type": "Polygon", "coordinates": [ [ - [145.0100040435791, -37.76080849651723], - [145.00873804092407, -37.76342088777352], - [145.0157332420349, -37.76292895101701], - [145.0100040435791, -37.76080849651723] + [ + 145.0100040435791, + -37.76080849651723 + ], + [ + 145.00873804092407, + -37.76342088777352 + ], + [ + 145.0157332420349, + -37.76292895101701 + ], + [ + 145.0100040435791, + -37.76080849651723 + ] ] ] } @@ -105,16 +177,28 @@ "properties": { "date": 2019, "someProperty": 4, - "id": 1 + "idProperty": 1 }, "geometry": { "type": "Polygon", "coordinates": [ [ - [145.0100040435791, -37.76080849651723], - [145.00873804092407, -37.76342088777352], - [145.0157332420349, -37.76292895101701], - [145.0100040435791, -37.76080849651723] + [ + 145.0100040435791, + -37.76080849651723 + ], + [ + 145.00873804092407, + -37.76342088777352 + ], + [ + 145.0157332420349, + -37.76292895101701 + ], + [ + 145.0100040435791, + -37.76080849651723 + ] ] ] } @@ -124,16 +208,28 @@ "properties": { "date": 2020, "someProperty": 1, - "id": 1 + "idProperty": 1 }, "geometry": { "type": "Polygon", "coordinates": [ [ - [145.0100040435791, -37.76080849651723], - [145.00873804092407, -37.76342088777352], - [145.0157332420349, -37.76292895101701], - [145.0100040435791, -37.76080849651723] + [ + 145.0100040435791, + -37.76080849651723 + ], + [ + 145.00873804092407, + -37.76342088777352 + ], + [ + 145.0157332420349, + -37.76292895101701 + ], + [ + 145.0100040435791, + -37.76080849651723 + ] ] ] } @@ -143,16 +239,28 @@ "properties": { "date": 2021, "someProperty": 10, - "id": 1 + "idProperty": 1 }, "geometry": { "type": "Polygon", "coordinates": [ [ - [145.0100040435791, -37.76080849651723], - [145.00873804092407, -37.76342088777352], - [145.0157332420349, -37.76292895101701], - [145.0100040435791, -37.76080849651723] + [ + 145.0100040435791, + -37.76080849651723 + ], + [ + 145.00873804092407, + -37.76342088777352 + ], + [ + 145.0157332420349, + -37.76292895101701 + ], + [ + 145.0100040435791, + -37.76080849651723 + ] ] ] } @@ -162,19 +270,31 @@ "properties": { "date": 2022, "someProperty": 7, - "id": 1 + "idProperty": 1 }, "geometry": { "type": "Polygon", "coordinates": [ [ - [145.0100040435791, -37.76080849651723], - [145.00873804092407, -37.76342088777352], - [145.0157332420349, -37.76292895101701], - [145.0100040435791, -37.76080849651723] + [ + 145.0100040435791, + -37.76080849651723 + ], + [ + 145.00873804092407, + -37.76342088777352 + ], + [ + 145.0157332420349, + -37.76292895101701 + ], + [ + 145.0100040435791, + -37.76080849651723 + ] ] ] } } ] -} +} \ No newline at end of file From 735b1bda646f672edc5823c7000496816c148909 Mon Sep 17 00:00:00 2001 From: Nick Forbes-Smith Date: Tue, 24 Oct 2023 16:34:30 +1100 Subject: [PATCH 341/654] prettier --- wwwroot/test/GeoJSON/empty-geoms.geojson | 59 ++--- .../time-based-automatic-styles.geojson | 202 ++++-------------- 2 files changed, 53 insertions(+), 208 deletions(-) diff --git a/wwwroot/test/GeoJSON/empty-geoms.geojson b/wwwroot/test/GeoJSON/empty-geoms.geojson index ea0050ec794..f327c7ae095 100644 --- a/wwwroot/test/GeoJSON/empty-geoms.geojson +++ b/wwwroot/test/GeoJSON/empty-geoms.geojson @@ -10,10 +10,7 @@ }, "geometry": { "type": "Point", - "coordinates": [ - 144.91734981536865, - -37.824700770115996 - ] + "coordinates": [144.91734981536865, -37.824700770115996] } }, { @@ -25,10 +22,7 @@ }, "geometry": { "type": "Point", - "coordinates": [ - 144.92305755615234, - -37.82453127776299 - ] + "coordinates": [144.92305755615234, -37.82453127776299] } }, { @@ -60,34 +54,17 @@ "type": "Polygon", "coordinates": [ [ - [ - 145.0100040435791, - -37.76080849651723 - ], - [ - 145.00873804092407, - -37.76342088777352 - ], - [ - 145.0157332420349, - -37.76292895101701 - ], - [ - 145.0100040435791, - -37.76080849651723 - ] + [145.0100040435791, -37.76080849651723], + [145.00873804092407, -37.76342088777352], + [145.0157332420349, -37.76292895101701], + [145.0100040435791, -37.76080849651723] ] ] } }, { "type": "Feature", - "bbox": [ - -10.0, - -10.0, - 10.0, - 10.0 - ], + "bbox": [-10.0, -10.0, 10.0, 10.0], "properties": { "foo": "hi", "bar": "bye", @@ -98,27 +75,15 @@ "type": "MultiLineString", "coordinates": [ [ - [ - 100.0, - 0.0 - ], - [ - 101.0, - 1.0 - ] + [100.0, 0.0], + [101.0, 1.0] ], [ - [ - 102.0, - 2.0 - ], - [ - 103.0, - 3.0 - ] + [102.0, 2.0], + [103.0, 3.0] ] ] } } ] -} \ No newline at end of file +} diff --git a/wwwroot/test/GeoJSON/time-based-automatic-styles.geojson b/wwwroot/test/GeoJSON/time-based-automatic-styles.geojson index 4e9d8791a9d..8cd654ffe39 100644 --- a/wwwroot/test/GeoJSON/time-based-automatic-styles.geojson +++ b/wwwroot/test/GeoJSON/time-based-automatic-styles.geojson @@ -12,26 +12,11 @@ "type": "Polygon", "coordinates": [ [ - [ - 145.0130295753479, - -37.77042639061412 - ], - [ - 145.0200891494751, - -37.77042639061412 - ], - [ - 145.0200891494751, - -37.76543949054887 - ], - [ - 145.0130295753479, - -37.76543949054887 - ], - [ - 145.0130295753479, - -37.77042639061412 - ] + [145.0130295753479, -37.77042639061412], + [145.0200891494751, -37.77042639061412], + [145.0200891494751, -37.76543949054887], + [145.0130295753479, -37.76543949054887], + [145.0130295753479, -37.77042639061412] ] ] } @@ -47,26 +32,11 @@ "type": "Polygon", "coordinates": [ [ - [ - 145.0130295753479, - -37.77042639061412 - ], - [ - 145.0200891494751, - -37.77042639061412 - ], - [ - 145.0200891494751, - -37.76543949054887 - ], - [ - 145.0130295753479, - -37.76543949054887 - ], - [ - 145.0130295753479, - -37.77042639061412 - ] + [145.0130295753479, -37.77042639061412], + [145.0200891494751, -37.77042639061412], + [145.0200891494751, -37.76543949054887], + [145.0130295753479, -37.76543949054887], + [145.0130295753479, -37.77042639061412] ] ] } @@ -82,26 +52,11 @@ "type": "Polygon", "coordinates": [ [ - [ - 145.0130295753479, - -37.77042639061412 - ], - [ - 145.0200891494751, - -37.77042639061412 - ], - [ - 145.0200891494751, - -37.76543949054887 - ], - [ - 145.0130295753479, - -37.76543949054887 - ], - [ - 145.0130295753479, - -37.77042639061412 - ] + [145.0130295753479, -37.77042639061412], + [145.0200891494751, -37.77042639061412], + [145.0200891494751, -37.76543949054887], + [145.0130295753479, -37.76543949054887], + [145.0130295753479, -37.77042639061412] ] ] } @@ -117,26 +72,11 @@ "type": "Polygon", "coordinates": [ [ - [ - 145.0130295753479, - -37.77042639061412 - ], - [ - 145.0200891494751, - -37.77042639061412 - ], - [ - 145.0200891494751, - -37.76543949054887 - ], - [ - 145.0130295753479, - -37.76543949054887 - ], - [ - 145.0130295753479, - -37.77042639061412 - ] + [145.0130295753479, -37.77042639061412], + [145.0200891494751, -37.77042639061412], + [145.0200891494751, -37.76543949054887], + [145.0130295753479, -37.76543949054887], + [145.0130295753479, -37.77042639061412] ] ] } @@ -152,22 +92,10 @@ "type": "Polygon", "coordinates": [ [ - [ - 145.0100040435791, - -37.76080849651723 - ], - [ - 145.00873804092407, - -37.76342088777352 - ], - [ - 145.0157332420349, - -37.76292895101701 - ], - [ - 145.0100040435791, - -37.76080849651723 - ] + [145.0100040435791, -37.76080849651723], + [145.00873804092407, -37.76342088777352], + [145.0157332420349, -37.76292895101701], + [145.0100040435791, -37.76080849651723] ] ] } @@ -183,22 +111,10 @@ "type": "Polygon", "coordinates": [ [ - [ - 145.0100040435791, - -37.76080849651723 - ], - [ - 145.00873804092407, - -37.76342088777352 - ], - [ - 145.0157332420349, - -37.76292895101701 - ], - [ - 145.0100040435791, - -37.76080849651723 - ] + [145.0100040435791, -37.76080849651723], + [145.00873804092407, -37.76342088777352], + [145.0157332420349, -37.76292895101701], + [145.0100040435791, -37.76080849651723] ] ] } @@ -214,22 +130,10 @@ "type": "Polygon", "coordinates": [ [ - [ - 145.0100040435791, - -37.76080849651723 - ], - [ - 145.00873804092407, - -37.76342088777352 - ], - [ - 145.0157332420349, - -37.76292895101701 - ], - [ - 145.0100040435791, - -37.76080849651723 - ] + [145.0100040435791, -37.76080849651723], + [145.00873804092407, -37.76342088777352], + [145.0157332420349, -37.76292895101701], + [145.0100040435791, -37.76080849651723] ] ] } @@ -245,22 +149,10 @@ "type": "Polygon", "coordinates": [ [ - [ - 145.0100040435791, - -37.76080849651723 - ], - [ - 145.00873804092407, - -37.76342088777352 - ], - [ - 145.0157332420349, - -37.76292895101701 - ], - [ - 145.0100040435791, - -37.76080849651723 - ] + [145.0100040435791, -37.76080849651723], + [145.00873804092407, -37.76342088777352], + [145.0157332420349, -37.76292895101701], + [145.0100040435791, -37.76080849651723] ] ] } @@ -276,25 +168,13 @@ "type": "Polygon", "coordinates": [ [ - [ - 145.0100040435791, - -37.76080849651723 - ], - [ - 145.00873804092407, - -37.76342088777352 - ], - [ - 145.0157332420349, - -37.76292895101701 - ], - [ - 145.0100040435791, - -37.76080849651723 - ] + [145.0100040435791, -37.76080849651723], + [145.00873804092407, -37.76342088777352], + [145.0157332420349, -37.76292895101701], + [145.0100040435791, -37.76080849651723] ] ] } } ] -} \ No newline at end of file +} From 4b61b00d0d0c37587a20d3514fd80037dad0e5fa Mon Sep 17 00:00:00 2001 From: Nick Forbes-Smith Date: Tue, 24 Oct 2023 16:44:53 +1100 Subject: [PATCH 342/654] replace currentDiscreteTimeIndex with currentDiscreteJulianDate --- lib/ModelMixins/GeojsonMixin.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/ModelMixins/GeojsonMixin.ts b/lib/ModelMixins/GeojsonMixin.ts index 6ce753bd160..df72d0fe261 100644 --- a/lib/ModelMixins/GeojsonMixin.ts +++ b/lib/ModelMixins/GeojsonMixin.ts @@ -298,7 +298,7 @@ function GeoJsonMixin>(Base: T) { () => [ this.useTableStylingAndProtomaps, this.readyData, - this.currentDiscreteTimeIndex, + this.currentDiscreteJulianDate, this.activeTableStyle.timeIntervals, this.activeTableStyle.colorMap, this.activeTableStyle.pointSizeMap, From 728840214f62e3684286efca7dbaf0878500b560 Mon Sep 17 00:00:00 2001 From: Nick Forbes-Smith Date: Tue, 24 Oct 2023 17:51:50 +1100 Subject: [PATCH 343/654] Fix share links with picked features for protomaps --- CHANGES.md | 1 + .../ProtomapsImageryProvider.ts | 29 ++++++++++++------- lib/ModelMixins/GeojsonMixin.ts | 4 ++- .../MapboxVectorTileCatalogItem.ts | 1 + 4 files changed, 24 insertions(+), 11 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index b435f7cf136..1ee97136874 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -10,6 +10,7 @@ - Fix `GeoJsonMixin` timeline animation for lines/polygons - Fix bug in mismatched GeoJSON Feature `_id_` and TableMixin `rowId` - this was causing incorrect styling when using `filterByProperties` or features had `null` geometry - Fix splitter for `GeoJsonMixin` (lines and polygon features only) +- Fix share links with picked features from `ProtomapsImageryProvider` - [The next improvement] #### 8.3.6 - 2023-10-03 diff --git a/lib/Map/ImageryProvider/ProtomapsImageryProvider.ts b/lib/Map/ImageryProvider/ProtomapsImageryProvider.ts index cf29e8f651a..20fd81084c6 100644 --- a/lib/Map/ImageryProvider/ProtomapsImageryProvider.ts +++ b/lib/Map/ImageryProvider/ProtomapsImageryProvider.ts @@ -5,36 +5,35 @@ import circle from "@turf/circle"; import { Feature } from "@turf/helpers"; import i18next from "i18next"; import { cloneDeep, isEmpty } from "lodash-es"; -import { action, observable, runInAction, makeObservable } from "mobx"; +import { action, makeObservable, observable, runInAction } from "mobx"; import { Bbox, - Feature as ProtomapsFeature, GeomType, - Labelers, LabelRule, + Labelers, LineSymbolizer, - painter, + Rule as PaintRule, PmtilesSource, PreparedTile, - Rule as PaintRule, + Feature as ProtomapsFeature, TileCache, TileSource, View, Zxy, - ZxySource + ZxySource, + painter } from "protomaps"; import Cartographic from "terriajs-cesium/Source/Core/Cartographic"; import Credit from "terriajs-cesium/Source/Core/Credit"; -import defaultValue from "terriajs-cesium/Source/Core/defaultValue"; import DeveloperError from "terriajs-cesium/Source/Core/DeveloperError"; import CesiumEvent from "terriajs-cesium/Source/Core/Event"; import CesiumMath from "terriajs-cesium/Source/Core/Math"; import Rectangle from "terriajs-cesium/Source/Core/Rectangle"; import WebMercatorTilingScheme from "terriajs-cesium/Source/Core/WebMercatorTilingScheme"; +import defaultValue from "terriajs-cesium/Source/Core/defaultValue"; import ImageryLayerFeatureInfo from "terriajs-cesium/Source/Scene/ImageryLayerFeatureInfo"; -import filterOutUndefined from "../../Core/filterOutUndefined"; -import isDefined from "../../Core/isDefined"; import TerriaError from "../../Core/TerriaError"; +import isDefined from "../../Core/isDefined"; import { FeatureCollectionWithCrs, FEATURE_ID_PROP as GEOJSON_FEATURE_ID_PROP, @@ -85,6 +84,8 @@ export type ProtomapsData = string | FeatureCollectionWithCrs | Source; interface Options { terria: Terria; + /** This must be defined to support pickedFeatures in share links */ + id?: string; data: ProtomapsData; minimumZoom?: number; maximumZoom?: number; @@ -272,6 +273,10 @@ export default class ProtomapsImageryProvider readonly errorEvent = new CesiumEvent(); readonly ready = true; readonly credit: Credit; + /** This is only used for Terria feature picking - as we track ImageryProvider feature picking by url (See PickedFeatures/Cesium._attachProviderCoordHooks). This URL is never called. + * This is set using the `id` property in the constructor options + */ + readonly url?: string; // Set values to please poor cesium types readonly defaultNightAlpha = undefined; @@ -349,6 +354,7 @@ export default class ProtomapsImageryProvider } this.errorEvent = new CesiumEvent(); + this.url = options.id; this.ready = true; @@ -544,10 +550,12 @@ export default class ProtomapsImageryProvider this.source instanceof GeojsonSource && this.source.geojsonObject ) { + // Get rough meters per pixel (at equator) for given zoom level + const zoomMeters = 156543 / Math.pow(2, level); // Create circle with 10 pixel radius to pick features const buffer = circle( [CesiumMath.toDegrees(longitude), CesiumMath.toDegrees(latitude)], - 10 * this.terria.mainViewer.scale, + 10 * zoomMeters, { steps: 10, units: "meters" @@ -662,6 +670,7 @@ export default class ProtomapsImageryProvider return new ProtomapsImageryProvider({ terria: options?.terria ?? this.terria, + id: options?.id ?? this.url, data, minimumZoom: options?.minimumZoom ?? this.minimumLevel, maximumZoom: options?.maximumZoom ?? this.maximumLevel, diff --git a/lib/ModelMixins/GeojsonMixin.ts b/lib/ModelMixins/GeojsonMixin.ts index df72d0fe261..8a5ca3e7169 100644 --- a/lib/ModelMixins/GeojsonMixin.ts +++ b/lib/ModelMixins/GeojsonMixin.ts @@ -88,6 +88,7 @@ import LoadableStratum from "../Models/Definition/LoadableStratum"; import Model, { BaseModel } from "../Models/Definition/Model"; import StratumOrder from "../Models/Definition/StratumOrder"; import TerriaFeature from "../Models/Feature/Feature"; +import { TerriaFeatureData } from "../Models/Feature/FeatureData"; import { ViewingControl } from "../Models/ViewingControls"; import TableStylingWorkflow from "../Models/Workflows/TableStylingWorkflow"; import createLongitudeLatitudeFeaturePerRow from "../Table/createLongitudeLatitudeFeaturePerRow"; @@ -102,7 +103,6 @@ import { ExportData } from "./ExportableMixin"; import FeatureInfoUrlTemplateMixin from "./FeatureInfoUrlTemplateMixin"; import { isDataSource } from "./MappableMixin"; import TableMixin from "./TableMixin"; -import { TerriaFeatureData } from "../Models/Feature/FeatureData"; export const FEATURE_ID_PROP = "_id_"; @@ -775,6 +775,8 @@ function GeoJsonMixin>(Base: T) { let provider = new ProtomapsImageryProvider({ terria: this.terria, data: protomapsData, + // Note: this URL is only used for Terria feature picking (see PickedFeatures.ProviderCoordsMap) + id: this.uniqueId, paintRules: [ // Polygon features { diff --git a/lib/Models/Catalog/CatalogItems/MapboxVectorTileCatalogItem.ts b/lib/Models/Catalog/CatalogItems/MapboxVectorTileCatalogItem.ts index 7e9ee34aefa..6d21833590f 100644 --- a/lib/Models/Catalog/CatalogItems/MapboxVectorTileCatalogItem.ts +++ b/lib/Models/Catalog/CatalogItems/MapboxVectorTileCatalogItem.ts @@ -206,6 +206,7 @@ class MapboxVectorTileCatalogItem extends MappableMixin( return new ProtomapsImageryProvider({ terria: this.terria, + id: this.uniqueId, data: this.url, minimumZoom: this.minimumZoom, maximumNativeZoom: this.maximumNativeZoom, From dc01dff1b4d865de3ce0549a38f9b8ca57f03326 Mon Sep 17 00:00:00 2001 From: Nick Forbes-Smith Date: Wed, 25 Oct 2023 11:32:20 +1100 Subject: [PATCH 344/654] Remove comment --- lib/ModelMixins/GeojsonMixin.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/ModelMixins/GeojsonMixin.ts b/lib/ModelMixins/GeojsonMixin.ts index 8a5ca3e7169..14684953008 100644 --- a/lib/ModelMixins/GeojsonMixin.ts +++ b/lib/ModelMixins/GeojsonMixin.ts @@ -775,7 +775,6 @@ function GeoJsonMixin>(Base: T) { let provider = new ProtomapsImageryProvider({ terria: this.terria, data: protomapsData, - // Note: this URL is only used for Terria feature picking (see PickedFeatures.ProviderCoordsMap) id: this.uniqueId, paintRules: [ // Polygon features From 33a90239b2adee4a87308d8bac74afc93ca49947 Mon Sep 17 00:00:00 2001 From: Stephen Davies Date: Wed, 25 Oct 2023 14:19:53 +1100 Subject: [PATCH 345/654] Add attribution on screen and google logo for Google Photorealistic 3D Tiles --- lib/Models/Cesium.ts | 110 +++++++++++------- lib/ReactViews/BottomDock/MapDataCount.tsx | 5 +- .../Map/BottomLeftBar/BottomLeftBar.tsx | 73 ++++++++++-- .../TraitsClasses/Cesium3dTilesTraits.ts | 7 ++ wwwroot/images/google_on_non_white_hdpi.png | Bin 0 -> 11448 bytes 5 files changed, 136 insertions(+), 59 deletions(-) create mode 100644 wwwroot/images/google_on_non_white_hdpi.png diff --git a/lib/Models/Cesium.ts b/lib/Models/Cesium.ts index 4ddda5ab67a..f54115c838b 100644 --- a/lib/Models/Cesium.ts +++ b/lib/Models/Cesium.ts @@ -94,6 +94,11 @@ import { setViewerMode } from "./ViewerMode"; //import Cesium3DTilesInspector from "terriajs-cesium/Source/Widgets/Cesium3DTilesInspector/Cesium3DTilesInspector"; +type CreditDisplayElement = { + credit: Credit; + count: number; +}; + // Intermediary var cartesian3Scratch = new Cartesian3(); var enuToFixedScratch = new Matrix4(); @@ -129,7 +134,10 @@ export default class Cesium extends GlobeOrMap { | MappableMixin.Instance | /*TODO Cesium.Cesium3DTileset*/ any; + // Lightbox and on screen attributions from CreditDisplay private cesiumDataAttributions: IObservableArray = observable([]); + // Public because this is accessed from BottomLeftBar.tsx + cesiumScreenDataAttributions: IObservableArray = observable([]); // When true, feature picking is paused. This is useful for temporarily // disabling feature picking when some other interaction mode wants to take @@ -490,6 +498,7 @@ export default class Cesium extends GlobeOrMap { const creditDisplay: CreditDisplay & { _currentFrameCredits?: { lightboxCredits: AssociativeArray; + screenCredits: AssociativeArray; }; } = this.scene.frameState.creditDisplay; const creditDisplayOldDestroy = creditDisplay.destroy; @@ -505,48 +514,16 @@ export default class Cesium extends GlobeOrMap { creditDisplayOldEndFrame.bind(creditDisplay)(); runInAction(() => { - const creditDisplayElements: { - credit: Credit; - count: number; - }[] = creditDisplay._currentFrameCredits!.lightboxCredits.values; - - // sort credits by count (number of times they are added to map) - const credits = creditDisplayElements - .sort((credit1, credit2) => { - return credit2.count - credit1.count; - }) - .map(({ credit }) => credit.html); - - if (isEqual(credits, toJS(this.cesiumDataAttributions))) return; - - // first remove ones that are not on the map anymore - // Iterate backwards because we're removing items. - for (let i = this.cesiumDataAttributions.length - 1; i >= 0; i--) { - const attribution = this.cesiumDataAttributions[i]; - if (!credits.includes(attribution)) { - this.cesiumDataAttributions.remove(attribution); - } - } - - // then go through all credits and add them or update their position - for (const [index, credit] of credits.entries()) { - const attributionIndex = this.cesiumDataAttributions.indexOf(credit); - - if (attributionIndex === index) { - // it is already on correct position in the list - continue; - } else if (attributionIndex === -1) { - // it is not on the list yet so we add it to the list - this.cesiumDataAttributions.splice(index, 0, credit); - } else { - // it is on the list but not in the right place so we move it - this.cesiumDataAttributions.splice( - index, - 0, - this.cesiumDataAttributions.splice(attributionIndex, 1)[0] - ); - } - } + syncCesiumCreditsToAttributions( + creditDisplay._currentFrameCredits!.lightboxCredits + .values as CreditDisplayElement[], + this.cesiumDataAttributions + ); + syncCesiumCreditsToAttributions( + creditDisplay._currentFrameCredits!.screenCredits + .values as CreditDisplayElement[], + this.cesiumScreenDataAttributions + ); }); }; } @@ -1033,11 +1010,11 @@ export default class Cesium extends GlobeOrMap { : undefined; if (!center) { - /** In cases where the horizon is not visible, we cannot calculate a center using a pick ray, + /** In cases where the horizon is not visible, we cannot calculate a center using a pick ray, but we need to return a useful CameraView that works in 3D mode and 2D mode. - In this case we can return the correct definition for the cesium camera, with position, direction, and up, + In this case we can return the correct definition for the cesium camera, with position, direction, and up, but we need to calculate a bounding box on the ellipsoid too to be used in 2D mode. - + To do this we clone the camera, rotate it to point straight down, and project the camera view from that position onto the ellipsoid. **/ @@ -1851,3 +1828,46 @@ function flyToBoundingSpherePromise( }); }); } + +function syncCesiumCreditsToAttributions( + creditsElements: CreditDisplayElement[], + dataAttributionsObservable: IObservableArray +) { + // sort credits by count (number of times they are added to map) + const credits = creditsElements + .sort((credit1, credit2) => { + return credit2.count - credit1.count; + }) + .map(({ credit }) => credit.html); + + if (isEqual(credits, toJS(dataAttributionsObservable))) return; + + // first remove ones that are not on the map anymore + // Iterate backwards because we're removing items. + for (let i = dataAttributionsObservable.length - 1; i >= 0; i--) { + const attribution = dataAttributionsObservable[i]; + if (!credits.includes(attribution)) { + dataAttributionsObservable.remove(attribution); + } + } + + // then go through all credits and add them or update their position + for (const [index, credit] of credits.entries()) { + const attributionIndex = dataAttributionsObservable.indexOf(credit); + + if (attributionIndex === index) { + // it is already on correct position in the list + continue; + } else if (attributionIndex === -1) { + // it is not on the list yet so we add it to the list + dataAttributionsObservable.splice(index, 0, credit); + } else { + // it is on the list but not in the right place so we move it + dataAttributionsObservable.splice( + index, + 0, + dataAttributionsObservable.splice(attributionIndex, 1)[0] + ); + } + } +} diff --git a/lib/ReactViews/BottomDock/MapDataCount.tsx b/lib/ReactViews/BottomDock/MapDataCount.tsx index 0468faa962a..e10e54db3e5 100644 --- a/lib/ReactViews/BottomDock/MapDataCount.tsx +++ b/lib/ReactViews/BottomDock/MapDataCount.tsx @@ -39,10 +39,7 @@ const MapDataCount = observer(function (props: Props) { : t("countDatasets.noMapDataEnabled"); return ( - // Should we even provide a wrapper Box? makes sense not to, but most of the - // components as they stand come with their own "wrapper" via scss - // - + props.theme.mobile}px) { bottom: 35px; } + display: flex; +`; + +// Use padding to avoid other UI elements +const AttributionsContainer = styled(Text)` + text-shadow: 0 0 2px #000000; + padding-left: 8px; + padding-right: 56px; + @media (max-width: ${(props) => props.theme.mobile}px) { + padding-right: 8px; + padding-bottom: 32px; + } `; + const shouldShowPlayStoryButton = (viewState: ViewState) => viewState.terria.configParameters.storyEnabled && defined(viewState.terria.stories) && viewState.terria.stories.length > 0 && viewState.useSmallScreenInterface; -const BottomLeftBar: FC = () => { +const BottomLeftBar: FC = observer(() => { const { t } = useTranslation(); const theme = useTheme(); const viewState = useViewState(); + const screenDataAttributions = + viewState.terria.cesium?.cesiumScreenDataAttributions; + const isNotificationActive = viewState.terria.notificationState.currentNotification; + const isUsingGooglePhotorealistic3dTiles = + viewState.terria.mainViewer.viewerMode === ViewerMode.Cesium && + viewState.terria.workbench.items + .filter((i): i is Cesium3DTilesCatalogItem => i.type === "3d-tiles") + .some( + (i) => + i.url?.startsWith( + "https://tile.googleapis.com/v1/3dtiles/root.json" + ) && i.show + ); + return ( { ) : null} + {/* Google Logo. Needed for Google Photorealistic 3D Tiles + */} + {isUsingGooglePhotorealistic3dTiles && ( + + )} + {/* On screen data attributions. At the moment, this supports only Cesium viewer. + Needed for Google Photorealistic 3D Tiles + */} + {!!screenDataAttributions?.length && ( + + {screenDataAttributions + .flatMap((attributionHtml, i) => [ + + {parseCustomHtmlToReact(attributionHtml)} + , + + ]) + .slice(0, -1)} + + )} ); -}; +}); export default BottomLeftBar; diff --git a/lib/Traits/TraitsClasses/Cesium3dTilesTraits.ts b/lib/Traits/TraitsClasses/Cesium3dTilesTraits.ts index f98dd03086f..b3e88b8b9cb 100644 --- a/lib/Traits/TraitsClasses/Cesium3dTilesTraits.ts +++ b/lib/Traits/TraitsClasses/Cesium3dTilesTraits.ts @@ -101,6 +101,13 @@ export class OptionsTraits extends ModelTraits { description: "Point cloud shading parameters" }) pointCloudShading?: PointCloudShadingTraits; + + @primitiveTrait({ + type: "boolean", + name: "Show credits on screen", + description: "Whether to display the credits of this tileset on screen." + }) + showCreditsOnScreen: boolean = false; } export default class Cesium3DTilesTraits extends mixTraits( diff --git a/wwwroot/images/google_on_non_white_hdpi.png b/wwwroot/images/google_on_non_white_hdpi.png new file mode 100644 index 0000000000000000000000000000000000000000..393d03005d5bd544bd8655319844fca20fc10fc2 GIT binary patch literal 11448 zcmeHscTkht)_3SdX@Vd9lF%Xa7J63#1PCpZP^I@GO(}wabm>h51q4J?5TuJB zAWeEvse%Gu^qhO{x%0g<-`tt+{qJPvDSPj=etWIoT6<0Qvl9{e8WiMAsd$c*Z$m8 zn(xBYc6W()@g|(-5WE^u9Zxz838#W|k!XKAQ2)+m7uLGEy|FuDZLxmv{rrOW>d!BS zyeHivKQNb`a16unJ$pHRu91bzWoJCCON|^J1E%m(685Wd!*5$3lvhS~WH+|z$Pu_e!ZJf+$WpvRT_A*5{rNx-{;qiE(@y}=3 zU-e}>p9QoI=LRg6ihGG=^(bEWT^?RJslKif7~6TP*24S_xzr$H?Jy@TBg3m(Sy;43 zF)aMt@Fp#zP*Ss%BlYwVv`=7(ic3>;ERl+yO;P^F#|yRyBJZtUdle9Yqj1?Z*RR6r zu2D+<*C3X`x=;}?wRYkIwb%JZ+|u$}lOg4?Cu0^MQQ4a$L;djLZl-69=)1M~SB@rp z9>qCnapxGhqRVp(o%AF>7`b_v7Rgw<&O8}+b*pO|b25-W8F#}xKN(w3;Ka*AO^&Iv zI}8m#c{K_{Ztq7z&27-DrgPObbzQIX)K4v1?ceA5F-rx^p`+P5_F8|i-7fUvE5By| zJ!+X4kvTAOm45aB^X#Z~_RG@)=cz9A`Ro_Peyi_J!d<$X(Ywx5fk%;-vT*8ry45=| zYB>aq7;QWv)+~ty)nUV2%zwiT6YREwtSw|%=+ALuPMl!hoR=kZ>JXf z=BwcA>mGoVPuRjnFv;WAR@h05H?s3nc5GhgjuTY@^ zpZFy1G}j*$t8Xnx@_-fe8WdBW>3PrITl0I&UpJdQT~jqWw>r<-wSijmQiXS%H$=fI^y)1*(_s=d(<+I@wGd9;+?ZRWzS&%)D=sCmO$ldDMX* z-kelliuGj4&8y;l(yH%p5IJ(3Awu;0CH@y5JqHwd-Lsnf?wx9dz<0xFDVNf0_vf#g zQ_D?eDB$ieP_+>udh@nnV0S+(1tE)dB_yPb7a?_Sc!lt1&GhR2z6CQQ92|h=l2Ei#%tvrq%rW7kP zR|#3gG4=;*+tdX751St9K+fJ}!ZTui+>&qaevT)Cg*}MbnY}&Oy3$PG{qQ+ICeKaC zUg;>GHjry~a=sX-!AF;Sce{#4o_-ul75>E*at<_&{5T>3EN5s+S$y>zXki<2!$`wjg!8DP_B$@_`xTLh_Pjb_s+fsb@1y1)($0RZX)O{Y#% zR=QRLrti%LNKTG0ev#&zsjd<)mnL=Ynz zg!)lLY0+_|-xb*;)dwnhA13y5DLokRs~d{l_B|qE#A0EGUVKsv6gP-j19ddac1?x* z3h-!j^|h^q0#|n+#R505aMDV1pRlr&Dqr%me3=I%w~qG|*xzOdUn^WQFW7U zGTO{lPY2tUwWRo?DXZd$?zY2qik|f;ABv^V5iZm=s{*-Mncnt51U3Pp=rQf0cex#= z+Qsn-ff-!^z#E?1YudKac95O!GD-;HSYDBLJxM^+*S6t%EaR!3tXI{Y-$XXYQ(8%T zI|-HG`|C!L8g4$OfQ=l3zRH`s$0{MLsUl>X<6Om(8t_MBQ+b*v@o0cXS*i1Mn{`Hs zJTdxiNl9rO={yh7j?77U&I8K5R^Fc8mdfwaYoqLz=As%TL5oGw4BsEppUcaoP@8`U z*I?CN9`;++o;Kd2imjK9F$js3I#=@C%w60^F}zS#Ig8W1W*U&r#n&e+zdrS`%51+I z=4C^^L4CYI#%+uy*``HA?1}6KD7oQ5#YHzL1@E7TefX@oMsM$)9fm(m98Ia!w8MM% zBwe(+@6eVY)jv#-K?j1!wBoL)`!u5zzkTKcP3ALOk8n`wAhDahV5LE9PtrR^>=Clv zr9{I?LY)sYR*J{jQPt88WzdS$?lqV8A!!oj>RJxeTo7Z9Ma^50uA*n6@hQA`_ zBci1L+8xNz)y^ay6IwhqCNaR+lS1U1Z(~G_Ujf&62}uNtU8tX=6wd7nlk!lBCaT_? z>!AvsAuJ4e70JdP5lVFWHTpQV`(q3?<650@oUDF1*yJmKRV>oHv~o*DZe=%vTV(hS z8Ml~KjiVu94RK4nR6Fw$r~Al;?RRUJ!v=+wi$f09t(P>`ca&$Y(}DNOZY0{*n*u#m>@Gp`?KteQM3OG2Y1?$?df>Bohq> z4XaF#OZg^HIVTae$P~LC1dFBYeH1#XqW9M6w7nbNX&f=EB0UfxGflrb z$>)G2pf7QaWPXFqtDKmv=wds&;eFH~E@XB_ORiw%WNe-NMCtWBdQcB<#l*&BrmeT4 zc!Mk#q4?r>YKlbRi?==>&I`C1n-5q!dHQ7(@&=Y>B>USTtiO)1MvD;PM`vNnS+(R%p8o^kve$8Vl9;5!=l9kk52EV6~{4eFsG)vLfM`qA&6!>P#<*YWn%oZwN3^VjOD1Va!CPS-L~h@ z>%Vi>BE(G6?6vPu{vm!46LntH9Hq*BgyF9#KM2{q0yCWLpgvHl*#FdooS;q;Qa_@s z1}ZXjs*gk}#;Ix07|L-H!|`0AN!3irXwHJ8>WPXzIjT~Oygh@>_7u_)`qWXXz3v8Q zeF_a{$&~YF|K>Njzv*y~0v)5@8^u9EBn&T9b*E=3&pz?F--&P#Wy!h_FzvDFL=s!D zkmcX^01!y%A@NaI0eg}w9w$_~_0BLV(Cq2cCvBPQQ$T4J?soQAM%u{KjRuOBx-BDb zi3;;+2l4n9-633FEd%|B)l_&Tn)g7#dE4Q59aM&RPl_ela{~*O)e?NFDd6s0&lH=+K>~mh{ z`QBH*M-LCTy6c5k!N_jPjL=c)y3cwul<&pq?%Uq0Gh8O-;{ub*J+YPK8DBM#AjGCg zJoAs8%LAXHxzQFTes=PXL0t$@rMwyTdVTS!GxGeJA8a+C>FJ)l)0hbRI)oBTk9 z3HfIZ^{`V#AbFHp97d7tQ8SX~XH?9A+s@Z~7H~eeBgkRG-+RB^dg|&fx@RWBi)&XY z`FXj(_3tAQ>lu>4{Z~U94C$0eT%^cd)1O$)v>`fNdmdBfUFZ>d4)^VQ+`rf9(VH4U ztJ^~cr&daKU9=NxCAiVckddHjI8TdBA)48$O<=lzJ>YKRZ8sVjAgMG>C6>yay0so8 zPg&Ua$oz<&{m~vxGPj)*oMk8Ki~c(k5}xLRv)9zFq`=R?4r1`g_e-pS7LKY>3pX@x zkaYL7Z4+yK0ybRjazEAEx5}jAj>-3rnDH$|KKcG>en@jVRdXQv_+h!rF>%wXSMzHg zd>^jH=?F}X7C)KTrb&|k6J^g*6SOa^Se$0MW_=LP(3dZuC?gA$>^*>dLscDd7hZb{ zMz2WNt!i&B(Un~iO-o#4PfLdS&dDXTFF}hhR}%+gSzD-5aoNJl{L$9?b^T4)qD2S$ zQhVWD&ZA1Y$$J>4rqmN2iu19rIj*}6nv-P+0>o@&sI8O|jUyIoo8W8sDcfl4rrB`u z!_)pL$XxSuZr+AHK4)-0Gc{HI`r|`JAIQ6_VZopPAUAfgtmuV0xepgiC&mT_NW81) z=n4GpIOHYEI_O=gNFJ@iCCRKrBpT7K`{t>W&8`bSP|ZG%Jr&eVtLv$GgFyt?chP&(w@2FEA3oSxqyHYt+Yr1m(9pwd8R|6E-Sxpl+va|@`Sx3 zf{afk&&c*DlqK(l8p{qSqFtIw&eL^g5tDlNjZ-d7jo_~VZZnOjJP=H>R9+b+7o~@-#-qo<<6pv5!};)# zmy`{WKJd}T+uDO35fD@t82xzGK4C^+Bi#WYX^#oXmKxch8KRrsTE&imN9XUB^yQWE zrPcWMGuj_$1GypB$W5mBU35r|8;j--4aGC@FTQa|mV`br>{d$oLNZbln$fPYz;1L! z5nKLAG|`aSPLg&DGIHE>O%V0gmqqe*@TngKI0K)tx`Pc^`NYf-uVhSqXFK6^bjXMS+!wyLX{R1 z8^@MiS;lqcVe*@ctMY6&WFfS|Y?8D#eWWJuiKes%xBLkx>R+U|W4oRD94|kSHQ#zC zsK9;VQaXW9b#GaE%dKBptecba^|VRhdR$-2s=)PlA*ue7oBE@f%GvZG@7j%`iQI}e z+K1Xmk+%J-jR7X z_WfzxRyyldi{1{V4^G8&wo^NFq{|N^+kV&} z+$p)_!)%%-Y277Cd;rnw3@n8TdR;lqP$Ip&N^TLR7cdUsZx?VSEsQ-E2n45uLbslZ zd0e?}wQ_?6h$zgviFAG&O;RS}L?=X_8fXi6lawc7X;MZt@WGVRmb#eSenTR)RB}>C ziVj9^^Ky9J+*TKohSeSoQFYC|^8I^s8gpK!IYkF-FwE$Xy#B+s-V0tNkz;AZ=9K&dNrPQ z-?Z>DKCz0xtSy|AameDUMjNuIlj`{gzX5a#GsCjGL#|{$*fuad$MwRtrG0_ktARv; z72y}o-Vr5Z`8FesqYouCvC5Q9`uQc5qxX;6+dR}HgQGlw_VZS&B!DKru}y?52Y%#o z6Qt)BIcehu(=gk_+EGH+m(%pz;{CcnK^1`%iy%fMiRZd>49R3e|F_$Ci;`k*^`8ah z0Dx<)KRW=#E7Ipkb<>A zP!y(gjL%Zq$L>{f#*d_n%|sq0f|nBzft07>JF>0<#m}bSRzast#X9-r3C+XiD}s4O znfM9xpV=A5t-YvDIf~dTeL31|WN#1;)r%&3BtpKK3bcJ)dmoE;Pn1cX!W~A!^{Su# z4nd$w!8RLjE}tDyo!Volk`?FXOzcX8rM=sv`NDNP0H+?QfRRgo$f7bQvqO{Z`-|85 z3v95|(AI=0R{*Rwnv(13Q|+sgo&FTh3kI0SCK@#uWQyM|%#AEwjHOV8%Vn!Fy6M{} zU74?3!6IwwVOq$H6j?H5{+*>UU-Dlq6TV@Nn!pSe^uGa^7~C4rGJE}cy;&ps zni7jk;M6^0g)-T9YkSOmndMDOT`oqBg7ugxU&(fMzRju`(EhPN^!_^AgN_Ur(dOvS z6D^G`dlkwcAUW@$!WczgQ64P&ANS1J2~+E$cZZ?W~Z^IA9cs75b}8M zotv?op$J8_HCiFR7SCY5z1U4i59zqz$Do?S&zt{Zi7w4^GveoH571Gz`xDRpU}=Tp zr;bbF>KB2I$%_~U0055@t*VO9QdRxe*L~bK{rrOTCheC9y0~tWCN*rjHi>utqLr8U zJsnfhD3v?cYxU80?Zp#0wD`LsF(p(J%G4o*>`E_YF4aj$9tSRc4QClXy}T{jvcsi2 zxN58UxZ3Od#fA?S)wbX=Q94Lm02DfiTrU_6RJhf2r|U4q{9x{(Gk4M;q8))k-ZZh> zO)dz^Vm50El0Bq)MP)Cm{aEuS*Qdns{>GW32}k;iz`WVoS2M4kZPv7UL)Yl29*9d+ zaG4yI=fX5(cC>8C@%Q-2%E_97eczePC1^vRu_VNS<|{ZbHNyv);OsXhH+hy)O$vFa z4!RfI*qx6m-dlfGrkSkcHgy9>o@iLGE1xi$H83~Bx)-LzRwgAbLsl4`gAfMBZr^X= z4oQO1xWf<&Jzbas#zO?@h_OeB1bTSk4od(4ImJLPq=Op@3$#Z$qdnz8Upl%$K(wPg z$XrrSOwUUd<$~4>_CXm3>zg>K2XMFt9c`f~n)_yYru@^$b*dtuQSPv9?1 zq&>zDD-QzU#)1E`&%;Yk?=N^y-#=Nv@gW+B^b!>p5fkthW!fM zAJ!Q7pmAA=bpN|mzn~m(Q1%c>87KsT6qZ2BK!qV-F-Kt;aYr#>Cus=@2{AFSq$Je- zHa7Wpet zaR9$HaL&L~eNad&#>WJMahC`EvI+Q0^RHn&+vr* zNWmmzgmF!=zsX}9(N01CFX>;a2PpRk%bI9k-26emyZ%^G#whPUT7NX%(ZAOc5cqpl zz>p4qxZsQQNBt2k9M&I04lYPfXB4h{{F$%+>PP<%xnPfkIyge?C50gp5@6g-Mp9VD z-bqGS94zkO2!`5AIY=RYv+x(XFUAQQfb>BrJL7o7afQpz-&_It{)iO+e~JgVpnin` z#~6+x;lCJzi2cc!=${^o{;C@Pa#>FF{~|^1x4_@Z3{LNlK3w_2RYTFg%Hf}+;SB!Y z{QVh>|II0Yz<(zBulW6ku7BwIuNe5Rg#XE|f9U$J82GP*|H-cZZ*-CWdqait#QhBl zz-^ay9QkN)TP=Kh9Su0(GCpmn8`mQ9(zNsi0Ityfy6^yb`8RN#Bv>syHIg+FdRh^_ zZ7tY60D!1f3$AS9@@d}E+C5W^?!w9cS!=&(41EG|Qc|W}S)HAsCtk0fmQv!rT@k(l zwICW1m1nmc4bmnwOoaF7^d>7rh`P%d`)e2G~K|EkF^d1T*x?Ox@0TsclBW^1#GCMR_{&?H%wn#Y-O_;b|eo(5U zxrkPZyEM$9|7Q9R{J8#g=W(9bWlGYob5BtPR{$YudI(cI-Zpa6OXtfcs@K=;G7hk# zU9FDosHBcCdw=6Z_oR=GG0q)Q$^I>?YfbP*;?RpPxuEyQop(f_gah8W!U8Cpgq*(R z4QDpJED&hl!>e-H+C`76BOzf_P2}50Vk(J;+o9Pd-E<^BV|NCQO1^|jP7`}O9>;jk z96llOO}V&ZU`{;h%|81jko3Uf0R3>JOP-yJF9^}Mxe?*fnQ?5){bYJ%+o3>0JU^yV zF77k3+V?86QcedVWqzA0R8?a)sEZnY5?{7KZ%G;~43@kp#QIL8zSWRQLx?+R#VERC z7?nM})VYCAI96_2@gb0KD_aQNi zfrewPO1!dBZ#t(QTUrAG9Wqd*#=(OprZ2eoOy<|19cngfKa-!9J#p&nzaR49iSEZ3 z`lX+aUf|h9sb_26@wug zQ5Y*Aaf_ZO_V%Eh{Ab310I~Ug1)naLLS5@b58h7QnpKgUp>%_kj8|iU%;_J3ivR#b z=>q@&s-D7npj4Bx8>Y2He8c7mNr2FB%NY~%xn50AbHDNld zE-y%prDFmAU@f#wq{P*?a8HZ)O&ZA}F~Th$Avt&mdqc}zq0X5kOSC(8p5ennQC?{5Js7G#BxI-!=c=b44ON?xp%UXna4z2+@le-C87IGCEp=Hg_HeyYq z1j$8vPQUn(wJz^M(a#GC9&shFtncJ$S7k5~ zY$mrl#uaowcnbeW063|Toa!B8UcNPUR~&1&Eake)xW`Pnn@kg$b!ZHs82w1+h5U%@ z?$(aC(UwW@l>Nv!F96egPb0j<$>~76t!lm8Sl6h3UluwhvQTchuIrY#T;`VPmHBk_ zvv)nI!gDy>CAP1@Y@hTjok@QF_-lSqtq?LSdsuc##1s7)l9Yg8O)Gf`0<~~{ z$LB-dROyD+n!hD9NWJnjh5`BXP=h}2z1pN*L)Yl*g0=#=1keCp74396B~f`K+&e#3 z%P6AoY1wh5&wCZgGyRCR*a`vwLw^Whl$~FL@xH7b3pqE5a5bB(soK_R(q%JgZLJrr z&PyBdPhE^psjpZ~UJEH>&eY&Bo?c(B)-deL z$&Plui5*Wq_>S)Q+^w+kwzS02L20nL}!{5NCAl_DjyokQoG uwr>LlTjp2yz;yHPO(&N=zw3V(PLN2*yJS4b8-gq904+6rc)f~U)c*mQ%#mLJ literal 0 HcmV?d00001 From 9151a0013c5b2a15a2a26ea389c80aaf372a6b4c Mon Sep 17 00:00:00 2001 From: Stephen Davies Date: Wed, 25 Oct 2023 14:20:17 +1100 Subject: [PATCH 346/654] Fix mobx warning --- lib/ReactViews/Map/ProgressBar.tsx | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/lib/ReactViews/Map/ProgressBar.tsx b/lib/ReactViews/Map/ProgressBar.tsx index 9fcc5359d60..6c60dbb3a09 100644 --- a/lib/ReactViews/Map/ProgressBar.tsx +++ b/lib/ReactViews/Map/ProgressBar.tsx @@ -1,9 +1,10 @@ -import React, { VFC, useCallback, useEffect, useMemo, useState } from "react"; +import { observer } from "mobx-react"; +import { VFC, useCallback, useEffect, useState } from "react"; import styled, { css, keyframes, useTheme } from "styled-components"; import EventHelper from "terriajs-cesium/Source/Core/EventHelper"; import { useViewState } from "../Context"; -export const ProgressBar: VFC = () => { +export const ProgressBar: VFC = observer(() => { const [loadPercentage, setLoadPercentage] = useState(0); const [indeterminateLoading, setIndeterminateLoading] = useState(); @@ -32,13 +33,8 @@ export const ProgressBar: VFC = () => { }; }, []); - const backgroundColor = useMemo( - () => - terria.baseMapContrastColor === "#ffffff" - ? "#ffffff" - : theme.colorPrimary, - [terria.baseMapContrastColor] - ); + const backgroundColor = + terria.baseMapContrastColor === "#ffffff" ? "#ffffff" : theme.colorPrimary; const allComplete = loadPercentage === 100 && !indeterminateLoading; @@ -50,7 +46,7 @@ export const ProgressBar: VFC = () => { loadPercentage={`${loadPercentage}%`} /> ); -}; +}); interface IStyledProgressBarProps { loadPercentage: string; From 223970cf2894fec920c88553347b60ceb279e47a Mon Sep 17 00:00:00 2001 From: Stephen Davies Date: Wed, 25 Oct 2023 14:23:59 +1100 Subject: [PATCH 347/654] Remove debugging console logs --- lib/ViewModels/TerriaViewer.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/lib/ViewModels/TerriaViewer.ts b/lib/ViewModels/TerriaViewer.ts index 5e5c7568f26..f2ddec0e238 100644 --- a/lib/ViewModels/TerriaViewer.ts +++ b/lib/ViewModels/TerriaViewer.ts @@ -219,7 +219,6 @@ export default class TerriaViewer { newViewer = untracked(() => new NoViewer(this)); } - console.log(`Creating a viewer: ${newViewer.type}`); this._lastViewer = newViewer; newViewer.zoomTo(currentView || untracked(() => this.homeCamera), 0.0); @@ -248,7 +247,6 @@ export default class TerriaViewer { let currentView: CameraView | undefined; if (this._lastViewer !== undefined) { this.beforeViewerChanged.raiseEvent(); - console.log(`Destroying viewer: ${this._lastViewer.type}`); currentView = this._lastViewer.getCurrentCameraView(); this._lastViewer.destroy(); this._lastViewer = undefined; From f10f0c7269ae1d234727c29cda8e90c9ff2aca62 Mon Sep 17 00:00:00 2001 From: Stephen Davies Date: Wed, 25 Oct 2023 15:33:34 +1100 Subject: [PATCH 348/654] Add changelog entry --- CHANGES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES.md b/CHANGES.md index 1ee97136874..ead7503da41 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -11,6 +11,7 @@ - Fix bug in mismatched GeoJSON Feature `_id_` and TableMixin `rowId` - this was causing incorrect styling when using `filterByProperties` or features had `null` geometry - Fix splitter for `GeoJsonMixin` (lines and polygon features only) - Fix share links with picked features from `ProtomapsImageryProvider` +- Added on screen attribution and Google logo for Google Photorealistic 3D Tiles. - [The next improvement] #### 8.3.6 - 2023-10-03 From 7a0f2096fba9bf03fd10dcd5980d63fd73f8d9ce Mon Sep 17 00:00:00 2001 From: Stephen Davies Date: Wed, 25 Oct 2023 15:37:17 +1100 Subject: [PATCH 349/654] Fix missing React imports, waiting on React 18 https://github.com/TerriaJS/terriajs/pull/6902 --- lib/ReactViews/Map/BottomLeftBar/BottomLeftBar.tsx | 2 +- lib/ReactViews/Map/ProgressBar.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/ReactViews/Map/BottomLeftBar/BottomLeftBar.tsx b/lib/ReactViews/Map/BottomLeftBar/BottomLeftBar.tsx index 552cc842b9c..2fbc49aacdf 100644 --- a/lib/ReactViews/Map/BottomLeftBar/BottomLeftBar.tsx +++ b/lib/ReactViews/Map/BottomLeftBar/BottomLeftBar.tsx @@ -1,5 +1,5 @@ import { observer } from "mobx-react"; -import { FC } from "react"; +import React, { FC } from "react"; import { useTranslation } from "react-i18next"; import styled, { useTheme } from "styled-components"; import defined from "terriajs-cesium/Source/Core/defined"; diff --git a/lib/ReactViews/Map/ProgressBar.tsx b/lib/ReactViews/Map/ProgressBar.tsx index 6c60dbb3a09..eedfef26599 100644 --- a/lib/ReactViews/Map/ProgressBar.tsx +++ b/lib/ReactViews/Map/ProgressBar.tsx @@ -1,5 +1,5 @@ import { observer } from "mobx-react"; -import { VFC, useCallback, useEffect, useState } from "react"; +import React, { VFC, useCallback, useEffect, useState } from "react"; import styled, { css, keyframes, useTheme } from "styled-components"; import EventHelper from "terriajs-cesium/Source/Core/EventHelper"; import { useViewState } from "../Context"; From 97ba9ffd8474412d78732a093e1a9871aec49a4b Mon Sep 17 00:00:00 2001 From: Stephen Davies Date: Fri, 20 Oct 2023 04:04:23 +1100 Subject: [PATCH 350/654] Add ASGS 2021 leftovers and add an automated duplicate alias check --- .../find-region-mapping-alias-duplicates.yml | 34 + .../find-region-mapping-alias-duplicates.js | 22 + wwwroot/data/regionMapping.json | 724 ++++++++++++++---- 3 files changed, 634 insertions(+), 146 deletions(-) create mode 100644 .github/workflows/find-region-mapping-alias-duplicates.yml create mode 100644 buildprocess/find-region-mapping-alias-duplicates.js diff --git a/.github/workflows/find-region-mapping-alias-duplicates.yml b/.github/workflows/find-region-mapping-alias-duplicates.yml new file mode 100644 index 00000000000..331c2ed47c3 --- /dev/null +++ b/.github/workflows/find-region-mapping-alias-duplicates.yml @@ -0,0 +1,34 @@ +name: Find region mapping alias duplicates + +# Run when regionMapping.json file or is updated +on: + push: + paths: + - "wwwroot/data/regionMapping.json" + - "buildprocess/find-region-mapping-alias-duplicates.js" + pull_request: + paths: + - "wwwroot/data/regionMapping.json" + - "buildprocess/find-region-mapping-alias-duplicates.js" + +# A workflow run is made up of one or more jobs that can run sequentially or in parallel +jobs: + # This workflow contains a single job + find-alias-duplicates: + # The type of runner that the job will run on + runs-on: ubuntu-latest + + # Steps represent a sequence of tasks that will be executed as part of the job + steps: + # Check out only 2 files + # Use without cone mode as no git operations are executed past checkout + - uses: actions/checkout@v4 + with: + sparse-checkout: | + wwwroot/data/regionMapping.json + buildprocess/find-region-mapping-alias-duplicates.js + sparse-checkout-cone-mode: false + + - name: Check aliases + run: | + node buildprocess/find-region-mapping-alias-duplicates.js diff --git a/buildprocess/find-region-mapping-alias-duplicates.js b/buildprocess/find-region-mapping-alias-duplicates.js new file mode 100644 index 00000000000..e3d2c6e079c --- /dev/null +++ b/buildprocess/find-region-mapping-alias-duplicates.js @@ -0,0 +1,22 @@ +const fs = require("fs"); +const regions = JSON.parse( + fs.readFileSync("wwwroot/data/regionMapping.json") +).regionWmsMap; + +const aliasToType = new Map(); +for (const [regType, regDef] of Object.entries(regions)) { + for (const alias of regDef.aliases ?? []) { + aliasToType.set(alias, [...(aliasToType.get(alias) ?? []), regType]); + } +} + +let issues = 0; +for (const [alias, regTypes] of aliasToType.entries()) { + if (regTypes.length > 1) { + console.error( + `Alias "${alias}" used in multiple types: ${regTypes.join(", ")}` + ); + issues++; + } +} +process.exitCode = issues > 0 ? 1 : 0; diff --git a/wwwroot/data/regionMapping.json b/wwwroot/data/regionMapping.json index 987f18be348..a2f929b28d2 100644 --- a/wwwroot/data/regionMapping.json +++ b/wwwroot/data/regionMapping.json @@ -1,6 +1,447 @@ { "comments": "Matching takes place in the order defined in this file. Place code matches before name matches, and smaller regions before larger ones.", "regionWmsMap": { + "STE_2021": { + "layerName": "STE_2021", + "server": "https://tiles.terria.io/STE_2021/{z}/{x}/{y}.pbf", + "serverType": "MVT", + "serverMaxNativeZoom": 12, + "serverMinZoom": 0, + "serverMaxZoom": 28, + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-STE_2021.json", + "uniqueIdProp": "FID", + "regionProp": "STATE_CODE_2021", + "nameProp": "STATE_NAME_2021", + "aliases": ["ste_code_2021", "ste_code", "ste"], + "description": "States and Territories 2021", + "bbox": [96.81, -43.74, 168, -9.14] + }, + "ILOC_2021": { + "layerName": "ILOC_2021", + "server": "https://tiles.terria.io/ILOC_2021/{z}/{x}/{y}.pbf", + "serverType": "MVT", + "serverMaxNativeZoom": 12, + "serverMinZoom": 0, + "serverMaxZoom": 28, + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-ILOC_2021.json", + "uniqueIdProp": "FID", + "regionProp": "ILO_CODE21", + "nameProp": "ILO_NAME21", + "aliases": ["iloc_code_2021", "iloc_code", "iloc"], + "description": "Indigenous Locations 2021", + "bbox": [96.81, -43.74, 168, -9.14] + }, + "ILOC_NAME_2021": { + "layerName": "ILOC_2021", + "server": "https://tiles.terria.io/ILOC_2021/{z}/{x}/{y}.pbf", + "serverType": "MVT", + "serverMaxNativeZoom": 12, + "serverMinZoom": 0, + "serverMaxZoom": 28, + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-ILOC_NAME_2021.json", + "uniqueIdProp": "FID", + "regionProp": "ILO_NAME21", + "nameProp": "ILO_NAME21", + "aliases": ["iloc_name_2021", "iloc_name"], + "description": "Indigenous Locations 2021", + "bbox": [96.81, -43.74, 168, -9.14] + }, + "IARE_2021": { + "layerName": "IARE_2021", + "server": "https://tiles.terria.io/IARE_2021/{z}/{x}/{y}.pbf", + "serverType": "MVT", + "serverMaxNativeZoom": 12, + "serverMinZoom": 0, + "serverMaxZoom": 28, + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-IARE_2021.json", + "uniqueIdProp": "FID", + "regionProp": "IAR_CODE21", + "nameProp": "IAR_NAME21", + "aliases": ["iare_code_2021", "iare_code", "iare"], + "description": "Indigenous Areas 2021", + "bbox": [96.81, -43.74, 168, -9.14] + }, + "IARE_NAME_2021": { + "layerName": "IARE_2021", + "server": "https://tiles.terria.io/IARE_2021/{z}/{x}/{y}.pbf", + "serverType": "MVT", + "serverMaxNativeZoom": 12, + "serverMinZoom": 0, + "serverMaxZoom": 28, + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-IARE_NAME_2021.json", + "uniqueIdProp": "FID", + "regionProp": "IAR_NAME21", + "nameProp": "IAR_NAME21", + "aliases": ["iare_name_2021", "iare_name"], + "description": "Indigenous Areas 2021", + "bbox": [96.81, -43.74, 168, -9.14] + }, + "IREG_2021": { + "layerName": "IREG_2021", + "server": "https://tiles.terria.io/IREG_2021/{z}/{x}/{y}.pbf", + "serverType": "MVT", + "serverMaxNativeZoom": 12, + "serverMinZoom": 0, + "serverMaxZoom": 28, + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-IREG_2021.json", + "uniqueIdProp": "FID", + "regionProp": "IRE_CODE21", + "nameProp": "IRE_NAME21", + "aliases": ["ireg_code_2021", "ireg_code", "ireg"], + "description": "Indigenous Regions 2021", + "bbox": [96.81, -43.74, 168, -9.14] + }, + "IREG_NAME_2021": { + "layerName": "IREG_2021", + "server": "https://tiles.terria.io/IREG_2021/{z}/{x}/{y}.pbf", + "serverType": "MVT", + "serverMaxNativeZoom": 12, + "serverMinZoom": 0, + "serverMaxZoom": 28, + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-IREG_NAME_2021.json", + "uniqueIdProp": "FID", + "regionProp": "IRE_NAME21", + "nameProp": "IRE_NAME21", + "aliases": ["ireg_name_2021", "ireg_name"], + "description": "Indigenous Regions 2021", + "bbox": [96.81, -43.74, 168, -9.14] + }, + "RA_2021": { + "layerName": "RA_2021", + "server": "https://tiles.terria.io/RA_2021/{z}/{x}/{y}.pbf", + "serverType": "MVT", + "serverMaxNativeZoom": 12, + "serverMinZoom": 0, + "serverMaxZoom": 28, + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-RA_2021.json", + "uniqueIdProp": "FID", + "regionProp": "RA_CODE21", + "nameProp": "RA_NAME21", + "aliases": ["ra_code_2021", "ra_code", "ra"], + "description": "Remoteness Areas 2021", + "bbox": [96.81, -43.74, 168, -9.14] + }, + "SAL_2021": { + "layerName": "SAL_2021", + "server": "https://tiles.terria.io/SAL_2021/{z}/{x}/{y}.pbf", + "serverType": "MVT", + "serverMaxNativeZoom": 12, + "serverMinZoom": 0, + "serverMaxZoom": 28, + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-SAL_2021.json", + "uniqueIdProp": "FID", + "regionProp": "SAL_CODE_2021", + "nameProp": "SAL_NAME_2021", + "aliases": ["sal_code_2021", "sal_code", "sal"], + "description": "Suburbs and Localities 2021", + "bbox": [96.81, -43.74, 168, -9.14] + }, + "ADD_2021": { + "layerName": "ADD_2021", + "server": "https://tiles.terria.io/ADD_2021/{z}/{x}/{y}.pbf", + "serverType": "MVT", + "serverMaxNativeZoom": 12, + "serverMinZoom": 0, + "serverMaxZoom": 28, + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-ADD_2021.json", + "uniqueIdProp": "FID", + "regionProp": "ADD_CODE_2021", + "nameProp": "ADD_NAME_2021", + "aliases": ["add_code_2021", "add_code", "add"], + "description": "Australian Drainage Divisions 2021", + "bbox": [96.81, -43.74, 168, -9.14] + }, + "ADD_NAME_2021": { + "layerName": "ADD_2021", + "server": "https://tiles.terria.io/ADD_2021/{z}/{x}/{y}.pbf", + "serverType": "MVT", + "serverMaxNativeZoom": 12, + "serverMinZoom": 0, + "serverMaxZoom": 28, + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-ADD_NAME_2021.json", + "uniqueIdProp": "FID", + "regionProp": "ADD_NAME_2021", + "nameProp": "ADD_NAME_2021", + "aliases": ["add_name_2021", "add_name"], + "description": "Australian Drainage Divisions 2021", + "bbox": [96.81, -43.74, 168, -9.14] + }, + "DZN_2021": { + "layerName": "DZN_2021", + "server": "https://tiles.terria.io/DZN_2021/{z}/{x}/{y}.pbf", + "serverType": "MVT", + "serverMaxNativeZoom": 12, + "serverMinZoom": 0, + "serverMaxZoom": 28, + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-DZN_2021.json", + "uniqueIdProp": "FID", + "regionProp": "DZN_CODE_2021", + "nameProp": "DZN_CODE_2021", + "aliases": ["dzn_code_2021", "dzn_code", "dzn"], + "description": "Destination Zones 2021", + "bbox": [96.81, -43.74, 168, -9.14] + }, + "LGA_2022": { + "layerName": "LGA_2022", + "server": "https://tiles.terria.io/LGA_2022/{z}/{x}/{y}.pbf", + "serverType": "MVT", + "serverMaxNativeZoom": 12, + "serverMinZoom": 0, + "serverMaxZoom": 28, + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-LGA_2022.json", + "uniqueIdProp": "FID", + "regionProp": "LGA_CODE_2022", + "nameProp": "LGA_NAME_2022", + "aliases": ["lga_code_2022"], + "description": "Local Government Areas 2022", + "bbox": [96.81, -43.74, 168, -9.14] + }, + "LGA_2023": { + "layerName": "LGA_2023", + "server": "https://tiles.terria.io/LGA_2023/{z}/{x}/{y}.pbf", + "serverType": "MVT", + "serverMaxNativeZoom": 12, + "serverMinZoom": 0, + "serverMaxZoom": 28, + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-LGA_2023.json", + "uniqueIdProp": "FID", + "regionProp": "LGA_CODE_2023", + "nameProp": "LGA_NAME_2023", + "aliases": ["lga_code_2023", "lga_code", "lga"], + "description": "Local Government Areas 2023", + "bbox": [96.81, -43.74, 168, -9.14] + }, + "SED_2021": { + "layerName": "SED_2021", + "server": "https://tiles.terria.io/SED_2021/{z}/{x}/{y}.pbf", + "serverType": "MVT", + "serverMaxNativeZoom": 12, + "serverMinZoom": 0, + "serverMaxZoom": 28, + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-SED_2021.json", + "uniqueIdProp": "FID", + "regionProp": "SED_CODE_2021", + "nameProp": "SED_NAME_2021", + "aliases": ["sed_code_2021"], + "description": "State Electoral Divisions 2021 (ABS)", + "bbox": [96.81, -43.74, 168, -9.14] + }, + "SED_NAME_2021": { + "layerName": "SED_2021", + "server": "https://tiles.terria.io/SED_2021/{z}/{x}/{y}.pbf", + "serverType": "MVT", + "serverMaxNativeZoom": 12, + "serverMinZoom": 0, + "serverMaxZoom": 28, + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-SED_NAME_2021.json", + "uniqueIdProp": "FID", + "regionProp": "SED_NAME_2021", + "nameProp": "SED_NAME_2021", + "aliases": ["sed_name_2021"], + "description": "State Electoral Divisions 2021 (ABS)", + "bbox": [96.81, -43.74, 168, -9.14] + }, + "SED_2022": { + "layerName": "SED_2022", + "server": "https://tiles.terria.io/SED_2022/{z}/{x}/{y}.pbf", + "serverType": "MVT", + "serverMaxNativeZoom": 12, + "serverMinZoom": 0, + "serverMaxZoom": 28, + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-SED_2022.json", + "uniqueIdProp": "FID", + "regionProp": "SED_CODE_2022", + "nameProp": "SED_NAME_2022", + "aliases": ["sed_code_2022", "sed_code", "sed"], + "description": "State Electoral Divisions 2022 (ABS)", + "bbox": [96.81, -43.74, 168, -9.14] + }, + "SED_NAME_2022": { + "layerName": "SED_2022", + "server": "https://tiles.terria.io/SED_2022/{z}/{x}/{y}.pbf", + "serverType": "MVT", + "serverMaxNativeZoom": 12, + "serverMinZoom": 0, + "serverMaxZoom": 28, + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-SED_NAME_2022.json", + "uniqueIdProp": "FID", + "regionProp": "SED_NAME_2022", + "nameProp": "SED_NAME_2022", + "aliases": ["sed_name_2022", "sed_name"], + "description": "State Electoral Divisions 2022 (ABS)", + "bbox": [96.81, -43.74, 168, -9.14] + }, + "CED_2021": { + "layerName": "CED_2021", + "server": "https://tiles.terria.io/CED_2021/{z}/{x}/{y}.pbf", + "serverType": "MVT", + "serverMaxNativeZoom": 12, + "serverMinZoom": 0, + "serverMaxZoom": 28, + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-CED_2021.json", + "uniqueIdProp": "FID", + "regionProp": "CED_CODE_2021", + "nameProp": "CED_NAME_2021", + "aliases": ["ced_code_2021", "ced_code", "ced"], + "description": "Commonwealth Electoral Divisions 2021 (ABS)", + "bbox": [96.81, -43.74, 168, -9.14] + }, + "CED_NAME_2021": { + "layerName": "CED_2021", + "server": "https://tiles.terria.io/CED_2021/{z}/{x}/{y}.pbf", + "serverType": "MVT", + "serverMaxNativeZoom": 12, + "serverMinZoom": 0, + "serverMaxZoom": 28, + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-CED_NAME_2021.json", + "uniqueIdProp": "FID", + "regionProp": "CED_NAME_2021", + "nameProp": "CED_NAME_2021", + "aliases": ["ced_name_2021", "ced_name"], + "description": "Commonwealth Electoral Divisions 2021 (ABS)", + "bbox": [96.81, -43.74, 168, -9.14] + }, + "POA_2021": { + "layerName": "POA_2021", + "server": "https://tiles.terria.io/POA_2021/{z}/{x}/{y}.pbf", + "serverType": "MVT", + "serverMaxNativeZoom": 12, + "serverMinZoom": 0, + "serverMaxZoom": 28, + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-POA_2021.json", + "uniqueIdProp": "FID", + "regionProp": "POA_CODE_2021", + "nameProp": "POA_CODE_2021", + "aliases": [ + "poa_code_2021", + "poa_code", + "poa", + "postcode_2021", + "postcode" + ], + "description": "Postal Areas 2021 (ABS)", + "bbox": [96.81, -43.74, 168, -9.14] + }, + "TR_2021": { + "layerName": "TR_2021", + "server": "https://tiles.terria.io/TR_2021/{z}/{x}/{y}.pbf", + "serverType": "MVT", + "serverMaxNativeZoom": 12, + "serverMinZoom": 0, + "serverMaxZoom": 28, + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-TR_2021.json", + "uniqueIdProp": "FID", + "regionProp": "TR_CODE_2021", + "nameProp": "TR_NAME_2021", + "aliases": ["tr_code_2021", "tr_code", "tr"], + "description": "Tourism Regions 2021", + "bbox": [96.81, -43.74, 168, -9.14] + }, + "TR_NAME_2021": { + "layerName": "TR_2021", + "server": "https://tiles.terria.io/TR_2021/{z}/{x}/{y}.pbf", + "serverType": "MVT", + "serverMaxNativeZoom": 12, + "serverMinZoom": 0, + "serverMaxZoom": 28, + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-TR_NAME_2021.json", + "uniqueIdProp": "FID", + "regionProp": "TR_NAME_2021", + "nameProp": "TR_NAME_2021", + "aliases": ["tr_name_2021", "tr_name"], + "description": "Tourism Regions 2021", + "bbox": [96.81, -43.74, 168, -9.14] + }, + "SUA_2021": { + "layerName": "SUA_2021", + "server": "https://tiles.terria.io/SUA_2021/{z}/{x}/{y}.pbf", + "serverType": "MVT", + "serverMaxNativeZoom": 12, + "serverMinZoom": 0, + "serverMaxZoom": 28, + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-SUA_2021.json", + "uniqueIdProp": "FID", + "regionProp": "SUA_CODE_2021", + "nameProp": "SUA_NAME_2021", + "aliases": ["sua_code_2021", "sua_code", "sua"], + "description": "Significant Urban Areas 2021", + "bbox": [96.81, -43.74, 168, -9.14] + }, + "SUA_NAME_2021": { + "layerName": "SUA_2021", + "server": "https://tiles.terria.io/SUA_2021/{z}/{x}/{y}.pbf", + "serverType": "MVT", + "serverMaxNativeZoom": 12, + "serverMinZoom": 0, + "serverMaxZoom": 28, + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-SUA_NAME_2021.json", + "uniqueIdProp": "FID", + "regionProp": "SUA_NAME_2021", + "nameProp": "SUA_NAME_2021", + "aliases": ["sua_name_2022", "sua_name"], + "description": "Significant Urban Areas 2021", + "bbox": [96.81, -43.74, 168, -9.14] + }, + "UCL_2021": { + "layerName": "UCL_2021", + "server": "https://tiles.terria.io/UCL_2021/{z}/{x}/{y}.pbf", + "serverType": "MVT", + "serverMaxNativeZoom": 12, + "serverMinZoom": 0, + "serverMaxZoom": 28, + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-UCL_2021.json", + "uniqueIdProp": "FID", + "regionProp": "UCL_CODE_2021", + "nameProp": "UCL_NAME_2021", + "aliases": ["ucl_code_2021", "ucl_code", "ucl"], + "description": "Urban Centres and Localities 2021", + "bbox": [96.81, -43.74, 168, -9.14] + }, + "UCL_NAME_2021": { + "layerName": "UCL_2021", + "server": "https://tiles.terria.io/UCL_2021/{z}/{x}/{y}.pbf", + "serverType": "MVT", + "serverMaxNativeZoom": 12, + "serverMinZoom": 0, + "serverMaxZoom": 28, + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-UCL_NAME_2021.json", + "uniqueIdProp": "FID", + "regionProp": "UCL_NAME_2021", + "nameProp": "UCL_NAME_2021", + "aliases": ["ucl_name_2021", "ucl_name"], + "description": "Urban Centres and Localities 2021", + "bbox": [96.81, -43.74, 168, -9.14] + }, + "SOS_2021": { + "layerName": "SOS_2021", + "server": "https://tiles.terria.io/SOS_2021/{z}/{x}/{y}.pbf", + "serverType": "MVT", + "serverMaxNativeZoom": 12, + "serverMinZoom": 0, + "serverMaxZoom": 28, + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-SOS_2021.json", + "uniqueIdProp": "FID", + "regionProp": "SOS_CODE_2021", + "nameProp": "SOS_NAME_2021", + "aliases": ["sos_code_2021", "sos_code", "sos"], + "description": "Section of State 2021", + "bbox": [96.81, -43.74, 168, -9.14] + }, + "SOSR_2021": { + "layerName": "SOSR_2021", + "server": "https://tiles.terria.io/SOSR_2021/{z}/{x}/{y}.pbf", + "serverType": "MVT", + "serverMaxNativeZoom": 12, + "serverMinZoom": 0, + "serverMaxZoom": 28, + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-SOSR_2021.json", + "uniqueIdProp": "FID", + "regionProp": "SOSR_CODE_2021", + "nameProp": "SOSR_NAME_2021", + "aliases": ["sosr_code_2021", "sosr_code", "sosr"], + "description": "Section of State Range 2021", + "bbox": [96.81, -43.74, 168, -9.14] + }, "SA1_2011": { "layerName": "FID_SA1_2011_AUST", "server": "https://vector-tiles.terria.io/FID_SA1_2011_AUST/{z}/{x}/{y}.pbf", @@ -10,7 +451,7 @@ "aliases": ["sa1_code_2011", "sa1_maincode_2011"], "digits": 11, "description": "Statistical Area Level 1 2011 (ABS)", - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-FID_SA1_2011_AUST_SA1_MAIN11.json", + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-FID_SA1_2011_AUST_SA1_MAIN11.json", "serverType": "MVT", "serverSubdomains": [], "serverMinZoom": 0, @@ -31,7 +472,7 @@ "aliases": ["sa1_7digitcode_2011"], "digits": 7, "description": "Statistical Area Level 1 2011 by 7-dig code (ABS)", - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-FID_SA1_2011_AUST_SA1_7DIG11.json", + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-FID_SA1_2011_AUST_SA1_7DIG11.json", "serverType": "MVT", "serverSubdomains": [], "serverMinZoom": 0, @@ -59,7 +500,7 @@ "aliases": ["sa1_code_2016", "sa1_maincode_2016"], "nameProp": "SA1_7DIG16", "description": "Statistical Area Level 1 2016 by code (ABS)", - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-SA1_2016_AUST_SA1_MAIN16.json" + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-SA1_2016_AUST_SA1_MAIN16.json" }, "SA1_7DIGIT_2016": { "layerName": "SA1_2016_AUST", @@ -77,7 +518,7 @@ "aliases": ["sa1_7digitcode", "sa1_7digitcode_2016"], "nameProp": "SA1_7DIG16", "description": "Statistical Area Level 1 2016 by 7-dig code (ABS)", - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-SA1_2016_AUST_SA1_7DIG16.json" + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-SA1_2016_AUST_SA1_7DIG16.json" }, "SA1_2021": { "layerName": "SA1_2021", @@ -86,7 +527,7 @@ "serverMaxNativeZoom": 12, "serverMinZoom": 0, "serverMaxZoom": 28, - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-SA1_2021_SA1_2021.json", + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-SA1_2021_SA1_2021.json", "regionProp": "SA1_CODE21", "nameProp": "SA1_CODE21", "aliases": ["sa1_code_2021", "sa1_maincode_2021", "sa1", "sa1_code"], @@ -102,7 +543,7 @@ "aliases": ["sa4_code_2011", "sa4_maincode_2011"], "digits": 3, "description": "Statistical Area Level 4 2011 by code (ABS)", - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-FID_SA4_2011_AUST_SA4_CODE11.json", + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-FID_SA4_2011_AUST_SA4_CODE11.json", "serverType": "MVT", "serverSubdomains": [], "serverMinZoom": 0, @@ -122,7 +563,7 @@ "regionProp": "SA4_NAME11", "aliases": ["sa4_name_2011"], "description": "Statistical Area Level 4 2011 by name (ABS)", - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-FID_SA4_2011_AUST_SA4_NAME11.json", + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-FID_SA4_2011_AUST_SA4_NAME11.json", "serverType": "MVT", "serverSubdomains": [], "serverMinZoom": 0, @@ -150,7 +591,7 @@ "aliases": ["sa4_maincode_2016", "sa4_code_2016"], "nameProp": "SA4_NAME16", "description": "Statistical Area Level 4 2016 by code (ABS)", - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-SA4_2016_AUST_SA4_CODE16.json" + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-SA4_2016_AUST_SA4_CODE16.json" }, "SA4_NAME_2016": { "layerName": "SA4_2016_AUST", @@ -168,7 +609,7 @@ "aliases": ["sa4_name_2016"], "nameProp": "SA4_NAME16", "description": "Statistical Area Level 4 2016 by name (ABS)", - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-SA4_2016_AUST_SA4_NAME16.json" + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-SA4_2016_AUST_SA4_NAME16.json" }, "SA4_2021": { "layerName": "SA4_2021", @@ -177,7 +618,7 @@ "serverMaxNativeZoom": 12, "serverMinZoom": 0, "serverMaxZoom": 28, - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-SA4_2021_SA4_2021.json", + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-SA4_2021_SA4_2021.json", "regionProp": "SA4_CODE21", "nameProp": "SA4_NAME21", "aliases": ["sa4_code_2021", "sa4_maincode_2021", "sa4", "sa4_code"], @@ -191,7 +632,7 @@ "serverMaxNativeZoom": 12, "serverMinZoom": 0, "serverMaxZoom": 28, - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-SA4_NAME_2021_SA4_2021.json", + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-SA4_NAME_2021_SA4_2021.json", "regionProp": "SA4_NAME21", "nameProp": "SA4_NAME21", "aliases": ["sa4_name_2021", "sa4_name"], @@ -207,7 +648,7 @@ "aliases": ["sa3_code_2011", "sa3_maincode_2011"], "digits": 5, "description": "Statistical Area Level 3 2011 by code (ABS)", - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-FID_SA3_2011_AUST_SA3_CODE11.json", + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-FID_SA3_2011_AUST_SA3_CODE11.json", "serverType": "MVT", "serverSubdomains": [], "serverMinZoom": 0, @@ -228,7 +669,7 @@ "aliases": ["sa3_name_2011"], "digits": 5, "description": "Statistical Area Level 3 2011 by name (ABS)", - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-FID_SA3_2011_AUST_SA3_NAME11.json", + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-FID_SA3_2011_AUST_SA3_NAME11.json", "serverType": "MVT", "serverSubdomains": [], "serverMinZoom": 0, @@ -256,7 +697,7 @@ "aliases": ["sa3_code_2016", "sa3_maincode_2016"], "nameProp": "SA3_NAME16", "description": "Statistical Area Level 3 2016 by code (ABS)", - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-SA3_2016_AUST_SA3_CODE16.json" + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-SA3_2016_AUST_SA3_CODE16.json" }, "SA3_NAME_2016": { "layerName": "SA3_2016_AUST", @@ -274,7 +715,7 @@ "aliases": ["sa3_name_2016"], "nameProp": "SA3_NAME16", "description": "Statistical Area Level 3 2016 by name (ABS)", - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-SA3_2016_AUST_SA3_NAME16.json" + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-SA3_2016_AUST_SA3_NAME16.json" }, "SA3_2021": { "layerName": "SA3_2021", @@ -283,7 +724,7 @@ "serverMaxNativeZoom": 12, "serverMinZoom": 0, "serverMaxZoom": 28, - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-SA3_2021_SA3_2021.json", + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-SA3_2021_SA3_2021.json", "regionProp": "SA3_CODE21", "nameProp": "SA3_NAME21", "aliases": ["sa3_code_2021", "sa3_maincode_2021", "sa3", "sa3_code"], @@ -297,7 +738,7 @@ "serverMaxNativeZoom": 12, "serverMinZoom": 0, "serverMaxZoom": 28, - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-SA3_NAME_2021_SA3_2021.json", + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-SA3_NAME_2021_SA3_2021.json", "regionProp": "SA3_NAME21", "nameProp": "SA3_NAME21", "aliases": ["sa3_name_2021", "sa3_name"], @@ -313,7 +754,7 @@ "aliases": ["sa2_code_2011", "sa2_maincode_2011"], "digits": 9, "description": "Statistical Area Level 2 2011 by code (ABS)", - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-FID_SA2_2011_AUST_SA2_MAIN11.json", + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-FID_SA2_2011_AUST_SA2_MAIN11.json", "serverType": "MVT", "serverSubdomains": [], "serverMinZoom": 0, @@ -334,7 +775,7 @@ "aliases": ["sa2_5digitcode_2011"], "digits": 5, "description": "Statistical Area Level 2 2011 by 5-dig code (ABS)", - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-FID_SA2_2011_AUST_SA2_5DIG11.json", + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-FID_SA2_2011_AUST_SA2_5DIG11.json", "serverType": "MVT", "serverSubdomains": [], "serverMinZoom": 0, @@ -354,7 +795,7 @@ "regionProp": "SA2_NAME11", "aliases": ["sa2_name_2011"], "description": "Statistical Area Level 2 2011 by name (ABS)", - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-FID_SA2_2011_AUST_SA2_NAME11.json", + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-FID_SA2_2011_AUST_SA2_NAME11.json", "serverType": "MVT", "serverSubdomains": [], "serverMinZoom": 0, @@ -382,7 +823,7 @@ "aliases": ["sa2_code_2016", "sa2_maincode_2016"], "nameProp": "SA2_NAME16", "description": "Statistical Area Level 2 2016 by code (ABS)", - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-SA2_2016_AUST_SA2_MAIN16.json" + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-SA2_2016_AUST_SA2_MAIN16.json" }, "SA2_5DIG_2016": { "layerName": "SA2_2016_AUST", @@ -400,7 +841,7 @@ "aliases": ["sa2_5digitcode", "sa2_5digitcode_2016"], "nameProp": "SA2_NAME16", "description": "Statistical Area Level 2 2016 by 5-dig code (ABS)", - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-SA2_2016_AUST_SA2_5DIG16.json" + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-SA2_2016_AUST_SA2_5DIG16.json" }, "SA2_NAME_2016": { "layerName": "SA2_2016_AUST", @@ -418,7 +859,7 @@ "aliases": ["sa2_name_2016"], "nameProp": "SA2_NAME16", "description": "Statistical Area Level 2 2016 by name (ABS)", - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-SA2_2016_AUST_SA2_NAME16.json" + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-SA2_2016_AUST_SA2_NAME16.json" }, "SA2_2021": { "layerName": "SA2_2021", @@ -427,7 +868,7 @@ "serverMaxNativeZoom": 12, "serverMinZoom": 0, "serverMaxZoom": 28, - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-SA2_2021_SA2_2021.json", + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-SA2_2021_SA2_2021.json", "regionProp": "SA2_CODE21", "nameProp": "SA2_NAME21", "aliases": ["sa2_code_2021", "sa2_maincode_2021", "sa2", "sa2_code"], @@ -441,7 +882,7 @@ "serverMaxNativeZoom": 12, "serverMinZoom": 0, "serverMaxZoom": 28, - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-SA2_NAME_2021_SA2_2021.json", + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-SA2_NAME_2021_SA2_2021.json", "regionProp": "SA2_NAME21", "nameProp": "SA2_NAME21", "aliases": ["sa2_name_2021", "sa2_name"], @@ -457,7 +898,7 @@ "aliases": ["ssc_code_2011"], "digits": 5, "description": "ABS approximations of suburbs by code (2011)", - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-FID_SSC_2011_AUST_SSC_CODE.json", + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-FID_SSC_2011_AUST_SSC_CODE.json", "serverType": "MVT", "serverSubdomains": [], "serverMinZoom": 0, @@ -477,7 +918,7 @@ "regionProp": "SSC_NAME", "aliases": ["ssc_name_2011"], "description": "ABS approximations of suburbs by name (2011)", - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-FID_SSC_2011_AUST_SSC_NAME.json", + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-FID_SSC_2011_AUST_SSC_NAME.json", "serverType": "MVT", "serverSubdomains": [], "serverMinZoom": 0, @@ -505,7 +946,7 @@ "aliases": ["ssc_code_2016", "ssc_code", "ssc"], "nameProp": "SSC_NAME16", "description": "ABS approximations of suburbs by code (2016)", - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-SSC_2016_AUST_SSC_CODE16.json" + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-SSC_2016_AUST_SSC_CODE16.json" }, "SSC_NAME_2016": { "layerName": "SSC_2016_AUST", @@ -523,7 +964,7 @@ "aliases": ["ssc_name_2016", "ssc_name", "suburb"], "nameProp": "SSC_NAME16", "description": "ABS approximations of suburbs by name (2016)", - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-SSC_2016_AUST_SSC_NAME16.json" + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-SSC_2016_AUST_SSC_NAME16.json" }, "LGA_2021": { "layerName": "LGA_2021", @@ -532,10 +973,10 @@ "serverMaxNativeZoom": 12, "serverMinZoom": 0, "serverMaxZoom": 28, - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-LGA_2021_LGA_2021.json", + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-LGA_2021_LGA_2021.json", "regionProp": "LGA_CODE21", "nameProp": "LGA_NAME21", - "aliases": ["lga_code_2021", "lga_code_2020", "lga_code", "lga"], + "aliases": ["lga_code_2021", "lga_code_2020"], "description": "Local Government Areas 2021 by code (ABS)", "bbox": [96.81, -43.75, 168, -9.14] }, @@ -546,7 +987,7 @@ "serverMaxNativeZoom": 12, "serverMinZoom": 0, "serverMaxZoom": 28, - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-LGA_2019_LGA_2019.json", + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-LGA_2019_LGA_2019.json", "regionProp": "LGA_CODE19", "nameProp": "LGA_NAME19", "aliases": ["lga_code_2019"], @@ -568,7 +1009,7 @@ "nameProp": "LGA_NAME18", "aliases": ["lga_code_2018"], "description": "Local Government Areas 2018 by code (ABS)", - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-LGA_2018_AUST_LGA_CODE18.json" + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-LGA_2018_AUST_LGA_CODE18.json" }, "LGA_2017": { "layerName": "LGA_2017_AUST", @@ -585,7 +1026,7 @@ "nameProp": "LGA_NAME17", "aliases": ["lga_code_2017"], "description": "Local Government Areas 2017 by code (ABS)", - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-LGA_2017_AUST_LGA_CODE17.json" + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-LGA_2017_AUST_LGA_CODE17.json" }, "LGA_2016": { "layerName": "LGA_2016_AUST", @@ -603,7 +1044,7 @@ "aliases": ["lga_code_2016"], "nameProp": "LGA_NAME16", "description": "Local Government Areas 2016 by code (ABS)", - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-LGA_2016_AUST_LGA_CODE16.json" + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-LGA_2016_AUST_LGA_CODE16.json" }, "LGA_2015": { "layerName": "FID_LGA_2015_AUST", @@ -614,7 +1055,7 @@ "aliases": ["lga_code_2015", "lga_code_2014"], "digits": 5, "description": "Local Government Areas 2015 by code (ABS)", - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-FID_LGA_2015_AUST_LGA_CODE15.json", + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-FID_LGA_2015_AUST_LGA_CODE15.json", "serverType": "MVT", "serverSubdomains": [], "serverMinZoom": 0, @@ -635,7 +1076,7 @@ "aliases": ["lga_code_2013", "lga_code_2012"], "digits": 5, "description": "Local Government Areas 2013 by code (ABS)", - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-FID_LGA_2013_AUST_LGA_CODE13.json", + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-FID_LGA_2013_AUST_LGA_CODE13.json", "serverType": "MVT", "serverSubdomains": [], "serverMinZoom": 0, @@ -656,7 +1097,7 @@ "aliases": ["lga_code_2011", "lga_code_2010"], "digits": 5, "description": "Local Government Areas 2011 by code (ABS)", - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-FID_LGA_2011_AUST_LGA_CODE11.json", + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-FID_LGA_2011_AUST_LGA_CODE11.json", "serverType": "MVT", "serverSubdomains": [], "serverMinZoom": 0, @@ -703,8 +1144,8 @@ "disambigProp": "STE_NAME16", "disambigRegionId": "STE_NAME_2016", "description": "Local Government Areas 2011 by name (ABS)", - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-FID_LGA_2011_AUST_LGA_NAME11.json", - "regionDisambigIdsFile": "build/TerriaJS/data/regionids/region_map-FID_LGA_2011_AUST_STE_NAME11.json", + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-FID_LGA_2011_AUST_LGA_NAME11.json", + "regionDisambigIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-FID_LGA_2011_AUST_STE_NAME11.json", "serverType": "MVT", "serverSubdomains": [], "serverMinZoom": 0, @@ -729,18 +1170,12 @@ -9.142175976999962 ], "regionProp": "POA_CODE16", - "aliases": [ - "poa_code_2016", - "poa_code", - "poa", - "postcode_2016", - "postcode" - ], + "aliases": ["poa_code_2016", "postcode_2016"], "digits": 4, "dataReplacements": [["^(?=\\d\\d\\d$)", "0"]], "nameProp": "POA_NAME16", "description": "Postal areas 2016 (ABS approximation)", - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-POA_2016_AUST_POA_CODE16.json" + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-POA_2016_AUST_POA_CODE16.json" }, "POA_2011": { "layerName": "FID_POA_2011_AUST", @@ -757,7 +1192,7 @@ "digits": 4, "dataReplacements": [["^(?=\\d\\d\\d$)", "0"]], "description": "Postal areas 2011 (ABS approximation)", - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-FID_POA_2011_AUST_POA_CODE.json", + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-FID_POA_2011_AUST_POA_CODE.json", "serverType": "MVT", "serverSubdomains": [], "serverMinZoom": 0, @@ -776,10 +1211,10 @@ "serverMaxNativeZoom": 12, "serverMinZoom": 0, "serverMaxZoom": 28, - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-CED_CODE18_CED_2018.json", + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-CED_CODE18_CED_2018.json", "regionProp": "CED_CODE18", "nameProp": "CED_NAME18", - "aliases": ["ced", "ced_code", "ced_2018", "ced_code_2018"], + "aliases": ["ced_2018", "ced_code_2018"], "description": "Commonwealth electoral divisions 2018 by code (ABS)", "bbox": [96.82, -43.74, 159.11, -9.14] }, @@ -791,10 +1226,10 @@ "serverMinZoom": 0, "serverMaxZoom": 28, "digits": 3, - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-CED_NAME18_CED_2018.json", + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-CED_NAME18_CED_2018.json", "regionProp": "CED_NAME18", "nameProp": "CED_NAME18", - "aliases": ["ced_name", "ced_name_2018"], + "aliases": ["ced_name_2018"], "description": "Commonwealth electoral divisions 2018 by name (ABS)", "bbox": [96.82, -43.74, 159.11, -9.14] }, @@ -807,7 +1242,7 @@ "aliases": ["ced_code_2016"], "digits": 3, "description": "Commonwealth electoral divisions 2016 by code (ABS)", - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-FID_CED_2016_AUST_CED_CODE16.json", + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-FID_CED_2016_AUST_CED_CODE16.json", "serverType": "MVT", "serverSubdomains": [], "serverMinZoom": 0, @@ -827,7 +1262,7 @@ "regionProp": "CED_NAME16", "aliases": ["ced_name_2016"], "description": "Commonwealth electoral divisions 2016 by name (ABS)", - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-FID_CED_2016_AUST_CED_NAME16.json", + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-FID_CED_2016_AUST_CED_NAME16.json", "serverType": "MVT", "serverSubdomains": [], "serverMinZoom": 0, @@ -848,7 +1283,7 @@ "aliases": ["ced_code_2013"], "digits": 3, "description": "Commonwealth electoral divisions 2013 by code (ABS)", - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-FID_CED_2013_AUST_CED_CODE13.json", + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-FID_CED_2013_AUST_CED_CODE13.json", "serverType": "MVT", "serverSubdomains": [], "serverMinZoom": 0, @@ -868,7 +1303,7 @@ "regionProp": "CED_NAME13", "aliases": ["ced_name_2013"], "description": "Commonwealth electoral divisions 2013 by name (ABS)", - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-FID_CED_2013_AUST_CED_NAME13.json", + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-FID_CED_2013_AUST_CED_NAME13.json", "serverType": "MVT", "serverSubdomains": [], "serverMinZoom": 0, @@ -889,7 +1324,7 @@ "aliases": ["ced_code_2011"], "digits": 3, "description": "Commonwealth electoral divisions 2011 by code (ABS)", - "disabledregionIdsFile": "build/TerriaJS/data/regionids/region_map-FID_CED_2011_AUST_CED_CODE.json", + "disabledregionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-FID_CED_2011_AUST_CED_CODE.json", "serverType": "MVT", "serverSubdomains": [], "serverMinZoom": 0, @@ -900,7 +1335,7 @@ -9.142175976999999 ], "nameProp": "CED_NAME", - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-FID_CED_2011_AUST_CED_CODE.json" + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-FID_CED_2011_AUST_CED_CODE.json" }, "CED_NAME_2011": { "layerName": "FID_CED_2011_AUST", @@ -910,7 +1345,7 @@ "regionProp": "CED_NAME", "aliases": ["ced_name_2011"], "description": "Commonwealth electoral divisions 2011 by name (ABS)", - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-FID_CED_2011_AUST_CED_NAME.json", + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-FID_CED_2011_AUST_CED_NAME.json", "serverType": "MVT", "serverSubdomains": [], "serverMinZoom": 0, @@ -931,7 +1366,7 @@ "aliases": ["divisionid", "com_elb_id_2016", "com_elb_id", "com_elb"], "digits": 3, "description": "Commonwealth electoral districts 2016 by code (AEC)", - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-FID_COM20160509_ELB_DIV_ID.json", + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-FID_COM20160509_ELB_DIV_ID.json", "serverType": "MVT", "serverSubdomains": [], "serverMinZoom": 0, @@ -950,7 +1385,7 @@ "serverMaxNativeZoom": 12, "serverMinZoom": 0, "serverMaxZoom": 28, - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-ELB_NAME_2021_ELB_2021.json", + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-ELB_NAME_2021_ELB_2021.json", "regionProp": "Elect_div", "nameProp": "Elect_div", "aliases": ["com_elb_name_2021", "com_elb_name", "divisionnm"], @@ -963,7 +1398,7 @@ "serverType": "MVT", "serverMaxNativeZoom": 12, "serverMinZoom": 0, - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-ELB_NAME_2019_ELB_2019.json", + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-ELB_NAME_2019_ELB_2019.json", "regionProp": "Sortname", "nameProp": "Sortname", "aliases": ["com_elb_name_2019"], @@ -982,7 +1417,7 @@ "textCodes": true, "aliases": ["com_elb_name_2016"], "description": "Commonwealth electoral districts 2016 by name (AEC)", - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-FID_COM20160509_ELB_ELECT_DIV.json", + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-FID_COM20160509_ELB_ELECT_DIV.json", "serverType": "MVT", "serverSubdomains": [], "serverMinZoom": 0, @@ -1003,7 +1438,7 @@ "textCodes": true, "aliases": ["com_elb_name_2011"], "description": "Commonwealth electoral districts 2011 by name (AEC)", - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-FID_COM20111216_ELB_region_ELECT_DIV.json", + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-FID_COM20111216_ELB_region_ELECT_DIV.json", "serverType": "MVT", "serverSubdomains": [], "serverMinZoom": 0, @@ -1027,7 +1462,7 @@ "nameProp": "ced_name_2013", "aliases": ["com_elb_id_2013"], "description": "Commonwealth electoral districts 2013 by id (AEC)", - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-CommonwealthElectoralDivision_2013_ced_code_2013.json" + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-CommonwealthElectoralDivision_2013_ced_code_2013.json" }, "COM_ELB_NAME_2013": { "layerName": "CommonwealthElectoralDivision_2013", @@ -1041,7 +1476,7 @@ "nameProp": "ced_name_2013", "aliases": ["com_elb_name_2013"], "description": "Commonwealth electoral districts 2013 by name (AEC)", - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-CommonwealthElectoralDivision_2013_ced_name_2013.json" + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-CommonwealthElectoralDivision_2013_ced_name_2013.json" }, "COM_ELB_ID_2010": { "layerName": "CommonwealthElectoralDivision_2010", @@ -1055,7 +1490,7 @@ "nameProp": "ced_name_2010", "aliases": ["com_elb_id_2010"], "description": "Commonwealth electoral districts 2010 by code (AEC)", - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-CommonwealthElectoralDivision_2010_ced_code_2010.json" + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-CommonwealthElectoralDivision_2010_ced_code_2010.json" }, "COM_ELB_NAME_2010": { "layerName": "CommonwealthElectoralDivision_2010", @@ -1069,7 +1504,7 @@ "nameProp": "ced_name_2010", "aliases": ["com_elb_name_2010"], "description": "Commonwealth electoral districts 2010 by name (AEC)", - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-CommonwealthElectoralDivision_2010_ced_name_2010.json" + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-CommonwealthElectoralDivision_2010_ced_name_2010.json" }, "COM_ELB_ID_2007": { "layerName": "CommonwealthElectoralDivision_2007", @@ -1083,7 +1518,7 @@ "nameProp": "ced_name_2007", "aliases": ["com_elb_id_2007"], "description": "Commonwealth electoral districts 2007 by code (AEC)", - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-CommonwealthElectoralDivision_2007_ced_code_2007.json" + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-CommonwealthElectoralDivision_2007_ced_code_2007.json" }, "COM_ELB_NAME_2007": { "layerName": "CommonwealthElectoralDivision_2007", @@ -1097,7 +1532,7 @@ "nameProp": "ced_name_2007", "aliases": ["com_elb_name_2007"], "description": "Commonwealth electoral districts 2007 by name (AEC)", - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-CommonwealthElectoralDivision_2007_ced_name_2007.json" + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-CommonwealthElectoralDivision_2007_ced_name_2007.json" }, "SED_CODE18": { "layerName": "SED_2018", @@ -1106,10 +1541,10 @@ "serverMaxNativeZoom": 12, "serverMinZoom": 0, "serverMaxZoom": 28, - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-SED_CODE18_SED_2018.json", + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-SED_CODE18_SED_2018.json", "regionProp": "SED_CODE18", "nameProp": "SED_NAME18", - "aliases": ["sed", "sed_code", "sed_2018", "sed_code_2018"], + "aliases": ["sed_2018", "sed_code_2018"], "description": "State electoral divisions 2018 by code (ABS)", "bbox": [96.82, -43.74, 159.11, -9.14] }, @@ -1120,10 +1555,10 @@ "serverMaxNativeZoom": 12, "serverMinZoom": 0, "serverMaxZoom": 28, - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-SED_NAME18_SED_2018.json", + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-SED_NAME18_SED_2018.json", "regionProp": "SED_NAME18", "nameProp": "SED_NAME18", - "aliases": ["sed_name", "sed_name_2018"], + "aliases": ["sed_name_2018"], "description": "State electoral divisions 2018 by name (ABS)", "bbox": [96.82, -43.74, 159.11, -9.14] }, @@ -1134,7 +1569,7 @@ "serverMaxNativeZoom": 12, "serverMinZoom": 0, "serverMaxZoom": 28, - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-SED_CODE18_SED_2016.json", + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-SED_CODE18_SED_2016.json", "regionProp": "SED_CODE16", "nameProp": "SED_NAME16", "aliases": ["sed_2016", "sed_code_2016", "sed_code16"], @@ -1148,7 +1583,7 @@ "serverMaxNativeZoom": 12, "serverMinZoom": 0, "serverMaxZoom": 28, - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-SED_NAME16_SED_2016.json", + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-SED_NAME16_SED_2016.json", "regionProp": "SED_NAME16", "nameProp": "SED_NAME16", "aliases": ["sed_name_2016", "sed_name16"], @@ -1164,7 +1599,7 @@ "aliases": ["sed_code_2011"], "digits": 5, "description": "State electoral divisions 2011 by code (ABS)", - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-FID_SED_2011_AUST_SED_CODE.json", + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-FID_SED_2011_AUST_SED_CODE.json", "serverType": "MVT", "serverSubdomains": [], "serverMinZoom": 0, @@ -1184,7 +1619,7 @@ "regionProp": "SED_NAME", "aliases": ["sed_name_2011"], "description": "State electoral divisions 2011 by name (ABS)", - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-FID_SED_2011_AUST_SED_NAME.json", + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-FID_SED_2011_AUST_SED_NAME.json", "serverType": "MVT", "serverSubdomains": [], "serverMinZoom": 0, @@ -1205,7 +1640,7 @@ "aliases": ["gccsa_code_2011"], "digits": 5, "description": "Greater capital city statistical areas 2011 by code (ABS)", - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-FID_GCCSA_2011_AUST_GCC_CODE11.json", + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-FID_GCCSA_2011_AUST_GCC_CODE11.json", "serverType": "MVT", "serverSubdomains": [], "serverMinZoom": 0, @@ -1225,7 +1660,7 @@ "regionProp": "GCC_NAME11", "aliases": ["gccsa_name_2011"], "description": "Greater capital city statistical areas 2011 by name (ABS)", - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-FID_GCCSA_2011_AUST_GCC_NAME11.json", + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-FID_GCCSA_2011_AUST_GCC_NAME11.json", "serverType": "MVT", "serverSubdomains": [], "serverMinZoom": 0, @@ -1253,7 +1688,7 @@ "aliases": ["gccsa_code_2016"], "nameProp": "GCC_NAME16", "description": "Greater capital city statistical areas 2016 by code (ABS)", - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-GCCSA_2016_AUST_GCC_CODE16.json" + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-GCCSA_2016_AUST_GCC_CODE16.json" }, "GCCSA_NAME_2016": { "layerName": "GCCSA_2016_AUST", @@ -1271,7 +1706,7 @@ "aliases": ["gccsa_name_2016"], "nameProp": "GCC_NAME16", "description": "Greater capital city statistical areas 2016 by name (ABS)", - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-GCCSA_2016_AUST_GCC_NAME16.json" + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-GCCSA_2016_AUST_GCC_NAME16.json" }, "GCCSA_2021": { "layerName": "GCCSA_2021", @@ -1280,7 +1715,7 @@ "serverMaxNativeZoom": 12, "serverMinZoom": 0, "serverMaxZoom": 28, - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-GCCSA_2021_GCCSA_2021.json", + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-GCCSA_2021_GCCSA_2021.json", "regionProp": "GCC_CODE21", "nameProp": "GCC_NAME21", "aliases": ["gccsa_code_2021", "gccsa_code", "gccsa"], @@ -1294,7 +1729,7 @@ "serverMaxNativeZoom": 12, "serverMinZoom": 0, "serverMaxZoom": 28, - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-GCCSA_NAME_2021_GCCSA_2021.json", + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-GCCSA_NAME_2021_GCCSA_2021.json", "regionProp": "GCC_NAME21", "nameProp": "GCC_NAME21", "aliases": ["gccsa_name_2021", "gccsa_name"], @@ -1307,10 +1742,10 @@ "analyticsWmsLayerName": "region_map:FID_SUA_2011_AUST", "analyticsWmsServer": "http://geoserver.nationalmap.nicta.com.au/region_map/ows", "regionProp": "SUA_CODE11", - "aliases": ["sua_code_2011", "sua_code", "sua"], + "aliases": ["sua_code_2011"], "digits": 4, "description": "Significant urban areas 2011 by code", - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-FID_SUA_2011_AUST_SUA_CODE11.json", + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-FID_SUA_2011_AUST_SUA_CODE11.json", "serverType": "MVT", "serverSubdomains": [], "serverMinZoom": 0, @@ -1328,11 +1763,11 @@ "analyticsWmsLayerName": "region_map:FID_SUA_2011_AUST", "analyticsWmsServer": "http://geoserver.nationalmap.nicta.com.au/region_map/ows", "regionProp": "SUA_NAME11", - "aliases": ["sua_name_2011", "sua_name"], + "aliases": ["sua_name_2011"], "description": "Significant urban areas 2011 by name", "serverReplacements": [["[^A-Za-z]", ""]], "dataReplacements": [["[^A-Za-z]", ""]], - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-FID_SUA_2011_AUST_SUA_NAME11.json", + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-FID_SUA_2011_AUST_SUA_NAME11.json", "serverType": "MVT", "serverSubdomains": [], "serverMinZoom": 0, @@ -1353,7 +1788,7 @@ "aliases": ["ste_code_2011"], "description": "States and Territories 2011 by code (ABS)", "digits": 1, - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-FID_STE_2011_AUST_STE_CODE11.json", + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-FID_STE_2011_AUST_STE_CODE11.json", "serverType": "MVT", "serverSubdomains": [], "serverMinZoom": 0, @@ -1379,18 +1814,15 @@ ], "regionProp": "STE_CODE16", "aliases": [ - "ste", - "ste_code", "ste_code_2016", "ste_code_2017", "ste_code_2018", "ste_code_2019", - "ste_code_2020", - "ste_code_2021" + "ste_code_2020" ], "nameProp": "STE_NAME16", "description": "States and Territories 2016 by code (ABS)", - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-STE_2016_AUST_STE_CODE16.json" + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-STE_2016_AUST_STE_CODE16.json" }, "SOS": { "layerName": "FID_SOS_2011_AUST", @@ -1398,10 +1830,10 @@ "analyticsWmsLayerName": "region_map:FID_SOS_2011_AUST", "analyticsWmsServer": "http://geoserver.nationalmap.nicta.com.au/region_map/ows", "regionProp": "SOS_CODE11", - "aliases": ["sos_code_2011", "sos_code", "sos"], + "aliases": ["sos_code_2011"], "digits": 2, "description": "Section of state 2011", - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-FID_SOS_2011_AUST_SOS_CODE11.json", + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-FID_SOS_2011_AUST_SOS_CODE11.json", "serverType": "MVT", "serverSubdomains": [], "serverMinZoom": 0, @@ -1419,10 +1851,10 @@ "analyticsWmsLayerName": "region_map:FID_SOSR_2011_AUST", "analyticsWmsServer": "http://geoserver.nationalmap.nicta.com.au/region_map/ows", "regionProp": "SSR_CODE11", - "aliases": ["sosr_code_2011", "sosr_code", "sosr"], + "aliases": ["sosr_code_2011"], "digits": 3, "description": "Section of state range 2011", - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-FID_SOSR_2011_AUST_SSR_CODE11.json", + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-FID_SOSR_2011_AUST_SSR_CODE11.json", "serverType": "MVT", "serverSubdomains": [], "serverMinZoom": 0, @@ -1440,10 +1872,10 @@ "analyticsWmsLayerName": "region_map:FID_UCL_2011_AUST", "analyticsWmsServer": "http://geoserver.nationalmap.nicta.com.au/region_map/ows", "regionProp": "UCL_CODE11", - "aliases": ["ucl_code_2011", "ucl_code", "ucl"], + "aliases": ["ucl_code_2011"], "digits": 6, "description": "Urban centres and localities 2011", - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-FID_UCL_2011_AUST_UCL_CODE11.json", + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-FID_UCL_2011_AUST_UCL_CODE11.json", "serverType": "MVT", "serverSubdomains": [], "serverMinZoom": 0, @@ -1461,10 +1893,10 @@ "analyticsWmsLayerName": "region_map:FID_IREG_2011_AUST", "analyticsWmsServer": "http://geoserver.nationalmap.nicta.com.au/region_map/ows", "regionProp": "IR_CODE11", - "aliases": ["ireg_code_2011", "ireg_code", "ireg"], + "aliases": ["ireg_code_2011"], "digits": 3, "description": "Indigenous regions 2011", - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-FID_IREG_2011_AUST_IR_CODE11.json", + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-FID_IREG_2011_AUST_IR_CODE11.json", "serverType": "MVT", "serverSubdomains": [], "serverMinZoom": 0, @@ -1482,10 +1914,10 @@ "analyticsWmsLayerName": "region_map:FID_ILOC_2011_AUST", "analyticsWmsServer": "http://geoserver.nationalmap.nicta.com.au/region_map/ows", "regionProp": "IL_CODE11", - "aliases": ["iloc_code_2011", "iloc_code", "iloc"], + "aliases": ["iloc_code_2011"], "digits": 8, "description": "Indigenous locations 2011", - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-FID_ILOC_2011_AUST_IL_CODE11.json", + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-FID_ILOC_2011_AUST_IL_CODE11.json", "serverType": "MVT", "serverSubdomains": [], "serverMinZoom": 0, @@ -1503,10 +1935,10 @@ "analyticsWmsLayerName": "region_map:FID_IARE_2011_AUST", "analyticsWmsServer": "http://geoserver.nationalmap.nicta.com.au/region_map/ows", "regionProp": "IA_CODE11", - "aliases": ["iare_code_2011", "iare_code", "iare"], + "aliases": ["iare_code_2011"], "digits": 6, "description": "Indigenous areas 2011", - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-FID_IARE_2011_AUST_IA_CODE11.json", + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-FID_IARE_2011_AUST_IA_CODE11.json", "serverType": "MVT", "serverSubdomains": [], "serverMinZoom": 0, @@ -1524,10 +1956,10 @@ "analyticsWmsLayerName": "region_map:FID_RA_2011_AUST", "analyticsWmsServer": "http://geoserver.nationalmap.nicta.com.au/region_map/ows", "regionProp": "RA_CODE11", - "aliases": ["ra_code_2011", "ra_code", "ra"], + "aliases": ["ra_code_2011"], "digits": 2, "description": "Remoteness areas 2011", - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-FID_RA_2011_AUST_RA_CODE11.json", + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-FID_RA_2011_AUST_RA_CODE11.json", "serverType": "MVT", "serverSubdomains": [], "serverMinZoom": 0, @@ -1545,10 +1977,10 @@ "analyticsWmsLayerName": "region_map:FID_TR_2015_AUST", "analyticsWmsServer": "http://geoserver.nationalmap.nicta.com.au/region_map/ows", "regionProp": "TR_CODE15", - "aliases": ["tr_code_2015", "tr_code", "tr"], + "aliases": ["tr_code_2015"], "digits": 5, "description": "Tourism regions 2015", - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-FID_TR_2015_AUST_TR_CODE15.json", + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-FID_TR_2015_AUST_TR_CODE15.json", "serverType": "MVT", "serverSubdomains": [], "serverMinZoom": 0, @@ -1569,7 +2001,7 @@ "aliases": ["tr_code_2013", "tr_2013"], "digits": 5, "description": "Tourism regions 2013", - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-FID_TR_2013_AUST_TR_CODE13.json", + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-FID_TR_2013_AUST_TR_CODE13.json", "serverType": "MVT", "serverSubdomains": [], "serverMinZoom": 0, @@ -1590,7 +2022,7 @@ "aliases": ["nrmr", "nrmr_code", "nrmr_code_2011"], "digits": 3, "description": "Natural resource management regions 2011", - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-FID_NRMR_2011_AUST_NRMR_CODE.json", + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-FID_NRMR_2011_AUST_NRMR_CODE.json", "serverType": "MVT", "serverSubdomains": [], "serverMinZoom": 0, @@ -1610,7 +2042,7 @@ "regionProp": "NRMR_NAME", "aliases": ["nrmr_name"], "description": "Natural resource management regions 2011", - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-FID_NRMR_2011_AUST_NRMR_NAME.json", + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-FID_NRMR_2011_AUST_NRMR_NAME.json", "serverType": "MVT", "serverSubdomains": [], "serverMinZoom": 0, @@ -1628,10 +2060,10 @@ "analyticsWmsLayerName": "region_map:FID_ADD_2011_AUST", "analyticsWmsServer": "http://geoserver.nationalmap.nicta.com.au/region_map/ows", "regionProp": "ADD_CODE", - "aliases": ["add", "add_code", "add_code_2011"], + "aliases": ["add_code_2011"], "digits": 3, "description": "Australian drainage divisions 2011", - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-FID_ADD_2011_AUST_ADD_CODE.json", + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-FID_ADD_2011_AUST_ADD_CODE.json", "serverType": "MVT", "serverSubdomains": [], "serverMinZoom": 0, @@ -1649,9 +2081,9 @@ "analyticsWmsLayerName": "region_map:FID_ADD_2011_AUST", "analyticsWmsServer": "http://geoserver.nationalmap.nicta.com.au/region_map/ows", "regionProp": "ADD_NAME", - "aliases": ["add_name"], + "aliases": ["add_name_2011"], "description": "Australian drainage divisions by name 2011", - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-FID_ADD_2011_AUST_ADD_NAME.json", + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-FID_ADD_2011_AUST_ADD_NAME.json", "serverType": "MVT", "serverSubdomains": [], "serverMinZoom": 0, @@ -1676,10 +2108,10 @@ -9.142175976999962 ], "regionProp": "ADD_CODE16", - "aliases": ["add_code_2016", "add_code", "add"], + "aliases": ["add_code_2016"], "nameProp": "ADD_NAME16", "description": "Australian drainage divisions 2016", - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-ADD_2016_AUST_ADD_CODE16.json" + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-ADD_2016_AUST_ADD_CODE16.json" }, "ADD_NAME_2016": { "layerName": "ADD_2016_AUST", @@ -1694,10 +2126,10 @@ -9.142175976999962 ], "regionProp": "ADD_NAME16", - "aliases": ["add_name_2016", "add_name"], + "aliases": ["add_name_2016"], "nameProp": "ADD_NAME16", "description": "Australian drainage divisions by name 2016", - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-ADD_2016_AUST_ADD_NAME16.json" + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-ADD_2016_AUST_ADD_NAME16.json" }, "PHN": { "layerName": "FID_PHN_boundaries_AUS_Sep2015_V5", @@ -1708,7 +2140,7 @@ "aliases": ["phn_code_2015", "phn_code", "phn"], "digits": 6, "description": "Primary health networks", - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-FID_PHN_boundaries_AUS_Sep2015_V5_PHN_Code.json", + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-FID_PHN_boundaries_AUS_Sep2015_V5_PHN_Code.json", "serverType": "MVT", "serverSubdomains": [], "serverMinZoom": 0, @@ -1747,7 +2179,7 @@ ["^8$", "Australian Capital Territory"], ["^9$", "Other Territories"] ], - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-FID_STE_2011_AUST_STE_NAME11.json", + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-FID_STE_2011_AUST_STE_NAME11.json", "serverType": "MVT", "serverSubdomains": [], "serverMinZoom": 0, @@ -1794,7 +2226,7 @@ ["^8$", "Australian Capital Territory"], ["^9$", "Other Territories"] ], - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-STE_2016_AUST_STE_NAME16.json" + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-STE_2016_AUST_STE_NAME16.json" }, "SLA": { "layerName": "fid_asgc06_sla", @@ -1821,7 +2253,7 @@ 96.81676569599999, -43.740509602999985, 159.10921900799997, -9.142175976999999 ], - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-fid_asgc06_sla_SLA_CODE06.json" + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-fid_asgc06_sla_SLA_CODE06.json" }, "SLA_5DIGITCODE": { "layerName": "fid_asgc06_sla", @@ -1842,7 +2274,7 @@ 96.81676569599999, -43.740509602999985, 159.10921900799997, -9.142175976999999 ], - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-fid_asgc06_sla_SLA_5DIGIT.json" + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-fid_asgc06_sla_SLA_5DIGIT.json" }, "SLA_NAME": { "layerName": "fid_asgc06_sla", @@ -1862,7 +2294,7 @@ 96.81676569599999, -43.740509602999985, 159.10921900799997, -9.142175976999999 ], - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-fid_asgc06_sla_SLA_NAME06.json" + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-fid_asgc06_sla_SLA_NAME06.json" }, "CD": { "layerName": "fid_asgc06_cd", @@ -1883,7 +2315,7 @@ -9.142175976999999 ], "nameProp": "CD_CODE06", - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-fid_asgc06_cd_CD_CODE06.json" + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-fid_asgc06_cd_CD_CODE06.json" }, "CNT2": { "layerName": "FID_TM_WORLD_BORDERS", @@ -1894,7 +2326,7 @@ "aliases": ["cnt2", "iso2"], "digits": 2, "textCodes": true, - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-FID_TM_WORLD_BORDERS_ISO2.json", + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-FID_TM_WORLD_BORDERS_ISO2.json", "serverType": "MVT", "serverSubdomains": [], "serverMinZoom": 0, @@ -1915,7 +2347,7 @@ "aliases": ["cnt3", "iso3"], "digits": 3, "textCodes": true, - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-FID_TM_WORLD_BORDERS_ISO3.json", + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-FID_TM_WORLD_BORDERS_ISO3.json", "serverType": "MVT", "serverSubdomains": [], "serverMinZoom": 0, @@ -1935,7 +2367,7 @@ "regionProp": "NAME", "textCodes": true, "aliases": ["country"], - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-FID_TM_WORLD_BORDERS_NAME.json", + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-FID_TM_WORLD_BORDERS_NAME.json", "serverType": "MVT", "serverSubdomains": [], "serverMinZoom": 0, @@ -1965,7 +2397,7 @@ "aus_code_2021", "aus_code_2022" ], - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-FID_AUS_2011_AUST_AUS_CODE.json", + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-FID_AUS_2011_AUST_AUS_CODE.json", "serverType": "MVT", "serverSubdomains": [], "serverMinZoom": 0, @@ -1993,7 +2425,7 @@ "aliases": ["esa", "esa_code", "esa_code_2009"], "nameProp": "ESA_NAME", "description": "Employment Service Areas 2009-2015+", - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-FID_AUS_ESA_09_ESA_CODE.json" + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-FID_AUS_ESA_09_ESA_CODE.json" }, "ESA_NAME_09": { "layerName": "FID_AUS_ESA_09", @@ -2011,7 +2443,7 @@ "aliases": ["esa_name", "esa_name_2009"], "nameProp": "ESA_NAME", "description": "Employment Service Areas 2009-2015+", - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-FID_AUS_ESA_09_ESA_NAME.json" + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-FID_AUS_ESA_09_ESA_NAME.json" }, "IBRA7_REG": { "layerName": "ibra7_regions", @@ -2029,7 +2461,7 @@ "aliases": ["ibra7_reg", "ibra7_reg_code"], "nameProp": "REG_NAME_7", "description": "IBRA Regions v7", - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-ibra7_regions_REG_CODE_7.json" + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-ibra7_regions_REG_CODE_7.json" }, "IBRA7_REG_NAME": { "layerName": "ibra7_regions", @@ -2047,7 +2479,7 @@ "aliases": ["ibra7_reg_name"], "nameProp": "REG_NAME_7", "description": "IBRA Regions v7", - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-ibra7_regions_REG_NAME_7.json" + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-ibra7_regions_REG_NAME_7.json" }, "IBRA7_SUB": { "layerName": "ibra7_subregions", @@ -2065,7 +2497,7 @@ "aliases": ["ibra7_sub", "ibra7_sub_code"], "nameProp": "SUB_NAME_7", "description": "IBRA Subregions v7", - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-ibra7_subregions_SUB_CODE_7.json" + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-ibra7_subregions_SUB_CODE_7.json" }, "IBRA7_SUB_NAME": { "layerName": "ibra7_subregions", @@ -2083,7 +2515,7 @@ "aliases": ["ibra7_sub_name"], "nameProp": "SUB_NAME_7", "description": "IBRA Subregions v7", - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-ibra7_subregions_SUB_NAME_7.json" + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-ibra7_subregions_SUB_NAME_7.json" }, "NZ_AU_2017": { "layerName": "NZ_AU2017_HD_Clipped", @@ -2100,7 +2532,7 @@ "nameProp": "AU2017_NAM", "aliases": ["nz_au_code_2017", "nz_au"], "description": "Stats New Zealand Area Units 2017", - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-NZ_AU2017_HD_Clipped_AU2017.json" + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-NZ_AU2017_HD_Clipped_AU2017.json" }, "NZ_AU_2017_NAME": { "layerName": "NZ_AU2017_HD_Clipped", @@ -2117,7 +2549,7 @@ "nameProp": "AU2017_NAM", "aliases": ["nz_au_name_2017"], "description": "Stats New Zealand Area Units 2017", - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-NZ_AU2017_HD_Clipped_AU2017_NAM.json" + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-NZ_AU2017_HD_Clipped_AU2017_NAM.json" }, "NZ_MB_2017": { "layerName": "NZ_MB2017_HD_Clipped", @@ -2134,7 +2566,7 @@ "nameProp": "MB2017", "aliases": ["nz_mb_code_2017", "nz_mb"], "description": "Stats New Zealand Mesh Blocks 2017", - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-NZ_MB2017_HD_Clipped_MB2017.json" + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-NZ_MB2017_HD_Clipped_MB2017.json" }, "AEC_FED_2017_AMLS": { "layerName": "AEC_FED_2017_AMLS", @@ -2148,7 +2580,7 @@ "nameProp": "FED_DIV", "aliases": ["fed_code_2017"], "description": "Australian Electoral Commission Commonwealth Electoral Boundaries for ABS Australian Marriage Law Survey", - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-AEC_FED_2017_AMLS_FED_ABB.json" + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-AEC_FED_2017_AMLS_FED_ABB.json" }, "RRA_Name": { "layerName": "Regional_Recovery_Areas", @@ -2157,7 +2589,7 @@ "serverMaxNativeZoom": 12, "serverMinZoom": 0, "serverMaxZoom": 28, - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-RRA_Name_Regional_Recovery_Areas.json", + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-RRA_Name_Regional_Recovery_Areas.json", "regionProp": "RRA_Name", "nameProp": "RRA_Name", "aliases": ["RRA_NAME", "RRA"], @@ -2174,7 +2606,7 @@ "serverMaxNativeZoom": 12, "serverMinZoom": 0, "serverMaxZoom": 28, - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-ABARES_CODE_ABARES_Ag_Regions.json", + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-ABARES_CODE_ABARES_Ag_Regions.json", "regionProp": "AbaresCode", "nameProp": "AbaresName", "aliases": ["abares_code", "abares_region_code"], @@ -2191,7 +2623,7 @@ "serverMaxNativeZoom": 12, "serverMinZoom": 0, "serverMaxZoom": 28, - "regionIdsFile": "build/TerriaJS/data/regionids/region_map-ABARES_NAME_ABARES_Ag_Regions.json", + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-ABARES_NAME_ABARES_Ag_Regions.json", "regionProp": "AbaresName", "nameProp": "AbaresName", "description": "ABARES regions, farm survey statistical aggregation areas", From e75d4bee6c74f02511462c15f863a28410fa12be Mon Sep 17 00:00:00 2001 From: Stephen Davies Date: Mon, 23 Oct 2023 11:36:14 +1100 Subject: [PATCH 351/654] Fix tests, and improve some tests by checking for errors on loading --- test/ModelMixins/TableMixinSpec.ts | 92 ++++++++++--------- .../YDYRCatalogFunctionJobSpec.ts | 4 +- .../YDYRCatalogFunctionSpec.ts | 4 +- .../SdmxJson/SdmxJsonCatalogItemSpec.ts | 4 +- .../DimensionSelectorSectionSpec.tsx | 2 +- test/Table/TableStyleSpec.ts | 9 +- 6 files changed, 60 insertions(+), 55 deletions(-) diff --git a/test/ModelMixins/TableMixinSpec.ts b/test/ModelMixins/TableMixinSpec.ts index 57d6200e654..f467749db1e 100644 --- a/test/ModelMixins/TableMixinSpec.ts +++ b/test/ModelMixins/TableMixinSpec.ts @@ -74,24 +74,26 @@ describe("TableMixin", function () { item = new CsvCatalogItem("test", terria, undefined); jasmine.Ajax.install(); + jasmine.Ajax.stubRequest(/.*/).andError({}); + jasmine.Ajax.stubRequest( "build/TerriaJS/data/regionMapping.json" ).andReturn({ responseText: regionMapping }); jasmine.Ajax.stubRequest( - "build/TerriaJS/data/regionids/region_map-STE_2016_AUST_STE_NAME16.json" + "https://tiles.terria.io/region-mapping/regionids/region_map-STE_2016_AUST_STE_NAME16.json" ).andReturn({ responseText: regionIdsSte }); jasmine.Ajax.stubRequest( - "build/TerriaJS/data/regionids/region_map-FID_LGA_2011_AUST_LGA_NAME11.json" + "https://tiles.terria.io/region-mapping/regionids/region_map-FID_LGA_2011_AUST_LGA_NAME11.json" ).andReturn({ responseText: regionIdsLgaName }); jasmine.Ajax.stubRequest( - "build/TerriaJS/data/regionids/region_map-FID_LGA_2015_AUST_LGA_CODE15.json" + "https://tiles.terria.io/region-mapping/regionids/region_map-FID_LGA_2015_AUST_LGA_CODE15.json" ).andReturn({ responseText: regionIdsLgaCode }); jasmine.Ajax.stubRequest( - "build/TerriaJS/data/regionids/region_map-FID_LGA_2011_AUST_STE_NAME11.json" + "https://tiles.terria.io/region-mapping/regionids/region_map-FID_LGA_2011_AUST_STE_NAME11.json" ).andReturn({ responseText: regionIdsLgaNameStates }); }); @@ -103,7 +105,7 @@ describe("TableMixin", function () { let dataSource: CustomDataSource; beforeEach(async function () { item.setTrait(CommonStrata.user, "csvString", LatLonEnumDateIdCsv); - await item.loadMapItems(); + (await item.loadMapItems()).throwIfError(); dataSource = item.mapItems[0]; expect(dataSource instanceof CustomDataSource).toBe(true); }); @@ -170,7 +172,7 @@ describe("TableMixin", function () { it("creates entities for all times", async function () { item.defaultStyle.time.setTrait(CommonStrata.user, "timeColumn", null); - await item.loadMapItems(); + (await item.loadMapItems()).throwIfError(); const mapItem = item.mapItems[0]; expect(mapItem instanceof CustomDataSource).toBe(true); if (mapItem instanceof CustomDataSource) { @@ -191,7 +193,7 @@ describe("TableMixin", function () { "csvString", LatLonEnumDateIdWithRegionCsv ); - await item.loadMapItems(); + (await item.loadMapItems()).throwIfError(); dataSource = item.mapItems[0]; expect(dataSource instanceof CustomDataSource).toBe(true); }); @@ -265,7 +267,7 @@ describe("TableMixin", function () { it("creates entities for all times", async function () { item.defaultStyle.time.setTrait(CommonStrata.user, "timeColumn", null); - await item.loadMapItems(); + (await item.loadMapItems()).throwIfError(); const mapItem = item.mapItems[0]; expect(mapItem instanceof CustomDataSource).toBe(true); if (mapItem instanceof CustomDataSource) { @@ -281,7 +283,7 @@ describe("TableMixin", function () { item.setTrait(CommonStrata.user, "csvString", LatLonValCsv) ); - await item.loadMapItems(); + (await item.loadMapItems()).throwIfError(); const mapItem = item.mapItems[0]; expect(mapItem instanceof CustomDataSource).toBe(true); if (mapItem instanceof CustomDataSource) { @@ -295,7 +297,7 @@ describe("TableMixin", function () { item.setTrait(CommonStrata.user, "removeDuplicateRows", true); }); - await item.loadMapItems(); + (await item.loadMapItems()).throwIfError(); const mapItem = item.mapItems[0]; expect(mapItem instanceof CustomDataSource).toBe(true); if (mapItem instanceof CustomDataSource) { @@ -317,7 +319,7 @@ describe("TableMixin", function () { runInAction(() => item.setTrait(CommonStrata.user, "csvString", LatLonValCsv) ); - await item.loadMapItems(); + (await item.loadMapItems()).throwIfError(); const dataSource = item.mapItems[0] as CustomDataSource; const propertyNames = dataSource.entities.values[0].properties?.propertyNames; @@ -331,7 +333,7 @@ describe("TableMixin", function () { item.setTrait(CommonStrata.user, "csvString", BadDatesCsv) ); - await item.loadMapItems(); + (await item.loadMapItems()).throwIfError(); const mapItem = item.mapItems[0]; expect(mapItem instanceof CustomDataSource).toBe(true); if (mapItem instanceof CustomDataSource) { @@ -344,7 +346,7 @@ describe("TableMixin", function () { let dataSource: CustomDataSource; beforeEach(async function () { item.setTrait(CommonStrata.user, "csvString", ParkingSensorDataCsv); - await item.loadMapItems(); + (await item.loadMapItems()).throwIfError(); dataSource = item.mapItems[0]; expect(dataSource instanceof CustomDataSource).toBe(true); }); @@ -508,7 +510,7 @@ describe("TableMixin", function () { item.setTrait(CommonStrata.user, "csvString", LatLonEnumDateIdCsv); }); - await item.loadMapItems(); + (await item.loadMapItems()).throwIfError(); expect(item.timeDisableDimension).toBeUndefined(); }); @@ -518,7 +520,7 @@ describe("TableMixin", function () { item.setTrait(CommonStrata.user, "showDisableTimeOption", true); }); - await item.loadMapItems(); + (await item.loadMapItems()).throwIfError(); expect(item.timeDisableDimension).toBeDefined(); }); }); @@ -529,7 +531,7 @@ describe("TableMixin", function () { item.setTrait(CommonStrata.user, "csvString", LatLonEnumDateIdCsv); }); - await item.loadMapItems(); + (await item.loadMapItems()).throwIfError(); expect(item.styleDimensions?.options?.length).toBe(4); expect(item.styleDimensions?.options?.[2].id).toBe("value"); @@ -542,7 +544,7 @@ describe("TableMixin", function () { item.setTrait(CommonStrata.user, "showDisableStyleOption", true); }); - await item.loadMapItems(); + (await item.loadMapItems()).throwIfError(); expect(item.styleDimensions?.options?.length).toBe(4); expect(item.styleDimensions?.allowUndefined).toBeTruthy(); @@ -559,7 +561,7 @@ describe("TableMixin", function () { }); }); - await item.loadMapItems(); + (await item.loadMapItems()).throwIfError(); expect(item.styleDimensions?.options?.[2].id).toBe("value"); expect(item.styleDimensions?.options?.[2].name).toBe("Some Title"); @@ -574,7 +576,7 @@ describe("TableMixin", function () { }); }); - await item.loadMapItems(); + (await item.loadMapItems()).throwIfError(); expect(item.styleDimensions?.options?.[2].id).toBe("value"); expect(item.styleDimensions?.options?.[2].name).toBe("Some Style Title"); @@ -583,13 +585,13 @@ describe("TableMixin", function () { it("loads regionProviderLists on loadMapItems", async function () { item.setTrait(CommonStrata.user, "csvString", LatLonEnumDateIdCsv); - await item.loadMetadata(); + (await item.loadMetadata()).throwIfError(); expect(item.regionProviderLists).toBeUndefined(); - await item.loadMapItems(); + (await item.loadMapItems()).throwIfError(); - expect(item.regionProviderLists?.[0]?.regionProviders.length).toBe(114); + expect(item.regionProviderLists?.[0]?.regionProviders.length).toBe(143); }); it("loads regionProviderLists on loadMapItems - with multiple regionMappingDefinitionsUrl", async function () { @@ -609,16 +611,16 @@ describe("TableMixin", function () { item.setTrait(CommonStrata.user, "csvString", LgaWithDisambigCsv); - await item.loadMetadata(); + (await item.loadMetadata()).throwIfError(); expect(item.regionProviderLists).toBeUndefined(); - await item.loadMapItems(); + (await item.loadMapItems()).throwIfError(); expect(item.regionProviderLists?.length).toBe(2); expect(item.regionProviderLists?.[0]?.regionProviders.length).toBe(2); - expect(item.regionProviderLists?.[1]?.regionProviders.length).toBe(114); + expect(item.regionProviderLists?.[1]?.regionProviders.length).toBe(143); // Item region provider should match from "additionalRegion.json" (as it comes before "build/TerriaJS/data/regionMapping.json") expect(item.activeTableStyle.regionColumn?.regionType?.description).toBe( @@ -644,15 +646,15 @@ describe("TableMixin", function () { item.setTrait(CommonStrata.user, "csvString", LgaWithDisambigCsv); - await item.loadMetadata(); + (await item.loadMetadata()).throwIfError(); expect(item.regionProviderLists).toBeUndefined(); - await item.loadMapItems(); + (await item.loadMapItems()).throwIfError(); expect(item.regionProviderLists?.length).toBe(1); - expect(item.regionProviderLists?.[0]?.regionProviders.length).toBe(114); + expect(item.regionProviderLists?.[0]?.regionProviders.length).toBe(143); // Item region provider should match from "build/TerriaJS/data/regionMapping.json" expect(item.activeTableStyle.regionColumn?.regionType?.description).toBe( @@ -667,7 +669,7 @@ describe("TableMixin", function () { item.setTrait("definition", "activeStyle", "0dp"); - await item.loadMapItems(); + (await item.loadMapItems()).throwIfError(); expect(item.legends[0].items.length).toBe(7); expect(item.legends[0].items.map((i) => i.title)).toEqual([ @@ -686,7 +688,7 @@ describe("TableMixin", function () { item.setTrait("definition", "activeStyle", "1dp"); - await item.loadMapItems(); + (await item.loadMapItems()).throwIfError(); expect(item.legends[0].items.length).toBe(7); expect(item.legends[0].items.map((i) => i.title)).toEqual([ @@ -705,7 +707,7 @@ describe("TableMixin", function () { item.setTrait("definition", "activeStyle", "2dp"); - await item.loadMapItems(); + (await item.loadMapItems()).throwIfError(); expect(item.legends[0].items.length).toBe(7); expect(item.legends[0].items.map((i) => i.title)).toEqual([ @@ -724,7 +726,7 @@ describe("TableMixin", function () { item.setTrait("definition", "activeStyle", "3dp"); - await item.loadMapItems(); + (await item.loadMapItems()).throwIfError(); expect(item.legends[0].items.length).toBe(7); expect(item.legends[0].items.map((i) => i.title)).toEqual([ @@ -746,7 +748,7 @@ describe("TableMixin", function () { styles: [{ name: "0dp", title: "Some title" }] }); - await item.loadMapItems(); + (await item.loadMapItems()).throwIfError(); expect(item.legends[0].title).toBe("0dp"); }); @@ -755,7 +757,7 @@ describe("TableMixin", function () { describe("region mapping - LGA with disambig", function () { beforeEach(async function () { item.setTrait(CommonStrata.user, "csvString", LgaWithDisambigCsv); - await item.loadMapItems(); + (await item.loadMapItems()).throwIfError(); await item.regionProviderLists?.[0] ?.getRegionProvider("LGA_NAME_2011") @@ -833,7 +835,7 @@ describe("TableMixin", function () { ` ); - await item.loadMapItems(); + (await item.loadMapItems()).throwIfError(); expect(item.activeTableStyle.regionColumn?.name).toBe("lga code-_-2015"); expect(item.activeTableStyle.regionColumn?.regionType?.regionType).toBe( @@ -884,7 +886,7 @@ describe("TableMixin", function () { ]); item.setTrait(CommonStrata.user, "activeStyle", "test-style"); - await item.loadMapItems(); + (await item.loadMapItems()).throwIfError(); const mapItem = item.mapItems[0] as CustomDataSource; @@ -958,7 +960,7 @@ describe("TableMixin", function () { ]); item.setTrait(CommonStrata.user, "activeStyle", "test-style"); - await item.loadMapItems(); + (await item.loadMapItems()).throwIfError(); const mapItem = item.mapItems[0] as CustomDataSource; @@ -1067,7 +1069,7 @@ describe("TableMixin", function () { ]); item.setTrait(CommonStrata.user, "activeStyle", "test-style"); - await item.loadMapItems(); + (await item.loadMapItems()).throwIfError(); const mapItem = item.mapItems[0] as CustomDataSource; @@ -1242,7 +1244,7 @@ describe("TableMixin", function () { ]); item.setTrait(CommonStrata.user, "activeStyle", "test-style"); - await item.loadMapItems(); + (await item.loadMapItems()).throwIfError(); const mapItem = item.mapItems[0] as CustomDataSource; @@ -1396,7 +1398,7 @@ describe("TableMixin", function () { ]); item.setTrait(CommonStrata.user, "activeStyle", "test-style"); - await item.loadMapItems(); + (await item.loadMapItems()).throwIfError(); const mapItem = item.mapItems[0] as CustomDataSource; @@ -1571,7 +1573,7 @@ describe("TableMixin", function () { ]); item.setTrait(CommonStrata.user, "activeStyle", "test-style"); - await item.loadMapItems(); + (await item.loadMapItems()).throwIfError(); const mapItem = item.mapItems[0] as CustomDataSource; @@ -1773,7 +1775,7 @@ describe("TableMixin", function () { ]); item.setTrait(CommonStrata.user, "activeStyle", "test-style"); - await item.loadMapItems(); + (await item.loadMapItems()).throwIfError(); const mapItem = item.mapItems[0] as CustomDataSource; @@ -1911,7 +1913,7 @@ describe("TableMixin", function () { ]); item.setTrait(CommonStrata.user, "activeStyle", "test-style"); - await item.loadMapItems(); + (await item.loadMapItems()).throwIfError(); const mapItem = item.mapItems[0] as CustomDataSource; @@ -2017,7 +2019,7 @@ describe("TableMixin", function () { it("doesn't pick hidden style as default activeStyle", async function () { item.setTrait(CommonStrata.user, "csvString", ParkingSensorDataCsv); - await item.loadMapItems(); + (await item.loadMapItems()).throwIfError(); expect(item.activeStyle).toBe("eventid"); @@ -2028,7 +2030,7 @@ describe("TableMixin", function () { }) ]); - await item.loadMapItems(); + (await item.loadMapItems()).throwIfError(); expect(item.activeStyle).toBe("parkflag"); }); diff --git a/test/Models/Catalog/CatalogFunctions/YDYRCatalogFunctionJobSpec.ts b/test/Models/Catalog/CatalogFunctions/YDYRCatalogFunctionJobSpec.ts index cb243ee2cff..7fabfa43206 100644 --- a/test/Models/Catalog/CatalogFunctions/YDYRCatalogFunctionJobSpec.ts +++ b/test/Models/Catalog/CatalogFunctions/YDYRCatalogFunctionJobSpec.ts @@ -60,11 +60,11 @@ describe("YDYRCatalogFunctionJob", function () { ).andReturn({ responseText: regionMapping }); jasmine.Ajax.stubRequest( - "build/TerriaJS/data/regionids/region_map-SA4_2016_AUST_SA4_CODE16.json" + "https://tiles.terria.io/region-mapping/regionids/region_map-SA4_2016_AUST_SA4_CODE16.json" ).andReturn({ responseText: sa4regionCodes }); jasmine.Ajax.stubRequest( - "build/TerriaJS/data/regionids/region_map-FID_LGA_2011_AUST_LGA_CODE11.json" + "https://tiles.terria.io/region-mapping/regionids/region_map-FID_LGA_2011_AUST_LGA_CODE11.json" ).andReturn({ responseText: lga2011RegionCodes }); terria = new Terria(); diff --git a/test/Models/Catalog/CatalogFunctions/YDYRCatalogFunctionSpec.ts b/test/Models/Catalog/CatalogFunctions/YDYRCatalogFunctionSpec.ts index 2b062b557d6..d36b51abe64 100644 --- a/test/Models/Catalog/CatalogFunctions/YDYRCatalogFunctionSpec.ts +++ b/test/Models/Catalog/CatalogFunctions/YDYRCatalogFunctionSpec.ts @@ -62,11 +62,11 @@ describe("YDYRCatalogFunction", function () { }); jasmine.Ajax.stubRequest( - "build/TerriaJS/data/regionids/region_map-SA4_2016_AUST_SA4_CODE16.json" + "https://tiles.terria.io/region-mapping/regionids/region_map-SA4_2016_AUST_SA4_CODE16.json" ).andReturn({ responseText: sa4regionCodes }); jasmine.Ajax.stubRequest( - "build/TerriaJS/data/regionids/region_map-FID_LGA_2011_AUST_LGA_CODE11.json" + "https://tiles.terria.io/region-mapping/regionids/region_map-FID_LGA_2011_AUST_LGA_CODE11.json" ).andReturn({ responseText: lga2011RegionCodes }); jasmine.Ajax.stubRequest( diff --git a/test/Models/Catalog/SdmxJson/SdmxJsonCatalogItemSpec.ts b/test/Models/Catalog/SdmxJson/SdmxJsonCatalogItemSpec.ts index d27b47aea4a..538fc939f9e 100644 --- a/test/Models/Catalog/SdmxJson/SdmxJsonCatalogItemSpec.ts +++ b/test/Models/Catalog/SdmxJson/SdmxJsonCatalogItemSpec.ts @@ -46,11 +46,11 @@ describe("SdmxJsonCatalogItem", function () { ).andReturn({ responseText: regionMapping }); jasmine.Ajax.stubRequest( - "build/TerriaJS/data/regionids/region_map-STE_2016_AUST_STE_CODE16.json" + "https://tiles.terria.io/region-mapping/regionids/region_map-STE_2016_AUST_STE_CODE16.json" ).andReturn({ responseText: steCodes }); jasmine.Ajax.stubRequest( - "build/TerriaJS/data/regionids/region_map-FID_TM_WORLD_BORDERS_ISO2.json" + "https://tiles.terria.io/region-mapping/regionids/region_map-FID_TM_WORLD_BORDERS_ISO2.json" ).andReturn({ responseText: isoCodes }); jasmine.Ajax.stubRequest( diff --git a/test/ReactViews/DimensionSelectorSectionSpec.tsx b/test/ReactViews/DimensionSelectorSectionSpec.tsx index 073a2fc0500..ccc2f9e185a 100644 --- a/test/ReactViews/DimensionSelectorSectionSpec.tsx +++ b/test/ReactViews/DimensionSelectorSectionSpec.tsx @@ -170,7 +170,7 @@ describe("DimensionSelectorSection", function () { }); jasmine.Ajax.stubRequest( - "build/TerriaJS/data/regionids/region_map-FID_LGA_2015_AUST_LGA_CODE15.json" + "https://tiles.terria.io/region-mapping/regionids/region_map-FID_LGA_2015_AUST_LGA_CODE15.json" ).andReturn({ responseText: JSON.stringify( require("../../wwwroot/data/regionids/region_map-FID_LGA_2015_AUST_LGA_CODE15.json") diff --git a/test/Table/TableStyleSpec.ts b/test/Table/TableStyleSpec.ts index 49d303dc467..350b31770f4 100644 --- a/test/Table/TableStyleSpec.ts +++ b/test/Table/TableStyleSpec.ts @@ -44,21 +44,24 @@ describe("TableStyle", function () { "build/TerriaJS/data/regionMapping.json"; jasmine.Ajax.install(); + jasmine.Ajax.stubRequest(/.*/).andError({ + statusText: "Unexpected request, not stubbed" + }); jasmine.Ajax.stubRequest( "build/TerriaJS/data/regionMapping.json" ).andReturn({ responseText: regionMapping }); jasmine.Ajax.stubRequest( - "build/TerriaJS/data/regionids/region_map-SED_CODE18_SED_2018.json" + "https://tiles.terria.io/region-mapping/regionids/region_map-SED_CODE18_SED_2018.json" ).andReturn({ responseText: SedCods }); jasmine.Ajax.stubRequest( - "build/TerriaJS/data/regionids/region_map-SA4_2016_AUST_SA4_CODE16.json" + "https://tiles.terria.io/region-mapping/regionids/region_map-SA4_2016_AUST_SA4_CODE16.json" ).andReturn({ responseText: Sa4Codes }); jasmine.Ajax.stubRequest( - "build/TerriaJS/data/regionids/region_map-SA4_2016_AUST_SA4_NAME16.json" + "https://tiles.terria.io/region-mapping/regionids/region_map-SA4_2016_AUST_SA4_NAME16.json" ).andReturn({ responseText: Sa4Names }); }); From e949c4d1dd1dde9dd98cc5c762446e47ab4889db Mon Sep 17 00:00:00 2001 From: Stephen Davies Date: Wed, 25 Oct 2023 19:01:58 +1100 Subject: [PATCH 352/654] Add CLUE blocks --- wwwroot/data/regionMapping.json | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/wwwroot/data/regionMapping.json b/wwwroot/data/regionMapping.json index a2f929b28d2..7d456cd82e5 100644 --- a/wwwroot/data/regionMapping.json +++ b/wwwroot/data/regionMapping.json @@ -2632,6 +2632,20 @@ 96.81694140799998, -43.74050960300003, 159.10921900799997, -9.142175976999999 ] + }, + "City_of_Melbourne_CLUE": { + "layerName": "City_of_Melbourne_CLUE", + "server": "https://tiles.terria.io/City_of_Melbourne_CLUE/{z}/{x}/{y}.pbf", + "serverType": "MVT", + "serverMaxNativeZoom": 16, + "serverMinZoom": 10, + "serverMaxZoom": 28, + "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-City_of_Melbourne_CLUE.json", + "uniqueIdProp": "FID", + "regionProp": "block_id", + "nameProp": "clue_area", + "description": "City of Melbourne Census of Land Use and Employment", + "bbox": [144.88, -37.86, 145, -37.77] } } } From 7b493681ace33769f754d178472ea2d50d2f3b96 Mon Sep 17 00:00:00 2001 From: Stephen Davies Date: Wed, 25 Oct 2023 19:39:53 +1100 Subject: [PATCH 353/654] Remove atom tracking database https://xkcd.com/2170/ --- wwwroot/data/regionMapping.json | 555 +++++++++----------------------- 1 file changed, 144 insertions(+), 411 deletions(-) diff --git a/wwwroot/data/regionMapping.json b/wwwroot/data/regionMapping.json index 7d456cd82e5..7ffeece0aad 100644 --- a/wwwroot/data/regionMapping.json +++ b/wwwroot/data/regionMapping.json @@ -14,7 +14,7 @@ "nameProp": "STATE_NAME_2021", "aliases": ["ste_code_2021", "ste_code", "ste"], "description": "States and Territories 2021", - "bbox": [96.81, -43.74, 168, -9.14] + "bbox": [96.81, -43.74, 168.0, -9.14] }, "ILOC_2021": { "layerName": "ILOC_2021", @@ -29,7 +29,7 @@ "nameProp": "ILO_NAME21", "aliases": ["iloc_code_2021", "iloc_code", "iloc"], "description": "Indigenous Locations 2021", - "bbox": [96.81, -43.74, 168, -9.14] + "bbox": [96.81, -43.74, 168.0, -9.14] }, "ILOC_NAME_2021": { "layerName": "ILOC_2021", @@ -44,7 +44,7 @@ "nameProp": "ILO_NAME21", "aliases": ["iloc_name_2021", "iloc_name"], "description": "Indigenous Locations 2021", - "bbox": [96.81, -43.74, 168, -9.14] + "bbox": [96.81, -43.74, 168.0, -9.14] }, "IARE_2021": { "layerName": "IARE_2021", @@ -59,7 +59,7 @@ "nameProp": "IAR_NAME21", "aliases": ["iare_code_2021", "iare_code", "iare"], "description": "Indigenous Areas 2021", - "bbox": [96.81, -43.74, 168, -9.14] + "bbox": [96.81, -43.74, 168.0, -9.14] }, "IARE_NAME_2021": { "layerName": "IARE_2021", @@ -74,7 +74,7 @@ "nameProp": "IAR_NAME21", "aliases": ["iare_name_2021", "iare_name"], "description": "Indigenous Areas 2021", - "bbox": [96.81, -43.74, 168, -9.14] + "bbox": [96.81, -43.74, 168.0, -9.14] }, "IREG_2021": { "layerName": "IREG_2021", @@ -89,7 +89,7 @@ "nameProp": "IRE_NAME21", "aliases": ["ireg_code_2021", "ireg_code", "ireg"], "description": "Indigenous Regions 2021", - "bbox": [96.81, -43.74, 168, -9.14] + "bbox": [96.81, -43.74, 168.0, -9.14] }, "IREG_NAME_2021": { "layerName": "IREG_2021", @@ -104,7 +104,7 @@ "nameProp": "IRE_NAME21", "aliases": ["ireg_name_2021", "ireg_name"], "description": "Indigenous Regions 2021", - "bbox": [96.81, -43.74, 168, -9.14] + "bbox": [96.81, -43.74, 168.0, -9.14] }, "RA_2021": { "layerName": "RA_2021", @@ -119,7 +119,7 @@ "nameProp": "RA_NAME21", "aliases": ["ra_code_2021", "ra_code", "ra"], "description": "Remoteness Areas 2021", - "bbox": [96.81, -43.74, 168, -9.14] + "bbox": [96.81, -43.74, 168.0, -9.14] }, "SAL_2021": { "layerName": "SAL_2021", @@ -134,7 +134,7 @@ "nameProp": "SAL_NAME_2021", "aliases": ["sal_code_2021", "sal_code", "sal"], "description": "Suburbs and Localities 2021", - "bbox": [96.81, -43.74, 168, -9.14] + "bbox": [96.81, -43.74, 168.0, -9.14] }, "ADD_2021": { "layerName": "ADD_2021", @@ -149,7 +149,7 @@ "nameProp": "ADD_NAME_2021", "aliases": ["add_code_2021", "add_code", "add"], "description": "Australian Drainage Divisions 2021", - "bbox": [96.81, -43.74, 168, -9.14] + "bbox": [96.81, -43.74, 168.0, -9.14] }, "ADD_NAME_2021": { "layerName": "ADD_2021", @@ -164,7 +164,7 @@ "nameProp": "ADD_NAME_2021", "aliases": ["add_name_2021", "add_name"], "description": "Australian Drainage Divisions 2021", - "bbox": [96.81, -43.74, 168, -9.14] + "bbox": [96.81, -43.74, 168.0, -9.14] }, "DZN_2021": { "layerName": "DZN_2021", @@ -179,7 +179,7 @@ "nameProp": "DZN_CODE_2021", "aliases": ["dzn_code_2021", "dzn_code", "dzn"], "description": "Destination Zones 2021", - "bbox": [96.81, -43.74, 168, -9.14] + "bbox": [96.81, -43.74, 168.0, -9.14] }, "LGA_2022": { "layerName": "LGA_2022", @@ -194,7 +194,7 @@ "nameProp": "LGA_NAME_2022", "aliases": ["lga_code_2022"], "description": "Local Government Areas 2022", - "bbox": [96.81, -43.74, 168, -9.14] + "bbox": [96.81, -43.74, 168.0, -9.14] }, "LGA_2023": { "layerName": "LGA_2023", @@ -209,7 +209,7 @@ "nameProp": "LGA_NAME_2023", "aliases": ["lga_code_2023", "lga_code", "lga"], "description": "Local Government Areas 2023", - "bbox": [96.81, -43.74, 168, -9.14] + "bbox": [96.81, -43.74, 168.0, -9.14] }, "SED_2021": { "layerName": "SED_2021", @@ -224,7 +224,7 @@ "nameProp": "SED_NAME_2021", "aliases": ["sed_code_2021"], "description": "State Electoral Divisions 2021 (ABS)", - "bbox": [96.81, -43.74, 168, -9.14] + "bbox": [96.81, -43.74, 168.0, -9.14] }, "SED_NAME_2021": { "layerName": "SED_2021", @@ -239,7 +239,7 @@ "nameProp": "SED_NAME_2021", "aliases": ["sed_name_2021"], "description": "State Electoral Divisions 2021 (ABS)", - "bbox": [96.81, -43.74, 168, -9.14] + "bbox": [96.81, -43.74, 168.0, -9.14] }, "SED_2022": { "layerName": "SED_2022", @@ -254,7 +254,7 @@ "nameProp": "SED_NAME_2022", "aliases": ["sed_code_2022", "sed_code", "sed"], "description": "State Electoral Divisions 2022 (ABS)", - "bbox": [96.81, -43.74, 168, -9.14] + "bbox": [96.81, -43.74, 168.0, -9.14] }, "SED_NAME_2022": { "layerName": "SED_2022", @@ -269,7 +269,7 @@ "nameProp": "SED_NAME_2022", "aliases": ["sed_name_2022", "sed_name"], "description": "State Electoral Divisions 2022 (ABS)", - "bbox": [96.81, -43.74, 168, -9.14] + "bbox": [96.81, -43.74, 168.0, -9.14] }, "CED_2021": { "layerName": "CED_2021", @@ -284,7 +284,7 @@ "nameProp": "CED_NAME_2021", "aliases": ["ced_code_2021", "ced_code", "ced"], "description": "Commonwealth Electoral Divisions 2021 (ABS)", - "bbox": [96.81, -43.74, 168, -9.14] + "bbox": [96.81, -43.74, 168.0, -9.14] }, "CED_NAME_2021": { "layerName": "CED_2021", @@ -299,7 +299,7 @@ "nameProp": "CED_NAME_2021", "aliases": ["ced_name_2021", "ced_name"], "description": "Commonwealth Electoral Divisions 2021 (ABS)", - "bbox": [96.81, -43.74, 168, -9.14] + "bbox": [96.81, -43.74, 168.0, -9.14] }, "POA_2021": { "layerName": "POA_2021", @@ -320,7 +320,7 @@ "postcode" ], "description": "Postal Areas 2021 (ABS)", - "bbox": [96.81, -43.74, 168, -9.14] + "bbox": [96.81, -43.74, 168.0, -9.14] }, "TR_2021": { "layerName": "TR_2021", @@ -335,7 +335,7 @@ "nameProp": "TR_NAME_2021", "aliases": ["tr_code_2021", "tr_code", "tr"], "description": "Tourism Regions 2021", - "bbox": [96.81, -43.74, 168, -9.14] + "bbox": [96.81, -43.74, 168.0, -9.14] }, "TR_NAME_2021": { "layerName": "TR_2021", @@ -350,7 +350,7 @@ "nameProp": "TR_NAME_2021", "aliases": ["tr_name_2021", "tr_name"], "description": "Tourism Regions 2021", - "bbox": [96.81, -43.74, 168, -9.14] + "bbox": [96.81, -43.74, 168.0, -9.14] }, "SUA_2021": { "layerName": "SUA_2021", @@ -365,7 +365,7 @@ "nameProp": "SUA_NAME_2021", "aliases": ["sua_code_2021", "sua_code", "sua"], "description": "Significant Urban Areas 2021", - "bbox": [96.81, -43.74, 168, -9.14] + "bbox": [96.81, -43.74, 168.0, -9.14] }, "SUA_NAME_2021": { "layerName": "SUA_2021", @@ -380,7 +380,7 @@ "nameProp": "SUA_NAME_2021", "aliases": ["sua_name_2022", "sua_name"], "description": "Significant Urban Areas 2021", - "bbox": [96.81, -43.74, 168, -9.14] + "bbox": [96.81, -43.74, 168.0, -9.14] }, "UCL_2021": { "layerName": "UCL_2021", @@ -395,7 +395,7 @@ "nameProp": "UCL_NAME_2021", "aliases": ["ucl_code_2021", "ucl_code", "ucl"], "description": "Urban Centres and Localities 2021", - "bbox": [96.81, -43.74, 168, -9.14] + "bbox": [96.81, -43.74, 168.0, -9.14] }, "UCL_NAME_2021": { "layerName": "UCL_2021", @@ -410,7 +410,7 @@ "nameProp": "UCL_NAME_2021", "aliases": ["ucl_name_2021", "ucl_name"], "description": "Urban Centres and Localities 2021", - "bbox": [96.81, -43.74, 168, -9.14] + "bbox": [96.81, -43.74, 168.0, -9.14] }, "SOS_2021": { "layerName": "SOS_2021", @@ -425,7 +425,7 @@ "nameProp": "SOS_NAME_2021", "aliases": ["sos_code_2021", "sos_code", "sos"], "description": "Section of State 2021", - "bbox": [96.81, -43.74, 168, -9.14] + "bbox": [96.81, -43.74, 168.0, -9.14] }, "SOSR_2021": { "layerName": "SOSR_2021", @@ -440,7 +440,7 @@ "nameProp": "SOSR_NAME_2021", "aliases": ["sosr_code_2021", "sosr_code", "sosr"], "description": "Section of State Range 2021", - "bbox": [96.81, -43.74, 168, -9.14] + "bbox": [96.81, -43.74, 168.0, -9.14] }, "SA1_2011": { "layerName": "FID_SA1_2011_AUST", @@ -457,10 +457,7 @@ "serverMinZoom": 0, "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [ - 96.81694140799998, -43.74050960300003, 159.10921900799997, - -9.142175976999999 - ], + "bbox": [96.81, -43.75, 159.11, -9.14], "nameProp": "SA1_7DIG11" }, "SA1_7DIGIT_2011": { @@ -478,10 +475,7 @@ "serverMinZoom": 0, "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [ - 96.81694140799998, -43.74050960300003, 159.10921900799997, - -9.142175976999999 - ], + "bbox": [96.81, -43.75, 159.11, -9.14], "nameProp": "SA1_7DIG11" }, "SA1_2016": { @@ -492,10 +486,7 @@ "serverMinZoom": 0, "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [ - 96.81694139400007, -43.74050960299996, 167.99803499600006, - -9.142175976999962 - ], + "bbox": [96.81, -43.75, 168.0, -9.14], "regionProp": "SA1_MAIN16", "aliases": ["sa1_code_2016", "sa1_maincode_2016"], "nameProp": "SA1_7DIG16", @@ -510,10 +501,7 @@ "serverMinZoom": 0, "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [ - 96.81694139400007, -43.74050960299996, 167.99803499600006, - -9.142175976999962 - ], + "bbox": [96.81, -43.75, 168.0, -9.14], "regionProp": "SA1_7DIG16", "aliases": ["sa1_7digitcode", "sa1_7digitcode_2016"], "nameProp": "SA1_7DIG16", @@ -532,7 +520,7 @@ "nameProp": "SA1_CODE21", "aliases": ["sa1_code_2021", "sa1_maincode_2021", "sa1", "sa1_code"], "description": "Statistical Area Level 1 2021 (ABS)", - "bbox": [96.81, -43.75, 168, -9.14] + "bbox": [96.81, -43.75, 168.0, -9.14] }, "SA4_2011": { "layerName": "FID_SA4_2011_AUST", @@ -549,10 +537,7 @@ "serverMinZoom": 0, "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [ - 96.81694140799998, -43.74050960300003, 159.10921900799997, - -9.142175976999999 - ], + "bbox": [96.81, -43.75, 159.11, -9.14], "nameProp": "SA4_NAME11" }, "SA4_NAME_2011": { @@ -569,10 +554,7 @@ "serverMinZoom": 0, "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [ - 96.81694140799998, -43.74050960300003, 159.10921900799997, - -9.142175976999999 - ], + "bbox": [96.81, -43.75, 159.11, -9.14], "nameProp": "SA4_NAME11" }, "SA4_2016": { @@ -583,10 +565,7 @@ "serverMinZoom": 0, "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [ - 96.81694139400007, -43.74050960299996, 167.99803499600006, - -9.142175976999962 - ], + "bbox": [96.81, -43.75, 168.0, -9.14], "regionProp": "SA4_CODE16", "aliases": ["sa4_maincode_2016", "sa4_code_2016"], "nameProp": "SA4_NAME16", @@ -601,10 +580,7 @@ "serverMinZoom": 0, "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [ - 96.81694139400007, -43.74050960299996, 167.99803499600006, - -9.142175976999962 - ], + "bbox": [96.81, -43.75, 168.0, -9.14], "regionProp": "SA4_NAME16", "aliases": ["sa4_name_2016"], "nameProp": "SA4_NAME16", @@ -623,7 +599,7 @@ "nameProp": "SA4_NAME21", "aliases": ["sa4_code_2021", "sa4_maincode_2021", "sa4", "sa4_code"], "description": "Statistical Area Level 4 2021 by code (ABS)", - "bbox": [96.81, -43.75, 168, -9.14] + "bbox": [96.81, -43.75, 168.0, -9.14] }, "SA4_NAME_2021": { "layerName": "SA4_2021", @@ -637,7 +613,7 @@ "nameProp": "SA4_NAME21", "aliases": ["sa4_name_2021", "sa4_name"], "description": "Statistical Area Level 4 2021 by name (ABS)", - "bbox": [96.81, -43.75, 168, -9.14] + "bbox": [96.81, -43.75, 168.0, -9.14] }, "SA3_2011": { "layerName": "FID_SA3_2011_AUST", @@ -654,10 +630,7 @@ "serverMinZoom": 0, "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [ - 96.81694140799998, -43.74050960300003, 159.10921900799997, - -9.142175976999999 - ], + "bbox": [96.81, -43.75, 159.11, -9.14], "nameProp": "SA3_NAME11" }, "SA3_NAME_2011": { @@ -675,10 +648,7 @@ "serverMinZoom": 0, "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [ - 96.81694140799998, -43.74050960300003, 159.10921900799997, - -9.142175976999999 - ], + "bbox": [96.81, -43.75, 159.11, -9.14], "nameProp": "SA3_NAME11" }, "SA3_2016": { @@ -689,10 +659,7 @@ "serverMinZoom": 0, "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [ - 96.81694139400007, -43.74050960299996, 167.99803499600006, - -9.142175976999962 - ], + "bbox": [96.81, -43.75, 168.0, -9.14], "regionProp": "SA3_CODE16", "aliases": ["sa3_code_2016", "sa3_maincode_2016"], "nameProp": "SA3_NAME16", @@ -707,10 +674,7 @@ "serverMinZoom": 0, "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [ - 96.81694139400007, -43.74050960299996, 167.99803499600006, - -9.142175976999962 - ], + "bbox": [96.81, -43.75, 168.0, -9.14], "regionProp": "SA3_NAME16", "aliases": ["sa3_name_2016"], "nameProp": "SA3_NAME16", @@ -729,7 +693,7 @@ "nameProp": "SA3_NAME21", "aliases": ["sa3_code_2021", "sa3_maincode_2021", "sa3", "sa3_code"], "description": "Statistical Area Level 3 2021 by code (ABS)", - "bbox": [96.81, -43.75, 168, -9.14] + "bbox": [96.81, -43.75, 168.0, -9.14] }, "SA3_NAME_2021": { "layerName": "SA3_2021", @@ -743,7 +707,7 @@ "nameProp": "SA3_NAME21", "aliases": ["sa3_name_2021", "sa3_name"], "description": "Statistical Area Level 3 2021 by name (ABS)", - "bbox": [96.81, -43.75, 168, -9.14] + "bbox": [96.81, -43.75, 168.0, -9.14] }, "SA2_2011": { "layerName": "FID_SA2_2011_AUST", @@ -760,10 +724,7 @@ "serverMinZoom": 0, "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [ - 96.81694140799998, -43.74050960300003, 159.10921900799997, - -9.142175976999999 - ], + "bbox": [96.81, -43.75, 159.11, -9.14], "nameProp": "SA2_NAME11" }, "SA2_5DIG_2011": { @@ -781,10 +742,7 @@ "serverMinZoom": 0, "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [ - 96.81694140799998, -43.74050960300003, 159.10921900799997, - -9.142175976999999 - ], + "bbox": [96.81, -43.75, 159.11, -9.14], "nameProp": "SA2_NAME11" }, "SA2_NAME_2011": { @@ -801,10 +759,7 @@ "serverMinZoom": 0, "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [ - 96.81694140799998, -43.74050960300003, 159.10921900799997, - -9.142175976999999 - ], + "bbox": [96.81, -43.75, 159.11, -9.14], "nameProp": "SA2_NAME11" }, "SA2_2016": { @@ -815,10 +770,7 @@ "serverMinZoom": 0, "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [ - 96.81694139400007, -43.74050960299996, 167.99803499600006, - -9.142175976999962 - ], + "bbox": [96.81, -43.75, 168.0, -9.14], "regionProp": "SA2_MAIN16", "aliases": ["sa2_code_2016", "sa2_maincode_2016"], "nameProp": "SA2_NAME16", @@ -833,10 +785,7 @@ "serverMinZoom": 0, "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [ - 96.81694139400007, -43.74050960299996, 167.99803499600006, - -9.142175976999962 - ], + "bbox": [96.81, -43.75, 168.0, -9.14], "regionProp": "SA2_5DIG16", "aliases": ["sa2_5digitcode", "sa2_5digitcode_2016"], "nameProp": "SA2_NAME16", @@ -851,10 +800,7 @@ "serverMinZoom": 0, "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [ - 96.81694139400007, -43.74050960299996, 167.99803499600006, - -9.142175976999962 - ], + "bbox": [96.81, -43.75, 168.0, -9.14], "regionProp": "SA2_NAME16", "aliases": ["sa2_name_2016"], "nameProp": "SA2_NAME16", @@ -873,7 +819,7 @@ "nameProp": "SA2_NAME21", "aliases": ["sa2_code_2021", "sa2_maincode_2021", "sa2", "sa2_code"], "description": "Statistical Area Level 2 2021 by code (ABS)", - "bbox": [96.81, -43.75, 168, -9.14] + "bbox": [96.81, -43.75, 168.0, -9.14] }, "SA2_NAME_2021": { "layerName": "SA2_2021", @@ -887,7 +833,7 @@ "nameProp": "SA2_NAME21", "aliases": ["sa2_name_2021", "sa2_name"], "description": "Statistical Area Level 2 2021 by name (ABS)", - "bbox": [96.81, -43.75, 168, -9.14] + "bbox": [96.81, -43.75, 168.0, -9.14] }, "SSC": { "layerName": "FID_SSC_2011_AUST", @@ -904,10 +850,7 @@ "serverMinZoom": 0, "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [ - 96.81694140799998, -43.740509602999985, 159.10921900799997, - -9.142175976999999 - ], + "bbox": [96.81, -43.75, 159.11, -9.14], "nameProp": "SSC_NAME" }, "SSC_NAME": { @@ -924,10 +867,7 @@ "serverMinZoom": 0, "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [ - 96.81694140799998, -43.740509602999985, 159.10921900799997, - -9.142175976999999 - ], + "bbox": [96.81, -43.75, 159.11, -9.14], "nameProp": "SSC_NAME" }, "SSC_2016": { @@ -938,10 +878,7 @@ "serverMinZoom": 0, "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [ - 96.81694139400007, -43.74050960299996, 167.99803499600006, - -9.142175976999962 - ], + "bbox": [96.81, -43.75, 168.0, -9.14], "regionProp": "SSC_CODE16", "aliases": ["ssc_code_2016", "ssc_code", "ssc"], "nameProp": "SSC_NAME16", @@ -956,10 +893,7 @@ "serverMinZoom": 0, "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [ - 96.81694139400007, -43.74050960299996, 167.99803499600006, - -9.142175976999962 - ], + "bbox": [96.81, -43.75, 168.0, -9.14], "regionProp": "SSC_NAME16", "aliases": ["ssc_name_2016", "ssc_name", "suburb"], "nameProp": "SSC_NAME16", @@ -978,7 +912,7 @@ "nameProp": "LGA_NAME21", "aliases": ["lga_code_2021", "lga_code_2020"], "description": "Local Government Areas 2021 by code (ABS)", - "bbox": [96.81, -43.75, 168, -9.14] + "bbox": [96.81, -43.75, 168.0, -9.14] }, "LGA_2019": { "layerName": "LGA_2019", @@ -992,7 +926,7 @@ "nameProp": "LGA_NAME19", "aliases": ["lga_code_2019"], "description": "Local Government Areas 2019 by code (ABS)", - "bbox": [96.81, -43.75, 168, -9.14] + "bbox": [96.81, -43.75, 168.0, -9.14] }, "LGA_2018": { "layerName": "LGA_2018_AUST", @@ -1000,10 +934,7 @@ "serverType": "MVT", "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [ - 96.81694139400008, -43.74050960205758, 167.99803499600011, - -9.142175976703571 - ], + "bbox": [96.81, -43.75, 168.0, -9.14], "uniqueIdProp": "FID", "regionProp": "LGA_CODE18", "nameProp": "LGA_NAME18", @@ -1017,10 +948,7 @@ "serverType": "MVT", "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [ - 96.81694139400008, -43.74050960205758, 167.99803499600011, - -9.142175976703571 - ], + "bbox": [96.81, -43.75, 168.0, -9.14], "uniqueIdProp": "FID", "regionProp": "LGA_CODE17", "nameProp": "LGA_NAME17", @@ -1036,10 +964,7 @@ "serverMinZoom": 0, "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [ - 96.81694139400007, -43.74050960299996, 167.99803499600006, - -9.142175976999962 - ], + "bbox": [96.81, -43.75, 168.0, -9.14], "regionProp": "LGA_CODE16", "aliases": ["lga_code_2016"], "nameProp": "LGA_NAME16", @@ -1061,10 +986,7 @@ "serverMinZoom": 0, "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [ - 96.81694140799998, -43.740509602999985, 159.10921900799997, - -9.142175976999999 - ], + "bbox": [96.81, -43.75, 159.11, -9.14], "nameProp": "LGA_NAME15" }, "LGA_2013": { @@ -1082,10 +1004,7 @@ "serverMinZoom": 0, "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [ - 96.81694140799998, -43.740509602999985, 159.10921900799997, - -9.142175976999999 - ], + "bbox": [96.81, -43.75, 159.11, -9.14], "nameProp": "LGA_NAME13" }, "LGA_2011": { @@ -1103,10 +1022,7 @@ "serverMinZoom": 0, "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [ - 112.92111395999996, -43.74050957999999, 153.63872711999997, - -9.142175969999997 - ], + "bbox": [112.92, -43.75, 153.64, -9.14], "nameProp": "LGA_NAME11" }, "LGA_NAME_2011": { @@ -1151,10 +1067,7 @@ "serverMinZoom": 0, "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [ - 112.92111395999996, -43.74050957999999, 153.63872711999997, - -9.142175969999997 - ], + "bbox": [112.92, -43.75, 153.64, -9.14], "nameProp": "LGA_NAME11" }, "POA": { @@ -1165,10 +1078,7 @@ "serverMinZoom": 0, "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [ - 96.81694139400007, -43.74050960299996, 167.99803499600006, - -9.142175976999962 - ], + "bbox": [96.81, -43.75, 168.0, -9.14], "regionProp": "POA_CODE16", "aliases": ["poa_code_2016", "postcode_2016"], "digits": 4, @@ -1198,10 +1108,7 @@ "serverMinZoom": 0, "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [ - 96.81694140799998, -43.59821500299999, 159.10921900799997, - -9.142175976999999 - ], + "bbox": [96.81, -43.6, 159.11, -9.14], "nameProp": "POA_NAME" }, "CED_CODE18": { @@ -1216,7 +1123,7 @@ "nameProp": "CED_NAME18", "aliases": ["ced_2018", "ced_code_2018"], "description": "Commonwealth electoral divisions 2018 by code (ABS)", - "bbox": [96.82, -43.74, 159.11, -9.14] + "bbox": [96.82, -43.74, 159.12, -9.14] }, "CED_NAME18": { "layerName": "CED_2018", @@ -1231,7 +1138,7 @@ "nameProp": "CED_NAME18", "aliases": ["ced_name_2018"], "description": "Commonwealth electoral divisions 2018 by name (ABS)", - "bbox": [96.82, -43.74, 159.11, -9.14] + "bbox": [96.82, -43.74, 159.12, -9.14] }, "CED_CODE_2016": { "layerName": "FID_CED_2016_AUST", @@ -1248,10 +1155,7 @@ "serverMinZoom": 0, "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [ - 96.81694140799998, -43.74050960300003, 159.10921900799997, - -9.142175976999999 - ], + "bbox": [96.81, -43.75, 159.11, -9.14], "nameProp": "CED_NAME16" }, "CED_NAME_2016": { @@ -1268,10 +1172,7 @@ "serverMinZoom": 0, "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [ - 96.81694140799998, -43.74050960300003, 159.10921900799997, - -9.142175976999999 - ], + "bbox": [96.81, -43.75, 159.11, -9.14], "nameProp": "CED_NAME16" }, "CED_CODE_2013": { @@ -1289,10 +1190,7 @@ "serverMinZoom": 0, "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [ - 96.81694140799998, -43.740509602999985, 159.10921900799997, - -9.142175976999999 - ], + "bbox": [96.81, -43.75, 159.11, -9.14], "nameProp": "CED_NAME13" }, "CED_NAME_2013": { @@ -1309,10 +1207,7 @@ "serverMinZoom": 0, "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [ - 96.81694140799998, -43.740509602999985, 159.10921900799997, - -9.142175976999999 - ], + "bbox": [96.81, -43.75, 159.11, -9.14], "nameProp": "CED_NAME13" }, "CED_CODE_2011": { @@ -1330,10 +1225,7 @@ "serverMinZoom": 0, "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [ - 96.81694140799998, -43.740509602999985, 159.10921900799997, - -9.142175976999999 - ], + "bbox": [96.81, -43.75, 159.11, -9.14], "nameProp": "CED_NAME", "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-FID_CED_2011_AUST_CED_CODE.json" }, @@ -1351,10 +1243,7 @@ "serverMinZoom": 0, "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [ - 96.81694140799998, -43.740509602999985, 159.10921900799997, - -9.142175976999999 - ], + "bbox": [96.81, -43.75, 159.11, -9.14], "nameProp": "CED_NAME" }, "COM_ELB_ID_2016": { @@ -1372,10 +1261,7 @@ "serverMinZoom": 0, "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [ - 96.81676599999997, -43.740509999999986, 159.1092189999999, - -9.142175999999996 - ], + "bbox": [96.81, -43.75, 159.11, -9.14], "nameProp": "SORTNAME" }, "ELB_2021": { @@ -1390,7 +1276,7 @@ "nameProp": "Elect_div", "aliases": ["com_elb_name_2021", "com_elb_name", "divisionnm"], "description": "Commonwealth electoral districts 2021 by name (AEC)", - "bbox": [96.81, -43.73, 168, -9.1] + "bbox": [96.81, -43.73, 168.0, -9.1] }, "ELB_2019": { "layerName": "ELB_2019", @@ -1403,10 +1289,7 @@ "nameProp": "Sortname", "aliases": ["com_elb_name_2019"], "description": "Commonwealth electoral districts 2019 by name (AEC)", - "bbox": [ - 96.81694140799998, -43.74050960300003, 159.10921900799997, - -9.142175976999999 - ] + "bbox": [96.81, -43.75, 159.11, -9.14] }, "COM_ELB_NAME_2016": { "layerName": "FID_COM20160509_ELB", @@ -1423,10 +1306,7 @@ "serverMinZoom": 0, "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [ - 96.81676599999997, -43.740509999999986, 159.1092189999999, - -9.142175999999996 - ], + "bbox": [96.81, -43.75, 159.11, -9.14], "nameProp": "SORTNAME" }, "COM_ELB_NAME_2011": { @@ -1444,10 +1324,7 @@ "serverMinZoom": 0, "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [ - 96.81676599999999, -43.74050999999999, 159.10921899999994, - -9.142175999999997 - ], + "bbox": [96.81, -43.75, 159.11, -9.14], "nameProp": "SORTNAME" }, "COM_ELB_ID_2013": { @@ -1456,7 +1333,7 @@ "serverType": "MVT", "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [96.816766, -43.74051, 159.109219, -9.142176], + "bbox": [96.81, -43.75, 159.11, -9.14], "uniqueIdProp": "FID", "regionProp": "ced_code_2013", "nameProp": "ced_name_2013", @@ -1470,7 +1347,7 @@ "serverType": "MVT", "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [96.816766, -43.74051, 159.109219, -9.142176], + "bbox": [96.81, -43.75, 159.11, -9.14], "uniqueIdProp": "FID", "regionProp": "ced_name_2013", "nameProp": "ced_name_2013", @@ -1484,7 +1361,7 @@ "serverType": "MVT", "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [96.816766, -43.74051, 159.109219, -9.142176], + "bbox": [96.81, -43.75, 159.11, -9.14], "uniqueIdProp": "FID", "regionProp": "ced_code_2010", "nameProp": "ced_name_2010", @@ -1498,7 +1375,7 @@ "serverType": "MVT", "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [96.816766, -43.74051, 159.109219, -9.142176], + "bbox": [96.81, -43.75, 159.11, -9.14], "uniqueIdProp": "FID", "regionProp": "ced_name_2010", "nameProp": "ced_name_2010", @@ -1512,7 +1389,7 @@ "serverType": "MVT", "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [96.817997, -43.74051, 159.105442, -9.142186], + "bbox": [96.81, -43.75, 159.11, -9.14], "uniqueIdProp": "FID", "regionProp": "ced_code_2007", "nameProp": "ced_name_2007", @@ -1526,7 +1403,7 @@ "serverType": "MVT", "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [96.817997, -43.74051, 159.105442, -9.142186], + "bbox": [96.81, -43.75, 159.11, -9.14], "uniqueIdProp": "FID", "regionProp": "ced_name_2007", "nameProp": "ced_name_2007", @@ -1546,7 +1423,7 @@ "nameProp": "SED_NAME18", "aliases": ["sed_2018", "sed_code_2018"], "description": "State electoral divisions 2018 by code (ABS)", - "bbox": [96.82, -43.74, 159.11, -9.14] + "bbox": [96.82, -43.74, 159.12, -9.14] }, "SED_NAME18": { "layerName": "SED_2018", @@ -1560,7 +1437,7 @@ "nameProp": "SED_NAME18", "aliases": ["sed_name_2018"], "description": "State electoral divisions 2018 by name (ABS)", - "bbox": [96.82, -43.74, 159.11, -9.14] + "bbox": [96.82, -43.74, 159.12, -9.14] }, "SED_CODE16": { "layerName": "SED_2016", @@ -1574,7 +1451,7 @@ "nameProp": "SED_NAME16", "aliases": ["sed_2016", "sed_code_2016", "sed_code16"], "description": "State electoral divisions 2016 by code (ABS)", - "bbox": [96.82, -43.74, 159.11, -9.14] + "bbox": [96.82, -43.74, 159.12, -9.14] }, "SED_NAME16": { "layerName": "SED_2016", @@ -1588,7 +1465,7 @@ "nameProp": "SED_NAME16", "aliases": ["sed_name_2016", "sed_name16"], "description": "State electoral divisions 2016 by code (ABS)", - "bbox": [96.82, -43.74, 159.11, -9.14] + "bbox": [96.82, -43.74, 159.12, -9.14] }, "SED_CODE11": { "layerName": "FID_SED_2011_AUST", @@ -1605,10 +1482,7 @@ "serverMinZoom": 0, "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [ - 112.92111395199997, -43.740509602999985, 159.10921900799997, - -9.142175976999999 - ], + "bbox": [112.92, -43.75, 159.11, -9.14], "nameProp": "SED_NAME" }, "SED_NAME11": { @@ -1625,10 +1499,7 @@ "serverMinZoom": 0, "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [ - 112.92111395199997, -43.740509602999985, 159.10921900799997, - -9.142175976999999 - ], + "bbox": [112.92, -43.75, 159.11, -9.14], "nameProp": "SED_NAME" }, "GCCSA_2011": { @@ -1646,10 +1517,7 @@ "serverMinZoom": 0, "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [ - 96.81694140799998, -43.74050960300003, 159.10921900799997, - -9.142175976999999 - ], + "bbox": [96.81, -43.75, 159.11, -9.14], "nameProp": "GCC_NAME11" }, "GCCSA_NAME_2011": { @@ -1666,10 +1534,7 @@ "serverMinZoom": 0, "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [ - 96.81694140799998, -43.74050960300003, 159.10921900799997, - -9.142175976999999 - ], + "bbox": [96.81, -43.75, 159.11, -9.14], "nameProp": "GCC_NAME11" }, "GCCSA_2016": { @@ -1680,10 +1545,7 @@ "serverMinZoom": 0, "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [ - 96.81694139400007, -43.74050960299996, 167.99803499600006, - -9.142175976999962 - ], + "bbox": [96.81, -43.75, 168.0, -9.14], "regionProp": "GCC_CODE16", "aliases": ["gccsa_code_2016"], "nameProp": "GCC_NAME16", @@ -1698,10 +1560,7 @@ "serverMinZoom": 0, "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [ - 96.81694139400007, -43.74050960299996, 167.99803499600006, - -9.142175976999962 - ], + "bbox": [96.81, -43.75, 168.0, -9.14], "regionProp": "GCC_NAME16", "aliases": ["gccsa_name_2016"], "nameProp": "GCC_NAME16", @@ -1720,7 +1579,7 @@ "nameProp": "GCC_NAME21", "aliases": ["gccsa_code_2021", "gccsa_code", "gccsa"], "description": "Greater capital city statistical areas 2021 by code (ABS)", - "bbox": [96.81, -43.75, 168, -9.14] + "bbox": [96.81, -43.75, 168.0, -9.14] }, "GCCSA_NAME_2021": { "layerName": "GCCSA_2021", @@ -1734,7 +1593,7 @@ "nameProp": "GCC_NAME21", "aliases": ["gccsa_name_2021", "gccsa_name"], "description": "Greater capital city statistical areas 2021 by name (ABS)", - "bbox": [96.81, -43.75, 168, -9.14] + "bbox": [96.81, -43.75, 168.0, -9.14] }, "SUA": { "layerName": "FID_SUA_2011_AUST", @@ -1751,10 +1610,7 @@ "serverMinZoom": 0, "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [ - 96.81694140799998, -43.740509602999985, 159.10921900799997, - -9.142175976999999 - ], + "bbox": [96.81, -43.75, 159.11, -9.14], "nameProp": "SUA_NAME11" }, "SUA_NAME": { @@ -1773,10 +1629,7 @@ "serverMinZoom": 0, "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [ - 96.81694140799998, -43.740509602999985, 159.10921900799997, - -9.142175976999999 - ], + "bbox": [96.81, -43.75, 159.11, -9.14], "nameProp": "SUA_NAME11" }, "STE_2011": { @@ -1794,10 +1647,7 @@ "serverMinZoom": 0, "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [ - 96.81694140799998, -43.74050960300003, 159.10921900799997, - -9.142175976999999 - ], + "bbox": [96.81, -43.75, 159.11, -9.14], "nameProp": "STE_NAME11" }, "STE_2016": { @@ -1808,10 +1658,7 @@ "serverMinZoom": 0, "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [ - 96.81694139400007, -43.74050960299996, 167.99803499600006, - -9.142175976999962 - ], + "bbox": [96.81, -43.75, 168.0, -9.14], "regionProp": "STE_CODE16", "aliases": [ "ste_code_2016", @@ -1839,10 +1686,7 @@ "serverMinZoom": 0, "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [ - 96.81694140799998, -43.740509602999985, 159.10921900799997, - -9.142175976999999 - ], + "bbox": [96.81, -43.75, 159.11, -9.14], "nameProp": "SOS_NAME11" }, "SOSR": { @@ -1860,10 +1704,7 @@ "serverMinZoom": 0, "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [ - 96.81694140799998, -43.740509602999985, 159.10921900799997, - -9.142175976999999 - ], + "bbox": [96.81, -43.75, 159.11, -9.14], "nameProp": "SSR_NAME11" }, "UCL": { @@ -1881,10 +1722,7 @@ "serverMinZoom": 0, "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [ - 96.81694140799998, -43.740509602999985, 159.10921900799997, - -9.142175976999999 - ], + "bbox": [96.81, -43.75, 159.11, -9.14], "nameProp": "UCL_NAME11" }, "IREG": { @@ -1902,10 +1740,7 @@ "serverMinZoom": 0, "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [ - 96.81694140799998, -43.740509602999985, 159.10921900799997, - -9.142175976999999 - ], + "bbox": [96.81, -43.75, 159.11, -9.14], "nameProp": "IR_NAME11" }, "ILOC": { @@ -1923,10 +1758,7 @@ "serverMinZoom": 0, "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [ - 96.81694140799998, -43.740509602999985, 159.10921900799997, - -9.142175976999999 - ], + "bbox": [96.81, -43.75, 159.11, -9.14], "nameProp": "IL_NAME11" }, "IARE": { @@ -1944,10 +1776,7 @@ "serverMinZoom": 0, "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [ - 96.81694140799998, -43.740509602999985, 159.10921900799997, - -9.142175976999999 - ], + "bbox": [96.81, -43.75, 159.11, -9.14], "nameProp": "IA_NAME11" }, "RA": { @@ -1965,10 +1794,7 @@ "serverMinZoom": 0, "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [ - 96.81694140799998, -43.740509602999985, 159.10921900799997, - -9.142175976999999 - ], + "bbox": [96.81, -43.75, 159.11, -9.14], "nameProp": "RA_NAME11" }, "TR": { @@ -1986,10 +1812,7 @@ "serverMinZoom": 0, "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [ - 112.92111395199997, -43.740509602999985, 159.10921900799997, - -9.142175976999999 - ], + "bbox": [112.92, -43.75, 159.11, -9.14], "nameProp": "TR_NAME15" }, "TR_2013": { @@ -2007,10 +1830,7 @@ "serverMinZoom": 0, "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [ - 112.92111395199997, -43.740509602999985, 159.10921900799997, - -9.142175976999999 - ], + "bbox": [112.92, -43.75, 159.11, -9.14], "nameProp": "TR_NAME13" }, "NRMR": { @@ -2028,10 +1848,7 @@ "serverMinZoom": 0, "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [ - 96.81694140799995, -43.74050960299998, 159.10921900799994, - -9.142175976999997 - ], + "bbox": [96.81, -43.75, 159.11, -9.14], "nameProp": "NRMR_NAME" }, "NRMR_NAME": { @@ -2048,10 +1865,7 @@ "serverMinZoom": 0, "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [ - 96.81694140799995, -43.74050960299998, 159.10921900799994, - -9.142175976999997 - ], + "bbox": [96.81, -43.75, 159.11, -9.14], "nameProp": "NRMR_NAME" }, "ADD": { @@ -2069,10 +1883,7 @@ "serverMinZoom": 0, "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [ - 112.92111395199994, -43.74050960299998, 159.10921900799994, - -9.142175976999997 - ], + "bbox": [112.92, -43.75, 159.11, -9.14], "nameProp": "ADD_NAME" }, "ADD_NAME": { @@ -2089,10 +1900,7 @@ "serverMinZoom": 0, "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [ - 112.92111395199994, -43.74050960299998, 159.10921900799994, - -9.142175976999997 - ], + "bbox": [112.92, -43.75, 159.11, -9.14], "nameProp": "ADD_NAME" }, "ADD_2016": { @@ -2103,10 +1911,7 @@ "serverMinZoom": 0, "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [ - 96.81694139400007, -43.74050960299996, 167.99803499600006, - -9.142175976999962 - ], + "bbox": [96.81, -43.75, 168.0, -9.14], "regionProp": "ADD_CODE16", "aliases": ["add_code_2016"], "nameProp": "ADD_NAME16", @@ -2121,10 +1926,7 @@ "serverMinZoom": 0, "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [ - 96.81694139400007, -43.74050960299996, 167.99803499600006, - -9.142175976999962 - ], + "bbox": [96.81, -43.75, 168.0, -9.14], "regionProp": "ADD_NAME16", "aliases": ["add_name_2016"], "nameProp": "ADD_NAME16", @@ -2146,10 +1948,7 @@ "serverMinZoom": 0, "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [ - 96.81694140800003, -43.74050960299996, 159.10921900800005, - -9.142175976999962 - ], + "bbox": [96.81, -43.75, 159.11, -9.14], "nameProp": "PHN_Name" }, "STE_NAME_2011": { @@ -2185,10 +1984,7 @@ "serverMinZoom": 0, "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [ - 96.81694140799998, -43.74050960300003, 159.10921900799997, - -9.142175976999999 - ], + "bbox": [96.81, -43.75, 159.11, -9.14], "nameProp": "STE_NAME11" }, "STE_NAME_2016": { @@ -2199,10 +1995,7 @@ "serverMinZoom": 0, "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [ - 96.81694139400007, -43.74050960299996, 167.99803499600006, - -9.142175976999962 - ], + "bbox": [96.81, -43.75, 168.0, -9.14], "regionProp": "STE_NAME16", "aliases": ["state", "ste_name", "ste_name_2016", "ste_name_2021"], "nameProp": "STE_NAME16", @@ -2249,10 +2042,7 @@ "serverMinZoom": 0, "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [ - 96.81676569599999, -43.740509602999985, 159.10921900799997, - -9.142175976999999 - ], + "bbox": [96.81, -43.75, 159.11, -9.14], "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-fid_asgc06_sla_SLA_CODE06.json" }, "SLA_5DIGITCODE": { @@ -2270,10 +2060,7 @@ "serverMinZoom": 0, "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [ - 96.81676569599999, -43.740509602999985, 159.10921900799997, - -9.142175976999999 - ], + "bbox": [96.81, -43.75, 159.11, -9.14], "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-fid_asgc06_sla_SLA_5DIGIT.json" }, "SLA_NAME": { @@ -2290,10 +2077,7 @@ "serverMinZoom": 0, "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [ - 96.81676569599999, -43.740509602999985, 159.10921900799997, - -9.142175976999999 - ], + "bbox": [96.81, -43.75, 159.11, -9.14], "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-fid_asgc06_sla_SLA_NAME06.json" }, "CD": { @@ -2310,10 +2094,7 @@ "serverMinZoom": 0, "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [ - 96.76945846399997, -43.740509602999985, 159.10921900799997, - -9.142175976999999 - ], + "bbox": [96.76, -43.75, 159.11, -9.14], "nameProp": "CD_CODE06", "regionIdsFile": "https://tiles.terria.io/region-mapping/regionids/region_map-fid_asgc06_cd_CD_CODE06.json" }, @@ -2332,10 +2113,7 @@ "serverMinZoom": 0, "serverMaxNativeZoom": 10, "serverMaxZoom": 28, - "bbox": [ - -179.99999999999994, -85.05109999999998, 179.99999999999994, - 83.62359600000005 - ], + "bbox": [-180.0, -85.06, 180.0, 83.63], "nameProp": "NAME" }, "CNT3": { @@ -2353,10 +2131,7 @@ "serverMinZoom": 0, "serverMaxNativeZoom": 10, "serverMaxZoom": 28, - "bbox": [ - -179.99999999999994, -85.05109999999998, 179.99999999999994, - 83.62359600000005 - ], + "bbox": [-180.0, -85.06, 180.0, 83.63], "nameProp": "NAME" }, "COUNTRY": { @@ -2373,10 +2148,7 @@ "serverMinZoom": 0, "serverMaxNativeZoom": 10, "serverMaxZoom": 28, - "bbox": [ - -179.99999999999994, -85.05109999999998, 179.99999999999994, - 83.62359600000005 - ], + "bbox": [-180.0, -85.06, 180.0, 83.63], "nameProp": "NAME" }, "AUS": { @@ -2403,10 +2175,7 @@ "serverMinZoom": 0, "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [ - 96.81694140799998, -43.74050960300003, 159.10921900799997, - -9.142175976999999 - ], + "bbox": [96.81, -43.75, 159.11, -9.14], "nameProp": "AUS_NAME" }, "ESA_09": { @@ -2417,10 +2186,7 @@ "serverMinZoom": 0, "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [ - 96.81676599999999, -43.74050999999999, 159.10921899999994, - -9.142175999999997 - ], + "bbox": [96.81, -43.75, 159.11, -9.14], "regionProp": "ESA_CODE", "aliases": ["esa", "esa_code", "esa_code_2009"], "nameProp": "ESA_NAME", @@ -2435,10 +2201,7 @@ "serverMinZoom": 0, "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [ - 96.81676599999999, -43.74050999999999, 159.10921899999994, - -9.142175999999997 - ], + "bbox": [96.81, -43.75, 159.11, -9.14], "regionProp": "ESA_NAME", "aliases": ["esa_name", "esa_name_2009"], "nameProp": "ESA_NAME", @@ -2453,10 +2216,7 @@ "serverMinZoom": 0, "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [ - 72.57737629065888, -54.776992953536805, 167.9981399159851, - -9.141289999999968 - ], + "bbox": [72.57, -54.78, 168.0, -9.14], "regionProp": "REG_CODE_7", "aliases": ["ibra7_reg", "ibra7_reg_code"], "nameProp": "REG_NAME_7", @@ -2471,10 +2231,7 @@ "serverMinZoom": 0, "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [ - 72.57737629065888, -54.776992953536805, 167.9981399159851, - -9.141289999999968 - ], + "bbox": [72.57, -54.78, 168.0, -9.14], "regionProp": "REG_NAME_7", "aliases": ["ibra7_reg_name"], "nameProp": "REG_NAME_7", @@ -2489,10 +2246,7 @@ "serverMinZoom": 0, "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [ - 72.57737629065888, -54.77699295353692, 167.9981399159851, - -9.141289999999968 - ], + "bbox": [72.57, -54.78, 168.0, -9.14], "regionProp": "SUB_CODE_7", "aliases": ["ibra7_sub", "ibra7_sub_code"], "nameProp": "SUB_NAME_7", @@ -2507,10 +2261,7 @@ "serverMinZoom": 0, "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [ - 72.57737629065888, -54.77699295353692, 167.9981399159851, - -9.141289999999968 - ], + "bbox": [72.57, -54.78, 168.0, -9.14], "regionProp": "SUB_NAME_7", "aliases": ["ibra7_sub_name"], "nameProp": "SUB_NAME_7", @@ -2523,10 +2274,7 @@ "serverType": "MVT", "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [ - -176.89314232298426, -47.28999251282331, 178.57724348546415, - -34.392630183116 - ], + "bbox": [-176.9, -47.29, 178.58, -34.39], "uniqueIdProp": "FID", "regionProp": "AU2017", "nameProp": "AU2017_NAM", @@ -2540,10 +2288,7 @@ "serverType": "MVT", "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [ - -176.89314232298426, -47.28999251282331, 178.57724348546415, - -34.392630183116 - ], + "bbox": [-176.9, -47.29, 178.58, -34.39], "uniqueIdProp": "FID", "regionProp": "AU2017_NAM", "nameProp": "AU2017_NAM", @@ -2557,10 +2302,7 @@ "serverType": "MVT", "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [ - -176.89314232298426, -47.28999251282331, 178.57724348546415, - -34.392630183116 - ], + "bbox": [-176.9, -47.29, 178.58, -34.39], "uniqueIdProp": "FID", "regionProp": "MB2017", "nameProp": "MB2017", @@ -2574,7 +2316,7 @@ "serverType": "MVT", "serverMaxNativeZoom": 12, "serverMaxZoom": 28, - "bbox": [96.816941, -43.74051, 167.99803499600011, -9.142176], + "bbox": [96.81, -43.75, 168.0, -9.14], "uniqueIdProp": "FID", "regionProp": "FED_ABB", "nameProp": "FED_DIV", @@ -2594,10 +2336,7 @@ "nameProp": "RRA_Name", "aliases": ["RRA_NAME", "RRA"], "description": "Bushfire Regional Recovery Areas", - "bbox": [ - 96.81694140799998, -43.74050960300003, 159.10921900799997, - -9.142175976999999 - ] + "bbox": [96.81, -43.75, 159.11, -9.14] }, "ABARES_CODE": { "layerName": "ABARES_Ag_Regions", @@ -2611,10 +2350,7 @@ "nameProp": "AbaresName", "aliases": ["abares_code", "abares_region_code"], "description": "ABARES regions, farm survey statistical aggregation areas", - "bbox": [ - 96.81694140799998, -43.74050960300003, 159.10921900799997, - -9.142175976999999 - ] + "bbox": [96.81, -43.75, 159.11, -9.14] }, "ABARES_NAME": { "layerName": "ABARES_Ag_Regions", @@ -2628,10 +2364,7 @@ "nameProp": "AbaresName", "description": "ABARES regions, farm survey statistical aggregation areas", "aliases": ["abares_name", "abares_region_name"], - "bbox": [ - 96.81694140799998, -43.74050960300003, 159.10921900799997, - -9.142175976999999 - ] + "bbox": [96.81, -43.75, 159.11, -9.14] }, "City_of_Melbourne_CLUE": { "layerName": "City_of_Melbourne_CLUE", @@ -2645,7 +2378,7 @@ "regionProp": "block_id", "nameProp": "clue_area", "description": "City of Melbourne Census of Land Use and Employment", - "bbox": [144.88, -37.86, 145, -37.77] + "bbox": [144.88, -37.86, 145.0, -37.77] } } } From 1aaeffb3d18580ecfb801ad1cb4a97830e3a7964 Mon Sep 17 00:00:00 2001 From: Stephen Davies Date: Wed, 25 Oct 2023 19:48:34 +1100 Subject: [PATCH 354/654] Add changelog entry --- CHANGES.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGES.md b/CHANGES.md index 1ee97136874..eab10dc1711 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -11,6 +11,10 @@ - Fix bug in mismatched GeoJSON Feature `_id_` and TableMixin `rowId` - this was causing incorrect styling when using `filterByProperties` or features had `null` geometry - Fix splitter for `GeoJsonMixin` (lines and polygon features only) - Fix share links with picked features from `ProtomapsImageryProvider` +- Added many remaining ASGS 2021 region types to region mapping (STE_2021,ILOC_2021,IARE_2021,IREG_2021,RA_2021,SAL_2021,ADD_2021,DZN_2021,LGA_2022,LGA_2023,SED_2021,SED_2022, + CED_2021,POA_2021,TR_2021,SUA_2021,UCL_2021,SOS_2021,SOSR_2021). + - See [ASGS 2021](https://www.abs.gov.au/statistics/standards/australian-statistical-geography-standard-asgs-edition-3/jul2021-jun2026/access-and-downloads/digital-boundary-files) +- Added [Melbourne CLUE blocks](https://data.melbourne.vic.gov.au/pages/clue/) to region mapping. - [The next improvement] #### 8.3.6 - 2023-10-03 From beabdbea819578d41892ae340ee65bc1966250b1 Mon Sep 17 00:00:00 2001 From: Stephen Davies Date: Thu, 26 Oct 2023 00:44:57 +1100 Subject: [PATCH 355/654] Update number of region mapping types --- test/ModelMixins/TableMixinSpec.ts | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/test/ModelMixins/TableMixinSpec.ts b/test/ModelMixins/TableMixinSpec.ts index f467749db1e..f74c8d54f18 100644 --- a/test/ModelMixins/TableMixinSpec.ts +++ b/test/ModelMixins/TableMixinSpec.ts @@ -63,6 +63,8 @@ const regionIdsLgaNameStates = JSON.stringify( require("../../wwwroot/data/regionids/region_map-FID_LGA_2011_AUST_STE_NAME11.json") ); +const NUMBER_OF_REGION_MAPPING_TYPES = 144; + describe("TableMixin", function () { let item: CsvCatalogItem; let terria: Terria; @@ -591,7 +593,9 @@ describe("TableMixin", function () { (await item.loadMapItems()).throwIfError(); - expect(item.regionProviderLists?.[0]?.regionProviders.length).toBe(143); + expect(item.regionProviderLists?.[0]?.regionProviders.length).toBe( + NUMBER_OF_REGION_MAPPING_TYPES + ); }); it("loads regionProviderLists on loadMapItems - with multiple regionMappingDefinitionsUrl", async function () { @@ -620,7 +624,9 @@ describe("TableMixin", function () { expect(item.regionProviderLists?.length).toBe(2); expect(item.regionProviderLists?.[0]?.regionProviders.length).toBe(2); - expect(item.regionProviderLists?.[1]?.regionProviders.length).toBe(143); + expect(item.regionProviderLists?.[1]?.regionProviders.length).toBe( + NUMBER_OF_REGION_MAPPING_TYPES + ); // Item region provider should match from "additionalRegion.json" (as it comes before "build/TerriaJS/data/regionMapping.json") expect(item.activeTableStyle.regionColumn?.regionType?.description).toBe( @@ -654,7 +660,9 @@ describe("TableMixin", function () { expect(item.regionProviderLists?.length).toBe(1); - expect(item.regionProviderLists?.[0]?.regionProviders.length).toBe(143); + expect(item.regionProviderLists?.[0]?.regionProviders.length).toBe( + NUMBER_OF_REGION_MAPPING_TYPES + ); // Item region provider should match from "build/TerriaJS/data/regionMapping.json" expect(item.activeTableStyle.regionColumn?.regionType?.description).toBe( From 2f0cec5a4c864cabb2bcdbc51cd34cea2ca2cbfb Mon Sep 17 00:00:00 2001 From: Nick Forbes-Smith Date: Thu, 26 Oct 2023 11:16:01 +1000 Subject: [PATCH 356/654] Add `hideDefaultDescription` to `CatalogMemberMixin` (#6951) --- CHANGES.md | 1 + lib/ReactViews/Preview/Description.jsx | 6 +- .../TraitsClasses/CatalogMemberTraits.ts | 8 +++ test/ReactViews/Preview/DescriptionSpec.tsx | 55 ++++++++++++++++++- 4 files changed, 67 insertions(+), 3 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 1ee97136874..1745a1601b3 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -11,6 +11,7 @@ - Fix bug in mismatched GeoJSON Feature `_id_` and TableMixin `rowId` - this was causing incorrect styling when using `filterByProperties` or features had `null` geometry - Fix splitter for `GeoJsonMixin` (lines and polygon features only) - Fix share links with picked features from `ProtomapsImageryProvider` +- Add `hideDefaultDescription` to `CatalogMemberTraits` - if true, then no generic default description will be shown when `description` is empty. - [The next improvement] #### 8.3.6 - 2023-10-03 diff --git a/lib/ReactViews/Preview/Description.jsx b/lib/ReactViews/Preview/Description.jsx index cfb32fdd38c..904abfbd82f 100644 --- a/lib/ReactViews/Preview/Description.jsx +++ b/lib/ReactViews/Preview/Description.jsx @@ -64,7 +64,11 @@ class Description extends React.Component {

    {t("description.dataNotLocal")}

    diff --git a/lib/Traits/TraitsClasses/CatalogMemberTraits.ts b/lib/Traits/TraitsClasses/CatalogMemberTraits.ts index c073799b775..9ddf821411d 100644 --- a/lib/Traits/TraitsClasses/CatalogMemberTraits.ts +++ b/lib/Traits/TraitsClasses/CatalogMemberTraits.ts @@ -116,6 +116,14 @@ class CatalogMemberTraits extends ModelTraits { }) description?: string; + @primitiveTrait({ + type: "boolean", + name: "Hide default description", + description: + "If true, then no generic default description will be displayed if `description` is undefined." + }) + hideDefaultDescription: boolean = false; + @primitiveTrait({ type: "string", name: "Name in catalog", diff --git a/test/ReactViews/Preview/DescriptionSpec.tsx b/test/ReactViews/Preview/DescriptionSpec.tsx index fa1ec7c33d6..c9bfe4b42bf 100644 --- a/test/ReactViews/Preview/DescriptionSpec.tsx +++ b/test/ReactViews/Preview/DescriptionSpec.tsx @@ -3,9 +3,11 @@ import React from "react"; import { act } from "react-dom/test-utils"; import { create, ReactTestRenderer } from "react-test-renderer"; import { ThemeProvider } from "styled-components"; -import Terria from "../../../lib/Models/Terria"; -import updateModelFromJson from "../../../lib/Models/Definition/updateModelFromJson"; +import GeoJsonCatalogItem from "../../../lib/Models/Catalog/CatalogItems/GeoJsonCatalogItem"; import WebMapServiceCatalogItem from "../../../lib/Models/Catalog/Ows/WebMapServiceCatalogItem"; +import CommonStrata from "../../../lib/Models/Definition/CommonStrata"; +import updateModelFromJson from "../../../lib/Models/Definition/updateModelFromJson"; +import Terria from "../../../lib/Models/Terria"; import Description from "../../../lib/ReactViews/Preview/Description"; import { terriaTheme } from "../../../lib/ReactViews/StandardUserInterface"; @@ -142,4 +144,53 @@ describe("DescriptionSpec", function () { expect(child.props.children).toBe("some link"); }); + + it("respects hideDefaultDescription", function () { + const geoJsonItem = new GeoJsonCatalogItem("test-geojson", terria); + runInAction(() => { + geoJsonItem.setTrait(CommonStrata.definition, "description", "test"); + }); + + act(() => { + testRenderer = create( + + + + ); + }); + + const showDescription = testRenderer.root.findAll( + (node) => node.type === "p" + ); + + expect(showDescription.length).toEqual(1); + expect(showDescription[0].children[0]).toBe("test"); + + runInAction(() => { + geoJsonItem.setTrait(CommonStrata.definition, "description", ""); + }); + + const showDefaultDescription = testRenderer.root.findAll( + (node) => node.type === "p" + ); + + expect(showDefaultDescription.length).toEqual(1); + expect(showDefaultDescription[0].children[0]).toBe( + "description.dataNotLocal" + ); + + runInAction(() => { + geoJsonItem.setTrait( + CommonStrata.definition, + "hideDefaultDescription", + true + ); + }); + + const showNoDescription = testRenderer.root.findAll( + (node) => node.type === "p" + ); + + expect(showNoDescription.length).toEqual(0); + }); }); From 49b4c8a451595ded793773f23f4bfbddad2ddbfe Mon Sep 17 00:00:00 2001 From: Mike Wu <41275384+mwu2018@users.noreply.github.com> Date: Thu, 26 Oct 2023 15:41:02 +1100 Subject: [PATCH 357/654] v8.3.7 (#6953) --- CHANGES.md | 7 +++++-- package.json | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 8d119cecab2..2244eaed456 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,6 +1,10 @@ # Change Log -#### next release (8.3.7) +#### next release (8.3.8) + +- [The next improvement] + +#### 8.3.7 - 2023-10-26 - Fix `WebMapServiceCatalogItem` `allowFeaturePicking` - Allow translation of TableStylingWorkflow. @@ -13,7 +17,6 @@ - Fix share links with picked features from `ProtomapsImageryProvider` - Added on screen attribution and Google logo for Google Photorealistic 3D Tiles. - Add `hideDefaultDescription` to `CatalogMemberTraits` - if true, then no generic default description will be shown when `description` is empty. -- [The next improvement] #### 8.3.6 - 2023-10-03 diff --git a/package.json b/package.json index 35fc2b61343..c1baed979f4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "terriajs", - "version": "8.3.6", + "version": "8.3.7", "description": "Geospatial data visualization platform.", "license": "Apache-2.0", "engines": { From 66c4dd09d912ef8b18527c1b9764cbe4c6fb7398 Mon Sep 17 00:00:00 2001 From: Nick Forbes-Smith Date: Fri, 27 Oct 2023 22:43:14 +1100 Subject: [PATCH 358/654] Re-enable tests --- test/ReactViews/DataCatalog/CatalogGroupSpec.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/ReactViews/DataCatalog/CatalogGroupSpec.tsx b/test/ReactViews/DataCatalog/CatalogGroupSpec.tsx index 8aa83fb516c..731d8363357 100644 --- a/test/ReactViews/DataCatalog/CatalogGroupSpec.tsx +++ b/test/ReactViews/DataCatalog/CatalogGroupSpec.tsx @@ -6,7 +6,7 @@ import { terriaTheme } from "../../../lib/ReactViews/StandardUserInterface"; import { create } from "react-test-renderer"; import { act } from "react-dom/test-utils"; -fdescribe("CatalogGroup", () => { +describe("CatalogGroup", () => { let testRenderer: ReturnType; describe("Loading", () => { From 51c39b31191b8791ed9b1d8ea18426ab8af88914 Mon Sep 17 00:00:00 2001 From: Nick Forbes-Smith Date: Fri, 27 Oct 2023 23:19:24 +1100 Subject: [PATCH 359/654] Fix WMS nested group IDs --- CHANGES.md | 3 +- .../Catalog/Ows/WebMapServiceCatalogGroup.ts | 18 +++--- .../Ows/WebMapServiceCatalogGroupSpec.ts | 61 ++++++++++++++----- wwwroot/test/WMS/wms_nested_groups.xml | 47 ++++++++++++++ 4 files changed, 105 insertions(+), 24 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 3bb3ea568c1..bbb6d82efb8 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -2,8 +2,9 @@ #### next release (8.3.8) -- [The next improvement] +- Fix WMS nested group IDs - nested groups with the same name were not being created - Remove `jsx-control-statements` dependency +- [The next improvement] #### 8.3.7 - 2023-10-26 diff --git a/lib/Models/Catalog/Ows/WebMapServiceCatalogGroup.ts b/lib/Models/Catalog/Ows/WebMapServiceCatalogGroup.ts index bbaecbcee64..bdf48aff1ce 100644 --- a/lib/Models/Catalog/Ows/WebMapServiceCatalogGroup.ts +++ b/lib/Models/Catalog/Ows/WebMapServiceCatalogGroup.ts @@ -168,8 +168,8 @@ class GetCapabilitiesStratum extends LoadableStratum( } @action - createMemberFromLayer(layer: CapabilitiesLayer) { - const layerId = this.getLayerId(layer); + createMemberFromLayer(layer: CapabilitiesLayer, parentLayerId?: string) { + const layerId = this.getLayerId(layer, parentLayerId); if (!layerId) { return; @@ -185,7 +185,7 @@ class GetCapabilitiesStratum extends LoadableStratum( members = [layer.Layer as CapabilitiesLayer]; } - members.forEach((member) => this.createMemberFromLayer(member)); + members.forEach((member) => this.createMemberFromLayer(member, layerId)); // Create group const existingModel = this.catalogGroup.terria.getModelById( @@ -215,7 +215,9 @@ class GetCapabilitiesStratum extends LoadableStratum( model.setTrait( CommonStrata.definition, "members", - filterOutUndefined(members.map((member) => this.getLayerId(member))) + filterOutUndefined( + members.map((member) => this.getLayerId(member, layerId)) + ) ); // Set group `info` trait if applicable @@ -318,11 +320,13 @@ class GetCapabilitiesStratum extends LoadableStratum( model.createGetCapabilitiesStratumFromParent(this.capabilities); } - getLayerId(layer: CapabilitiesLayer) { - if (!isDefined(this.catalogGroup.uniqueId)) { + getLayerId(layer: CapabilitiesLayer, parentLayerId?: string) { + if (!isDefined(this.catalogGroup.uniqueId) && !isDefined(parentLayerId)) { return; } - return `${this.catalogGroup.uniqueId}/${layer.Name ?? layer.Title}`; + return `${parentLayerId ?? this.catalogGroup.uniqueId}/${ + layer.Name ?? layer.Title + }`; } /** For backward-compatibility. diff --git a/test/Models/Catalog/Ows/WebMapServiceCatalogGroupSpec.ts b/test/Models/Catalog/Ows/WebMapServiceCatalogGroupSpec.ts index 2c3b3ebb7be..c1b16bbd00d 100644 --- a/test/Models/Catalog/Ows/WebMapServiceCatalogGroupSpec.ts +++ b/test/Models/Catalog/Ows/WebMapServiceCatalogGroupSpec.ts @@ -133,26 +133,53 @@ describe("WebMapServiceCatalogGroup", function () { }); it("loads", async function () { - expect(wms.members.length).toEqual(3); - expect(wms.memberModels.length).toEqual(3); + expect(wms.members.length).toEqual(2); + expect(wms.memberModels.length).toEqual(2); - const firstGroup = wms.memberModels[0]; + const firstGroup = wms.memberModels[0] as WebMapServiceCatalogGroup; + expect(firstGroup.uniqueId).toEqual( + "test/Digital Earth Australia - OGC Web Services" + ); expect( GroupMixin.isMixedInto(firstGroup) && firstGroup.members.length ).toEqual(3); - const firstGroupFirstModel = - GroupMixin.isMixedInto(firstGroup) && firstGroup.memberModels[0]; - expect( - firstGroupFirstModel && - CatalogMemberMixin.isMixedInto(firstGroupFirstModel) && - firstGroupFirstModel.name - ).toEqual("Surface Reflectance 25m Annual Geomedian (Landsat 8)"); + const firstSubGroup = firstGroup + .memberModels[0] as WebMapServiceCatalogGroup; + expect(firstSubGroup.uniqueId).toEqual( + "test/Digital Earth Australia - OGC Web Services/Surface Reflectance" + ); + expect(firstSubGroup.name).toEqual("Surface Reflectance"); + expect(firstSubGroup.members.length).toEqual(3); - const thirdGroup = wms.memberModels[2]; - expect( - GroupMixin.isMixedInto(thirdGroup) && thirdGroup.members.length - ).toEqual(1); + const firstSubGroupModel = firstSubGroup + .memberModels[0] as WebMapServiceCatalogItem; + expect(firstSubGroupModel.uniqueId).toEqual( + "test/Digital Earth Australia - OGC Web Services/Surface Reflectance/ls8_nbart_geomedian_annual" + ); + expect(firstSubGroupModel.name).toEqual( + "Surface Reflectance 25m Annual Geomedian (Landsat 8)" + ); + + const secondGroup = wms.memberModels[1] as WebMapServiceCatalogGroup; + expect(secondGroup.uniqueId).toEqual("test/Some other catalog"); + expect(secondGroup.name).toEqual("Some other catalog"); + expect(secondGroup.memberModels.length).toEqual(1); + + const secondSubGroup = secondGroup + .memberModels[0] as WebMapServiceCatalogGroup; + expect(secondSubGroup.uniqueId).toEqual( + "test/Some other catalog/Surface Reflectance" + ); + expect(secondSubGroup.name).toEqual("Surface Reflectance"); + expect(secondSubGroup.members.length).toEqual(1); + + const secondSubGroupModel = secondSubGroup + .memberModels[0] as WebMapServiceCatalogItem; + expect(secondSubGroupModel.uniqueId).toEqual( + "test/Some other catalog/Surface Reflectance/some_layer" + ); + expect(secondSubGroupModel.name).toEqual("Some layer"); }); }); @@ -176,8 +203,10 @@ describe("WebMapServiceCatalogGroup", function () { }); it("sets traits correctly", async function () { - const wmsItem = (wms.memberModels[0] as WebMapServiceCatalogGroup) - .memberModels[0] as WebMapServiceCatalogItem; + const wmsItem = ( + (wms.memberModels[0] as WebMapServiceCatalogGroup) + .memberModels[0] as WebMapServiceCatalogGroup + ).memberModels[0] as WebMapServiceCatalogItem; expect(wmsItem.linkedWcsUrl).toEqual("some-url"); expect(wmsItem.linkedWcsCoverage).toEqual("ls8_nbart_geomedian_annual"); diff --git a/wwwroot/test/WMS/wms_nested_groups.xml b/wwwroot/test/WMS/wms_nested_groups.xml index 62a58e44d16..fc5852e1f94 100644 --- a/wwwroot/test/WMS/wms_nested_groups.xml +++ b/wwwroot/test/WMS/wms_nested_groups.xml @@ -601,5 +601,52 @@ NOTE this layer has no EX_GeographicBoundingBox + + Some other catalog + + Some other catalog + + EPSG:3857 + EPSG:4326 + EPSG:3577 + EPSG:3111 + + 100 + 160 + -50 + -10 + + + Surface Reflectance + This is another layer called Surface Reflectance + + some_layer + Some layer + Some layer + + + WOfS + + + 109.989859933428 + 156.101505058599 + -45.2413329418709 + -9.02727104242042 + + + + + + + 2013-01-01,2014-01-01,2015-01-01,2016-01-01,2017-01-01,2018-01-01 + + + + + From 1e1e66c38aa46392f7799f76dfb14671e7870625 Mon Sep 17 00:00:00 2001 From: Nick Forbes-Smith Date: Thu, 2 Nov 2023 21:08:54 +1100 Subject: [PATCH 360/654] Fix maximum call stack size exceeded on Math.min/max when creating Charts --- CHANGES.md | 1 + lib/Core/math.ts | 23 +++++++++++++++++++++++ lib/ModelMixins/ChartableMixin.ts | 3 ++- 3 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 lib/Core/math.ts diff --git a/CHANGES.md b/CHANGES.md index 3bb3ea568c1..625749b8db6 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -3,6 +3,7 @@ #### next release (8.3.8) - [The next improvement] +- Fix maximum call stack size exceeded on Math.min/max when creating Charts - Remove `jsx-control-statements` dependency #### 8.3.7 - 2023-10-26 diff --git a/lib/Core/math.ts b/lib/Core/math.ts new file mode 100644 index 00000000000..0659572674f --- /dev/null +++ b/lib/Core/math.ts @@ -0,0 +1,23 @@ +export function getMax(nums: number[]) { + let len = nums.length; + if (len === 0) return undefined; + + let max = -Infinity; + + while (len--) { + max = nums[len] > max ? nums[len] : max; + } + return max; +} + +export function getMin(nums: number[]) { + let len = nums.length; + if (len === 0) return undefined; + + let min = Infinity; + + while (len--) { + min = nums[len] < min ? nums[len] : min; + } + return min; +} diff --git a/lib/ModelMixins/ChartableMixin.ts b/lib/ModelMixins/ChartableMixin.ts index 9da5b576d1c..e6806b34d57 100644 --- a/lib/ModelMixins/ChartableMixin.ts +++ b/lib/ModelMixins/ChartableMixin.ts @@ -1,6 +1,7 @@ import { maxBy, minBy } from "lodash-es"; import AbstractConstructor from "../Core/AbstractConstructor"; import LatLonHeight from "../Core/LatLonHeight"; +import { getMax, getMin } from "../Core/math"; import Model from "../Models/Definition/Model"; import { GlyphStyle } from "../ReactViews/Custom/Chart/Glyphs"; import ModelTraits from "../Traits/ModelTraits"; @@ -23,7 +24,7 @@ export function calculateDomain(points: ChartPoint[]): ChartDomain { const asNum = (x: Date | number) => (x instanceof Date ? x.getTime() : x); return { x: [minBy(xs, asNum) || 0, maxBy(xs, asNum) || 0], - y: [Math.min(...ys), Math.max(...ys)] + y: [getMin(ys) ?? 0, getMax(ys) ?? 0] }; } From 7a7ea6706eb3a0ddf597909b375784cde067e6e7 Mon Sep 17 00:00:00 2001 From: Nick Forbes-Smith Date: Thu, 2 Nov 2023 21:09:20 +1100 Subject: [PATCH 361/654] Fix boolean flag in `MyDataTab` displaying number --- CHANGES.md | 1 + lib/ReactViews/ExplorerWindow/Tabs/MyDataTab/MyDataTab.jsx | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGES.md b/CHANGES.md index 625749b8db6..4a74e1041b5 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -4,6 +4,7 @@ - [The next improvement] - Fix maximum call stack size exceeded on Math.min/max when creating Charts +- Fix boolean flag in `MyDataTab` displaying number - Remove `jsx-control-statements` dependency #### 8.3.7 - 2023-10-26 diff --git a/lib/ReactViews/ExplorerWindow/Tabs/MyDataTab/MyDataTab.jsx b/lib/ReactViews/ExplorerWindow/Tabs/MyDataTab/MyDataTab.jsx index 7fbb75a9057..bfec39c7c72 100644 --- a/lib/ReactViews/ExplorerWindow/Tabs/MyDataTab/MyDataTab.jsx +++ b/lib/ReactViews/ExplorerWindow/Tabs/MyDataTab/MyDataTab.jsx @@ -123,7 +123,7 @@ class MyDataTab extends React.Component { } render() { - const showTwoColumn = this.hasUserAddedData() & !this.state.activeTab; + const showTwoColumn = !!(this.hasUserAddedData() & !this.state.activeTab); const { t, className } = this.props; return ( Date: Thu, 2 Nov 2023 21:15:31 +1100 Subject: [PATCH 362/654] make operator consistent --- lib/ModelMixins/ChartableMixin.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/ModelMixins/ChartableMixin.ts b/lib/ModelMixins/ChartableMixin.ts index e6806b34d57..b3884db2a77 100644 --- a/lib/ModelMixins/ChartableMixin.ts +++ b/lib/ModelMixins/ChartableMixin.ts @@ -23,7 +23,7 @@ export function calculateDomain(points: ChartPoint[]): ChartDomain { const ys = points.map((p) => p.y); const asNum = (x: Date | number) => (x instanceof Date ? x.getTime() : x); return { - x: [minBy(xs, asNum) || 0, maxBy(xs, asNum) || 0], + x: [minBy(xs, asNum) ?? 0, maxBy(xs, asNum) ?? 0], y: [getMin(ys) ?? 0, getMax(ys) ?? 0] }; } From 7214e69f91b4c745672f53a24214ad6fa236a963 Mon Sep 17 00:00:00 2001 From: Zoran Kokeza Date: Fri, 3 Nov 2023 02:56:22 +0100 Subject: [PATCH 363/654] fix: white screen --- lib/Models/SearchProviders/CatalogSearchProvider.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/Models/SearchProviders/CatalogSearchProvider.ts b/lib/Models/SearchProviders/CatalogSearchProvider.ts index e1b113b4fb4..920aa16101d 100644 --- a/lib/Models/SearchProviders/CatalogSearchProvider.ts +++ b/lib/Models/SearchProviders/CatalogSearchProvider.ts @@ -3,7 +3,8 @@ import { computed, observable, runInAction, - makeObservable + makeObservable, + override } from "mobx"; import { fromPromise } from "mobx-utils"; import { @@ -137,7 +138,7 @@ export default class CatalogSearchProvider extends SearchProviderMixin( return CatalogSearchProvider.type; } - @computed get resultsAreReferences() { + @override get resultsAreReferences() { return ( isDefined(this.terria.catalogIndex?.loadPromise) && fromPromise(this.terria.catalogIndex!.loadPromise).state === "fulfilled" From 44236d0e97b78821196f80214479329e790b3877 Mon Sep 17 00:00:00 2001 From: Zoran Kokeza Date: Fri, 3 Nov 2023 03:00:09 +0100 Subject: [PATCH 364/654] fix: remove unused property --- lib/Models/Terria.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Models/Terria.ts b/lib/Models/Terria.ts index a352d8f050c..d02935554e8 100644 --- a/lib/Models/Terria.ts +++ b/lib/Models/Terria.ts @@ -417,7 +417,7 @@ interface HomeCameraInit { export default class Terria { private readonly models = observable.map(); - private searchProviders: any[] = []; + /** Map from share key -> id */ readonly shareKeysMap = observable.map(); /** Map from id -> share keys */ From c2d5cf13ce2ba1939ed24a1c3eeee1aff7c6b6ac Mon Sep 17 00:00:00 2001 From: Nick Forbes-Smith Date: Fri, 3 Nov 2023 14:15:39 +1100 Subject: [PATCH 365/654] Fix WMS sharekeys --- .../Catalog/Ows/WebMapServiceCatalogGroup.ts | 23 +++++++++++++------ 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/lib/Models/Catalog/Ows/WebMapServiceCatalogGroup.ts b/lib/Models/Catalog/Ows/WebMapServiceCatalogGroup.ts index bdf48aff1ce..58517a153ae 100644 --- a/lib/Models/Catalog/Ows/WebMapServiceCatalogGroup.ts +++ b/lib/Models/Catalog/Ows/WebMapServiceCatalogGroup.ts @@ -201,7 +201,7 @@ class GetCapabilitiesStratum extends LoadableStratum( // At the moment we ignore duplicate layers this.catalogGroup.terria.addModel( model, - this.getLayerShareKeys(layer) + this.getLayerShareKeys(layer, layerId) ); } catch (e) { TerriaError.from(e, "Failed to add CatalogGroup").log(); @@ -253,7 +253,10 @@ class GetCapabilitiesStratum extends LoadableStratum( try { // Sometimes WMS Layers have duplicate names // At the moment we ignore duplicate layers - this.catalogGroup.terria.addModel(model, this.getLayerShareKeys(layer)); + this.catalogGroup.terria.addModel( + model, + this.getLayerShareKeys(layer, layerId) + ); } catch (e) { TerriaError.from(e, "Failed to add WebMapServiceCatalogItem").log(); return; @@ -330,14 +333,20 @@ class GetCapabilitiesStratum extends LoadableStratum( } /** For backward-compatibility. - * If layer.Name is defined, we will use it to create layer autoID (see `this.getLayerId`). - * Previously we used layer.Title, so we now add it as a shareKey + * Previously we have used the following IDs + * - `WMS Group Catalog ID/WMS Layer Name` - regardless of nesting + * - `WMS Group Catalog ID/WMS Layer Title` */ - getLayerShareKeys(layer: CapabilitiesLayer) { + getLayerShareKeys(layer: CapabilitiesLayer, layerId: string) { + const shareKeys: string[] = []; + + if (layerId !== `${this.catalogGroup.uniqueId}/${layer.Name}`) + shareKeys.push(`${this.catalogGroup.uniqueId}/${layer.Name}`); + if (isDefined(layer.Name) && layer.Title !== layer.Name) - return [`${this.catalogGroup.uniqueId}/${layer.Title}`]; + shareKeys.push(`${this.catalogGroup.uniqueId}/${layer.Title}`); - return []; + return shareKeys; } } From 9dd9a144c599b12442ed61d98a7b5085b9dbafde Mon Sep 17 00:00:00 2001 From: Nick Forbes-Smith Date: Fri, 3 Nov 2023 14:57:37 +1100 Subject: [PATCH 366/654] Add comment + update CHANGES --- CHANGES.md | 11 +++++------ .../Catalog/Ows/WebMapServiceCapabilitiesStratum.ts | 4 +++- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 2b14c2a1222..e3b49c67e38 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -2,19 +2,18 @@ #### next release (8.3.8) -- [The next improvement] - Remove `jsx-control-statements` dependency +- WMS `isEsri` default value will now check for case-insensitive `mapserver/wmsserver` (instead of `MapServer/WMSServer`) +- Tweak ArcGis MapServer WMS `GetFeatureInfo` default behaviour + - Add `application/geo+json` and `application/vnd.geo+json` default `GetFeatureInfo` (after `application/json` in priority list) + - Add `application/xml` default `GetFeatureInfo`. (if `isEsri` is true, then this will be used before `text/html`) +- [The next improvement] #### 8.3.7 - 2023-10-26 - Fix `WebMapServiceCatalogItem` `allowFeaturePicking` - Allow translation of TableStylingWorkflow. - Fix "Remove all" not removing selected/picked features -- WMS `isEsri` default value will now check for case-insensitive `mapserver/wmsserver` (instead of `MapServer/WMSServer`) -- Tweak ArcGis MapServer WMS `GetFeatureInfo` default behaviour - - Add `application/geo+json` and `application/vnd.geo+json` default `GetFeatureInfo` (after `application/json` in priority list) - - Add `application/xml` default `GetFeatureInfo`. (if `isEsri` is true, then this will be used before `text/html`) -- [The next improvement] - Fix crash on empty GeoJSON features - Add `tableFeatureInfoContext` support to `GeoJsonMixin.createProtomapsImageryProvider` - Fix `GeoJsonMixin` timeline animation for lines/polygons diff --git a/lib/Models/Catalog/Ows/WebMapServiceCapabilitiesStratum.ts b/lib/Models/Catalog/Ows/WebMapServiceCapabilitiesStratum.ts index 32b8737cc18..67a83fb5f11 100644 --- a/lib/Models/Catalog/Ows/WebMapServiceCapabilitiesStratum.ts +++ b/lib/Models/Catalog/Ows/WebMapServiceCapabilitiesStratum.ts @@ -861,7 +861,7 @@ export default class WebMapServiceCapabilitiesStratum extends LoadableStratum( if (formatsArray.includes("application/vnd.geo+json")) return { format: "application/vnd.geo+json", type: "json" }; - // Special case for Esri WMS, use XML before HTML + // Special case for Esri WMS, use XML before HTML/GML // as HTML includes with rowbg that is hard to read if (this.isEsri && formatsArray.includes("text/xml")) { return { format: "text/xml", type: "xml" }; @@ -870,6 +870,8 @@ export default class WebMapServiceCapabilitiesStratum extends LoadableStratum( return { format: "text/html", type: "html" }; if (formatsArray.includes("application/vnd.ogc.gml")) return { format: "application/vnd.ogc.gml", type: "xml" }; + + // For non-Esri services, we use XML after HTML/GML if (formatsArray.includes("text/xml")) { return { format: "text/xml", type: "xml" }; } From a4fb9dd6b5a03413355d904e5eff22847fc60b5a Mon Sep 17 00:00:00 2001 From: Nick Forbes-Smith Date: Fri, 3 Nov 2023 18:22:23 +1100 Subject: [PATCH 367/654] Fix changes --- CHANGES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES.md b/CHANGES.md index b560d68191f..bf3f525cd4d 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -2,6 +2,7 @@ #### next release (8.3.8) +- Remove `jsx-control-statements` dependency - Fix WMS nested group IDs - nested groups with the same name were not being created - WMS `isEsri` default value will now check for case-insensitive `mapserver/wmsserver` (instead of `MapServer/WMSServer`) - Tweak ArcGis MapServer WMS `GetFeatureInfo` default behaviour From 5ded654c251c0a9582864537c5b38b8414883697 Mon Sep 17 00:00:00 2001 From: Zoran Kokeza Date: Fri, 3 Nov 2023 10:06:35 +0100 Subject: [PATCH 368/654] fix: rename ADR --- ...-search-providers.md => 0011-configurable-search-providers.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename architecture/{0007-configurable-search-providers.md => 0011-configurable-search-providers.md} (100%) diff --git a/architecture/0007-configurable-search-providers.md b/architecture/0011-configurable-search-providers.md similarity index 100% rename from architecture/0007-configurable-search-providers.md rename to architecture/0011-configurable-search-providers.md From b9a51b2e505e9d6c8e4877e88f4a95089514c416 Mon Sep 17 00:00:00 2001 From: Nick Forbes-Smith Date: Fri, 3 Nov 2023 22:35:15 +1100 Subject: [PATCH 369/654] Add TopStratum merge strategy to objectArrayTrait --- CHANGES.md | 1 + .../Custom/CsvChartCustomComponent.ts | 3 ++- lib/Traits/ArrayNestedStrataMap.ts | 18 +++++++++++++----- lib/Traits/Decorators/objectArrayTrait.ts | 19 +++++++++++++++---- .../ExportWebCoverageServiceTraits.ts | 6 ++++-- lib/Traits/TraitsClasses/LegendOwnerTraits.ts | 6 ++++-- .../TraitsClasses/Table/ChartStyleTraits.ts | 8 +++++--- test/Traits/objectArrayTraitSpec.ts | 6 ++++-- 8 files changed, 48 insertions(+), 19 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index bf3f525cd4d..cf3f480942b 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -12,6 +12,7 @@ CED_2021,POA_2021,TR_2021,SUA_2021,UCL_2021,SOS_2021,SOSR_2021). - See [ASGS 2021](https://www.abs.gov.au/statistics/standards/australian-statistical-geography-standard-asgs-edition-3/jul2021-jun2026/access-and-downloads/digital-boundary-files) - Added [Melbourne CLUE blocks](https://data.melbourne.vic.gov.au/pages/clue/) to region mapping. +- - [The next improvement] #### 8.3.7 - 2023-10-26 diff --git a/lib/ReactViews/Custom/CsvChartCustomComponent.ts b/lib/ReactViews/Custom/CsvChartCustomComponent.ts index 79faefcc6ef..fd1199d320b 100644 --- a/lib/ReactViews/Custom/CsvChartCustomComponent.ts +++ b/lib/ReactViews/Custom/CsvChartCustomComponent.ts @@ -169,7 +169,8 @@ export default class CsvChartCustomComponent extends ChartCustomComponent { - chartStyle.chart.addObject(CommonStrata.user, "lines", y)!; + const line = chartStyle.chart.addObject(CommonStrata.user, "lines", y)!; + line.setTrait(CommonStrata.user, "isSelectedInWorkbench", true); }); item.setTrait(CommonStrata.user, "activeStyle", "chart"); diff --git a/lib/Traits/ArrayNestedStrataMap.ts b/lib/Traits/ArrayNestedStrataMap.ts index 2c4e3c612f2..528e24fde80 100644 --- a/lib/Traits/ArrayNestedStrataMap.ts +++ b/lib/Traits/ArrayNestedStrataMap.ts @@ -1,6 +1,7 @@ import { computed, makeObservable } from "mobx"; -import createStratumInstance from "../Models/Definition/createStratumInstance"; import StratumFromTraits from "../Models/Definition/StratumFromTraits"; +import createStratumInstance from "../Models/Definition/createStratumInstance"; +import { MergeStrategy } from "./Decorators/objectArrayTrait"; import ModelTraits from "./ModelTraits"; import Stratified from "./Stratified"; import TraitsConstructor from "./TraitsConstructor"; @@ -18,7 +19,7 @@ export default class ArrayNestedStrataMap readonly objectTraits: TraitsConstructorWithRemoval, readonly objectIdProperty: string | number | symbol, readonly objectId: string, - readonly merge: boolean + readonly merge: MergeStrategy ) { makeObservable(this); } @@ -127,6 +128,7 @@ export default class ArrayNestedStrataMap this.parentModel.strataTopToBottom; const result = new Map>(); + const topStratumId = this.parentModel.strataTopToBottom.keys().next().value; // Find the strata that go into this object. for (let stratumId of strataTopToBottom.keys()) { @@ -143,22 +145,28 @@ export default class ArrayNestedStrataMap }); if (thisObject === undefined) { + // If merge strategy is TopStratum, we only return an object if it is in the top stratum - to we stop here + if ( + this.merge === MergeStrategy.TopStratum && + stratumId === topStratumId + ) + break; continue; } + // This object is removed in this stratum, so stop here. if ( this.objectTraits.isRemoval !== undefined && this.objectTraits.isRemoval(thisObject) ) { - // This object is removed in this stratum, so stop here. break; } // This stratum applies to this object. result.set(stratumId, thisObject); - // If merge is false, only return the top-most strata's object - if (!this.merge) return result; + // If merge strategy is None, only return the top-most strata's object + if (this.merge === MergeStrategy.None) return result; } return result; diff --git a/lib/Traits/Decorators/objectArrayTrait.ts b/lib/Traits/Decorators/objectArrayTrait.ts index 98602a8a279..9205d85be20 100644 --- a/lib/Traits/Decorators/objectArrayTrait.ts +++ b/lib/Traits/Decorators/objectArrayTrait.ts @@ -18,15 +18,26 @@ import ModelTraits from "../ModelTraits"; import Trait, { TraitOptions } from "../Trait"; import traitsClassToModelClass from "../traitsClassToModelClass"; +export enum MergeStrategy { + /** + * Merge array elements across strata (if merge is false, each element will only be the top-most strata's object). This is the default. + */ + All = "all", + /** Similar to Merge.All, but elements that exist in the top-most strata will be merged with lower strata. Elements that only exist in lower strata will be removed. */ + TopStratum = "topStratum", + /** Don't merge array elements across strata. */ + None = "none" +} + export interface ObjectArrayTraitOptions extends TraitOptions { type: TraitsConstructorWithRemoval; idProperty: keyof T | "index"; modelClass?: ModelConstructor>; /** - * Merge array elements across strata (if merge is false, each element will only be the top-most strata's object). Default is `true` + * How to merge array elements across strata. By default all elements are merged. */ - merge?: boolean; + merge?: MergeStrategy; } export default function objectArrayTrait( @@ -50,14 +61,14 @@ export class ObjectArrayTrait extends Trait { readonly idProperty: keyof T | "index"; readonly decoratorForFlattened = computed.struct; readonly modelClass: ModelConstructor>; - readonly merge: boolean; + readonly merge: MergeStrategy; constructor(id: string, options: ObjectArrayTraitOptions, parent: any) { super(id, options, parent); this.type = options.type; this.idProperty = options.idProperty; this.modelClass = options.modelClass || traitsClassToModelClass(this.type); - this.merge = options.merge ?? true; + this.merge = options.merge ?? MergeStrategy.All; } private readonly createObject: ( diff --git a/lib/Traits/TraitsClasses/ExportWebCoverageServiceTraits.ts b/lib/Traits/TraitsClasses/ExportWebCoverageServiceTraits.ts index 6dd824d5ab8..0ace5805cc0 100644 --- a/lib/Traits/TraitsClasses/ExportWebCoverageServiceTraits.ts +++ b/lib/Traits/TraitsClasses/ExportWebCoverageServiceTraits.ts @@ -1,4 +1,6 @@ -import objectArrayTrait from "../Decorators/objectArrayTrait"; +import objectArrayTrait, { + MergeStrategy +} from "../Decorators/objectArrayTrait"; import objectTrait from "../Decorators/objectTrait"; import primitiveTrait from "../Decorators/primitiveTrait"; import mixTraits from "../mixTraits"; @@ -57,7 +59,7 @@ export class WebCoverageServiceParameterTraits extends ModelTraits { @objectArrayTrait({ type: KeyValueTraits, idProperty: "index", - merge: false, + merge: MergeStrategy.None, name: "Additional key-value parameters to add as URL query parameters", description: "Each key-value will be added to URL like so - `someurl.com?key=value`." diff --git a/lib/Traits/TraitsClasses/LegendOwnerTraits.ts b/lib/Traits/TraitsClasses/LegendOwnerTraits.ts index b8c2ab986aa..8c826bc38a4 100644 --- a/lib/Traits/TraitsClasses/LegendOwnerTraits.ts +++ b/lib/Traits/TraitsClasses/LegendOwnerTraits.ts @@ -1,4 +1,6 @@ -import objectArrayTrait from "../Decorators/objectArrayTrait"; +import objectArrayTrait, { + MergeStrategy +} from "../Decorators/objectArrayTrait"; import primitiveTrait from "../Decorators/primitiveTrait"; import ModelTraits from "../ModelTraits"; import LegendTraits from "./LegendTraits"; @@ -9,7 +11,7 @@ export default class LegendOwnerTraits extends ModelTraits { description: "The legends to display on the workbench.", type: LegendTraits, idProperty: "index", - merge: false + merge: MergeStrategy.None }) legends?: LegendTraits[]; diff --git a/lib/Traits/TraitsClasses/Table/ChartStyleTraits.ts b/lib/Traits/TraitsClasses/Table/ChartStyleTraits.ts index 3b734514785..ecc724e515a 100644 --- a/lib/Traits/TraitsClasses/Table/ChartStyleTraits.ts +++ b/lib/Traits/TraitsClasses/Table/ChartStyleTraits.ts @@ -1,6 +1,8 @@ -import ModelTraits from "../../ModelTraits"; +import objectArrayTrait, { + MergeStrategy +} from "../../Decorators/objectArrayTrait"; import primitiveTrait from "../../Decorators/primitiveTrait"; -import objectArrayTrait from "../../Decorators/objectArrayTrait"; +import ModelTraits from "../../ModelTraits"; export class TableChartLineStyleTraits extends ModelTraits { @primitiveTrait({ @@ -61,7 +63,7 @@ export default class TableChartStyleTraits extends ModelTraits { "Lines on the chart, each of which is formed by plotting a column as the Y-axis.", type: TableChartLineStyleTraits, idProperty: "yAxisColumn", - merge: false + merge: MergeStrategy.TopStratum }) lines?: TableChartLineStyleTraits[]; } diff --git a/test/Traits/objectArrayTraitSpec.ts b/test/Traits/objectArrayTraitSpec.ts index 9fb6c59e1b2..b85e9a77a89 100644 --- a/test/Traits/objectArrayTraitSpec.ts +++ b/test/Traits/objectArrayTraitSpec.ts @@ -2,7 +2,9 @@ import { configure } from "mobx"; import CreateModel from "../../lib/Models/Definition/CreateModel"; import createStratumInstance from "../../lib/Models/Definition/createStratumInstance"; import Terria from "../../lib/Models/Terria"; -import objectArrayTrait from "../../lib/Traits/Decorators/objectArrayTrait"; +import objectArrayTrait, { + MergeStrategy +} from "../../lib/Traits/Decorators/objectArrayTrait"; import primitiveTrait from "../../lib/Traits/Decorators/primitiveTrait"; import ModelTraits from "../../lib/Traits/ModelTraits"; @@ -69,7 +71,7 @@ class OuterTraitsNoMerge extends ModelTraits { name: "Inner", description: "Inner", idProperty: "foo", - merge: false + merge: MergeStrategy.None }) inner?: InnerTraits[]; From d790d60e7a6cedd2bd4badb675c71ac688dfb734 Mon Sep 17 00:00:00 2001 From: Nick Forbes-Smith Date: Fri, 3 Nov 2023 22:37:28 +1100 Subject: [PATCH 370/654] fix comment --- lib/Traits/ArrayNestedStrataMap.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/Traits/ArrayNestedStrataMap.ts b/lib/Traits/ArrayNestedStrataMap.ts index 528e24fde80..afd100d4da7 100644 --- a/lib/Traits/ArrayNestedStrataMap.ts +++ b/lib/Traits/ArrayNestedStrataMap.ts @@ -145,12 +145,13 @@ export default class ArrayNestedStrataMap }); if (thisObject === undefined) { - // If merge strategy is TopStratum, we only return an object if it is in the top stratum - to we stop here + // If merge strategy is TopStratum, we only return an object if it is in the top stratum - so we stop here if ( this.merge === MergeStrategy.TopStratum && stratumId === topStratumId - ) + ) { break; + } continue; } From 97920ceac3f264d9ce6212e3a6874c78108875a8 Mon Sep 17 00:00:00 2001 From: Zoran Kokeza Date: Sat, 4 Nov 2023 14:18:52 +0100 Subject: [PATCH 371/654] tests: reorganize tests and test search provider mixin --- .../SearchProviderMixinSpec.ts | 76 +++++++++++++++++++ .../BingMapsSearchProviderSpec.ts} | 0 .../LocationSearchProviderSpec.ts} | 0 3 files changed, 76 insertions(+) create mode 100644 test/ModelMixins/SearchProviders/SearchProviderMixinSpec.ts rename test/{Traits/SearchProviders/BingMapsSearchProviderTraitsSpec.ts => Models/SearchProviders/BingMapsSearchProviderSpec.ts} (100%) rename test/{Traits/SearchProviders/LocationSearchProviderTraitsSpec.ts => Models/SearchProviders/LocationSearchProviderSpec.ts} (100%) diff --git a/test/ModelMixins/SearchProviders/SearchProviderMixinSpec.ts b/test/ModelMixins/SearchProviders/SearchProviderMixinSpec.ts new file mode 100644 index 00000000000..54c07c34b38 --- /dev/null +++ b/test/ModelMixins/SearchProviders/SearchProviderMixinSpec.ts @@ -0,0 +1,76 @@ +import { CommonStrata } from "terriajs-plugin-api"; +import SearchProviderMixin from "../../../lib/ModelMixins/SearchProviders/SearchProviderMixin"; +import CreateModel from "../../../lib/Models/Definition/CreateModel"; +import SearchProviderResults from "../../../lib/Models/SearchProviders/SearchProviderResults"; +import Terria from "../../../lib/Models/Terria"; +import BingMapsSearchProviderTraits from "../../../lib/Traits/SearchProviders/BingMapsSearchProviderTraits"; + +class TestSearchProvider extends SearchProviderMixin( + CreateModel(BingMapsSearchProviderTraits) +) { + type = "test"; + + constructor(uniqueId: string | undefined, terria: Terria) { + super(uniqueId, terria); + } + + public override logEvent = jasmine.createSpy(); + public override doSearch = jasmine + .createSpy() + .and.returnValue(Promise.resolve()); +} + +describe("SearchProviderMixin", () => { + let terria: Terria; + let searchProvider: TestSearchProvider; + + beforeEach(() => { + terria = new Terria({ + baseUrl: "./" + }); + searchProvider = new TestSearchProvider("test", terria); + searchProvider.setTrait(CommonStrata.definition, "minCharacters", 3); + searchProvider.logEvent.calls.reset(); + searchProvider.doSearch.calls.reset(); + }); + + it(" - properly mixed", () => { + expect(SearchProviderMixin.isMixedInto(searchProvider)).toBeTruthy(); + }); + + it(" - should not run search if searchText is undefined", () => { + const result = searchProvider.search(undefined as never); + expect(result.resultsCompletePromise).toBeDefined(); + expect(result.message).toBeDefined(); + + expect(searchProvider.logEvent).not.toHaveBeenCalled(); + expect(searchProvider.doSearch).not.toHaveBeenCalled(); + }); + + it(" - should not run search if only spaces", () => { + const result = searchProvider.search(" "); + expect(result.resultsCompletePromise).toBeDefined(); + expect(result.message).toBeDefined(); + + expect(searchProvider.logEvent).not.toHaveBeenCalled(); + expect(searchProvider.doSearch).not.toHaveBeenCalled(); + }); + + it(" - should not run search if searchText less than minCharacters", () => { + const result = searchProvider.search("12"); + expect(result.resultsCompletePromise).toBeDefined(); + expect(result.message).toBeDefined(); + + expect(searchProvider.logEvent).not.toHaveBeenCalled(); + expect(searchProvider.doSearch).not.toHaveBeenCalled(); + }); + + it(" - should run search if searchText is valid", () => { + const result = searchProvider.search("1234"); + expect(result.resultsCompletePromise).toBeDefined(); + expect(result.message).not.toBeDefined(); + + expect(searchProvider.logEvent).toHaveBeenCalled(); + expect(searchProvider.doSearch).toHaveBeenCalled(); + }); +}); diff --git a/test/Traits/SearchProviders/BingMapsSearchProviderTraitsSpec.ts b/test/Models/SearchProviders/BingMapsSearchProviderSpec.ts similarity index 100% rename from test/Traits/SearchProviders/BingMapsSearchProviderTraitsSpec.ts rename to test/Models/SearchProviders/BingMapsSearchProviderSpec.ts diff --git a/test/Traits/SearchProviders/LocationSearchProviderTraitsSpec.ts b/test/Models/SearchProviders/LocationSearchProviderSpec.ts similarity index 100% rename from test/Traits/SearchProviders/LocationSearchProviderTraitsSpec.ts rename to test/Models/SearchProviders/LocationSearchProviderSpec.ts From 6263bb5d5a51c5507e2a12dc4090285bc0e89b33 Mon Sep 17 00:00:00 2001 From: Zoran Kokeza Date: Sat, 4 Nov 2023 14:19:19 +0100 Subject: [PATCH 372/654] fix: ADR title number --- architecture/0011-configurable-search-providers.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/architecture/0011-configurable-search-providers.md b/architecture/0011-configurable-search-providers.md index a80f24246fb..2779eaf5a97 100644 --- a/architecture/0011-configurable-search-providers.md +++ b/architecture/0011-configurable-search-providers.md @@ -1,4 +1,4 @@ -# 7. Configuration of search providers +# 11. Configuration of search providers Date: 2021-01-19 From 07057ab7aa82f96c982bd670acd7751ac2afcacd Mon Sep 17 00:00:00 2001 From: Zoran Kokeza Date: Sat, 4 Nov 2023 15:13:46 +0100 Subject: [PATCH 373/654] feat: add CatalogSearchProviderMixin and small types refactor --- .../CatalogSearchProviderMixin.ts | 44 +++++++++++++++++++ .../LocationSearchProviderMixin.ts | 6 +-- .../SearchProviders/SearchProviderMixin.ts | 8 +--- .../WebFeatureServiceSearchProviderMixin.ts | 8 ++-- .../SearchProviders/CatalogSearchProvider.ts | 10 +---- .../SearchProviders/SearchProviderResults.ts | 4 +- lib/ReactViewModels/SearchState.ts | 11 ++--- lib/ReactViewModels/ViewState.ts | 6 ++- .../Search/LocationSearchResults.tsx | 9 ++-- test/Map/StyledHtmlSpec.tsx | 2 +- .../MapNavigation/MapNavigationModelSpec.ts | 2 +- test/Models/TerriaSpec.ts | 6 +-- test/ReactViews/BottomDock/BottomDockSpec.tsx | 2 +- .../BottomDock/MapDataCountSpec.tsx | 2 +- .../DataCatalog/DataCatalogItemSpec.tsx | 2 +- test/ReactViews/DisclaimerSpec.tsx | 2 +- test/ReactViews/FeatureInfoPanelSpec.tsx | 2 +- test/ReactViews/Generic/PromptSpec.tsx | 2 +- .../Map/Navigation/Compass/CompassSpec.tsx | 2 +- .../Compass/GyroscopeGuidanceSpec.tsx | 2 +- .../Map/Panels/HelpPanel/HelpPanelSpec.tsx | 2 +- .../Map/Panels/HelpPanel/VideoGuideSpec.tsx | 2 +- .../Map/Panels/LangPanel/LangPanelSpec.tsx | 2 +- .../Panels/SharePanel/BuildShareLinkSpec.ts | 2 +- test/ReactViews/Search/BreadcrumbsSpec.tsx | 2 +- .../Search/SearchBoxAndResultsSpec.tsx | 2 +- test/ReactViews/Search/SearchBoxSpec.tsx | 2 +- .../TrainerBar/TrainerBarSpec.tsx | 2 +- .../ItemSearchTool/ItemSearchToolSpec.tsx | 2 +- test/ReactViews/Tour/TourPortalSpec.tsx | 2 +- test/ReactViews/WelcomeMessageSpec.tsx | 2 +- 31 files changed, 93 insertions(+), 61 deletions(-) create mode 100644 lib/ModelMixins/SearchProviders/CatalogSearchProviderMixin.ts diff --git a/lib/ModelMixins/SearchProviders/CatalogSearchProviderMixin.ts b/lib/ModelMixins/SearchProviders/CatalogSearchProviderMixin.ts new file mode 100644 index 00000000000..a0a62d02afd --- /dev/null +++ b/lib/ModelMixins/SearchProviders/CatalogSearchProviderMixin.ts @@ -0,0 +1,44 @@ +import { computed, makeObservable } from "mobx"; +import AbstractConstructor from "../../Core/AbstractConstructor"; +import Model from "../../Models/Definition/Model"; +import SearchProviderTraits from "../../Traits/SearchProviders/SearchProviderTraits"; +import SearchProviderMixin from "./SearchProviderMixin"; +import isDefined from "../../Core/isDefined"; +import { fromPromise } from "mobx-utils"; + +type CatalogSearchProviderModel = Model; + +function CatalogSearchProviderMixin< + T extends AbstractConstructor +>(Base: T) { + abstract class CatalogSearchProviderMixin extends SearchProviderMixin(Base) { + constructor(...args: any[]) { + super(...args); + makeObservable(this); + } + + @computed get resultsAreReferences() { + return ( + isDefined(this.terria.catalogIndex?.loadPromise) && + fromPromise(this.terria.catalogIndex!.loadPromise).state === "fulfilled" + ); + } + + get hasCatalogSearchProviderMixin() { + return true; + } + } + + return CatalogSearchProviderMixin; +} + +namespace CatalogSearchProviderMixin { + export interface Instance + extends InstanceType> {} + + export function isMixedInto(model: any): model is Instance { + return model && model.hasCatalogSearchProviderMixin; + } +} + +export default CatalogSearchProviderMixin; diff --git a/lib/ModelMixins/SearchProviders/LocationSearchProviderMixin.ts b/lib/ModelMixins/SearchProviders/LocationSearchProviderMixin.ts index 31c1784d414..33a73f8372c 100644 --- a/lib/ModelMixins/SearchProviders/LocationSearchProviderMixin.ts +++ b/lib/ModelMixins/SearchProviders/LocationSearchProviderMixin.ts @@ -59,12 +59,10 @@ export function getMapCenter(terria: Terria): MapCenter { } namespace LocationSearchProviderMixin { - export interface LocationSearchProviderMixin + export interface Instance extends InstanceType> {} - export function isMixedInto( - model: any - ): model is LocationSearchProviderMixin { + export function isMixedInto(model: any): model is Instance { return model && model.hasLocationSearchProviderMixin; } } diff --git a/lib/ModelMixins/SearchProviders/SearchProviderMixin.ts b/lib/ModelMixins/SearchProviders/SearchProviderMixin.ts index badb379b831..8825b2102bb 100644 --- a/lib/ModelMixins/SearchProviders/SearchProviderMixin.ts +++ b/lib/ModelMixins/SearchProviders/SearchProviderMixin.ts @@ -64,20 +64,16 @@ function SearchProviderMixin< get hasSearchProviderMixin() { return true; } - - @computed get resultsAreReferences() { - return isDefined(this.terria.catalogIndex); - } } return SearchProviderMixin; } namespace SearchProviderMixin { - export interface SearchProviderMixin + export interface Instance extends InstanceType> {} - export function isMixedInto(model: any): model is SearchProviderMixin { + export function isMixedInto(model: any): model is Instance { return model && model.hasSearchProviderMixin; } } diff --git a/lib/ModelMixins/SearchProviders/WebFeatureServiceSearchProviderMixin.ts b/lib/ModelMixins/SearchProviders/WebFeatureServiceSearchProviderMixin.ts index c80a3d1abfa..ef81a3e1160 100644 --- a/lib/ModelMixins/SearchProviders/WebFeatureServiceSearchProviderMixin.ts +++ b/lib/ModelMixins/SearchProviders/WebFeatureServiceSearchProviderMixin.ts @@ -199,21 +199,19 @@ function WebFeatureServiceSearchProviderMixin< } namespace WebFeatureServiceSearchProviderMixin { - export interface WebFeatureServiceSearchProviderMixin + export interface Instance extends InstanceType< ReturnType > {} - export function isMixedInto( - model: any - ): model is WebFeatureServiceSearchProviderMixin { + export function isMixedInto(model: any): model is Instance { return model && model.isWebFeatureServiceSearchProviderMixin; } } export default WebFeatureServiceSearchProviderMixin; function createZoomToFunction( - model: WebFeatureServiceSearchProviderMixin.WebFeatureServiceSearchProviderMixin, + model: WebFeatureServiceSearchProviderMixin.Instance, location: any ) { // Server does not return information of a bounding box, just a location. diff --git a/lib/Models/SearchProviders/CatalogSearchProvider.ts b/lib/Models/SearchProviders/CatalogSearchProvider.ts index 920aa16101d..175a4600c1a 100644 --- a/lib/Models/SearchProviders/CatalogSearchProvider.ts +++ b/lib/Models/SearchProviders/CatalogSearchProvider.ts @@ -23,6 +23,7 @@ import Terria from "../Terria"; import SearchProviderResults from "./SearchProviderResults"; import SearchResult from "./SearchResult"; import isDefined from "../../Core/isDefined"; +import CatalogSearchProviderMixin from "../../ModelMixins/SearchProviders/CatalogSearchProviderMixin"; type UniqueIdString = string; type ResultMap = Map; @@ -115,7 +116,7 @@ export function loadAndSearchCatalogRecursively( }); } -export default class CatalogSearchProvider extends SearchProviderMixin( +export default class CatalogSearchProvider extends CatalogSearchProviderMixin( CreateModel(CatalogSearchProviderTraits) ) { static readonly type = "catalog-search-provider"; @@ -138,13 +139,6 @@ export default class CatalogSearchProvider extends SearchProviderMixin( return CatalogSearchProvider.type; } - @override get resultsAreReferences() { - return ( - isDefined(this.terria.catalogIndex?.loadPromise) && - fromPromise(this.terria.catalogIndex!.loadPromise).state === "fulfilled" - ); - } - protected logEvent(searchText: string) { this.terria.analytics?.logEvent( Category.search, diff --git a/lib/Models/SearchProviders/SearchProviderResults.ts b/lib/Models/SearchProviders/SearchProviderResults.ts index 6ddfb1cc9bb..1b2ce0cf6d0 100644 --- a/lib/Models/SearchProviders/SearchProviderResults.ts +++ b/lib/Models/SearchProviders/SearchProviderResults.ts @@ -16,9 +16,7 @@ export default class SearchProviderResults { Promise.resolve() ); - constructor( - readonly searchProvider: SearchProviderMixin.SearchProviderMixin - ) { + constructor(readonly searchProvider: SearchProviderMixin.Instance) { makeObservable(this); } diff --git a/lib/ReactViewModels/SearchState.ts b/lib/ReactViewModels/SearchState.ts index 1a64d95d20f..df12571996d 100644 --- a/lib/ReactViewModels/SearchState.ts +++ b/lib/ReactViewModels/SearchState.ts @@ -12,19 +12,20 @@ import SearchProviderMixin from "../ModelMixins/SearchProviders/SearchProviderMi import CatalogSearchProvider from "../Models/SearchProviders/CatalogSearchProvider"; import SearchProviderResults from "../Models/SearchProviders/SearchProviderResults"; import Terria from "../Models/Terria"; +import CatalogSearchProviderMixin from "../ModelMixins/SearchProviders/CatalogSearchProviderMixin"; interface SearchStateOptions { terria: Terria; - catalogSearchProvider?: CatalogSearchProvider; - locationSearchProviders?: LocationSearchProviderMixin.LocationSearchProviderMixin[]; + catalogSearchProvider?: CatalogSearchProviderMixin.Instance; + locationSearchProviders?: LocationSearchProviderMixin.Instance[]; } export default class SearchState { @observable - catalogSearchProvider: SearchProviderMixin.SearchProviderMixin | undefined; + catalogSearchProvider: CatalogSearchProviderMixin.Instance | undefined; @observable - locationSearchProviders: LocationSearchProviderMixin.LocationSearchProviderMixin[]; + locationSearchProviders: LocationSearchProviderMixin.Instance[]; @observable catalogSearchText: string = ""; @observable isWaitingToStartCatalogSearch: boolean = false; @@ -98,7 +99,7 @@ export default class SearchState { } @computed - get unifiedSearchProviders(): SearchProviderMixin.SearchProviderMixin[] { + get unifiedSearchProviders(): SearchProviderMixin.Instance[] { return filterOutUndefined([ this.catalogSearchProvider, ...this.locationSearchProviders diff --git a/lib/ReactViewModels/ViewState.ts b/lib/ReactViewModels/ViewState.ts index caaa9449bcf..360fa325e00 100644 --- a/lib/ReactViewModels/ViewState.ts +++ b/lib/ReactViewModels/ViewState.ts @@ -38,6 +38,8 @@ import { } from "./defaultTourPoints"; import DisclaimerHandler from "./DisclaimerHandler"; import SearchState from "./SearchState"; +import CatalogSearchProviderMixin from "../ModelMixins/SearchProviders/CatalogSearchProviderMixin"; +import LocationSearchProviderMixin from "../ModelMixins/SearchProviders/LocationSearchProviderMixin"; export const DATA_CATALOG_NAME = "data-catalog"; export const USER_DATA_NAME = "my-data"; @@ -48,8 +50,8 @@ export const WORKBENCH_RESIZE_ANIMATION_DURATION = 500; interface ViewStateOptions { terria: Terria; - catalogSearchProvider: any; - locationSearchProviders: any[]; + catalogSearchProvider: CatalogSearchProviderMixin.Instance | undefined; + locationSearchProviders: LocationSearchProviderMixin.Instance[]; errorHandlingProvider?: any; } diff --git a/lib/ReactViews/Search/LocationSearchResults.tsx b/lib/ReactViews/Search/LocationSearchResults.tsx index e3157571b87..1984b20a5b0 100644 --- a/lib/ReactViews/Search/LocationSearchResults.tsx +++ b/lib/ReactViews/Search/LocationSearchResults.tsx @@ -19,6 +19,7 @@ import { applyTranslationIfExists } from "../../Language/languageHelpers"; import LocationSearchProviderMixin from "../../ModelMixins/SearchProviders/LocationSearchProviderMixin"; import SearchProviderResults from "../../Models/SearchProviders/SearchProviderResults"; import Terria from "../../Models/Terria"; +import SearchResultModel from "../../Models/SearchProviders/SearchResult"; import ViewState from "../../ReactViewModels/ViewState"; import Box, { BoxSpan } from "../../Styled/Box"; import { RawButton } from "../../Styled/Button"; @@ -44,7 +45,7 @@ interface PropsType extends WithTranslation { isWaitingForSearchToStart: boolean; terria: Terria; search: SearchProviderResults; - onLocationClick: () => void; + onLocationClick: (result: SearchResultModel) => void; theme: DefaultTheme; locationSearchText: string; } @@ -98,8 +99,8 @@ class LocationSearchResults extends React.Component { render() { const { search } = this.props; - const searchProvider: LocationSearchProviderMixin.LocationSearchProviderMixin = - search.searchProvider as any; + const searchProvider: LocationSearchProviderMixin.Instance = + search.searchProvider as unknown as LocationSearchProviderMixin.Instance; const maxResults = searchProvider.recommendedListLength || 5; const validResults = this.validResults; @@ -144,7 +145,7 @@ class LocationSearchResults extends React.Component { isWaitingForSearchToStart={this.props.isWaitingForSearchToStart} />
    {{#terria.timeSeries.data}}{{terria.timeSeries.data}}{{/terria.timeSeries.data}}`; + template += `{{#terria.timeSeries.data}}{{terria.timeSeries.data}}{{/terria.timeSeries.data}}`; } return createStratumInstance(FeatureInfoTemplateTraits, { template }); diff --git a/test/Models/Catalog/SdmxJson/SdmxJsonCatalogItemSpec.ts b/test/Models/Catalog/SdmxJson/SdmxJsonCatalogItemSpec.ts index 538fc939f9e..73572efc595 100644 --- a/test/Models/Catalog/SdmxJson/SdmxJsonCatalogItemSpec.ts +++ b/test/Models/Catalog/SdmxJson/SdmxJsonCatalogItemSpec.ts @@ -264,6 +264,34 @@ describe("SdmxJsonCatalogItem", function () { ); }); + it("sets featureInfoTemplate with time-series chart", async function () { + runInAction(() => { + sdmxItem.setTrait("definition", "agencyId", "ABS"); + sdmxItem.setTrait("definition", "dataflowId", "RT"); + sdmxItem.setTrait("definition", "modelOverrides", [ + createStratumInstance(ModelOverrideTraits, { + id: "urn:sdmx:org.sdmx.infomodel.codelist.Codelist=ABS:CL_STATE(1.0.0)", + type: "region", + regionType: "STE_2016" + }) + ]); + }); + + await sdmxItem.regionProviderLists?.[0] + ?.getRegionProvider("STE_2016") + ?.loadRegionIDs(); + + await sdmxItem.loadMapItems(); + + expect(sdmxItem.mapItems.length).toBe(1); + + expect(sdmxItem.featureInfoTemplate).toBeDefined(); + expect(sdmxItem.featureInfoTemplate?.template).toContain(" Date: Thu, 14 Mar 2024 16:30:01 +1100 Subject: [PATCH 609/654] Bump version to 8.6.1 --- CHANGES.md | 7 +++++-- package.json | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 4afd825e8eb..ba852ff2410 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,10 +1,13 @@ # Change Log -#### next release (8.6.1) +#### next release (8.6.2) -- Fix SDMX `featureInfoTemplate` `` bug not showing correct `yColumn` - [The next improvement] +#### 8.6.1 - 2024-03-14 + +- Fix SDMX `featureInfoTemplate` `` bug not showing correct `yColumn` + #### 8.6.0 - 2024-03-12 - **Breaking changes:** diff --git a/package.json b/package.json index d665a0d8250..520459e1f73 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "terriajs", - "version": "8.6.0", + "version": "8.6.1", "description": "Geospatial data visualization platform.", "license": "Apache-2.0", "engines": { From 36527c83399522e7268d3dcd2792736c6306e496 Mon Sep 17 00:00:00 2001 From: Stephen Davies Date: Fri, 15 Mar 2024 01:30:01 +1100 Subject: [PATCH 610/654] Update attributions --- doc/acknowledgements/attributions.md | 7582 +++++++++++++++++--------- 1 file changed, 4937 insertions(+), 2645 deletions(-) diff --git a/doc/acknowledgements/attributions.md b/doc/acknowledgements/attributions.md index 257841e3d6b..96e4dc2448b 100644 --- a/doc/acknowledgements/attributions.md +++ b/doc/acknowledgements/attributions.md @@ -2,7 +2,213 @@ THE FOLLOWING SETS FORTH ATTRIBUTION NOTICES FOR THIRD PARTY SOFTWARE THAT MAY B ----- -The following software may be included in this product: @babel/code-frame, @babel/compat-data, @babel/core, @babel/eslint-parser, @babel/generator, @babel/helper-annotate-as-pure, @babel/helper-builder-binary-assignment-operator-visitor, @babel/helper-compilation-targets, @babel/helper-create-class-features-plugin, @babel/helper-create-regexp-features-plugin, @babel/helper-environment-visitor, @babel/helper-explode-assignable-expression, @babel/helper-function-name, @babel/helper-get-function-arity, @babel/helper-hoist-variables, @babel/helper-member-expression-to-functions, @babel/helper-module-imports, @babel/helper-module-transforms, @babel/helper-optimise-call-expression, @babel/helper-plugin-utils, @babel/helper-remap-async-to-generator, @babel/helper-replace-supers, @babel/helper-simple-access, @babel/helper-skip-transparent-expression-wrappers, @babel/helper-split-export-declaration, @babel/helper-string-parser, @babel/helper-validator-identifier, @babel/helper-validator-option, @babel/helper-wrap-function, @babel/helpers, @babel/highlight, @babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression, @babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining, @babel/plugin-proposal-async-generator-functions, @babel/plugin-proposal-class-properties, @babel/plugin-proposal-class-static-block, @babel/plugin-proposal-decorators, @babel/plugin-proposal-dynamic-import, @babel/plugin-proposal-export-namespace-from, @babel/plugin-proposal-json-strings, @babel/plugin-proposal-logical-assignment-operators, @babel/plugin-proposal-nullish-coalescing-operator, @babel/plugin-proposal-numeric-separator, @babel/plugin-proposal-object-rest-spread, @babel/plugin-proposal-optional-catch-binding, @babel/plugin-proposal-optional-chaining, @babel/plugin-proposal-private-methods, @babel/plugin-proposal-private-property-in-object, @babel/plugin-proposal-unicode-property-regex, @babel/plugin-syntax-async-generators, @babel/plugin-syntax-class-properties, @babel/plugin-syntax-class-static-block, @babel/plugin-syntax-decorators, @babel/plugin-syntax-dynamic-import, @babel/plugin-syntax-export-namespace-from, @babel/plugin-syntax-json-strings, @babel/plugin-syntax-jsx, @babel/plugin-syntax-logical-assignment-operators, @babel/plugin-syntax-nullish-coalescing-operator, @babel/plugin-syntax-numeric-separator, @babel/plugin-syntax-object-rest-spread, @babel/plugin-syntax-optional-catch-binding, @babel/plugin-syntax-optional-chaining, @babel/plugin-syntax-private-property-in-object, @babel/plugin-syntax-top-level-await, @babel/plugin-syntax-typescript, @babel/plugin-transform-arrow-functions, @babel/plugin-transform-async-to-generator, @babel/plugin-transform-block-scoped-functions, @babel/plugin-transform-block-scoping, @babel/plugin-transform-classes, @babel/plugin-transform-computed-properties, @babel/plugin-transform-destructuring, @babel/plugin-transform-dotall-regex, @babel/plugin-transform-duplicate-keys, @babel/plugin-transform-exponentiation-operator, @babel/plugin-transform-for-of, @babel/plugin-transform-function-name, @babel/plugin-transform-literals, @babel/plugin-transform-member-expression-literals, @babel/plugin-transform-modules-amd, @babel/plugin-transform-modules-commonjs, @babel/plugin-transform-modules-systemjs, @babel/plugin-transform-modules-umd, @babel/plugin-transform-named-capturing-groups-regex, @babel/plugin-transform-new-target, @babel/plugin-transform-object-super, @babel/plugin-transform-parameters, @babel/plugin-transform-property-literals, @babel/plugin-transform-react-display-name, @babel/plugin-transform-react-jsx, @babel/plugin-transform-react-jsx-development, @babel/plugin-transform-react-pure-annotations, @babel/plugin-transform-regenerator, @babel/plugin-transform-reserved-words, @babel/plugin-transform-shorthand-properties, @babel/plugin-transform-spread, @babel/plugin-transform-sticky-regex, @babel/plugin-transform-template-literals, @babel/plugin-transform-typeof-symbol, @babel/plugin-transform-typescript, @babel/plugin-transform-unicode-escapes, @babel/plugin-transform-unicode-regex, @babel/preset-env, @babel/preset-react, @babel/preset-typescript, @babel/runtime, @babel/template, @babel/traverse, @babel/types. A copy of the source code may be downloaded from https://github.com/babel/babel.git (@babel/code-frame), https://github.com/babel/babel.git (@babel/compat-data), https://github.com/babel/babel.git (@babel/core), https://github.com/babel/babel.git (@babel/eslint-parser), https://github.com/babel/babel.git (@babel/generator), https://github.com/babel/babel.git (@babel/helper-annotate-as-pure), https://github.com/babel/babel.git (@babel/helper-builder-binary-assignment-operator-visitor), https://github.com/babel/babel.git (@babel/helper-compilation-targets), https://github.com/babel/babel.git (@babel/helper-create-class-features-plugin), https://github.com/babel/babel.git (@babel/helper-create-regexp-features-plugin), https://github.com/babel/babel.git (@babel/helper-environment-visitor), https://github.com/babel/babel.git (@babel/helper-explode-assignable-expression), https://github.com/babel/babel.git (@babel/helper-function-name), https://github.com/babel/babel.git (@babel/helper-get-function-arity), https://github.com/babel/babel.git (@babel/helper-hoist-variables), https://github.com/babel/babel.git (@babel/helper-member-expression-to-functions), https://github.com/babel/babel.git (@babel/helper-module-imports), https://github.com/babel/babel.git (@babel/helper-module-transforms), https://github.com/babel/babel.git (@babel/helper-optimise-call-expression), https://github.com/babel/babel.git (@babel/helper-plugin-utils), https://github.com/babel/babel.git (@babel/helper-remap-async-to-generator), https://github.com/babel/babel.git (@babel/helper-replace-supers), https://github.com/babel/babel.git (@babel/helper-simple-access), https://github.com/babel/babel.git (@babel/helper-skip-transparent-expression-wrappers), https://github.com/babel/babel.git (@babel/helper-split-export-declaration), https://github.com/babel/babel.git (@babel/helper-string-parser), https://github.com/babel/babel.git (@babel/helper-validator-identifier), https://github.com/babel/babel.git (@babel/helper-validator-option), https://github.com/babel/babel.git (@babel/helper-wrap-function), https://github.com/babel/babel.git (@babel/helpers), https://github.com/babel/babel.git (@babel/highlight), https://github.com/babel/babel.git (@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression), https://github.com/babel/babel.git (@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining), https://github.com/babel/babel.git (@babel/plugin-proposal-async-generator-functions), https://github.com/babel/babel.git (@babel/plugin-proposal-class-properties), https://github.com/babel/babel.git (@babel/plugin-proposal-class-static-block), https://github.com/babel/babel.git (@babel/plugin-proposal-decorators), https://github.com/babel/babel.git (@babel/plugin-proposal-dynamic-import), https://github.com/babel/babel.git (@babel/plugin-proposal-export-namespace-from), https://github.com/babel/babel.git (@babel/plugin-proposal-json-strings), https://github.com/babel/babel.git (@babel/plugin-proposal-logical-assignment-operators), https://github.com/babel/babel.git (@babel/plugin-proposal-nullish-coalescing-operator), https://github.com/babel/babel.git (@babel/plugin-proposal-numeric-separator), https://github.com/babel/babel.git (@babel/plugin-proposal-object-rest-spread), https://github.com/babel/babel.git (@babel/plugin-proposal-optional-catch-binding), https://github.com/babel/babel.git (@babel/plugin-proposal-optional-chaining), https://github.com/babel/babel.git (@babel/plugin-proposal-private-methods), https://github.com/babel/babel.git (@babel/plugin-proposal-private-property-in-object), https://github.com/babel/babel.git (@babel/plugin-proposal-unicode-property-regex), https://github.com/babel/babel/tree/master/packages/babel-plugin-syntax-async-generators (@babel/plugin-syntax-async-generators), https://github.com/babel/babel.git (@babel/plugin-syntax-class-properties), https://github.com/babel/babel.git (@babel/plugin-syntax-class-static-block), https://github.com/babel/babel.git (@babel/plugin-syntax-decorators), https://github.com/babel/babel/tree/master/packages/babel-plugin-syntax-dynamic-import (@babel/plugin-syntax-dynamic-import), https://github.com/babel/babel/tree/master/packages/babel-plugin-syntax-export-namespace-from (@babel/plugin-syntax-export-namespace-from), https://github.com/babel/babel/tree/master/packages/babel-plugin-syntax-json-strings (@babel/plugin-syntax-json-strings), https://github.com/babel/babel.git (@babel/plugin-syntax-jsx), https://github.com/babel/babel.git (@babel/plugin-syntax-logical-assignment-operators), https://github.com/babel/babel/tree/master/packages/babel-plugin-syntax-nullish-coalescing-operator (@babel/plugin-syntax-nullish-coalescing-operator), https://github.com/babel/babel.git (@babel/plugin-syntax-numeric-separator), https://github.com/babel/babel/tree/master/packages/babel-plugin-syntax-object-rest-spread (@babel/plugin-syntax-object-rest-spread), https://github.com/babel/babel/tree/master/packages/babel-plugin-syntax-optional-catch-binding (@babel/plugin-syntax-optional-catch-binding), https://github.com/babel/babel/tree/master/packages/babel-plugin-syntax-optional-chaining (@babel/plugin-syntax-optional-chaining), https://github.com/babel/babel.git (@babel/plugin-syntax-private-property-in-object), https://github.com/babel/babel.git (@babel/plugin-syntax-top-level-await), https://github.com/babel/babel.git (@babel/plugin-syntax-typescript), https://github.com/babel/babel.git (@babel/plugin-transform-arrow-functions), https://github.com/babel/babel.git (@babel/plugin-transform-async-to-generator), https://github.com/babel/babel.git (@babel/plugin-transform-block-scoped-functions), https://github.com/babel/babel.git (@babel/plugin-transform-block-scoping), https://github.com/babel/babel.git (@babel/plugin-transform-classes), https://github.com/babel/babel.git (@babel/plugin-transform-computed-properties), https://github.com/babel/babel.git (@babel/plugin-transform-destructuring), https://github.com/babel/babel.git (@babel/plugin-transform-dotall-regex), https://github.com/babel/babel.git (@babel/plugin-transform-duplicate-keys), https://github.com/babel/babel.git (@babel/plugin-transform-exponentiation-operator), https://github.com/babel/babel.git (@babel/plugin-transform-for-of), https://github.com/babel/babel.git (@babel/plugin-transform-function-name), https://github.com/babel/babel.git (@babel/plugin-transform-literals), https://github.com/babel/babel.git (@babel/plugin-transform-member-expression-literals), https://github.com/babel/babel.git (@babel/plugin-transform-modules-amd), https://github.com/babel/babel.git (@babel/plugin-transform-modules-commonjs), https://github.com/babel/babel.git (@babel/plugin-transform-modules-systemjs), https://github.com/babel/babel.git (@babel/plugin-transform-modules-umd), https://github.com/babel/babel.git (@babel/plugin-transform-named-capturing-groups-regex), https://github.com/babel/babel.git (@babel/plugin-transform-new-target), https://github.com/babel/babel.git (@babel/plugin-transform-object-super), https://github.com/babel/babel.git (@babel/plugin-transform-parameters), https://github.com/babel/babel.git (@babel/plugin-transform-property-literals), https://github.com/babel/babel.git (@babel/plugin-transform-react-display-name), https://github.com/babel/babel.git (@babel/plugin-transform-react-jsx), https://github.com/babel/babel.git (@babel/plugin-transform-react-jsx-development), https://github.com/babel/babel.git (@babel/plugin-transform-react-pure-annotations), https://github.com/babel/babel.git (@babel/plugin-transform-regenerator), https://github.com/babel/babel.git (@babel/plugin-transform-reserved-words), https://github.com/babel/babel.git (@babel/plugin-transform-shorthand-properties), https://github.com/babel/babel.git (@babel/plugin-transform-spread), https://github.com/babel/babel.git (@babel/plugin-transform-sticky-regex), https://github.com/babel/babel.git (@babel/plugin-transform-template-literals), https://github.com/babel/babel.git (@babel/plugin-transform-typeof-symbol), https://github.com/babel/babel.git (@babel/plugin-transform-typescript), https://github.com/babel/babel.git (@babel/plugin-transform-unicode-escapes), https://github.com/babel/babel.git (@babel/plugin-transform-unicode-regex), https://github.com/babel/babel.git (@babel/preset-env), https://github.com/babel/babel.git (@babel/preset-react), https://github.com/babel/babel.git (@babel/preset-typescript), https://github.com/babel/babel.git (@babel/runtime), https://github.com/babel/babel.git (@babel/template), https://github.com/babel/babel.git (@babel/traverse), https://github.com/babel/babel.git (@babel/types). This software contains the following license and notice below: +The following software may be included in this product: @ampproject/remapping, @xtuc/long, long, spdx-correct, validate-npm-package-license. A copy of the source code may be downloaded from git+https://github.com/ampproject/remapping.git (@ampproject/remapping), https://github.com/dcodeIO/long.js.git (@xtuc/long), https://github.com/dcodeIO/long.js.git (long), https://github.com/jslicense/spdx-correct.js.git (spdx-correct), https://github.com/kemitchell/validate-npm-package-license.js.git (validate-npm-package-license). This software contains the following license and notice below: + +Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +----- + +The following software may be included in this product: @babel/code-frame, @babel/compat-data, @babel/core, @babel/eslint-parser, @babel/generator, @babel/helper-annotate-as-pure, @babel/helper-builder-binary-assignment-operator-visitor, @babel/helper-compilation-targets, @babel/helper-create-class-features-plugin, @babel/helper-create-regexp-features-plugin, @babel/helper-environment-visitor, @babel/helper-function-name, @babel/helper-hoist-variables, @babel/helper-member-expression-to-functions, @babel/helper-module-imports, @babel/helper-module-transforms, @babel/helper-optimise-call-expression, @babel/helper-plugin-utils, @babel/helper-remap-async-to-generator, @babel/helper-replace-supers, @babel/helper-simple-access, @babel/helper-skip-transparent-expression-wrappers, @babel/helper-split-export-declaration, @babel/helper-string-parser, @babel/helper-validator-identifier, @babel/helper-validator-option, @babel/helper-wrap-function, @babel/helpers, @babel/highlight, @babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression, @babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining, @babel/plugin-bugfix-v8-static-class-fields-redefine-readonly, @babel/plugin-proposal-class-properties, @babel/plugin-proposal-decorators, @babel/plugin-proposal-object-rest-spread, @babel/plugin-proposal-private-property-in-object, @babel/plugin-syntax-async-generators, @babel/plugin-syntax-class-properties, @babel/plugin-syntax-class-static-block, @babel/plugin-syntax-decorators, @babel/plugin-syntax-dynamic-import, @babel/plugin-syntax-export-namespace-from, @babel/plugin-syntax-import-assertions, @babel/plugin-syntax-import-attributes, @babel/plugin-syntax-import-meta, @babel/plugin-syntax-json-strings, @babel/plugin-syntax-jsx, @babel/plugin-syntax-logical-assignment-operators, @babel/plugin-syntax-nullish-coalescing-operator, @babel/plugin-syntax-numeric-separator, @babel/plugin-syntax-object-rest-spread, @babel/plugin-syntax-optional-catch-binding, @babel/plugin-syntax-optional-chaining, @babel/plugin-syntax-private-property-in-object, @babel/plugin-syntax-top-level-await, @babel/plugin-syntax-typescript, @babel/plugin-syntax-unicode-sets-regex, @babel/plugin-transform-arrow-functions, @babel/plugin-transform-async-generator-functions, @babel/plugin-transform-async-to-generator, @babel/plugin-transform-block-scoped-functions, @babel/plugin-transform-block-scoping, @babel/plugin-transform-class-properties, @babel/plugin-transform-class-static-block, @babel/plugin-transform-classes, @babel/plugin-transform-computed-properties, @babel/plugin-transform-destructuring, @babel/plugin-transform-dotall-regex, @babel/plugin-transform-duplicate-keys, @babel/plugin-transform-dynamic-import, @babel/plugin-transform-exponentiation-operator, @babel/plugin-transform-export-namespace-from, @babel/plugin-transform-for-of, @babel/plugin-transform-function-name, @babel/plugin-transform-json-strings, @babel/plugin-transform-literals, @babel/plugin-transform-logical-assignment-operators, @babel/plugin-transform-member-expression-literals, @babel/plugin-transform-modules-amd, @babel/plugin-transform-modules-commonjs, @babel/plugin-transform-modules-systemjs, @babel/plugin-transform-modules-umd, @babel/plugin-transform-named-capturing-groups-regex, @babel/plugin-transform-new-target, @babel/plugin-transform-nullish-coalescing-operator, @babel/plugin-transform-numeric-separator, @babel/plugin-transform-object-rest-spread, @babel/plugin-transform-object-super, @babel/plugin-transform-optional-catch-binding, @babel/plugin-transform-optional-chaining, @babel/plugin-transform-parameters, @babel/plugin-transform-private-methods, @babel/plugin-transform-private-property-in-object, @babel/plugin-transform-property-literals, @babel/plugin-transform-react-display-name, @babel/plugin-transform-react-jsx, @babel/plugin-transform-react-jsx-development, @babel/plugin-transform-react-pure-annotations, @babel/plugin-transform-regenerator, @babel/plugin-transform-reserved-words, @babel/plugin-transform-shorthand-properties, @babel/plugin-transform-spread, @babel/plugin-transform-sticky-regex, @babel/plugin-transform-template-literals, @babel/plugin-transform-typeof-symbol, @babel/plugin-transform-typescript, @babel/plugin-transform-unicode-escapes, @babel/plugin-transform-unicode-property-regex, @babel/plugin-transform-unicode-regex, @babel/plugin-transform-unicode-sets-regex, @babel/preset-env, @babel/preset-react, @babel/preset-typescript, @babel/runtime, @babel/template, @babel/traverse, @babel/types. A copy of the source code may be downloaded from https://github.com/babel/babel.git (@babel/code-frame), https://github.com/babel/babel.git (@babel/compat-data), https://github.com/babel/babel.git (@babel/core), https://github.com/babel/babel.git (@babel/eslint-parser), https://github.com/babel/babel.git (@babel/generator), https://github.com/babel/babel.git (@babel/helper-annotate-as-pure), https://github.com/babel/babel.git (@babel/helper-builder-binary-assignment-operator-visitor), https://github.com/babel/babel.git (@babel/helper-compilation-targets), https://github.com/babel/babel.git (@babel/helper-create-class-features-plugin), https://github.com/babel/babel.git (@babel/helper-create-regexp-features-plugin), https://github.com/babel/babel.git (@babel/helper-environment-visitor), https://github.com/babel/babel.git (@babel/helper-function-name), https://github.com/babel/babel.git (@babel/helper-hoist-variables), https://github.com/babel/babel.git (@babel/helper-member-expression-to-functions), https://github.com/babel/babel.git (@babel/helper-module-imports), https://github.com/babel/babel.git (@babel/helper-module-transforms), https://github.com/babel/babel.git (@babel/helper-optimise-call-expression), https://github.com/babel/babel.git (@babel/helper-plugin-utils), https://github.com/babel/babel.git (@babel/helper-remap-async-to-generator), https://github.com/babel/babel.git (@babel/helper-replace-supers), https://github.com/babel/babel.git (@babel/helper-simple-access), https://github.com/babel/babel.git (@babel/helper-skip-transparent-expression-wrappers), https://github.com/babel/babel.git (@babel/helper-split-export-declaration), https://github.com/babel/babel.git (@babel/helper-string-parser), https://github.com/babel/babel.git (@babel/helper-validator-identifier), https://github.com/babel/babel.git (@babel/helper-validator-option), https://github.com/babel/babel.git (@babel/helper-wrap-function), https://github.com/babel/babel.git (@babel/helpers), https://github.com/babel/babel.git (@babel/highlight), https://github.com/babel/babel.git (@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression), https://github.com/babel/babel.git (@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining), https://github.com/babel/babel.git (@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly), https://github.com/babel/babel.git (@babel/plugin-proposal-class-properties), https://github.com/babel/babel.git (@babel/plugin-proposal-decorators), https://github.com/babel/babel.git (@babel/plugin-proposal-object-rest-spread), https://github.com/babel/babel-plugin-proposal-private-property-in-object.git (@babel/plugin-proposal-private-property-in-object), https://github.com/babel/babel/tree/master/packages/babel-plugin-syntax-async-generators (@babel/plugin-syntax-async-generators), https://github.com/babel/babel.git (@babel/plugin-syntax-class-properties), https://github.com/babel/babel.git (@babel/plugin-syntax-class-static-block), https://github.com/babel/babel.git (@babel/plugin-syntax-decorators), https://github.com/babel/babel/tree/master/packages/babel-plugin-syntax-dynamic-import (@babel/plugin-syntax-dynamic-import), https://github.com/babel/babel/tree/master/packages/babel-plugin-syntax-export-namespace-from (@babel/plugin-syntax-export-namespace-from), https://github.com/babel/babel.git (@babel/plugin-syntax-import-assertions), https://github.com/babel/babel.git (@babel/plugin-syntax-import-attributes), https://github.com/babel/babel.git (@babel/plugin-syntax-import-meta), https://github.com/babel/babel/tree/master/packages/babel-plugin-syntax-json-strings (@babel/plugin-syntax-json-strings), https://github.com/babel/babel.git (@babel/plugin-syntax-jsx), https://github.com/babel/babel.git (@babel/plugin-syntax-logical-assignment-operators), https://github.com/babel/babel/tree/master/packages/babel-plugin-syntax-nullish-coalescing-operator (@babel/plugin-syntax-nullish-coalescing-operator), https://github.com/babel/babel.git (@babel/plugin-syntax-numeric-separator), https://github.com/babel/babel/tree/master/packages/babel-plugin-syntax-object-rest-spread (@babel/plugin-syntax-object-rest-spread), https://github.com/babel/babel/tree/master/packages/babel-plugin-syntax-optional-catch-binding (@babel/plugin-syntax-optional-catch-binding), https://github.com/babel/babel/tree/master/packages/babel-plugin-syntax-optional-chaining (@babel/plugin-syntax-optional-chaining), https://github.com/babel/babel.git (@babel/plugin-syntax-private-property-in-object), https://github.com/babel/babel.git (@babel/plugin-syntax-top-level-await), https://github.com/babel/babel.git (@babel/plugin-syntax-typescript), https://github.com/babel/babel.git (@babel/plugin-syntax-unicode-sets-regex), https://github.com/babel/babel.git (@babel/plugin-transform-arrow-functions), https://github.com/babel/babel.git (@babel/plugin-transform-async-generator-functions), https://github.com/babel/babel.git (@babel/plugin-transform-async-to-generator), https://github.com/babel/babel.git (@babel/plugin-transform-block-scoped-functions), https://github.com/babel/babel.git (@babel/plugin-transform-block-scoping), https://github.com/babel/babel.git (@babel/plugin-transform-class-properties), https://github.com/babel/babel.git (@babel/plugin-transform-class-static-block), https://github.com/babel/babel.git (@babel/plugin-transform-classes), https://github.com/babel/babel.git (@babel/plugin-transform-computed-properties), https://github.com/babel/babel.git (@babel/plugin-transform-destructuring), https://github.com/babel/babel.git (@babel/plugin-transform-dotall-regex), https://github.com/babel/babel.git (@babel/plugin-transform-duplicate-keys), https://github.com/babel/babel.git (@babel/plugin-transform-dynamic-import), https://github.com/babel/babel.git (@babel/plugin-transform-exponentiation-operator), https://github.com/babel/babel.git (@babel/plugin-transform-export-namespace-from), https://github.com/babel/babel.git (@babel/plugin-transform-for-of), https://github.com/babel/babel.git (@babel/plugin-transform-function-name), https://github.com/babel/babel.git (@babel/plugin-transform-json-strings), https://github.com/babel/babel.git (@babel/plugin-transform-literals), https://github.com/babel/babel.git (@babel/plugin-transform-logical-assignment-operators), https://github.com/babel/babel.git (@babel/plugin-transform-member-expression-literals), https://github.com/babel/babel.git (@babel/plugin-transform-modules-amd), https://github.com/babel/babel.git (@babel/plugin-transform-modules-commonjs), https://github.com/babel/babel.git (@babel/plugin-transform-modules-systemjs), https://github.com/babel/babel.git (@babel/plugin-transform-modules-umd), https://github.com/babel/babel.git (@babel/plugin-transform-named-capturing-groups-regex), https://github.com/babel/babel.git (@babel/plugin-transform-new-target), https://github.com/babel/babel.git (@babel/plugin-transform-nullish-coalescing-operator), https://github.com/babel/babel.git (@babel/plugin-transform-numeric-separator), https://github.com/babel/babel.git (@babel/plugin-transform-object-rest-spread), https://github.com/babel/babel.git (@babel/plugin-transform-object-super), https://github.com/babel/babel.git (@babel/plugin-transform-optional-catch-binding), https://github.com/babel/babel.git (@babel/plugin-transform-optional-chaining), https://github.com/babel/babel.git (@babel/plugin-transform-parameters), https://github.com/babel/babel.git (@babel/plugin-transform-private-methods), https://github.com/babel/babel.git (@babel/plugin-transform-private-property-in-object), https://github.com/babel/babel.git (@babel/plugin-transform-property-literals), https://github.com/babel/babel.git (@babel/plugin-transform-react-display-name), https://github.com/babel/babel.git (@babel/plugin-transform-react-jsx), https://github.com/babel/babel.git (@babel/plugin-transform-react-jsx-development), https://github.com/babel/babel.git (@babel/plugin-transform-react-pure-annotations), https://github.com/babel/babel.git (@babel/plugin-transform-regenerator), https://github.com/babel/babel.git (@babel/plugin-transform-reserved-words), https://github.com/babel/babel.git (@babel/plugin-transform-shorthand-properties), https://github.com/babel/babel.git (@babel/plugin-transform-spread), https://github.com/babel/babel.git (@babel/plugin-transform-sticky-regex), https://github.com/babel/babel.git (@babel/plugin-transform-template-literals), https://github.com/babel/babel.git (@babel/plugin-transform-typeof-symbol), https://github.com/babel/babel.git (@babel/plugin-transform-typescript), https://github.com/babel/babel.git (@babel/plugin-transform-unicode-escapes), https://github.com/babel/babel.git (@babel/plugin-transform-unicode-property-regex), https://github.com/babel/babel.git (@babel/plugin-transform-unicode-regex), https://github.com/babel/babel.git (@babel/plugin-transform-unicode-sets-regex), https://github.com/babel/babel.git (@babel/preset-env), https://github.com/babel/babel.git (@babel/preset-react), https://github.com/babel/babel.git (@babel/preset-typescript), https://github.com/babel/babel.git (@babel/runtime), https://github.com/babel/babel.git (@babel/template), https://github.com/babel/babel.git (@babel/traverse), https://github.com/babel/babel.git (@babel/types). This software contains the following license and notice below: MIT License @@ -132,6 +338,32 @@ SOFTWARE. ----- +The following software may be included in this product: @eslint-community/eslint-utils, @eslint-community/regexpp, eslint-utils, regexpp. A copy of the source code may be downloaded from https://github.com/eslint-community/eslint-utils (@eslint-community/eslint-utils), https://github.com/eslint-community/regexpp (@eslint-community/regexpp), git+https://github.com/mysticatea/eslint-utils.git (eslint-utils), git+https://github.com/mysticatea/regexpp.git (regexpp). This software contains the following license and notice below: + +MIT License + +Copyright (c) 2018 Toru Nagashima + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +----- + The following software may be included in this product: @eslint/eslintrc. A copy of the source code may be downloaded from https://github.com/eslint/eslintrc.git. This software contains the following license and notice below: MIT License @@ -438,21 +670,119 @@ SOFTWARE. ----- -The following software may be included in this product: @juggle/resize-observer. A copy of the source code may be downloaded from git+ssh://git@github.com/juggle/resize-observer.git. This software contains the following license and notice below: +The following software may be included in this product: @jridgewell/gen-mapping, @jridgewell/set-array. A copy of the source code may be downloaded from https://github.com/jridgewell/gen-mapping (@jridgewell/gen-mapping), https://github.com/jridgewell/set-array (@jridgewell/set-array). This software contains the following license and notice below: -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ +Copyright 2022 Justin Ridgewell - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - 1. Definitions. +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. +----- + +The following software may be included in this product: @jridgewell/resolve-uri. A copy of the source code may be downloaded from https://github.com/jridgewell/resolve-uri. This software contains the following license and notice below: + +Copyright 2019 Justin Ridgewell + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +----- + +The following software may be included in this product: @jridgewell/sourcemap-codec. A copy of the source code may be downloaded from git+https://github.com/jridgewell/sourcemap-codec.git. This software contains the following license and notice below: + +The MIT License + +Copyright (c) 2015 Rich Harris + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +----- + +The following software may be included in this product: @jridgewell/trace-mapping. A copy of the source code may be downloaded from git+https://github.com/jridgewell/trace-mapping.git. This software contains the following license and notice below: + +Copyright 2022 Justin Ridgewell + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +----- + +The following software may be included in this product: @juggle/resize-observer. A copy of the source code may be downloaded from git+ssh://git@github.com/juggle/resize-observer.git. This software contains the following license and notice below: + +Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common @@ -729,6 +1059,18 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ----- +The following software may be included in this product: @nicolo-ribaudo/eslint-scope-5-internals. This software contains the following license and notice below: + +Copyright 2022 Nicolò Ribaudo + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +----- + The following software may be included in this product: @nodelib/fs.scandir, @nodelib/fs.stat, @nodelib/fs.walk, fast-glob. A copy of the source code may be downloaded from https://github.com/nodelib/nodelib/tree/master/packages/fs/fs.scandir (@nodelib/fs.scandir), https://github.com/nodelib/nodelib/tree/master/packages/fs/fs.stat (@nodelib/fs.stat), https://github.com/nodelib/nodelib/tree/master/packages/fs/fs.walk (@nodelib/fs.walk), https://github.com/mrmlnc/fast-glob.git (fast-glob). This software contains the following license and notice below: The MIT License (MIT) @@ -807,7 +1149,64 @@ DEALINGS IN THE SOFTWARE. ----- -The following software may be included in this product: @sindresorhus/is, escape-string-regexp, find-cache-dir, globals, import-fresh, is-docker, map-obj, meow, p-limit, p-map, parse-json, strip-json-comments, yocto-queue. A copy of the source code may be downloaded from https://github.com/sindresorhus/is.git (@sindresorhus/is), https://github.com/sindresorhus/escape-string-regexp.git (escape-string-regexp), https://github.com/avajs/find-cache-dir.git (find-cache-dir), https://github.com/sindresorhus/globals.git (globals), https://github.com/sindresorhus/import-fresh.git (import-fresh), https://github.com/sindresorhus/is-docker.git (is-docker), https://github.com/sindresorhus/map-obj.git (map-obj), https://github.com/sindresorhus/meow.git (meow), https://github.com/sindresorhus/p-limit.git (p-limit), https://github.com/sindresorhus/p-map.git (p-map), https://github.com/sindresorhus/parse-json.git (parse-json), https://github.com/sindresorhus/strip-json-comments.git (strip-json-comments), https://github.com/sindresorhus/yocto-queue.git (yocto-queue). This software contains the following license and notice below: +The following software may be included in this product: @open-wc/webpack-import-meta-loader. A copy of the source code may be downloaded from https://github.com/open-wc/open-wc.git. This software contains the following license and notice below: + +MIT License + +Copyright (c) 2018 open-wc + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +----- + +The following software may be included in this product: @protobufjs/aspromise, @protobufjs/base64, @protobufjs/codegen, @protobufjs/eventemitter, @protobufjs/fetch, @protobufjs/float, @protobufjs/inquire, @protobufjs/path, @protobufjs/pool, @protobufjs/utf8. A copy of the source code may be downloaded from https://github.com/dcodeIO/protobuf.js.git (@protobufjs/aspromise), https://github.com/dcodeIO/protobuf.js.git (@protobufjs/base64), https://github.com/dcodeIO/protobuf.js.git (@protobufjs/codegen), https://github.com/dcodeIO/protobuf.js.git (@protobufjs/eventemitter), https://github.com/dcodeIO/protobuf.js.git (@protobufjs/fetch), https://github.com/dcodeIO/protobuf.js.git (@protobufjs/float), https://github.com/dcodeIO/protobuf.js.git (@protobufjs/inquire), https://github.com/dcodeIO/protobuf.js.git (@protobufjs/path), https://github.com/dcodeIO/protobuf.js.git (@protobufjs/pool), https://github.com/dcodeIO/protobuf.js.git (@protobufjs/utf8). This software contains the following license and notice below: + +Copyright (c) 2016, Daniel Wirtz All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +* Neither the name of its author, nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +----- + +The following software may be included in this product: @sindresorhus/is, escape-string-regexp, find-cache-dir, globals, import-fresh, is-docker, p-limit, p-map, parse-json, strip-json-comments, yocto-queue. A copy of the source code may be downloaded from https://github.com/sindresorhus/is.git (@sindresorhus/is), https://github.com/sindresorhus/escape-string-regexp.git (escape-string-regexp), https://github.com/avajs/find-cache-dir.git (find-cache-dir), https://github.com/sindresorhus/globals.git (globals), https://github.com/sindresorhus/import-fresh.git (import-fresh), https://github.com/sindresorhus/is-docker.git (is-docker), https://github.com/sindresorhus/p-limit.git (p-limit), https://github.com/sindresorhus/p-map.git (p-map), https://github.com/sindresorhus/parse-json.git (parse-json), https://github.com/sindresorhus/strip-json-comments.git (strip-json-comments), https://github.com/sindresorhus/yocto-queue.git (yocto-queue). This software contains the following license and notice below: MIT License @@ -872,7 +1271,35 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----- -The following software may be included in this product: @types/arcgis-rest-api, @types/css-font-loading-module, @types/d3-array, @types/d3-axis, @types/d3-color, @types/d3-interpolate, @types/d3-path, @types/d3-scale, @types/d3-scale-chromatic, @types/d3-selection, @types/d3-shape, @types/d3-time, @types/d3-transition, @types/dompurify, @types/flexsearch, @types/geojson, @types/glob, @types/jasmine, @types/jasmine-ajax, @types/json-schema, @types/leaflet, @types/lodash, @types/lodash-es, @types/math-expression-evaluator, @types/minimatch, @types/minimist, @types/node, @types/node-fetch, @types/normalize-package-data, @types/prop-types, @types/rc-slider, @types/rc-tooltip, @types/react, @types/react-color, @types/react-dom, @types/react-select, @types/react-test-renderer, @types/react-transition-group, @types/reactcss, @types/retry, @types/scheduler, @types/shpjs, @types/styled-components, @types/tapable, @types/trusted-types, @types/uglify-js, @types/webpack, @types/webpack-sources. A copy of the source code may be downloaded from https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/arcgis-rest-api), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/css-font-loading-module), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/d3-array), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/d3-axis), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/d3-color), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/d3-interpolate), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/d3-path), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/d3-scale), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/d3-scale-chromatic), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/d3-selection), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/d3-shape), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/d3-time), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/d3-transition), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/dompurify), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/flexsearch), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/geojson), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/glob), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/jasmine), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/jasmine-ajax), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/json-schema), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/leaflet), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/lodash), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/lodash-es), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/math-expression-evaluator), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/minimatch), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/minimist), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/node), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/node-fetch), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/normalize-package-data), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/prop-types), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/rc-slider), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/rc-tooltip), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/react), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/react-color), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/react-dom), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/react-select), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/react-test-renderer), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/react-transition-group), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/reactcss), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/retry), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/scheduler), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/shpjs), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/styled-components), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/tapable), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/trusted-types), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/uglify-js), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/webpack), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/webpack-sources). This software contains the following license and notice below: +The following software may be included in this product: @tweenjs/tween.js. A copy of the source code may be downloaded from https://github.com/tweenjs/tween.js.git. This software contains the following license and notice below: + +The MIT License + +Copyright (c) 2010-2012 Tween.js authors. + +Easing equations Copyright (c) 2001 Robert Penner http://robertpenner.com/easing/ + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +----- + +The following software may be included in this product: @types/arcgis-rest-api, @types/css-font-loading-module, @types/d3-array, @types/d3-axis, @types/d3-color, @types/d3-interpolate, @types/d3-path, @types/d3-scale, @types/d3-scale-chromatic, @types/d3-selection, @types/d3-shape, @types/d3-time, @types/d3-transition, @types/dompurify, @types/flexsearch, @types/geojson, @types/glob, @types/jasmine, @types/jasmine-ajax, @types/json-schema, @types/leaflet, @types/lodash, @types/lodash-es, @types/math-expression-evaluator, @types/minimatch, @types/node, @types/node-fetch, @types/prop-types, @types/rc-slider, @types/rc-tooltip, @types/react, @types/react-color, @types/react-dom, @types/react-select, @types/react-test-renderer, @types/react-transition-group, @types/reactcss, @types/retry, @types/scheduler, @types/semver, @types/shpjs, @types/styled-components, @types/tapable, @types/trusted-types, @types/uglify-js, @types/webpack, @types/webpack-sources. A copy of the source code may be downloaded from https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/arcgis-rest-api), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/css-font-loading-module), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/d3-array), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/d3-axis), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/d3-color), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/d3-interpolate), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/d3-path), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/d3-scale), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/d3-scale-chromatic), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/d3-selection), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/d3-shape), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/d3-time), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/d3-transition), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/dompurify), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/flexsearch), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/geojson), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/glob), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/jasmine), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/jasmine-ajax), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/json-schema), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/leaflet), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/lodash), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/lodash-es), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/math-expression-evaluator), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/minimatch), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/node), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/node-fetch), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/prop-types), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/rc-slider), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/rc-tooltip), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/react), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/react-color), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/react-dom), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/react-select), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/react-test-renderer), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/react-transition-group), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/reactcss), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/retry), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/scheduler), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/semver), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/shpjs), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/styled-components), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/tapable), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/trusted-types), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/uglify-js), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/webpack), https://github.com/DefinitelyTyped/DefinitelyTyped.git (@types/webpack-sources). This software contains the following license and notice below: MIT License @@ -924,11 +1351,11 @@ MIT License ----- -The following software may be included in this product: @visx/axis, @visx/bounds, @visx/clip-path, @visx/curve, @visx/event, @visx/glyph, @visx/grid, @visx/group, @visx/legend, @visx/point, @visx/responsive, @visx/scale, @visx/shape, @visx/text, @visx/tooltip. A copy of the source code may be downloaded from git+https://github.com/airbnb/visx.git (@visx/axis), git+https://github.com/airbnb/visx.git (@visx/bounds), git+https://github.com/airbnb/visx.git (@visx/clip-path), https://github.com/airbnb/visx (@visx/curve), git+https://github.com/airbnb/visx.git (@visx/event), git+https://github.com/airbnb/visx.git (@visx/glyph), git+https://github.com/airbnb/visx.git (@visx/grid), git+https://github.com/airbnb/visx.git (@visx/group), git+https://github.com/airbnb/visx.git (@visx/legend), https://github.com/airbnb/visx (@visx/point), git+https://github.com/airbnb/visx.git (@visx/responsive), git+https://github.com/airbnb/visx.git (@visx/scale), https://github.com/airbnb/visx (@visx/shape), git+https://github.com/airbnb/visx.git (@visx/text), git+https://github.com/airbnb/visx.git (@visx/tooltip). This software contains the following license and notice below: +The following software may be included in this product: @typescript-eslint/eslint-plugin, @typescript-eslint/scope-manager, @typescript-eslint/types, @typescript-eslint/utils, @typescript-eslint/visitor-keys. A copy of the source code may be downloaded from https://github.com/typescript-eslint/typescript-eslint.git (@typescript-eslint/eslint-plugin), https://github.com/typescript-eslint/typescript-eslint.git (@typescript-eslint/scope-manager), https://github.com/typescript-eslint/typescript-eslint.git (@typescript-eslint/types), https://github.com/typescript-eslint/typescript-eslint.git (@typescript-eslint/utils), https://github.com/typescript-eslint/typescript-eslint.git (@typescript-eslint/visitor-keys). This software contains the following license and notice below: MIT License -Copyright (c) 2017-2018 Harrison Shoff +Copyright (c) 2019 typescript-eslint and other contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -950,11 +1377,38 @@ SOFTWARE. ----- -The following software may be included in this product: @webassemblyjs/ast, @webassemblyjs/helper-api-error, @webassemblyjs/helper-buffer, @webassemblyjs/helper-code-frame, @webassemblyjs/helper-fsm, @webassemblyjs/helper-module-context, @webassemblyjs/helper-wasm-bytecode, @webassemblyjs/helper-wasm-section, @webassemblyjs/ieee754, @webassemblyjs/utf8, @webassemblyjs/wasm-edit, @webassemblyjs/wasm-gen, @webassemblyjs/wasm-opt, @webassemblyjs/wasm-parser, @webassemblyjs/wast-parser, @webassemblyjs/wast-printer. A copy of the source code may be downloaded from https://github.com/xtuc/webassemblyjs.git (@webassemblyjs/ast), https://github.com/xtuc/webassemblyjs.git (@webassemblyjs/helper-buffer), https://github.com/xtuc/webassemblyjs.git (@webassemblyjs/helper-code-frame), https://github.com/xtuc/webassemblyjs.git (@webassemblyjs/helper-module-context), https://github.com/xtuc/webassemblyjs.git (@webassemblyjs/helper-wasm-bytecode), https://github.com/xtuc/webassemblyjs.git (@webassemblyjs/helper-wasm-section), https://github.com/xtuc/webassemblyjs.git (@webassemblyjs/utf8), https://github.com/xtuc/webassemblyjs.git (@webassemblyjs/wasm-edit), https://github.com/xtuc/webassemblyjs.git (@webassemblyjs/wasm-gen), https://github.com/xtuc/webassemblyjs.git (@webassemblyjs/wasm-opt), https://github.com/xtuc/webassemblyjs.git (@webassemblyjs/wasm-parser), https://github.com/xtuc/webassemblyjs.git (@webassemblyjs/wast-parser), https://github.com/xtuc/webassemblyjs.git (@webassemblyjs/wast-printer). This software contains the following license and notice below: +The following software may be included in this product: @typescript-eslint/parser. A copy of the source code may be downloaded from https://github.com/typescript-eslint/typescript-eslint.git. This software contains the following license and notice below: + +TypeScript ESLint Parser +Copyright JS Foundation and other contributors, https://js.foundation + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +- Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +----- + +The following software may be included in this product: @typescript-eslint/type-utils. A copy of the source code may be downloaded from https://github.com/typescript-eslint/typescript-eslint.git. This software contains the following license and notice below: MIT License -Copyright (c) 2018 Sven Sauleau +Copyright (c) 2021 typescript-eslint and other contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -976,11 +1430,42 @@ SOFTWARE. ----- -The following software may be included in this product: @webassemblyjs/floating-point-hex-parser. A copy of the source code may be downloaded from https://github.com/xtuc/webassemblyjs.git. This software contains the following license and notice below: +The following software may be included in this product: @typescript-eslint/typescript-estree. A copy of the source code may be downloaded from https://github.com/typescript-eslint/typescript-eslint.git. This software contains the following license and notice below: + +TypeScript ESTree + +Originally extracted from: + +TypeScript ESLint Parser +Copyright JS Foundation and other contributors, https://js.foundation + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +- Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +----- + +The following software may be included in this product: @visx/axis, @visx/bounds, @visx/clip-path, @visx/curve, @visx/event, @visx/glyph, @visx/grid, @visx/group, @visx/legend, @visx/point, @visx/responsive, @visx/scale, @visx/shape, @visx/text, @visx/tooltip. A copy of the source code may be downloaded from git+https://github.com/airbnb/visx.git (@visx/axis), git+https://github.com/airbnb/visx.git (@visx/bounds), git+https://github.com/airbnb/visx.git (@visx/clip-path), https://github.com/airbnb/visx (@visx/curve), git+https://github.com/airbnb/visx.git (@visx/event), git+https://github.com/airbnb/visx.git (@visx/glyph), git+https://github.com/airbnb/visx.git (@visx/grid), git+https://github.com/airbnb/visx.git (@visx/group), git+https://github.com/airbnb/visx.git (@visx/legend), https://github.com/airbnb/visx (@visx/point), git+https://github.com/airbnb/visx.git (@visx/responsive), git+https://github.com/airbnb/visx.git (@visx/scale), https://github.com/airbnb/visx (@visx/shape), git+https://github.com/airbnb/visx.git (@visx/text), git+https://github.com/airbnb/visx.git (@visx/tooltip). This software contains the following license and notice below: MIT License -Copyright (c) 2017 Mauro Bringolf +Copyright (c) 2017-2018 Harrison Shoff Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -1002,31 +1487,83 @@ SOFTWARE. ----- -The following software may be included in this product: @webassemblyjs/leb128. This software contains the following license and notice below: +The following software may be included in this product: @webassemblyjs/ast, @webassemblyjs/helper-api-error, @webassemblyjs/helper-buffer, @webassemblyjs/helper-code-frame, @webassemblyjs/helper-fsm, @webassemblyjs/helper-module-context, @webassemblyjs/helper-wasm-bytecode, @webassemblyjs/helper-wasm-section, @webassemblyjs/ieee754, @webassemblyjs/utf8, @webassemblyjs/wasm-edit, @webassemblyjs/wasm-gen, @webassemblyjs/wasm-opt, @webassemblyjs/wasm-parser, @webassemblyjs/wast-parser, @webassemblyjs/wast-printer. A copy of the source code may be downloaded from https://github.com/xtuc/webassemblyjs.git (@webassemblyjs/ast), https://github.com/xtuc/webassemblyjs.git (@webassemblyjs/helper-buffer), https://github.com/xtuc/webassemblyjs.git (@webassemblyjs/helper-code-frame), https://github.com/xtuc/webassemblyjs.git (@webassemblyjs/helper-module-context), https://github.com/xtuc/webassemblyjs.git (@webassemblyjs/helper-wasm-bytecode), https://github.com/xtuc/webassemblyjs.git (@webassemblyjs/helper-wasm-section), https://github.com/xtuc/webassemblyjs.git (@webassemblyjs/utf8), https://github.com/xtuc/webassemblyjs.git (@webassemblyjs/wasm-edit), https://github.com/xtuc/webassemblyjs.git (@webassemblyjs/wasm-gen), https://github.com/xtuc/webassemblyjs.git (@webassemblyjs/wasm-opt), https://github.com/xtuc/webassemblyjs.git (@webassemblyjs/wasm-parser), https://github.com/xtuc/webassemblyjs.git (@webassemblyjs/wast-parser), https://github.com/xtuc/webassemblyjs.git (@webassemblyjs/wast-printer). This software contains the following license and notice below: -Copyright 2012 The Obvious Corporation. -http://obvious.com/ +MIT License -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at +Copyright (c) 2018 Sven Sauleau -http://www.apache.org/licenses/LICENSE-2.0 +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. -------------------------------------------------------------------------- - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ +----- +The following software may be included in this product: @webassemblyjs/floating-point-hex-parser. A copy of the source code may be downloaded from https://github.com/xtuc/webassemblyjs.git. This software contains the following license and notice below: -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION +MIT License + +Copyright (c) 2017 Mauro Bringolf + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +----- + +The following software may be included in this product: @webassemblyjs/leb128. This software contains the following license and notice below: + +Copyright 2012 The Obvious Corporation. +http://obvious.com/ + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + + +------------------------------------------------------------------------- + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. @@ -1234,348 +1771,91 @@ POSSIBILITY OF SUCH DAMAGE. ----- -The following software may be included in this product: @xtuc/long, spdx-correct, validate-npm-package-license. A copy of the source code may be downloaded from https://github.com/dcodeIO/long.js.git (@xtuc/long), https://github.com/jslicense/spdx-correct.js.git (spdx-correct), https://github.com/kemitchell/validate-npm-package-license.js.git (validate-npm-package-license). This software contains the following license and notice below: +The following software may be included in this product: abab. A copy of the source code may be downloaded from git+https://github.com/jsdom/abab.git. This software contains the following license and notice below: -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ +Copyright © 2019 W3C and Jeff Carpenter \ - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION +Both the original source code and new contributions in this repository are released under the [3-Clause BSD license](https://opensource.org/licenses/BSD-3-Clause). - 1. Definitions. +# The 3-Clause BSD License - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. +3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. +----- - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. +The following software may be included in this product: accepts, mime-types. A copy of the source code may be downloaded from https://github.com/jshttp/accepts.git (accepts), https://github.com/jshttp/mime-types.git (mime-types). This software contains the following license and notice below: - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. +(The MIT License) - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). +Copyright (c) 2014 Jonathan Ong +Copyright (c) 2015 Douglas Christopher Wilson - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. +----- - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. +The following software may be included in this product: acorn, acorn-walk. A copy of the source code may be downloaded from https://github.com/acornjs/acorn.git (acorn), https://github.com/acornjs/acorn.git (acorn-walk). This software contains the following license and notice below: - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: +Copyright (C) 2012-2018 by various contributors (see AUTHORS) - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. +----- - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. +The following software may be included in this product: acorn. A copy of the source code may be downloaded from https://github.com/acornjs/acorn.git. This software contains the following license and notice below: - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. +MIT License - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. +Copyright (C) 2012-2018 by various contributors (see AUTHORS) - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - ------ - -The following software may be included in this product: abab. A copy of the source code may be downloaded from git+https://github.com/jsdom/abab.git. This software contains the following license and notice below: - -Copyright © 2019 W3C and Jeff Carpenter \ - -Both the original source code and new contributions in this repository are released under the [3-Clause BSD license](https://opensource.org/licenses/BSD-3-Clause). - -# The 3-Clause BSD License - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. -2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - ------ - -The following software may be included in this product: abbrev. A copy of the source code may be downloaded from http://github.com/isaacs/abbrev-js. This software contains the following license and notice below: - -This software is dual-licensed under the ISC and MIT licenses. -You may use this software under EITHER of the following licenses. - ----------- - -The ISC License - -Copyright (c) Isaac Z. Schlueter and Contributors - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - ----------- - -Copyright Isaac Z. Schlueter and Contributors -All rights reserved. - -Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated documentation -files (the "Software"), to deal in the Software without -restriction, including without limitation the rights to use, -copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. - ------ - -The following software may be included in this product: accepts, mime-types. A copy of the source code may be downloaded from https://github.com/jshttp/accepts.git (accepts), https://github.com/jshttp/mime-types.git (mime-types). This software contains the following license and notice below: - -(The MIT License) - -Copyright (c) 2014 Jonathan Ong -Copyright (c) 2015 Douglas Christopher Wilson - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - ------ - -The following software may be included in this product: acorn, acorn-walk. A copy of the source code may be downloaded from https://github.com/acornjs/acorn.git (acorn), https://github.com/acornjs/acorn.git (acorn-walk). This software contains the following license and notice below: - -Copyright (C) 2012-2018 by various contributors (see AUTHORS) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - ------ - -The following software may be included in this product: acorn. A copy of the source code may be downloaded from https://github.com/acornjs/acorn.git. This software contains the following license and notice below: - -MIT License - -Copyright (C) 2012-2018 by various contributors (see AUTHORS) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, @@ -1687,7 +1967,7 @@ SOFTWARE. ----- -The following software may be included in this product: aggregate-error, ansi-regex, ansi-styles, array-union, binary-extensions, callsites, camelcase, camelcase-keys, chalk, clean-stack, del, env-paths, execa, find-up, get-stream, globals, globby, hard-rejection, has-flag, import-local, indent-string, internal-ip, is-absolute-url, is-finite, is-fullwidth-code-point, is-path-cwd, is-path-in-cwd, is-path-inside, is-wsl, locate-path, make-dir, multimatch, opn, p-limit, p-locate, p-map, p-retry, p-try, parent-module, path-exists, path-key, path-type, pify, pkg-dir, quick-lru, read-pkg, read-pkg-up, redent, resolve-from, shebang-regex, slash, string-width, strip-ansi, strip-indent, supports-color, trim-newlines, type-fest, wrap-ansi. A copy of the source code may be downloaded from https://github.com/sindresorhus/aggregate-error.git (aggregate-error), https://github.com/chalk/ansi-regex.git (ansi-regex), https://github.com/chalk/ansi-styles.git (ansi-styles), https://github.com/sindresorhus/array-union.git (array-union), https://github.com/sindresorhus/binary-extensions.git (binary-extensions), https://github.com/sindresorhus/callsites.git (callsites), https://github.com/sindresorhus/camelcase.git (camelcase), https://github.com/sindresorhus/camelcase-keys.git (camelcase-keys), https://github.com/chalk/chalk.git (chalk), https://github.com/sindresorhus/clean-stack.git (clean-stack), https://github.com/sindresorhus/del.git (del), https://github.com/sindresorhus/env-paths.git (env-paths), https://github.com/sindresorhus/execa.git (execa), https://github.com/sindresorhus/find-up.git (find-up), https://github.com/sindresorhus/get-stream.git (get-stream), https://github.com/sindresorhus/globals.git (globals), https://github.com/sindresorhus/globby.git (globby), https://github.com/sindresorhus/hard-rejection.git (hard-rejection), https://github.com/sindresorhus/has-flag.git (has-flag), https://github.com/sindresorhus/import-local.git (import-local), https://github.com/sindresorhus/indent-string.git (indent-string), https://github.com/sindresorhus/internal-ip.git (internal-ip), https://github.com/sindresorhus/is-absolute-url.git (is-absolute-url), https://github.com/sindresorhus/is-finite.git (is-finite), https://github.com/sindresorhus/is-fullwidth-code-point.git (is-fullwidth-code-point), https://github.com/sindresorhus/is-path-cwd.git (is-path-cwd), https://github.com/sindresorhus/is-path-in-cwd.git (is-path-in-cwd), https://github.com/sindresorhus/is-path-inside.git (is-path-inside), https://github.com/sindresorhus/is-wsl.git (is-wsl), https://github.com/sindresorhus/locate-path.git (locate-path), https://github.com/sindresorhus/make-dir.git (make-dir), https://github.com/sindresorhus/multimatch.git (multimatch), https://github.com/sindresorhus/opn.git (opn), https://github.com/sindresorhus/p-limit.git (p-limit), https://github.com/sindresorhus/p-locate.git (p-locate), https://github.com/sindresorhus/p-map.git (p-map), https://github.com/sindresorhus/p-retry.git (p-retry), https://github.com/sindresorhus/p-try.git (p-try), https://github.com/sindresorhus/parent-module.git (parent-module), https://github.com/sindresorhus/path-exists.git (path-exists), https://github.com/sindresorhus/path-key.git (path-key), https://github.com/sindresorhus/path-type.git (path-type), https://github.com/sindresorhus/pify.git (pify), https://github.com/sindresorhus/pkg-dir.git (pkg-dir), https://github.com/sindresorhus/quick-lru.git (quick-lru), https://github.com/sindresorhus/read-pkg.git (read-pkg), https://github.com/sindresorhus/read-pkg-up.git (read-pkg-up), https://github.com/sindresorhus/redent.git (redent), https://github.com/sindresorhus/resolve-from.git (resolve-from), https://github.com/sindresorhus/shebang-regex.git (shebang-regex), https://github.com/sindresorhus/slash.git (slash), https://github.com/sindresorhus/string-width.git (string-width), https://github.com/chalk/strip-ansi.git (strip-ansi), https://github.com/sindresorhus/strip-indent.git (strip-indent), https://github.com/chalk/supports-color.git (supports-color), https://github.com/sindresorhus/trim-newlines.git (trim-newlines), https://github.com/sindresorhus/type-fest.git (type-fest), https://github.com/chalk/wrap-ansi.git (wrap-ansi). This software contains the following license and notice below: +The following software may be included in this product: aggregate-error, ansi-regex, ansi-styles, array-union, binary-extensions, callsites, camelcase, chalk, clean-stack, del, execa, find-up, get-stream, globals, globby, has-flag, import-local, indent-string, internal-ip, is-absolute-url, is-finite, is-fullwidth-code-point, is-path-cwd, is-path-in-cwd, is-path-inside, is-wsl, locate-path, make-dir, multimatch, opn, p-limit, p-locate, p-map, p-retry, p-try, parent-module, path-exists, path-key, path-type, pify, pkg-dir, resolve-from, shebang-regex, slash, string-width, strip-ansi, supports-color, wrap-ansi. A copy of the source code may be downloaded from https://github.com/sindresorhus/aggregate-error.git (aggregate-error), https://github.com/chalk/ansi-regex.git (ansi-regex), https://github.com/chalk/ansi-styles.git (ansi-styles), https://github.com/sindresorhus/array-union.git (array-union), https://github.com/sindresorhus/binary-extensions.git (binary-extensions), https://github.com/sindresorhus/callsites.git (callsites), https://github.com/sindresorhus/camelcase.git (camelcase), https://github.com/chalk/chalk.git (chalk), https://github.com/sindresorhus/clean-stack.git (clean-stack), https://github.com/sindresorhus/del.git (del), https://github.com/sindresorhus/execa.git (execa), https://github.com/sindresorhus/find-up.git (find-up), https://github.com/sindresorhus/get-stream.git (get-stream), https://github.com/sindresorhus/globals.git (globals), https://github.com/sindresorhus/globby.git (globby), https://github.com/sindresorhus/has-flag.git (has-flag), https://github.com/sindresorhus/import-local.git (import-local), https://github.com/sindresorhus/indent-string.git (indent-string), https://github.com/sindresorhus/internal-ip.git (internal-ip), https://github.com/sindresorhus/is-absolute-url.git (is-absolute-url), https://github.com/sindresorhus/is-finite.git (is-finite), https://github.com/sindresorhus/is-fullwidth-code-point.git (is-fullwidth-code-point), https://github.com/sindresorhus/is-path-cwd.git (is-path-cwd), https://github.com/sindresorhus/is-path-in-cwd.git (is-path-in-cwd), https://github.com/sindresorhus/is-path-inside.git (is-path-inside), https://github.com/sindresorhus/is-wsl.git (is-wsl), https://github.com/sindresorhus/locate-path.git (locate-path), https://github.com/sindresorhus/make-dir.git (make-dir), https://github.com/sindresorhus/multimatch.git (multimatch), https://github.com/sindresorhus/opn.git (opn), https://github.com/sindresorhus/p-limit.git (p-limit), https://github.com/sindresorhus/p-locate.git (p-locate), https://github.com/sindresorhus/p-map.git (p-map), https://github.com/sindresorhus/p-retry.git (p-retry), https://github.com/sindresorhus/p-try.git (p-try), https://github.com/sindresorhus/parent-module.git (parent-module), https://github.com/sindresorhus/path-exists.git (path-exists), https://github.com/sindresorhus/path-key.git (path-key), https://github.com/sindresorhus/path-type.git (path-type), https://github.com/sindresorhus/pify.git (pify), https://github.com/sindresorhus/pkg-dir.git (pkg-dir), https://github.com/sindresorhus/resolve-from.git (resolve-from), https://github.com/sindresorhus/shebang-regex.git (shebang-regex), https://github.com/sindresorhus/slash.git (slash), https://github.com/sindresorhus/string-width.git (string-width), https://github.com/chalk/strip-ansi.git (strip-ansi), https://github.com/chalk/supports-color.git (supports-color), https://github.com/chalk/wrap-ansi.git (wrap-ansi). This software contains the following license and notice below: MIT License @@ -2178,7 +2458,7 @@ Apache License ----- -The following software may be included in this product: ansi-regex, ansi-styles, array-differ, array-union, array-uniq, arrify, camelcase, chalk, code-point-at, decamelize, detect-indent, escape-string-regexp, find-up, fs-access, get-stream, globals, globby, has-ansi, has-flag, ip-regex, is-binary-path, is-fullwidth-code-point, is-plain-obj, is-stream, is-wsl, lcid, load-json-file, locate-path, map-obj, npm-run-path, null-check, number-is-nan, object-assign, os-locale, os-tmpdir, p-finally, p-locate, p-try, parse-json, path-exists, path-is-absolute, path-key, path-type, pify, query-string, read-pkg, read-pkg-up, repeating, resolve-cwd, resolve-from, shebang-regex, string-width, strip-ansi, strip-bom, strip-eof, supports-color, trim-right, wrap-ansi, yn. A copy of the source code may be downloaded from https://github.com/chalk/ansi-regex.git (ansi-regex), https://github.com/chalk/ansi-styles.git (ansi-styles), https://github.com/sindresorhus/array-differ.git (array-differ), https://github.com/sindresorhus/array-union.git (array-union), https://github.com/sindresorhus/array-uniq.git (array-uniq), https://github.com/sindresorhus/arrify.git (arrify), https://github.com/sindresorhus/camelcase.git (camelcase), https://github.com/chalk/chalk.git (chalk), https://github.com/sindresorhus/code-point-at.git (code-point-at), https://github.com/sindresorhus/decamelize.git (decamelize), https://github.com/sindresorhus/detect-indent.git (detect-indent), https://github.com/sindresorhus/escape-string-regexp.git (escape-string-regexp), https://github.com/sindresorhus/find-up.git (find-up), https://github.com/sindresorhus/fs-access.git (fs-access), https://github.com/sindresorhus/get-stream.git (get-stream), https://github.com/sindresorhus/globals.git (globals), https://github.com/sindresorhus/globby.git (globby), https://github.com/sindresorhus/has-ansi.git (has-ansi), https://github.com/sindresorhus/has-flag.git (has-flag), https://github.com/sindresorhus/ip-regex.git (ip-regex), https://github.com/sindresorhus/is-binary-path.git (is-binary-path), https://github.com/sindresorhus/is-fullwidth-code-point.git (is-fullwidth-code-point), https://github.com/sindresorhus/is-plain-obj.git (is-plain-obj), https://github.com/sindresorhus/is-stream.git (is-stream), https://github.com/sindresorhus/is-wsl.git (is-wsl), https://github.com/sindresorhus/lcid.git (lcid), https://github.com/sindresorhus/load-json-file.git (load-json-file), https://github.com/sindresorhus/locate-path.git (locate-path), https://github.com/sindresorhus/map-obj.git (map-obj), https://github.com/sindresorhus/npm-run-path.git (npm-run-path), https://github.com/sindresorhus/null-check.git (null-check), https://github.com/sindresorhus/number-is-nan.git (number-is-nan), https://github.com/sindresorhus/object-assign.git (object-assign), https://github.com/sindresorhus/os-locale.git (os-locale), https://github.com/sindresorhus/os-tmpdir.git (os-tmpdir), https://github.com/sindresorhus/p-finally.git (p-finally), https://github.com/sindresorhus/p-locate.git (p-locate), https://github.com/sindresorhus/p-try.git (p-try), https://github.com/sindresorhus/parse-json.git (parse-json), https://github.com/sindresorhus/path-exists.git (path-exists), https://github.com/sindresorhus/path-is-absolute.git (path-is-absolute), https://github.com/sindresorhus/path-key.git (path-key), https://github.com/sindresorhus/path-type.git (path-type), https://github.com/sindresorhus/pify.git (pify), https://github.com/sindresorhus/query-string.git (query-string), https://github.com/sindresorhus/read-pkg.git (read-pkg), https://github.com/sindresorhus/read-pkg-up.git (read-pkg-up), https://github.com/sindresorhus/repeating.git (repeating), https://github.com/sindresorhus/resolve-cwd.git (resolve-cwd), https://github.com/sindresorhus/resolve-from.git (resolve-from), https://github.com/sindresorhus/shebang-regex.git (shebang-regex), https://github.com/sindresorhus/string-width.git (string-width), https://github.com/chalk/strip-ansi.git (strip-ansi), https://github.com/sindresorhus/strip-bom.git (strip-bom), https://github.com/sindresorhus/strip-eof.git (strip-eof), https://github.com/chalk/supports-color.git (supports-color), https://github.com/sindresorhus/trim-right.git (trim-right), https://github.com/chalk/wrap-ansi.git (wrap-ansi), https://github.com/sindresorhus/yn.git (yn). This software contains the following license and notice below: +The following software may be included in this product: ansi-regex, ansi-styles, array-differ, array-union, array-uniq, arrify, camelcase, chalk, code-point-at, decamelize, detect-indent, escape-string-regexp, find-up, fs-access, get-stream, globals, globby, has-ansi, has-flag, ip-regex, is-binary-path, is-fullwidth-code-point, is-plain-obj, is-stream, is-wsl, lcid, load-json-file, locate-path, npm-run-path, null-check, number-is-nan, object-assign, os-locale, os-tmpdir, p-finally, p-locate, p-try, parse-json, path-exists, path-is-absolute, path-key, path-type, pify, query-string, read-pkg, read-pkg-up, repeating, resolve-cwd, resolve-from, shebang-regex, string-width, strip-ansi, strip-bom, strip-eof, supports-color, trim-right, wrap-ansi, yn. A copy of the source code may be downloaded from https://github.com/chalk/ansi-regex.git (ansi-regex), https://github.com/chalk/ansi-styles.git (ansi-styles), https://github.com/sindresorhus/array-differ.git (array-differ), https://github.com/sindresorhus/array-union.git (array-union), https://github.com/sindresorhus/array-uniq.git (array-uniq), https://github.com/sindresorhus/arrify.git (arrify), https://github.com/sindresorhus/camelcase.git (camelcase), https://github.com/chalk/chalk.git (chalk), https://github.com/sindresorhus/code-point-at.git (code-point-at), https://github.com/sindresorhus/decamelize.git (decamelize), https://github.com/sindresorhus/detect-indent.git (detect-indent), https://github.com/sindresorhus/escape-string-regexp.git (escape-string-regexp), https://github.com/sindresorhus/find-up.git (find-up), https://github.com/sindresorhus/fs-access.git (fs-access), https://github.com/sindresorhus/get-stream.git (get-stream), https://github.com/sindresorhus/globals.git (globals), https://github.com/sindresorhus/globby.git (globby), https://github.com/sindresorhus/has-ansi.git (has-ansi), https://github.com/sindresorhus/has-flag.git (has-flag), https://github.com/sindresorhus/ip-regex.git (ip-regex), https://github.com/sindresorhus/is-binary-path.git (is-binary-path), https://github.com/sindresorhus/is-fullwidth-code-point.git (is-fullwidth-code-point), https://github.com/sindresorhus/is-plain-obj.git (is-plain-obj), https://github.com/sindresorhus/is-stream.git (is-stream), https://github.com/sindresorhus/is-wsl.git (is-wsl), https://github.com/sindresorhus/lcid.git (lcid), https://github.com/sindresorhus/load-json-file.git (load-json-file), https://github.com/sindresorhus/locate-path.git (locate-path), https://github.com/sindresorhus/npm-run-path.git (npm-run-path), https://github.com/sindresorhus/null-check.git (null-check), https://github.com/sindresorhus/number-is-nan.git (number-is-nan), https://github.com/sindresorhus/object-assign.git (object-assign), https://github.com/sindresorhus/os-locale.git (os-locale), https://github.com/sindresorhus/os-tmpdir.git (os-tmpdir), https://github.com/sindresorhus/p-finally.git (p-finally), https://github.com/sindresorhus/p-locate.git (p-locate), https://github.com/sindresorhus/p-try.git (p-try), https://github.com/sindresorhus/parse-json.git (parse-json), https://github.com/sindresorhus/path-exists.git (path-exists), https://github.com/sindresorhus/path-is-absolute.git (path-is-absolute), https://github.com/sindresorhus/path-key.git (path-key), https://github.com/sindresorhus/path-type.git (path-type), https://github.com/sindresorhus/pify.git (pify), https://github.com/sindresorhus/query-string.git (query-string), https://github.com/sindresorhus/read-pkg.git (read-pkg), https://github.com/sindresorhus/read-pkg-up.git (read-pkg-up), https://github.com/sindresorhus/repeating.git (repeating), https://github.com/sindresorhus/resolve-cwd.git (resolve-cwd), https://github.com/sindresorhus/resolve-from.git (resolve-from), https://github.com/sindresorhus/shebang-regex.git (shebang-regex), https://github.com/sindresorhus/string-width.git (string-width), https://github.com/chalk/strip-ansi.git (strip-ansi), https://github.com/sindresorhus/strip-bom.git (strip-bom), https://github.com/sindresorhus/strip-eof.git (strip-eof), https://github.com/chalk/supports-color.git (supports-color), https://github.com/sindresorhus/trim-right.git (trim-right), https://github.com/chalk/wrap-ansi.git (wrap-ansi), https://github.com/sindresorhus/yn.git (yn). This software contains the following license and notice below: The MIT License (MIT) @@ -2322,7 +2602,7 @@ THE SOFTWARE. ----- -The following software may be included in this product: aproba, wide-align. A copy of the source code may be downloaded from https://github.com/iarna/aproba (aproba), https://github.com/iarna/wide-align (wide-align). This software contains the following license and notice below: +The following software may be included in this product: aproba. A copy of the source code may be downloaded from https://github.com/iarna/aproba. This software contains the following license and notice below: Copyright (c) 2015, Rebecca Turner @@ -2340,7 +2620,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ----- -The following software may be included in this product: archy, buffer-equal, camelize, concat-map, defined, ent, is-typedarray, json-stable-stringify-without-jsonify, minimist, path-browserify, resumer, safe-regex, text-table, tty-browserify, wordwrap. A copy of the source code may be downloaded from http://github.com/substack/node-archy.git (archy), git://github.com/substack/node-buffer-equal.git (buffer-equal), git://github.com/substack/camelize.git (camelize), git://github.com/substack/node-concat-map.git (concat-map), git://github.com/substack/defined.git (defined), https://github.com/substack/node-ent.git (ent), git://github.com/hughsk/is-typedarray.git (is-typedarray), git://github.com/samn/json-stable-stringify.git (json-stable-stringify-without-jsonify), git://github.com/minimistjs/minimist.git (minimist), git://github.com/substack/path-browserify.git (path-browserify), git://github.com/substack/resumer.git (resumer), git://github.com/substack/safe-regex.git (safe-regex), git://github.com/substack/text-table.git (text-table), git://github.com/substack/tty-browserify.git (tty-browserify), git://github.com/substack/node-wordwrap.git (wordwrap). This software contains the following license and notice below: +The following software may be included in this product: archy, buffer-equal, camelize, concat-map, defined, ent, is-typedarray, json-stable-stringify-without-jsonify, minimist, path-browserify, resumer, safe-regex, text-table, tty-browserify, wordwrap. A copy of the source code may be downloaded from http://github.com/substack/node-archy.git (archy), git://github.com/substack/node-buffer-equal.git (buffer-equal), git://github.com/substack/camelize.git (camelize), git://github.com/substack/node-concat-map.git (concat-map), git://github.com/substack/defined.git (defined), https://github.com/substack/node-ent.git (ent), git://github.com/hughsk/is-typedarray.git (is-typedarray), git://github.com/samn/json-stable-stringify.git (json-stable-stringify-without-jsonify), git://github.com/substack/minimist.git (minimist), git://github.com/substack/path-browserify.git (path-browserify), git://github.com/substack/resumer.git (resumer), git://github.com/substack/safe-regex.git (safe-regex), git://github.com/substack/text-table.git (text-table), git://github.com/substack/tty-browserify.git (tty-browserify), git://github.com/substack/node-wordwrap.git (wordwrap). This software contains the following license and notice below: This software is released under the MIT license: @@ -2363,16 +2643,6 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----- -The following software may be included in this product: are-we-there-yet. A copy of the source code may be downloaded from https://github.com/iarna/are-we-there-yet.git. This software contains the following license and notice below: - -Copyright (c) 2015, Rebecca Turner - -Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - ------ - The following software may be included in this product: argparse. A copy of the source code may be downloaded from https://github.com/nodeca/argparse.git. This software contains the following license and notice below: (The MIT License) @@ -2555,7 +2825,7 @@ THE SOFTWARE. ----- -The following software may be included in this product: array-flatten, camel-case, lower-case, no-case, param-case, path-to-regexp, ts-node, upper-case. A copy of the source code may be downloaded from git://github.com/blakeembrey/array-flatten.git (array-flatten), git://github.com/blakeembrey/camel-case.git (camel-case), git://github.com/blakeembrey/lower-case.git (lower-case), git://github.com/blakeembrey/no-case.git (no-case), git://github.com/blakeembrey/param-case.git (param-case), https://github.com/pillarjs/path-to-regexp.git (path-to-regexp), git://github.com/TypeStrong/ts-node.git (ts-node), git://github.com/blakeembrey/upper-case.git (upper-case). This software contains the following license and notice below: +The following software may be included in this product: array-flatten, camel-case, lower-case, no-case, param-case, path-to-regexp, ts-node, upper-case. A copy of the source code may be downloaded from git://github.com/blakeembrey/array-flatten.git (array-flatten), git://github.com/blakeembrey/camel-case.git (camel-case), git://github.com/blakeembrey/lower-case.git (lower-case), git://github.com/blakeembrey/no-case.git (no-case), git://github.com/blakeembrey/param-case.git (param-case), https://github.com/component/path-to-regexp.git (path-to-regexp), git://github.com/TypeStrong/ts-node.git (ts-node), git://github.com/blakeembrey/upper-case.git (upper-case). This software contains the following license and notice below: The MIT License (MIT) @@ -3207,6 +3477,33 @@ SOFTWARE. ----- +The following software may be included in this product: autolinker. A copy of the source code may be downloaded from git://github.com/gregjacobs/Autolinker.js.git. This software contains the following license and notice below: + +The MIT License (MIT) + +Copyright (c) 2014 Gregory Jacobs (http://greg-jacobs.com) + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +----- + The following software may be included in this product: available-typed-arrays, is-weakref. A copy of the source code may be downloaded from git+https://github.com/inspect-js/available-typed-arrays.git (available-typed-arrays), git+https://github.com/inspect-js/is-weakref.git (is-weakref). This software contains the following license and notice below: MIT License @@ -3559,58 +3856,6 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----- -The following software may be included in this product: babel-plugin-dynamic-import-node. A copy of the source code may be downloaded from git+https://github.com/airbnb/babel-plugin-dynamic-import-node.git. This software contains the following license and notice below: - -MIT License - -Copyright (c) 2016 Airbnb - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - ------ - -The following software may be included in this product: babel-plugin-jsx-control-statements. A copy of the source code may be downloaded from https://github.com/AlexGilleran/jsx-control-statements. This software contains the following license and notice below: - -The MIT License (MIT) - -Copyright (c) 2015-2016 Alex Gilleran - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - ------ - The following software may be included in this product: babel-plugin-lodash. A copy of the source code may be downloaded from https://github.com/lodash/babel-plugin-lodash.git. This software contains the following license and notice below: Copyright JS Foundation and other contributors @@ -5143,7 +5388,7 @@ THE SOFTWARE. ----- -The following software may be included in this product: chownr, color-support, fs-minipass, fs-write-stream-atomic, ini, isexe, json-stringify-safe, lru-cache, minimatch, minipass-collect, minipass-flush, minipass-pipeline, nopt, npmlog, once, pseudomap, rimraf, semver, tar, which, wrappy, yallist. A copy of the source code may be downloaded from git://github.com/isaacs/chownr.git (chownr), git+https://github.com/isaacs/color-support.git (color-support), git+https://github.com/npm/fs-minipass.git (fs-minipass), https://github.com/npm/fs-write-stream-atomic (fs-write-stream-atomic), git://github.com/isaacs/ini.git (ini), git+https://github.com/isaacs/isexe.git (isexe), git://github.com/isaacs/json-stringify-safe (json-stringify-safe), git://github.com/isaacs/node-lru-cache.git (lru-cache), git://github.com/isaacs/minimatch.git (minimatch), git+https://github.com/isaacs/minipass-flush.git (minipass-flush), https://github.com/npm/nopt.git (nopt), https://github.com/npm/npmlog.git (npmlog), git://github.com/isaacs/once (once), git+https://github.com/isaacs/pseudomap.git (pseudomap), git://github.com/isaacs/rimraf.git (rimraf), https://github.com/npm/node-semver (semver), https://github.com/npm/node-tar.git (tar), git://github.com/isaacs/node-which.git (which), https://github.com/npm/wrappy (wrappy), git+https://github.com/isaacs/yallist.git (yallist). This software contains the following license and notice below: +The following software may be included in this product: chownr, color-support, fs-minipass, fs-write-stream-atomic, ini, isexe, json-stringify-safe, lru-cache, minimatch, minipass-collect, minipass-flush, minipass-pipeline, once, pseudomap, rimraf, semver, tar, which, wrappy, yallist. A copy of the source code may be downloaded from git://github.com/isaacs/chownr.git (chownr), git+https://github.com/isaacs/color-support.git (color-support), git+https://github.com/npm/fs-minipass.git (fs-minipass), https://github.com/npm/fs-write-stream-atomic (fs-write-stream-atomic), git://github.com/isaacs/ini.git (ini), git+https://github.com/isaacs/isexe.git (isexe), git://github.com/isaacs/json-stringify-safe (json-stringify-safe), git://github.com/isaacs/node-lru-cache.git (lru-cache), git://github.com/isaacs/minimatch.git (minimatch), git+https://github.com/isaacs/minipass-flush.git (minipass-flush), git://github.com/isaacs/once (once), git+https://github.com/isaacs/pseudomap.git (pseudomap), git://github.com/isaacs/rimraf.git (rimraf), https://github.com/npm/node-semver (semver), https://github.com/npm/node-tar.git (tar), git://github.com/isaacs/node-which.git (which), https://github.com/npm/wrappy (wrappy), git+https://github.com/isaacs/yallist.git (yallist). This software contains the following license and notice below: The ISC License @@ -5820,29 +6065,11 @@ THE SOFTWARE. ----- -The following software may be included in this product: console-control-strings, gauge. A copy of the source code may be downloaded from https://github.com/iarna/console-control-strings (console-control-strings), https://github.com/iarna/gauge (gauge). This software contains the following license and notice below: +The following software may be included in this product: content-disposition, depd, forwarded, vary. A copy of the source code may be downloaded from https://github.com/jshttp/content-disposition.git (content-disposition), https://github.com/dougwilson/nodejs-depd.git (depd), https://github.com/jshttp/forwarded.git (forwarded), https://github.com/jshttp/vary.git (vary). This software contains the following license and notice below: -Copyright (c) 2014, Rebecca Turner +(The MIT License) -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - ------ - -The following software may be included in this product: content-disposition, depd, forwarded, vary. A copy of the source code may be downloaded from https://github.com/jshttp/content-disposition.git (content-disposition), https://github.com/dougwilson/nodejs-depd.git (depd), https://github.com/jshttp/forwarded.git (forwarded), https://github.com/jshttp/vary.git (vary). This software contains the following license and notice below: - -(The MIT License) - -Copyright (c) 2014-2017 Douglas Christopher Wilson +Copyright (c) 2014-2017 Douglas Christopher Wilson Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the @@ -6043,7 +6270,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----- -The following software may be included in this product: core-js, core-js-compat. A copy of the source code may be downloaded from https://github.com/zloirock/core-js.git (core-js), https://github.com/zloirock/core-js.git (core-js-compat). This software contains the following license and notice below: +The following software may be included in this product: core-js. A copy of the source code may be downloaded from https://github.com/zloirock/core-js.git. This software contains the following license and notice below: Copyright (c) 2014-2022 Denis Pushkarev @@ -6091,6 +6318,30 @@ THE SOFTWARE. ----- +The following software may be included in this product: core-js-compat. A copy of the source code may be downloaded from https://github.com/zloirock/core-js.git. This software contains the following license and notice below: + +Copyright (c) 2014-2023 Denis Pushkarev + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +----- + The following software may be included in this product: core-util-is. A copy of the source code may be downloaded from git://github.com/isaacs/core-util-is. This software contains the following license and notice below: Copyright Node.js contributors. All rights reserved. @@ -7179,32 +7430,6 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----- -The following software may be included in this product: decamelize-keys. A copy of the source code may be downloaded from https://github.com/dsblv/decamelize-keys.git. This software contains the following license and notice below: - -The MIT License (MIT) - -Copyright (c) Sindre Sorhus (sindresorhus.com), Dmirty Sobolev - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - ------ - The following software may be included in this product: decode-uri-component. A copy of the source code may be downloaded from https://github.com/SamVerschueren/decode-uri-component.git. This software contains the following license and notice below: The MIT License (MIT) @@ -7415,31 +7640,6 @@ THE SOFTWARE. ----- -The following software may be included in this product: delegates. A copy of the source code may be downloaded from https://github.com/visionmedia/node-delegates.git. This software contains the following license and notice below: - -Copyright (c) 2015 TJ Holowaychuk - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - ------ - The following software may be included in this product: depd. A copy of the source code may be downloaded from https://github.com/dougwilson/nodejs-depd.git. This software contains the following license and notice below: (The MIT License) @@ -8406,502 +8606,583 @@ Exhibit B - “Incompatible With Secondary Licenses” Notice ----- -The following software may be included in this product: domready. A copy of the source code may be downloaded from https://github.com/ded/domready.git. This software contains the following license and notice below: - -The MIT License (MIT) - -Copyright (c) 2013 Dustin Diaz - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. +The following software may be included in this product: dompurify. A copy of the source code may be downloaded from git://github.com/cure53/DOMPurify.git. This software contains the following license and notice below: -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. +DOMPurify +Copyright 2023 Dr.-Ing. Mario Heiderich, Cure53 ------ +DOMPurify is free software; you can redistribute it and/or modify it under the +terms of either: -The following software may be included in this product: duplexify, end-of-stream, protocol-buffers-schema, pump, pumpify. A copy of the source code may be downloaded from git://github.com/mafintosh/duplexify (duplexify), git://github.com/mafintosh/end-of-stream.git (end-of-stream), https://github.com/mafintosh/protocol-buffers-schema (protocol-buffers-schema), git://github.com/mafintosh/pump.git (pump), git://github.com/mafintosh/pumpify (pumpify). This software contains the following license and notice below: +a) the Apache License Version 2.0, or +b) the Mozilla Public License Version 2.0 -The MIT License (MIT) +----------------------------------------------------------------------------- -Copyright (c) 2014 Mathias Buus + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. + 1. Definitions. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. ------ + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. -The following software may be included in this product: each-props. A copy of the source code may be downloaded from git+https://github.com/sttk/each-props.git. This software contains the following license and notice below: + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. -MIT License + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. -Copyright (c) 2016 Takayuki Sato + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. ------ + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." -The following software may be included in this product: ecc-jsbn. A copy of the source code may be downloaded from https://github.com/quartzjer/ecc-jsbn.git. This software contains the following license and notice below: + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. -The MIT License (MIT) + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. -Copyright (c) 2014 Jeremie Miller + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and ------ + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and -The following software may be included in this product: electron-to-chromium. A copy of the source code may be downloaded from https://github.com/kilian/electron-to-chromium/. This software contains the following license and notice below: + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. -Copyright 2018 Kilian Valkhof + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. -Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. ------ + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. -The following software may be included in this product: emojis-list. A copy of the source code may be downloaded from git+https://github.com/kikobeats/emojis-list.git. This software contains the following license and notice below: + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. -The MIT License (MIT) + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. -Copyright © 2015 Kiko Beats + END OF TERMS AND CONDITIONS -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + APPENDIX: How to apply the Apache License to your work. -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. -THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + Copyright [yyyy] [name of copyright owner] ------ + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at -The following software may be included in this product: encodeurl. A copy of the source code may be downloaded from https://github.com/pillarjs/encodeurl.git. This software contains the following license and notice below: + http://www.apache.org/licenses/LICENSE-2.0 -(The MIT License) + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. -Copyright (c) 2016 Douglas Christopher Wilson +----------------------------------------------------------------------------- +Mozilla Public License, version 2.0 -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: +1. Definitions -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. +1.1. “Contributor” -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + means each individual or legal entity that creates, contributes to the + creation of, or owns Covered Software. ------ +1.2. “Contributor Version” -The following software may be included in this product: engine.io. A copy of the source code may be downloaded from git@github.com:socketio/engine.io.git. This software contains the following license and notice below: + means the combination of the Contributions of others (if any) used by a + Contributor and that particular Contributor’s Contribution. -(The MIT License) +1.3. “Contribution” -Copyright (c) 2014 Guillermo Rauch + means Covered Software of a particular Contributor. -Permission is hereby granted, free of charge, to any person obtaining a copy of this software -and associated documentation files (the 'Software'), to deal in the Software without restriction, -including without limitation the rights to use, copy, modify, merge, publish, distribute, -sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +1.4. “Covered Software” -The above copyright notice and this permission notice shall be included in all copies or -substantial portions of the Software. + means Source Code Form to which the initial Contributor has attached the + notice in Exhibit A, the Executable Form of such Source Code Form, and + Modifications of such Source Code Form, in each case including portions + thereof. -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +1.5. “Incompatible With Secondary Licenses” + means ------ + a. that the initial Contributor has attached the notice described in + Exhibit B to the Covered Software; or -The following software may be included in this product: engine.io-client. A copy of the source code may be downloaded from https://github.com/socketio/engine.io-client.git. This software contains the following license and notice below: + b. that the Covered Software was made available under the terms of version + 1.1 or earlier of the License, but not also under the terms of a + Secondary License. -(The MIT License) +1.6. “Executable Form” -Copyright (c) 2014-2015 Automattic + means any form of the work other than Source Code Form. -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: +1.7. “Larger Work” -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. + means a work that combines Covered Software with other material, in a separate + file or files, that is not Covered Software. -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +1.8. “License” ------ + means this document. -The following software may be included in this product: engine.io-parser. A copy of the source code may be downloaded from git@github.com:socketio/engine.io-parser.git. This software contains the following license and notice below: +1.9. “Licensable” -(The MIT License) + means having the right to grant, to the maximum extent possible, whether at the + time of the initial grant or subsequently, any and all of the rights conveyed by + this License. -Copyright (c) 2016 Guillermo Rauch (@rauchg) +1.10. “Modifications” -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: + means any of the following: -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. + a. any file in Source Code Form that results from an addition to, deletion + from, or modification of the contents of Covered Software; or -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + b. any new file in Source Code Form that contains any Covered Software. ------ +1.11. “Patent Claims” of a Contributor -The following software may be included in this product: enquirer. A copy of the source code may be downloaded from https://github.com/enquirer/enquirer.git. This software contains the following license and notice below: + means any patent claim(s), including without limitation, method, process, + and apparatus claims, in any patent Licensable by such Contributor that + would be infringed, but for the grant of the License, by the making, + using, selling, offering for sale, having made, import, or transfer of + either its Contributions or its Contributor Version. -The MIT License (MIT) +1.12. “Secondary License” -Copyright (c) 2016-present, Jon Schlinkert. + means either the GNU General Public License, Version 2.0, the GNU Lesser + General Public License, Version 2.1, the GNU Affero General Public + License, Version 3.0, or any later versions of those licenses. -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +1.13. “Source Code Form” -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. + means the form of the work preferred for making modifications. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. +1.14. “You” (or “Your”) ------ + means an individual or a legal entity exercising rights under this + License. For legal entities, “You” includes any entity that controls, is + controlled by, or is under common control with You. For purposes of this + definition, “control” means (a) the power, direct or indirect, to cause + the direction or management of such entity, whether by contract or + otherwise, or (b) ownership of more than fifty percent (50%) of the + outstanding shares or beneficial ownership of such entity. -The following software may be included in this product: error-ex, is-arrayish. A copy of the source code may be downloaded from https://github.com/qix-/node-error-ex.git (error-ex), https://github.com/qix-/node-is-arrayish.git (is-arrayish). This software contains the following license and notice below: -The MIT License (MIT) +2. License Grants and Conditions -Copyright (c) 2015 JD Ballard +2.1. Grants -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - ------ + Each Contributor hereby grants You a world-wide, royalty-free, + non-exclusive license: -The following software may be included in this product: error-stack-parser, stackframe. A copy of the source code may be downloaded from git://github.com/stacktracejs/error-stack-parser.git (error-stack-parser), git://github.com/stacktracejs/stackframe.git (stackframe). This software contains the following license and notice below: + a. under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or as + part of a Larger Work; and -Copyright (c) 2017 Eric Wendelin and other contributors + b. under Patent Claims of such Contributor to make, use, sell, offer for + sale, have made, import, and otherwise transfer either its Contributions + or its Contributor Version. -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: +2.2. Effective Date -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. + The licenses granted in Section 2.1 with respect to any Contribution become + effective for each Contribution on the date the Contributor first distributes + such Contribution. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +2.3. Limitations on Grant Scope ------ + The licenses granted in this Section 2 are the only rights granted under this + License. No additional rights or licenses will be implied from the distribution + or licensing of Covered Software under this License. Notwithstanding Section + 2.1(b) above, no patent license is granted by a Contributor: -The following software may be included in this product: es-to-primitive, is-boolean-object, is-callable, is-date-object, is-number-object, is-string, is-symbol, is-typed-array, object.entries, object.getownpropertydescriptors, object.values, string.prototype.matchall, which-typed-array. A copy of the source code may be downloaded from git://github.com/ljharb/es-to-primitive.git (es-to-primitive), git://github.com/inspect-js/is-boolean-object.git (is-boolean-object), git://github.com/inspect-js/is-callable.git (is-callable), git://github.com/inspect-js/is-date-object.git (is-date-object), git://github.com/inspect-js/is-number-object.git (is-number-object), git://github.com/ljharb/is-string.git (is-string), git://github.com/inspect-js/is-symbol.git (is-symbol), git://github.com/inspect-js/is-typed-array.git (is-typed-array), git://github.com/es-shims/Object.entries.git (object.entries), git://github.com/es-shims/object.getownpropertydescriptors.git (object.getownpropertydescriptors), git://github.com/es-shims/Object.values.git (object.values), git+https://github.com/es-shims/String.prototype.matchAll.git (string.prototype.matchall), git://github.com/inspect-js/which-typed-array.git (which-typed-array). This software contains the following license and notice below: + a. for any code that a Contributor has removed from Covered Software; or -The MIT License (MIT) + b. for infringements caused by: (i) Your and any other third party’s + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or -Copyright (c) 2015 Jordan Harband + c. under Patent Claims infringed by Covered Software in the absence of its + Contributions. -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: + This License does not grant any rights in the trademarks, service marks, or + logos of any Contributor (except as may be necessary to comply with the + notice requirements in Section 3.4). -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +2.4. Subsequent Licenses -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. + No Contributor makes additional grants as a result of Your choice to + distribute the Covered Software under a subsequent version of this License + (see Section 10.2) or under the terms of a Secondary License (if permitted + under the terms of Section 3.3). ------ +2.5. Representation -The following software may be included in this product: es5-ext, ext. A copy of the source code may be downloaded from https://github.com/medikoo/es5-ext.git (es5-ext), https://github.com/medikoo/es5-ext#ext (ext). This software contains the following license and notice below: + Each Contributor represents that the Contributor believes its Contributions + are its original creation(s) or it has sufficient rights to grant the + rights to its Contributions conveyed by this License. -ISC License +2.6. Fair Use -Copyright (c) 2011-2019, Mariusz Nowak, @medikoo, medikoo.com + This License is not intended to limit any rights You have under applicable + copyright doctrines of fair use, fair dealing, or other equivalents. -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. +2.7. Conditions -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE -OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE. + Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in + Section 2.1. ------ -The following software may be included in this product: es6-iterator. A copy of the source code may be downloaded from git://github.com/medikoo/es6-iterator.git. This software contains the following license and notice below: +3. Responsibilities -The MIT License (MIT) +3.1. Distribution of Source Form -Copyright (C) 2013-2017 Mariusz Nowak (www.medikoo.com) + All distribution of Covered Software in Source Code Form, including any + Modifications that You create or to which You contribute, must be under the + terms of this License. You must inform recipients that the Source Code Form + of the Covered Software is governed by the terms of this License, and how + they can obtain a copy of this License. You may not attempt to alter or + restrict the recipients’ rights in the Source Code Form. -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +3.2. Distribution of Executable Form -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. + If You distribute Covered Software in Executable Form then: -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. + a. such Covered Software must also be made available in Source Code Form, + as described in Section 3.1, and You must inform recipients of the + Executable Form how they can obtain a copy of such Source Code Form by + reasonable means in a timely manner, at a charge no more than the cost + of distribution to the recipient; and ------ + b. You may distribute such Executable Form under the terms of this License, + or sublicense it under different terms, provided that the license for + the Executable Form does not attempt to limit or alter the recipients’ + rights in the Source Code Form under this License. -The following software may be included in this product: es6-promise. A copy of the source code may be downloaded from git://github.com/stefanpenner/es6-promise.git. This software contains the following license and notice below: +3.3. Distribution of a Larger Work -Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors + You may create and distribute a Larger Work under terms of Your choice, + provided that You also comply with the requirements of this License for the + Covered Software. If the Larger Work is a combination of Covered Software + with a work governed by one or more Secondary Licenses, and the Covered + Software is not Incompatible With Secondary Licenses, this License permits + You to additionally distribute such Covered Software under the terms of + such Secondary License(s), so that the recipient of the Larger Work may, at + their option, further distribute the Covered Software under the terms of + either this License or such Secondary License(s). -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: +3.4. Notices -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. + You may not remove or alter the substance of any license notices (including + copyright notices, patent notices, disclaimers of warranty, or limitations + of liability) contained within the Source Code Form of the Covered + Software, except that You may alter any license notices to the extent + required to remedy known factual inaccuracies. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +3.5. Application of Additional Terms ------ + You may choose to offer, and to charge a fee for, warranty, support, + indemnity or liability obligations to one or more recipients of Covered + Software. However, You may do so only on Your own behalf, and not on behalf + of any Contributor. You must make it absolutely clear that any such + warranty, support, indemnity, or liability obligation is offered by You + alone, and You hereby agree to indemnify every Contributor for any + liability incurred by such Contributor as a result of warranty, support, + indemnity or liability terms You offer. You may include additional + disclaimers of warranty and limitations of liability specific to any + jurisdiction. -The following software may be included in this product: es6-weak-map. A copy of the source code may be downloaded from git://github.com/medikoo/es6-weak-map.git. This software contains the following license and notice below: +4. Inability to Comply Due to Statute or Regulation -ISC License + If it is impossible for You to comply with any of the terms of this License + with respect to some or all of the Covered Software due to statute, judicial + order, or regulation then You must: (a) comply with the terms of this License + to the maximum extent possible; and (b) describe the limitations and the code + they affect. Such description must be placed in a text file included with all + distributions of the Covered Software under this License. Except to the + extent prohibited by statute or regulation, such description must be + sufficiently detailed for a recipient of ordinary skill to be able to + understand it. -Copyright (c) 2013-2018, Mariusz Nowak, @medikoo, medikoo.com +5. Termination -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. +5.1. The rights granted under this License will terminate automatically if You + fail to comply with any of its terms. However, if You become compliant, + then the rights granted under this License from a particular Contributor + are reinstated (a) provisionally, unless and until such Contributor + explicitly and finally terminates Your grants, and (b) on an ongoing basis, + if such Contributor fails to notify You of the non-compliance by some + reasonable means prior to 60 days after You have come back into compliance. + Moreover, Your grants from a particular Contributor are reinstated on an + ongoing basis if such Contributor notifies You of the non-compliance by + some reasonable means, this is the first time You have received notice of + non-compliance with this License from such Contributor, and You become + compliant prior to 30 days after Your receipt of the notice. -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE -OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE. +5.2. If You initiate litigation against any entity by asserting a patent + infringement claim (excluding declaratory judgment actions, counter-claims, + and cross-claims) alleging that a Contributor Version directly or + indirectly infringes any patent, then the rights granted to You by any and + all Contributors for the Covered Software under Section 2.1 of this License + shall terminate. ------ +5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user + license agreements (excluding distributors and resellers) which have been + validly granted by You or Your distributors under this License prior to + termination shall survive termination. -The following software may be included in this product: escalade, klona. A copy of the source code may be downloaded from https://github.com/lukeed/escalade.git (escalade), https://github.com/lukeed/klona.git (klona). This software contains the following license and notice below: +6. Disclaimer of Warranty -MIT License + Covered Software is provided under this License on an “as is” basis, without + warranty of any kind, either expressed, implied, or statutory, including, + without limitation, warranties that the Covered Software is free of defects, + merchantable, fit for a particular purpose or non-infringing. The entire + risk as to the quality and performance of the Covered Software is with You. + Should any Covered Software prove defective in any respect, You (not any + Contributor) assume the cost of any necessary servicing, repair, or + correction. This disclaimer of warranty constitutes an essential part of this + License. No use of any Covered Software is authorized under this License + except under this disclaimer. -Copyright (c) Luke Edwards (lukeed.com) +7. Limitation of Liability -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + Under no circumstances and under no legal theory, whether tort (including + negligence), contract, or otherwise, shall any Contributor, or anyone who + distributes Covered Software as permitted above, be liable to You for any + direct, indirect, special, incidental, or consequential damages of any + character including, without limitation, damages for lost profits, loss of + goodwill, work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses, even if such party shall have been + informed of the possibility of such damages. This limitation of liability + shall not apply to liability for death or personal injury resulting from such + party’s negligence to the extent applicable law prohibits such limitation. + Some jurisdictions do not allow the exclusion or limitation of incidental or + consequential damages, so this exclusion and limitation may not apply to You. -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +8. Litigation -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + Any litigation relating to this License may be brought only in the courts of + a jurisdiction where the defendant maintains its principal place of business + and such litigation shall be governed by laws of that jurisdiction, without + reference to its conflict-of-law provisions. Nothing in this Section shall + prevent a party’s ability to bring cross-claims or counter-claims. ------ +9. Miscellaneous -The following software may be included in this product: escape-html. A copy of the source code may be downloaded from https://github.com/component/escape-html.git. This software contains the following license and notice below: + This License represents the complete agreement concerning the subject matter + hereof. If any provision of this License is held to be unenforceable, such + provision shall be reformed only to the extent necessary to make it + enforceable. Any law or regulation which provides that the language of a + contract shall be construed against the drafter shall not be used to construe + this License against a Contributor. -(The MIT License) -Copyright (c) 2012-2013 TJ Holowaychuk -Copyright (c) 2015 Andreas Lubbe -Copyright (c) 2015 Tiancheng "Timothy" Gu +10. Versions of the License -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: +10.1. New Versions -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. + Mozilla Foundation is the license steward. Except as provided in Section + 10.3, no one other than the license steward has the right to modify or + publish new versions of this License. Each version will be given a + distinguishing version number. -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +10.2. Effect of New Versions ------ + You may distribute the Covered Software under the terms of the version of + the License under which You originally received the Covered Software, or + under the terms of any subsequent version published by the license + steward. -The following software may be included in this product: escodegen. A copy of the source code may be downloaded from http://github.com/estools/escodegen.git. This software contains the following license and notice below: +10.3. Modified Versions -Copyright (C) 2012 Yusuke Suzuki (twitter: @Constellation) and other contributors. + If you create software not governed by this License, and you want to + create a new license for such software, you may create and use a modified + version of this License if you rename the license and remove any + references to the name of the license steward (except to note that such + modified license differs from this License). -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: +10.4. Distributing Source Code Form that is Incompatible With Secondary Licenses + If You choose to distribute Source Code Form that is Incompatible With + Secondary Licenses under the terms of this version of the License, the + notice described in Exhibit B of this License must be attached. - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. +Exhibit A - Source Code Form License Notice -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + This Source Code Form is subject to the + terms of the Mozilla Public License, v. + 2.0. If a copy of the MPL was not + distributed with this file, You can + obtain one at + http://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular file, then +You may include the notice in a location (such as a LICENSE file in a relevant +directory) where a recipient would be likely to look for such a notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - “Incompatible With Secondary Licenses” Notice + + This Source Code Form is “Incompatible + With Secondary Licenses”, as defined by + the Mozilla Public License, v. 2.0. ----- -The following software may be included in this product: eslint. A copy of the source code may be downloaded from https://github.com/eslint/eslint.git. This software contains the following license and notice below: +The following software may be included in this product: domready. A copy of the source code may be downloaded from https://github.com/ded/domready.git. This software contains the following license and notice below: -Copyright JS Foundation and other contributors, https://js.foundation +The MIT License (MIT) + +Copyright (c) 2013 Dustin Diaz Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -8923,11 +9204,37 @@ THE SOFTWARE. ----- -The following software may be included in this product: eslint-plugin-react. A copy of the source code may be downloaded from https://github.com/yannickcr/eslint-plugin-react. This software contains the following license and notice below: +The following software may be included in this product: duplexify, end-of-stream, protocol-buffers-schema, pump, pumpify. A copy of the source code may be downloaded from git://github.com/mafintosh/duplexify (duplexify), git://github.com/mafintosh/end-of-stream.git (end-of-stream), https://github.com/mafintosh/protocol-buffers-schema (protocol-buffers-schema), git://github.com/mafintosh/pump.git (pump), git://github.com/mafintosh/pumpify (pumpify). This software contains the following license and notice below: The MIT License (MIT) -Copyright (c) 2014 Yannick Croissant +Copyright (c) 2014 Mathias Buus + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +----- + +The following software may be included in this product: each-props. A copy of the source code may be downloaded from git+https://github.com/sttk/each-props.git. This software contains the following license and notice below: + +MIT License + +Copyright (c) 2016 Takayuki Sato Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -8949,38 +9256,31 @@ SOFTWARE. ----- -The following software may be included in this product: eslint-scope. A copy of the source code may be downloaded from https://github.com/eslint/eslint-scope.git. This software contains the following license and notice below: +The following software may be included in this product: earcut. A copy of the source code may be downloaded from git://github.com/mapbox/earcut.git. This software contains the following license and notice below: -Copyright JS Foundation and other contributors, https://js.foundation -Copyright (C) 2012-2013 Yusuke Suzuki (twitter: @Constellation) and other contributors. +ISC License -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: +Copyright (c) 2016, Mapbox - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. +Permission to use, copy, modify, and/or distribute this software for any purpose +with or without fee is hereby granted, provided that the above copyright notice +and this permission notice appear in all copies. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. ----- -The following software may be included in this product: eslint-utils, regexpp. A copy of the source code may be downloaded from git+https://github.com/mysticatea/eslint-utils.git (eslint-utils), git+https://github.com/mysticatea/regexpp.git (regexpp). This software contains the following license and notice below: +The following software may be included in this product: ecc-jsbn. A copy of the source code may be downloaded from https://github.com/quartzjer/ecc-jsbn.git. This software contains the following license and notice below: -MIT License +The MIT License (MIT) -Copyright (c) 2018 Toru Nagashima +Copyright (c) 2014 Jeremie Miller Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -9002,353 +9302,215 @@ SOFTWARE. ----- -The following software may be included in this product: eslint-visitor-keys. A copy of the source code may be downloaded from https://github.com/eslint/eslint-visitor-keys.git. This software contains the following license and notice below: +The following software may be included in this product: electron-to-chromium. A copy of the source code may be downloaded from https://github.com/kilian/electron-to-chromium/. This software contains the following license and notice below: -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ +Copyright 2018 Kilian Valkhof - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION +Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. - 1. Definitions. +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. +----- - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. +The following software may be included in this product: emojis-list. A copy of the source code may be downloaded from git+https://github.com/kikobeats/emojis-list.git. This software contains the following license and notice below: - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. +The MIT License (MIT) - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. +Copyright © 2015 Kiko Beats - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). +THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. +----- - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." +The following software may be included in this product: encodeurl. A copy of the source code may be downloaded from https://github.com/pillarjs/encodeurl.git. This software contains the following license and notice below: - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. +(The MIT License) - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. +Copyright (c) 2016 Douglas Christopher Wilson - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. +----- - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. +The following software may be included in this product: engine.io. A copy of the source code may be downloaded from git@github.com:socketio/engine.io.git. This software contains the following license and notice below: - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. +(The MIT License) - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. +Copyright (c) 2014 Guillermo Rauch - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. +Permission is hereby granted, free of charge, to any person obtaining a copy of this software +and associated documentation files (the 'Software'), to deal in the Software without restriction, +including without limitation the rights to use, copy, modify, merge, publish, distribute, +sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. +The above copyright notice and this permission notice shall be included in all copies or +substantial portions of the Software. - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - END OF TERMS AND CONDITIONS +----- - APPENDIX: How to apply the Apache License to your work. +The following software may be included in this product: engine.io-client. A copy of the source code may be downloaded from https://github.com/socketio/engine.io-client.git. This software contains the following license and notice below: - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. +(The MIT License) - Copyright contributors +Copyright (c) 2014-2015 Automattic - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: - http://www.apache.org/licenses/LICENSE-2.0 +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----- -The following software may be included in this product: espree. A copy of the source code may be downloaded from https://github.com/eslint/espree.git. This software contains the following license and notice below: - -BSD 2-Clause License +The following software may be included in this product: engine.io-parser. A copy of the source code may be downloaded from git@github.com:socketio/engine.io-parser.git. This software contains the following license and notice below: -Copyright (c) Open JS Foundation -All rights reserved. +(The MIT License) -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: +Copyright (c) 2016 Guillermo Rauch (@rauchg) -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----- -The following software may be included in this product: esprima. A copy of the source code may be downloaded from https://github.com/jquery/esprima.git. This software contains the following license and notice below: +The following software may be included in this product: enquirer. A copy of the source code may be downloaded from https://github.com/enquirer/enquirer.git. This software contains the following license and notice below: -Copyright JS Foundation and other contributors, https://js.foundation/ +The MIT License (MIT) -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: +Copyright (c) 2016-present, Jon Schlinkert. - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. ----- -The following software may be included in this product: esquery. A copy of the source code may be downloaded from https://github.com/estools/esquery.git. This software contains the following license and notice below: +The following software may be included in this product: error-ex, is-arrayish. A copy of the source code may be downloaded from https://github.com/qix-/node-error-ex.git (error-ex), https://github.com/qix-/node-is-arrayish.git (is-arrayish). This software contains the following license and notice below: -Copyright (c) 2013, Joel Feenstra -All rights reserved. +The MIT License (MIT) -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the ESQuery nor the names of its contributors may - be used to endorse or promote products derived from this software without - specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL JOEL FEENSTRA BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - ------ - -The following software may be included in this product: estraverse, esutils. A copy of the source code may be downloaded from http://github.com/estools/estraverse.git (estraverse), http://github.com/estools/esutils.git (esutils). This software contains the following license and notice below: +Copyright (c) 2015 JD Ballard -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. ----- -The following software may be included in this product: etag, proxy-addr. A copy of the source code may be downloaded from https://github.com/jshttp/etag.git (etag), https://github.com/jshttp/proxy-addr.git (proxy-addr). This software contains the following license and notice below: - -(The MIT License) +The following software may be included in this product: error-stack-parser, stackframe. A copy of the source code may be downloaded from git://github.com/stacktracejs/error-stack-parser.git (error-stack-parser), git://github.com/stacktracejs/stackframe.git (stackframe). This software contains the following license and notice below: -Copyright (c) 2014-2016 Douglas Christopher Wilson +Copyright (c) 2017 Eric Wendelin and other contributors -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. ----- -The following software may be included in this product: eventemitter3. A copy of the source code may be downloaded from git://github.com/primus/eventemitter3.git. This software contains the following license and notice below: +The following software may be included in this product: es-to-primitive, is-boolean-object, is-callable, is-date-object, is-number-object, is-string, is-symbol, is-typed-array, object.entries, object.getownpropertydescriptors, object.values, string.prototype.matchall, which-typed-array. A copy of the source code may be downloaded from git://github.com/ljharb/es-to-primitive.git (es-to-primitive), git://github.com/inspect-js/is-boolean-object.git (is-boolean-object), git://github.com/inspect-js/is-callable.git (is-callable), git://github.com/inspect-js/is-date-object.git (is-date-object), git://github.com/inspect-js/is-number-object.git (is-number-object), git://github.com/ljharb/is-string.git (is-string), git://github.com/inspect-js/is-symbol.git (is-symbol), git://github.com/inspect-js/is-typed-array.git (is-typed-array), git://github.com/es-shims/Object.entries.git (object.entries), git://github.com/es-shims/object.getownpropertydescriptors.git (object.getownpropertydescriptors), git://github.com/es-shims/Object.values.git (object.values), git+https://github.com/es-shims/String.prototype.matchAll.git (string.prototype.matchall), git://github.com/inspect-js/which-typed-array.git (which-typed-array). This software contains the following license and notice below: The MIT License (MIT) -Copyright (c) 2014 Arnout Kazemier +Copyright (c) 2015 Jordan Harband Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -9370,65 +9532,31 @@ SOFTWARE. ----- -The following software may be included in this product: events. A copy of the source code may be downloaded from git://github.com/Gozala/events.git. This software contains the following license and notice below: - -MIT - -Copyright Joyent, Inc. and other Node contributors. - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to permit -persons to whom the Software is furnished to do so, subject to the -following conditions: - -The above copyright notice and this permission notice shall be included -in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -USE OR OTHER DEALINGS IN THE SOFTWARE. - ------ - -The following software may be included in this product: eventsource. A copy of the source code may be downloaded from git://github.com/EventSource/eventsource.git. This software contains the following license and notice below: - -The MIT License +The following software may be included in this product: es5-ext, ext. A copy of the source code may be downloaded from https://github.com/medikoo/es5-ext.git (es5-ext), https://github.com/medikoo/es5-ext#ext (ext). This software contains the following license and notice below: -Copyright (c) EventSource GitHub organisation +ISC License -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: +Copyright (c) 2011-2019, Mariusz Nowak, @medikoo, medikoo.com -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE +OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. ----- -The following software may be included in this product: expand-tilde, map-cache, snapdragon, to-object-path. A copy of the source code may be downloaded from https://github.com/jonschlinkert/expand-tilde.git (expand-tilde), https://github.com/jonschlinkert/map-cache.git (map-cache), https://github.com/jonschlinkert/snapdragon.git (snapdragon), https://github.com/jonschlinkert/to-object-path.git (to-object-path). This software contains the following license and notice below: +The following software may be included in this product: es6-iterator. A copy of the source code may be downloaded from git://github.com/medikoo/es6-iterator.git. This software contains the following license and notice below: The MIT License (MIT) -Copyright (c) 2015-2016, Jon Schlinkert. +Copyright (C) 2013-2017 Mariusz Nowak (www.medikoo.com) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -9450,69 +9578,75 @@ THE SOFTWARE. ----- -The following software may be included in this product: express. A copy of the source code may be downloaded from https://github.com/expressjs/express.git. This software contains the following license and notice below: +The following software may be included in this product: es6-promise. A copy of the source code may be downloaded from git://github.com/stefanpenner/es6-promise.git. This software contains the following license and notice below: -(The MIT License) +Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors -Copyright (c) 2009-2014 TJ Holowaychuk -Copyright (c) 2013-2014 Roman Shtylman -Copyright (c) 2014-2015 Douglas Christopher Wilson +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +----- + +The following software may be included in this product: es6-weak-map. A copy of the source code may be downloaded from git://github.com/medikoo/es6-weak-map.git. This software contains the following license and notice below: + +ISC License + +Copyright (c) 2013-2018, Mariusz Nowak, @medikoo, medikoo.com + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE +OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. ----- -The following software may be included in this product: express-brute. A copy of the source code may be downloaded from git@github.com:AdamPflug/express-brute.git. This software contains the following license and notice below: +The following software may be included in this product: escalade, klona. A copy of the source code may be downloaded from https://github.com/lukeed/escalade.git (escalade), https://github.com/lukeed/klona.git (klona). This software contains the following license and notice below: -The MIT License (MIT) +MIT License -Copyright (c) 2013 Adam Pflug +Copyright (c) Luke Edwards (lukeed.com) -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----- -The following software may be included in this product: extend. A copy of the source code may be downloaded from https://github.com/justmoon/node-extend.git. This software contains the following license and notice below: +The following software may be included in this product: escape-html. A copy of the source code may be downloaded from https://github.com/component/escape-html.git. This software contains the following license and notice below: -The MIT License (MIT) +(The MIT License) -Copyright (c) 2014 Stefan Thomas +Copyright (c) 2012-2013 TJ Holowaychuk +Copyright (c) 2015 Andreas Lubbe +Copyright (c) 2015 Tiancheng "Timothy" Gu Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including +'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to @@ -9521,47 +9655,45 @@ the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - ------ - -The following software may be included in this product: extend-shallow, mixin-deep. A copy of the source code may be downloaded from https://github.com/jonschlinkert/extend-shallow.git (extend-shallow), https://github.com/jonschlinkert/mixin-deep.git (mixin-deep). This software contains the following license and notice below: +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -The MIT License (MIT) +----- -Copyright (c) 2014-2015, 2017, Jon Schlinkert. +The following software may be included in this product: escodegen. A copy of the source code may be downloaded from http://github.com/estools/escodegen.git. This software contains the following license and notice below: -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +Copyright (C) 2012 Yusuke Suzuki (twitter: @Constellation) and other contributors. -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. ------ +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -The following software may be included in this product: extend-shallow, parse-filepath. A copy of the source code may be downloaded from https://github.com/jonschlinkert/extend-shallow.git (extend-shallow), https://github.com/jonschlinkert/parse-filepath.git (parse-filepath). This software contains the following license and notice below: +----- -The MIT License (MIT) +The following software may be included in this product: eslint. A copy of the source code may be downloaded from https://github.com/eslint/eslint.git. This software contains the following license and notice below: -Copyright (c) 2014-2015, Jon Schlinkert. +Copyright JS Foundation and other contributors, https://js.foundation Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -9583,9 +9715,11 @@ THE SOFTWARE. ----- -The following software may be included in this product: extsprintf, jsprim. A copy of the source code may be downloaded from https://github.com/davepacheco/node-extsprintf.git (extsprintf), git://github.com/joyent/node-jsprim.git (jsprim). This software contains the following license and notice below: +The following software may be included in this product: eslint-config-prettier. A copy of the source code may be downloaded from https://github.com/prettier/eslint-config-prettier.git. This software contains the following license and notice below: -Copyright (c) 2012, Joyent, Inc. All rights reserved. +The MIT License (MIT) + +Copyright (c) 2017, 2018, 2019, 2020, 2021, 2022, 2023 Simon Lydell and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -9603,15 +9737,15 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE +THE SOFTWARE. ----- -The following software may be included in this product: fancy-log, glogg. A copy of the source code may be downloaded from https://github.com/gulpjs/fancy-log.git (fancy-log), https://github.com/gulpjs/glogg.git (glogg). This software contains the following license and notice below: +The following software may be included in this product: eslint-plugin-react. A copy of the source code may be downloaded from https://github.com/yannickcr/eslint-plugin-react. This software contains the following license and notice below: The MIT License (MIT) -Copyright (c) 2014, 2015, 2018 Blaine Bublitz and Eric Schoffstall +Copyright (c) 2014 Yannick Croissant Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -9633,66 +9767,11 @@ SOFTWARE. ----- -The following software may be included in this product: fast-json-stable-stringify. A copy of the source code may be downloaded from git://github.com/epoberezkin/fast-json-stable-stringify.git. This software contains the following license and notice below: - -This software is released under the MIT license: - -Copyright (c) 2017 Evgeny Poberezkin -Copyright (c) 2013 James Halliday - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - ------ - -The following software may be included in this product: fast-levenshtein. A copy of the source code may be downloaded from https://github.com/hiddentao/fast-levenshtein.git. This software contains the following license and notice below: - -(MIT License) - -Copyright (c) 2013 [Ramesh Nair](http://www.hiddentao.com/) - -Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated documentation -files (the "Software"), to deal in the Software without -restriction, including without limitation the rights to use, -copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. - ------ - -The following software may be included in this product: fast-xml-parser. A copy of the source code may be downloaded from https://github.com/NaturalIntelligence/fast-xml-parser. This software contains the following license and notice below: +The following software may be included in this product: eslint-plugin-react-hooks, react, react-dom, react-is, react-test-renderer, scheduler. A copy of the source code may be downloaded from https://github.com/facebook/react.git (eslint-plugin-react-hooks), git+https://github.com/facebook/react.git (react), git+https://github.com/facebook/react.git (react-dom), https://github.com/facebook/react.git (react-is), git+https://github.com/facebook/react.git (react-test-renderer), https://github.com/facebook/react.git (scheduler). This software contains the following license and notice below: MIT License -Copyright (c) 2017 Amit Kumar Gupta +Copyright (c) Facebook, Inc. and its affiliates. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -9714,112 +9793,353 @@ SOFTWARE. ----- -The following software may be included in this product: fastq. A copy of the source code may be downloaded from git+https://github.com/mcollina/fastq.git. This software contains the following license and notice below: - -Copyright (c) 2015-2020, Matteo Collina - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. +The following software may be included in this product: eslint-scope. A copy of the source code may be downloaded from https://github.com/eslint/eslint-scope.git. This software contains the following license and notice below: -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +Copyright JS Foundation and other contributors, https://js.foundation +Copyright (C) 2012-2013 Yusuke Suzuki (twitter: @Constellation) and other contributors. ------ +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: -The following software may be included in this product: faye-websocket. A copy of the source code may be downloaded from git://github.com/faye/faye-websocket-node.git. This software contains the following license and notice below: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. -Copyright 2010-2021 James Coglan +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -Licensed under the Apache License, Version 2.0 (the "License"); you may not use -this file except in compliance with the License. You may obtain a copy of the -License at +----- - http://www.apache.org/licenses/LICENSE-2.0 +The following software may be included in this product: eslint-visitor-keys. A copy of the source code may be downloaded from https://github.com/eslint/eslint-visitor-keys.git. This software contains the following license and notice below: -Unless required by applicable law or agreed to in writing, software distributed -under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR -CONDITIONS OF ANY KIND, either express or implied. See the License for the -specific language governing permissions and limitations under the License. +Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ ------ + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION -The following software may be included in this product: fetch-mock. A copy of the source code may be downloaded from https://github.com/wheresrhys/fetch-mock.git. This software contains the following license and notice below: + 1. Definitions. -The MIT License (MIT) + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. -Copyright (c) 2015 Rhys Evans + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. ------ + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. -The following software may be included in this product: file-entry-cache, flat-cache. A copy of the source code may be downloaded from https://github.com/royriojas/file-entry-cache.git (file-entry-cache), https://github.com/royriojas/flat-cache.git (flat-cache). This software contains the following license and notice below: + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). -The MIT License (MIT) + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. -Copyright (c) 2015 Roy Riojas + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright contributors + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. ----- -The following software may be included in this product: file-saver. A copy of the source code may be downloaded from git+https://github.com/eligrey/FileSaver.js.git. This software contains the following license and notice below: +The following software may be included in this product: espree. A copy of the source code may be downloaded from https://github.com/eslint/espree.git. This software contains the following license and notice below: -The MIT License +BSD 2-Clause License -Copyright © 2016 [Eli Grey][1]. +Copyright (c) Open JS Foundation +All rights reserved. -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. - [1]: http://eligrey.com +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ----- -The following software may be included in this product: file-uri-to-path. A copy of the source code may be downloaded from git://github.com/TooTallNate/file-uri-to-path.git. This software contains the following license and notice below: +The following software may be included in this product: esprima. A copy of the source code may be downloaded from https://github.com/jquery/esprima.git. This software contains the following license and notice below: -Copyright (c) 2014 Nathan Rajlich +Copyright JS Foundation and other contributors, https://js.foundation/ + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +----- + +The following software may be included in this product: esquery. A copy of the source code may be downloaded from https://github.com/estools/esquery.git. This software contains the following license and notice below: + +Copyright (c) 2013, Joel Feenstra +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the ESQuery nor the names of its contributors may + be used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL JOEL FEENSTRA BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +----- + +The following software may be included in this product: estraverse, esutils. A copy of the source code may be downloaded from http://github.com/estools/estraverse.git (estraverse), http://github.com/estools/esutils.git (esutils). This software contains the following license and notice below: + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +----- + +The following software may be included in this product: etag, proxy-addr. A copy of the source code may be downloaded from https://github.com/jshttp/etag.git (etag), https://github.com/jshttp/proxy-addr.git (proxy-addr). This software contains the following license and notice below: + +(The MIT License) + +Copyright (c) 2014-2016 Douglas Christopher Wilson Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the @@ -9842,11 +10162,11 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----- -The following software may be included in this product: fill-range, is-number, micromatch. A copy of the source code may be downloaded from https://github.com/jonschlinkert/fill-range.git (fill-range), https://github.com/jonschlinkert/is-number.git (is-number), https://github.com/micromatch/micromatch.git (micromatch). This software contains the following license and notice below: +The following software may be included in this product: eventemitter3. A copy of the source code may be downloaded from git://github.com/primus/eventemitter3.git. This software contains the following license and notice below: The MIT License (MIT) -Copyright (c) 2014-present, Jon Schlinkert. +Copyright (c) 2014 Arnout Kazemier Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -9855,28 +10175,55 @@ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. ----- -The following software may be included in this product: finalhandler. A copy of the source code may be downloaded from https://github.com/pillarjs/finalhandler.git. This software contains the following license and notice below: +The following software may be included in this product: events. A copy of the source code may be downloaded from git://github.com/Gozala/events.git. This software contains the following license and notice below: -(The MIT License) +MIT -Copyright (c) 2014-2017 Douglas Christopher Wilson +Copyright Joyent, Inc. and other Node contributors. + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the +following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +USE OR OTHER DEALINGS IN THE SOFTWARE. + +----- + +The following software may be included in this product: eventsource. A copy of the source code may be downloaded from git://github.com/EventSource/eventsource.git. This software contains the following license and notice below: + +The MIT License + +Copyright (c) EventSource GitHub organisation Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including +"Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to @@ -9885,21 +10232,49 @@ the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----- -The following software may be included in this product: find. A copy of the source code may be downloaded from git://github.com/yuanchuan/find.git. This software contains the following license and notice below: +The following software may be included in this product: expand-tilde, map-cache, snapdragon, to-object-path. A copy of the source code may be downloaded from https://github.com/jonschlinkert/expand-tilde.git (expand-tilde), https://github.com/jonschlinkert/map-cache.git (map-cache), https://github.com/jonschlinkert/snapdragon.git (snapdragon), https://github.com/jonschlinkert/to-object-path.git (to-object-path). This software contains the following license and notice below: + +The MIT License (MIT) + +Copyright (c) 2015-2016, Jon Schlinkert. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +----- + +The following software may be included in this product: express. A copy of the source code may be downloaded from https://github.com/expressjs/express.git. This software contains the following license and notice below: (The MIT License) -Copyright (c) 2013-2018 Yuan Chuan +Copyright (c) 2009-2014 TJ Holowaychuk +Copyright (c) 2013-2014 Roman Shtylman +Copyright (c) 2014-2015 Douglas Christopher Wilson Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the @@ -9922,37 +10297,63 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----- -The following software may be included in this product: find-cache-dir. A copy of the source code may be downloaded from https://github.com/avajs/find-cache-dir.git. This software contains the following license and notice below: +The following software may be included in this product: express-brute. A copy of the source code may be downloaded from git@github.com:AdamPflug/express-brute.git. This software contains the following license and notice below: -MIT License +The MIT License (MIT) -Copyright (c) James Talmage (github.com/jamestalmage) +Copyright (c) 2013 Adam Pflug -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----- -The following software may be included in this product: find-root. A copy of the source code may be downloaded from git@github.com:js-n/find-root.git. This software contains the following license and notice below: +The following software may be included in this product: extend. A copy of the source code may be downloaded from https://github.com/justmoon/node-extend.git. This software contains the following license and notice below: -Copyright © 2017 jsdnxx +The MIT License (MIT) -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +Copyright (c) 2014 Stefan Thomas -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: -THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----- -The following software may be included in this product: findup-sync. A copy of the source code may be downloaded from https://github.com/gulpjs/findup-sync.git. This software contains the following license and notice below: +The following software may be included in this product: extend-shallow, mixin-deep. A copy of the source code may be downloaded from https://github.com/jonschlinkert/extend-shallow.git (extend-shallow), https://github.com/jonschlinkert/mixin-deep.git (mixin-deep). This software contains the following license and notice below: The MIT License (MIT) -Copyright (c) 2013-2018 Ben Alman , Blaine Bublitz , and Eric Schoffstall +Copyright (c) 2014-2015, 2017, Jon Schlinkert. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -9961,24 +10362,24 @@ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. ----- -The following software may be included in this product: fined. A copy of the source code may be downloaded from https://github.com/gulpjs/fined.git. This software contains the following license and notice below: +The following software may be included in this product: extend-shallow, parse-filepath. A copy of the source code may be downloaded from https://github.com/jonschlinkert/extend-shallow.git (extend-shallow), https://github.com/jonschlinkert/parse-filepath.git (parse-filepath). This software contains the following license and notice below: The MIT License (MIT) -Copyright (c) 2016, 2017, 2018 Blaine Bublitz and Eric Schoffstall +Copyright (c) 2014-2015, Jon Schlinkert. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -9987,24 +10388,22 @@ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. ----- -The following software may be included in this product: flagged-respawn, v8flags. A copy of the source code may be downloaded from https://github.com/gulpjs/flagged-respawn.git (flagged-respawn), https://github.com/gulpjs/v8flags.git (v8flags). This software contains the following license and notice below: - -The MIT License (MIT) +The following software may be included in this product: extsprintf, jsprim. A copy of the source code may be downloaded from https://github.com/davepacheco/node-extsprintf.git (extsprintf), git://github.com/joyent/node-jsprim.git (jsprim). This software contains the following license and notice below: -Copyright (c) 2014-2018 Tyler Kellen , Blaine Bublitz , and Eric Schoffstall +Copyright (c) 2012, Joyent, Inc. All rights reserved. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -10013,107 +10412,24 @@ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - ------ - -The following software may be included in this product: flatqueue, quickselect. A copy of the source code may be downloaded from git+https://github.com/mourner/flatqueue.git (flatqueue). This software contains the following license and notice below: - -ISC License - -Copyright (c) 2018, Vladimir Agafonkin - -Permission to use, copy, modify, and/or distribute this software for any purpose -with or without fee is hereby granted, provided that the above copyright notice -and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS -OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER -TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF -THIS SOFTWARE. - ------ - -The following software may be included in this product: flatted. A copy of the source code may be downloaded from git+https://github.com/WebReflection/flatted.git. This software contains the following license and notice below: - -ISC License - -Copyright (c) 2018-2020, Andrea Giammarchi, @WebReflection - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE -OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE. - ------ - -The following software may be included in this product: flatted. A copy of the source code may be downloaded from git+https://github.com/WebReflection/flatted.git. This software contains the following license and notice below: - -ISC License - -Copyright (c) 2018, Andrea Giammarchi, @WebReflection - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE -OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE. - ------ - -The following software may be included in this product: follow-redirects. A copy of the source code may be downloaded from git@github.com:follow-redirects/follow-redirects.git. This software contains the following license and notice below: - -Copyright 2014–present Olivier Lalonde , James Talmage , Ruben Verborgh - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE ----- -The following software may be included in this product: for-each. A copy of the source code may be downloaded from git://github.com/Raynos/for-each.git. This software contains the following license and notice below: +The following software may be included in this product: fancy-log, glogg. A copy of the source code may be downloaded from https://github.com/gulpjs/fancy-log.git (fancy-log), https://github.com/gulpjs/glogg.git (glogg). This software contains the following license and notice below: The MIT License (MIT) -Copyright (c) 2012 Raynos. +Copyright (c) 2014, 2015, 2018 Blaine Bublitz and Eric Schoffstall Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -10135,37 +10451,66 @@ SOFTWARE. ----- -The following software may be included in this product: fork-ts-checker-notifier-webpack-plugin. A copy of the source code may be downloaded from https://github.com/johnnyreilly/fork-ts-checker-notifier-webpack-plugin.git. This software contains the following license and notice below: +The following software may be included in this product: fast-json-stable-stringify. A copy of the source code may be downloaded from git://github.com/epoberezkin/fast-json-stable-stringify.git. This software contains the following license and notice below: -The MIT License (MIT) +This software is released under the MIT license: -Copyright (c) 2017 John Reilly +Copyright (c) 2017 Evgeny Poberezkin +Copyright (c) 2013 James Halliday -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----- -The following software may be included in this product: fork-ts-checker-webpack-plugin. A copy of the source code may be downloaded from https://github.com/TypeStrong/fork-ts-checker-webpack-plugin.git. This software contains the following license and notice below: +The following software may be included in this product: fast-levenshtein. A copy of the source code may be downloaded from https://github.com/hiddentao/fast-levenshtein.git. This software contains the following license and notice below: + +(MIT License) + +Copyright (c) 2013 [Ramesh Nair](http://www.hiddentao.com/) + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +----- + +The following software may be included in this product: fast-xml-parser. A copy of the source code may be downloaded from https://github.com/NaturalIntelligence/fast-xml-parser. This software contains the following license and notice below: MIT License -Copyright (c) 2020 TypeStrong +Copyright (c) 2017 Amit Kumar Gupta Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -10187,35 +10532,72 @@ SOFTWARE. ----- -The following software may be included in this product: form-data. A copy of the source code may be downloaded from git://github.com/form-data/form-data.git. This software contains the following license and notice below: +The following software may be included in this product: fastq. A copy of the source code may be downloaded from git+https://github.com/mcollina/fastq.git. This software contains the following license and notice below: -Copyright (c) 2012 Felix Geisendörfer (felix@debuggable.com) and contributors +Copyright (c) 2015-2020, Matteo Collina - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - THE SOFTWARE. +----- + +The following software may be included in this product: faye-websocket. A copy of the source code may be downloaded from git://github.com/faye/faye-websocket-node.git. This software contains the following license and notice below: + +Copyright 2010-2021 James Coglan + +Licensed under the Apache License, Version 2.0 (the "License"); you may not use +this file except in compliance with the License. You may obtain a copy of the +License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed +under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +CONDITIONS OF ANY KIND, either express or implied. See the License for the +specific language governing permissions and limitations under the License. ----- -The following software may be included in this product: fp-ts. A copy of the source code may be downloaded from https://github.com/gcanti/fp-ts.git. This software contains the following license and notice below: +The following software may be included in this product: fetch-mock. A copy of the source code may be downloaded from https://github.com/wheresrhys/fetch-mock.git. This software contains the following license and notice below: -MIT License +The MIT License (MIT) -Copyright (c) 2017-present Giulio Canti +Copyright (c) 2015 Rhys Evans + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +----- + +The following software may be included in this product: file-entry-cache, flat-cache. A copy of the source code may be downloaded from https://github.com/royriojas/file-entry-cache.git (file-entry-cache), https://github.com/royriojas/flat-cache.git (flat-cache). This software contains the following license and notice below: + +The MIT License (MIT) + +Copyright (c) 2015 Roy Riojas Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -10237,11 +10619,52 @@ SOFTWARE. ----- -The following software may be included in this product: fragment-cache, posix-character-classes. A copy of the source code may be downloaded from https://github.com/jonschlinkert/fragment-cache.git (fragment-cache), https://github.com/jonschlinkert/posix-character-classes.git (posix-character-classes). This software contains the following license and notice below: +The following software may be included in this product: file-saver. A copy of the source code may be downloaded from git+https://github.com/eligrey/FileSaver.js.git. This software contains the following license and notice below: + +The MIT License + +Copyright © 2016 [Eli Grey][1]. + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + [1]: http://eligrey.com + +----- + +The following software may be included in this product: file-uri-to-path. A copy of the source code may be downloaded from git://github.com/TooTallNate/file-uri-to-path.git. This software contains the following license and notice below: + +Copyright (c) 2014 Nathan Rajlich + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +----- + +The following software may be included in this product: fill-range, is-number, micromatch. A copy of the source code may be downloaded from https://github.com/jonschlinkert/fill-range.git (fill-range), https://github.com/jonschlinkert/is-number.git (is-number), https://github.com/micromatch/micromatch.git (micromatch). This software contains the following license and notice below: The MIT License (MIT) -Copyright (c) 2016-2017, Jon Schlinkert +Copyright (c) 2014-present, Jon Schlinkert. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -10263,12 +10686,11 @@ THE SOFTWARE. ----- -The following software may be included in this product: fresh. A copy of the source code may be downloaded from https://github.com/jshttp/fresh.git. This software contains the following license and notice below: +The following software may be included in this product: finalhandler. A copy of the source code may be downloaded from https://github.com/pillarjs/finalhandler.git. This software contains the following license and notice below: (The MIT License) -Copyright (c) 2012 TJ Holowaychuk -Copyright (c) 2016-2017 Douglas Christopher Wilson +Copyright (c) 2014-2017 Douglas Christopher Wilson Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the @@ -10291,51 +10713,64 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----- -The following software may be included in this product: from, JSONStream, through. A copy of the source code may be downloaded from git://github.com/dominictarr/from.git (from), git://github.com/dominictarr/JSONStream.git (JSONStream), https://github.com/dominictarr/through.git (through). This software contains the following license and notice below: +The following software may be included in this product: find. A copy of the source code may be downloaded from git://github.com/yuanchuan/find.git. This software contains the following license and notice below: -Apache License, Version 2.0 +(The MIT License) -Copyright (c) 2011 Dominic Tarr +Copyright (c) 2013-2018 Yuan Chuan -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: - http://www.apache.org/licenses/LICENSE-2.0 +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----- -The following software may be included in this product: fs-extra. A copy of the source code may be downloaded from https://github.com/jprichardson/node-fs-extra. This software contains the following license and notice below: +The following software may be included in this product: find-cache-dir. A copy of the source code may be downloaded from https://github.com/avajs/find-cache-dir.git. This software contains the following license and notice below: -(The MIT License) +MIT License -Copyright (c) 2011-2017 JP Richardson +Copyright (c) James Talmage (github.com/jamestalmage) -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files -(the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, - merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS -OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----- -The following software may be included in this product: fs-mkdirp-stream. A copy of the source code may be downloaded from https://github.com/gulpjs/fs-mkdirp-stream.git. This software contains the following license and notice below: +The following software may be included in this product: find-root. A copy of the source code may be downloaded from git@github.com:js-n/find-root.git. This software contains the following license and notice below: + +Copyright © 2017 jsdnxx + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +----- + +The following software may be included in this product: findup-sync. A copy of the source code may be downloaded from https://github.com/gulpjs/findup-sync.git. This software contains the following license and notice below: The MIT License (MIT) -Copyright (c) 2017 Blaine Bublitz , Eric Schoffstall and other contributors (Originally based on code from node-mkdirp - MIT/X11 license - Copyright 2010 James Halliday) +Copyright (c) 2013-2018 Ben Alman , Blaine Bublitz , and Eric Schoffstall Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -10357,89 +10792,146 @@ SOFTWARE. ----- -The following software may be included in this product: fs-monkey, memfs. A copy of the source code may be downloaded from https://github.com/streamich/fs-monkey.git (fs-monkey), https://github.com/streamich/memfs.git (memfs). This software contains the following license and notice below: +The following software may be included in this product: fined. A copy of the source code may be downloaded from https://github.com/gulpjs/fined.git. This software contains the following license and notice below: -This is free and unencumbered software released into the public domain. +The MIT License (MIT) -Anyone is free to copy, modify, publish, use, compile, sell, or -distribute this software, either in source code form or as a compiled -binary, for any purpose, commercial or non-commercial, and by any -means. +Copyright (c) 2016, 2017, 2018 Blaine Bublitz and Eric Schoffstall -In jurisdictions that recognize copyright laws, the author or authors -of this software dedicate any and all copyright interest in the -software to the public domain. We make this dedication for the benefit -of the public at large and to the detriment of our heirs and -successors. We intend this dedication to be an overt act of -relinquishment in perpetuity of all present and future rights to this -software under copyright law. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR -OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, -ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -For more information, please refer to +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. ----- -The following software may be included in this product: fs.realpath. A copy of the source code may be downloaded from git+https://github.com/isaacs/fs.realpath.git. This software contains the following license and notice below: +The following software may be included in this product: flagged-respawn, v8flags. A copy of the source code may be downloaded from https://github.com/gulpjs/flagged-respawn.git (flagged-respawn), https://github.com/gulpjs/v8flags.git (v8flags). This software contains the following license and notice below: -The ISC License +The MIT License (MIT) -Copyright (c) Isaac Z. Schlueter and Contributors +Copyright (c) 2014-2018 Tyler Kellen , Blaine Bublitz , and Eric Schoffstall + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +----- + +The following software may be included in this product: flatqueue, kdbush, quickselect. A copy of the source code may be downloaded from git+https://github.com/mourner/flatqueue.git (flatqueue), git://github.com/mourner/kdbush.git (kdbush). This software contains the following license and notice below: + +ISC License + +Copyright (c) 2018, Vladimir Agafonkin + +Permission to use, copy, modify, and/or distribute this software for any purpose +with or without fee is hereby granted, provided that the above copyright notice +and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. + +----- + +The following software may be included in this product: flatted. A copy of the source code may be downloaded from git+https://github.com/WebReflection/flatted.git. This software contains the following license and notice below: + +ISC License + +Copyright (c) 2018-2020, Andrea Giammarchi, @WebReflection Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE +OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. ----- +----- -This library bundles a version of the `fs.realpath` and `fs.realpathSync` -methods from Node.js v0.10 under the terms of the Node.js MIT license. +The following software may be included in this product: flatted. A copy of the source code may be downloaded from git+https://github.com/WebReflection/flatted.git. This software contains the following license and notice below: -Node's license follows, also included at the header of `old.js` which contains -the licensed code: +ISC License - Copyright Joyent, Inc. and other Node contributors. +Copyright (c) 2018, Andrea Giammarchi, @WebReflection - Permission is hereby granted, free of charge, to any person obtaining a - copy of this software and associated documentation files (the "Software"), - to deal in the Software without restriction, including without limitation - the rights to use, copy, modify, merge, publish, distribute, sublicense, - and/or sell copies of the Software, and to permit persons to whom the - Software is furnished to do so, subject to the following conditions: +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE +OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. +----- + +The following software may be included in this product: follow-redirects. A copy of the source code may be downloaded from git@github.com:follow-redirects/follow-redirects.git. This software contains the following license and notice below: + +Copyright 2014–present Olivier Lalonde , James Talmage , Ruben Verborgh + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----- -The following software may be included in this product: fsevents. A copy of the source code may be downloaded from https://github.com/strongloop/fsevents.git. This software contains the following license and notice below: +The following software may be included in this product: for-each. A copy of the source code may be downloaded from git://github.com/Raynos/for-each.git. This software contains the following license and notice below: -MIT License ------------ +The MIT License (MIT) -Copyright (C) 2010-2014 Philipp Dunkel +Copyright (c) 2012 Raynos. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -10448,25 +10940,50 @@ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. ----- -The following software may be included in this product: fsevents. A copy of the source code may be downloaded from https://github.com/fsevents/fsevents.git. This software contains the following license and notice below: +The following software may be included in this product: fork-ts-checker-notifier-webpack-plugin. A copy of the source code may be downloaded from https://github.com/johnnyreilly/fork-ts-checker-notifier-webpack-plugin.git. This software contains the following license and notice below: + +The MIT License (MIT) + +Copyright (c) 2017 John Reilly + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +----- + +The following software may be included in this product: fork-ts-checker-webpack-plugin. A copy of the source code may be downloaded from https://github.com/TypeStrong/fork-ts-checker-webpack-plugin.git. This software contains the following license and notice below: MIT License ------------ -Copyright (C) 2010-2020 by Philipp Dunkel, Ben Noordhuis, Elan Shankar, Paul Miller +Copyright (c) 2020 TypeStrong Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -10475,22 +10992,48 @@ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. ----- -The following software may be included in this product: function-bind. A copy of the source code may be downloaded from git://github.com/Raynos/function-bind.git. This software contains the following license and notice below: +The following software may be included in this product: form-data. A copy of the source code may be downloaded from git://github.com/form-data/form-data.git. This software contains the following license and notice below: -Copyright (c) 2013 Raynos. +Copyright (c) 2012 Felix Geisendörfer (felix@debuggable.com) and contributors + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + +----- + +The following software may be included in this product: fp-ts. A copy of the source code may be downloaded from https://github.com/gcanti/fp-ts.git. This software contains the following license and notice below: + +MIT License + +Copyright (c) 2017-present Giulio Canti Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -10499,24 +11042,24 @@ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. ----- -The following software may be included in this product: functional-red-black-tree. A copy of the source code may be downloaded from git://github.com/mikolalysenko/functional-red-black-tree.git. This software contains the following license and notice below: +The following software may be included in this product: fragment-cache, posix-character-classes. A copy of the source code may be downloaded from https://github.com/jonschlinkert/fragment-cache.git (fragment-cache), https://github.com/jonschlinkert/posix-character-classes.git (posix-character-classes). This software contains the following license and notice below: The MIT License (MIT) -Copyright (c) 2013 Mikola Lysenko +Copyright (c) 2016-2017, Jon Schlinkert Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -10538,79 +11081,79 @@ THE SOFTWARE. ----- -The following software may be included in this product: gensync. A copy of the source code may be downloaded from https://github.com/loganfsmyth/gensync.git. This software contains the following license and notice below: +The following software may be included in this product: fresh. A copy of the source code may be downloaded from https://github.com/jshttp/fresh.git. This software contains the following license and notice below: -Copyright 2018 Logan Smyth +(The MIT License) -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +Copyright (c) 2012 TJ Holowaychuk +Copyright (c) 2016-2017 Douglas Christopher Wilson -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----- -The following software may be included in this product: geojson-rbush. This software contains the following license and notice below: +The following software may be included in this product: from, JSONStream, through. A copy of the source code may be downloaded from git://github.com/dominictarr/from.git (from), git://github.com/dominictarr/JSONStream.git (JSONStream), https://github.com/dominictarr/through.git (through). This software contains the following license and notice below: -The MIT License (MIT) +Apache License, Version 2.0 -Copyright (c) 2018 Denis Carriere +Copyright (c) 2011 Dominic Tarr -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. + http://www.apache.org/licenses/LICENSE-2.0 -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. ----- -The following software may be included in this product: geojson-vt. A copy of the source code may be downloaded from git://github.com/mapbox/geojson-vt.git. This software contains the following license and notice below: - -ISC License - -Copyright (c) 2015, Mapbox - -Permission to use, copy, modify, and/or distribute this software for any purpose -with or without fee is hereby granted, provided that the above copyright notice -and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS -OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER -TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF -THIS SOFTWARE. +The following software may be included in this product: fs-extra. A copy of the source code may be downloaded from https://github.com/jprichardson/node-fs-extra. This software contains the following license and notice below: ------ +(The MIT License) -The following software may be included in this product: get-caller-file. A copy of the source code may be downloaded from git+https://github.com/stefanpenner/get-caller-file.git. This software contains the following license and notice below: +Copyright (c) 2011-2017 JP Richardson -ISC License (ISC) -Copyright 2018 Stefan Penner +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files +(the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, + merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: -Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS +OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----- -The following software may be included in this product: get-symbol-description, has-tostringtag, is-shared-array-buffer. A copy of the source code may be downloaded from git+https://github.com/inspect-js/get-symbol-description.git (get-symbol-description), git+https://github.com/inspect-js/has-tostringtag.git (has-tostringtag), git+https://github.com/inspect-js/is-shared-array-buffer.git (is-shared-array-buffer). This software contains the following license and notice below: +The following software may be included in this product: fs-mkdirp-stream. A copy of the source code may be downloaded from https://github.com/gulpjs/fs-mkdirp-stream.git. This software contains the following license and notice below: -MIT License +The MIT License (MIT) -Copyright (c) 2021 Inspect JS +Copyright (c) 2017 Blaine Bublitz , Eric Schoffstall and other contributors (Originally based on code from node-mkdirp - MIT/X11 license - Copyright 2010 James Halliday) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -10632,30 +11175,36 @@ SOFTWARE. ----- -The following software may be included in this product: getpass, http-signature, sshpk. A copy of the source code may be downloaded from https://github.com/arekinath/node-getpass.git (getpass), git://github.com/joyent/node-http-signature.git (http-signature), git+https://github.com/joyent/node-sshpk.git (sshpk). This software contains the following license and notice below: +The following software may be included in this product: fs-monkey, memfs. A copy of the source code may be downloaded from https://github.com/streamich/fs-monkey.git (fs-monkey), https://github.com/streamich/memfs.git (memfs). This software contains the following license and notice below: -Copyright Joyent, Inc. All rights reserved. -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to -deal in the Software without restriction, including without limitation the -rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -sell copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +This is free and unencumbered software released into the public domain. -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -IN THE SOFTWARE. +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +For more information, please refer to ----- -The following software may be included in this product: glob. A copy of the source code may be downloaded from git://github.com/isaacs/node-glob.git. This software contains the following license and notice below: +The following software may be included in this product: fs.realpath. A copy of the source code may be downloaded from git+https://github.com/isaacs/fs.realpath.git. This software contains the following license and notice below: The ISC License @@ -10673,59 +11222,69 @@ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -## Glob Logo - -Glob's logo created by Tanya Brassie , licensed -under a Creative Commons Attribution-ShareAlike 4.0 International License -https://creativecommons.org/licenses/by-sa/4.0/ +---- ------ +This library bundles a version of the `fs.realpath` and `fs.realpathSync` +methods from Node.js v0.10 under the terms of the Node.js MIT license. -The following software may be included in this product: glob-parent. A copy of the source code may be downloaded from https://github.com/gulpjs/glob-parent.git. This software contains the following license and notice below: +Node's license follows, also included at the header of `old.js` which contains +the licensed code: -The ISC License + Copyright Joyent, Inc. and other Node contributors. -Copyright (c) 2015, 2019 Elan Shanker + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. ----- -The following software may be included in this product: glob-parent. A copy of the source code may be downloaded from https://github.com/es128/glob-parent. This software contains the following license and notice below: +The following software may be included in this product: fsevents. A copy of the source code may be downloaded from https://github.com/strongloop/fsevents.git. This software contains the following license and notice below: -The ISC License +MIT License +----------- -Copyright (c) 2015 Elan Shanker +Copyright (C) 2010-2014 Philipp Dunkel -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. ----- -The following software may be included in this product: glob-stream. A copy of the source code may be downloaded from https://github.com/gulpjs/glob-stream.git. This software contains the following license and notice below: +The following software may be included in this product: fsevents. A copy of the source code may be downloaded from https://github.com/fsevents/fsevents.git. This software contains the following license and notice below: -The MIT License (MIT) +MIT License +----------- -Copyright (c) 2015-2017 Blaine Bublitz , Eric Schoffstall and other contributors +Copyright (C) 2010-2020 by Philipp Dunkel, Ben Noordhuis, Elan Shankar, Paul Miller Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -10734,24 +11293,22 @@ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. ----- -The following software may be included in this product: glob-watcher, lead, remove-bom-stream, replace-homedir, resolve-options, to-through. A copy of the source code may be downloaded from https://github.com/gulpjs/glob-watcher.git (glob-watcher), https://github.com/gulpjs/lead.git (lead), https://github.com/gulpjs/remove-bom-stream.git (remove-bom-stream), https://github.com/gulpjs/replace-homedir.git (replace-homedir), https://github.com/gulpjs/resolve-options.git (resolve-options), https://github.com/gulpjs/to-through.git (to-through). This software contains the following license and notice below: - -The MIT License (MIT) +The following software may be included in this product: function-bind. A copy of the source code may be downloaded from git://github.com/Raynos/function-bind.git. This software contains the following license and notice below: -Copyright (c) 2017 Blaine Bublitz , Eric Schoffstall and other contributors +Copyright (c) 2013 Raynos. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -10760,24 +11317,24 @@ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. ----- -The following software may be included in this product: global-modules, global-prefix, repeat-element, to-regex-range, use. A copy of the source code may be downloaded from https://github.com/jonschlinkert/global-modules.git (global-modules), https://github.com/jonschlinkert/global-prefix.git (global-prefix), https://github.com/jonschlinkert/repeat-element.git (repeat-element), https://github.com/micromatch/to-regex-range.git (to-regex-range), https://github.com/jonschlinkert/use.git (use). This software contains the following license and notice below: +The following software may be included in this product: functional-red-black-tree. A copy of the source code may be downloaded from git://github.com/mikolalysenko/functional-red-black-tree.git. This software contains the following license and notice below: The MIT License (MIT) -Copyright (c) 2015-present, Jon Schlinkert. +Copyright (c) 2013 Mikola Lysenko Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -10799,38 +11356,79 @@ THE SOFTWARE. ----- -The following software may be included in this product: globule. A copy of the source code may be downloaded from git://github.com/cowboy/node-globule.git. This software contains the following license and notice below: +The following software may be included in this product: gensync. A copy of the source code may be downloaded from https://github.com/loganfsmyth/gensync.git. This software contains the following license and notice below: -Copyright (c) 2018 "Cowboy" Ben Alman +Copyright 2018 Logan Smyth -Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated documentation -files (the "Software"), to deal in the Software without -restriction, including without limitation the rights to use, -copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following -conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----- -The following software may be included in this product: gopd. A copy of the source code may be downloaded from git+https://github.com/ljharb/gopd.git. This software contains the following license and notice below: +The following software may be included in this product: geojson-rbush. This software contains the following license and notice below: + +The MIT License (MIT) + +Copyright (c) 2018 Denis Carriere + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +----- + +The following software may be included in this product: geojson-vt. A copy of the source code may be downloaded from git://github.com/mapbox/geojson-vt.git. This software contains the following license and notice below: + +ISC License + +Copyright (c) 2015, Mapbox + +Permission to use, copy, modify, and/or distribute this software for any purpose +with or without fee is hereby granted, provided that the above copyright notice +and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. + +----- + +The following software may be included in this product: get-caller-file. A copy of the source code may be downloaded from git+https://github.com/stefanpenner/get-caller-file.git. This software contains the following license and notice below: + +ISC License (ISC) +Copyright 2018 Stefan Penner + +Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +----- + +The following software may be included in this product: get-symbol-description, has-tostringtag, is-shared-array-buffer. A copy of the source code may be downloaded from git+https://github.com/inspect-js/get-symbol-description.git (get-symbol-description), git+https://github.com/inspect-js/has-tostringtag.git (has-tostringtag), git+https://github.com/inspect-js/is-shared-array-buffer.git (is-shared-array-buffer). This software contains the following license and notice below: MIT License -Copyright (c) 2022 Jordan Harband +Copyright (c) 2021 Inspect JS Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -10852,11 +11450,60 @@ SOFTWARE. ----- -The following software may be included in this product: graceful-fs. A copy of the source code may be downloaded from https://github.com/isaacs/node-graceful-fs. This software contains the following license and notice below: +The following software may be included in this product: getpass, http-signature, sshpk. A copy of the source code may be downloaded from https://github.com/arekinath/node-getpass.git (getpass), git://github.com/joyent/node-http-signature.git (http-signature), git+https://github.com/joyent/node-sshpk.git (sshpk). This software contains the following license and notice below: + +Copyright Joyent, Inc. All rights reserved. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. + +----- + +The following software may be included in this product: glob. A copy of the source code may be downloaded from git://github.com/isaacs/node-glob.git. This software contains the following license and notice below: The ISC License -Copyright (c) Isaac Z. Schlueter, Ben Noordhuis, and Contributors +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +## Glob Logo + +Glob's logo created by Tanya Brassie , licensed +under a Creative Commons Attribution-ShareAlike 4.0 International License +https://creativecommons.org/licenses/by-sa/4.0/ + +----- + +The following software may be included in this product: glob-parent. A copy of the source code may be downloaded from https://github.com/gulpjs/glob-parent.git. This software contains the following license and notice below: + +The ISC License + +Copyright (c) 2015, 2019 Elan Shanker Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above @@ -10872,11 +11519,31 @@ IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ----- -The following software may be included in this product: gulp. A copy of the source code may be downloaded from https://github.com/gulpjs/gulp.git. This software contains the following license and notice below: +The following software may be included in this product: glob-parent. A copy of the source code may be downloaded from https://github.com/es128/glob-parent. This software contains the following license and notice below: + +The ISC License + +Copyright (c) 2015 Elan Shanker + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +----- + +The following software may be included in this product: glob-stream. A copy of the source code may be downloaded from https://github.com/gulpjs/glob-stream.git. This software contains the following license and notice below: The MIT License (MIT) -Copyright (c) 2013-2018 Blaine Bublitz , Eric Schoffstall and other contributors +Copyright (c) 2015-2017 Blaine Bublitz , Eric Schoffstall and other contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -10898,11 +11565,11 @@ SOFTWARE. ----- -The following software may be included in this product: gulplog. A copy of the source code may be downloaded from https://github.com/gulpjs/gulplog.git. This software contains the following license and notice below: +The following software may be included in this product: glob-watcher, lead, remove-bom-stream, replace-homedir, resolve-options, to-through. A copy of the source code may be downloaded from https://github.com/gulpjs/glob-watcher.git (glob-watcher), https://github.com/gulpjs/lead.git (lead), https://github.com/gulpjs/remove-bom-stream.git (remove-bom-stream), https://github.com/gulpjs/replace-homedir.git (replace-homedir), https://github.com/gulpjs/resolve-options.git (resolve-options), https://github.com/gulpjs/to-through.git (to-through). This software contains the following license and notice below: The MIT License (MIT) -Copyright (c) 2015 Blaine Bublitz, Eric Schoffstall and other contributors +Copyright (c) 2017 Blaine Bublitz , Eric Schoffstall and other contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -10924,11 +11591,11 @@ SOFTWARE. ----- -The following software may be included in this product: hammerjs. A copy of the source code may be downloaded from git://github.com/hammerjs/hammer.js.git. This software contains the following license and notice below: +The following software may be included in this product: global-modules, global-prefix, repeat-element, to-regex-range, use. A copy of the source code may be downloaded from https://github.com/jonschlinkert/global-modules.git (global-modules), https://github.com/jonschlinkert/global-prefix.git (global-prefix), https://github.com/jonschlinkert/repeat-element.git (repeat-element), https://github.com/micromatch/to-regex-range.git (to-regex-range), https://github.com/jonschlinkert/use.git (use). This software contains the following license and notice below: The MIT License (MIT) -Copyright (C) 2011-2014 by Jorik Tangelder (Eight Media) +Copyright (c) 2015-present, Jon Schlinkert. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -10950,43 +11617,11 @@ THE SOFTWARE. ----- -The following software may be included in this product: har-schema. A copy of the source code may be downloaded from https://github.com/ahmadnassri/har-schema.git. This software contains the following license and notice below: - -Copyright (c) 2015, Ahmad Nassri - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - ------ - -The following software may be included in this product: har-validator. A copy of the source code may be downloaded from https://github.com/ahmadnassri/node-har-validator.git. This software contains the following license and notice below: - -MIT License - -Copyright (c) 2018 Ahmad Nassri - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - ------ - -The following software may be included in this product: has-bigints, internal-slot, side-channel, unbox-primitive, which-boxed-primitive. A copy of the source code may be downloaded from git+https://github.com/ljharb/has-bigints.git (has-bigints), git+https://github.com/ljharb/internal-slot.git (internal-slot), git+https://github.com/ljharb/side-channel.git (side-channel), git+https://github.com/ljharb/unbox-primitive.git (unbox-primitive), git+https://github.com/inspect-js/which-boxed-primitive.git (which-boxed-primitive). This software contains the following license and notice below: +The following software may be included in this product: gopd. A copy of the source code may be downloaded from git+https://github.com/ljharb/gopd.git. This software contains the following license and notice below: MIT License -Copyright (c) 2019 Jordan Harband +Copyright (c) 2022 Jordan Harband Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -11008,36 +11643,31 @@ SOFTWARE. ----- -The following software may be included in this product: has-binary2. This software contains the following license and notice below: - -The MIT License (MIT) +The following software may be included in this product: graceful-fs. A copy of the source code may be downloaded from https://github.com/isaacs/node-graceful-fs. This software contains the following license and notice below: -Copyright (c) 2014 Kevin Roark +The ISC License -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: +Copyright (c) Isaac Z. Schlueter, Ben Noordhuis, and Contributors -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ----- -The following software may be included in this product: has-symbols. A copy of the source code may be downloaded from git://github.com/inspect-js/has-symbols.git. This software contains the following license and notice below: +The following software may be included in this product: grapheme-splitter. A copy of the source code may be downloaded from https://github.com/orling/grapheme-splitter.git. This software contains the following license and notice below: -MIT License +The MIT License (MIT) -Copyright (c) 2016 Jordan Harband +Copyright (c) 2015 Orlin Georgiev Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -11059,29 +11689,34 @@ SOFTWARE. ----- -The following software may be included in this product: has-unicode. A copy of the source code may be downloaded from https://github.com/iarna/has-unicode. This software contains the following license and notice below: +The following software may be included in this product: graphemer. A copy of the source code may be downloaded from https://github.com/flmnt/graphemer.git. This software contains the following license and notice below: -Copyright (c) 2014, Rebecca Turner +Copyright 2020 Filament (Anomalous Technologies Limited) -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----- -The following software may be included in this product: hash-base, md5.js. A copy of the source code may be downloaded from https://github.com/crypto-browserify/hash-base.git (hash-base), https://github.com/crypto-browserify/md5.js.git (md5.js). This software contains the following license and notice below: +The following software may be included in this product: gulp. A copy of the source code may be downloaded from https://github.com/gulpjs/gulp.git. This software contains the following license and notice below: The MIT License (MIT) -Copyright (c) 2016 Kirill Fomichev +Copyright (c) 2013-2018 Blaine Bublitz , Eric Schoffstall and other contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -11090,20 +11725,207 @@ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. ----- -The following software may be included in this product: hoist-non-react-statics. A copy of the source code may be downloaded from git://github.com/mridgway/hoist-non-react-statics.git. This software contains the following license and notice below: +The following software may be included in this product: gulplog. A copy of the source code may be downloaded from https://github.com/gulpjs/gulplog.git. This software contains the following license and notice below: + +The MIT License (MIT) + +Copyright (c) 2015 Blaine Bublitz, Eric Schoffstall and other contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +----- + +The following software may be included in this product: hammerjs. A copy of the source code may be downloaded from git://github.com/hammerjs/hammer.js.git. This software contains the following license and notice below: + +The MIT License (MIT) + +Copyright (C) 2011-2014 by Jorik Tangelder (Eight Media) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +----- + +The following software may be included in this product: har-schema. A copy of the source code may be downloaded from https://github.com/ahmadnassri/har-schema.git. This software contains the following license and notice below: + +Copyright (c) 2015, Ahmad Nassri + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +----- + +The following software may be included in this product: har-validator. A copy of the source code may be downloaded from https://github.com/ahmadnassri/node-har-validator.git. This software contains the following license and notice below: + +MIT License + +Copyright (c) 2018 Ahmad Nassri + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +----- + +The following software may be included in this product: has-bigints, internal-slot, side-channel, unbox-primitive, which-boxed-primitive. A copy of the source code may be downloaded from git+https://github.com/ljharb/has-bigints.git (has-bigints), git+https://github.com/ljharb/internal-slot.git (internal-slot), git+https://github.com/ljharb/side-channel.git (side-channel), git+https://github.com/ljharb/unbox-primitive.git (unbox-primitive), git+https://github.com/inspect-js/which-boxed-primitive.git (which-boxed-primitive). This software contains the following license and notice below: + +MIT License + +Copyright (c) 2019 Jordan Harband + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +----- + +The following software may be included in this product: has-binary2. This software contains the following license and notice below: + +The MIT License (MIT) + +Copyright (c) 2014 Kevin Roark + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +----- + +The following software may be included in this product: has-symbols. A copy of the source code may be downloaded from git://github.com/inspect-js/has-symbols.git. This software contains the following license and notice below: + +MIT License + +Copyright (c) 2016 Jordan Harband + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +----- + +The following software may be included in this product: hash-base, md5.js. A copy of the source code may be downloaded from https://github.com/crypto-browserify/hash-base.git (hash-base), https://github.com/crypto-browserify/md5.js.git (md5.js). This software contains the following license and notice below: + +The MIT License (MIT) + +Copyright (c) 2016 Kirill Fomichev + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +----- + +The following software may be included in this product: hoist-non-react-statics. A copy of the source code may be downloaded from git://github.com/mridgway/hoist-non-react-statics.git. This software contains the following license and notice below: Software License Agreement (BSD License) ======================================== @@ -11790,7 +12612,33 @@ SOFTWARE. ----- -The following software may be included in this product: infer-owner, minipass. A copy of the source code may be downloaded from https://github.com/npm/infer-owner (infer-owner), git+https://github.com/isaacs/minipass.git (minipass). This software contains the following license and notice below: +The following software may be included in this product: immutable. A copy of the source code may be downloaded from git://github.com/immutable-js/immutable-js.git. This software contains the following license and notice below: + +MIT License + +Copyright (c) 2014-present, Lee Byron and other contributors. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +----- + +The following software may be included in this product: infer-owner. A copy of the source code may be downloaded from https://github.com/npm/infer-owner. This software contains the following license and notice below: The ISC License @@ -12545,6 +13393,31 @@ OTHER DEALINGS IN THE SOFTWARE. ----- +The following software may be included in this product: jsep. A copy of the source code may be downloaded from https://github.com/EricSmekens/jsep.git. This software contains the following license and notice below: + +Copyright (c) 2013 Stephen Oney, https://ericsmekens.github.io/jsep/ + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +----- + The following software may be included in this product: json-parse-better-errors. A copy of the source code may be downloaded from https://github.com/zkat/json-parse-better-errors. This software contains the following license and notice below: Copyright 2017 Kat Marchán @@ -13739,7 +14612,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----- -The following software may be included in this product: karma-spec-reporter. A copy of the source code may be downloaded from git://github.com/mlex/karma-spec-reporter.git. This software contains the following license and notice below: +The following software may be included in this product: karma-spec-reporter. A copy of the source code may be downloaded from git://github.com/tmcgee123/karma-spec-reporter.git. This software contains the following license and notice below: Copyright (C) 2015 Michael Lex @@ -13786,24 +14659,50 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----- -The following software may be included in this product: lazystream. A copy of the source code may be downloaded from https://github.com/jpommerening/node-lazystream.git. This software contains the following license and notice below: +The following software may be included in this product: ktx-parse. A copy of the source code may be downloaded from https://github.com/donmccurdy/ktx-parse.git. This software contains the following license and notice below: -Copyright (c) 2013 J. Pommerening, contributors. +The MIT License (MIT) -Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated documentation -files (the "Software"), to deal in the Software without -restriction, including without limitation the rights to use, -copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following -conditions: +Copyright (c) 2020 Don McCurdy -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +----- + +The following software may be included in this product: lazystream. A copy of the source code may be downloaded from https://github.com/jpommerening/node-lazystream.git. This software contains the following license and notice below: + +Copyright (c) 2013 J. Pommerening, contributors. + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, @@ -14580,6 +15479,32 @@ SOFTWARE. ----- +The following software may be included in this product: meshoptimizer. A copy of the source code may be downloaded from https://github.com/zeux/meshoptimizer. This software contains the following license and notice below: + +MIT License + +Copyright (c) 2016-2023 Arseny Kapoulkine + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +----- + The following software may be included in this product: methods. A copy of the source code may be downloaded from https://github.com/jshttp/methods.git. This software contains the following license and notice below: (The MIT License) @@ -14658,32 +15583,6 @@ THE SOFTWARE. ----- -The following software may be included in this product: min-indent. A copy of the source code may be downloaded from https://github.com/thejameskyle/min-indent. This software contains the following license and notice below: - -The MIT License (MIT) - -Copyright (c) Sindre Sorhus (sindresorhus.com), James Kyle (thejameskyle.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - ------ - The following software may be included in this product: minimalistic-assert. A copy of the source code may be downloaded from https://github.com/calvinmetcalf/minimalistic-assert.git. This software contains the following license and notice below: Copyright 2015 Calvin Metcalf @@ -14702,32 +15601,6 @@ PERFORMANCE OF THIS SOFTWARE. ----- -The following software may be included in this product: minimist-options. A copy of the source code may be downloaded from https://github.com/vadimdemedes/minimist-options.git. This software contains the following license and notice below: - -The MIT License (MIT) - -Copyright (c) Vadim Demedes (vadimdemedes.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - ------ - The following software may be included in this product: minipass. A copy of the source code may be downloaded from git+https://github.com/isaacs/minipass.git. This software contains the following license and notice below: The ISC License @@ -15621,35 +16494,6 @@ POSSIBILITY OF SUCH DAMAGES. ----- -The following software may be included in this product: node-gyp. A copy of the source code may be downloaded from git://github.com/nodejs/node-gyp.git. This software contains the following license and notice below: - -(The MIT License) - -Copyright (c) 2012 Nathan Rajlich - -Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated documentation -files (the "Software"), to deal in the Software without -restriction, including without limitation the rights to use, -copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. - ------ - The following software may be included in this product: node-libs-browser. A copy of the source code may be downloaded from git+https://github.com/webpack/node-libs-browser.git. This software contains the following license and notice below: (The MIT License) @@ -15729,31 +16573,6 @@ THE SOFTWARE. ----- -The following software may be included in this product: node-sass. A copy of the source code may be downloaded from https://github.com/sass/node-sass. This software contains the following license and notice below: - -Copyright (c) 2013-2016 Andrew Nesbitt - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - ------ - The following software may be included in this product: normalize-package-data. A copy of the source code may be downloaded from git://github.com/npm/normalize-package-data.git. This software contains the following license and notice below: This package contains code originally written by Isaac Z. Schlueter. @@ -15789,23 +16608,30 @@ IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ----- -The following software may be included in this product: normalize-package-data. A copy of the source code may be downloaded from git://github.com/npm/normalize-package-data.git. This software contains the following license and notice below: - -This package contains code originally written by Isaac Z. Schlueter. -Used with permission. - -Copyright (c) Meryn Stol ("Author") -All rights reserved. +The following software may be included in this product: nosleep.js. A copy of the source code may be downloaded from https://github.com/richtr/NoSleep.js.git. This software contains the following license and notice below: -The BSD License +The MIT License (MIT) -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: +Copyright (c) Rich Tibbett -1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: -2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----- @@ -16174,7 +17000,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----- -The following software may be included in this product: parallel-transform, stdout-stream. A copy of the source code may be downloaded from git://github.com/mafintosh/parallel-transform (parallel-transform), https://github.com/mafintosh/stdout-stream.git (stdout-stream). This software contains the following license and notice below: +The following software may be included in this product: parallel-transform. A copy of the source code may be downloaded from git://github.com/mafintosh/parallel-transform. This software contains the following license and notice below: Copyright 2013 Mathias Buus @@ -23355,6 +24181,50 @@ Copyright (c) 2014, Mike Adair, Richard Greenwood, Didier Richard, Stephen Irons ----- +The following software may be included in this product: protobufjs. A copy of the source code may be downloaded from https://github.com/protobufjs/protobuf.js.git. This software contains the following license and notice below: + +This license applies to all parts of protobuf.js except those files +either explicitly including or referencing a different license or +located in a directory containing a different LICENSE file. + +--- + +Copyright (c) 2016, Daniel Wirtz All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +* Neither the name of its author, nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +--- + +Code generated by the command line utilities is owned by the owner +of the input file used when generating it. This code is not +standalone and requires a support library to be linked with it. This +support library is itself covered by the above license. + +----- + The following software may be included in this product: protomaps. A copy of the source code may be downloaded from git://github.com/protomaps/protomaps.js.git. This software contains the following license and notice below: Copyright 2021 Protomaps LLC @@ -23517,6 +24387,18 @@ The complete list of contributors can be found at: https://github.com/hapijs/qs/ ----- +The following software may be included in this product: querystring. A copy of the source code may be downloaded from git://github.com/Gozala/querystring.git. This software contains the following license and notice below: + +Copyright 2012 Irakli Gozalishvili + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +----- + The following software may be included in this product: querystring, querystring-es3. A copy of the source code may be downloaded from git://github.com/Gozala/querystring.git (querystring), git://github.com/mike-spainhower/querystring.git (querystring-es3). This software contains the following license and notice below: Copyright 2012 Irakli Gozalishvili. All rights reserved. @@ -23540,18 +24422,6 @@ IN THE SOFTWARE. ----- -The following software may be included in this product: querystring. A copy of the source code may be downloaded from git://github.com/Gozala/querystring.git. This software contains the following license and notice below: - -Copyright 2012 Irakli Gozalishvili - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - ------ - The following software may be included in this product: queue-microtask, run-parallel. A copy of the source code may be downloaded from git://github.com/feross/queue-microtask.git (queue-microtask), git://github.com/feross/run-parallel.git (run-parallel). This software contains the following license and notice below: The MIT License (MIT) @@ -23826,11 +24696,11 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----- -The following software may be included in this product: react, react-dom, react-is, react-test-renderer, scheduler. A copy of the source code may be downloaded from git+https://github.com/facebook/react.git (react), git+https://github.com/facebook/react.git (react-dom), https://github.com/facebook/react.git (react-is), git+https://github.com/facebook/react.git (react-test-renderer), https://github.com/facebook/react.git (scheduler). This software contains the following license and notice below: +The following software may be included in this product: react-anything-sortable. A copy of the source code may be downloaded from https://github.com/jasonslyvia/react-anything-sortable.git. This software contains the following license and notice below: -MIT License +The MIT License (MIT) -Copyright (c) Facebook, Inc. and its affiliates. +Copyright (c) 2014 Sen Yang Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -23852,11 +24722,11 @@ SOFTWARE. ----- -The following software may be included in this product: react-anything-sortable. A copy of the source code may be downloaded from https://github.com/jasonslyvia/react-anything-sortable.git. This software contains the following license and notice below: +The following software may be included in this product: react-color, reactcss. A copy of the source code may be downloaded from git+https://github.com/casesandberg/react-color.git (react-color), https://github.com/casesandberg/reactcss (reactcss). This software contains the following license and notice below: The MIT License (MIT) -Copyright (c) 2014 Sen Yang +Copyright (c) 2015 Case Sandberg Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -23878,11 +24748,11 @@ SOFTWARE. ----- -The following software may be included in this product: react-color, reactcss. A copy of the source code may be downloaded from git+https://github.com/casesandberg/react-color.git (react-color), https://github.com/casesandberg/reactcss (reactcss). This software contains the following license and notice below: +The following software may be included in this product: react-datepicker. A copy of the source code may be downloaded from git://github.com/Hacker0x01/react-datepicker.git. This software contains the following license and notice below: The MIT License (MIT) -Copyright (c) 2015 Case Sandberg +Copyright (c) 2016 HackerOne Inc and individual contributers Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -23904,11 +24774,11 @@ SOFTWARE. ----- -The following software may be included in this product: react-datepicker. A copy of the source code may be downloaded from git://github.com/Hacker0x01/react-datepicker.git. This software contains the following license and notice below: +The following software may be included in this product: react-popper. A copy of the source code may be downloaded from https://github.com/souporserious/react-popper. This software contains the following license and notice below: The MIT License (MIT) -Copyright (c) 2016 HackerOne Inc and individual contributers +Copyright (c) 2015 React Popper authors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -23930,35 +24800,9 @@ SOFTWARE. ----- -The following software may be included in this product: react-popper. A copy of the source code may be downloaded from https://github.com/souporserious/react-popper. This software contains the following license and notice below: - -The MIT License (MIT) +The following software may be included in this product: react-responsive. A copy of the source code may be downloaded from git://github.com/contra/react-responsive.git. This software contains the following license and notice below: -Copyright (c) 2015 React Popper authors - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - ------ - -The following software may be included in this product: react-responsive. A copy of the source code may be downloaded from git://github.com/contra/react-responsive.git. This software contains the following license and notice below: - -Copyright (c) 2014 Fractal +Copyright (c) 2014 Fractal Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the @@ -24326,7 +25170,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----- -The following software may be included in this product: regenerator-runtime, regenerator-transform. A copy of the source code may be downloaded from https://github.com/facebook/regenerator/tree/master/packages/runtime (regenerator-runtime), https://github.com/facebook/regenerator/tree/master/packages/regenerator-transform (regenerator-transform). This software contains the following license and notice below: +The following software may be included in this product: regenerator-runtime, regenerator-transform. A copy of the source code may be downloaded from https://github.com/facebook/regenerator/tree/master/packages/runtime (regenerator-runtime), https://github.com/facebook/regenerator/tree/main/packages/transform (regenerator-transform). This software contains the following license and notice below: MIT License @@ -24633,7 +25477,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----- -The following software may be included in this product: require-main-filename, set-blocking, yargs-parser. A copy of the source code may be downloaded from git+ssh://git@github.com/yargs/require-main-filename.git (require-main-filename), git+https://github.com/yargs/set-blocking.git (set-blocking), https://github.com/yargs/yargs-parser.git (yargs-parser). This software contains the following license and notice below: +The following software may be included in this product: require-main-filename, set-blocking, yargs-parser. A copy of the source code may be downloaded from git+ssh://git@github.com/yargs/require-main-filename.git (require-main-filename), git+https://github.com/yargs/set-blocking.git (set-blocking), git@github.com:yargs/yargs-parser.git (yargs-parser). This software contains the following license and notice below: Copyright (c) 2016, Contributors @@ -24844,104 +25688,1737 @@ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +----- + +The following software may be included in this product: rfdc. A copy of the source code may be downloaded from git+https://github.com/davidmarkclements/rfdc.git. This software contains the following license and notice below: + +Copyright 2019 "David Mark Clements " + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and +to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF +CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. + +----- + +The following software may be included in this product: ripemd160. A copy of the source code may be downloaded from https://github.com/crypto-browserify/ripemd160. This software contains the following license and notice below: + +The MIT License (MIT) + +Copyright (c) 2016 crypto-browserify + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +----- + +The following software may be included in this product: rollbar. A copy of the source code may be downloaded from http://github.com/rollbar/rollbar.js. This software contains the following license and notice below: + +Copyright (c) 2014 Rollbar, Inc. + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +----- + +The following software may be included in this product: safer-buffer. A copy of the source code may be downloaded from git+https://github.com/ChALkeR/safer-buffer.git. This software contains the following license and notice below: + +MIT License + +Copyright (c) 2018 Nikita Skovoroda + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +----- + +The following software may be included in this product: sass. A copy of the source code may be downloaded from https://github.com/sass/dart-sass. This software contains the following license and notice below: + +Dart Sass license: + +Copyright (c) 2016, Google Inc. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +-------------------------------------------------------------------------------- + +Dart SDK license: + +Copyright 2012, the Dart project authors. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of Google LLC nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +-------------------------------------------------------------------------------- + +_fe_analyzer_shared license: + +Copyright 2019, the Dart project authors. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of Google LLC nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +-------------------------------------------------------------------------------- + +analyzer, protobuf and protoc_plugin license: + +Copyright 2013, the Dart project authors. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of Google LLC nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +-------------------------------------------------------------------------------- + +archive license: + +The MIT License + +Copyright (c) 2013-2021 Brendan Duncan. +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +-------------------------------------------------------------------------------- + +args, csslib and logging license: + +Copyright 2013, the Dart project authors. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of Google LLC nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +-------------------------------------------------------------------------------- + +async, cli_util, collection, mime, source_map_stack_trace, stream_channel and +typed_data license: + +Copyright 2015, the Dart project authors. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of Google LLC nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +-------------------------------------------------------------------------------- + +boolean_selector, meta and shelf_packages_handler license: + +Copyright 2016, the Dart project authors. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of Google LLC nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +-------------------------------------------------------------------------------- + +charcode license: + +Copyright 2014, the Dart project authors. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +-------------------------------------------------------------------------------- + +checked_yaml license: + +Copyright 2019, the Dart project authors. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +-------------------------------------------------------------------------------- + +cli_pkg license: + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + +-------------------------------------------------------------------------------- + +cli_repl license: + +Copyright (c) 2018, Jennifer Thakar. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the project nor the names of its contributors may be + used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +-------------------------------------------------------------------------------- + +convert, crypto, shelf_static and vm_service license: + +Copyright 2015, the Dart project authors. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of Google LLC nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +-------------------------------------------------------------------------------- + +coverage, dart_style, dartdoc, glob, http, http_parser, matcher, path, pool, +pub_semver, source_span, string_scanner, test and watcher license: + +Copyright 2014, the Dart project authors. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of Google LLC nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +-------------------------------------------------------------------------------- + +ffi and package_config license: + +Copyright 2019, the Dart project authors. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of Google LLC nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +-------------------------------------------------------------------------------- + +file license: + +Copyright 2017, the Dart project authors. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +-------------------------------------------------------------------------------- + +fixnum, http_multi_server, oauth2, shelf, shelf_web_socket, source_maps and +stack_trace license: + +Copyright 2014, the Dart project authors. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of Google LLC nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +-------------------------------------------------------------------------------- + +frontend_server_client license: + +Copyright 2020, the Dart project authors. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of Google LLC nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +-------------------------------------------------------------------------------- + +grinder and webkit_inspection_protocol license: + +Copyright 2013, Google Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +-------------------------------------------------------------------------------- + +html license: + +Copyright (c) 2006-2012 The Authors + +Contributors: +James Graham - jg307@cam.ac.uk +Anne van Kesteren - annevankesteren@gmail.com +Lachlan Hunt - lachlan.hunt@lachy.id.au +Matt McDonald - kanashii@kanashii.ca +Sam Ruby - rubys@intertwingly.net +Ian Hickson (Google) - ian@hixie.ch +Thomas Broyer - t.broyer@ltgt.net +Jacques Distler - distler@golem.ph.utexas.edu +Henri Sivonen - hsivonen@iki.fi +Adam Barth - abarth@webkit.org +Eric Seidel - eric@webkit.org +The Mozilla Foundation (contributions from Henri Sivonen since 2008) +David Flanagan (Mozilla) - dflanagan@mozilla.com +Google LLC (contributed the Dart port) - misc@dartlang.org + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +-------------------------------------------------------------------------------- + +io, stream_transform and term_glyph license: + +Copyright 2017, the Dart project authors. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of Google LLC nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +-------------------------------------------------------------------------------- + +js license: + +Copyright 2012, the Dart project authors. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of Google LLC nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +-------------------------------------------------------------------------------- + +json_annotation license: + +Copyright 2017, the Dart project authors. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +-------------------------------------------------------------------------------- + +lints license: + +Copyright 2021, the Dart project authors. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of Google LLC nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +-------------------------------------------------------------------------------- + +markdown license: + +Copyright 2012, the Dart project authors. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of Google LLC nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +-------------------------------------------------------------------------------- + +native_synchronization license: + +Copyright 2023, the Dart project authors. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of Google LLC nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +-------------------------------------------------------------------------------- + +node_interop license: + +Copyright (c) 2017, Anatoly Pulyaevskiy. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +-------------------------------------------------------------------------------- + +node_preamble license: + +The MIT License (MIT) + +Copyright (c) 2015 Michael Bullington + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +=== + +Copyright 2012, the Dart project authors. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +-------------------------------------------------------------------------------- + +petitparser and xml license: + +The MIT License + +Copyright (c) 2006-2023 Lukas Renggli. +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +-------------------------------------------------------------------------------- + +pointycastle license: + + +Copyright (c) 2000 - 2019 The Legion of the Bouncy Castle Inc. (https://www.bouncycastle.org) + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + + +-------------------------------------------------------------------------------- + +pub_api_client license: + +MIT License + +Copyright (c) 2020 Leo Farias + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +-------------------------------------------------------------------------------- + +pubspec license: + +Copyright (c) 2015, Anders Holmgren. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +-------------------------------------------------------------------------------- + +pubspec_parse license: + +Copyright 2018, the Dart project authors. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of Google LLC nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +-------------------------------------------------------------------------------- + +quiver and retry license: + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +-------------------------------------------------------------------------------- + +test_api and test_core license: + +Copyright 2018, the Dart project authors. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of Google LLC nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +-------------------------------------------------------------------------------- ------ +test_descriptor and web_socket_channel license: -The following software may be included in this product: rfdc. A copy of the source code may be downloaded from git+https://github.com/davidmarkclements/rfdc.git. This software contains the following license and notice below: +Copyright 2016, the Dart project authors. -Copyright 2019 "David Mark Clements " +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -documentation files (the "Software"), to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and -to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of Google LLC nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. -The above copyright notice and this permission notice shall be included in all copies or substantial portions -of the Software. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED -TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -IN THE SOFTWARE. ------ +-------------------------------------------------------------------------------- -The following software may be included in this product: ripemd160. A copy of the source code may be downloaded from https://github.com/crypto-browserify/ripemd160. This software contains the following license and notice below: +test_process license: -The MIT License (MIT) +Copyright 2017, the Dart project authors. -Copyright (c) 2016 crypto-browserify +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of Google LLC nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. ------ +-------------------------------------------------------------------------------- -The following software may be included in this product: rollbar. A copy of the source code may be downloaded from http://github.com/rollbar/rollbar.js. This software contains the following license and notice below: +uri license: -Copyright (c) 2014 Rollbar, Inc. +Copyright 2013, the Dart project authors. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -MIT License -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: +-------------------------------------------------------------------------------- -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. +web license: -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +Copyright 2023, the Dart project authors. ------ +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of Google LLC nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. -The following software may be included in this product: safer-buffer. A copy of the source code may be downloaded from git+https://github.com/ChALkeR/safer-buffer.git. This software contains the following license and notice below: +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -MIT License -Copyright (c) 2018 Nikita Skovoroda +-------------------------------------------------------------------------------- -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +yaml license: + +Copyright (c) 2014, the Dart project authors. +Copyright (c) 2006, Kirill Simonov. + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. @@ -25027,32 +27504,6 @@ License, as follows: ----- -The following software may be included in this product: scss-tokenizer. A copy of the source code may be downloaded from https://github.com/sasstools/scss-tokenizer.git. This software contains the following license and notice below: - -The MIT License (MIT) - -Copyright (c) 2015 sasstools - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - ------ - The following software may be included in this product: selfsigned. A copy of the source code may be downloaded from git://github.com/jfromaniello/selfsigned.git. This software contains the following license and notice below: MIT License @@ -25590,7 +28041,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI ----- -The following software may be included in this product: source-map. A copy of the source code may be downloaded from http://github.com/mozilla/source-map.git. This software contains the following license and notice below: +The following software may be included in this product: source-map, source-map-js. A copy of the source code may be downloaded from http://github.com/mozilla/source-map.git (source-map), https://github.com/7rulnik/source-map-js.git (source-map-js). This software contains the following license and notice below: Copyright (c) 2009-2011, Mozilla Foundation and contributors All rights reserved. @@ -26265,7 +28716,7 @@ SOFTWARE. ----- -The following software may be included in this product: terriajs-cesium. A copy of the source code may be downloaded from https://github.com/TerriaJS/cesium.git. This software contains the following license and notice below: +The following software may be included in this product: terriajs-cesium. A copy of the source code may be downloaded from git+https://github.com/CesiumGS/cesium.git. This software contains the following license and notice below: Copyright 2011-2022 CesiumJS Contributors @@ -26495,20 +28946,6 @@ http://sponeil.net/ > > THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -### Grauw Uri utilities - -http://hg.grauw.nl/grauw-lib - -> Laurens Holst (http://www.grauw.nl/) -> -> Copyright 2012 Laurens Holst -> -> Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at -> -> http://www.apache.org/licenses/LICENSE-2.0 -> -> Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ### zip.js https://github.com/gildas-lormeau/zip.js @@ -26553,68 +28990,6 @@ https://github.com/sole/tween.js > > THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -### fontmetrics.js - -https://github.com/Pomax/fontmetrics.js - -> Copyright (C) 2011 by Mike "Pomax" Kamermans -> -> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -> -> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -> -> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -### almond - -https://github.com/jrburke/almond - -> Copyright (c) 2010-2011, The Dojo Foundation -> -> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -> -> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -> -> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -### RequireJS - -https://github.com/jrburke/requirejs - -> Copyright (c) 2010-2015, The Dojo Foundation -> -> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -> -> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -> -> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -### Knockout - -http://knockoutjs.com/ - -> (c) The Knockout.js team - http://knockoutjs.com/ -> License: MIT (http://www.opensource.org/licenses/mit-license.php) -> -> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -> -> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -> -> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -### Knockout ES5 plugin - -https://github.com/SteveSanderson/knockout-es5 - -> Copyright (c) Steve Sanderson -> MIT license -> -> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -> -> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -> -> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - ### topojson-client https://github.com/topojson/topojson-client @@ -26680,14 +29055,6 @@ https://github.com/NVIDIAGameWorks/GraphicsSamples > > LIMITATION OF LIABILITY: NVIDIA SHALL NOT BE LIABLE TO DEVELOPER, DEVELOPER'S CUSTOMERS, OR ANY OTHER PERSON OR ENTITY CLAIMING THROUGH OR UNDER DEVELOPER FOR ANY LOSS OF PROFITS, INCOME, SAVINGS, OR ANY OTHER CONSEQUENTIAL, INCIDENTAL, SPECIAL, PUNITIVE, DIRECT OR INDIRECT DAMAGES (WHETHER IN AN ACTION IN CONTRACT, TORT OR BASED ON A WARRANTY), EVEN IF NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS SHALL APPLY NOTWITHSTANDING ANY FAILURE OF THE ESSENTIAL PURPOSE OF ANY LIMITED REMEDY. IN NO EVENT SHALL NVIDIA'S AGGREGATE LIABILITY TO DEVELOPER OR ANY OTHER PERSON OR ENTITY CLAIMING THROUGH OR UNDER DEVELOPER EXCEED THE AMOUNT OF MONEY ACTUALLY PAID BY DEVELOPER TO NVIDIA FOR THE SOFTWARE OR ANY OTHER MATERIALS. -### NoSleep.js - -https://github.com/richtr/NoSleep.js - -> NoSleep.js v0.5.0 - git.io/vfn01 -> Rich Tibbett -> MIT license - ### jsep https://github.com/EricSmekens/jsep @@ -26775,26 +29142,6 @@ https://github.com/mourner/rbush > OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN > THE SOFTWARE. -### quickselect - -https://github.com/mourner/quickselect - -> ISC License - -> Copyright (c) 2018, Vladimir Agafonkin - -> Permission to use, copy, modify, and/or distribute this software for any purpose -> with or without fee is hereby granted, provided that the above copyright notice -> and this permission notice appear in all copies. -> -> THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -> REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND -> FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -> INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS -> OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER -> TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF -> THIS SOFTWARE. - ### basis_universal https://github.com/BinomialLLC/basis_universal @@ -26856,38 +29203,12 @@ https://github.com/zeux/meshoptimizer/blob/master/LICENSE.md > copies or substantial portions of the Software. > > THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -> SOFTWARE. - -### texture-tester - -https://github.com/toji/texture-tester - -> Copyright (c) 2014, Brandon Jones. All rights reserved. -> -> Redistribution and use in source and binary forms, with or without modification, -> are permitted provided that the following conditions are met: -> -> - Redistributions of source code must retain the above copyright notice, this -> list of conditions and the following disclaimer. -> - Redistributions in binary form must reproduce the above copyright notice, -> this list of conditions and the following disclaimer in the documentation -> and/or other materials provided with the distribution. -> -> THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -> ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -> WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -> DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR -> ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -> (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -> LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -> ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -> (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -> SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +> SOFTWARE. ### pako @@ -27277,6 +29598,32 @@ https://github.com/google/s2geometry/blob/master/LICENSE > See the License for the specific language governing permissions and > limitations under the License. +### URI.js + +http://medialize.github.io/URI.js/ + +> The MIT License (MIT) +> +> Copyright (c) 2011 Rodney Rehm +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +> THE SOFTWARE. + # Tests The CesiumJS tests use the following third-party libraries and data. @@ -27293,167 +29640,271 @@ Copyright (c) 2008-2014 Pivotal Labs > > THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# CesiumJS Documentation +----- -The CesiumJS documentation files include the following third-party content. +The following software may be included in this product: terriajs-cesium-widgets. A copy of the source code may be downloaded from git+https://github.com/CesiumGS/cesium.git. This software contains the following license and notice below: -### Source Sans Pro (Font) +Copyright 2011-2022 CesiumJS Contributors -Source® Sans Pro, Adobe's first open source typeface family, was designed by Paul D. Hunt. It is a sans serif typeface intended to work well in user interfaces. + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ -[SIL Open Font License, 1.1](http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=OFL) ([text](http://scripts.sil.org/cms/scripts/render_download.php?format=file&media_id=OFL_plaintext&filename=OFL.txt)) +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION -# Example Applications +1. Definitions. -The CesiumJS example applications include the following third-party libraries and data. + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. -### Dojo Toolkit + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. -http://dojotoolkit.org/ + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. -> Copyright (c) 2005-2015, The Dojo Foundation -> -> All rights reserved. -> -> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: -> -> - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. -> - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -> - Neither the name of the Dojo Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. -> -> THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. -### CodeMirror + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. -http://codemirror.net/ + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. -> Copyright (C) 2017 by Marijn Haverbeke and others -> -> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -> -> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -> -> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -> -> Please note that some subdirectories of the CodeMirror distribution include their own LICENSE files, and are released under different licences. + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). -### clipboard.js + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. -https://clipboardjs.com/ + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." -> The MIT License (MIT) -> Copyright © 2018 Zeno Rocha -> -> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -> -> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -> -> THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. -### JSHint +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. -http://www.jshint.com/ +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. -> JSHint, by JSHint Community. -> -> Licensed under the same slightly modified MIT license that JSLint is. It stops evil-doers everywhere. -> -> JSHint is a derivative work of JSLint: -> -> Copyright (c) 2002 Douglas Crockford (www.JSLint.com) -> -> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -> -> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -> -> The Software shall be used for Good, not Evil. -> -> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. JSHint was forked from the 2010-12-16 edition of JSLint. +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. -### Public domain data from Natural Earth +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. -Free vector and raster map data @ naturalearthdata.com +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. -Terms of use: http://www.naturalearthdata.com/about/terms-of-use/ +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. -### Data from JHT's Planetary Pixel Emporium +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. -Copyright (c) by James Hastings-Trew +END OF TERMS AND CONDITIONS -http://planetpixelemporium.com/ +APPENDIX: How to apply the Apache License to your work. -Copyright Information: http://planetpixelemporium.com/planets.html + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. -### Sky box images from NASA +Copyright 2011-2020 CesiumJS Contributors -http://maps.jpl.nasa.gov/stars.html +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at -http://svs.gsfc.nasa.gov/vis/a000000/a003500/a003572/ + http://www.apache.org/licenses/LICENSE-2.0 -Terms of use: http://www.nasa.gov/audience/formedia/features/MP_Photo_Guidelines.html +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. -### Some vector icons from (or inspired by) Raphaël JS +Patents US9153063B2 US9865085B1 US10592242 -http://raphaeljs.com/icons/ +Patents pending US15/829,786 US16/850,266 US16/851,958 -http://raphaeljs.com/license.html +# Third-Party Code -### Mouse and gesture vector icons made by Freepik from Flaticon.com +CesiumJS includes the following third-party code. -Creative Commons Attribution 3.0 -https://web.archive.org/web/20140419110558/http://www.flaticon.com/terms-of-use +### NoSleep.js -### Maki icon set from Mapbox +https://github.com/richtr/NoSleep.js -https://www.mapbox.com/maki/ +> NoSleep.js v0.5.0 - git.io/vfn01 +> Rich Tibbett +> MIT license -https://github.com/mapbox/maki +### Knockout -### Big Buck Bunny trailer +http://knockoutjs.com/ -Creative Commons Attribution 3.0 -(c) copyright 2008, Blender Foundation -www.bigbuckbunny.org +> (c) The Knockout.js team - http://knockoutjs.com/ +> License: MIT (http://www.opensource.org/licenses/mit-license.php) +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -### population909500.json +### Knockout ES5 plugin -https://github.com/dataarts/webgl-globe +https://github.com/SteveSanderson/knockout-es5 -> Copyright 2011 Google Data Arts Team +> Copyright (c) Steve Sanderson +> MIT license > -> Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: > -> http://www.apache.org/licenses/LICENSE-2.0 +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. > -> Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - -### Wooden Watch Tower - -Creative Commons Attribution 3.0 -(c) copyright 2012, Dennis Haupt -http://www.blendswap.com/blends/view/61653 - -### Perc Lead Mine - -Creative Commons Attribution 4.0 International -(c) copyright 2019, Dr Edward Alan Lockhart -https://sketchfab.com/3d-models/parc-lead-mine-4759a23abbff454c8c682ff9b02ba111 - -### GitHub logo +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -https://github.com/logos +# Tests -### GPX files +The CesiumJS tests use the following third-party libraries and data. -Public domain -https://www.gpsvisualizer.com/examples/google_gpx.html +### Jasmine -Creative Commons Attribution-ShareAlike 2.0 -https://wiki.openstreetmap.org/wiki/GPX +http://jasmine.github.io/ -### Font Awesome Icon +Copyright (c) 2008-2014 Pivotal Labs -Font Awesome by Dave Gandy - http://fontawesome.io +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----- @@ -27935,6 +30386,24 @@ SOFTWARE. ----- +The following software may be included in this product: topojson-client. A copy of the source code may be downloaded from https://github.com/topojson/topojson-client.git. This software contains the following license and notice below: + +Copyright 2012-2019 Michael Bostock + +Permission to use, copy, modify, and/or distribute this software for any purpose +with or without fee is hereby granted, provided that the above copyright notice +and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. + +----- + The following software may be included in this product: toposort. A copy of the source code may be downloaded from https://github.com/marcelklehr/toposort.git. This software contains the following license and notice below: Toposort - Topological sorting for node.js @@ -28058,209 +30527,28 @@ THE SOFTWARE. ----- -The following software may be included in this product: true-case-path. A copy of the source code may be downloaded from git+https://github.com/barsh/true-case-path.git. This software contains the following license and notice below: - -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. +The following software may be included in this product: ts-api-utils. A copy of the source code may be downloaded from https://github.com/JoshuaKGoldberg/ts-api-utils. This software contains the following license and notice below: - Copyright {yyyy} {name of copyright owner} +# MIT License - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: - http://www.apache.org/licenses/LICENSE-2.0 +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----- @@ -29997,10 +32285,14 @@ http://www.gnu.org/licenses/lgpl.html The following software may be included in this product: xmldom. A copy of the source code may be downloaded from git://github.com/xmldom/xmldom.git. This software contains the following license and notice below: -You can choose any one of these licenses: +Copyright 2019 - present Christopher J. Brody and other contributors, as listed in: https://github.com/xmldom/xmldom/graphs/contributors +Copyright 2012 - 2017 @jindw and other contributors, as listed in: https://github.com/jindw/xmldom/graphs/contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -- MIT: https://opensource.org/licenses/MIT -- LGPL: http://www.gnu.org/licenses/lgpl.html +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----- From 6fe2312ea9e6bda8c0e17f2e528ca7a1c330ba70 Mon Sep 17 00:00:00 2001 From: Stephen Davies Date: Fri, 15 Mar 2024 01:38:16 +1100 Subject: [PATCH 611/654] Fix exception from objectArrayTrait using MergeStrategy topStratum --- CHANGES.md | 1 + lib/Traits/Decorators/objectArrayTrait.ts | 18 ++++++++++-------- test/Traits/objectArrayTraitSpec.ts | 6 ++++++ 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index ba852ff2410..fd69dd5882c 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -2,6 +2,7 @@ #### next release (8.6.2) +- Fixed exception thrown from `objectArrayTrait` when a model has 0 strata and a `MergeStrategy` of `topStratum`. - [The next improvement] #### 8.6.1 - 2024-03-14 diff --git a/lib/Traits/Decorators/objectArrayTrait.ts b/lib/Traits/Decorators/objectArrayTrait.ts index fd581b77b0b..947da7c2133 100644 --- a/lib/Traits/Decorators/objectArrayTrait.ts +++ b/lib/Traits/Decorators/objectArrayTrait.ts @@ -156,14 +156,16 @@ export class ObjectArrayTrait extends Trait { // If merge strategy is topStratum, then we only want to keep the ids that exist in the top stratum if (this.merge === MergeStrategy.TopStratum) { const topStratum = model.strataTopToBottom.values().next().value; - - const topIds = this.getIdsAcrossStrata(new Map([["top", topStratum]])); - // Remove ids that don't exist in the top stratum - idsInCorrectOrder.forEach((id) => { - if (!topIds.has(id)) { - idsWithCorrectRemovals.delete(id); - } - }); + // topStratum will be undefined if a model has 0 strata + if (topStratum !== undefined) { + const topIds = this.getIdsAcrossStrata(new Map([["top", topStratum]])); + // Remove ids that don't exist in the top stratum + idsInCorrectOrder.forEach((id) => { + if (!topIds.has(id)) { + idsWithCorrectRemovals.delete(id); + } + }); + } } // Correct ids are: diff --git a/test/Traits/objectArrayTraitSpec.ts b/test/Traits/objectArrayTraitSpec.ts index bae94c227ab..8efe0b7f058 100644 --- a/test/Traits/objectArrayTraitSpec.ts +++ b/test/Traits/objectArrayTraitSpec.ts @@ -392,6 +392,12 @@ describe("objectArrayTrait", function () { expect(model.inner[0].baz).toBe(true); }); + it("no error when a model has 0 strata and merge = top", function () { + const terria = new Terria(); + const model = new TestModelMergeTop("test", terria); + expect(model.inner.length).toBe(0); + }); + it("updates to reflect new strata added after evaluation (with merge = top)", function () { const terria = new Terria(); const model = new TestModelMergeTop("test", terria); From eff3e6960746d0fca1d7ff71765df606496db158 Mon Sep 17 00:00:00 2001 From: Mike Wu <41275384+mwu2018@users.noreply.github.com> Date: Mon, 18 Mar 2024 17:35:49 +1100 Subject: [PATCH 612/654] Issue 4937 b (#7077) * Fix doc errors. * Add a wfs-grouup example. * Add a wms-group example. * Add a wmts example. * Add wmts-group example and fix an incorrect trait name. * Bug fix * Update lib/Traits/TraitsClasses/WebFeatureServiceCatalogGroupTraits.ts Co-authored-by: Lawrence Owen * Update lib/Traits/TraitsClasses/WebFeatureServiceCatalogItemTraits.ts Co-authored-by: Lawrence Owen * Update lib/Traits/TraitsClasses/WebMapTileServiceCatalogGroupTraits.ts Co-authored-by: Lawrence Owen * Update lib/Traits/TraitsClasses/WebMapTileServiceCatalogItemTraits.ts Co-authored-by: Lawrence Owen --------- Co-authored-by: Lawrence Owen --- .../WebFeatureServiceCatalogGroupTraits.ts | 9 +++++++++ .../WebFeatureServiceCatalogItemTraits.ts | 3 +-- .../TraitsClasses/WebMapServiceCatalogGroupTraits.ts | 10 ++++++++++ .../WebMapTileServiceCatalogGroupTraits.ts | 11 +++++++++++ .../WebMapTileServiceCatalogItemTraits.ts | 12 ++++++++++++ 5 files changed, 43 insertions(+), 2 deletions(-) diff --git a/lib/Traits/TraitsClasses/WebFeatureServiceCatalogGroupTraits.ts b/lib/Traits/TraitsClasses/WebFeatureServiceCatalogGroupTraits.ts index f2a65b1f6f6..3f45d0e3812 100644 --- a/lib/Traits/TraitsClasses/WebFeatureServiceCatalogGroupTraits.ts +++ b/lib/Traits/TraitsClasses/WebFeatureServiceCatalogGroupTraits.ts @@ -5,6 +5,15 @@ import mixTraits from "../mixTraits"; import UrlTraits from "./UrlTraits"; import LegendOwnerTraits from "./LegendOwnerTraits"; +@traitClass({ + description: `Creates a group of all layers in the catalog from a url that points to a WFS service.`, + example: { + type: "wfs-group", + name: "wfs-group example", + url: "https://warehouse.ausseabed.gov.au/geoserver/ows", + id: "some unique id for wfs-group example" + } +}) export default class WebFeatureServiceCatalogGroupTraits extends mixTraits( GetCapabilitiesTraits, GroupTraits, diff --git a/lib/Traits/TraitsClasses/WebFeatureServiceCatalogItemTraits.ts b/lib/Traits/TraitsClasses/WebFeatureServiceCatalogItemTraits.ts index efb52e7bb54..ac00d798f04 100644 --- a/lib/Traits/TraitsClasses/WebFeatureServiceCatalogItemTraits.ts +++ b/lib/Traits/TraitsClasses/WebFeatureServiceCatalogItemTraits.ts @@ -27,8 +27,7 @@ export const SUPPORTED_CRS_3857 = [ ]; @traitClass({ - description: `Creates a single item in the catalog from url that points to WFS service. - + description: `Creates a single item in the catalog from url that points to a WFS service. Note: Must specify property typeNames.`, example: { type: "wfs", diff --git a/lib/Traits/TraitsClasses/WebMapServiceCatalogGroupTraits.ts b/lib/Traits/TraitsClasses/WebMapServiceCatalogGroupTraits.ts index 693edf5bbc8..4bfdb6a6b6c 100644 --- a/lib/Traits/TraitsClasses/WebMapServiceCatalogGroupTraits.ts +++ b/lib/Traits/TraitsClasses/WebMapServiceCatalogGroupTraits.ts @@ -2,6 +2,7 @@ import { JsonObject } from "../../Core/Json"; import anyTrait from "../Decorators/anyTrait"; import objectTrait from "../Decorators/objectTrait"; import primitiveTrait from "../Decorators/primitiveTrait"; +import { traitClass } from "../Trait"; import mixTraits from "../mixTraits"; import CatalogMemberTraits from "./CatalogMemberTraits"; import ExportWebCoverageServiceTraits from "./ExportWebCoverageServiceTraits"; @@ -10,6 +11,15 @@ import GroupTraits from "./GroupTraits"; import LegendOwnerTraits from "./LegendOwnerTraits"; import UrlTraits from "./UrlTraits"; +@traitClass({ + description: `Creates a group of all layers (or subgroups) in the catalog from a url that points to a wms service.`, + example: { + type: "wms-group", + name: "wms-group example", + url: "https://ows.services.dea.ga.gov.au", + id: "a unique id for wms-group example" + } +}) export default class WebMapServiceCatalogGroupTraits extends mixTraits( GetCapabilitiesTraits, GroupTraits, diff --git a/lib/Traits/TraitsClasses/WebMapTileServiceCatalogGroupTraits.ts b/lib/Traits/TraitsClasses/WebMapTileServiceCatalogGroupTraits.ts index 1482d6636b1..e4c6033f72b 100644 --- a/lib/Traits/TraitsClasses/WebMapTileServiceCatalogGroupTraits.ts +++ b/lib/Traits/TraitsClasses/WebMapTileServiceCatalogGroupTraits.ts @@ -5,7 +5,18 @@ import mixTraits from "../mixTraits"; import primitiveTrait from "../Decorators/primitiveTrait"; import UrlTraits from "./UrlTraits"; import LegendOwnerTraits from "./LegendOwnerTraits"; +import { traitClass } from "../Trait"; +@traitClass({ + description: `Creates a wmts group in the catalog from a url that points to a wmts-group service.`, + example: { + type: "wmts-group", + id: "a unique id for wmts-group example", + name: "wmts-group example", + url: "https://services.arcgisonline.com/arcgis/rest/services/World_Imagery/MapServer/WMTS/1.0.0/WMTSCapabilities.xml", + opacity: 1 + } +}) export default class WebMapTileServiceCatalogGroupTraits extends mixTraits( GetCapabilitiesTraits, GroupTraits, diff --git a/lib/Traits/TraitsClasses/WebMapTileServiceCatalogItemTraits.ts b/lib/Traits/TraitsClasses/WebMapTileServiceCatalogItemTraits.ts index b09724f0823..11fc241e0a8 100644 --- a/lib/Traits/TraitsClasses/WebMapTileServiceCatalogItemTraits.ts +++ b/lib/Traits/TraitsClasses/WebMapTileServiceCatalogItemTraits.ts @@ -5,6 +5,7 @@ import objectTrait from "../Decorators/objectTrait"; import primitiveTrait from "../Decorators/primitiveTrait"; import mixTraits from "../mixTraits"; import ModelTraits from "../ModelTraits"; +import { traitClass } from "../Trait"; import CatalogMemberTraits from "./CatalogMemberTraits"; import GetCapabilitiesTraits from "./GetCapabilitiesTraits"; import ImageryProviderTraits from "./ImageryProviderTraits"; @@ -68,6 +69,17 @@ export class WebMapTileServiceAvailableLayerStylesTraits extends ModelTraits { styles?: WebMapTileServiceAvailableStyleTraits[]; } +@traitClass({ + description: `Creates a single item in the catalog from a url that points to a wmts service.`, + example: { + type: "wmts", + id: "a unique id for wmts example", + name: "wmts example", + url: "https://services.arcgisonline.com/arcgis/rest/services/Reference/World_Boundaries_and_Places/MapServer/WMTS/1.0.0/WMTSCapabilities.xml", + layer: "Reference_World_Boundaries_and_Places", + opacity: 1 + } +}) export default class WebMapServiceCatalogItemTraits extends mixTraits( LayerOrderingTraits, GetCapabilitiesTraits, From bc01aeced5cd036f4b131dfd82a33789158e0614 Mon Sep 17 00:00:00 2001 From: Mike Wu <41275384+mwu2018@users.noreply.github.com> Date: Tue, 19 Mar 2024 14:37:16 +1100 Subject: [PATCH 613/654] Add a missing import. (#7080) --- lib/Traits/TraitsClasses/WebFeatureServiceCatalogGroupTraits.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/Traits/TraitsClasses/WebFeatureServiceCatalogGroupTraits.ts b/lib/Traits/TraitsClasses/WebFeatureServiceCatalogGroupTraits.ts index 3f45d0e3812..cf438024c1e 100644 --- a/lib/Traits/TraitsClasses/WebFeatureServiceCatalogGroupTraits.ts +++ b/lib/Traits/TraitsClasses/WebFeatureServiceCatalogGroupTraits.ts @@ -4,6 +4,7 @@ import GroupTraits from "./GroupTraits"; import mixTraits from "../mixTraits"; import UrlTraits from "./UrlTraits"; import LegendOwnerTraits from "./LegendOwnerTraits"; +import { traitClass } from "../Trait"; @traitClass({ description: `Creates a group of all layers in the catalog from a url that points to a WFS service.`, From 33e310cee03c7083fb03b92bc37bd5771b5b6e03 Mon Sep 17 00:00:00 2001 From: Stephen Davies Date: Thu, 21 Mar 2024 02:24:31 +1100 Subject: [PATCH 614/654] Fix Cesium resolving relative baseUrl wrongly by passing in absolute URL --- CHANGES.md | 2 ++ lib/Models/Terria.ts | 29 ++++++++++++++++------------- 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index fd69dd5882c..f58386c383b 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -3,6 +3,7 @@ #### next release (8.6.2) - Fixed exception thrown from `objectArrayTrait` when a model has 0 strata and a `MergeStrategy` of `topStratum`. +- Fixed a bug with passing a relative baseUrl to Cesium 1.113.0. - [The next improvement] #### 8.6.1 - 2024-03-14 @@ -46,6 +47,7 @@ - Add option to enable/disable shortening share URLs via InitSourceData. - Fix bug in ArcGisMapServerCatalogItem. - Add examples. +- Upgraded Cesium to 1.113.0 (i.e. `terriajs-cesium@6.2.0` & `terriajs-cesium-widgets@4.4.0`). #### 8.4.1 - 2023-12-08 diff --git a/lib/Models/Terria.ts b/lib/Models/Terria.ts index 10967e949c5..48394cc90e9 100644 --- a/lib/Models/Terria.ts +++ b/lib/Models/Terria.ts @@ -428,8 +428,10 @@ export default class Terria { readonly modelIdShareKeysMap = observable.map(); /** Base URL for the Terria app. Used for SPA routes */ - readonly appBaseHref: string = - typeof document !== "undefined" ? document.baseURI : "/"; + readonly appBaseHref: string = ensureSuffix( + typeof document !== "undefined" ? document.baseURI : "/", + "/" + ); /** Base URL to Terria resources */ readonly baseUrl: string = "build/TerriaJS/"; @@ -691,18 +693,25 @@ export default class Terria { constructor(options: TerriaOptions = {}) { makeObservable(this); if (options.appBaseHref) { - this.appBaseHref = new URL( - options.appBaseHref, - typeof document !== "undefined" ? document.baseURI : "/" - ).toString(); + this.appBaseHref = ensureSuffix( + new URL( + options.appBaseHref, + typeof document !== "undefined" ? document.baseURI : "/" + ).href, + "/" + ); } if (options.baseUrl) { this.baseUrl = ensureSuffix(options.baseUrl, "/"); } + // Construct an absolute URL to send to Cesium, as otherwise it resolves relative + // to document.location instead of the correct document.baseURI + const cesiumBaseUrlRelative = + options.cesiumBaseUrl ?? `${this.baseUrl}build/Cesium/build/`; this.cesiumBaseUrl = ensureSuffix( - options.cesiumBaseUrl ?? `${this.baseUrl}build/Cesium/build/`, + new URL(cesiumBaseUrlRelative, this.appBaseHref).href, "/" ); // Casting to `any` as `setBaseUrl` method is not part of the Cesiums' type definitions @@ -1249,12 +1258,6 @@ export default class Terria { new URI(newUrl).filename("").query("").hash("") ); - if (!this.appBaseHref.endsWith("/")) { - console.warn( - `Terria expected appBaseHref to end with a "/" but appBaseHref is "${this.appBaseHref}". Routes may not work as intended. To fix this, try setting the "--baseHref" parameter to a URL with a trailing slash while building your map, or constructing the Terria object with an appropriate appBaseHref (with trailing slash).` - ); - } - // /catalog/ and /story/ routes if (newUrl.startsWith(this.appBaseHref)) { const pageUrl = new URL(newUrl); From 646451881f0c080538b47e51d0d1390b9f8a6430 Mon Sep 17 00:00:00 2001 From: Nick Forbes-Smith Date: Thu, 21 Mar 2024 12:50:21 +1100 Subject: [PATCH 615/654] Fix generateCatalogIndex + add commander to process args --- buildprocess/configureWebpack.js | 3 + buildprocess/generateCatalogIndex.ts | 120 +++++++++++++++------------ package.json | 3 + 3 files changed, 71 insertions(+), 55 deletions(-) diff --git a/buildprocess/configureWebpack.js b/buildprocess/configureWebpack.js index 16a5c8e38bd..964deee41f0 100644 --- a/buildprocess/configureWebpack.js +++ b/buildprocess/configureWebpack.js @@ -146,6 +146,8 @@ function configureWebpack( ["@babel/plugin-proposal-decorators", { legacy: true }], "@babel/plugin-proposal-class-properties", "@babel/proposal-object-rest-spread", + "@babel/plugin-proposal-optional-chaining", + "@babel/plugin-proposal-nullish-coalescing-operator", "babel-plugin-styled-components", require.resolve("@babel/plugin-syntax-dynamic-import"), "babel-plugin-lodash" @@ -160,6 +162,7 @@ function configureWebpack( config.module.rules.push({ test: /\.(ts|js)x?$/, include: [ + path.resolve(terriaJSBasePath, "node_modules", "commander"), path.resolve(terriaJSBasePath, "lib"), path.resolve(terriaJSBasePath, "test"), path.resolve(terriaJSBasePath, "buildprocess", "generateDocs.ts"), diff --git a/buildprocess/generateCatalogIndex.ts b/buildprocess/generateCatalogIndex.ts index 1e71967ec29..0c995a7088c 100644 --- a/buildprocess/generateCatalogIndex.ts +++ b/buildprocess/generateCatalogIndex.ts @@ -2,8 +2,8 @@ import Bottleneck from "bottleneck"; import * as fse from "fs-extra"; import { shuffle } from "lodash-es"; import { join, parse } from "path"; -import filterOutUndefined from "../lib/Core/filterOutUndefined"; import TerriaError from "../lib/Core/TerriaError"; +import filterOutUndefined from "../lib/Core/filterOutUndefined"; import timeout from "../lib/Core/timeout"; import CatalogMemberMixin, { getName @@ -14,12 +14,14 @@ import ReferenceMixin from "../lib/ModelMixins/ReferenceMixin"; import CatalogGroup from "../lib/Models/Catalog/CatalogGroup"; import CkanItemReference from "../lib/Models/Catalog/Ckan/CkanItemReference"; import registerCatalogMembers from "../lib/Models/Catalog/registerCatalogMembers"; -import hasTraits from "../lib/Models/Definition/hasTraits"; import { BaseModel } from "../lib/Models/Definition/Model"; +import hasTraits from "../lib/Models/Definition/hasTraits"; import { CatalogIndexFile } from "../lib/Models/SearchProviders/CatalogIndex"; +import registerSearchProviders from "../lib/Models/SearchProviders/registerSearchProviders"; import Terria from "../lib/Models/Terria"; import CatalogMemberReferenceTraits from "../lib/Traits/TraitsClasses/CatalogMemberReferenceTraits"; import patchNetworkRequests from "./patchNetworkRequests"; +import { program } from "commander"; /** Add model to index */ function indexModel( @@ -131,58 +133,20 @@ async function loadReference( result.catchError((e) => console.error(e.toError().message)); } -/** - * Generate catalog index (**experimental**) - * - * This will "crawl" a terria JS catalog, load all groups and references and then create an "index" file which contains fully resolved tree of models. - * - * It applies network request rate limiting (see `speedString` parameter) - * - * @param configUrl URL to map-config - * - * @param baseUrl baseUrl will be used as: - * - `origin` property for CORS - * - URL for `serverConfig` - * - URL for `proxy` - * - * @param outPath catalog-index JSON file path - * - * @param speedString speed will control number of concurrently loaded catalog groups/references - * - default value is 1 (which is around 10 loads per second) - * - minimum value is 1 - * - If speed = 10 - then expect around 100 loads per second - * - Note: - * - loads are somewhat randomised across catalog, so you don't hit one server with many requests - * - one load may not equal one request. some groups/references do not make network requests - * - * @param excludeIdsCsv CSV of model IDs to exclude from catalog index (eg "some-id-1,some-id-2") - * - * @param basicAuth basic auth token to add to requests which include `baseUrl` (or `proxy/`) - - * Example usage: node ./build/generateCatalogIndex.js http://localhost:3001/config.json http://localhost:3001/ - */ export default async function generateCatalogIndex( configUrl: string, baseUrl: string, outPath: string | undefined, speedString: string | undefined, - excludeIdsCsv: string | undefined, - basicAuth: string | undefined + excludeIds: string[] | undefined, + basicAuth: string | undefined, + timeoutMs: number | undefined ) { let debug = false; let speed = speedString ? parseFloat(speedString) : 1; if (speed < 1) speed = 1; - const excludeIds = excludeIdsCsv ? excludeIdsCsv.split(",") : []; - - if (!configUrl || !baseUrl) { - console.error( - `\nUSAGE: node ./build/generateCatalogIndex.js \n` - ); - process.exit(1); - } - // Make sure baseURL has trailing slash baseUrl = baseUrl.endsWith("/") ? baseUrl : `${baseUrl}/`; @@ -196,8 +160,7 @@ export default async function generateCatalogIndex( minTime: 100 / speed }); - /** Timeout for loading groups/references */ - const timeoutMs = 30000; + timeoutMs = timeoutMs ?? 30000; let totalJobs = 0; let completedJobs = 0; @@ -221,7 +184,7 @@ export default async function generateCatalogIndex( let name = getName(member); let path = getPath(terria, member); - if (member.uniqueId && excludeIds.includes(member.uniqueId)) { + if (member.uniqueId && excludeIds && excludeIds.includes(member.uniqueId)) { console.log(`Excluding model \`${member.uniqueId}\`:"${name}" (${path}`); return; } @@ -347,6 +310,7 @@ export default async function generateCatalogIndex( const terria = new Terria(terriaOptions); registerCatalogMembers(); + registerSearchProviders(); try { terria.configParameters.serverConfigUrl = `${baseUrl}serverconfig`; @@ -355,7 +319,7 @@ export default async function generateCatalogIndex( await terria.loadInitSources(); } catch (e) { - console.error(TerriaError.from(e, `Failed to initialise Terria`).toError()); + TerriaError.from(e, `Failed to initialise Terria`).log(); } // Load group and references @@ -412,14 +376,60 @@ export default async function generateCatalogIndex( } } -const [configUrl, baseUrl, outPath, speedString, excludeIdsCsv, basicAuth] = - process.argv.slice(2); +program + .name("generateCatalogIndex") + .description( + `Generate catalog index (**experimental**) + +This will "crawl" a terria JS catalog, load all groups and references and then create an "index" file which contains fully resolved tree of models. + +Example usage +- node ./build/generateCatalogIndex.js -c http://localhost:3001/config.json -b http://localhost:3001/ --excludeIds zrPtHVJcPi + ` + ) + .requiredOption("-c, --configUrl ", "configUrl URL to map-config") + .requiredOption( + "-b, --baseUrl ", + "baseUrl will be used as:\n- `origin` property for CORS\n- URL for `serverConfig`\n- URL for `proxy`" + ) + .option( + "-o, --outPath [outPath]", + "catalog-index JSON file path", + "catalog-index.json" + ) + .option( + "--basicAuth [basicAuth]", + "basic auth token to add to requests which include `baseUrl` (or `proxy/`)" + ) + .option( + "--excludeIds [ids...]", + 'CSV of model IDs to exclude from catalog index (eg "some-id-1 some-id-2")' + ) + .option( + "-s, --speed [speed]", + "speed will control number of concurrently loaded catalog groups/references:\n- default value is 1 (which is around 10 loads per second)\n- minimum value is 1\n- If speed = 10 - then expect around 100 loads per second\n- Note: loads are somewhat randomised across catalog, so you don't hit one server with many requests\n- Also note: one load may not equal one request. some groups/references do not make network requests", + parseFloat, + 1 + ) + .option( + "-t, --timeout [timeout]", + "Network request timeout (in ms)", + parseFloat, + 30000 + ); + +program.parse(); + +const options = program.opts(); + +console.log(options); generateCatalogIndex( - configUrl, - baseUrl, - outPath, - speedString, - excludeIdsCsv, - basicAuth + options.configUrl, + options.baseUrl, + options.outPath, + options.speed, + options.excludeIds, + options.basicAuth, + options.timeout ); diff --git a/package.json b/package.json index 520459e1f73..63a583a2880 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,9 @@ "@babel/parser": "^7.23.5", "@babel/plugin-proposal-class-properties": "^7.18.6", "@babel/plugin-proposal-decorators": "^7.22.7", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", "@babel/plugin-proposal-object-rest-spread": "^7.20.7", + "@babel/plugin-proposal-optional-chaining": "^7.21.0", "@babel/preset-env": "^7.23.5", "@babel/preset-react": "^7.23.3", "@babel/preset-typescript": "^7.22.5", @@ -90,6 +92,7 @@ "class-list": "^0.1.1", "classnames": "^2.3.1", "clipboard": "^2.0.8", + "commander": "^12.0.0", "copy-webpack-plugin": "^6.4.0", "core-js": "^3.1.4", "css-loader": "^2.1.0", From d7aab84ec675b2606c56087ed39e256fa38f0747 Mon Sep 17 00:00:00 2001 From: Nick Forbes-Smith Date: Thu, 21 Mar 2024 12:53:55 +1100 Subject: [PATCH 616/654] clean up gen catalog index --- buildprocess/generateCatalogIndex.ts | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/buildprocess/generateCatalogIndex.ts b/buildprocess/generateCatalogIndex.ts index 0c995a7088c..6ce97ba3c03 100644 --- a/buildprocess/generateCatalogIndex.ts +++ b/buildprocess/generateCatalogIndex.ts @@ -140,7 +140,7 @@ export default async function generateCatalogIndex( speedString: string | undefined, excludeIds: string[] | undefined, basicAuth: string | undefined, - timeoutMs: number | undefined + timeoutMs: number ) { let debug = false; @@ -160,8 +160,6 @@ export default async function generateCatalogIndex( minTime: 100 / speed }); - timeoutMs = timeoutMs ?? 30000; - let totalJobs = 0; let completedJobs = 0; @@ -384,7 +382,7 @@ program This will "crawl" a terria JS catalog, load all groups and references and then create an "index" file which contains fully resolved tree of models. Example usage -- node ./build/generateCatalogIndex.js -c http://localhost:3001/config.json -b http://localhost:3001/ --excludeIds zrPtHVJcPi +- node ./build/generateCatalogIndex.js -c http://localhost:3001/config.json -b http://localhost:3001/ ` ) .requiredOption("-c, --configUrl ", "configUrl URL to map-config") @@ -422,8 +420,6 @@ program.parse(); const options = program.opts(); -console.log(options); - generateCatalogIndex( options.configUrl, options.baseUrl, From c0e6d68cc9d5173e4be86d269457cf7fde016c97 Mon Sep 17 00:00:00 2001 From: Nick Forbes-Smith Date: Thu, 21 Mar 2024 13:35:47 +1100 Subject: [PATCH 617/654] Update changes + docs --- CHANGES.md | 3 +++ doc/customizing/search-providers.md | 6 ++++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index fd69dd5882c..58fedc11409 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -2,7 +2,10 @@ #### next release (8.6.2) +- **Breaking changes:** + - `generateCatalogIndex` now uses `commander` to parse arguments. Run `node ./build/generateCatalogIndex.js --help` for more information. - Fixed exception thrown from `objectArrayTrait` when a model has 0 strata and a `MergeStrategy` of `topStratum`. +- Fix `generateCatalogIndex` after `searchProvider` changes - [The next improvement] #### 8.6.1 - 2024-03-14 diff --git a/doc/customizing/search-providers.md b/doc/customizing/search-providers.md index 3077a7e3fb5..75dc83e0bc4 100644 --- a/doc/customizing/search-providers.md +++ b/doc/customizing/search-providers.md @@ -29,11 +29,11 @@ The [flexsearch](https://github.com/nextapps-de/flexsearch) library is used to i To generate the catalog index: - `yarn build-tools` -- `node .\build\generateCatalogIndex.js config-url base-url` where +- `node ./build/generateCatalogIndex.js -c config-url -b base-url` where - `config-url` is URL to client-side-config file - `base-url` is URL to terriajs-server (this is used to load `server-config` and to proxy requests) - - For example `node .\build\generateCatalogIndex.js http://localhost:3001/config.json http://localhost:3001` + - For example `node ./build/generateCatalogIndex.js -c http://localhost:3001/config.json -b http://localhost:3001/` - This will output three files - `catalog-index.json` @@ -48,6 +48,8 @@ This file will have to be re-generated manually every time the catalog structure For more details see [/buildprocess/generateCatalogIndex.ts](/buildprocess/generateCatalogIndex.ts) +- Run `node ./build/generateCatalogIndex.js --help` for argument documentation + ## Location search providers Location search providers are used to search for locations on the map. TerriaJS currently supports two implementations of search providers: From 0a451d13ea6d28d0c3254c7a77cc7fbc70d9bd5a Mon Sep 17 00:00:00 2001 From: Nick Forbes-Smith Date: Thu, 21 Mar 2024 14:18:47 +1100 Subject: [PATCH 618/654] downgrade commander to work with node v16 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 63a583a2880..d11189195d1 100644 --- a/package.json +++ b/package.json @@ -92,7 +92,7 @@ "class-list": "^0.1.1", "classnames": "^2.3.1", "clipboard": "^2.0.8", - "commander": "^12.0.0", + "commander": "^11.1.0 ", "copy-webpack-plugin": "^6.4.0", "core-js": "^3.1.4", "css-loader": "^2.1.0", From e54209fbd96a58d2ac25f1b280a994b971d1145c Mon Sep 17 00:00:00 2001 From: Nick Forbes-Smith Date: Thu, 21 Mar 2024 15:26:25 +1100 Subject: [PATCH 619/654] Fix bug with relative URLs being ignored in `generateCatalogIndex` --- CHANGES.md | 1 + buildprocess/generateCatalogIndex.ts | 2 +- buildprocess/patchNetworkRequests.ts | 49 ++++++++++++++++++++-------- 3 files changed, 38 insertions(+), 14 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 58fedc11409..3abf4fb2ede 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -6,6 +6,7 @@ - `generateCatalogIndex` now uses `commander` to parse arguments. Run `node ./build/generateCatalogIndex.js --help` for more information. - Fixed exception thrown from `objectArrayTrait` when a model has 0 strata and a `MergeStrategy` of `topStratum`. - Fix `generateCatalogIndex` after `searchProvider` changes +- Fix bug with relative URLs being ignored in `generateCatalogIndex` - [The next improvement] #### 8.6.1 - 2024-03-14 diff --git a/buildprocess/generateCatalogIndex.ts b/buildprocess/generateCatalogIndex.ts index 6ce97ba3c03..1a0937405ec 100644 --- a/buildprocess/generateCatalogIndex.ts +++ b/buildprocess/generateCatalogIndex.ts @@ -150,7 +150,7 @@ export default async function generateCatalogIndex( // Make sure baseURL has trailing slash baseUrl = baseUrl.endsWith("/") ? baseUrl : `${baseUrl}/`; - patchNetworkRequests(baseUrl, basicAuth); + patchNetworkRequests(baseUrl, basicAuth, true); console.log(`Config URL: ${configUrl}`); diff --git a/buildprocess/patchNetworkRequests.ts b/buildprocess/patchNetworkRequests.ts index 254f6dacbea..9c82455f785 100644 --- a/buildprocess/patchNetworkRequests.ts +++ b/buildprocess/patchNetworkRequests.ts @@ -1,4 +1,5 @@ import fetch, { Headers, Request, Response } from "node-fetch"; +import Resource from "terriajs-cesium/Source/Core/Resource"; import URI from "urijs"; /** Patch XMLHttpRequest and Fetch so they work correctly in Node.js @@ -24,6 +25,13 @@ export default function patchNetworkRequests( method: string, url: string ) { + // All URLs need to be absolute - so add the base URL if it's not already there + if (url.indexOf("http://") !== 0 && url.indexOf("https://") !== 0) { + console.log(`Rewrite relative URL: \`${url}\` to \`${arguments[1]}\``); + arguments[1] = `${baseUrl}${url}`; + url = `${baseUrl}${url}`; + } + open.apply(this, arguments as any); console.log("\x1b[35m%s\x1b[0m", `Making XHR: ${url}`); @@ -46,29 +54,44 @@ export default function patchNetworkRequests( } }; - // Alternative approach using Resource instead of XMLHttpRequest (can be swapped over if needed) - - // const load = (Resource as any)._Implementations.loadWithXhr; - // (Resource as any)._Implementations.loadWithXhr = function(...args: any) { - // if (URI(args[0]).hostname() === baseHostname) { - // if (!args[4]) { - // args[4] = {}; - // } - // args[4]["authorization"] = `Basic ${basicAuth}`; - // } + const load = (Resource as any)._Implementations.loadWithXhr; + (Resource as any)._Implementations.loadWithXhr = function (...args: any) { + // Note we don't need to patch the loadWithXhr for basic auth, as it uses XMLHttpRequest + // if (URI(args[0]).hostname() === baseHostname) { + // if (!args[4]) { + // args[4] = {}; + // } + // args[4]["authorization"] = `Basic ${basicAuth}`; + // } + + console.log("\x1b[35m%s\x1b[0m", `Loading resource request: ${args[0]}`); + + // All URLs need to be absolute - so add the base URL if it's not already there + if (args[0].indexOf("http://") !== 0 && args[0].indexOf("https://") !== 0) { + console.log( + `Rewrite relative URL: \`${args[0]}\` to \`${baseUrl}${args[0]}\`` + ); + args[0] = `${baseUrl}${args[0]}`; + } - // load.apply(this, args); - // }; + load.apply(this, args); + }; // A fun method to add Auth headers to all requests with baseUrl const newFetch = ( input: RequestInfo, init?: RequestInit ): Promise => { - const url = typeof input === "string" ? input : input.url; + let url = typeof input === "string" ? input : input.url; console.log("\x1b[35m%s\x1b[0m", `Making fetch request: ${url}`); + // All URLs need to be absolute - so add the base URL if it's not already there + if (url.indexOf("http://") !== 0 && url.indexOf("https://") !== 0) { + console.log(`Rewrite relative URL: \`${url}\` to \`${baseUrl}${url}\``); + url = `${baseUrl}${url}`; + } + if ( (basicAuth && URI(url).hostname() === baseHostname) || url.startsWith("proxy/") From 84fc123ed2b29f27b6ebf52545ec51046217a3c2 Mon Sep 17 00:00:00 2001 From: Stephen Davies Date: Fri, 22 Mar 2024 02:38:20 +1100 Subject: [PATCH 620/654] Fix setting appBaseHref when running Terria in node --- lib/Models/Terria.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Models/Terria.ts b/lib/Models/Terria.ts index 48394cc90e9..d1047c0ecec 100644 --- a/lib/Models/Terria.ts +++ b/lib/Models/Terria.ts @@ -696,7 +696,7 @@ export default class Terria { this.appBaseHref = ensureSuffix( new URL( options.appBaseHref, - typeof document !== "undefined" ? document.baseURI : "/" + typeof document !== "undefined" ? document.baseURI : undefined ).href, "/" ); From 37f2484c132bd2e4b5a2641fe3b9451d52c2fb64 Mon Sep 17 00:00:00 2001 From: Stephen Davies Date: Fri, 22 Mar 2024 03:29:07 +1100 Subject: [PATCH 621/654] Fix tests --- test/Models/TerriaSpec.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/Models/TerriaSpec.ts b/test/Models/TerriaSpec.ts index 9e9b3259fee..59696ebfe26 100644 --- a/test/Models/TerriaSpec.ts +++ b/test/Models/TerriaSpec.ts @@ -76,7 +76,8 @@ describe("Terria", function () { baseUrl: "./", cesiumBaseUrl: "some/path/to/cesium" }); - expect(terria.cesiumBaseUrl).toBe("some/path/to/cesium/"); + const path = new URL(terria.cesiumBaseUrl).pathname; + expect(path).toBe("/some/path/to/cesium/"); }); it("should default to a path relative to `baseUrl`", function () { @@ -84,9 +85,8 @@ describe("Terria", function () { appBaseHref: "/", baseUrl: "some/path/to/terria" }); - expect(terria.cesiumBaseUrl).toBe( - "some/path/to/terria/build/Cesium/build/" - ); + const path = new URL(terria.cesiumBaseUrl).pathname; + expect(path).toBe("/some/path/to/terria/build/Cesium/build/"); }); it("should update the baseUrl setting in the cesium module", function () { From d80defbe34cb11b59cbd51aff61d06bcda83331d Mon Sep 17 00:00:00 2001 From: Nick Forbes-Smith Date: Fri, 22 Mar 2024 13:41:15 +1100 Subject: [PATCH 622/654] Fix ArcGisMapServerImageryProvider tileInfo bug --- CHANGES.md | 1 + lib/Models/Catalog/Esri/ArcGisInterfaces.ts | 1 + .../Esri/ArcGisMapServerCatalogItem.ts | 2 + .../esri/ArcGisMapServerCatalogItemSpec.ts | 47 +- .../LayerWithTiles/layers.json | 451 ++++++++++++++++++ .../LayerWithTiles/legend.json | 52 ++ .../LayerWithTiles/mapserver.json | 224 +++++++++ 7 files changed, 764 insertions(+), 14 deletions(-) create mode 100644 wwwroot/test/ArcGisMapServer/LayerWithTiles/layers.json create mode 100644 wwwroot/test/ArcGisMapServer/LayerWithTiles/legend.json create mode 100644 wwwroot/test/ArcGisMapServer/LayerWithTiles/mapserver.json diff --git a/CHANGES.md b/CHANGES.md index 3abf4fb2ede..1c3c9cba9b2 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -7,6 +7,7 @@ - Fixed exception thrown from `objectArrayTrait` when a model has 0 strata and a `MergeStrategy` of `topStratum`. - Fix `generateCatalogIndex` after `searchProvider` changes - Fix bug with relative URLs being ignored in `generateCatalogIndex` +- Fix bug with ArcGisMapServerImageryProvider not correctly identifying if the `tile` endpoint can be used - [The next improvement] #### 8.6.1 - 2024-03-14 diff --git a/lib/Models/Catalog/Esri/ArcGisInterfaces.ts b/lib/Models/Catalog/Esri/ArcGisInterfaces.ts index 06e959da05f..144d6bffd5f 100644 --- a/lib/Models/Catalog/Esri/ArcGisInterfaces.ts +++ b/lib/Models/Catalog/Esri/ArcGisInterfaces.ts @@ -47,6 +47,7 @@ export interface MapServer { */ singleFusedMapCache?: boolean; //comma separated list of supported capabilities - e.g. "Map,Query,Data,TilesOnly,Tilemap" + tileInfo?: unknown; capabilities?: string; mapName?: string; timeInfo?: TimeInfo; diff --git a/lib/Models/Catalog/Esri/ArcGisMapServerCatalogItem.ts b/lib/Models/Catalog/Esri/ArcGisMapServerCatalogItem.ts index bbe8dcb2912..ced44e00963 100644 --- a/lib/Models/Catalog/Esri/ArcGisMapServerCatalogItem.ts +++ b/lib/Models/Catalog/Esri/ArcGisMapServerCatalogItem.ts @@ -322,6 +322,8 @@ class MapServerStratum extends LoadableStratum( * If the `layersArray` property is specified, we request individual dynamic layers and ignore the fused map cache. */ @computed get usePreCachedTilesIfAvailable() { + if (!this.mapServer.tileInfo) return false; + if (this._item.parameters) return false; return ( diff --git a/test/Models/Catalog/esri/ArcGisMapServerCatalogItemSpec.ts b/test/Models/Catalog/esri/ArcGisMapServerCatalogItemSpec.ts index 323b89144d0..d58d8ed2c89 100644 --- a/test/Models/Catalog/esri/ArcGisMapServerCatalogItemSpec.ts +++ b/test/Models/Catalog/esri/ArcGisMapServerCatalogItemSpec.ts @@ -59,6 +59,12 @@ describe("ArcGisMapServerCatalogItem", function () { return realLoadWithXhr(...args); } else if (url.match("/cadastre_history/MapServer")) { args[0] = "test/ArcGisMapServer/time-enabled.json"; + } else if (url.match("/LayerWithTiles/MapServer")) { + url = url.replace(/^.*\/MapServer/, "MapServer"); + url = url.replace(/MapServer\/?\?.*/i, "mapserver.json"); + url = url.replace(/MapServer\/Legend\/?\?.*/i, "legend.json"); + url = url.replace(/MapServer\/Layers\/?\?.*/i, "layers.json"); + args[0] = "test/ArcGisMapServer/LayerWithTiles/" + url; } return realLoadWithXhr(...args); @@ -268,12 +274,16 @@ describe("ArcGisMapServerCatalogItem", function () { it("usePreCachedTilesIfAvailable = false if requesting specific layers", async function () { runInAction(() => { item = new ArcGisMapServerCatalogItem("test", new Terria()); - item.setTrait(CommonStrata.definition, "url", mapServerUrl); - item.setTrait(CommonStrata.definition, "layers", "31,32"); + item.setTrait( + CommonStrata.definition, + "url", + "http://www.example.com/LayerWithTiles/MapServer" + ); + item.setTrait(CommonStrata.definition, "layers", "0"); }); await item.loadMapItems(); - expect(item.layersArray.length).toBe(2); + expect(item.layersArray.length).toBe(1); imageryProvider = item.mapItems[0] .imageryProvider as ArcGisMapServerImageryProvider; @@ -284,7 +294,11 @@ describe("ArcGisMapServerCatalogItem", function () { it("usePreCachedTilesIfAvailable = false if requesting layer ID in url path", async function () { runInAction(() => { item = new ArcGisMapServerCatalogItem("test", new Terria()); - item.setTrait(CommonStrata.definition, "url", singleLayerUrl); + item.setTrait( + CommonStrata.definition, + "url", + "http://www.example.com/LayerWithTiles/MapServer/1" + ); }); await item.loadMapItems(); @@ -299,7 +313,11 @@ describe("ArcGisMapServerCatalogItem", function () { it("usePreCachedTilesIfAvailable = false if parameters have been specified", async function () { runInAction(() => { item = new ArcGisMapServerCatalogItem("test", new Terria()); - item.setTrait(CommonStrata.definition, "url", mapServerUrl); + item.setTrait( + CommonStrata.definition, + "url", + "http://www.example.com/LayerWithTiles/MapServer" + ); item.setTrait(CommonStrata.definition, "layers", undefined); item.setTrait(CommonStrata.definition, "parameters", { test: "something" @@ -318,11 +336,15 @@ describe("ArcGisMapServerCatalogItem", function () { it("usePreCachedTilesIfAvailable = true if not requesting specific layers", async function () { runInAction(() => { item = new ArcGisMapServerCatalogItem("test", new Terria()); - item.setTrait(CommonStrata.definition, "url", mapServerUrl); + item.setTrait( + CommonStrata.definition, + "url", + "http://www.example.com/LayerWithTiles/MapServer" + ); item.setTrait(CommonStrata.definition, "layers", undefined); }); await item.loadMapItems(); - expect(item.layersArray.length).toBe(74); + expect(item.layersArray.length).toBe(2); imageryProvider = item.mapItems[0] .imageryProvider as ArcGisMapServerImageryProvider; @@ -333,18 +355,15 @@ describe("ArcGisMapServerCatalogItem", function () { it("usePreCachedTilesIfAvailable = true if requesting all layers", async function () { runInAction(() => { item = new ArcGisMapServerCatalogItem("test", new Terria()); - item.setTrait(CommonStrata.definition, "url", mapServerUrl); item.setTrait( CommonStrata.definition, - "layers", - new Array(74) - .fill(0) - .map((_, i) => i) - .join(",") + "url", + "http://www.example.com/LayerWithTiles/MapServer" ); + item.setTrait(CommonStrata.definition, "layers", "0,1"); }); await item.loadMapItems(); - expect(item.layersArray.length).toBe(74); + expect(item.layersArray.length).toBe(2); imageryProvider = item.mapItems[0] .imageryProvider as ArcGisMapServerImageryProvider; diff --git a/wwwroot/test/ArcGisMapServer/LayerWithTiles/layers.json b/wwwroot/test/ArcGisMapServer/LayerWithTiles/layers.json new file mode 100644 index 00000000000..d56ec2d3f23 --- /dev/null +++ b/wwwroot/test/ArcGisMapServer/LayerWithTiles/layers.json @@ -0,0 +1,451 @@ +{ + "layers": [ + { + "currentVersion": 11.1, + "cimVersion": "3.1.0", + "id": 0, + "name": "CED", + "type": "Feature Layer", + "description": "", + "geometryType": "esriGeometryPolygon", + "sourceSpatialReference": { + "wkid": 102100, + "latestWkid": 3857, + "xyTolerance": 0.001, + "zTolerance": 0.001, + "mTolerance": 0.001, + "falseX": -20037700, + "falseY": -30241100, + "xyUnits": 10000, + "falseZ": -100000, + "zUnits": 10000, + "falseM": -100000, + "mUnits": 10000 + }, + "copyrightText": "", + "parentLayer": null, + "subLayers": [], + "minScale": 0, + "maxScale": 0, + "referenceScale": 0.0, + "drawingInfo": { + "renderer": { + "type": "simple", + "symbol": { + "type": "esriSFS", + "style": "esriSFSSolid", + "color": [0, 0, 0, 0], + "outline": { + "type": "esriSLS", + "style": "esriSLSSolid", + "color": [227, 26, 28, 255], + "width": 1 + } + } + }, + "scaleSymbols": true, + "transparency": 0, + "labelingInfo": null + }, + "defaultVisibility": true, + "extent": { + "xmin": 1.0777612572299998e7, + "ymin": -5425372.930199999, + "xmax": 1.7711957239600003e7, + "ymax": -1022048.4739000015, + "spatialReference": { + "wkid": 102100, + "latestWkid": 3857, + "xyTolerance": 0.001, + "zTolerance": 0.001, + "mTolerance": 0.001, + "falseX": -20037700, + "falseY": -30241100, + "xyUnits": 10000, + "falseZ": -100000, + "zUnits": 10000, + "falseM": -100000, + "mUnits": 10000 + } + }, + "hasAttachments": false, + "htmlPopupType": "esriServerHTMLPopupTypeAsHTMLText", + "displayField": "CED_NAME", + "typeIdField": null, + "subtypeFieldName": null, + "subtypeField": null, + "defaultSubtypeCode": null, + "fields": [ + { + "name": "objectid", + "type": "esriFieldTypeOID", + "alias": "OBJECTID", + "domain": null + }, + { + "name": "shape", + "type": "esriFieldTypeGeometry", + "alias": "Shape", + "domain": null + }, + { + "name": "CED_CODE", + "type": "esriFieldTypeString", + "alias": "CED_CODE", + "length": 6, + "domain": null + }, + { + "name": "CED_NAME", + "type": "esriFieldTypeString", + "alias": "CED_NAME", + "length": 40, + "domain": null + }, + { + "name": "st_length(shape)", + "type": "esriFieldTypeDouble", + "alias": "Shape_Length", + "domain": null + }, + { + "name": "st_area(shape)", + "type": "esriFieldTypeDouble", + "alias": "Shape_Area", + "domain": null + } + ], + "geometryField": { + "name": "shape", + "type": "esriFieldTypeGeometry", + "alias": "Shape" + }, + "indexes": [ + { + "name": "i257ced_code", + "fields": "CED_CODE", + "isAscending": true, + "isUnique": false, + "description": "" + }, + { + "name": "i257ced_name", + "fields": "CED_NAME", + "isAscending": true, + "isUnique": false, + "description": "" + }, + { + "name": "r533_sde_rowid_uk", + "fields": "objectid", + "isAscending": true, + "isUnique": true, + "description": "" + }, + { + "name": "a522_ix1", + "fields": "shape", + "isAscending": true, + "isUnique": true, + "description": "" + } + ], + "subtypes": [], + "relationships": [], + "canModifyLayer": true, + "canScaleSymbols": false, + "hasLabels": false, + "capabilities": "Map,Query,Data", + "maxRecordCount": 2000, + "supportsStatistics": true, + "supportsExceedsLimitStatistics": true, + "supportsAdvancedQueries": true, + "hasZ": true, + "hasM": true, + "supportedQueryFormats": "JSON, geoJSON, PBF", + "isDataVersioned": false, + "ownershipBasedAccessControlForFeatures": { "allowOthersToQuery": true }, + "useStandardizedQueries": true, + "supportedSpatialRelationships": [ + "esriSpatialRelIntersects", + "esriSpatialRelContains", + "esriSpatialRelCrosses", + "esriSpatialRelEnvelopeIntersects", + "esriSpatialRelIndexIntersects", + "esriSpatialRelOverlaps", + "esriSpatialRelTouches", + "esriSpatialRelWithin", + "esriSpatialRelRelation" + ], + "advancedQueryCapabilities": { + "useStandardizedQueries": true, + "supportsStatistics": true, + "supportsPercentileStatistics": true, + "supportsHavingClause": true, + "supportsOrderBy": true, + "supportsDistinct": true, + "supportsCountDistinct": true, + "supportsPagination": true, + "supportsLod": false, + "supportsQueryWithLodSR": false, + "supportsTrueCurve": true, + "supportsQueryWithDatumTransformation": true, + "supportsReturningQueryExtent": true, + "supportsQueryWithDistance": true, + "supportsSqlExpression": true, + "supportsTimeRelation": true, + "supportsSqlFormat": false, + "supportsQueryAnalytic": true + }, + "supportsDatumTransformation": true, + "advancedQueryAnalyticCapabilities": { + "supportsLinearRegression": true, + "supportsAsync": false, + "supportsPercentileAnalytic": false + }, + "dateFieldsTimeReference": null, + "preferredTimeReference": null, + "datesInUnknownTimezone": false, + "hasGeometryProperties": true, + "geometryProperties": { + "shapeAreaFieldName": "st_area(shape)", + "shapeLengthFieldName": "st_length(shape)", + "units": "esriMeters", + "mapUnits": { "uwkid": 9001 } + }, + "hasMetadata": true, + "isDataArchived": false, + "archivingInfo": { + "supportsQueryWithHistoricMoment": false, + "startArchivingMoment": -1 + }, + "supportsCoordinatesQuantization": true, + "supportsDynamicLegends": true, + "serviceItemId": "29715c4ca43543de88ec7ce6506b13bf" + }, + { + "currentVersion": 11.1, + "cimVersion": "3.1.0", + "id": 1, + "name": "CED_GEN", + "type": "Feature Layer", + "description": "", + "geometryType": "esriGeometryPolygon", + "sourceSpatialReference": { + "wkid": 102100, + "latestWkid": 3857, + "xyTolerance": 0.001, + "zTolerance": 0.001, + "mTolerance": 0.001, + "falseX": -20037700, + "falseY": -30241100, + "xyUnits": 10000, + "falseZ": -100000, + "zUnits": 10000, + "falseM": -100000, + "mUnits": 10000 + }, + "copyrightText": "", + "parentLayer": null, + "subLayers": [], + "minScale": 0, + "maxScale": 0, + "referenceScale": 0.0, + "drawingInfo": { + "renderer": { + "type": "simple", + "symbol": { + "type": "esriSFS", + "style": "esriSFSSolid", + "color": [0, 0, 0, 0], + "outline": { + "type": "esriSLS", + "style": "esriSLSSolid", + "color": [227, 26, 28, 255], + "width": 1 + } + } + }, + "scaleSymbols": true, + "transparency": 0, + "labelingInfo": null + }, + "defaultVisibility": false, + "extent": { + "xmin": 1.07776133515e7, + "ymin": -5410374.9551, + "xmax": 1.77119524529e7, + "ymax": -1022048.4739000015, + "spatialReference": { + "wkid": 102100, + "latestWkid": 3857, + "xyTolerance": 0.001, + "zTolerance": 0.001, + "mTolerance": 0.001, + "falseX": -20037700, + "falseY": -30241100, + "xyUnits": 10000, + "falseZ": -100000, + "zUnits": 10000, + "falseM": -100000, + "mUnits": 10000 + } + }, + "hasAttachments": false, + "htmlPopupType": "esriServerHTMLPopupTypeAsHTMLText", + "displayField": "CED_NAME", + "typeIdField": null, + "subtypeFieldName": null, + "subtypeField": null, + "defaultSubtypeCode": null, + "fields": [ + { + "name": "objectid", + "type": "esriFieldTypeOID", + "alias": "OBJECTID", + "domain": null + }, + { + "name": "shape", + "type": "esriFieldTypeGeometry", + "alias": "Shape", + "domain": null + }, + { + "name": "CED_CODE", + "type": "esriFieldTypeString", + "alias": "CED_CODE", + "length": 6, + "domain": null + }, + { + "name": "CED_NAME", + "type": "esriFieldTypeString", + "alias": "CED_NAME", + "length": 40, + "domain": null + }, + { + "name": "st_length(shape)", + "type": "esriFieldTypeDouble", + "alias": "Shape_Length", + "domain": null + }, + { + "name": "st_area(shape)", + "type": "esriFieldTypeDouble", + "alias": "Shape_Area", + "domain": null + } + ], + "geometryField": { + "name": "shape", + "type": "esriFieldTypeGeometry", + "alias": "Shape" + }, + "indexes": [ + { + "name": "i258ced_code", + "fields": "CED_CODE", + "isAscending": true, + "isUnique": false, + "description": "" + }, + { + "name": "i258ced_name", + "fields": "CED_NAME", + "isAscending": true, + "isUnique": false, + "description": "" + }, + { + "name": "r535_sde_rowid_uk", + "fields": "objectid", + "isAscending": true, + "isUnique": true, + "description": "" + }, + { + "name": "a524_ix1", + "fields": "shape", + "isAscending": true, + "isUnique": true, + "description": "" + } + ], + "subtypes": [], + "relationships": [], + "canModifyLayer": true, + "canScaleSymbols": false, + "hasLabels": false, + "capabilities": "Map,Query,Data", + "maxRecordCount": 2000, + "supportsStatistics": true, + "supportsExceedsLimitStatistics": true, + "supportsAdvancedQueries": true, + "hasZ": true, + "hasM": true, + "supportedQueryFormats": "JSON, geoJSON, PBF", + "isDataVersioned": false, + "ownershipBasedAccessControlForFeatures": { "allowOthersToQuery": true }, + "useStandardizedQueries": true, + "supportedSpatialRelationships": [ + "esriSpatialRelIntersects", + "esriSpatialRelContains", + "esriSpatialRelCrosses", + "esriSpatialRelEnvelopeIntersects", + "esriSpatialRelIndexIntersects", + "esriSpatialRelOverlaps", + "esriSpatialRelTouches", + "esriSpatialRelWithin", + "esriSpatialRelRelation" + ], + "advancedQueryCapabilities": { + "useStandardizedQueries": true, + "supportsStatistics": true, + "supportsPercentileStatistics": true, + "supportsHavingClause": true, + "supportsOrderBy": true, + "supportsDistinct": true, + "supportsCountDistinct": true, + "supportsPagination": true, + "supportsLod": false, + "supportsQueryWithLodSR": false, + "supportsTrueCurve": true, + "supportsQueryWithDatumTransformation": true, + "supportsReturningQueryExtent": true, + "supportsQueryWithDistance": true, + "supportsSqlExpression": true, + "supportsTimeRelation": true, + "supportsSqlFormat": false, + "supportsQueryAnalytic": true + }, + "supportsDatumTransformation": true, + "advancedQueryAnalyticCapabilities": { + "supportsLinearRegression": true, + "supportsAsync": false, + "supportsPercentileAnalytic": false + }, + "dateFieldsTimeReference": null, + "preferredTimeReference": null, + "datesInUnknownTimezone": false, + "hasGeometryProperties": true, + "geometryProperties": { + "shapeAreaFieldName": "st_area(shape)", + "shapeLengthFieldName": "st_length(shape)", + "units": "esriMeters", + "mapUnits": { "uwkid": 9001 } + }, + "hasMetadata": true, + "isDataArchived": false, + "archivingInfo": { + "supportsQueryWithHistoricMoment": false, + "startArchivingMoment": -1 + }, + "supportsCoordinatesQuantization": true, + "supportsDynamicLegends": true, + "serviceItemId": "29715c4ca43543de88ec7ce6506b13bf" + } + ], + "tables": [] +} diff --git a/wwwroot/test/ArcGisMapServer/LayerWithTiles/legend.json b/wwwroot/test/ArcGisMapServer/LayerWithTiles/legend.json new file mode 100644 index 00000000000..ec315616a0f --- /dev/null +++ b/wwwroot/test/ArcGisMapServer/LayerWithTiles/legend.json @@ -0,0 +1,52 @@ +{ + "layers": [ + { + "layerId": 0, + "layerName": "CED", + "layerType": "Feature Layer", + "minScale": 0, + "maxScale": 0, + "legend": [ + { + "label": "", + "url": "13475f3a5a215091da89ba1f50364cdc", + "imageData": "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAY0lEQVQ4je3UwQnAIBBE0UG2irDpxc4kndmL1mESsxLwPHvcf/H2EIWRdugNx2SdFxIqJQ1kAMXAhHr2ToFNdaILdEwCpBOe2AuQTxyMrQD57A0H8rdnTDaw/6eUOY709V7gAWeDEPvhQjLjAAAAAElFTkSuQmCC", + "contentType": "image/png", + "groupId": "0", + "height": 20, + "width": 20 + } + ], + "legendGroups": [ + { + "id": "0", + "heading": "" + } + ] + }, + { + "layerId": 1, + "layerName": "CED_GEN", + "layerType": "Feature Layer", + "minScale": 0, + "maxScale": 0, + "legend": [ + { + "label": "", + "url": "13475f3a5a215091da89ba1f50364cdc", + "imageData": "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAY0lEQVQ4je3UwQnAIBBE0UG2irDpxc4kndmL1mESsxLwPHvcf/H2EIWRdugNx2SdFxIqJQ1kAMXAhHr2ToFNdaILdEwCpBOe2AuQTxyMrQD57A0H8rdnTDaw/6eUOY709V7gAWeDEPvhQjLjAAAAAElFTkSuQmCC", + "contentType": "image/png", + "groupId": "0", + "height": 20, + "width": 20 + } + ], + "legendGroups": [ + { + "id": "0", + "heading": "" + } + ] + } + ] +} diff --git a/wwwroot/test/ArcGisMapServer/LayerWithTiles/mapserver.json b/wwwroot/test/ArcGisMapServer/LayerWithTiles/mapserver.json new file mode 100644 index 00000000000..e40f0123a40 --- /dev/null +++ b/wwwroot/test/ArcGisMapServer/LayerWithTiles/mapserver.json @@ -0,0 +1,224 @@ +{ + "currentVersion": 11.1, + "cimVersion": "3.1.0", + "serviceDescription": "", + "mapName": "Layers", + "description": "", + "copyrightText": "", + "supportsDynamicLayers": true, + "layers": [ + { + "id": 0, + "name": "CED", + "parentLayerId": -1, + "defaultVisibility": true, + "subLayerIds": null, + "minScale": 0, + "maxScale": 0, + "type": "Feature Layer", + "geometryType": "esriGeometryPolygon", + "supportsDynamicLegends": true + }, + { + "id": 1, + "name": "CED_GEN", + "parentLayerId": -1, + "defaultVisibility": false, + "subLayerIds": null, + "minScale": 0, + "maxScale": 0, + "type": "Feature Layer", + "geometryType": "esriGeometryPolygon", + "supportsDynamicLegends": true + } + ], + "tables": [], + "spatialReference": { + "wkid": 102100, + "latestWkid": 3857, + "xyTolerance": 0.001, + "zTolerance": 0.001, + "mTolerance": 0.001, + "falseX": -20037700, + "falseY": -30241100, + "xyUnits": 10000, + "falseZ": -100000, + "zUnits": 10000, + "falseM": -100000, + "mUnits": 10000 + }, + "singleFusedMapCache": false, + "tileInfo": { + "rows": 256, + "cols": 256, + "dpi": 96, + "format": "PNG", + "compressionQuality": 0, + "origin": { + "x": -2.0037508342787e7, + "y": 2.0037508342787e7 + }, + "spatialReference": { + "wkid": 102100, + "latestWkid": 3857, + "xyTolerance": 0.001, + "zTolerance": 0.001, + "mTolerance": 0.001, + "falseX": -20037700, + "falseY": -30241100, + "xyUnits": 1.4892314192838538e8, + "falseZ": -100000, + "zUnits": 10000, + "falseM": -100000, + "mUnits": 10000 + }, + "lods": [ + { + "level": 0, + "resolution": 156543.033928, + "scale": 5.91657527591555e8 + }, + { + "level": 1, + "resolution": 78271.5169639999, + "scale": 2.95828763795777e8 + }, + { + "level": 2, + "resolution": 39135.7584820001, + "scale": 1.47914381897889e8 + }, + { + "level": 3, + "resolution": 19567.8792409999, + "scale": 7.3957190948944e7 + }, + { + "level": 4, + "resolution": 9783.93962049996, + "scale": 3.6978595474472e7 + }, + { + "level": 5, + "resolution": 4891.96981024998, + "scale": 1.8489297737236e7 + }, + { + "level": 6, + "resolution": 2445.98490512499, + "scale": 9244648.868618 + }, + { + "level": 7, + "resolution": 1222.99245256249, + "scale": 4622324.434309 + }, + { + "level": 8, + "resolution": 611.49622628138, + "scale": 2311162.217155 + }, + { + "level": 9, + "resolution": 305.748113140558, + "scale": 1155581.108577 + }, + { + "level": 10, + "resolution": 152.874056570411, + "scale": 577790.554289 + }, + { + "level": 11, + "resolution": 76.4370282850732, + "scale": 288895.277144 + }, + { + "level": 12, + "resolution": 38.2185141425366, + "scale": 144447.638572 + }, + { + "level": 13, + "resolution": 19.1092570712683, + "scale": 72223.819286 + } + ] + }, + "storageInfo": { + "storageFormat": "esriMapCacheStorageModeCompactV2", + "packetSize": 128 + }, + "initialExtent": { + "xmin": 1.0686671116154265e7, + "ymin": -5916377.298219686, + "xmax": 1.8701674453269962e7, + "ymax": -598607.9389850269, + "spatialReference": { + "wkid": 102100, + "latestWkid": 3857, + "xyTolerance": 0.001, + "zTolerance": 0.001, + "mTolerance": 0.001, + "falseX": -20037700, + "falseY": -30241100, + "xyUnits": 10000, + "falseZ": -100000, + "zUnits": 10000, + "falseM": -100000, + "mUnits": 10000 + } + }, + "fullExtent": { + "xmin": 1.0777612572299998e7, + "ymin": -5425372.930199999, + "xmax": 1.7711957239600003e7, + "ymax": -1022048.4739000015, + "spatialReference": { + "wkid": 102100, + "latestWkid": 3857, + "xyTolerance": 0.001, + "zTolerance": 0.001, + "mTolerance": 0.001, + "falseX": -20037700, + "falseY": -30241100, + "xyUnits": 10000, + "falseZ": -100000, + "zUnits": 10000, + "falseM": -100000, + "mUnits": 10000 + } + }, + "datesInUnknownTimezone": false, + "minScale": 0, + "maxScale": 72223.819286, + "units": "esriMeters", + "supportedImageFormatTypes": "PNG32,PNG24,PNG,JPG,DIB,TIFF,EMF,PS,PDF,GIF,SVG,SVGZ,BMP", + "documentInfo": { + "Title": "Untitled.aprx", + "Author": "", + "Comments": "", + "Subject": "", + "Category": "", + "Version": "3.1.0", + "AntialiasingMode": "Fast", + "TextAntialiasingMode": "Force", + "Keywords": "" + }, + "capabilities": "Map,Query,Data", + "supportedQueryFormats": "JSON, geoJSON, PBF", + "exportTilesAllowed": false, + "referenceScale": 0.0, + "supportsDatumTransformation": true, + "archivingInfo": { "supportsHistoricMoment": false }, + "supportsClipping": true, + "supportsSpatialFilter": true, + "supportsTimeRelation": true, + "supportsQueryDataElements": true, + "mapUnits": { "uwkid": 9001 }, + "maxRecordCount": 2000, + "maxImageHeight": 4096, + "maxImageWidth": 4096, + "supportedExtensions": "FeatureServer, KmlServer, OGCFeatureServer, WFSServer, WMSServer", + "serviceItemId": "29715c4ca43543de88ec7ce6506b13bf" +} From 81ae353c81a6b096f68a7cd39e346790e7829735 Mon Sep 17 00:00:00 2001 From: Nick Forbes-Smith Date: Fri, 22 Mar 2024 15:57:57 +1100 Subject: [PATCH 623/654] reorder MapServer props --- lib/Models/Catalog/Esri/ArcGisInterfaces.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Models/Catalog/Esri/ArcGisInterfaces.ts b/lib/Models/Catalog/Esri/ArcGisInterfaces.ts index 144d6bffd5f..88f9d1b91ab 100644 --- a/lib/Models/Catalog/Esri/ArcGisInterfaces.ts +++ b/lib/Models/Catalog/Esri/ArcGisInterfaces.ts @@ -46,8 +46,8 @@ export interface MapServer { * So instead we create a single item in the group called "All layers" (models.arcGisMapServerCatalogGroup.singleFusedMapCacheLayerName) */ singleFusedMapCache?: boolean; - //comma separated list of supported capabilities - e.g. "Map,Query,Data,TilesOnly,Tilemap" tileInfo?: unknown; + //comma separated list of supported capabilities - e.g. "Map,Query,Data,TilesOnly,Tilemap" capabilities?: string; mapName?: string; timeInfo?: TimeInfo; From 5547251d8591daa0ca296a35b297edde983fea9d Mon Sep 17 00:00:00 2001 From: Nick Forbes-Smith Date: Fri, 22 Mar 2024 15:59:09 +1100 Subject: [PATCH 624/654] Add comment --- lib/Models/Catalog/Esri/ArcGisMapServerCatalogItem.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/Models/Catalog/Esri/ArcGisMapServerCatalogItem.ts b/lib/Models/Catalog/Esri/ArcGisMapServerCatalogItem.ts index ced44e00963..b91a6c9003f 100644 --- a/lib/Models/Catalog/Esri/ArcGisMapServerCatalogItem.ts +++ b/lib/Models/Catalog/Esri/ArcGisMapServerCatalogItem.ts @@ -322,6 +322,7 @@ class MapServerStratum extends LoadableStratum( * If the `layersArray` property is specified, we request individual dynamic layers and ignore the fused map cache. */ @computed get usePreCachedTilesIfAvailable() { + // Checking tileInfo in MapServer metadata should be handled by cesium - but currently there is a bug in ArcGisMapServerImageryProvider if (!this.mapServer.tileInfo) return false; if (this._item.parameters) return false; From 0ea673fff5f841070e74aca3a2eebb33ec970d36 Mon Sep 17 00:00:00 2001 From: Nick Forbes-Smith Date: Fri, 22 Mar 2024 16:04:27 +1100 Subject: [PATCH 625/654] Release TerriaJS 8.7.0 --- CHANGES.md | 7 +++++-- package.json | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 1c3c9cba9b2..a8e03340da9 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,6 +1,10 @@ # Change Log -#### next release (8.6.2) +#### next release (8.7.1) + +- [The next improvement] + +#### 8.7.0 - 2024-03-22 - **Breaking changes:** - `generateCatalogIndex` now uses `commander` to parse arguments. Run `node ./build/generateCatalogIndex.js --help` for more information. @@ -8,7 +12,6 @@ - Fix `generateCatalogIndex` after `searchProvider` changes - Fix bug with relative URLs being ignored in `generateCatalogIndex` - Fix bug with ArcGisMapServerImageryProvider not correctly identifying if the `tile` endpoint can be used -- [The next improvement] #### 8.6.1 - 2024-03-14 diff --git a/package.json b/package.json index d11189195d1..8db468021d3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "terriajs", - "version": "8.6.1", + "version": "8.7.0", "description": "Geospatial data visualization platform.", "license": "Apache-2.0", "engines": { From 20846c720638133d78e8a0d03f5a2224f7ad4b54 Mon Sep 17 00:00:00 2001 From: Kevin Ring Date: Sat, 23 Mar 2024 21:51:40 +1100 Subject: [PATCH 626/654] Use CesiumJS v1.115. --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 8db468021d3..22bdbbabfb1 100644 --- a/package.json +++ b/package.json @@ -176,8 +176,8 @@ "style-loader": "^0.23.1", "styled-components": "^5.3.9", "svg-sprite-loader": "4.1.3", - "terriajs-cesium": "6.2.0", - "terriajs-cesium-widgets": "4.4.0", + "terriajs-cesium": "8.0.0", + "terriajs-cesium-widgets": "5.0.0", "terriajs-html2canvas": "1.0.0-alpha.12-terriajs-1", "thredds-catalog-crawler": "0.0.6", "ts-essentials": "^5.0.0", From 9de25ef86c837fd7b11cfe9350d30fa80ac916c9 Mon Sep 17 00:00:00 2001 From: Lawrence Owen Date: Thu, 28 Mar 2024 09:02:08 +1000 Subject: [PATCH 627/654] Add cesium upgrade to changelog --- CHANGES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES.md b/CHANGES.md index a8e03340da9..9a68f3f6105 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -2,6 +2,7 @@ #### next release (8.7.1) +- Upgraded to TerriajS Cesium 1.115.0 - [The next improvement] #### 8.7.0 - 2024-03-22 From 78aceff1a8de056ac30648dcd71540bd11bb7a1b Mon Sep 17 00:00:00 2001 From: "Peter A. Jonsson" Date: Sat, 30 Mar 2024 23:26:51 +0100 Subject: [PATCH 628/654] Run yarn install --- yarn.lock | 62 +++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 42 insertions(+), 20 deletions(-) diff --git a/yarn.lock b/yarn.lock index 18f9e4201f3..65319258424 100644 --- a/yarn.lock +++ b/yarn.lock @@ -212,7 +212,7 @@ dependencies: "@babel/types" "^7.22.5" -"@babel/helper-skip-transparent-expression-wrappers@^7.22.5": +"@babel/helper-skip-transparent-expression-wrappers@^7.20.0", "@babel/helper-skip-transparent-expression-wrappers@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz#007f15240b5751c537c40e77abb4e89eeaaa8847" integrity sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q== @@ -316,6 +316,14 @@ "@babel/helper-split-export-declaration" "^7.22.6" "@babel/plugin-syntax-decorators" "^7.22.5" +"@babel/plugin-proposal-nullish-coalescing-operator@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz#fdd940a99a740e577d6c753ab6fbb43fdb9467e1" + integrity sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-proposal-object-rest-spread@^7.20.7": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz#aa662940ef425779c75534a5c41e9d936edc390a" @@ -327,6 +335,15 @@ "@babel/plugin-syntax-object-rest-spread" "^7.8.3" "@babel/plugin-transform-parameters" "^7.20.7" +"@babel/plugin-proposal-optional-chaining@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz#886f5c8978deb7d30f678b2e24346b287234d3ea" + integrity sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": version "7.21.0-placeholder-for-preset-env.2" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz#7844f9289546efa9febac2de4cfe358a050bd703" @@ -1544,10 +1561,10 @@ "@turf/helpers" "^6.5.0" "@turf/invariant" "^6.5.0" -"@tweenjs/tween.js@^21.0.0": - version "21.1.1" - resolved "https://registry.yarnpkg.com/@tweenjs/tween.js/-/tween.js-21.1.1.tgz#5ad68be730fc39ef9e08760842ed798ec2c9fc5d" - integrity sha512-O2GetAwEC/0MOiRb3lxCLIt/eeugoDPX0nu+1SFWLqGKf835ZdWsfM9RzDpjF+aKkpYMhvOnEhO+SxMnHHjpfw== +"@tweenjs/tween.js@^23.1.1": + version "23.1.1" + resolved "https://registry.yarnpkg.com/@tweenjs/tween.js/-/tween.js-23.1.1.tgz#0ae28ed9c635805557f78c2626464018d5f1b5e2" + integrity sha512-ZpboH7pCPPeyBWKf8c7TJswtCEQObFo3bOBYalm99NzZarATALYCo5OhbCa/n4RQyJyHfhkdx+hNrdL5ByFYDw== "@types/arcgis-rest-api@^10.4.5": version "10.4.5" @@ -2336,10 +2353,10 @@ resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== -"@zip.js/zip.js@2.4.x": - version "2.4.26" - resolved "https://registry.yarnpkg.com/@zip.js/zip.js/-/zip.js-2.4.26.tgz#b79bb2055dc6e185890ee01cdb710caba505d5b2" - integrity sha512-I9HBO3BHIxEMQmltmHM3iqUW6IHqi3gsL9wTSXvHTRpOrA6q2OxtR58EDSaOGjHhDVJ+wIOAxZyKq2x00AVmqw== +"@zip.js/zip.js@^2.7.34": + version "2.7.40" + resolved "https://registry.yarnpkg.com/@zip.js/zip.js/-/zip.js-2.7.40.tgz#e53626cfe051119df97bf1672188b9f36dfe75b8" + integrity sha512-kSYwO0Wth6G66QM4CejZqG0nRhBsVVTaR18M/Ta8EcqcvaV0dYrnDDyKAstfy0V5+ejK4b9w5xc1W0ECATJTvA== JSONStream@^1.0.0: version "1.3.5" @@ -3805,6 +3822,11 @@ commander@2.17.x: resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" integrity sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg== +"commander@^11.1.0 ": + version "11.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-11.1.0.tgz#62fdce76006a68e5c1ab3314dc92e800eb83d906" + integrity sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ== + commander@~2.19.0: version "2.19.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" @@ -11659,21 +11681,21 @@ temp-fs@^0.9.9: dependencies: rimraf "~2.5.2" -terriajs-cesium-widgets@4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/terriajs-cesium-widgets/-/terriajs-cesium-widgets-4.4.0.tgz#f7bb130494942b97d6fb61ba23823a5e0f7e1b29" - integrity sha512-IHXEue9jhF5beBMirzdZHw7WJfCuy/Tp8IDDkMhwhqX372P8kQu136W+bjR/vDPlx32RPo5EK/c1CpINW2r/9g== +terriajs-cesium-widgets@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/terriajs-cesium-widgets/-/terriajs-cesium-widgets-5.0.0.tgz#52a67cd33815ccc777acd35d66319b25ad82c425" + integrity sha512-v3zHp+tYvq7Siov/BDDhX/2caDKPdBayyA0YqnWIuBTRx5nLcm4Nh3AFs44v+ouprZ8MoMAc3Q+546A4bo9OiQ== dependencies: nosleep.js "^0.12.0" - terriajs-cesium "^6.2.0" + terriajs-cesium "^8.0.0" -terriajs-cesium@6.2.0, terriajs-cesium@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/terriajs-cesium/-/terriajs-cesium-6.2.0.tgz#5a3c12f7789736984dc1741d3d3a0f7767d3c394" - integrity sha512-L561XTvDusNWvqU6BaO8y1vbbdNN1DvwS2gJxOgkibMkzOlWxo0vLa/RtxJtprCi+QShT7MAB6QIsub/gCIxKw== +terriajs-cesium@8.0.0, terriajs-cesium@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/terriajs-cesium/-/terriajs-cesium-8.0.0.tgz#7f83b5fa12014c2803f8e2513be3f1779913dd99" + integrity sha512-YpNZh1fmBaRuyVQP1R6/0C5CfwwuVAGvJGgXSD1rSskjpynQ3MmRNi+YfqzsHxkkyUBEOtLFnzPxRYDAy/Id0w== dependencies: - "@tweenjs/tween.js" "^21.0.0" - "@zip.js/zip.js" "2.4.x" + "@tweenjs/tween.js" "^23.1.1" + "@zip.js/zip.js" "^2.7.34" autolinker "^4.0.0" bitmap-sdf "^1.0.3" dompurify "^3.0.2" From 55d89f43bbbf09778c969f9f6fcbeb7dda1eb86f Mon Sep 17 00:00:00 2001 From: "Peter A. Jonsson" Date: Sat, 30 Mar 2024 23:29:39 +0100 Subject: [PATCH 629/654] Update to Karma 6.4.3 This fixes a number of security isssues. --- gulpfile.js | 8 +- package.json | 2 +- yarn.lock | 669 ++++++++++++++++++++++++--------------------------- 3 files changed, 321 insertions(+), 358 deletions(-) diff --git a/gulpfile.js b/gulpfile.js index e904266f249..f20f94d8db7 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -142,10 +142,9 @@ gulp.task("test", function (done) { }); function runKarma(configFile, done) { - var karma = require("karma").Server; - var path = require("path"); - - karma.start( + const { Server } = require("karma"); + const path = require("path"); + const server = new Server( { configFile: path.join(__dirname, configFile) }, @@ -153,6 +152,7 @@ function runKarma(configFile, done) { return done(e); } ); + server.start(); } gulp.task("code-attribution", function userAttribution(done) { diff --git a/package.json b/package.json index 22bdbbabfb1..25b96e785df 100644 --- a/package.json +++ b/package.json @@ -213,7 +213,7 @@ "jasmine-core": "^2.9.1", "jsdom": "^17.0.0", "jsdom-global": "^3.0.2", - "karma": "^4.0.0", + "karma": "^6.4.3", "karma-browserstack-launcher": "^1.4.0", "karma-chrome-launcher": "^2.0.0", "karma-coverage-istanbul-reporter": "^2.0.5", diff --git a/yarn.lock b/yarn.lock index 65319258424..1df5cd37581 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1093,6 +1093,11 @@ "@babel/helper-validator-identifier" "^7.22.20" to-fast-properties "^2.0.0" +"@colors/colors@1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" + integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== + "@emotion/cache@^10.0.27", "@emotion/cache@^10.0.9": version "10.0.29" resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-10.0.29.tgz#87e7e64f412c060102d589fe7c6dc042e6f9d1e0" @@ -1449,6 +1454,11 @@ resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-2.1.1.tgz#ceff6a28a5b4867c2dd4a1ba513de278ccbe8bb1" integrity sha512-/aPsuoj/1Dw/kzhkgz+ES6TxG0zfTMGLwuK2ZG00k/iJzYHTLCE8mVU8EPqEOp/lmxPoq1C1C9RYToRKb2KEfg== +"@socket.io/component-emitter@~3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz#96116f2a912e0c02817345b3c10751069920d553" + integrity sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg== + "@tinymce/tinymce-react@^4.3.0": version "4.3.0" resolved "https://registry.yarnpkg.com/@tinymce/tinymce-react/-/tinymce-react-4.3.0.tgz#5e2f5a58526a1bba9710f54f5fcf16abd4c742a1" @@ -1571,6 +1581,18 @@ resolved "https://registry.yarnpkg.com/@types/arcgis-rest-api/-/arcgis-rest-api-10.4.5.tgz#35a1d6b1b39bb530b36799d679576cbc1f35cc2e" integrity sha512-MhpTj3aaURIFhK6pBRF50yCHW5TpbeuC1E81juovfNesSOshsQnCzludhpBhIr2pNzplTBlfzrT7RKiLZ5F3Tw== +"@types/cookie@^0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.4.1.tgz#bfd02c1f2224567676c1545199f87c3a861d878d" + integrity sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q== + +"@types/cors@^2.8.12": + version "2.8.17" + resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.17.tgz#5d718a5e494a8166f569d986794e49c48b216b2b" + integrity sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA== + dependencies: + "@types/node" "*" + "@types/create-react-class@^15.6.2": version "15.6.3" resolved "https://registry.yarnpkg.com/@types/create-react-class/-/create-react-class-15.6.3.tgz#d9a533441acd1532f2b97d55c24dfb87898d5cc2" @@ -1770,7 +1792,7 @@ "@types/node" "*" form-data "^3.0.0" -"@types/node@*", "@types/node@>=13.7.0", "@types/node@^18.15.11": +"@types/node@*", "@types/node@>=10.0.0", "@types/node@>=13.7.0", "@types/node@^18.15.11": version "18.15.11" resolved "https://registry.yarnpkg.com/@types/node/-/node-18.15.11.tgz#b3b790f09cb1696cffcec605de025b088fa4225f" integrity sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q== @@ -2420,11 +2442,6 @@ adjust-sourcemap-loader@3.0.0: loader-utils "^2.0.0" regex-parser "^2.2.11" -after@0.8.2: - version "0.8.2" - resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f" - integrity sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8= - agent-base@5: version "5.1.1" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-5.1.1.tgz#e8fb3f242959db44d63be665db7a8e739537a32c" @@ -2737,11 +2754,6 @@ array.prototype.flatmap@^1.2.5: define-properties "^1.1.3" es-abstract "^1.19.0" -arraybuffer.slice@~0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz#3bbc4275dd584cc1b10809b89d4e8b63a69e7675" - integrity sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog== - arrify@^1.0.0, arrify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" @@ -3078,11 +3090,6 @@ bach@^1.0.0: async-settle "^1.0.0" now-and-later "^2.0.0" -backo2@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" - integrity sha1-MasayLEpNjRj41s+u2n038+6eUc= - balanced-match@^0.4.2: version "0.4.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" @@ -3100,7 +3107,7 @@ base-x@^3.0.5: dependencies: safe-buffer "^5.0.1" -base64-arraybuffer@0.1.5, base64-arraybuffer@^0.1.5: +base64-arraybuffer@^0.1.5: version "0.1.5" resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad666aa5cd4bf9c6e9ce8" integrity sha1-c5JncZI7Whl0etZmqlzUv5xunOg= @@ -3110,10 +3117,10 @@ base64-js@^1.0.2: resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== -base64id@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/base64id/-/base64id-1.0.0.tgz#47688cb99bb6804f0e06d3e763b1c32e57d8e6b6" - integrity sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY= +base64id@2.0.0, base64id@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/base64id/-/base64id-2.0.0.tgz#2770ac6bc47d312af97a8bf9a634342e0cd25cb6" + integrity sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog== base@^0.11.1: version "0.11.2" @@ -3147,13 +3154,6 @@ bcrypt-pbkdf@^1.0.0: dependencies: tweetnacl "^0.14.3" -better-assert@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/better-assert/-/better-assert-1.0.2.tgz#40866b9e1b9e0b55b481894311e68faffaebc522" - integrity sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI= - dependencies: - callsite "1.0.0" - big.js@^3.1.3: version "3.2.0" resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e" @@ -3186,12 +3186,7 @@ bitmap-sdf@^1.0.3: resolved "https://registry.yarnpkg.com/bitmap-sdf/-/bitmap-sdf-1.0.4.tgz#e87b8b1d84ee846567cfbb29d60eedd34bca5b6f" integrity sha512-1G3U4n5JE6RAiALMxu0p1XmeZkTeCwGKykzsLTCqVzfSDaN6S7fKnkIkfejogz+iwqBWc0UYAIKnKHNN7pSfDg== -blob@0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.5.tgz#d680eeef25f8cd91ad533f5b01eed48e64caf683" - integrity sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig== - -bluebird@^3.3.0, bluebird@^3.5.0, bluebird@^3.5.5: +bluebird@^3.5.0, bluebird@^3.5.5: version "3.7.2" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== @@ -3206,7 +3201,7 @@ bn.js@^5.0.0, bn.js@^5.1.1: resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002" integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== -body-parser@1.19.1, body-parser@^1.15.0, body-parser@^1.16.1: +body-parser@1.19.1, body-parser@^1.15.0: version "1.19.1" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.1.tgz#1499abbaa9274af3ecc9f6f10396c995943e31d4" integrity sha512-8ljfQi5eBk8EJfECMrgqNGWPEY5jWP+1IzkzkGdFFEwFQZZyaZ21UqdaHktgiMlH0xLHqIFtE/u2OYE5dOtViA== @@ -3222,6 +3217,24 @@ body-parser@1.19.1, body-parser@^1.15.0, body-parser@^1.16.1: raw-body "2.4.2" type-is "~1.6.18" +body-parser@^1.19.0: + version "1.20.2" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.2.tgz#6feb0e21c4724d06de7ff38da36dad4f57a747fd" + integrity sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA== + dependencies: + bytes "3.1.2" + content-type "~1.0.5" + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" + iconv-lite "0.4.24" + on-finished "2.4.1" + qs "6.11.0" + raw-body "2.5.2" + type-is "~1.6.18" + unpipe "1.0.0" + bonjour@^3.5.0: version "3.5.0" resolved "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5" @@ -3373,29 +3386,11 @@ browserstack@~1.5.1: dependencies: https-proxy-agent "^2.2.1" -buffer-alloc-unsafe@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" - integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg== - -buffer-alloc@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" - integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow== - dependencies: - buffer-alloc-unsafe "^1.1.0" - buffer-fill "^1.0.0" - buffer-equal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-1.0.0.tgz#59616b498304d556abd466966b22eeda3eca5fbe" integrity sha1-WWFrSYME1Var1GaWayLu2j7KX74= -buffer-fill@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" - integrity sha1-+PeLdniYiO858gXNY39o5wISKyw= - buffer-from@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" @@ -3435,6 +3430,11 @@ bytes@3.1.1: resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.1.tgz#3f018291cb4cbad9accb6e6970bca9c8889e879a" integrity sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg== +bytes@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + cacache@^12.0.2: version "12.0.4" resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.4.tgz#668bcbd105aeb5f1d92fe25570ec9525c8faa40c" @@ -3503,11 +3503,6 @@ call-bind@^1.0.0, call-bind@^1.0.2, call-bind@~1.0.2: function-bind "^1.1.1" get-intrinsic "^1.0.2" -callsite@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20" - integrity sha1-KAOY5dZkvXQDi28JBRU+borxvCA= - callsites@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" @@ -3588,7 +3583,7 @@ chalk@^4.0.0, chalk@^4.1.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -"chokidar@>=3.0.0 <4.0.0", chokidar@^3.0.0, chokidar@^3.4.1, chokidar@^3.4.2: +"chokidar@>=3.0.0 <4.0.0", chokidar@^3.4.1, chokidar@^3.4.2: version "3.5.3" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== @@ -3622,6 +3617,21 @@ chokidar@^2.0.0, chokidar@^2.1.8: optionalDependencies: fsevents "^1.2.7" +chokidar@^3.5.1: + version "3.6.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" + integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + chownr@^1.1.1: version "1.1.4" resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" @@ -3715,6 +3725,15 @@ cliui@^6.0.0: strip-ansi "^6.0.0" wrap-ansi "^6.2.0" +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + clone-buffer@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58" @@ -3800,7 +3819,7 @@ color2k@^1.2.4: resolved "https://registry.yarnpkg.com/color2k/-/color2k-1.2.5.tgz#3d8f08d213170f781fb6270424454dd3c0197b02" integrity sha512-G39qNMGyM/fhl8hcy1YqpfXzQ810zSGyiJAgdMFlreCI7Hpwu3Jpu4tuBM/Oxu1Bek1FwyaBbtrtdkTr4HDhLA== -colors@1.4.0, colors@^1.1.0: +colors@1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== @@ -3842,26 +3861,11 @@ compare-versions@^3.4.0: resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-3.6.0.tgz#1a5689913685e5a87637b8d3ffca75514ec41d62" integrity sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA== -component-bind@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1" - integrity sha1-AMYIq33Nk4l8AAllGx06jh5zu9E= - -component-emitter@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" - integrity sha1-E3kY1teCg/ffemt8WmPhQOaUJeY= - component-emitter@^1.2.1: version "1.3.0" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== -component-inherit@0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143" - integrity sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM= - compose-function@3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/compose-function/-/compose-function-3.0.3.tgz#9ed675f13cc54501d30950a486ff6a7ba3ab185f" @@ -3918,7 +3922,7 @@ connect-history-api-fallback@^1.6.0: resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc" integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg== -connect@^3.6.0: +connect@^3.7.0: version "3.7.0" resolved "https://registry.yarnpkg.com/connect/-/connect-3.7.0.tgz#5d49348910caa5e07a01800b030d0c35f20484f8" integrity sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ== @@ -3955,6 +3959,11 @@ content-type@~1.0.4: resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== +content-type@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" + integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== + convert-source-map@1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" @@ -3984,16 +3993,16 @@ cookie-signature@1.0.6: resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= -cookie@0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" - integrity sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s= - cookie@0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1" integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA== +cookie@~0.4.1: + version "0.4.2" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" + integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== + copy-concurrently@^1.0.0: version "1.0.5" resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" @@ -4063,7 +4072,7 @@ core-util-is@~1.0.0: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== -cors@^2.7.1: +cors@^2.7.1, cors@~2.8.5: version "2.8.5" resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== @@ -4512,10 +4521,10 @@ data-urls@^3.0.0: whatwg-mimetype "^3.0.0" whatwg-url "^10.0.0" -date-format@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/date-format/-/date-format-2.1.0.tgz#31d5b5ea211cf5fd764cd38baf9d033df7e125cf" - integrity sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA== +date-format@^4.0.14: + version "4.0.14" + resolved "https://registry.yarnpkg.com/date-format/-/date-format-4.0.14.tgz#7a8e584434fb169a521c8b7aa481f355810d9400" + integrity sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg== dateformat@^3.0.3: version "3.0.3" @@ -4534,7 +4543,7 @@ debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8: dependencies: ms "2.0.0" -debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.4: +debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.4, debug@~4.3.1, debug@~4.3.2, debug@~4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -4548,13 +4557,6 @@ debug@^3.1.0, debug@^3.1.1, debug@^3.2.6: dependencies: ms "^2.1.1" -debug@~3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" - integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== - dependencies: - ms "2.0.0" - decache@^3.0.5: version "3.1.0" resolved "https://registry.yarnpkg.com/decache/-/decache-3.1.0.tgz#4f5036fbd6581fcc97237ac3954a244b9536c2da" @@ -4688,16 +4690,16 @@ delegate@^3.1.2: resolved "https://registry.yarnpkg.com/delegate/-/delegate-3.2.0.tgz#b66b71c3158522e8ab5744f720d8ca0c2af59166" integrity sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw== +depd@2.0.0, depd@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + depd@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= -depd@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" - integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== - des.js@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" @@ -4706,6 +4708,11 @@ des.js@^1.0.0: inherits "^2.0.1" minimalistic-assert "^1.0.0" +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + destroy@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" @@ -4808,10 +4815,10 @@ dom-helpers@^5.0.1: "@babel/runtime" "^7.8.7" csstype "^3.0.2" -dom-serialize@^2.2.0: +dom-serialize@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/dom-serialize/-/dom-serialize-2.2.1.tgz#562ae8999f44be5ea3076f5419dcd59eb43ac95b" - integrity sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs= + integrity sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ== dependencies: custom-event "~1.0.0" ent "~2.2.0" @@ -5006,45 +5013,26 @@ end-of-stream@^1.0.0, end-of-stream@^1.1.0: dependencies: once "^1.4.0" -engine.io-client@~3.2.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-3.2.1.tgz#6f54c0475de487158a1a7c77d10178708b6add36" - integrity sha512-y5AbkytWeM4jQr7m/koQLc5AxpRKC1hEVUb/s1FUAWEJq5AzJJ4NLvzuKPuxtDi5Mq755WuDvZ6Iv2rXj4PTzw== - dependencies: - component-emitter "1.2.1" - component-inherit "0.0.3" - debug "~3.1.0" - engine.io-parser "~2.1.1" - has-cors "1.1.0" - indexof "0.0.1" - parseqs "0.0.5" - parseuri "0.0.5" - ws "~3.3.1" - xmlhttprequest-ssl "~1.5.4" - yeast "0.1.2" - -engine.io-parser@~2.1.0, engine.io-parser@~2.1.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-2.1.3.tgz#757ab970fbf2dfb32c7b74b033216d5739ef79a6" - integrity sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA== - dependencies: - after "0.8.2" - arraybuffer.slice "~0.0.7" - base64-arraybuffer "0.1.5" - blob "0.0.5" - has-binary2 "~1.0.2" +engine.io-parser@~5.2.1: + version "5.2.2" + resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.2.2.tgz#37b48e2d23116919a3453738c5720455e64e1c49" + integrity sha512-RcyUFKA93/CXH20l4SoVvzZfrSDMOTUS3bWVpTt2FuFP+XYrL8i8oonHP7WInRyVHXh0n/ORtoeiE1os+8qkSw== -engine.io@~3.2.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-3.2.1.tgz#b60281c35484a70ee0351ea0ebff83ec8c9522a2" - integrity sha512-+VlKzHzMhaU+GsCIg4AoXF1UdDFjHHwMmMKqMJNDNLlUlejz58FCy4LBqB2YVJskHGYl06BatYWKP2TVdVXE5w== +engine.io@~6.5.2: + version "6.5.4" + resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-6.5.4.tgz#6822debf324e781add2254e912f8568508850cdc" + integrity sha512-KdVSDKhVKyOi+r5uEabrDLZw2qXStVvCsEB/LN3mw4WFi6Gx50jTyuxYVCwAAC0U46FdnzP/ScKRBTXb/NiEOg== dependencies: + "@types/cookie" "^0.4.1" + "@types/cors" "^2.8.12" + "@types/node" ">=10.0.0" accepts "~1.3.4" - base64id "1.0.0" - cookie "0.3.1" - debug "~3.1.0" - engine.io-parser "~2.1.0" - ws "~3.3.1" + base64id "2.0.0" + cookie "~0.4.1" + cors "~2.8.5" + debug "~4.3.1" + engine.io-parser "~5.2.1" + ws "~8.11.0" enhanced-resolve@^4.0.0, enhanced-resolve@^4.1.1, enhanced-resolve@^4.5.0: version "4.5.0" @@ -5836,16 +5824,16 @@ flatqueue@^1.2.1: resolved "https://registry.yarnpkg.com/flatqueue/-/flatqueue-1.2.1.tgz#82f501758fc5925742fbeb478637230456157ef2" integrity sha512-X86TpWS1rGuY7m382HuA9vngLeDuWA9lJvhEG+GfgKMV5onSvx5a71cl7GMbXzhWtlN9dGfqOBrpfqeOtUfGYQ== -flatted@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" - integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== - flatted@^3.1.0: version "3.2.4" resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.4.tgz#28d9969ea90661b5134259f312ab6aa7929ac5e2" integrity sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw== +flatted@^3.2.7: + version "3.3.1" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" + integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== + flexsearch@0.7.21: version "0.7.21" resolved "https://registry.yarnpkg.com/flexsearch/-/flexsearch-0.7.21.tgz#0f5ede3f2aae67ddc351efbe3b24b69d29e9d48b" @@ -5992,6 +5980,15 @@ fs-extra@^7.0.1: jsonfile "^4.0.0" universalify "^0.1.0" +fs-extra@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" + integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^4.0.0" + universalify "^0.1.0" + fs-extra@^9.0.0: version "9.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" @@ -6099,7 +6096,7 @@ get-caller-file@^1.0.1: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== -get-caller-file@^2.0.1: +get-caller-file@^2.0.1, get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== @@ -6202,7 +6199,7 @@ glob-watcher@^5.0.3: normalize-path "^3.0.0" object.defaults "^1.1.0" -glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: +glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.1.7: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== @@ -6328,6 +6325,11 @@ graceful-fs@^4.0.0, graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2 resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96" integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ== +graceful-fs@^4.2.6: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + grapheme-splitter@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" @@ -6419,18 +6421,6 @@ has-bigints@^1.0.1: resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== -has-binary2@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-binary2/-/has-binary2-1.0.3.tgz#7776ac627f3ea77250cfc332dab7ddf5e4f5d11d" - integrity sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw== - dependencies: - isarray "2.0.1" - -has-cors@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39" - integrity sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk= - has-flag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" @@ -6664,6 +6654,17 @@ http-errors@1.8.1: statuses ">= 1.5.0 < 2" toidentifier "1.0.1" +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" + http-errors@~1.6.2: version "1.6.3" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" @@ -6698,7 +6699,7 @@ http-proxy-middleware@0.19.1: lodash "^4.17.11" micromatch "^3.1.10" -http-proxy@^1.13.0, http-proxy@^1.17.0: +http-proxy@^1.17.0, http-proxy@^1.18.1: version "1.18.1" resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== @@ -7372,17 +7373,10 @@ isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= -isarray@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.1.tgz#a37d94ed9cda2d59865c9f76fe596ee1f338741e" - integrity sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4= - -isbinaryfile@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.3.tgz#5d6def3edebf6e8ca8cae9c30183a804b5f8be80" - integrity sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw== - dependencies: - buffer-alloc "^1.2.0" +isbinaryfile@^4.0.8: + version "4.0.10" + resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-4.0.10.tgz#0c5b5e30c2557a2f06febd37b7322946aaee42b3" + integrity sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw== isexe@^2.0.0: version "2.0.0" @@ -7792,37 +7786,35 @@ karma-spec-reporter@^0.0.36: dependencies: colors "1.4.0" -karma@^4.0.0: - version "4.4.1" - resolved "https://registry.yarnpkg.com/karma/-/karma-4.4.1.tgz#6d9aaab037a31136dc074002620ee11e8c2e32ab" - integrity sha512-L5SIaXEYqzrh6b1wqYC42tNsFMx2PWuxky84pK9coK09MvmL7mxii3G3bZBh/0rvD27lqDd0le9jyhzvwif73A== +karma@^6.4.3: + version "6.4.3" + resolved "https://registry.yarnpkg.com/karma/-/karma-6.4.3.tgz#763e500f99597218bbb536de1a14acc4ceea7ce8" + integrity sha512-LuucC/RE92tJ8mlCwqEoRWXP38UMAqpnq98vktmS9SznSoUPPUJQbc91dHcxcunROvfQjdORVA/YFviH+Xci9Q== dependencies: - bluebird "^3.3.0" - body-parser "^1.16.1" + "@colors/colors" "1.5.0" + body-parser "^1.19.0" braces "^3.0.2" - chokidar "^3.0.0" - colors "^1.1.0" - connect "^3.6.0" + chokidar "^3.5.1" + connect "^3.7.0" di "^0.0.1" - dom-serialize "^2.2.0" - flatted "^2.0.0" - glob "^7.1.1" - graceful-fs "^4.1.2" - http-proxy "^1.13.0" - isbinaryfile "^3.0.0" - lodash "^4.17.14" - log4js "^4.0.0" - mime "^2.3.1" - minimatch "^3.0.2" - optimist "^0.6.1" - qjobs "^1.1.4" - range-parser "^1.2.0" - rimraf "^2.6.0" - safe-buffer "^5.0.1" - socket.io "2.1.1" + dom-serialize "^2.2.1" + glob "^7.1.7" + graceful-fs "^4.2.6" + http-proxy "^1.18.1" + isbinaryfile "^4.0.8" + lodash "^4.17.21" + log4js "^6.4.1" + mime "^2.5.2" + minimatch "^3.0.4" + mkdirp "^0.5.5" + qjobs "^1.2.0" + range-parser "^1.2.1" + rimraf "^3.0.2" + socket.io "^4.7.2" source-map "^0.6.1" - tmp "0.0.33" - useragent "2.3.0" + tmp "^0.2.1" + ua-parser-js "^0.7.30" + yargs "^16.1.1" kdbush@^4.0.1: version "4.0.2" @@ -8098,16 +8090,16 @@ lodash@^4.0.1, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.1 resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== -log4js@^4.0.0: - version "4.5.1" - resolved "https://registry.yarnpkg.com/log4js/-/log4js-4.5.1.tgz#e543625e97d9e6f3e6e7c9fc196dd6ab2cae30b5" - integrity sha512-EEEgFcE9bLgaYUKuozyFfytQM2wDHtXn4tAN41pkaxpNjAykv11GVdeI4tHtmPWW4Xrgh9R/2d7XYghDVjbKKw== +log4js@^6.4.1: + version "6.9.1" + resolved "https://registry.yarnpkg.com/log4js/-/log4js-6.9.1.tgz#aba5a3ff4e7872ae34f8b4c533706753709e38b6" + integrity sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g== dependencies: - date-format "^2.0.0" - debug "^4.1.1" - flatted "^2.0.0" - rfdc "^1.1.4" - streamroller "^1.0.6" + date-format "^4.0.14" + debug "^4.3.4" + flatted "^3.2.7" + rfdc "^1.3.0" + streamroller "^3.1.5" loglevel@^1.6.8: version "1.8.0" @@ -8136,7 +8128,12 @@ lower-case@^1.1.1: resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" integrity sha1-miyr0bno4K6ZOkv31YdcOcQujqw= -lru-cache@4.1.x, lru-cache@^4.0.1: +lru-cache@^2.7.0: + version "2.7.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952" + integrity sha1-bUUk6LlV+V1PW1iFHOId1y+06VI= + +lru-cache@^4.0.1: version "4.1.5" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== @@ -8144,11 +8141,6 @@ lru-cache@4.1.x, lru-cache@^4.0.1: pseudomap "^1.0.2" yallist "^2.1.2" -lru-cache@^2.7.0: - version "2.7.3" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952" - integrity sha1-bUUk6LlV+V1PW1iFHOId1y+06VI= - lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" @@ -8405,7 +8397,7 @@ mime@1.6.0: resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== -mime@^2.0.3, mime@^2.3.1, mime@^2.4.4: +mime@^2.0.3, mime@^2.4.4, mime@^2.5.2: version "2.6.0" resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== @@ -8429,7 +8421,7 @@ minimalistic-crypto-utils@^1.0.1: resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= -minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4, minimatch@^3.1.1: +minimatch@^3.0.3, minimatch@^3.0.4, minimatch@^3.1.1: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== @@ -8446,11 +8438,6 @@ minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.8, minimist@~1.2.5: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== -minimist@~0.0.1: - version "0.0.10" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" - integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= - minipass-collect@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" @@ -8837,11 +8824,6 @@ object-assign@^4, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1 resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= -object-component@0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/object-component/-/object-component-0.0.3.tgz#f0c69aa50efc95b866c186f400a33769cb2f1291" - integrity sha1-8MaapQ78lbhmwYb0AKM3acsvEpE= - object-copy@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" @@ -8973,6 +8955,13 @@ obuf@^1.0.0, obuf@^1.1.2: resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + on-finished@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" @@ -8999,14 +8988,6 @@ opn@^5.5.0: dependencies: is-wsl "^1.1.0" -optimist@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" - integrity sha1-2j6nRob6IaGaERwybpDrFaAZZoY= - dependencies: - minimist "~0.0.1" - wordwrap "~0.0.2" - optionator@^0.8.1: version "0.8.3" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" @@ -9057,11 +9038,6 @@ os-locale@^1.4.0: dependencies: lcid "^1.0.0" -os-tmpdir@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= - p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" @@ -9236,20 +9212,6 @@ parsedbf@^1.1.0: iconv-lite "^0.4.15" text-encoding-polyfill "^0.6.7" -parseqs@0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.5.tgz#d5208a3738e46766e291ba2ea173684921a8b89d" - integrity sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0= - dependencies: - better-assert "~1.0.0" - -parseuri@0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.5.tgz#80204a50d4dbb779bfdc6ebe2778d90e4bce320a" - integrity sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo= - dependencies: - better-assert "~1.0.0" - parseurl@~1.3.2, parseurl@~1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" @@ -9822,11 +9784,18 @@ q@~1.5.0: resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= -qjobs@^1.1.4: +qjobs@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/qjobs/-/qjobs-1.2.0.tgz#c45e9c61800bd087ef88d7e256423bdd49e5d071" integrity sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg== +qs@6.11.0: + version "6.11.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" + integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== + dependencies: + side-channel "^1.0.4" + qs@6.9.6: version "6.9.6" resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.6.tgz#26ed3c8243a431b2924aca84cc90471f35d5a0ee" @@ -9895,7 +9864,7 @@ randomfill@^1.0.3: randombytes "^2.0.5" safe-buffer "^5.1.0" -range-parser@^1.2.0, range-parser@^1.2.1, range-parser@~1.2.1: +range-parser@^1.2.1, range-parser@~1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== @@ -9918,6 +9887,16 @@ raw-body@2.4.2: iconv-lite "0.4.24" unpipe "1.0.0" +raw-body@2.5.2: + version "2.5.2" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" + integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + raw-loader@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-1.0.0.tgz#3f9889e73dadbda9a424bce79809b4133ad46405" @@ -10604,12 +10583,12 @@ rework@1.0.1: convert-source-map "^0.3.3" css "^2.0.0" -rfdc@^1.1.4: - version "1.3.0" - resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" - integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== +rfdc@^1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.1.tgz#2b6d4df52dffe8bb346992a10ea9451f24373a8f" + integrity sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg== -rimraf@^2.5.4, rimraf@^2.6.0, rimraf@^2.6.3: +rimraf@^2.5.4, rimraf@^2.6.3: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== @@ -11029,51 +11008,34 @@ snapdragon@^0.8.1: source-map-resolve "^0.5.0" use "^3.1.0" -socket.io-adapter@~1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz#ab3f0d6f66b8fc7fca3959ab5991f82221789be9" - integrity sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g== - -socket.io-client@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-2.1.1.tgz#dcb38103436ab4578ddb026638ae2f21b623671f" - integrity sha512-jxnFyhAuFxYfjqIgduQlhzqTcOEQSn+OHKVfAxWaNWa7ecP7xSNk2Dx/3UEsDcY7NcFafxvNvKPmmO7HTwTxGQ== - dependencies: - backo2 "1.0.2" - base64-arraybuffer "0.1.5" - component-bind "1.0.0" - component-emitter "1.2.1" - debug "~3.1.0" - engine.io-client "~3.2.0" - has-binary2 "~1.0.2" - has-cors "1.1.0" - indexof "0.0.1" - object-component "0.0.3" - parseqs "0.0.5" - parseuri "0.0.5" - socket.io-parser "~3.2.0" - to-array "0.1.4" +socket.io-adapter@~2.5.2: + version "2.5.4" + resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-2.5.4.tgz#4fdb1358667f6d68f25343353bd99bd11ee41006" + integrity sha512-wDNHGXGewWAjQPt3pyeYBtpWSq9cLE5UW1ZUPL/2eGK9jtse/FpXib7epSTsz0Q0m+6sg6Y4KtcFTlah1bdOVg== + dependencies: + debug "~4.3.4" + ws "~8.11.0" -socket.io-parser@~3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-3.2.0.tgz#e7c6228b6aa1f814e6148aea325b51aa9499e077" - integrity sha512-FYiBx7rc/KORMJlgsXysflWx/RIvtqZbyGLlHZvjfmPTPeuD/I8MaW7cfFrj5tRltICJdgwflhfZ3NVVbVLFQA== +socket.io-parser@~4.2.4: + version "4.2.4" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.2.4.tgz#c806966cf7270601e47469ddeec30fbdfda44c83" + integrity sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew== dependencies: - component-emitter "1.2.1" - debug "~3.1.0" - isarray "2.0.1" + "@socket.io/component-emitter" "~3.1.0" + debug "~4.3.1" -socket.io@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-2.1.1.tgz#a069c5feabee3e6b214a75b40ce0652e1cfb9980" - integrity sha512-rORqq9c+7W0DAK3cleWNSyfv/qKXV99hV4tZe+gGLfBECw3XEhBy7x85F3wypA9688LKjtwO9pX9L33/xQI8yA== +socket.io@^4.7.2: + version "4.7.5" + resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-4.7.5.tgz#56eb2d976aef9d1445f373a62d781a41c7add8f8" + integrity sha512-DmeAkF6cwM9jSfmp6Dr/5/mfMwb5Z5qRrSXLpo3Fq5SqyU8CMF15jIN4ZhfSwu35ksM1qmHZDQ/DK5XTccSTvA== dependencies: - debug "~3.1.0" - engine.io "~3.2.0" - has-binary2 "~1.0.2" - socket.io-adapter "~1.1.0" - socket.io-client "2.1.1" - socket.io-parser "~3.2.0" + accepts "~1.3.4" + base64id "~2.0.0" + cors "~2.8.5" + debug "~4.3.2" + engine.io "~6.5.2" + socket.io-adapter "~2.5.2" + socket.io-parser "~4.2.4" sockjs-client@^1.5.0: version "1.5.2" @@ -11272,6 +11234,11 @@ static-extend@^0.1.1: define-property "^0.2.5" object-copy "^0.1.0" +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + "statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@~1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" @@ -11331,16 +11298,14 @@ stream-shift@^1.0.0: resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== -streamroller@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/streamroller/-/streamroller-1.0.6.tgz#8167d8496ed9f19f05ee4b158d9611321b8cacd9" - integrity sha512-3QC47Mhv3/aZNFpDDVO44qQb9gwB9QggMEE0sQmkTAwBVYdBRWISdsywlkfm5II1Q5y/pmrHflti/IgmIzdDBg== +streamroller@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/streamroller/-/streamroller-3.1.5.tgz#1263182329a45def1ffaef58d31b15d13d2ee7ff" + integrity sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw== dependencies: - async "^2.6.2" - date-format "^2.0.0" - debug "^3.2.6" - fs-extra "^7.0.1" - lodash "^4.17.14" + date-format "^4.0.14" + debug "^4.3.4" + fs-extra "^8.1.0" strict-uri-encode@^1.0.0: version "1.1.0" @@ -11843,12 +11808,10 @@ tinyqueue@^2.0.3: resolved "https://registry.yarnpkg.com/tinyqueue/-/tinyqueue-2.0.3.tgz#64d8492ebf39e7801d7bd34062e29b45b2035f08" integrity sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA== -tmp@0.0.33, tmp@0.0.x: - version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" - integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== - dependencies: - os-tmpdir "~1.0.2" +tmp@^0.2.1: + version "0.2.3" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.3.tgz#eb783cc22bc1e8bebd0671476d46ea4eb32a79ae" + integrity sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w== to-absolute-glob@^2.0.0: version "2.0.2" @@ -11858,11 +11821,6 @@ to-absolute-glob@^2.0.0: is-absolute "^1.0.0" is-negated-glob "^1.0.0" -to-array@0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890" - integrity sha1-F+bBH3PdTz10zaek/zI46a2b+JA= - to-arraybuffer@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" @@ -12106,6 +12064,11 @@ typescript@~5.2.0: resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.2.2.tgz#5ebb5e5a5b75f085f22bc3f8460fba308310fa78" integrity sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w== +ua-parser-js@^0.7.30: + version "0.7.37" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.37.tgz#e464e66dac2d33a7a1251d7d7a99d6157ec27832" + integrity sha512-xV8kqRKM+jhMvcHWUKthV9fNebIzrNy//2O9ZwWcfiBFR5f25XVZPLlEajk/sf3Ra15V92isyQqnIEXRDaZWEA== + uc.micro@^1.0.1, uc.micro@^1.0.5: version "1.0.6" resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac" @@ -12119,11 +12082,6 @@ uglify-js@3.4.x: commander "~2.19.0" source-map "~0.6.1" -ultron@~1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c" - integrity sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og== - unbox-primitive@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" @@ -12328,14 +12286,6 @@ use@^3.1.0: resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== -useragent@2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/useragent/-/useragent-2.3.0.tgz#217f943ad540cb2128658ab23fc960f6a88c9972" - integrity sha512-4AoH4pxuSvHCjqLO04sU6U/uE65BYza8l/KKBS0b0hnUPWi+cQ2BpeTEwejCSx9SPV5/U03nniDTrWx5NrmKdw== - dependencies: - lru-cache "4.1.x" - tmp "0.0.x" - util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" @@ -12803,11 +12753,6 @@ word-wrap@^1.2.3, word-wrap@~1.2.3: resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== -wordwrap@~0.0.2: - version "0.0.3" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" - integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc= - worker-farm@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" @@ -12849,6 +12794,15 @@ wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" @@ -12866,14 +12820,10 @@ ws@^8.0.0: resolved "https://registry.yarnpkg.com/ws/-/ws-8.4.0.tgz#f05e982a0a88c604080e8581576e2a063802bed6" integrity sha512-IHVsKe2pjajSUIl4KYMQOdlyliovpEPquKkqbwswulszzI7r0SfQrxnXdWAEqOlDCLrVSJzo+O1hAwdog2sKSQ== -ws@~3.3.1: - version "3.3.3" - resolved "https://registry.yarnpkg.com/ws/-/ws-3.3.3.tgz#f1cf84fe2d5e901ebce94efaece785f187a228f2" - integrity sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA== - dependencies: - async-limiter "~1.0.0" - safe-buffer "~5.1.0" - ultron "~1.1.0" +ws@~8.11.0: + version "8.11.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.11.0.tgz#6a0d36b8edfd9f96d8b25683db2f8d7de6e8e143" + integrity sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg== xml-name-validator@^3.0.0: version "3.0.0" @@ -12908,11 +12858,6 @@ xmldom@~0.1.19: resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.31.tgz#b76c9a1bd9f0a9737e5a72dc37231cf38375e2ff" integrity sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ== -xmlhttprequest-ssl@~1.5.4: - version "1.5.5" - resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz#c2876b06168aadc40e57d97e81191ac8f4398b3e" - integrity sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4= - xtend@^4.0.0, xtend@~4.0.0, xtend@~4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" @@ -12928,6 +12873,11 @@ y18n@^4.0.0: resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + yallist@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" @@ -12964,6 +12914,11 @@ yargs-parser@^18.1.2: camelcase "^5.0.0" decamelize "^1.2.0" +yargs-parser@^20.2.2: + version "20.2.9" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + yargs-parser@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.1.tgz#7ede329c1d8cdbbe209bd25cdb990e9b1ebbb394" @@ -13005,6 +12960,19 @@ yargs@^15.3.1: y18n "^4.0.0" yargs-parser "^18.1.2" +yargs@^16.1.1: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + yargs@^7.1.0: version "7.1.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.2.tgz#63a0a5d42143879fdbb30370741374e0641d55db" @@ -13024,11 +12992,6 @@ yargs@^7.1.0: y18n "^3.2.1" yargs-parser "^5.0.1" -yeast@0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419" - integrity sha1-AI4G2AlDIMNy28L47XagymyKxBk= - yn@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/yn/-/yn-2.0.0.tgz#e5adabc8acf408f6385fc76495684c88e6af689a" From fc23a57f02d8619be1484f467a519120b164c495 Mon Sep 17 00:00:00 2001 From: "Peter A. Jonsson" Date: Sun, 31 Mar 2024 12:32:23 +0200 Subject: [PATCH 630/654] Fix some unused variable warnings Put an underscore in front of the name to reduce the noise in the test output. --- lib/Models/Catalog/Gtfs/GtfsCatalogItem.ts | 2 +- lib/Models/Catalog/registerCatalogMembers.ts | 14 +++++++------- lib/Models/Cesium.ts | 2 +- lib/ReactViews/FeatureInfo/FeatureInfoPanel.tsx | 2 +- lib/ReactViews/Feedback/FeedbackForm.tsx | 2 +- .../Map/MapNavigation/Items/Compass/Compass.tsx | 8 ++++---- .../Workbench/Controls/GeneratedControlSection.tsx | 2 +- lib/ReactViews/Workbench/Controls/Legend.tsx | 2 +- .../Controls/SelectableDimensionSection.tsx | 2 +- .../Workflow/SelectableDimensionWorkflow.tsx | 2 +- lib/Table/TableAutomaticStylesStratum.ts | 2 +- test/Models/TerriaSpec.ts | 2 +- 12 files changed, 21 insertions(+), 21 deletions(-) diff --git a/lib/Models/Catalog/Gtfs/GtfsCatalogItem.ts b/lib/Models/Catalog/Gtfs/GtfsCatalogItem.ts index 348670009e2..0080c2683bd 100644 --- a/lib/Models/Catalog/Gtfs/GtfsCatalogItem.ts +++ b/lib/Models/Catalog/Gtfs/GtfsCatalogItem.ts @@ -377,7 +377,7 @@ export default class GtfsCatalogItem extends UrlMixin( } }); }) - .catch((e: Error) => { + .catch((_e: Error) => { throw new TerriaError({ title: `Could not load ${this.nameInCatalog}.`, sender: this, diff --git a/lib/Models/Catalog/registerCatalogMembers.ts b/lib/Models/Catalog/registerCatalogMembers.ts index bf0040e7cfa..923d4f086ee 100644 --- a/lib/Models/Catalog/registerCatalogMembers.ts +++ b/lib/Models/Catalog/registerCatalogMembers.ts @@ -356,37 +356,37 @@ export default function registerCatalogMembers() { // These don't even try to match a URL, they're just total fallbacks. We really, really want something to work. UrlToCatalogMemberMapping.register( - (s) => true, + (_s) => true, WebMapServiceCatalogGroup.type, true ); UrlToCatalogMemberMapping.register( - (s) => true, + (_s) => true, WebFeatureServiceCatalogGroup.type, true ); UrlToCatalogMemberMapping.register( - (s) => true, + (_s) => true, ArcGisMapServerCatalogItem.type, true ); UrlToCatalogMemberMapping.register( - (s) => true, + (_s) => true, ArcGisMapServerCatalogGroup.type, true ); UrlToCatalogMemberMapping.register( - (s) => true, + (_s) => true, ArcGisFeatureServerCatalogItem.type, true ); UrlToCatalogMemberMapping.register( - (s) => true, + (_s) => true, ArcGisCatalogGroup.type, true ); UrlToCatalogMemberMapping.register( - (s) => true, + (_s) => true, ArcGisFeatureServerCatalogGroup.type, true ); diff --git a/lib/Models/Cesium.ts b/lib/Models/Cesium.ts index 12902c175da..d795f65c296 100644 --- a/lib/Models/Cesium.ts +++ b/lib/Models/Cesium.ts @@ -1562,7 +1562,7 @@ export default class Cesium extends GlobeOrMap { runInAction(() => { result.isLoading = false; result.features = allFeatures.reduce( - (resultFeaturesSoFar, imageryLayerFeatures, i) => { + (resultFeaturesSoFar, imageryLayerFeatures, _i) => { if (!isDefined(imageryLayerFeatures)) { return resultFeaturesSoFar; } diff --git a/lib/ReactViews/FeatureInfo/FeatureInfoPanel.tsx b/lib/ReactViews/FeatureInfo/FeatureInfoPanel.tsx index c2bc418f3fb..209fc355a06 100644 --- a/lib/ReactViews/FeatureInfo/FeatureInfoPanel.tsx +++ b/lib/ReactViews/FeatureInfo/FeatureInfoPanel.tsx @@ -115,7 +115,7 @@ class FeatureInfoPanel extends React.Component { catalogItems: MappableMixin.Instance[], featureMap: Map ) { - return catalogItems.map((catalogItem, i) => { + return catalogItems.map((catalogItem, _i) => { // From the pairs, select only those with this catalog item, and pull the features out of the pair objects. const features = (catalogItem.uniqueId diff --git a/lib/ReactViews/Feedback/FeedbackForm.tsx b/lib/ReactViews/Feedback/FeedbackForm.tsx index 92df385d21f..a2d05548c13 100644 --- a/lib/ReactViews/Feedback/FeedbackForm.tsx +++ b/lib/ReactViews/Feedback/FeedbackForm.tsx @@ -124,7 +124,7 @@ class FeedbackForm extends React.Component { } } - changeSendShareUrl(e: React.ChangeEvent) { + changeSendShareUrl(_e: React.ChangeEvent) { this.setState((prevState: IState) => ({ sendShareURL: !prevState.sendShareURL })); diff --git a/lib/ReactViews/Map/MapNavigation/Items/Compass/Compass.tsx b/lib/ReactViews/Map/MapNavigation/Items/Compass/Compass.tsx index a989f007286..7f8806d1100 100644 --- a/lib/ReactViews/Map/MapNavigation/Items/Compass/Compass.tsx +++ b/lib/ReactViews/Map/MapNavigation/Items/Compass/Compass.tsx @@ -254,7 +254,7 @@ class Compass extends React.PureComponent { } } - handleDoubleClick(e: any) { + handleDoubleClick(_e: any) { const scene = this.props.terria.cesium!.scene; const camera = scene.camera; @@ -541,7 +541,7 @@ function rotate( // viewModel.props.terria.cesium.notifyRepaintRequired(); }; - viewModel.rotateMouseUpFunction = function (e) { + viewModel.rotateMouseUpFunction = function (_e) { viewModel.isRotating = false; if (viewModel.rotateMouseMoveFunction) { document.removeEventListener( @@ -629,7 +629,7 @@ function orbit( viewModel.orbitIsLook = false; } - viewModel.orbitAnimationFrameFunction = function (e: any) { + viewModel.orbitAnimationFrameFunction = function (_e: any) { const timestamp = getTimestamp(); const deltaT = timestamp - viewModel.orbitLastTimestamp; const rate = ((viewModel.state.orbitCursorOpacity - 0.5) * 2.5) / 1000; @@ -692,7 +692,7 @@ function orbit( updateAngleAndOpacity(vector, compassRectangle.width); }; - viewModel.orbitMouseUpFunction = function (e: any) { + viewModel.orbitMouseUpFunction = function (_e: any) { // TODO: if mouse didn't move, reset view to looking down, north is up? viewModel.isOrbiting = false; diff --git a/lib/ReactViews/Workbench/Controls/GeneratedControlSection.tsx b/lib/ReactViews/Workbench/Controls/GeneratedControlSection.tsx index a688de78897..be8f906ea6e 100644 --- a/lib/ReactViews/Workbench/Controls/GeneratedControlSection.tsx +++ b/lib/ReactViews/Workbench/Controls/GeneratedControlSection.tsx @@ -25,7 +25,7 @@ const GeneratedControlSection: React.FC = ({ } return ( - {enabledDimensions.map((dim, i) => ( + {enabledDimensions.map((dim, _i) => ( , i: number) { + renderImageLegend(legend: Model, _i: number) { const isImage = checkMimeType(legend); // const insertDirectly = !!legend.safeSvgContent; // we only insert content we generated ourselves, not arbitrary SVG from init files. diff --git a/lib/ReactViews/Workbench/Controls/SelectableDimensionSection.tsx b/lib/ReactViews/Workbench/Controls/SelectableDimensionSection.tsx index 1351c544179..79e27f3b8e7 100644 --- a/lib/ReactViews/Workbench/Controls/SelectableDimensionSection.tsx +++ b/lib/ReactViews/Workbench/Controls/SelectableDimensionSection.tsx @@ -34,7 +34,7 @@ class SelectableDimensionSection extends React.Component { return ( - {selectableDimensions.map((dim, i) => ( + {selectableDimensions.map((dim, _i) => ( { {/* Render Panel for each top-level selectable dimension */} {terria.selectableDimensionWorkflow.selectableDimensions.map( - (groupDim, i) => { + (groupDim, _i) => { if (groupDim.disable) return null; const childDims = filterSelectableDimensions()( diff --git a/lib/Table/TableAutomaticStylesStratum.ts b/lib/Table/TableAutomaticStylesStratum.ts index 6c4705efe4e..2833b0a5298 100644 --- a/lib/Table/TableAutomaticStylesStratum.ts +++ b/lib/Table/TableAutomaticStylesStratum.ts @@ -178,7 +178,7 @@ export default class TableAutomaticStylesStratum extends LoadableStratum( column.type !== TableColumnType.enum ); - const columnStyles = this.catalogItem.tableColumns.map((column, i) => + const columnStyles = this.catalogItem.tableColumns.map((column, _i) => createStratumInstance(TableStyleTraits, { id: column.name, color: createStratumInstance(TableColorStyleTraits, { diff --git a/test/Models/TerriaSpec.ts b/test/Models/TerriaSpec.ts index 59696ebfe26..fd578780854 100644 --- a/test/Models/TerriaSpec.ts +++ b/test/Models/TerriaSpec.ts @@ -588,7 +588,7 @@ describe("Terria", function () { }); UrlToCatalogMemberMapping.register( - (s) => true, + (_s) => true, WebMapServiceCatalogItem.type, true ); From d71a7925f81733bbc8858539f8974d57ccf431b9 Mon Sep 17 00:00:00 2001 From: "Peter A. Jonsson" Date: Sun, 31 Mar 2024 12:34:36 +0200 Subject: [PATCH 631/654] CI: fix yarn warning The double dashes are not required according to yarn. --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2ad165cca4e..c666368a339 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -28,7 +28,7 @@ jobs: run: yarn prettier-check - name: Build TerriaJS tests - run: yarn gulp lint release -- --continue + run: yarn gulp lint release --continue env: NODE_OPTIONS: --max_old_space_size=4096 From e6f31221e8db62e5a0307721d5717c431140dafe Mon Sep 17 00:00:00 2001 From: "Peter A. Jonsson" Date: Sun, 31 Mar 2024 12:38:17 +0200 Subject: [PATCH 632/654] Remove unused import This fixes a warning in the tests. --- lib/Models/Catalog/registerCatalogMembers.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/Models/Catalog/registerCatalogMembers.ts b/lib/Models/Catalog/registerCatalogMembers.ts index bf0040e7cfa..fbd6e3c2250 100644 --- a/lib/Models/Catalog/registerCatalogMembers.ts +++ b/lib/Models/Catalog/registerCatalogMembers.ts @@ -1,4 +1,3 @@ -import { uniq } from "lodash-es"; import YDYRCatalogFunction from "./CatalogFunctions/YDYRCatalogFunction"; import YDYRCatalogFunctionJob from "./CatalogFunctions/YDYRCatalogFunctionJob"; import CatalogGroup from "./CatalogGroup"; From a0aa9833d800dad4558b8607bec0ac55d9957d15 Mon Sep 17 00:00:00 2001 From: Stephen Davies Date: Thu, 4 Apr 2024 13:51:31 +1100 Subject: [PATCH 633/654] Send a relative URL to cesium when no absolute URL can be constructed Fixes a crash on constructing Terria in nodejs when no absolute URL is passed to Terria --- CHANGES.md | 2 +- lib/Models/Terria.ts | 14 ++++++++------ 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 6216549bab8..1e72cb72cb5 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -4,6 +4,7 @@ - Upgraded to TerriajS Cesium 1.115.0 - Fix `PointStyleTraits.marker` bug where URLs were not being used. +- Fixed a bug with passing a relative baseUrl to Cesium >= 1.113.0 when `document.baseURI` is different to its `location`. - [The next improvement] #### 8.7.0 - 2024-03-22 @@ -11,7 +12,6 @@ - **Breaking changes:** - `generateCatalogIndex` now uses `commander` to parse arguments. Run `node ./build/generateCatalogIndex.js --help` for more information. - Fixed exception thrown from `objectArrayTrait` when a model has 0 strata and a `MergeStrategy` of `topStratum`. -- Fixed a bug with passing a relative baseUrl to Cesium 1.113.0. - Fix `generateCatalogIndex` after `searchProvider` changes - Fix bug with relative URLs being ignored in `generateCatalogIndex` - Fix bug with ArcGisMapServerImageryProvider not correctly identifying if the `tile` endpoint can be used diff --git a/lib/Models/Terria.ts b/lib/Models/Terria.ts index d1047c0ecec..ea1e1b2fdb5 100644 --- a/lib/Models/Terria.ts +++ b/lib/Models/Terria.ts @@ -694,10 +694,9 @@ export default class Terria { makeObservable(this); if (options.appBaseHref) { this.appBaseHref = ensureSuffix( - new URL( - options.appBaseHref, - typeof document !== "undefined" ? document.baseURI : undefined - ).href, + typeof document !== "undefined" + ? new URI(options.appBaseHref).absoluteTo(document.baseURI).toString() + : options.appBaseHref, "/" ); } @@ -706,12 +705,15 @@ export default class Terria { this.baseUrl = ensureSuffix(options.baseUrl, "/"); } - // Construct an absolute URL to send to Cesium, as otherwise it resolves relative + // Try to construct an absolute URL to send to Cesium, as otherwise it resolves relative // to document.location instead of the correct document.baseURI + // This URL can still be relative if Terria is running in an environment without `document` + // (e.g. Node.js) and no absolute URL is passed as an option for `appBaseHref`. In this case, + // send a relative URL to cesium const cesiumBaseUrlRelative = options.cesiumBaseUrl ?? `${this.baseUrl}build/Cesium/build/`; this.cesiumBaseUrl = ensureSuffix( - new URL(cesiumBaseUrlRelative, this.appBaseHref).href, + new URI(cesiumBaseUrlRelative).absoluteTo(this.appBaseHref).toString(), "/" ); // Casting to `any` as `setBaseUrl` method is not part of the Cesiums' type definitions From 0d46f43b7aa12bfe366e0d75cf1ba7eca7232b27 Mon Sep 17 00:00:00 2001 From: Stephen Davies Date: Thu, 4 Apr 2024 14:28:32 +1100 Subject: [PATCH 634/654] Update yarn lockfile --- yarn.lock | 62 +++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 42 insertions(+), 20 deletions(-) diff --git a/yarn.lock b/yarn.lock index 18f9e4201f3..1298b7d5a3e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -212,7 +212,7 @@ dependencies: "@babel/types" "^7.22.5" -"@babel/helper-skip-transparent-expression-wrappers@^7.22.5": +"@babel/helper-skip-transparent-expression-wrappers@^7.20.0", "@babel/helper-skip-transparent-expression-wrappers@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz#007f15240b5751c537c40e77abb4e89eeaaa8847" integrity sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q== @@ -316,6 +316,14 @@ "@babel/helper-split-export-declaration" "^7.22.6" "@babel/plugin-syntax-decorators" "^7.22.5" +"@babel/plugin-proposal-nullish-coalescing-operator@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz#fdd940a99a740e577d6c753ab6fbb43fdb9467e1" + integrity sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-proposal-object-rest-spread@^7.20.7": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz#aa662940ef425779c75534a5c41e9d936edc390a" @@ -327,6 +335,15 @@ "@babel/plugin-syntax-object-rest-spread" "^7.8.3" "@babel/plugin-transform-parameters" "^7.20.7" +"@babel/plugin-proposal-optional-chaining@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz#886f5c8978deb7d30f678b2e24346b287234d3ea" + integrity sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": version "7.21.0-placeholder-for-preset-env.2" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz#7844f9289546efa9febac2de4cfe358a050bd703" @@ -1544,10 +1561,10 @@ "@turf/helpers" "^6.5.0" "@turf/invariant" "^6.5.0" -"@tweenjs/tween.js@^21.0.0": - version "21.1.1" - resolved "https://registry.yarnpkg.com/@tweenjs/tween.js/-/tween.js-21.1.1.tgz#5ad68be730fc39ef9e08760842ed798ec2c9fc5d" - integrity sha512-O2GetAwEC/0MOiRb3lxCLIt/eeugoDPX0nu+1SFWLqGKf835ZdWsfM9RzDpjF+aKkpYMhvOnEhO+SxMnHHjpfw== +"@tweenjs/tween.js@^23.1.1": + version "23.1.1" + resolved "https://registry.yarnpkg.com/@tweenjs/tween.js/-/tween.js-23.1.1.tgz#0ae28ed9c635805557f78c2626464018d5f1b5e2" + integrity sha512-ZpboH7pCPPeyBWKf8c7TJswtCEQObFo3bOBYalm99NzZarATALYCo5OhbCa/n4RQyJyHfhkdx+hNrdL5ByFYDw== "@types/arcgis-rest-api@^10.4.5": version "10.4.5" @@ -2336,10 +2353,10 @@ resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== -"@zip.js/zip.js@2.4.x": - version "2.4.26" - resolved "https://registry.yarnpkg.com/@zip.js/zip.js/-/zip.js-2.4.26.tgz#b79bb2055dc6e185890ee01cdb710caba505d5b2" - integrity sha512-I9HBO3BHIxEMQmltmHM3iqUW6IHqi3gsL9wTSXvHTRpOrA6q2OxtR58EDSaOGjHhDVJ+wIOAxZyKq2x00AVmqw== +"@zip.js/zip.js@^2.7.34": + version "2.7.41" + resolved "https://registry.yarnpkg.com/@zip.js/zip.js/-/zip.js-2.7.41.tgz#582668dabe997c353b37f27edb95162f688d387a" + integrity sha512-EMxPWXlEqqvsK9jxPmNvEShrIXP2LYTdQnEfsBH6OQCnlZRVo/dJIgtzbKvtK9A8PBTDQdxwxulj+QKplmW2Xg== JSONStream@^1.0.0: version "1.3.5" @@ -3805,6 +3822,11 @@ commander@2.17.x: resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" integrity sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg== +"commander@^11.1.0 ": + version "11.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-11.1.0.tgz#62fdce76006a68e5c1ab3314dc92e800eb83d906" + integrity sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ== + commander@~2.19.0: version "2.19.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" @@ -11659,21 +11681,21 @@ temp-fs@^0.9.9: dependencies: rimraf "~2.5.2" -terriajs-cesium-widgets@4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/terriajs-cesium-widgets/-/terriajs-cesium-widgets-4.4.0.tgz#f7bb130494942b97d6fb61ba23823a5e0f7e1b29" - integrity sha512-IHXEue9jhF5beBMirzdZHw7WJfCuy/Tp8IDDkMhwhqX372P8kQu136W+bjR/vDPlx32RPo5EK/c1CpINW2r/9g== +terriajs-cesium-widgets@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/terriajs-cesium-widgets/-/terriajs-cesium-widgets-5.0.0.tgz#52a67cd33815ccc777acd35d66319b25ad82c425" + integrity sha512-v3zHp+tYvq7Siov/BDDhX/2caDKPdBayyA0YqnWIuBTRx5nLcm4Nh3AFs44v+ouprZ8MoMAc3Q+546A4bo9OiQ== dependencies: nosleep.js "^0.12.0" - terriajs-cesium "^6.2.0" + terriajs-cesium "^8.0.0" -terriajs-cesium@6.2.0, terriajs-cesium@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/terriajs-cesium/-/terriajs-cesium-6.2.0.tgz#5a3c12f7789736984dc1741d3d3a0f7767d3c394" - integrity sha512-L561XTvDusNWvqU6BaO8y1vbbdNN1DvwS2gJxOgkibMkzOlWxo0vLa/RtxJtprCi+QShT7MAB6QIsub/gCIxKw== +terriajs-cesium@8.0.0, terriajs-cesium@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/terriajs-cesium/-/terriajs-cesium-8.0.0.tgz#7f83b5fa12014c2803f8e2513be3f1779913dd99" + integrity sha512-YpNZh1fmBaRuyVQP1R6/0C5CfwwuVAGvJGgXSD1rSskjpynQ3MmRNi+YfqzsHxkkyUBEOtLFnzPxRYDAy/Id0w== dependencies: - "@tweenjs/tween.js" "^21.0.0" - "@zip.js/zip.js" "2.4.x" + "@tweenjs/tween.js" "^23.1.1" + "@zip.js/zip.js" "^2.7.34" autolinker "^4.0.0" bitmap-sdf "^1.0.3" dompurify "^3.0.2" From d953221a2518973dfe925a2759f41011a28156ad Mon Sep 17 00:00:00 2001 From: Reza Almanda Date: Thu, 14 Mar 2024 20:33:36 +0000 Subject: [PATCH 635/654] Translated using Weblate (Indonesian) for TerriaJSNext Currently translated at 35.9% (498 of 1386 strings) Translation: TerriaJS/TerriaJSNext Translate-URL: https://hosted.weblate.org/projects/terriajs/terriajsnext/id/ --- wwwroot/languages/id/translation.json | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/wwwroot/languages/id/translation.json b/wwwroot/languages/id/translation.json index 8bb27e497e4..350a2486504 100644 --- a/wwwroot/languages/id/translation.json +++ b/wwwroot/languages/id/translation.json @@ -206,6 +206,15 @@ }, "exploreMapDataButton": { "content": "##Jelaja peta\n\nJelajah katalog data yang tersedia dan tambahkan ke peta di sini. Anda dapat menambahkan beberapa kumpulan data sekaligus, dan Anda akan melihatnya tercantum di bawah di meja kerja." + }, + "mapNavigationSplitterIcon": { + "content": "## Bandingkan\n\nFitur yang hebat dari Terria adalah kemampuan untuk membandingkan dataset menggunakan tampilan layar terpisah. Untuk dataset dengan komponen deret waktu, seperti citra satelit, Anda dapat membandingkan tanggal mundur dan maju dalam waktu dengan mengeklik pemilih tanggal." + }, + "mapNavigationCompassOuterRing": { + "content": "## Melihat kontrol\n\nDi sini Anda dapat mengubah tampilan peta. Anda dapat mengubah orientasi tampilan dengan menggunakan cincin luar, dan Anda dapat memiringkan sudut kamera dengan menggunakan cincin dalam. Klik dua kali untuk mengatur ulang tampilan." + }, + "menuBarStoryButton": { + "content": "## Cerita\n\nCerita memungkinkan Anda menambahkan informasi kontekstual ke kumpulan data untuk menghidupkan narasi. Buat cerita data Anda sendiri menggunakan Editor Cerita, dan bagikan melalui panel 'Bagikan' setelah selesai." } }, "trainer": { @@ -305,14 +314,20 @@ "goleft": "Kiri", "goleftTitle": "Tampilkan di sisi kiri" }, - "toggleSplitterToolTitle": "Bandingkan" + "toggleSplitterToolTitle": "Bandingkan", + "errorTitle": "Gagal membandingkan item katalog.", + "duplicateModelErrorMessage": "Terjadi error saat memisahkan item katalog`\"{{name}}\"`. Item katalog ini mungkin tidak mendukung fungsionalitas \"bandingkan\"", + "modelNotFoundErrorMessage": "ID Model `\"{{id}}\"` tidak ditemukan", + "toggleSplitterTool": "Aktifkan perbandingan berdampingan antara dua set data yang berbeda", + "toggleSplitterToolDisabled": "Harap nonaktifkan fitur perbandingan berdampingan lainnya untuk mengaktifkan perbandingan standar" }, "location": { - "originError": "Browser Anda hanya dapat menyediakan lokasi Anda ketika menggunakan https. Anda mungkin dapat menggunakan {{secureUrl}} saja.", + "originError": "Browser Anda hanya dapat memberikan lokasi Anda saat menggunakan HTTPS. Anda mungkin dapat menggunakan {{secureUrl}} sebagai gantinya.", "location": "Lokasi", "myLocation": "Lokasi Saya", "browserCannotProvide": "Browser Anda tidak dapat menyediakan lokasi Anda.", - "errorGettingLocation": "Terjadi kesalahan mendapatkan lokasi" + "errorGettingLocation": "Terjadi kesalahan mendapatkan lokasi", + "centreMap": "Pusatkan peta di lokasi Anda saat ini" }, "itemSearchTool": { "backBtnText": "Cari lagi", @@ -774,6 +789,6 @@ "chrome": "Google Chrome", "firefox": "Mozilla Firefox", "edge": "Microsoft Edge", - "safari": "" + "safari": "Apple Safari" } } From 7695494e49a1500d4435a486921d5a630e6737e0 Mon Sep 17 00:00:00 2001 From: Hiroo Imaki Date: Thu, 21 Mar 2024 04:07:58 +0000 Subject: [PATCH 636/654] Translated using Weblate (Japanese) for TerriaJSNext Currently translated at 100.0% (1386 of 1386 strings) Translation: TerriaJS/TerriaJSNext Translate-URL: https://hosted.weblate.org/projects/terriajs/terriajsnext/ja/ --- wwwroot/languages/ja/translation.json | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/wwwroot/languages/ja/translation.json b/wwwroot/languages/ja/translation.json index 5f4d523077f..cfd7b386188 100644 --- a/wwwroot/languages/ja/translation.json +++ b/wwwroot/languages/ja/translation.json @@ -366,7 +366,7 @@ "viewMore": "より {{name}} 結果を表示", "viewLess": "{{name}} 少なく結果を表示", "search": "データカタログで '{{searchText}}' を検索", - "searchInDataCatalog": "データカタログで <1>「{{locationSearchText}}」 を検索", + "searchInDataCatalog": "データカタログで「{{locationSearchText}}」を検索", "data": "データ", "done": "終了", "resultsLabel": "検索結果" @@ -628,7 +628,7 @@ "auto": "ファイルタイプ", "shp": "Shapefile", "gltf": "glTF", - "carto": "Carto V1", + "carto": "CartoV1", "json": "Terriaカタログ", "gpx": "GPX", "czml": "CZML", @@ -716,7 +716,8 @@ "searchNoPlaceNames": "検索条件に合致する正式名称を持つ場所が見つかりませんでした。", "searchLocations": "場所", "searchAddresses": "住所", - "searchErrorOccurred": "検索中にエラーが発生しました。インターネット接続を確認するか後でやり直してください。" + "searchErrorOccurred": "検索中にエラーが発生しました。インターネット接続を確認するか後でやり直してください。", + "searchMinCharacters_0": "最低限 {{count}} 文字を入力してください" }, "chart": { "download": "ダウンロード", @@ -2221,5 +2222,14 @@ "colorAdd": "追加", "colorRemove": "削除", "invalid": "無効" + }, + "searchProvider": { + "models": { + "idForMatchingErrorTitle": "欠損属性", + "idForMatchingErrorMessage": "モデルオブジェクトは `id`, `localId`, または `name` 属性を持つ必要があります。", + "unsupportedTypeTitle": "不明タイプ", + "unsupportedTypeMessage": "不明モデルタイプ {{type}}は作成できません。" + }, + "noSearchProviders": "検索プロバイダが設定されていません" } } From 5b27cb24350e2cf138de6b6eb372fd8368ec7232 Mon Sep 17 00:00:00 2001 From: Lawrence Owen Date: Mon, 8 Apr 2024 14:36:08 +1000 Subject: [PATCH 637/654] Force updated teser-webpack-plugin to remove need for --legacl-ssl-provider with node18 --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 22bdbbabfb1..7ca4f2c4f6f 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,8 @@ "resolutions": { "colors": "1.4.0", "@types/node": "^18.15.11", - "@types/css-font-loading-module": "^0.0.9" + "@types/css-font-loading-module": "^0.0.9", + "terser-webpack-plugin": "^4.2.3" }, "dependencies": { "@babel/core": "^7.23.5", From 88e587c66e0d4021645e3bb4920378b68e377f53 Mon Sep 17 00:00:00 2001 From: Lawrence Owen Date: Mon, 8 Apr 2024 16:50:16 +1000 Subject: [PATCH 638/654] Fix type errors new in node18 Apply api changes from "commander" Ignore [css] prop for styled components, explicitly ignore other props on bare html elements --- .eslintrc | 3 +- CHANGES.md | 1 + buildprocess/generateCatalogIndex.ts | 5 +- doc/acknowledgements/attributions.md | 2426 +++++++++++++---- lib/ReactViews/Map/Panels/DropdownPanel.jsx | 1 + lib/ReactViews/Map/Panels/InnerPanel.jsx | 1 + .../Notification/NotificationWindow.jsx | 1 + 7 files changed, 1942 insertions(+), 496 deletions(-) diff --git a/.eslintrc b/.eslintrc index 6262e63b090..fba8a521806 100644 --- a/.eslintrc +++ b/.eslintrc @@ -106,7 +106,8 @@ "prefer-const": "error", /* See https://stackoverflow.com/questions/64646248/eslintrc-js-for-react-17-and-jsx-without-import-react/64646593#64646593 */ "react/jsx-uses-react": "off", - "react/react-in-jsx-scope": "off" + "react/react-in-jsx-scope": "off", + "react/no-unknown-property": ["error", { "ignore": ["css"] }] }, "overrides": [ { diff --git a/CHANGES.md b/CHANGES.md index 6216549bab8..db55864c342 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -4,6 +4,7 @@ - Upgraded to TerriajS Cesium 1.115.0 - Fix `PointStyleTraits.marker` bug where URLs were not being used. +- Fix node v18 compatibility by forcing `webpack-terser-plugin` version resolution and fixing new type errors - [The next improvement] #### 8.7.0 - 2024-03-22 diff --git a/buildprocess/generateCatalogIndex.ts b/buildprocess/generateCatalogIndex.ts index 1a0937405ec..688e5ef52b0 100644 --- a/buildprocess/generateCatalogIndex.ts +++ b/buildprocess/generateCatalogIndex.ts @@ -21,7 +21,7 @@ import registerSearchProviders from "../lib/Models/SearchProviders/registerSearc import Terria from "../lib/Models/Terria"; import CatalogMemberReferenceTraits from "../lib/Traits/TraitsClasses/CatalogMemberReferenceTraits"; import patchNetworkRequests from "./patchNetworkRequests"; -import { program } from "commander"; +import { Command } from "commander"; /** Add model to index */ function indexModel( @@ -374,6 +374,7 @@ export default async function generateCatalogIndex( } } +const program = new Command(); program .name("generateCatalogIndex") .description( @@ -416,7 +417,7 @@ Example usage 30000 ); -program.parse(); +program.parse(process.argv); const options = program.opts(); diff --git a/doc/acknowledgements/attributions.md b/doc/acknowledgements/attributions.md index 96e4dc2448b..152ab5cef9c 100644 --- a/doc/acknowledgements/attributions.md +++ b/doc/acknowledgements/attributions.md @@ -2,7 +2,7 @@ THE FOLLOWING SETS FORTH ATTRIBUTION NOTICES FOR THIRD PARTY SOFTWARE THAT MAY B ----- -The following software may be included in this product: @ampproject/remapping, @xtuc/long, long, spdx-correct, validate-npm-package-license. A copy of the source code may be downloaded from git+https://github.com/ampproject/remapping.git (@ampproject/remapping), https://github.com/dcodeIO/long.js.git (@xtuc/long), https://github.com/dcodeIO/long.js.git (long), https://github.com/jslicense/spdx-correct.js.git (spdx-correct), https://github.com/kemitchell/validate-npm-package-license.js.git (validate-npm-package-license). This software contains the following license and notice below: +The following software may be included in this product: @ampproject/remapping, @xtuc/long, ejs, long, spdx-correct, validate-npm-package-license. A copy of the source code may be downloaded from git+https://github.com/ampproject/remapping.git (@ampproject/remapping), https://github.com/dcodeIO/long.js.git (@xtuc/long), git://github.com/mde/ejs.git (ejs), https://github.com/dcodeIO/long.js.git (long), https://github.com/jslicense/spdx-correct.js.git (spdx-correct), https://github.com/kemitchell/validate-npm-package-license.js.git (validate-npm-package-license). This software contains the following license and notice below: Apache License Version 2.0, January 2004 @@ -208,7 +208,7 @@ Apache License ----- -The following software may be included in this product: @babel/code-frame, @babel/compat-data, @babel/core, @babel/eslint-parser, @babel/generator, @babel/helper-annotate-as-pure, @babel/helper-builder-binary-assignment-operator-visitor, @babel/helper-compilation-targets, @babel/helper-create-class-features-plugin, @babel/helper-create-regexp-features-plugin, @babel/helper-environment-visitor, @babel/helper-function-name, @babel/helper-hoist-variables, @babel/helper-member-expression-to-functions, @babel/helper-module-imports, @babel/helper-module-transforms, @babel/helper-optimise-call-expression, @babel/helper-plugin-utils, @babel/helper-remap-async-to-generator, @babel/helper-replace-supers, @babel/helper-simple-access, @babel/helper-skip-transparent-expression-wrappers, @babel/helper-split-export-declaration, @babel/helper-string-parser, @babel/helper-validator-identifier, @babel/helper-validator-option, @babel/helper-wrap-function, @babel/helpers, @babel/highlight, @babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression, @babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining, @babel/plugin-bugfix-v8-static-class-fields-redefine-readonly, @babel/plugin-proposal-class-properties, @babel/plugin-proposal-decorators, @babel/plugin-proposal-object-rest-spread, @babel/plugin-proposal-private-property-in-object, @babel/plugin-syntax-async-generators, @babel/plugin-syntax-class-properties, @babel/plugin-syntax-class-static-block, @babel/plugin-syntax-decorators, @babel/plugin-syntax-dynamic-import, @babel/plugin-syntax-export-namespace-from, @babel/plugin-syntax-import-assertions, @babel/plugin-syntax-import-attributes, @babel/plugin-syntax-import-meta, @babel/plugin-syntax-json-strings, @babel/plugin-syntax-jsx, @babel/plugin-syntax-logical-assignment-operators, @babel/plugin-syntax-nullish-coalescing-operator, @babel/plugin-syntax-numeric-separator, @babel/plugin-syntax-object-rest-spread, @babel/plugin-syntax-optional-catch-binding, @babel/plugin-syntax-optional-chaining, @babel/plugin-syntax-private-property-in-object, @babel/plugin-syntax-top-level-await, @babel/plugin-syntax-typescript, @babel/plugin-syntax-unicode-sets-regex, @babel/plugin-transform-arrow-functions, @babel/plugin-transform-async-generator-functions, @babel/plugin-transform-async-to-generator, @babel/plugin-transform-block-scoped-functions, @babel/plugin-transform-block-scoping, @babel/plugin-transform-class-properties, @babel/plugin-transform-class-static-block, @babel/plugin-transform-classes, @babel/plugin-transform-computed-properties, @babel/plugin-transform-destructuring, @babel/plugin-transform-dotall-regex, @babel/plugin-transform-duplicate-keys, @babel/plugin-transform-dynamic-import, @babel/plugin-transform-exponentiation-operator, @babel/plugin-transform-export-namespace-from, @babel/plugin-transform-for-of, @babel/plugin-transform-function-name, @babel/plugin-transform-json-strings, @babel/plugin-transform-literals, @babel/plugin-transform-logical-assignment-operators, @babel/plugin-transform-member-expression-literals, @babel/plugin-transform-modules-amd, @babel/plugin-transform-modules-commonjs, @babel/plugin-transform-modules-systemjs, @babel/plugin-transform-modules-umd, @babel/plugin-transform-named-capturing-groups-regex, @babel/plugin-transform-new-target, @babel/plugin-transform-nullish-coalescing-operator, @babel/plugin-transform-numeric-separator, @babel/plugin-transform-object-rest-spread, @babel/plugin-transform-object-super, @babel/plugin-transform-optional-catch-binding, @babel/plugin-transform-optional-chaining, @babel/plugin-transform-parameters, @babel/plugin-transform-private-methods, @babel/plugin-transform-private-property-in-object, @babel/plugin-transform-property-literals, @babel/plugin-transform-react-display-name, @babel/plugin-transform-react-jsx, @babel/plugin-transform-react-jsx-development, @babel/plugin-transform-react-pure-annotations, @babel/plugin-transform-regenerator, @babel/plugin-transform-reserved-words, @babel/plugin-transform-shorthand-properties, @babel/plugin-transform-spread, @babel/plugin-transform-sticky-regex, @babel/plugin-transform-template-literals, @babel/plugin-transform-typeof-symbol, @babel/plugin-transform-typescript, @babel/plugin-transform-unicode-escapes, @babel/plugin-transform-unicode-property-regex, @babel/plugin-transform-unicode-regex, @babel/plugin-transform-unicode-sets-regex, @babel/preset-env, @babel/preset-react, @babel/preset-typescript, @babel/runtime, @babel/template, @babel/traverse, @babel/types. A copy of the source code may be downloaded from https://github.com/babel/babel.git (@babel/code-frame), https://github.com/babel/babel.git (@babel/compat-data), https://github.com/babel/babel.git (@babel/core), https://github.com/babel/babel.git (@babel/eslint-parser), https://github.com/babel/babel.git (@babel/generator), https://github.com/babel/babel.git (@babel/helper-annotate-as-pure), https://github.com/babel/babel.git (@babel/helper-builder-binary-assignment-operator-visitor), https://github.com/babel/babel.git (@babel/helper-compilation-targets), https://github.com/babel/babel.git (@babel/helper-create-class-features-plugin), https://github.com/babel/babel.git (@babel/helper-create-regexp-features-plugin), https://github.com/babel/babel.git (@babel/helper-environment-visitor), https://github.com/babel/babel.git (@babel/helper-function-name), https://github.com/babel/babel.git (@babel/helper-hoist-variables), https://github.com/babel/babel.git (@babel/helper-member-expression-to-functions), https://github.com/babel/babel.git (@babel/helper-module-imports), https://github.com/babel/babel.git (@babel/helper-module-transforms), https://github.com/babel/babel.git (@babel/helper-optimise-call-expression), https://github.com/babel/babel.git (@babel/helper-plugin-utils), https://github.com/babel/babel.git (@babel/helper-remap-async-to-generator), https://github.com/babel/babel.git (@babel/helper-replace-supers), https://github.com/babel/babel.git (@babel/helper-simple-access), https://github.com/babel/babel.git (@babel/helper-skip-transparent-expression-wrappers), https://github.com/babel/babel.git (@babel/helper-split-export-declaration), https://github.com/babel/babel.git (@babel/helper-string-parser), https://github.com/babel/babel.git (@babel/helper-validator-identifier), https://github.com/babel/babel.git (@babel/helper-validator-option), https://github.com/babel/babel.git (@babel/helper-wrap-function), https://github.com/babel/babel.git (@babel/helpers), https://github.com/babel/babel.git (@babel/highlight), https://github.com/babel/babel.git (@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression), https://github.com/babel/babel.git (@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining), https://github.com/babel/babel.git (@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly), https://github.com/babel/babel.git (@babel/plugin-proposal-class-properties), https://github.com/babel/babel.git (@babel/plugin-proposal-decorators), https://github.com/babel/babel.git (@babel/plugin-proposal-object-rest-spread), https://github.com/babel/babel-plugin-proposal-private-property-in-object.git (@babel/plugin-proposal-private-property-in-object), https://github.com/babel/babel/tree/master/packages/babel-plugin-syntax-async-generators (@babel/plugin-syntax-async-generators), https://github.com/babel/babel.git (@babel/plugin-syntax-class-properties), https://github.com/babel/babel.git (@babel/plugin-syntax-class-static-block), https://github.com/babel/babel.git (@babel/plugin-syntax-decorators), https://github.com/babel/babel/tree/master/packages/babel-plugin-syntax-dynamic-import (@babel/plugin-syntax-dynamic-import), https://github.com/babel/babel/tree/master/packages/babel-plugin-syntax-export-namespace-from (@babel/plugin-syntax-export-namespace-from), https://github.com/babel/babel.git (@babel/plugin-syntax-import-assertions), https://github.com/babel/babel.git (@babel/plugin-syntax-import-attributes), https://github.com/babel/babel.git (@babel/plugin-syntax-import-meta), https://github.com/babel/babel/tree/master/packages/babel-plugin-syntax-json-strings (@babel/plugin-syntax-json-strings), https://github.com/babel/babel.git (@babel/plugin-syntax-jsx), https://github.com/babel/babel.git (@babel/plugin-syntax-logical-assignment-operators), https://github.com/babel/babel/tree/master/packages/babel-plugin-syntax-nullish-coalescing-operator (@babel/plugin-syntax-nullish-coalescing-operator), https://github.com/babel/babel.git (@babel/plugin-syntax-numeric-separator), https://github.com/babel/babel/tree/master/packages/babel-plugin-syntax-object-rest-spread (@babel/plugin-syntax-object-rest-spread), https://github.com/babel/babel/tree/master/packages/babel-plugin-syntax-optional-catch-binding (@babel/plugin-syntax-optional-catch-binding), https://github.com/babel/babel/tree/master/packages/babel-plugin-syntax-optional-chaining (@babel/plugin-syntax-optional-chaining), https://github.com/babel/babel.git (@babel/plugin-syntax-private-property-in-object), https://github.com/babel/babel.git (@babel/plugin-syntax-top-level-await), https://github.com/babel/babel.git (@babel/plugin-syntax-typescript), https://github.com/babel/babel.git (@babel/plugin-syntax-unicode-sets-regex), https://github.com/babel/babel.git (@babel/plugin-transform-arrow-functions), https://github.com/babel/babel.git (@babel/plugin-transform-async-generator-functions), https://github.com/babel/babel.git (@babel/plugin-transform-async-to-generator), https://github.com/babel/babel.git (@babel/plugin-transform-block-scoped-functions), https://github.com/babel/babel.git (@babel/plugin-transform-block-scoping), https://github.com/babel/babel.git (@babel/plugin-transform-class-properties), https://github.com/babel/babel.git (@babel/plugin-transform-class-static-block), https://github.com/babel/babel.git (@babel/plugin-transform-classes), https://github.com/babel/babel.git (@babel/plugin-transform-computed-properties), https://github.com/babel/babel.git (@babel/plugin-transform-destructuring), https://github.com/babel/babel.git (@babel/plugin-transform-dotall-regex), https://github.com/babel/babel.git (@babel/plugin-transform-duplicate-keys), https://github.com/babel/babel.git (@babel/plugin-transform-dynamic-import), https://github.com/babel/babel.git (@babel/plugin-transform-exponentiation-operator), https://github.com/babel/babel.git (@babel/plugin-transform-export-namespace-from), https://github.com/babel/babel.git (@babel/plugin-transform-for-of), https://github.com/babel/babel.git (@babel/plugin-transform-function-name), https://github.com/babel/babel.git (@babel/plugin-transform-json-strings), https://github.com/babel/babel.git (@babel/plugin-transform-literals), https://github.com/babel/babel.git (@babel/plugin-transform-logical-assignment-operators), https://github.com/babel/babel.git (@babel/plugin-transform-member-expression-literals), https://github.com/babel/babel.git (@babel/plugin-transform-modules-amd), https://github.com/babel/babel.git (@babel/plugin-transform-modules-commonjs), https://github.com/babel/babel.git (@babel/plugin-transform-modules-systemjs), https://github.com/babel/babel.git (@babel/plugin-transform-modules-umd), https://github.com/babel/babel.git (@babel/plugin-transform-named-capturing-groups-regex), https://github.com/babel/babel.git (@babel/plugin-transform-new-target), https://github.com/babel/babel.git (@babel/plugin-transform-nullish-coalescing-operator), https://github.com/babel/babel.git (@babel/plugin-transform-numeric-separator), https://github.com/babel/babel.git (@babel/plugin-transform-object-rest-spread), https://github.com/babel/babel.git (@babel/plugin-transform-object-super), https://github.com/babel/babel.git (@babel/plugin-transform-optional-catch-binding), https://github.com/babel/babel.git (@babel/plugin-transform-optional-chaining), https://github.com/babel/babel.git (@babel/plugin-transform-parameters), https://github.com/babel/babel.git (@babel/plugin-transform-private-methods), https://github.com/babel/babel.git (@babel/plugin-transform-private-property-in-object), https://github.com/babel/babel.git (@babel/plugin-transform-property-literals), https://github.com/babel/babel.git (@babel/plugin-transform-react-display-name), https://github.com/babel/babel.git (@babel/plugin-transform-react-jsx), https://github.com/babel/babel.git (@babel/plugin-transform-react-jsx-development), https://github.com/babel/babel.git (@babel/plugin-transform-react-pure-annotations), https://github.com/babel/babel.git (@babel/plugin-transform-regenerator), https://github.com/babel/babel.git (@babel/plugin-transform-reserved-words), https://github.com/babel/babel.git (@babel/plugin-transform-shorthand-properties), https://github.com/babel/babel.git (@babel/plugin-transform-spread), https://github.com/babel/babel.git (@babel/plugin-transform-sticky-regex), https://github.com/babel/babel.git (@babel/plugin-transform-template-literals), https://github.com/babel/babel.git (@babel/plugin-transform-typeof-symbol), https://github.com/babel/babel.git (@babel/plugin-transform-typescript), https://github.com/babel/babel.git (@babel/plugin-transform-unicode-escapes), https://github.com/babel/babel.git (@babel/plugin-transform-unicode-property-regex), https://github.com/babel/babel.git (@babel/plugin-transform-unicode-regex), https://github.com/babel/babel.git (@babel/plugin-transform-unicode-sets-regex), https://github.com/babel/babel.git (@babel/preset-env), https://github.com/babel/babel.git (@babel/preset-react), https://github.com/babel/babel.git (@babel/preset-typescript), https://github.com/babel/babel.git (@babel/runtime), https://github.com/babel/babel.git (@babel/template), https://github.com/babel/babel.git (@babel/traverse), https://github.com/babel/babel.git (@babel/types). This software contains the following license and notice below: +The following software may be included in this product: @babel/code-frame, @babel/compat-data, @babel/core, @babel/eslint-parser, @babel/generator, @babel/helper-annotate-as-pure, @babel/helper-builder-binary-assignment-operator-visitor, @babel/helper-compilation-targets, @babel/helper-create-class-features-plugin, @babel/helper-create-regexp-features-plugin, @babel/helper-environment-visitor, @babel/helper-function-name, @babel/helper-hoist-variables, @babel/helper-member-expression-to-functions, @babel/helper-module-imports, @babel/helper-module-transforms, @babel/helper-optimise-call-expression, @babel/helper-plugin-utils, @babel/helper-remap-async-to-generator, @babel/helper-replace-supers, @babel/helper-simple-access, @babel/helper-skip-transparent-expression-wrappers, @babel/helper-split-export-declaration, @babel/helper-string-parser, @babel/helper-validator-identifier, @babel/helper-validator-option, @babel/helper-wrap-function, @babel/helpers, @babel/highlight, @babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression, @babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining, @babel/plugin-bugfix-v8-static-class-fields-redefine-readonly, @babel/plugin-proposal-class-properties, @babel/plugin-proposal-decorators, @babel/plugin-proposal-nullish-coalescing-operator, @babel/plugin-proposal-object-rest-spread, @babel/plugin-proposal-optional-chaining, @babel/plugin-proposal-private-property-in-object, @babel/plugin-syntax-async-generators, @babel/plugin-syntax-class-properties, @babel/plugin-syntax-class-static-block, @babel/plugin-syntax-decorators, @babel/plugin-syntax-dynamic-import, @babel/plugin-syntax-export-namespace-from, @babel/plugin-syntax-import-assertions, @babel/plugin-syntax-import-attributes, @babel/plugin-syntax-import-meta, @babel/plugin-syntax-json-strings, @babel/plugin-syntax-jsx, @babel/plugin-syntax-logical-assignment-operators, @babel/plugin-syntax-nullish-coalescing-operator, @babel/plugin-syntax-numeric-separator, @babel/plugin-syntax-object-rest-spread, @babel/plugin-syntax-optional-catch-binding, @babel/plugin-syntax-optional-chaining, @babel/plugin-syntax-private-property-in-object, @babel/plugin-syntax-top-level-await, @babel/plugin-syntax-typescript, @babel/plugin-syntax-unicode-sets-regex, @babel/plugin-transform-arrow-functions, @babel/plugin-transform-async-generator-functions, @babel/plugin-transform-async-to-generator, @babel/plugin-transform-block-scoped-functions, @babel/plugin-transform-block-scoping, @babel/plugin-transform-class-properties, @babel/plugin-transform-class-static-block, @babel/plugin-transform-classes, @babel/plugin-transform-computed-properties, @babel/plugin-transform-destructuring, @babel/plugin-transform-dotall-regex, @babel/plugin-transform-duplicate-keys, @babel/plugin-transform-dynamic-import, @babel/plugin-transform-exponentiation-operator, @babel/plugin-transform-export-namespace-from, @babel/plugin-transform-for-of, @babel/plugin-transform-function-name, @babel/plugin-transform-json-strings, @babel/plugin-transform-literals, @babel/plugin-transform-logical-assignment-operators, @babel/plugin-transform-member-expression-literals, @babel/plugin-transform-modules-amd, @babel/plugin-transform-modules-commonjs, @babel/plugin-transform-modules-systemjs, @babel/plugin-transform-modules-umd, @babel/plugin-transform-named-capturing-groups-regex, @babel/plugin-transform-new-target, @babel/plugin-transform-nullish-coalescing-operator, @babel/plugin-transform-numeric-separator, @babel/plugin-transform-object-rest-spread, @babel/plugin-transform-object-super, @babel/plugin-transform-optional-catch-binding, @babel/plugin-transform-optional-chaining, @babel/plugin-transform-parameters, @babel/plugin-transform-private-methods, @babel/plugin-transform-private-property-in-object, @babel/plugin-transform-property-literals, @babel/plugin-transform-react-display-name, @babel/plugin-transform-react-jsx, @babel/plugin-transform-react-jsx-development, @babel/plugin-transform-react-pure-annotations, @babel/plugin-transform-regenerator, @babel/plugin-transform-reserved-words, @babel/plugin-transform-shorthand-properties, @babel/plugin-transform-spread, @babel/plugin-transform-sticky-regex, @babel/plugin-transform-template-literals, @babel/plugin-transform-typeof-symbol, @babel/plugin-transform-typescript, @babel/plugin-transform-unicode-escapes, @babel/plugin-transform-unicode-property-regex, @babel/plugin-transform-unicode-regex, @babel/plugin-transform-unicode-sets-regex, @babel/preset-env, @babel/preset-react, @babel/preset-typescript, @babel/runtime, @babel/template, @babel/traverse, @babel/types. A copy of the source code may be downloaded from https://github.com/babel/babel.git (@babel/code-frame), https://github.com/babel/babel.git (@babel/compat-data), https://github.com/babel/babel.git (@babel/core), https://github.com/babel/babel.git (@babel/eslint-parser), https://github.com/babel/babel.git (@babel/generator), https://github.com/babel/babel.git (@babel/helper-annotate-as-pure), https://github.com/babel/babel.git (@babel/helper-builder-binary-assignment-operator-visitor), https://github.com/babel/babel.git (@babel/helper-compilation-targets), https://github.com/babel/babel.git (@babel/helper-create-class-features-plugin), https://github.com/babel/babel.git (@babel/helper-create-regexp-features-plugin), https://github.com/babel/babel.git (@babel/helper-environment-visitor), https://github.com/babel/babel.git (@babel/helper-function-name), https://github.com/babel/babel.git (@babel/helper-hoist-variables), https://github.com/babel/babel.git (@babel/helper-member-expression-to-functions), https://github.com/babel/babel.git (@babel/helper-module-imports), https://github.com/babel/babel.git (@babel/helper-module-transforms), https://github.com/babel/babel.git (@babel/helper-optimise-call-expression), https://github.com/babel/babel.git (@babel/helper-plugin-utils), https://github.com/babel/babel.git (@babel/helper-remap-async-to-generator), https://github.com/babel/babel.git (@babel/helper-replace-supers), https://github.com/babel/babel.git (@babel/helper-simple-access), https://github.com/babel/babel.git (@babel/helper-skip-transparent-expression-wrappers), https://github.com/babel/babel.git (@babel/helper-split-export-declaration), https://github.com/babel/babel.git (@babel/helper-string-parser), https://github.com/babel/babel.git (@babel/helper-validator-identifier), https://github.com/babel/babel.git (@babel/helper-validator-option), https://github.com/babel/babel.git (@babel/helper-wrap-function), https://github.com/babel/babel.git (@babel/helpers), https://github.com/babel/babel.git (@babel/highlight), https://github.com/babel/babel.git (@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression), https://github.com/babel/babel.git (@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining), https://github.com/babel/babel.git (@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly), https://github.com/babel/babel.git (@babel/plugin-proposal-class-properties), https://github.com/babel/babel.git (@babel/plugin-proposal-decorators), https://github.com/babel/babel.git (@babel/plugin-proposal-nullish-coalescing-operator), https://github.com/babel/babel.git (@babel/plugin-proposal-object-rest-spread), https://github.com/babel/babel.git (@babel/plugin-proposal-optional-chaining), https://github.com/babel/babel-plugin-proposal-private-property-in-object.git (@babel/plugin-proposal-private-property-in-object), https://github.com/babel/babel/tree/master/packages/babel-plugin-syntax-async-generators (@babel/plugin-syntax-async-generators), https://github.com/babel/babel.git (@babel/plugin-syntax-class-properties), https://github.com/babel/babel.git (@babel/plugin-syntax-class-static-block), https://github.com/babel/babel.git (@babel/plugin-syntax-decorators), https://github.com/babel/babel/tree/master/packages/babel-plugin-syntax-dynamic-import (@babel/plugin-syntax-dynamic-import), https://github.com/babel/babel/tree/master/packages/babel-plugin-syntax-export-namespace-from (@babel/plugin-syntax-export-namespace-from), https://github.com/babel/babel.git (@babel/plugin-syntax-import-assertions), https://github.com/babel/babel.git (@babel/plugin-syntax-import-attributes), https://github.com/babel/babel.git (@babel/plugin-syntax-import-meta), https://github.com/babel/babel/tree/master/packages/babel-plugin-syntax-json-strings (@babel/plugin-syntax-json-strings), https://github.com/babel/babel.git (@babel/plugin-syntax-jsx), https://github.com/babel/babel.git (@babel/plugin-syntax-logical-assignment-operators), https://github.com/babel/babel/tree/master/packages/babel-plugin-syntax-nullish-coalescing-operator (@babel/plugin-syntax-nullish-coalescing-operator), https://github.com/babel/babel.git (@babel/plugin-syntax-numeric-separator), https://github.com/babel/babel/tree/master/packages/babel-plugin-syntax-object-rest-spread (@babel/plugin-syntax-object-rest-spread), https://github.com/babel/babel/tree/master/packages/babel-plugin-syntax-optional-catch-binding (@babel/plugin-syntax-optional-catch-binding), https://github.com/babel/babel/tree/master/packages/babel-plugin-syntax-optional-chaining (@babel/plugin-syntax-optional-chaining), https://github.com/babel/babel.git (@babel/plugin-syntax-private-property-in-object), https://github.com/babel/babel.git (@babel/plugin-syntax-top-level-await), https://github.com/babel/babel.git (@babel/plugin-syntax-typescript), https://github.com/babel/babel.git (@babel/plugin-syntax-unicode-sets-regex), https://github.com/babel/babel.git (@babel/plugin-transform-arrow-functions), https://github.com/babel/babel.git (@babel/plugin-transform-async-generator-functions), https://github.com/babel/babel.git (@babel/plugin-transform-async-to-generator), https://github.com/babel/babel.git (@babel/plugin-transform-block-scoped-functions), https://github.com/babel/babel.git (@babel/plugin-transform-block-scoping), https://github.com/babel/babel.git (@babel/plugin-transform-class-properties), https://github.com/babel/babel.git (@babel/plugin-transform-class-static-block), https://github.com/babel/babel.git (@babel/plugin-transform-classes), https://github.com/babel/babel.git (@babel/plugin-transform-computed-properties), https://github.com/babel/babel.git (@babel/plugin-transform-destructuring), https://github.com/babel/babel.git (@babel/plugin-transform-dotall-regex), https://github.com/babel/babel.git (@babel/plugin-transform-duplicate-keys), https://github.com/babel/babel.git (@babel/plugin-transform-dynamic-import), https://github.com/babel/babel.git (@babel/plugin-transform-exponentiation-operator), https://github.com/babel/babel.git (@babel/plugin-transform-export-namespace-from), https://github.com/babel/babel.git (@babel/plugin-transform-for-of), https://github.com/babel/babel.git (@babel/plugin-transform-function-name), https://github.com/babel/babel.git (@babel/plugin-transform-json-strings), https://github.com/babel/babel.git (@babel/plugin-transform-literals), https://github.com/babel/babel.git (@babel/plugin-transform-logical-assignment-operators), https://github.com/babel/babel.git (@babel/plugin-transform-member-expression-literals), https://github.com/babel/babel.git (@babel/plugin-transform-modules-amd), https://github.com/babel/babel.git (@babel/plugin-transform-modules-commonjs), https://github.com/babel/babel.git (@babel/plugin-transform-modules-systemjs), https://github.com/babel/babel.git (@babel/plugin-transform-modules-umd), https://github.com/babel/babel.git (@babel/plugin-transform-named-capturing-groups-regex), https://github.com/babel/babel.git (@babel/plugin-transform-new-target), https://github.com/babel/babel.git (@babel/plugin-transform-nullish-coalescing-operator), https://github.com/babel/babel.git (@babel/plugin-transform-numeric-separator), https://github.com/babel/babel.git (@babel/plugin-transform-object-rest-spread), https://github.com/babel/babel.git (@babel/plugin-transform-object-super), https://github.com/babel/babel.git (@babel/plugin-transform-optional-catch-binding), https://github.com/babel/babel.git (@babel/plugin-transform-optional-chaining), https://github.com/babel/babel.git (@babel/plugin-transform-parameters), https://github.com/babel/babel.git (@babel/plugin-transform-private-methods), https://github.com/babel/babel.git (@babel/plugin-transform-private-property-in-object), https://github.com/babel/babel.git (@babel/plugin-transform-property-literals), https://github.com/babel/babel.git (@babel/plugin-transform-react-display-name), https://github.com/babel/babel.git (@babel/plugin-transform-react-jsx), https://github.com/babel/babel.git (@babel/plugin-transform-react-jsx-development), https://github.com/babel/babel.git (@babel/plugin-transform-react-pure-annotations), https://github.com/babel/babel.git (@babel/plugin-transform-regenerator), https://github.com/babel/babel.git (@babel/plugin-transform-reserved-words), https://github.com/babel/babel.git (@babel/plugin-transform-shorthand-properties), https://github.com/babel/babel.git (@babel/plugin-transform-spread), https://github.com/babel/babel.git (@babel/plugin-transform-sticky-regex), https://github.com/babel/babel.git (@babel/plugin-transform-template-literals), https://github.com/babel/babel.git (@babel/plugin-transform-typeof-symbol), https://github.com/babel/babel.git (@babel/plugin-transform-typescript), https://github.com/babel/babel.git (@babel/plugin-transform-unicode-escapes), https://github.com/babel/babel.git (@babel/plugin-transform-unicode-property-regex), https://github.com/babel/babel.git (@babel/plugin-transform-unicode-regex), https://github.com/babel/babel.git (@babel/plugin-transform-unicode-sets-regex), https://github.com/babel/babel.git (@babel/preset-env), https://github.com/babel/babel.git (@babel/preset-react), https://github.com/babel/babel.git (@babel/preset-typescript), https://github.com/babel/babel.git (@babel/runtime), https://github.com/babel/babel.git (@babel/template), https://github.com/babel/babel.git (@babel/traverse), https://github.com/babel/babel.git (@babel/types). This software contains the following license and notice below: MIT License @@ -312,7 +312,7 @@ SOFTWARE. ----- -The following software may be included in this product: @emotion/cache, @emotion/core, @emotion/css, @emotion/hash, @emotion/is-prop-valid, @emotion/memoize, @emotion/serialize, @emotion/sheet, @emotion/stylis, @emotion/unitless, @emotion/utils, @emotion/weak-memoize, babel-plugin-emotion. A copy of the source code may be downloaded from https://github.com/emotion-js/emotion/tree/master/packages/cache (@emotion/cache), https://github.com/emotion-js/emotion/tree/master/packages/core (@emotion/core), https://github.com/emotion-js/emotion/tree/master/packages/css (@emotion/css), https://github.com/emotion-js/emotion/tree/master/packages/hash (@emotion/hash), https://github.com/emotion-js/emotion/tree/main/packages/is-prop-valid (@emotion/is-prop-valid), https://github.com/emotion-js/emotion/tree/main/packages/memoize (@emotion/memoize), https://github.com/emotion-js/emotion/tree/master/packages/serialize (@emotion/serialize), https://github.com/emotion-js/emotion/tree/master/packages/sheet (@emotion/sheet), https://github.com/emotion-js/emotion/tree/master/packages/stylis (@emotion/stylis), https://github.com/emotion-js/emotion/tree/master/packages/unitless (@emotion/unitless), https://github.com/emotion-js/emotion/tree/master/packages/serialize (@emotion/utils), https://github.com/emotion-js/emotion/tree/master/packages/weak-memoize (@emotion/weak-memoize), https://github.com/emotion-js/emotion/tree/master/packages/babel-plugin-emotion (babel-plugin-emotion). This software contains the following license and notice below: +The following software may be included in this product: @emotion/cache, @emotion/core, @emotion/css, @emotion/hash, @emotion/is-prop-valid, @emotion/memoize, @emotion/serialize, @emotion/sheet, @emotion/stylis, @emotion/unitless, @emotion/utils, @emotion/weak-memoize, babel-plugin-emotion. A copy of the source code may be downloaded from https://github.com/emotion-js/emotion/tree/master/packages/cache (@emotion/cache), https://github.com/emotion-js/emotion/tree/master/packages/core (@emotion/core), https://github.com/emotion-js/emotion/tree/master/packages/css (@emotion/css), https://github.com/emotion-js/emotion/tree/master/packages/hash (@emotion/hash), https://github.com/emotion-js/emotion/tree/main/packages/is-prop-valid (@emotion/is-prop-valid), https://github.com/emotion-js/emotion/tree/master/packages/memoize (@emotion/memoize), https://github.com/emotion-js/emotion/tree/master/packages/serialize (@emotion/serialize), https://github.com/emotion-js/emotion/tree/master/packages/sheet (@emotion/sheet), https://github.com/emotion-js/emotion/tree/master/packages/stylis (@emotion/stylis), https://github.com/emotion-js/emotion/tree/master/packages/unitless (@emotion/unitless), https://github.com/emotion-js/emotion/tree/master/packages/serialize (@emotion/utils), https://github.com/emotion-js/emotion/tree/master/packages/weak-memoize (@emotion/weak-memoize), https://github.com/emotion-js/emotion/tree/master/packages/babel-plugin-emotion (babel-plugin-emotion). This software contains the following license and notice below: MIT License @@ -694,7 +694,7 @@ SOFTWARE. ----- -The following software may be included in this product: @jridgewell/resolve-uri. A copy of the source code may be downloaded from https://github.com/jridgewell/resolve-uri. This software contains the following license and notice below: +The following software may be included in this product: @jridgewell/resolve-uri, @jridgewell/source-map. A copy of the source code may be downloaded from https://github.com/jridgewell/resolve-uri (@jridgewell/resolve-uri), https://github.com/jridgewell/source-map (@jridgewell/source-map). This software contains the following license and notice below: Copyright 2019 Justin Ridgewell @@ -1771,6 +1771,39 @@ POSSIBILITY OF SUCH DAMAGE. ----- +The following software may be included in this product: @zip.js/zip.js. A copy of the source code may be downloaded from git+https://github.com/gildas-lormeau/zip.js.git. This software contains the following license and notice below: + +BSD 3-Clause License + +Copyright (c) 2023, Gildas Lormeau + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +----- + The following software may be included in this product: abab. A copy of the source code may be downloaded from git+https://github.com/jsdom/abab.git. This software contains the following license and notice below: Copyright © 2019 W3C and Jeff Carpenter \ @@ -1817,9 +1850,11 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----- -The following software may be included in this product: acorn, acorn-walk. A copy of the source code may be downloaded from https://github.com/acornjs/acorn.git (acorn), https://github.com/acornjs/acorn.git (acorn-walk). This software contains the following license and notice below: +The following software may be included in this product: acorn. A copy of the source code may be downloaded from https://github.com/acornjs/acorn.git. This software contains the following license and notice below: -Copyright (C) 2012-2018 by various contributors (see AUTHORS) +MIT License + +Copyright (C) 2012-2022 by various contributors (see AUTHORS) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -1867,6 +1902,30 @@ THE SOFTWARE. ----- +The following software may be included in this product: acorn, acorn-walk. A copy of the source code may be downloaded from https://github.com/acornjs/acorn.git (acorn), https://github.com/acornjs/acorn.git (acorn-walk). This software contains the following license and notice below: + +Copyright (C) 2012-2018 by various contributors (see AUTHORS) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +----- + The following software may be included in this product: acorn. A copy of the source code may be downloaded from https://github.com/acornjs/acorn.git. This software contains the following license and notice below: MIT License @@ -1967,7 +2026,7 @@ SOFTWARE. ----- -The following software may be included in this product: aggregate-error, ansi-regex, ansi-styles, array-union, binary-extensions, callsites, camelcase, chalk, clean-stack, del, execa, find-up, get-stream, globals, globby, has-flag, import-local, indent-string, internal-ip, is-absolute-url, is-finite, is-fullwidth-code-point, is-path-cwd, is-path-in-cwd, is-path-inside, is-wsl, locate-path, make-dir, multimatch, opn, p-limit, p-locate, p-map, p-retry, p-try, parent-module, path-exists, path-key, path-type, pify, pkg-dir, resolve-from, shebang-regex, slash, string-width, strip-ansi, supports-color, wrap-ansi. A copy of the source code may be downloaded from https://github.com/sindresorhus/aggregate-error.git (aggregate-error), https://github.com/chalk/ansi-regex.git (ansi-regex), https://github.com/chalk/ansi-styles.git (ansi-styles), https://github.com/sindresorhus/array-union.git (array-union), https://github.com/sindresorhus/binary-extensions.git (binary-extensions), https://github.com/sindresorhus/callsites.git (callsites), https://github.com/sindresorhus/camelcase.git (camelcase), https://github.com/chalk/chalk.git (chalk), https://github.com/sindresorhus/clean-stack.git (clean-stack), https://github.com/sindresorhus/del.git (del), https://github.com/sindresorhus/execa.git (execa), https://github.com/sindresorhus/find-up.git (find-up), https://github.com/sindresorhus/get-stream.git (get-stream), https://github.com/sindresorhus/globals.git (globals), https://github.com/sindresorhus/globby.git (globby), https://github.com/sindresorhus/has-flag.git (has-flag), https://github.com/sindresorhus/import-local.git (import-local), https://github.com/sindresorhus/indent-string.git (indent-string), https://github.com/sindresorhus/internal-ip.git (internal-ip), https://github.com/sindresorhus/is-absolute-url.git (is-absolute-url), https://github.com/sindresorhus/is-finite.git (is-finite), https://github.com/sindresorhus/is-fullwidth-code-point.git (is-fullwidth-code-point), https://github.com/sindresorhus/is-path-cwd.git (is-path-cwd), https://github.com/sindresorhus/is-path-in-cwd.git (is-path-in-cwd), https://github.com/sindresorhus/is-path-inside.git (is-path-inside), https://github.com/sindresorhus/is-wsl.git (is-wsl), https://github.com/sindresorhus/locate-path.git (locate-path), https://github.com/sindresorhus/make-dir.git (make-dir), https://github.com/sindresorhus/multimatch.git (multimatch), https://github.com/sindresorhus/opn.git (opn), https://github.com/sindresorhus/p-limit.git (p-limit), https://github.com/sindresorhus/p-locate.git (p-locate), https://github.com/sindresorhus/p-map.git (p-map), https://github.com/sindresorhus/p-retry.git (p-retry), https://github.com/sindresorhus/p-try.git (p-try), https://github.com/sindresorhus/parent-module.git (parent-module), https://github.com/sindresorhus/path-exists.git (path-exists), https://github.com/sindresorhus/path-key.git (path-key), https://github.com/sindresorhus/path-type.git (path-type), https://github.com/sindresorhus/pify.git (pify), https://github.com/sindresorhus/pkg-dir.git (pkg-dir), https://github.com/sindresorhus/resolve-from.git (resolve-from), https://github.com/sindresorhus/shebang-regex.git (shebang-regex), https://github.com/sindresorhus/slash.git (slash), https://github.com/sindresorhus/string-width.git (string-width), https://github.com/chalk/strip-ansi.git (strip-ansi), https://github.com/chalk/supports-color.git (supports-color), https://github.com/chalk/wrap-ansi.git (wrap-ansi). This software contains the following license and notice below: +The following software may be included in this product: aggregate-error, ansi-regex, ansi-styles, array-union, binary-extensions, callsites, camelcase, chalk, clean-stack, del, execa, find-up, get-stream, globals, globby, has-flag, import-local, indent-string, internal-ip, invert-kv, is-absolute-url, is-finite, is-fullwidth-code-point, is-path-cwd, is-path-in-cwd, is-path-inside, is-wsl, lcid, locate-path, make-dir, mem, mimic-fn, multimatch, opn, os-locale, p-is-promise, p-limit, p-locate, p-map, p-retry, p-try, parent-module, path-exists, path-key, path-type, pify, pkg-dir, resolve-from, shebang-regex, slash, string-width, strip-ansi, supports-color, wrap-ansi. A copy of the source code may be downloaded from https://github.com/sindresorhus/aggregate-error.git (aggregate-error), https://github.com/chalk/ansi-regex.git (ansi-regex), https://github.com/chalk/ansi-styles.git (ansi-styles), https://github.com/sindresorhus/array-union.git (array-union), https://github.com/sindresorhus/binary-extensions.git (binary-extensions), https://github.com/sindresorhus/callsites.git (callsites), https://github.com/sindresorhus/camelcase.git (camelcase), https://github.com/chalk/chalk.git (chalk), https://github.com/sindresorhus/clean-stack.git (clean-stack), https://github.com/sindresorhus/del.git (del), https://github.com/sindresorhus/execa.git (execa), https://github.com/sindresorhus/find-up.git (find-up), https://github.com/sindresorhus/get-stream.git (get-stream), https://github.com/sindresorhus/globals.git (globals), https://github.com/sindresorhus/globby.git (globby), https://github.com/sindresorhus/has-flag.git (has-flag), https://github.com/sindresorhus/import-local.git (import-local), https://github.com/sindresorhus/indent-string.git (indent-string), https://github.com/sindresorhus/internal-ip.git (internal-ip), https://github.com/sindresorhus/invert-kv.git (invert-kv), https://github.com/sindresorhus/is-absolute-url.git (is-absolute-url), https://github.com/sindresorhus/is-finite.git (is-finite), https://github.com/sindresorhus/is-fullwidth-code-point.git (is-fullwidth-code-point), https://github.com/sindresorhus/is-path-cwd.git (is-path-cwd), https://github.com/sindresorhus/is-path-in-cwd.git (is-path-in-cwd), https://github.com/sindresorhus/is-path-inside.git (is-path-inside), https://github.com/sindresorhus/is-wsl.git (is-wsl), https://github.com/sindresorhus/lcid.git (lcid), https://github.com/sindresorhus/locate-path.git (locate-path), https://github.com/sindresorhus/make-dir.git (make-dir), https://github.com/sindresorhus/mem.git (mem), https://github.com/sindresorhus/mimic-fn.git (mimic-fn), https://github.com/sindresorhus/multimatch.git (multimatch), https://github.com/sindresorhus/opn.git (opn), https://github.com/sindresorhus/os-locale.git (os-locale), https://github.com/sindresorhus/p-is-promise.git (p-is-promise), https://github.com/sindresorhus/p-limit.git (p-limit), https://github.com/sindresorhus/p-locate.git (p-locate), https://github.com/sindresorhus/p-map.git (p-map), https://github.com/sindresorhus/p-retry.git (p-retry), https://github.com/sindresorhus/p-try.git (p-try), https://github.com/sindresorhus/parent-module.git (parent-module), https://github.com/sindresorhus/path-exists.git (path-exists), https://github.com/sindresorhus/path-key.git (path-key), https://github.com/sindresorhus/path-type.git (path-type), https://github.com/sindresorhus/pify.git (pify), https://github.com/sindresorhus/pkg-dir.git (pkg-dir), https://github.com/sindresorhus/resolve-from.git (resolve-from), https://github.com/sindresorhus/shebang-regex.git (shebang-regex), https://github.com/sindresorhus/slash.git (slash), https://github.com/sindresorhus/string-width.git (string-width), https://github.com/chalk/strip-ansi.git (strip-ansi), https://github.com/chalk/supports-color.git (supports-color), https://github.com/chalk/wrap-ansi.git (wrap-ansi). This software contains the following license and notice below: MIT License @@ -2178,7 +2237,7 @@ The following software may be included in this product: ansi-colors. A copy of t The MIT License (MIT) -Copyright (c) 2015-2017, Brian Woodward. +Copyright (c) 2015-present, Brian Woodward. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -2204,7 +2263,7 @@ The following software may be included in this product: ansi-colors. A copy of t The MIT License (MIT) -Copyright (c) 2015-present, Brian Woodward. +Copyright (c) 2015-2017, Brian Woodward. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -2458,7 +2517,7 @@ Apache License ----- -The following software may be included in this product: ansi-regex, ansi-styles, array-differ, array-union, array-uniq, arrify, camelcase, chalk, code-point-at, decamelize, detect-indent, escape-string-regexp, find-up, fs-access, get-stream, globals, globby, has-ansi, has-flag, ip-regex, is-binary-path, is-fullwidth-code-point, is-plain-obj, is-stream, is-wsl, lcid, load-json-file, locate-path, npm-run-path, null-check, number-is-nan, object-assign, os-locale, os-tmpdir, p-finally, p-locate, p-try, parse-json, path-exists, path-is-absolute, path-key, path-type, pify, query-string, read-pkg, read-pkg-up, repeating, resolve-cwd, resolve-from, shebang-regex, string-width, strip-ansi, strip-bom, strip-eof, supports-color, trim-right, wrap-ansi, yn. A copy of the source code may be downloaded from https://github.com/chalk/ansi-regex.git (ansi-regex), https://github.com/chalk/ansi-styles.git (ansi-styles), https://github.com/sindresorhus/array-differ.git (array-differ), https://github.com/sindresorhus/array-union.git (array-union), https://github.com/sindresorhus/array-uniq.git (array-uniq), https://github.com/sindresorhus/arrify.git (arrify), https://github.com/sindresorhus/camelcase.git (camelcase), https://github.com/chalk/chalk.git (chalk), https://github.com/sindresorhus/code-point-at.git (code-point-at), https://github.com/sindresorhus/decamelize.git (decamelize), https://github.com/sindresorhus/detect-indent.git (detect-indent), https://github.com/sindresorhus/escape-string-regexp.git (escape-string-regexp), https://github.com/sindresorhus/find-up.git (find-up), https://github.com/sindresorhus/fs-access.git (fs-access), https://github.com/sindresorhus/get-stream.git (get-stream), https://github.com/sindresorhus/globals.git (globals), https://github.com/sindresorhus/globby.git (globby), https://github.com/sindresorhus/has-ansi.git (has-ansi), https://github.com/sindresorhus/has-flag.git (has-flag), https://github.com/sindresorhus/ip-regex.git (ip-regex), https://github.com/sindresorhus/is-binary-path.git (is-binary-path), https://github.com/sindresorhus/is-fullwidth-code-point.git (is-fullwidth-code-point), https://github.com/sindresorhus/is-plain-obj.git (is-plain-obj), https://github.com/sindresorhus/is-stream.git (is-stream), https://github.com/sindresorhus/is-wsl.git (is-wsl), https://github.com/sindresorhus/lcid.git (lcid), https://github.com/sindresorhus/load-json-file.git (load-json-file), https://github.com/sindresorhus/locate-path.git (locate-path), https://github.com/sindresorhus/npm-run-path.git (npm-run-path), https://github.com/sindresorhus/null-check.git (null-check), https://github.com/sindresorhus/number-is-nan.git (number-is-nan), https://github.com/sindresorhus/object-assign.git (object-assign), https://github.com/sindresorhus/os-locale.git (os-locale), https://github.com/sindresorhus/os-tmpdir.git (os-tmpdir), https://github.com/sindresorhus/p-finally.git (p-finally), https://github.com/sindresorhus/p-locate.git (p-locate), https://github.com/sindresorhus/p-try.git (p-try), https://github.com/sindresorhus/parse-json.git (parse-json), https://github.com/sindresorhus/path-exists.git (path-exists), https://github.com/sindresorhus/path-is-absolute.git (path-is-absolute), https://github.com/sindresorhus/path-key.git (path-key), https://github.com/sindresorhus/path-type.git (path-type), https://github.com/sindresorhus/pify.git (pify), https://github.com/sindresorhus/query-string.git (query-string), https://github.com/sindresorhus/read-pkg.git (read-pkg), https://github.com/sindresorhus/read-pkg-up.git (read-pkg-up), https://github.com/sindresorhus/repeating.git (repeating), https://github.com/sindresorhus/resolve-cwd.git (resolve-cwd), https://github.com/sindresorhus/resolve-from.git (resolve-from), https://github.com/sindresorhus/shebang-regex.git (shebang-regex), https://github.com/sindresorhus/string-width.git (string-width), https://github.com/chalk/strip-ansi.git (strip-ansi), https://github.com/sindresorhus/strip-bom.git (strip-bom), https://github.com/sindresorhus/strip-eof.git (strip-eof), https://github.com/chalk/supports-color.git (supports-color), https://github.com/sindresorhus/trim-right.git (trim-right), https://github.com/chalk/wrap-ansi.git (wrap-ansi), https://github.com/sindresorhus/yn.git (yn). This software contains the following license and notice below: +The following software may be included in this product: ansi-regex, ansi-styles, array-differ, array-union, array-uniq, arrify, camelcase, chalk, code-point-at, decamelize, detect-indent, escape-string-regexp, find-up, fs-access, get-stream, globals, globby, has-ansi, has-flag, ip-regex, is-binary-path, is-fullwidth-code-point, is-plain-obj, is-stream, is-wsl, lcid, load-json-file, locate-path, npm-run-path, null-check, number-is-nan, object-assign, os-locale, os-tmpdir, p-defer, p-finally, p-locate, p-try, parse-json, path-exists, path-is-absolute, path-key, path-type, pify, query-string, read-pkg, read-pkg-up, repeating, resolve-cwd, resolve-from, shebang-regex, string-width, strip-ansi, strip-bom, strip-eof, supports-color, trim-right, wrap-ansi, yn. A copy of the source code may be downloaded from https://github.com/chalk/ansi-regex.git (ansi-regex), https://github.com/chalk/ansi-styles.git (ansi-styles), https://github.com/sindresorhus/array-differ.git (array-differ), https://github.com/sindresorhus/array-union.git (array-union), https://github.com/sindresorhus/array-uniq.git (array-uniq), https://github.com/sindresorhus/arrify.git (arrify), https://github.com/sindresorhus/camelcase.git (camelcase), https://github.com/chalk/chalk.git (chalk), https://github.com/sindresorhus/code-point-at.git (code-point-at), https://github.com/sindresorhus/decamelize.git (decamelize), https://github.com/sindresorhus/detect-indent.git (detect-indent), https://github.com/sindresorhus/escape-string-regexp.git (escape-string-regexp), https://github.com/sindresorhus/find-up.git (find-up), https://github.com/sindresorhus/fs-access.git (fs-access), https://github.com/sindresorhus/get-stream.git (get-stream), https://github.com/sindresorhus/globals.git (globals), https://github.com/sindresorhus/globby.git (globby), https://github.com/sindresorhus/has-ansi.git (has-ansi), https://github.com/sindresorhus/has-flag.git (has-flag), https://github.com/sindresorhus/ip-regex.git (ip-regex), https://github.com/sindresorhus/is-binary-path.git (is-binary-path), https://github.com/sindresorhus/is-fullwidth-code-point.git (is-fullwidth-code-point), https://github.com/sindresorhus/is-plain-obj.git (is-plain-obj), https://github.com/sindresorhus/is-stream.git (is-stream), https://github.com/sindresorhus/is-wsl.git (is-wsl), https://github.com/sindresorhus/lcid.git (lcid), https://github.com/sindresorhus/load-json-file.git (load-json-file), https://github.com/sindresorhus/locate-path.git (locate-path), https://github.com/sindresorhus/npm-run-path.git (npm-run-path), https://github.com/sindresorhus/null-check.git (null-check), https://github.com/sindresorhus/number-is-nan.git (number-is-nan), https://github.com/sindresorhus/object-assign.git (object-assign), https://github.com/sindresorhus/os-locale.git (os-locale), https://github.com/sindresorhus/os-tmpdir.git (os-tmpdir), https://github.com/sindresorhus/p-defer.git (p-defer), https://github.com/sindresorhus/p-finally.git (p-finally), https://github.com/sindresorhus/p-locate.git (p-locate), https://github.com/sindresorhus/p-try.git (p-try), https://github.com/sindresorhus/parse-json.git (parse-json), https://github.com/sindresorhus/path-exists.git (path-exists), https://github.com/sindresorhus/path-is-absolute.git (path-is-absolute), https://github.com/sindresorhus/path-key.git (path-key), https://github.com/sindresorhus/path-type.git (path-type), https://github.com/sindresorhus/pify.git (pify), https://github.com/sindresorhus/query-string.git (query-string), https://github.com/sindresorhus/read-pkg.git (read-pkg), https://github.com/sindresorhus/read-pkg-up.git (read-pkg-up), https://github.com/sindresorhus/repeating.git (repeating), https://github.com/sindresorhus/resolve-cwd.git (resolve-cwd), https://github.com/sindresorhus/resolve-from.git (resolve-from), https://github.com/sindresorhus/shebang-regex.git (shebang-regex), https://github.com/sindresorhus/string-width.git (string-width), https://github.com/chalk/strip-ansi.git (strip-ansi), https://github.com/sindresorhus/strip-bom.git (strip-bom), https://github.com/sindresorhus/strip-eof.git (strip-eof), https://github.com/chalk/supports-color.git (supports-color), https://github.com/sindresorhus/trim-right.git (trim-right), https://github.com/chalk/wrap-ansi.git (wrap-ansi), https://github.com/sindresorhus/yn.git (yn). This software contains the following license and notice below: The MIT License (MIT) @@ -2514,7 +2573,7 @@ The following software may be included in this product: anymatch. A copy of the The ISC License -Copyright (c) 2014 Elan Shanker +Copyright (c) 2019 Elan Shanker, Paul Miller (https://paulmillr.com) Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above @@ -2534,7 +2593,7 @@ The following software may be included in this product: anymatch. A copy of the The ISC License -Copyright (c) 2019 Elan Shanker, Paul Miller (https://paulmillr.com) +Copyright (c) 2014 Elan Shanker Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above @@ -2602,24 +2661,6 @@ THE SOFTWARE. ----- -The following software may be included in this product: aproba. A copy of the source code may be downloaded from https://github.com/iarna/aproba. This software contains the following license and notice below: - -Copyright (c) 2015, Rebecca Turner - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - ------ - The following software may be included in this product: archy, buffer-equal, camelize, concat-map, defined, ent, is-typedarray, json-stable-stringify-without-jsonify, minimist, path-browserify, resumer, safe-regex, text-table, tty-browserify, wordwrap. A copy of the source code may be downloaded from http://github.com/substack/node-archy.git (archy), git://github.com/substack/node-buffer-equal.git (buffer-equal), git://github.com/substack/camelize.git (camelize), git://github.com/substack/node-concat-map.git (concat-map), git://github.com/substack/defined.git (defined), https://github.com/substack/node-ent.git (ent), git://github.com/hughsk/is-typedarray.git (is-typedarray), git://github.com/samn/json-stable-stringify.git (json-stable-stringify-without-jsonify), git://github.com/substack/minimist.git (minimist), git://github.com/substack/path-browserify.git (path-browserify), git://github.com/substack/resumer.git (resumer), git://github.com/substack/safe-regex.git (safe-regex), git://github.com/substack/text-table.git (text-table), git://github.com/substack/tty-browserify.git (tty-browserify), git://github.com/substack/node-wordwrap.git (wordwrap). This software contains the following license and notice below: This software is released under the MIT license: @@ -2825,7 +2866,7 @@ THE SOFTWARE. ----- -The following software may be included in this product: array-flatten, camel-case, lower-case, no-case, param-case, path-to-regexp, ts-node, upper-case. A copy of the source code may be downloaded from git://github.com/blakeembrey/array-flatten.git (array-flatten), git://github.com/blakeembrey/camel-case.git (camel-case), git://github.com/blakeembrey/lower-case.git (lower-case), git://github.com/blakeembrey/no-case.git (no-case), git://github.com/blakeembrey/param-case.git (param-case), https://github.com/component/path-to-regexp.git (path-to-regexp), git://github.com/TypeStrong/ts-node.git (ts-node), git://github.com/blakeembrey/upper-case.git (upper-case). This software contains the following license and notice below: +The following software may be included in this product: array-flatten, camel-case, lower-case, no-case, param-case, path-to-regexp, ts-node, upper-case. A copy of the source code may be downloaded from git://github.com/blakeembrey/array-flatten.git (array-flatten), git://github.com/blakeembrey/camel-case.git (camel-case), git://github.com/blakeembrey/lower-case.git (lower-case), git://github.com/blakeembrey/no-case.git (no-case), git://github.com/blakeembrey/param-case.git (param-case), https://github.com/pillarjs/path-to-regexp.git (path-to-regexp), git://github.com/TypeStrong/ts-node.git (ts-node), git://github.com/blakeembrey/upper-case.git (upper-case). This software contains the following license and notice below: The MIT License (MIT) @@ -3005,7 +3046,7 @@ SOFTWARE. ----- -The following software may be included in this product: assert, readable-stream, util. A copy of the source code may be downloaded from git://github.com/browserify/commonjs-assert.git (assert), git://github.com/nodejs/readable-stream (readable-stream), git://github.com/browserify/node-util (util). This software contains the following license and notice below: +The following software may be included in this product: assert, readable-stream, util. A copy of the source code may be downloaded from git://github.com/browserify/commonjs-assert.git (assert), git://github.com/nodejs/readable-stream (readable-stream), git://github.com/defunctzombie/node-util (util). This software contains the following license and notice below: Copyright Joyent, Inc. and other Node contributors. All rights reserved. Permission is hereby granted, free of charge, to any person obtaining a copy @@ -3856,6 +3897,32 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----- +The following software may be included in this product: babel-plugin-jsx-control-statements. A copy of the source code may be downloaded from https://github.com/AlexGilleran/jsx-control-statements. This software contains the following license and notice below: + +The MIT License (MIT) + +Copyright (c) 2015-2016 Alex Gilleran + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +----- + The following software may be included in this product: babel-plugin-lodash. A copy of the source code may be downloaded from https://github.com/lodash/babel-plugin-lodash.git. This software contains the following license and notice below: Copyright JS Foundation and other contributors @@ -4856,7 +4923,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----- -The following software may be included in this product: cacache, figgy-pudding, ssri. A copy of the source code may be downloaded from https://github.com/npm/cacache (cacache), https://github.com/npm/figgy-pudding (figgy-pudding), https://github.com/zkat/ssri (ssri). This software contains the following license and notice below: +The following software may be included in this product: cacache, ssri. A copy of the source code may be downloaded from https://github.com/npm/cacache (cacache), https://github.com/npm/ssri (ssri). This software contains the following license and notice below: ISC License @@ -5388,7 +5455,7 @@ THE SOFTWARE. ----- -The following software may be included in this product: chownr, color-support, fs-minipass, fs-write-stream-atomic, ini, isexe, json-stringify-safe, lru-cache, minimatch, minipass-collect, minipass-flush, minipass-pipeline, once, pseudomap, rimraf, semver, tar, which, wrappy, yallist. A copy of the source code may be downloaded from git://github.com/isaacs/chownr.git (chownr), git+https://github.com/isaacs/color-support.git (color-support), git+https://github.com/npm/fs-minipass.git (fs-minipass), https://github.com/npm/fs-write-stream-atomic (fs-write-stream-atomic), git://github.com/isaacs/ini.git (ini), git+https://github.com/isaacs/isexe.git (isexe), git://github.com/isaacs/json-stringify-safe (json-stringify-safe), git://github.com/isaacs/node-lru-cache.git (lru-cache), git://github.com/isaacs/minimatch.git (minimatch), git+https://github.com/isaacs/minipass-flush.git (minipass-flush), git://github.com/isaacs/once (once), git+https://github.com/isaacs/pseudomap.git (pseudomap), git://github.com/isaacs/rimraf.git (rimraf), https://github.com/npm/node-semver (semver), https://github.com/npm/node-tar.git (tar), git://github.com/isaacs/node-which.git (which), https://github.com/npm/wrappy (wrappy), git+https://github.com/isaacs/yallist.git (yallist). This software contains the following license and notice below: +The following software may be included in this product: chownr, color-support, fs-minipass, ini, isexe, json-stringify-safe, lru-cache, minimatch, minipass-collect, minipass-flush, minipass-pipeline, once, pseudomap, rimraf, semver, tar, which, wrappy, yallist. A copy of the source code may be downloaded from git://github.com/isaacs/chownr.git (chownr), git+https://github.com/isaacs/color-support.git (color-support), git+https://github.com/npm/fs-minipass.git (fs-minipass), git://github.com/isaacs/ini.git (ini), git+https://github.com/isaacs/isexe.git (isexe), git://github.com/isaacs/json-stringify-safe (json-stringify-safe), git://github.com/isaacs/node-lru-cache.git (lru-cache), git://github.com/isaacs/minimatch.git (minimatch), git+https://github.com/isaacs/minipass-flush.git (minipass-flush), git://github.com/isaacs/once (once), git+https://github.com/isaacs/pseudomap.git (pseudomap), git://github.com/isaacs/rimraf.git (rimraf), https://github.com/npm/node-semver.git (semver), https://github.com/npm/node-tar.git (tar), git://github.com/isaacs/node-which.git (which), https://github.com/npm/wrappy (wrappy), git+https://github.com/isaacs/yallist.git (yallist). This software contains the following license and notice below: The ISC License @@ -5631,7 +5698,7 @@ SOFTWARE. ----- -The following software may be included in this product: clone-stats, from2. A copy of the source code may be downloaded from git://github.com/hughsk/clone-stats (clone-stats), git://github.com/hughsk/from2 (from2). This software contains the following license and notice below: +The following software may be included in this product: clone-stats. A copy of the source code may be downloaded from git://github.com/hughsk/clone-stats. This software contains the following license and notice below: ## The MIT License (MIT) ## @@ -6175,24 +6242,6 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----- -The following software may be included in this product: copy-concurrently, move-concurrently, promise-inflight. A copy of the source code may be downloaded from git+https://github.com/npm/copy-concurrently.git (copy-concurrently), git+https://github.com/npm/move-concurrently.git (move-concurrently), git+https://github.com/iarna/promise-inflight.git (promise-inflight). This software contains the following license and notice below: - -Copyright (c) 2017, Rebecca Turner - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - ------ - The following software may be included in this product: copy-descriptor, expand-brackets, resolve-dir, to-absolute-glob. A copy of the source code may be downloaded from https://github.com/jonschlinkert/copy-descriptor.git (copy-descriptor), https://github.com/jonschlinkert/expand-brackets.git (expand-brackets), https://github.com/jonschlinkert/resolve-dir.git (resolve-dir), https://github.com/jonschlinkert/to-absolute-glob.git (to-absolute-glob). This software contains the following license and notice below: The MIT License (MIT) @@ -6835,32 +6884,6 @@ IN THE SOFTWARE. ----- -The following software may be included in this product: cyclist, flush-write-stream, multicast-dns, multicast-dns-service-types, stream-each. A copy of the source code may be downloaded from git://github.com/mafintosh/cyclist (cyclist), https://github.com/mafintosh/flush-write-stream.git (flush-write-stream), https://github.com/mafintosh/multicast-dns.git (multicast-dns), https://github.com/mafintosh/multicast-dns-service-types.git (multicast-dns-service-types), https://github.com/mafintosh/stream-each.git (stream-each). This software contains the following license and notice below: - -The MIT License (MIT) - -Copyright (c) 2015 Mathias Buus - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - ------ - The following software may be included in this product: d, es6-symbol. A copy of the source code may be downloaded from git://github.com/medikoo/d.git (d), git://github.com/medikoo/es6-symbol.git (es6-symbol). This software contains the following license and notice below: ISC License @@ -6881,9 +6904,9 @@ PERFORMANCE OF THIS SOFTWARE. ----- -The following software may be included in this product: d3-array. A copy of the source code may be downloaded from https://github.com/d3/d3-array.git. This software contains the following license and notice below: +The following software may be included in this product: d3-array, d3-axis, d3-color, d3-dispatch, d3-drag, d3-interpolate, d3-time, d3-timer, d3-zoom. A copy of the source code may be downloaded from https://github.com/d3/d3-array.git (d3-array), https://github.com/d3/d3-axis.git (d3-axis), https://github.com/d3/d3-color.git (d3-color), https://github.com/d3/d3-dispatch.git (d3-dispatch), https://github.com/d3/d3-drag.git (d3-drag), https://github.com/d3/d3-interpolate.git (d3-interpolate), https://github.com/d3/d3-time.git (d3-time), https://github.com/d3/d3-timer.git (d3-timer), https://github.com/d3/d3-zoom.git (d3-zoom). This software contains the following license and notice below: -Copyright 2010-2020 Mike Bostock +Copyright 2010-2016 Mike Bostock All rights reserved. Redistribution and use in source and binary forms, with or without modification, @@ -6913,9 +6936,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ----- -The following software may be included in this product: d3-array, d3-axis, d3-color, d3-dispatch, d3-drag, d3-interpolate, d3-time, d3-timer, d3-zoom. A copy of the source code may be downloaded from https://github.com/d3/d3-array.git (d3-array), https://github.com/d3/d3-axis.git (d3-axis), https://github.com/d3/d3-color.git (d3-color), https://github.com/d3/d3-dispatch.git (d3-dispatch), https://github.com/d3/d3-drag.git (d3-drag), https://github.com/d3/d3-interpolate.git (d3-interpolate), https://github.com/d3/d3-time.git (d3-time), https://github.com/d3/d3-timer.git (d3-timer), https://github.com/d3/d3-zoom.git (d3-zoom). This software contains the following license and notice below: +The following software may be included in this product: d3-array. A copy of the source code may be downloaded from https://github.com/d3/d3-array.git. This software contains the following license and notice below: -Copyright 2010-2016 Mike Bostock +Copyright 2010-2020 Mike Bostock All rights reserved. Redistribution and use in source and binary forms, with or without modification, @@ -7383,49 +7406,49 @@ SOFTWARE. ----- -The following software may be included in this product: debug. A copy of the source code may be downloaded from git://github.com/debug-js/debug.git. This software contains the following license and notice below: +The following software may be included in this product: debug. A copy of the source code may be downloaded from git://github.com/visionmedia/debug.git. This software contains the following license and notice below: (The MIT License) -Copyright (c) 2014-2017 TJ Holowaychuk -Copyright (c) 2018-2021 Josh Junon +Copyright (c) 2014 TJ Holowaychuk -Permission is hereby granted, free of charge, to any person obtaining a copy of this software -and associated documentation files (the 'Software'), to deal in the Software without restriction, -including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, +Permission is hereby granted, free of charge, to any person obtaining a copy of this software +and associated documentation files (the 'Software'), to deal in the Software without restriction, +including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all copies or substantial +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT -LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT +LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----- -The following software may be included in this product: debug. A copy of the source code may be downloaded from git://github.com/visionmedia/debug.git. This software contains the following license and notice below: +The following software may be included in this product: debug. A copy of the source code may be downloaded from git://github.com/debug-js/debug.git. This software contains the following license and notice below: (The MIT License) -Copyright (c) 2014 TJ Holowaychuk +Copyright (c) 2014-2017 TJ Holowaychuk +Copyright (c) 2018-2021 Josh Junon -Permission is hereby granted, free of charge, to any person obtaining a copy of this software -and associated documentation files (the 'Software'), to deal in the Software without restriction, -including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, +Permission is hereby granted, free of charge, to any person obtaining a copy of this software +and associated documentation files (the 'Software'), to deal in the Software without restriction, +including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all copies or substantial +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT -LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT +LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----- @@ -7509,32 +7532,6 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----- -The following software may be included in this product: deepmerge. A copy of the source code may be downloaded from git://github.com/KyleAMathews/deepmerge.git. This software contains the following license and notice below: - -The MIT License (MIT) - -Copyright (c) 2012 Nicholas Fisher - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - ------ - The following software may be included in this product: deepmerge. A copy of the source code may be downloaded from git://github.com/TehShrike/deepmerge.git. This software contains the following license and notice below: The MIT License (MIT) @@ -7561,38 +7558,64 @@ THE SOFTWARE. ----- -The following software may be included in this product: default-gateway. A copy of the source code may be downloaded from https://github.com/silverwind/default-gateway.git. This software contains the following license and notice below: - -Copyright (c) silverwind -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - ------ - -The following software may be included in this product: default-require-extensions. A copy of the source code may be downloaded from https://github.com/avajs/default-require-extensions.git. This software contains the following license and notice below: +The following software may be included in this product: deepmerge. A copy of the source code may be downloaded from git://github.com/KyleAMathews/deepmerge.git. This software contains the following license and notice below: The MIT License (MIT) -Copyright (c) Node.js contributors, James Talmage (github.com/jamestalmage) +Copyright (c) 2012 Nicholas Fisher + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +----- + +The following software may be included in this product: default-gateway. A copy of the source code may be downloaded from https://github.com/silverwind/default-gateway.git. This software contains the following license and notice below: + +Copyright (c) silverwind +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +----- + +The following software may be included in this product: default-require-extensions. A copy of the source code may be downloaded from https://github.com/avajs/default-require-extensions.git. This software contains the following license and notice below: + +The MIT License (MIT) + +Copyright (c) Node.js contributors, James Talmage (github.com/jamestalmage) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -9482,6 +9505,35 @@ THE SOFTWARE. ----- +The following software may be included in this product: error-stack-parser, stackframe, tweetnacl. A copy of the source code may be downloaded from git://github.com/stacktracejs/error-stack-parser.git (error-stack-parser), git://github.com/stacktracejs/stackframe.git (stackframe), https://github.com/dchest/tweetnacl-js.git (tweetnacl). This software contains the following license and notice below: + +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. + +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +For more information, please refer to + +----- + The following software may be included in this product: error-stack-parser, stackframe. A copy of the source code may be downloaded from git://github.com/stacktracejs/error-stack-parser.git (error-stack-parser), git://github.com/stacktracejs/stackframe.git (stackframe). This software contains the following license and notice below: Copyright (c) 2017 Eric Wendelin and other contributors @@ -9767,7 +9819,7 @@ SOFTWARE. ----- -The following software may be included in this product: eslint-plugin-react-hooks, react, react-dom, react-is, react-test-renderer, scheduler. A copy of the source code may be downloaded from https://github.com/facebook/react.git (eslint-plugin-react-hooks), git+https://github.com/facebook/react.git (react), git+https://github.com/facebook/react.git (react-dom), https://github.com/facebook/react.git (react-is), git+https://github.com/facebook/react.git (react-test-renderer), https://github.com/facebook/react.git (scheduler). This software contains the following license and notice below: +The following software may be included in this product: eslint-plugin-react-hooks, jest-worker, react, react-dom, react-is, react-test-renderer, scheduler. A copy of the source code may be downloaded from https://github.com/facebook/react.git (eslint-plugin-react-hooks), https://github.com/facebook/jest.git (jest-worker), git+https://github.com/facebook/react.git (react), git+https://github.com/facebook/react.git (react-dom), https://github.com/facebook/react.git (react-is), git+https://github.com/facebook/react.git (react-test-renderer), https://github.com/facebook/react.git (scheduler). This software contains the following license and notice below: MIT License @@ -10740,20 +10792,6 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----- -The following software may be included in this product: find-cache-dir. A copy of the source code may be downloaded from https://github.com/avajs/find-cache-dir.git. This software contains the following license and notice below: - -MIT License - -Copyright (c) James Talmage (github.com/jamestalmage) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - ------ - The following software may be included in this product: find-root. A copy of the source code may be downloaded from git@github.com:js-n/find-root.git. This software contains the following license and notice below: Copyright © 2017 jsdnxx @@ -10904,6 +10942,32 @@ PERFORMANCE OF THIS SOFTWARE. ----- +The following software may be included in this product: flush-write-stream, multicast-dns, multicast-dns-service-types. A copy of the source code may be downloaded from https://github.com/mafintosh/flush-write-stream.git (flush-write-stream), https://github.com/mafintosh/multicast-dns.git (multicast-dns), https://github.com/mafintosh/multicast-dns-service-types.git (multicast-dns-service-types). This software contains the following license and notice below: + +The MIT License (MIT) + +Copyright (c) 2015 Mathias Buus + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +----- + The following software may be included in this product: follow-redirects. A copy of the source code may be downloaded from git@github.com:follow-redirects/follow-redirects.git. This software contains the following license and notice below: Copyright 2014–present Olivier Lalonde , James Talmage , Ruben Verborgh @@ -11252,12 +11316,12 @@ the licensed code: ----- -The following software may be included in this product: fsevents. A copy of the source code may be downloaded from https://github.com/strongloop/fsevents.git. This software contains the following license and notice below: +The following software may be included in this product: fsevents. A copy of the source code may be downloaded from https://github.com/fsevents/fsevents.git. This software contains the following license and notice below: MIT License ----------- -Copyright (C) 2010-2014 Philipp Dunkel +Copyright (C) 2010-2020 by Philipp Dunkel, Ben Noordhuis, Elan Shankar, Paul Miller Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -11279,12 +11343,12 @@ THE SOFTWARE. ----- -The following software may be included in this product: fsevents. A copy of the source code may be downloaded from https://github.com/fsevents/fsevents.git. This software contains the following license and notice below: +The following software may be included in this product: fsevents. A copy of the source code may be downloaded from https://github.com/strongloop/fsevents.git. This software contains the following license and notice below: MIT License ----------- -Copyright (C) 2010-2020 by Philipp Dunkel, Ben Noordhuis, Elan Shankar, Paul Miller +Copyright (C) 2010-2014 Philipp Dunkel Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -12521,32 +12585,6 @@ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ----- -The following software may be included in this product: iferr. A copy of the source code may be downloaded from https://github.com/shesek/iferr. This software contains the following license and notice below: - -The MIT License (MIT) - -Copyright (c) 2014 Nadav Ivgi - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - ------ - The following software may be included in this product: image-size. A copy of the source code may be downloaded from https://github.com/image-size/image-size.git. This software contains the following license and notice below: The MIT License (MIT) @@ -12813,7 +12851,7 @@ SOFTWARE. The following software may be included in this product: ipaddr.js. A copy of the source code may be downloaded from git://github.com/whitequark/ipaddr.js. This software contains the following license and notice below: -Copyright (C) 2011-2017 whitequark +Copyright (C) 2011 Peter Zotov Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -12837,7 +12875,7 @@ THE SOFTWARE. The following software may be included in this product: ipaddr.js. A copy of the source code may be downloaded from git://github.com/whitequark/ipaddr.js. This software contains the following license and notice below: -Copyright (C) 2011 Peter Zotov +Copyright (C) 2011-2017 whitequark Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -15205,6 +15243,20 @@ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH RE ----- +The following software may be included in this product: map-age-cleaner. A copy of the source code may be downloaded from https://github.com/SamVerschueren/map-age-cleaner.git. This software contains the following license and notice below: + +MIT License + +Copyright (c) Sam Verschueren (github.com/SamVerschueren) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +----- + The following software may be included in this product: markdown-it. A copy of the source code may be downloaded from https://github.com/markdown-it/markdown-it.git. This software contains the following license and notice below: Copyright (c) 2014 Vitaly Puzrin, Alex Kocharin. @@ -15453,6 +15505,32 @@ SOFTWARE. ----- +The following software may be included in this product: merge-stream. A copy of the source code may be downloaded from https://github.com/grncdr/merge-stream.git. This software contains the following license and notice below: + +The MIT License (MIT) + +Copyright (c) Stephen Sugden (stephensugden.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +----- + The following software may be included in this product: merge2. A copy of the source code may be downloaded from git@github.com:teambition/merge2.git. This software contains the following license and notice below: The MIT License (MIT) @@ -15557,7 +15635,7 @@ Copyright (c) 2012, Mike Adair, Richard Greenwood, Didier Richard, Stephen Irons ----- -The following software may be included in this product: mime. A copy of the source code may be downloaded from https://github.com/broofa/node-mime. This software contains the following license and notice below: +The following software may be included in this product: mime. A copy of the source code may be downloaded from https://github.com/broofa/mime. This software contains the following license and notice below: The MIT License (MIT) @@ -15664,18 +15742,6 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----- -The following software may be included in this product: mississippi. A copy of the source code may be downloaded from git+https://github.com/maxogden/mississippi.git. This software contains the following license and notice below: - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - ------ - The following software may be included in this product: mitt. A copy of the source code may be downloaded from https://github.com/developit/mitt.git. This software contains the following license and notice below: The MIT License (MIT) @@ -17000,31 +17066,6 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----- -The following software may be included in this product: parallel-transform. A copy of the source code may be downloaded from git://github.com/mafintosh/parallel-transform. This software contains the following license and notice below: - -Copyright 2013 Mathias Buus - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - ------ - The following software may be included in this product: parse-asn1. A copy of the source code may be downloaded from git://github.com/crypto-browserify/parse-asn1.git. This software contains the following license and notice below: Copyright (c) 2017, crypto-browserify contributors @@ -24181,6 +24222,24 @@ Copyright (c) 2014, Mike Adair, Richard Greenwood, Didier Richard, Stephen Irons ----- +The following software may be included in this product: promise-inflight. A copy of the source code may be downloaded from git+https://github.com/iarna/promise-inflight.git. This software contains the following license and notice below: + +Copyright (c) 2017, Rebecca Turner + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +----- + The following software may be included in this product: protobufjs. A copy of the source code may be downloaded from https://github.com/protobufjs/protobuf.js.git. This software contains the following license and notice below: This license applies to all parts of protobuf.js except those files @@ -24387,18 +24446,6 @@ The complete list of contributors can be found at: https://github.com/hapijs/qs/ ----- -The following software may be included in this product: querystring. A copy of the source code may be downloaded from git://github.com/Gozala/querystring.git. This software contains the following license and notice below: - -Copyright 2012 Irakli Gozalishvili - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - ------ - The following software may be included in this product: querystring, querystring-es3. A copy of the source code may be downloaded from git://github.com/Gozala/querystring.git (querystring), git://github.com/mike-spainhower/querystring.git (querystring-es3). This software contains the following license and notice below: Copyright 2012 Irakli Gozalishvili. All rights reserved. @@ -24422,6 +24469,18 @@ IN THE SOFTWARE. ----- +The following software may be included in this product: querystring. A copy of the source code may be downloaded from git://github.com/Gozala/querystring.git. This software contains the following license and notice below: + +Copyright 2012 Irakli Gozalishvili + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +----- + The following software may be included in this product: queue-microtask, run-parallel. A copy of the source code may be downloaded from git://github.com/feross/queue-microtask.git (queue-microtask), git://github.com/feross/run-parallel.git (run-parallel). This software contains the following license and notice below: The MIT License (MIT) @@ -25044,31 +25103,6 @@ IN THE SOFTWARE. The following software may be included in this product: readdirp. A copy of the source code may be downloaded from git://github.com/paulmillr/readdirp.git. This software contains the following license and notice below: -This software is released under the MIT license: - -Copyright (c) 2012-2015 Thorsten Lorenz - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - ------ - -The following software may be included in this product: readdirp. A copy of the source code may be downloaded from git://github.com/paulmillr/readdirp.git. This software contains the following license and notice below: - MIT License Copyright (c) 2012-2019 Thorsten Lorenz, Paul Miller (https://paulmillr.com) @@ -25093,6 +25127,31 @@ SOFTWARE. ----- +The following software may be included in this product: readdirp. A copy of the source code may be downloaded from git://github.com/paulmillr/readdirp.git. This software contains the following license and notice below: + +This software is released under the MIT license: + +Copyright (c) 2012-2015 Thorsten Lorenz + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +----- + The following software may be included in this product: rechoir. A copy of the source code may be downloaded from git://github.com/tkellen/node-rechoir.git. This software contains the following license and notice below: Copyright (c) 2015 Tyler Kellen @@ -25120,6 +25179,32 @@ OTHER DEALINGS IN THE SOFTWARE. ----- +The following software may be included in this product: redbox-react. A copy of the source code may be downloaded from git+https://github.com/commissure/redbox-react.git. This software contains the following license and notice below: + +The MIT License (MIT) + +Copyright (c) 2015 David Pfahler + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +----- + The following software may be included in this product: reduce-css-calc. A copy of the source code may be downloaded from https://github.com/MoOx/reduce-css-calc.git. This software contains the following license and notice below: The MIT License (MIT) @@ -28152,6 +28237,38 @@ THE SOFTWARE. ----- +The following software may be included in this product: sourcemapped-stacktrace. A copy of the source code may be downloaded from http://github.com/novocaine/sourcemapped-stacktrace. This software contains the following license and notice below: + +Copyright (c) 2016, James Salter +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of sourcemapped-stacktrace nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +----- + The following software may be included in this product: sparkles. A copy of the source code may be downloaded from https://github.com/gulpjs/sparkles.git. This software contains the following license and notice below: The MIT License (MIT) @@ -28413,31 +28530,6 @@ THE SOFTWARE. ----- -The following software may be included in this product: string_decoder. A copy of the source code may be downloaded from git://github.com/rvagg/string_decoder.git. This software contains the following license and notice below: - -Copyright Joyent, Inc. and other Node contributors. - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to permit -persons to whom the Software is furnished to do so, subject to the -following conditions: - -The above copyright notice and this permission notice shall be included -in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -USE OR OTHER DEALINGS IN THE SOFTWARE. - ------ - The following software may be included in this product: string_decoder. A copy of the source code may be downloaded from git://github.com/nodejs/string_decoder.git. This software contains the following license and notice below: Node.js is licensed for use as follows: @@ -28490,130 +28582,155 @@ IN THE SOFTWARE. ----- -The following software may be included in this product: string.prototype.trim. A copy of the source code may be downloaded from git://github.com/es-shims/String.prototype.trim.git. This software contains the following license and notice below: - -The MIT License (MIT) - -Copyright (c) 2015 Jordan Harband - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - ------ - -The following software may be included in this product: string.prototype.trimend, string.prototype.trimstart. A copy of the source code may be downloaded from git://github.com/es-shims/String.prototype.trimEnd.git (string.prototype.trimend), git://github.com/es-shims/String.prototype.trimStart.git (string.prototype.trimstart). This software contains the following license and notice below: - -MIT License - -Copyright (c) 2017 Khaled Al-Ansari - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - ------ - -The following software may be included in this product: strnum. A copy of the source code may be downloaded from https://github.com/NaturalIntelligence/strnum. This software contains the following license and notice below: - -MIT License - -Copyright (c) 2021 Natural Intelligence - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - ------ - -The following software may be included in this product: supports-preserve-symlinks-flag. A copy of the source code may be downloaded from git+https://github.com/inspect-js/node-supports-preserve-symlinks-flag.git. This software contains the following license and notice below: - -MIT License - -Copyright (c) 2022 Inspect JS - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - ------ - -The following software may be included in this product: sver-compat. A copy of the source code may be downloaded from git+ssh://git@github.com/phated/sver-compat.git. This software contains the following license and notice below: - -MIT License ------------ +The following software may be included in this product: string_decoder. A copy of the source code may be downloaded from git://github.com/rvagg/string_decoder.git. This software contains the following license and notice below: -Copyright (C) 2017 Guy Bedford +Copyright Joyent, Inc. and other Node contributors. -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the +following conditions: -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +USE OR OTHER DEALINGS IN THE SOFTWARE. ----- -The following software may be included in this product: svg-sprite-loader. A copy of the source code may be downloaded from https://github.com/kisenka/svg-sprite-loader.git. This software contains the following license and notice below: +The following software may be included in this product: string.prototype.trim. A copy of the source code may be downloaded from git://github.com/es-shims/String.prototype.trim.git. This software contains the following license and notice below: The MIT License (MIT) -Copyright (c) 2017 Stas Kurilov (kisenka) +Copyright (c) 2015 Jordan Harband + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +----- + +The following software may be included in this product: string.prototype.trimend, string.prototype.trimstart. A copy of the source code may be downloaded from git://github.com/es-shims/String.prototype.trimEnd.git (string.prototype.trimend), git://github.com/es-shims/String.prototype.trimStart.git (string.prototype.trimstart). This software contains the following license and notice below: + +MIT License + +Copyright (c) 2017 Khaled Al-Ansari + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +----- + +The following software may be included in this product: strnum. A copy of the source code may be downloaded from https://github.com/NaturalIntelligence/strnum. This software contains the following license and notice below: + +MIT License + +Copyright (c) 2021 Natural Intelligence + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +----- + +The following software may be included in this product: supports-preserve-symlinks-flag. A copy of the source code may be downloaded from git+https://github.com/inspect-js/node-supports-preserve-symlinks-flag.git. This software contains the following license and notice below: + +MIT License + +Copyright (c) 2022 Inspect JS + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +----- + +The following software may be included in this product: sver-compat. A copy of the source code may be downloaded from git+ssh://git@github.com/phated/sver-compat.git. This software contains the following license and notice below: + +MIT License +----------- + +Copyright (C) 2017 Guy Bedford + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +----- + +The following software may be included in this product: svg-sprite-loader. A copy of the source code may be downloaded from https://github.com/kisenka/svg-sprite-loader.git. This software contains the following license and notice below: + +The MIT License (MIT) + +Copyright (c) 2017 Stas Kurilov (kisenka) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -28716,6 +28833,212 @@ SOFTWARE. ----- +The following software may be included in this product: terriajs, workspace-aggregator-67b4d0de-a4f7-4cd1-b3ab-46d2a2b29e61. A copy of the source code may be downloaded from http://github.com/TerriaJS/terriajs (terriajs), http://github.com/TerriaJS/TerriaMap (workspace-aggregator-67b4d0de-a4f7-4cd1-b3ab-46d2a2b29e61). This software contains the following license and notice below: + +Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright 2012 CSIRO's Data61 and Contributors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +----- + The following software may be included in this product: terriajs-cesium. A copy of the source code may be downloaded from git+https://github.com/CesiumGS/cesium.git. This software contains the following license and notice below: Copyright 2011-2022 CesiumJS Contributors @@ -29642,6 +29965,932 @@ Copyright (c) 2008-2014 Pivotal Labs ----- +The following software may be included in this product: terriajs-cesium. A copy of the source code may be downloaded from git+https://github.com/CesiumGS/cesium.git. This software contains the following license and notice below: + +Copyright 2011-2024 CesiumJS Contributors + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright 2011-2020 CesiumJS Contributors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +Patents US9153063B2 US9865085B1 US10592242 + +Patents pending US15/829,786 US16/850,266 US16/851,958 + +# Third-Party Code + +CesiumJS includes the following third-party code. + +### Sean O'Neil + +http://sponeil.net/ + +> Copyright (c) 2000-2005, Sean O'Neil (s_p_oneil@hotmail.com) +> +> All rights reserved. +> +> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: +> +> - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. +> - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. +> - Neither the name of the project nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. +> +> THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +### zip.js + +https://github.com/gildas-lormeau/zip.js + +> Copyright (c) 2013 Gildas Lormeau. All rights reserved. +> +> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: +> +> 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. +> +> 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. +> +> 3. The names of the authors may not be used to endorse or promote products derived from this software without specific prior written permission. +> +> THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT, INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +### Autolinker.js + +https://github.com/gregjacobs/Autolinker.js + +The MIT License (MIT) + +> Copyright (c) 2015 Gregory Jacobs (http://greg-jacobs.com) + +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +### tween.js + +https://github.com/sole/tween.js + +> Copyright (c) 2010-2012 Tween.js authors. +> +> Easing equations Copyright (c) 2001 Robert Penner http://robertpenner.com/easing/ +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +### topojson-client + +https://github.com/topojson/topojson-client + +> Copyright 2012-2019 Michael Bostock +> +> Permission to use, copy, modify, and/or distribute this software for any purpose +> with or without fee is hereby granted, provided that the above copyright notice +> and this permission notice appear in all copies. +> +> THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +> REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +> FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +> INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +> OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +> TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +> THIS SOFTWARE. + +### mersenne-twister.js + +https://gist.github.com/banksean/300494 + +> Copyright (C) 1997 - 2002, Makoto Matsumoto and Takuji Nishimura, +> All rights reserved. +> +> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: +> +> 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. +> +> 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. +> +> 3. The names of its contributors may not be used to endorse or promote products derived from this software without specific prior written permission. +> +> THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +### NVIDIA GameWorks Graphics Samples + +https://github.com/NVIDIAGameWorks/GraphicsSamples + +> Copyright 2016 NVIDIA Corporation +> +> BY DOWNLOADING THE SOFTWARE AND OTHER AVAILABLE MATERIALS, YOU ("DEVELOPER") AGREE TO BE BOUND BY THE FOLLOWING TERMS AND CONDITIONS +> +> The materials available for download to Developers may include software in both sample source ("Source Code") and object code ("Object Code") versions, documentation ("Documentation"), certain art work ("Art Assets") and other materials (collectively, these materials referred to herein as "Materials"). Except as expressly indicated herein, all terms and conditions of this Agreement apply to all of the Materials. +> +> Except as expressly set forth herein, NVIDIA owns all of the Materials and makes them available to Developer only under the terms and conditions set forth in this Agreement. +> +> License: Subject to the terms of this Agreement, NVIDIA hereby grants to Developer a royalty-free, non-exclusive license to possess and to use the Materials. The following terms apply to the specified type of Material: +> +> Source Code: Developer shall have the right to modify and create derivative works with the Source Code. Developer shall own any derivative works ("Derivatives") it creates to the Source Code, provided that Developer uses the Materials in accordance with the terms of this Agreement. Developer may distribute the Derivatives, provided that all NVIDIA copyright notices and trademarks are used properly and the Derivatives include the following statement: "This software contains source code provided by NVIDIA Corporation." +> +> Object Code: Developer agrees not to disassemble, decompile or reverse engineer the Object Code versions of any of the Materials. Developer acknowledges that certain of the Materials provided in Object Code version may contain third party components that may be subject to restrictions, and expressly agrees not to attempt to modify or distribute such Materials without first receiving consent from NVIDIA. +> +> Art Assets: Developer shall have the right to modify and create Derivatives of the Art Assets, but may not distribute any of the Art Assets or Derivatives created therefrom without NVIDIA's prior written consent. +> +> Government End Users: If you are acquiring the Software on behalf of any unit or agency of the United States Government, the following provisions apply. The Government agrees the Software and documentation were developed at private expense and are provided with "RESTRICTED RIGHTS". Use, duplication, or disclosure by the Government is subject to restrictions as set forth in DFARS 227.7202-1(a) and 227.7202-3(a) (1995), DFARS 252.227-7013(c)(1)(ii) (Oct 1988), FAR 12.212(a)(1995), FAR 52.227-19, (June 1987) or FAR 52.227-14(ALT III) (June 1987),as amended from time to time. In the event that this License, or any part thereof, is deemed inconsistent with the minimum rights identified in the Restricted Rights provisions, the minimum rights shall prevail. +> No Other License. No rights or licenses are granted by NVIDIA under this License, expressly or by implication, with respect to any proprietary information or patent, copyright, trade secret or other intellectual property right owned or controlled by NVIDIA, except as expressly provided in this License. +> Term: This License is effective until terminated. NVIDIA may terminate this Agreement (and with it, all of Developer's right to the Materials) immediately upon written notice (which may include email) to Developer, with or without cause. +> +> Support: NVIDIA has no obligation to support or to continue providing or updating any of the Materials. +> +> No Warranty: THE SOFTWARE AND ANY OTHER MATERIALS PROVIDED BY NVIDIA TO DEVELOPER HEREUNDER ARE PROVIDED "AS IS." NVIDIA DISCLAIMS ALL WARRANTIES, EXPRESS, IMPLIED OR STATUTORY, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +> +> LIMITATION OF LIABILITY: NVIDIA SHALL NOT BE LIABLE TO DEVELOPER, DEVELOPER'S CUSTOMERS, OR ANY OTHER PERSON OR ENTITY CLAIMING THROUGH OR UNDER DEVELOPER FOR ANY LOSS OF PROFITS, INCOME, SAVINGS, OR ANY OTHER CONSEQUENTIAL, INCIDENTAL, SPECIAL, PUNITIVE, DIRECT OR INDIRECT DAMAGES (WHETHER IN AN ACTION IN CONTRACT, TORT OR BASED ON A WARRANTY), EVEN IF NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS SHALL APPLY NOTWITHSTANDING ANY FAILURE OF THE ESSENTIAL PURPOSE OF ANY LIMITED REMEDY. IN NO EVENT SHALL NVIDIA'S AGGREGATE LIABILITY TO DEVELOPER OR ANY OTHER PERSON OR ENTITY CLAIMING THROUGH OR UNDER DEVELOPER EXCEED THE AMOUNT OF MONEY ACTUALLY PAID BY DEVELOPER TO NVIDIA FOR THE SOFTWARE OR ANY OTHER MATERIALS. + +### jsep + +https://github.com/EricSmekens/jsep + +> Copyright (c) 2013 Stephen Oney, https://ericsmekens.github.io/jsep/ +> +> Permission is hereby granted, free of charge, to any person obtaining +> a copy of this software and associated documentation files (the +> "Software"), to deal in the Software without restriction, including +> without limitation the rights to use, copy, modify, merge, publish, +> distribute, sublicense, and/or sell copies of the Software, and to +> permit persons to whom the Software is furnished to do so, subject to +> the following conditions: +> +> The above copyright notice and this permission notice shall be +> included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +> MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +> NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +> LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +> OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +> WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +### earcut + +https://github.com/mapbox/earcut + +> Copyright (c) 2016, Mapbox +> +> Permission to use, copy, modify, and/or distribute this software for any purpose +> with or without fee is hereby granted, provided that the above copyright notice +> and this permission notice appear in all copies. +> +> THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +> REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +> FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +> INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +> OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +> TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +> THIS SOFTWARE. + +### kdbush + +https://github.com/mourner/kdbush + +> Copyright (c) 2016, Vladimir Agafonkin +> +> Permission to use, copy, modify, and/or distribute this software for any purpose +> with or without fee is hereby granted, provided that the above copyright notice +> and this permission notice appear in all copies. +> +> THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +> REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +> FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +> INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +> OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +> TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +> THIS SOFTWARE. + +### rbush + +https://github.com/mourner/rbush + +> MIT License + +> Copyright (c) 2016 Vladimir Agafonkin + +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +> THE SOFTWARE. + +### basis_universal + +https://github.com/BinomialLLC/basis_universal + +> Licensed under the Apache License, Version 2.0 (the "License"); you may not +> use this file except in compliance with the License. You may obtain a copy of +> the License at +> +> +> +> Unless required by applicable law or agreed to in writing, software +> distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +> WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +> License for the specific language governing permissions and limitations under +> the License. + +### KTX-Parse + +https://github.com/donmccurdy/KTX-Parse/ + +> (The MIT License) +> +> Copyright (c) 2020 Don McCurdy +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +> THE SOFTWARE. + +### meshoptimizer + +https://github.com/zeux/meshoptimizer/blob/master/LICENSE.md + +> MIT License +> +> Copyright (c) 2016-2021 Arseny Kapoulkine +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all +> copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +> SOFTWARE. + +### pako + +https://github.com/nodeca/pako + +> (The MIT License) +> +> Copyright (C) 2014-2017 by Vitaly Puzrin and Andrei Tuputcyn +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +> THE SOFTWARE. + +### protobuf + +https://github.com/dcodeIO/ProtoBuf.js + +> Copyright (c) 2016, Daniel Wirtz All rights reserved. +> +> Redistribution and use in source and binary forms, with or without +> modification, are permitted provided that the following conditions are +> met: +> +> - Redistributions of source code must retain the above copyright +> notice, this list of conditions and the following disclaimer. +> - Redistributions in binary form must reproduce the above copyright +> notice, this list of conditions and the following disclaimer in the +> documentation and/or other materials provided with the distribution. +> - Neither the name of its author, nor the names of its contributors +> may be used to endorse or promote products derived from this software +> without specific prior written permission. +> +> THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +> "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +> LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +> A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +> OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +> SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +> LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +> DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +> THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +> (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +> OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +### gltf-WebGL-PBR + +https://github.com/KhronosGroup/glTF-WebGL-PBR + +> The MIT License +> +> Copyright (c) 2016-2017 Mohamad Moneimne and Contributors +> +> Permission is hereby granted, free of charge, to any person obtaining +> a copy of this software and associated documentation files (the "Software"), +> to deal in the Software without restriction, including without limitation the +> rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +> sell copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +> INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +> PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +> HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF +> CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE +> OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +### ShaderFastLibs + +https://github.com/michaldrobot/ShaderFastLibs + +> The MIT License (MIT) +> +> Copyright (c) 2014 Michal Drobot +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +### Draco + +https://github.com/google/draco + +> Licensed under the Apache License, Version 2.0 (the "License"); you may not +> use this file except in compliance with the License. You may obtain a copy of +> the License at +> +> +> +> Unless required by applicable law or agreed to in writing, software +> distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +> WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +> License for the specific language governing permissions and limitations under +> the License. + +### DOMPurify + +https://github.com/cure53/DOMPurify + +> DOMPurify +> Copyright 2015 Mario Heiderich +> +> DOMPurify is free software; you can redistribute it and/or modify it under the +> terms of either: +> +> a) the Apache License Version 2.0, or +> b) the Mozilla Public License Version 2.0 +> +> Licensed under the Apache License, Version 2.0 (the "License"); +> you may not use this file except in compliance with the License. +> You may obtain a copy of the License at +> +> http://www.apache.org/licenses/LICENSE-2.0 +> +> Unless required by applicable law or agreed to in writing, software +> distributed under the License is distributed on an "AS IS" BASIS, +> WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +> See the License for the specific language governing permissions and +> limitations under the License. + +### LERC + +http://github.com/Esri/lerc/ + +> Copyright 2015 Esri +> +> Licensed under the Apache License, Version 2.0 (the "License"); +> you may not use this file except in compliance with the License. +> You may obtain a copy of the License at +> +> http://www.apache.org/licenses/LICENSE-2.0 +> +> Unless required by applicable law or agreed to in writing, software +> distributed under the License is distributed on an "AS IS" BASIS, +> WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +> See the License for the specific language governing permissions and +> limitations under the License. +> +> A copy of the license and additional notices are located with the +> source distribution at: +> +> http://github.com/Esri/lerc/ + +### GraphemeSplitter + +https://github.com/orling/grapheme-splitter + +> The MIT License (MIT) +> +> Copyright (c) 2015 Orlin Georgiev +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +### bitmap-sdf + +https://github.com/dy/bitmap-sdf + +> (c) 2017 Dima Yv. MIT License +> +> Development supported by plot.ly. + +### s2geometry + +https://github.com/google/s2geometry/blob/master/LICENSE + +> Apache License +> Version 2.0, January 2004 +> http://www.apache.org/licenses/ +> +> TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION +> +> 1. Definitions. +> +> "License" shall mean the terms and conditions for use, reproduction, +> and distribution as defined by Sections 1 through 9 of this document. +> +> "Licensor" shall mean the copyright owner or entity authorized by +> the copyright owner that is granting the License. +> +> "Legal Entity" shall mean the union of the acting entity and all +> other entities that control, are controlled by, or are under common +> control with that entity. For the purposes of this definition, +> "control" means (i) the power, direct or indirect, to cause the +> direction or management of such entity, whether by contract or +> otherwise, or (ii) ownership of fifty percent (50%) or more of the +> outstanding shares, or (iii) beneficial ownership of such entity. +> +> "You" (or "Your") shall mean an individual or Legal Entity +> exercising permissions granted by this License. +> +> "Source" form shall mean the preferred form for making modifications, +> including but not limited to software source code, documentation +> source, and configuration files. +> +> "Object" form shall mean any form resulting from mechanical +> transformation or translation of a Source form, including but +> not limited to compiled object code, generated documentation, +> and conversions to other media types. +> +> "Work" shall mean the work of authorship, whether in Source or +> Object form, made available under the License, as indicated by a +> copyright notice that is included in or attached to the work +> (an example is provided in the Appendix below). +> +> "Derivative Works" shall mean any work, whether in Source or Object +> form, that is based on (or derived from) the Work and for which the +> editorial revisions, annotations, elaborations, or other modifications +> represent, as a whole, an original work of authorship. For the purposes +> of this License, Derivative Works shall not include works that remain +> separable from, or merely link (or bind by name) to the interfaces of, +> the Work and Derivative Works thereof. +> +> "Contribution" shall mean any work of authorship, including +> the original version of the Work and any modifications or additions +> to that Work or Derivative Works thereof, that is intentionally +> submitted to Licensor for inclusion in the Work by the copyright owner +> or by an individual or Legal Entity authorized to submit on behalf of +> the copyright owner. For the purposes of this definition, "submitted" +> means any form of electronic, verbal, or written communication sent +> to the Licensor or its representatives, including but not limited to +> communication on electronic mailing lists, source code control systems, +> and issue tracking systems that are managed by, or on behalf of, the +> Licensor for the purpose of discussing and improving the Work, but +> excluding communication that is conspicuously marked or otherwise +> designated in writing by the copyright owner as "Not a Contribution." +> +> "Contributor" shall mean Licensor and any individual or Legal Entity +> on behalf of whom a Contribution has been received by Licensor and +> subsequently incorporated within the Work. +> +> 2. Grant of Copyright License. Subject to the terms and conditions of +> this License, each Contributor hereby grants to You a perpetual, +> worldwide, non-exclusive, no-charge, royalty-free, irrevocable +> copyright license to reproduce, prepare Derivative Works of, +> publicly display, publicly perform, sublicense, and distribute the +> Work and such Derivative Works in Source or Object form. +> +> 3. Grant of Patent License. Subject to the terms and conditions of +> this License, each Contributor hereby grants to You a perpetual, +> worldwide, non-exclusive, no-charge, royalty-free, irrevocable +> (except as stated in this section) patent license to make, have made, +> use, offer to sell, sell, import, and otherwise transfer the Work, +> where such license applies only to those patent claims licensable +> by such Contributor that are necessarily infringed by their +> Contribution(s) alone or by combination of their Contribution(s) +> with the Work to which such Contribution(s) was submitted. If You +> institute patent litigation against any entity (including a +> cross-claim or counterclaim in a lawsuit) alleging that the Work +> or a Contribution incorporated within the Work constitutes direct +> or contributory patent infringement, then any patent licenses +> granted to You under this License for that Work shall terminate +> as of the date such litigation is filed. +> +> 4. Redistribution. You may reproduce and distribute copies of the +> Work or Derivative Works thereof in any medium, with or without +> modifications, and in Source or Object form, provided that You +> meet the following conditions: +> +> (a) You must give any other recipients of the Work or +> Derivative Works a copy of this License; and +> +> (b) You must cause any modified files to carry prominent notices +> stating that You changed the files; and +> +> (c) You must retain, in the Source form of any Derivative Works +> that You distribute, all copyright, patent, trademark, and +> attribution notices from the Source form of the Work, +> excluding those notices that do not pertain to any part of +> the Derivative Works; and +> +> (d) If the Work includes a "NOTICE" text file as part of its +> distribution, then any Derivative Works that You distribute must +> include a readable copy of the attribution notices contained +> within such NOTICE file, excluding those notices that do not +> pertain to any part of the Derivative Works, in at least one +> of the following places: within a NOTICE text file distributed +> as part of the Derivative Works; within the Source form or +> documentation, if provided along with the Derivative Works; or, +> within a display generated by the Derivative Works, if and +> wherever such third-party notices normally appear. The contents +> of the NOTICE file are for informational purposes only and +> do not modify the License. You may add Your own attribution +> notices within Derivative Works that You distribute, alongside +> or as an addendum to the NOTICE text from the Work, provided +> that such additional attribution notices cannot be construed +> as modifying the License. +> +> You may add Your own copyright statement to Your modifications and +> may provide additional or different license terms and conditions +> for use, reproduction, or distribution of Your modifications, or +> for any such Derivative Works as a whole, provided Your use, +> reproduction, and distribution of the Work otherwise complies with +> the conditions stated in this License. +> +> 5. Submission of Contributions. Unless You explicitly state otherwise, +> any Contribution intentionally submitted for inclusion in the Work +> by You to the Licensor shall be under the terms and conditions of +> this License, without any additional terms or conditions. +> Notwithstanding the above, nothing herein shall supersede or modify +> the terms of any separate license agreement you may have executed +> with Licensor regarding such Contributions. +> +> 6. Trademarks. This License does not grant permission to use the trade +> names, trademarks, service marks, or product names of the Licensor, +> except as required for reasonable and customary use in describing the +> origin of the Work and reproducing the content of the NOTICE file. +> +> 7. Disclaimer of Warranty. Unless required by applicable law or +> agreed to in writing, Licensor provides the Work (and each +> Contributor provides its Contributions) on an "AS IS" BASIS, +> WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or +> implied, including, without limitation, any warranties or conditions +> of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A +> PARTICULAR PURPOSE. You are solely responsible for determining the +> appropriateness of using or redistributing the Work and assume any +> risks associated with Your exercise of permissions under this License. +> +> 8. Limitation of Liability. In no event and under no legal theory, +> whether in tort (including negligence), contract, or otherwise, +> unless required by applicable law (such as deliberate and grossly +> negligent acts) or agreed to in writing, shall any Contributor be +> liable to You for damages, including any direct, indirect, special, +> incidental, or consequential damages of any character arising as a +> result of this License or out of the use or inability to use the +> Work (including but not limited to damages for loss of goodwill, +> work stoppage, computer failure or malfunction, or any and all +> other commercial damages or losses), even if such Contributor +> has been advised of the possibility of such damages. +> +> 9. Accepting Warranty or Additional Liability. While redistributing +> the Work or Derivative Works thereof, You may choose to offer, +> and charge a fee for, acceptance of support, warranty, indemnity, +> or other liability obligations and/or rights consistent with this +> License. However, in accepting such obligations, You may act only +> on Your own behalf and on Your sole responsibility, not on behalf +> of any other Contributor, and only if You agree to indemnify, +> defend, and hold each Contributor harmless for any liability +> incurred by, or claims asserted against, such Contributor by reason +> of your accepting any such warranty or additional liability. +> +> END OF TERMS AND CONDITIONS +> +> APPENDIX: How to apply the Apache License to your work. +> +> To apply the Apache License to your work, attach the following +> boilerplate notice, with the fields enclosed by brackets "[]" +> replaced with your own identifying information. (Don't include +> the brackets!) The text should be enclosed in the appropriate +> comment syntax for the file format. We also recommend that a +> file or class name and description of purpose be included on the +> same "printed page" as the copyright notice for easier +> identification within third-party archives. +> +> Copyright [yyyy] [name of copyright owner] +> +> Licensed under the Apache License, Version 2.0 (the "License"); +> you may not use this file except in compliance with the License. +> You may obtain a copy of the License at +> +> http://www.apache.org/licenses/LICENSE-2.0 +> +> Unless required by applicable law or agreed to in writing, software +> distributed under the License is distributed on an "AS IS" BASIS, +> WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +> See the License for the specific language governing permissions and +> limitations under the License. + +### URI.js + +http://medialize.github.io/URI.js/ + +> The MIT License (MIT) +> +> Copyright (c) 2011 Rodney Rehm +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +> THE SOFTWARE. + +# Tests + +The CesiumJS tests use the following third-party libraries and data. + +### Jasmine + +http://jasmine.github.io/ + +Copyright (c) 2008-2014 Pivotal Labs + +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +----- + The following software may be included in this product: terriajs-cesium-widgets. A copy of the source code may be downloaded from git+https://github.com/CesiumGS/cesium.git. This software contains the following license and notice below: Copyright 2011-2022 CesiumJS Contributors @@ -29935,6 +31184,212 @@ OTHER DEALINGS IN THE SOFTWARE. ----- +The following software may be included in this product: terriajs-plugin-api. A copy of the source code may be downloaded from https://github.com/terriajs/plugin-api. This software contains the following license and notice below: + +Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright 2012-2018 CSIRO's Data61 and Contributors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +----- + The following software may be included in this product: terriajs-server. A copy of the source code may be downloaded from https://github.com/TerriaJS/TerriaJS-Server. This software contains the following license and notice below: Copyright(c) 2012-2016 National ICT Australia Limited (NICTA) / Data61. @@ -29967,9 +31422,7 @@ http://proj4js.org/ ----- -The following software may be included in this product: terser, uglify-js. A copy of the source code may be downloaded from https://github.com/terser/terser (terser), https://github.com/mishoo/UglifyJS2.git (uglify-js). This software contains the following license and notice below: - -UglifyJS is released under the BSD license: +The following software may be included in this product: terser. A copy of the source code may be downloaded from https://github.com/terser/terser. This software contains the following license and notice below: Copyright 2012-2018 (c) Mihai Bazon @@ -30827,35 +32280,6 @@ PERFORMANCE OF THIS SOFTWARE. ----- -The following software may be included in this product: tweetnacl. A copy of the source code may be downloaded from https://github.com/dchest/tweetnacl-js.git. This software contains the following license and notice below: - -This is free and unencumbered software released into the public domain. - -Anyone is free to copy, modify, publish, use, compile, sell, or -distribute this software, either in source code form or as a compiled -binary, for any purpose, commercial or non-commercial, and by any -means. - -In jurisdictions that recognize copyright laws, the author or authors -of this software dedicate any and all copyright interest in the -software to the public domain. We make this dedication for the benefit -of the public at large and to the detriment of our heirs and -successors. We intend this dedication to be an overt act of -relinquishment in perpetuity of all present and future rights to this -software under copyright law. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR -OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, -ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. - -For more information, please refer to - ------ - The following software may be included in this product: type. A copy of the source code may be downloaded from https://github.com/medikoo/type.git. This software contains the following license and notice below: ISC License @@ -31035,6 +32459,40 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----- +The following software may be included in this product: uglify-js. A copy of the source code may be downloaded from https://github.com/mishoo/UglifyJS2.git. This software contains the following license and notice below: + +UglifyJS is released under the BSD license: + +Copyright 2012-2018 (c) Mihai Bazon + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + + * Redistributions of source code must retain the above + copyright notice, this list of conditions and the following + disclaimer. + + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials + provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “AS IS” AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, +OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR +TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. + +----- + The following software may be included in this product: underscore. A copy of the source code may be downloaded from git://github.com/jashkenas/underscore.git. This software contains the following license and notice below: Copyright (c) 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative @@ -31455,7 +32913,7 @@ The following software may be included in this product: uuid. A copy of the sour The MIT License (MIT) -Copyright (c) 2010-2016 Robert Kieffer and other contributors +Copyright (c) 2010-2020 Robert Kieffer and other contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -31477,25 +32935,11 @@ SOFTWARE. ----- -The following software may be included in this product: uuid. A copy of the source code may be downloaded from https://github.com/uuidjs/uuid.git. This software contains the following license and notice below: - -The MIT License (MIT) - -Copyright (c) 2010-2020 Robert Kieffer and other contributors - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - ------ - -The following software may be included in this product: uuid. A copy of the source code may be downloaded from https://github.com/uuidjs/uuid.git. This software contains the following license and notice below: +The following software may be included in this product: uuid. A copy of the source code may be downloaded from https://github.com/kelektiv/node-uuid.git. This software contains the following license and notice below: The MIT License (MIT) -Copyright (c) 2010-2020 Robert Kieffer and other contributors +Copyright (c) 2010-2016 Robert Kieffer and other contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -31517,6 +32961,20 @@ SOFTWARE. ----- +The following software may be included in this product: uuid. A copy of the source code may be downloaded from https://github.com/uuidjs/uuid.git. This software contains the following license and notice below: + +The MIT License (MIT) + +Copyright (c) 2010-2020 Robert Kieffer and other contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +----- + The following software may be included in this product: v8-compile-cache. A copy of the source code may be downloaded from https://github.com/zertosh/v8-compile-cache.git. This software contains the following license and notice below: The MIT License (MIT) @@ -31948,24 +33406,6 @@ THIS SOFTWARE. ----- -The following software may be included in this product: worker-farm. A copy of the source code may be downloaded from https://github.com/rvagg/node-worker-farm.git. This software contains the following license and notice below: - -The MIT License (MIT) -===================== - -Copyright (c) 2014 LevelUP contributors ---------------------------------------- - -*LevelUP contributors listed at * - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - ------ - The following software may be included in this product: ws. A copy of the source code may be downloaded from https://github.com/websockets/ws.git. This software contains the following license and notice below: The MIT License (MIT) @@ -32384,11 +33824,12 @@ THIS SOFTWARE. ----- -The following software may be included in this product: yargs. A copy of the source code may be downloaded from https://github.com/yargs/yargs.git. This software contains the following license and notice below: +The following software may be included in this product: yargs. A copy of the source code may be downloaded from http://github.com/yargs/yargs.git. This software contains the following license and notice below: -MIT License +Copyright 2010 James Halliday (mail@substack.net) +Modified work Copyright 2014 Contributors (ben@npmjs.com) -Copyright 2010 James Halliday (mail@substack.net); Modified work Copyright 2014 Contributors (ben@npmjs.com) +This project is free software released under the MIT/X11 license: Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -32412,10 +33853,9 @@ THE SOFTWARE. The following software may be included in this product: yargs. A copy of the source code may be downloaded from https://github.com/yargs/yargs.git. This software contains the following license and notice below: -Copyright 2010 James Halliday (mail@substack.net) -Modified work Copyright 2014 Contributors (ben@npmjs.com) +MIT License -This project is free software released under the MIT/X11 license: +Copyright 2010 James Halliday (mail@substack.net); Modified work Copyright 2014 Contributors (ben@npmjs.com) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/lib/ReactViews/Map/Panels/DropdownPanel.jsx b/lib/ReactViews/Map/Panels/DropdownPanel.jsx index 2ecd9bbc4fa..fbe3958f437 100644 --- a/lib/ReactViews/Map/Panels/DropdownPanel.jsx +++ b/lib/ReactViews/Map/Panels/DropdownPanel.jsx @@ -99,6 +99,7 @@ const DropdownPanel = createReactClass({ ref={ this.props.btnRef || ((element) => (this.buttonElement = element)) } + /* eslint-disable-next-line react/no-unknown-property */ isOpen={this.isOpen()} css={` ${(p) => diff --git a/lib/ReactViews/Map/Panels/InnerPanel.jsx b/lib/ReactViews/Map/Panels/InnerPanel.jsx index c2594e35187..cbbdc051a10 100644 --- a/lib/ReactViews/Map/Panels/InnerPanel.jsx +++ b/lib/ReactViews/Map/Panels/InnerPanel.jsx @@ -139,6 +139,7 @@ const InnerPanel = createReactClass({ onClick={this.forceClose} title={t("general.close")} aria-label={t("general.close")} + /* eslint-disable-next-line react/no-unknown-property */ showDropdownAsModal={this.props.showDropdownAsModal} css={` svg { diff --git a/lib/ReactViews/Notification/NotificationWindow.jsx b/lib/ReactViews/Notification/NotificationWindow.jsx index 0f7e9c400b1..ab6ca48d149 100644 --- a/lib/ReactViews/Notification/NotificationWindow.jsx +++ b/lib/ReactViews/Notification/NotificationWindow.jsx @@ -73,6 +73,7 @@ const NotificationWindow = createReactClass({
    From 65bdd962c4cf7c576098e60429d4330a1b24e27a Mon Sep 17 00:00:00 2001 From: Lawrence Owen Date: Mon, 8 Apr 2024 16:56:55 +1000 Subject: [PATCH 639/654] Bump .nvmrc to node18 --- .nvmrc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.nvmrc b/.nvmrc index 2ab3d4be550..60495ee0aad 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -v16.20.2 +v18.19.1 From a728a19251ab32655dcb1888251e442f98db7819 Mon Sep 17 00:00:00 2001 From: Lawrence Owen Date: Mon, 8 Apr 2024 17:31:46 +1000 Subject: [PATCH 640/654] revert changes to generateCatalogIndex.ts --- buildprocess/generateCatalogIndex.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/buildprocess/generateCatalogIndex.ts b/buildprocess/generateCatalogIndex.ts index 688e5ef52b0..1a0937405ec 100644 --- a/buildprocess/generateCatalogIndex.ts +++ b/buildprocess/generateCatalogIndex.ts @@ -21,7 +21,7 @@ import registerSearchProviders from "../lib/Models/SearchProviders/registerSearc import Terria from "../lib/Models/Terria"; import CatalogMemberReferenceTraits from "../lib/Traits/TraitsClasses/CatalogMemberReferenceTraits"; import patchNetworkRequests from "./patchNetworkRequests"; -import { Command } from "commander"; +import { program } from "commander"; /** Add model to index */ function indexModel( @@ -374,7 +374,6 @@ export default async function generateCatalogIndex( } } -const program = new Command(); program .name("generateCatalogIndex") .description( @@ -417,7 +416,7 @@ Example usage 30000 ); -program.parse(process.argv); +program.parse(); const options = program.opts(); From c69982ca2df7a8b56784a7cfab6d52954309c99c Mon Sep 17 00:00:00 2001 From: Lawrence Owen Date: Tue, 9 Apr 2024 10:49:36 +1000 Subject: [PATCH 641/654] Karma fix for node18, listen on '::' See https://github.com/karma-runner/karma/issues/3730 for more details --- buildprocess/createKarmaBaseConfig.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/buildprocess/createKarmaBaseConfig.js b/buildprocess/createKarmaBaseConfig.js index 4f9117469ea..8a70af79e13 100644 --- a/buildprocess/createKarmaBaseConfig.js +++ b/buildprocess/createKarmaBaseConfig.js @@ -13,6 +13,7 @@ module.exports = function (config) { // frameworks to use // available frameworks: https://npmjs.org/browse/keyword/karma-adapter frameworks: ["jasmine"], + listenAddress: "::", // list of files / patterns to load in the browser files: [ @@ -70,7 +71,7 @@ module.exports = function (config) { suppressErrorSummary: false, suppressFailed: false, suppressPassed: true, - suppressSkipped: false + suppressSkipped: true } }; }; From 45487f8addf09b70fc467319da5516dfb72f108f Mon Sep 17 00:00:00 2001 From: "Peter A. Jonsson" Date: Sun, 31 Mar 2024 18:39:11 +0200 Subject: [PATCH 642/654] Remove spuriuos return Return as the last statement of a function without return value is not required. --- lib/ReactViews/Custom/Chart/MomentPointsChart.jsx | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/ReactViews/Custom/Chart/MomentPointsChart.jsx b/lib/ReactViews/Custom/Chart/MomentPointsChart.jsx index 362b7e6915d..ea810e7c891 100644 --- a/lib/ReactViews/Custom/Chart/MomentPointsChart.jsx +++ b/lib/ReactViews/Custom/Chart/MomentPointsChart.jsx @@ -138,7 +138,6 @@ function closestPointIndex(x, sortedPoints) { return i - 1; } } - return; } export default MomentPointsChart; From cc39db47a6c37921efade7ff9ffa8dbd3397f18d Mon Sep 17 00:00:00 2001 From: "Peter A. Jonsson" Date: Sun, 31 Mar 2024 11:47:48 +0200 Subject: [PATCH 643/654] Update all visx dependencies This fixes some security issues in dependencies. --- package.json | 22 +-- yarn.lock | 381 +++++++++++++++++++++++++++++++-------------------- 2 files changed, 247 insertions(+), 156 deletions(-) diff --git a/package.json b/package.json index 1d03193c034..9c292ca9549 100644 --- a/package.json +++ b/package.json @@ -74,17 +74,17 @@ "@types/shpjs": "^3.4.0", "@types/styled-components": "^5.1.26", "@types/urijs": "1.19.1", - "@visx/axis": "^2.1.0", - "@visx/clip-path": "^2.1.0", - "@visx/event": "^2.1.0", - "@visx/glyph": "^2.1.0", - "@visx/grid": "^2.1.0", - "@visx/group": "^2.1.0", - "@visx/legend": "^2.1.0", - "@visx/responsive": "^2.10.0", - "@visx/scale": "^2.1.0", - "@visx/shape": "^2.1.0", - "@visx/tooltip": "^2.1.0", + "@visx/axis": "^3.10.1", + "@visx/clip-path": "^3.3.0", + "@visx/event": "^3.3.0", + "@visx/glyph": "^3.3.0", + "@visx/grid": "^3.5.0", + "@visx/group": "^3.3.0", + "@visx/legend": "^3.5.0", + "@visx/responsive": "^3.10.2", + "@visx/scale": "^3.5.0", + "@visx/shape": "^3.5.0", + "@visx/tooltip": "^3.3.0", "assimpjs": "^0.0.7", "babel-loader": "^8.2.3", "babel-plugin-lodash": "^3.3.4", diff --git a/yarn.lock b/yarn.lock index ce0acca487b..405361b34e0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1322,11 +1322,6 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" -"@juggle/resize-observer@^3.3.1": - version "3.4.0" - resolved "https://registry.yarnpkg.com/@juggle/resize-observer/-/resize-observer-3.4.0.tgz#08d6c5e20cf7e4cc02fd181c4b0c225cd31dbb60" - integrity sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA== - "@mapbox/geojson-merge@^1.1.1": version "1.1.1" resolved "https://registry.yarnpkg.com/@mapbox/geojson-merge/-/geojson-merge-1.1.1.tgz#0848e09ae0e44eeb6ea2f7943f54c76fc2a561ed" @@ -1640,6 +1635,11 @@ resolved "https://registry.yarnpkg.com/@types/css-font-loading-module/-/css-font-loading-module-0.0.9.tgz#e1637ceebba3f07634bda0fd400ae34b78c93c45" integrity sha512-HU/J7J/3Bw7QJBOHWcY+77KreCqx/z//cYwJK6w40o9F5tCrrjrPY2f+YRJbjSYCKzjojmn6jafK6bn9Qht0iA== +"@types/d3-array@3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/d3-array/-/d3-array-3.0.3.tgz#87d990bf504d14ad6b16766979d04e943c046dac" + integrity sha512-Reoy+pKnvsksN0lQUlcH6dOGjRZ/3WRwXR//m+/8lt1BXeI4xyaUZoqULNjyXXRuh0Mj4LNpkCvhUpQlY3X5xQ== + "@types/d3-array@^2.0.0": version "2.12.3" resolved "https://registry.yarnpkg.com/@types/d3-array/-/d3-array-2.12.3.tgz#8d16d51fb04ad5a5a8ebe14eb8263a579f1efdd1" @@ -1652,22 +1652,44 @@ dependencies: "@types/d3-selection" "^1" -"@types/d3-color@^1": - version "1.4.2" - resolved "https://registry.yarnpkg.com/@types/d3-color/-/d3-color-1.4.2.tgz#944f281d04a0f06e134ea96adbb68303515b2784" - integrity sha512-fYtiVLBYy7VQX+Kx7wU/uOIkGQn8aAEY8oWMoyja3N4dLd8Yf6XgSIR/4yWvMuveNOH5VShnqCgRqqh/UNanBA== +"@types/d3-color@*": + version "3.1.3" + resolved "https://registry.yarnpkg.com/@types/d3-color/-/d3-color-3.1.3.tgz#368c961a18de721da8200e80bf3943fb53136af2" + integrity sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A== + +"@types/d3-color@3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@types/d3-color/-/d3-color-3.1.0.tgz#6594da178ded6c7c3842f3cc0ac84b156f12f2d4" + integrity sha512-HKuicPHJuvPgCD+np6Se9MQvS6OCbJmOjGvylzMJRlDwUXjKTTXs6Pwgk79O09Vj/ho3u1ofXnhFOaEWWPrlwA== "@types/d3-color@^3.0.0": version "3.0.2" resolved "https://registry.yarnpkg.com/@types/d3-color/-/d3-color-3.0.2.tgz#53f2d6325f66ee79afd707c05ac849e8ae0edbb0" integrity sha512-WVx6zBiz4sWlboCy7TCgjeyHpNjMsoF36yaagny1uXfbadc9f+5BeBf7U+lRmQqY3EHbGQpP8UdW8AC+cywSwQ== -"@types/d3-interpolate@^1.3.1": - version "1.4.2" - resolved "https://registry.yarnpkg.com/@types/d3-interpolate/-/d3-interpolate-1.4.2.tgz#88902a205f682773a517612299a44699285eed7b" - integrity sha512-ylycts6llFf8yAEs1tXzx2loxxzDZHseuhPokrqKprTQSTcD3JbJI1omZP1rphsELZO3Q+of3ff0ZS7+O6yVzg== +"@types/d3-delaunay@6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@types/d3-delaunay/-/d3-delaunay-6.0.1.tgz#006b7bd838baec1511270cb900bf4fc377bbbf41" + integrity sha512-tLxQ2sfT0p6sxdG75c6f/ekqxjyYR0+LwPrsO1mbC9YDBzPJhs2HbJJRrn8Ez1DBoHRo2yx7YEATI+8V1nGMnQ== + +"@types/d3-format@3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/d3-format/-/d3-format-3.0.1.tgz#194f1317a499edd7e58766f96735bdc0216bb89d" + integrity sha512-5KY70ifCCzorkLuIkDe0Z9YTf9RR2CjBX1iaJG+rgM/cPP+sO+q9YdQ9WdhQcgPj1EQiJ2/0+yUkkziTG6Lubg== + +"@types/d3-geo@3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@types/d3-geo/-/d3-geo-3.1.0.tgz#b9e56a079449174f0a2c8684a9a4df3f60522440" + integrity sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ== dependencies: - "@types/d3-color" "^1" + "@types/geojson" "*" + +"@types/d3-interpolate@3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/d3-interpolate/-/d3-interpolate-3.0.1.tgz#e7d17fa4a5830ad56fe22ce3b4fac8541a9572dc" + integrity sha512-jx5leotSeac3jr0RePOH1KdR9rISG91QIE4Q2PYTu4OymLTZfA3SrnURSLzKH48HmXVUru50b8nje4E79oQSQw== + dependencies: + "@types/d3-color" "*" "@types/d3-path@^1", "@types/d3-path@^1.0.8": version "1.0.9" @@ -1679,12 +1701,12 @@ resolved "https://registry.yarnpkg.com/@types/d3-scale-chromatic/-/d3-scale-chromatic-2.0.1.tgz#495cbbae7273e0d0ff564cdc19aa6d2b9928da83" integrity sha512-3EuZlbPu+pvclZcb1DhlymTWT2W+lYsRKBjvkH2ojDbCWDYavifqu1vYX9WGzlPgCgcS4Alhk1+zapXbGEGylQ== -"@types/d3-scale@^3.3.0": - version "3.3.2" - resolved "https://registry.yarnpkg.com/@types/d3-scale/-/d3-scale-3.3.2.tgz#18c94e90f4f1c6b1ee14a70f14bfca2bd1c61d06" - integrity sha512-gGqr7x1ost9px3FvIfUMi5XA/F/yAf4UkUDtdQhpH92XCT0Oa7zkkRzY61gPVJq+DxpHn/btouw5ohWkbBsCzQ== +"@types/d3-scale@4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@types/d3-scale/-/d3-scale-4.0.2.tgz#41be241126af4630524ead9cb1008ab2f0f26e69" + integrity sha512-Yk4htunhPAwN0XGlIwArRomOjdoBFXC3+kCxK2Ubg7I9shQlVSJy/pG/Ht5ASN+gdMIalpk8TJ5xV74jFsetLA== dependencies: - "@types/d3-time" "^2" + "@types/d3-time" "*" "@types/d3-selection@^1", "@types/d3-selection@^1.4.1": version "1.4.3" @@ -1698,10 +1720,20 @@ dependencies: "@types/d3-path" "^1" -"@types/d3-time@^2", "@types/d3-time@^2.0.0": - version "2.1.1" - resolved "https://registry.yarnpkg.com/@types/d3-time/-/d3-time-2.1.1.tgz#743fdc821c81f86537cbfece07093ac39b4bc342" - integrity sha512-9MVYlmIgmRR31C5b4FVSWtuMmBHh2mOWQYfl7XAYOa8dsnb7iEmUmRSWSFgXFtkjxO65d7hTUHQC+RhR/9IWFg== +"@types/d3-time-format@2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@types/d3-time-format/-/d3-time-format-2.1.0.tgz#011e0fb7937be34a9a8f580ae1e2f2f1336a8a22" + integrity sha512-/myT3I7EwlukNOX2xVdMzb8FRgNzRMpsZddwst9Ld/VFe6LyJyRp0s32l/V9XoUzk+Gqu56F/oGk6507+8BxrA== + +"@types/d3-time@*": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/d3-time/-/d3-time-3.0.3.tgz#3c186bbd9d12b9d84253b6be6487ca56b54f88be" + integrity sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw== + +"@types/d3-time@3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/d3-time/-/d3-time-3.0.0.tgz#e1ac0f3e9e195135361fa1a1d62f795d87e6e819" + integrity sha512-sZLCdHvBUcNby1cB6Fd3ZBrABbjz3v1Vm90nysCQ6Vt7vd6e/h9Lt7SiJUoEX0l4Dzc7P5llKyhqSi1ycSf1Hg== "@types/d3-transition@^1.1.4": version "1.3.2" @@ -2093,149 +2125,143 @@ "@typescript-eslint/types" "6.13.1" eslint-visitor-keys "^3.4.1" -"@visx/axis@^2.1.0": - version "2.4.0" - resolved "https://registry.yarnpkg.com/@visx/axis/-/axis-2.4.0.tgz#0785a872e1a2706ece2f3e9e350736b04039359e" - integrity sha512-5QA1Std1HSfBjVObulMW6gi2ZlBg9zuP8jUpgs1LL5tLWritla4T6cheEGLNa6Yuuy/DKzpHJUmNGBtpBGFEGw== +"@visx/axis@^3.10.1": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@visx/axis/-/axis-3.10.1.tgz#c2003993517d8bf398fe8edd41be70b6931ccc6e" + integrity sha512-HBEDLcpZoJ16hFbkYu3S6mN5mbwlFmUWY5yN967X06RdIL4LmAG3gnZ7u4F9buA3LQo+trJXW78moN005odD4Q== dependencies: "@types/react" "*" - "@visx/group" "2.1.0" - "@visx/point" "2.1.0" - "@visx/scale" "2.2.2" - "@visx/shape" "2.4.0" - "@visx/text" "2.3.0" + "@visx/group" "3.3.0" + "@visx/point" "3.3.0" + "@visx/scale" "3.5.0" + "@visx/shape" "3.5.0" + "@visx/text" "3.3.0" classnames "^2.3.1" prop-types "^15.6.0" -"@visx/bounds@2.1.2": - version "2.1.2" - resolved "https://registry.yarnpkg.com/@visx/bounds/-/bounds-2.1.2.tgz#aa46104d262bc703e73380c69aa5854e5492f77b" - integrity sha512-O80K6PkDH//6xVDP3rSdd+9GNtBUMJKgVXh1ZjW8tAj/rtRq+GiyE17sB3uqV+btNkg0oJiVsFpmoLI50beJDQ== +"@visx/bounds@3.3.0": + version "3.3.0" + resolved "https://registry.yarnpkg.com/@visx/bounds/-/bounds-3.3.0.tgz#6ccecda636f1f970478f392dff2f6136aaead24f" + integrity sha512-gESmN+4N2NkeUzqQEDZaS63umkGfMp9XjQcKBqtOR64mjjQtamh3lNVRWvKjJ2Zb421RbYHWq22Wv9nay6ZUOg== dependencies: "@types/react" "*" "@types/react-dom" "*" prop-types "^15.5.10" -"@visx/clip-path@^2.1.0": - version "2.1.0" - resolved "https://registry.yarnpkg.com/@visx/clip-path/-/clip-path-2.1.0.tgz#5730ebda167493a56d033c454453900ed0b4904b" - integrity sha512-g8OC8M4H+AunfT2taKyy++X7muMrhlqITNDan25gVopGuHxydiDYatu4qdZIGbYjAoiI0KHEB07/HV8iePcTdQ== +"@visx/clip-path@^3.3.0": + version "3.3.0" + resolved "https://registry.yarnpkg.com/@visx/clip-path/-/clip-path-3.3.0.tgz#3ba27fe739faf11c2ef9679356ac37a01df01347" + integrity sha512-uMuI2M05qZTgUdTSHJGg4VDr2gytGmGyuaC89iByHqNaeMHkrJqQi/cOFAZi4D0dn75p7lVirJijEgDgSpcrMQ== dependencies: "@types/react" "*" prop-types "^15.5.10" -"@visx/curve@2.1.0": - version "2.1.0" - resolved "https://registry.yarnpkg.com/@visx/curve/-/curve-2.1.0.tgz#f614bfe3db66df7db7382db7a75ced1506b94602" - integrity sha512-9b6JOnx91gmOQiSPhUOxdsvcnW88fgqfTPKoVgQxidMsD/I3wksixtwo8TR/vtEz2aHzzsEEhlv1qK7Y3yaSDw== +"@visx/curve@3.3.0": + version "3.3.0" + resolved "https://registry.yarnpkg.com/@visx/curve/-/curve-3.3.0.tgz#a5ed8f1511d404ef83c0b956ed5021088ac64b0e" + integrity sha512-G1l1rzGWwIs8ka3mBhO/gj8uYK6XdU/3bwRSoiZ+MockMahQFPog0bUkuVgPwwzPSJfsA/E5u53Y/DNesnHQxg== dependencies: "@types/d3-shape" "^1.3.1" d3-shape "^1.0.6" -"@visx/event@^2.1.0": - version "2.1.2" - resolved "https://registry.yarnpkg.com/@visx/event/-/event-2.1.2.tgz#f714e705b8702e6bac2c11c4ae667535460e50c1" - integrity sha512-x3gAQ9DB4zDA6qqGpzlpGacGuOtmzFi/m5Zq7BJ0OJ7PjNfkIazCsznc9epCT/g9IIhwhs+UN/Ijww4YnFHqHw== +"@visx/event@^3.3.0": + version "3.3.0" + resolved "https://registry.yarnpkg.com/@visx/event/-/event-3.3.0.tgz#30bb7f02857800749219e4ba76fce53df4d47353" + integrity sha512-fKalbNgNz2ooVOTXhvcOx5IlEQDgVfX66rI7bgZhBxI2/scy+5rWcXJXpwkheRF68SMx9R93SjKW6tmiD0h+jA== dependencies: "@types/react" "*" - "@visx/point" "2.1.0" + "@visx/point" "3.3.0" -"@visx/glyph@^2.1.0": - version "2.1.2" - resolved "https://registry.yarnpkg.com/@visx/glyph/-/glyph-2.1.2.tgz#3da1a6280b09b43012256dca65845230d16ef49d" - integrity sha512-HUVpW2mdaWP6zfMIGFUW7xR4eRyvzthic/9f46m+4eX8e6a5tJlgh1gNwrTB5rly1kXtBlyGaDOxKEkrs+6UQA== +"@visx/glyph@^3.3.0": + version "3.3.0" + resolved "https://registry.yarnpkg.com/@visx/glyph/-/glyph-3.3.0.tgz#bea3519d6094e96ea5fd1935030273bcdd8cb32f" + integrity sha512-U2r1rFLpim3afKuuAmrbxXGSDCaLwXHmjXxWN8PiIQPMxpS7eaa/V5g2TRd/+x0KCkaf3Ismk4VKMl8ZlrmxIQ== dependencies: "@types/d3-shape" "^1.3.1" "@types/react" "*" - "@visx/group" "2.1.0" + "@visx/group" "3.3.0" classnames "^2.3.1" d3-shape "^1.2.0" prop-types "^15.6.2" -"@visx/grid@^2.1.0": - version "2.4.0" - resolved "https://registry.yarnpkg.com/@visx/grid/-/grid-2.4.0.tgz#8ddf3bf6154ae0f6ffb27e3919079229471813f8" - integrity sha512-1tk8XaLeFRQA8BKy/+oP7aqsE99GKzyEYA1w4waga2VI0bDZiSnuZix6cy5PTusZxt9ZzjTmPGkC2RXq9+I5XA== +"@visx/grid@^3.5.0": + version "3.5.0" + resolved "https://registry.yarnpkg.com/@visx/grid/-/grid-3.5.0.tgz#a20058f2c7553e3f2f2ec140bdfdf4434ffd5f41" + integrity sha512-i1pdobTE223ItMiER3q4ojIaZWja3vg46TkS6FotnBZ4c0VRDHSrALQPdi0na+YEgppASWCQ2WrI/vD6mIkhSg== dependencies: "@types/react" "*" - "@visx/curve" "2.1.0" - "@visx/group" "2.1.0" - "@visx/point" "2.1.0" - "@visx/scale" "2.2.2" - "@visx/shape" "2.4.0" + "@visx/curve" "3.3.0" + "@visx/group" "3.3.0" + "@visx/point" "3.3.0" + "@visx/scale" "3.5.0" + "@visx/shape" "3.5.0" classnames "^2.3.1" prop-types "^15.6.2" -"@visx/group@2.1.0", "@visx/group@^2.1.0": - version "2.1.0" - resolved "https://registry.yarnpkg.com/@visx/group/-/group-2.1.0.tgz#65d4a72feb20dd09443f73cdc12ad5fb339792ef" - integrity sha512-bZKa54yVjGYPZZhzYHLz4AVlidSr4ET9B/xmSa7nnictMJWr7e/IuZThB/bMfDQlgdtvhcfTgs+ZluySc5SBUg== +"@visx/group@3.3.0", "@visx/group@^3.3.0": + version "3.3.0" + resolved "https://registry.yarnpkg.com/@visx/group/-/group-3.3.0.tgz#20c1b75c1ab31798c3c702b6f58c412c688a6373" + integrity sha512-yKepDKwJqlzvnvPS0yDuW13XNrYJE4xzT6xM7J++441nu6IybWWwextyap8ey+kU651cYDb+q1Oi6aHvQwyEyw== dependencies: "@types/react" "*" classnames "^2.3.1" prop-types "^15.6.2" -"@visx/legend@^2.1.0": - version "2.2.2" - resolved "https://registry.yarnpkg.com/@visx/legend/-/legend-2.2.2.tgz#38d39469c7608e7268a8f716f81f80d3a656dfae" - integrity sha512-Pf77v3h12P5W2w5Iw1z+hucJVk19GOg+2R3N+O0SODDeaWg3pyN4eJMcs2LdYSfNWGkcejGu4G9Q/UUgjv7ihw== +"@visx/legend@^3.5.0": + version "3.5.0" + resolved "https://registry.yarnpkg.com/@visx/legend/-/legend-3.5.0.tgz#a1ffe1fa7b47428ea22eaab312a1e0119a95b52b" + integrity sha512-bRQNF3M2VCTxTmRkRVjeQSDqvjgUT1CMU3T1apf2UmZJ7zo73anwqDBtSJx+csarDij0DbcoWvKY4NdTp7Uepg== dependencies: "@types/react" "*" - "@visx/group" "2.1.0" - "@visx/scale" "2.2.2" + "@visx/group" "3.3.0" + "@visx/scale" "3.5.0" classnames "^2.3.1" prop-types "^15.5.10" -"@visx/point@2.1.0": - version "2.1.0" - resolved "https://registry.yarnpkg.com/@visx/point/-/point-2.1.0.tgz#b3e263826f28b3a170d6604dea8ffa27a4b9ac3b" - integrity sha512-vVnfI7oqjjttkn05Xi/ooR0UqQRoGf68lyT3SOl0WPHvIQBGNh3XoVUBHDr15/NUkfErgK6TNlfXY763YncPWg== +"@visx/point@3.3.0": + version "3.3.0" + resolved "https://registry.yarnpkg.com/@visx/point/-/point-3.3.0.tgz#7a705e09892ae45b4c9cf3155e9be3a3845460d8" + integrity sha512-03eBBIJarkmX79WbeEGTUZwmS5/MUuabbiM9KfkGS9pETBTWkp1DZtEHZdp5z34x5TDQVLSi0rk1Plg3/8RtDg== -"@visx/responsive@^2.10.0": - version "2.17.0" - resolved "https://registry.yarnpkg.com/@visx/responsive/-/responsive-2.17.0.tgz#8a31f016a270234bfecf25fb066f30d19784ddc7" - integrity sha512-3dY2shGbQnoknIRv3Vfnwsy3ZA8Q5Q/rYnTLiokWChYRfNC8NMPoX9mprEeb/gMAxtKjaLn3zcCgd8R+eetxIQ== +"@visx/responsive@^3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@visx/responsive/-/responsive-3.10.2.tgz#fbd085c3f12418df71b4283e8d5188dd4427af90" + integrity sha512-oDzFnLLpGpvTcFDoixVJX6iKOVzNJJW4dlAnsfgtxa/ibgMFZGoN4QL3NIzVlgg9s0fTDFCgQ+0FSMv1VvgKlQ== dependencies: - "@juggle/resize-observer" "^3.3.1" "@types/lodash" "^4.14.172" "@types/react" "*" lodash "^4.17.21" prop-types "^15.6.1" -"@visx/scale@2.2.2", "@visx/scale@^2.1.0": - version "2.2.2" - resolved "https://registry.yarnpkg.com/@visx/scale/-/scale-2.2.2.tgz#b8eafabdcf92bb45ab196058fe184772ad80fd25" - integrity sha512-3aDySGUTpe6VykDQmF+g2nz5paFu9iSPTcCOEgkcru0/v5tmGzUdvivy8CkYbr87HN73V/Jc53lGm+kJUQcLBw== +"@visx/scale@3.5.0", "@visx/scale@^3.5.0": + version "3.5.0" + resolved "https://registry.yarnpkg.com/@visx/scale/-/scale-3.5.0.tgz#c3db3863bbdd24d44781104ef5ee4cdc8df6f11d" + integrity sha512-xo3zrXV2IZxrMq9Y9RUVJUpd93h3NO/r/y3GVi5F9AsbOzOhsLIbsPkunhO9mpUSR8LZ9TiumLEBrY+3frRBSg== dependencies: - "@types/d3-interpolate" "^1.3.1" - "@types/d3-scale" "^3.3.0" - "@types/d3-time" "^2.0.0" - d3-interpolate "^1.4.0" - d3-scale "^3.3.0" - d3-time "^2.1.1" + "@visx/vendor" "3.5.0" -"@visx/shape@2.4.0", "@visx/shape@^2.1.0": - version "2.4.0" - resolved "https://registry.yarnpkg.com/@visx/shape/-/shape-2.4.0.tgz#d25d6a319c416258e12947d74773edb83051ba03" - integrity sha512-D6XdGCgWi0/0ZKJ5iK8W5gILCKdrbDwnR/e7o6n/favLU0o+ntiI4a9PZBZ5bYS0aFNG7r+miGMcWV/AQfODuA== +"@visx/shape@3.5.0", "@visx/shape@^3.5.0": + version "3.5.0" + resolved "https://registry.yarnpkg.com/@visx/shape/-/shape-3.5.0.tgz#fa4bb7a9ed863360be541d75c434503246305e36" + integrity sha512-DP3t9jBQ7dSE3e6ptA1xO4QAIGxO55GrY/6P+S6YREuQGjZgq20TLYLAsiaoPEzFSS4tp0m12ZTPivWhU2VBTw== dependencies: "@types/d3-path" "^1.0.8" "@types/d3-shape" "^1.3.1" "@types/lodash" "^4.14.172" "@types/react" "*" - "@visx/curve" "2.1.0" - "@visx/group" "2.1.0" - "@visx/scale" "2.2.2" + "@visx/curve" "3.3.0" + "@visx/group" "3.3.0" + "@visx/scale" "3.5.0" classnames "^2.3.1" d3-path "^1.0.5" d3-shape "^1.2.0" lodash "^4.17.21" prop-types "^15.5.10" -"@visx/text@2.3.0": - version "2.3.0" - resolved "https://registry.yarnpkg.com/@visx/text/-/text-2.3.0.tgz#34b66a467685cf1db2380a2673e032f2f874919a" - integrity sha512-5mEcmzWZqbziz6Azv+H6BWrnUbnpygAw4SNzBqF+YiGik5gR/USaBRAs9aKjnoUg6qFe3NZWFOcGpR3BzDR/bQ== +"@visx/text@3.3.0": + version "3.3.0" + resolved "https://registry.yarnpkg.com/@visx/text/-/text-3.3.0.tgz#f53366a9c18bc448c6b8869527c0f75c9591e7a7" + integrity sha512-fOimcsf0GtQE9whM5MdA/xIkHMaV29z7qNqNXysUDE8znSMKsN+ott7kSg2ljAEE89CQo3WKHkPNettoVsa84w== dependencies: "@types/lodash" "^4.14.172" "@types/react" "*" @@ -2244,17 +2270,42 @@ prop-types "^15.7.2" reduce-css-calc "^1.3.0" -"@visx/tooltip@^2.1.0": - version "2.2.2" - resolved "https://registry.yarnpkg.com/@visx/tooltip/-/tooltip-2.2.2.tgz#dc6e1c50fb0aaa0ffcb773eb0a5beb25ec89170d" - integrity sha512-wI0t+hE+gp7euuqI8likKBDsx70I+WJ6UJ9YCra8/LyyuVSbOobnLZlqQw1QhIYbdmnDReIckZ0dq3sa6z2qbw== +"@visx/tooltip@^3.3.0": + version "3.3.0" + resolved "https://registry.yarnpkg.com/@visx/tooltip/-/tooltip-3.3.0.tgz#9d5e6199dacd82052678207204a33f028fe15e02" + integrity sha512-0ovbxnvAphEU/RVJprWHdOJT7p3YfBDpwXclXRuhIY2EkH59g8sDHatDcYwiNPeqk61jBh1KACRZxqToMuutlg== dependencies: "@types/react" "*" - "@visx/bounds" "2.1.2" + "@visx/bounds" "3.3.0" classnames "^2.3.1" prop-types "^15.5.10" react-use-measure "^2.0.4" +"@visx/vendor@3.5.0": + version "3.5.0" + resolved "https://registry.yarnpkg.com/@visx/vendor/-/vendor-3.5.0.tgz#a9990382ba759b9c4049be303d65d2cb3ca034a8" + integrity sha512-yt3SEZRVmt36+APsCISSO9eSOtzQkBjt+QRxNRzcTWuzwMAaF3PHCCSe31++kkpgY9yFoF+Gfes1TBe5NlETiQ== + dependencies: + "@types/d3-array" "3.0.3" + "@types/d3-color" "3.1.0" + "@types/d3-delaunay" "6.0.1" + "@types/d3-format" "3.0.1" + "@types/d3-geo" "3.1.0" + "@types/d3-interpolate" "3.0.1" + "@types/d3-scale" "4.0.2" + "@types/d3-time" "3.0.0" + "@types/d3-time-format" "2.1.0" + d3-array "3.2.1" + d3-color "3.1.0" + d3-delaunay "6.0.2" + d3-format "3.1.0" + d3-geo "3.1.0" + d3-interpolate "3.0.1" + d3-scale "4.0.2" + d3-time "3.1.0" + d3-time-format "4.1.0" + internmap "2.0.3" + "@webassemblyjs/ast@1.9.0": version "1.9.0" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964" @@ -4308,12 +4359,19 @@ custom-event@~1.0.0: resolved "https://registry.yarnpkg.com/custom-event/-/custom-event-1.0.1.tgz#5d02a46850adf1b4a317946a3928fccb5bfd0425" integrity sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU= -d3-array@2, d3-array@^2.3.0: - version "2.12.1" - resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-2.12.1.tgz#e20b41aafcdffdf5d50928004ececf815a465e81" - integrity sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ== +"d3-array@2 - 3", "d3-array@2.10.0 - 3", "d3-array@2.5.0 - 3": + version "3.2.4" + resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-3.2.4.tgz#15fec33b237f97ac5d7c986dc77da273a8ed0bb5" + integrity sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg== + dependencies: + internmap "1 - 2" + +d3-array@3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-3.2.1.tgz#39331ea706f5709417d31bbb6ec152e0328b39b3" + integrity sha512-gUY/qeHq/yNqqoCKNq4vtpFLdoCdvyNpWoC/KNjhGbhDuQpAM9sIQQKkXSNpXa9h5KySs/gzm7R88WkUutgwWQ== dependencies: - internmap "^1.0.0" + internmap "1 - 2" d3-array@^1.0.0, d3-array@^1.2.0: version "1.2.4" @@ -4340,11 +4398,18 @@ d3-color@1: resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-2.0.0.tgz#8d625cab42ed9b8f601a1760a389f7ea9189d62e" integrity sha512-SPXi0TSKPD4g9tw0NMZFnR95XVgUZiBH+uUTqQuDu1OsE2zomHU7ho0FISciaPvosimixwHFl3WHLGabv6dDgQ== -d3-color@^3.0.1: +"d3-color@1 - 3", d3-color@3.1.0, d3-color@^3.0.1: version "3.1.0" resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-3.1.0.tgz#395b2833dfac71507f12ac2f7af23bf819de24e2" integrity sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA== +d3-delaunay@6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/d3-delaunay/-/d3-delaunay-6.0.2.tgz#7fd3717ad0eade2fc9939f4260acfb503f984e92" + integrity sha512-IMLNldruDQScrcfT+MWnazhHbDJhcRJyOEBAJfwQnHle1RPh6WDuLvxNArUju2VSMSUuKlY5BGHRJ2cYyoFLQQ== + dependencies: + delaunator "5" + d3-dispatch@1, d3-dispatch@^1.0.5: version "1.0.6" resolved "https://registry.yarnpkg.com/d3-dispatch/-/d3-dispatch-1.0.6.tgz#00d37bcee4dd8cd97729dd893a0ac29caaba5d58" @@ -4368,25 +4433,39 @@ d3-format@1: resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-1.4.5.tgz#374f2ba1320e3717eb74a9356c67daee17a7edb4" integrity sha512-J0piedu6Z8iB6TbIGfZgDzfXxUFN3qQRMofy2oPdXzQibYGqPB/9iMcxr/TGalU+2RsyDO+U4f33id8tbnSRMQ== -"d3-format@1 - 2": - version "2.0.0" - resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-2.0.0.tgz#a10bcc0f986c372b729ba447382413aabf5b0767" - integrity sha512-Ab3S6XuE/Q+flY96HXT0jOXcM4EAClYFnRGY5zsjRGNy6qCYrQsMffs7cV5Q9xejb35zxW5hf/guKw34kvIKsA== +"d3-format@1 - 3", d3-format@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-3.1.0.tgz#9260e23a28ea5cb109e93b21a06e24e2ebd55641" + integrity sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA== + +d3-geo@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/d3-geo/-/d3-geo-3.1.0.tgz#74fd54e1f4cebd5185ac2039217a98d39b0a4c0e" + integrity sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA== + dependencies: + d3-array "2.5.0 - 3" -d3-interpolate@1, d3-interpolate@^1.3.2, d3-interpolate@^1.4.0: +d3-interpolate@1, d3-interpolate@^1.3.2: version "1.4.0" resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-1.4.0.tgz#526e79e2d80daa383f9e0c1c1c7dcc0f0583e987" integrity sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA== dependencies: d3-color "1" -"d3-interpolate@1 - 2", "d3-interpolate@1.2.0 - 2": +"d3-interpolate@1 - 2": version "2.0.1" resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-2.0.1.tgz#98be499cfb8a3b94d4ff616900501a64abc91163" integrity sha512-c5UhwwTs/yybcmTpAVqwSFl6vrQ8JZJoT5F7xNFK9pymv5C0Ymcc9/LIJHtYIggg/yS9YHw8i8O8tgb9pupjeQ== dependencies: d3-color "1 - 2" +"d3-interpolate@1.2.0 - 3", d3-interpolate@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-3.0.1.tgz#3c47aa5b32c5b3dfb56ef3fd4342078a632b400d" + integrity sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g== + dependencies: + d3-color "1 - 3" + d3-path@1, d3-path@^1.0.5: version "1.0.9" resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-1.0.9.tgz#48c050bb1fe8c262493a8caf5524e3e9591701cf" @@ -4400,6 +4479,17 @@ d3-scale-chromatic@^2.0.0: d3-color "1 - 2" d3-interpolate "1 - 2" +d3-scale@4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-4.0.2.tgz#82b38e8e8ff7080764f8dcec77bd4be393689396" + integrity sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ== + dependencies: + d3-array "2.10.0 - 3" + d3-format "1 - 3" + d3-interpolate "1.2.0 - 3" + d3-time "2.1.1 - 3" + d3-time-format "2 - 4" + d3-scale@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-2.2.2.tgz#4e880e0b2745acaaddd3ede26a9e908a9e17b81f" @@ -4412,17 +4502,6 @@ d3-scale@^2.2.2: d3-time "1" d3-time-format "2" -d3-scale@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-3.3.0.tgz#28c600b29f47e5b9cd2df9749c206727966203f3" - integrity sha512-1JGp44NQCt5d1g+Yy+GeOnZP7xHo0ii8zsQp6PGzd+C1/dl0KGsp9A7Mxwp+1D1o4unbTTxVdU/ZOIEBoeZPbQ== - dependencies: - d3-array "^2.3.0" - d3-format "1 - 2" - d3-interpolate "1.2.0 - 2" - d3-time "^2.1.1" - d3-time-format "2 - 3" - d3-selection@1, d3-selection@^1.0.0, d3-selection@^1.1.0: version "1.4.2" resolved "https://registry.yarnpkg.com/d3-selection/-/d3-selection-1.4.2.tgz#dcaa49522c0dbf32d6c1858afc26b6094555bc5c" @@ -4442,24 +4521,24 @@ d3-time-format@2: dependencies: d3-time "1" -"d3-time-format@2 - 3": - version "3.0.0" - resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-3.0.0.tgz#df8056c83659e01f20ac5da5fdeae7c08d5f1bb6" - integrity sha512-UXJh6EKsHBTjopVqZBhFysQcoXSv/5yLONZvkQ5Kk3qbwiUYkdX17Xa1PT6U1ZWXGGfB1ey5L8dKMlFq2DO0Ag== +"d3-time-format@2 - 4", d3-time-format@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-4.1.0.tgz#7ab5257a5041d11ecb4fe70a5c7d16a195bb408a" + integrity sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg== dependencies: - d3-time "1 - 2" + d3-time "1 - 3" d3-time@1: version "1.1.0" resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-1.1.0.tgz#b1e19d307dae9c900b7e5b25ffc5dcc249a8a0f1" integrity sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA== -"d3-time@1 - 2", d3-time@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-2.1.1.tgz#e9d8a8a88691f4548e68ca085e5ff956724a6682" - integrity sha512-/eIQe/eR4kCQwq7yxi7z4c6qEXf2IYGcjoWB5OOQy4Tq9Uv39/947qlDcN2TLkiTzQWzvnsuYPB9TrWaNfipKQ== +"d3-time@1 - 3", "d3-time@2.1.1 - 3", d3-time@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-3.1.0.tgz#9310db56e992e3c0175e1ef385e545e48a9bb5c7" + integrity sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q== dependencies: - d3-array "2" + d3-array "2 - 3" d3-timer@1: version "1.0.10" @@ -4672,6 +4751,13 @@ del@^4.1.1: pify "^4.0.1" rimraf "^2.6.3" +delaunator@5: + version "5.0.1" + resolved "https://registry.yarnpkg.com/delaunator/-/delaunator-5.0.1.tgz#39032b08053923e924d6094fe2cde1a99cc51278" + integrity sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw== + dependencies: + robust-predicates "^3.0.2" + delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" @@ -6900,10 +6986,10 @@ internal-slot@^1.0.3: has "^1.0.3" side-channel "^1.0.4" -internmap@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/internmap/-/internmap-1.0.1.tgz#0017cc8a3b99605f0302f2b198d272e015e5df95" - integrity sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw== +"internmap@1 - 2", internmap@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/internmap/-/internmap-2.0.3.tgz#6685f23755e43c524e251d29cbc97248e3061009" + integrity sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg== interpret@^1.4.0: version "1.4.0" @@ -10549,6 +10635,11 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: hash-base "^3.0.0" inherits "^2.0.1" +robust-predicates@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/robust-predicates/-/robust-predicates-3.0.2.tgz#d5b28528c4824d20fc48df1928d41d9efa1ad771" + integrity sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg== + rollbar@^2.24.0: version "2.24.0" resolved "https://registry.yarnpkg.com/rollbar/-/rollbar-2.24.0.tgz#3e0986ee6600d06d3abd4d85f471bcbc11fafc99" From 7a97c649328af86470ae612f88690b94c9874f95 Mon Sep 17 00:00:00 2001 From: "Peter A. Jonsson" Date: Sun, 31 Mar 2024 18:46:31 +0200 Subject: [PATCH 644/654] Remove leading ./ on imports Most imports do not have this form, and it's not required, so remove it. --- lib/ModelMixins/MinMaxLevelMixin.ts | 4 ++-- lib/ReactViews/Feedback/FeedbackForm.tsx | 2 +- .../StandardUserInterface/TrainerBar/TrainerBar.tsx | 2 +- lib/ReactViews/Tour/TourPortal.jsx | 2 +- lib/ReactViews/Workbench/WorkbenchButton.tsx | 2 +- lib/Styled/Checkbox/Checkbox.tsx | 2 +- test/Core/scaleDenominatorToLevelSpec.ts | 2 +- test/Models/TerriaSpec.ts | 2 +- 8 files changed, 9 insertions(+), 9 deletions(-) diff --git a/lib/ModelMixins/MinMaxLevelMixin.ts b/lib/ModelMixins/MinMaxLevelMixin.ts index a1d714b0d2f..5f3aab59723 100644 --- a/lib/ModelMixins/MinMaxLevelMixin.ts +++ b/lib/ModelMixins/MinMaxLevelMixin.ts @@ -4,9 +4,9 @@ import Request from "terriajs-cesium/Source/Core/Request"; import AbstractConstructor from "../Core/AbstractConstructor"; import isDefined from "../Core/isDefined"; import Model from "../Models/Definition/Model"; -import { scaleDenominatorToLevel } from "./../Core/scaleToDenominator"; +import { scaleDenominatorToLevel } from "../Core/scaleToDenominator"; import CommonStrata from "./../Models/Definition/CommonStrata"; -import { MinMaxLevelTraits } from "./../Traits/TraitsClasses/MinMaxLevelTraits"; +import { MinMaxLevelTraits } from "../Traits/TraitsClasses/MinMaxLevelTraits"; type BaseType = Model; diff --git a/lib/ReactViews/Feedback/FeedbackForm.tsx b/lib/ReactViews/Feedback/FeedbackForm.tsx index a2d05548c13..b8f94162847 100644 --- a/lib/ReactViews/Feedback/FeedbackForm.tsx +++ b/lib/ReactViews/Feedback/FeedbackForm.tsx @@ -17,7 +17,7 @@ import parseCustomMarkdownToReact, { parseCustomMarkdownToReactWithOptions } from "../Custom/parseCustomMarkdownToReact"; import { WithViewState, withViewState } from "../Context"; -import { applyTranslationIfExists } from "./../../Language/languageHelpers"; +import { applyTranslationIfExists } from "../../Language/languageHelpers"; interface IProps extends WithTranslation, WithViewState { theme: DefaultTheme; diff --git a/lib/ReactViews/StandardUserInterface/TrainerBar/TrainerBar.tsx b/lib/ReactViews/StandardUserInterface/TrainerBar/TrainerBar.tsx index 3794c229355..237b4da9112 100644 --- a/lib/ReactViews/StandardUserInterface/TrainerBar/TrainerBar.tsx +++ b/lib/ReactViews/StandardUserInterface/TrainerBar/TrainerBar.tsx @@ -18,7 +18,7 @@ import Spacing from "../../../Styled/Spacing"; import Text, { TextSpan } from "../../../Styled/Text"; import measureElement, { MeasureElementProps } from "../../HOCs/measureElement"; import { WithViewState, withViewState } from "../../Context"; -import { applyTranslationIfExists } from "./../../../Language/languageHelpers"; +import { applyTranslationIfExists } from "../../../Language/languageHelpers"; const StyledHtml: any = require("../../Map/Panels/HelpPanel/StyledHtml").default; diff --git a/lib/ReactViews/Tour/TourPortal.jsx b/lib/ReactViews/Tour/TourPortal.jsx index d7a45815329..83734c87fd4 100644 --- a/lib/ReactViews/Tour/TourPortal.jsx +++ b/lib/ReactViews/Tour/TourPortal.jsx @@ -24,7 +24,7 @@ import Caret from "../Generic/Caret"; import CloseButton from "../Generic/CloseButton"; import { useWindowSize } from "../Hooks/useWindowSize"; import { useViewState } from "../Context"; -import { applyTranslationIfExists } from "./../../Language/languageHelpers"; +import { applyTranslationIfExists } from "../../Language/languageHelpers"; import { calculateLeftPosition, calculateTopPosition, diff --git a/lib/ReactViews/Workbench/WorkbenchButton.tsx b/lib/ReactViews/Workbench/WorkbenchButton.tsx index b7a8fb71a38..cb147cf885e 100644 --- a/lib/ReactViews/Workbench/WorkbenchButton.tsx +++ b/lib/ReactViews/Workbench/WorkbenchButton.tsx @@ -2,7 +2,7 @@ import React from "react"; import styled from "styled-components"; import Box from "../../Styled/Box"; -import { SpacingSpan } from "./../../Styled/Spacing"; +import { SpacingSpan } from "../../Styled/Spacing"; import { TextSpan } from "../../Styled/Text"; import { RawButton } from "../../Styled/Button"; diff --git a/lib/Styled/Checkbox/Checkbox.tsx b/lib/Styled/Checkbox/Checkbox.tsx index 3f1ab8bed19..30cc5a6078b 100644 --- a/lib/Styled/Checkbox/Checkbox.tsx +++ b/lib/Styled/Checkbox/Checkbox.tsx @@ -9,7 +9,7 @@ import React, { } from "react"; import { useUID } from "react-uid"; import { TextSpan } from "../Text"; -import { SpacingSpan } from "./../Spacing"; +import { SpacingSpan } from "../Spacing"; import CheckboxIcon from "./Elements/CheckboxIcon"; import HiddenCheckbox from "./Elements/HiddenCheckbox"; import { ICheckboxProps } from "./types"; diff --git a/test/Core/scaleDenominatorToLevelSpec.ts b/test/Core/scaleDenominatorToLevelSpec.ts index fd2e4f0fa28..83173096217 100644 --- a/test/Core/scaleDenominatorToLevelSpec.ts +++ b/test/Core/scaleDenominatorToLevelSpec.ts @@ -1,4 +1,4 @@ -import { scaleDenominatorToLevel } from "./../../lib/Core/scaleToDenominator"; +import { scaleDenominatorToLevel } from "../../lib/Core/scaleToDenominator"; describe("scaleDenominatorToLevel", () => { it("returns undefined when scale negative", () => { const scale = -1; diff --git a/test/Models/TerriaSpec.ts b/test/Models/TerriaSpec.ts index fd578780854..03c681fb35a 100644 --- a/test/Models/TerriaSpec.ts +++ b/test/Models/TerriaSpec.ts @@ -34,7 +34,7 @@ import ViewerMode from "../../lib/Models/ViewerMode"; import ViewState from "../../lib/ReactViewModels/ViewState"; import { buildShareLink } from "../../lib/ReactViews/Map/Panels/SharePanel/BuildShareLink"; import SimpleCatalogItem from "../Helpers/SimpleCatalogItem"; -import { defaultBaseMaps } from "./../../lib/Models/BaseMaps/defaultBaseMaps"; +import { defaultBaseMaps } from "../../lib/Models/BaseMaps/defaultBaseMaps"; const mapConfigBasicJson = require("../../wwwroot/test/Magda/map-config-basic.json"); const mapConfigBasicString = JSON.stringify(mapConfigBasicJson); From d1ca2946a4dba5ce357c8bda3a66eb91f523c8e3 Mon Sep 17 00:00:00 2001 From: "Peter A. Jonsson" Date: Sun, 31 Mar 2024 18:59:35 +0200 Subject: [PATCH 645/654] Remove unused imports --- lib/Core/loadBlob.ts | 2 -- lib/Core/uriHelpers.ts | 2 -- lib/Map/Leaflet/ImageryProviderLeafletGridLayer.ts | 2 +- lib/Map/Leaflet/ImageryProviderLeafletTileLayer.ts | 1 - lib/ModelMixins/GetCapabilitiesMixin.ts | 2 +- lib/ModelMixins/TimeFilterMixin.ts | 1 - .../Catalog/CatalogGroups/OpenDataSoftCatalogGroup.ts | 1 - lib/Models/Catalog/CatalogItems/ApiTableCatalogItem.ts | 1 - .../Catalog/CatalogItems/CesiumTerrainCatalogItem.ts | 1 - lib/Models/Catalog/CatalogItems/GeoRssCatalogItem.ts | 2 -- .../Catalog/CatalogItems/MapboxVectorTileCatalogItem.ts | 8 +------- lib/Models/Catalog/CatalogItems/ShapefileCatalogItem.ts | 1 - .../Catalog/CatalogItems/SocrataMapViewCatalogItem.ts | 1 - .../Catalog/CatalogReferences/ThreddsItemReference.ts | 1 - .../Catalog/Esri/ArcGisFeatureServerCatalogGroup.ts | 2 +- lib/Models/Catalog/Esri/ArcGisFeatureServerCatalogItem.ts | 2 -- lib/Models/Catalog/Ows/WebFeatureServiceCatalogGroup.ts | 2 +- lib/Models/Catalog/Ows/WebMapServiceCapabilities.ts | 2 +- lib/Models/Catalog/Ows/WebMapTileServiceCatalogGroup.ts | 2 +- .../Catalog/Ows/WebProcessingServiceCapabilities.ts | 2 +- .../Catalog/Ows/WebProcessingServiceCatalogFunctionJob.ts | 2 +- .../Catalog/Ows/WebProcessingServiceCatalogGroup.ts | 1 - lib/Models/Catalog/SdmxJson/SdmxJsonServerStratum.ts | 2 -- lib/Models/ItemSearchProviders/ItemSearchProvider.ts | 2 -- .../SearchProviders/upsertSearchProviderFromJson.ts | 1 - lib/Models/Workflows/TableStylingWorkflow.ts | 3 +-- lib/ReactViews/Custom/FeedbackLinkCustomComponent.tsx | 2 +- lib/ReactViews/Custom/parseCustomHtmlToReact.ts | 1 - lib/ReactViews/Errors/RaiseToUserErrorBoundary.tsx | 2 +- lib/ReactViews/ExplorerWindow/ExplorerWindow.tsx | 1 - lib/ReactViews/FeatureInfo/FeatureInfoPanel.tsx | 2 -- lib/ReactViews/FeatureInfo/FeatureInfoSection.tsx | 2 +- lib/ReactViews/Map/BottomBar/DistanceLegend.tsx | 2 +- .../Map/Panels/SharePanel/ShareUrl/ShareUrlWarning.tsx | 1 - lib/ReactViews/Map/Panels/ToolsPanel/CountDatasets.tsx | 3 +-- lib/ReactViews/Notification/MapInteractionWindow.tsx | 1 - lib/ReactViews/Preview/ExportData.tsx | 1 - lib/ReactViews/Story/StoryPanel/StoryButtons.tsx | 3 +-- .../Tools/PedestrianMode/DropPedestrianToGround.tsx | 1 - lib/ReactViews/Workbench/Controls/ViewingControls.tsx | 5 +---- lib/ReactViews/Workbench/PositionRightOfWorkbench.tsx | 2 +- lib/Table/createLongitudeLatitudeFeaturePerId.ts | 1 - .../TraitsClasses/ArcGisMapServerCatalogGroupTraits.ts | 2 -- lib/Traits/TraitsClasses/ArcGisPortalSharedTraits.ts | 2 -- lib/Traits/TraitsClasses/CkanSharedTraits.ts | 2 -- lib/Traits/TraitsClasses/CswCatalogGroupTraits.ts | 4 +--- .../TraitsClasses/WebMapServiceCatalogGroupTraits.ts | 2 -- .../WebProcessingServiceCatalogGroupTraits.ts | 2 -- .../Catalog/CatalogItems/CompositeCatalogItemSpec.ts | 1 - .../Catalog/Ows/WebFeatureServiceCatalogItemSpec.ts | 1 - test/Models/Catalog/Ows/WebMapServiceCatalogGroupSpec.ts | 1 - .../Ows/WebProcessingServiceCatalogFunctionSpec.ts | 2 +- test/Models/Catalog/allCatalogModelsSpec.ts | 1 - .../Models/Catalog/esri/ArcGisPortalCatatalogGroupSpec.ts | 3 --- test/Models/Catalog/esri/ArcGisPortalReferenceItemSpec.ts | 2 -- test/Models/SelectableDimensionSpec.ts | 2 +- test/ReactViews/Custom/Chart/BottomDockChartSpec.tsx | 6 +----- test/ReactViews/DimensionSelectorSectionSpec.tsx | 1 - test/ReactViews/ShortReportSpec.tsx | 1 - test/Traits/UrlTraitsSpec.ts | 1 - 60 files changed, 22 insertions(+), 93 deletions(-) diff --git a/lib/Core/loadBlob.ts b/lib/Core/loadBlob.ts index 78af432d1be..9a87f8037f8 100644 --- a/lib/Core/loadBlob.ts +++ b/lib/Core/loadBlob.ts @@ -1,9 +1,7 @@ import Resource from "terriajs-cesium/Source/Core/Resource"; import JsonValue from "./Json"; import loadJson from "./loadJson"; -import URI from "urijs"; import { - configure as zipConfigure, ZipReader, BlobReader as ZipBlobReader, Data64URIWriter as ZipData64URIWriter, diff --git a/lib/Core/uriHelpers.ts b/lib/Core/uriHelpers.ts index 9de5d7c4e94..5b74bccfeab 100644 --- a/lib/Core/uriHelpers.ts +++ b/lib/Core/uriHelpers.ts @@ -1,5 +1,3 @@ -import URI from "urijs"; - export const getUriWithoutPath = (anyUri: uri.URI) => { if (!anyUri) { return undefined; diff --git a/lib/Map/Leaflet/ImageryProviderLeafletGridLayer.ts b/lib/Map/Leaflet/ImageryProviderLeafletGridLayer.ts index da240ae16b1..46cfbe69bbc 100644 --- a/lib/Map/Leaflet/ImageryProviderLeafletGridLayer.ts +++ b/lib/Map/Leaflet/ImageryProviderLeafletGridLayer.ts @@ -1,4 +1,4 @@ -import L, { TileEvent } from "leaflet"; +import L from "leaflet"; import { autorun, computed, diff --git a/lib/Map/Leaflet/ImageryProviderLeafletTileLayer.ts b/lib/Map/Leaflet/ImageryProviderLeafletTileLayer.ts index 0795a418179..2927d091c29 100644 --- a/lib/Map/Leaflet/ImageryProviderLeafletTileLayer.ts +++ b/lib/Map/Leaflet/ImageryProviderLeafletTileLayer.ts @@ -19,7 +19,6 @@ import ImageryLayerFeatureInfo from "terriajs-cesium/Source/Scene/ImageryLayerFe import ImageryProvider from "terriajs-cesium/Source/Scene/ImageryProvider"; import SplitDirection from "terriajs-cesium/Source/Scene/SplitDirection"; import isDefined from "../../Core/isDefined"; -import pollToPromise from "../../Core/pollToPromise"; import TerriaError from "../../Core/TerriaError"; import Leaflet from "../../Models/Leaflet"; import getUrlForImageryTile from "../ImageryProvider/getUrlForImageryTile"; diff --git a/lib/ModelMixins/GetCapabilitiesMixin.ts b/lib/ModelMixins/GetCapabilitiesMixin.ts index 13e81b4a725..5e9d011e20c 100644 --- a/lib/ModelMixins/GetCapabilitiesMixin.ts +++ b/lib/ModelMixins/GetCapabilitiesMixin.ts @@ -1,4 +1,4 @@ -import { computed, makeObservable, override } from "mobx"; +import { makeObservable, override } from "mobx"; import AbstractConstructor from "../Core/AbstractConstructor"; import Model from "../Models/Definition/Model"; import StratumOrder from "../Models/Definition/StratumOrder"; diff --git a/lib/ModelMixins/TimeFilterMixin.ts b/lib/ModelMixins/TimeFilterMixin.ts index 05a26dbd09f..99e3414a2f5 100644 --- a/lib/ModelMixins/TimeFilterMixin.ts +++ b/lib/ModelMixins/TimeFilterMixin.ts @@ -30,7 +30,6 @@ import TimeFilterTraits, { } from "../Traits/TraitsClasses/TimeFilterTraits"; import DiscretelyTimeVaryingMixin from "./DiscretelyTimeVaryingMixin"; import MappableMixin, { ImageryParts } from "./MappableMixin"; -import TimeVarying from "./TimeVarying"; type BaseType = Model & MappableMixin.Instance; diff --git a/lib/Models/Catalog/CatalogGroups/OpenDataSoftCatalogGroup.ts b/lib/Models/Catalog/CatalogGroups/OpenDataSoftCatalogGroup.ts index a0f70491fce..cee6a7c3be2 100644 --- a/lib/Models/Catalog/CatalogGroups/OpenDataSoftCatalogGroup.ts +++ b/lib/Models/Catalog/CatalogGroups/OpenDataSoftCatalogGroup.ts @@ -3,7 +3,6 @@ import { Dataset, Facet } from "@opendatasoft/api-client/dist/client/types"; import i18next from "i18next"; import { action, computed, runInAction, makeObservable } from "mobx"; import URI from "urijs"; -import filterOutUndefined from "../../../Core/filterOutUndefined"; import isDefined from "../../../Core/isDefined"; import runLater from "../../../Core/runLater"; import CatalogMemberMixin from "../../../ModelMixins/CatalogMemberMixin"; diff --git a/lib/Models/Catalog/CatalogItems/ApiTableCatalogItem.ts b/lib/Models/Catalog/CatalogItems/ApiTableCatalogItem.ts index 1ff89b2e465..0da084f15f6 100644 --- a/lib/Models/Catalog/CatalogItems/ApiTableCatalogItem.ts +++ b/lib/Models/Catalog/CatalogItems/ApiTableCatalogItem.ts @@ -5,7 +5,6 @@ import URI from "urijs"; import isDefined from "../../../Core/isDefined"; import loadJson from "../../../Core/loadJson"; import AutoRefreshingMixin from "../../../ModelMixins/AutoRefreshingMixin"; -import CatalogMemberMixin from "../../../ModelMixins/CatalogMemberMixin"; import TableMixin from "../../../ModelMixins/TableMixin"; import TableAutomaticStylesStratum from "../../../Table/TableAutomaticStylesStratum"; import ApiRequestTraits from "../../../Traits/TraitsClasses/ApiRequestTraits"; diff --git a/lib/Models/Catalog/CatalogItems/CesiumTerrainCatalogItem.ts b/lib/Models/Catalog/CatalogItems/CesiumTerrainCatalogItem.ts index d69418c7f6c..43d0844a962 100644 --- a/lib/Models/Catalog/CatalogItems/CesiumTerrainCatalogItem.ts +++ b/lib/Models/Catalog/CatalogItems/CesiumTerrainCatalogItem.ts @@ -7,7 +7,6 @@ import { } from "mobx"; import CesiumTerrainProvider from "terriajs-cesium/Source/Core/CesiumTerrainProvider"; import IonResource from "terriajs-cesium/Source/Core/IonResource"; -import TerriaError from "../../../Core/TerriaError"; import CatalogMemberMixin from "../../../ModelMixins/CatalogMemberMixin"; import MappableMixin from "../../../ModelMixins/MappableMixin"; import UrlMixin from "../../../ModelMixins/UrlMixin"; diff --git a/lib/Models/Catalog/CatalogItems/GeoRssCatalogItem.ts b/lib/Models/Catalog/CatalogItems/GeoRssCatalogItem.ts index e570aacc52d..911453b3353 100644 --- a/lib/Models/Catalog/CatalogItems/GeoRssCatalogItem.ts +++ b/lib/Models/Catalog/CatalogItems/GeoRssCatalogItem.ts @@ -12,9 +12,7 @@ import { geoRss2ToGeoJson, geoRssAtomToGeoJson } from "../../../Map/Vector/geoRssConvertor"; -import CatalogMemberMixin from "../../../ModelMixins/CatalogMemberMixin"; import GeoJsonMixin from "../../../ModelMixins/GeojsonMixin"; -import UrlMixin from "../../../ModelMixins/UrlMixin"; import { InfoSectionTraits } from "../../../Traits/TraitsClasses/CatalogMemberTraits"; import GeoRssCatalogItemTraits from "../../../Traits/TraitsClasses/GeoRssCatalogItemTraits"; import CreateModel from "../../Definition/CreateModel"; diff --git a/lib/Models/Catalog/CatalogItems/MapboxVectorTileCatalogItem.ts b/lib/Models/Catalog/CatalogItems/MapboxVectorTileCatalogItem.ts index f7101dd88af..b2c44695642 100644 --- a/lib/Models/Catalog/CatalogItems/MapboxVectorTileCatalogItem.ts +++ b/lib/Models/Catalog/CatalogItems/MapboxVectorTileCatalogItem.ts @@ -1,12 +1,6 @@ import bbox from "@turf/bbox"; import i18next from "i18next"; -import { - computed, - observable, - runInAction, - makeObservable, - override -} from "mobx"; +import { computed, runInAction, makeObservable, override } from "mobx"; import { GeomType, json_style, diff --git a/lib/Models/Catalog/CatalogItems/ShapefileCatalogItem.ts b/lib/Models/Catalog/CatalogItems/ShapefileCatalogItem.ts index bf031acb262..4888f8b913d 100644 --- a/lib/Models/Catalog/CatalogItems/ShapefileCatalogItem.ts +++ b/lib/Models/Catalog/CatalogItems/ShapefileCatalogItem.ts @@ -6,7 +6,6 @@ import isDefined from "../../../Core/isDefined"; import JsonValue, { isJsonObject, JsonArray } from "../../../Core/Json"; import loadBlob, { isZip } from "../../../Core/loadBlob"; import TerriaError from "../../../Core/TerriaError"; -import CatalogMemberMixin from "../../../ModelMixins/CatalogMemberMixin"; import GeoJsonMixin, { FeatureCollectionWithCrs } from "../../../ModelMixins/GeojsonMixin"; diff --git a/lib/Models/Catalog/CatalogItems/SocrataMapViewCatalogItem.ts b/lib/Models/Catalog/CatalogItems/SocrataMapViewCatalogItem.ts index d969edf0085..0335337e8d9 100644 --- a/lib/Models/Catalog/CatalogItems/SocrataMapViewCatalogItem.ts +++ b/lib/Models/Catalog/CatalogItems/SocrataMapViewCatalogItem.ts @@ -1,7 +1,6 @@ import { computed, runInAction, makeObservable } from "mobx"; import loadJson from "../../../Core/loadJson"; import TerriaError from "../../../Core/TerriaError"; -import CatalogMemberMixin from "../../../ModelMixins/CatalogMemberMixin"; import GeoJsonMixin, { toFeatureCollection } from "../../../ModelMixins/GeojsonMixin"; diff --git a/lib/Models/Catalog/CatalogReferences/ThreddsItemReference.ts b/lib/Models/Catalog/CatalogReferences/ThreddsItemReference.ts index dd0a05e0623..08f0a71685c 100644 --- a/lib/Models/Catalog/CatalogReferences/ThreddsItemReference.ts +++ b/lib/Models/Catalog/CatalogReferences/ThreddsItemReference.ts @@ -8,7 +8,6 @@ import ThreddsCatalogGroup, { ThreddsDataset } from "../CatalogGroups/ThreddsCatalogGroup"; import CatalogMemberFactory from "../CatalogMemberFactory"; -import CommonStrata from "../../Definition/CommonStrata"; import CreateModel from "../../Definition/CreateModel"; import LoadableStratum from "../../Definition/LoadableStratum"; import { BaseModel } from "../../Definition/Model"; diff --git a/lib/Models/Catalog/Esri/ArcGisFeatureServerCatalogGroup.ts b/lib/Models/Catalog/Esri/ArcGisFeatureServerCatalogGroup.ts index 908790afef0..fe8f731e409 100644 --- a/lib/Models/Catalog/Esri/ArcGisFeatureServerCatalogGroup.ts +++ b/lib/Models/Catalog/Esri/ArcGisFeatureServerCatalogGroup.ts @@ -6,7 +6,7 @@ import isDefined from "../../../Core/isDefined"; import loadJson from "../../../Core/loadJson"; import replaceUnderscores from "../../../Core/replaceUnderscores"; import runLater from "../../../Core/runLater"; -import TerriaError, { networkRequestError } from "../../../Core/TerriaError"; +import { networkRequestError } from "../../../Core/TerriaError"; import CatalogMemberMixin from "../../../ModelMixins/CatalogMemberMixin"; import GroupMixin from "../../../ModelMixins/GroupMixin"; import UrlMixin from "../../../ModelMixins/UrlMixin"; diff --git a/lib/Models/Catalog/Esri/ArcGisFeatureServerCatalogItem.ts b/lib/Models/Catalog/Esri/ArcGisFeatureServerCatalogItem.ts index b065177ef6e..c01282c3eb5 100644 --- a/lib/Models/Catalog/Esri/ArcGisFeatureServerCatalogItem.ts +++ b/lib/Models/Catalog/Esri/ArcGisFeatureServerCatalogItem.ts @@ -9,11 +9,9 @@ import replaceUnderscores from "../../../Core/replaceUnderscores"; import { networkRequestError } from "../../../Core/TerriaError"; import featureDataToGeoJson from "../../../Map/PickedFeatures/featureDataToGeoJson"; import proj4definitions from "../../../Map/Vector/Proj4Definitions"; -import CatalogMemberMixin from "../../../ModelMixins/CatalogMemberMixin"; import GeoJsonMixin, { FeatureCollectionWithCrs } from "../../../ModelMixins/GeojsonMixin"; -import UrlMixin from "../../../ModelMixins/UrlMixin"; import ArcGisFeatureServerCatalogItemTraits from "../../../Traits/TraitsClasses/ArcGisFeatureServerCatalogItemTraits"; import { InfoSectionTraits } from "../../../Traits/TraitsClasses/CatalogMemberTraits"; import { RectangleTraits } from "../../../Traits/TraitsClasses/MappableTraits"; diff --git a/lib/Models/Catalog/Ows/WebFeatureServiceCatalogGroup.ts b/lib/Models/Catalog/Ows/WebFeatureServiceCatalogGroup.ts index 7c86f4ca3a0..25b97e39445 100644 --- a/lib/Models/Catalog/Ows/WebFeatureServiceCatalogGroup.ts +++ b/lib/Models/Catalog/Ows/WebFeatureServiceCatalogGroup.ts @@ -5,7 +5,7 @@ import filterOutUndefined from "../../../Core/filterOutUndefined"; import isDefined from "../../../Core/isDefined"; import replaceUnderscores from "../../../Core/replaceUnderscores"; import runLater from "../../../Core/runLater"; -import TerriaError, { networkRequestError } from "../../../Core/TerriaError"; +import { networkRequestError } from "../../../Core/TerriaError"; import CatalogMemberMixin from "../../../ModelMixins/CatalogMemberMixin"; import GetCapabilitiesMixin from "../../../ModelMixins/GetCapabilitiesMixin"; import GroupMixin from "../../../ModelMixins/GroupMixin"; diff --git a/lib/Models/Catalog/Ows/WebMapServiceCapabilities.ts b/lib/Models/Catalog/Ows/WebMapServiceCapabilities.ts index 205245d6d2e..1c567135c27 100644 --- a/lib/Models/Catalog/Ows/WebMapServiceCapabilities.ts +++ b/lib/Models/Catalog/Ows/WebMapServiceCapabilities.ts @@ -2,7 +2,7 @@ import { createTransformer } from "mobx-utils"; import defined from "terriajs-cesium/Source/Core/defined"; import isReadOnlyArray from "../../../Core/isReadOnlyArray"; import loadXML from "../../../Core/loadXML"; -import TerriaError, { networkRequestError } from "../../../Core/TerriaError"; +import { networkRequestError } from "../../../Core/TerriaError"; import xml2json from "../../../ThirdParty/xml2json"; import { RectangleTraits } from "../../../Traits/TraitsClasses/MappableTraits"; import { diff --git a/lib/Models/Catalog/Ows/WebMapTileServiceCatalogGroup.ts b/lib/Models/Catalog/Ows/WebMapTileServiceCatalogGroup.ts index 4e662d32503..5a87ae1cabd 100644 --- a/lib/Models/Catalog/Ows/WebMapTileServiceCatalogGroup.ts +++ b/lib/Models/Catalog/Ows/WebMapTileServiceCatalogGroup.ts @@ -5,7 +5,7 @@ import filterOutUndefined from "../../../Core/filterOutUndefined"; import isDefined from "../../../Core/isDefined"; import replaceUnderscores from "../../../Core/replaceUnderscores"; import runLater from "../../../Core/runLater"; -import TerriaError, { networkRequestError } from "../../../Core/TerriaError"; +import { networkRequestError } from "../../../Core/TerriaError"; import CatalogMemberMixin from "../../../ModelMixins/CatalogMemberMixin"; import GetCapabilitiesMixin from "../../../ModelMixins/GetCapabilitiesMixin"; import GroupMixin from "../../../ModelMixins/GroupMixin"; diff --git a/lib/Models/Catalog/Ows/WebProcessingServiceCapabilities.ts b/lib/Models/Catalog/Ows/WebProcessingServiceCapabilities.ts index f3c3e3d6d78..0f30e1e2bda 100644 --- a/lib/Models/Catalog/Ows/WebProcessingServiceCapabilities.ts +++ b/lib/Models/Catalog/Ows/WebProcessingServiceCapabilities.ts @@ -2,7 +2,7 @@ import i18next from "i18next"; import filterOutUndefined from "../../../Core/filterOutUndefined"; import { isJsonObject, isJsonString } from "../../../Core/Json"; import loadXML from "../../../Core/loadXML"; -import TerriaError, { networkRequestError } from "../../../Core/TerriaError"; +import { networkRequestError } from "../../../Core/TerriaError"; import xml2json from "../../../ThirdParty/xml2json"; import { OnlineResource, diff --git a/lib/Models/Catalog/Ows/WebProcessingServiceCatalogFunctionJob.ts b/lib/Models/Catalog/Ows/WebProcessingServiceCatalogFunctionJob.ts index 95a7aab7e0e..c3eafa7feca 100644 --- a/lib/Models/Catalog/Ows/WebProcessingServiceCatalogFunctionJob.ts +++ b/lib/Models/Catalog/Ows/WebProcessingServiceCatalogFunctionJob.ts @@ -12,7 +12,7 @@ import { import Mustache from "mustache"; import URI from "urijs"; import isDefined from "../../../Core/isDefined"; -import { JsonObject, isJsonObject } from "../../../Core/Json"; +import { JsonObject } from "../../../Core/Json"; import TerriaError from "../../../Core/TerriaError"; import CatalogFunctionJobMixin from "../../../ModelMixins/CatalogFunctionJobMixin"; import CatalogMemberMixin from "../../../ModelMixins/CatalogMemberMixin"; diff --git a/lib/Models/Catalog/Ows/WebProcessingServiceCatalogGroup.ts b/lib/Models/Catalog/Ows/WebProcessingServiceCatalogGroup.ts index f1d6d108708..fb7046ff48a 100644 --- a/lib/Models/Catalog/Ows/WebProcessingServiceCatalogGroup.ts +++ b/lib/Models/Catalog/Ows/WebProcessingServiceCatalogGroup.ts @@ -2,7 +2,6 @@ import i18next from "i18next"; import { action, computed, runInAction, makeObservable } from "mobx"; import URI from "urijs"; import filterOutUndefined from "../../../Core/filterOutUndefined"; -import { isJsonObject } from "../../../Core/Json"; import replaceUnderscores from "../../../Core/replaceUnderscores"; import runLater from "../../../Core/runLater"; import TerriaError from "../../../Core/TerriaError"; diff --git a/lib/Models/Catalog/SdmxJson/SdmxJsonServerStratum.ts b/lib/Models/Catalog/SdmxJson/SdmxJsonServerStratum.ts index 60c71080ad4..72a1dd06a51 100644 --- a/lib/Models/Catalog/SdmxJson/SdmxJsonServerStratum.ts +++ b/lib/Models/Catalog/SdmxJson/SdmxJsonServerStratum.ts @@ -7,12 +7,10 @@ import flatten from "../../../Core/flatten"; import isDefined from "../../../Core/isDefined"; import { regexMatches } from "../../../Core/regexMatches"; import TerriaError from "../../../Core/TerriaError"; -import { InfoSectionTraits } from "../../../Traits/TraitsClasses/CatalogMemberTraits"; import ModelReference from "../../../Traits/ModelReference"; import SdmxCatalogGroupTraits from "../../../Traits/TraitsClasses/SdmxCatalogGroupTraits"; import CatalogGroup from "../CatalogGroup"; import CommonStrata from "../../Definition/CommonStrata"; -import createStratumInstance from "../../Definition/createStratumInstance"; import LoadableStratum from "../../Definition/LoadableStratum"; import { BaseModel } from "../../Definition/Model"; import proxyCatalogItemUrl from "../proxyCatalogItemUrl"; diff --git a/lib/Models/ItemSearchProviders/ItemSearchProvider.ts b/lib/Models/ItemSearchProviders/ItemSearchProvider.ts index 876ae438315..551fd3f8224 100644 --- a/lib/Models/ItemSearchProviders/ItemSearchProvider.ts +++ b/lib/Models/ItemSearchProviders/ItemSearchProvider.ts @@ -1,5 +1,3 @@ -import BoundingSphere from "terriajs-cesium/Source/Core/BoundingSphere"; -import Cartographic from "terriajs-cesium/Source/Core/Cartographic"; import { SearchParameterTraits } from "../../Traits/TraitsClasses/SearchableItemTraits"; export type ItemSearchParameter = diff --git a/lib/Models/SearchProviders/upsertSearchProviderFromJson.ts b/lib/Models/SearchProviders/upsertSearchProviderFromJson.ts index 81c863b1ad0..5395fb3dc2a 100644 --- a/lib/Models/SearchProviders/upsertSearchProviderFromJson.ts +++ b/lib/Models/SearchProviders/upsertSearchProviderFromJson.ts @@ -3,7 +3,6 @@ import { runInAction } from "mobx"; import Result from "../../Core/Result"; import TerriaError from "../../Core/TerriaError"; import { applyTranslationIfExists } from "../../Language/languageHelpers"; -import SearchProviderMixin from "../../ModelMixins/SearchProviders/SearchProviderMixin"; import CommonStrata from "../Definition/CommonStrata"; import { BaseModel } from "../Definition/Model"; import updateModelFromJson from "../Definition/updateModelFromJson"; diff --git a/lib/Models/Workflows/TableStylingWorkflow.ts b/lib/Models/Workflows/TableStylingWorkflow.ts index c39f32b8f3d..b22de17baf5 100644 --- a/lib/Models/Workflows/TableStylingWorkflow.ts +++ b/lib/Models/Workflows/TableStylingWorkflow.ts @@ -6,8 +6,7 @@ import { ObservableMap, reaction, runInAction, - makeObservable, - override + makeObservable } from "mobx"; import filterOutUndefined from "../../Core/filterOutUndefined"; import isDefined from "../../Core/isDefined"; diff --git a/lib/ReactViews/Custom/FeedbackLinkCustomComponent.tsx b/lib/ReactViews/Custom/FeedbackLinkCustomComponent.tsx index dfab28beef4..8fb74270d6b 100644 --- a/lib/ReactViews/Custom/FeedbackLinkCustomComponent.tsx +++ b/lib/ReactViews/Custom/FeedbackLinkCustomComponent.tsx @@ -1,6 +1,6 @@ import i18next from "i18next"; import { runInAction } from "mobx"; -import React, { ReactElement, ReactNode } from "react"; +import React, { ReactElement } from "react"; import ViewState from "../../ReactViewModels/ViewState"; import { RawButton } from "../../Styled/Button"; import Text from "../../Styled/Text"; diff --git a/lib/ReactViews/Custom/parseCustomHtmlToReact.ts b/lib/ReactViews/Custom/parseCustomHtmlToReact.ts index 3d89d755817..5522d57854f 100644 --- a/lib/ReactViews/Custom/parseCustomHtmlToReact.ts +++ b/lib/ReactViews/Custom/parseCustomHtmlToReact.ts @@ -6,7 +6,6 @@ import React, { DetailedReactHTMLElement, ReactElement } from "react"; -import styled from "styled-components"; import CustomComponent, { DomElement, ProcessNodeContext diff --git a/lib/ReactViews/Errors/RaiseToUserErrorBoundary.tsx b/lib/ReactViews/Errors/RaiseToUserErrorBoundary.tsx index a5a1fef7825..595f8a9febc 100644 --- a/lib/ReactViews/Errors/RaiseToUserErrorBoundary.tsx +++ b/lib/ReactViews/Errors/RaiseToUserErrorBoundary.tsx @@ -1,5 +1,5 @@ import React, { ErrorInfo } from "react"; -import TerriaError, { TerriaErrorOverrides } from "../../Core/TerriaError"; +import { TerriaErrorOverrides } from "../../Core/TerriaError"; import ViewState from "../../ReactViewModels/ViewState"; type PropsType = { diff --git a/lib/ReactViews/ExplorerWindow/ExplorerWindow.tsx b/lib/ReactViews/ExplorerWindow/ExplorerWindow.tsx index 5ed52578fe7..5be207e331c 100644 --- a/lib/ReactViews/ExplorerWindow/ExplorerWindow.tsx +++ b/lib/ReactViews/ExplorerWindow/ExplorerWindow.tsx @@ -1,7 +1,6 @@ import { action } from "mobx"; import { observer } from "mobx-react"; import React from "react"; -import ViewState from "../../ReactViewModels/ViewState"; import { useViewState } from "../Context"; import ModalPopup from "./ModalPopup"; import Tabs from "./Tabs"; diff --git a/lib/ReactViews/FeatureInfo/FeatureInfoPanel.tsx b/lib/ReactViews/FeatureInfo/FeatureInfoPanel.tsx index 209fc355a06..2893bbaa00d 100644 --- a/lib/ReactViews/FeatureInfo/FeatureInfoPanel.tsx +++ b/lib/ReactViews/FeatureInfo/FeatureInfoPanel.tsx @@ -7,7 +7,6 @@ import { withTranslation } from "react-i18next"; import Cartesian3 from "terriajs-cesium/Source/Core/Cartesian3"; import Ellipsoid from "terriajs-cesium/Source/Core/Ellipsoid"; import CesiumMath from "terriajs-cesium/Source/Core/Math"; -import DataSource from "terriajs-cesium/Source/DataSources/DataSource"; import Entity from "terriajs-cesium/Source/DataSources/Entity"; import flatten from "../../Core/flatten"; import isDefined from "../../Core/isDefined"; @@ -21,7 +20,6 @@ import TerriaFeature from "../../Models/Feature/Feature"; import { addMarker, isMarkerVisible, - LOCATION_MARKER_DATA_SOURCE_NAME, removeMarker } from "../../Models/LocationMarkerUtils"; import Terria from "../../Models/Terria"; diff --git a/lib/ReactViews/FeatureInfo/FeatureInfoSection.tsx b/lib/ReactViews/FeatureInfo/FeatureInfoSection.tsx index 8275e8fec9c..a76aeb8725b 100644 --- a/lib/ReactViews/FeatureInfo/FeatureInfoSection.tsx +++ b/lib/ReactViews/FeatureInfo/FeatureInfoSection.tsx @@ -12,7 +12,7 @@ import { import { observer } from "mobx-react"; import { IDisposer } from "mobx-utils"; import Mustache from "mustache"; -import React, { Ref } from "react"; +import React from "react"; import { withTranslation } from "react-i18next"; import styled from "styled-components"; import Cartesian3 from "terriajs-cesium/Source/Core/Cartesian3"; diff --git a/lib/ReactViews/Map/BottomBar/DistanceLegend.tsx b/lib/ReactViews/Map/BottomBar/DistanceLegend.tsx index eb17467a7d8..5d0091be82b 100644 --- a/lib/ReactViews/Map/BottomBar/DistanceLegend.tsx +++ b/lib/ReactViews/Map/BottomBar/DistanceLegend.tsx @@ -2,7 +2,7 @@ import L from "leaflet"; import { runInAction } from "mobx"; import { observer } from "mobx-react"; -import React, { FC, useEffect, useState, memo } from "react"; +import React, { FC, useEffect, useState } from "react"; import { useTheme } from "styled-components"; import Cartesian2 from "terriajs-cesium/Source/Core/Cartesian2"; import EllipsoidGeodesic from "terriajs-cesium/Source/Core/EllipsoidGeodesic"; diff --git a/lib/ReactViews/Map/Panels/SharePanel/ShareUrl/ShareUrlWarning.tsx b/lib/ReactViews/Map/Panels/SharePanel/ShareUrl/ShareUrlWarning.tsx index d7176346d45..4cc0199d510 100644 --- a/lib/ReactViews/Map/Panels/SharePanel/ShareUrl/ShareUrlWarning.tsx +++ b/lib/ReactViews/Map/Panels/SharePanel/ShareUrl/ShareUrlWarning.tsx @@ -1,7 +1,6 @@ import React, { FC } from "react"; import { Trans, useTranslation } from "react-i18next"; import styled from "styled-components"; -import { reaction } from "mobx"; import { observer } from "mobx-react"; import { getName } from "../../../../../ModelMixins/CatalogMemberMixin"; diff --git a/lib/ReactViews/Map/Panels/ToolsPanel/CountDatasets.tsx b/lib/ReactViews/Map/Panels/ToolsPanel/CountDatasets.tsx index 0bd4fccf3d8..e2e8e8d3e98 100644 --- a/lib/ReactViews/Map/Panels/ToolsPanel/CountDatasets.tsx +++ b/lib/ReactViews/Map/Panels/ToolsPanel/CountDatasets.tsx @@ -2,8 +2,7 @@ import { observer } from "mobx-react"; import React, { useState } from "react"; -import { useTranslation, withTranslation } from "react-i18next"; -import defined from "terriajs-cesium/Source/Core/defined"; +import { useTranslation } from "react-i18next"; import { applyTranslationIfExists, TRANSLATE_KEY_PREFIX diff --git a/lib/ReactViews/Notification/MapInteractionWindow.tsx b/lib/ReactViews/Notification/MapInteractionWindow.tsx index 4c476613ab8..8c3d2ede0a1 100644 --- a/lib/ReactViews/Notification/MapInteractionWindow.tsx +++ b/lib/ReactViews/Notification/MapInteractionWindow.tsx @@ -3,7 +3,6 @@ import classNames from "classnames"; import { Lambda, observable, reaction, makeObservable } from "mobx"; import { observer } from "mobx-react"; -import PropTypes from "prop-types"; import React from "react"; import styled from "styled-components"; import isDefined from "../../Core/isDefined"; diff --git a/lib/ReactViews/Preview/ExportData.tsx b/lib/ReactViews/Preview/ExportData.tsx index be7f2913bfa..334992b5259 100644 --- a/lib/ReactViews/Preview/ExportData.tsx +++ b/lib/ReactViews/Preview/ExportData.tsx @@ -5,7 +5,6 @@ import { withTranslation, WithTranslation } from "react-i18next"; import Styles from "./mappable-preview.scss"; import { observer } from "mobx-react"; -import TerriaError from "../../Core/TerriaError"; import isDefined from "../../Core/isDefined"; import ExportableMixin from "../../ModelMixins/ExportableMixin"; const FileSaver = require("file-saver"); diff --git a/lib/ReactViews/Story/StoryPanel/StoryButtons.tsx b/lib/ReactViews/Story/StoryPanel/StoryButtons.tsx index 8fdb0126d76..cc8d11836f8 100644 --- a/lib/ReactViews/Story/StoryPanel/StoryButtons.tsx +++ b/lib/ReactViews/Story/StoryPanel/StoryButtons.tsx @@ -1,9 +1,8 @@ import React from "react"; import { useTranslation } from "react-i18next"; import styled, { useTheme } from "styled-components"; -import Button, { RawButton } from "../../../Styled/Button"; +import { RawButton } from "../../../Styled/Button"; import Icon, { StyledIcon } from "../../../Styled/Icon"; -import Styles from "../story-panel.scss"; interface BtnProp { onClick: () => void; diff --git a/lib/ReactViews/Tools/PedestrianMode/DropPedestrianToGround.tsx b/lib/ReactViews/Tools/PedestrianMode/DropPedestrianToGround.tsx index 7564058e3b3..19a00f9447c 100644 --- a/lib/ReactViews/Tools/PedestrianMode/DropPedestrianToGround.tsx +++ b/lib/ReactViews/Tools/PedestrianMode/DropPedestrianToGround.tsx @@ -3,7 +3,6 @@ import { useTranslation } from "react-i18next"; import Cartesian2 from "terriajs-cesium/Source/Core/Cartesian2"; import Cartesian3 from "terriajs-cesium/Source/Core/Cartesian3"; import Cartographic from "terriajs-cesium/Source/Core/Cartographic"; -import Ellipsoid from "terriajs-cesium/Source/Core/Ellipsoid"; import EllipsoidTerrainProvider from "terriajs-cesium/Source/Core/EllipsoidTerrainProvider"; import sampleTerrainMostDetailed from "terriajs-cesium/Source/Core/sampleTerrainMostDetailed"; import ScreenSpaceEventHandler from "terriajs-cesium/Source/Core/ScreenSpaceEventHandler"; diff --git a/lib/ReactViews/Workbench/Controls/ViewingControls.tsx b/lib/ReactViews/Workbench/Controls/ViewingControls.tsx index 0611aec979b..2fba40ff7d3 100644 --- a/lib/ReactViews/Workbench/Controls/ViewingControls.tsx +++ b/lib/ReactViews/Workbench/Controls/ViewingControls.tsx @@ -32,10 +32,7 @@ import CommonStrata from "../../../Models/Definition/CommonStrata"; import hasTraits from "../../../Models/Definition/hasTraits"; import Model, { BaseModel } from "../../../Models/Definition/Model"; import getAncestors from "../../../Models/getAncestors"; -import { - default as ViewingControlsModel, - ViewingControl -} from "../../../Models/ViewingControls"; +import { ViewingControl } from "../../../Models/ViewingControls"; import ViewState from "../../../ReactViewModels/ViewState"; import AnimatedSpinnerIcon from "../../../Styled/AnimatedSpinnerIcon"; import Box from "../../../Styled/Box"; diff --git a/lib/ReactViews/Workbench/PositionRightOfWorkbench.tsx b/lib/ReactViews/Workbench/PositionRightOfWorkbench.tsx index f011635ff21..ee3fa3b8fce 100644 --- a/lib/ReactViews/Workbench/PositionRightOfWorkbench.tsx +++ b/lib/ReactViews/Workbench/PositionRightOfWorkbench.tsx @@ -1,6 +1,6 @@ import { observer } from "mobx-react"; import React from "react"; -import styled, { CSSObject } from "styled-components"; +import styled from "styled-components"; import ViewState from "../../ReactViewModels/ViewState"; type PositionRightOfWorkbenchProps = { diff --git a/lib/Table/createLongitudeLatitudeFeaturePerId.ts b/lib/Table/createLongitudeLatitudeFeaturePerId.ts index 37af1238724..805e2256f2c 100644 --- a/lib/Table/createLongitudeLatitudeFeaturePerId.ts +++ b/lib/Table/createLongitudeLatitudeFeaturePerId.ts @@ -3,7 +3,6 @@ import Cartesian3 from "terriajs-cesium/Source/Core/Cartesian3"; import Color from "terriajs-cesium/Source/Core/Color"; import Iso8601 from "terriajs-cesium/Source/Core/Iso8601"; import JulianDate from "terriajs-cesium/Source/Core/JulianDate"; -import NearFarScalar from "terriajs-cesium/Source/Core/NearFarScalar"; import Packable from "terriajs-cesium/Source/Core/Packable"; import TimeInterval from "terriajs-cesium/Source/Core/TimeInterval"; import TimeIntervalCollection from "terriajs-cesium/Source/Core/TimeIntervalCollection"; diff --git a/lib/Traits/TraitsClasses/ArcGisMapServerCatalogGroupTraits.ts b/lib/Traits/TraitsClasses/ArcGisMapServerCatalogGroupTraits.ts index 92054ec6400..608773fd948 100644 --- a/lib/Traits/TraitsClasses/ArcGisMapServerCatalogGroupTraits.ts +++ b/lib/Traits/TraitsClasses/ArcGisMapServerCatalogGroupTraits.ts @@ -1,5 +1,3 @@ -import { JsonObject } from "../../Core/Json"; -import anyTrait from "../Decorators/anyTrait"; import { traitClass } from "../Trait"; import mixTraits from "../mixTraits"; import CatalogMemberTraits from "./CatalogMemberTraits"; diff --git a/lib/Traits/TraitsClasses/ArcGisPortalSharedTraits.ts b/lib/Traits/TraitsClasses/ArcGisPortalSharedTraits.ts index a2530afbb89..43b2e8fd963 100644 --- a/lib/Traits/TraitsClasses/ArcGisPortalSharedTraits.ts +++ b/lib/Traits/TraitsClasses/ArcGisPortalSharedTraits.ts @@ -1,5 +1,3 @@ -import anyTrait from "../Decorators/anyTrait"; -import JsonObject from "../../Core/Json"; import objectArrayTrait from "../Decorators/objectArrayTrait"; import ArcGisPortalItemFormatTraits from "./ArcGisPortalItemFormatTraits"; import mixTraits from "../mixTraits"; diff --git a/lib/Traits/TraitsClasses/CkanSharedTraits.ts b/lib/Traits/TraitsClasses/CkanSharedTraits.ts index d5cc0dd8fe6..00b0872873c 100644 --- a/lib/Traits/TraitsClasses/CkanSharedTraits.ts +++ b/lib/Traits/TraitsClasses/CkanSharedTraits.ts @@ -1,5 +1,3 @@ -import JsonObject from "../../Core/Json"; -import anyTrait from "../Decorators/anyTrait"; import objectArrayTrait from "../Decorators/objectArrayTrait"; import primitiveTrait from "../Decorators/primitiveTrait"; import mixTraits from "../mixTraits"; diff --git a/lib/Traits/TraitsClasses/CswCatalogGroupTraits.ts b/lib/Traits/TraitsClasses/CswCatalogGroupTraits.ts index 25055065deb..9a089fd6662 100644 --- a/lib/Traits/TraitsClasses/CswCatalogGroupTraits.ts +++ b/lib/Traits/TraitsClasses/CswCatalogGroupTraits.ts @@ -1,5 +1,3 @@ -import { JsonObject } from "../../Core/Json"; -import anyTrait from "../Decorators/anyTrait"; import CatalogMemberTraits from "./CatalogMemberTraits"; import GetCapabilitiesTraits from "./GetCapabilitiesTraits"; import GroupTraits from "./GroupTraits"; @@ -44,7 +42,7 @@ export class DomainSpecTraits extends ModelTraits { } @traitClass({ - description: `Creates one catalog group from url that points to a csw service. + description: `Creates one catalog group from url that points to a csw service. The url in the example supports CORS therefore do not use proxy. Using a proxy might not work.`, example: { type: "csw-group", diff --git a/lib/Traits/TraitsClasses/WebMapServiceCatalogGroupTraits.ts b/lib/Traits/TraitsClasses/WebMapServiceCatalogGroupTraits.ts index 4bfdb6a6b6c..a644c397813 100644 --- a/lib/Traits/TraitsClasses/WebMapServiceCatalogGroupTraits.ts +++ b/lib/Traits/TraitsClasses/WebMapServiceCatalogGroupTraits.ts @@ -1,5 +1,3 @@ -import { JsonObject } from "../../Core/Json"; -import anyTrait from "../Decorators/anyTrait"; import objectTrait from "../Decorators/objectTrait"; import primitiveTrait from "../Decorators/primitiveTrait"; import { traitClass } from "../Trait"; diff --git a/lib/Traits/TraitsClasses/WebProcessingServiceCatalogGroupTraits.ts b/lib/Traits/TraitsClasses/WebProcessingServiceCatalogGroupTraits.ts index 2fb546dd392..5e6f686bbdf 100644 --- a/lib/Traits/TraitsClasses/WebProcessingServiceCatalogGroupTraits.ts +++ b/lib/Traits/TraitsClasses/WebProcessingServiceCatalogGroupTraits.ts @@ -1,5 +1,3 @@ -import { JsonObject } from "../../Core/Json"; -import anyTrait from "../Decorators/anyTrait"; import CatalogMemberTraits from "./CatalogMemberTraits"; import GetCapabilitiesTraits from "./GetCapabilitiesTraits"; import GroupTraits from "./GroupTraits"; diff --git a/test/Models/Catalog/CatalogItems/CompositeCatalogItemSpec.ts b/test/Models/Catalog/CatalogItems/CompositeCatalogItemSpec.ts index b6176877f14..4814909aa8d 100644 --- a/test/Models/Catalog/CatalogItems/CompositeCatalogItemSpec.ts +++ b/test/Models/Catalog/CatalogItems/CompositeCatalogItemSpec.ts @@ -1,4 +1,3 @@ -import CatalogMemberFactory from "../../../../lib/Models/Catalog/CatalogMemberFactory"; import CompositeCatalogItem from "../../../../lib/Models/Catalog/CatalogItems/CompositeCatalogItem"; import GeoJsonCatalogItem from "../../../../lib/Models/Catalog/CatalogItems/GeoJsonCatalogItem"; import WebMapServiceCatalogItem from "../../../../lib/Models/Catalog/Ows/WebMapServiceCatalogItem"; diff --git a/test/Models/Catalog/Ows/WebFeatureServiceCatalogItemSpec.ts b/test/Models/Catalog/Ows/WebFeatureServiceCatalogItemSpec.ts index 932f68cda97..d62a06a5900 100644 --- a/test/Models/Catalog/Ows/WebFeatureServiceCatalogItemSpec.ts +++ b/test/Models/Catalog/Ows/WebFeatureServiceCatalogItemSpec.ts @@ -1,5 +1,4 @@ import i18next from "i18next"; -import { runInAction } from "mobx"; import GetCapabilitiesMixin from "../../../../lib/ModelMixins/GetCapabilitiesMixin"; import WebFeatureServiceCatalogItem, { GetCapabilitiesStratum diff --git a/test/Models/Catalog/Ows/WebMapServiceCatalogGroupSpec.ts b/test/Models/Catalog/Ows/WebMapServiceCatalogGroupSpec.ts index c1b16bbd00d..2e0c193f16f 100644 --- a/test/Models/Catalog/Ows/WebMapServiceCatalogGroupSpec.ts +++ b/test/Models/Catalog/Ows/WebMapServiceCatalogGroupSpec.ts @@ -1,6 +1,5 @@ import i18next from "i18next"; import { runInAction } from "mobx"; -import CatalogMemberMixin from "../../../../lib/ModelMixins/CatalogMemberMixin"; import GroupMixin from "../../../../lib/ModelMixins/GroupMixin"; import WebMapServiceCatalogGroup from "../../../../lib/Models/Catalog/Ows/WebMapServiceCatalogGroup"; import WebMapServiceCatalogItem from "../../../../lib/Models/Catalog/Ows/WebMapServiceCatalogItem"; diff --git a/test/Models/Catalog/Ows/WebProcessingServiceCatalogFunctionSpec.ts b/test/Models/Catalog/Ows/WebProcessingServiceCatalogFunctionSpec.ts index d65a9d24dfb..55c3d9208a4 100644 --- a/test/Models/Catalog/Ows/WebProcessingServiceCatalogFunctionSpec.ts +++ b/test/Models/Catalog/Ows/WebProcessingServiceCatalogFunctionSpec.ts @@ -1,4 +1,4 @@ -import { action, configure, reaction, runInAction } from "mobx"; +import { configure, reaction, runInAction } from "mobx"; import Cartographic from "terriajs-cesium/Source/Core/Cartographic"; import GeoJsonDataSource from "terriajs-cesium/Source/DataSources/GeoJsonDataSource"; import isDefined from "../../../../lib/Core/isDefined"; diff --git a/test/Models/Catalog/allCatalogModelsSpec.ts b/test/Models/Catalog/allCatalogModelsSpec.ts index 73b9193d8f2..c676620df9d 100644 --- a/test/Models/Catalog/allCatalogModelsSpec.ts +++ b/test/Models/Catalog/allCatalogModelsSpec.ts @@ -1,5 +1,4 @@ import ReferenceMixin from "../../../lib/ModelMixins/ReferenceMixin"; -import TableMixin from "../../../lib/ModelMixins/TableMixin"; import CatalogMemberFactory from "../../../lib/Models/Catalog/CatalogMemberFactory"; import registerCatalogMembers from "../../../lib/Models/Catalog/registerCatalogMembers"; import hasTraits from "../../../lib/Models/Definition/hasTraits"; diff --git a/test/Models/Catalog/esri/ArcGisPortalCatatalogGroupSpec.ts b/test/Models/Catalog/esri/ArcGisPortalCatatalogGroupSpec.ts index c5b54c1ba4c..07fbb93fb61 100644 --- a/test/Models/Catalog/esri/ArcGisPortalCatatalogGroupSpec.ts +++ b/test/Models/Catalog/esri/ArcGisPortalCatatalogGroupSpec.ts @@ -4,11 +4,8 @@ import Terria from "../../../../lib/Models/Terria"; import ArcGisPortalCatalogGroup, { ArcGisPortalStratum } from "../../../../lib/Models/Catalog/Esri/ArcGisPortalCatalogGroup"; -import CommonStrata from "../../../../lib/Models/Definition/CommonStrata"; import i18next from "i18next"; -import ArcGisPortalItemReference from "../../../../lib/Models/Catalog/Esri/ArcGisPortalItemReference"; import CatalogGroup from "../../../../lib/Models/Catalog/CatalogGroup"; -import { BaseModel } from "../../../../lib/Models/Definition/Model"; configure({ enforceActions: "observed", diff --git a/test/Models/Catalog/esri/ArcGisPortalReferenceItemSpec.ts b/test/Models/Catalog/esri/ArcGisPortalReferenceItemSpec.ts index b421a30615c..20358256b0a 100644 --- a/test/Models/Catalog/esri/ArcGisPortalReferenceItemSpec.ts +++ b/test/Models/Catalog/esri/ArcGisPortalReferenceItemSpec.ts @@ -3,13 +3,11 @@ import _loadWithXhr from "../../../../lib/Core/loadWithXhr"; import Terria from "../../../../lib/Models/Terria"; import registerCatalogMembers from "../../../../lib/Models/Catalog/registerCatalogMembers"; -import CommonStrata from "../../../../lib/Models/Definition/CommonStrata"; import i18next from "i18next"; import ArcGisPortalItemReference, { ArcGisPortalItemStratum } from "../../../../lib/Models/Catalog/Esri/ArcGisPortalItemReference"; import ArcGisFeatureServerCatalogItem from "../../../../lib/Models/Catalog/Esri/ArcGisFeatureServerCatalogItem"; -import InfoSectionTraits from "../../../../lib/Traits/TraitsClasses/CatalogMemberTraits"; configure({ enforceActions: "observed", diff --git a/test/Models/SelectableDimensionSpec.ts b/test/Models/SelectableDimensionSpec.ts index 97bd5ac4e2d..9759e110ed8 100644 --- a/test/Models/SelectableDimensionSpec.ts +++ b/test/Models/SelectableDimensionSpec.ts @@ -1,4 +1,4 @@ -import SelectableDimensions, { +import { DEFAULT_PLACEMENT, Placement, SelectableDimension, diff --git a/test/ReactViews/Custom/Chart/BottomDockChartSpec.tsx b/test/ReactViews/Custom/Chart/BottomDockChartSpec.tsx index 2e2b3c02030..225d4994871 100644 --- a/test/ReactViews/Custom/Chart/BottomDockChartSpec.tsx +++ b/test/ReactViews/Custom/Chart/BottomDockChartSpec.tsx @@ -1,10 +1,6 @@ -import React from "react"; -import { act } from "react-dom/test-utils"; -import TestRenderer, { ReactTestRenderer } from "react-test-renderer"; +import { ReactTestRenderer } from "react-test-renderer"; import { ChartItem } from "../../../../lib/ModelMixins/ChartableMixin"; import Terria from "../../../../lib/Models/Terria"; -import BottomDockChart from "../../../../lib/ReactViews/Custom/Chart/BottomDockChart"; -import PointOnMap from "../../../../lib/ReactViews/Custom/Chart/PointOnMap"; describe("BottomDockChart", function () { let terria: Terria; diff --git a/test/ReactViews/DimensionSelectorSectionSpec.tsx b/test/ReactViews/DimensionSelectorSectionSpec.tsx index 8093cee1663..6a73decb1cf 100644 --- a/test/ReactViews/DimensionSelectorSectionSpec.tsx +++ b/test/ReactViews/DimensionSelectorSectionSpec.tsx @@ -13,7 +13,6 @@ import SelectableDimensions, { SelectableDimension as SelectableDimensionModel } from "../../lib/Models/SelectableDimensions/SelectableDimensions"; import Terria from "../../lib/Models/Terria"; -import Collapsible from "../../lib/ReactViews/Custom/Collapsible/Collapsible"; import { SelectableDimensionGroup } from "../../lib/ReactViews/SelectableDimensions/Group"; import SelectableDimension from "../../lib/ReactViews/SelectableDimensions/SelectableDimension"; import { terriaTheme } from "../../lib/ReactViews/StandardUserInterface"; diff --git a/test/ReactViews/ShortReportSpec.tsx b/test/ReactViews/ShortReportSpec.tsx index 7ea0022b6b4..ba5d636aafa 100644 --- a/test/ReactViews/ShortReportSpec.tsx +++ b/test/ReactViews/ShortReportSpec.tsx @@ -10,7 +10,6 @@ import WebMapServiceCatalogItem from "../../lib/Models/Catalog/Ows/WebMapService import Terria from "../../lib/Models/Terria"; import { terriaTheme } from "../../lib/ReactViews/StandardUserInterface"; import ShortReport from "../../lib/ReactViews/Workbench/Controls/ShortReport"; -import Text from "../../lib/Styled/Text"; describe("ShortReport", function () { let testRenderer: ReactTestRenderer | undefined; diff --git a/test/Traits/UrlTraitsSpec.ts b/test/Traits/UrlTraitsSpec.ts index 2de17ecd005..2acead0031f 100644 --- a/test/Traits/UrlTraitsSpec.ts +++ b/test/Traits/UrlTraitsSpec.ts @@ -1,5 +1,4 @@ import { configure, runInAction } from "mobx"; -import _loadWithXhr from "../../lib/Core/loadWithXhr"; import Terria from "../../lib/Models/Terria"; import CommonStrata from "../../lib/Models/Definition/CommonStrata"; import GeoJsonCatalogItem from "../../lib/Models/Catalog/CatalogItems/GeoJsonCatalogItem"; From c514a263761620a4ac7ac49df2b2e1e6052f7fc3 Mon Sep 17 00:00:00 2001 From: Mike Wu <41275384+mwu2018@users.noreply.github.com> Date: Tue, 16 Apr 2024 09:34:28 +1000 Subject: [PATCH 646/654] Reduce log noise in MagdaReference. (#7108) --- CHANGES.md | 1 + lib/Models/Catalog/CatalogReferences/MagdaReference.ts | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGES.md b/CHANGES.md index 2be12264b57..b7d031f7aa2 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -6,6 +6,7 @@ - Fix `PointStyleTraits.marker` bug where URLs were not being used. - Fixed a bug with passing a relative baseUrl to Cesium >= 1.113.0 when `document.baseURI` is different to its `location`. - Fix node v18 compatibility by forcing `webpack-terser-plugin` version resolution and fixing new type errors +- Reduce log noise in `MagdaReference`. - [The next improvement] #### 8.7.0 - 2024-03-22 diff --git a/lib/Models/Catalog/CatalogReferences/MagdaReference.ts b/lib/Models/Catalog/CatalogReferences/MagdaReference.ts index 748aabcad9d..0bb801a7415 100644 --- a/lib/Models/Catalog/CatalogReferences/MagdaReference.ts +++ b/lib/Models/Catalog/CatalogReferences/MagdaReference.ts @@ -522,7 +522,7 @@ export default class MagdaReference extends AccessControlMixin( group.setTrait(magdaRecordStratum, "name", record.name); } group.setTrait(magdaRecordStratum, "members", filterOutUndefined(ids)); - if (GroupMixin.isMixedInto(group)) { + if (GroupMixin.isMixedInto(group) && group.uniqueId) { console.log(`Refreshing ids for ${group.uniqueId}`); group.refreshKnownContainerUniqueIds(group.uniqueId); } From 3be8d07ee12d78a4013b13303ea14b6ec8925f1c Mon Sep 17 00:00:00 2001 From: Nick Forbes-Smith Date: Tue, 16 Apr 2024 14:56:40 +1000 Subject: [PATCH 647/654] Release 8.7.1 --- CHANGES.md | 7 +++++-- package.json | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index b7d031f7aa2..24101e6cc55 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,13 +1,16 @@ # Change Log -#### next release (8.7.1) +#### next release (8.7.2) + +- [The next improvement] + +#### 8.7.1 - 2024-04-16 - Upgraded to TerriajS Cesium 1.115.0 - Fix `PointStyleTraits.marker` bug where URLs were not being used. - Fixed a bug with passing a relative baseUrl to Cesium >= 1.113.0 when `document.baseURI` is different to its `location`. - Fix node v18 compatibility by forcing `webpack-terser-plugin` version resolution and fixing new type errors - Reduce log noise in `MagdaReference`. -- [The next improvement] #### 8.7.0 - 2024-03-22 diff --git a/package.json b/package.json index 1d03193c034..a552f3033fa 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "terriajs", - "version": "8.7.0", + "version": "8.7.1", "description": "Geospatial data visualization platform.", "license": "Apache-2.0", "engines": { From cf4da1edaa8ecaad0099d8ff4a015ffcbce9b6f3 Mon Sep 17 00:00:00 2001 From: Nanda Date: Mon, 29 Apr 2024 15:00:18 +1000 Subject: [PATCH 648/654] Simplify type of Text component. Save 16 seconds from typescript compile step. --- lib/Styled/Styled.types.ts | 6 ------ lib/Styled/Text.tsx | 7 +++---- 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/lib/Styled/Styled.types.ts b/lib/Styled/Styled.types.ts index 26b30bdd665..2d83724fc05 100644 --- a/lib/Styled/Styled.types.ts +++ b/lib/Styled/Styled.types.ts @@ -23,12 +23,6 @@ export type WhiteSpace = | "initial" | "inherit"; -export type OneKeyFrom = K extends any - ? Pick & Partial, never>> extends infer O - ? { [P in keyof O]: O[P] } - : never - : never; - /** * Types that can be used after upgrade to ts4. */ diff --git a/lib/Styled/Text.tsx b/lib/Styled/Text.tsx index 0e58759baab..73819e0ad4d 100644 --- a/lib/Styled/Text.tsx +++ b/lib/Styled/Text.tsx @@ -1,6 +1,5 @@ import { ComponentProps } from "react"; import styled from "styled-components"; -import { OneKeyFrom } from "./Styled.types"; interface ITextSize { noFontSize?: boolean; @@ -52,9 +51,9 @@ export interface ITextPropsBase { } export type ITextProps = ITextPropsBase & - OneKeyFrom & - OneKeyFrom & - OneKeyFrom & + ITextSize & + ITextColor & + ITextWeight & ComponentProps<"div">; // should it be a span or inline-block-div? - leaning to div From 94f5c66749d6c695d0a1b4735c666c5418b138d2 Mon Sep 17 00:00:00 2001 From: Nanda Date: Mon, 29 Apr 2024 15:15:46 +1000 Subject: [PATCH 649/654] Remove OneKeyFrom type for Box. --- lib/Styled/Box.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/Styled/Box.tsx b/lib/Styled/Box.tsx index 25ce8be9d4b..0811606137f 100644 --- a/lib/Styled/Box.tsx +++ b/lib/Styled/Box.tsx @@ -1,6 +1,6 @@ import { Ref } from "react"; import styled from "styled-components"; -import { OneKeyFrom, Overflow, WhiteSpace, WordBreak } from "./Styled.types"; +import { Overflow, WhiteSpace, WordBreak } from "./Styled.types"; interface Column { col1?: boolean; @@ -68,7 +68,7 @@ export interface IBoxPropsBase { as?: React.ElementType | keyof JSX.IntrinsicElements; } -export type IBoxProps = IBoxPropsBase & OneKeyFrom; +export type IBoxProps = IBoxPropsBase & Column; export const Box = styled.div` display: flex; From acc183431829f520e79b6891fe41e527561ebe7f Mon Sep 17 00:00:00 2001 From: Brendon Ward Date: Tue, 30 Apr 2024 13:27:32 +1000 Subject: [PATCH 650/654] Wps value range (#7033) * refactor the DateTimeParameterEditor to be a functional component * add the proptypes check to appease the tests * format and minor code tidy * update CHANGES.MD * add the currentTime from timelineStack as the default date time in WPS params * no need to set dateValue when declaring it with useState * Add a NumberParameterEditor to allow for the setting of a min-max range * make NumberParameterEditor a functional component and add the DefaultValue from WPS as the initial value * update CHANGES.MD * add entry to CHANGES * set default on load and override isValid in NumberParameter * undo ParameterEditor change * run prettier checks * add rangeDescription check to ParameterEditor * use super.isValid in NumberParameter * remove scss button style and implement PR feedback for NumberParameter * fix type issue * update CHANGES * remove changes to DateTimeParameters.jsx from this branch and reset CHANGES * remove entries from CHANGES --- CHANGES.md | 2 +- .../WebProcessingServiceCatalogFunction.ts | 25 ++++++ .../FunctionParameters/NumberParameter.ts | 76 +++++++++++++++++++ .../createParameterFromType.js | 2 + .../Analytics/NumberParameterEditor.tsx | 39 ++++++++++ lib/ReactViews/Analytics/ParameterEditor.jsx | 34 ++++++++- lib/ReactViews/Analytics/invoke-function.scss | 1 - .../Analytics/invoke-function.scss.d.ts | 49 ------------ 8 files changed, 173 insertions(+), 55 deletions(-) create mode 100644 lib/Models/FunctionParameters/NumberParameter.ts create mode 100644 lib/ReactViews/Analytics/NumberParameterEditor.tsx diff --git a/CHANGES.md b/CHANGES.md index 24101e6cc55..9d0d1f50712 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -2,7 +2,7 @@ #### next release (8.7.2) -- [The next improvement] +- Add NumberParameterEditor to enable WPS AllowedValues Ranges to be set and use DefaultValue #### 8.7.1 - 2024-04-16 diff --git a/lib/Models/Catalog/Ows/WebProcessingServiceCatalogFunction.ts b/lib/Models/Catalog/Ows/WebProcessingServiceCatalogFunction.ts index 547988477d6..2ac05f34368 100644 --- a/lib/Models/Catalog/Ows/WebProcessingServiceCatalogFunction.ts +++ b/lib/Models/Catalog/Ows/WebProcessingServiceCatalogFunction.ts @@ -43,10 +43,18 @@ import RegionTypeParameter from "../../FunctionParameters/RegionTypeParameter"; import StringParameter from "../../FunctionParameters/StringParameter"; import proxyCatalogItemUrl from "../proxyCatalogItemUrl"; import { ModelConstructorParameters } from "../../Definition/Model"; + import WebProcessingServiceCatalogFunctionJob from "./WebProcessingServiceCatalogFunctionJob"; +import NumberParameter from "../../FunctionParameters/NumberParameter"; type AllowedValues = { Value?: string | string[]; + Range?: Range; +}; + +type Range = { + MaximumValue?: number; + MinimumValue?: number; }; type LiteralDataType = { @@ -57,6 +65,7 @@ type LiteralData = { AllowedValues?: AllowedValues; AllowedValue?: AllowedValues; AnyValue?: unknown; + DefaultValue?: unknown; DataType?: LiteralDataType | string; dataType?: string; }; @@ -364,6 +373,7 @@ const LiteralDataConverter = { const allowedValues = input.LiteralData.AllowedValues || input.LiteralData.AllowedValue; + if (isDefined(allowedValues) && isDefined(allowedValues.Value)) { return new EnumerationParameter(catalogFunction, { ...options, @@ -375,6 +385,20 @@ const LiteralDataConverter = { return { id }; }) }); + } else if (isDefined(allowedValues) && isDefined(allowedValues.Range)) { + const np = new NumberParameter(catalogFunction, { + ...options + }); + + np.minimum = isDefined(allowedValues.Range.MinimumValue) + ? allowedValues.Range.MinimumValue + : np.minimum; + np.maximum = allowedValues.Range.MaximumValue; + np.defaultValue = isDefined(input.LiteralData.DefaultValue) + ? (input.LiteralData.DefaultValue as number) + : np.minimum; + + return np; } else if (isDefined(input.LiteralData.AnyValue)) { let dtype: string | null = null; if (isDefined(input.LiteralData["dataType"])) { @@ -411,6 +435,7 @@ const LiteralDataConverter = { dt.variant = "literal"; return dt; } + // Assume its a string, if no literal datatype given return new StringParameter(catalogFunction, { ...options diff --git a/lib/Models/FunctionParameters/NumberParameter.ts b/lib/Models/FunctionParameters/NumberParameter.ts new file mode 100644 index 00000000000..7e46f3c6f1c --- /dev/null +++ b/lib/Models/FunctionParameters/NumberParameter.ts @@ -0,0 +1,76 @@ +import { computed, makeObservable, override } from "mobx"; +import FunctionParameter, { + Options as FunctionParameterOptions +} from "./FunctionParameter"; +import CatalogFunctionMixin from "../../ModelMixins/CatalogFunctionMixin"; + +interface Options extends FunctionParameterOptions { + minimum?: number; + maximum?: number; + defaultValue?: number; +} + +export default class NumberParameter + extends FunctionParameter + implements Options +{ + static readonly type = "number"; + readonly type = "number"; + minimum?: number; + maximum?: number; + defaultValue?: number; + + @computed + get rangeDescription() { + if (this.minimum !== undefined && this.maximum !== undefined) { + return `: must be between ${this.minimum} to ${this.maximum}`; + } else if (this.minimum !== undefined) { + return `: at least ${this.minimum}`; + } else if (this.maximum !== undefined) { + return `: at most ${this.maximum}`; + } else { + return ""; + } + } + + @override get value(): number | undefined { + return super.value ?? this.defaultValue; + } + + @override + get isValid(): boolean { + return super.value === undefined + ? this.isValidRange + : this.isValidRange && super.isValid; + } + + get isValidRange(): boolean { + let value = + this.value !== undefined ? this.value : (this.defaultValue as number); + + if (typeof value === "string") { + value = parseFloat(value); + } + + if (this.minimum !== undefined && value < this.minimum) { + return false; + } + + if (this.maximum !== undefined && value > this.maximum) { + return false; + } + + return true; + } + + constructor( + catalogFunction: CatalogFunctionMixin.Instance, + options: Options + ) { + super(catalogFunction, options); + makeObservable(this); + this.minimum = options.minimum; + this.maximum = options.maximum; + this.defaultValue = options.defaultValue; + } +} diff --git a/lib/Models/FunctionParameters/createParameterFromType.js b/lib/Models/FunctionParameters/createParameterFromType.js index efe848ba1d9..6d7517cb43f 100644 --- a/lib/Models/FunctionParameters/createParameterFromType.js +++ b/lib/Models/FunctionParameters/createParameterFromType.js @@ -10,12 +10,14 @@ var PolygonParameter = require("./PolygonParameter"); var DateTimeParameter = require("./DateTimeParameter"); var EnumerationParameter = require("./EnumerationParameter"); var StringParameter = require("./StringParameter"); +var NumberParameter = require("./NumberParameter"); var PointParameter = require("./PointParameter"); var BooleanParameter = require("./BooleanParameter"); var BooleanParameterGroup = require("./BooleanParameterGroup"); var mapping = { [StringParameter.prototype.type]: StringParameter, + [NumberParameter.prototype.type]: NumberParameter, [EnumerationParameter.prototype.type]: EnumerationParameter, [BooleanParameter.prototype.type]: BooleanParameter, [BooleanParameterGroup.prototype.type]: BooleanParameterGroup, diff --git a/lib/ReactViews/Analytics/NumberParameterEditor.tsx b/lib/ReactViews/Analytics/NumberParameterEditor.tsx new file mode 100644 index 00000000000..94c31916062 --- /dev/null +++ b/lib/ReactViews/Analytics/NumberParameterEditor.tsx @@ -0,0 +1,39 @@ +import React, { ChangeEvent, useEffect, useState } from "react"; +import { observer } from "mobx-react"; +import CommonStrata from "../../Models/Definition/CommonStrata"; +import NumberParameter from "../../Models/FunctionParameters/NumberParameter"; + +import Styles from "./parameter-editors.scss"; + +const NumberParameterEditor: React.FC<{ parameter: NumberParameter }> = ({ + parameter +}) => { + const [value, setValue] = useState(0); + + useEffect(() => { + if (parameter.defaultValue !== undefined) { + setValue(parameter.defaultValue); + } + }, [parameter.defaultValue]); + + const onChange = (e: ChangeEvent) => { + setValue(parseFloat(e.target.value)); + parameter.setValue(CommonStrata.user, parseFloat(e.target.value)); + }; + + const min = (parameter.minimum || "") as string; + const max = (parameter.maximum || "") as string; + + return ( + + ); +}; + +export default observer(NumberParameterEditor); diff --git a/lib/ReactViews/Analytics/ParameterEditor.jsx b/lib/ReactViews/Analytics/ParameterEditor.jsx index 0ed8edefe72..ba9e9067c51 100644 --- a/lib/ReactViews/Analytics/ParameterEditor.jsx +++ b/lib/ReactViews/Analytics/ParameterEditor.jsx @@ -17,6 +17,7 @@ import DateParameterEditor from "./DateParameterEditor"; import DateTimeParameterEditor from "./DateTimeParameterEditor"; import EnumerationParameterEditor from "./EnumerationParameterEditor"; import GenericParameterEditor from "./GenericParameterEditor"; +import NumberParameterEditor from "./NumberParameterEditor"; import GeoJsonParameterEditor from "./GeoJsonParameterEditor"; import defined from "terriajs-cesium/Source/Core/defined"; @@ -49,11 +50,18 @@ const ParameterEditor = createReactClass({ {this.props.parameter.isRequired && (required)} {typeof this.props.parameter.description === "string" && - this.props.parameter.description !== "" - ? parseCustomMarkdownToReact(this.props.parameter.description, { + this.props.parameter.description !== "" && + typeof this.props.parameter.rangeDescription === "string" && + this.props.parameter.rangeDescription !== "" + ? parseCustomMarkdownToReact( + `${this.props.parameter.description} ${this.props.parameter.rangeDescription}`, + { + parameter: this.props.parameter + } + ) + : parseCustomMarkdownToReact(this.props.parameter.description, { parameter: this.props.parameter - }) - : ""} + })}
    ); }, @@ -222,6 +230,7 @@ ParameterEditor.parameterTypeConverters = [ previewed={parameterEditor.props.previewed} parameter={parameterEditor.props.parameter} parameterViewModel={parameterEditor.props.parameterViewModel} + terria={parameterEditor.props.viewState.terria} />
    ); @@ -370,6 +379,23 @@ ParameterEditor.parameterTypeConverters = [ ); } } + }, + { + id: "number", + parameterTypeToDiv: function NumberParameterToDiv(type, parameterEditor) { + if (type === this.id) { + return ( +
    + {parameterEditor.renderLabel()} + +
    + ); + } + } } ]; diff --git a/lib/ReactViews/Analytics/invoke-function.scss b/lib/ReactViews/Analytics/invoke-function.scss index c7872fd47bc..b05b3effafa 100644 --- a/lib/ReactViews/Analytics/invoke-function.scss +++ b/lib/ReactViews/Analytics/invoke-function.scss @@ -1,6 +1,5 @@ @import "~terriajs-variables"; @import "../../Sass/common/mixins"; -@import "../../Sass/common/_buttons.scss"; .invoke-function { padding: $padding-small; diff --git a/lib/ReactViews/Analytics/invoke-function.scss.d.ts b/lib/ReactViews/Analytics/invoke-function.scss.d.ts index 654f8f526ea..afec4c0b728 100644 --- a/lib/ReactViews/Analytics/invoke-function.scss.d.ts +++ b/lib/ReactViews/Analytics/invoke-function.scss.d.ts @@ -1,61 +1,12 @@ // This file is automatically generated. // Please do not change this file! interface CssExports { - '_buttons__btn-primary': string; 'btn': string; - 'btn--add-to-map': string; - 'btn--catalog': string; - 'btn--catalog-item': string; - 'btn--close-modal': string; - 'btn--group-indicator': string; - 'btn--loading-on-map': string; - 'btn--map': string; - 'btn--radio': string; - 'btn--remove-from-map': string; - 'btn--search-clear': string; - 'btn--secondary': string; - 'btn--small': string; - 'btn--tab': string; - 'btn--tertiary': string; - 'btn--tertiary-dark': string; - 'btn-grey': string; - 'btn-large': string; - 'btn-primary': string; - 'btn-primary--hover': string; - 'btn-small': string; - 'btn-transparent': string; - 'btnAddToMap': string; - 'btnCatalog': string; - 'btnCatalogItem': string; - 'btnCloseModal': string; - 'btnGrey': string; - 'btnGroupIndicator': string; - 'btnLarge': string; - 'btnLoadingOnMap': string; - 'btnMap': string; - 'btnPrimary': string; - 'btnPrimaryHover': string; - 'btnRadio': string; - 'btnRemoveFromMap': string; - 'btnSearchClear': string; - 'btnSecondary': string; - 'btnSmall': string; - 'btnTab': string; - 'btnTertiary': string; - 'btnTertiaryDark': string; - 'btnTransparent': string; - 'buttonsBtnPrimary': string; 'content': string; 'description': string; 'footer': string; 'invoke-function': string; 'invokeFunction': string; - 'is-active': string; - 'is-open': string; - 'is-previewed': string; - 'isActive': string; - 'isOpen': string; - 'isPreviewed': string; } declare var cssExports: CssExports; export = cssExports; From 76e2e4f6f43aac8753d9d264d343ca0cc6f70fe3 Mon Sep 17 00:00:00 2001 From: "Peter A. Jonsson" Date: Sun, 31 Mar 2024 17:34:09 +0200 Subject: [PATCH 651/654] Update svg-sprite-loader version This fixes some security issues in dependencies. --- package.json | 2 +- yarn.lock | 210 ++++----------------------------------------------- 2 files changed, 16 insertions(+), 196 deletions(-) diff --git a/package.json b/package.json index 4db1633083a..671ad8b3d51 100644 --- a/package.json +++ b/package.json @@ -176,7 +176,7 @@ "string-replace-webpack-plugin": "^0.1.3", "style-loader": "^0.23.1", "styled-components": "^5.3.9", - "svg-sprite-loader": "4.1.3", + "svg-sprite-loader": "^6.0.11", "terriajs-cesium": "8.0.0", "terriajs-cesium-widgets": "5.0.0", "terriajs-html2canvas": "1.0.0-alpha.12-terriajs-1", diff --git a/yarn.lock b/yarn.lock index 405361b34e0..707ec982fb3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3333,11 +3333,6 @@ bonjour@^3.5.0: multicast-dns "^6.0.1" multicast-dns-service-types "^1.1.0" -boolbase@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" - integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= - bottleneck@^2.19.5: version "2.19.5" resolved "https://registry.yarnpkg.com/bottleneck/-/bottleneck-2.19.5.tgz#5df0b90f59fd47656ebe63c78a98419205cadd91" @@ -3573,14 +3568,6 @@ callsites@^3.0.0: resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== -camel-case@3.0.x: - version "3.0.0" - resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73" - integrity sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M= - dependencies: - no-case "^2.2.0" - upper-case "^1.1.1" - camelcase@5.3.1, camelcase@^5.0.0, camelcase@^5.2.0: version "5.3.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" @@ -3737,13 +3724,6 @@ classnames@2.x, classnames@^2.2.1, classnames@^2.2.5, classnames@^2.2.6, classna resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.1.tgz#dfcfa3891e306ec1dad105d0e88f4417b8535e8e" integrity sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA== -clean-css@4.2.x: - version "4.2.4" - resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.4.tgz#733bf46eba4e607c6891ea57c24a989356831178" - integrity sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A== - dependencies: - source-map "~0.6.0" - clean-stack@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" @@ -3896,21 +3876,11 @@ commander@2, commander@^2.20.0: resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== -commander@2.17.x: - version "2.17.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" - integrity sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg== - "commander@^11.1.0 ": version "11.1.0" resolved "https://registry.yarnpkg.com/commander/-/commander-11.1.0.tgz#62fdce76006a68e5c1ab3314dc92e800eb83d906" integrity sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ== -commander@~2.19.0: - version "2.19.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" - integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg== - commondir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" @@ -4282,17 +4252,6 @@ css-modules-typescript-loader@^2.0.4: line-diff "^2.0.1" loader-utils "^1.2.3" -css-select@^4.1.3: - version "4.2.1" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.2.1.tgz#9e665d6ae4c7f9d65dbe69d0316e3221fb274cdd" - integrity sha512-/aUslKhzkTNCQUB2qTX84lVmfia9NyjP3WpDGtj/WxhwBzWBYUV3DgUpurHTme8UTPcPlAD1DJ+b0nN/t50zDQ== - dependencies: - boolbase "^1.0.0" - css-what "^5.1.0" - domhandler "^4.3.0" - domutils "^2.8.0" - nth-check "^2.0.1" - css-to-react-native@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/css-to-react-native/-/css-to-react-native-3.0.0.tgz#62dbe678072a824a689bcfee011fc96e02a7d756" @@ -4302,11 +4261,6 @@ css-to-react-native@^3.0.0: css-color-keywords "^1.0.0" postcss-value-parser "^4.0.2" -css-what@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-5.1.0.tgz#3f7b707aadf633baf62c2ceb8579b545bb40f7fe" - integrity sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw== - css@^2.0.0: version "2.2.4" resolved "https://registry.yarnpkg.com/css/-/css-2.2.4.tgz#c646755c73971f2bba6a601e2cf2fd71b1298929" @@ -4704,7 +4658,7 @@ default-resolution@^2.0.0: resolved "https://registry.yarnpkg.com/default-resolution/-/default-resolution-2.0.0.tgz#bcb82baa72ad79b426a76732f1a81ad6df26d684" integrity sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ= -define-properties@^1.1.2, define-properties@^1.1.3: +define-properties@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== @@ -4878,13 +4832,6 @@ dom-align@^1.7.0: resolved "https://registry.yarnpkg.com/dom-align/-/dom-align-1.12.2.tgz#0f8164ebd0c9c21b0c790310493cd855892acd4b" integrity sha512-pHuazgqrsTFrGU2WLDdXxCFabkdQDx72ddkraZNih1KsMcN5qsRSTR9O4VJRlwTPCPb5COYg3LOfiMHHcPInHg== -dom-converter@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" - integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA== - dependencies: - utila "~0.4" - dom-helpers@^5.0.1: version "5.2.1" resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.1.tgz#d9400536b2bf8225ad98fe052e029451ac40e902" @@ -4949,7 +4896,7 @@ domhandler@^2.3.0: dependencies: domelementtype "1" -domhandler@^4.0, domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.2.2, domhandler@^4.3.0: +domhandler@^4.0, domhandler@^4.2.0, domhandler@^4.2.2: version "4.3.1" resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.1.tgz#8d792033416f59d68bc03a5aa7b018c1ca89279c" integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ== @@ -4979,7 +4926,7 @@ domutils@^1.5.1: dom-serializer "0" domelementtype "1" -domutils@^2.5.2, domutils@^2.8.0: +domutils@^2.8.0: version "2.8.0" resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== @@ -6549,7 +6496,7 @@ hash.js@^1.0.0, hash.js@^1.0.3: inherits "^2.0.3" minimalistic-assert "^1.0.1" -he@1.2.x, he@^1.1.1: +he@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== @@ -6609,19 +6556,6 @@ html-escaper@^2.0.0: resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== -html-minifier@^3.2.3: - version "3.5.21" - resolved "https://registry.yarnpkg.com/html-minifier/-/html-minifier-3.5.21.tgz#d0040e054730e354db008463593194015212d20c" - integrity sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA== - dependencies: - camel-case "3.0.x" - clean-css "4.2.x" - commander "2.17.x" - he "1.2.x" - param-case "2.1.x" - relateurl "0.2.x" - uglify-js "3.4.x" - html-parse-stringify@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz#dfc1017347ce9f77c8141a507f233040c59c55d2" @@ -6639,19 +6573,6 @@ html-to-react@1.4.7: lodash.camelcase "^4.3.0" ramda "^0.27.1" -html-webpack-plugin@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz#b01abbd723acaaa7b37b6af4492ebda03d9dd37b" - integrity sha1-sBq71yOsqqeze2r0SS69oD2d03s= - dependencies: - html-minifier "^3.2.3" - loader-utils "^0.2.16" - lodash "^4.17.3" - pretty-error "^2.0.2" - tapable "^1.0.0" - toposort "^1.0.0" - util.promisify "1.0.0" - htmlparser2@^3.8.3: version "3.10.1" resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f" @@ -6664,16 +6585,6 @@ htmlparser2@^3.8.3: inherits "^2.0.1" readable-stream "^3.1.1" -htmlparser2@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-6.1.0.tgz#c4d762b6c3371a05dbe65e94ae43a9f845fb8fb7" - integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A== - dependencies: - domelementtype "^2.0.1" - domhandler "^4.0.0" - domutils "^2.5.2" - entities "^2.0.0" - htmlparser2@^7.0: version "7.2.0" resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-7.2.0.tgz#8817cdea38bbc324392a90b1990908e81a65f5a5" @@ -8049,7 +7960,7 @@ loader-utils@1.2.3: emojis-list "^2.0.0" json5 "^1.0.1" -loader-utils@^0.2.16, loader-utils@^0.2.5, loader-utils@~0.2.2, loader-utils@~0.2.3, loader-utils@~0.2.5: +loader-utils@^0.2.5, loader-utils@~0.2.2, loader-utils@~0.2.3, loader-utils@~0.2.5: version "0.2.17" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.17.tgz#f86e6374d43205a6e6c60e9196f17c0299bfb348" integrity sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g= @@ -8135,7 +8046,7 @@ lodash.truncate@^4.4.2: resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM= -lodash@^4.0.1, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.6.1: +lodash@^4.0.1, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.6.1: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -8173,11 +8084,6 @@ loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.3.1, loose-envify@^1.4 dependencies: js-tokens "^3.0.0 || ^4.0.0" -lower-case@^1.1.1: - version "1.1.4" - resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" - integrity sha1-miyr0bno4K6ZOkv31YdcOcQujqw= - lru-cache@^2.7.0: version "2.7.3" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952" @@ -8702,13 +8608,6 @@ nice-try@^1.0.4: resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== -no-case@^2.2.0: - version "2.3.2" - resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac" - integrity sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ== - dependencies: - lower-case "^1.1.1" - node-fetch@2.6.7, node-fetch@^2.6.1: version "2.6.7" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" @@ -8819,13 +8718,6 @@ npm-run-path@^2.0.0: dependencies: path-key "^2.0.0" -nth-check@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.0.1.tgz#2efe162f5c3da06a28959fbd3db75dbeea9f0fc2" - integrity sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w== - dependencies: - boolbase "^1.0.0" - null-check@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/null-check/-/null-check-1.0.0.tgz#977dffd7176012b9ec30d2a39db5cf72a0439edd" @@ -8928,15 +8820,6 @@ object.fromentries@^2.0.5: define-properties "^1.1.3" es-abstract "^1.19.1" -object.getownpropertydescriptors@^2.0.3: - version "2.1.3" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.3.tgz#b223cf38e17fefb97a63c10c91df72ccb386df9e" - integrity sha512-VdDoCwvJI4QdC6ndjpqFmoL3/+HxffFBbcJzKi5hwLLqqx3mdbedRpfZDdK0SrOSauj8X4GzBvnDZl4vTN7dOw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" - object.hasown@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.0.tgz#7232ed266f34d197d15cac5880232f7a4790afe5" @@ -9156,13 +9039,6 @@ papaparse@^5.2.0: resolved "https://registry.yarnpkg.com/papaparse/-/papaparse-5.3.1.tgz#770b7a9124d821d4b2132132b7bd7dce7194b5b1" integrity sha512-Dbt2yjLJrCwH2sRqKFFJaN5XgIASO9YOFeFP8rIBRG2Ain8mqk5r1M6DkfvqEVozVcz3r3HaUGw253hA1nLIcA== -param-case@2.1.x: - version "2.1.1" - resolved "https://registry.yarnpkg.com/param-case/-/param-case-2.1.1.tgz#df94fd8cf6531ecf75e6bef9a0858fbc72be2247" - integrity sha1-35T9jPZTHs915r75oIWPvHK+Ikc= - dependencies: - no-case "^2.2.0" - parent-module@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" @@ -9596,14 +9472,6 @@ prettier@2.7.1: resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.7.1.tgz#e235806850d057f97bb08368a4f7d899f7760c64" integrity sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g== -pretty-error@^2.0.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.2.tgz#be89f82d81b1c86ec8fdfbc385045882727f93b6" - integrity sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw== - dependencies: - lodash "^4.17.20" - renderkid "^2.0.4" - pretty-hrtime@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1" @@ -10327,11 +10195,6 @@ regjsparser@^0.9.1: dependencies: jsesc "~0.5.0" -relateurl@0.2.x: - version "0.2.7" - resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" - integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk= - remove-bom-buffer@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz#c2bf1e377520d324f623892e33c10cac2c252b53" @@ -10354,17 +10217,6 @@ remove-trailing-separator@^1.0.1, remove-trailing-separator@^1.1.0: resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= -renderkid@^2.0.4: - version "2.0.7" - resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-2.0.7.tgz#464f276a6bdcee606f4a15993f9b29fc74ca8609" - integrity sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ== - dependencies: - css-select "^4.1.3" - dom-converter "^0.2.0" - htmlparser2 "^6.1.0" - lodash "^4.17.21" - strip-ansi "^3.0.1" - repeat-element@^1.1.2: version "1.1.4" resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" @@ -11101,7 +10953,7 @@ source-map-url@^0.4.0: resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== -source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: +source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== @@ -11536,7 +11388,7 @@ sver-compat@^1.5.0: es6-iterator "^2.0.1" es6-symbol "^3.1.1" -svg-baker-runtime@^1.4.0: +svg-baker-runtime@^1.4.7: version "1.4.7" resolved "https://registry.yarnpkg.com/svg-baker-runtime/-/svg-baker-runtime-1.4.7.tgz#f4720637f5b6202eef6378d81f1fead0815f8a4e" integrity sha512-Zorfwwj5+lWjk/oxwSMsRdS2sPQQdTmmsvaSpzU+i9ZWi3zugHLt6VckWfnswphQP0LmOel3nggpF5nETbt6xw== @@ -11545,7 +11397,7 @@ svg-baker-runtime@^1.4.0: mitt "1.1.2" svg-baker "^1.7.0" -svg-baker@^1.4.0, svg-baker@^1.7.0: +svg-baker@^1.5.0, svg-baker@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/svg-baker/-/svg-baker-1.7.0.tgz#8367f78d875550c52fe4756f7303d5c5d7c2e9a7" integrity sha512-nibslMbkXOIkqKVrfcncwha45f97fGuAOn1G99YwnwTj8kF9YiM6XexPcUso97NxOm6GsP0SIvYVIosBis1xLg== @@ -11564,19 +11416,18 @@ svg-baker@^1.4.0, svg-baker@^1.7.0: query-string "^4.3.2" traverse "^0.6.6" -svg-sprite-loader@4.1.3: - version "4.1.3" - resolved "https://registry.yarnpkg.com/svg-sprite-loader/-/svg-sprite-loader-4.1.3.tgz#d25cfa75a5c4e499f7b5282281db6eb3bda13fe0" - integrity sha512-lOLDSJoyriYnOeGYc7nhxTDYj2vfdBVKpxIS/XK70//kA3VB55H89T1lct2OEClY4w5kQLZJAvDGQ41g3YTogQ== +svg-sprite-loader@^6.0.11: + version "6.0.11" + resolved "https://registry.yarnpkg.com/svg-sprite-loader/-/svg-sprite-loader-6.0.11.tgz#a4d60cee3d74232a2c17d31c73a2008295f61220" + integrity sha512-TedsTf8wsHH6HgdwKjUveDZRC6q5gPloYV8A8/zZaRWP929J7x6TzQ6MvZFl+YYDJuJ0Akyuu/vNVJ+fbPuYXg== dependencies: bluebird "^3.5.0" deepmerge "1.3.2" domready "1.0.8" escape-string-regexp "1.0.5" - html-webpack-plugin "^3.2.0" loader-utils "^1.1.0" - svg-baker "^1.4.0" - svg-baker-runtime "^1.4.0" + svg-baker "^1.5.0" + svg-baker-runtime "^1.4.7" url-slug "2.0.0" symbol-tree@^3.2.4: @@ -11882,11 +11733,6 @@ topojson-client@^3.1.0: dependencies: commander "2" -toposort@^1.0.0: - version "1.0.7" - resolved "https://registry.yarnpkg.com/toposort/-/toposort-1.0.7.tgz#2e68442d9f64ec720b8cc89e6443ac6caa950029" - integrity sha1-LmhELZ9k7HILjMieZEOsbKqVACk= - tough-cookie@^2.3.3, tough-cookie@~2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" @@ -12069,14 +11915,6 @@ uc.micro@^1.0.1, uc.micro@^1.0.5: resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac" integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA== -uglify-js@3.4.x: - version "3.4.10" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.10.tgz#9ad9563d8eb3acdfb8d38597d2af1d815f6a755f" - integrity sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw== - dependencies: - commander "~2.19.0" - source-map "~0.6.1" - unbox-primitive@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" @@ -12214,11 +12052,6 @@ update-browserslist-db@^1.0.13: escalade "^3.1.1" picocolors "^1.0.0" -upper-case@^1.1.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598" - integrity sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg= - uri-js@^4.2.2: version "4.4.1" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" @@ -12286,14 +12119,6 @@ util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= -util.promisify@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" - integrity sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA== - dependencies: - define-properties "^1.1.2" - object.getownpropertydescriptors "^2.0.3" - util@0.10.3: version "0.10.3" resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" @@ -12319,11 +12144,6 @@ util@^0.12.4: is-typed-array "^1.1.3" which-typed-array "^1.1.2" -utila@~0.4: - version "0.4.0" - resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" - integrity sha1-ihagXURWV6Oupe7MWxKk+lN5dyw= - utils-merge@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" From c1287ecaaa85ae4882dc5596ce9013d295116846 Mon Sep 17 00:00:00 2001 From: "Peter A. Jonsson" Date: Sun, 31 Mar 2024 19:09:41 +0200 Subject: [PATCH 652/654] Update to shpjs 4.0.4 This fixes some security issues in dependencies. --- package.json | 2 +- yarn.lock | 27 +++++++++++++++------------ 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/package.json b/package.json index 4db1633083a..cab1f39626f 100644 --- a/package.json +++ b/package.json @@ -170,7 +170,7 @@ "retry": "^0.12.0", "rollbar": "^2.24.0", "sass-loader": "^10", - "shpjs": "^3.6.0", + "shpjs": "^4.0.4", "simple-statistics": "^7.0.1", "string-replace-loader": "^2.1.1", "string-replace-webpack-plugin": "^0.1.3", diff --git a/yarn.lock b/yarn.lock index 405361b34e0..eb1032e5768 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7756,12 +7756,15 @@ jsprim@^1.2.2: array-includes "^3.1.3" object.assign "^4.1.2" -jszip@^2.4.0: - version "2.6.1" - resolved "https://registry.yarnpkg.com/jszip/-/jszip-2.6.1.tgz#b88f3a7b2e67a2a048152982c7a3756d9c4828f0" - integrity sha1-uI86ey5noqBIFSmCx6N1bZxIKPA= +jszip@^3.5.0: + version "3.10.1" + resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.10.1.tgz#34aee70eb18ea1faec2f589208a157d1feb091c2" + integrity sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g== dependencies: + lie "~3.3.0" pako "~1.0.2" + readable-stream "~2.3.6" + setimmediate "^1.0.5" just-debounce@^1.0.0: version "1.1.0" @@ -7977,7 +7980,7 @@ levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" -lie@^3.0.1: +lie@^3.0.1, lie@~3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/lie/-/lie-3.3.0.tgz#dcf82dee545f46074daf200c7c1c5a08e0f40f6a" integrity sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ== @@ -10886,10 +10889,10 @@ set-value@^2.0.0, set-value@^2.0.1: is-plain-object "^2.0.3" split-string "^3.0.1" -setimmediate@^1.0.4: +setimmediate@^1.0.4, setimmediate@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= + integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== setprototypeof@1.1.0: version "1.1.0" @@ -10943,12 +10946,12 @@ shellwords@^0.1.1: resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== -shpjs@^3.6.0: - version "3.6.3" - resolved "https://registry.yarnpkg.com/shpjs/-/shpjs-3.6.3.tgz#91fbbddbe16230befe4c63013d82189ec03f3fb9" - integrity sha512-wcR2S3WL/7RnEIm+YO+H/mZR9z9FCV46op+SZt+W5PtPs26Omb9U93f+EPI1DOpNKBuAIrWjHWh0SxlnBahJkg== +shpjs@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/shpjs/-/shpjs-4.0.4.tgz#8849032ba1a738e7a983cd9c508ba3097ad2717c" + integrity sha512-+IcS2DoiTGqAONUEN46ZociKGJ2ecs1EVwJuSqnAOkMafxWC8noO3X/zI959RCbqHGvBr1RM1bdk4jc7fYONVg== dependencies: - jszip "^2.4.0" + jszip "^3.5.0" lie "^3.0.1" lru-cache "^2.7.0" parsedbf "^1.1.0" From 1c22491df3df7af7b0d8b1d0200d2d83a7712f16 Mon Sep 17 00:00:00 2001 From: "Peter A. Jonsson" Date: Sun, 31 Mar 2024 19:30:14 +0200 Subject: [PATCH 653/654] Update to resolve-uri-loader 5 This fixes some security issues in dependencies. --- package.json | 2 +- yarn.lock | 134 +++++++++++++++++---------------------------------- 2 files changed, 45 insertions(+), 91 deletions(-) diff --git a/package.json b/package.json index 0ff928f6192..43aa48aa400 100644 --- a/package.json +++ b/package.json @@ -166,7 +166,7 @@ "react-transition-group": "^4.3.0", "react-uid": "^2.3.0", "react-virtual": "~2.3.2", - "resolve-url-loader": "^3.0.1", + "resolve-url-loader": "^5.0.0", "retry": "^0.12.0", "rollbar": "^2.24.0", "sass-loader": "^10", diff --git a/yarn.lock b/yarn.lock index 23fedd04a59..541f66924fb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2525,10 +2525,10 @@ acorn@^8.8.2: resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== -adjust-sourcemap-loader@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/adjust-sourcemap-loader/-/adjust-sourcemap-loader-3.0.0.tgz#5ae12fb5b7b1c585e80bbb5a63ec163a1a45e61e" - integrity sha512-YBrGyT2/uVQ/c6Rr+t6ZJXniY03YtHGMJQYal368burRGYKqhx9qGTWqcBU5s1CwYY9E/ri63RYyG1IacMZtqw== +adjust-sourcemap-loader@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz#fc4a0fd080f7d10471f30a7320f25560ade28c99" + integrity sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A== dependencies: loader-utils "^2.0.0" regex-parser "^2.2.11" @@ -2715,11 +2715,6 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" -arity-n@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/arity-n/-/arity-n-1.0.4.tgz#d9e76b11733e08569c0847ae7b39b2860b30b745" - integrity sha1-2edrEXM+CFacCEeuezmyhgswt0U= - arr-diff@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" @@ -3568,16 +3563,16 @@ callsites@^3.0.0: resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== -camelcase@5.3.1, camelcase@^5.0.0, camelcase@^5.2.0: - version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - camelcase@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" integrity sha1-MvxLn82vhF/N9+c7uXysImHwqwo= +camelcase@^5.0.0, camelcase@^5.2.0: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + camelize@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/camelize/-/camelize-1.0.0.tgz#164a5483e630fa4321e5af07020e531831b2609b" @@ -3896,13 +3891,6 @@ component-emitter@^1.2.1: resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== -compose-function@3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/compose-function/-/compose-function-3.0.3.tgz#9ed675f13cc54501d30950a486ff6a7ba3ab185f" - integrity sha1-ntZ18TzFRQHTCVCkhv9qe6OrGF8= - dependencies: - arity-n "^1.0.4" - compressible@~2.0.16: version "2.0.18" resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" @@ -3994,18 +3982,6 @@ content-type@~1.0.5: resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== -convert-source-map@1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" - integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== - dependencies: - safe-buffer "~5.1.1" - -convert-source-map@^0.3.3: - version "0.3.5" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-0.3.5.tgz#f1d802950af7dd2631a1febe0596550c86ab3190" - integrity sha1-8dgClQr33SYxof6+BZZVDIarMZA= - convert-source-map@^1.5.0: version "1.8.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" @@ -4013,6 +3989,11 @@ convert-source-map@^1.5.0: dependencies: safe-buffer "~5.1.1" +convert-source-map@^1.7.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" + integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== + convert-source-map@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" @@ -4261,16 +4242,6 @@ css-to-react-native@^3.0.0: css-color-keywords "^1.0.0" postcss-value-parser "^4.0.2" -css@^2.0.0: - version "2.2.4" - resolved "https://registry.yarnpkg.com/css/-/css-2.2.4.tgz#c646755c73971f2bba6a601e2cf2fd71b1298929" - integrity sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw== - dependencies: - inherits "^2.0.3" - source-map "^0.6.1" - source-map-resolve "^0.5.2" - urix "^0.1.0" - cssesc@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" @@ -5165,7 +5136,7 @@ es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.50: es6-symbol "~3.1.3" next-tick "~1.0.0" -es6-iterator@2.0.3, es6-iterator@^2.0.1, es6-iterator@^2.0.3, es6-iterator@~2.0.3: +es6-iterator@^2.0.1, es6-iterator@^2.0.3, es6-iterator@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c= @@ -7954,15 +7925,6 @@ loader-runner@^2.4.0: resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== -loader-utils@1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" - integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== - dependencies: - big.js "^5.2.2" - emojis-list "^2.0.0" - json5 "^1.0.1" - loader-utils@^0.2.5, loader-utils@~0.2.2, loader-utils@~0.2.3, loader-utils@~0.2.5: version "0.2.17" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.17.tgz#f86e6374d43205a6e6c60e9196f17c0299bfb348" @@ -8569,6 +8531,11 @@ nan@^2.12.1: resolved "https://registry.yarnpkg.com/nan/-/nan-2.15.0.tgz#3f34a473ff18e15c1b5626b62903b5ad6e665fee" integrity sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ== +nanoid@^3.3.7: + version "3.3.7" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" + integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== + nanomatch@^1.2.1, nanomatch@^1.2.9: version "1.2.13" resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" @@ -9390,15 +9357,6 @@ postcss-value-parser@^4.0.2: resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@7.0.36: - version "7.0.36" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.36.tgz#056f8cffa939662a8f5905950c07d5285644dfcb" - integrity sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw== - dependencies: - chalk "^2.4.2" - source-map "^0.6.1" - supports-color "^6.1.0" - postcss@^5.2.17: version "5.2.18" resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.18.tgz#badfa1497d46244f6390f58b319830d9107853c5" @@ -9417,6 +9375,15 @@ postcss@^7.0.14, postcss@^7.0.5, postcss@^7.0.6: picocolors "^0.2.1" source-map "^0.6.1" +postcss@^8.2.14: + version "8.4.38" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.38.tgz#b387d533baf2054288e337066d81c6bee9db9e0e" + integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A== + dependencies: + nanoid "^3.3.7" + picocolors "^1.0.0" + source-map-js "^1.2.0" + posthtml-parser@^0.2.0, posthtml-parser@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/posthtml-parser/-/posthtml-parser-0.2.1.tgz#35d530de386740c2ba24ff2eb2faf39ccdf271dd" @@ -10375,20 +10342,15 @@ resolve-protobuf-schema@^2.1.0: dependencies: protocol-buffers-schema "^3.3.1" -resolve-url-loader@^3.0.1: - version "3.1.4" - resolved "https://registry.yarnpkg.com/resolve-url-loader/-/resolve-url-loader-3.1.4.tgz#3c16caebe0b9faea9c7cc252fa49d2353c412320" - integrity sha512-D3sQ04o0eeQEySLrcz4DsX3saHfsr8/N6tfhblxgZKXxMT2Louargg12oGNfoTRLV09GXhVUe5/qgA5vdgNigg== - dependencies: - adjust-sourcemap-loader "3.0.0" - camelcase "5.3.1" - compose-function "3.0.3" - convert-source-map "1.7.0" - es6-iterator "2.0.3" - loader-utils "1.2.3" - postcss "7.0.36" - rework "1.0.1" - rework-visit "1.0.0" +resolve-url-loader@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz#ee3142fb1f1e0d9db9524d539cfa166e9314f795" + integrity sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg== + dependencies: + adjust-sourcemap-loader "^4.0.0" + convert-source-map "^1.7.0" + loader-utils "^2.0.0" + postcss "^8.2.14" source-map "0.6.1" resolve-url@^0.2.1: @@ -10443,19 +10405,6 @@ reusify@^1.0.4: resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== -rework-visit@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/rework-visit/-/rework-visit-1.0.0.tgz#9945b2803f219e2f7aca00adb8bc9f640f842c9a" - integrity sha1-mUWygD8hni96ygCtuLyfZA+ELJo= - -rework@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/rework/-/rework-1.0.1.tgz#30806a841342b54510aa4110850cd48534144aa7" - integrity sha1-MIBqhBNCtUUQqkEQhQzUhTQUSqc= - dependencies: - convert-source-map "^0.3.3" - css "^2.0.0" - rfdc@^1.3.0: version "1.3.1" resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.1.tgz#2b6d4df52dffe8bb346992a10ea9451f24373a8f" @@ -10932,7 +10881,12 @@ source-list-map@^2.0.0: resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== -source-map-resolve@^0.5.0, source-map-resolve@^0.5.2: +source-map-js@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" + integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== + +source-map-resolve@^0.5.0: version "0.5.3" resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== From 16948671aa68ebda2a2c81964752288ff51680ea Mon Sep 17 00:00:00 2001 From: "Peter A. Jonsson" Date: Thu, 2 May 2024 09:26:33 +0200 Subject: [PATCH 654/654] Update to underscore 1.12.1 This fixes CVE-2021-23358. --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 0ff928f6192..ed9b274eb2c 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,8 @@ "colors": "1.4.0", "@types/node": "^18.15.11", "@types/css-font-loading-module": "^0.0.9", - "terser-webpack-plugin": "^4.2.3" + "terser-webpack-plugin": "^4.2.3", + "underscore": "^1.12.1" }, "dependencies": { "@babel/core": "^7.23.5",