From 8c3f1717a8af4f8b9bcbda085752a550516f7c9f Mon Sep 17 00:00:00 2001 From: Pete Bacon Darwin Date: Fri, 8 Feb 2019 22:10:19 +0000 Subject: [PATCH] refactor(core): do not remove `templateUrl` when resolving (#28055) When we resolve a component `templateUrl` we copy the contents of the resolved template file into the `template` property. Previously we would then remove the `templateUrl` to indicate that the component has been resolved. But this meant that we no longer had access to the URL of the original template file. This is essential for diagnostics messages about the template compilation. Now the existence of the `template` property overrides the existence of `templateUrl`, which allows us to keep the `templateUrl` property. PR Close #28055 --- packages/core/src/metadata/resource_loading.ts | 11 ++++++----- packages/core/test/metadata/resource_loading_spec.ts | 2 -- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/packages/core/src/metadata/resource_loading.ts b/packages/core/src/metadata/resource_loading.ts index 70c8a0235c..633e0ac871 100644 --- a/packages/core/src/metadata/resource_loading.ts +++ b/packages/core/src/metadata/resource_loading.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ -import { Component } from './directives'; +import {Component} from './directives'; /** @@ -42,7 +42,7 @@ import { Component } from './directives'; * contents of the resolved URL. Browser's `fetch()` method is a good default implementation. */ export function resolveComponentResources( - resourceResolver: (url: string) => (Promise }>)): Promise { + resourceResolver: (url: string) => (Promise}>)): Promise { // Store all promises which are fetching the resources. const urlFetches: Promise[] = []; @@ -62,7 +62,6 @@ export function resolveComponentResources( if (component.templateUrl) { cachedResourceResolve(component.templateUrl).then((template) => { component.template = template; - component.templateUrl = undefined; }); } const styleUrls = component.styleUrls; @@ -92,12 +91,14 @@ export function maybeQueueResolutionOfComponentResources(metadata: Component) { } export function componentNeedsResolution(component: Component): boolean { - return !!(component.templateUrl || component.styleUrls && component.styleUrls.length); + return !!( + (component.templateUrl && !component.template) || + component.styleUrls && component.styleUrls.length); } export function clearResolutionOfComponentResourcesQueue() { componentResourceResolutionQueue.clear(); } -function unwrapResponse(response: string | { text(): Promise }): string | Promise { +function unwrapResponse(response: string | {text(): Promise}): string|Promise { return typeof response == 'string' ? response : response.text(); } diff --git a/packages/core/test/metadata/resource_loading_spec.ts b/packages/core/test/metadata/resource_loading_spec.ts index 2c15e02a90..49d6ff5b6d 100644 --- a/packages/core/test/metadata/resource_loading_spec.ts +++ b/packages/core/test/metadata/resource_loading_spec.ts @@ -64,7 +64,6 @@ Did you run and wait for 'resolveComponentResources()'?`.trim()); compileComponent(MyComponent, metadata); await resolveComponentResources(testResolver); expect(MyComponent.ngComponentDef).toBeDefined(); - expect(metadata.templateUrl).toBe(undefined); expect(metadata.template).toBe('content'); expect(resourceFetchCount).toBe(1); }); @@ -127,7 +126,6 @@ Did you run and wait for 'resolveComponentResources()'?`.trim()); compileComponent(MyComponent, metadata); await resolveComponentResources(fetch); expect(MyComponent.ngComponentDef).toBeDefined(); - expect(metadata.templateUrl).toBe(undefined); expect(metadata.template).toBe('response for test://content'); }); });