From f2d4458e15431f73faede90ce03f82d21a2a964d Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Mon, 22 Apr 2024 23:43:30 +0200 Subject: [PATCH] Improve error message when merging an override fails --- .../ThemeConfig/Conversion/ConversionContext.ts | 15 +++++++++++++++ src/Models/ThemeConfig/Conversion/PrepareLayer.ts | 14 +++++++------- src/Models/ThemeConfig/Conversion/PrepareTheme.ts | 6 +++--- src/Utils.ts | 3 --- 4 files changed, 25 insertions(+), 13 deletions(-) diff --git a/src/Models/ThemeConfig/Conversion/ConversionContext.ts b/src/Models/ThemeConfig/Conversion/ConversionContext.ts index f0b567c74..d03f2a3eb 100644 --- a/src/Models/ThemeConfig/Conversion/ConversionContext.ts +++ b/src/Models/ThemeConfig/Conversion/ConversionContext.ts @@ -1,4 +1,5 @@ import { ConversionMessage, ConversionMsgLevel } from "./Conversion" +import { Utils } from "../../../Utils" export class ConversionContext { private static reported = false @@ -148,4 +149,18 @@ export class ConversionContext { debug(message: string) { this.messages.push({ context: this, level: "debug", message }) } + + /** + * Exactly the same as Utils.Merge, except that it wraps the error message + * @param source + * @param target + * @constructor + */ + MergeObjectsForOverride(source: Readonly, target: T): T & S { + try{ + return Utils.Merge(source,target) + }catch (e) { + this.err("Could not apply an override: due to "+e+"\n\tHINT: did you just pull changes from the repository or switch branches? Try 'npm run reset:layeroverview'") + } + } } diff --git a/src/Models/ThemeConfig/Conversion/PrepareLayer.ts b/src/Models/ThemeConfig/Conversion/PrepareLayer.ts index 8906b818d..159e3aa5f 100644 --- a/src/Models/ThemeConfig/Conversion/PrepareLayer.ts +++ b/src/Models/ThemeConfig/Conversion/PrepareLayer.ts @@ -212,7 +212,7 @@ class ExpandTagRendering extends Conversion< return result } - private lookup(name: string): TagRenderingConfigJson[] | undefined { + private lookup(name: string, ctx: ConversionContext): TagRenderingConfigJson[] | undefined { const direct = this.directLookup(name) if (direct === undefined) { @@ -224,13 +224,13 @@ class ExpandTagRendering extends Conversion< if (nm !== undefined) { let indirect: TagRenderingConfigJson[] if (typeof nm === "string") { - indirect = this.lookup(nm) + indirect = this.lookup(nm, ctx) } else { - indirect = [].concat(...nm.map((n) => this.lookup(n))) + indirect = [].concat(...nm.map((n) => this.lookup(n, ctx))) } for (let foundTr of indirect) { foundTr = Utils.Clone(foundTr) - Utils.Merge(tagRenderingConfigJson["override"] ?? {}, foundTr) + ctx.Merge(tagRenderingConfigJson["override"] ?? {}, foundTr) foundTr["id"] = tagRenderingConfigJson["id"] ?? foundTr["id"] result.push(foundTr) } @@ -318,7 +318,7 @@ class ExpandTagRendering extends Conversion< if (typeof tr === "string") { let lookup if (this._state.tagRenderings !== null) { - lookup = this.lookup(tr) + lookup = this.lookup(tr, ctx) } if (lookup === undefined) { if ( @@ -382,7 +382,7 @@ class ExpandTagRendering extends Conversion< const trs: TagRenderingConfigJson[] = [] for (const name of names) { - const lookup = this.lookup(name) + const lookup = this.lookup(name, ctx) if (lookup === undefined) { let candidates = Array.from(state.tagRenderings.keys()) if (name.indexOf(".") > 0) { @@ -433,7 +433,7 @@ class ExpandTagRendering extends Conversion< } for (let foundTr of lookup) { foundTr = Utils.Clone(foundTr) - Utils.Merge(tr["override"] ?? {}, foundTr) + ctx.MergeObjectsForOverride(tr["override"] ?? {}, foundTr) if (names.length == 1) { foundTr["id"] = tr["id"] ?? foundTr["id"] } diff --git a/src/Models/ThemeConfig/Conversion/PrepareTheme.ts b/src/Models/ThemeConfig/Conversion/PrepareTheme.ts index f452a3bfa..8c43691ea 100644 --- a/src/Models/ThemeConfig/Conversion/PrepareTheme.ts +++ b/src/Models/ThemeConfig/Conversion/PrepareTheme.ts @@ -97,7 +97,7 @@ class SubstituteLayer extends Conversion { ) } - convert(json: LayoutConfigJson, _: ConversionContext): LayoutConfigJson { + convert(json: LayoutConfigJson, ctx: ConversionContext): LayoutConfigJson { const overrideAll = json.overrideAll if (overrideAll === undefined) { return json @@ -324,7 +324,7 @@ class ApplyOverrideAll extends DesugaringStep { for (let layer of json.layers) { layer = Utils.Clone(layer) - Utils.Merge(overrideAll, layer) + ctx.MergeObjectsForOverride(overrideAll, layer) if (tagRenderingsPlus) { if (!layer.tagRenderings) { layer.tagRenderings = tagRenderingsPlus diff --git a/src/Utils.ts b/src/Utils.ts index f82054e1c..bbddfc418 100644 --- a/src/Utils.ts +++ b/src/Utils.ts @@ -622,9 +622,6 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be } for (const key in source) { - if (!source.hasOwnProperty(key)) { - continue - } if (key.startsWith("=")) { const trimmedKey = key.substr(1) target[trimmedKey] = source[key]