feat(compiler): support sync runtime compile

Adds new abstraction `Compiler` with methods
`compileComponentAsync` and `compileComponentSync`.
This is in preparation of deprecating `ComponentResolver`.

`compileComponentSync` is able to compile components
synchronously given all components either have an inline
template or they have been compiled before.

Also changes `TestComponentBuilder.createSync` to
take a `Type` and use the new `compileComponentSync` method.

Also supports overriding the component metadata even if
the component has already been compiled.

Also fixes #7084 in a better way.

BREAKING CHANGE:
`TestComponentBuilder.createSync` now takes a component type
and throws if not all templates are either inlined
are compiled before via `createAsync`.

Closes #9594
This commit is contained in:
Tobias Bosch
2016-06-24 08:46:43 -07:00
parent 24eb8389d2
commit bf598d6b8b
35 changed files with 1093 additions and 700 deletions

View File

@ -310,21 +310,24 @@ export declare class CompilerConfig {
});
}
export declare class CompileTemplateMetadata {
export declare class CompileTemplateMetadata implements CompileStylesheetMetadata {
animations: CompileAnimationEntryMetadata[];
encapsulation: ViewEncapsulation;
externalStylesheets: CompileStylesheetMetadata[];
interpolation: [string, string];
moduleUrl: string;
ngContentSelectors: string[];
styleUrls: string[];
styles: string[];
template: string;
templateUrl: string;
constructor({encapsulation, template, templateUrl, styles, styleUrls, animations, ngContentSelectors, interpolation}?: {
constructor({encapsulation, template, templateUrl, styles, styleUrls, externalStylesheets, animations, ngContentSelectors, interpolation}?: {
encapsulation?: ViewEncapsulation;
template?: string;
templateUrl?: string;
styles?: string[];
styleUrls?: string[];
externalStylesheets?: CompileStylesheetMetadata[];
ngContentSelectors?: string[];
animations?: CompileAnimationEntryMetadata[];
interpolation?: [string, string];
@ -460,9 +463,8 @@ export declare class NormalizedComponentWithViewDirectives {
}
export declare class OfflineCompiler {
constructor(_directiveNormalizer: DirectiveNormalizer, _templateParser: TemplateParser, _styleCompiler: StyleCompiler, _viewCompiler: ViewCompiler, _outputEmitter: OutputEmitter, _xhr: XHR);
compileTemplates(components: NormalizedComponentWithViewDirectives[]): SourceModule;
loadAndCompileStylesheet(stylesheetUrl: string, shim: boolean, suffix: string): Promise<StyleSheetSourceWithImports>;
constructor(_directiveNormalizer: DirectiveNormalizer, _templateParser: TemplateParser, _styleCompiler: StyleCompiler, _viewCompiler: ViewCompiler, _outputEmitter: OutputEmitter);
compileTemplates(components: NormalizedComponentWithViewDirectives[]): SourceModule[];
normalizeDirectiveMetadata(directive: CompileDirectiveMetadata): Promise<CompileDirectiveMetadata>;
}
@ -515,9 +517,12 @@ export declare abstract class RenderTypes {
renderer: CompileIdentifierMetadata;
}
export declare class RuntimeCompiler implements ComponentResolver {
constructor(_metadataResolver: CompileMetadataResolver, _templateNormalizer: DirectiveNormalizer, _templateParser: TemplateParser, _styleCompiler: StyleCompiler, _viewCompiler: ViewCompiler, _xhr: XHR, _genConfig: CompilerConfig);
export declare class RuntimeCompiler implements ComponentResolver, Compiler {
constructor(_metadataResolver: CompileMetadataResolver, _templateNormalizer: DirectiveNormalizer, _templateParser: TemplateParser, _styleCompiler: StyleCompiler, _viewCompiler: ViewCompiler, _genConfig: CompilerConfig);
clearCache(): void;
clearCacheFor(compType: Type): void;
compileComponentAsync<T>(compType: ConcreteType<T>): Promise<ComponentFactory<T>>;
compileComponentSync<T>(compType: ConcreteType<T>): ComponentFactory<T>;
resolveComponent(component: Type | string): Promise<ComponentFactory<any>>;
}

View File

@ -1,4 +1,5 @@
export declare class MockDirectiveResolver extends DirectiveResolver {
constructor(_injector: Injector);
resolve(type: Type): DirectiveMetadata;
setProvidersOverride(type: Type, providers: any[]): void;
setViewProvidersOverride(type: Type, viewProviders: any[]): void;
@ -22,7 +23,7 @@ export declare class MockSchemaRegistry implements ElementSchemaRegistry {
}
export declare class MockViewResolver extends ViewResolver {
constructor();
constructor(_injector: Injector);
overrideViewDirective(component: Type, from: Type, to: Type): void;
resolve(component: Type): ViewMetadata;
setAnimations(component: Type, animations: AnimationEntryMetadata[]): void;
@ -32,7 +33,8 @@ export declare class MockViewResolver extends ViewResolver {
export declare class OverridingTestComponentBuilder extends TestComponentBuilder {
constructor(injector: Injector);
createAsync(rootComponentType: Type): Promise<ComponentFixture<any>>;
createAsync<T>(rootComponentType: ConcreteType<T>): Promise<ComponentFixture<T>>;
createSync<T>(rootComponentType: ConcreteType<T>): ComponentFixture<T>;
overrideAnimations(componentType: Type, animations: AnimationEntryMetadata[]): TestComponentBuilder;
overrideDirective(componentType: Type, from: Type, to: Type): OverridingTestComponentBuilder;
overrideProviders(type: Type, providers: any[]): OverridingTestComponentBuilder;

View File

@ -207,7 +207,7 @@ export declare abstract class ChangeDetectorRef {
}
/** @stable */
export declare function Class(clsDef: ClassDefinition): ConcreteType;
export declare function Class(clsDef: ClassDefinition): ConcreteType<any>;
/** @stable */
export interface ClassDefinition {
@ -226,6 +226,14 @@ export declare class CollectionChangeRecord {
toString(): string;
}
/** @stable */
export declare class Compiler {
clearCache(): void;
clearCacheFor(compType: Type): void;
compileComponentAsync<T>(component: ConcreteType<T>): Promise<ComponentFactory<T>>;
compileComponentSync<T>(component: ConcreteType<T>): ComponentFactory<T>;
}
/** @stable */
export declare var Component: ComponentMetadataFactory;
@ -254,7 +262,7 @@ export declare class ComponentFactory<C> {
/** @stable */
export declare abstract class ComponentFactoryResolver {
abstract resolveComponentFactory<T>(component: ClassWithConstructor<T>): ComponentFactory<T>;
abstract resolveComponentFactory<T>(component: ConcreteType<T>): ComponentFactory<T>;
static NULL: ComponentFactoryResolver;
}
@ -1267,7 +1275,7 @@ export interface TypeDecorator {
annotations: any[];
(target: Object, propertyKey?: string | symbol, parameterIndex?: number): void;
<T extends Type>(type: T): T;
Class(obj: ClassDefinition): ConcreteType;
Class(obj: ClassDefinition): ConcreteType<any>;
}
/** @stable */

View File

@ -89,10 +89,10 @@ export declare function setBaseTestProviders(platformProviders: Array<Type | Pro
export declare class TestComponentBuilder {
protected _injector: Injector;
constructor(_injector: Injector);
createAsync(rootComponentType: Type): Promise<ComponentFixture<any>>;
createFakeAsync(rootComponentType: Type): ComponentFixture<any>;
createAsync<T>(rootComponentType: ConcreteType<T>): Promise<ComponentFixture<T>>;
createFakeAsync<T>(rootComponentType: ConcreteType<T>): ComponentFixture<T>;
protected createFromFactory<C>(ngZone: NgZone, componentFactory: ComponentFactory<C>): ComponentFixture<C>;
/** @deprecated */ createSync<C>(componentFactory: ComponentFactory<C>): ComponentFixture<C>;
createSync<T>(rootComponentType: ConcreteType<T>): ComponentFixture<T>;
overrideAnimations(componentType: Type, animations: AnimationEntryMetadata[]): TestComponentBuilder;
overrideDirective(componentType: Type, from: Type, to: Type): TestComponentBuilder;
overrideProviders(type: Type, providers: any[]): TestComponentBuilder;