diff --git a/packages/core/src/render3/component_ref.ts b/packages/core/src/render3/component_ref.ts index 03ff592959..3bb4c25088 100644 --- a/packages/core/src/render3/component_ref.ts +++ b/packages/core/src/render3/component_ref.ts @@ -16,16 +16,16 @@ import {ElementRef as viewEngine_ElementRef} from '../linker/element_ref'; import {NgModuleRef as viewEngine_NgModuleRef} from '../linker/ng_module_factory'; import {RendererFactory2} from '../render/api'; import {Type} from '../type'; - +import {VERSION} from '../version'; import {assertComponentType, assertDefined} from './assert'; import {LifecycleHooksFeature, createRootComponent, createRootComponentView, createRootContext} from './component'; import {getComponentDef} from './definition'; import {NodeInjector} from './di'; import {createLViewData, createNodeAtIndex, createTView, createViewNode, elementCreate, locateHostElement, refreshDescendantViews} from './instructions'; import {ComponentDef, RenderFlags} from './interfaces/definition'; -import {TContainerNode, TElementContainerNode, TElementNode, TNode, TNodeType, TViewNode} from './interfaces/node'; -import {RElement, RendererFactory3, domRendererFactory3} from './interfaces/renderer'; -import {FLAGS, HEADER_OFFSET, INJECTOR, LViewData, LViewFlags, RootContext, TVIEW} from './interfaces/view'; +import {TContainerNode, TElementContainerNode, TElementNode, TNode, TNodeType} from './interfaces/node'; +import {RElement, RendererFactory3, domRendererFactory3, isProceduralRenderer} from './interfaces/renderer'; +import {HEADER_OFFSET, LViewData, LViewFlags, RootContext, TVIEW} from './interfaces/view'; import {enterView, leaveView} from './state'; import {defaultScheduler, getTNode} from './util'; import {createElementRef} from './view_engine_compatibility'; @@ -141,6 +141,14 @@ export class ComponentFactory extends viewEngine_ComponentFactory { const renderer = rendererFactory.createRenderer(hostRNode, this.componentDef); const rootViewInjector = ngModule ? createChainedInjector(injector, ngModule.injector) : injector; + + if (rootSelectorOrNode && hostRNode) { + ngDevMode && ngDevMode.rendererSetAttribute++; + isProceduralRenderer(renderer) ? + renderer.setAttribute(hostRNode, 'ng-version', VERSION.full) : + hostRNode.setAttribute('ng-version', VERSION.full); + } + // Create the root view. Uses empty TView and ContentTemplate. const rootView: LViewData = createLViewData( renderer, createTView(-1, null, 1, 0, null, null, null), rootContext, rootFlags, undefined, diff --git a/packages/core/test/bundling/hello_world_r2/bundle.golden_symbols.json b/packages/core/test/bundling/hello_world_r2/bundle.golden_symbols.json index f66d9efc0d..9c4fe6aecf 100644 --- a/packages/core/test/bundling/hello_world_r2/bundle.golden_symbols.json +++ b/packages/core/test/bundling/hello_world_r2/bundle.golden_symbols.json @@ -440,6 +440,9 @@ { "name": "UnsubscriptionErrorImpl" }, + { + "name": "VERSION" + }, { "name": "VIEWS" }, diff --git a/packages/core/test/bundling/todo_r2/bundle.golden_symbols.json b/packages/core/test/bundling/todo_r2/bundle.golden_symbols.json index d5a236d5fb..2ec554f072 100644 --- a/packages/core/test/bundling/todo_r2/bundle.golden_symbols.json +++ b/packages/core/test/bundling/todo_r2/bundle.golden_symbols.json @@ -926,6 +926,9 @@ { "name": "VALID_ELEMENTS" }, + { + "name": "VERSION" + }, { "name": "VIEWS" }, diff --git a/packages/platform-server/test/integration_spec.ts b/packages/platform-server/test/integration_spec.ts index 15be437172..858ceab948 100644 --- a/packages/platform-server/test/integration_spec.ts +++ b/packages/platform-server/test/integration_spec.ts @@ -539,32 +539,29 @@ class HiddenModule { }); afterEach(() => { expect(called).toBe(true); }); - fixmeIvy('to investigate') && - it('using long form should work', async(() => { - const platform = - platformDynamicServer([{provide: INITIAL_CONFIG, useValue: {document: doc}}]); + it('using long form should work', async(() => { + const platform = + platformDynamicServer([{provide: INITIAL_CONFIG, useValue: {document: doc}}]); - platform.bootstrapModule(AsyncServerModule) - .then((moduleRef) => { - const applicationRef: ApplicationRef = moduleRef.injector.get(ApplicationRef); - return applicationRef.isStable.pipe(first((isStable: boolean) => isStable)) - .toPromise(); - }) - .then((b) => { - expect(platform.injector.get(PlatformState).renderToString()) - .toBe(expectedOutput); - platform.destroy(); - called = true; - }); - })); - - fixmeIvy('to investigate') && - it('using renderModule should work', async(() => { - renderModule(AsyncServerModule, {document: doc}).then(output => { - expect(output).toBe(expectedOutput); + platform.bootstrapModule(AsyncServerModule) + .then((moduleRef) => { + const applicationRef: ApplicationRef = moduleRef.injector.get(ApplicationRef); + return applicationRef.isStable.pipe(first((isStable: boolean) => isStable)) + .toPromise(); + }) + .then((b) => { + expect(platform.injector.get(PlatformState).renderToString()).toBe(expectedOutput); + platform.destroy(); called = true; }); - })); + })); + + it('using renderModule should work', async(() => { + renderModule(AsyncServerModule, {document: doc}).then(output => { + expect(output).toBe(expectedOutput); + called = true; + }); + })); it('using renderModuleFactory should work', async(inject([PlatformRef], (defaultPlatform: PlatformRef) => { @@ -609,14 +606,13 @@ class HiddenModule { })); - fixmeIvy('to investigate') && - it('sets a prefix for the _nghost and _ngcontent attributes', async(() => { - renderModule(ExampleStylesModule, {document: doc}).then(output => { - expect(output).toMatch( - /