forked from MapComplete/MapComplete
		
	Housekeeping
This commit is contained in:
		
							parent
							
								
									4ad1e67f6e
								
							
						
					
					
						commit
						da615acfb1
					
				
					 55 changed files with 1772 additions and 1455 deletions
				
			
		|  | @ -105,12 +105,12 @@ class DownloadNsiLogos extends Script { | |||
|             ) | ||||
|             for (let j = 0; j < results.length; j++) { | ||||
|                 let didDownload = results[j] | ||||
|                 if(didDownload !== "error"){ | ||||
|                 if (didDownload !== "error") { | ||||
|                     continue | ||||
|                 } | ||||
|                 console.log("Retrying", items[i + j].id, type) | ||||
|                 didDownload = await this.downloadLogo(items[i + j], type, basePath) | ||||
|                 if(didDownload === "error"){ | ||||
|                 if (didDownload === "error") { | ||||
|                     console.log("Failed again:", items[i + j].id) | ||||
|                 } | ||||
|             } | ||||
|  |  | |||
|  | @ -55,7 +55,7 @@ class ParseLayer extends Conversion< | |||
| 
 | ||||
|     convert( | ||||
|         path: string, | ||||
|         context: ConversionContext, | ||||
|         context: ConversionContext | ||||
|     ): { | ||||
|         parsed: LayerConfig | ||||
|         raw: LayerConfigJson | ||||
|  | @ -110,7 +110,7 @@ class AddIconSummary extends DesugaringStep<{ raw: LayerConfigJson; parsed: Laye | |||
|         const fixed = json.raw | ||||
|         const layerConfig = json.parsed | ||||
|         const pointRendering: PointRenderingConfig = layerConfig.mapRendering.find((pr) => | ||||
|             pr.location.has("point"), | ||||
|             pr.location.has("point") | ||||
|         ) | ||||
|         const defaultTags = layerConfig.GetBaseTags() | ||||
|         fixed["_layerIcon"] = Utils.NoNull( | ||||
|  | @ -125,7 +125,7 @@ class AddIconSummary extends DesugaringStep<{ raw: LayerConfigJson; parsed: Laye | |||
|                     result["color"] = c | ||||
|                 } | ||||
|                 return result | ||||
|             }), | ||||
|             }) | ||||
|         ) | ||||
|         return { raw: fixed, parsed: layerConfig } | ||||
|     } | ||||
|  | @ -147,7 +147,7 @@ class LayerOverviewUtils extends Script { | |||
| 
 | ||||
|     private static extractLayerIdsFrom( | ||||
|         themeFile: LayoutConfigJson, | ||||
|         includeInlineLayers = true, | ||||
|         includeInlineLayers = true | ||||
|     ): string[] { | ||||
|         const publicLayerIds: string[] = [] | ||||
|         if (!Array.isArray(themeFile.layers)) { | ||||
|  | @ -214,10 +214,10 @@ class LayerOverviewUtils extends Script { | |||
|                 | LayerConfigJson | ||||
|                 | string | ||||
|                 | { | ||||
|                 builtin | ||||
|             } | ||||
|                 )[] | ||||
|         }[], | ||||
|                       builtin | ||||
|                   } | ||||
|             )[] | ||||
|         }[] | ||||
|     ) { | ||||
|         const perId = new Map<string, any>() | ||||
|         for (const theme of themes) { | ||||
|  | @ -258,7 +258,7 @@ class LayerOverviewUtils extends Script { | |||
|         writeFileSync( | ||||
|             "./src/assets/generated/theme_overview.json", | ||||
|             JSON.stringify(sorted, null, "  "), | ||||
|             { encoding: "utf8" }, | ||||
|             { encoding: "utf8" } | ||||
|         ) | ||||
|     } | ||||
| 
 | ||||
|  | @ -270,7 +270,7 @@ class LayerOverviewUtils extends Script { | |||
|         writeFileSync( | ||||
|             `${LayerOverviewUtils.themePath}${theme.id}.json`, | ||||
|             JSON.stringify(theme, null, "  "), | ||||
|             { encoding: "utf8" }, | ||||
|             { encoding: "utf8" } | ||||
|         ) | ||||
|     } | ||||
| 
 | ||||
|  | @ -281,12 +281,12 @@ class LayerOverviewUtils extends Script { | |||
|         writeFileSync( | ||||
|             `${LayerOverviewUtils.layerPath}${layer.id}.json`, | ||||
|             JSON.stringify(layer, null, "  "), | ||||
|             { encoding: "utf8" }, | ||||
|             { encoding: "utf8" } | ||||
|         ) | ||||
|     } | ||||
| 
 | ||||
|     static asDict( | ||||
|         trs: QuestionableTagRenderingConfigJson[], | ||||
|         trs: QuestionableTagRenderingConfigJson[] | ||||
|     ): Map<string, QuestionableTagRenderingConfigJson> { | ||||
|         const d = new Map<string, QuestionableTagRenderingConfigJson>() | ||||
|         for (const tr of trs) { | ||||
|  | @ -299,12 +299,12 @@ class LayerOverviewUtils extends Script { | |||
|     getSharedTagRenderings( | ||||
|         doesImageExist: DoesImageExist, | ||||
|         bootstrapTagRenderings: Map<string, QuestionableTagRenderingConfigJson>, | ||||
|         bootstrapTagRenderingsOrder: string[], | ||||
|         bootstrapTagRenderingsOrder: string[] | ||||
|     ): QuestionableTagRenderingConfigJson[] | ||||
|     getSharedTagRenderings( | ||||
|         doesImageExist: DoesImageExist, | ||||
|         bootstrapTagRenderings: Map<string, QuestionableTagRenderingConfigJson> = null, | ||||
|         bootstrapTagRenderingsOrder: string[] = [], | ||||
|         bootstrapTagRenderingsOrder: string[] = [] | ||||
|     ): QuestionableTagRenderingConfigJson[] { | ||||
|         const prepareLayer = new PrepareLayer( | ||||
|             { | ||||
|  | @ -315,7 +315,7 @@ class LayerOverviewUtils extends Script { | |||
|             }, | ||||
|             { | ||||
|                 addTagRenderingsToContext: true, | ||||
|             }, | ||||
|             } | ||||
|         ) | ||||
| 
 | ||||
|         const path = "assets/layers/questions/questions.json" | ||||
|  | @ -335,7 +335,7 @@ class LayerOverviewUtils extends Script { | |||
|         return this.getSharedTagRenderings( | ||||
|             doesImageExist, | ||||
|             dict, | ||||
|             sharedQuestions.tagRenderings.map((tr) => tr["id"]), | ||||
|             sharedQuestions.tagRenderings.map((tr) => tr["id"]) | ||||
|         ) | ||||
|     } | ||||
| 
 | ||||
|  | @ -375,8 +375,8 @@ class LayerOverviewUtils extends Script { | |||
|             if (contents.indexOf("<text") > 0) { | ||||
|                 console.warn( | ||||
|                     "The SVG at " + | ||||
|                     path + | ||||
|                     " contains a `text`-tag. This is highly discouraged. Every machine viewing your theme has their own font libary, and the font you choose might not be present, resulting in a different font being rendered. Solution: open your .svg in inkscape (or another program), select the text and convert it to a path", | ||||
|                         path + | ||||
|                         " contains a `text`-tag. This is highly discouraged. Every machine viewing your theme has their own font libary, and the font you choose might not be present, resulting in a different font being rendered. Solution: open your .svg in inkscape (or another program), select the text and convert it to a path" | ||||
|                 ) | ||||
|                 errCount++ | ||||
|             } | ||||
|  | @ -392,14 +392,14 @@ class LayerOverviewUtils extends Script { | |||
|             args | ||||
|                 .find((a) => a.startsWith("--themes=")) | ||||
|                 ?.substring("--themes=".length) | ||||
|                 ?.split(",") ?? [], | ||||
|                 ?.split(",") ?? [] | ||||
|         ) | ||||
| 
 | ||||
|         const layerWhitelist = new Set( | ||||
|             args | ||||
|                 .find((a) => a.startsWith("--layers=")) | ||||
|                 ?.substring("--layers=".length) | ||||
|                 ?.split(",") ?? [], | ||||
|                 ?.split(",") ?? [] | ||||
|         ) | ||||
| 
 | ||||
|         const forceReload = args.some((a) => a == "--force") | ||||
|  | @ -428,11 +428,11 @@ class LayerOverviewUtils extends Script { | |||
|             sharedLayers, | ||||
|             recompiledThemes, | ||||
|             forceReload, | ||||
|             themeWhitelist, | ||||
|             themeWhitelist | ||||
|         ) | ||||
| 
 | ||||
|         new ValidateThemeEnsemble().convertStrict( | ||||
|             Array.from(sharedThemes.values()).map((th) => new LayoutConfig(th, true)), | ||||
|             Array.from(sharedThemes.values()).map((th) => new LayoutConfig(th, true)) | ||||
|         ) | ||||
| 
 | ||||
|         if (recompiledThemes.length > 0) { | ||||
|  | @ -440,7 +440,7 @@ class LayerOverviewUtils extends Script { | |||
|                 "./src/assets/generated/known_layers.json", | ||||
|                 JSON.stringify({ | ||||
|                     layers: Array.from(sharedLayers.values()).filter((l) => l.id !== "favourite"), | ||||
|                 }), | ||||
|                 }) | ||||
|             ) | ||||
|         } | ||||
| 
 | ||||
|  | @ -461,7 +461,7 @@ class LayerOverviewUtils extends Script { | |||
|             const proto: LayoutConfigJson = JSON.parse( | ||||
|                 readFileSync("./assets/themes/mapcomplete-changes/mapcomplete-changes.proto.json", { | ||||
|                     encoding: "utf8", | ||||
|                 }), | ||||
|                 }) | ||||
|             ) | ||||
|             const protolayer = <LayerConfigJson>( | ||||
|                 proto.layers.filter((l) => l["id"] === "mapcomplete-changes")[0] | ||||
|  | @ -478,12 +478,12 @@ class LayerOverviewUtils extends Script { | |||
|                 layers: ScriptUtils.getLayerFiles().map((f) => f.parsed), | ||||
|                 themes: ScriptUtils.getThemeFiles().map((f) => f.parsed), | ||||
|             }, | ||||
|             ConversionContext.construct([], []), | ||||
|             ConversionContext.construct([], []) | ||||
|         ) | ||||
| 
 | ||||
|         for (const [_, theme] of sharedThemes) { | ||||
|             theme.layers = theme.layers.filter( | ||||
|                 (l) => Constants.added_by_default.indexOf(l["id"]) < 0, | ||||
|                 (l) => Constants.added_by_default.indexOf(l["id"]) < 0 | ||||
|             ) | ||||
|         } | ||||
| 
 | ||||
|  | @ -492,7 +492,7 @@ class LayerOverviewUtils extends Script { | |||
|                 "./src/assets/generated/known_themes.json", | ||||
|                 JSON.stringify({ | ||||
|                     themes: Array.from(sharedThemes.values()), | ||||
|                 }), | ||||
|                 }) | ||||
|             ) | ||||
|         } | ||||
| 
 | ||||
|  | @ -504,7 +504,7 @@ class LayerOverviewUtils extends Script { | |||
|     private parseLayer( | ||||
|         doesImageExist: DoesImageExist, | ||||
|         prepLayer: PrepareLayer, | ||||
|         sharedLayerPath: string, | ||||
|         sharedLayerPath: string | ||||
|     ): { | ||||
|         raw: LayerConfigJson | ||||
|         parsed: LayerConfig | ||||
|  | @ -515,7 +515,7 @@ class LayerOverviewUtils extends Script { | |||
|         const parsed = parser.convertStrict(sharedLayerPath, context) | ||||
|         const result = AddIconSummary.singleton.convertStrict( | ||||
|             parsed, | ||||
|             context.inOperation("AddIconSummary"), | ||||
|             context.inOperation("AddIconSummary") | ||||
|         ) | ||||
|         return { ...result, context } | ||||
|     } | ||||
|  | @ -523,7 +523,7 @@ class LayerOverviewUtils extends Script { | |||
|     private buildLayerIndex( | ||||
|         doesImageExist: DoesImageExist, | ||||
|         forceReload: boolean, | ||||
|         whitelist: Set<string>, | ||||
|         whitelist: Set<string> | ||||
|     ): Map<string, LayerConfigJson> { | ||||
|         // First, we expand and validate all builtin layers. These are written to src/assets/generated/layers
 | ||||
|         // At the same time, an index of available layers is built.
 | ||||
|  | @ -578,17 +578,17 @@ class LayerOverviewUtils extends Script { | |||
| 
 | ||||
|         console.log( | ||||
|             "Recompiled layers " + | ||||
|             recompiledLayers.join(", ") + | ||||
|             " and skipped " + | ||||
|             skippedLayers.length + | ||||
|             " layers. Detected " + | ||||
|             warningCount + | ||||
|             " warnings", | ||||
|                 recompiledLayers.join(", ") + | ||||
|                 " and skipped " + | ||||
|                 skippedLayers.length + | ||||
|                 " layers. Detected " + | ||||
|                 warningCount + | ||||
|                 " warnings" | ||||
|         ) | ||||
|         // We always need the calculated tags of 'usersettings', so we export them separately
 | ||||
|         this.extractJavascriptCodeForLayer( | ||||
|             state.sharedLayers.get("usersettings"), | ||||
|             "./src/Logic/State/UserSettingsMetaTagging.ts", | ||||
|             "./src/Logic/State/UserSettingsMetaTagging.ts" | ||||
|         ) | ||||
| 
 | ||||
|         return sharedLayers | ||||
|  | @ -605,8 +605,8 @@ class LayerOverviewUtils extends Script { | |||
|     private extractJavascriptCode(themeFile: LayoutConfigJson) { | ||||
|         const allCode = [ | ||||
|             "import {Feature} from 'geojson'", | ||||
|             "import { ExtraFuncType } from \"../../../Logic/ExtraFunctions\";", | ||||
|             "import { Utils } from \"../../../Utils\"", | ||||
|             'import { ExtraFuncType } from "../../../Logic/ExtraFunctions";', | ||||
|             'import { Utils } from "../../../Utils"', | ||||
|             "export class ThemeMetaTagging {", | ||||
|             "   public static readonly themeName = " + JSON.stringify(themeFile.id), | ||||
|             "", | ||||
|  | @ -618,8 +618,8 @@ class LayerOverviewUtils extends Script { | |||
| 
 | ||||
|             allCode.push( | ||||
|                 "   public metaTaggging_for_" + | ||||
|                 id + | ||||
|                 "(feat: Feature, helperFunctions: Record<ExtraFuncType, (feature: Feature) => Function>) {", | ||||
|                     id + | ||||
|                     "(feat: Feature, helperFunctions: Record<ExtraFuncType, (feature: Feature) => Function>) {" | ||||
|             ) | ||||
|             allCode.push("      const {" + ExtraFunctions.types.join(", ") + "} = helperFunctions") | ||||
|             for (const line of code) { | ||||
|  | @ -630,10 +630,10 @@ class LayerOverviewUtils extends Script { | |||
|                 if (!isStrict) { | ||||
|                     allCode.push( | ||||
|                         "      Utils.AddLazyProperty(feat.properties, '" + | ||||
|                         attributeName + | ||||
|                         "', () => " + | ||||
|                         expression + | ||||
|                         " ) ", | ||||
|                             attributeName + | ||||
|                             "', () => " + | ||||
|                             expression + | ||||
|                             " ) " | ||||
|                     ) | ||||
|                 } else { | ||||
|                     attributeName = attributeName.substring(0, attributeName.length - 1).trim() | ||||
|  | @ -678,7 +678,7 @@ class LayerOverviewUtils extends Script { | |||
|         const code = l.calculatedTags ?? [] | ||||
| 
 | ||||
|         allCode.push( | ||||
|             "   public metaTaggging_for_" + l.id + "(feat: {properties: Record<string, string>}) {", | ||||
|             "   public metaTaggging_for_" + l.id + "(feat: {properties: Record<string, string>}) {" | ||||
|         ) | ||||
|         for (const line of code) { | ||||
|             const firstEq = line.indexOf("=") | ||||
|  | @ -688,10 +688,10 @@ class LayerOverviewUtils extends Script { | |||
|             if (!isStrict) { | ||||
|                 allCode.push( | ||||
|                     "      Utils.AddLazyProperty(feat.properties, '" + | ||||
|                     attributeName + | ||||
|                     "', () => " + | ||||
|                     expression + | ||||
|                     " ) ", | ||||
|                         attributeName + | ||||
|                         "', () => " + | ||||
|                         expression + | ||||
|                         " ) " | ||||
|                 ) | ||||
|             } else { | ||||
|                 attributeName = attributeName.substring(0, attributeName.length - 2).trim() | ||||
|  | @ -716,14 +716,14 @@ class LayerOverviewUtils extends Script { | |||
|         sharedLayers: Map<string, LayerConfigJson>, | ||||
|         recompiledThemes: string[], | ||||
|         forceReload: boolean, | ||||
|         whitelist: Set<string>, | ||||
|         whitelist: Set<string> | ||||
|     ): Map<string, LayoutConfigJson> { | ||||
|         console.log("   ---------- VALIDATING BUILTIN THEMES ---------") | ||||
|         const themeFiles = ScriptUtils.getThemeFiles() | ||||
|         const fixed = new Map<string, LayoutConfigJson>() | ||||
| 
 | ||||
|         const publicLayers = LayerOverviewUtils.publicLayerIdsFrom( | ||||
|             themeFiles.map((th) => th.parsed), | ||||
|             themeFiles.map((th) => th.parsed) | ||||
|         ) | ||||
| 
 | ||||
|         const trs = this.getSharedTagRenderings(new DoesImageExist(licensePaths, existsSync)) | ||||
|  | @ -763,15 +763,15 @@ class LayerOverviewUtils extends Script { | |||
|                 LayerOverviewUtils.themePath + "/" + themePath.substring(themePath.lastIndexOf("/")) | ||||
| 
 | ||||
|             const usedLayers = Array.from( | ||||
|                 LayerOverviewUtils.extractLayerIdsFrom(themeFile, false), | ||||
|                 LayerOverviewUtils.extractLayerIdsFrom(themeFile, false) | ||||
|             ).map((id) => LayerOverviewUtils.layerPath + id + ".json") | ||||
| 
 | ||||
|             if (!forceReload && !this.shouldBeUpdated([themePath, ...usedLayers], targetPath)) { | ||||
|                 fixed.set( | ||||
|                     themeFile.id, | ||||
|                     JSON.parse( | ||||
|                         readFileSync(LayerOverviewUtils.themePath + themeFile.id + ".json", "utf8"), | ||||
|                     ), | ||||
|                         readFileSync(LayerOverviewUtils.themePath + themeFile.id + ".json", "utf8") | ||||
|                     ) | ||||
|                 ) | ||||
|                 ScriptUtils.erasableLog("Skipping", themeFile.id) | ||||
|                 skippedThemes.push(themeFile.id) | ||||
|  | @ -782,23 +782,23 @@ class LayerOverviewUtils extends Script { | |||
| 
 | ||||
|             new PrevalidateTheme().convertStrict( | ||||
|                 themeFile, | ||||
|                 ConversionContext.construct([themePath], ["PrepareLayer"]), | ||||
|                 ConversionContext.construct([themePath], ["PrepareLayer"]) | ||||
|             ) | ||||
|             try { | ||||
|                 themeFile = new PrepareTheme(convertState, { | ||||
|                     skipDefaultLayers: true, | ||||
|                 }).convertStrict( | ||||
|                     themeFile, | ||||
|                     ConversionContext.construct([themePath], ["PrepareLayer"]), | ||||
|                     ConversionContext.construct([themePath], ["PrepareLayer"]) | ||||
|                 ) | ||||
|                 new ValidateThemeAndLayers( | ||||
|                     new DoesImageExist(licensePaths, existsSync, knownTagRenderings), | ||||
|                     themePath, | ||||
|                     true, | ||||
|                     knownTagRenderings, | ||||
|                     knownTagRenderings | ||||
|                 ).convertStrict( | ||||
|                     themeFile, | ||||
|                     ConversionContext.construct([themePath], ["PrepareLayer"]), | ||||
|                     ConversionContext.construct([themePath], ["PrepareLayer"]) | ||||
|                 ) | ||||
| 
 | ||||
|                 if (themeFile.icon.endsWith(".svg")) { | ||||
|  | @ -850,16 +850,16 @@ class LayerOverviewUtils extends Script { | |||
|                             t.shortDescription ?? new Translation(t.description).FirstSentence(), | ||||
|                         mustHaveLanguage: t.mustHaveLanguage?.length > 0, | ||||
|                     } | ||||
|                 }), | ||||
|                 }) | ||||
|             ) | ||||
|         } | ||||
| 
 | ||||
|         console.log( | ||||
|             "Recompiled themes " + | ||||
|             recompiledThemes.join(", ") + | ||||
|             " and skipped " + | ||||
|             skippedThemes.length + | ||||
|             " themes", | ||||
|                 recompiledThemes.join(", ") + | ||||
|                 " and skipped " + | ||||
|                 skippedThemes.length + | ||||
|                 " themes" | ||||
|         ) | ||||
| 
 | ||||
|         return fixed | ||||
|  |  | |||
|  | @ -19,9 +19,16 @@ class GenerateSummaryTileCache extends Script { | |||
|         } | ||||
|     } | ||||
| 
 | ||||
|     async fetchTile(z: number, x: number, y: number, layersSummed: string): Promise<Feature<Point>> { | ||||
|     async fetchTile( | ||||
|         z: number, | ||||
|         x: number, | ||||
|         y: number, | ||||
|         layersSummed: string | ||||
|     ): Promise<Feature<Point>> { | ||||
|         const index = Tiles.tile_index(z, x, y) | ||||
|         let feature: Feature<Point> | any = (await SummaryTileSource.downloadTile(index, this.url, layersSummed).AsPromise())[0] | ||||
|         let feature: Feature<Point> | any = ( | ||||
|             await SummaryTileSource.downloadTile(index, this.url, layersSummed).AsPromise() | ||||
|         )[0] | ||||
|         if (!feature) { | ||||
|             feature = { properties: { total: 0 } } | ||||
|         } | ||||
|  | @ -34,7 +41,13 @@ class GenerateSummaryTileCache extends Script { | |||
|         return feature | ||||
|     } | ||||
| 
 | ||||
|     async fetchTileRecursive(z: number, x: number, y: number, layersSummed: string, sleepMs = 0): Promise<Feature<Point>> { | ||||
|     async fetchTileRecursive( | ||||
|         z: number, | ||||
|         x: number, | ||||
|         y: number, | ||||
|         layersSummed: string, | ||||
|         sleepMs = 0 | ||||
|     ): Promise<Feature<Point>> { | ||||
|         const index = Tiles.tile_index(z, x, y) | ||||
|         const path = this.cacheDir + "tile_" + z + "_" + x + "_" + y + ".json" | ||||
|         if (existsSync(path)) { | ||||
|  | @ -48,11 +61,12 @@ class GenerateSummaryTileCache extends Script { | |||
|             feature = await this.fetchTile(z, x, y, layersSummed) | ||||
|         } else { | ||||
|             const parts = [ | ||||
|                await this.fetchTileRecursive(z + 1, x * 2, y * 2, layersSummed), | ||||
|                await this.fetchTileRecursive(z + 1, x * 2 + 1, y * 2, layersSummed), | ||||
|                await this.fetchTileRecursive(z + 1, x * 2, y * 2 + 1, layersSummed), | ||||
|                await this.fetchTileRecursive(z + 1, x * 2 + 1, y * 2 + 1, layersSummed)] | ||||
|             const sum = this.sumTotals(parts.map(f => f.properties)) | ||||
|                 await this.fetchTileRecursive(z + 1, x * 2, y * 2, layersSummed), | ||||
|                 await this.fetchTileRecursive(z + 1, x * 2 + 1, y * 2, layersSummed), | ||||
|                 await this.fetchTileRecursive(z + 1, x * 2, y * 2 + 1, layersSummed), | ||||
|                 await this.fetchTileRecursive(z + 1, x * 2 + 1, y * 2 + 1, layersSummed), | ||||
|             ] | ||||
|             const sum = this.sumTotals(parts.map((f) => f.properties)) | ||||
|             feature = <Feature<Point>>{ | ||||
|                 type: "Feature", | ||||
|                 properties: sum, | ||||
|  | @ -77,14 +91,13 @@ class GenerateSummaryTileCache extends Script { | |||
|         return sum | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
|     async main(args: string[]): Promise<void> { | ||||
| 
 | ||||
|         const layers = await Utils.downloadJson<{ layers: string[], meta: object }>(this.url + "/status.json") | ||||
|         const layersSummed = layers.layers.map(l => encodeURIComponent(l)).join("+") | ||||
|         const layers = await Utils.downloadJson<{ layers: string[]; meta: object }>( | ||||
|             this.url + "/status.json" | ||||
|         ) | ||||
|         const layersSummed = layers.layers.map((l) => encodeURIComponent(l)).join("+") | ||||
|         const r = await this.fetchTileRecursive(0, 0, 0, layersSummed) | ||||
|         console.log(r) | ||||
| 
 | ||||
|     } | ||||
| } | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue