From 07606e3181fc7aa9f9185eb771fc9c44f01fe344 Mon Sep 17 00:00:00 2001 From: Andrew Kushnir Date: Wed, 20 Jul 2022 12:04:58 -0700 Subject: [PATCH] feat(platform-browser): add `isEmpty` method to the `TransferState` class (#46915) This commit adds the `isEmpty` method to the `TransferState` class to make it possible to check whether the state is empty or not. This is helpful in situations when the `TransferState` should be serialized and the content is transferred to the client (if the state is empty - certain operations can be omitted). PR Close #46915 --- goldens/public-api/platform-browser/index.md | 1 + .../platform-server/src/transferstate/app.ts | 1 - .../platform-browser/src/browser/transfer_state.ts | 7 +++++++ .../test/browser/transfer_state_spec.ts | 14 +++++++++++++- packages/platform-server/src/transfer_state.ts | 4 +--- 5 files changed, 22 insertions(+), 5 deletions(-) diff --git a/goldens/public-api/platform-browser/index.md b/goldens/public-api/platform-browser/index.md index cd51458aa2e14..898f22c2d5e98 100644 --- a/goldens/public-api/platform-browser/index.md +++ b/goldens/public-api/platform-browser/index.md @@ -228,6 +228,7 @@ export class Title { export class TransferState { get(key: StateKey, defaultValue: T): T; hasKey(key: StateKey): boolean; + get isEmpty(): boolean; onSerialize(key: StateKey, callback: () => T): void; remove(key: StateKey): void; set(key: StateKey, value: T): void; diff --git a/integration/platform-server/src/transferstate/app.ts b/integration/platform-server/src/transferstate/app.ts index b435c237631d0..07eeba5119ab2 100644 --- a/integration/platform-server/src/transferstate/app.ts +++ b/integration/platform-server/src/transferstate/app.ts @@ -16,7 +16,6 @@ import {TransferStateComponent} from './transfer-state.component'; bootstrap: [TransferStateComponent], imports: [ BrowserModule.withServerTransition({appId: 'ts'}), - BrowserTransferStateModule, ], }) export class TransferStateModule { diff --git a/packages/platform-browser/src/browser/transfer_state.ts b/packages/platform-browser/src/browser/transfer_state.ts index 80fce876d6263..8993278846049 100644 --- a/packages/platform-browser/src/browser/transfer_state.ts +++ b/packages/platform-browser/src/browser/transfer_state.ts @@ -125,6 +125,13 @@ export class TransferState { return this.store.hasOwnProperty(key); } + /** + * Indicates whether the state is empty. + */ + get isEmpty(): boolean { + return Object.keys(this.store).length === 0; + } + /** * Register a callback to provide the value for a key when `toJson` is called. */ diff --git a/packages/platform-browser/test/browser/transfer_state_spec.ts b/packages/platform-browser/test/browser/transfer_state_spec.ts index 72445d12f9556..d5a84ee32d115 100644 --- a/packages/platform-browser/test/browser/transfer_state_spec.ts +++ b/packages/platform-browser/test/browser/transfer_state_spec.ts @@ -44,7 +44,6 @@ describe('TransferState', () => { TestBed.configureTestingModule({ imports: [ BrowserModule.withServerTransition({appId: APP_ID}), - BrowserTransferStateModule, ] }); doc = TestBed.inject(DOCUMENT); @@ -117,6 +116,19 @@ describe('TransferState', () => { expect(transferState.toJson()).toBe('{"test":20,"delayed":"changed"}'); }); + + it('should provide an ability to detect whether the state is empty', () => { + const transferState = TestBed.inject(TransferState); + + // The state is empty initially. + expect(transferState.isEmpty).toBeTrue(); + + transferState.set(TEST_KEY, 20); + expect(transferState.isEmpty).toBeFalse(); + + transferState.remove(TEST_KEY); + expect(transferState.isEmpty).toBeTrue(); + }); }); describe('escape/unescape', () => { diff --git a/packages/platform-server/src/transfer_state.ts b/packages/platform-server/src/transfer_state.ts index 1f959314679c2..26e8b3fed67a2 100644 --- a/packages/platform-server/src/transfer_state.ts +++ b/packages/platform-server/src/transfer_state.ts @@ -21,9 +21,7 @@ export const TRANSFER_STATE_SERIALIZATION_PROVIDERS: Provider[] = [{ function serializeTransferStateFactory(doc: Document, appId: string, transferStore: TransferState) { return () => { - const store = (transferStore as unknown as {store: {}}).store; - const isStateEmpty = Object.keys(store).length === 0; - if (isStateEmpty) { + if (transferStore.isEmpty) { // The state is empty, nothing to transfer, // avoid creating an extra `