From 23bed7d2bd6bc1b1cf03a62098805fbf98636390 Mon Sep 17 00:00:00 2001 From: Cassandra Choi Date: Tue, 21 May 2024 19:19:40 +0000 Subject: [PATCH] refactor(cdk/tree): move coerceObservable to cdk/coercion/private --- src/cdk/a11y/BUILD.bazel | 1 + src/cdk/a11y/key-manager/tree-key-manager.ts | 8 +--- src/cdk/coercion/private/BUILD.bazel | 45 +++++++++++++++++++ src/cdk/coercion/private/index.ts | 9 ++++ src/cdk/coercion/private/observable.spec.ts | 24 ++++++++++ src/cdk/coercion/private/observable.ts | 19 ++++++++ src/cdk/config.bzl | 1 + src/cdk/tree/BUILD.bazel | 1 + src/cdk/tree/tree.ts | 8 +--- .../cdk-tree-custom-key-manager-example.ts | 10 +---- 10 files changed, 104 insertions(+), 22 deletions(-) create mode 100644 src/cdk/coercion/private/BUILD.bazel create mode 100644 src/cdk/coercion/private/index.ts create mode 100644 src/cdk/coercion/private/observable.spec.ts create mode 100644 src/cdk/coercion/private/observable.ts diff --git a/src/cdk/a11y/BUILD.bazel b/src/cdk/a11y/BUILD.bazel index 81148f1486d2..710ea578423d 100644 --- a/src/cdk/a11y/BUILD.bazel +++ b/src/cdk/a11y/BUILD.bazel @@ -19,6 +19,7 @@ ng_module( deps = [ "//src:dev_mode_types", "//src/cdk/coercion", + "//src/cdk/coercion/private", "//src/cdk/keycodes", "//src/cdk/layout", "//src/cdk/observers", diff --git a/src/cdk/a11y/key-manager/tree-key-manager.ts b/src/cdk/a11y/key-manager/tree-key-manager.ts index 817f19646b3b..d880181293c3 100644 --- a/src/cdk/a11y/key-manager/tree-key-manager.ts +++ b/src/cdk/a11y/key-manager/tree-key-manager.ts @@ -7,6 +7,7 @@ */ import {InjectionToken, QueryList} from '@angular/core'; +import {coerceObservable} from '@angular/cdk/coercion/private'; import {Observable, Subject, Subscription, isObservable, of as observableOf} from 'rxjs'; import {take} from 'rxjs/operators'; import { @@ -17,13 +18,6 @@ import { } from './tree-key-manager-strategy'; import {Typeahead} from './typeahead'; -function coerceObservable(data: T | Observable): Observable { - if (!isObservable(data)) { - return observableOf(data); - } - return data; -} - /** * This class manages keyboard events for trees. If you pass it a QueryList or other list of tree * items, it will set the active item, focus, handle expansion and typeahead correctly when diff --git a/src/cdk/coercion/private/BUILD.bazel b/src/cdk/coercion/private/BUILD.bazel new file mode 100644 index 000000000000..a488f49f66a3 --- /dev/null +++ b/src/cdk/coercion/private/BUILD.bazel @@ -0,0 +1,45 @@ +load( + "//tools:defaults.bzl", + "ng_module", + "ng_test_library", + "ng_web_test_suite", +) + +package(default_visibility = ["//visibility:public"]) + +ng_module( + name = "private", + srcs = glob( + ["**/*.ts"], + exclude = ["**/*.spec.ts"], + ), + deps = [ + "//src:dev_mode_types", + "@npm//@angular/core", + "@npm//rxjs", + ], +) + +ng_test_library( + name = "private_tests_lib", + srcs = glob( + ["**/*.spec.ts"], + exclude = ["**/*.e2e.spec.ts"], + ), + deps = [ + ":private", + "@npm//rxjs", + ], +) + +ng_web_test_suite( + name = "unit_tests", + deps = [ + ":private_tests_lib", + ], +) + +filegroup( + name = "source-files", + srcs = glob(["**/*.ts"]), +) diff --git a/src/cdk/coercion/private/index.ts b/src/cdk/coercion/private/index.ts new file mode 100644 index 000000000000..f6b637b3d215 --- /dev/null +++ b/src/cdk/coercion/private/index.ts @@ -0,0 +1,9 @@ +/** + * @license + * Copyright Google LLC 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 + */ + +export * from './observable'; diff --git a/src/cdk/coercion/private/observable.spec.ts b/src/cdk/coercion/private/observable.spec.ts new file mode 100644 index 000000000000..214a35a711bb --- /dev/null +++ b/src/cdk/coercion/private/observable.spec.ts @@ -0,0 +1,24 @@ +import {Observable, ReplaySubject} from 'rxjs'; +import {coerceObservable} from './observable'; +import {fakeAsync} from '@angular/core/testing'; + +describe('coerceObservable', () => { + it('should return the Observable, if an Observable is passed in', () => { + const observable = new Observable(); + expect(coerceObservable(observable)).toBe(observable); + }); + + it('should return subclasses of Observables', () => { + const observable = new ReplaySubject(1); + expect(coerceObservable(observable)).toBe(observable); + }); + + it('should wrap non-Observables in Observables', fakeAsync(() => { + const observable = coerceObservable(3); + let emittedValue = 0; + observable.subscribe(value => { + emittedValue = value; + }); + expect(emittedValue).toBe(3); + })); +}); diff --git a/src/cdk/coercion/private/observable.ts b/src/cdk/coercion/private/observable.ts new file mode 100644 index 000000000000..528c4f7fc497 --- /dev/null +++ b/src/cdk/coercion/private/observable.ts @@ -0,0 +1,19 @@ +/** + * @license + * Copyright Google LLC 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 + */ +import {Observable, isObservable, of as observableOf} from 'rxjs'; + +/** + * Given either an Observable or non-Observable value, returns either the original + * Observable, or wraps it in an Observable that emits the non-Observable value. + */ +export function coerceObservable(data: T | Observable): Observable { + if (!isObservable(data)) { + return observableOf(data); + } + return data; +} diff --git a/src/cdk/config.bzl b/src/cdk/config.bzl index 956010dfe44d..72c7a68bf286 100644 --- a/src/cdk/config.bzl +++ b/src/cdk/config.bzl @@ -5,6 +5,7 @@ CDK_ENTRYPOINTS = [ "bidi", "clipboard", "coercion", + "coercion/private", "collections", "dialog", "drag-drop", diff --git a/src/cdk/tree/BUILD.bazel b/src/cdk/tree/BUILD.bazel index 1e28a24e66fb..4434c52a254b 100644 --- a/src/cdk/tree/BUILD.bazel +++ b/src/cdk/tree/BUILD.bazel @@ -18,6 +18,7 @@ ng_module( "//src:dev_mode_types", "//src/cdk/a11y", "//src/cdk/bidi", + "//src/cdk/coercion/private", "//src/cdk/collections", "//src/cdk/keycodes", "@npm//@angular/core", diff --git a/src/cdk/tree/tree.ts b/src/cdk/tree/tree.ts index 5e7381be8203..ab8ac4401ce5 100644 --- a/src/cdk/tree/tree.ts +++ b/src/cdk/tree/tree.ts @@ -47,6 +47,7 @@ import { inject, booleanAttribute, } from '@angular/core'; +import {coerceObservable} from '@angular/cdk/coercion/private'; import { BehaviorSubject, combineLatest, @@ -70,13 +71,6 @@ import { getTreeNoValidDataSourceError, } from './tree-errors'; -function coerceObservable(data: T | Observable): Observable { - if (!isObservable(data)) { - return observableOf(data); - } - return data; -} - type RenderingData = | { flattenedNodes: null; diff --git a/src/components-examples/cdk/tree/cdk-tree-custom-key-manager/cdk-tree-custom-key-manager-example.ts b/src/components-examples/cdk/tree/cdk-tree-custom-key-manager/cdk-tree-custom-key-manager-example.ts index ae33cef02076..91f7a37e2600 100644 --- a/src/components-examples/cdk/tree/cdk-tree-custom-key-manager/cdk-tree-custom-key-manager-example.ts +++ b/src/components-examples/cdk/tree/cdk-tree-custom-key-manager/cdk-tree-custom-key-manager-example.ts @@ -1,5 +1,6 @@ import {ChangeDetectionStrategy, Component, QueryList} from '@angular/core'; import {ArrayDataSource} from '@angular/cdk/collections'; +import {coerceObservable} from '@angular/cdk/coercion/private'; import {FlatTreeControl, CdkTreeModule} from '@angular/cdk/tree'; import {MatIconModule} from '@angular/material/icon'; import {MatButtonModule} from '@angular/material/button'; @@ -24,7 +25,7 @@ import { TAB, UP_ARROW, } from '@angular/cdk/keycodes'; -import {of as observableOf, Subject, isObservable, Observable} from 'rxjs'; +import {Subject, isObservable, Observable} from 'rxjs'; import {take} from 'rxjs/operators'; const TREE_DATA: ExampleFlatNode[] = [ @@ -93,13 +94,6 @@ interface ExampleFlatNode { isExpanded?: boolean; } -function coerceObservable(data: T | Observable): Observable { - if (!isObservable(data)) { - return observableOf(data); - } - return data; -} - /** * This class manages keyboard events for trees. If you pass it a QueryList or other list of tree * items, it will set the active item, focus, handle expansion and typeahead correctly when