
Every decorator now is made of the following: - a function that can be used as a decorator or as a constructor. This function also can be used for `instanceof` checks. - a type for this function (callable and newable) - a type that describes the shape of the data that the user needs to pass to the decorator as well as the instance of the metadata The docs for decorators live at the followig places so that IDEs can discover them correctly: - General description of the decorator is placed on the `...Decorator` interface on the callable function definition - Property descriptions are placed on the interface that describes the metadata produces by the decorator
116 lines
4.9 KiB
TypeScript
116 lines
4.9 KiB
TypeScript
/**
|
|
* @license
|
|
* Copyright Google Inc. All Rights Reserved.
|
|
*
|
|
* Use of this source code is governed by an MIT-style license that can be
|
|
* found in the LICENSE file at https://angular.io/license
|
|
*/
|
|
|
|
/**
|
|
* @module
|
|
* @description
|
|
* Entry point for all APIs of the compiler package.
|
|
*
|
|
* <div class="callout is-critical">
|
|
* <header>Unstable APIs</header>
|
|
* <p>
|
|
* All compiler apis are currently considered experimental and private!
|
|
* </p>
|
|
* <p>
|
|
* We expect the APIs in this package to keep on changing. Do not rely on them.
|
|
* </p>
|
|
* </div>
|
|
*/
|
|
export * from './schema_registry_mock';
|
|
export * from './directive_resolver_mock';
|
|
export * from './ng_module_resolver_mock';
|
|
export * from './pipe_resolver_mock';
|
|
|
|
import {createPlatformFactory, ModuleWithComponentFactories, Injectable, CompilerOptions, COMPILER_OPTIONS, CompilerFactory, NgModuleFactory, Injector, NgModuleMetadata, NgModule, ComponentMetadata, Component, DirectiveMetadata, Directive, Pipe, Type, PlatformRef} from '@angular/core';
|
|
import {MetadataOverride} from '@angular/core/testing';
|
|
import {TestingCompilerFactory, TestingCompiler} from './private_import_core';
|
|
import {platformCoreDynamic, RuntimeCompiler, DirectiveResolver, NgModuleResolver, PipeResolver} from '@angular/compiler';
|
|
import {MockDirectiveResolver} from './directive_resolver_mock';
|
|
import {MockNgModuleResolver} from './ng_module_resolver_mock';
|
|
import {MockPipeResolver} from './pipe_resolver_mock';
|
|
import {MetadataOverrider} from './metadata_overrider';
|
|
|
|
@Injectable()
|
|
export class TestingCompilerFactoryImpl implements TestingCompilerFactory {
|
|
constructor(private _compilerFactory: CompilerFactory) {}
|
|
|
|
createTestingCompiler(options: CompilerOptions[]): TestingCompiler {
|
|
const compiler = <RuntimeCompiler>this._compilerFactory.createCompiler(options);
|
|
return new TestingCompilerImpl(
|
|
compiler, compiler.injector.get(MockDirectiveResolver),
|
|
compiler.injector.get(MockPipeResolver), compiler.injector.get(MockNgModuleResolver));
|
|
}
|
|
}
|
|
|
|
export class TestingCompilerImpl implements TestingCompiler {
|
|
private _overrider = new MetadataOverrider();
|
|
constructor(
|
|
private _compiler: RuntimeCompiler, private _directiveResolver: MockDirectiveResolver,
|
|
private _pipeResolver: MockPipeResolver, private _moduleResolver: MockNgModuleResolver) {}
|
|
get injector(): Injector { return this._compiler.injector; }
|
|
|
|
compileModuleSync<T>(moduleType: Type<T>): NgModuleFactory<T> {
|
|
return this._compiler.compileModuleSync(moduleType);
|
|
}
|
|
|
|
compileModuleAsync<T>(moduleType: Type<T>): Promise<NgModuleFactory<T>> {
|
|
return this._compiler.compileModuleAsync(moduleType);
|
|
}
|
|
compileModuleAndAllComponentsSync<T>(moduleType: Type<T>): ModuleWithComponentFactories<T> {
|
|
return this._compiler.compileModuleAndAllComponentsSync(moduleType);
|
|
}
|
|
|
|
compileModuleAndAllComponentsAsync<T>(moduleType: Type<T>):
|
|
Promise<ModuleWithComponentFactories<T>> {
|
|
return this._compiler.compileModuleAndAllComponentsAsync(moduleType);
|
|
}
|
|
|
|
overrideModule(ngModule: Type<any>, override: MetadataOverride<NgModule>): void {
|
|
const oldMetadata = this._moduleResolver.resolve(ngModule, false);
|
|
this._moduleResolver.setNgModule(
|
|
ngModule, this._overrider.overrideMetadata(NgModuleMetadata, oldMetadata, override));
|
|
}
|
|
overrideDirective(directive: Type<any>, override: MetadataOverride<Directive>): void {
|
|
const oldMetadata = this._directiveResolver.resolve(directive, false);
|
|
this._directiveResolver.setDirective(
|
|
directive, this._overrider.overrideMetadata(DirectiveMetadata, oldMetadata, override));
|
|
}
|
|
overrideComponent(component: Type<any>, override: MetadataOverride<Component>): void {
|
|
const oldMetadata = this._directiveResolver.resolve(component, false);
|
|
this._directiveResolver.setDirective(
|
|
component, this._overrider.overrideMetadata(ComponentMetadata, oldMetadata, override));
|
|
}
|
|
overridePipe(pipe: Type<any>, override: MetadataOverride<Pipe>): void {
|
|
const oldMetadata = this._pipeResolver.resolve(pipe, false);
|
|
this._pipeResolver.setPipe(pipe, this._overrider.overrideMetadata(Pipe, oldMetadata, override));
|
|
}
|
|
clearCache(): void { this._compiler.clearCache(); }
|
|
clearCacheFor(type: Type<any>) { this._compiler.clearCacheFor(type); }
|
|
}
|
|
|
|
/**
|
|
* Platform for dynamic tests
|
|
*
|
|
* @experimental
|
|
*/
|
|
export const platformCoreDynamicTesting: (extraProviders?: any[]) => PlatformRef =
|
|
createPlatformFactory(platformCoreDynamic, 'coreDynamicTesting', [
|
|
{
|
|
provide: COMPILER_OPTIONS,
|
|
useValue: {
|
|
providers: [
|
|
MockPipeResolver, {provide: PipeResolver, useExisting: MockPipeResolver},
|
|
MockDirectiveResolver, {provide: DirectiveResolver, useExisting: MockDirectiveResolver},
|
|
MockNgModuleResolver, {provide: NgModuleResolver, useExisting: MockNgModuleResolver}
|
|
]
|
|
},
|
|
multi: true
|
|
},
|
|
{provide: TestingCompilerFactory, useClass: TestingCompilerFactoryImpl}
|
|
]);
|