forked from MapComplete/MapComplete
		
	Reformat all files with prettier
This commit is contained in:
		
							parent
							
								
									e22d189376
								
							
						
					
					
						commit
						b541d3eab4
					
				
					 382 changed files with 50893 additions and 35566 deletions
				
			
		|  | @ -1,43 +1,44 @@ | |||
| import ScriptUtils from "./ScriptUtils"; | ||||
| import {existsSync, mkdirSync, readFileSync, statSync, writeFileSync} from "fs"; | ||||
| import ScriptUtils from "./ScriptUtils" | ||||
| import { existsSync, mkdirSync, readFileSync, statSync, writeFileSync } from "fs" | ||||
| import * as licenses from "../assets/generated/license_info.json" | ||||
| import {LayoutConfigJson} from "../Models/ThemeConfig/Json/LayoutConfigJson"; | ||||
| import {LayerConfigJson} from "../Models/ThemeConfig/Json/LayerConfigJson"; | ||||
| import Constants from "../Models/Constants"; | ||||
| import { LayoutConfigJson } from "../Models/ThemeConfig/Json/LayoutConfigJson" | ||||
| import { LayerConfigJson } from "../Models/ThemeConfig/Json/LayerConfigJson" | ||||
| import Constants from "../Models/Constants" | ||||
| import { | ||||
|     DoesImageExist, | ||||
|     PrevalidateTheme, | ||||
|     ValidateLayer, | ||||
|     ValidateTagRenderings, | ||||
|     ValidateThemeAndLayers | ||||
| } from "../Models/ThemeConfig/Conversion/Validation"; | ||||
| import {Translation} from "../UI/i18n/Translation"; | ||||
| import {TagRenderingConfigJson} from "../Models/ThemeConfig/Json/TagRenderingConfigJson"; | ||||
| import * as questions from "../assets/tagRenderings/questions.json"; | ||||
| import * as icons from "../assets/tagRenderings/icons.json"; | ||||
| import PointRenderingConfigJson from "../Models/ThemeConfig/Json/PointRenderingConfigJson"; | ||||
| import {PrepareLayer} from "../Models/ThemeConfig/Conversion/PrepareLayer"; | ||||
| import {PrepareTheme} from "../Models/ThemeConfig/Conversion/PrepareTheme"; | ||||
| import {DesugaringContext} from "../Models/ThemeConfig/Conversion/Conversion"; | ||||
| import {Utils} from "../Utils"; | ||||
| import {AllKnownLayouts} from "../Customizations/AllKnownLayouts"; | ||||
|     ValidateThemeAndLayers, | ||||
| } from "../Models/ThemeConfig/Conversion/Validation" | ||||
| import { Translation } from "../UI/i18n/Translation" | ||||
| import { TagRenderingConfigJson } from "../Models/ThemeConfig/Json/TagRenderingConfigJson" | ||||
| import * as questions from "../assets/tagRenderings/questions.json" | ||||
| import * as icons from "../assets/tagRenderings/icons.json" | ||||
| import PointRenderingConfigJson from "../Models/ThemeConfig/Json/PointRenderingConfigJson" | ||||
| import { PrepareLayer } from "../Models/ThemeConfig/Conversion/PrepareLayer" | ||||
| import { PrepareTheme } from "../Models/ThemeConfig/Conversion/PrepareTheme" | ||||
| import { DesugaringContext } from "../Models/ThemeConfig/Conversion/Conversion" | ||||
| import { Utils } from "../Utils" | ||||
| import { AllKnownLayouts } from "../Customizations/AllKnownLayouts" | ||||
| 
 | ||||
| // This scripts scans 'assets/layers/*.json' for layer definition files and 'assets/themes/*.json' for theme definition files.
 | ||||
| // It spits out an overview of those to be used to load them
 | ||||
| 
 | ||||
| class LayerOverviewUtils { | ||||
| 
 | ||||
|     public static readonly layerPath = "./assets/generated/layers/" | ||||
|     public static readonly themePath = "./assets/generated/themes/" | ||||
| 
 | ||||
|     private static publicLayerIdsFrom(themefiles: LayoutConfigJson[]): Set<string> { | ||||
|         const publicThemes = [].concat(...themefiles | ||||
|             .filter(th => !th.hideFromOverview)) | ||||
|         const publicThemes = [].concat(...themefiles.filter((th) => !th.hideFromOverview)) | ||||
| 
 | ||||
|         return new Set([].concat(...publicThemes.map(th => this.extractLayerIdsFrom(th)))) | ||||
|         return new Set([].concat(...publicThemes.map((th) => this.extractLayerIdsFrom(th)))) | ||||
|     } | ||||
| 
 | ||||
|     private static extractLayerIdsFrom(themeFile: LayoutConfigJson, includeInlineLayers = true): string[] { | ||||
|     private static extractLayerIdsFrom( | ||||
|         themeFile: LayoutConfigJson, | ||||
|         includeInlineLayers = true | ||||
|     ): string[] { | ||||
|         const publicLayerIds = [] | ||||
|         for (const publicLayer of themeFile.layers) { | ||||
|             if (typeof publicLayer === "string") { | ||||
|  | @ -50,7 +51,7 @@ class LayerOverviewUtils { | |||
|                     publicLayerIds.push(bi) | ||||
|                     continue | ||||
|                 } | ||||
|                 bi.forEach(id => publicLayerIds.push(id)) | ||||
|                 bi.forEach((id) => publicLayerIds.push(id)) | ||||
|                 continue | ||||
|             } | ||||
|             if (includeInlineLayers) { | ||||
|  | @ -62,24 +63,33 @@ class LayerOverviewUtils { | |||
| 
 | ||||
|     shouldBeUpdated(sourcefile: string | string[], targetfile: string): boolean { | ||||
|         if (!existsSync(targetfile)) { | ||||
|             return true; | ||||
|             return true | ||||
|         } | ||||
|         const targetModified = statSync(targetfile).mtime | ||||
|         if (typeof sourcefile === "string") { | ||||
|             sourcefile = [sourcefile] | ||||
|         } | ||||
| 
 | ||||
|         return sourcefile.some(sourcefile => statSync(sourcefile).mtime > targetModified) | ||||
|         return sourcefile.some((sourcefile) => statSync(sourcefile).mtime > targetModified) | ||||
|     } | ||||
| 
 | ||||
|     writeSmallOverview(themes: { id: string, title: any, shortDescription: any, icon: string, hideFromOverview: boolean, mustHaveLanguage: boolean, layers: (LayerConfigJson | string | { builtin })[] }[]) { | ||||
|         const perId = new Map<string, any>(); | ||||
|     writeSmallOverview( | ||||
|         themes: { | ||||
|             id: string | ||||
|             title: any | ||||
|             shortDescription: any | ||||
|             icon: string | ||||
|             hideFromOverview: boolean | ||||
|             mustHaveLanguage: boolean | ||||
|             layers: (LayerConfigJson | string | { builtin })[] | ||||
|         }[] | ||||
|     ) { | ||||
|         const perId = new Map<string, any>() | ||||
|         for (const theme of themes) { | ||||
| 
 | ||||
|             const keywords: {}[] = [] | ||||
|             for (const layer of (theme.layers ?? [])) { | ||||
|                 const l = <LayerConfigJson>layer; | ||||
|                 keywords.push({"*": l.id}) | ||||
|             for (const layer of theme.layers ?? []) { | ||||
|                 const l = <LayerConfigJson>layer | ||||
|                 keywords.push({ "*": l.id }) | ||||
|                 keywords.push(l.title) | ||||
|                 keywords.push(l.description) | ||||
|             } | ||||
|  | @ -91,56 +101,69 @@ class LayerOverviewUtils { | |||
|                 icon: theme.icon, | ||||
|                 hideFromOverview: theme.hideFromOverview, | ||||
|                 mustHaveLanguage: theme.mustHaveLanguage, | ||||
|                 keywords: Utils.NoNull(keywords) | ||||
|                 keywords: Utils.NoNull(keywords), | ||||
|             } | ||||
|             perId.set(theme.id, data); | ||||
|             perId.set(theme.id, data) | ||||
|         } | ||||
| 
 | ||||
| 
 | ||||
|         const sorted = Constants.themeOrder.map(id => { | ||||
|         const sorted = Constants.themeOrder.map((id) => { | ||||
|             if (!perId.has(id)) { | ||||
|                 throw "Ordered theme id " + id + " not found" | ||||
|             } | ||||
|             return perId.get(id); | ||||
|         }); | ||||
| 
 | ||||
|             return perId.get(id) | ||||
|         }) | ||||
| 
 | ||||
|         perId.forEach((value) => { | ||||
|             if (Constants.themeOrder.indexOf(value.id) >= 0) { | ||||
|                 return; // actually a continue
 | ||||
|                 return // actually a continue
 | ||||
|             } | ||||
|             sorted.push(value) | ||||
|         }) | ||||
| 
 | ||||
|         writeFileSync("./assets/generated/theme_overview.json", JSON.stringify(sorted, null, "  "), "UTF8"); | ||||
|         writeFileSync( | ||||
|             "./assets/generated/theme_overview.json", | ||||
|             JSON.stringify(sorted, null, "  "), | ||||
|             "UTF8" | ||||
|         ) | ||||
|     } | ||||
| 
 | ||||
|     writeTheme(theme: LayoutConfigJson) { | ||||
|         if (!existsSync(LayerOverviewUtils.themePath)) { | ||||
|             mkdirSync(LayerOverviewUtils.themePath); | ||||
|             mkdirSync(LayerOverviewUtils.themePath) | ||||
|         } | ||||
|         writeFileSync(`${LayerOverviewUtils.themePath}${theme.id}.json`, JSON.stringify(theme, null, "  "), "UTF8"); | ||||
|         writeFileSync( | ||||
|             `${LayerOverviewUtils.themePath}${theme.id}.json`, | ||||
|             JSON.stringify(theme, null, "  "), | ||||
|             "UTF8" | ||||
|         ) | ||||
|     } | ||||
| 
 | ||||
|     writeLayer(layer: LayerConfigJson) { | ||||
|         if (!existsSync(LayerOverviewUtils.layerPath)) { | ||||
|             mkdirSync(LayerOverviewUtils.layerPath); | ||||
|             mkdirSync(LayerOverviewUtils.layerPath) | ||||
|         } | ||||
|         writeFileSync(`${LayerOverviewUtils.layerPath}${layer.id}.json`, JSON.stringify(layer, null, "  "), "UTF8"); | ||||
|         writeFileSync( | ||||
|             `${LayerOverviewUtils.layerPath}${layer.id}.json`, | ||||
|             JSON.stringify(layer, null, "  "), | ||||
|             "UTF8" | ||||
|         ) | ||||
|     } | ||||
| 
 | ||||
|     getSharedTagRenderings(doesImageExist: DoesImageExist): Map<string, TagRenderingConfigJson> { | ||||
|         const dict = new Map<string, TagRenderingConfigJson>(); | ||||
|         const dict = new Map<string, TagRenderingConfigJson>() | ||||
| 
 | ||||
|         const validator = new ValidateTagRenderings(undefined, doesImageExist); | ||||
|         const validator = new ValidateTagRenderings(undefined, doesImageExist) | ||||
|         for (const key in questions["default"]) { | ||||
|             if (key === "id") { | ||||
|                 continue | ||||
|             } | ||||
|             questions[key].id = key; | ||||
|             questions[key].id = key | ||||
|             questions[key]["source"] = "shared-questions" | ||||
|             const config = <TagRenderingConfigJson>questions[key] | ||||
|             validator.convertStrict(config, "generate-layer-overview:tagRenderings/questions.json:" + key) | ||||
|             validator.convertStrict( | ||||
|                 config, | ||||
|                 "generate-layer-overview:tagRenderings/questions.json:" + key | ||||
|             ) | ||||
|             dict.set(key, config) | ||||
|         } | ||||
|         for (const key in icons["default"]) { | ||||
|  | @ -150,9 +173,12 @@ class LayerOverviewUtils { | |||
|             if (typeof icons[key] !== "object") { | ||||
|                 continue | ||||
|             } | ||||
|             icons[key].id = key; | ||||
|             icons[key].id = key | ||||
|             const config = <TagRenderingConfigJson>icons[key] | ||||
|             validator.convertStrict(config, "generate-layer-overview:tagRenderings/icons.json:" + key) | ||||
|             validator.convertStrict( | ||||
|                 config, | ||||
|                 "generate-layer-overview:tagRenderings/icons.json:" + key | ||||
|             ) | ||||
|             dict.set(key, config) | ||||
|         } | ||||
| 
 | ||||
|  | @ -160,35 +186,43 @@ class LayerOverviewUtils { | |||
|             if (key === "id") { | ||||
|                 return | ||||
|             } | ||||
|             value.id = value.id ?? key; | ||||
|             value.id = value.id ?? key | ||||
|         }) | ||||
| 
 | ||||
|         return dict; | ||||
|         return dict | ||||
|     } | ||||
| 
 | ||||
|     checkAllSvgs() { | ||||
|         const allSvgs = ScriptUtils.readDirRecSync("./assets") | ||||
|             .filter(path => path.endsWith(".svg")) | ||||
|             .filter(path => !path.startsWith("./assets/generated")) | ||||
|         let errCount = 0; | ||||
|         const exempt = ["assets/SocialImageTemplate.svg", "assets/SocialImageTemplateWide.svg", "assets/SocialImageBanner.svg", "assets/svg/osm-logo.svg"]; | ||||
|             .filter((path) => path.endsWith(".svg")) | ||||
|             .filter((path) => !path.startsWith("./assets/generated")) | ||||
|         let errCount = 0 | ||||
|         const exempt = [ | ||||
|             "assets/SocialImageTemplate.svg", | ||||
|             "assets/SocialImageTemplateWide.svg", | ||||
|             "assets/SocialImageBanner.svg", | ||||
|             "assets/svg/osm-logo.svg", | ||||
|         ] | ||||
|         for (const path of allSvgs) { | ||||
|             if (exempt.some(p => "./" + p === path)) { | ||||
|             if (exempt.some((p) => "./" + p === path)) { | ||||
|                 continue | ||||
|             } | ||||
| 
 | ||||
|             const contents = readFileSync(path, "UTF8") | ||||
|             if (contents.indexOf("data:image/png;") >= 0) { | ||||
|                 console.warn("The SVG at " + path + " is a fake SVG: it contains PNG data!") | ||||
|                 errCount++; | ||||
|                 errCount++ | ||||
|                 if (path.startsWith("./assets/svg")) { | ||||
|                     throw "A core SVG is actually a PNG. Don't do this!" | ||||
|                 } | ||||
|             } | ||||
|             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") | ||||
|                 errCount++; | ||||
| 
 | ||||
|                 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" | ||||
|                 ) | ||||
|                 errCount++ | ||||
|             } | ||||
|         } | ||||
|         if (errCount > 0) { | ||||
|  | @ -197,91 +231,115 @@ class LayerOverviewUtils { | |||
|     } | ||||
| 
 | ||||
|     main(args: string[]) { | ||||
| 
 | ||||
|         const forceReload = args.some(a => a == "--force") | ||||
|         const forceReload = args.some((a) => a == "--force") | ||||
| 
 | ||||
|         const licensePaths = new Set<string>() | ||||
|         for (const i in licenses) { | ||||
|             licensePaths.add(licenses[i].path) | ||||
|         } | ||||
|         const doesImageExist = new DoesImageExist(licensePaths, existsSync) | ||||
|         const sharedLayers = this.buildLayerIndex(doesImageExist, forceReload); | ||||
|         const sharedLayers = this.buildLayerIndex(doesImageExist, forceReload) | ||||
|         const recompiledThemes: string[] = [] | ||||
|         const sharedThemes = this.buildThemeIndex(doesImageExist, sharedLayers, recompiledThemes, forceReload) | ||||
|         const sharedThemes = this.buildThemeIndex( | ||||
|             doesImageExist, | ||||
|             sharedLayers, | ||||
|             recompiledThemes, | ||||
|             forceReload | ||||
|         ) | ||||
| 
 | ||||
|         writeFileSync("./assets/generated/known_layers_and_themes.json", JSON.stringify({ | ||||
|             "layers": Array.from(sharedLayers.values()), | ||||
|             "themes": Array.from(sharedThemes.values()) | ||||
|         })) | ||||
|         writeFileSync( | ||||
|             "./assets/generated/known_layers_and_themes.json", | ||||
|             JSON.stringify({ | ||||
|                 layers: Array.from(sharedLayers.values()), | ||||
|                 themes: Array.from(sharedThemes.values()), | ||||
|             }) | ||||
|         ) | ||||
| 
 | ||||
|         writeFileSync("./assets/generated/known_layers.json", JSON.stringify({layers: Array.from(sharedLayers.values())})) | ||||
|         writeFileSync( | ||||
|             "./assets/generated/known_layers.json", | ||||
|             JSON.stringify({ layers: Array.from(sharedLayers.values()) }) | ||||
|         ) | ||||
| 
 | ||||
| 
 | ||||
|         if (recompiledThemes.length > 0 && !(recompiledThemes.length === 1 && recompiledThemes[0] === "mapcomplete-changes")) { | ||||
|         if ( | ||||
|             recompiledThemes.length > 0 && | ||||
|             !(recompiledThemes.length === 1 && recompiledThemes[0] === "mapcomplete-changes") | ||||
|         ) { | ||||
|             // mapcomplete-changes shows an icon for each corresponding mapcomplete-theme
 | ||||
|             const iconsPerTheme = | ||||
|                 Array.from(sharedThemes.values()).map(th => ({ | ||||
|                     if: "theme=" + th.id, | ||||
|                     then: th.icon | ||||
|                 })) | ||||
|             const proto: LayoutConfigJson = JSON.parse(readFileSync("./assets/themes/mapcomplete-changes/mapcomplete-changes.proto.json", "UTF8")); | ||||
|             const protolayer = <LayerConfigJson>(proto.layers.filter(l => l["id"] === "mapcomplete-changes")[0]) | ||||
|             const rendering = (<PointRenderingConfigJson>protolayer.mapRendering[0]) | ||||
|             const iconsPerTheme = Array.from(sharedThemes.values()).map((th) => ({ | ||||
|                 if: "theme=" + th.id, | ||||
|                 then: th.icon, | ||||
|             })) | ||||
|             const proto: LayoutConfigJson = JSON.parse( | ||||
|                 readFileSync( | ||||
|                     "./assets/themes/mapcomplete-changes/mapcomplete-changes.proto.json", | ||||
|                     "UTF8" | ||||
|                 ) | ||||
|             ) | ||||
|             const protolayer = <LayerConfigJson>( | ||||
|                 proto.layers.filter((l) => l["id"] === "mapcomplete-changes")[0] | ||||
|             ) | ||||
|             const rendering = <PointRenderingConfigJson>protolayer.mapRendering[0] | ||||
|             rendering.icon["mappings"] = iconsPerTheme | ||||
|             writeFileSync('./assets/themes/mapcomplete-changes/mapcomplete-changes.json', JSON.stringify(proto, null, "  ")) | ||||
|             writeFileSync( | ||||
|                 "./assets/themes/mapcomplete-changes/mapcomplete-changes.json", | ||||
|                 JSON.stringify(proto, null, "  ") | ||||
|             ) | ||||
|         } | ||||
| 
 | ||||
|         this.checkAllSvgs() | ||||
|          | ||||
|         if(AllKnownLayouts.getSharedLayersConfigs().size == 0){ | ||||
|             console.error( "This was a bootstrapping-run. Run generate layeroverview again!") | ||||
|         }else{ | ||||
|             const green = s => '\x1b[92m' + s + '\x1b[0m' | ||||
| 
 | ||||
|         if (AllKnownLayouts.getSharedLayersConfigs().size == 0) { | ||||
|             console.error("This was a bootstrapping-run. Run generate layeroverview again!") | ||||
|         } else { | ||||
|             const green = (s) => "\x1b[92m" + s + "\x1b[0m" | ||||
|             console.log(green("All done!")) | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     private buildLayerIndex(doesImageExist: DoesImageExist, forceReload: boolean): Map<string, LayerConfigJson> { | ||||
|     private buildLayerIndex( | ||||
|         doesImageExist: DoesImageExist, | ||||
|         forceReload: boolean | ||||
|     ): Map<string, LayerConfigJson> { | ||||
|         // First, we expand and validate all builtin layers. These are written to assets/generated/layers
 | ||||
|         // At the same time, an index of available layers is built.
 | ||||
|         console.log("   ---------- VALIDATING BUILTIN LAYERS ---------") | ||||
| 
 | ||||
|         const sharedTagRenderings = this.getSharedTagRenderings(doesImageExist); | ||||
|         const sharedTagRenderings = this.getSharedTagRenderings(doesImageExist) | ||||
|         const state: DesugaringContext = { | ||||
|             tagRenderings: sharedTagRenderings, | ||||
|             sharedLayers: AllKnownLayouts.getSharedLayersConfigs() | ||||
|             sharedLayers: AllKnownLayouts.getSharedLayersConfigs(), | ||||
|         } | ||||
|         const sharedLayers = new Map<string, LayerConfigJson>() | ||||
|         const prepLayer = new PrepareLayer(state); | ||||
|         const prepLayer = new PrepareLayer(state) | ||||
|         const skippedLayers: string[] = [] | ||||
|         const recompiledLayers: string[] = [] | ||||
|         for (const sharedLayerPath of ScriptUtils.getLayerPaths()) { | ||||
| 
 | ||||
|             { | ||||
|                 const targetPath = LayerOverviewUtils.layerPath + sharedLayerPath.substring(sharedLayerPath.lastIndexOf("/")) | ||||
|                 const targetPath = | ||||
|                     LayerOverviewUtils.layerPath + | ||||
|                     sharedLayerPath.substring(sharedLayerPath.lastIndexOf("/")) | ||||
|                 if (!forceReload && !this.shouldBeUpdated(sharedLayerPath, targetPath)) { | ||||
|                     const sharedLayer = JSON.parse(readFileSync(targetPath, "utf8")) | ||||
|                     sharedLayers.set(sharedLayer.id, sharedLayer) | ||||
|                     skippedLayers.push(sharedLayer.id) | ||||
|                     console.log("Loaded "+sharedLayer.id) | ||||
|                     continue; | ||||
|                     console.log("Loaded " + sharedLayer.id) | ||||
|                     continue | ||||
|                 } | ||||
| 
 | ||||
|             } | ||||
|             let parsed; | ||||
|             let parsed | ||||
|             try { | ||||
|                 parsed = JSON.parse(readFileSync(sharedLayerPath, "utf8")) | ||||
|             } catch (e) { | ||||
|                 throw ("Could not parse or read file " + sharedLayerPath) | ||||
|                 throw "Could not parse or read file " + sharedLayerPath | ||||
|             } | ||||
|             const context = "While building builtin layer " + sharedLayerPath | ||||
|             const fixed = prepLayer.convertStrict(parsed, context) | ||||
| 
 | ||||
|             if (fixed.source.osmTags["and"] === undefined) { | ||||
|                 fixed.source.osmTags = {"and": [fixed.source.osmTags]} | ||||
|                 fixed.source.osmTags = { and: [fixed.source.osmTags] } | ||||
|             } | ||||
| 
 | ||||
|             const validator = new ValidateLayer(sharedLayerPath, true, doesImageExist); | ||||
|             const validator = new ValidateLayer(sharedLayerPath, true, doesImageExist) | ||||
|             validator.convertStrict(fixed, context) | ||||
| 
 | ||||
|             if (sharedLayers.has(fixed.id)) { | ||||
|  | @ -292,74 +350,108 @@ class LayerOverviewUtils { | |||
|             recompiledLayers.push(fixed.id) | ||||
| 
 | ||||
|             this.writeLayer(fixed) | ||||
| 
 | ||||
| 
 | ||||
|         } | ||||
| 
 | ||||
|         console.log("Recompiled layers " + recompiledLayers.join(", ") + " and skipped " + skippedLayers.length + " layers") | ||||
|         console.log( | ||||
|             "Recompiled layers " + | ||||
|                 recompiledLayers.join(", ") + | ||||
|                 " and skipped " + | ||||
|                 skippedLayers.length + | ||||
|                 " layers" | ||||
|         ) | ||||
| 
 | ||||
|         return sharedLayers; | ||||
|         return sharedLayers | ||||
|     } | ||||
| 
 | ||||
|     private buildThemeIndex(doesImageExist: DoesImageExist, sharedLayers: Map<string, LayerConfigJson>, recompiledThemes: string[], forceReload: boolean): Map<string, LayoutConfigJson> { | ||||
|     private buildThemeIndex( | ||||
|         doesImageExist: DoesImageExist, | ||||
|         sharedLayers: Map<string, LayerConfigJson>, | ||||
|         recompiledThemes: string[], | ||||
|         forceReload: boolean | ||||
|     ): Map<string, LayoutConfigJson> { | ||||
|         console.log("   ---------- VALIDATING BUILTIN THEMES ---------") | ||||
|         const themeFiles = ScriptUtils.getThemeFiles(); | ||||
|         const fixed = new Map<string, LayoutConfigJson>(); | ||||
|         const themeFiles = ScriptUtils.getThemeFiles() | ||||
|         const fixed = new Map<string, LayoutConfigJson>() | ||||
| 
 | ||||
|         const publicLayers = LayerOverviewUtils.publicLayerIdsFrom(themeFiles.map(th => th.parsed)) | ||||
|         const publicLayers = LayerOverviewUtils.publicLayerIdsFrom( | ||||
|             themeFiles.map((th) => th.parsed) | ||||
|         ) | ||||
| 
 | ||||
|         const convertState: DesugaringContext = { | ||||
|             sharedLayers, | ||||
|             tagRenderings: this.getSharedTagRenderings(doesImageExist), | ||||
|             publicLayers | ||||
|             publicLayers, | ||||
|         } | ||||
|         const skippedThemes: string[] = [] | ||||
|         for (const themeInfo of themeFiles) { | ||||
| 
 | ||||
|             const themePath = themeInfo.path; | ||||
|             const themePath = themeInfo.path | ||||
|             let themeFile = themeInfo.parsed | ||||
| 
 | ||||
|             { | ||||
|                 const targetPath = LayerOverviewUtils.themePath + "/" + themePath.substring(themePath.lastIndexOf("/")) | ||||
|                 const usedLayers = Array.from(LayerOverviewUtils.extractLayerIdsFrom(themeFile, false)) | ||||
|                     .map(id => LayerOverviewUtils.layerPath + id + ".json") | ||||
|                 const targetPath = | ||||
|                     LayerOverviewUtils.themePath + | ||||
|                     "/" + | ||||
|                     themePath.substring(themePath.lastIndexOf("/")) | ||||
|                 const usedLayers = Array.from( | ||||
|                     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'))) | ||||
|                     fixed.set( | ||||
|                         themeFile.id, | ||||
|                         JSON.parse( | ||||
|                             readFileSync( | ||||
|                                 LayerOverviewUtils.themePath + themeFile.id + ".json", | ||||
|                                 "utf8" | ||||
|                             ) | ||||
|                         ) | ||||
|                     ) | ||||
|                     skippedThemes.push(themeFile.id) | ||||
|                     continue; | ||||
|                     continue | ||||
|                 } | ||||
|                 recompiledThemes.push(themeFile.id) | ||||
|             } | ||||
| 
 | ||||
|             new PrevalidateTheme().convertStrict(themeFile, themePath) | ||||
|             try { | ||||
| 
 | ||||
|                 themeFile = new PrepareTheme(convertState).convertStrict(themeFile, themePath) | ||||
| 
 | ||||
|                 new ValidateThemeAndLayers(doesImageExist, themePath, true, convertState.tagRenderings) | ||||
|                     .convertStrict(themeFile, themePath) | ||||
|                 new ValidateThemeAndLayers( | ||||
|                     doesImageExist, | ||||
|                     themePath, | ||||
|                     true, | ||||
|                     convertState.tagRenderings | ||||
|                 ).convertStrict(themeFile, themePath) | ||||
| 
 | ||||
|                 this.writeTheme(themeFile) | ||||
|                 fixed.set(themeFile.id, themeFile) | ||||
|             } catch (e) { | ||||
|                 console.error("ERROR: could not prepare theme " + themePath + " due to " + e) | ||||
|                 throw e; | ||||
|                 throw e | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         this.writeSmallOverview(Array.from(fixed.values()).map(t => { | ||||
|             return { | ||||
|                 ...t, | ||||
|                 hideFromOverview: t.hideFromOverview ?? false, | ||||
|                 shortDescription: t.shortDescription ?? new Translation(t.description).FirstSentence().translations, | ||||
|                 mustHaveLanguage: t.mustHaveLanguage?.length > 0, | ||||
|             } | ||||
|         })); | ||||
|         this.writeSmallOverview( | ||||
|             Array.from(fixed.values()).map((t) => { | ||||
|                 return { | ||||
|                     ...t, | ||||
|                     hideFromOverview: t.hideFromOverview ?? false, | ||||
|                     shortDescription: | ||||
|                         t.shortDescription ?? | ||||
|                         new Translation(t.description).FirstSentence().translations, | ||||
|                     mustHaveLanguage: t.mustHaveLanguage?.length > 0, | ||||
|                 } | ||||
|             }) | ||||
|         ) | ||||
| 
 | ||||
|         console.log("Recompiled themes " + recompiledThemes.join(", ") + " and skipped " + skippedThemes.length + " themes") | ||||
| 
 | ||||
|         return fixed; | ||||
|         console.log( | ||||
|             "Recompiled themes " + | ||||
|                 recompiledThemes.join(", ") + | ||||
|                 " and skipped " + | ||||
|                 skippedThemes.length + | ||||
|                 " themes" | ||||
|         ) | ||||
| 
 | ||||
|         return fixed | ||||
|     } | ||||
| } | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue