From c78e070636c8e0eeba4f4fa14094e24093b2a738 Mon Sep 17 00:00:00 2001 From: Samuel Degueldre Date: Fri, 25 Aug 2023 09:03:39 +0200 Subject: [PATCH] [IMP] runtime: do not check template equality outside dev mode When defining a template with a name that the template set already contains, we currently always check whether the template is the same and throw an error when it's not. This is potentially expensive as it can involve serializing a pretty large XML document. This check is only supposed to help during development so this commit disables this check outside dev mode. --- src/runtime/template_set.ts | 4 ++++ tests/compiler/validation.test.ts | 11 +++++++++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/runtime/template_set.ts b/src/runtime/template_set.ts index 4bcbe43e..e7d40403 100644 --- a/src/runtime/template_set.ts +++ b/src/runtime/template_set.ts @@ -66,6 +66,10 @@ export class TemplateSet { addTemplate(name: string, template: string | Element) { if (name in this.rawTemplates) { + // this check can be expensive, just silently ignore double definitions outside dev mode + if (!this.dev) { + return; + } const rawTemplate = this.rawTemplates[name]; const currentAsString = typeof rawTemplate === "string" diff --git a/tests/compiler/validation.test.ts b/tests/compiler/validation.test.ts index e90eaf9e..01ded356 100644 --- a/tests/compiler/validation.test.ts +++ b/tests/compiler/validation.test.ts @@ -11,8 +11,8 @@ describe("basic validation", () => { expect(() => context.getTemplate("invalidname")).toThrow("Missing template"); }); - test("cannot add a different template with the same name", () => { - const context = new TemplateSet(); + test("cannot add a different template with the same name in dev mode", () => { + const context = new TemplateSet({ dev: true }); context.addTemplate("test", ``); // Same template with the same name is fine expect(() => context.addTemplate("test", "")).not.toThrow(); @@ -20,6 +20,13 @@ describe("basic validation", () => { expect(() => context.addTemplate("test", "
")).toThrow("already defined"); }); + test("adding different template with same name outside dev mode silently ignores it", () => { + const context = new TemplateSet({ dev: false }); + context.addTemplate("test", ``); + expect(() => context.addTemplate("test", "
")).not.toThrow(); + expect(context.rawTemplates.test).toBe(""); + }); + test("invalid xml", () => { const template = "
"; expect(() => snapshotTemplate(template)).toThrow("Invalid XML in template");