@angular-architects/ngrx-toolkit 0.0.2 → 0.0.4

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.
@@ -1,7 +1,8 @@
1
- import { patchState as patchState$1 } from '@ngrx/signals';
2
- import { signal, effect, PLATFORM_ID, inject } from '@angular/core';
1
+ import { patchState as patchState$1, withState, withComputed, signalStoreFeature, withMethods, withHooks } from '@ngrx/signals';
2
+ import { signal, effect, PLATFORM_ID, inject, computed, isSignal, untracked } from '@angular/core';
3
3
  import { isPlatformServer } from '@angular/common';
4
4
  import { Subject } from 'rxjs';
5
+ import { setAllEntities, addEntity, updateEntity, removeEntity } from '@ngrx/signals/entities';
5
6
 
6
7
  const storeRegistry = signal({});
7
8
  let currentActionNames = new Set();
@@ -178,9 +179,312 @@ function withRedux(redux) {
178
179
  };
179
180
  }
180
181
 
182
+ function getCallStateKeys(config) {
183
+ const prop = config?.collection;
184
+ return {
185
+ callStateKey: prop ? `${config.collection}CallState` : 'callState',
186
+ loadingKey: prop ? `${config.collection}Loading` : 'loading',
187
+ loadedKey: prop ? `${config.collection}Loaded` : 'loaded',
188
+ errorKey: prop ? `${config.collection}Error` : 'error',
189
+ };
190
+ }
191
+ function withCallState(config) {
192
+ const { callStateKey, errorKey, loadedKey, loadingKey } = getCallStateKeys(config);
193
+ return signalStoreFeature(withState({ [callStateKey]: 'init' }), withComputed((state) => {
194
+ const callState = state[callStateKey];
195
+ return {
196
+ [loadingKey]: computed(() => callState() === 'loading'),
197
+ [loadedKey]: computed(() => callState() === 'loaded'),
198
+ [errorKey]: computed(() => {
199
+ const v = callState();
200
+ return typeof v === 'object' ? v.error : null;
201
+ })
202
+ };
203
+ }));
204
+ }
205
+ function setLoading(prop) {
206
+ if (prop) {
207
+ return { [`${prop}CallState`]: 'loading' };
208
+ }
209
+ return { callState: 'loading' };
210
+ }
211
+ function setLoaded(prop) {
212
+ if (prop) {
213
+ return { [`${prop}CallState`]: 'loaded' };
214
+ }
215
+ else {
216
+ return { callState: 'loaded' };
217
+ }
218
+ }
219
+ function setError(error, prop) {
220
+ let errorMessage = '';
221
+ if (!error) {
222
+ errorMessage = '';
223
+ }
224
+ else if (typeof error === 'object' && 'message' in error) {
225
+ errorMessage = String(error.message);
226
+ }
227
+ else {
228
+ errorMessage = String(error);
229
+ }
230
+ if (prop) {
231
+ return { [`${prop}CallState`]: { error: errorMessage } };
232
+ }
233
+ else {
234
+ return { callState: { error: errorMessage } };
235
+ }
236
+ }
237
+
238
+ function capitalize(str) {
239
+ return str ? str[0].toUpperCase() + str.substring(1) : str;
240
+ }
241
+ function getDataServiceKeys(options) {
242
+ const filterKey = options.collection ? `${options.collection}Filter` : 'filter';
243
+ const selectedIdsKey = options.collection ? `selected${capitalize(options.collection)}Ids` : 'selectedIds';
244
+ const selectedEntitiesKey = options.collection ? `selected${capitalize(options.collection)}Entities` : 'selectedEntities';
245
+ const updateFilterKey = options.collection ? `update${capitalize(options.collection)}Filter` : 'updateFilter';
246
+ const updateSelectedKey = options.collection ? `updateSelected${capitalize(options.collection)}Entities` : 'updateSelected';
247
+ const loadKey = options.collection ? `load${capitalize(options.collection)}Entities` : 'load';
248
+ const currentKey = options.collection ? `current${capitalize(options.collection)}` : 'current';
249
+ const loadByIdKey = options.collection ? `load${capitalize(options.collection)}ById` : 'loadById';
250
+ const setCurrentKey = options.collection ? `setCurrent${capitalize(options.collection)}` : 'setCurrent';
251
+ const createKey = options.collection ? `create${capitalize(options.collection)}` : 'create';
252
+ const updateKey = options.collection ? `update${capitalize(options.collection)}` : 'update';
253
+ const updateAllKey = options.collection ? `updateAll${capitalize(options.collection)}` : 'updateAll';
254
+ const deleteKey = options.collection ? `delete${capitalize(options.collection)}` : 'delete';
255
+ // TODO: Take these from @ngrx/signals/entities, when they are exported
256
+ const entitiesKey = options.collection ? `${options.collection}Entities` : 'entities';
257
+ const entityMapKey = options.collection ? `${options.collection}EntityMap` : 'entityMap';
258
+ const idsKey = options.collection ? `${options.collection}Ids` : 'ids';
259
+ return {
260
+ filterKey,
261
+ selectedIdsKey,
262
+ selectedEntitiesKey,
263
+ updateFilterKey,
264
+ updateSelectedKey,
265
+ loadKey,
266
+ entitiesKey,
267
+ entityMapKey,
268
+ idsKey,
269
+ currentKey,
270
+ loadByIdKey,
271
+ setCurrentKey,
272
+ createKey,
273
+ updateKey,
274
+ updateAllKey,
275
+ deleteKey
276
+ };
277
+ }
278
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
279
+ function withDataService(options) {
280
+ const { dataServiceType, filter, collection: prefix } = options;
281
+ const { entitiesKey, filterKey, loadKey, selectedEntitiesKey, selectedIdsKey, updateFilterKey, updateSelectedKey, currentKey, createKey, updateKey, updateAllKey, deleteKey, loadByIdKey, setCurrentKey } = getDataServiceKeys(options);
282
+ const { callStateKey } = getCallStateKeys({ collection: prefix });
283
+ return signalStoreFeature(withState(() => ({
284
+ [filterKey]: filter,
285
+ [selectedIdsKey]: {},
286
+ [currentKey]: undefined
287
+ })), withComputed((store) => {
288
+ const entities = store[entitiesKey];
289
+ const selectedIds = store[selectedIdsKey];
290
+ return {
291
+ [selectedEntitiesKey]: computed(() => entities().filter(e => selectedIds()[e.id]))
292
+ };
293
+ }), withMethods((store) => {
294
+ const dataService = inject(dataServiceType);
295
+ return {
296
+ [updateFilterKey]: (filter) => {
297
+ patchState$1(store, { [filterKey]: filter });
298
+ },
299
+ [updateSelectedKey]: (id, selected) => {
300
+ patchState$1(store, (state) => ({
301
+ [selectedIdsKey]: {
302
+ ...state[selectedIdsKey],
303
+ [id]: selected,
304
+ }
305
+ }));
306
+ },
307
+ [loadKey]: async () => {
308
+ const filter = store[filterKey];
309
+ store[callStateKey] && patchState$1(store, setLoading(prefix));
310
+ try {
311
+ const result = await dataService.load(filter());
312
+ patchState$1(store, prefix ? setAllEntities(result, { collection: prefix }) : setAllEntities(result));
313
+ store[callStateKey] && patchState$1(store, setLoaded(prefix));
314
+ }
315
+ catch (e) {
316
+ store[callStateKey] && patchState$1(store, setError(e, prefix));
317
+ throw e;
318
+ }
319
+ },
320
+ [loadByIdKey]: async (id) => {
321
+ store[callStateKey] && patchState$1(store, setLoading(prefix));
322
+ try {
323
+ const current = await dataService.loadById(id);
324
+ store[callStateKey] && patchState$1(store, setLoaded(prefix));
325
+ patchState$1(store, { [currentKey]: current });
326
+ }
327
+ catch (e) {
328
+ store[callStateKey] && patchState$1(store, setError(e, prefix));
329
+ throw e;
330
+ }
331
+ },
332
+ [setCurrentKey]: (current) => {
333
+ patchState$1(store, { [currentKey]: current });
334
+ },
335
+ [createKey]: async (entity) => {
336
+ patchState$1(store, { [currentKey]: entity });
337
+ store[callStateKey] && patchState$1(store, setLoading(prefix));
338
+ try {
339
+ const created = await dataService.create(entity);
340
+ patchState$1(store, { [currentKey]: created });
341
+ patchState$1(store, prefix ? addEntity(created, { collection: prefix }) : addEntity(created));
342
+ store[callStateKey] && patchState$1(store, setLoaded(prefix));
343
+ }
344
+ catch (e) {
345
+ store[callStateKey] && patchState$1(store, setError(e, prefix));
346
+ throw e;
347
+ }
348
+ },
349
+ [updateKey]: async (entity) => {
350
+ patchState$1(store, { [currentKey]: entity });
351
+ store[callStateKey] && patchState$1(store, setLoading(prefix));
352
+ try {
353
+ const updated = await dataService.update(entity);
354
+ patchState$1(store, { [currentKey]: updated });
355
+ // Why do we need this cast to Partial<Entity>?
356
+ const updateArg = { id: updated.id, changes: updated };
357
+ patchState$1(store, prefix ? updateEntity(updateArg, { collection: prefix }) : updateEntity(updateArg));
358
+ store[callStateKey] && patchState$1(store, setLoaded(prefix));
359
+ }
360
+ catch (e) {
361
+ store[callStateKey] && patchState$1(store, setError(e, prefix));
362
+ throw e;
363
+ }
364
+ },
365
+ [updateAllKey]: async (entities) => {
366
+ store[callStateKey] && patchState$1(store, setLoading(prefix));
367
+ try {
368
+ const result = await dataService.updateAll(entities);
369
+ patchState$1(store, prefix ? setAllEntities(result, { collection: prefix }) : setAllEntities(result));
370
+ store[callStateKey] && patchState$1(store, setLoaded(prefix));
371
+ }
372
+ catch (e) {
373
+ store[callStateKey] && patchState$1(store, setError(e, prefix));
374
+ throw e;
375
+ }
376
+ },
377
+ [deleteKey]: async (entity) => {
378
+ patchState$1(store, { [currentKey]: entity });
379
+ store[callStateKey] && patchState$1(store, setLoading(prefix));
380
+ try {
381
+ await dataService.delete(entity);
382
+ patchState$1(store, { [currentKey]: undefined });
383
+ patchState$1(store, prefix ? removeEntity(entity.id, { collection: prefix }) : removeEntity(entity.id));
384
+ store[callStateKey] && patchState$1(store, setLoaded(prefix));
385
+ }
386
+ catch (e) {
387
+ store[callStateKey] && patchState$1(store, setError(e, prefix));
388
+ throw e;
389
+ }
390
+ },
391
+ };
392
+ }));
393
+ }
394
+
395
+ const defaultOptions = {
396
+ maxStackSize: 100
397
+ };
398
+ function getUndoRedoKeys(collections) {
399
+ if (collections) {
400
+ return collections.flatMap(c => [`${c}EntityMap`, `${c}Ids`, `selected${capitalize(c)}Ids`, `${c}Filter`]);
401
+ }
402
+ return ['entityMap', 'ids', 'selectedIds', 'filter'];
403
+ }
404
+ function withUndoRedo(options = {}) {
405
+ let previous = null;
406
+ let skipOnce = false;
407
+ const normalized = {
408
+ ...defaultOptions,
409
+ ...options
410
+ };
411
+ //
412
+ // Design Decision: This feature has its own
413
+ // internal state.
414
+ //
415
+ const undoStack = [];
416
+ const redoStack = [];
417
+ const canUndo = signal(false);
418
+ const canRedo = signal(false);
419
+ const updateInternal = () => {
420
+ canUndo.set(undoStack.length !== 0);
421
+ canRedo.set(redoStack.length !== 0);
422
+ };
423
+ const keys = getUndoRedoKeys(normalized?.collections);
424
+ return signalStoreFeature(withComputed(() => ({
425
+ canUndo: canUndo.asReadonly(),
426
+ canRedo: canRedo.asReadonly()
427
+ })), withMethods((store) => ({
428
+ undo() {
429
+ const item = undoStack.pop();
430
+ if (item && previous) {
431
+ redoStack.push(previous);
432
+ }
433
+ if (item) {
434
+ skipOnce = true;
435
+ patchState$1(store, item);
436
+ previous = item;
437
+ }
438
+ updateInternal();
439
+ },
440
+ redo() {
441
+ const item = redoStack.pop();
442
+ if (item && previous) {
443
+ undoStack.push(previous);
444
+ }
445
+ if (item) {
446
+ skipOnce = true;
447
+ patchState$1(store, item);
448
+ previous = item;
449
+ }
450
+ updateInternal();
451
+ }
452
+ })), withHooks({
453
+ onInit(store) {
454
+ effect(() => {
455
+ const cand = keys.reduce((acc, key) => {
456
+ const s = store[key];
457
+ if (s && isSignal(s)) {
458
+ return {
459
+ ...acc,
460
+ [key]: s()
461
+ };
462
+ }
463
+ return acc;
464
+ }, {});
465
+ if (skipOnce) {
466
+ skipOnce = false;
467
+ return;
468
+ }
469
+ // Clear redoStack after recorded action
470
+ redoStack.splice(0);
471
+ if (previous) {
472
+ undoStack.push(previous);
473
+ }
474
+ if (redoStack.length > normalized.maxStackSize) {
475
+ undoStack.unshift();
476
+ }
477
+ previous = cand;
478
+ // Don't propogate current reactive context
479
+ untracked(() => updateInternal());
480
+ });
481
+ }
482
+ }));
483
+ }
484
+
181
485
  /**
182
486
  * Generated bundle index. Do not edit.
183
487
  */
184
488
 
185
- export { noPayload, patchState, payload, withDevtools, withRedux };
489
+ export { capitalize, getCallStateKeys, getDataServiceKeys, getUndoRedoKeys, noPayload, patchState, payload, setError, setLoaded, setLoading, withCallState, withDataService, withDevtools, withRedux, withUndoRedo };
186
490
  //# sourceMappingURL=angular-architects-ngrx-toolkit.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"angular-architects-ngrx-toolkit.mjs","sources":["../../../../libs/ngrx-toolkit/src/lib/with-devtools.ts","../../../../libs/ngrx-toolkit/src/lib/assertions/assertions.ts","../../../../libs/ngrx-toolkit/src/lib/with-redux.ts","../../../../libs/ngrx-toolkit/src/angular-architects-ngrx-toolkit.ts"],"sourcesContent":["import {\n patchState as originalPatchState,\n SignalStoreFeature,\n} from '@ngrx/signals';\nimport { SignalStoreFeatureResult } from '@ngrx/signals/src/signal-store-models';\nimport { effect, inject, PLATFORM_ID, signal, Signal } from '@angular/core';\nimport { isPlatformServer } from '@angular/common';\n\ndeclare global {\n interface Window {\n __REDUX_DEVTOOLS_EXTENSION__:\n | {\n connect: (options: { name: string }) => {\n send: (action: Action, state: Record<string, unknown>) => void;\n };\n }\n | undefined;\n }\n}\n\ntype EmptyFeatureResult = { state: {}; signals: {}; methods: {} };\nexport type Action = { type: string };\n\nconst storeRegistry = signal<Record<string, Signal<unknown>>>({});\n\nlet currentActionNames = new Set<string>();\n\nlet synchronizationInitialized = false;\n\nfunction initSynchronization() {\n effect(() => {\n if (!connection) {\n return;\n }\n\n const stores = storeRegistry();\n const rootState: Record<string, unknown> = {};\n for (const name in stores) {\n const store = stores[name];\n rootState[name] = store();\n }\n\n const names = Array.from(currentActionNames);\n const type = names.length ? names.join(', ') : 'Store Update';\n currentActionNames = new Set<string>();\n\n connection.send({ type }, rootState);\n });\n}\n\nfunction getValueFromSymbol(obj: unknown, symbol: symbol) {\n if (typeof obj === 'object' && obj && symbol in obj) {\n return (obj as { [key: symbol]: any })[symbol];\n }\n}\n\nfunction getStoreSignal(store: unknown): Signal<unknown> {\n const [signalStateKey] = Object.getOwnPropertySymbols(store);\n if (!signalStateKey) {\n throw new Error('Cannot find State Signal');\n }\n\n return getValueFromSymbol(store, signalStateKey);\n}\n\ntype ConnectResponse = {\n send: (action: Action, state: Record<string, unknown>) => void;\n};\nlet connection: ConnectResponse | undefined;\n\n/**\n * required for testing. is not exported during build\n */\nexport function reset() {\n connection = undefined;\n synchronizationInitialized = false;\n storeRegistry.set({});\n}\n\n/**\n * @param name store's name as it should appear in the DevTools\n */\nexport function withDevtools<Input extends SignalStoreFeatureResult>(\n name: string\n): SignalStoreFeature<Input, EmptyFeatureResult> {\n return (store) => {\n const isServer = isPlatformServer(inject(PLATFORM_ID));\n if (isServer) {\n return store;\n }\n\n const extensions = window.__REDUX_DEVTOOLS_EXTENSION__;\n if (!extensions) {\n return store;\n }\n\n if (!connection) {\n connection = extensions.connect({\n name: 'NgRx Signal Store',\n });\n }\n\n const storeSignal = getStoreSignal(store);\n storeRegistry.update((value) => ({\n ...value,\n [name]: storeSignal,\n }));\n\n if (!synchronizationInitialized) {\n initSynchronization();\n synchronizationInitialized = true;\n }\n\n return store;\n };\n}\n\ntype PatchFn = typeof originalPatchState extends (\n arg1: infer First,\n ...args: infer Rest\n) => infer Returner\n ? (state: First, action: string, ...rest: Rest) => Returner\n : never;\n\nexport const patchState: PatchFn = (state, action, ...rest) => {\n currentActionNames.add(action);\n return originalPatchState(state, ...rest);\n};\n","import { ActionsFnSpecs } from '../with-redux';\n\nexport function assertActionFnSpecs(\n obj: unknown\n): asserts obj is ActionsFnSpecs {\n if (!obj || typeof obj !== 'object') {\n throw new Error('%o is not an Action Specification');\n }\n}\n","import { Observable, Subject, Subscription } from 'rxjs';\nimport { SignalStoreFeature } from '@ngrx/signals';\nimport {\n EmptyFeatureResult,\n SignalStoreFeatureResult,\n} from '@ngrx/signals/src/signal-store-models';\nimport { StateSignal } from '@ngrx/signals/src/state-signal';\nimport { assertActionFnSpecs } from './assertions/assertions';\nimport { effect } from '@angular/core';\n\n/** Actions **/\n\ntype Payload = Record<string, unknown>;\n\ntype ActionFn<\n Type extends string = string,\n ActionPayload extends Payload = Payload\n> = ((payload: ActionPayload) => ActionPayload & { type: Type }) & {\n type: Type;\n};\n\ntype ActionFns = Record<string, ActionFn>;\n\nexport type ActionsFnSpecs = Record<string, Payload>;\n\ntype ActionFnCreator<Spec extends ActionsFnSpecs> = {\n [ActionName in keyof Spec]: ((\n payload: Spec[ActionName]\n ) => Spec[ActionName] & { type: ActionName }) & { type: ActionName & string };\n};\n\ntype ActionFnPayload<Action> = Action extends (payload: infer Payload) => void\n ? Payload\n : never;\n\ntype ActionFnsCreator<Spec extends ActionsFnSpecs> = Spec extends {\n private: Record<string, Payload>;\n public: Record<string, Payload>;\n}\n ? ActionFnCreator<Spec['private']> & ActionFnCreator<Spec['public']>\n : ActionFnCreator<Spec>;\n\ntype PublicActionFns<Spec extends ActionsFnSpecs> = Spec extends {\n public: Record<string, Payload>;\n}\n ? ActionFnCreator<Spec['public']>\n : ActionFnCreator<Spec>;\n\nexport function payload<Type extends Payload>(): Type {\n return {} as Type;\n}\n\nexport const noPayload = {};\n\n/** Reducer **/\n\ntype ReducerFunction<ReducerAction, State> = (\n action: ActionFnPayload<ReducerAction>,\n state: State\n) => void;\n\ntype ReducerFactory<StateActionFns extends ActionFns, State> = (\n actions: StateActionFns,\n on: <ReducerAction extends { type: string }>(\n action: ReducerAction,\n reducerFn: ReducerFunction<ActionFnPayload<ReducerAction>, State>\n ) => void\n) => void;\n\n/** Effect **/\n\ntype EffectsFactory<StateActionFns extends ActionFns> = (\n actions: StateActionFns,\n create: <EffectAction extends { type: string }>(\n action: EffectAction\n ) => Observable<ActionFnPayload<EffectAction>>\n) => Record<string, Observable<unknown>>;\n\nfunction createActionFns<Spec extends ActionsFnSpecs>(\n actionFnSpecs: Spec,\n reducerRegistry: Record<\n string,\n (payload: ActionFnPayload<unknown>, state: unknown) => void\n >,\n effectsRegistry: Record<string, Subject<ActionFnPayload<unknown>>>,\n state: unknown\n) {\n const actionFns: Record<string, ActionFn> = {};\n\n for (const type in actionFnSpecs) {\n const actionFn = (payload: Payload) => {\n const fullPayload = { ...payload, type };\n const reducer = reducerRegistry[type];\n if (reducer) {\n (reducer as (payload: unknown, state: unknown) => void)(\n fullPayload as unknown,\n state\n );\n }\n const effectSubject = effectsRegistry[type];\n if (effectSubject) {\n (effectSubject as unknown as Subject<unknown>).next(fullPayload);\n }\n return fullPayload;\n };\n actionFn.type = type.toString();\n actionFns[type] = actionFn;\n }\n\n return actionFns;\n}\n\nfunction createPublicAndAllActionsFns<Spec extends ActionsFnSpecs>(\n actionFnSpecs: Spec,\n reducerRegistry: Record<\n string,\n (payload: ActionFnPayload<unknown>, state: unknown) => void\n >,\n effectsRegistry: Record<string, Subject<ActionFnPayload<unknown>>>,\n state: unknown\n): { all: ActionFns; publics: ActionFns } {\n if ('public' in actionFnSpecs || 'private' in actionFnSpecs) {\n const privates = actionFnSpecs['private'] || {};\n const publics = actionFnSpecs['public'] || {};\n\n assertActionFnSpecs(privates);\n assertActionFnSpecs(publics);\n\n const privateActionFns = createActionFns(\n privates,\n reducerRegistry,\n effectsRegistry,\n state\n );\n const publicActionFns = createActionFns(\n publics,\n reducerRegistry,\n effectsRegistry,\n state\n );\n\n return {\n all: { ...privateActionFns, ...publicActionFns },\n publics: publicActionFns,\n };\n }\n\n const actionFns = createActionFns(\n actionFnSpecs,\n reducerRegistry,\n effectsRegistry,\n state\n );\n\n return { all: actionFns, publics: actionFns };\n}\n\nfunction fillReducerRegistry(\n reducer: ReducerFactory<ActionFns, unknown>,\n actionFns: ActionFns,\n reducerRegistry: Record<\n string,\n (payload: ActionFnPayload<unknown>, state: unknown) => void\n >\n) {\n function on(\n action: { type: string },\n reducerFn: (payload: ActionFnPayload<unknown>, state: unknown) => void\n ) {\n reducerRegistry[action.type] = reducerFn;\n }\n\n reducer(actionFns, on);\n\n return reducerRegistry;\n}\n\nfunction fillEffects(\n effects: EffectsFactory<ActionFns>,\n actionFns: ActionFns,\n effectsRegistry: Record<string, Subject<ActionFnPayload<unknown>>> = {}\n): Observable<unknown>[] {\n function create(action: { type: string }) {\n const subject = new Subject<ActionFnPayload<unknown>>();\n effectsRegistry[action.type] = subject;\n return subject.asObservable();\n }\n\n const effectObservables = effects(actionFns, create);\n return Object.values(effectObservables);\n}\n\nfunction startSubscriptions(observables: Observable<unknown>[]) {\n return observables.map((observable) => observable.subscribe());\n}\n\nfunction processRedux<Spec extends ActionsFnSpecs, ReturnType>(\n actionFnSpecs: Spec,\n reducer: ReducerFactory<ActionFns, unknown>,\n effects: EffectsFactory<ActionFns>,\n store: unknown\n) {\n const reducerRegistry: Record<\n string,\n (payload: ActionFnPayload<unknown>, state: unknown) => void\n > = {};\n const effectsRegistry: Record<string, Subject<ActionFnPayload<unknown>>> = {};\n const actionsMap = createPublicAndAllActionsFns(\n actionFnSpecs,\n reducerRegistry,\n effectsRegistry,\n store\n );\n const actionFns = actionsMap.all;\n const publicActionsFns = actionsMap.publics;\n\n fillReducerRegistry(reducer, actionFns, reducerRegistry);\n const effectObservables = fillEffects(effects, actionFns, effectsRegistry);\n const subscriptions = startSubscriptions(effectObservables);\n\n return {\n methods: publicActionsFns as ReturnType,\n subscriptions: subscriptions,\n };\n}\n\n/**\n * @param redux redux\n *\n * properties do not start with `with` since they are not extension functions on their own.\n *\n * no dependency to NgRx\n *\n * actions are passed to reducer and effects, but it is also possible to use other actions.\n * effects provide forAction and do not return anything. that is important because effects should stay inaccessible\n */\nexport function withRedux<\n Spec extends ActionsFnSpecs,\n Input extends SignalStoreFeatureResult,\n StateActionFns extends ActionFnsCreator<Spec> = ActionFnsCreator<Spec>,\n PublicStoreActionFns extends PublicActionFns<Spec> = PublicActionFns<Spec>\n>(redux: {\n actions: Spec;\n reducer: ReducerFactory<StateActionFns, StateSignal<Input['state']>>;\n effects: EffectsFactory<StateActionFns>;\n}): SignalStoreFeature<\n Input,\n EmptyFeatureResult & { methods: PublicStoreActionFns }\n> {\n return (store) => {\n const { methods, subscriptions } = processRedux<Spec, PublicStoreActionFns>(\n redux.actions,\n redux.reducer as ReducerFactory<ActionFns, unknown>,\n redux.effects as EffectsFactory<ActionFns>,\n store\n );\n return {\n ...store,\n methods,\n };\n };\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["originalPatchState"],"mappings":"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"}
1
+ {"version":3,"file":"angular-architects-ngrx-toolkit.mjs","sources":["../../../../libs/ngrx-toolkit/src/lib/with-devtools.ts","../../../../libs/ngrx-toolkit/src/lib/assertions/assertions.ts","../../../../libs/ngrx-toolkit/src/lib/with-redux.ts","../../../../libs/ngrx-toolkit/src/lib/with-call-state.ts","../../../../libs/ngrx-toolkit/src/lib/with-data-service.ts","../../../../libs/ngrx-toolkit/src/lib/with-undo-redo.ts","../../../../libs/ngrx-toolkit/src/angular-architects-ngrx-toolkit.ts"],"sourcesContent":["import {\n patchState as originalPatchState,\n SignalStoreFeature,\n} from '@ngrx/signals';\nimport { SignalStoreFeatureResult } from '@ngrx/signals/src/signal-store-models';\nimport { effect, inject, PLATFORM_ID, signal, Signal } from '@angular/core';\nimport { isPlatformServer } from '@angular/common';\n\ndeclare global {\n interface Window {\n __REDUX_DEVTOOLS_EXTENSION__:\n | {\n connect: (options: { name: string }) => {\n send: (action: Action, state: Record<string, unknown>) => void;\n };\n }\n | undefined;\n }\n}\n\ntype EmptyFeatureResult = { state: {}; signals: {}; methods: {} };\nexport type Action = { type: string };\n\nconst storeRegistry = signal<Record<string, Signal<unknown>>>({});\n\nlet currentActionNames = new Set<string>();\n\nlet synchronizationInitialized = false;\n\nfunction initSynchronization() {\n effect(() => {\n if (!connection) {\n return;\n }\n\n const stores = storeRegistry();\n const rootState: Record<string, unknown> = {};\n for (const name in stores) {\n const store = stores[name];\n rootState[name] = store();\n }\n\n const names = Array.from(currentActionNames);\n const type = names.length ? names.join(', ') : 'Store Update';\n currentActionNames = new Set<string>();\n\n connection.send({ type }, rootState);\n });\n}\n\nfunction getValueFromSymbol(obj: unknown, symbol: symbol) {\n if (typeof obj === 'object' && obj && symbol in obj) {\n return (obj as { [key: symbol]: any })[symbol];\n }\n}\n\nfunction getStoreSignal(store: unknown): Signal<unknown> {\n const [signalStateKey] = Object.getOwnPropertySymbols(store);\n if (!signalStateKey) {\n throw new Error('Cannot find State Signal');\n }\n\n return getValueFromSymbol(store, signalStateKey);\n}\n\ntype ConnectResponse = {\n send: (action: Action, state: Record<string, unknown>) => void;\n};\nlet connection: ConnectResponse | undefined;\n\n/**\n * required for testing. is not exported during build\n */\nexport function reset() {\n connection = undefined;\n synchronizationInitialized = false;\n storeRegistry.set({});\n}\n\n/**\n * @param name store's name as it should appear in the DevTools\n */\nexport function withDevtools<Input extends SignalStoreFeatureResult>(\n name: string\n): SignalStoreFeature<Input, EmptyFeatureResult> {\n return (store) => {\n const isServer = isPlatformServer(inject(PLATFORM_ID));\n if (isServer) {\n return store;\n }\n\n const extensions = window.__REDUX_DEVTOOLS_EXTENSION__;\n if (!extensions) {\n return store;\n }\n\n if (!connection) {\n connection = extensions.connect({\n name: 'NgRx Signal Store',\n });\n }\n\n const storeSignal = getStoreSignal(store);\n storeRegistry.update((value) => ({\n ...value,\n [name]: storeSignal,\n }));\n\n if (!synchronizationInitialized) {\n initSynchronization();\n synchronizationInitialized = true;\n }\n\n return store;\n };\n}\n\ntype PatchFn = typeof originalPatchState extends (\n arg1: infer First,\n ...args: infer Rest\n) => infer Returner\n ? (state: First, action: string, ...rest: Rest) => Returner\n : never;\n\nexport const patchState: PatchFn = (state, action, ...rest) => {\n currentActionNames.add(action);\n return originalPatchState(state, ...rest);\n};\n","import { ActionsFnSpecs } from '../with-redux';\n\nexport function assertActionFnSpecs(\n obj: unknown\n): asserts obj is ActionsFnSpecs {\n if (!obj || typeof obj !== 'object') {\n throw new Error('%o is not an Action Specification');\n }\n}\n","import { Observable, Subject, Subscription } from 'rxjs';\nimport { SignalStoreFeature } from '@ngrx/signals';\nimport {\n EmptyFeatureResult,\n SignalStoreFeatureResult,\n} from '@ngrx/signals/src/signal-store-models';\nimport { StateSignal } from '@ngrx/signals/src/state-signal';\nimport { assertActionFnSpecs } from './assertions/assertions';\nimport { effect } from '@angular/core';\n\n/** Actions **/\n\ntype Payload = Record<string, unknown>;\n\ntype ActionFn<\n Type extends string = string,\n ActionPayload extends Payload = Payload\n> = ((payload: ActionPayload) => ActionPayload & { type: Type }) & {\n type: Type;\n};\n\ntype ActionFns = Record<string, ActionFn>;\n\nexport type ActionsFnSpecs = Record<string, Payload>;\n\ntype ActionFnCreator<Spec extends ActionsFnSpecs> = {\n [ActionName in keyof Spec]: ((\n payload: Spec[ActionName]\n ) => Spec[ActionName] & { type: ActionName }) & { type: ActionName & string };\n};\n\ntype ActionFnPayload<Action> = Action extends (payload: infer Payload) => void\n ? Payload\n : never;\n\ntype ActionFnsCreator<Spec extends ActionsFnSpecs> = Spec extends {\n private: Record<string, Payload>;\n public: Record<string, Payload>;\n}\n ? ActionFnCreator<Spec['private']> & ActionFnCreator<Spec['public']>\n : ActionFnCreator<Spec>;\n\ntype PublicActionFns<Spec extends ActionsFnSpecs> = Spec extends {\n public: Record<string, Payload>;\n}\n ? ActionFnCreator<Spec['public']>\n : ActionFnCreator<Spec>;\n\nexport function payload<Type extends Payload>(): Type {\n return {} as Type;\n}\n\nexport const noPayload = {};\n\n/** Reducer **/\n\ntype ReducerFunction<ReducerAction, State> = (\n action: ActionFnPayload<ReducerAction>,\n state: State\n) => void;\n\ntype ReducerFactory<StateActionFns extends ActionFns, State> = (\n actions: StateActionFns,\n on: <ReducerAction extends { type: string }>(\n action: ReducerAction,\n reducerFn: ReducerFunction<ActionFnPayload<ReducerAction>, State>\n ) => void\n) => void;\n\n/** Effect **/\n\ntype EffectsFactory<StateActionFns extends ActionFns> = (\n actions: StateActionFns,\n create: <EffectAction extends { type: string }>(\n action: EffectAction\n ) => Observable<ActionFnPayload<EffectAction>>\n) => Record<string, Observable<unknown>>;\n\nfunction createActionFns<Spec extends ActionsFnSpecs>(\n actionFnSpecs: Spec,\n reducerRegistry: Record<\n string,\n (payload: ActionFnPayload<unknown>, state: unknown) => void\n >,\n effectsRegistry: Record<string, Subject<ActionFnPayload<unknown>>>,\n state: unknown\n) {\n const actionFns: Record<string, ActionFn> = {};\n\n for (const type in actionFnSpecs) {\n const actionFn = (payload: Payload) => {\n const fullPayload = { ...payload, type };\n const reducer = reducerRegistry[type];\n if (reducer) {\n (reducer as (payload: unknown, state: unknown) => void)(\n fullPayload as unknown,\n state\n );\n }\n const effectSubject = effectsRegistry[type];\n if (effectSubject) {\n (effectSubject as unknown as Subject<unknown>).next(fullPayload);\n }\n return fullPayload;\n };\n actionFn.type = type.toString();\n actionFns[type] = actionFn;\n }\n\n return actionFns;\n}\n\nfunction createPublicAndAllActionsFns<Spec extends ActionsFnSpecs>(\n actionFnSpecs: Spec,\n reducerRegistry: Record<\n string,\n (payload: ActionFnPayload<unknown>, state: unknown) => void\n >,\n effectsRegistry: Record<string, Subject<ActionFnPayload<unknown>>>,\n state: unknown\n): { all: ActionFns; publics: ActionFns } {\n if ('public' in actionFnSpecs || 'private' in actionFnSpecs) {\n const privates = actionFnSpecs['private'] || {};\n const publics = actionFnSpecs['public'] || {};\n\n assertActionFnSpecs(privates);\n assertActionFnSpecs(publics);\n\n const privateActionFns = createActionFns(\n privates,\n reducerRegistry,\n effectsRegistry,\n state\n );\n const publicActionFns = createActionFns(\n publics,\n reducerRegistry,\n effectsRegistry,\n state\n );\n\n return {\n all: { ...privateActionFns, ...publicActionFns },\n publics: publicActionFns,\n };\n }\n\n const actionFns = createActionFns(\n actionFnSpecs,\n reducerRegistry,\n effectsRegistry,\n state\n );\n\n return { all: actionFns, publics: actionFns };\n}\n\nfunction fillReducerRegistry(\n reducer: ReducerFactory<ActionFns, unknown>,\n actionFns: ActionFns,\n reducerRegistry: Record<\n string,\n (payload: ActionFnPayload<unknown>, state: unknown) => void\n >\n) {\n function on(\n action: { type: string },\n reducerFn: (payload: ActionFnPayload<unknown>, state: unknown) => void\n ) {\n reducerRegistry[action.type] = reducerFn;\n }\n\n reducer(actionFns, on);\n\n return reducerRegistry;\n}\n\nfunction fillEffects(\n effects: EffectsFactory<ActionFns>,\n actionFns: ActionFns,\n effectsRegistry: Record<string, Subject<ActionFnPayload<unknown>>> = {}\n): Observable<unknown>[] {\n function create(action: { type: string }) {\n const subject = new Subject<ActionFnPayload<unknown>>();\n effectsRegistry[action.type] = subject;\n return subject.asObservable();\n }\n\n const effectObservables = effects(actionFns, create);\n return Object.values(effectObservables);\n}\n\nfunction startSubscriptions(observables: Observable<unknown>[]) {\n return observables.map((observable) => observable.subscribe());\n}\n\nfunction processRedux<Spec extends ActionsFnSpecs, ReturnType>(\n actionFnSpecs: Spec,\n reducer: ReducerFactory<ActionFns, unknown>,\n effects: EffectsFactory<ActionFns>,\n store: unknown\n) {\n const reducerRegistry: Record<\n string,\n (payload: ActionFnPayload<unknown>, state: unknown) => void\n > = {};\n const effectsRegistry: Record<string, Subject<ActionFnPayload<unknown>>> = {};\n const actionsMap = createPublicAndAllActionsFns(\n actionFnSpecs,\n reducerRegistry,\n effectsRegistry,\n store\n );\n const actionFns = actionsMap.all;\n const publicActionsFns = actionsMap.publics;\n\n fillReducerRegistry(reducer, actionFns, reducerRegistry);\n const effectObservables = fillEffects(effects, actionFns, effectsRegistry);\n const subscriptions = startSubscriptions(effectObservables);\n\n return {\n methods: publicActionsFns as ReturnType,\n subscriptions: subscriptions,\n };\n}\n\n/**\n * @param redux redux\n *\n * properties do not start with `with` since they are not extension functions on their own.\n *\n * no dependency to NgRx\n *\n * actions are passed to reducer and effects, but it is also possible to use other actions.\n * effects provide forAction and do not return anything. that is important because effects should stay inaccessible\n */\nexport function withRedux<\n Spec extends ActionsFnSpecs,\n Input extends SignalStoreFeatureResult,\n StateActionFns extends ActionFnsCreator<Spec> = ActionFnsCreator<Spec>,\n PublicStoreActionFns extends PublicActionFns<Spec> = PublicActionFns<Spec>\n>(redux: {\n actions: Spec;\n reducer: ReducerFactory<StateActionFns, StateSignal<Input['state']>>;\n effects: EffectsFactory<StateActionFns>;\n}): SignalStoreFeature<\n Input,\n EmptyFeatureResult & { methods: PublicStoreActionFns }\n> {\n return (store) => {\n const { methods, subscriptions } = processRedux<Spec, PublicStoreActionFns>(\n redux.actions,\n redux.reducer as ReducerFactory<ActionFns, unknown>,\n redux.effects as EffectsFactory<ActionFns>,\n store\n );\n return {\n ...store,\n methods,\n };\n };\n}\n","import { Signal, computed } from '@angular/core';\nimport {\n SignalStoreFeature,\n signalStoreFeature,\n withComputed,\n withState,\n} from '@ngrx/signals';\nimport { Emtpy } from './shared/empty';\n\nexport type CallState = 'init' | 'loading' | 'loaded' | { error: string };\n\nexport type NamedCallStateSlice<Collection extends string> = {\n [K in Collection as `${K}CallState`]: CallState;\n};\n\nexport type CallStateSlice = {\n callState: CallState\n}\n\nexport type NamedCallStateSignals<Prop extends string> = {\n [K in Prop as `${K}Loading`]: Signal<boolean>;\n} & {\n [K in Prop as `${K}Loaded`]: Signal<boolean>;\n } & {\n [K in Prop as `${K}Error`]: Signal<string | null>;\n } \n\nexport type CallStateSignals = {\n loading: Signal<boolean>;\n loaded: Signal<boolean>;\n error: Signal<string | null>\n} \n\nexport function getCallStateKeys(config?: { collection?: string }) {\n const prop = config?.collection;\n return {\n callStateKey: prop ? `${config.collection}CallState` : 'callState',\n loadingKey: prop ? `${config.collection}Loading` : 'loading',\n loadedKey: prop ? `${config.collection}Loaded` : 'loaded',\n errorKey: prop ? `${config.collection}Error` : 'error',\n };\n}\n\nexport function withCallState<Collection extends string>(config: {\n collection: Collection;\n}): SignalStoreFeature<\n { state: Emtpy, signals: Emtpy, methods: Emtpy },\n {\n state: NamedCallStateSlice<Collection>,\n signals: NamedCallStateSignals<Collection>,\n methods: Emtpy\n }\n>;\nexport function withCallState(): SignalStoreFeature<\n { state: Emtpy, signals: Emtpy, methods: Emtpy },\n {\n state: CallStateSlice,\n signals: CallStateSignals,\n methods: Emtpy\n }\n>;\nexport function withCallState<Collection extends string>(config?: {\n collection: Collection;\n}): SignalStoreFeature {\n const { callStateKey, errorKey, loadedKey, loadingKey } =\n getCallStateKeys(config);\n\n return signalStoreFeature(\n withState({ [callStateKey]: 'init' }),\n withComputed((state: Record<string, Signal<unknown>>) => {\n\n const callState = state[callStateKey] as Signal<CallState>;\n\n return {\n [loadingKey]: computed(() => callState() === 'loading'),\n [loadedKey]: computed(() => callState() === 'loaded'),\n [errorKey]: computed(() => {\n const v = callState();\n return typeof v === 'object' ? v.error : null;\n })\n }\n })\n );\n}\n\nexport function setLoading<Prop extends string>(\n prop?: Prop\n): NamedCallStateSlice<Prop> | CallStateSlice {\n if (prop) {\n return { [`${prop}CallState`]: 'loading' } as NamedCallStateSlice<Prop>;\n }\n\n return { callState: 'loading' };\n}\n\nexport function setLoaded<Prop extends string>(\n prop?: Prop\n): NamedCallStateSlice<Prop> | CallStateSlice {\n\n if (prop) {\n return { [`${prop}CallState`]: 'loaded' } as NamedCallStateSlice<Prop>;\n }\n else {\n return { callState: 'loaded' };\n\n }\n}\n\nexport function setError<Prop extends string>(\n error: unknown,\n prop?: Prop,\n ): NamedCallStateSlice<Prop> | CallStateSlice {\n\n let errorMessage = '';\n\n if (!error) {\n errorMessage = '';\n }\n else if (typeof error === 'object' && 'message' in error) {\n errorMessage = String(error.message);\n }\n else {\n errorMessage = String(error);\n }\n \n\n if (prop) {\n return { [`${prop}CallState`]: { error: errorMessage } } as NamedCallStateSlice<Prop>;\n }\n else {\n return { callState: { error: errorMessage } };\n }\n}\n","import { ProviderToken, Signal, computed, inject } from \"@angular/core\";\nimport { SignalStoreFeature, patchState, signalStoreFeature, withComputed, withMethods, withState } from \"@ngrx/signals\";\nimport { CallState, getCallStateKeys, setError, setLoaded, setLoading } from \"./with-call-state\";\nimport { setAllEntities, EntityId, addEntity, updateEntity, removeEntity } from \"@ngrx/signals/entities\";\nimport { EntityState, NamedEntitySignals } from \"@ngrx/signals/entities/src/models\";\nimport { StateSignal } from \"@ngrx/signals/src/state-signal\";\nimport { Emtpy } from \"./shared/empty\";\n\nexport type Filter = Record<string, unknown>;\nexport type Entity = { id: EntityId };\n\nexport interface DataService<E extends Entity, F extends Filter> {\n load(filter: F): Promise<E[]>;\n loadById(id: EntityId): Promise<E>;\n create(entity: E): Promise<E>;\n update(entity: E): Promise<E>;\n updateAll(entity: E[]): Promise<E[]>;\n delete(entity: E): Promise<void>;\n}\n\nexport function capitalize(str: string): string {\n return str ? str[0].toUpperCase() + str.substring(1) : str;\n}\n\nexport function getDataServiceKeys(options: { collection?: string }) {\n const filterKey = options.collection ? `${options.collection}Filter` : 'filter';\n const selectedIdsKey = options.collection ? `selected${capitalize(options.collection)}Ids` : 'selectedIds';\n const selectedEntitiesKey = options.collection ? `selected${capitalize(options.collection)}Entities` : 'selectedEntities';\n\n const updateFilterKey = options.collection ? `update${capitalize(options.collection)}Filter` : 'updateFilter';\n const updateSelectedKey = options.collection ? `updateSelected${capitalize(options.collection)}Entities` : 'updateSelected';\n const loadKey = options.collection ? `load${capitalize(options.collection)}Entities` : 'load';\n\n const currentKey = options.collection ? `current${capitalize(options.collection)}` : 'current';\n const loadByIdKey = options.collection ? `load${capitalize(options.collection)}ById` : 'loadById';\n const setCurrentKey = options.collection ? `setCurrent${capitalize(options.collection)}` : 'setCurrent';\n const createKey = options.collection ? `create${capitalize(options.collection)}` : 'create';\n const updateKey = options.collection ? `update${capitalize(options.collection)}` : 'update';\n const updateAllKey = options.collection ? `updateAll${capitalize(options.collection)}` : 'updateAll';\n const deleteKey = options.collection ? `delete${capitalize(options.collection)}` : 'delete';\n\n // TODO: Take these from @ngrx/signals/entities, when they are exported\n const entitiesKey = options.collection ? `${options.collection}Entities` : 'entities';\n const entityMapKey = options.collection ? `${options.collection}EntityMap` : 'entityMap';\n const idsKey = options.collection ? `${options.collection}Ids` : 'ids';\n\n return {\n filterKey,\n selectedIdsKey,\n selectedEntitiesKey,\n updateFilterKey,\n updateSelectedKey,\n loadKey,\n entitiesKey,\n entityMapKey,\n idsKey,\n\n currentKey,\n loadByIdKey,\n setCurrentKey,\n createKey,\n updateKey,\n updateAllKey,\n deleteKey\n };\n}\n\nexport type NamedDataServiceState<E extends Entity, F extends Filter, Collection extends string> =\n {\n [K in Collection as `${K}Filter`]: F;\n } & {\n [K in Collection as `selected${Capitalize<K>}Ids`]: Record<EntityId, boolean>;\n } & {\n [K in Collection as `current${Capitalize<K>}`]: E;\n }\n\nexport type DataServiceState<E extends Entity, F extends Filter> = {\n filter: F;\n selectedIds: Record<EntityId, boolean>;\n current: E;\n}\n\nexport type NamedDataServiceSignals<E extends Entity, Collection extends string> =\n {\n [K in Collection as `selected${Capitalize<K>}Entities`]: Signal<E[]>;\n }\n\nexport type DataServiceSignals<E extends Entity> =\n {\n selectedEntities: Signal<E[]>;\n }\n\nexport type NamedDataServiceMethods<E extends Entity, F extends Filter, Collection extends string> =\n {\n [K in Collection as `update${Capitalize<K>}Filter`]: (filter: F) => void;\n } &\n {\n [K in Collection as `updateSelected${Capitalize<K>}Entities`]: (id: EntityId, selected: boolean) => void;\n } &\n {\n [K in Collection as `load${Capitalize<K>}Entities`]: () => Promise<void>;\n } &\n\n {\n [K in Collection as `setCurrent${Capitalize<K>}`]: (entity: E) => void;\n } &\n {\n [K in Collection as `load${Capitalize<K>}ById`]: (id: EntityId) => Promise<void>;\n } &\n {\n [K in Collection as `create${Capitalize<K>}`]: (entity: E) => Promise<void>;\n } &\n {\n [K in Collection as `update${Capitalize<K>}`]: (entity: E) => Promise<void>;\n } &\n {\n [K in Collection as `updateAll${Capitalize<K>}`]: (entity: E[]) => Promise<void>;\n } &\n {\n [K in Collection as `delete${Capitalize<K>}`]: (entity: E) => Promise<void>;\n };\n\n\nexport type DataServiceMethods<E extends Entity, F extends Filter> =\n {\n updateFilter: (filter: F) => void;\n updateSelected: (id: EntityId, selected: boolean) => void;\n load: () => Promise<void>;\n\n setCurrent(entity: E): void;\n loadById(id: EntityId): Promise<void>;\n create(entity: E): Promise<void>;\n update(entity: E): Promise<void>;\n updateAll(entities: E[]): Promise<void>;\n delete(entity: E): Promise<void>;\n }\n\nexport type Empty = Record<string, never>\n\nexport function withDataService<E extends Entity, F extends Filter, Collection extends string>(options: { dataServiceType: ProviderToken<DataService<E, F>>, filter: F, collection: Collection }): SignalStoreFeature<\n {\n state: Emtpy,\n // These alternatives break type inference:\n // state: { callState: CallState } & NamedEntityState<E, Collection>,\n // state: NamedEntityState<E, Collection>,\n\n signals: NamedEntitySignals<E, Collection>,\n methods: Emtpy,\n },\n {\n state: NamedDataServiceState<E, F, Collection>\n signals: NamedDataServiceSignals<E, Collection>\n methods: NamedDataServiceMethods<E, F, Collection>\n }\n>;\nexport function withDataService<E extends Entity, F extends Filter>(options: { dataServiceType: ProviderToken<DataService<E, F>>, filter: F }): SignalStoreFeature<\n {\n state: { callState: CallState } & EntityState<E>\n signals: Emtpy,\n methods: Emtpy,\n },\n {\n state: DataServiceState<E, F>\n signals: DataServiceSignals<E>\n methods: DataServiceMethods<E, F>\n }>;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function withDataService<E extends Entity, F extends Filter, Collection extends string>(options: { dataServiceType: ProviderToken<DataService<E, F>>, filter: F, collection?: Collection }): SignalStoreFeature<any, any> {\n const { dataServiceType, filter, collection: prefix } = options;\n const {\n entitiesKey,\n filterKey,\n loadKey,\n selectedEntitiesKey,\n selectedIdsKey,\n updateFilterKey,\n updateSelectedKey,\n\n currentKey,\n createKey,\n updateKey,\n updateAllKey,\n deleteKey,\n loadByIdKey,\n setCurrentKey\n } = getDataServiceKeys(options);\n\n const { callStateKey } = getCallStateKeys({ collection: prefix });\n\n return signalStoreFeature(\n withState(() => ({\n [filterKey]: filter,\n [selectedIdsKey]: {} as Record<EntityId, boolean>,\n [currentKey]: undefined as E | undefined\n })),\n withComputed((store: Record<string, unknown>) => {\n const entities = store[entitiesKey] as Signal<E[]>;\n const selectedIds = store[selectedIdsKey] as Signal<Record<EntityId, boolean>>;\n\n return {\n [selectedEntitiesKey]: computed(() => entities().filter(e => selectedIds()[e.id]))\n }\n }),\n withMethods((store: Record<string, unknown> & StateSignal<object>) => {\n const dataService = inject(dataServiceType)\n return {\n [updateFilterKey]: (filter: F): void => {\n patchState(store, { [filterKey]: filter });\n },\n [updateSelectedKey]: (id: EntityId, selected: boolean): void => {\n patchState(store, (state: Record<string, unknown>) => ({\n [selectedIdsKey]: {\n ...state[selectedIdsKey] as Record<EntityId, boolean>,\n [id]: selected,\n }\n }));\n },\n [loadKey]: async (): Promise<void> => {\n const filter = store[filterKey] as Signal<F>;\n store[callStateKey] && patchState(store, setLoading(prefix));\n\n try {\n const result = await dataService.load(filter());\n patchState(store, prefix ? setAllEntities(result, { collection: prefix }) : setAllEntities(result));\n store[callStateKey] && patchState(store, setLoaded(prefix));\n }\n catch (e) {\n store[callStateKey] && patchState(store, setError(e, prefix));\n throw e;\n }\n },\n [loadByIdKey]: async (id: EntityId): Promise<void> => {\n store[callStateKey] && patchState(store, setLoading(prefix));\n\n try {\n const current = await dataService.loadById(id);\n store[callStateKey] && patchState(store, setLoaded(prefix));\n patchState(store, { [currentKey]: current });\n }\n catch (e) {\n store[callStateKey] && patchState(store, setError(e, prefix));\n throw e;\n }\n },\n [setCurrentKey]: (current: E): void => {\n patchState(store, { [currentKey]: current });\n },\n [createKey]: async (entity: E): Promise<void> => {\n patchState(store, { [currentKey]: entity });\n store[callStateKey] && patchState(store, setLoading(prefix));\n\n try {\n const created = await dataService.create(entity);\n patchState(store, { [currentKey]: created });\n patchState(store, prefix ? addEntity(created, { collection: prefix }) : addEntity(created));\n store[callStateKey] && patchState(store, setLoaded(prefix));\n }\n catch (e) {\n store[callStateKey] && patchState(store, setError(e, prefix));\n throw e;\n }\n },\n [updateKey]: async (entity: E): Promise<void> => {\n patchState(store, { [currentKey]: entity });\n store[callStateKey] && patchState(store, setLoading(prefix));\n\n try {\n const updated = await dataService.update(entity);\n patchState(store, { [currentKey]: updated });\n // Why do we need this cast to Partial<Entity>?\n const updateArg = { id: updated.id, changes: updated as Partial<Entity> };\n patchState(store, prefix ? updateEntity(updateArg, { collection: prefix }) : updateEntity(updateArg));\n store[callStateKey] && patchState(store, setLoaded(prefix));\n }\n catch (e) {\n store[callStateKey] && patchState(store, setError(e, prefix));\n throw e;\n }\n },\n [updateAllKey]: async (entities: E[]): Promise<void> => {\n store[callStateKey] && patchState(store, setLoading(prefix));\n\n try {\n const result = await dataService.updateAll(entities);\n patchState(store, prefix ? setAllEntities(result, { collection: prefix }) : setAllEntities(result));\n store[callStateKey] && patchState(store, setLoaded(prefix));\n }\n catch (e) {\n store[callStateKey] && patchState(store, setError(e, prefix));\n throw e;\n }\n },\n [deleteKey]: async (entity: E): Promise<void> => {\n patchState(store, { [currentKey]: entity });\n store[callStateKey] && patchState(store, setLoading(prefix));\n\n try {\n await dataService.delete(entity);\n patchState(store, { [currentKey]: undefined });\n patchState(store, prefix ? removeEntity(entity.id, { collection: prefix }) : removeEntity(entity.id));\n store[callStateKey] && patchState(store, setLoaded(prefix));\n }\n catch (e) {\n store[callStateKey] && patchState(store, setError(e, prefix));\n throw e;\n }\n },\n };\n })\n );\n}\n","import { SignalStoreFeature, patchState, signalStoreFeature, withComputed, withHooks, withMethods } from \"@ngrx/signals\";\nimport { EntityId, EntityMap, EntityState } from \"@ngrx/signals/entities\";\nimport { Signal, effect, signal, untracked, isSignal } from \"@angular/core\";\nimport { EntitySignals, NamedEntitySignals } from \"@ngrx/signals/entities/src/models\";\nimport { Entity, capitalize } from \"./with-data-service\";\nimport { Emtpy } from \"./shared/empty\";\n\nexport type StackItem = Record<string, unknown>;\n\nexport type NormalizedUndoRedoOptions = {\n maxStackSize: number;\n collections?: string[]\n}\n\nconst defaultOptions: NormalizedUndoRedoOptions = {\n maxStackSize: 100\n};\n\nexport type NamedUndoRedoState<Collection extends string> = {\n [K in Collection as `${K}EntityMap`]: EntityMap<Entity>;\n} & {\n [K in Collection as `${K}Ids`]: EntityId[];\n }\n\nexport type NamedUndoRedoSignals<Collection extends string> = {\n [K in Collection as `${K}Entities`]: Signal<Entity[]>\n}\n\nexport function getUndoRedoKeys(collections?: string[]): string[] {\n if (collections) {\n return collections.flatMap(c => [`${c}EntityMap`, `${c}Ids`, `selected${capitalize(c)}Ids`, `${c}Filter`])\n }\n return ['entityMap', 'ids', 'selectedIds', 'filter'];\n}\n\nexport function withUndoRedo<Collection extends string>(options?: { maxStackSize?: number; collections: Collection[] }): SignalStoreFeature<\n {\n state: Emtpy,\n // This alternative breaks type inference:\n // state: NamedEntityState<Entity, Collection>\n signals: NamedEntitySignals<Entity, Collection>,\n methods: Emtpy\n },\n {\n state: Emtpy,\n signals: {\n canUndo: Signal<boolean>,\n canRedo: Signal<boolean>\n },\n methods: {\n undo: () => void,\n redo: () => void\n }\n }>;\n\nexport function withUndoRedo(options?: { maxStackSize?: number }): SignalStoreFeature<\n {\n state: EntityState<Entity>,\n signals: EntitySignals<Entity>,\n methods: Emtpy\n },\n {\n state: Emtpy,\n signals: {\n canUndo: Signal<boolean>,\n canRedo: Signal<boolean>\n },\n methods: {\n undo: () => void,\n redo: () => void\n }\n }>;\n\nexport function withUndoRedo<Collection extends string>(options: {\n maxStackSize?: number;\n collections?: Collection[]\n} = {}): \n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nSignalStoreFeature<any, any> {\n let previous: StackItem | null = null;\n let skipOnce = false;\n\n const normalized = {\n ...defaultOptions,\n ...options\n };\n\n //\n // Design Decision: This feature has its own\n // internal state.\n //\n\n const undoStack: StackItem[] = [];\n const redoStack: StackItem[] = [];\n\n const canUndo = signal(false);\n const canRedo = signal(false);\n\n const updateInternal = () => {\n canUndo.set(undoStack.length !== 0);\n canRedo.set(redoStack.length !== 0);\n };\n\n const keys = getUndoRedoKeys(normalized?.collections);\n\n return signalStoreFeature(\n\n withComputed(() => ({\n canUndo: canUndo.asReadonly(),\n canRedo: canRedo.asReadonly()\n })),\n withMethods((store) => ({\n undo(): void {\n const item = undoStack.pop();\n\n if (item && previous) {\n redoStack.push(previous);\n }\n\n if (item) {\n skipOnce = true;\n patchState(store, item);\n previous = item;\n }\n\n updateInternal();\n },\n redo(): void {\n const item = redoStack.pop();\n\n if (item && previous) {\n undoStack.push(previous);\n }\n\n if (item) {\n skipOnce = true;\n patchState(store, item);\n previous = item;\n }\n\n updateInternal();\n }\n })),\n withHooks({\n onInit(store: Record<string, unknown>) {\n effect(() => {\n\n const cand = keys.reduce((acc, key) => {\n const s = store[key];\n if (s && isSignal(s)) {\n return {\n ...acc,\n [key]: s()\n }\n }\n return acc;\n }, {});\n\n if (skipOnce) {\n skipOnce = false;\n return;\n }\n\n // Clear redoStack after recorded action\n redoStack.splice(0);\n\n if (previous) {\n undoStack.push(previous);\n }\n\n if (redoStack.length > normalized.maxStackSize) {\n undoStack.unshift();\n }\n\n previous = cand;\n\n // Don't propogate current reactive context\n untracked(() => updateInternal());\n })\n }\n })\n\n )\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["originalPatchState","patchState"],"mappings":"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"}
package/index.d.ts CHANGED
@@ -1,2 +1,5 @@
1
1
  export { withDevtools, patchState, Action } from './lib/with-devtools';
2
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';
@@ -0,0 +1 @@
1
+ export type Emtpy = {};
@@ -0,0 +1,55 @@
1
+ import { Signal } from '@angular/core';
2
+ import { SignalStoreFeature } from '@ngrx/signals';
3
+ import { Emtpy } from './shared/empty';
4
+ export type CallState = 'init' | 'loading' | 'loaded' | {
5
+ error: string;
6
+ };
7
+ export type NamedCallStateSlice<Collection extends string> = {
8
+ [K in Collection as `${K}CallState`]: CallState;
9
+ };
10
+ export type CallStateSlice = {
11
+ callState: CallState;
12
+ };
13
+ export type NamedCallStateSignals<Prop extends string> = {
14
+ [K in Prop as `${K}Loading`]: Signal<boolean>;
15
+ } & {
16
+ [K in Prop as `${K}Loaded`]: Signal<boolean>;
17
+ } & {
18
+ [K in Prop as `${K}Error`]: Signal<string | null>;
19
+ };
20
+ export type CallStateSignals = {
21
+ loading: Signal<boolean>;
22
+ loaded: Signal<boolean>;
23
+ error: Signal<string | null>;
24
+ };
25
+ export declare function getCallStateKeys(config?: {
26
+ collection?: string;
27
+ }): {
28
+ callStateKey: string;
29
+ loadingKey: string;
30
+ loadedKey: string;
31
+ errorKey: string;
32
+ };
33
+ export declare function withCallState<Collection extends string>(config: {
34
+ collection: Collection;
35
+ }): SignalStoreFeature<{
36
+ state: Emtpy;
37
+ signals: Emtpy;
38
+ methods: Emtpy;
39
+ }, {
40
+ state: NamedCallStateSlice<Collection>;
41
+ signals: NamedCallStateSignals<Collection>;
42
+ methods: Emtpy;
43
+ }>;
44
+ export declare function withCallState(): SignalStoreFeature<{
45
+ state: Emtpy;
46
+ signals: Emtpy;
47
+ methods: Emtpy;
48
+ }, {
49
+ state: CallStateSlice;
50
+ signals: CallStateSignals;
51
+ methods: Emtpy;
52
+ }>;
53
+ export declare function setLoading<Prop extends string>(prop?: Prop): NamedCallStateSlice<Prop> | CallStateSlice;
54
+ export declare function setLoaded<Prop extends string>(prop?: Prop): NamedCallStateSlice<Prop> | CallStateSlice;
55
+ export declare function setError<Prop extends string>(error: unknown, prop?: Prop): NamedCallStateSlice<Prop> | CallStateSlice;