2016-06-23 12:47:54 -04:00
/ * *
* @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
* /
feat(browser): use AppModules for bootstrap in the browser
This introduces the `BrowserModule` to be used for long form
bootstrap and offline compile bootstrap:
```
@AppModule({
modules: [BrowserModule],
precompile: [MainComponent],
providers: […], // additional providers
directives: […], // additional platform directives
pipes: […] // additional platform pipes
})
class MyModule {
constructor(appRef: ApplicationRef) {
appRef.bootstrap(MainComponent);
}
}
// offline compile
import {bootstrapModuleFactory} from ‘@angular/platform-browser’;
bootstrapModuleFactory(MyModuleNgFactory);
// runtime compile long form
import {bootstrapModule} from ‘@angular/platform-browser-dynamic’;
bootstrapModule(MyModule);
```
The short form, `bootstrap(...)`, can now creates a module on the fly,
given `directives`, `pipes, `providers`, `precompile` and `modules`
properties.
Related changes:
- make `SanitizationService`, `SecurityContext` public in `@angular/core` so that the offline compiler can resolve the token
- move `AnimationDriver` to `platform-browser` and make it
public so that the offline compiler can resolve the token
BREAKING CHANGES:
- short form bootstrap does no longer allow
to inject compiler internals (i.e. everything
from `@angular/compiler). Inject `Compiler` instead.
To provide custom providers for the compiler,
create a custom compiler via `browserCompiler({providers: [...]})`
and pass that into the `bootstrap` method.
2016-06-30 16:07:17 -04:00
import { LowerCasePipe , NgIf } from '@angular/common' ;
import { XHR } from '@angular/compiler' ;
2016-07-07 14:57:11 -04:00
import { APP_INITIALIZER , Component , Directive , ExceptionHandler , Inject , Input , OnDestroy , PLATFORM_DIRECTIVES , PLATFORM_INITIALIZER , PLATFORM_PIPES , Pipe , ReflectiveInjector , coreLoadAndBootstrap , createPlatform , provide } from '@angular/core' ;
2016-06-08 19:38:52 -04:00
import { ApplicationRef , disposePlatform } from '@angular/core/src/application_ref' ;
import { Console } from '@angular/core/src/console' ;
import { ComponentRef } from '@angular/core/src/linker/component_factory' ;
import { Testability , TestabilityRegistry } from '@angular/core/src/testability/testability' ;
feat(browser): use AppModules for bootstrap in the browser
This introduces the `BrowserModule` to be used for long form
bootstrap and offline compile bootstrap:
```
@AppModule({
modules: [BrowserModule],
precompile: [MainComponent],
providers: […], // additional providers
directives: […], // additional platform directives
pipes: […] // additional platform pipes
})
class MyModule {
constructor(appRef: ApplicationRef) {
appRef.bootstrap(MainComponent);
}
}
// offline compile
import {bootstrapModuleFactory} from ‘@angular/platform-browser’;
bootstrapModuleFactory(MyModuleNgFactory);
// runtime compile long form
import {bootstrapModule} from ‘@angular/platform-browser-dynamic’;
bootstrapModule(MyModule);
```
The short form, `bootstrap(...)`, can now creates a module on the fly,
given `directives`, `pipes, `providers`, `precompile` and `modules`
properties.
Related changes:
- make `SanitizationService`, `SecurityContext` public in `@angular/core` so that the offline compiler can resolve the token
- move `AnimationDriver` to `platform-browser` and make it
public so that the offline compiler can resolve the token
BREAKING CHANGES:
- short form bootstrap does no longer allow
to inject compiler internals (i.e. everything
from `@angular/compiler). Inject `Compiler` instead.
To provide custom providers for the compiler,
create a custom compiler via `browserCompiler({providers: [...]})`
and pass that into the `bootstrap` method.
2016-06-30 16:07:17 -04:00
import { ComponentFixture } from '@angular/core/testing' ;
import { AsyncTestCompleter , Log , afterEach , beforeEach , beforeEachProviders , ddescribe , describe , expect , iit , inject , it } from '@angular/core/testing/testing_internal' ;
2016-06-10 13:21:53 -04:00
import { BROWSER_APP_PROVIDERS , BROWSER_PLATFORM_PROVIDERS } from '@angular/platform-browser' ;
import { BROWSER_APP_COMPILER_PROVIDERS , bootstrap } from '@angular/platform-browser-dynamic' ;
2016-06-08 19:38:52 -04:00
import { getDOM } from '@angular/platform-browser/src/dom/dom_adapter' ;
import { DOCUMENT } from '@angular/platform-browser/src/dom/dom_tokens' ;
import { PromiseWrapper } from '../../src/facade/async' ;
import { stringify } from '../../src/facade/lang' ;
2015-05-26 12:45:15 -04:00
2016-03-08 16:36:48 -05:00
@Component ( { selector : 'hello-app' , template : '{{greeting}} world!' } )
2015-05-26 12:45:15 -04:00
class HelloRootCmp {
greeting : string ;
constructor ( ) { this . greeting = 'hello' ; }
}
2016-03-08 16:36:48 -05:00
@Component ( { selector : 'hello-app' , template : 'before: <ng-content></ng-content> after: done' } )
2015-05-26 12:45:15 -04:00
class HelloRootCmpContent {
constructor ( ) { }
}
2016-03-08 16:36:48 -05:00
@Component ( { selector : 'hello-app-2' , template : '{{greeting}} world, again!' } )
2015-05-26 12:45:15 -04:00
class HelloRootCmp2 {
greeting : string ;
constructor ( ) { this . greeting = 'hello' ; }
}
2016-03-08 16:36:48 -05:00
@Component ( { selector : 'hello-app' , template : '' } )
2015-05-26 12:45:15 -04:00
class HelloRootCmp3 {
2016-06-08 18:45:15 -04:00
appBinding : any /** TODO #9100 */ ;
2015-05-26 12:45:15 -04:00
2016-06-08 19:38:52 -04:00
constructor ( @Inject ( 'appBinding' ) appBinding : any /** TODO #9100 */ ) {
this . appBinding = appBinding ;
}
2015-05-26 12:45:15 -04:00
}
2016-03-08 16:36:48 -05:00
@Component ( { selector : 'hello-app' , template : '' } )
2015-05-26 12:45:15 -04:00
class HelloRootCmp4 {
2016-06-08 18:45:15 -04:00
appRef : any /** TODO #9100 */ ;
2015-05-26 12:45:15 -04:00
2016-06-09 14:04:15 -04:00
constructor ( @Inject ( ApplicationRef ) appRef : ApplicationRef ) { this . appRef = appRef ; }
2015-05-26 12:45:15 -04:00
}
@Component ( { selector : 'hello-app' } )
class HelloRootMissingTemplate {
}
@Directive ( { selector : 'hello-app' } )
class HelloRootDirectiveIsNotCmp {
}
2016-03-08 16:36:48 -05:00
@Component ( { selector : 'hello-app' , template : '' } )
2015-11-10 18:42:22 -05:00
class HelloOnDestroyTickCmp implements OnDestroy {
appRef : ApplicationRef ;
2016-06-09 14:04:15 -04:00
constructor ( @Inject ( ApplicationRef ) appRef : ApplicationRef ) { this . appRef = appRef ; }
2015-11-10 18:42:22 -05:00
refactor(lifecycle): prefix lifecycle methods with "ng"
BREAKING CHANGE:
Previously, components that would implement lifecycle interfaces would include methods
like "onChanges" or "afterViewInit." Given that components were at risk of using such
names without realizing that Angular would call the methods at different points of
the component lifecycle. This change adds an "ng" prefix to all lifecycle hook methods,
far reducing the risk of an accidental name collision.
To fix, just rename these methods:
* onInit
* onDestroy
* doCheck
* onChanges
* afterContentInit
* afterContentChecked
* afterViewInit
* afterViewChecked
* _Router Hooks_
* onActivate
* onReuse
* onDeactivate
* canReuse
* canDeactivate
To:
* ngOnInit,
* ngOnDestroy,
* ngDoCheck,
* ngOnChanges,
* ngAfterContentInit,
* ngAfterContentChecked,
* ngAfterViewInit,
* ngAfterViewChecked
* _Router Hooks_
* routerOnActivate
* routerOnReuse
* routerOnDeactivate
* routerCanReuse
* routerCanDeactivate
The names of lifecycle interfaces and enums have not changed, though interfaces
have been updated to reflect the new method names.
Closes #5036
2015-11-16 20:04:36 -05:00
ngOnDestroy ( ) : void { this . appRef . tick ( ) ; }
2015-11-10 18:42:22 -05:00
}
feat(browser): use AppModules for bootstrap in the browser
This introduces the `BrowserModule` to be used for long form
bootstrap and offline compile bootstrap:
```
@AppModule({
modules: [BrowserModule],
precompile: [MainComponent],
providers: […], // additional providers
directives: […], // additional platform directives
pipes: […] // additional platform pipes
})
class MyModule {
constructor(appRef: ApplicationRef) {
appRef.bootstrap(MainComponent);
}
}
// offline compile
import {bootstrapModuleFactory} from ‘@angular/platform-browser’;
bootstrapModuleFactory(MyModuleNgFactory);
// runtime compile long form
import {bootstrapModule} from ‘@angular/platform-browser-dynamic’;
bootstrapModule(MyModule);
```
The short form, `bootstrap(...)`, can now creates a module on the fly,
given `directives`, `pipes, `providers`, `precompile` and `modules`
properties.
Related changes:
- make `SanitizationService`, `SecurityContext` public in `@angular/core` so that the offline compiler can resolve the token
- move `AnimationDriver` to `platform-browser` and make it
public so that the offline compiler can resolve the token
BREAKING CHANGES:
- short form bootstrap does no longer allow
to inject compiler internals (i.e. everything
from `@angular/compiler). Inject `Compiler` instead.
To provide custom providers for the compiler,
create a custom compiler via `browserCompiler({providers: [...]})`
and pass that into the `bootstrap` method.
2016-06-30 16:07:17 -04:00
@Component ( { selector : 'hello-app' , templateUrl : './sometemplate.html' } )
class HelloUrlCmp {
greeting = 'hello' ;
}
2016-07-07 14:57:11 -04:00
@Directive ( { selector : '[someDir]' , host : { '[title]' : 'someDir' } } )
class SomeDirective {
@Input ( )
someDir : string ;
}
@Pipe ( { name : 'somePipe' } )
class SomePipe {
transform ( value : string ) : any { return ` transformed ${ value } ` ; }
}
@Component ( { selector : 'hello-app' , template : ` <div [someDir]="'someValue' | somePipe"></div> ` } )
feat(browser): use AppModules for bootstrap in the browser
This introduces the `BrowserModule` to be used for long form
bootstrap and offline compile bootstrap:
```
@AppModule({
modules: [BrowserModule],
precompile: [MainComponent],
providers: […], // additional providers
directives: […], // additional platform directives
pipes: […] // additional platform pipes
})
class MyModule {
constructor(appRef: ApplicationRef) {
appRef.bootstrap(MainComponent);
}
}
// offline compile
import {bootstrapModuleFactory} from ‘@angular/platform-browser’;
bootstrapModuleFactory(MyModuleNgFactory);
// runtime compile long form
import {bootstrapModule} from ‘@angular/platform-browser-dynamic’;
bootstrapModule(MyModule);
```
The short form, `bootstrap(...)`, can now creates a module on the fly,
given `directives`, `pipes, `providers`, `precompile` and `modules`
properties.
Related changes:
- make `SanitizationService`, `SecurityContext` public in `@angular/core` so that the offline compiler can resolve the token
- move `AnimationDriver` to `platform-browser` and make it
public so that the offline compiler can resolve the token
BREAKING CHANGES:
- short form bootstrap does no longer allow
to inject compiler internals (i.e. everything
from `@angular/compiler). Inject `Compiler` instead.
To provide custom providers for the compiler,
create a custom compiler via `browserCompiler({providers: [...]})`
and pass that into the `bootstrap` method.
2016-06-30 16:07:17 -04:00
class HelloCmpUsingPlatformDirectiveAndPipe {
show : boolean = false ;
}
2015-07-27 18:47:42 -04:00
class _ArrayLogger {
res : any [ ] = [ ] ;
log ( s : any ) : void { this . res . push ( s ) ; }
2015-08-24 14:35:27 -04:00
logError ( s : any ) : void { this . res . push ( s ) ; }
2015-07-27 18:47:42 -04:00
logGroup ( s : any ) : void { this . res . push ( s ) ; }
2015-07-23 21:00:19 -04:00
logGroupEnd ( ) { } ;
}
2015-07-27 18:47:42 -04:00
2015-12-15 11:34:44 -05:00
class DummyConsole implements Console {
2016-07-07 14:57:11 -04:00
public warnings : string [ ] = [ ] ;
log ( message : string ) { }
warn ( message : string ) { this . warnings . push ( message ) ; }
2015-12-15 11:34:44 -05:00
}
2015-05-26 12:45:15 -04:00
export function main() {
2016-06-08 19:38:52 -04:00
var fakeDoc : any /** TODO #9100 */ , el : any /** TODO #9100 */ , el2 : any /** TODO #9100 */ ,
testProviders : any /** TODO #9100 */ , lightDom : any /** TODO #9100 */ ;
2015-05-26 12:45:15 -04:00
describe ( 'bootstrap factory method' , ( ) = > {
2016-07-07 14:57:11 -04:00
let compilerConsole : DummyConsole ;
2016-06-23 20:10:22 -04:00
beforeEachProviders ( ( ) = > { return [ Log ] ; } ) ;
2015-06-24 16:46:39 -04:00
beforeEach ( ( ) = > {
2016-04-14 17:52:35 -04:00
disposePlatform ( ) ;
2016-04-28 20:50:03 -04:00
fakeDoc = getDOM ( ) . createHtmlDocument ( ) ;
el = getDOM ( ) . createElement ( 'hello-app' , fakeDoc ) ;
el2 = getDOM ( ) . createElement ( 'hello-app-2' , fakeDoc ) ;
lightDom = getDOM ( ) . createElement ( 'light-dom-el' , fakeDoc ) ;
getDOM ( ) . appendChild ( fakeDoc . body , el ) ;
getDOM ( ) . appendChild ( fakeDoc . body , el2 ) ;
getDOM ( ) . appendChild ( el , lightDom ) ;
getDOM ( ) . setText ( lightDom , 'loading' ) ;
2016-07-07 14:57:11 -04:00
compilerConsole = new DummyConsole ( ) ;
2015-12-15 11:34:44 -05:00
testProviders =
2016-07-07 14:57:11 -04:00
[ { provide : DOCUMENT , useValue : fakeDoc } , { provide : Console , useValue : compilerConsole } ] ;
2015-06-24 16:46:39 -04:00
} ) ;
2015-11-18 12:18:37 -05:00
afterEach ( disposePlatform ) ;
2016-04-14 17:52:35 -04:00
it ( 'should throw if bootstrapped Directive is not a Component' , ( ) = > {
feat(browser): use AppModules for bootstrap in the browser
This introduces the `BrowserModule` to be used for long form
bootstrap and offline compile bootstrap:
```
@AppModule({
modules: [BrowserModule],
precompile: [MainComponent],
providers: […], // additional providers
directives: […], // additional platform directives
pipes: […] // additional platform pipes
})
class MyModule {
constructor(appRef: ApplicationRef) {
appRef.bootstrap(MainComponent);
}
}
// offline compile
import {bootstrapModuleFactory} from ‘@angular/platform-browser’;
bootstrapModuleFactory(MyModuleNgFactory);
// runtime compile long form
import {bootstrapModule} from ‘@angular/platform-browser-dynamic’;
bootstrapModule(MyModule);
```
The short form, `bootstrap(...)`, can now creates a module on the fly,
given `directives`, `pipes, `providers`, `precompile` and `modules`
properties.
Related changes:
- make `SanitizationService`, `SecurityContext` public in `@angular/core` so that the offline compiler can resolve the token
- move `AnimationDriver` to `platform-browser` and make it
public so that the offline compiler can resolve the token
BREAKING CHANGES:
- short form bootstrap does no longer allow
to inject compiler internals (i.e. everything
from `@angular/compiler). Inject `Compiler` instead.
To provide custom providers for the compiler,
create a custom compiler via `browserCompiler({providers: [...]})`
and pass that into the `bootstrap` method.
2016-06-30 16:07:17 -04:00
expect ( ( ) = > bootstrap ( HelloRootDirectiveIsNotCmp ) )
2016-04-14 17:52:35 -04:00
. toThrowError (
` Could not compile ' ${ stringify ( HelloRootDirectiveIsNotCmp ) } ' because it is not a component. ` ) ;
} ) ;
2015-05-26 12:45:15 -04:00
2016-06-08 19:38:52 -04:00
it ( 'should throw if no element is found' ,
inject ( [ AsyncTestCompleter ] , ( async : AsyncTestCompleter ) = > {
2015-07-27 18:47:42 -04:00
var logger = new _ArrayLogger ( ) ;
2016-02-25 17:24:17 -05:00
var exceptionHandler = new ExceptionHandler ( logger , false ) ;
2015-07-23 21:00:19 -04:00
2015-07-27 18:47:42 -04:00
var refPromise =
2016-06-02 20:30:40 -04:00
bootstrap ( HelloRootCmp , [ { provide : ExceptionHandler , useValue : exceptionHandler } ] ) ;
2015-05-26 12:45:15 -04:00
PromiseWrapper . then ( refPromise , null , ( reason ) = > {
expect ( reason . message ) . toContain ( 'The selector "hello-app" did not match any elements' ) ;
async . done ( ) ;
return null ;
} ) ;
} ) ) ;
2016-04-28 20:50:03 -04:00
if ( getDOM ( ) . supportsDOMEvents ( ) ) {
2016-02-25 17:24:17 -05:00
it ( 'should forward the error to promise when bootstrap fails' ,
2016-06-09 14:04:15 -04:00
inject ( [ AsyncTestCompleter ] , ( async : AsyncTestCompleter ) = > {
2016-02-25 17:24:17 -05:00
// Skip for dart since it causes a confusing error message in console when test passes.
var logger = new _ArrayLogger ( ) ;
var exceptionHandler = new ExceptionHandler ( logger , false ) ;
var refPromise =
2016-06-02 20:30:40 -04:00
bootstrap ( HelloRootCmp , [ { provide : ExceptionHandler , useValue : exceptionHandler } ] ) ;
2016-01-06 17:13:44 -05:00
PromiseWrapper . then ( refPromise , null , ( reason : any ) = > {
2016-02-25 17:24:17 -05:00
expect ( reason . message )
. toContain ( 'The selector "hello-app" did not match any elements' ) ;
async . done ( ) ;
} ) ;
} ) ) ;
2015-07-27 18:47:42 -04:00
it ( 'should invoke the default exception handler when bootstrap fails' ,
2016-06-09 14:04:15 -04:00
inject ( [ AsyncTestCompleter ] , ( async : AsyncTestCompleter ) = > {
2015-07-27 18:47:42 -04:00
var logger = new _ArrayLogger ( ) ;
2016-02-25 17:24:17 -05:00
var exceptionHandler = new ExceptionHandler ( logger , false ) ;
2015-07-27 18:47:42 -04:00
var refPromise =
2016-06-02 20:30:40 -04:00
bootstrap ( HelloRootCmp , [ { provide : ExceptionHandler , useValue : exceptionHandler } ] ) ;
2015-07-27 18:47:42 -04:00
PromiseWrapper . then ( refPromise , null , ( reason ) = > {
2016-06-08 19:38:52 -04:00
expect ( logger . res . join ( '' ) )
2015-07-27 18:47:42 -04:00
. toContain ( 'The selector "hello-app" did not match any elements' ) ;
async . done ( ) ;
return null ;
} ) ;
} ) ) ;
}
2015-05-26 12:45:15 -04:00
it ( 'should create an injector promise' , ( ) = > {
2015-10-11 01:11:13 -04:00
var refPromise = bootstrap ( HelloRootCmp , testProviders ) ;
2015-05-26 12:45:15 -04:00
expect ( refPromise ) . not . toBe ( null ) ;
} ) ;
2016-06-09 14:04:15 -04:00
it ( 'should display hello world' , inject ( [ AsyncTestCompleter ] , ( async : AsyncTestCompleter ) = > {
2015-10-11 01:11:13 -04:00
var refPromise = bootstrap ( HelloRootCmp , testProviders ) ;
2015-05-26 12:45:15 -04:00
refPromise . then ( ( ref ) = > {
expect ( el ) . toHaveText ( 'hello world!' ) ;
async . done ( ) ;
} ) ;
} ) ) ;
2016-06-08 19:38:52 -04:00
it ( 'should support multiple calls to bootstrap' ,
inject ( [ AsyncTestCompleter ] , ( async : AsyncTestCompleter ) = > {
2015-10-11 01:11:13 -04:00
var refPromise1 = bootstrap ( HelloRootCmp , testProviders ) ;
var refPromise2 = bootstrap ( HelloRootCmp2 , testProviders ) ;
2016-06-08 19:38:52 -04:00
PromiseWrapper . all ( [ refPromise1 , refPromise2 ] ) . then ( ( refs ) = > {
expect ( el ) . toHaveText ( 'hello world!' ) ;
expect ( el2 ) . toHaveText ( 'hello world, again!' ) ;
async . done ( ) ;
} ) ;
2015-05-26 12:45:15 -04:00
} ) ) ;
2015-11-13 14:21:16 -05:00
2015-11-10 18:42:22 -05:00
it ( 'should not crash if change detection is invoked when the root component is disposed' ,
2016-06-09 14:04:15 -04:00
inject ( [ AsyncTestCompleter ] , ( async : AsyncTestCompleter ) = > {
2016-06-08 19:38:52 -04:00
bootstrap ( HelloOnDestroyTickCmp , testProviders ) . then ( ( ref ) = > {
expect ( ( ) = > ref . destroy ( ) ) . not . toThrow ( ) ;
async . done ( ) ;
} ) ;
2015-11-10 18:42:22 -05:00
} ) ) ;
2015-11-10 13:40:33 -05:00
it ( 'should unregister change detectors when components are disposed' ,
2016-06-09 14:04:15 -04:00
inject ( [ AsyncTestCompleter ] , ( async : AsyncTestCompleter ) = > {
2016-06-08 19:38:52 -04:00
var platform =
createPlatform ( ReflectiveInjector . resolveAndCreate ( BROWSER_PLATFORM_PROVIDERS ) ) ;
var app = ReflectiveInjector
. resolveAndCreate (
[ BROWSER_APP_PROVIDERS , BROWSER_APP_COMPILER_PROVIDERS , testProviders ] ,
platform . injector )
. get ( ApplicationRef ) ;
coreLoadAndBootstrap ( HelloRootCmp , app . injector ) . then ( ( ref ) = > {
ref . destroy ( ) ;
expect ( ( ) = > app . tick ( ) ) . not . toThrow ( ) ;
async . done ( ) ;
} ) ;
2015-11-10 13:40:33 -05:00
} ) ) ;
2015-05-26 12:45:15 -04:00
2016-06-08 19:38:52 -04:00
it ( 'should make the provided bindings available to the application component' ,
2016-06-09 14:04:15 -04:00
inject ( [ AsyncTestCompleter ] , ( async : AsyncTestCompleter ) = > {
2015-10-11 01:11:13 -04:00
var refPromise = bootstrap (
2016-06-08 19:38:52 -04:00
HelloRootCmp3 , [ testProviders , { provide : 'appBinding' , useValue : 'BoundValue' } ] ) ;
2015-05-26 12:45:15 -04:00
refPromise . then ( ( ref ) = > {
2016-06-08 19:38:52 -04:00
expect ( ref . instance . appBinding ) . toEqual ( 'BoundValue' ) ;
2015-05-26 12:45:15 -04:00
async . done ( ) ;
} ) ;
} ) ) ;
2016-06-08 19:38:52 -04:00
it ( 'should avoid cyclic dependencies when root component requires Lifecycle through DI' ,
2016-06-09 14:04:15 -04:00
inject ( [ AsyncTestCompleter ] , ( async : AsyncTestCompleter ) = > {
2015-10-11 01:11:13 -04:00
var refPromise = bootstrap ( HelloRootCmp4 , testProviders ) ;
2015-05-26 12:45:15 -04:00
refPromise . then ( ( ref ) = > {
2016-04-13 20:05:17 -04:00
expect ( ref . instance . appRef ) . toBe ( ref . injector . get ( ApplicationRef ) ) ;
2015-05-26 12:45:15 -04:00
async . done ( ) ;
} ) ;
} ) ) ;
2016-06-08 19:38:52 -04:00
it ( 'should run platform initializers' , inject ( [ Log ] , ( log : Log ) = > {
2016-04-14 17:52:35 -04:00
let p = createPlatform ( ReflectiveInjector . resolveAndCreate ( [
2016-05-19 17:31:21 -04:00
BROWSER_PLATFORM_PROVIDERS ,
2016-06-08 19:38:52 -04:00
{ provide : PLATFORM_INITIALIZER , useValue : log.fn ( 'platform_init1' ) , multi : true } ,
{ provide : PLATFORM_INITIALIZER , useValue : log.fn ( 'platform_init2' ) , multi : true }
2016-04-14 17:52:35 -04:00
] ) ) ;
2016-06-08 19:38:52 -04:00
expect ( log . result ( ) ) . toEqual ( 'platform_init1; platform_init2' ) ;
2015-11-18 12:18:37 -05:00
log . clear ( ) ;
2016-04-14 17:52:35 -04:00
var a = ReflectiveInjector . resolveAndCreate (
[
2016-05-19 17:31:21 -04:00
BROWSER_APP_PROVIDERS ,
2016-06-08 19:38:52 -04:00
{ provide : APP_INITIALIZER , useValue : log.fn ( 'app_init1' ) , multi : true } ,
{ provide : APP_INITIALIZER , useValue : log.fn ( 'app_init2' ) , multi : true }
2016-04-14 17:52:35 -04:00
] ,
p . injector ) ;
a . get ( ApplicationRef ) ;
2015-11-18 12:18:37 -05:00
2016-06-08 19:38:52 -04:00
expect ( log . result ( ) ) . toEqual ( 'app_init1; app_init2' ) ;
2015-11-18 12:18:37 -05:00
} ) ) ;
2015-05-26 12:45:15 -04:00
it ( 'should register each application with the testability registry' ,
2016-06-09 14:04:15 -04:00
inject ( [ AsyncTestCompleter ] , ( async : AsyncTestCompleter ) = > {
2016-04-30 13:52:04 -04:00
var refPromise1 : Promise < ComponentRef < any > > = bootstrap ( HelloRootCmp , testProviders ) ;
var refPromise2 : Promise < ComponentRef < any > > = bootstrap ( HelloRootCmp2 , testProviders ) ;
2015-05-26 12:45:15 -04:00
2016-06-08 19:38:52 -04:00
PromiseWrapper . all ( [ refPromise1 , refPromise2 ] ) . then ( ( refs : ComponentRef < any > [ ] ) = > {
var registry = refs [ 0 ] . injector . get ( TestabilityRegistry ) ;
var testabilities =
[ refs [ 0 ] . injector . get ( Testability ) , refs [ 1 ] . injector . get ( Testability ) ] ;
PromiseWrapper . all ( testabilities ) . then ( ( testabilities : Testability [ ] ) = > {
expect ( registry . findTestabilityInTree ( el ) ) . toEqual ( testabilities [ 0 ] ) ;
expect ( registry . findTestabilityInTree ( el2 ) ) . toEqual ( testabilities [ 1 ] ) ;
async . done ( ) ;
} ) ;
} ) ;
2015-05-26 12:45:15 -04:00
} ) ) ;
feat(browser): use AppModules for bootstrap in the browser
This introduces the `BrowserModule` to be used for long form
bootstrap and offline compile bootstrap:
```
@AppModule({
modules: [BrowserModule],
precompile: [MainComponent],
providers: […], // additional providers
directives: […], // additional platform directives
pipes: […] // additional platform pipes
})
class MyModule {
constructor(appRef: ApplicationRef) {
appRef.bootstrap(MainComponent);
}
}
// offline compile
import {bootstrapModuleFactory} from ‘@angular/platform-browser’;
bootstrapModuleFactory(MyModuleNgFactory);
// runtime compile long form
import {bootstrapModule} from ‘@angular/platform-browser-dynamic’;
bootstrapModule(MyModule);
```
The short form, `bootstrap(...)`, can now creates a module on the fly,
given `directives`, `pipes, `providers`, `precompile` and `modules`
properties.
Related changes:
- make `SanitizationService`, `SecurityContext` public in `@angular/core` so that the offline compiler can resolve the token
- move `AnimationDriver` to `platform-browser` and make it
public so that the offline compiler can resolve the token
BREAKING CHANGES:
- short form bootstrap does no longer allow
to inject compiler internals (i.e. everything
from `@angular/compiler). Inject `Compiler` instead.
To provide custom providers for the compiler,
create a custom compiler via `browserCompiler({providers: [...]})`
and pass that into the `bootstrap` method.
2016-06-30 16:07:17 -04:00
// Note: This will soon be deprecated as bootstrap creates a separate injector for the compiler,
// i.e. such providers needs to go into that injecotr (when calling `browserCompiler`);
it ( 'should still allow to provide a custom xhr via the regular providers' ,
inject ( [ AsyncTestCompleter ] , ( async : AsyncTestCompleter ) = > {
let spyXhr : XHR = { get : ( url : string ) = > Promise . resolve ( '{{greeting}} world!' ) } ;
2016-07-07 14:57:11 -04:00
bootstrap ( HelloUrlCmp , testProviders . concat ( [
{ provide : XHR , useValue : spyXhr }
] ) ) . then ( ( compRef ) = > {
expect ( el ) . toHaveText ( 'hello world!' ) ;
expect ( compilerConsole . warnings ) . toEqual ( [
refactor(core): clean up platform bootstrap and initTestEnvironment
- Introduces `CompilerFactory` which can be part of a `PlatformRef`.
- Introduces `WorkerAppModule`, `WorkerUiModule`, `ServerModule`
- Introduces `serverDynamicPlatform` for applications using runtime compilation
on the server.
- Changes browser bootstrap for runtime and offline compilation (see below for an example).
* introduces `bootstrapModule` and `bootstrapModuleFactory` in `@angular/core`
* introduces new `browserDynamicPlatform` in `@angular/platform-browser-dynamic
- Changes `initTestEnvironment` (which used to be `setBaseTestProviders`) to not take a compiler factory any more (see below for an example).
BREAKING CHANGE:
## Migration from `setBaseTestProviders` to `initTestEnvironment`:
- For the browser platform:
BEFORE:
```
import {setBaseTestProviders} from ‘@angular/core/testing’;
import {TEST_BROWSER_DYNAMIC_PLATFORM_PROVIDERS,
TEST_BROWSER_DYNAMIC_APPLICATION_PROVIDERS} from ‘@angular/platform-browser-dynamic/testing’;
setBaseTestProviders(TEST_BROWSER_DYNAMIC_PLATFORM_PROVIDERS,
TEST_BROWSER_DYNAMIC_APPLICATION_PROVIDERS);
```
AFTER:
```
import {initTestEnvironment} from ‘@angular/core/testing’;
import {browserDynamicTestPlatform,
BrowserDynamicTestModule} from ‘@angular/platform-browser-dynamic/testing’;
initTestEnvironment(
BrowserDynamicTestModule,
browserDynamicTestPlatform());
```
- For the server platform:
BEFORE:
```
import {setBaseTestProviders} from ‘@angular/core/testing’;
import {TEST_SERVER_PLATFORM_PROVIDERS,
TEST_SERVER_APPLICATION_PROVIDERS} from ‘@angular/platform-server/testing/server’;
setBaseTestProviders(TEST_SERVER_PLATFORM_PROVIDERS,
TEST_SERVER_APPLICATION_PROVIDERS);
```
AFTER:
```
import {initTestEnvironment} from ‘@angular/core/testing’;
import {serverTestPlatform,
ServerTestModule} from ‘@angular/platform-browser-dynamic/testing’;
initTestEnvironment(
ServerTestModule,
serverTestPlatform());
```
## Bootstrap changes
```
@AppModule({
modules: [BrowserModule],
precompile: [MainComponent],
providers: […], // additional providers
directives: […], // additional platform directives
pipes: […] // additional platform pipes
})
class MyModule {
constructor(appRef: ApplicationRef) {
appRef.bootstrap(MainComponent);
}
}
// offline compile
import {browserPlatform} from ‘@angular/platform-browser’;
import {bootstrapModuleFactory} from ‘@angular/core’;
bootstrapModuleFactory(MyModuleNgFactory, browserPlatform());
// runtime compile long form
import {browserDynamicPlatform} from ‘@angular/platform-browser-dynamic’;
import {bootstrapModule} from ‘@angular/core’;
bootstrapModule(MyModule, browserDynamicPlatform());
```
Closes #9922
Part of #9726
2016-07-08 13:47:17 -04:00
'Passing an instance of XHR to "bootstrap()" as provider is deprecated. Pass the provider via the new parameter "compilerOptions" of "bootstrap()" instead.'
2016-07-07 14:57:11 -04:00
] ) ;
async . done ( ) ;
} ) ;
feat(browser): use AppModules for bootstrap in the browser
This introduces the `BrowserModule` to be used for long form
bootstrap and offline compile bootstrap:
```
@AppModule({
modules: [BrowserModule],
precompile: [MainComponent],
providers: […], // additional providers
directives: […], // additional platform directives
pipes: […] // additional platform pipes
})
class MyModule {
constructor(appRef: ApplicationRef) {
appRef.bootstrap(MainComponent);
}
}
// offline compile
import {bootstrapModuleFactory} from ‘@angular/platform-browser’;
bootstrapModuleFactory(MyModuleNgFactory);
// runtime compile long form
import {bootstrapModule} from ‘@angular/platform-browser-dynamic’;
bootstrapModule(MyModule);
```
The short form, `bootstrap(...)`, can now creates a module on the fly,
given `directives`, `pipes, `providers`, `precompile` and `modules`
properties.
Related changes:
- make `SanitizationService`, `SecurityContext` public in `@angular/core` so that the offline compiler can resolve the token
- move `AnimationDriver` to `platform-browser` and make it
public so that the offline compiler can resolve the token
BREAKING CHANGES:
- short form bootstrap does no longer allow
to inject compiler internals (i.e. everything
from `@angular/compiler). Inject `Compiler` instead.
To provide custom providers for the compiler,
create a custom compiler via `browserCompiler({providers: [...]})`
and pass that into the `bootstrap` method.
2016-06-30 16:07:17 -04:00
} ) ) ;
// Note: This will soon be deprecated as bootstrap creates a separate injector for the compiler,
// i.e. such providers needs to go into that injecotr (when calling `browserCompiler`);
it ( 'should still allow to provide platform directives/pipes via the regular providers' ,
2016-07-07 14:57:11 -04:00
inject ( [ Console , AsyncTestCompleter ] , ( console : DummyConsole , async : AsyncTestCompleter ) = > {
feat(browser): use AppModules for bootstrap in the browser
This introduces the `BrowserModule` to be used for long form
bootstrap and offline compile bootstrap:
```
@AppModule({
modules: [BrowserModule],
precompile: [MainComponent],
providers: […], // additional providers
directives: […], // additional platform directives
pipes: […] // additional platform pipes
})
class MyModule {
constructor(appRef: ApplicationRef) {
appRef.bootstrap(MainComponent);
}
}
// offline compile
import {bootstrapModuleFactory} from ‘@angular/platform-browser’;
bootstrapModuleFactory(MyModuleNgFactory);
// runtime compile long form
import {bootstrapModule} from ‘@angular/platform-browser-dynamic’;
bootstrapModule(MyModule);
```
The short form, `bootstrap(...)`, can now creates a module on the fly,
given `directives`, `pipes, `providers`, `precompile` and `modules`
properties.
Related changes:
- make `SanitizationService`, `SecurityContext` public in `@angular/core` so that the offline compiler can resolve the token
- move `AnimationDriver` to `platform-browser` and make it
public so that the offline compiler can resolve the token
BREAKING CHANGES:
- short form bootstrap does no longer allow
to inject compiler internals (i.e. everything
from `@angular/compiler). Inject `Compiler` instead.
To provide custom providers for the compiler,
create a custom compiler via `browserCompiler({providers: [...]})`
and pass that into the `bootstrap` method.
2016-06-30 16:07:17 -04:00
bootstrap ( HelloCmpUsingPlatformDirectiveAndPipe , testProviders . concat ( [
2016-07-07 14:57:11 -04:00
{ provide : PLATFORM_DIRECTIVES , useValue : [ SomeDirective ] } ,
{ provide : PLATFORM_PIPES , useValue : [ SomePipe ] }
feat(browser): use AppModules for bootstrap in the browser
This introduces the `BrowserModule` to be used for long form
bootstrap and offline compile bootstrap:
```
@AppModule({
modules: [BrowserModule],
precompile: [MainComponent],
providers: […], // additional providers
directives: […], // additional platform directives
pipes: […] // additional platform pipes
})
class MyModule {
constructor(appRef: ApplicationRef) {
appRef.bootstrap(MainComponent);
}
}
// offline compile
import {bootstrapModuleFactory} from ‘@angular/platform-browser’;
bootstrapModuleFactory(MyModuleNgFactory);
// runtime compile long form
import {bootstrapModule} from ‘@angular/platform-browser-dynamic’;
bootstrapModule(MyModule);
```
The short form, `bootstrap(...)`, can now creates a module on the fly,
given `directives`, `pipes, `providers`, `precompile` and `modules`
properties.
Related changes:
- make `SanitizationService`, `SecurityContext` public in `@angular/core` so that the offline compiler can resolve the token
- move `AnimationDriver` to `platform-browser` and make it
public so that the offline compiler can resolve the token
BREAKING CHANGES:
- short form bootstrap does no longer allow
to inject compiler internals (i.e. everything
from `@angular/compiler). Inject `Compiler` instead.
To provide custom providers for the compiler,
create a custom compiler via `browserCompiler({providers: [...]})`
and pass that into the `bootstrap` method.
2016-06-30 16:07:17 -04:00
] ) ) . then ( ( compRef ) = > {
let compFixture = new ComponentFixture ( compRef , null , null ) ;
compFixture . detectChanges ( ) ;
2016-07-07 14:57:11 -04:00
expect ( compFixture . debugElement . children [ 0 ] . properties [ 'title' ] )
. toBe ( 'transformed someValue' ) ;
feat(browser): use AppModules for bootstrap in the browser
This introduces the `BrowserModule` to be used for long form
bootstrap and offline compile bootstrap:
```
@AppModule({
modules: [BrowserModule],
precompile: [MainComponent],
providers: […], // additional providers
directives: […], // additional platform directives
pipes: […] // additional platform pipes
})
class MyModule {
constructor(appRef: ApplicationRef) {
appRef.bootstrap(MainComponent);
}
}
// offline compile
import {bootstrapModuleFactory} from ‘@angular/platform-browser’;
bootstrapModuleFactory(MyModuleNgFactory);
// runtime compile long form
import {bootstrapModule} from ‘@angular/platform-browser-dynamic’;
bootstrapModule(MyModule);
```
The short form, `bootstrap(...)`, can now creates a module on the fly,
given `directives`, `pipes, `providers`, `precompile` and `modules`
properties.
Related changes:
- make `SanitizationService`, `SecurityContext` public in `@angular/core` so that the offline compiler can resolve the token
- move `AnimationDriver` to `platform-browser` and make it
public so that the offline compiler can resolve the token
BREAKING CHANGES:
- short form bootstrap does no longer allow
to inject compiler internals (i.e. everything
from `@angular/compiler). Inject `Compiler` instead.
To provide custom providers for the compiler,
create a custom compiler via `browserCompiler({providers: [...]})`
and pass that into the `bootstrap` method.
2016-06-30 16:07:17 -04:00
2016-07-07 14:57:11 -04:00
expect ( compilerConsole . warnings ) . toEqual ( [
'Passing PLATFORM_DIRECTIVES to "bootstrap()" as provider is deprecated. Use the new parameter "directives" of "bootstrap()" instead.' ,
2016-07-08 16:40:54 -04:00
'Passing PLATFORM_PIPES to "bootstrap()" as provider is deprecated. Use the new parameter "pipes" of "bootstrap()" instead.' ,
` Providing platform directives via the PLATFORM_DIRECTIVES provider or the "CompilerConfig" is deprecated. Provide platform directives via an @AppModule instead. Directives: ${ stringify ( SomeDirective ) } ` ,
` Providing platform pipes via the PLATFORM_PIPES provider or the "CompilerConfig" is deprecated. Provide platform pipes via an @AppModule instead. Pipes: ${ stringify ( SomePipe ) } `
2016-07-07 14:57:11 -04:00
] ) ;
feat(browser): use AppModules for bootstrap in the browser
This introduces the `BrowserModule` to be used for long form
bootstrap and offline compile bootstrap:
```
@AppModule({
modules: [BrowserModule],
precompile: [MainComponent],
providers: […], // additional providers
directives: […], // additional platform directives
pipes: […] // additional platform pipes
})
class MyModule {
constructor(appRef: ApplicationRef) {
appRef.bootstrap(MainComponent);
}
}
// offline compile
import {bootstrapModuleFactory} from ‘@angular/platform-browser’;
bootstrapModuleFactory(MyModuleNgFactory);
// runtime compile long form
import {bootstrapModule} from ‘@angular/platform-browser-dynamic’;
bootstrapModule(MyModule);
```
The short form, `bootstrap(...)`, can now creates a module on the fly,
given `directives`, `pipes, `providers`, `precompile` and `modules`
properties.
Related changes:
- make `SanitizationService`, `SecurityContext` public in `@angular/core` so that the offline compiler can resolve the token
- move `AnimationDriver` to `platform-browser` and make it
public so that the offline compiler can resolve the token
BREAKING CHANGES:
- short form bootstrap does no longer allow
to inject compiler internals (i.e. everything
from `@angular/compiler). Inject `Compiler` instead.
To provide custom providers for the compiler,
create a custom compiler via `browserCompiler({providers: [...]})`
and pass that into the `bootstrap` method.
2016-06-30 16:07:17 -04:00
async . done ( ) ;
} ) ;
} ) ) ;
2015-05-26 12:45:15 -04:00
} ) ;
}