fix(perf): support prod mode again
After splitting the facades into multiple modules, enabling prod mode for code had no effect for the compiler. Also in a change between RC1 and RC2 we created the `CompilerConfig` via a provider with `useValue` and not via a `useFactory`, which reads the prod mode too early. Closes #9318 Closes #8508 Closes #9318
This commit is contained in:
parent
5c8d3154d7
commit
c0f2a22a08
@ -4,9 +4,12 @@ require('zone.js/dist/zone-node.js');
|
|||||||
require('zone.js/dist/long-stack-trace-zone.js');
|
require('zone.js/dist/long-stack-trace-zone.js');
|
||||||
|
|
||||||
import {AnimateCmpNgFactory} from '../src/animate.ngfactory';
|
import {AnimateCmpNgFactory} from '../src/animate.ngfactory';
|
||||||
import {ReflectiveInjector, DebugElement, getDebugNode} from '@angular/core';
|
import {ReflectiveInjector, DebugElement, getDebugNode, lockRunMode} from '@angular/core';
|
||||||
import {browserPlatform, BROWSER_APP_PROVIDERS} from '@angular/platform-browser';
|
import {browserPlatform, BROWSER_APP_PROVIDERS} from '@angular/platform-browser';
|
||||||
|
|
||||||
|
// Need to lock the mode explicitely as this test is not using Angular's testing framework.
|
||||||
|
lockRunMode();
|
||||||
|
|
||||||
describe('template codegen output', () => {
|
describe('template codegen output', () => {
|
||||||
function findTargetElement(elm: DebugElement): DebugElement {
|
function findTargetElement(elm: DebugElement): DebugElement {
|
||||||
// the open-close-container is a child of the main container
|
// the open-close-container is a child of the main container
|
||||||
|
@ -10,9 +10,12 @@ import * as fs from 'fs';
|
|||||||
import * as path from 'path';
|
import * as path from 'path';
|
||||||
import {BasicNgFactory} from '../src/basic.ngfactory';
|
import {BasicNgFactory} from '../src/basic.ngfactory';
|
||||||
import {MyComp} from '../src/a/multiple_components';
|
import {MyComp} from '../src/a/multiple_components';
|
||||||
import {ReflectiveInjector, DebugElement, getDebugNode} from '@angular/core';
|
import {ReflectiveInjector, DebugElement, getDebugNode, lockRunMode} from '@angular/core';
|
||||||
import {browserPlatform, BROWSER_APP_PROVIDERS} from '@angular/platform-browser';
|
import {browserPlatform, BROWSER_APP_PROVIDERS} from '@angular/platform-browser';
|
||||||
|
|
||||||
|
// Need to lock the mode explicitely as this test is not using Angular's testing framework.
|
||||||
|
lockRunMode();
|
||||||
|
|
||||||
describe('template codegen output', () => {
|
describe('template codegen output', () => {
|
||||||
const outDir = 'src';
|
const outDir = 'src';
|
||||||
|
|
||||||
|
@ -1,9 +1,12 @@
|
|||||||
import {DebugElement, ReflectiveInjector, getDebugNode} from '@angular/core';
|
import {DebugElement, ReflectiveInjector, getDebugNode, lockRunMode} from '@angular/core';
|
||||||
import {BROWSER_APP_PROVIDERS, By, browserPlatform} from '@angular/platform-browser';
|
import {BROWSER_APP_PROVIDERS, By, browserPlatform} from '@angular/platform-browser';
|
||||||
|
|
||||||
import {CompWithProjection} from '../src/projection';
|
import {CompWithProjection} from '../src/projection';
|
||||||
import {MainCompNgFactory} from '../src/projection.ngfactory';
|
import {MainCompNgFactory} from '../src/projection.ngfactory';
|
||||||
|
|
||||||
|
// Need to lock the mode explicitely as this test is not using Angular's testing framework.
|
||||||
|
lockRunMode();
|
||||||
|
|
||||||
describe('content projection', () => {
|
describe('content projection', () => {
|
||||||
it('should support basic content projection', () => {
|
it('should support basic content projection', () => {
|
||||||
const appInjector =
|
const appInjector =
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
* Intended to be used in a build step.
|
* Intended to be used in a build step.
|
||||||
*/
|
*/
|
||||||
import * as compiler from '@angular/compiler';
|
import * as compiler from '@angular/compiler';
|
||||||
import {ViewEncapsulation} from '@angular/core';
|
import {ViewEncapsulation, lockRunMode} from '@angular/core';
|
||||||
import {Parse5DomAdapter} from '@angular/platform-server';
|
import {Parse5DomAdapter} from '@angular/platform-server';
|
||||||
import {AngularCompilerOptions} from '@angular/tsc-wrapped';
|
import {AngularCompilerOptions} from '@angular/tsc-wrapped';
|
||||||
import * as path from 'path';
|
import * as path from 'path';
|
||||||
@ -29,7 +29,9 @@ export class CodeGenerator {
|
|||||||
private options: AngularCompilerOptions, private program: ts.Program,
|
private options: AngularCompilerOptions, private program: ts.Program,
|
||||||
public host: ts.CompilerHost, private staticReflector: StaticReflector,
|
public host: ts.CompilerHost, private staticReflector: StaticReflector,
|
||||||
private resolver: CompileMetadataResolver, private compiler: compiler.OfflineCompiler,
|
private resolver: CompileMetadataResolver, private compiler: compiler.OfflineCompiler,
|
||||||
private reflectorHost: ReflectorHost) {}
|
private reflectorHost: ReflectorHost) {
|
||||||
|
lockRunMode();
|
||||||
|
}
|
||||||
|
|
||||||
private generateSource(metadatas: compiler.CompileDirectiveMetadata[]) {
|
private generateSource(metadatas: compiler.CompileDirectiveMetadata[]) {
|
||||||
const normalize = (metadata: compiler.CompileDirectiveMetadata) => {
|
const normalize = (metadata: compiler.CompileDirectiveMetadata) => {
|
||||||
|
@ -11,7 +11,7 @@ import * as ts from 'typescript';
|
|||||||
import * as tsc from '@angular/tsc-wrapped';
|
import * as tsc from '@angular/tsc-wrapped';
|
||||||
import * as path from 'path';
|
import * as path from 'path';
|
||||||
import * as compiler from '@angular/compiler';
|
import * as compiler from '@angular/compiler';
|
||||||
import {ViewEncapsulation} from '@angular/core';
|
import {ViewEncapsulation, lockRunMode} from '@angular/core';
|
||||||
|
|
||||||
import {StaticReflector} from './static_reflector';
|
import {StaticReflector} from './static_reflector';
|
||||||
import {CompileMetadataResolver, HtmlParser, DirectiveNormalizer, Lexer, Parser, TemplateParser, DomElementSchemaRegistry, StyleCompiler, ViewCompiler, TypeScriptEmitter, MessageExtractor, removeDuplicates, ExtractionResult, Message, ParseError, serializeXmb,} from './compiler_private';
|
import {CompileMetadataResolver, HtmlParser, DirectiveNormalizer, Lexer, Parser, TemplateParser, DomElementSchemaRegistry, StyleCompiler, ViewCompiler, TypeScriptEmitter, MessageExtractor, removeDuplicates, ExtractionResult, Message, ParseError, serializeXmb,} from './compiler_private';
|
||||||
@ -35,7 +35,9 @@ class Extractor {
|
|||||||
private _options: tsc.AngularCompilerOptions, private _program: ts.Program,
|
private _options: tsc.AngularCompilerOptions, private _program: ts.Program,
|
||||||
public host: ts.CompilerHost, private staticReflector: StaticReflector,
|
public host: ts.CompilerHost, private staticReflector: StaticReflector,
|
||||||
private _resolver: CompileMetadataResolver, private _compiler: compiler.OfflineCompiler,
|
private _resolver: CompileMetadataResolver, private _compiler: compiler.OfflineCompiler,
|
||||||
private _reflectorHost: ReflectorHost, private _extractor: MessageExtractor) {}
|
private _reflectorHost: ReflectorHost, private _extractor: MessageExtractor) {
|
||||||
|
lockRunMode();
|
||||||
|
}
|
||||||
|
|
||||||
private _extractCmpMessages(metadatas: compiler.CompileDirectiveMetadata[]):
|
private _extractCmpMessages(metadatas: compiler.CompileDirectiveMetadata[]):
|
||||||
Promise<ExtractionResult> {
|
Promise<ExtractionResult> {
|
||||||
|
@ -1,8 +1,10 @@
|
|||||||
|
import {isDevMode} from '@angular/core';
|
||||||
|
|
||||||
import {BaseException} from '../src/facade/exceptions';
|
import {BaseException} from '../src/facade/exceptions';
|
||||||
import {assertionsEnabled, isArray, isBlank, isString} from '../src/facade/lang';
|
import {isArray, isBlank, isString} from '../src/facade/lang';
|
||||||
|
|
||||||
export function assertArrayOfStrings(identifier: string, value: any) {
|
export function assertArrayOfStrings(identifier: string, value: any) {
|
||||||
if (!assertionsEnabled() || isBlank(value)) {
|
if (!isDevMode() || isBlank(value)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!isArray(value)) {
|
if (!isArray(value)) {
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
import {ViewEncapsulation} from '@angular/core';
|
import {ViewEncapsulation, isDevMode} from '@angular/core';
|
||||||
|
|
||||||
import {unimplemented} from '../src/facade/exceptions';
|
import {unimplemented} from '../src/facade/exceptions';
|
||||||
import {assertionsEnabled} from '../src/facade/lang';
|
|
||||||
|
|
||||||
import {CompileIdentifierMetadata} from './compile_metadata';
|
import {CompileIdentifierMetadata} from './compile_metadata';
|
||||||
import {Identifiers} from './identifiers';
|
import {Identifiers} from './identifiers';
|
||||||
@ -9,16 +8,16 @@ import {Identifiers} from './identifiers';
|
|||||||
export class CompilerConfig {
|
export class CompilerConfig {
|
||||||
public renderTypes: RenderTypes;
|
public renderTypes: RenderTypes;
|
||||||
public defaultEncapsulation: ViewEncapsulation;
|
public defaultEncapsulation: ViewEncapsulation;
|
||||||
public genDebugInfo: boolean;
|
private _genDebugInfo: boolean;
|
||||||
public logBindingUpdate: boolean;
|
private _logBindingUpdate: boolean;
|
||||||
public useJit: boolean;
|
public useJit: boolean;
|
||||||
public platformDirectives: any[];
|
public platformDirectives: any[];
|
||||||
public platformPipes: any[];
|
public platformPipes: any[];
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
{renderTypes = new DefaultRenderTypes(), defaultEncapsulation = ViewEncapsulation.Emulated,
|
{renderTypes = new DefaultRenderTypes(), defaultEncapsulation = ViewEncapsulation.Emulated,
|
||||||
genDebugInfo = assertionsEnabled(), logBindingUpdate = assertionsEnabled(), useJit = true,
|
genDebugInfo, logBindingUpdate, useJit = true, platformDirectives = [],
|
||||||
platformDirectives = [], platformPipes = []}: {
|
platformPipes = []}: {
|
||||||
renderTypes?: RenderTypes,
|
renderTypes?: RenderTypes,
|
||||||
defaultEncapsulation?: ViewEncapsulation,
|
defaultEncapsulation?: ViewEncapsulation,
|
||||||
genDebugInfo?: boolean,
|
genDebugInfo?: boolean,
|
||||||
@ -29,12 +28,19 @@ export class CompilerConfig {
|
|||||||
} = {}) {
|
} = {}) {
|
||||||
this.renderTypes = renderTypes;
|
this.renderTypes = renderTypes;
|
||||||
this.defaultEncapsulation = defaultEncapsulation;
|
this.defaultEncapsulation = defaultEncapsulation;
|
||||||
this.genDebugInfo = genDebugInfo;
|
this._genDebugInfo = genDebugInfo;
|
||||||
this.logBindingUpdate = logBindingUpdate;
|
this._logBindingUpdate = logBindingUpdate;
|
||||||
this.useJit = useJit;
|
this.useJit = useJit;
|
||||||
this.platformDirectives = platformDirectives;
|
this.platformDirectives = platformDirectives;
|
||||||
this.platformPipes = platformPipes;
|
this.platformPipes = platformPipes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
get genDebugInfo(): boolean {
|
||||||
|
return this._genDebugInfo === void 0 ? isDevMode() : this._genDebugInfo;
|
||||||
|
}
|
||||||
|
get logBindingUpdate(): boolean {
|
||||||
|
return this._logBindingUpdate === void 0 ? isDevMode() : this._logBindingUpdate;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -3,7 +3,6 @@ library angular2.core;
|
|||||||
export './src/core/angular_entrypoint.dart' show AngularEntrypoint;
|
export './src/core/angular_entrypoint.dart' show AngularEntrypoint;
|
||||||
export './src/core/metadata.dart';
|
export './src/core/metadata.dart';
|
||||||
export './src/core/util.dart';
|
export './src/core/util.dart';
|
||||||
export 'package:angular2/src/facade/lang.dart' show enableProdMode;
|
|
||||||
export './src/core/di.dart' hide ForwardRefFn, resolveForwardRef, forwardRef;
|
export './src/core/di.dart' hide ForwardRefFn, resolveForwardRef, forwardRef;
|
||||||
export './src/facade/facade.dart';
|
export './src/facade/facade.dart';
|
||||||
export './src/core/application_ref.dart' show createPlatform, assertPlatform,
|
export './src/core/application_ref.dart' show createPlatform, assertPlatform,
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
export * from './src/metadata';
|
export * from './src/metadata';
|
||||||
export * from './src/util';
|
export * from './src/util';
|
||||||
export * from './src/di';
|
export * from './src/di';
|
||||||
export {createPlatform, assertPlatform, disposePlatform, getPlatform, coreBootstrap, coreLoadAndBootstrap, createNgZone, PlatformRef, ApplicationRef} from './src/application_ref';
|
export {createPlatform, assertPlatform, disposePlatform, getPlatform, coreBootstrap, coreLoadAndBootstrap, createNgZone, PlatformRef, ApplicationRef, enableProdMode, lockRunMode, isDevMode} from './src/application_ref';
|
||||||
export {APP_ID, APP_INITIALIZER, PACKAGE_ROOT_URL, PLATFORM_INITIALIZER} from './src/application_tokens';
|
export {APP_ID, APP_INITIALIZER, PACKAGE_ROOT_URL, PLATFORM_INITIALIZER} from './src/application_tokens';
|
||||||
export * from './src/zone';
|
export * from './src/zone';
|
||||||
export * from './src/render';
|
export * from './src/render';
|
||||||
@ -19,7 +19,7 @@ export * from './src/platform_common_providers';
|
|||||||
export * from './src/application_common_providers';
|
export * from './src/application_common_providers';
|
||||||
export {wtfCreateScope, wtfLeave, wtfStartTimeRange, wtfEndTimeRange, WtfScopeFn} from './src/profile/profile';
|
export {wtfCreateScope, wtfLeave, wtfStartTimeRange, wtfEndTimeRange, WtfScopeFn} from './src/profile/profile';
|
||||||
|
|
||||||
export {Type, enableProdMode} from './src/facade/lang';
|
export {Type} from './src/facade/lang';
|
||||||
export {EventEmitter} from './src/facade/async';
|
export {EventEmitter} from './src/facade/async';
|
||||||
export {ExceptionHandler, WrappedException, BaseException} from './src/facade/exceptions';
|
export {ExceptionHandler, WrappedException, BaseException} from './src/facade/exceptions';
|
||||||
export * from './private_export';
|
export * from './private_export';
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import {ObservableWrapper, PromiseWrapper} from '../src/facade/async';
|
import {ObservableWrapper, PromiseWrapper} from '../src/facade/async';
|
||||||
import {ListWrapper} from '../src/facade/collection';
|
import {ListWrapper} from '../src/facade/collection';
|
||||||
import {BaseException, ExceptionHandler, unimplemented} from '../src/facade/exceptions';
|
import {BaseException, ExceptionHandler, unimplemented} from '../src/facade/exceptions';
|
||||||
import {IS_DART, Type, assertionsEnabled, isBlank, isPresent, isPromise, lockMode} from '../src/facade/lang';
|
import {IS_DART, Type, isBlank, isPresent, isPromise} from '../src/facade/lang';
|
||||||
|
|
||||||
import {APP_INITIALIZER, PLATFORM_INITIALIZER} from './application_tokens';
|
import {APP_INITIALIZER, PLATFORM_INITIALIZER} from './application_tokens';
|
||||||
import {ChangeDetectorRef} from './change_detection/change_detector_ref';
|
import {ChangeDetectorRef} from './change_detection/change_detector_ref';
|
||||||
@ -13,18 +13,58 @@ import {WtfScopeFn, wtfCreateScope, wtfLeave} from './profile/profile';
|
|||||||
import {Testability, TestabilityRegistry} from './testability/testability';
|
import {Testability, TestabilityRegistry} from './testability/testability';
|
||||||
import {NgZone, NgZoneError} from './zone/ng_zone';
|
import {NgZone, NgZoneError} from './zone/ng_zone';
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create an Angular zone.
|
* Create an Angular zone.
|
||||||
* @experimental
|
* @experimental
|
||||||
*/
|
*/
|
||||||
export function createNgZone(): NgZone {
|
export function createNgZone(): NgZone {
|
||||||
return new NgZone({enableLongStackTrace: assertionsEnabled()});
|
return new NgZone({enableLongStackTrace: isDevMode()});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var _devMode: boolean = true;
|
||||||
|
var _runModeLocked: boolean = false;
|
||||||
var _platform: PlatformRef;
|
var _platform: PlatformRef;
|
||||||
var _inPlatformCreate: boolean = false;
|
var _inPlatformCreate: boolean = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Disable Angular's development mode, which turns off assertions and other
|
||||||
|
* checks within the framework.
|
||||||
|
*
|
||||||
|
* One important assertion this disables verifies that a change detection pass
|
||||||
|
* does not result in additional changes to any bindings (also known as
|
||||||
|
* unidirectional data flow).
|
||||||
|
* @stable
|
||||||
|
*/
|
||||||
|
export function enableProdMode(): void {
|
||||||
|
if (_runModeLocked) {
|
||||||
|
// Cannot use BaseException as that ends up importing from facade/lang.
|
||||||
|
throw new BaseException('Cannot enable prod mode after platform setup.');
|
||||||
|
}
|
||||||
|
_devMode = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns whether Angular is in development mode.
|
||||||
|
* This can only be read after `lockRunMode` has been called.
|
||||||
|
*
|
||||||
|
* By default, this is true, unless a user calls `enableProdMode`.
|
||||||
|
*/
|
||||||
|
export function isDevMode(): boolean {
|
||||||
|
if (!_runModeLocked) {
|
||||||
|
throw new BaseException(`Dev mode can't be read before bootstrap!`);
|
||||||
|
}
|
||||||
|
return _devMode;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Locks the run mode of Angular. After this has been called,
|
||||||
|
* it can't be changed any more. I.e. `isDevMode()` will always
|
||||||
|
* return the same value.
|
||||||
|
*/
|
||||||
|
export function lockRunMode(): void {
|
||||||
|
_runModeLocked = true;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a platform.
|
* Creates a platform.
|
||||||
* Platforms have to be eagerly created via this function.
|
* Platforms have to be eagerly created via this function.
|
||||||
@ -38,7 +78,7 @@ export function createPlatform(injector: Injector): PlatformRef {
|
|||||||
throw new BaseException(
|
throw new BaseException(
|
||||||
'There can be only one platform. Destroy the previous one to create a new one.');
|
'There can be only one platform. Destroy the previous one to create a new one.');
|
||||||
}
|
}
|
||||||
lockMode();
|
lockRunMode();
|
||||||
_inPlatformCreate = true;
|
_inPlatformCreate = true;
|
||||||
try {
|
try {
|
||||||
_platform = injector.get(PlatformRef);
|
_platform = injector.get(PlatformRef);
|
||||||
@ -281,7 +321,7 @@ export class ApplicationRef_ extends ApplicationRef {
|
|||||||
constructor(private _platform: PlatformRef_, private _zone: NgZone, private _injector: Injector) {
|
constructor(private _platform: PlatformRef_, private _zone: NgZone, private _injector: Injector) {
|
||||||
super();
|
super();
|
||||||
var zone: NgZone = _injector.get(NgZone);
|
var zone: NgZone = _injector.get(NgZone);
|
||||||
this._enforceNoNewChanges = assertionsEnabled();
|
this._enforceNoNewChanges = isDevMode();
|
||||||
zone.run(() => { this._exceptionHandler = _injector.get(ExceptionHandler); });
|
zone.run(() => { this._exceptionHandler = _injector.get(ExceptionHandler); });
|
||||||
this._asyncInitDonePromise = this.run(() => {
|
this._asyncInitDonePromise = this.run(() => {
|
||||||
let inits: Function[] = _injector.get(APP_INITIALIZER, null);
|
let inits: Function[] = _injector.get(APP_INITIALIZER, null);
|
||||||
@ -373,7 +413,7 @@ export class ApplicationRef_ extends ApplicationRef {
|
|||||||
|
|
||||||
this._loadComponent(compRef);
|
this._loadComponent(compRef);
|
||||||
let c: Console = this._injector.get(Console);
|
let c: Console = this._injector.get(Console);
|
||||||
if (assertionsEnabled()) {
|
if (isDevMode()) {
|
||||||
let prodDescription = IS_DART ? 'Production mode is disabled in Dart.' :
|
let prodDescription = IS_DART ? 'Production mode is disabled in Dart.' :
|
||||||
'Call enableProdMode() to enable the production mode.';
|
'Call enableProdMode() to enable the production mode.';
|
||||||
c.log(`Angular 2 is running in the development mode. ${prodDescription}`);
|
c.log(`Angular 2 is running in the development mode. ${prodDescription}`);
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import {ObservableWrapper} from '../facade/async';
|
import {ObservableWrapper} from '../facade/async';
|
||||||
import {ListWrapper, Map, MapWrapper, StringMapWrapper} from '../facade/collection';
|
import {ListWrapper, Map, MapWrapper, StringMapWrapper} from '../facade/collection';
|
||||||
import {Type, assertionsEnabled, isArray, isBlank, isNumber, isPresent, isPrimitive, isString, stringify} from '../facade/lang';
|
import {Type, isArray, isBlank, isNumber, isPresent, isPrimitive, isString, stringify} from '../facade/lang';
|
||||||
import {RenderComponentType, RenderDebugInfo, Renderer, RootRenderer} from '../render/api';
|
import {RenderComponentType, RenderDebugInfo, Renderer, RootRenderer} from '../render/api';
|
||||||
|
|
||||||
import {AppElement} from './element';
|
import {AppElement} from './element';
|
||||||
|
@ -1 +0,0 @@
|
|||||||
export {enableProdMode} from '../src/facade/lang';
|
|
@ -1,21 +1,9 @@
|
|||||||
import {IS_DART, assertionsEnabled} from '../../router/src/facade/lang';
|
import {isDevMode} from '@angular/core';
|
||||||
|
|
||||||
import {beforeEach, ddescribe, describe, expect, iit, inject, it, xdescribe, xit} from '../testing';
|
import {beforeEach, ddescribe, describe, expect, iit, inject, it, xdescribe, xit} from '../testing';
|
||||||
|
|
||||||
export function main() {
|
export function main() {
|
||||||
describe('dev mode', () => {
|
describe('dev mode', () => {
|
||||||
it('is enabled in our tests by default', () => { expect(assertionsEnabled()).toBe(true); });
|
it('is enabled in our tests by default', () => { expect(isDevMode()).toBe(true); });
|
||||||
});
|
});
|
||||||
|
|
||||||
if (IS_DART) {
|
|
||||||
describe('checked mode', () => {
|
|
||||||
it('is enabled in our tests', () => {
|
|
||||||
try {
|
|
||||||
var s: string = <any>42;
|
|
||||||
expect(s).toEqual(42); // without it, dart analyzer will complain that `s` is not used.
|
|
||||||
throw 'should not be reached';
|
|
||||||
} catch (e) {
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
import {PLATFORM_INITIALIZER, Provider, ReflectiveInjector, Type} from '../index';
|
import {PLATFORM_INITIALIZER, Provider, ReflectiveInjector, Type} from '../index';
|
||||||
|
import {lockRunMode} from '../src/application_ref';
|
||||||
import {ListWrapper} from '../src/facade/collection';
|
import {ListWrapper} from '../src/facade/collection';
|
||||||
import {BaseException} from '../src/facade/exceptions';
|
import {BaseException} from '../src/facade/exceptions';
|
||||||
import {FunctionWrapper, isPresent} from '../src/facade/lang';
|
import {FunctionWrapper, isPresent} from '../src/facade/lang';
|
||||||
@ -33,6 +34,7 @@ export class TestInjector {
|
|||||||
}
|
}
|
||||||
|
|
||||||
createInjector() {
|
createInjector() {
|
||||||
|
lockRunMode();
|
||||||
var rootInjector = ReflectiveInjector.resolveAndCreate(this.platformProviders);
|
var rootInjector = ReflectiveInjector.resolveAndCreate(this.platformProviders);
|
||||||
this._injector = rootInjector.resolveAndCreateChild(
|
this._injector = rootInjector.resolveAndCreateChild(
|
||||||
ListWrapper.concat(this.applicationProviders, this._providers));
|
ListWrapper.concat(this.applicationProviders, this._providers));
|
||||||
|
@ -310,36 +310,6 @@ warn(o) {
|
|||||||
print(o);
|
print(o);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Functions below are noop in Dart. Imperatively controlling dev mode kills
|
|
||||||
// tree shaking. We should only rely on `assertionsEnabled`.
|
|
||||||
@Deprecated('Do not use this function. It is for JS only. There is no alternative.')
|
|
||||||
void lockMode() {}
|
|
||||||
@Deprecated('Do not use this function. It is for JS only. There is no alternative.')
|
|
||||||
void enableDevMode() {}
|
|
||||||
@Deprecated('Do not use this function. It is for JS only. There is no alternative.')
|
|
||||||
void enableProdMode() {}
|
|
||||||
|
|
||||||
/// Use this function to guard debugging code. When Dart is compiled in
|
|
||||||
/// production mode, the code guarded using this function will be tree
|
|
||||||
/// shaken away, reducing code size.
|
|
||||||
///
|
|
||||||
/// WARNING: DO NOT CHANGE THIS METHOD! This method is designed to have no
|
|
||||||
/// more AST nodes than the maximum allowed by dart2js to inline it. In
|
|
||||||
/// addition, the use of `assert` allows the compiler to statically compute
|
|
||||||
/// the value returned by this function and tree shake conditions guarded by
|
|
||||||
/// it.
|
|
||||||
///
|
|
||||||
/// Example:
|
|
||||||
///
|
|
||||||
/// if (assertionsEnabled()) {
|
|
||||||
/// ...code here is tree shaken away in prod mode...
|
|
||||||
/// }
|
|
||||||
bool assertionsEnabled() {
|
|
||||||
var k = false;
|
|
||||||
assert((k = true));
|
|
||||||
return k;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Can't be all uppercase as our transpiler would think it is a special directive...
|
// Can't be all uppercase as our transpiler would think it is a special directive...
|
||||||
class Json {
|
class Json {
|
||||||
static parse(String s) => convert.JSON.decode(s);
|
static parse(String s) => convert.JSON.decode(s);
|
||||||
|
@ -77,34 +77,6 @@ export function getTypeNameForDebugging(type: Type): string {
|
|||||||
export var Math = _global.Math;
|
export var Math = _global.Math;
|
||||||
export var Date = _global.Date;
|
export var Date = _global.Date;
|
||||||
|
|
||||||
var _devMode: boolean = true;
|
|
||||||
var _modeLocked: boolean = false;
|
|
||||||
|
|
||||||
export function lockMode() {
|
|
||||||
_modeLocked = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Disable Angular's development mode, which turns off assertions and other
|
|
||||||
* checks within the framework.
|
|
||||||
*
|
|
||||||
* One important assertion this disables verifies that a change detection pass
|
|
||||||
* does not result in additional changes to any bindings (also known as
|
|
||||||
* unidirectional data flow).
|
|
||||||
* @stable
|
|
||||||
*/
|
|
||||||
export function enableProdMode() {
|
|
||||||
if (_modeLocked) {
|
|
||||||
// Cannot use BaseException as that ends up importing from facade/lang.
|
|
||||||
throw 'Cannot enable prod mode after platform setup.';
|
|
||||||
}
|
|
||||||
_devMode = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
export function assertionsEnabled(): boolean {
|
|
||||||
return _devMode;
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: remove calls to assert in production environment
|
// TODO: remove calls to assert in production environment
|
||||||
// Note: Can't just export this and import in in other files
|
// Note: Can't just export this and import in in other files
|
||||||
// as `assert` is a reserved keyword in Dart
|
// as `assert` is a reserved keyword in Dart
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
import {ApplicationRef, DebugNode, NgZone, RootRenderer, getDebugNode} from '@angular/core';
|
import {ApplicationRef, DebugNode, NgZone, RootRenderer, getDebugNode, isDevMode} from '@angular/core';
|
||||||
|
|
||||||
import {DebugDomRootRenderer} from '../../../core_private';
|
import {DebugDomRootRenderer} from '../../../core_private';
|
||||||
import {assertionsEnabled} from '../../facade/lang';
|
|
||||||
import {getDOM} from '../dom_adapter';
|
import {getDOM} from '../dom_adapter';
|
||||||
import {DomRootRenderer} from '../dom_renderer';
|
import {DomRootRenderer} from '../dom_renderer';
|
||||||
|
|
||||||
@ -24,7 +23,7 @@ export function inspectNativeElement(element: any /** TODO #9100 */): DebugNode
|
|||||||
}
|
}
|
||||||
|
|
||||||
function _createConditionalRootRenderer(rootRenderer: any /** TODO #9100 */) {
|
function _createConditionalRootRenderer(rootRenderer: any /** TODO #9100 */) {
|
||||||
if (assertionsEnabled()) {
|
if (isDevMode()) {
|
||||||
return _createRootRenderer(rootRenderer);
|
return _createRootRenderer(rootRenderer);
|
||||||
}
|
}
|
||||||
return rootRenderer;
|
return rootRenderer;
|
||||||
|
@ -1,9 +1,11 @@
|
|||||||
|
import {isDevMode} from '@angular/core';
|
||||||
|
|
||||||
import {DomAdapter, getDOM} from '../dom/dom_adapter';
|
import {DomAdapter, getDOM} from '../dom/dom_adapter';
|
||||||
import {assertionsEnabled} from '../facade/lang';
|
|
||||||
|
|
||||||
import {sanitizeUrl} from './url_sanitizer';
|
import {sanitizeUrl} from './url_sanitizer';
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** A <body> element that can be safely used to parse untrusted HTML. Lazily initialized below. */
|
/** A <body> element that can be safely used to parse untrusted HTML. Lazily initialized below. */
|
||||||
let inertElement: HTMLElement = null;
|
let inertElement: HTMLElement = null;
|
||||||
/** Lazily initialized to make sure the DOM adapter gets set before use. */
|
/** Lazily initialized to make sure the DOM adapter gets set before use. */
|
||||||
@ -256,7 +258,7 @@ export function sanitizeHtml(unsafeHtml: string): string {
|
|||||||
DOM.removeChild(parent, child);
|
DOM.removeChild(parent, child);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (assertionsEnabled() && safeHtml !== unsafeHtml) {
|
if (isDevMode() && safeHtml !== unsafeHtml) {
|
||||||
DOM.log('WARNING: sanitizing HTML stripped some content.');
|
DOM.log('WARNING: sanitizing HTML stripped some content.');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,8 +1,10 @@
|
|||||||
|
import {isDevMode} from '@angular/core';
|
||||||
|
|
||||||
import {getDOM} from '../dom/dom_adapter';
|
import {getDOM} from '../dom/dom_adapter';
|
||||||
import {assertionsEnabled} from '../facade/lang';
|
|
||||||
|
|
||||||
import {sanitizeUrl} from './url_sanitizer';
|
import {sanitizeUrl} from './url_sanitizer';
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Regular expression for safe style values.
|
* Regular expression for safe style values.
|
||||||
*
|
*
|
||||||
@ -81,7 +83,7 @@ export function sanitizeStyle(value: string): string {
|
|||||||
return value; // Safe style values.
|
return value; // Safe style values.
|
||||||
}
|
}
|
||||||
|
|
||||||
if (assertionsEnabled()) getDOM().log('WARNING: sanitizing unsafe style value ' + value);
|
if (isDevMode()) getDOM().log('WARNING: sanitizing unsafe style value ' + value);
|
||||||
|
|
||||||
return 'unsafe';
|
return 'unsafe';
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
|
import {isDevMode} from '@angular/core';
|
||||||
|
|
||||||
import {getDOM} from '../dom/dom_adapter';
|
import {getDOM} from '../dom/dom_adapter';
|
||||||
import {assertionsEnabled} from '../facade/lang';
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A pattern that recognizes a commonly useful subset of URLs that are safe.
|
* A pattern that recognizes a commonly useful subset of URLs that are safe.
|
||||||
@ -37,7 +39,7 @@ export function sanitizeUrl(url: string): string {
|
|||||||
url = String(url);
|
url = String(url);
|
||||||
if (url.match(SAFE_URL_PATTERN) || url.match(DATA_URL_PATTERN)) return url;
|
if (url.match(SAFE_URL_PATTERN) || url.match(DATA_URL_PATTERN)) return url;
|
||||||
|
|
||||||
if (assertionsEnabled()) getDOM().log('WARNING: sanitizing unsafe URL value ' + url);
|
if (isDevMode()) getDOM().log('WARNING: sanitizing unsafe URL value ' + url);
|
||||||
|
|
||||||
return 'unsafe:' + url;
|
return 'unsafe:' + url;
|
||||||
}
|
}
|
||||||
|
@ -254,7 +254,7 @@ const CORE = [
|
|||||||
'EmbeddedViewRef.destroy():any',
|
'EmbeddedViewRef.destroy():any',
|
||||||
'EmbeddedViewRef.rootNodes:any[]',
|
'EmbeddedViewRef.rootNodes:any[]',
|
||||||
'EmbeddedViewRef<C>',
|
'EmbeddedViewRef<C>',
|
||||||
'enableProdMode():any',
|
'enableProdMode():void',
|
||||||
'EventEmitter.constructor(isAsync:boolean=false)',
|
'EventEmitter.constructor(isAsync:boolean=false)',
|
||||||
'EventEmitter.emit(value:T):any',
|
'EventEmitter.emit(value:T):any',
|
||||||
'EventEmitter.next(value:any):any',
|
'EventEmitter.next(value:any):any',
|
||||||
@ -311,6 +311,7 @@ const CORE = [
|
|||||||
'InstantiationError.wrapperMessage:string',
|
'InstantiationError.wrapperMessage:string',
|
||||||
'InvalidProviderError',
|
'InvalidProviderError',
|
||||||
'InvalidProviderError.constructor(provider:any)',
|
'InvalidProviderError.constructor(provider:any)',
|
||||||
|
'isDevMode():boolean',
|
||||||
'IterableDiffer',
|
'IterableDiffer',
|
||||||
'IterableDiffer.diff(object:any):any',
|
'IterableDiffer.diff(object:any):any',
|
||||||
'IterableDiffer.onDestroy():any',
|
'IterableDiffer.onDestroy():any',
|
||||||
@ -342,6 +343,7 @@ const CORE = [
|
|||||||
'KeyValueDiffers.extend(factories:KeyValueDifferFactory[]):Provider',
|
'KeyValueDiffers.extend(factories:KeyValueDifferFactory[]):Provider',
|
||||||
'KeyValueDiffers.factories:KeyValueDifferFactory[]',
|
'KeyValueDiffers.factories:KeyValueDifferFactory[]',
|
||||||
'KeyValueDiffers.find(kv:Object):KeyValueDifferFactory',
|
'KeyValueDiffers.find(kv:Object):KeyValueDifferFactory',
|
||||||
|
'lockRunMode():void',
|
||||||
'NgZone',
|
'NgZone',
|
||||||
'NgZone.assertInAngularZone():void',
|
'NgZone.assertInAngularZone():void',
|
||||||
'NgZone.assertNotInAngularZone():void',
|
'NgZone.assertNotInAngularZone():void',
|
||||||
@ -1217,7 +1219,7 @@ const COMPILER = [
|
|||||||
'CompileQueryMetadata.selectors:Array<CompileTokenMetadata>',
|
'CompileQueryMetadata.selectors:Array<CompileTokenMetadata>',
|
||||||
'CompileQueryMetadata.toJson():{[key:string]:any}',
|
'CompileQueryMetadata.toJson():{[key:string]:any}',
|
||||||
'CompilerConfig',
|
'CompilerConfig',
|
||||||
'CompilerConfig.constructor({renderTypes=newDefaultRenderTypes(),defaultEncapsulation=ViewEncapsulation.Emulated,genDebugInfo=assertionsEnabled(),logBindingUpdate=assertionsEnabled(),useJit=true,platformDirectives=[],platformPipes=[]}:{renderTypes?:RenderTypes, defaultEncapsulation?:ViewEncapsulation, genDebugInfo?:boolean, logBindingUpdate?:boolean, useJit?:boolean, platformDirectives?:any[], platformPipes?:any[]}={})',
|
'CompilerConfig.constructor({renderTypes=newDefaultRenderTypes(),defaultEncapsulation=ViewEncapsulation.Emulated,genDebugInfo,logBindingUpdate,useJit=true,platformDirectives=[],platformPipes=[]}:{renderTypes?:RenderTypes, defaultEncapsulation?:ViewEncapsulation, genDebugInfo?:boolean, logBindingUpdate?:boolean, useJit?:boolean, platformDirectives?:any[], platformPipes?:any[]}={})',
|
||||||
'CompilerConfig.defaultEncapsulation:ViewEncapsulation',
|
'CompilerConfig.defaultEncapsulation:ViewEncapsulation',
|
||||||
'CompilerConfig.genDebugInfo:boolean',
|
'CompilerConfig.genDebugInfo:boolean',
|
||||||
'CompilerConfig.logBindingUpdate:boolean',
|
'CompilerConfig.logBindingUpdate:boolean',
|
||||||
|
Loading…
x
Reference in New Issue
Block a user