riducers 1.2.2 → 1.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +2 -1
- package/dist/index.js +54 -35
- package/dist/index.js.map +1 -1
- package/esm/index.d.ts +2 -1
- package/esm/index.js +54 -35
- package/esm/index.js.map +1 -1
- package/package.json +1 -1
- package/src/index.ts +100 -59
package/dist/index.d.ts
CHANGED
|
@@ -3,9 +3,10 @@ interface ModelObj {
|
|
|
3
3
|
}
|
|
4
4
|
type SortFn = (a: ModelObj, b: ModelObj) => number;
|
|
5
5
|
interface ReducerOpts {
|
|
6
|
-
stateType?:
|
|
6
|
+
stateType?: "list" | "map" | "static" | "mapList";
|
|
7
7
|
sort?: SortFn;
|
|
8
8
|
keyName?: string;
|
|
9
|
+
mapKeyName?: string;
|
|
9
10
|
initialState?: any;
|
|
10
11
|
}
|
|
11
12
|
declare function reducerBuilder(key: string, opts?: ReducerOpts): (state: any, action: {
|
package/dist/index.js
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.reducerBuilder = void 0;
|
|
4
4
|
const keySort = (key) => (a, b) => {
|
|
5
|
-
if (typeof a[key] ===
|
|
5
|
+
if (typeof a[key] === "number" && typeof b[key] === "number")
|
|
6
6
|
return a[key] - b[key];
|
|
7
|
-
else if (typeof a[key] ===
|
|
7
|
+
else if (typeof a[key] === "string" && typeof b[key] === "string")
|
|
8
8
|
return a[key].localeCompare(b[key]);
|
|
9
9
|
return 0;
|
|
10
10
|
};
|
|
@@ -13,22 +13,22 @@ const mapInsertReducer = (state, action) => {
|
|
|
13
13
|
if (!state)
|
|
14
14
|
state = {};
|
|
15
15
|
let resp = Array.isArray(action.payload) ? action.payload : [action.payload];
|
|
16
|
-
|
|
16
|
+
let newState = { ...state };
|
|
17
17
|
for (let i in resp) {
|
|
18
18
|
if ((_a = resp[i]) === null || _a === void 0 ? void 0 : _a[action.keyName])
|
|
19
|
-
|
|
19
|
+
newState[resp[i][action.keyName]] = { ...resp[i] };
|
|
20
20
|
}
|
|
21
|
-
return
|
|
21
|
+
return newState;
|
|
22
22
|
};
|
|
23
23
|
const mapDeleteReducer = (state, action) => {
|
|
24
24
|
if (!state)
|
|
25
25
|
state = {};
|
|
26
26
|
let resp = Array.isArray(action.payload) ? action.payload : [action.payload];
|
|
27
|
-
|
|
27
|
+
let newState = { ...state };
|
|
28
28
|
for (let i in resp) {
|
|
29
|
-
delete
|
|
29
|
+
delete newState[resp[i][action.keyName]];
|
|
30
30
|
}
|
|
31
|
-
return
|
|
31
|
+
return newState;
|
|
32
32
|
};
|
|
33
33
|
const mapReplaceReducer = (state, action) => {
|
|
34
34
|
var _a;
|
|
@@ -44,45 +44,51 @@ const listInsertReducer = (state, action) => {
|
|
|
44
44
|
if (!state)
|
|
45
45
|
state = [];
|
|
46
46
|
let resp = Array.isArray(action.payload) ? action.payload : [action.payload];
|
|
47
|
-
|
|
47
|
+
let newState = [...state];
|
|
48
48
|
let respMap = resp.map((r) => r[action.keyName]);
|
|
49
|
-
let stateMap =
|
|
49
|
+
let stateMap = newState.map((r) => r[action.keyName]);
|
|
50
50
|
let toInsert = respMap.filter((id) => stateMap.indexOf(id) < 0);
|
|
51
51
|
let toReplace = respMap.filter((id) => stateMap.indexOf(id) >= 0);
|
|
52
52
|
for (let i in toReplace) {
|
|
53
53
|
let stateIndex = stateMap.indexOf(toReplace[i]);
|
|
54
54
|
let respIndex = respMap.indexOf(toReplace[i]);
|
|
55
|
-
|
|
55
|
+
newState[stateIndex] = { ...resp[respIndex] };
|
|
56
56
|
}
|
|
57
57
|
if (toInsert.length > 0) {
|
|
58
58
|
let inserts = toInsert.map((id) => resp[respMap.indexOf(id)]);
|
|
59
|
-
|
|
59
|
+
newState = [...newState, ...inserts];
|
|
60
60
|
}
|
|
61
61
|
if (action === null || action === void 0 ? void 0 : action.sort)
|
|
62
|
-
|
|
63
|
-
return
|
|
62
|
+
newState.sort(action === null || action === void 0 ? void 0 : action.sort);
|
|
63
|
+
return newState;
|
|
64
64
|
};
|
|
65
65
|
const listSortReducer = (state, action) => {
|
|
66
66
|
if (!state)
|
|
67
67
|
state = [];
|
|
68
|
-
|
|
68
|
+
let newState = [...state];
|
|
69
69
|
let sort = (action === null || action === void 0 ? void 0 : action.sort) ? action.sort : keySort(action.keyName);
|
|
70
|
-
|
|
71
|
-
return
|
|
70
|
+
newState.sort(sort);
|
|
71
|
+
return newState;
|
|
72
72
|
};
|
|
73
73
|
const listDeleteReducer = (state, action) => {
|
|
74
|
-
if (!state)
|
|
74
|
+
if (!state || !Array.isArray(state))
|
|
75
75
|
state = [];
|
|
76
|
-
|
|
77
|
-
state = [...state];
|
|
76
|
+
let newState = [...state];
|
|
78
77
|
let resp = Array.isArray(action.payload) ? action.payload : [action.payload];
|
|
79
|
-
let stateMap =
|
|
78
|
+
let stateMap = newState.map((s) => s[action.keyName]);
|
|
80
79
|
for (let i in resp) {
|
|
81
80
|
let index = stateMap.indexOf(resp[i][action.keyName]);
|
|
82
81
|
if (index >= 0)
|
|
83
|
-
|
|
82
|
+
newState.splice(index, 1);
|
|
84
83
|
}
|
|
85
|
-
return
|
|
84
|
+
return newState;
|
|
85
|
+
};
|
|
86
|
+
const listShiftReducer = (state) => {
|
|
87
|
+
if (!state || !Array.isArray(state))
|
|
88
|
+
state = [];
|
|
89
|
+
let newState = [...state];
|
|
90
|
+
newState.shift();
|
|
91
|
+
return newState;
|
|
86
92
|
};
|
|
87
93
|
const listReplaceReducer = (state, action) => {
|
|
88
94
|
let resp = Array.isArray(action.payload) ? action.payload : [action.payload];
|
|
@@ -100,13 +106,16 @@ const objReplaceReducer = (state, action) => {
|
|
|
100
106
|
const objDeleteReducer = () => {
|
|
101
107
|
return null;
|
|
102
108
|
};
|
|
103
|
-
const OPS = [
|
|
109
|
+
const OPS = ["insert", "replace", "delete", "clear", "sort"];
|
|
104
110
|
function reducerBuilder(key, opts) {
|
|
105
111
|
var _a;
|
|
106
112
|
let initialState = opts === null || opts === void 0 ? void 0 : opts.initialState;
|
|
107
|
-
let stateType = (_a = opts === null || opts === void 0 ? void 0 : opts.stateType) !== null && _a !== void 0 ? _a :
|
|
108
|
-
let isList = stateType ===
|
|
109
|
-
let isMap = stateType ===
|
|
113
|
+
let stateType = (_a = opts === null || opts === void 0 ? void 0 : opts.stateType) !== null && _a !== void 0 ? _a : "static";
|
|
114
|
+
let isList = stateType === "list";
|
|
115
|
+
let isMap = stateType === "map";
|
|
116
|
+
let isMapList = stateType === "mapList";
|
|
117
|
+
if (isMapList && !(opts === null || opts === void 0 ? void 0 : opts.mapKeyName))
|
|
118
|
+
throw new Error("mapKeyName is required for stateType: mapList");
|
|
110
119
|
if (initialState === undefined) {
|
|
111
120
|
if (isList)
|
|
112
121
|
initialState = [];
|
|
@@ -124,6 +133,8 @@ function reducerBuilder(key, opts) {
|
|
|
124
133
|
return [];
|
|
125
134
|
else if (isMap)
|
|
126
135
|
return {};
|
|
136
|
+
else if (isMapList)
|
|
137
|
+
return {};
|
|
127
138
|
else
|
|
128
139
|
return null;
|
|
129
140
|
}
|
|
@@ -134,6 +145,7 @@ function reducerBuilder(key, opts) {
|
|
|
134
145
|
let op = m[1];
|
|
135
146
|
let payload = action.payload;
|
|
136
147
|
let keyName = (_a = opts === null || opts === void 0 ? void 0 : opts.keyName) !== null && _a !== void 0 ? _a : "id";
|
|
148
|
+
let mapKeyName = opts === null || opts === void 0 ? void 0 : opts.mapKeyName;
|
|
137
149
|
if (isMap && !OPS.includes(op)) {
|
|
138
150
|
if (payload && !Array.isArray(payload)) {
|
|
139
151
|
payload[keyName] = op;
|
|
@@ -147,32 +159,39 @@ function reducerBuilder(key, opts) {
|
|
|
147
159
|
}
|
|
148
160
|
let sort = (_b = action.sort) !== null && _b !== void 0 ? _b : opts === null || opts === void 0 ? void 0 : opts.sort;
|
|
149
161
|
if (op === "insert") {
|
|
150
|
-
if (isList && payload)
|
|
151
|
-
return listInsertReducer(state, { payload, sort, keyName });
|
|
162
|
+
if ((isList || isMapList) && payload)
|
|
163
|
+
return listInsertReducer(state, { payload, sort, keyName, mapKeyName, isMapList });
|
|
152
164
|
else if (isMap && payload)
|
|
153
165
|
return mapInsertReducer(state, { payload, keyName });
|
|
154
166
|
return objInsertReducer(state, { payload });
|
|
155
167
|
}
|
|
156
168
|
else if (op === "replace") {
|
|
157
|
-
if (isList)
|
|
158
|
-
return listReplaceReducer(state, { payload, sort, keyName });
|
|
169
|
+
if (isList || isMapList)
|
|
170
|
+
return listReplaceReducer(state, { payload, sort, keyName, mapKeyName, isMapList });
|
|
159
171
|
else if (isMap)
|
|
160
172
|
return mapReplaceReducer(state, { payload, keyName });
|
|
161
173
|
return objReplaceReducer(state, { payload });
|
|
162
174
|
}
|
|
163
175
|
else if (op === "delete") {
|
|
164
|
-
if (isList)
|
|
165
|
-
return listDeleteReducer(state, { payload, keyName });
|
|
176
|
+
if (isList || isMapList)
|
|
177
|
+
return listDeleteReducer(state, { payload, keyName, mapKeyName, isMapList });
|
|
166
178
|
else if (isMap)
|
|
167
179
|
return mapDeleteReducer(state, { payload, keyName });
|
|
168
180
|
return objDeleteReducer();
|
|
169
181
|
}
|
|
182
|
+
else if (op === "shift") {
|
|
183
|
+
if (isList || isMapList)
|
|
184
|
+
return listShiftReducer(state);
|
|
185
|
+
else {
|
|
186
|
+
console.error(`unshift is only valid for stateType: list or mapList`);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
170
189
|
else if (op === "clear") {
|
|
171
190
|
return initialState;
|
|
172
191
|
}
|
|
173
192
|
else if (op === "sort") {
|
|
174
|
-
if (isList)
|
|
175
|
-
return listSortReducer(state, { sort, keyName });
|
|
193
|
+
if (isList || isMapList)
|
|
194
|
+
return listSortReducer(state, { sort, keyName, mapKeyName, isMapList });
|
|
176
195
|
}
|
|
177
196
|
else {
|
|
178
197
|
console.error(`unknown op (${op}) in action type: ${action.type}. Op should be one of: insert, delete, replace, clear, or sort.`);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/esm/index.d.ts
CHANGED
|
@@ -3,9 +3,10 @@ interface ModelObj {
|
|
|
3
3
|
}
|
|
4
4
|
type SortFn = (a: ModelObj, b: ModelObj) => number;
|
|
5
5
|
interface ReducerOpts {
|
|
6
|
-
stateType?:
|
|
6
|
+
stateType?: "list" | "map" | "static" | "mapList";
|
|
7
7
|
sort?: SortFn;
|
|
8
8
|
keyName?: string;
|
|
9
|
+
mapKeyName?: string;
|
|
9
10
|
initialState?: any;
|
|
10
11
|
}
|
|
11
12
|
declare function reducerBuilder(key: string, opts?: ReducerOpts): (state: any, action: {
|
package/esm/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
const keySort = (key) => (a, b) => {
|
|
2
|
-
if (typeof a[key] ===
|
|
2
|
+
if (typeof a[key] === "number" && typeof b[key] === "number")
|
|
3
3
|
return a[key] - b[key];
|
|
4
|
-
else if (typeof a[key] ===
|
|
4
|
+
else if (typeof a[key] === "string" && typeof b[key] === "string")
|
|
5
5
|
return a[key].localeCompare(b[key]);
|
|
6
6
|
return 0;
|
|
7
7
|
};
|
|
@@ -9,22 +9,22 @@ const mapInsertReducer = (state, action) => {
|
|
|
9
9
|
if (!state)
|
|
10
10
|
state = {};
|
|
11
11
|
let resp = Array.isArray(action.payload) ? action.payload : [action.payload];
|
|
12
|
-
|
|
12
|
+
let newState = { ...state };
|
|
13
13
|
for (let i in resp) {
|
|
14
14
|
if (resp[i]?.[action.keyName])
|
|
15
|
-
|
|
15
|
+
newState[resp[i][action.keyName]] = { ...resp[i] };
|
|
16
16
|
}
|
|
17
|
-
return
|
|
17
|
+
return newState;
|
|
18
18
|
};
|
|
19
19
|
const mapDeleteReducer = (state, action) => {
|
|
20
20
|
if (!state)
|
|
21
21
|
state = {};
|
|
22
22
|
let resp = Array.isArray(action.payload) ? action.payload : [action.payload];
|
|
23
|
-
|
|
23
|
+
let newState = { ...state };
|
|
24
24
|
for (let i in resp) {
|
|
25
|
-
delete
|
|
25
|
+
delete newState[resp[i][action.keyName]];
|
|
26
26
|
}
|
|
27
|
-
return
|
|
27
|
+
return newState;
|
|
28
28
|
};
|
|
29
29
|
const mapReplaceReducer = (state, action) => {
|
|
30
30
|
let newState = {};
|
|
@@ -39,45 +39,51 @@ const listInsertReducer = (state, action) => {
|
|
|
39
39
|
if (!state)
|
|
40
40
|
state = [];
|
|
41
41
|
let resp = Array.isArray(action.payload) ? action.payload : [action.payload];
|
|
42
|
-
|
|
42
|
+
let newState = [...state];
|
|
43
43
|
let respMap = resp.map((r) => r[action.keyName]);
|
|
44
|
-
let stateMap =
|
|
44
|
+
let stateMap = newState.map((r) => r[action.keyName]);
|
|
45
45
|
let toInsert = respMap.filter((id) => stateMap.indexOf(id) < 0);
|
|
46
46
|
let toReplace = respMap.filter((id) => stateMap.indexOf(id) >= 0);
|
|
47
47
|
for (let i in toReplace) {
|
|
48
48
|
let stateIndex = stateMap.indexOf(toReplace[i]);
|
|
49
49
|
let respIndex = respMap.indexOf(toReplace[i]);
|
|
50
|
-
|
|
50
|
+
newState[stateIndex] = { ...resp[respIndex] };
|
|
51
51
|
}
|
|
52
52
|
if (toInsert.length > 0) {
|
|
53
53
|
let inserts = toInsert.map((id) => resp[respMap.indexOf(id)]);
|
|
54
|
-
|
|
54
|
+
newState = [...newState, ...inserts];
|
|
55
55
|
}
|
|
56
56
|
if (action?.sort)
|
|
57
|
-
|
|
58
|
-
return
|
|
57
|
+
newState.sort(action?.sort);
|
|
58
|
+
return newState;
|
|
59
59
|
};
|
|
60
60
|
const listSortReducer = (state, action) => {
|
|
61
61
|
if (!state)
|
|
62
62
|
state = [];
|
|
63
|
-
|
|
63
|
+
let newState = [...state];
|
|
64
64
|
let sort = action?.sort ? action.sort : keySort(action.keyName);
|
|
65
|
-
|
|
66
|
-
return
|
|
65
|
+
newState.sort(sort);
|
|
66
|
+
return newState;
|
|
67
67
|
};
|
|
68
68
|
const listDeleteReducer = (state, action) => {
|
|
69
|
-
if (!state)
|
|
69
|
+
if (!state || !Array.isArray(state))
|
|
70
70
|
state = [];
|
|
71
|
-
|
|
72
|
-
state = [...state];
|
|
71
|
+
let newState = [...state];
|
|
73
72
|
let resp = Array.isArray(action.payload) ? action.payload : [action.payload];
|
|
74
|
-
let stateMap =
|
|
73
|
+
let stateMap = newState.map((s) => s[action.keyName]);
|
|
75
74
|
for (let i in resp) {
|
|
76
75
|
let index = stateMap.indexOf(resp[i][action.keyName]);
|
|
77
76
|
if (index >= 0)
|
|
78
|
-
|
|
77
|
+
newState.splice(index, 1);
|
|
79
78
|
}
|
|
80
|
-
return
|
|
79
|
+
return newState;
|
|
80
|
+
};
|
|
81
|
+
const listShiftReducer = (state) => {
|
|
82
|
+
if (!state || !Array.isArray(state))
|
|
83
|
+
state = [];
|
|
84
|
+
let newState = [...state];
|
|
85
|
+
newState.shift();
|
|
86
|
+
return newState;
|
|
81
87
|
};
|
|
82
88
|
const listReplaceReducer = (state, action) => {
|
|
83
89
|
let resp = Array.isArray(action.payload) ? action.payload : [action.payload];
|
|
@@ -95,12 +101,15 @@ const objReplaceReducer = (state, action) => {
|
|
|
95
101
|
const objDeleteReducer = () => {
|
|
96
102
|
return null;
|
|
97
103
|
};
|
|
98
|
-
const OPS = [
|
|
104
|
+
const OPS = ["insert", "replace", "delete", "clear", "sort"];
|
|
99
105
|
function reducerBuilder(key, opts) {
|
|
100
106
|
let initialState = opts?.initialState;
|
|
101
|
-
let stateType = opts?.stateType ??
|
|
102
|
-
let isList = stateType ===
|
|
103
|
-
let isMap = stateType ===
|
|
107
|
+
let stateType = opts?.stateType ?? "static";
|
|
108
|
+
let isList = stateType === "list";
|
|
109
|
+
let isMap = stateType === "map";
|
|
110
|
+
let isMapList = stateType === "mapList";
|
|
111
|
+
if (isMapList && !opts?.mapKeyName)
|
|
112
|
+
throw new Error("mapKeyName is required for stateType: mapList");
|
|
104
113
|
if (initialState === undefined) {
|
|
105
114
|
if (isList)
|
|
106
115
|
initialState = [];
|
|
@@ -117,6 +126,8 @@ function reducerBuilder(key, opts) {
|
|
|
117
126
|
return [];
|
|
118
127
|
else if (isMap)
|
|
119
128
|
return {};
|
|
129
|
+
else if (isMapList)
|
|
130
|
+
return {};
|
|
120
131
|
else
|
|
121
132
|
return null;
|
|
122
133
|
}
|
|
@@ -127,6 +138,7 @@ function reducerBuilder(key, opts) {
|
|
|
127
138
|
let op = m[1];
|
|
128
139
|
let payload = action.payload;
|
|
129
140
|
let keyName = opts?.keyName ?? "id";
|
|
141
|
+
let mapKeyName = opts?.mapKeyName;
|
|
130
142
|
if (isMap && !OPS.includes(op)) {
|
|
131
143
|
if (payload && !Array.isArray(payload)) {
|
|
132
144
|
payload[keyName] = op;
|
|
@@ -140,32 +152,39 @@ function reducerBuilder(key, opts) {
|
|
|
140
152
|
}
|
|
141
153
|
let sort = action.sort ?? opts?.sort;
|
|
142
154
|
if (op === "insert") {
|
|
143
|
-
if (isList && payload)
|
|
144
|
-
return listInsertReducer(state, { payload, sort, keyName });
|
|
155
|
+
if ((isList || isMapList) && payload)
|
|
156
|
+
return listInsertReducer(state, { payload, sort, keyName, mapKeyName, isMapList });
|
|
145
157
|
else if (isMap && payload)
|
|
146
158
|
return mapInsertReducer(state, { payload, keyName });
|
|
147
159
|
return objInsertReducer(state, { payload });
|
|
148
160
|
}
|
|
149
161
|
else if (op === "replace") {
|
|
150
|
-
if (isList)
|
|
151
|
-
return listReplaceReducer(state, { payload, sort, keyName });
|
|
162
|
+
if (isList || isMapList)
|
|
163
|
+
return listReplaceReducer(state, { payload, sort, keyName, mapKeyName, isMapList });
|
|
152
164
|
else if (isMap)
|
|
153
165
|
return mapReplaceReducer(state, { payload, keyName });
|
|
154
166
|
return objReplaceReducer(state, { payload });
|
|
155
167
|
}
|
|
156
168
|
else if (op === "delete") {
|
|
157
|
-
if (isList)
|
|
158
|
-
return listDeleteReducer(state, { payload, keyName });
|
|
169
|
+
if (isList || isMapList)
|
|
170
|
+
return listDeleteReducer(state, { payload, keyName, mapKeyName, isMapList });
|
|
159
171
|
else if (isMap)
|
|
160
172
|
return mapDeleteReducer(state, { payload, keyName });
|
|
161
173
|
return objDeleteReducer();
|
|
162
174
|
}
|
|
175
|
+
else if (op === "shift") {
|
|
176
|
+
if (isList || isMapList)
|
|
177
|
+
return listShiftReducer(state);
|
|
178
|
+
else {
|
|
179
|
+
console.error(`unshift is only valid for stateType: list or mapList`);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
163
182
|
else if (op === "clear") {
|
|
164
183
|
return initialState;
|
|
165
184
|
}
|
|
166
185
|
else if (op === "sort") {
|
|
167
|
-
if (isList)
|
|
168
|
-
return listSortReducer(state, { sort, keyName });
|
|
186
|
+
if (isList || isMapList)
|
|
187
|
+
return listSortReducer(state, { sort, keyName, mapKeyName, isMapList });
|
|
169
188
|
}
|
|
170
189
|
else {
|
|
171
190
|
console.error(`unknown op (${op}) in action type: ${action.type}. Op should be one of: insert, delete, replace, clear, or sort.`);
|
package/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/index.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
|
|
2
1
|
type Id = number | string;
|
|
3
2
|
|
|
4
3
|
interface ModelObj {
|
|
@@ -11,148 +10,171 @@ interface ListAction {
|
|
|
11
10
|
payload: ModelObj | ModelObj[];
|
|
12
11
|
sort?: SortFn;
|
|
13
12
|
keyName: string;
|
|
13
|
+
mapKeyName?: string;
|
|
14
|
+
isMapList: boolean;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
interface MapAction {
|
|
18
|
+
payload: ModelObj | ModelObj[];
|
|
19
|
+
sort?: SortFn;
|
|
20
|
+
keyName: string;
|
|
14
21
|
}
|
|
15
22
|
|
|
16
23
|
interface ListSortAction {
|
|
17
24
|
sort?: SortFn;
|
|
18
25
|
keyName: string;
|
|
26
|
+
mapKeyName?: string;
|
|
27
|
+
isMapList: boolean;
|
|
19
28
|
}
|
|
20
29
|
|
|
21
30
|
const keySort = (key: string) => (a: ModelObj, b: ModelObj) => {
|
|
22
|
-
if (typeof a[key] ===
|
|
23
|
-
else if (typeof a[key] ===
|
|
31
|
+
if (typeof a[key] === "number" && typeof b[key] === "number") return a[key] - b[key];
|
|
32
|
+
else if (typeof a[key] === "string" && typeof b[key] === "string") return a[key].localeCompare(b[key]);
|
|
24
33
|
return 0;
|
|
25
34
|
};
|
|
26
35
|
|
|
27
|
-
const mapInsertReducer = (state: ModelObj, action:
|
|
36
|
+
const mapInsertReducer = (state: ModelObj, action: MapAction) => {
|
|
28
37
|
if (!state) state = {};
|
|
29
38
|
let resp: ModelObj[] = Array.isArray(action.payload) ? action.payload : [action.payload];
|
|
30
|
-
|
|
39
|
+
let newState = { ...state };
|
|
31
40
|
for (let i in resp) {
|
|
32
|
-
if (resp[i]?.[action.keyName])
|
|
41
|
+
if (resp[i]?.[action.keyName]) newState[resp[i][action.keyName]] = { ...resp[i] };
|
|
33
42
|
}
|
|
34
|
-
return
|
|
35
|
-
}
|
|
43
|
+
return newState;
|
|
44
|
+
};
|
|
36
45
|
|
|
37
|
-
const mapDeleteReducer = (state: ModelObj, action:
|
|
46
|
+
const mapDeleteReducer = (state: ModelObj, action: MapAction) => {
|
|
38
47
|
if (!state) state = {};
|
|
39
48
|
let resp: ModelObj[] = Array.isArray(action.payload) ? action.payload : [action.payload];
|
|
40
|
-
|
|
49
|
+
let newState = { ...state };
|
|
41
50
|
for (let i in resp) {
|
|
42
|
-
delete
|
|
51
|
+
delete newState[resp[i][action.keyName]];
|
|
43
52
|
}
|
|
44
|
-
return
|
|
45
|
-
}
|
|
53
|
+
return newState;
|
|
54
|
+
};
|
|
46
55
|
|
|
47
|
-
const mapReplaceReducer = (state: ModelObj, action:
|
|
56
|
+
const mapReplaceReducer = (state: ModelObj, action: MapAction) => {
|
|
48
57
|
let newState = {} as any;
|
|
49
58
|
let resp: ModelObj[] = Array.isArray(action.payload) ? action.payload : [action.payload];
|
|
50
59
|
for (let i in resp) {
|
|
51
|
-
if (resp[i]?.[action.keyName]) newState[resp[i][action.keyName]] = {...resp[i]};
|
|
60
|
+
if (resp[i]?.[action.keyName]) newState[resp[i][action.keyName]] = { ...resp[i] };
|
|
52
61
|
}
|
|
53
62
|
return newState;
|
|
54
|
-
}
|
|
63
|
+
};
|
|
55
64
|
|
|
56
65
|
const listInsertReducer = (state: ModelObj[], action: ListAction) => {
|
|
57
66
|
if (!state) state = [];
|
|
58
67
|
let resp: ModelObj[] = Array.isArray(action.payload) ? action.payload : [action.payload];
|
|
59
68
|
|
|
60
|
-
|
|
69
|
+
let newState = [...state];
|
|
61
70
|
let respMap: Id[] = resp.map((r: any) => r[action.keyName]);
|
|
62
|
-
let stateMap: Id[] =
|
|
63
|
-
let toInsert: Id[] = respMap.filter((id
|
|
71
|
+
let stateMap: Id[] = newState.map((r: any) => r[action.keyName]);
|
|
72
|
+
let toInsert: Id[] = respMap.filter((id: number | string) => stateMap.indexOf(id) < 0);
|
|
64
73
|
let toReplace: Id[] = respMap.filter((id: number | string) => stateMap.indexOf(id) >= 0);
|
|
65
74
|
for (let i in toReplace) {
|
|
66
75
|
let stateIndex = stateMap.indexOf(toReplace[i]);
|
|
67
76
|
let respIndex = respMap.indexOf(toReplace[i]);
|
|
68
|
-
|
|
77
|
+
newState[stateIndex] = { ...resp[respIndex] };
|
|
69
78
|
}
|
|
70
79
|
if (toInsert.length > 0) {
|
|
71
80
|
let inserts = toInsert.map((id: number | string) => resp[respMap.indexOf(id)]);
|
|
72
|
-
|
|
81
|
+
newState = [...newState, ...inserts];
|
|
73
82
|
}
|
|
74
|
-
if (action?.sort)
|
|
75
|
-
return
|
|
76
|
-
}
|
|
83
|
+
if (action?.sort) newState.sort(action?.sort);
|
|
84
|
+
return newState;
|
|
85
|
+
};
|
|
77
86
|
|
|
78
87
|
const listSortReducer = (state: ModelObj[], action: ListSortAction) => {
|
|
79
88
|
if (!state) state = [];
|
|
80
|
-
|
|
89
|
+
let newState = [...state];
|
|
81
90
|
let sort = action?.sort ? action.sort : keySort(action.keyName);
|
|
82
|
-
|
|
83
|
-
return
|
|
84
|
-
}
|
|
91
|
+
newState.sort(sort);
|
|
92
|
+
return newState;
|
|
93
|
+
};
|
|
85
94
|
|
|
86
95
|
const listDeleteReducer = (state: ModelObj[], action: ListAction) => {
|
|
87
|
-
if (!state) state = [];
|
|
88
|
-
|
|
96
|
+
if (!state || !Array.isArray(state)) state = [];
|
|
97
|
+
let newState = [...state];
|
|
89
98
|
let resp: ModelObj[] = Array.isArray(action.payload) ? action.payload : [action.payload];
|
|
90
99
|
|
|
91
|
-
let stateMap: Id[] =
|
|
100
|
+
let stateMap: Id[] = newState.map((s: any) => s[action.keyName]);
|
|
92
101
|
for (let i in resp) {
|
|
93
102
|
let index = stateMap.indexOf(resp[i][action.keyName]);
|
|
94
|
-
if (index >= 0)
|
|
103
|
+
if (index >= 0) newState.splice(index, 1);
|
|
95
104
|
}
|
|
96
|
-
return
|
|
105
|
+
return newState;
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
const listShiftReducer = (state: ModelObj[]) => {
|
|
109
|
+
if (!state || !Array.isArray(state)) state = [];
|
|
110
|
+
let newState = [...state];
|
|
111
|
+
newState.shift();
|
|
112
|
+
return newState;
|
|
97
113
|
}
|
|
98
114
|
|
|
99
115
|
const listReplaceReducer = (state: ModelObj[], action: ListAction) => {
|
|
100
116
|
let resp: ModelObj[] = Array.isArray(action.payload) ? action.payload : [action.payload];
|
|
101
|
-
resp = resp.map((r: any) => ({...r}));
|
|
117
|
+
resp = resp.map((r: any) => ({ ...r }));
|
|
102
118
|
if (action?.sort) resp.sort(action?.sort);
|
|
103
119
|
return resp;
|
|
104
|
-
}
|
|
120
|
+
};
|
|
105
121
|
|
|
106
122
|
const objInsertReducer = (state: any, action: { payload: any }) => {
|
|
107
|
-
return action.payload
|
|
108
|
-
}
|
|
123
|
+
return action.payload;
|
|
124
|
+
};
|
|
109
125
|
|
|
110
126
|
const objReplaceReducer = (state: any, action: { payload: any }) => {
|
|
111
|
-
return action.payload
|
|
112
|
-
}
|
|
127
|
+
return action.payload;
|
|
128
|
+
};
|
|
113
129
|
|
|
114
130
|
const objDeleteReducer = () => {
|
|
115
|
-
return null
|
|
116
|
-
}
|
|
131
|
+
return null;
|
|
132
|
+
};
|
|
117
133
|
|
|
118
134
|
interface ReducerOpts {
|
|
119
|
-
stateType?:
|
|
135
|
+
stateType?: "list" | "map" | "static" | "mapList";
|
|
120
136
|
sort?: SortFn;
|
|
121
137
|
keyName?: string;
|
|
138
|
+
mapKeyName?: string;
|
|
122
139
|
initialState?: any;
|
|
123
140
|
}
|
|
124
141
|
|
|
125
|
-
const OPS = [
|
|
142
|
+
const OPS = ["insert", "replace", "delete", "clear", "sort"];
|
|
126
143
|
function reducerBuilder(key: string, opts?: ReducerOpts) {
|
|
127
144
|
let initialState = opts?.initialState;
|
|
128
|
-
let stateType = opts?.stateType ??
|
|
129
|
-
let isList = stateType ===
|
|
130
|
-
let isMap = stateType ===
|
|
145
|
+
let stateType = opts?.stateType ?? "static";
|
|
146
|
+
let isList = stateType === "list";
|
|
147
|
+
let isMap = stateType === "map";
|
|
148
|
+
let isMapList = stateType === "mapList";
|
|
149
|
+
|
|
150
|
+
if (isMapList && !opts?.mapKeyName) throw new Error("mapKeyName is required for stateType: mapList");
|
|
151
|
+
|
|
131
152
|
if (initialState === undefined) {
|
|
132
153
|
if (isList) initialState = [];
|
|
133
154
|
else if (isMap) initialState = {};
|
|
134
155
|
else initialState = null;
|
|
135
156
|
}
|
|
136
|
-
return (state: any, action: { type: string; payload?: any; sort?: (a: ModelObj, b: ModelObj) => number }) => {
|
|
137
|
-
|
|
157
|
+
return (state: any, action: { type: string; payload?: any; sort?: (a: ModelObj, b: ModelObj) => number }) => {
|
|
138
158
|
if (state === undefined) {
|
|
139
159
|
if (initialState !== undefined) return initialState;
|
|
140
160
|
else if (isList) return [];
|
|
141
161
|
else if (isMap) return {};
|
|
162
|
+
else if (isMapList) return {};
|
|
142
163
|
else return null;
|
|
143
164
|
}
|
|
144
165
|
let rx = new RegExp(`^${key}/([^\/]+)$`);
|
|
145
166
|
let m = action.type.match(rx);
|
|
146
167
|
if (!m) return state;
|
|
147
|
-
|
|
168
|
+
|
|
148
169
|
let op = m[1];
|
|
149
170
|
let payload = action.payload;
|
|
150
171
|
let keyName = opts?.keyName ?? "id";
|
|
172
|
+
let mapKeyName = opts?.mapKeyName;
|
|
151
173
|
|
|
152
174
|
if (isMap && !OPS.includes(op)) {
|
|
153
175
|
if (payload && !Array.isArray(payload)) {
|
|
154
176
|
payload[keyName] = op;
|
|
155
|
-
op = "insert";
|
|
177
|
+
op = "insert";
|
|
156
178
|
}
|
|
157
179
|
if (!payload) {
|
|
158
180
|
payload = {};
|
|
@@ -163,24 +185,43 @@ return (state: any, action: { type: string; payload?: any; sort?: (a: ModelObj,
|
|
|
163
185
|
|
|
164
186
|
let sort = action.sort ?? opts?.sort;
|
|
165
187
|
if (op === "insert") {
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
return
|
|
188
|
+
|
|
189
|
+
if ((isList || isMapList) && payload) return listInsertReducer(state, { payload, sort, keyName, mapKeyName, isMapList });
|
|
190
|
+
else if (isMap && payload) return mapInsertReducer(state, { payload, keyName });
|
|
191
|
+
return objInsertReducer(state, { payload });
|
|
192
|
+
|
|
169
193
|
} else if (op === "replace") {
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
return
|
|
194
|
+
|
|
195
|
+
if (isList || isMapList) return listReplaceReducer(state, { payload, sort, keyName, mapKeyName, isMapList });
|
|
196
|
+
else if (isMap) return mapReplaceReducer(state, { payload, keyName });
|
|
197
|
+
return objReplaceReducer(state, { payload });
|
|
198
|
+
|
|
173
199
|
} else if (op === "delete") {
|
|
174
|
-
|
|
175
|
-
|
|
200
|
+
|
|
201
|
+
if (isList || isMapList) return listDeleteReducer(state, { payload, keyName, mapKeyName, isMapList });
|
|
202
|
+
else if (isMap) return mapDeleteReducer(state, { payload, keyName });
|
|
176
203
|
return objDeleteReducer();
|
|
204
|
+
|
|
205
|
+
} else if (op === "shift") {
|
|
206
|
+
if (isList || isMapList) return listShiftReducer(state);
|
|
207
|
+
else {
|
|
208
|
+
console.error(`unshift is only valid for stateType: list or mapList`);
|
|
209
|
+
}
|
|
210
|
+
|
|
177
211
|
} else if (op === "clear") {
|
|
212
|
+
|
|
178
213
|
return initialState;
|
|
214
|
+
|
|
179
215
|
} else if (op === "sort") {
|
|
180
|
-
|
|
216
|
+
|
|
217
|
+
if (isList || isMapList) return listSortReducer(state, { sort, keyName, mapKeyName, isMapList });
|
|
218
|
+
|
|
181
219
|
} else {
|
|
220
|
+
|
|
182
221
|
console.error(`unknown op (${op}) in action type: ${action.type}. Op should be one of: insert, delete, replace, clear, or sort.`);
|
|
222
|
+
|
|
183
223
|
}
|
|
224
|
+
|
|
184
225
|
return state || (isList ? [] : isMap ? {} : null);
|
|
185
226
|
};
|
|
186
227
|
}
|