From e927aeae865fcafe6bbbe4a61b8643e99b42c75a Mon Sep 17 00:00:00 2001 From: Tobias Bosch Date: Fri, 14 Apr 2017 11:25:56 -0700 Subject: [PATCH] feat(upgrade): allow setting the angularjs lib at runtime (#15168) Readds 8ad464d90e735ab3f59bdb95191ef9110e63ac84. --- packages/upgrade/src/common/angular1.ts | 66 ++++++++++++++----- packages/upgrade/static/public_api.ts | 1 + .../test/static/integration/injection_spec.ts | 30 ++++++++- tools/public_api_guard/upgrade/static.d.ts | 6 ++ 4 files changed, 87 insertions(+), 16 deletions(-) diff --git a/packages/upgrade/src/common/angular1.ts b/packages/upgrade/src/common/angular1.ts index 267e8dbac8..20b93c1cd9 100644 --- a/packages/upgrade/src/common/angular1.ts +++ b/packages/upgrade/src/common/angular1.ts @@ -201,6 +201,7 @@ function noNg() { throw new Error('AngularJS v1.x is not loaded!'); } + let angular: { bootstrap: (e: Element, modules: (string | IInjectable)[], config: IAngularBootstrapConfig) => void, @@ -208,27 +209,62 @@ let angular: { element: (e: Element | string) => IAugmentedJQuery, version: {major: number}, resumeBootstrap?: () => void, getTestability: (e: Element) => ITestabilityService -} = { - bootstrap: noNg, - module: noNg, - element: noNg, - version: noNg, - resumeBootstrap: noNg, - getTestability: noNg }; - try { if (window.hasOwnProperty('angular')) { - angular = (window).angular; + setAngularLib((window).angular); } } catch (e) { - // ignore in CJS mode. + setAngularLib({ + bootstrap: noNg, + module: noNg, + element: noNg, + version: noNg, + resumeBootstrap: noNg, + getTestability: noNg + }); +} + +/** + * Resets the AngularJS library. + * + * Used when angularjs is loaded lazily, and not available on `window`. + * + * @stable + */ +export function setAngularLib(ng: any): void { + angular = ng; +} + +/** + * Returns the current version of the AngularJS library. + * + * @stable + */ +export function getAngularLib(): any { + return angular; +} + +export function bootstrap( + e: Element, modules: (string | IInjectable)[], config: IAngularBootstrapConfig): void { + angular.bootstrap(e, modules, config); +} + +export function module(prefix: string, dependencies?: string[]): IModule { + return angular.module(prefix, dependencies); +} + +export function element(e: Element | string): IAugmentedJQuery { + return angular.element(e); +} + +export function resumeBootstrap(): void { + angular.resumeBootstrap(); +} + +export function getTestability(e: Element): ITestabilityService { + return angular.getTestability(e); } -export const bootstrap = angular.bootstrap; -export const module = angular.module; -export const element = angular.element; export const version = angular.version; -export const resumeBootstrap = angular.resumeBootstrap; -export const getTestability = angular.getTestability; diff --git a/packages/upgrade/static/public_api.ts b/packages/upgrade/static/public_api.ts index 57b16cedc6..9d28d1c554 100644 --- a/packages/upgrade/static/public_api.ts +++ b/packages/upgrade/static/public_api.ts @@ -12,6 +12,7 @@ * Entry point for all public APIs of the upgrade/static package, allowing * Angular 1 and Angular 2+ to run side by side in the same application. */ +export {getAngularLib, setAngularLib} from './src/common/angular1'; export {downgradeComponent} from './src/common/downgrade_component'; export {downgradeInjectable} from './src/common/downgrade_injectable'; export {VERSION} from './src/common/version'; diff --git a/packages/upgrade/test/static/integration/injection_spec.ts b/packages/upgrade/test/static/integration/injection_spec.ts index 93b3e3c3a2..8ee142c2f4 100644 --- a/packages/upgrade/test/static/integration/injection_spec.ts +++ b/packages/upgrade/test/static/integration/injection_spec.ts @@ -12,7 +12,7 @@ import {BrowserModule} from '@angular/platform-browser'; import {platformBrowserDynamic} from '@angular/platform-browser-dynamic'; import * as angular from '@angular/upgrade/src/common/angular1'; import {$INJECTOR, INJECTOR_KEY} from '@angular/upgrade/src/common/constants'; -import {UpgradeModule, downgradeInjectable} from '@angular/upgrade/static'; +import {UpgradeModule, downgradeInjectable, getAngularLib, setAngularLib} from '@angular/upgrade/static'; import {bootstrap, html} from '../test_helpers'; @@ -99,5 +99,33 @@ export function main() { expect(runBlockTriggered).toBeTruthy(); }); })); + + it('should allow resetting angular at runtime', async(() => { + let wrappedBootstrapepedCalled = false; + + const n: any = getAngularLib(); + + setAngularLib({ + bootstrap: (...args: any[]) => { + wrappedBootstrapepedCalled = true; + n.bootstrap(...args); + }, + module: n.module, + element: n.element, + version: n.version, + resumeBootstrap: n.resumeBootstrap, + getTestability: n.getTestability + }); + + @NgModule({imports: [BrowserModule, UpgradeModule]}) + class Ng2Module { + ngDoBootstrap() {} + } + + const ng1Module = angular.module('ng1Module', []); + + bootstrap(platformBrowserDynamic(), Ng2Module, html('
'), ng1Module) + .then((upgrade) => { expect(wrappedBootstrapepedCalled).toEqual(true); }); + })); }); } diff --git a/tools/public_api_guard/upgrade/static.d.ts b/tools/public_api_guard/upgrade/static.d.ts index 40cee4c38d..2eedf38587 100644 --- a/tools/public_api_guard/upgrade/static.d.ts +++ b/tools/public_api_guard/upgrade/static.d.ts @@ -9,6 +9,12 @@ export declare function downgradeComponent(info: { /** @experimental */ export declare function downgradeInjectable(token: any): Function; +/** @stable */ +export declare function getAngularLib(): any; + +/** @stable */ +export declare function setAngularLib(ng: any): void; + /** @experimental */ export declare class UpgradeComponent implements OnInit, OnChanges, DoCheck, OnDestroy { constructor(name: string, elementRef: ElementRef, injector: Injector);