From 18c75d2ba1c3e55d93276a2399e0afdcb60f3eb1 Mon Sep 17 00:00:00 2001 From: Hristo Deshev Date: Tue, 22 Dec 2015 15:01:45 +0200 Subject: [PATCH] Fix zone.js patches by avoiding multiple global moduleMerge's. The previous implementation was calling moduleMerge multiple times for a required module if it had more than one configured global lazy-loaded functions/properties. We now keep tracked of merged modules and merge only the first time. --- globals/globals.ts | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/globals/globals.ts b/globals/globals.ts index 0af8f290a..5ad0dad93 100644 --- a/globals/globals.ts +++ b/globals/globals.ts @@ -31,17 +31,24 @@ global.registerModule("ui/dialogs", () => require("ui/dialogs")); global.registerModule("../xhr/xhr", () => require("../xhr/xhr")); global.registerModule("fetch", () => require("fetch")); -function registerOnGlobalContext(name, module) { +const __tnsGlobalMergedModules = new Map(); + +function registerOnGlobalContext(name: string, module: string): void { + Object.defineProperty(global, name, { get: function () { // We do not need to cache require() call since it is already cached in the runtime. let m = global.loadModule(module); - global.moduleMerge(m, global); + if (!__tnsGlobalMergedModules.has(module)) { + __tnsGlobalMergedModules.set(module, true); + global.moduleMerge(m, global); + } // Redefine the property to make sure the above code is executed only once. - Object.defineProperty(this, name, { value: m[name], configurable: true, writable: true }); + let resolvedValue = m[name]; + Object.defineProperty(this, name, { value: resolvedValue, configurable: true, writable: true }); - return m[name]; + return resolvedValue; }, configurable: true });