refactor(ivy): refactor more files in DI to prepare it for bazel packages (#28098)
PR Close #28098
This commit is contained in:

committed by
Andrew Kushnir

parent
6a9a48b0ac
commit
978ffa9d32
@ -1,22 +0,0 @@
|
||||
/**
|
||||
* @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
|
||||
*/
|
||||
import {global} from '../../util/global';
|
||||
import {CompilerFacade, ExportedCompilerFacade} from './compiler_facade_interface';
|
||||
export * from './compiler_facade_interface';
|
||||
|
||||
export function getCompilerFacade(): CompilerFacade {
|
||||
const globalNg: ExportedCompilerFacade = global.ng;
|
||||
if (!globalNg || !globalNg.ɵcompilerFacade) {
|
||||
throw new Error(
|
||||
`Angular JIT compilation failed: '@angular/compiler' not loaded!\n` +
|
||||
` - JIT compilation is discouraged for production use-cases! Consider AOT mode instead.\n` +
|
||||
` - Did you bootstrap using '@angular/platform-browser-dynamic' or '@angular/platform-server'?\n` +
|
||||
` - Alternatively provide the compiler with 'import "@angular/compiler";' before bootstrapping.`);
|
||||
}
|
||||
return globalNg.ɵcompilerFacade;
|
||||
}
|
@ -1,149 +0,0 @@
|
||||
/**
|
||||
* @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
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* A set of interfaces which are shared between `@angular/core` and `@angular/compiler` to allow
|
||||
* for late binding of `@angular/compiler` for JIT purposes.
|
||||
*
|
||||
* This file has two copies. Please ensure that they are in sync:
|
||||
* - packages/compiler/src/compiler_facade_interface.ts (master)
|
||||
* - packages/core/src/render3/jit/compiler_facade_interface.ts (copy)
|
||||
*
|
||||
* Please ensure that the two files are in sync using this command:
|
||||
* ```
|
||||
* cp packages/compiler/src/compiler_facade_interface.ts \
|
||||
* packages/core/src/render3/jit/compiler_facade_interface.ts
|
||||
* ```
|
||||
*/
|
||||
|
||||
export interface ExportedCompilerFacade { ɵcompilerFacade: CompilerFacade; }
|
||||
|
||||
export interface CompilerFacade {
|
||||
compilePipe(angularCoreEnv: CoreEnvironment, sourceMapUrl: string, meta: R3PipeMetadataFacade):
|
||||
any;
|
||||
compileInjectable(
|
||||
angularCoreEnv: CoreEnvironment, sourceMapUrl: string, meta: R3InjectableMetadataFacade): any;
|
||||
compileInjector(
|
||||
angularCoreEnv: CoreEnvironment, sourceMapUrl: string, meta: R3InjectorMetadataFacade): any;
|
||||
compileNgModule(
|
||||
angularCoreEnv: CoreEnvironment, sourceMapUrl: string, meta: R3NgModuleMetadataFacade): any;
|
||||
compileDirective(
|
||||
angularCoreEnv: CoreEnvironment, sourceMapUrl: string, meta: R3DirectiveMetadataFacade): any;
|
||||
compileComponent(
|
||||
angularCoreEnv: CoreEnvironment, sourceMapUrl: string, meta: R3ComponentMetadataFacade): any;
|
||||
|
||||
R3ResolvedDependencyType: typeof R3ResolvedDependencyType;
|
||||
}
|
||||
|
||||
export interface CoreEnvironment { [name: string]: Function; }
|
||||
|
||||
export type StringMap = {
|
||||
[key: string]: string;
|
||||
};
|
||||
|
||||
export type StringMapWithRename = {
|
||||
[key: string]: string | [string, string];
|
||||
};
|
||||
|
||||
export type Provider = any;
|
||||
|
||||
export enum R3ResolvedDependencyType {
|
||||
Token = 0,
|
||||
Attribute = 1,
|
||||
}
|
||||
|
||||
export interface R3DependencyMetadataFacade {
|
||||
token: any;
|
||||
resolved: R3ResolvedDependencyType;
|
||||
host: boolean;
|
||||
optional: boolean;
|
||||
self: boolean;
|
||||
skipSelf: boolean;
|
||||
}
|
||||
|
||||
export interface R3PipeMetadataFacade {
|
||||
name: string;
|
||||
type: any;
|
||||
pipeName: string;
|
||||
deps: R3DependencyMetadataFacade[]|null;
|
||||
pure: boolean;
|
||||
}
|
||||
|
||||
export interface R3InjectableMetadataFacade {
|
||||
name: string;
|
||||
type: any;
|
||||
typeArgumentCount: number;
|
||||
ctorDeps: R3DependencyMetadataFacade[]|null;
|
||||
providedIn: any;
|
||||
useClass?: any;
|
||||
useFactory?: any;
|
||||
useExisting?: any;
|
||||
useValue?: any;
|
||||
userDeps?: R3DependencyMetadataFacade[];
|
||||
}
|
||||
|
||||
export interface R3NgModuleMetadataFacade {
|
||||
type: any;
|
||||
bootstrap: Function[];
|
||||
declarations: Function[];
|
||||
imports: Function[];
|
||||
exports: Function[];
|
||||
emitInline: boolean;
|
||||
}
|
||||
|
||||
export interface R3InjectorMetadataFacade {
|
||||
name: string;
|
||||
type: any;
|
||||
deps: R3DependencyMetadataFacade[]|null;
|
||||
providers: any[];
|
||||
imports: any[];
|
||||
}
|
||||
|
||||
export interface R3DirectiveMetadataFacade {
|
||||
name: string;
|
||||
type: any;
|
||||
typeArgumentCount: number;
|
||||
typeSourceSpan: null;
|
||||
deps: R3DependencyMetadataFacade[]|null;
|
||||
selector: string|null;
|
||||
queries: R3QueryMetadataFacade[];
|
||||
host: {[key: string]: string};
|
||||
propMetadata: {[key: string]: any[]};
|
||||
inputs: string[];
|
||||
outputs: string[];
|
||||
usesInheritance: boolean;
|
||||
exportAs: string[]|null;
|
||||
providers: Provider[]|null;
|
||||
}
|
||||
|
||||
export interface R3ComponentMetadataFacade extends R3DirectiveMetadataFacade {
|
||||
template: string;
|
||||
preserveWhitespaces: boolean;
|
||||
animations: any[]|undefined;
|
||||
viewQueries: R3QueryMetadataFacade[];
|
||||
pipes: Map<string, any>;
|
||||
directives: {selector: string, expression: any}[];
|
||||
styles: string[];
|
||||
encapsulation: ViewEncapsulation;
|
||||
viewProviders: Provider[]|null;
|
||||
interpolation?: [string, string];
|
||||
changeDetection?: ChangeDetectionStrategy;
|
||||
}
|
||||
|
||||
export type ViewEncapsulation = number;
|
||||
|
||||
export type ChangeDetectionStrategy = number;
|
||||
|
||||
export interface R3QueryMetadataFacade {
|
||||
propertyName: string;
|
||||
first: boolean;
|
||||
predicate: any|string[];
|
||||
descendants: boolean;
|
||||
read: any|null;
|
||||
}
|
@ -7,7 +7,10 @@
|
||||
*/
|
||||
|
||||
import {ComponentType} from '..';
|
||||
import {R3DirectiveMetadataFacade, getCompilerFacade} from '../../compiler/compiler_facade';
|
||||
import {R3ComponentMetadataFacade, R3QueryMetadataFacade} from '../../compiler/compiler_facade_interface';
|
||||
import {resolveForwardRef} from '../../di/forward_ref';
|
||||
import {getReflect, reflectDependencies} from '../../di/jit/util';
|
||||
import {Type} from '../../interface/type';
|
||||
import {Query} from '../../metadata/di';
|
||||
import {Component, Directive} from '../../metadata/directives';
|
||||
@ -17,11 +20,8 @@ import {EMPTY_ARRAY, EMPTY_OBJ} from '../empty';
|
||||
import {NG_COMPONENT_DEF, NG_DIRECTIVE_DEF} from '../fields';
|
||||
import {renderStringify} from '../util';
|
||||
|
||||
import {R3DirectiveMetadataFacade, getCompilerFacade} from './compiler_facade';
|
||||
import {R3ComponentMetadataFacade, R3QueryMetadataFacade} from './compiler_facade_interface';
|
||||
import {angularCoreEnv} from './environment';
|
||||
import {flushModuleScopingQueueAsMuchAsPossible, patchComponentDefWithScope, transitiveScopesFor} from './module';
|
||||
import {getReflect, reflectDependencies} from './util';
|
||||
|
||||
|
||||
|
||||
|
@ -1,100 +0,0 @@
|
||||
/**
|
||||
* @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
|
||||
*/
|
||||
|
||||
import {Injectable} from '../../di/injectable';
|
||||
import {NG_INJECTABLE_DEF} from '../../di/interface/defs';
|
||||
import {ClassSansProvider, ExistingSansProvider, FactorySansProvider, ValueProvider, ValueSansProvider} from '../../di/interface/provider';
|
||||
import {Type} from '../../interface/type';
|
||||
import {getClosureSafeProperty} from '../../util/property';
|
||||
|
||||
import {R3InjectableMetadataFacade, getCompilerFacade} from './compiler_facade';
|
||||
import {angularCoreEnv} from './environment';
|
||||
import {convertDependencies, reflectDependencies} from './util';
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Compile an Angular injectable according to its `Injectable` metadata, and patch the resulting
|
||||
* `ngInjectableDef` onto the injectable type.
|
||||
*/
|
||||
export function compileInjectable(type: Type<any>, srcMeta?: Injectable): void {
|
||||
let def: any = null;
|
||||
|
||||
// if NG_INJECTABLE_DEF is already defined on this class then don't overwrite it
|
||||
if (type.hasOwnProperty(NG_INJECTABLE_DEF)) return;
|
||||
|
||||
Object.defineProperty(type, NG_INJECTABLE_DEF, {
|
||||
get: () => {
|
||||
if (def === null) {
|
||||
// Allow the compilation of a class with a `@Injectable()` decorator without parameters
|
||||
const meta: Injectable = srcMeta || {providedIn: null};
|
||||
const hasAProvider = isUseClassProvider(meta) || isUseFactoryProvider(meta) ||
|
||||
isUseValueProvider(meta) || isUseExistingProvider(meta);
|
||||
|
||||
|
||||
const compilerMeta: R3InjectableMetadataFacade = {
|
||||
name: type.name,
|
||||
type: type,
|
||||
typeArgumentCount: 0,
|
||||
providedIn: meta.providedIn,
|
||||
ctorDeps: reflectDependencies(type),
|
||||
userDeps: undefined
|
||||
};
|
||||
if ((isUseClassProvider(meta) || isUseFactoryProvider(meta)) && meta.deps !== undefined) {
|
||||
compilerMeta.userDeps = convertDependencies(meta.deps);
|
||||
}
|
||||
if (!hasAProvider) {
|
||||
// In the case the user specifies a type provider, treat it as {provide: X, useClass: X}.
|
||||
// The deps will have been reflected above, causing the factory to create the class by
|
||||
// calling
|
||||
// its constructor with injected deps.
|
||||
compilerMeta.useClass = type;
|
||||
} else if (isUseClassProvider(meta)) {
|
||||
// The user explicitly specified useClass, and may or may not have provided deps.
|
||||
compilerMeta.useClass = meta.useClass;
|
||||
} else if (isUseValueProvider(meta)) {
|
||||
// The user explicitly specified useValue.
|
||||
compilerMeta.useValue = meta.useValue;
|
||||
} else if (isUseFactoryProvider(meta)) {
|
||||
// The user explicitly specified useFactory.
|
||||
compilerMeta.useFactory = meta.useFactory;
|
||||
} else if (isUseExistingProvider(meta)) {
|
||||
// The user explicitly specified useExisting.
|
||||
compilerMeta.useExisting = meta.useExisting;
|
||||
} else {
|
||||
// Can't happen - either hasAProvider will be false, or one of the providers will be set.
|
||||
throw new Error(`Unreachable state.`);
|
||||
}
|
||||
def = getCompilerFacade().compileInjectable(
|
||||
angularCoreEnv, `ng://${type.name}/ngInjectableDef.js`, compilerMeta);
|
||||
}
|
||||
return def;
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
type UseClassProvider = Injectable & ClassSansProvider & {deps?: any[]};
|
||||
|
||||
const USE_VALUE =
|
||||
getClosureSafeProperty<ValueProvider>({provide: String, useValue: getClosureSafeProperty});
|
||||
|
||||
function isUseClassProvider(meta: Injectable): meta is UseClassProvider {
|
||||
return (meta as UseClassProvider).useClass !== undefined;
|
||||
}
|
||||
|
||||
function isUseValueProvider(meta: Injectable): meta is Injectable&ValueSansProvider {
|
||||
return USE_VALUE in meta;
|
||||
}
|
||||
|
||||
function isUseFactoryProvider(meta: Injectable): meta is Injectable&FactorySansProvider {
|
||||
return (meta as FactorySansProvider).useFactory !== undefined;
|
||||
}
|
||||
|
||||
function isUseExistingProvider(meta: Injectable): meta is Injectable&ExistingSansProvider {
|
||||
return (meta as ExistingSansProvider).useExisting !== undefined;
|
||||
}
|
@ -6,8 +6,10 @@
|
||||
* found in the LICENSE file at https://angular.io/license
|
||||
*/
|
||||
|
||||
import {R3InjectorMetadataFacade, getCompilerFacade} from '../../compiler/compiler_facade';
|
||||
import {resolveForwardRef} from '../../di/forward_ref';
|
||||
import {NG_INJECTOR_DEF} from '../../di/interface/defs';
|
||||
import {reflectDependencies} from '../../di/jit/util';
|
||||
import {Type} from '../../interface/type';
|
||||
import {registerNgModuleType} from '../../linker/ng_module_factory_loader';
|
||||
import {Component} from '../../metadata';
|
||||
@ -19,9 +21,7 @@ import {ComponentDef} from '../interfaces/definition';
|
||||
import {NgModuleType} from '../ng_module_ref';
|
||||
import {renderStringify} from '../util';
|
||||
|
||||
import {R3InjectorMetadataFacade, getCompilerFacade} from './compiler_facade';
|
||||
import {angularCoreEnv} from './environment';
|
||||
import {reflectDependencies} from './util';
|
||||
|
||||
const EMPTY_ARRAY: Type<any>[] = [];
|
||||
|
||||
|
@ -6,14 +6,14 @@
|
||||
* found in the LICENSE file at https://angular.io/license
|
||||
*/
|
||||
|
||||
import {getCompilerFacade} from '../../compiler/compiler_facade';
|
||||
import {reflectDependencies} from '../../di/jit/util';
|
||||
import {Type} from '../../interface/type';
|
||||
import {Pipe} from '../../metadata/directives';
|
||||
import {NG_PIPE_DEF} from '../fields';
|
||||
import {renderStringify} from '../util';
|
||||
|
||||
import {getCompilerFacade} from './compiler_facade';
|
||||
import {angularCoreEnv} from './environment';
|
||||
import {reflectDependencies} from './util';
|
||||
|
||||
export function compilePipe(type: Type<any>, meta: Pipe): void {
|
||||
let ngPipeDef: any = null;
|
||||
|
@ -1,79 +0,0 @@
|
||||
/**
|
||||
* @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
|
||||
*/
|
||||
|
||||
import {Host, Inject, Optional, Self, SkipSelf} from '../../di/metadata';
|
||||
import {Type} from '../../interface/type';
|
||||
import {Attribute} from '../../metadata/di';
|
||||
import {ReflectionCapabilities} from '../../reflection/reflection_capabilities';
|
||||
|
||||
import {CompilerFacade, R3DependencyMetadataFacade, getCompilerFacade} from './compiler_facade';
|
||||
|
||||
let _reflect: ReflectionCapabilities|null = null;
|
||||
|
||||
export function getReflect(): ReflectionCapabilities {
|
||||
return (_reflect = _reflect || new ReflectionCapabilities());
|
||||
}
|
||||
|
||||
export function reflectDependencies(type: Type<any>): R3DependencyMetadataFacade[] {
|
||||
return convertDependencies(getReflect().parameters(type));
|
||||
}
|
||||
|
||||
export function convertDependencies(deps: any[]): R3DependencyMetadataFacade[] {
|
||||
const compiler = getCompilerFacade();
|
||||
return deps.map(dep => reflectDependency(compiler, dep));
|
||||
}
|
||||
|
||||
function reflectDependency(compiler: CompilerFacade, dep: any | any[]): R3DependencyMetadataFacade {
|
||||
const meta: R3DependencyMetadataFacade = {
|
||||
token: null,
|
||||
host: false,
|
||||
optional: false,
|
||||
resolved: compiler.R3ResolvedDependencyType.Token,
|
||||
self: false,
|
||||
skipSelf: false,
|
||||
};
|
||||
|
||||
function setTokenAndResolvedType(token: any): void {
|
||||
meta.resolved = compiler.R3ResolvedDependencyType.Token;
|
||||
meta.token = token;
|
||||
}
|
||||
|
||||
if (Array.isArray(dep)) {
|
||||
if (dep.length === 0) {
|
||||
throw new Error('Dependency array must have arguments.');
|
||||
}
|
||||
for (let j = 0; j < dep.length; j++) {
|
||||
const param = dep[j];
|
||||
if (param === undefined) {
|
||||
// param may be undefined if type of dep is not set by ngtsc
|
||||
continue;
|
||||
} else if (param instanceof Optional || param.__proto__.ngMetadataName === 'Optional') {
|
||||
meta.optional = true;
|
||||
} else if (param instanceof SkipSelf || param.__proto__.ngMetadataName === 'SkipSelf') {
|
||||
meta.skipSelf = true;
|
||||
} else if (param instanceof Self || param.__proto__.ngMetadataName === 'Self') {
|
||||
meta.self = true;
|
||||
} else if (param instanceof Host || param.__proto__.ngMetadataName === 'Host') {
|
||||
meta.host = true;
|
||||
} else if (param instanceof Inject) {
|
||||
meta.token = param.token;
|
||||
} else if (param instanceof Attribute) {
|
||||
if (param.attributeName === undefined) {
|
||||
throw new Error(`Attribute name must be defined.`);
|
||||
}
|
||||
meta.token = param.attributeName;
|
||||
meta.resolved = compiler.R3ResolvedDependencyType.Attribute;
|
||||
} else {
|
||||
setTokenAndResolvedType(param);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
setTokenAndResolvedType(dep);
|
||||
}
|
||||
return meta;
|
||||
}
|
Reference in New Issue
Block a user