///
import { OpaqueToken } from '../core/di';
import { ProviderLiteral } from '../core/di/provider_util';
import { Type } from '../facade/type';
/**
* `UpgradeAdapterRef` controls a hybrid AngularJS v1 / Angular v2 application,
* but we don't have a use for it right now so no point in creating an interface for it...
*/
export declare type UpgradeAdapterRef = void;
export interface UpgradeAdapterInstance {
/**
* Allows Angular v2 Component to be used from AngularJS v1.
*/
downgradeNg2Component(type: Type): Function;
/**
* Bootstrap a hybrid AngularJS v1 / Angular v2 application.
*/
bootstrap(element: Element, modules?: any[], config?: ng.IAngularBootstrapConfig): UpgradeAdapterRef;
/**
* Allows Angular v2 service to be accessible from AngularJS v1.
*/
downgradeNg2Provider(token: any): Function;
/**
* Allows AngularJS v1 service to be accessible from Angular v2.
*/
upgradeNg1Provider(name: string, options?: {
asToken: any;
}): void;
}
export interface UpgradeAdapter {
new (ng2AppModule: Type): UpgradeAdapterInstance;
}
export declare class NgMetadataUpgradeAdapter {
_upgradeAdapter: UpgradeAdapterInstance;
bootstrap: Function;
/**
* Store a reference to the instantiated upgradeAdapter
*/
constructor(_upgradeAdapter: UpgradeAdapterInstance);
/**
* Used to register an Angular 2 component as a directive on an Angular 1 module,
* where the directive name is automatically created from the selector.
*
* E.g. `.directive(...upgradeAdapter.downgradeNg2Component(Ng2Component))
*/
downgradeNg2Component(component: Type): [string, Function];
/**
* Used to register an Angular 2 component by including it in the directives array
* of an ng-metadata annotated Angular 1 component.
*
* E.g.
* ```
* @Component({
* selector: 'foo',
* directives: [upgradeAdapter.provideNg2Component(Ng2Component)],
* })
* ```
*/
provideNg2Component(component: Type): Function;
/**
* Downgrades an Angular 2 Provider so that it can be registered as an Angular 1
* factory. Either a string or an ng-metadata OpaqueToken can be used for the name.
*
* E.g.
* ```
* const otherServiceToken = new OpaqueToken('otherService')
*
* .factory(...upgradeAdapter.downgradeNg2Provider('ng2Service', { useClass: Ng2Service }))
* .factory(...upgradeAdapter.downgradeNg2Provider(otherServiceToken, { useClass: Ng2Service }))
* ```
*/
downgradeNg2Provider(name: string | OpaqueToken, options: {
useClass: Type;
}): [string, Function];
/**
* Returns a ProviderLiteral which can be used to register an Angular 2 Provider
* by including it in the providers array of an ng-metadata annotated Angular 1
* component. Either a string or an ng-metadata OpaqueToken can be used for the name.
*
* E.g.
* ```
* const otherServiceToken = new OpaqueToken('otherService')
*
* @Component({
* selector: 'foo',
* providers: [
* upgradeAdapter.provideNg2Provider('ng2Service', { useClass: Ng2Service })
* upgradeAdapter.provideNg2Provider(otherServiceToken, { useClass: Ng2Service })
* ],
* })
* ```
*/
provideNg2Provider(name: string | OpaqueToken, options: {
useClass: Type;
}): ProviderLiteral;
/**
* Used to make an Angular 1 Provider available to Angular 2 Components and Providers.
* When using the upgraded Provider for DI, either the string name can be used with @Inject, or
* a given token can be injected by type.
*
* @example
* ```typescript
* import {Injectable, NgModule} from 'ng-metadata/core';
* import * as angular from 'angular';
*
* class MyCoolService {}
*
* angular.module('myApp',[])
* .service('myCoolSvc',MyCoolService)
*
* @Injectable()
* class MyService{}
*
* @NgModule({
* providers: [MyService]
* })
* class AppModule{}
*
* // upgrade.module.ts
* upgradeAdapter.upgradeNg1Provider(MyService)
* upgradeAdapter.upgradeNg1Provider('myCoolSvc', { asToken: MyCoolService })
* // angular 1 core services
* upgradeAdapter.upgradeNg1Provider('$routeParams')
*
* // angular 2 Component
* import { Component } from '@angular/core';
*
* @Component({
* selector: 'ng2',
* template: `
Ng2
`,
* })
* class Ng2Component {
* constructor(
* @Inject('$routeParams') private $routeParams: any, // by name using @Inject
* private myCoolSvc: MyCoolService // by type using the user defined token
* private mySvc: MyService // by type using ngMetadata @Injectable service class
* ) {}
* }
*```
*/
upgradeNg1Provider(name: string | OpaqueToken | Type, options?: {
asToken: string | OpaqueToken | Type | Function;
}): void;
}