From 92c547830af56005b85bc2fd22d17840ed87e69b Mon Sep 17 00:00:00 2001 From: Christopher Dahm Date: Fri, 14 Dec 2018 12:19:26 -0500 Subject: [PATCH] refactor: use isObservable provided by rxjs 6.1+ (#27668) Refactor common, core, forms, router to use the isObservable method from rxjs 6.1+. Remove the isObservable method from core. PR Close #27668 --- .../side-effects/snapshots/common/esm2015.js | 2 ++ .../side-effects/snapshots/common/esm5.js | 2 ++ packages/common/src/pipes/async_pipe.ts | 6 +++--- packages/core/src/core_private_export.ts | 2 +- .../core/src/render3/instructions/listener.ts | 3 +-- packages/core/src/util/BUILD.bazel | 1 - packages/core/src/util/lang.ts | 11 ---------- packages/core/src/view/provider.ts | 2 +- packages/core/test/util/lang_spec.ts | 21 +------------------ packages/core/test/view/BUILD.bazel | 1 + packages/core/test/view/provider_spec.ts | 13 ++++++------ packages/forms/src/validators.ts | 4 ++-- packages/router/src/utils/collection.ts | 4 ++-- 13 files changed, 22 insertions(+), 50 deletions(-) diff --git a/integration/side-effects/snapshots/common/esm2015.js b/integration/side-effects/snapshots/common/esm2015.js index 595d8ae0af..05c0877c59 100644 --- a/integration/side-effects/snapshots/common/esm2015.js +++ b/integration/side-effects/snapshots/common/esm2015.js @@ -1 +1,3 @@ import "@angular/core"; + +import "rxjs"; diff --git a/integration/side-effects/snapshots/common/esm5.js b/integration/side-effects/snapshots/common/esm5.js index 05d504f1d4..e7e3a29ff8 100644 --- a/integration/side-effects/snapshots/common/esm5.js +++ b/integration/side-effects/snapshots/common/esm5.js @@ -1,3 +1,5 @@ import "tslib"; import "@angular/core"; + +import "rxjs"; diff --git a/packages/common/src/pipes/async_pipe.ts b/packages/common/src/pipes/async_pipe.ts index 40d565d2f1..45337cbc73 100644 --- a/packages/common/src/pipes/async_pipe.ts +++ b/packages/common/src/pipes/async_pipe.ts @@ -6,8 +6,8 @@ * found in the LICENSE file at https://angular.io/license */ -import {ChangeDetectorRef, EventEmitter, OnDestroy, Pipe, PipeTransform, WrappedValue, ɵisObservable, ɵisPromise, ɵlooseIdentical} from '@angular/core'; -import {Observable, SubscriptionLike} from 'rxjs'; +import {ChangeDetectorRef, EventEmitter, OnDestroy, Pipe, PipeTransform, WrappedValue, ɵisPromise, ɵlooseIdentical} from '@angular/core'; +import {Observable, SubscriptionLike, isObservable} from 'rxjs'; import {invalidPipeArgumentError} from './invalid_pipe_argument_error'; interface SubscriptionStrategy { @@ -122,7 +122,7 @@ export class AsyncPipe implements OnDestroy, PipeTransform { return _promiseStrategy; } - if (ɵisObservable(obj)) { + if (isObservable(obj)) { return _observableStrategy; } diff --git a/packages/core/src/core_private_export.ts b/packages/core/src/core_private_export.ts index fab88f1b34..99807e1a7c 100644 --- a/packages/core/src/core_private_export.ts +++ b/packages/core/src/core_private_export.ts @@ -30,7 +30,7 @@ export {global as ɵglobal} from './util/global'; export {looseIdentical as ɵlooseIdentical,} from './util/comparison'; export {stringify as ɵstringify} from './util/stringify'; export {makeDecorator as ɵmakeDecorator} from './util/decorators'; -export {isObservable as ɵisObservable, isPromise as ɵisPromise} from './util/lang'; +export {isPromise as ɵisPromise} from './util/lang'; export {clearOverrides as ɵclearOverrides, initServicesIfNeeded as ɵinitServicesIfNeeded, overrideComponentView as ɵoverrideComponentView, overrideProvider as ɵoverrideProvider} from './view/index'; export {NOT_FOUND_CHECK_ONLY_ELEMENT_INJECTOR as ɵNOT_FOUND_CHECK_ONLY_ELEMENT_INJECTOR} from './view/provider'; export {LocaleDataIndex as ɵLocaleDataIndex, CurrencyIndex as ɵCurrencyIndex, ExtraLocaleDataIndex as ɵExtraLocaleDataIndex, getLocalePluralCase as ɵgetLocalePluralCase, findLocaleData as ɵfindLocaleData, registerLocaleData as ɵregisterLocaleData, unregisterAllLocaleData as ɵunregisterLocaleData} from './i18n/locale_data_api'; diff --git a/packages/core/src/render3/instructions/listener.ts b/packages/core/src/render3/instructions/listener.ts index 37057efc1f..19468bc98a 100644 --- a/packages/core/src/render3/instructions/listener.ts +++ b/packages/core/src/render3/instructions/listener.ts @@ -6,9 +6,8 @@ * found in the LICENSE file at https://angular.io/license */ - +import {isObservable} from 'rxjs'; import {assertDataInRange} from '../../util/assert'; -import {isObservable} from '../../util/lang'; import {EMPTY_OBJ} from '../empty'; import {PropertyAliasValue, TNode, TNodeFlags, TNodeType} from '../interfaces/node'; import {GlobalTargetResolver, RElement, Renderer3, isProceduralRenderer} from '../interfaces/renderer'; diff --git a/packages/core/src/util/BUILD.bazel b/packages/core/src/util/BUILD.bazel index 3ea2b343c1..0862fc5a20 100644 --- a/packages/core/src/util/BUILD.bazel +++ b/packages/core/src/util/BUILD.bazel @@ -15,6 +15,5 @@ ts_library( deps = [ "//packages:types", "//packages/core/src/interface", - "@npm//rxjs", ], ) diff --git a/packages/core/src/util/lang.ts b/packages/core/src/util/lang.ts index b6631e84d0..6cf4316a83 100644 --- a/packages/core/src/util/lang.ts +++ b/packages/core/src/util/lang.ts @@ -6,8 +6,6 @@ * found in the LICENSE file at https://angular.io/license */ -import {Observable} from 'rxjs'; - /** * Determine if the argument is shaped like a Promise */ @@ -16,12 +14,3 @@ export function isPromise(obj: any): obj is Promise { // It's up to the caller to ensure that obj.then conforms to the spec return !!obj && typeof obj.then === 'function'; } - -/** - * Determine if the argument is an Observable - */ -export function isObservable(obj: any | Observable): obj is Observable { - // TODO: use isObservable once we update pass rxjs 6.1 - // https://github.com/ReactiveX/rxjs/blob/master/CHANGELOG.md#610-2018-05-03 - return !!obj && typeof obj.subscribe === 'function'; -} diff --git a/packages/core/src/view/provider.ts b/packages/core/src/view/provider.ts index f8421a03bc..2c10555612 100644 --- a/packages/core/src/view/provider.ts +++ b/packages/core/src/view/provider.ts @@ -6,13 +6,13 @@ * found in the LICENSE file at https://angular.io/license */ +import {isObservable} from 'rxjs'; import {ChangeDetectorRef, SimpleChange, SimpleChanges, WrappedValue} from '../change_detection/change_detection'; import {INJECTOR, Injector, resolveForwardRef} from '../di'; import {ElementRef} from '../linker/element_ref'; import {TemplateRef} from '../linker/template_ref'; import {ViewContainerRef} from '../linker/view_container_ref'; import {Renderer2} from '../render/api'; -import {isObservable} from '../util/lang'; import {stringify} from '../util/stringify'; import {createChangeDetectorRef, createInjector} from './refs'; diff --git a/packages/core/test/util/lang_spec.ts b/packages/core/test/util/lang_spec.ts index 73086b09cf..19aade5c38 100644 --- a/packages/core/test/util/lang_spec.ts +++ b/packages/core/test/util/lang_spec.ts @@ -5,8 +5,7 @@ * 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 {isObservable, isPromise} from '@angular/core/src/util/lang'; -import {of } from 'rxjs'; +import {isPromise} from '@angular/core/src/util/lang'; { describe('isPromise', () => { @@ -26,22 +25,4 @@ import {of } from 'rxjs'; expect(isPromise(null)).toEqual(false); }); }); - - describe('isObservable', () => { - it('should be true for an Observable', () => expect(isObservable(of (true))).toEqual(true)); - - it('should be true if the argument is the object with subscribe function', - () => expect(isObservable({subscribe: () => {}})).toEqual(true)); - - it('should be false if the argument is undefined', - () => expect(isObservable(undefined)).toEqual(false)); - - it('should be false if the argument is null', () => expect(isObservable(null)).toEqual(false)); - - it('should be false if the argument is an object', - () => expect(isObservable({})).toEqual(false)); - - it('should be false if the argument is a function', - () => expect(isObservable(() => {})).toEqual(false)); - }); } diff --git a/packages/core/test/view/BUILD.bazel b/packages/core/test/view/BUILD.bazel index 481f1bcdf1..ca16bb9be6 100644 --- a/packages/core/test/view/BUILD.bazel +++ b/packages/core/test/view/BUILD.bazel @@ -17,6 +17,7 @@ ts_library( "//packages/core/testing", "//packages/platform-browser", "//packages/private/testing", + "@npm//rxjs", ], ) diff --git a/packages/core/test/view/provider_spec.ts b/packages/core/test/view/provider_spec.ts index cab5b26bc8..9a61e4051e 100644 --- a/packages/core/test/view/provider_spec.ts +++ b/packages/core/test/view/provider_spec.ts @@ -6,6 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ +import {Observable} from 'rxjs'; import {AfterContentChecked, AfterContentInit, AfterViewChecked, AfterViewInit, ChangeDetectorRef, DoCheck, ElementRef, ErrorHandler, EventEmitter, Injector, OnChanges, OnDestroy, OnInit, Renderer2, SimpleChange, TemplateRef, ViewContainerRef,} from '@angular/core'; import {getDebugContext} from '@angular/core/src/errors'; import {ArgumentType, DepFlags, NodeFlags, Services, anchorDef, asElementData, directiveDef, elementDef, providerDef, textDef} from '@angular/core/src/view/index'; @@ -341,13 +342,11 @@ import {ARG_TYPE_VALUES, checkNodeInlineOrDynamic, createRootView, createAndGetR let unsubscribeSpy: any; class SomeService { - emitter = { - subscribe: (callback: any) => { - const subscription = emitter.subscribe(callback); - unsubscribeSpy = spyOn(subscription, 'unsubscribe').and.callThrough(); - return subscription; - } - }; + emitter = new Observable((callback: any) => { + const subscription = emitter.subscribe(callback); + unsubscribeSpy = spyOn(subscription, 'unsubscribe').and.callThrough(); + return subscription; + }); } const handleEvent = jasmine.createSpy('handleEvent'); diff --git a/packages/forms/src/validators.ts b/packages/forms/src/validators.ts index 116d306e86..0806954b61 100644 --- a/packages/forms/src/validators.ts +++ b/packages/forms/src/validators.ts @@ -6,8 +6,8 @@ * found in the LICENSE file at https://angular.io/license */ -import {InjectionToken, ɵisObservable as isObservable, ɵisPromise as isPromise} from '@angular/core'; -import {Observable, forkJoin, from} from 'rxjs'; +import {InjectionToken, ɵisPromise as isPromise} from '@angular/core'; +import {Observable, forkJoin, from, isObservable} from 'rxjs'; import {map} from 'rxjs/operators'; import {AsyncValidatorFn, ValidationErrors, Validator, ValidatorFn} from './directives/validators'; import {AbstractControl, FormControl} from './model'; diff --git a/packages/router/src/utils/collection.ts b/packages/router/src/utils/collection.ts index 74fbc81420..95af5c1390 100644 --- a/packages/router/src/utils/collection.ts +++ b/packages/router/src/utils/collection.ts @@ -6,8 +6,8 @@ * found in the LICENSE file at https://angular.io/license */ -import {NgModuleFactory, ɵisObservable as isObservable, ɵisPromise as isPromise} from '@angular/core'; -import {Observable, from, of } from 'rxjs'; +import {NgModuleFactory, ɵisPromise as isPromise} from '@angular/core'; +import {Observable, from, isObservable, of } from 'rxjs'; import {concatAll, last as lastValue, map} from 'rxjs/operators'; import {PRIMARY_OUTLET, Params} from '../shared';