diff --git a/scripts/generateDocs.ts b/scripts/generateDocs.ts index 694c4feec..d9a2ff247 100644 --- a/scripts/generateDocs.ts +++ b/scripts/generateDocs.ts @@ -22,7 +22,6 @@ import ThemeViewState from "../src/Models/ThemeViewState" import Validators from "../src/UI/InputElement/Validators" import questions from "../public/assets/generated/layers/questions.json" import { LayerConfigJson } from "../src/Models/ThemeConfig/Json/LayerConfigJson" -import { Utils } from "../src/Utils" import { TagUtils } from "../src/Logic/Tags/TagUtils" import Script from "./Script" import { Changes } from "../src/Logic/Osm/Changes" @@ -562,7 +561,7 @@ export class GenerateDocs extends Script { item.url.startsWith("pmtiles://") ) ) - const serverInfos = Utils.DedupOnId(serverInfosDupl, (item) => item.url) + const serverInfos = Lists.dedupOnId(serverInfosDupl, (item) => item.url) const titles = Lists.dedup(Lists.noEmpty(serverInfos.map((s) => s.category))) titles.sort() diff --git a/scripts/generateLicenseInfo.ts b/scripts/generateLicenseInfo.ts index 2cb5ee215..a1352a612 100644 --- a/scripts/generateLicenseInfo.ts +++ b/scripts/generateLicenseInfo.ts @@ -327,7 +327,7 @@ export class GenerateLicenseInfo extends Script { } licenses.sort((a, b) => (a.path < b.path ? -1 : 1)) - licenses = Utils.DedupOnId(licenses, (l) => l.path) + licenses = Lists.dedupOnId(licenses, (l) => l.path) const path = dir + "/license_info.json" if (licenses.length === 0) { console.log("Removing", path, "as it is empty") diff --git a/src/Logic/ImageProviders/AllImageProviders.ts b/src/Logic/ImageProviders/AllImageProviders.ts index d4caf5b34..bff020e47 100644 --- a/src/Logic/ImageProviders/AllImageProviders.ts +++ b/src/Logic/ImageProviders/AllImageProviders.ts @@ -6,7 +6,6 @@ import { ImmutableStore, Store, Stores } from "../UIEventSource" import ImageProvider, { ProvidedImage } from "./ImageProvider" import { WikidataImageProvider } from "./WikidataImageProvider" import Panoramax from "./Panoramax" -import { Utils } from "../../Utils" import { ServerSourceInfo } from "../../Models/SourceOverview" import { Lists } from "../../Utils/Lists" @@ -151,7 +150,7 @@ export default class AllImageProviders { } const source = Stores.concat(allSources).map((result) => { const all = result.flatMap((x) => x) - return Utils.DedupOnId(all, (i) => [i?.id, i?.url, i?.alt_id]) + return Lists.dedupOnId(all, (i) => [i?.id, i?.url, i?.alt_id]) }) this._cachedImageStores[cachekey] = source return source diff --git a/src/Logic/Web/NearbyImagesSearch.ts b/src/Logic/Web/NearbyImagesSearch.ts index 576d012fb..75ea0f9f0 100644 --- a/src/Logic/Web/NearbyImagesSearch.ts +++ b/src/Logic/Web/NearbyImagesSearch.ts @@ -10,6 +10,7 @@ import { Point } from "geojson" import { ImageData, Panoramax, PanoramaxXYZ } from "panoramax-js/dist" import { Mapillary } from "../ImageProviders/Mapillary" import { ServerSourceInfo } from "../../Models/SourceOverview" +import { Lists } from "../../Utils/Lists" interface ImageFetcher { /** @@ -465,6 +466,6 @@ export class CombinedFetcher { this.fetchImage(source, lat, lon, state, sink) } - return { images: sink.mapD((imgs) => Utils.DedupOnId(imgs, (i) => i["id"])), state } + return { images: sink.mapD((imgs) => Lists.dedupOnId(imgs, (i) => i["id"])), state } } } diff --git a/src/Models/SourceOverview.ts b/src/Models/SourceOverview.ts index 5d4cf5e66..63d7a4606 100644 --- a/src/Models/SourceOverview.ts +++ b/src/Models/SourceOverview.ts @@ -10,7 +10,9 @@ import ThemeConfig from "../../src/Models/ThemeConfig/ThemeConfig" import { ThemeConfigJson } from "../../src/Models/ThemeConfig/Json/ThemeConfigJson" import SpecialVisualizations from "../../src/UI/SpecialVisualizations" import ValidationUtils from "../../src/Models/ThemeConfig/Conversion/ValidationUtils" -import { QuestionableTagRenderingConfigJson } from "../../src/Models/ThemeConfig/Json/QuestionableTagRenderingConfigJson" +import { + QuestionableTagRenderingConfigJson +} from "../../src/Models/ThemeConfig/Json/QuestionableTagRenderingConfigJson" import { LayerConfigJson } from "../../src/Models/ThemeConfig/Json/LayerConfigJson" import { Lists } from "../Utils/Lists" @@ -206,7 +208,7 @@ export class SourceOverview { } urls = urls.filter((item) => !!item?.url) urls.sort((a, b) => (a < b ? -1 : 1)) - urls = Utils.DedupOnId(urls, (item) => item.url) + urls = Lists.dedupOnId(urls, (item) => item.url) this.eliUrlsCached = urls return urls } diff --git a/src/Models/ThemeConfig/Conversion/PrepareLayer.ts b/src/Models/ThemeConfig/Conversion/PrepareLayer.ts index 11b849c3c..6db428e67 100644 --- a/src/Models/ThemeConfig/Conversion/PrepareLayer.ts +++ b/src/Models/ThemeConfig/Conversion/PrepareLayer.ts @@ -1,18 +1,6 @@ -import { - Concat, - DesugaringContext, - DesugaringStep, - Each, - FirstOf, - Fuse, - On, - SetDefault, -} from "./Conversion" +import { Concat, DesugaringContext, DesugaringStep, Each, FirstOf, Fuse, On, SetDefault } from "./Conversion" import { LayerConfigJson } from "../Json/LayerConfigJson" -import { - MinimalTagRenderingConfigJson, - TagRenderingConfigJson, -} from "../Json/TagRenderingConfigJson" +import { MinimalTagRenderingConfigJson, TagRenderingConfigJson } from "../Json/TagRenderingConfigJson" import { Utils } from "../../../Utils" import RewritableConfigJson from "../Json/RewritableConfigJson" import SpecialVisualizations from "../../../UI/SpecialVisualizations" @@ -1163,7 +1151,9 @@ export class PrepareLayer extends Fuse { "Fully prepares and expands a layer for the LayerConfig.", new DeriveSource(), new On("tagRenderings", new Each(new RewriteSpecial())), - new On("tagRenderings", new Concat(new ExpandRewrite()).andThenF(Utils.Flatten)), + new On("tagRenderings", new Concat(new ExpandRewrite()).andThenF(function (list: (T | T[])[]): T[] { + return Lists.flatten(list) + })), new On( "tagRenderings", (layer) => @@ -1180,7 +1170,9 @@ export class PrepareLayer extends Fuse { new On< (LineRenderingConfigJson | RewritableConfigJson)[], LayerConfigJson - >("lineRendering", new Each(new ExpandRewrite()).andThenF(Utils.Flatten)), + >("lineRendering", new Each(new ExpandRewrite()).andThenF(function (list: (T | T[])[]): T[] { + return Lists.flatten(list) + })), new On( "pointRendering", (layer) => diff --git a/src/Models/ThemeConfig/Conversion/PrevalidateLayer.ts b/src/Models/ThemeConfig/Conversion/PrevalidateLayer.ts index 55918223e..1f73474fc 100644 --- a/src/Models/ThemeConfig/Conversion/PrevalidateLayer.ts +++ b/src/Models/ThemeConfig/Conversion/PrevalidateLayer.ts @@ -178,9 +178,7 @@ export class PrevalidateLayer extends DesugaringStep { { // Check for multiple, identical builtin questions - usability for studio users - const duplicates = Utils.Duplicates( - json.tagRenderings.filter((tr) => typeof tr === "string") - ) + const duplicates = Lists.duplicates(json.tagRenderings.filter((tr) => typeof tr === "string")) for (let i = 0; i < json.tagRenderings.length; i++) { const tagRendering = json.tagRenderings[i] if (typeof tagRendering === "string" && duplicates.indexOf(tagRendering) > 0) { @@ -209,7 +207,7 @@ export class PrevalidateLayer extends DesugaringStep { { // duplicate ids in tagrenderings check const duplicates = Lists.noNull( - Utils.Duplicates(json.tagRenderings?.map((tr) => tr?.["id"])) + Lists.duplicates(json.tagRenderings?.map((tr) => tr?.["id"])) ) if (duplicates?.length > 0) { // It is tempting to add an index to this warning; however, due to labels the indices here might be different from the index in the tagRendering list @@ -312,9 +310,7 @@ export class PrevalidateLayer extends DesugaringStep { ) } - const duplicateIds = Utils.Duplicates( - (json.tagRenderings ?? [])?.map((f) => f["id"]).filter((id) => id !== "questions") - ) + const duplicateIds = Lists.duplicates((json.tagRenderings ?? [])?.map((f) => f["id"]).filter((id) => id !== "questions")) if (duplicateIds.length > 0 && !Utils.runningFromConsole) { context .enter("tagRenderings") diff --git a/src/Models/ThemeConfig/Conversion/ValidateTheme.ts b/src/Models/ThemeConfig/Conversion/ValidateTheme.ts index e24ce8c46..25d2fbf22 100644 --- a/src/Models/ThemeConfig/Conversion/ValidateTheme.ts +++ b/src/Models/ThemeConfig/Conversion/ValidateTheme.ts @@ -7,6 +7,7 @@ import ThemeConfig from "../ThemeConfig" import { Utils } from "../../../Utils" import { DetectDuplicatePresets, DoesImageExist, ValidateLanguageCompleteness } from "./Validation" import Constants from "../../Constants" +import { Lists } from "../../../Utils/Lists" export class ValidateTheme extends DesugaringStep { /** @@ -105,7 +106,7 @@ export class ValidateTheme extends DesugaringStep { } this._validateImage.convert(theme.icon, context.enter("icon")) } - const dups = Utils.Duplicates(json.layers.map((layer) => layer["id"])) + const dups = Lists.duplicates(json.layers.map((layer) => layer["id"])) if (dups.length > 0) { context.err( `The theme ${json.id} defines multiple layers with id ${dups.join(", ")}` diff --git a/src/Models/ThemeConfig/Conversion/Validation.ts b/src/Models/ThemeConfig/Conversion/Validation.ts index 2b87c97b6..4d4919442 100644 --- a/src/Models/ThemeConfig/Conversion/Validation.ts +++ b/src/Models/ThemeConfig/Conversion/Validation.ts @@ -24,6 +24,7 @@ import { AvailableRasterLayers } from "../../RasterLayers" import { eliCategory } from "../../RasterLayerProperties" import licenses from "../../../assets/generated/license_info.json" import { Strings } from "../../../Utils/Strings" +import { Lists } from "../../../Utils/Lists" export class ValidateLanguageCompleteness extends DesugaringStep { private readonly _languages: string[] @@ -1064,7 +1065,7 @@ export class DetectDuplicatePresets extends DesugaringStep { const enNames = presets.map((p) => p.title.textFor("en")) if (new Set(enNames).size != enNames.length) { - const dups = Utils.Duplicates(enNames) + const dups = Lists.duplicates(enNames) const layersWithDup = json.layers.filter((l) => l.presets.some((p) => dups.indexOf(p.title.textFor("en")) >= 0) ) diff --git a/src/Models/ThemeConfig/LayerConfig.ts b/src/Models/ThemeConfig/LayerConfig.ts index 3fa07c22f..8ca0de4e2 100644 --- a/src/Models/ThemeConfig/LayerConfig.ts +++ b/src/Models/ThemeConfig/LayerConfig.ts @@ -13,7 +13,6 @@ import PointRenderingConfig from "./PointRenderingConfig" import WithContextLoader from "./WithContextLoader" import LineRenderingConfig from "./LineRenderingConfig" import { TagRenderingConfigJson } from "./Json/TagRenderingConfigJson" -import { Utils } from "../../Utils" import { TagsFilter } from "../../Logic/Tags/TagsFilter" import FilterConfigJson from "./Json/FilterConfigJson" import { Overpass } from "../../Logic/Osm/Overpass" @@ -340,7 +339,7 @@ export default class LayerConfig extends WithContextLoader { } { - const duplicateIds = Utils.Duplicates(this.filters.map((f) => f.id)) + const duplicateIds = Lists.duplicates(this.filters.map((f) => f.id)) if (duplicateIds.length > 0) { throw `Some filters have a duplicate id: ${duplicateIds} (at ${context}.filters)` } diff --git a/src/UI/BigComponents/OfflineManagement.svelte b/src/UI/BigComponents/OfflineManagement.svelte index 21dc74914..7d37a3e6c 100644 --- a/src/UI/BigComponents/OfflineManagement.svelte +++ b/src/UI/BigComponents/OfflineManagement.svelte @@ -23,6 +23,7 @@ import Translations from "../i18n/Translations" import { default as Trans } from "../Base/Tr.svelte" import AccordionSingle from "../Flowbite/AccordionSingle.svelte" + import { Lists } from "../../Utils/Lists" export let state: ThemeViewState & SpecialVisualizationState = undefined export let autoDownload = state.autoDownloadOfflineBasemap @@ -202,7 +203,7 @@
- {Utils.toHumanByteSize(Utils.sum($installed.map((area) => area.size)))} + {Utils.toHumanByteSize(Lists.sum($installed.map((area) => area.size)))}