@angular-architects/ngrx-toolkit 0.0.1

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.
package/README.md ADDED
@@ -0,0 +1,7 @@
1
+ # ngrx-toolkit
2
+
3
+ This library was generated with [Nx](https://nx.dev).
4
+
5
+ ## Running unit tests
6
+
7
+ Run `nx test ngrx-toolkit` to execute the unit tests.
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './index';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci1hcmNoaXRlY3RzLW5ncngtdG9vbGtpdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYnMvbmdyeC10b29sa2l0L3NyYy9hbmd1bGFyLWFyY2hpdGVjdHMtbmdyeC10b29sa2l0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxTQUFTLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdlbmVyYXRlZCBidW5kbGUgaW5kZXguIERvIG5vdCBlZGl0LlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vaW5kZXgnO1xuIl19
@@ -0,0 +1,3 @@
1
+ export { withDevtools, patchState } from './lib/with-devtools';
2
+ export * from './lib/with-redux';
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWJzL25ncngtdG9vbGtpdC9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQVUsTUFBTSxxQkFBcUIsQ0FBQztBQUN2RSxjQUFjLGtCQUFrQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgd2l0aERldnRvb2xzLCBwYXRjaFN0YXRlLCBBY3Rpb24gfSBmcm9tICcuL2xpYi93aXRoLWRldnRvb2xzJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3dpdGgtcmVkdXgnO1xuIl19
@@ -0,0 +1,6 @@
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXJ0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvbmdyeC10b29sa2l0L3NyYy9saWIvYXNzZXJ0aW9ucy9hc3NlcnRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE1BQU0sVUFBVSxtQkFBbUIsQ0FDakMsR0FBWTtJQUVaLElBQUksQ0FBQyxHQUFHLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxFQUFFO1FBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMsbUNBQW1DLENBQUMsQ0FBQztLQUN0RDtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBY3Rpb25zRm5TcGVjcyB9IGZyb20gJy4uL3dpdGgtcmVkdXgnO1xuXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0QWN0aW9uRm5TcGVjcyhcbiAgb2JqOiB1bmtub3duXG4pOiBhc3NlcnRzIG9iaiBpcyBBY3Rpb25zRm5TcGVjcyB7XG4gIGlmICghb2JqIHx8IHR5cGVvZiBvYmogIT09ICdvYmplY3QnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCclbyBpcyBub3QgYW4gQWN0aW9uIFNwZWNpZmljYXRpb24nKTtcbiAgfVxufVxuIl19
@@ -0,0 +1,79 @@
1
+ import { patchState as originalPatchState, } from '@ngrx/signals';
2
+ import { effect, inject, PLATFORM_ID, signal } from '@angular/core';
3
+ import { isPlatformServer } from '@angular/common';
4
+ const storeRegistry = signal({});
5
+ let currentActionNames = new Set();
6
+ let synchronizationInitialized = false;
7
+ function initSynchronization() {
8
+ effect(() => {
9
+ if (!connection) {
10
+ return;
11
+ }
12
+ const stores = storeRegistry();
13
+ const rootState = {};
14
+ for (const name in stores) {
15
+ const store = stores[name];
16
+ rootState[name] = store();
17
+ }
18
+ const names = Array.from(currentActionNames);
19
+ const type = names.length ? names.join(', ') : 'Store Update';
20
+ currentActionNames = new Set();
21
+ connection.send({ type }, rootState);
22
+ });
23
+ }
24
+ function getValueFromSymbol(obj, symbol) {
25
+ if (typeof obj === 'object' && obj && symbol in obj) {
26
+ return obj[symbol];
27
+ }
28
+ }
29
+ function getStoreSignal(store) {
30
+ const [signalStateKey] = Object.getOwnPropertySymbols(store);
31
+ if (!signalStateKey) {
32
+ throw new Error('Cannot find State Signal');
33
+ }
34
+ return getValueFromSymbol(store, signalStateKey);
35
+ }
36
+ let connection;
37
+ /**
38
+ * required for testing. is not exported during build
39
+ */
40
+ export function reset() {
41
+ connection = undefined;
42
+ synchronizationInitialized = false;
43
+ storeRegistry.set({});
44
+ }
45
+ /**
46
+ * @param name store's name as it should appear in the DevTools
47
+ */
48
+ export function withDevtools(name) {
49
+ return (store) => {
50
+ const isServer = isPlatformServer(inject(PLATFORM_ID));
51
+ if (isServer) {
52
+ return store;
53
+ }
54
+ const extensions = window.__REDUX_DEVTOOLS_EXTENSION__;
55
+ if (!extensions) {
56
+ return store;
57
+ }
58
+ if (!connection) {
59
+ connection = extensions.connect({
60
+ name: 'NgRx Signal Store',
61
+ });
62
+ }
63
+ const storeSignal = getStoreSignal(store);
64
+ storeRegistry.update((value) => ({
65
+ ...value,
66
+ [name]: storeSignal,
67
+ }));
68
+ if (!synchronizationInitialized) {
69
+ initSynchronization();
70
+ synchronizationInitialized = true;
71
+ }
72
+ return store;
73
+ };
74
+ }
75
+ export const patchState = (state, action, ...rest) => {
76
+ currentActionNames.add(action);
77
+ return originalPatchState(state, ...rest);
78
+ };
79
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0aC1kZXZ0b29scy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvbmdyeC10b29sa2l0L3NyYy9saWIvd2l0aC1kZXZ0b29scy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsVUFBVSxJQUFJLGtCQUFrQixHQUVqQyxNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQzVFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBaUJuRCxNQUFNLGFBQWEsR0FBRyxNQUFNLENBQWtDLEVBQUUsQ0FBQyxDQUFDO0FBRWxFLElBQUksa0JBQWtCLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztBQUUzQyxJQUFJLDBCQUEwQixHQUFHLEtBQUssQ0FBQztBQUV2QyxTQUFTLG1CQUFtQjtJQUMxQixNQUFNLENBQUMsR0FBRyxFQUFFO1FBQ1YsSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNmLE9BQU87U0FDUjtRQUVELE1BQU0sTUFBTSxHQUFHLGFBQWEsRUFBRSxDQUFDO1FBQy9CLE1BQU0sU0FBUyxHQUE0QixFQUFFLENBQUM7UUFDOUMsS0FBSyxNQUFNLElBQUksSUFBSSxNQUFNLEVBQUU7WUFDekIsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzNCLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQztTQUMzQjtRQUVELE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUM3QyxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUM7UUFDOUQsa0JBQWtCLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztRQUV2QyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDdkMsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsU0FBUyxrQkFBa0IsQ0FBQyxHQUFZLEVBQUUsTUFBYztJQUN0RCxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsSUFBSSxHQUFHLElBQUksTUFBTSxJQUFJLEdBQUcsRUFBRTtRQUNuRCxPQUFRLEdBQThCLENBQUMsTUFBTSxDQUFDLENBQUM7S0FDaEQ7QUFDSCxDQUFDO0FBRUQsU0FBUyxjQUFjLENBQUMsS0FBYztJQUNwQyxNQUFNLENBQUMsY0FBYyxDQUFDLEdBQUcsTUFBTSxDQUFDLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzdELElBQUksQ0FBQyxjQUFjLEVBQUU7UUFDbkIsTUFBTSxJQUFJLEtBQUssQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO0tBQzdDO0lBRUQsT0FBTyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsY0FBYyxDQUFDLENBQUM7QUFDbkQsQ0FBQztBQUtELElBQUksVUFBdUMsQ0FBQztBQUU1Qzs7R0FFRztBQUNILE1BQU0sVUFBVSxLQUFLO0lBQ25CLFVBQVUsR0FBRyxTQUFTLENBQUM7SUFDdkIsMEJBQTBCLEdBQUcsS0FBSyxDQUFDO0lBQ25DLGFBQWEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDeEIsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLFlBQVksQ0FDMUIsSUFBWTtJQUVaLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRTtRQUNmLE1BQU0sUUFBUSxHQUFHLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO1FBQ3ZELElBQUksUUFBUSxFQUFFO1lBQ1osT0FBTyxLQUFLLENBQUM7U0FDZDtRQUVELE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyw0QkFBNEIsQ0FBQztRQUN2RCxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ2YsT0FBTyxLQUFLLENBQUM7U0FDZDtRQUVELElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDZixVQUFVLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQztnQkFDOUIsSUFBSSxFQUFFLG1CQUFtQjthQUMxQixDQUFDLENBQUM7U0FDSjtRQUVELE1BQU0sV0FBVyxHQUFHLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMxQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQy9CLEdBQUcsS0FBSztZQUNSLENBQUMsSUFBSSxDQUFDLEVBQUUsV0FBVztTQUNwQixDQUFDLENBQUMsQ0FBQztRQUVKLElBQUksQ0FBQywwQkFBMEIsRUFBRTtZQUMvQixtQkFBbUIsRUFBRSxDQUFDO1lBQ3RCLDBCQUEwQixHQUFHLElBQUksQ0FBQztTQUNuQztRQUVELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQVNELE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBWSxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxJQUFJLEVBQUUsRUFBRTtJQUM1RCxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDL0IsT0FBTyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztBQUM1QyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBwYXRjaFN0YXRlIGFzIG9yaWdpbmFsUGF0Y2hTdGF0ZSxcbiAgU2lnbmFsU3RvcmVGZWF0dXJlLFxufSBmcm9tICdAbmdyeC9zaWduYWxzJztcbmltcG9ydCB7IFNpZ25hbFN0b3JlRmVhdHVyZVJlc3VsdCB9IGZyb20gJ0BuZ3J4L3NpZ25hbHMvc3JjL3NpZ25hbC1zdG9yZS1tb2RlbHMnO1xuaW1wb3J0IHsgZWZmZWN0LCBpbmplY3QsIFBMQVRGT1JNX0lELCBzaWduYWwsIFNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgaXNQbGF0Zm9ybVNlcnZlciB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIFdpbmRvdyB7XG4gICAgX19SRURVWF9ERVZUT09MU19FWFRFTlNJT05fXzpcbiAgICAgIHwge1xuICAgICAgICAgIGNvbm5lY3Q6IChvcHRpb25zOiB7IG5hbWU6IHN0cmluZyB9KSA9PiB7XG4gICAgICAgICAgICBzZW5kOiAoYWN0aW9uOiBBY3Rpb24sIHN0YXRlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4gdm9pZDtcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB8IHVuZGVmaW5lZDtcbiAgfVxufVxuXG50eXBlIEVtcHR5RmVhdHVyZVJlc3VsdCA9IHsgc3RhdGU6IHt9OyBzaWduYWxzOiB7fTsgbWV0aG9kczoge30gfTtcbmV4cG9ydCB0eXBlIEFjdGlvbiA9IHsgdHlwZTogc3RyaW5nIH07XG5cbmNvbnN0IHN0b3JlUmVnaXN0cnkgPSBzaWduYWw8UmVjb3JkPHN0cmluZywgU2lnbmFsPHVua25vd24+Pj4oe30pO1xuXG5sZXQgY3VycmVudEFjdGlvbk5hbWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbmxldCBzeW5jaHJvbml6YXRpb25Jbml0aWFsaXplZCA9IGZhbHNlO1xuXG5mdW5jdGlvbiBpbml0U3luY2hyb25pemF0aW9uKCkge1xuICBlZmZlY3QoKCkgPT4ge1xuICAgIGlmICghY29ubmVjdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHN0b3JlcyA9IHN0b3JlUmVnaXN0cnkoKTtcbiAgICBjb25zdCByb290U3RhdGU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gICAgZm9yIChjb25zdCBuYW1lIGluIHN0b3Jlcykge1xuICAgICAgY29uc3Qgc3RvcmUgPSBzdG9yZXNbbmFtZV07XG4gICAgICByb290U3RhdGVbbmFtZV0gPSBzdG9yZSgpO1xuICAgIH1cblxuICAgIGNvbnN0IG5hbWVzID0gQXJyYXkuZnJvbShjdXJyZW50QWN0aW9uTmFtZXMpO1xuICAgIGNvbnN0IHR5cGUgPSBuYW1lcy5sZW5ndGggPyBuYW1lcy5qb2luKCcsICcpIDogJ1N0b3JlIFVwZGF0ZSc7XG4gICAgY3VycmVudEFjdGlvbk5hbWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICBjb25uZWN0aW9uLnNlbmQoeyB0eXBlIH0sIHJvb3RTdGF0ZSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRWYWx1ZUZyb21TeW1ib2wob2JqOiB1bmtub3duLCBzeW1ib2w6IHN5bWJvbCkge1xuICBpZiAodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgb2JqICYmIHN5bWJvbCBpbiBvYmopIHtcbiAgICByZXR1cm4gKG9iaiBhcyB7IFtrZXk6IHN5bWJvbF06IGFueSB9KVtzeW1ib2xdO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFN0b3JlU2lnbmFsKHN0b3JlOiB1bmtub3duKTogU2lnbmFsPHVua25vd24+IHtcbiAgY29uc3QgW3NpZ25hbFN0YXRlS2V5XSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoc3RvcmUpO1xuICBpZiAoIXNpZ25hbFN0YXRlS2V5KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZmluZCBTdGF0ZSBTaWduYWwnKTtcbiAgfVxuXG4gIHJldHVybiBnZXRWYWx1ZUZyb21TeW1ib2woc3RvcmUsIHNpZ25hbFN0YXRlS2V5KTtcbn1cblxudHlwZSBDb25uZWN0UmVzcG9uc2UgPSB7XG4gIHNlbmQ6IChhY3Rpb246IEFjdGlvbiwgc3RhdGU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB2b2lkO1xufTtcbmxldCBjb25uZWN0aW9uOiBDb25uZWN0UmVzcG9uc2UgfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogcmVxdWlyZWQgZm9yIHRlc3RpbmcuIGlzIG5vdCBleHBvcnRlZCBkdXJpbmcgYnVpbGRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc2V0KCkge1xuICBjb25uZWN0aW9uID0gdW5kZWZpbmVkO1xuICBzeW5jaHJvbml6YXRpb25Jbml0aWFsaXplZCA9IGZhbHNlO1xuICBzdG9yZVJlZ2lzdHJ5LnNldCh7fSk7XG59XG5cbi8qKlxuICogQHBhcmFtIG5hbWUgc3RvcmUncyBuYW1lIGFzIGl0IHNob3VsZCBhcHBlYXIgaW4gdGhlIERldlRvb2xzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aXRoRGV2dG9vbHM8SW5wdXQgZXh0ZW5kcyBTaWduYWxTdG9yZUZlYXR1cmVSZXN1bHQ+KFxuICBuYW1lOiBzdHJpbmdcbik6IFNpZ25hbFN0b3JlRmVhdHVyZTxJbnB1dCwgRW1wdHlGZWF0dXJlUmVzdWx0PiB7XG4gIHJldHVybiAoc3RvcmUpID0+IHtcbiAgICBjb25zdCBpc1NlcnZlciA9IGlzUGxhdGZvcm1TZXJ2ZXIoaW5qZWN0KFBMQVRGT1JNX0lEKSk7XG4gICAgaWYgKGlzU2VydmVyKSB7XG4gICAgICByZXR1cm4gc3RvcmU7XG4gICAgfVxuXG4gICAgY29uc3QgZXh0ZW5zaW9ucyA9IHdpbmRvdy5fX1JFRFVYX0RFVlRPT0xTX0VYVEVOU0lPTl9fO1xuICAgIGlmICghZXh0ZW5zaW9ucykge1xuICAgICAgcmV0dXJuIHN0b3JlO1xuICAgIH1cblxuICAgIGlmICghY29ubmVjdGlvbikge1xuICAgICAgY29ubmVjdGlvbiA9IGV4dGVuc2lvbnMuY29ubmVjdCh7XG4gICAgICAgIG5hbWU6ICdOZ1J4IFNpZ25hbCBTdG9yZScsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBzdG9yZVNpZ25hbCA9IGdldFN0b3JlU2lnbmFsKHN0b3JlKTtcbiAgICBzdG9yZVJlZ2lzdHJ5LnVwZGF0ZSgodmFsdWUpID0+ICh7XG4gICAgICAuLi52YWx1ZSxcbiAgICAgIFtuYW1lXTogc3RvcmVTaWduYWwsXG4gICAgfSkpO1xuXG4gICAgaWYgKCFzeW5jaHJvbml6YXRpb25Jbml0aWFsaXplZCkge1xuICAgICAgaW5pdFN5bmNocm9uaXphdGlvbigpO1xuICAgICAgc3luY2hyb25pemF0aW9uSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBzdG9yZTtcbiAgfTtcbn1cblxudHlwZSBQYXRjaEZuID0gdHlwZW9mIG9yaWdpbmFsUGF0Y2hTdGF0ZSBleHRlbmRzIChcbiAgYXJnMTogaW5mZXIgRmlyc3QsXG4gIC4uLmFyZ3M6IGluZmVyIFJlc3RcbikgPT4gaW5mZXIgUmV0dXJuZXJcbiAgPyAoc3RhdGU6IEZpcnN0LCBhY3Rpb246IHN0cmluZywgLi4ucmVzdDogUmVzdCkgPT4gUmV0dXJuZXJcbiAgOiBuZXZlcjtcblxuZXhwb3J0IGNvbnN0IHBhdGNoU3RhdGU6IFBhdGNoRm4gPSAoc3RhdGUsIGFjdGlvbiwgLi4ucmVzdCkgPT4ge1xuICBjdXJyZW50QWN0aW9uTmFtZXMuYWRkKGFjdGlvbik7XG4gIHJldHVybiBvcmlnaW5hbFBhdGNoU3RhdGUoc3RhdGUsIC4uLnJlc3QpO1xufTtcbiJdfQ==
@@ -0,0 +1,95 @@
1
+ import { Subject } from 'rxjs';
2
+ import { assertActionFnSpecs } from './assertions/assertions';
3
+ export function payload() {
4
+ return {};
5
+ }
6
+ export const noPayload = {};
7
+ function createActionFns(actionFnSpecs, reducerRegistry, effectsRegistry, state) {
8
+ const actionFns = {};
9
+ for (const type in actionFnSpecs) {
10
+ const actionFn = (payload) => {
11
+ const fullPayload = { ...payload, type };
12
+ const reducer = reducerRegistry[type];
13
+ if (reducer) {
14
+ reducer(fullPayload, state);
15
+ }
16
+ const effectSubject = effectsRegistry[type];
17
+ if (effectSubject) {
18
+ effectSubject.next(fullPayload);
19
+ }
20
+ return fullPayload;
21
+ };
22
+ actionFn.type = type.toString();
23
+ actionFns[type] = actionFn;
24
+ }
25
+ return actionFns;
26
+ }
27
+ function createPublicAndAllActionsFns(actionFnSpecs, reducerRegistry, effectsRegistry, state) {
28
+ if ('public' in actionFnSpecs || 'private' in actionFnSpecs) {
29
+ const privates = actionFnSpecs['private'] || {};
30
+ const publics = actionFnSpecs['public'] || {};
31
+ assertActionFnSpecs(privates);
32
+ assertActionFnSpecs(publics);
33
+ const privateActionFns = createActionFns(privates, reducerRegistry, effectsRegistry, state);
34
+ const publicActionFns = createActionFns(publics, reducerRegistry, effectsRegistry, state);
35
+ return {
36
+ all: { ...privateActionFns, ...publicActionFns },
37
+ publics: publicActionFns,
38
+ };
39
+ }
40
+ const actionFns = createActionFns(actionFnSpecs, reducerRegistry, effectsRegistry, state);
41
+ return { all: actionFns, publics: actionFns };
42
+ }
43
+ function fillReducerRegistry(reducer, actionFns, reducerRegistry) {
44
+ function on(action, reducerFn) {
45
+ reducerRegistry[action.type] = reducerFn;
46
+ }
47
+ reducer(actionFns, on);
48
+ return reducerRegistry;
49
+ }
50
+ function fillEffects(effects, actionFns, effectsRegistry = {}) {
51
+ function create(action) {
52
+ const subject = new Subject();
53
+ effectsRegistry[action.type] = subject;
54
+ return subject.asObservable();
55
+ }
56
+ const effectObservables = effects(actionFns, create);
57
+ return Object.values(effectObservables);
58
+ }
59
+ function startSubscriptions(observables) {
60
+ return observables.map((observable) => observable.subscribe());
61
+ }
62
+ function processRedux(actionFnSpecs, reducer, effects, store) {
63
+ const reducerRegistry = {};
64
+ const effectsRegistry = {};
65
+ const actionsMap = createPublicAndAllActionsFns(actionFnSpecs, reducerRegistry, effectsRegistry, store);
66
+ const actionFns = actionsMap.all;
67
+ const publicActionsFns = actionsMap.publics;
68
+ fillReducerRegistry(reducer, actionFns, reducerRegistry);
69
+ const effectObservables = fillEffects(effects, actionFns, effectsRegistry);
70
+ const subscriptions = startSubscriptions(effectObservables);
71
+ return {
72
+ methods: publicActionsFns,
73
+ subscriptions: subscriptions,
74
+ };
75
+ }
76
+ /**
77
+ * @param redux redux
78
+ *
79
+ * properties do not start with `with` since they are not extension functions on their own.
80
+ *
81
+ * no dependency to NgRx
82
+ *
83
+ * actions are passed to reducer and effects, but it is also possible to use other actions.
84
+ * effects provide forAction and do not return anything. that is important because effects should stay inaccessible
85
+ */
86
+ export function withRedux(redux) {
87
+ return (store) => {
88
+ const { methods, subscriptions } = processRedux(redux.actions, redux.reducer, redux.effects, store);
89
+ return {
90
+ ...store,
91
+ methods,
92
+ };
93
+ };
94
+ }
95
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0aC1yZWR1eC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvbmdyeC10b29sa2l0L3NyYy9saWIvd2l0aC1yZWR1eC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWMsT0FBTyxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQU96RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQXlDOUQsTUFBTSxVQUFVLE9BQU87SUFDckIsT0FBTyxFQUFVLENBQUM7QUFDcEIsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUM7QUEwQjVCLFNBQVMsZUFBZSxDQUN0QixhQUFtQixFQUNuQixlQUdDLEVBQ0QsZUFBa0UsRUFDbEUsS0FBYztJQUVkLE1BQU0sU0FBUyxHQUE2QixFQUFFLENBQUM7SUFFL0MsS0FBSyxNQUFNLElBQUksSUFBSSxhQUFhLEVBQUU7UUFDaEMsTUFBTSxRQUFRLEdBQUcsQ0FBQyxPQUFnQixFQUFFLEVBQUU7WUFDcEMsTUFBTSxXQUFXLEdBQUcsRUFBRSxHQUFHLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQztZQUN6QyxNQUFNLE9BQU8sR0FBRyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdEMsSUFBSSxPQUFPLEVBQUU7Z0JBQ1YsT0FBc0QsQ0FDckQsV0FBc0IsRUFDdEIsS0FBSyxDQUNOLENBQUM7YUFDSDtZQUNELE1BQU0sYUFBYSxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QyxJQUFJLGFBQWEsRUFBRTtnQkFDaEIsYUFBNkMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7YUFDbEU7WUFDRCxPQUFPLFdBQVcsQ0FBQztRQUNyQixDQUFDLENBQUM7UUFDRixRQUFRLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNoQyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcs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QUFPLEVBQUUsU0FBUyxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBQzNFLE1BQU0sYUFBYSxHQUFHLGtCQUFrQixDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFFNUQsT0FBTztRQUNMLE9BQU8sRUFBRSxnQkFBOEI7UUFDdkMsYUFBYSxFQUFFLGFBQWE7S0FDN0IsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLFVBQVUsU0FBUyxDQUt2QixLQUlEO0lBSUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFO1FBQ2YsTUFBTSxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsR0FBRyxZQUFZLENBQzdDLEtBQUssQ0FBQyxPQUFPLEVBQ2IsS0FBSyxDQUFDLE9BQTZDLEVBQ25ELEtBQUssQ0FBQyxPQUFvQyxFQUMxQyxLQUFLLENBQ04sQ0FBQztRQUNGLE9BQU87WUFDTCxHQUFHLEtBQUs7WUFDUixPQUFPO1NBQ1IsQ0FBQztJQUNKLENBQUMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFNpZ25hbFN0b3JlRmVhdHVyZSB9IGZyb20gJ0BuZ3J4L3NpZ25hbHMnO1xuaW1wb3J0IHtcbiAgRW1wdHlGZWF0dXJlUmVzdWx0LFxuICBTaWduYWxTdG9yZUZlYXR1cmVSZXN1bHQsXG59IGZyb20gJ0BuZ3J4L3NpZ25hbHMvc3JjL3NpZ25hbC1zdG9yZS1tb2RlbHMnO1xuaW1wb3J0IHsgU3RhdGVTaWduYWwgfSBmcm9tICdAbmdyeC9zaWduYWxzL3NyYy9zdGF0ZS1zaWduYWwnO1xuaW1wb3J0IHsgYXNzZXJ0QWN0aW9uRm5TcGVjcyB9IGZyb20gJy4vYXNzZXJ0aW9ucy9hc3NlcnRpb25zJztcbmltcG9ydCB7IGVmZmVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG4vKiogQWN0aW9ucyAqKi9cblxudHlwZSBQYXlsb2FkID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbnR5cGUgQWN0aW9uRm48XG4gIFR5cGUgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmcsXG4gIEFjdGlvblBheWxvYWQgZXh0ZW5kcyBQYXlsb2FkID0gUGF5bG9hZFxuPiA9ICgocGF5bG9hZDogQWN0aW9uUGF5bG9hZCkgPT4gQWN0aW9uUGF5bG9hZCAmIHsgdHlwZTogVHlwZSB9KSAmIHtcbiAgdHlwZTogVHlwZTtcbn07XG5cbnR5cGUgQWN0aW9uRm5zID0gUmVjb3JkPHN0cmluZywgQWN0aW9uRm4+O1xuXG5leHBvcnQgdHlwZSBBY3Rpb25zRm5TcGVjcyA9IFJlY29yZDxzdHJpbmcsIFBheWxvYWQ+O1xuXG50eXBlIEFjdGlvbkZuQ3JlYXRvcjxTcGVjIGV4dGVuZHMgQWN0aW9uc0ZuU3BlY3M+ID0ge1xuICBbQWN0aW9uTmFtZSBpbiBrZXlvZiBTcGVjXTogKChcbiAgICBwYXlsb2FkOiBTcGVjW0FjdGlvbk5hbWVdXG4gICkgPT4gU3BlY1tBY3Rpb25OYW1lXSAmIHsgdHlwZTogQWN0aW9uTmFtZSB9KSAmIHsgdHlwZTogQWN0aW9uTmFtZSAmIHN0cmluZyB9O1xufTtcblxudHlwZSBBY3Rpb25GblBheWxvYWQ8QWN0aW9uPiA9IEFjdGlvbiBleHRlbmRzIChwYXlsb2FkOiBpbmZlciBQYXlsb2FkKSA9PiB2b2lkXG4gID8gUGF5bG9hZFxuICA6IG5ldmVyO1xuXG50eXBlIEFjdGlvbkZuc0NyZWF0b3I8U3BlYyBleHRlbmRzIEFjdGlvbnNGblNwZWNzPiA9IFNwZWMgZXh0ZW5kcyB7XG4gIHByaXZhdGU6IFJlY29yZDxzdHJpbmcsIFBheWxvYWQ+O1xuICBwdWJsaWM6IFJlY29yZDxzdHJpbmcsIFBheWxvYWQ+O1xufVxuICA/IEFjdGlvbkZuQ3JlYXRvcjxTcGVjWydwcml2YXRlJ10+ICYgQWN0aW9uRm5DcmVhdG9yPFNwZWNbJ3B1YmxpYyddPlxuICA6IEFjdGlvbkZuQ3JlYXRvcjxTcGVjPjtcblxudHlwZSBQdWJsaWNBY3Rpb25GbnM8U3BlYyBleHRlbmRzIEFjdGlvbnNGblNwZWNzPiA9IFNwZWMgZXh0ZW5kcyB7XG4gIHB1YmxpYzogUmVjb3JkPHN0cmluZywgUGF5bG9hZD47XG59XG4gID8gQWN0aW9uRm5DcmVhdG9yPFNwZWNbJ3B1YmxpYyddPlxuICA6IEFjdGlvbkZuQ3JlYXRvcjxTcGVjPjtcblxuZXhwb3J0IGZ1bmN0aW9uIHBheWxvYWQ8VHlwZSBleHRlbmRzIFBheWxvYWQ+KCk6IFR5cGUge1xuICByZXR1cm4ge30gYXMgVHlwZTtcbn1cblxuZXhwb3J0IGNvbnN0IG5vUGF5bG9hZCA9IHt9O1xuXG4vKiogUmVkdWNlciAqKi9cblxudHlwZSBSZWR1Y2VyRnVuY3Rpb248UmVkdWNlckFjdGlvbiwgU3RhdGU+ID0gKFxuICBhY3Rpb246IEFjdGlvbkZuUGF5bG9hZDxSZWR1Y2VyQWN0aW9uPixcbiAgc3RhdGU6IFN0YXRlXG4pID0+IHZvaWQ7XG5cbnR5cGUgUmVkdWNlckZhY3Rvcnk8U3RhdGVBY3Rpb25GbnMgZXh0ZW5kcyBBY3Rpb25GbnMsIFN0YXRlPiA9IChcbiAgYWN0aW9uczogU3RhdGVBY3Rpb25GbnMsXG4gIG9uOiA8UmVkdWNlckFjdGlvbiBleHRlbmRzIHsgdHlwZTogc3RyaW5nIH0+KFxuICAgIGFjdGlvbjogUmVkdWNlckFjdGlvbixcbiAgICByZWR1Y2VyRm46IFJlZHVjZXJGdW5jdGlvbjxBY3Rpb25GblBheWxvYWQ8UmVkdWNlckFjdGlvbj4sIFN0YXRlPlxuICApID0+IHZvaWRcbikgPT4gdm9pZDtcblxuLyoqIEVmZmVjdCAqKi9cblxudHlwZSBFZmZlY3RzRmFjdG9yeTxTdGF0ZUFjdGlvbkZucyBleHRlbmRzIEFjdGlvbkZucz4gPSAoXG4gIGFjdGlvbnM6IFN0YXRlQWN0aW9uRm5zLFxuICBjcmVhdGU6IDxFZmZlY3RBY3Rpb24gZXh0ZW5kcyB7IHR5cGU6IHN0cmluZyB9PihcbiAgICBhY3Rpb246IEVmZmVjdEFjdGlvblxuICApID0+IE9ic2VydmFibGU8QWN0aW9uRm5QYXlsb2FkPEVmZmVjdEFjdGlvbj4+XG4pID0+IFJlY29yZDxzdHJpbmcsIE9ic2VydmFibGU8dW5rbm93bj4+O1xuXG5mdW5jdGlvbiBjcmVhdGVBY3Rpb25GbnM8U3BlYyBleHRlbmRzIEFjdGlvbnNGblNwZWNzPihcbiAgYWN0aW9uRm5TcGVjczogU3BlYyxcbiAgcmVkdWNlclJlZ2lzdHJ5OiBSZWNvcmQ8XG4gICAgc3RyaW5nLFxuICAgIChwYXlsb2FkOiBBY3Rpb25GblBheWxvYWQ8dW5rbm93bj4sIHN0YXRlOiB1bmtub3duKSA9PiB2b2lkXG4gID4sXG4gIGVmZmVjdHNSZWdpc3RyeTogUmVjb3JkPHN0cmluZywgU3ViamVjdDxBY3Rpb25GblBheWxvYWQ8dW5rbm93bj4+PixcbiAgc3RhdGU6IHVua25vd25cbikge1xuICBjb25zdCBhY3Rpb25GbnM6IFJlY29yZDxzdHJpbmcsIEFjdGlvbkZuPiA9IHt9O1xuXG4gIGZvciAoY29uc3QgdHlwZSBpbiBhY3Rpb25GblNwZWNzKSB7XG4gICAgY29uc3QgYWN0aW9uRm4gPSAocGF5bG9hZDogUGF5bG9hZCkgPT4ge1xuICAgICAgY29uc3QgZnVsbFBheWxvYWQgPSB7IC4uLnBheWxvYWQsIHR5cGUgfTtcbiAgICAgIGNvbnN0IHJlZHVjZXIgPSByZWR1Y2VyUmVnaXN0cnlbdHlwZV07XG4gICAgICBpZiAocmVkdWNlcikge1xuICAgICAgICAocmVkdWNlciBhcyAocGF5bG9hZDogdW5rbm93biwgc3RhdGU6IHVua25vd24pID0+IHZvaWQpKFxuICAgICAgICAgIGZ1bGxQYXlsb2FkIGFzIHVua25vd24sXG4gICAgICAgICAgc3RhdGVcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGVmZmVjdFN1YmplY3QgPSBlZmZlY3RzUmVnaXN0cnlbdHlwZV07XG4gICAgICBpZiAoZWZmZWN0U3ViamVjdCkge1xuICAgICAgICAoZWZmZWN0U3ViamVjdCBhcyB1bmtub3duIGFzIFN1YmplY3Q8dW5rbm93bj4pLm5leHQoZnVsbFBheWxvYWQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZ1bGxQYXlsb2FkO1xuICAgIH07XG4gICAgYWN0aW9uRm4udHlwZSA9IHR5cGUudG9TdHJpbmcoKTtcbiAgICBhY3Rpb25GbnNbdHlwZV0gPSBhY3Rpb25GbjtcbiAgfVxuXG4gIHJldHVybiBhY3Rpb25GbnM7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVB1YmxpY0FuZEFsbEFjdGlvbnNGbnM8U3BlYyBleHRlbmRzIEFjdGlvbnNGblNwZWNzPihcbiAgYWN0aW9uRm5TcGVjczogU3BlYyxcbiAgcmVkdWNlclJlZ2lzdHJ5OiBSZWNvcmQ8XG4gICAgc3RyaW5nLFxuICAgIChwYXlsb2FkOiBBY3Rpb25GblBheWxvYWQ8dW5rbm93bj4sIHN0YXRlOiB1bmtub3duKSA9PiB2b2lkXG4gID4sXG4gIGVmZmVjdHNSZWdpc3RyeTogUmVjb3JkPHN0cmluZywgU3ViamVjdDxBY3Rpb25GblBheWxvYWQ8dW5rbm93bj4+PixcbiAgc3RhdGU6IHVua25vd25cbik6IHsgYWxsOiBBY3Rpb25GbnM7IHB1YmxpY3M6IEFjdGlvbkZucyB9IHtcbiAgaWYgKCdwdWJsaWMnIGluIGFjdGlvbkZuU3BlY3MgfHwgJ3ByaXZhdGUnIGluIGFjdGlvbkZuU3BlY3MpIHtcbiAgICBjb25zdCBwcml2YXRlcyA9IGFjdGlvbkZuU3BlY3NbJ3ByaXZhdGUnXSB8fCB7fTtcbiAgICBjb25zdCBwdWJsaWNzID0gYWN0aW9uRm5TcGVjc1sncHVibGljJ10gfHwge307XG5cbiAgICBhc3NlcnRBY3Rpb25GblNwZWNzKHByaXZhdGVzKTtcbiAgICBhc3NlcnRBY3Rpb25GblNwZWNzKHB1YmxpY3MpO1xuXG4gICAgY29uc3QgcHJpdmF0ZUFjdGlvbkZucyA9IGNyZWF0ZUFjdGlvbkZucyhcbiAgICAgIHByaXZhdGVzLFxuICAgICAgcmVkdWNlclJlZ2lzdHJ5LFxuICAgICAgZWZmZWN0c1JlZ2lzdHJ5LFxuICAgICAgc3RhdGVcbiAgICApO1xuICAgIGNvbnN0IHB1YmxpY0FjdGlvbkZucyA9IGNyZWF0ZUFjdGlvbkZucyhcbiAgICAgIHB1YmxpY3MsXG4gICAgICByZWR1Y2VyUmVnaXN0cnksXG4gICAgICBlZmZlY3RzUmVnaXN0cnksXG4gICAgICBzdGF0ZVxuICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgYWxsOiB7IC4uLnByaXZhdGVBY3Rpb25GbnMsIC4uLnB1YmxpY0FjdGlvbkZucyB9LFxuICAgICAgcHVibGljczogcHVibGljQWN0aW9uRm5zLFxuICAgIH07XG4gIH1cblxuICBjb25zdCBhY3Rpb25GbnMgPSBjcmVhdGVBY3Rpb25GbnMoXG4gICAgYWN0aW9uRm5TcGVjcyxcbiAgICByZWR1Y2VyUmVnaXN0cnksXG4gICAgZWZmZWN0c1JlZ2lzdHJ5LFxuICAgIHN0YXRlXG4gICk7XG5cbiAgcmV0dXJuIHsgYWxsOiBhY3Rpb25GbnMsIHB1YmxpY3M6IGFjdGlvbkZucyB9O1xufVxuXG5mdW5jdGlvbiBmaWxsUmVkdWNlclJlZ2lzdHJ5KFxuICByZWR1Y2VyOiBSZWR1Y2VyRmFjdG9yeTxBY3Rpb25GbnMsIHVua25vd24+LFxuICBhY3Rpb25GbnM6IEFjdGlvbkZucyxcbiAgcmVkdWNlclJlZ2lzdHJ5OiBSZWNvcmQ8XG4gICAgc3RyaW5nLFxuICAgIChwYXlsb2FkOiBBY3Rpb25GblBheWxvYWQ8dW5rbm93bj4sIHN0YXRlOiB1bmtub3duKSA9PiB2b2lkXG4gID5cbikge1xuICBmdW5jdGlvbiBvbihcbiAgICBhY3Rpb246IHsgdHlwZTogc3RyaW5nIH0sXG4gICAgcmVkdWNlckZuOiAocGF5bG9hZDogQWN0aW9uRm5QYXlsb2FkPHVua25vd24+LCBzdGF0ZTogdW5rbm93bikgPT4gdm9pZFxuICApIHtcbiAgICByZWR1Y2VyUmVnaXN0cnlbYWN0aW9uLnR5cGVdID0gcmVkdWNlckZuO1xuICB9XG5cbiAgcmVkdWNlcihhY3Rpb25GbnMsIG9uKTtcblxuICByZXR1cm4gcmVkdWNlclJlZ2lzdHJ5O1xufVxuXG5mdW5jdGlvbiBmaWxsRWZmZWN0cyhcbiAgZWZmZWN0czogRWZmZWN0c0ZhY3Rvcnk8QWN0aW9uRm5zPixcbiAgYWN0aW9uRm5zOiBBY3Rpb25GbnMsXG4gIGVmZmVjdHNSZWdpc3RyeTogUmVjb3JkPHN0cmluZywgU3ViamVjdDxBY3Rpb25GblBheWxvYWQ8dW5rbm93bj4+PiA9IHt9XG4pOiBPYnNlcnZhYmxlPHVua25vd24+W10ge1xuICBmdW5jdGlvbiBjcmVhdGUoYWN0aW9uOiB7IHR5cGU6IHN0cmluZyB9KSB7XG4gICAgY29uc3Qgc3ViamVjdCA9IG5ldyBTdWJqZWN0PEFjdGlvbkZuUGF5bG9hZDx1bmtub3duPj4oKTtcbiAgICBlZmZlY3RzUmVnaXN0cnlbYWN0aW9uLnR5cGVdID0gc3ViamVjdDtcbiAgICByZXR1cm4gc3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIGNvbnN0IGVmZmVjdE9ic2VydmFibGVzID0gZWZmZWN0cyhhY3Rpb25GbnMsIGNyZWF0ZSk7XG4gIHJldHVybiBPYmplY3QudmFsdWVzKGVmZmVjdE9ic2VydmFibGVzKTtcbn1cblxuZnVuY3Rpb24gc3RhcnRTdWJzY3JpcHRpb25zKG9ic2VydmFibGVzOiBPYnNlcnZhYmxlPHVua25vd24+W10pIHtcbiAgcmV0dXJuIG9ic2VydmFibGVzLm1hcCgob2JzZXJ2YWJsZSkgPT4gb2JzZXJ2YWJsZS5zdWJzY3JpYmUoKSk7XG59XG5cbmZ1bmN0aW9uIHByb2Nlc3NSZWR1eDxTcGVjIGV4dGVuZHMgQWN0aW9uc0ZuU3BlY3MsIFJldHVyblR5cGU+KFxuICBhY3Rpb25GblNwZWNzOiBTcGVjLFxuICByZWR1Y2VyOiBSZWR1Y2VyRmFjdG9yeTxBY3Rpb25GbnMsIHVua25vd24+LFxuICBlZmZlY3RzOiBFZmZlY3RzRmFjdG9yeTxBY3Rpb25GbnM+LFxuICBzdG9yZTogdW5rbm93blxuKSB7XG4gIGNvbnN0IHJlZHVjZXJSZWdpc3RyeTogUmVjb3JkPFxuICAgIHN0cmluZyxcbiAgICAocGF5bG9hZDogQWN0aW9uRm5QYXlsb2FkPHVua25vd24+LCBzdGF0ZTogdW5rbm93bikgPT4gdm9pZFxuICA+ID0ge307XG4gIGNvbnN0IGVmZmVjdHNSZWdpc3RyeTogUmVjb3JkPHN0cmluZywgU3ViamVjdDxBY3Rpb25GblBheWxvYWQ8dW5rbm93bj4+PiA9IHt9O1xuICBjb25zdCBhY3Rpb25zTWFwID0gY3JlYXRlUHVibGljQW5kQWxsQWN0aW9uc0ZucyhcbiAgICBhY3Rpb25GblNwZWNzLFxuICAgIHJlZHVjZXJSZWdpc3RyeSxcbiAgICBlZmZlY3RzUmVnaXN0cnksXG4gICAgc3RvcmVcbiAgKTtcbiAgY29uc3QgYWN0aW9uRm5zID0gYWN0aW9uc01hcC5hbGw7XG4gIGNvbnN0IHB1YmxpY0FjdGlvbnNGbnMgPSBhY3Rpb25zTWFwLnB1YmxpY3M7XG5cbiAgZmlsbFJlZHVjZXJSZWdpc3RyeShyZWR1Y2VyLCBhY3Rpb25GbnMsIHJlZHVjZXJSZWdpc3RyeSk7XG4gIGNvbnN0IGVmZmVjdE9ic2VydmFibGVzID0gZmlsbEVmZmVjdHMoZWZmZWN0cywgYWN0aW9uRm5zLCBlZmZlY3RzUmVnaXN0cnkpO1xuICBjb25zdCBzdWJzY3JpcHRpb25zID0gc3RhcnRTdWJzY3JpcHRpb25zKGVmZmVjdE9ic2VydmFibGVzKTtcblxuICByZXR1cm4ge1xuICAgIG1ldGhvZHM6IHB1YmxpY0FjdGlvbnNGbnMgYXMgUmV0dXJuVHlwZSxcbiAgICBzdWJzY3JpcHRpb25zOiBzdWJzY3JpcHRpb25zLFxuICB9O1xufVxuXG4vKipcbiAqIEBwYXJhbSByZWR1eCByZWR1eFxuICpcbiAqIHByb3BlcnRpZXMgZG8gbm90IHN0YXJ0IHdpdGggYHdpdGhgIHNpbmNlIHRoZXkgYXJlIG5vdCBleHRlbnNpb24gZnVuY3Rpb25zIG9uIHRoZWlyIG93bi5cbiAqXG4gKiBubyBkZXBlbmRlbmN5IHRvIE5nUnhcbiAqXG4gKiBhY3Rpb25zIGFyZSBwYXNzZWQgdG8gcmVkdWNlciBhbmQgZWZmZWN0cywgYnV0IGl0IGlzIGFsc28gcG9zc2libGUgdG8gdXNlIG90aGVyIGFjdGlvbnMuXG4gKiBlZmZlY3RzIHByb3ZpZGUgZm9yQWN0aW9uIGFuZCBkbyBub3QgcmV0dXJuIGFueXRoaW5nLiB0aGF0IGlzIGltcG9ydGFudCBiZWNhdXNlIGVmZmVjdHMgc2hvdWxkIHN0YXkgaW5hY2Nlc3NpYmxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aXRoUmVkdXg8XG4gIFNwZWMgZXh0ZW5kcyBBY3Rpb25zRm5TcGVjcyxcbiAgSW5wdXQgZXh0ZW5kcyBTaWduYWxTdG9yZUZlYXR1cmVSZXN1bHQsXG4gIFN0YXRlQWN0aW9uRm5zIGV4dGVuZHMgQWN0aW9uRm5zQ3JlYXRvcjxTcGVjPiA9IEFjdGlvbkZuc0NyZWF0b3I8U3BlYz4sXG4gIFB1YmxpY1N0b3JlQWN0aW9uRm5zIGV4dGVuZHMgUHVibGljQWN0aW9uRm5zPFNwZWM+ID0gUHVibGljQWN0aW9uRm5zPFNwZWM+XG4+KHJlZHV4OiB7XG4gIGFjdGlvbnM6IFNwZWM7XG4gIHJlZHVjZXI6IFJlZHVjZXJGYWN0b3J5PFN0YXRlQWN0aW9uRm5zLCBTdGF0ZVNpZ25hbDxJbnB1dFsnc3RhdGUnXT4+O1xuICBlZmZlY3RzOiBFZmZlY3RzRmFjdG9yeTxTdGF0ZUFjdGlvbkZucz47XG59KTogU2lnbmFsU3RvcmVGZWF0dXJlPFxuICBJbnB1dCxcbiAgRW1wdHlGZWF0dXJlUmVzdWx0ICYgeyBtZXRob2RzOiBQdWJsaWNTdG9yZUFjdGlvbkZucyB9XG4+IHtcbiAgcmV0dXJuIChzdG9yZSkgPT4ge1xuICAgIGNvbnN0IHsgbWV0aG9kcywgc3Vic2NyaXB0aW9ucyB9ID0gcHJvY2Vzc1JlZHV4PFNwZWMsIFB1YmxpY1N0b3JlQWN0aW9uRm5zPihcbiAgICAgIHJlZHV4LmFjdGlvbnMsXG4gICAgICByZWR1eC5yZWR1Y2VyIGFzIFJlZHVjZXJGYWN0b3J5PEFjdGlvbkZucywgdW5rbm93bj4sXG4gICAgICByZWR1eC5lZmZlY3RzIGFzIEVmZmVjdHNGYWN0b3J5PEFjdGlvbkZucz4sXG4gICAgICBzdG9yZVxuICAgICk7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN0b3JlLFxuICAgICAgbWV0aG9kcyxcbiAgICB9O1xuICB9O1xufVxuIl19
@@ -0,0 +1,186 @@
1
+ import { patchState as patchState$1 } from '@ngrx/signals';
2
+ import { signal, effect, PLATFORM_ID, inject } from '@angular/core';
3
+ import { isPlatformServer } from '@angular/common';
4
+ import { Subject } from 'rxjs';
5
+
6
+ const storeRegistry = signal({});
7
+ let currentActionNames = new Set();
8
+ let synchronizationInitialized = false;
9
+ function initSynchronization() {
10
+ effect(() => {
11
+ if (!connection) {
12
+ return;
13
+ }
14
+ const stores = storeRegistry();
15
+ const rootState = {};
16
+ for (const name in stores) {
17
+ const store = stores[name];
18
+ rootState[name] = store();
19
+ }
20
+ const names = Array.from(currentActionNames);
21
+ const type = names.length ? names.join(', ') : 'Store Update';
22
+ currentActionNames = new Set();
23
+ connection.send({ type }, rootState);
24
+ });
25
+ }
26
+ function getValueFromSymbol(obj, symbol) {
27
+ if (typeof obj === 'object' && obj && symbol in obj) {
28
+ return obj[symbol];
29
+ }
30
+ }
31
+ function getStoreSignal(store) {
32
+ const [signalStateKey] = Object.getOwnPropertySymbols(store);
33
+ if (!signalStateKey) {
34
+ throw new Error('Cannot find State Signal');
35
+ }
36
+ return getValueFromSymbol(store, signalStateKey);
37
+ }
38
+ let connection;
39
+ /**
40
+ * required for testing. is not exported during build
41
+ */
42
+ function reset() {
43
+ connection = undefined;
44
+ synchronizationInitialized = false;
45
+ storeRegistry.set({});
46
+ }
47
+ /**
48
+ * @param name store's name as it should appear in the DevTools
49
+ */
50
+ function withDevtools(name) {
51
+ return (store) => {
52
+ const isServer = isPlatformServer(inject(PLATFORM_ID));
53
+ if (isServer) {
54
+ return store;
55
+ }
56
+ const extensions = window.__REDUX_DEVTOOLS_EXTENSION__;
57
+ if (!extensions) {
58
+ return store;
59
+ }
60
+ if (!connection) {
61
+ connection = extensions.connect({
62
+ name: 'NgRx Signal Store',
63
+ });
64
+ }
65
+ const storeSignal = getStoreSignal(store);
66
+ storeRegistry.update((value) => ({
67
+ ...value,
68
+ [name]: storeSignal,
69
+ }));
70
+ if (!synchronizationInitialized) {
71
+ initSynchronization();
72
+ synchronizationInitialized = true;
73
+ }
74
+ return store;
75
+ };
76
+ }
77
+ const patchState = (state, action, ...rest) => {
78
+ currentActionNames.add(action);
79
+ return patchState$1(state, ...rest);
80
+ };
81
+
82
+ function assertActionFnSpecs(obj) {
83
+ if (!obj || typeof obj !== 'object') {
84
+ throw new Error('%o is not an Action Specification');
85
+ }
86
+ }
87
+
88
+ function payload() {
89
+ return {};
90
+ }
91
+ const noPayload = {};
92
+ function createActionFns(actionFnSpecs, reducerRegistry, effectsRegistry, state) {
93
+ const actionFns = {};
94
+ for (const type in actionFnSpecs) {
95
+ const actionFn = (payload) => {
96
+ const fullPayload = { ...payload, type };
97
+ const reducer = reducerRegistry[type];
98
+ if (reducer) {
99
+ reducer(fullPayload, state);
100
+ }
101
+ const effectSubject = effectsRegistry[type];
102
+ if (effectSubject) {
103
+ effectSubject.next(fullPayload);
104
+ }
105
+ return fullPayload;
106
+ };
107
+ actionFn.type = type.toString();
108
+ actionFns[type] = actionFn;
109
+ }
110
+ return actionFns;
111
+ }
112
+ function createPublicAndAllActionsFns(actionFnSpecs, reducerRegistry, effectsRegistry, state) {
113
+ if ('public' in actionFnSpecs || 'private' in actionFnSpecs) {
114
+ const privates = actionFnSpecs['private'] || {};
115
+ const publics = actionFnSpecs['public'] || {};
116
+ assertActionFnSpecs(privates);
117
+ assertActionFnSpecs(publics);
118
+ const privateActionFns = createActionFns(privates, reducerRegistry, effectsRegistry, state);
119
+ const publicActionFns = createActionFns(publics, reducerRegistry, effectsRegistry, state);
120
+ return {
121
+ all: { ...privateActionFns, ...publicActionFns },
122
+ publics: publicActionFns,
123
+ };
124
+ }
125
+ const actionFns = createActionFns(actionFnSpecs, reducerRegistry, effectsRegistry, state);
126
+ return { all: actionFns, publics: actionFns };
127
+ }
128
+ function fillReducerRegistry(reducer, actionFns, reducerRegistry) {
129
+ function on(action, reducerFn) {
130
+ reducerRegistry[action.type] = reducerFn;
131
+ }
132
+ reducer(actionFns, on);
133
+ return reducerRegistry;
134
+ }
135
+ function fillEffects(effects, actionFns, effectsRegistry = {}) {
136
+ function create(action) {
137
+ const subject = new Subject();
138
+ effectsRegistry[action.type] = subject;
139
+ return subject.asObservable();
140
+ }
141
+ const effectObservables = effects(actionFns, create);
142
+ return Object.values(effectObservables);
143
+ }
144
+ function startSubscriptions(observables) {
145
+ return observables.map((observable) => observable.subscribe());
146
+ }
147
+ function processRedux(actionFnSpecs, reducer, effects, store) {
148
+ const reducerRegistry = {};
149
+ const effectsRegistry = {};
150
+ const actionsMap = createPublicAndAllActionsFns(actionFnSpecs, reducerRegistry, effectsRegistry, store);
151
+ const actionFns = actionsMap.all;
152
+ const publicActionsFns = actionsMap.publics;
153
+ fillReducerRegistry(reducer, actionFns, reducerRegistry);
154
+ const effectObservables = fillEffects(effects, actionFns, effectsRegistry);
155
+ const subscriptions = startSubscriptions(effectObservables);
156
+ return {
157
+ methods: publicActionsFns,
158
+ subscriptions: subscriptions,
159
+ };
160
+ }
161
+ /**
162
+ * @param redux redux
163
+ *
164
+ * properties do not start with `with` since they are not extension functions on their own.
165
+ *
166
+ * no dependency to NgRx
167
+ *
168
+ * actions are passed to reducer and effects, but it is also possible to use other actions.
169
+ * effects provide forAction and do not return anything. that is important because effects should stay inaccessible
170
+ */
171
+ function withRedux(redux) {
172
+ return (store) => {
173
+ const { methods, subscriptions } = processRedux(redux.actions, redux.reducer, redux.effects, store);
174
+ return {
175
+ ...store,
176
+ methods,
177
+ };
178
+ };
179
+ }
180
+
181
+ /**
182
+ * Generated bundle index. Do not edit.
183
+ */
184
+
185
+ export { noPayload, patchState, payload, withDevtools, withRedux };
186
+ //# sourceMappingURL=angular-architects-ngrx-toolkit.mjs.map
@@ -0,0 +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":";;;;;AAuBA,MAAM,aAAa,GAAG,MAAM,CAAkC,EAAE,CAAC,CAAC;AAElE,IAAI,kBAAkB,GAAG,IAAI,GAAG,EAAU,CAAC;AAE3C,IAAI,0BAA0B,GAAG,KAAK,CAAC;AAEvC,SAAS,mBAAmB,GAAA;IAC1B,MAAM,CAAC,MAAK;QACV,IAAI,CAAC,UAAU,EAAE;YACf,OAAO;AACR,SAAA;AAED,QAAA,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;QAC/B,MAAM,SAAS,GAA4B,EAAE,CAAC;AAC9C,QAAA,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE;AACzB,YAAA,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;AAC3B,YAAA,SAAS,CAAC,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC;AAC3B,SAAA;QAED,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;AAC7C,QAAA,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC;AAC9D,QAAA,kBAAkB,GAAG,IAAI,GAAG,EAAU,CAAC;QAEvC,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,SAAS,CAAC,CAAC;AACvC,KAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,kBAAkB,CAAC,GAAY,EAAE,MAAc,EAAA;IACtD,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,IAAI,MAAM,IAAI,GAAG,EAAE;AACnD,QAAA,OAAQ,GAA8B,CAAC,MAAM,CAAC,CAAC;AAChD,KAAA;AACH,CAAC;AAED,SAAS,cAAc,CAAC,KAAc,EAAA;IACpC,MAAM,CAAC,cAAc,CAAC,GAAG,MAAM,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC;IAC7D,IAAI,CAAC,cAAc,EAAE;AACnB,QAAA,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;AAC7C,KAAA;AAED,IAAA,OAAO,kBAAkB,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;AACnD,CAAC;AAKD,IAAI,UAAuC,CAAC;AAE5C;;AAEG;SACa,KAAK,GAAA;IACnB,UAAU,GAAG,SAAS,CAAC;IACvB,0BAA0B,GAAG,KAAK,CAAC;AACnC,IAAA,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AACxB,CAAC;AAED;;AAEG;AACG,SAAU,YAAY,CAC1B,IAAY,EAAA;IAEZ,OAAO,CAAC,KAAK,KAAI;QACf,MAAM,QAAQ,GAAG,gBAAgB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC;AACvD,QAAA,IAAI,QAAQ,EAAE;AACZ,YAAA,OAAO,KAAK,CAAC;AACd,SAAA;AAED,QAAA,MAAM,UAAU,GAAG,MAAM,CAAC,4BAA4B,CAAC;QACvD,IAAI,CAAC,UAAU,EAAE;AACf,YAAA,OAAO,KAAK,CAAC;AACd,SAAA;QAED,IAAI,CAAC,UAAU,EAAE;AACf,YAAA,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC;AAC9B,gBAAA,IAAI,EAAE,mBAAmB;AAC1B,aAAA,CAAC,CAAC;AACJ,SAAA;AAED,QAAA,MAAM,WAAW,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;QAC1C,aAAa,CAAC,MAAM,CAAC,CAAC,KAAK,MAAM;AAC/B,YAAA,GAAG,KAAK;YACR,CAAC,IAAI,GAAG,WAAW;AACpB,SAAA,CAAC,CAAC,CAAC;QAEJ,IAAI,CAAC,0BAA0B,EAAE;AAC/B,YAAA,mBAAmB,EAAE,CAAC;YACtB,0BAA0B,GAAG,IAAI,CAAC;AACnC,SAAA;AAED,QAAA,OAAO,KAAK,CAAC;AACf,KAAC,CAAC;AACJ,CAAC;AASM,MAAM,UAAU,GAAY,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,KAAI;AAC5D,IAAA,kBAAkB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AAC/B,IAAA,OAAOA,YAAkB,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,CAAC;AAC5C;;AC7HM,SAAU,mBAAmB,CACjC,GAAY,EAAA;AAEZ,IAAA,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;AACnC,QAAA,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;AACtD,KAAA;AACH;;SCwCgB,OAAO,GAAA;AACrB,IAAA,OAAO,EAAU,CAAC;AACpB,CAAC;AAEM,MAAM,SAAS,GAAG,GAAG;AA0B5B,SAAS,eAAe,CACtB,aAAmB,EACnB,eAGC,EACD,eAAkE,EAClE,KAAc,EAAA;IAEd,MAAM,SAAS,GAA6B,EAAE,CAAC;AAE/C,IAAA,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE;AAChC,QAAA,MAAM,QAAQ,GAAG,CAAC,OAAgB,KAAI;YACpC,MAAM,WAAW,GAAG,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,CAAC;AACzC,YAAA,MAAM,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;AACtC,YAAA,IAAI,OAAO,EAAE;AACV,gBAAA,OAAsD,CACrD,WAAsB,EACtB,KAAK,CACN,CAAC;AACH,aAAA;AACD,YAAA,MAAM,aAAa,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;AAC5C,YAAA,IAAI,aAAa,EAAE;AAChB,gBAAA,aAA6C,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;AAClE,aAAA;AACD,YAAA,OAAO,WAAW,CAAC;AACrB,SAAC,CAAC;AACF,QAAA,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;AAChC,QAAA,SAAS,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC;AAC5B,KAAA;AAED,IAAA,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,4BAA4B,CACnC,aAAmB,EACnB,eAGC,EACD,eAAkE,EAClE,KAAc,EAAA;AAEd,IAAA,IAAI,QAAQ,IAAI,aAAa,IAAI,SAAS,IAAI,aAAa,EAAE;QAC3D,MAAM,QAAQ,GAAG,aAAa,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QAChD,MAAM,OAAO,GAAG,aAAa,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QAE9C,mBAAmB,CAAC,QAAQ,CAAC,CAAC;QAC9B,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAE7B,QAAA,MAAM,gBAAgB,GAAG,eAAe,CACtC,QAAQ,EACR,eAAe,EACf,eAAe,EACf,KAAK,CACN,CAAC;AACF,QAAA,MAAM,eAAe,GAAG,eAAe,CACrC,OAAO,EACP,eAAe,EACf,eAAe,EACf,KAAK,CACN,CAAC;QAEF,OAAO;AACL,YAAA,GAAG,EAAE,EAAE,GAAG,gBAAgB,EAAE,GAAG,eAAe,EAAE;AAChD,YAAA,OAAO,EAAE,eAAe;SACzB,CAAC;AACH,KAAA;AAED,IAAA,MAAM,SAAS,GAAG,eAAe,CAC/B,aAAa,EACb,eAAe,EACf,eAAe,EACf,KAAK,CACN,CAAC;IAEF,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;AAChD,CAAC;AAED,SAAS,mBAAmB,CAC1B,OAA2C,EAC3C,SAAoB,EACpB,eAGC,EAAA;AAED,IAAA,SAAS,EAAE,CACT,MAAwB,EACxB,SAAsE,EAAA;AAEtE,QAAA,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC;KAC1C;AAED,IAAA,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;AAEvB,IAAA,OAAO,eAAe,CAAC;AACzB,CAAC;AAED,SAAS,WAAW,CAClB,OAAkC,EAClC,SAAoB,EACpB,kBAAqE,EAAE,EAAA;IAEvE,SAAS,MAAM,CAAC,MAAwB,EAAA;AACtC,QAAA,MAAM,OAAO,GAAG,IAAI,OAAO,EAA4B,CAAC;AACxD,QAAA,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC;AACvC,QAAA,OAAO,OAAO,CAAC,YAAY,EAAE,CAAC;KAC/B;IAED,MAAM,iBAAiB,GAAG,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;AACrD,IAAA,OAAO,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;AAC1C,CAAC;AAED,SAAS,kBAAkB,CAAC,WAAkC,EAAA;AAC5D,IAAA,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,KAAK,UAAU,CAAC,SAAS,EAAE,CAAC,CAAC;AACjE,CAAC;AAED,SAAS,YAAY,CACnB,aAAmB,EACnB,OAA2C,EAC3C,OAAkC,EAClC,KAAc,EAAA;IAEd,MAAM,eAAe,GAGjB,EAAE,CAAC;IACP,MAAM,eAAe,GAAsD,EAAE,CAAC;AAC9E,IAAA,MAAM,UAAU,GAAG,4BAA4B,CAC7C,aAAa,EACb,eAAe,EACf,eAAe,EACf,KAAK,CACN,CAAC;AACF,IAAA,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,CAAC;AACjC,IAAA,MAAM,gBAAgB,GAAG,UAAU,CAAC,OAAO,CAAC;AAE5C,IAAA,mBAAmB,CAAC,OAAO,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC;IACzD,MAAM,iBAAiB,GAAG,WAAW,CAAC,OAAO,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC;AAC3E,IAAA,MAAM,aAAa,GAAG,kBAAkB,CAAC,iBAAiB,CAAC,CAAC;IAE5D,OAAO;AACL,QAAA,OAAO,EAAE,gBAA8B;AACvC,QAAA,aAAa,EAAE,aAAa;KAC7B,CAAC;AACJ,CAAC;AAED;;;;;;;;;AASG;AACG,SAAU,SAAS,CAKvB,KAID,EAAA;IAIC,OAAO,CAAC,KAAK,KAAI;QACf,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,GAAG,YAAY,CAC7C,KAAK,CAAC,OAAO,EACb,KAAK,CAAC,OAA6C,EACnD,KAAK,CAAC,OAAoC,EAC1C,KAAK,CACN,CAAC;QACF,OAAO;AACL,YAAA,GAAG,KAAK;YACR,OAAO;SACR,CAAC;AACJ,KAAC,CAAC;AACJ;;ACrQA;;AAEG;;;;"}
package/index.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export { withDevtools, patchState, Action } from './lib/with-devtools';
2
+ export * from './lib/with-redux';
@@ -0,0 +1,2 @@
1
+ import { ActionsFnSpecs } from '../with-redux';
2
+ export declare function assertActionFnSpecs(obj: unknown): asserts obj is ActionsFnSpecs;
@@ -0,0 +1,32 @@
1
+ import { patchState as originalPatchState, SignalStoreFeature } from '@ngrx/signals';
2
+ import { SignalStoreFeatureResult } from '@ngrx/signals/src/signal-store-models';
3
+ declare global {
4
+ interface Window {
5
+ __REDUX_DEVTOOLS_EXTENSION__: {
6
+ connect: (options: {
7
+ name: string;
8
+ }) => {
9
+ send: (action: Action, state: Record<string, unknown>) => void;
10
+ };
11
+ } | undefined;
12
+ }
13
+ }
14
+ type EmptyFeatureResult = {
15
+ state: {};
16
+ signals: {};
17
+ methods: {};
18
+ };
19
+ export type Action = {
20
+ type: string;
21
+ };
22
+ /**
23
+ * required for testing. is not exported during build
24
+ */
25
+ export declare function reset(): void;
26
+ /**
27
+ * @param name store's name as it should appear in the DevTools
28
+ */
29
+ export declare function withDevtools<Input extends SignalStoreFeatureResult>(name: string): SignalStoreFeature<Input, EmptyFeatureResult>;
30
+ type PatchFn = typeof originalPatchState extends (arg1: infer First, ...args: infer Rest) => infer Returner ? (state: First, action: string, ...rest: Rest) => Returner : never;
31
+ export declare const patchState: PatchFn;
32
+ export {};
@@ -0,0 +1,57 @@
1
+ import { Observable } from 'rxjs';
2
+ import { SignalStoreFeature } from '@ngrx/signals';
3
+ import { EmptyFeatureResult, SignalStoreFeatureResult } from '@ngrx/signals/src/signal-store-models';
4
+ import { StateSignal } from '@ngrx/signals/src/state-signal';
5
+ /** Actions **/
6
+ type Payload = Record<string, unknown>;
7
+ type ActionFn<Type extends string = string, ActionPayload extends Payload = Payload> = ((payload: ActionPayload) => ActionPayload & {
8
+ type: Type;
9
+ }) & {
10
+ type: Type;
11
+ };
12
+ type ActionFns = Record<string, ActionFn>;
13
+ export type ActionsFnSpecs = Record<string, Payload>;
14
+ type ActionFnCreator<Spec extends ActionsFnSpecs> = {
15
+ [ActionName in keyof Spec]: ((payload: Spec[ActionName]) => Spec[ActionName] & {
16
+ type: ActionName;
17
+ }) & {
18
+ type: ActionName & string;
19
+ };
20
+ };
21
+ type ActionFnPayload<Action> = Action extends (payload: infer Payload) => void ? Payload : never;
22
+ type ActionFnsCreator<Spec extends ActionsFnSpecs> = Spec extends {
23
+ private: Record<string, Payload>;
24
+ public: Record<string, Payload>;
25
+ } ? ActionFnCreator<Spec['private']> & ActionFnCreator<Spec['public']> : ActionFnCreator<Spec>;
26
+ type PublicActionFns<Spec extends ActionsFnSpecs> = Spec extends {
27
+ public: Record<string, Payload>;
28
+ } ? ActionFnCreator<Spec['public']> : ActionFnCreator<Spec>;
29
+ export declare function payload<Type extends Payload>(): Type;
30
+ export declare const noPayload: {};
31
+ /** Reducer **/
32
+ type ReducerFunction<ReducerAction, State> = (action: ActionFnPayload<ReducerAction>, state: State) => void;
33
+ type ReducerFactory<StateActionFns extends ActionFns, State> = (actions: StateActionFns, on: <ReducerAction extends {
34
+ type: string;
35
+ }>(action: ReducerAction, reducerFn: ReducerFunction<ActionFnPayload<ReducerAction>, State>) => void) => void;
36
+ /** Effect **/
37
+ type EffectsFactory<StateActionFns extends ActionFns> = (actions: StateActionFns, create: <EffectAction extends {
38
+ type: string;
39
+ }>(action: EffectAction) => Observable<ActionFnPayload<EffectAction>>) => Record<string, Observable<unknown>>;
40
+ /**
41
+ * @param redux redux
42
+ *
43
+ * properties do not start with `with` since they are not extension functions on their own.
44
+ *
45
+ * no dependency to NgRx
46
+ *
47
+ * actions are passed to reducer and effects, but it is also possible to use other actions.
48
+ * effects provide forAction and do not return anything. that is important because effects should stay inaccessible
49
+ */
50
+ export declare function withRedux<Spec extends ActionsFnSpecs, Input extends SignalStoreFeatureResult, StateActionFns extends ActionFnsCreator<Spec> = ActionFnsCreator<Spec>, PublicStoreActionFns extends PublicActionFns<Spec> = PublicActionFns<Spec>>(redux: {
51
+ actions: Spec;
52
+ reducer: ReducerFactory<StateActionFns, StateSignal<Input['state']>>;
53
+ effects: EffectsFactory<StateActionFns>;
54
+ }): SignalStoreFeature<Input, EmptyFeatureResult & {
55
+ methods: PublicStoreActionFns;
56
+ }>;
57
+ export {};
package/package.json ADDED
@@ -0,0 +1,27 @@
1
+ {
2
+ "name": "@angular-architects/ngrx-toolkit",
3
+ "version": "0.0.1",
4
+ "peerDependencies": {
5
+ "@angular/common": "^17.0.0",
6
+ "@angular/core": "^17.0.0",
7
+ "@ngrx/signals": "^17.0.0"
8
+ },
9
+ "dependencies": {
10
+ "tslib": "^2.3.0"
11
+ },
12
+ "private": false,
13
+ "sideEffects": false,
14
+ "module": "fesm2022/angular-architects-ngrx-toolkit.mjs",
15
+ "typings": "index.d.ts",
16
+ "exports": {
17
+ "./package.json": {
18
+ "default": "./package.json"
19
+ },
20
+ ".": {
21
+ "types": "./index.d.ts",
22
+ "esm2022": "./esm2022/angular-architects-ngrx-toolkit.mjs",
23
+ "esm": "./esm2022/angular-architects-ngrx-toolkit.mjs",
24
+ "default": "./fesm2022/angular-architects-ngrx-toolkit.mjs"
25
+ }
26
+ }
27
+ }