@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 +7 -0
- package/esm2022/angular-architects-ngrx-toolkit.mjs +5 -0
- package/esm2022/index.mjs +3 -0
- package/esm2022/lib/assertions/assertions.mjs +6 -0
- package/esm2022/lib/with-devtools.mjs +79 -0
- package/esm2022/lib/with-redux.mjs +95 -0
- package/fesm2022/angular-architects-ngrx-toolkit.mjs +186 -0
- package/fesm2022/angular-architects-ngrx-toolkit.mjs.map +1 -0
- package/index.d.ts +2 -0
- package/lib/assertions/assertions.d.ts +2 -0
- package/lib/with-devtools.d.ts +32 -0
- package/lib/with-redux.d.ts +57 -0
- package/package.json +27 -0
package/README.md
ADDED
|
@@ -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":"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"}
|
package/index.d.ts
ADDED
|
@@ -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
|
+
}
|