@angular-architects/ngrx-toolkit 18.1.0 → 19.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/README.md +4 -12
  2. package/fesm2022/angular-architects-ngrx-toolkit-redux-connector.mjs +15 -15
  3. package/fesm2022/angular-architects-ngrx-toolkit-redux-connector.mjs.map +1 -1
  4. package/fesm2022/angular-architects-ngrx-toolkit.mjs +487 -78
  5. package/fesm2022/angular-architects-ngrx-toolkit.mjs.map +1 -1
  6. package/index.d.ts +9 -2
  7. package/lib/devtools/features/with-disabled-name-indicies.d.ts +27 -0
  8. package/lib/devtools/features/with-glitch-tracking.d.ts +30 -0
  9. package/lib/devtools/features/with-mapper.d.ts +28 -0
  10. package/lib/devtools/internal/current-action-names.d.ts +1 -0
  11. package/lib/devtools/internal/default-tracker.d.ts +13 -0
  12. package/lib/devtools/internal/devtools-feature.d.ts +24 -0
  13. package/lib/devtools/internal/devtools-syncer.service.d.ts +35 -0
  14. package/lib/devtools/internal/glitch-tracker.service.d.ts +18 -0
  15. package/lib/devtools/internal/models.d.ts +25 -0
  16. package/lib/devtools/rename-devtools-name.d.ts +7 -0
  17. package/lib/devtools/update-state.d.ts +17 -0
  18. package/lib/devtools/with-dev-tools-stub.d.ts +5 -0
  19. package/lib/devtools/with-devtools.d.ts +30 -0
  20. package/lib/shared/prettify.d.ts +1 -1
  21. package/lib/shared/throw-if-null.d.ts +1 -0
  22. package/lib/with-call-state.d.ts +2 -2
  23. package/lib/with-data-service.d.ts +3 -3
  24. package/lib/with-pagination.d.ts +4 -4
  25. package/lib/with-reset.d.ts +29 -0
  26. package/lib/with-storage-sync.d.ts +2 -2
  27. package/lib/with-undo-redo.d.ts +4 -3
  28. package/package.json +6 -7
  29. package/redux-connector/src/lib/create-redux.d.ts +4 -4
  30. package/redux-connector/src/lib/model.d.ts +5 -0
  31. package/redux-connector/src/lib/rxjs-interop/redux-method.d.ts +5 -2
  32. package/redux-connector/src/lib/signal-redux-store.d.ts +10 -2
  33. package/redux-connector/src/lib/util.d.ts +2 -2
  34. package/esm2022/angular-architects-ngrx-toolkit.mjs +0 -5
  35. package/esm2022/index.mjs +0 -8
  36. package/esm2022/lib/assertions/assertions.mjs +0 -6
  37. package/esm2022/lib/shared/prettify.mjs +0 -2
  38. package/esm2022/lib/shared/signal-store-models.mjs +0 -2
  39. package/esm2022/lib/with-call-state.mjs +0 -60
  40. package/esm2022/lib/with-data-service.mjs +0 -202
  41. package/esm2022/lib/with-devtools.mjs +0 -92
  42. package/esm2022/lib/with-pagination.mjs +0 -209
  43. package/esm2022/lib/with-redux.mjs +0 -100
  44. package/esm2022/lib/with-storage-sync.mjs +0 -56
  45. package/esm2022/lib/with-undo-redo.mjs +0 -113
  46. package/esm2022/redux-connector/angular-architects-ngrx-toolkit-redux-connector.mjs +0 -5
  47. package/esm2022/redux-connector/index.mjs +0 -3
  48. package/esm2022/redux-connector/src/lib/create-redux.mjs +0 -41
  49. package/esm2022/redux-connector/src/lib/model.mjs +0 -2
  50. package/esm2022/redux-connector/src/lib/rxjs-interop/redux-method.mjs +0 -22
  51. package/esm2022/redux-connector/src/lib/signal-redux-store.mjs +0 -43
  52. package/esm2022/redux-connector/src/lib/util.mjs +0 -13
  53. package/lib/with-devtools.d.ts +0 -38
@@ -0,0 +1,35 @@
1
+ import { OnDestroy } from '@angular/core';
2
+ import { StateSource } from '@ngrx/signals';
3
+ import { DevtoolsInnerOptions } from './devtools-feature';
4
+ import * as i0 from "@angular/core";
5
+ /**
6
+ * A service provided by the root injector is
7
+ * required because the synchronization runs
8
+ * globally.
9
+ *
10
+ * The SignalStore could be provided in a component.
11
+ * If the effect starts in the injection
12
+ * context of the SignalStore, the complete sync
13
+ * process would shut down once the component gets
14
+ * destroyed.
15
+ */
16
+ export declare class DevtoolsSyncer implements OnDestroy {
17
+ #private;
18
+ constructor();
19
+ ngOnDestroy(): void;
20
+ syncToDevTools(changedStatePerId: Record<string, object>): void;
21
+ getNextId(): string;
22
+ /**
23
+ * Consumer provides the id. That is because we can only start
24
+ * tracking the store in the init hook.
25
+ * Unfortunately, methods for renaming having the final id
26
+ * need to be defined already before.
27
+ * That's why `withDevtools` requests first the id and
28
+ * then registers itself later.
29
+ */
30
+ addStore(id: string, name: string, store: StateSource<object>, options: DevtoolsInnerOptions): void;
31
+ removeStore(id: string): void;
32
+ renameStore(oldName: string, newName: string): void;
33
+ static ɵfac: i0.ɵɵFactoryDeclaration<DevtoolsSyncer, never>;
34
+ static ɵprov: i0.ɵɵInjectableDeclaration<DevtoolsSyncer>;
35
+ }
@@ -0,0 +1,18 @@
1
+ import { Tracker, TrackerStores } from './models';
2
+ import { StateSource } from '@ngrx/signals';
3
+ import * as i0 from "@angular/core";
4
+ /**
5
+ * Internal Service used by {@link withGlitchTracking}. It does not rely
6
+ * on `effect` as {@link DefaultTracker} does but uses the NgRx function
7
+ * `watchState` to track all state changes.
8
+ */
9
+ export declare class GlitchTrackerService implements Tracker {
10
+ #private;
11
+ get stores(): TrackerStores;
12
+ onChange(callback: (changedState: Record<string, object>) => void): void;
13
+ removeStore(id: string): void;
14
+ track(id: string, store: StateSource<object>): void;
15
+ notifyRenamedStore(id: string): void;
16
+ static ɵfac: i0.ɵɵFactoryDeclaration<GlitchTrackerService, never>;
17
+ static ɵprov: i0.ɵɵInjectableDeclaration<GlitchTrackerService>;
18
+ }
@@ -0,0 +1,25 @@
1
+ import { StateSource } from '@ngrx/signals';
2
+ import { DevtoolsInnerOptions } from './devtools-feature';
3
+ export type Action = {
4
+ type: string;
5
+ };
6
+ export type Connection = {
7
+ send: (action: Action, state: Record<string, unknown>) => void;
8
+ };
9
+ export type ReduxDevtoolsExtension = {
10
+ connect: (options: {
11
+ name: string;
12
+ }) => Connection;
13
+ };
14
+ export type StoreRegistry = Record<string, {
15
+ options: DevtoolsInnerOptions;
16
+ name: string;
17
+ }>;
18
+ export type Tracker = {
19
+ track(id: string, store: StateSource<object>): void;
20
+ onChange(callback: (changedState: Record<string, object>) => void): void;
21
+ notifyRenamedStore(id: string): void;
22
+ removeStore(id: string): void;
23
+ get stores(): TrackerStores;
24
+ };
25
+ export type TrackerStores = Record<string, StateSource<object>>;
@@ -0,0 +1,7 @@
1
+ import { StateSource } from '@ngrx/signals';
2
+ /**
3
+ * Renames the name of a store how it appears in the Devtools.
4
+ * @param store instance of the SignalStore
5
+ * @param newName new name for the Devtools
6
+ */
7
+ export declare function renameDevtoolsName<State extends object>(store: StateSource<State>, newName: string): void;
@@ -0,0 +1,17 @@
1
+ import { patchState as originalPatchState } from '@ngrx/signals';
2
+ import { PartialStateUpdater, WritableStateSource } from '@ngrx/signals';
3
+ import { Prettify } from '../shared/prettify';
4
+ type PatchFn = typeof originalPatchState extends (arg1: infer First, ...args: infer Rest) => infer Returner ? (state: First, action: string, ...rest: Rest) => Returner : never;
5
+ /**
6
+ * @deprecated Has been renamed to `updateState`
7
+ */
8
+ export declare const patchState: PatchFn;
9
+ /**
10
+ * Wrapper of `patchState` for DevTools integration. Next to updating the state,
11
+ * it also sends the action to the DevTools.
12
+ * @param stateSource state of Signal Store
13
+ * @param action name of action how it will show in DevTools
14
+ * @param updaters updater functions or objects
15
+ */
16
+ export declare function updateState<State extends object>(stateSource: WritableStateSource<State>, action: string, ...updaters: Array<Partial<Prettify<State>> | PartialStateUpdater<Prettify<State>>>): void;
17
+ export {};
@@ -0,0 +1,5 @@
1
+ import { withDevtools } from './with-devtools';
2
+ /**
3
+ * Stub for DevTools integration. Can be used to disable DevTools in production.
4
+ */
5
+ export declare const withDevToolsStub: typeof withDevtools;
@@ -0,0 +1,30 @@
1
+ import { DevtoolsFeature } from './internal/devtools-feature';
2
+ import { ReduxDevtoolsExtension } from './internal/models';
3
+ declare global {
4
+ interface Window {
5
+ __REDUX_DEVTOOLS_EXTENSION__: ReduxDevtoolsExtension | undefined;
6
+ }
7
+ }
8
+ export declare const existingNames: Map<string, unknown>;
9
+ export declare const renameDevtoolsMethodName = "___renameDevtoolsName";
10
+ export declare const uniqueDevtoolsId = "___uniqueDevtoolsId";
11
+ /**
12
+ * Adds this store as a feature state to the Redux DevTools.
13
+ *
14
+ * By default, the action name is 'Store Update'. You can
15
+ * change that via the {@link updateState} method, which has as second
16
+ * parameter the action name.
17
+ *
18
+ * The standalone function {@link renameDevtoolsName} can rename
19
+ * the store name.
20
+ *
21
+ * @param name name of the store as it should appear in the DevTools
22
+ * @param features features to extend or modify the behavior of the Devtools
23
+ */
24
+ export declare function withDevtools(name: string, ...features: DevtoolsFeature[]): import("@ngrx/signals").SignalStoreFeature<import("@ngrx/signals").EmptyFeatureResult, {
25
+ state: {};
26
+ props: {};
27
+ methods: {
28
+ [x: string]: (newName?: unknown) => unknown;
29
+ };
30
+ }>;
@@ -1,3 +1,3 @@
1
- export type Prettify<Type extends {}> = {
1
+ export type Prettify<Type extends object> = {
2
2
  [Key in keyof Type]: Type[Key];
3
3
  };
@@ -0,0 +1 @@
1
+ export declare function throwIfNull<T>(obj: T): NonNullable<T>;
@@ -30,11 +30,11 @@ export declare function withCallState<Collection extends string>(config: {
30
30
  collection: Collection;
31
31
  }): SignalStoreFeature<EmptyFeatureResult, EmptyFeatureResult & {
32
32
  state: NamedCallStateSlice<Collection>;
33
- computed: NamedCallStateSignals<Collection>;
33
+ props: NamedCallStateSignals<Collection>;
34
34
  }>;
35
35
  export declare function withCallState(): SignalStoreFeature<EmptyFeatureResult, EmptyFeatureResult & {
36
36
  state: CallStateSlice;
37
- computed: CallStateSignals;
37
+ props: CallStateSignals;
38
38
  }>;
39
39
  export declare function setLoading<Prop extends string | undefined = undefined>(prop?: Prop): SetCallState<Prop>;
40
40
  export declare function setLoaded<Prop extends string | undefined = undefined>(prop?: Prop): SetCallState<Prop>;
@@ -89,10 +89,10 @@ export declare function withDataService<E extends Entity, F extends Filter, Coll
89
89
  filter: F;
90
90
  collection: Collection;
91
91
  }): SignalStoreFeature<EmptyFeatureResult & {
92
- computed: NamedEntityComputed<E, Collection>;
92
+ props: NamedEntityComputed<E, Collection>;
93
93
  }, {
94
94
  state: NamedDataServiceState<E, F, Collection>;
95
- computed: NamedDataServiceComputed<E, Collection>;
95
+ props: NamedDataServiceComputed<E, Collection>;
96
96
  methods: NamedDataServiceMethods<E, F, Collection>;
97
97
  }>;
98
98
  export declare function withDataService<E extends Entity, F extends Filter>(options: {
@@ -104,6 +104,6 @@ export declare function withDataService<E extends Entity, F extends Filter>(opti
104
104
  } & EntityState<E>;
105
105
  }, {
106
106
  state: DataServiceState<E, F>;
107
- computed: DataServiceComputed<E>;
107
+ props: DataServiceComputed<E>;
108
108
  methods: DataServiceMethods<E, F>;
109
109
  }>;
@@ -92,18 +92,18 @@ export declare function withPagination<E, Collection extends string>(options: {
92
92
  entity: E;
93
93
  collection: Collection;
94
94
  }): SignalStoreFeature<EmptyFeatureResult & {
95
- computed: NamedEntityComputed<E, Collection>;
95
+ props: NamedEntityComputed<E, Collection>;
96
96
  }, {
97
97
  state: NamedPaginationServiceState<E, Collection>;
98
- computed: NamedPaginationServiceSignals<E, Collection>;
98
+ props: NamedPaginationServiceSignals<E, Collection>;
99
99
  methods: NamedPaginationServiceMethods<Collection>;
100
100
  }>;
101
101
  export declare function withPagination<E>(): SignalStoreFeature<EmptyFeatureResult & {
102
102
  state: EntityState<E>;
103
- computed: EntityComputed<E>;
103
+ props: EntityComputed<E>;
104
104
  }, {
105
105
  state: PaginationServiceState<E>;
106
- computed: PaginationServiceSignals<E>;
106
+ props: PaginationServiceSignals<E>;
107
107
  methods: PaginationServiceMethods;
108
108
  }>;
109
109
  export declare function gotoPage<E, Collection extends string>(page: number, options?: {
@@ -0,0 +1,29 @@
1
+ import { StateSource } from '@ngrx/signals';
2
+ export type PublicMethods = {
3
+ resetState(): void;
4
+ };
5
+ /**
6
+ * Adds a `resetState` method to the store, which resets the state
7
+ * to the initial state.
8
+ *
9
+ * If you want to set a custom initial state, you can use {@link setResetState}.
10
+ */
11
+ export declare function withReset(): import("@ngrx/signals").SignalStoreFeature<import("@ngrx/signals").EmptyFeatureResult, {
12
+ state: {};
13
+ props: {
14
+ _resetState: {
15
+ value: {};
16
+ };
17
+ };
18
+ methods: {
19
+ resetState: () => void;
20
+ };
21
+ }>;
22
+ /**
23
+ * Sets the reset state of the store to the given state.
24
+ *
25
+ * Throws an error if the store is not configured with {@link withReset}.
26
+ * @param store the instance of a SignalStore
27
+ * @param state the state to set as the reset state
28
+ */
29
+ export declare function setResetState<State extends object>(store: StateSource<State>, state: State): void;
@@ -47,6 +47,6 @@ export type SyncConfig<State> = {
47
47
  *
48
48
  * Only works on browser platform.
49
49
  */
50
- export declare function withStorageSync<State extends object, Input extends SignalStoreFeatureResult>(key: string): SignalStoreFeature<Input, WithStorageSyncFeatureResult>;
51
- export declare function withStorageSync<State extends object, Input extends SignalStoreFeatureResult>(config: SyncConfig<Input['state']>): SignalStoreFeature<Input, WithStorageSyncFeatureResult>;
50
+ export declare function withStorageSync<Input extends SignalStoreFeatureResult>(key: string): SignalStoreFeature<Input, WithStorageSyncFeatureResult>;
51
+ export declare function withStorageSync<Input extends SignalStoreFeatureResult>(config: SyncConfig<Input['state']>): SignalStoreFeature<Input, WithStorageSyncFeatureResult>;
52
52
  export {};
@@ -11,20 +11,21 @@ export declare function getUndoRedoKeys(collections?: string[]): string[];
11
11
  type NonNever<T> = T extends never ? never : T;
12
12
  type ExtractEntityCollection<T> = T extends `${infer U}Entities` ? U : never;
13
13
  type ExtractEntityCollections<Store extends SignalStoreFeatureResult> = NonNever<{
14
- [K in keyof Store['computed']]: ExtractEntityCollection<K>;
15
- }[keyof Store['computed']]>;
14
+ [K in keyof Store['props']]: ExtractEntityCollection<K>;
15
+ }[keyof Store['props']]>;
16
16
  type OptionsForState<Store extends SignalStoreFeatureResult> = Partial<Omit<NormalizedUndoRedoOptions, 'collections' | 'keys'>> & {
17
17
  collections?: ExtractEntityCollections<Store>[];
18
18
  keys?: (keyof Store['state'])[];
19
19
  };
20
20
  export declare function withUndoRedo<Input extends EmptyFeatureResult>(options?: OptionsForState<Input>): SignalStoreFeature<Input, EmptyFeatureResult & {
21
- computed: {
21
+ props: {
22
22
  canUndo: Signal<boolean>;
23
23
  canRedo: Signal<boolean>;
24
24
  };
25
25
  methods: {
26
26
  undo: () => void;
27
27
  redo: () => void;
28
+ clearStack: () => void;
28
29
  };
29
30
  }>;
30
31
  export {};
package/package.json CHANGED
@@ -1,14 +1,17 @@
1
1
  {
2
2
  "name": "@angular-architects/ngrx-toolkit",
3
- "version": "18.1.0",
3
+ "version": "19.0.0",
4
4
  "license": "MIT",
5
5
  "repository": {
6
6
  "type": "GitHub",
7
7
  "url": "https://github.com/angular-architects/ngrx-toolkit"
8
8
  },
9
9
  "peerDependencies": {
10
- "@ngrx/signals": "18.1.0",
11
- "@ngrx/store": ">=18.0.0"
10
+ "@angular/core": "^19.0.0",
11
+ "@angular/common": "^19.0.0",
12
+ "@ngrx/signals": "^19.0.0",
13
+ "@ngrx/store": "^19.0.0",
14
+ "rxjs": "^7.0.0"
12
15
  },
13
16
  "peerDependenciesMeta": {
14
17
  "@ngrx/store": {
@@ -27,14 +30,10 @@
27
30
  },
28
31
  ".": {
29
32
  "types": "./index.d.ts",
30
- "esm2022": "./esm2022/angular-architects-ngrx-toolkit.mjs",
31
- "esm": "./esm2022/angular-architects-ngrx-toolkit.mjs",
32
33
  "default": "./fesm2022/angular-architects-ngrx-toolkit.mjs"
33
34
  },
34
35
  "./redux-connector": {
35
36
  "types": "./redux-connector/index.d.ts",
36
- "esm2022": "./esm2022/redux-connector/angular-architects-ngrx-toolkit-redux-connector.mjs",
37
- "esm": "./esm2022/redux-connector/angular-architects-ngrx-toolkit-redux-connector.mjs",
38
37
  "default": "./fesm2022/angular-architects-ngrx-toolkit-redux-connector.mjs"
39
38
  }
40
39
  }
@@ -1,5 +1,5 @@
1
- import { ActionCreator, ActionType } from "@ngrx/store/src/models";
2
- import { CreateReduxState, MapperTypes, Store } from "./model";
1
+ import { ActionCreator, ActionType } from '@ngrx/store/src/models';
2
+ import { CreateReduxState, MapperTypes, Store } from './model';
3
3
  export declare function mapAction<Creators extends readonly ActionCreator[]>(...args: [
4
4
  ...creators: Creators,
5
5
  storeMethod: (action: ActionType<Creators[number]>) => unknown
@@ -9,5 +9,5 @@ export declare function mapAction<Creators extends readonly ActionCreator[], T>(
9
9
  storeMethod: (action: ActionType<Creators[number]>, resultMethod: (input: T) => unknown) => unknown,
10
10
  resultMethod: (input: T) => unknown
11
11
  ]): MapperTypes<Creators>;
12
- export declare function withActionMappers(...mappers: MapperTypes<ActionCreator<any, any>[]>[]): MapperTypes<ActionCreator<any, any>[]>[];
13
- export declare function createReduxState<StoreName extends string, STORE extends Store>(storeName: StoreName, signalStore: STORE, withActionMappers: (store: InstanceType<STORE>) => MapperTypes<ActionCreator<any, any>[]>[]): CreateReduxState<StoreName, STORE>;
12
+ export declare function withActionMappers(...mappers: MapperTypes<ActionCreator[]>[]): MapperTypes<ActionCreator[]>[];
13
+ export declare function createReduxState<StoreName extends string, STORE extends Store>(storeName: StoreName, signalStore: STORE, withActionMappers: (store: InstanceType<STORE>) => MapperTypes<ActionCreator[]>[]): CreateReduxState<StoreName, STORE>;
@@ -33,3 +33,8 @@ export interface MapperTypes<Creators extends readonly ActionCreator[]> {
33
33
  storeMethod: StoreMethod<Creators>;
34
34
  resultMethod?: (...args: unknown[]) => unknown;
35
35
  }
36
+ export type ServiceWithDecorator = {
37
+ ɵprov?: {
38
+ providedIn?: string;
39
+ };
40
+ };
@@ -1,7 +1,10 @@
1
1
  import { Injector, Signal } from "@angular/core";
2
- import { Observable, Unsubscribable } from "rxjs";
2
+ import { Observable } from "rxjs";
3
3
  type RxMethodInput<Input> = Input | Observable<Input> | Signal<Input>;
4
- type RxMethod<Input, MethodInput = Input, MethodResult = unknown> = ((input: RxMethodInput<Input>, resultMethod: (input: MethodInput) => MethodResult) => Unsubscribable) & Unsubscribable;
4
+ type RxMethodRef = {
5
+ destroy: () => void;
6
+ };
7
+ type RxMethod<Input, MethodInput = Input, MethodResult = unknown> = ((input: RxMethodInput<Input>, resultMethod: (input: MethodInput) => MethodResult) => RxMethodRef) & RxMethodRef;
5
8
  export declare function reduxMethod<Input, MethodInput = Input>(generator: (source$: Observable<Input>) => Observable<MethodInput>, config?: {
6
9
  injector?: Injector;
7
10
  }): RxMethod<Input, MethodInput>;
@@ -5,11 +5,19 @@ export declare class SignalReduxStore {
5
5
  private mapperDict;
6
6
  dispatch: ((input: Action<string> | import("rxjs").Observable<Action<string>> | import("@angular/core").Signal<Action<string>>, config?: {
7
7
  injector?: import("@angular/core").Injector;
8
- }) => import("rxjs").Unsubscribable) & import("rxjs").Unsubscribable;
8
+ }) => {
9
+ destroy: () => void;
10
+ }) & {
11
+ destroy: () => void;
12
+ };
9
13
  connectFeatureStore(mappers: MapperTypes<ActionCreator<any, any>[]>[]): void;
10
14
  static ɵfac: i0.ɵɵFactoryDeclaration<SignalReduxStore, never>;
11
15
  static ɵprov: i0.ɵɵInjectableDeclaration<SignalReduxStore>;
12
16
  }
13
17
  export declare function injectReduxDispatch(): ((input: Action<string> | import("rxjs").Observable<Action<string>> | import("@angular/core").Signal<Action<string>>, config?: {
14
18
  injector?: import("@angular/core").Injector;
15
- }) => import("rxjs").Unsubscribable) & import("rxjs").Unsubscribable;
19
+ }) => {
20
+ destroy: () => void;
21
+ }) & {
22
+ destroy: () => void;
23
+ };
@@ -1,5 +1,5 @@
1
- import { Action } from '@ngrx/store';
1
+ import { ActionCreator } from '@ngrx/store';
2
2
  import { Unsubscribable } from 'rxjs';
3
3
  export declare function isUnsubscribable<F extends (...args: unknown[]) => unknown>(fn: F | (F & Unsubscribable)): fn is F & Unsubscribable;
4
4
  export declare function capitalize(str: string): string;
5
- export declare function isActionCreator(action: any): action is Action;
5
+ export declare function isActionCreator(action: unknown): action is ActionCreator;
@@ -1,5 +0,0 @@
1
- /**
2
- * Generated bundle index. Do not edit.
3
- */
4
- export * from './index';
5
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci1hcmNoaXRlY3RzLW5ncngtdG9vbGtpdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYnMvbmdyeC10b29sa2l0L3NyYy9hbmd1bGFyLWFyY2hpdGVjdHMtbmdyeC10b29sa2l0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxTQUFTLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdlbmVyYXRlZCBidW5kbGUgaW5kZXguIERvIG5vdCBlZGl0LlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vaW5kZXgnO1xuIl19
package/esm2022/index.mjs DELETED
@@ -1,8 +0,0 @@
1
- export { withDevtools, patchState, updateState, } from './lib/with-devtools';
2
- export * from './lib/with-redux';
3
- export * from './lib/with-call-state';
4
- export * from './lib/with-undo-redo';
5
- export * from './lib/with-data-service';
6
- export { withStorageSync } from './lib/with-storage-sync';
7
- export * from './lib/with-pagination';
8
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWJzL25ncngtdG9vbGtpdC9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFlBQVksRUFDWixVQUFVLEVBQ1YsV0FBVyxHQUVaLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsY0FBYyxrQkFBa0IsQ0FBQztBQUVqQyxjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLGNBQWMsc0JBQXNCLENBQUM7QUFDckMsY0FBYyx5QkFBeUIsQ0FBQztBQUN4QyxPQUFPLEVBQUUsZUFBZSxFQUFjLE1BQU0seUJBQXlCLENBQUM7QUFDdEUsY0FBYyx1QkFBdUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7XG4gIHdpdGhEZXZ0b29scyxcbiAgcGF0Y2hTdGF0ZSxcbiAgdXBkYXRlU3RhdGUsXG4gIEFjdGlvbixcbn0gZnJvbSAnLi9saWIvd2l0aC1kZXZ0b29scyc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi93aXRoLXJlZHV4JztcblxuZXhwb3J0ICogZnJvbSAnLi9saWIvd2l0aC1jYWxsLXN0YXRlJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3dpdGgtdW5kby1yZWRvJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3dpdGgtZGF0YS1zZXJ2aWNlJztcbmV4cG9ydCB7IHdpdGhTdG9yYWdlU3luYywgU3luY0NvbmZpZyB9IGZyb20gJy4vbGliL3dpdGgtc3RvcmFnZS1zeW5jJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3dpdGgtcGFnaW5hdGlvbic7XG4iXX0=
@@ -1,6 +0,0 @@
1
- export function assertActionFnSpecs(obj) {
2
- if (!obj || typeof obj !== 'object') {
3
- throw new Error('%o is not an Action Specification');
4
- }
5
- }
6
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXJ0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvbmdyeC10b29sa2l0L3NyYy9saWIvYXNzZXJ0aW9ucy9hc3NlcnRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE1BQU0sVUFBVSxtQkFBbUIsQ0FDakMsR0FBWTtJQUVaLElBQUksQ0FBQyxHQUFHLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDcEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWN0aW9uc0ZuU3BlY3MgfSBmcm9tICcuLi93aXRoLXJlZHV4JztcblxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEFjdGlvbkZuU3BlY3MoXG4gIG9iajogdW5rbm93blxuKTogYXNzZXJ0cyBvYmogaXMgQWN0aW9uc0ZuU3BlY3Mge1xuICBpZiAoIW9iaiB8fCB0eXBlb2Ygb2JqICE9PSAnb2JqZWN0Jykge1xuICAgIHRocm93IG5ldyBFcnJvcignJW8gaXMgbm90IGFuIEFjdGlvbiBTcGVjaWZpY2F0aW9uJyk7XG4gIH1cbn1cbiJdfQ==
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJldHRpZnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL25ncngtdG9vbGtpdC9zcmMvbGliL3NoYXJlZC9wcmV0dGlmeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHR5cGUgUHJldHRpZnk8VHlwZSBleHRlbmRzIHt9PiA9IHtcbiAgW0tleSBpbiBrZXlvZiBUeXBlXTogVHlwZVtLZXldO1xufTtcbiJdfQ==
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbmFsLXN0b3JlLW1vZGVscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvbmdyeC10b29sa2l0L3NyYy9saWIvc2hhcmVkL3NpZ25hbC1zdG9yZS1tb2RlbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVGhpcyBmaWxlIGNvbnRhaW5zIGNvcGllcyBvZiB0eXBlcyBvZiB0aGUgU2lnbmFsIFN0b3JlIHdoaWNoIGFyZSBub3QgcHVibGljLlxuICpcbiAqIFNpbmNlIGNlcnRhaW4gZmVhdHVyZXMgZGVwZW5kIG9uIHRoZW0sIGlmIHdlIGRvbid0IHdhbnQgdG8gYnJlYWtcbiAqIHRoZSBlbmNhcHN1bGF0aW9uIG9mIEBuZ3J4L3NpZ25hbHMsIHdlIGRlY2lkZWQgdG8gY29weSB0aGVtLlxuICpcbiAqIFNpbmNlIFR5cGVTY3JpcHQgaXMgYmFzZWQgb24gc3RydWN0dXJhbCB0eXBpbmcsIHdlIGNhbiBnZXQgYXdheSB3aXRoIGl0LlxuICpcbiAqIElmIEBuZ3J4L3NpZ25hbHMgY2hhbmdlcyBpdHMgaW50ZXJuYWwgdHlwZXMsIHdlIGNhdGNoIHRoZW0gdmlhIGludGVncmF0aW9uXG4gKiB0ZXN0cy5cbiAqXG4gKiBCZWNhdXNlIG9mIHRoZSBcInRpZ2h0IGNvdXBsaW5nXCIsIHRoZSB0b29sa2l0IGRvZXNuJ3QgaGF2ZSB2ZXJzaW9uIHJhbmdlXG4gKiB0byBAbmdyeC9zaWduYWwsIGJ1dCBpcyB2ZXJ5IHByZWNpc2UuXG4gKi9cbmltcG9ydCB7IFNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRW50aXR5SWQgfSBmcm9tICdAbmdyeC9zaWduYWxzL2VudGl0aWVzJztcblxuLy8gd2l0aEVudGl0ZXMgbW9kZWxzXG5leHBvcnQgdHlwZSBFbnRpdHlTdGF0ZTxFbnRpdHk+ID0ge1xuICBlbnRpdHlNYXA6IFJlY29yZDxFbnRpdHlJZCwgRW50aXR5PjtcbiAgaWRzOiBFbnRpdHlJZFtdO1xufTtcblxuZXhwb3J0IHR5cGUgRW50aXR5Q29tcHV0ZWQ8RW50aXR5PiA9IHtcbiAgZW50aXRpZXM6IFNpZ25hbDxFbnRpdHlbXT47XG59O1xuXG5leHBvcnQgdHlwZSBOYW1lZEVudGl0eUNvbXB1dGVkPEVudGl0eSwgQ29sbGVjdGlvbiBleHRlbmRzIHN0cmluZz4gPSB7XG4gIFtLIGluIGtleW9mIEVudGl0eUNvbXB1dGVkPEVudGl0eT4gYXMgYCR7Q29sbGVjdGlvbn0ke0NhcGl0YWxpemU8Sz59YF06IEVudGl0eUNvbXB1dGVkPEVudGl0eT5bS107XG59O1xuIl19
@@ -1,60 +0,0 @@
1
- import { computed } from '@angular/core';
2
- import { signalStoreFeature, withComputed, withState, } from '@ngrx/signals';
3
- export function getCallStateKeys(config) {
4
- const prop = config?.collection;
5
- return {
6
- callStateKey: prop ? `${config.collection}CallState` : 'callState',
7
- loadingKey: prop ? `${config.collection}Loading` : 'loading',
8
- loadedKey: prop ? `${config.collection}Loaded` : 'loaded',
9
- errorKey: prop ? `${config.collection}Error` : 'error',
10
- };
11
- }
12
- export function withCallState(config) {
13
- const { callStateKey, errorKey, loadedKey, loadingKey } = getCallStateKeys(config);
14
- return signalStoreFeature(withState({ [callStateKey]: 'init' }), withComputed((state) => {
15
- const callState = state[callStateKey];
16
- return {
17
- [loadingKey]: computed(() => callState() === 'loading'),
18
- [loadedKey]: computed(() => callState() === 'loaded'),
19
- [errorKey]: computed(() => {
20
- const v = callState();
21
- return typeof v === 'object' ? v.error : null;
22
- }),
23
- };
24
- }));
25
- }
26
- export function setLoading(prop) {
27
- if (prop) {
28
- return { [`${prop}CallState`]: 'loading' };
29
- }
30
- return { callState: 'loading' };
31
- }
32
- export function setLoaded(prop) {
33
- if (prop) {
34
- return { [`${prop}CallState`]: 'loaded' };
35
- }
36
- else {
37
- return { callState: 'loaded' };
38
- }
39
- }
40
- export function setError(error, prop) {
41
- let errorMessage;
42
- if (!error) {
43
- errorMessage = '';
44
- }
45
- else if (typeof error === 'object' && 'message' in error) {
46
- errorMessage = String(error.message);
47
- }
48
- else {
49
- errorMessage = String(error);
50
- }
51
- if (prop) {
52
- return {
53
- [`${prop}CallState`]: { error: errorMessage },
54
- };
55
- }
56
- else {
57
- return { callState: { error: errorMessage } };
58
- }
59
- }
60
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0aC1jYWxsLXN0YXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9uZ3J4LXRvb2xraXQvc3JjL2xpYi93aXRoLWNhbGwtc3RhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFVLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRCxPQUFPLEVBR0wsa0JBQWtCLEVBQ2xCLFlBQVksRUFDWixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUEwQnZCLE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxNQUFnQztJQUMvRCxNQUFNLElBQUksR0FBRyxNQUFNLEVBQUUsVUFBVSxDQUFDO0lBQ2hDLE9BQU87UUFDTCxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxVQUFVLFdBQVcsQ0FBQyxDQUFDLENBQUMsV0FBVztRQUNsRSxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxVQUFVLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUztRQUM1RCxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxVQUFVLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUTtRQUN6RCxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxVQUFVLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTztLQUN2RCxDQUFDO0FBQ0osQ0FBQztBQWtCRCxNQUFNLFVBQVUsYUFBYSxDQUE0QixNQUV4RDtJQUNDLE1BQU0sRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsR0FDckQsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFM0IsT0FBTyxrQkFBa0IsQ0FDdkIsU0FBUyxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUNyQyxZQUFZLENBQUMsQ0FBQyxLQUFzQyxFQUFFLEVBQUU7UUFDdEQsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLFlBQVksQ0FBc0IsQ0FBQztRQUUzRCxPQUFPO1lBQ0wsQ0FBQyxVQUFVLENBQUMsRUFBRSxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsU0FBUyxFQUFFLEtBQUssU0FBUyxDQUFDO1lBQ3ZELENBQUMsU0FBUyxDQUFDLEVBQUUsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsRUFBRSxLQUFLLFFBQVEsQ0FBQztZQUNyRCxDQUFDLFFBQVEsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxHQUFHLEVBQUU7Z0JBQ3hCLE1BQU0sQ0FBQyxHQUFHLFNBQVMsRUFBRSxDQUFDO2dCQUN0QixPQUFPLE9BQU8sQ0FBQyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQ2hELENBQUMsQ0FBQztTQUNILENBQUM7SUFDSixDQUFDLENBQUMsQ0FDSCxDQUFDO0FBQ0osQ0FBQztBQUVELE1BQU0sVUFBVSxVQUFVLENBQ3hCLElBQVc7SUFFWCxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ1QsT0FBTyxFQUFFLENBQUMsR0FBRyxJQUFJLFdBQVcsQ0FBQyxFQUFFLFNBQVMsRUFBd0IsQ0FBQztJQUNuRSxDQUFDO0lBRUQsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQXdCLENBQUM7QUFDeEQsQ0FBQztBQUVELE1BQU0sVUFBVSxTQUFTLENBQ3ZCLElBQVc7SUFFWCxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ1QsT0FBTyxFQUFFLENBQUMsR0FBRyxJQUFJLFdBQVcsQ0FBQyxFQUFFLFFBQVEsRUFBd0IsQ0FBQztJQUNsRSxDQUFDO1NBQU0sQ0FBQztRQUNOLE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUF3QixDQUFDO0lBQ3ZELENBQUM7QUFDSCxDQUFDO0FBRUQsTUFBTSxVQUFVLFFBQVEsQ0FDdEIsS0FBYyxFQUNkLElBQVc7SUFFWCxJQUFJLFlBQW9CLENBQUM7SUFFekIsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ1gsWUFBWSxHQUFHLEVBQUUsQ0FBQztJQUNwQixDQUFDO1NBQU0sSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksU0FBUyxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQzNELFlBQVksR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7U0FBTSxDQUFDO1FBQ04sWUFBWSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUNULE9BQU87WUFDTCxDQUFDLEdBQUcsSUFBSSxXQUFXLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUU7U0FDeEIsQ0FBQztJQUMxQixDQUFDO1NBQU0sQ0FBQztRQUNOLE9BQU8sRUFBRSxTQUFTLEVBQUUsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLEVBQXdCLENBQUM7SUFDdEUsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTaWduYWwsIGNvbXB1dGVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBFbXB0eUZlYXR1cmVSZXN1bHQsXG4gIFNpZ25hbFN0b3JlRmVhdHVyZSxcbiAgc2lnbmFsU3RvcmVGZWF0dXJlLFxuICB3aXRoQ29tcHV0ZWQsXG4gIHdpdGhTdGF0ZSxcbn0gZnJvbSAnQG5ncngvc2lnbmFscyc7XG5cbmV4cG9ydCB0eXBlIENhbGxTdGF0ZSA9ICdpbml0JyB8ICdsb2FkaW5nJyB8ICdsb2FkZWQnIHwgeyBlcnJvcjogc3RyaW5nIH07XG5cbmV4cG9ydCB0eXBlIENhbGxTdGF0ZVNsaWNlID0ge1xuICBjYWxsU3RhdGU6IENhbGxTdGF0ZTtcbn07XG5cbmV4cG9ydCB0eXBlIE5hbWVkQ2FsbFN0YXRlU2xpY2U8Q29sbGVjdGlvbiBleHRlbmRzIHN0cmluZz4gPSB7XG4gIFtLIGluIGtleW9mIENhbGxTdGF0ZVNsaWNlIGFzIGAke0NvbGxlY3Rpb259JHtDYXBpdGFsaXplPEs+fWBdOiBDYWxsU3RhdGVTbGljZVtLXTtcbn07XG5cbmV4cG9ydCB0eXBlIENhbGxTdGF0ZVNpZ25hbHMgPSB7XG4gIGxvYWRpbmc6IFNpZ25hbDxib29sZWFuPjtcbiAgbG9hZGVkOiBTaWduYWw8Ym9vbGVhbj47XG4gIGVycm9yOiBTaWduYWw8c3RyaW5nIHwgbnVsbD47XG59O1xuXG5leHBvcnQgdHlwZSBOYW1lZENhbGxTdGF0ZVNpZ25hbHM8UHJvcCBleHRlbmRzIHN0cmluZz4gPSB7XG4gIFtLIGluIGtleW9mIENhbGxTdGF0ZVNpZ25hbHMgYXMgYCR7UHJvcH0ke0NhcGl0YWxpemU8Sz59YF06IENhbGxTdGF0ZVNpZ25hbHNbS107XG59O1xuXG5leHBvcnQgdHlwZSBTZXRDYWxsU3RhdGU8UHJvcCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZD4gPSBQcm9wIGV4dGVuZHMgc3RyaW5nXG4gID8gTmFtZWRDYWxsU3RhdGVTbGljZTxQcm9wPlxuICA6IENhbGxTdGF0ZVNsaWNlO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2FsbFN0YXRlS2V5cyhjb25maWc/OiB7IGNvbGxlY3Rpb24/OiBzdHJpbmcgfSkge1xuICBjb25zdCBwcm9wID0gY29uZmlnPy5jb2xsZWN0aW9uO1xuICByZXR1cm4ge1xuICAgIGNhbGxTdGF0ZUtleTogcHJvcCA/IGAke2NvbmZpZy5jb2xsZWN0aW9ufUNhbGxTdGF0ZWAgOiAnY2FsbFN0YXRlJyxcbiAgICBsb2FkaW5nS2V5OiBwcm9wID8gYCR7Y29uZmlnLmNvbGxlY3Rpb259TG9hZGluZ2AgOiAnbG9hZGluZycsXG4gICAgbG9hZGVkS2V5OiBwcm9wID8gYCR7Y29uZmlnLmNvbGxlY3Rpb259TG9hZGVkYCA6ICdsb2FkZWQnLFxuICAgIGVycm9yS2V5OiBwcm9wID8gYCR7Y29uZmlnLmNvbGxlY3Rpb259RXJyb3JgIDogJ2Vycm9yJyxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdpdGhDYWxsU3RhdGU8Q29sbGVjdGlvbiBleHRlbmRzIHN0cmluZz4oY29uZmlnOiB7XG4gIGNvbGxlY3Rpb246IENvbGxlY3Rpb247XG59KTogU2lnbmFsU3RvcmVGZWF0dXJlPFxuICBFbXB0eUZlYXR1cmVSZXN1bHQsXG4gIEVtcHR5RmVhdHVyZVJlc3VsdCAmIHtcbiAgICBzdGF0ZTogTmFtZWRDYWxsU3RhdGVTbGljZTxDb2xsZWN0aW9uPjtcbiAgICBjb21wdXRlZDogTmFtZWRDYWxsU3RhdGVTaWduYWxzPENvbGxlY3Rpb24+O1xuICB9XG4+O1xuZXhwb3J0IGZ1bmN0aW9uIHdpdGhDYWxsU3RhdGUoKTogU2lnbmFsU3RvcmVGZWF0dXJlPFxuICBFbXB0eUZlYXR1cmVSZXN1bHQsXG4gIEVtcHR5RmVhdHVyZVJlc3VsdCAmIHtcbiAgICBzdGF0ZTogQ2FsbFN0YXRlU2xpY2U7XG4gICAgY29tcHV0ZWQ6IENhbGxTdGF0ZVNpZ25hbHM7XG4gIH1cbj47XG5leHBvcnQgZnVuY3Rpb24gd2l0aENhbGxTdGF0ZTxDb2xsZWN0aW9uIGV4dGVuZHMgc3RyaW5nPihjb25maWc/OiB7XG4gIGNvbGxlY3Rpb246IENvbGxlY3Rpb247XG59KTogU2lnbmFsU3RvcmVGZWF0dXJlIHtcbiAgY29uc3QgeyBjYWxsU3RhdGVLZXksIGVycm9yS2V5LCBsb2FkZWRLZXksIGxvYWRpbmdLZXkgfSA9XG4gICAgZ2V0Q2FsbFN0YXRlS2V5cyhjb25maWcpO1xuXG4gIHJldHVybiBzaWduYWxTdG9yZUZlYXR1cmUoXG4gICAgd2l0aFN0YXRlKHsgW2NhbGxTdGF0ZUtleV06ICdpbml0JyB9KSxcbiAgICB3aXRoQ29tcHV0ZWQoKHN0YXRlOiBSZWNvcmQ8c3RyaW5nLCBTaWduYWw8dW5rbm93bj4+KSA9PiB7XG4gICAgICBjb25zdCBjYWxsU3RhdGUgPSBzdGF0ZVtjYWxsU3RhdGVLZXldIGFzIFNpZ25hbDxDYWxsU3RhdGU+O1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBbbG9hZGluZ0tleV06IGNvbXB1dGVkKCgpID0+IGNhbGxTdGF0ZSgpID09PSAnbG9hZGluZycpLFxuICAgICAgICBbbG9hZGVkS2V5XTogY29tcHV0ZWQoKCkgPT4gY2FsbFN0YXRlKCkgPT09ICdsb2FkZWQnKSxcbiAgICAgICAgW2Vycm9yS2V5XTogY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHYgPSBjYWxsU3RhdGUoKTtcbiAgICAgICAgICByZXR1cm4gdHlwZW9mIHYgPT09ICdvYmplY3QnID8gdi5lcnJvciA6IG51bGw7XG4gICAgICAgIH0pLFxuICAgICAgfTtcbiAgICB9KVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0TG9hZGluZzxQcm9wIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkPihcbiAgcHJvcD86IFByb3Bcbik6IFNldENhbGxTdGF0ZTxQcm9wPiB7XG4gIGlmIChwcm9wKSB7XG4gICAgcmV0dXJuIHsgW2Ake3Byb3B9Q2FsbFN0YXRlYF06ICdsb2FkaW5nJyB9IGFzIFNldENhbGxTdGF0ZTxQcm9wPjtcbiAgfVxuXG4gIHJldHVybiB7IGNhbGxTdGF0ZTogJ2xvYWRpbmcnIH0gYXMgU2V0Q2FsbFN0YXRlPFByb3A+O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0TG9hZGVkPFByb3AgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ+KFxuICBwcm9wPzogUHJvcFxuKTogU2V0Q2FsbFN0YXRlPFByb3A+IHtcbiAgaWYgKHByb3ApIHtcbiAgICByZXR1cm4geyBbYCR7cHJvcH1DYWxsU3RhdGVgXTogJ2xvYWRlZCcgfSBhcyBTZXRDYWxsU3RhdGU8UHJvcD47XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHsgY2FsbFN0YXRlOiAnbG9hZGVkJyB9IGFzIFNldENhbGxTdGF0ZTxQcm9wPjtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0RXJyb3I8UHJvcCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZD4oXG4gIGVycm9yOiB1bmtub3duLFxuICBwcm9wPzogUHJvcFxuKTogU2V0Q2FsbFN0YXRlPFByb3A+IHtcbiAgbGV0IGVycm9yTWVzc2FnZTogc3RyaW5nO1xuXG4gIGlmICghZXJyb3IpIHtcbiAgICBlcnJvck1lc3NhZ2UgPSAnJztcbiAgfSBlbHNlIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmICdtZXNzYWdlJyBpbiBlcnJvcikge1xuICAgIGVycm9yTWVzc2FnZSA9IFN0cmluZyhlcnJvci5tZXNzYWdlKTtcbiAgfSBlbHNlIHtcbiAgICBlcnJvck1lc3NhZ2UgPSBTdHJpbmcoZXJyb3IpO1xuICB9XG5cbiAgaWYgKHByb3ApIHtcbiAgICByZXR1cm4ge1xuICAgICAgW2Ake3Byb3B9Q2FsbFN0YXRlYF06IHsgZXJyb3I6IGVycm9yTWVzc2FnZSB9LFxuICAgIH0gYXMgU2V0Q2FsbFN0YXRlPFByb3A+O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB7IGNhbGxTdGF0ZTogeyBlcnJvcjogZXJyb3JNZXNzYWdlIH0gfSBhcyBTZXRDYWxsU3RhdGU8UHJvcD47XG4gIH1cbn1cbiJdfQ==