Add introductions to usage examples and edit descriptions to be more complete and consistent with current API reference styles PR Close #37053
365 lines
12 KiB
TypeScript
365 lines
12 KiB
TypeScript
/**
|
|
* @license
|
|
* Copyright Google LLC 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
|
|
*/
|
|
|
|
import {ApplicationRef} from '../application_ref';
|
|
import {InjectorType, ɵɵdefineInjector} from '../di/interface/defs';
|
|
import {Provider} from '../di/interface/provider';
|
|
import {convertInjectableProviderToFactory} from '../di/util';
|
|
import {Type} from '../interface/type';
|
|
import {SchemaMetadata} from '../metadata/schema';
|
|
import {compileNgModule as render3CompileNgModule} from '../render3/jit/module';
|
|
import {makeDecorator, TypeDecorator} from '../util/decorators';
|
|
|
|
|
|
/**
|
|
* Represents the expansion of an `NgModule` into its scopes.
|
|
*
|
|
* A scope is a set of directives and pipes that are visible in a particular context. Each
|
|
* `NgModule` has two scopes. The `compilation` scope is the set of directives and pipes that will
|
|
* be recognized in the templates of components declared by the module. The `exported` scope is the
|
|
* set of directives and pipes exported by a module (that is, module B's exported scope gets added
|
|
* to module A's compilation scope when module A imports B).
|
|
*/
|
|
export interface NgModuleTransitiveScopes {
|
|
compilation: {directives: Set<any>; pipes: Set<any>;};
|
|
exported: {directives: Set<any>; pipes: Set<any>;};
|
|
schemas: SchemaMetadata[]|null;
|
|
}
|
|
|
|
/**
|
|
* @publicApi
|
|
*/
|
|
export type ɵɵNgModuleDefWithMeta<T, Declarations, Imports, Exports> = NgModuleDef<T>;
|
|
|
|
/**
|
|
* Runtime link information for NgModules.
|
|
*
|
|
* This is the internal data structure used by the runtime to assemble components, directives,
|
|
* pipes, and injectors.
|
|
*
|
|
* NOTE: Always use `ɵɵdefineNgModule` function to create this object,
|
|
* never create the object directly since the shape of this object
|
|
* can change between versions.
|
|
*/
|
|
export interface NgModuleDef<T> {
|
|
/** Token representing the module. Used by DI. */
|
|
type: T;
|
|
|
|
/** List of components to bootstrap. */
|
|
bootstrap: Type<any>[]|(() => Type<any>[]);
|
|
|
|
/** List of components, directives, and pipes declared by this module. */
|
|
declarations: Type<any>[]|(() => Type<any>[]);
|
|
|
|
/** List of modules or `ModuleWithProviders` imported by this module. */
|
|
imports: Type<any>[]|(() => Type<any>[]);
|
|
|
|
/**
|
|
* List of modules, `ModuleWithProviders`, components, directives, or pipes exported by this
|
|
* module.
|
|
*/
|
|
exports: Type<any>[]|(() => Type<any>[]);
|
|
|
|
/**
|
|
* Cached value of computed `transitiveCompileScopes` for this module.
|
|
*
|
|
* This should never be read directly, but accessed via `transitiveScopesFor`.
|
|
*/
|
|
transitiveCompileScopes: NgModuleTransitiveScopes|null;
|
|
|
|
/** The set of schemas that declare elements to be allowed in the NgModule. */
|
|
schemas: SchemaMetadata[]|null;
|
|
|
|
/** Unique ID for the module with which it should be registered. */
|
|
id: string|null;
|
|
}
|
|
|
|
/**
|
|
* A wrapper around an NgModule that associates it with [providers](guide/glossary#provider
|
|
* "Definition"). Usage without a generic type is deprecated.
|
|
*
|
|
* @see [Deprecations](guide/deprecations#modulewithproviders-type-without-a-generic)
|
|
*
|
|
* @publicApi
|
|
*/
|
|
export interface ModuleWithProviders<T> {
|
|
ngModule: Type<T>;
|
|
providers?: Provider[];
|
|
}
|
|
|
|
|
|
/**
|
|
* Type of the NgModule decorator / constructor function.
|
|
*
|
|
* @publicApi
|
|
*/
|
|
export interface NgModuleDecorator {
|
|
/**
|
|
* Decorator that marks a class as an NgModule and supplies configuration metadata.
|
|
*/
|
|
(obj?: NgModule): TypeDecorator;
|
|
new(obj?: NgModule): NgModule;
|
|
}
|
|
|
|
/**
|
|
* Type of the NgModule metadata.
|
|
*
|
|
* @publicApi
|
|
*/
|
|
export interface NgModule {
|
|
/**
|
|
* The set of injectable objects that are available in the injector
|
|
* of this module.
|
|
*
|
|
* @see [Dependency Injection guide](guide/dependency-injection)
|
|
* @see [NgModule guide](guide/providers)
|
|
*
|
|
* @usageNotes
|
|
*
|
|
* Dependencies whose providers are listed here become available for injection
|
|
* into any component, directive, pipe or service that is a child of this injector.
|
|
* The NgModule used for bootstrapping uses the root injector, and can provide dependencies
|
|
* to any part of the app.
|
|
*
|
|
* A lazy-loaded module has its own injector, typically a child of the app root injector.
|
|
* Lazy-loaded services are scoped to the lazy-loaded module's injector.
|
|
* If a lazy-loaded module also provides the `UserService`, any component created
|
|
* within that module's context (such as by router navigation) gets the local instance
|
|
* of the service, not the instance in the root injector.
|
|
* Components in external modules continue to receive the instance provided by their injectors.
|
|
*
|
|
* ### Example
|
|
*
|
|
* The following example defines a class that is injected in
|
|
* the HelloWorld NgModule:
|
|
*
|
|
* ```
|
|
* class Greeter {
|
|
* greet(name:string) {
|
|
* return 'Hello ' + name + '!';
|
|
* }
|
|
* }
|
|
*
|
|
* @NgModule({
|
|
* providers: [
|
|
* Greeter
|
|
* ]
|
|
* })
|
|
* class HelloWorld {
|
|
* greeter:Greeter;
|
|
*
|
|
* constructor(greeter:Greeter) {
|
|
* this.greeter = greeter;
|
|
* }
|
|
* }
|
|
* ```
|
|
*/
|
|
providers?: Provider[];
|
|
|
|
/**
|
|
* The set of components, directives, and pipes ([declarables](guide/glossary#declarable))
|
|
* that belong to this module.
|
|
*
|
|
* @usageNotes
|
|
*
|
|
* The set of selectors that are available to a template include those declared here, and
|
|
* those that are exported from imported NgModules.
|
|
*
|
|
* Declarables must belong to exactly one module.
|
|
* The compiler emits an error if you try to declare the same class in more than one module.
|
|
* Be careful not to declare a class that is imported from another module.
|
|
*
|
|
* ### Example
|
|
*
|
|
* The following example allows the CommonModule to use the `NgFor`
|
|
* directive.
|
|
*
|
|
* ```javascript
|
|
* @NgModule({
|
|
* declarations: [NgFor]
|
|
* })
|
|
* class CommonModule {
|
|
* }
|
|
* ```
|
|
*/
|
|
declarations?: Array<Type<any>|any[]>;
|
|
|
|
/**
|
|
* The set of NgModules whose exported [declarables](guide/glossary#declarable)
|
|
* are available to templates in this module.
|
|
*
|
|
* @usageNotes
|
|
*
|
|
* A template can use exported declarables from any
|
|
* imported module, including those from modules that are imported indirectly
|
|
* and re-exported.
|
|
* For example, `ModuleA` imports `ModuleB`, and also exports
|
|
* it, which makes the declarables from `ModuleB` available
|
|
* wherever `ModuleA` is imported.
|
|
*
|
|
* ### Example
|
|
*
|
|
* The following example allows MainModule to use anything exported by
|
|
* `CommonModule`:
|
|
*
|
|
* ```javascript
|
|
* @NgModule({
|
|
* imports: [CommonModule]
|
|
* })
|
|
* class MainModule {
|
|
* }
|
|
* ```
|
|
*
|
|
*/
|
|
imports?: Array<Type<any>|ModuleWithProviders<{}>|any[]>;
|
|
|
|
/**
|
|
* The set of components, directives, and pipes declared in this
|
|
* NgModule that can be used in the template of any component that is part of an
|
|
* NgModule that imports this NgModule. Exported declarations are the module's public API.
|
|
*
|
|
* A declarable belongs to one and only one NgModule.
|
|
* A module can list another module among its exports, in which case all of that module's
|
|
* public declaration are exported.
|
|
*
|
|
* @usageNotes
|
|
*
|
|
* Declarations are private by default.
|
|
* If this ModuleA does not export UserComponent, then only the components within this
|
|
* ModuleA can use UserComponent.
|
|
*
|
|
* ModuleA can import ModuleB and also export it, making exports from ModuleB
|
|
* available to an NgModule that imports ModuleA.
|
|
*
|
|
* ### Example
|
|
*
|
|
* The following example exports the `NgFor` directive from CommonModule.
|
|
*
|
|
* ```javascript
|
|
* @NgModule({
|
|
* exports: [NgFor]
|
|
* })
|
|
* class CommonModule {
|
|
* }
|
|
* ```
|
|
*/
|
|
exports?: Array<Type<any>|any[]>;
|
|
|
|
/**
|
|
* The set of components to compile when this NgModule is defined,
|
|
* so that they can be dynamically loaded into the view.
|
|
*
|
|
* For each component listed here, Angular creates a `ComponentFactory`
|
|
* and stores it in the `ComponentFactoryResolver`.
|
|
*
|
|
* Angular automatically adds components in the module's bootstrap
|
|
* and route definitions into the `entryComponents` list. Use this
|
|
* option to add components that are bootstrapped
|
|
* using one of the imperative techniques, such as `ViewContainerRef.createComponent()`.
|
|
*
|
|
* @see [Entry Components](guide/entry-components)
|
|
* @deprecated Since 9.0.0. With Ivy, this property is no longer necessary.
|
|
*/
|
|
entryComponents?: Array<Type<any>|any[]>;
|
|
|
|
/**
|
|
* The set of components that are bootstrapped when
|
|
* this module is bootstrapped. The components listed here
|
|
* are automatically added to `entryComponents`.
|
|
*/
|
|
bootstrap?: Array<Type<any>|any[]>;
|
|
|
|
/**
|
|
* The set of schemas that declare elements to be allowed in the NgModule.
|
|
* Elements and properties that are neither Angular components nor directives
|
|
* must be declared in a schema.
|
|
*
|
|
* Allowed value are `NO_ERRORS_SCHEMA` and `CUSTOM_ELEMENTS_SCHEMA`.
|
|
*
|
|
* @security When using one of `NO_ERRORS_SCHEMA` or `CUSTOM_ELEMENTS_SCHEMA`
|
|
* you must ensure that allowed elements and properties securely escape inputs.
|
|
*/
|
|
schemas?: Array<SchemaMetadata|any[]>;
|
|
|
|
/**
|
|
* A name or path that uniquely identifies this NgModule in `getModuleFactory`.
|
|
* If left `undefined`, the NgModule is not registered with
|
|
* `getModuleFactory`.
|
|
*/
|
|
id?: string;
|
|
|
|
/**
|
|
* When present, this module is ignored by the AOT compiler.
|
|
* It remains in distributed code, and the JIT compiler attempts to compile it
|
|
* at run time, in the browser.
|
|
* To ensure the correct behavior, the app must import `@angular/compiler`.
|
|
*/
|
|
jit?: true;
|
|
}
|
|
|
|
/**
|
|
* @Annotation
|
|
* @publicApi
|
|
*/
|
|
export const NgModule: NgModuleDecorator = makeDecorator(
|
|
'NgModule', (ngModule: NgModule) => ngModule, undefined, undefined,
|
|
/**
|
|
* Decorator that marks the following class as an NgModule, and supplies
|
|
* configuration metadata for it.
|
|
*
|
|
* * The `declarations` and `entryComponents` options configure the compiler
|
|
* with information about what belongs to the NgModule.
|
|
* * The `providers` options configures the NgModule's injector to provide
|
|
* dependencies the NgModule members.
|
|
* * The `imports` and `exports` options bring in members from other modules, and make
|
|
* this module's members available to others.
|
|
*/
|
|
(type: Type<any>, meta: NgModule) => SWITCH_COMPILE_NGMODULE(type, meta));
|
|
|
|
/**
|
|
* @description
|
|
* Hook for manual bootstrapping of the application instead of using bootstrap array in @NgModule
|
|
* annotation.
|
|
*
|
|
* Reference to the current application is provided as a parameter.
|
|
*
|
|
* See ["Bootstrapping"](guide/bootstrapping) and ["Entry components"](guide/entry-components).
|
|
*
|
|
* @usageNotes
|
|
* ```typescript
|
|
* class AppModule implements DoBootstrap {
|
|
* ngDoBootstrap(appRef: ApplicationRef) {
|
|
* appRef.bootstrap(AppComponent); // Or some other component
|
|
* }
|
|
* }
|
|
* ```
|
|
*
|
|
* @publicApi
|
|
*/
|
|
export interface DoBootstrap {
|
|
ngDoBootstrap(appRef: ApplicationRef): void;
|
|
}
|
|
|
|
function preR3NgModuleCompile(moduleType: Type<any>, metadata?: NgModule): void {
|
|
let imports = (metadata && metadata.imports) || [];
|
|
if (metadata && metadata.exports) {
|
|
imports = [...imports, metadata.exports];
|
|
}
|
|
|
|
(moduleType as InjectorType<any>).ɵinj = ɵɵdefineInjector({
|
|
factory: convertInjectableProviderToFactory(moduleType, {useClass: moduleType}),
|
|
providers: metadata && metadata.providers,
|
|
imports: imports,
|
|
});
|
|
}
|
|
|
|
|
|
export const SWITCH_COMPILE_NGMODULE__POST_R3__ = render3CompileNgModule;
|
|
const SWITCH_COMPILE_NGMODULE__PRE_R3__ = preR3NgModuleCompile;
|
|
const SWITCH_COMPILE_NGMODULE: typeof render3CompileNgModule = SWITCH_COMPILE_NGMODULE__PRE_R3__;
|