@ngrx/component-store
Version:
Reactive store for component state
1 lines • 31.7 kB
Source Map (JSON)
{"version":3,"file":"ngrx-component-store.mjs","sources":["../../../../modules/component-store/src/debounce-sync.ts","../../../../modules/component-store/src/lifecycle_hooks.ts","../../../../modules/component-store/src/component-store.ts","../../../../modules/component-store/index.ts","../../../../modules/component-store/ngrx-component-store.ts"],"sourcesContent":["/**\n * @license MIT License\n *\n * Copyright (c) 2017-2020 Nicholas Jamieson and contributors\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport {\n asapScheduler,\n MonoTypeOperatorFunction,\n Observable,\n Subscription,\n} from 'rxjs';\n\nexport function debounceSync<T>(): MonoTypeOperatorFunction<T> {\n return (source) =>\n new Observable<T>((observer) => {\n let actionSubscription: Subscription | undefined;\n let actionValue: T | undefined;\n const rootSubscription = new Subscription();\n rootSubscription.add(\n source.subscribe({\n complete: () => {\n if (actionSubscription) {\n observer.next(actionValue);\n }\n observer.complete();\n },\n error: (error) => {\n observer.error(error);\n },\n next: (value) => {\n actionValue = value;\n if (!actionSubscription) {\n actionSubscription = asapScheduler.schedule(() => {\n observer.next(actionValue);\n actionSubscription = undefined;\n });\n rootSubscription.add(actionSubscription);\n }\n },\n })\n );\n return rootSubscription;\n });\n}\n","import { Provider, InjectionToken, Type, inject } from '@angular/core';\nimport { take } from 'rxjs/operators';\nimport { ComponentStore } from './component-store';\n\n/**\n * The interface for the lifecycle hook\n * called after the ComponentStore is instantiated.\n */\nexport interface OnStoreInit {\n readonly ngrxOnStoreInit: () => void;\n}\n\n/**\n * The interface for the lifecycle hook\n * called only once after the ComponentStore\n * state is first initialized.\n */\nexport interface OnStateInit {\n readonly ngrxOnStateInit: () => void;\n}\n\n/**\n * Checks to see if the OnInitStore lifecycle hook\n * is defined on the ComponentStore.\n *\n * @param cs ComponentStore type\n * @returns boolean\n */\nexport function isOnStoreInitDefined(cs: unknown): cs is OnStoreInit {\n return typeof (cs as OnStoreInit).ngrxOnStoreInit === 'function';\n}\n\n/**\n * Checks to see if the OnInitState lifecycle hook\n * is defined on the ComponentStore.\n *\n * @param cs ComponentStore type\n * @returns boolean\n */\nexport function isOnStateInitDefined(cs: unknown): cs is OnStateInit {\n return typeof (cs as OnStateInit).ngrxOnStateInit === 'function';\n}\n\n/**\n * @description\n *\n * Function that returns the ComponentStore\n * class registered as a provider,\n * and uses a factory provider to instantiate the\n * ComponentStore and run the lifecycle hooks\n * defined on the ComponentStore.\n *\n * @param componentStoreClass The ComponentStore with lifecycle hooks\n * @returns Provider[]\n *\n * @usageNotes\n *\n * ```ts\n * @Injectable()\n * export class MyStore\n * extends ComponentStore<{ init: boolean }>\n * implements OnStoreInit, OnStateInit\n * {\n *\n * constructor() {\n * super({ init: true });\n * }\n *\n * ngrxOnStoreInit() {\n * // runs once after store has been instantiated\n * }\n *\n * ngrxOnStateInit() {\n * // runs once after store state has been initialized\n * }\n * }\n *\n * @Component({\n * providers: [\n * provideComponentStore(MyStore)\n * ]\n * })\n * export class MyComponent {\n * constructor(private myStore: MyStore) {}\n * }\n * ```\n */\nexport function provideComponentStore<T extends object>(\n componentStoreClass: Type<ComponentStore<T>>\n): Provider[] {\n const CS_WITH_HOOKS = new InjectionToken<ComponentStore<T>>(\n '@ngrx/component-store ComponentStore with Hooks'\n );\n\n return [\n { provide: CS_WITH_HOOKS, useClass: componentStoreClass },\n {\n provide: componentStoreClass,\n useFactory: () => {\n const componentStore = inject(CS_WITH_HOOKS);\n\n // Set private property that CS has been provided with lifecycle hooks\n componentStore['ɵhasProvider'] = true;\n\n if (isOnStoreInitDefined(componentStore)) {\n componentStore.ngrxOnStoreInit();\n }\n\n if (isOnStateInitDefined(componentStore)) {\n componentStore.state$\n .pipe(take(1))\n .subscribe(() => componentStore.ngrxOnStateInit());\n }\n\n return componentStore;\n },\n },\n ];\n}\n","import {\n isObservable,\n Observable,\n of,\n ReplaySubject,\n Subscription,\n throwError,\n combineLatest,\n Subject,\n queueScheduler,\n scheduled,\n asapScheduler,\n EMPTY,\n ObservedValueOf,\n} from 'rxjs';\nimport {\n takeUntil,\n withLatestFrom,\n map,\n distinctUntilChanged,\n shareReplay,\n take,\n tap,\n catchError,\n observeOn,\n} from 'rxjs/operators';\nimport { debounceSync } from './debounce-sync';\nimport {\n Injectable,\n OnDestroy,\n Optional,\n InjectionToken,\n Inject,\n isDevMode,\n Signal,\n computed,\n type ValueEqualityFn,\n type CreateComputedOptions,\n} from '@angular/core';\nimport { isOnStateInitDefined, isOnStoreInitDefined } from './lifecycle_hooks';\nimport { toSignal } from '@angular/core/rxjs-interop';\n\nexport interface SelectConfig<T = unknown> {\n debounce?: boolean;\n equal?: ValueEqualityFn<T>;\n}\n\nexport const INITIAL_STATE_TOKEN = new InjectionToken(\n '@ngrx/component-store Initial State'\n);\n\nexport type SelectorResults<Selectors extends Observable<unknown>[]> = {\n [Key in keyof Selectors]: Selectors[Key] extends Observable<infer U>\n ? U\n : never;\n};\n\nexport type Projector<Selectors extends Observable<unknown>[], Result> = (\n ...args: SelectorResults<Selectors>\n) => Result;\n\ntype SignalsProjector<Signals extends Signal<unknown>[], Result> = (\n ...values: {\n [Key in keyof Signals]: Signals[Key] extends Signal<infer Value>\n ? Value\n : never;\n }\n) => Result;\n\ninterface SelectSignalOptions<T> {\n /**\n * A comparison function which defines equality for select results.\n */\n equal?: ValueEqualityFn<T>;\n}\n\n@Injectable()\nexport class ComponentStore<T extends object> implements OnDestroy {\n // Should be used only in ngOnDestroy.\n private readonly destroySubject$ = new ReplaySubject<void>(1);\n // Exposed to any extending Store to be used for the teardown.\n readonly destroy$ = this.destroySubject$.asObservable();\n\n private readonly stateSubject$ = new ReplaySubject<T>(1);\n private isInitialized = false;\n // Needs to be after destroy$ is declared because it's used in select.\n readonly state$: Observable<T> = this.select((s) => s);\n readonly state: Signal<T> = toSignal(\n this.stateSubject$.pipe(takeUntil(this.destroy$)),\n { requireSync: false, manualCleanup: true }\n ) as Signal<T>;\n private ɵhasProvider = false;\n\n constructor(@Optional() @Inject(INITIAL_STATE_TOKEN) defaultState?: T) {\n // State can be initialized either through constructor or setState.\n if (defaultState) {\n this.initState(defaultState);\n }\n\n this.checkProviderForHooks();\n }\n\n /** Completes all relevant Observable streams. */\n ngOnDestroy() {\n this.stateSubject$.complete();\n this.destroySubject$.next();\n }\n\n /**\n * Creates an updater.\n *\n * Throws an error if updater is called with synchronous values (either\n * imperative value or Observable that is synchronous) before ComponentStore\n * is initialized. If called with async Observable before initialization then\n * state will not be updated and subscription would be closed.\n *\n * @param updaterFn A static updater function that takes 2 parameters (the\n * current state and an argument object) and returns a new instance of the\n * state.\n * @return A function that accepts one argument which is forwarded as the\n * second argument to `updaterFn`. Every time this function is called\n * subscribers will be notified of the state change.\n */\n updater<\n // Allow to force-provide the type\n ProvidedType = void,\n // This type is derived from the `value` property, defaulting to void if it's missing\n OriginType = ProvidedType,\n // The Value type is assigned from the Origin\n ValueType = OriginType,\n // Return either an empty callback or a function requiring specific types as inputs\n ReturnType = OriginType extends void\n ? () => void\n : (observableOrValue: ValueType | Observable<ValueType>) => Subscription\n >(updaterFn: (state: T, value: OriginType) => T): ReturnType {\n return ((\n observableOrValue?: OriginType | Observable<OriginType>\n ): Subscription => {\n // We need to explicitly throw an error if a synchronous error occurs.\n // This is necessary to make synchronous errors catchable.\n let isSyncUpdate = true;\n let syncError: unknown;\n // We can receive either the value or an observable. In case it's a\n // simple value, we'll wrap it with `of` operator to turn it into\n // Observable.\n const observable$ = isObservable(observableOrValue)\n ? observableOrValue\n : of(observableOrValue);\n const subscription = observable$\n .pipe(\n // Push the value into queueScheduler\n observeOn(queueScheduler),\n // If the state is not initialized yet, we'll throw an error.\n tap(() => this.assertStateIsInitialized()),\n withLatestFrom(this.stateSubject$),\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n map(([value, currentState]) => updaterFn(currentState, value!)),\n tap((newState) => this.stateSubject$.next(newState)),\n catchError((error: unknown) => {\n if (isSyncUpdate) {\n syncError = error;\n return EMPTY;\n }\n\n return throwError(error);\n }),\n takeUntil(this.destroy$)\n )\n .subscribe();\n\n if (syncError) {\n throw syncError;\n }\n isSyncUpdate = false;\n\n return subscription;\n }) as unknown as ReturnType;\n }\n\n /**\n * Initializes state. If it was already initialized then it resets the\n * state.\n */\n private initState(state: T): void {\n scheduled([state], queueScheduler).subscribe((s) => {\n this.isInitialized = true;\n this.stateSubject$.next(s);\n });\n }\n\n /**\n * Sets the state specific value.\n * @param stateOrUpdaterFn object of the same type as the state or an\n * updaterFn, returning such object.\n */\n setState(stateOrUpdaterFn: T | ((state: T) => T)): void {\n if (typeof stateOrUpdaterFn !== 'function') {\n this.initState(stateOrUpdaterFn);\n } else {\n this.updater(stateOrUpdaterFn as (state: T) => T)();\n }\n }\n\n /**\n * Patches the state with provided partial state.\n *\n * @param partialStateOrUpdaterFn a partial state or a partial updater\n * function that accepts the state and returns the partial state.\n * @throws Error if the state is not initialized.\n */\n patchState(\n partialStateOrUpdaterFn:\n | Partial<T>\n | Observable<Partial<T>>\n | ((state: T) => Partial<T>)\n ): void {\n const patchedState =\n typeof partialStateOrUpdaterFn === 'function'\n ? partialStateOrUpdaterFn(this.get())\n : partialStateOrUpdaterFn;\n\n this.updater((state, partialState: Partial<T>) => ({\n ...state,\n ...partialState,\n }))(patchedState);\n }\n\n protected get(): T;\n protected get<R>(projector: (s: T) => R): R;\n protected get<R>(projector?: (s: T) => R): R | T {\n this.assertStateIsInitialized();\n let value: R | T;\n\n this.stateSubject$.pipe(take(1)).subscribe((state) => {\n value = projector ? projector(state) : state;\n });\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return value!;\n }\n\n /**\n * Creates a selector.\n *\n * @param projector A pure projection function that takes the current state and\n * returns some new slice/projection of that state.\n * @param config SelectConfig that changes the behavior of selector, including\n * the debouncing of the values until the state is settled.\n * @return An observable of the projector results.\n */\n select<Result>(\n projector: (s: T) => Result,\n config?: SelectConfig<Result>\n ): Observable<Result>;\n select<SelectorsObject extends Record<string, Observable<unknown>>>(\n selectorsObject: SelectorsObject,\n config?: SelectConfig<{\n [K in keyof SelectorsObject]: ObservedValueOf<SelectorsObject[K]>;\n }>\n ): Observable<{\n [K in keyof SelectorsObject]: ObservedValueOf<SelectorsObject[K]>;\n }>;\n select<Selectors extends Observable<unknown>[], Result>(\n ...selectorsWithProjector: [\n ...selectors: Selectors,\n projector: Projector<Selectors, Result>\n ]\n ): Observable<Result>;\n select<Selectors extends Observable<unknown>[], Result>(\n ...selectorsWithProjectorAndConfig: [\n ...selectors: Selectors,\n projector: Projector<Selectors, Result>,\n config: SelectConfig<Result>\n ]\n ): Observable<Result>;\n select<\n Selectors extends Array<\n Observable<unknown> | SelectConfig<Result> | ProjectorFn | SelectorsObject\n >,\n Result,\n ProjectorFn extends (...a: unknown[]) => Result,\n SelectorsObject extends Record<string, Observable<unknown>>\n >(...args: Selectors): Observable<Result> {\n const { observablesOrSelectorsObject, projector, config } =\n processSelectorArgs<Selectors, Result, ProjectorFn, SelectorsObject>(\n args\n );\n\n const source$ = hasProjectFnOnly(observablesOrSelectorsObject, projector)\n ? this.stateSubject$\n : combineLatest(observablesOrSelectorsObject as any);\n\n return source$.pipe(\n config.debounce ? debounceSync() : noopOperator(),\n (projector\n ? map((projectorArgs) =>\n // projectorArgs could be an Array in case where the entire state is an Array, so adding this check\n (observablesOrSelectorsObject as Observable<unknown>[]).length >\n 0 && Array.isArray(projectorArgs)\n ? projector(...projectorArgs)\n : projector(projectorArgs)\n )\n : noopOperator()) as () => Observable<Result>,\n distinctUntilChanged(config.equal),\n shareReplay({\n refCount: true,\n bufferSize: 1,\n }),\n takeUntil(this.destroy$)\n );\n }\n\n /**\n * Creates a signal from the provided state projector function.\n */\n selectSignal<Result>(\n projector: (state: T) => Result,\n options?: SelectSignalOptions<Result>\n ): Signal<Result>;\n /**\n * Creates a signal by combining provided signals.\n */\n selectSignal<Signals extends Signal<unknown>[], Result>(\n ...args: [...signals: Signals, projector: SignalsProjector<Signals, Result>]\n ): Signal<Result>;\n /**\n * Creates a signal by combining provided signals.\n */\n selectSignal<Signals extends Signal<unknown>[], Result>(\n ...args: [\n ...signals: Signals,\n projector: SignalsProjector<Signals, Result>,\n options: SelectSignalOptions<Result>\n ]\n ): Signal<Result>;\n selectSignal(\n ...args:\n | [(state: T) => unknown, SelectSignalOptions<unknown>?]\n | [\n ...signals: Signal<unknown>[],\n projector: (...values: unknown[]) => unknown\n ]\n | [\n ...signals: Signal<unknown>[],\n projector: (...values: unknown[]) => unknown,\n options: SelectSignalOptions<unknown>\n ]\n ): Signal<unknown> {\n const selectSignalArgs = [...args];\n const options: CreateComputedOptions<unknown> =\n typeof selectSignalArgs[args.length - 1] === 'object'\n ? (selectSignalArgs.pop() as SelectSignalOptions<unknown>)\n : {};\n const projector = selectSignalArgs.pop() as (\n ...values: unknown[]\n ) => unknown;\n const signals = selectSignalArgs as Signal<unknown>[];\n\n const computation =\n signals.length === 0\n ? () => projector(this.state())\n : () => {\n const values = signals.map((signal) => signal());\n return projector(...values);\n };\n\n return computed(computation, options);\n }\n\n /**\n * Creates an effect.\n *\n * This effect is subscribed to throughout the lifecycle of the ComponentStore.\n * @param generator A function that takes an origin Observable input and\n * returns an Observable. The Observable that is returned will be\n * subscribed to for the life of the component.\n * @return A function that, when called, will trigger the origin Observable.\n */\n effect<\n // This type quickly became part of effect 'API'\n ProvidedType = void,\n // The actual origin$ type, which could be unknown, when not specified\n OriginType extends\n | Observable<ProvidedType>\n | unknown = Observable<ProvidedType>,\n // Unwrapped actual type of the origin$ Observable, after default was applied\n ObservableType = OriginType extends Observable<infer A> ? A : never,\n // Return either an optional callback or a function requiring specific types as inputs\n ReturnType = ProvidedType | ObservableType extends void\n ? (\n observableOrValue?: ObservableType | Observable<ObservableType>\n ) => Subscription\n : (\n observableOrValue: ObservableType | Observable<ObservableType>\n ) => Subscription\n >(generator: (origin$: OriginType) => Observable<unknown>): ReturnType {\n const origin$ = new Subject<ObservableType>();\n generator(origin$ as OriginType)\n // tied to the lifecycle 👇 of ComponentStore\n .pipe(takeUntil(this.destroy$))\n .subscribe();\n\n return ((\n observableOrValue?: ObservableType | Observable<ObservableType>\n ): Subscription => {\n const observable$ = isObservable(observableOrValue)\n ? observableOrValue\n : of(observableOrValue);\n return observable$.pipe(takeUntil(this.destroy$)).subscribe((value) => {\n // any new 👇 value is pushed into a stream\n origin$.next(value as ObservableType);\n });\n }) as unknown as ReturnType;\n }\n\n /**\n * Used to check if lifecycle hooks are defined\n * but not used with provideComponentStore()\n */\n private checkProviderForHooks() {\n asapScheduler.schedule(() => {\n if (\n isDevMode() &&\n (isOnStoreInitDefined(this) || isOnStateInitDefined(this)) &&\n !this.ɵhasProvider\n ) {\n const warnings = [\n isOnStoreInitDefined(this) ? 'OnStoreInit' : '',\n isOnStateInitDefined(this) ? 'OnStateInit' : '',\n ].filter((defined) => defined);\n\n console.warn(\n `@ngrx/component-store: ${\n this.constructor.name\n } has the ${warnings.join(' and ')} ` +\n 'lifecycle hook(s) implemented without being provided using the ' +\n `provideComponentStore(${this.constructor.name}) function. ` +\n `To resolve this, provide the component store via provideComponentStore(${this.constructor.name})`\n );\n }\n });\n }\n\n private assertStateIsInitialized(): void {\n if (!this.isInitialized) {\n throw new Error(\n `${this.constructor.name} has not been initialized yet. ` +\n `Please make sure it is initialized before updating/getting.`\n );\n }\n }\n}\n\nfunction processSelectorArgs<\n Selectors extends Array<\n Observable<unknown> | SelectConfig<Result> | ProjectorFn | SelectorsObject\n >,\n Result,\n ProjectorFn extends (...a: unknown[]) => Result,\n SelectorsObject extends Record<string, Observable<unknown>>\n>(\n args: Selectors\n):\n | {\n observablesOrSelectorsObject: Observable<unknown>[];\n projector: ProjectorFn;\n config: Required<SelectConfig<Result>>;\n }\n | {\n observablesOrSelectorsObject: SelectorsObject;\n projector: undefined;\n config: Required<SelectConfig<Result>>;\n } {\n const selectorArgs = Array.from(args);\n const defaultEqualityFn: ValueEqualityFn<Result> = (previous, current) =>\n previous === current;\n\n // Assign default values.\n let config: Required<SelectConfig<Result>> = {\n debounce: false,\n equal: defaultEqualityFn,\n };\n\n // Last argument is either config or projector or selectorsObject\n if (isSelectConfig(selectorArgs[selectorArgs.length - 1])) {\n config = { ...config, ...selectorArgs.pop() };\n }\n\n // At this point selectorArgs is either projector, selectors with projector or selectorsObject\n if (selectorArgs.length === 1 && typeof selectorArgs[0] !== 'function') {\n // this is a selectorsObject\n return {\n observablesOrSelectorsObject: selectorArgs[0] as SelectorsObject,\n projector: undefined,\n config,\n };\n }\n\n const projector = selectorArgs.pop() as ProjectorFn;\n\n // The Observables to combine, if there are any left.\n const observables = selectorArgs as Observable<unknown>[];\n return {\n observablesOrSelectorsObject: observables,\n projector,\n config,\n };\n}\n\nfunction isSelectConfig(\n arg: SelectConfig<unknown> | unknown\n): arg is SelectConfig<unknown> {\n const typedArg = arg as SelectConfig<unknown>;\n return (\n typeof typedArg.debounce !== 'undefined' ||\n typeof typedArg.equal !== 'undefined'\n );\n}\n\nfunction hasProjectFnOnly(\n observablesOrSelectorsObject: unknown[] | Record<string, unknown>,\n projector: unknown\n) {\n return (\n Array.isArray(observablesOrSelectorsObject) &&\n observablesOrSelectorsObject.length === 0 &&\n projector\n );\n}\n\nfunction noopOperator(): <T>(source$: Observable<T>) => typeof source$ {\n return (source$) => source$;\n}\n","/**\n * DO NOT EDIT\n *\n * This file is automatically generated at build\n */\n\nexport * from './public_api';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}