riducers 1.2.3 → 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 +34 -14
- package/dist/index.js.map +1 -1
- package/esm/index.d.ts +2 -1
- package/esm/index.js +34 -14
- package/esm/index.js.map +1 -1
- package/package.json +1 -1
- package/src/index.ts +84 -43
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
|
};
|
|
@@ -83,6 +83,13 @@ const listDeleteReducer = (state, action) => {
|
|
|
83
83
|
}
|
|
84
84
|
return newState;
|
|
85
85
|
};
|
|
86
|
+
const listShiftReducer = (state) => {
|
|
87
|
+
if (!state || !Array.isArray(state))
|
|
88
|
+
state = [];
|
|
89
|
+
let newState = [...state];
|
|
90
|
+
newState.shift();
|
|
91
|
+
return newState;
|
|
92
|
+
};
|
|
86
93
|
const listReplaceReducer = (state, action) => {
|
|
87
94
|
let resp = Array.isArray(action.payload) ? action.payload : [action.payload];
|
|
88
95
|
resp = resp.map((r) => ({ ...r }));
|
|
@@ -99,13 +106,16 @@ const objReplaceReducer = (state, action) => {
|
|
|
99
106
|
const objDeleteReducer = () => {
|
|
100
107
|
return null;
|
|
101
108
|
};
|
|
102
|
-
const OPS = [
|
|
109
|
+
const OPS = ["insert", "replace", "delete", "clear", "sort"];
|
|
103
110
|
function reducerBuilder(key, opts) {
|
|
104
111
|
var _a;
|
|
105
112
|
let initialState = opts === null || opts === void 0 ? void 0 : opts.initialState;
|
|
106
|
-
let stateType = (_a = opts === null || opts === void 0 ? void 0 : opts.stateType) !== null && _a !== void 0 ? _a :
|
|
107
|
-
let isList = stateType ===
|
|
108
|
-
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");
|
|
109
119
|
if (initialState === undefined) {
|
|
110
120
|
if (isList)
|
|
111
121
|
initialState = [];
|
|
@@ -123,6 +133,8 @@ function reducerBuilder(key, opts) {
|
|
|
123
133
|
return [];
|
|
124
134
|
else if (isMap)
|
|
125
135
|
return {};
|
|
136
|
+
else if (isMapList)
|
|
137
|
+
return {};
|
|
126
138
|
else
|
|
127
139
|
return null;
|
|
128
140
|
}
|
|
@@ -133,6 +145,7 @@ function reducerBuilder(key, opts) {
|
|
|
133
145
|
let op = m[1];
|
|
134
146
|
let payload = action.payload;
|
|
135
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;
|
|
136
149
|
if (isMap && !OPS.includes(op)) {
|
|
137
150
|
if (payload && !Array.isArray(payload)) {
|
|
138
151
|
payload[keyName] = op;
|
|
@@ -146,32 +159,39 @@ function reducerBuilder(key, opts) {
|
|
|
146
159
|
}
|
|
147
160
|
let sort = (_b = action.sort) !== null && _b !== void 0 ? _b : opts === null || opts === void 0 ? void 0 : opts.sort;
|
|
148
161
|
if (op === "insert") {
|
|
149
|
-
if (isList && payload)
|
|
150
|
-
return listInsertReducer(state, { payload, sort, keyName });
|
|
162
|
+
if ((isList || isMapList) && payload)
|
|
163
|
+
return listInsertReducer(state, { payload, sort, keyName, mapKeyName, isMapList });
|
|
151
164
|
else if (isMap && payload)
|
|
152
165
|
return mapInsertReducer(state, { payload, keyName });
|
|
153
166
|
return objInsertReducer(state, { payload });
|
|
154
167
|
}
|
|
155
168
|
else if (op === "replace") {
|
|
156
|
-
if (isList)
|
|
157
|
-
return listReplaceReducer(state, { payload, sort, keyName });
|
|
169
|
+
if (isList || isMapList)
|
|
170
|
+
return listReplaceReducer(state, { payload, sort, keyName, mapKeyName, isMapList });
|
|
158
171
|
else if (isMap)
|
|
159
172
|
return mapReplaceReducer(state, { payload, keyName });
|
|
160
173
|
return objReplaceReducer(state, { payload });
|
|
161
174
|
}
|
|
162
175
|
else if (op === "delete") {
|
|
163
|
-
if (isList)
|
|
164
|
-
return listDeleteReducer(state, { payload, keyName });
|
|
176
|
+
if (isList || isMapList)
|
|
177
|
+
return listDeleteReducer(state, { payload, keyName, mapKeyName, isMapList });
|
|
165
178
|
else if (isMap)
|
|
166
179
|
return mapDeleteReducer(state, { payload, keyName });
|
|
167
180
|
return objDeleteReducer();
|
|
168
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
|
+
}
|
|
169
189
|
else if (op === "clear") {
|
|
170
190
|
return initialState;
|
|
171
191
|
}
|
|
172
192
|
else if (op === "sort") {
|
|
173
|
-
if (isList)
|
|
174
|
-
return listSortReducer(state, { sort, keyName });
|
|
193
|
+
if (isList || isMapList)
|
|
194
|
+
return listSortReducer(state, { sort, keyName, mapKeyName, isMapList });
|
|
175
195
|
}
|
|
176
196
|
else {
|
|
177
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
|
};
|
|
@@ -78,6 +78,13 @@ const listDeleteReducer = (state, action) => {
|
|
|
78
78
|
}
|
|
79
79
|
return newState;
|
|
80
80
|
};
|
|
81
|
+
const listShiftReducer = (state) => {
|
|
82
|
+
if (!state || !Array.isArray(state))
|
|
83
|
+
state = [];
|
|
84
|
+
let newState = [...state];
|
|
85
|
+
newState.shift();
|
|
86
|
+
return newState;
|
|
87
|
+
};
|
|
81
88
|
const listReplaceReducer = (state, action) => {
|
|
82
89
|
let resp = Array.isArray(action.payload) ? action.payload : [action.payload];
|
|
83
90
|
resp = resp.map((r) => ({ ...r }));
|
|
@@ -94,12 +101,15 @@ const objReplaceReducer = (state, action) => {
|
|
|
94
101
|
const objDeleteReducer = () => {
|
|
95
102
|
return null;
|
|
96
103
|
};
|
|
97
|
-
const OPS = [
|
|
104
|
+
const OPS = ["insert", "replace", "delete", "clear", "sort"];
|
|
98
105
|
function reducerBuilder(key, opts) {
|
|
99
106
|
let initialState = opts?.initialState;
|
|
100
|
-
let stateType = opts?.stateType ??
|
|
101
|
-
let isList = stateType ===
|
|
102
|
-
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");
|
|
103
113
|
if (initialState === undefined) {
|
|
104
114
|
if (isList)
|
|
105
115
|
initialState = [];
|
|
@@ -116,6 +126,8 @@ function reducerBuilder(key, opts) {
|
|
|
116
126
|
return [];
|
|
117
127
|
else if (isMap)
|
|
118
128
|
return {};
|
|
129
|
+
else if (isMapList)
|
|
130
|
+
return {};
|
|
119
131
|
else
|
|
120
132
|
return null;
|
|
121
133
|
}
|
|
@@ -126,6 +138,7 @@ function reducerBuilder(key, opts) {
|
|
|
126
138
|
let op = m[1];
|
|
127
139
|
let payload = action.payload;
|
|
128
140
|
let keyName = opts?.keyName ?? "id";
|
|
141
|
+
let mapKeyName = opts?.mapKeyName;
|
|
129
142
|
if (isMap && !OPS.includes(op)) {
|
|
130
143
|
if (payload && !Array.isArray(payload)) {
|
|
131
144
|
payload[keyName] = op;
|
|
@@ -139,32 +152,39 @@ function reducerBuilder(key, opts) {
|
|
|
139
152
|
}
|
|
140
153
|
let sort = action.sort ?? opts?.sort;
|
|
141
154
|
if (op === "insert") {
|
|
142
|
-
if (isList && payload)
|
|
143
|
-
return listInsertReducer(state, { payload, sort, keyName });
|
|
155
|
+
if ((isList || isMapList) && payload)
|
|
156
|
+
return listInsertReducer(state, { payload, sort, keyName, mapKeyName, isMapList });
|
|
144
157
|
else if (isMap && payload)
|
|
145
158
|
return mapInsertReducer(state, { payload, keyName });
|
|
146
159
|
return objInsertReducer(state, { payload });
|
|
147
160
|
}
|
|
148
161
|
else if (op === "replace") {
|
|
149
|
-
if (isList)
|
|
150
|
-
return listReplaceReducer(state, { payload, sort, keyName });
|
|
162
|
+
if (isList || isMapList)
|
|
163
|
+
return listReplaceReducer(state, { payload, sort, keyName, mapKeyName, isMapList });
|
|
151
164
|
else if (isMap)
|
|
152
165
|
return mapReplaceReducer(state, { payload, keyName });
|
|
153
166
|
return objReplaceReducer(state, { payload });
|
|
154
167
|
}
|
|
155
168
|
else if (op === "delete") {
|
|
156
|
-
if (isList)
|
|
157
|
-
return listDeleteReducer(state, { payload, keyName });
|
|
169
|
+
if (isList || isMapList)
|
|
170
|
+
return listDeleteReducer(state, { payload, keyName, mapKeyName, isMapList });
|
|
158
171
|
else if (isMap)
|
|
159
172
|
return mapDeleteReducer(state, { payload, keyName });
|
|
160
173
|
return objDeleteReducer();
|
|
161
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
|
+
}
|
|
162
182
|
else if (op === "clear") {
|
|
163
183
|
return initialState;
|
|
164
184
|
}
|
|
165
185
|
else if (op === "sort") {
|
|
166
|
-
if (isList)
|
|
167
|
-
return listSortReducer(state, { sort, keyName });
|
|
186
|
+
if (isList || isMapList)
|
|
187
|
+
return listSortReducer(state, { sort, keyName, mapKeyName, isMapList });
|
|
168
188
|
}
|
|
169
189
|
else {
|
|
170
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":"AA6BA,MAAM,OAAO,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,CAAC,CAAW,EAAE,CAAW,EAAE,EAAE;IAC5D,IAAI,OAAO,CAAC,CAAC,GAAG,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,CAAC,GAAG,CAAC,KAAK,QAAQ;QAAE,OAAO,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;SAChF,IAAI,OAAO,CAAC,CAAC,GAAG,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,CAAC,GAAG,CAAC,KAAK,QAAQ;QAAE,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACvG,OAAO,CAAC,CAAC;AACX,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,CAAC,KAAe,EAAE,MAAiB,EAAE,EAAE;IAC9D,IAAI,CAAC,KAAK;QAAE,KAAK,GAAG,EAAE,CAAC;IACvB,IAAI,IAAI,GAAe,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACzF,IAAI,QAAQ,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC;IAC5B,KAAK,IAAI,CAAC,IAAI,IAAI,EAAE;QAClB,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC;YAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;KACnF;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,CAAC,KAAe,EAAE,MAAiB,EAAE,EAAE;IAC9D,IAAI,CAAC,KAAK;QAAE,KAAK,GAAG,EAAE,CAAC;IACvB,IAAI,IAAI,GAAe,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACzF,IAAI,QAAQ,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC;IAC5B,KAAK,IAAI,CAAC,IAAI,IAAI,EAAE;QAClB,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;KAC1C;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG,CAAC,KAAe,EAAE,MAAiB,EAAE,EAAE;IAC/D,IAAI,QAAQ,GAAG,EAAS,CAAC;IACzB,IAAI,IAAI,GAAe,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACzF,KAAK,IAAI,CAAC,IAAI,IAAI,EAAE;QAClB,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC;YAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;KACnF;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG,CAAC,KAAiB,EAAE,MAAkB,EAAE,EAAE;IAClE,IAAI,CAAC,KAAK;QAAE,KAAK,GAAG,EAAE,CAAC;IACvB,IAAI,IAAI,GAAe,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAEzF,IAAI,QAAQ,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;IAC1B,IAAI,OAAO,GAAS,IAAI,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IAC5D,IAAI,QAAQ,GAAS,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IACjE,IAAI,QAAQ,GAAS,OAAO,CAAC,MAAM,CAAC,CAAC,EAAmB,EAAE,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvF,IAAI,SAAS,GAAS,OAAO,CAAC,MAAM,CAAC,CAAC,EAAmB,EAAE,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IACzF,KAAK,IAAI,CAAC,IAAI,SAAS,EAAE;QACvB,IAAI,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QAChD,IAAI,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9C,QAAQ,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;KAC/C;IACD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;QACvB,IAAI,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAmB,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/E,QAAQ,GAAG,CAAC,GAAG,QAAQ,EAAE,GAAG,OAAO,CAAC,CAAC;KACtC;IACD,IAAI,MAAM,EAAE,IAAI;QAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC9C,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CAAC,KAAiB,EAAE,MAAsB,EAAE,EAAE;IACpE,IAAI,CAAC,KAAK;QAAE,KAAK,GAAG,EAAE,CAAC;IACvB,IAAI,QAAQ,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;IAC1B,IAAI,IAAI,GAAG,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAChE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpB,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG,CAAC,KAAiB,EAAE,MAAkB,EAAE,EAAE;IAClE,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,KAAK,GAAG,EAAE,CAAC;IAChD,IAAI,QAAQ,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;IAC1B,IAAI,IAAI,GAAe,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAEzF,IAAI,QAAQ,GAAS,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IACjE,KAAK,IAAI,CAAC,IAAI,IAAI,EAAE;QAClB,IAAI,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;QACtD,IAAI,KAAK,IAAI,CAAC;YAAE,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;KAC3C;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,CAAC,KAAiB,EAAE,EAAE;IAC7C,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,KAAK,GAAG,EAAE,CAAC;IAChD,IAAI,QAAQ,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,CAAC;IACjB,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAA;AAED,MAAM,kBAAkB,GAAG,CAAC,KAAiB,EAAE,MAAkB,EAAE,EAAE;IACnE,IAAI,IAAI,GAAe,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACzF,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IACxC,IAAI,MAAM,EAAE,IAAI;QAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC1C,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,CAAC,KAAU,EAAE,MAAwB,EAAE,EAAE;IAChE,OAAO,MAAM,CAAC,OAAO,CAAC;AACxB,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG,CAAC,KAAU,EAAE,MAAwB,EAAE,EAAE;IACjE,OAAO,MAAM,CAAC,OAAO,CAAC;AACxB,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,GAAG,EAAE;IAC5B,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAUF,MAAM,GAAG,GAAG,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;AAC7D,SAAS,cAAc,CAAC,GAAW,EAAE,IAAkB;IACrD,IAAI,YAAY,GAAG,IAAI,EAAE,YAAY,CAAC;IACtC,IAAI,SAAS,GAAG,IAAI,EAAE,SAAS,IAAI,QAAQ,CAAC;IAC5C,IAAI,MAAM,GAAG,SAAS,KAAK,MAAM,CAAC;IAClC,IAAI,KAAK,GAAG,SAAS,KAAK,KAAK,CAAC;IAChC,IAAI,SAAS,GAAG,SAAS,KAAK,SAAS,CAAC;IAExC,IAAI,SAAS,IAAI,CAAC,IAAI,EAAE,UAAU;QAAE,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IAErG,IAAI,YAAY,KAAK,SAAS,EAAE;QAC9B,IAAI,MAAM;YAAE,YAAY,GAAG,EAAE,CAAC;aACzB,IAAI,KAAK;YAAE,YAAY,GAAG,EAAE,CAAC;;YAC7B,YAAY,GAAG,IAAI,CAAC;KAC1B;IACD,OAAO,CAAC,KAAU,EAAE,MAAoF,EAAE,EAAE;QAC1G,IAAI,KAAK,KAAK,SAAS,EAAE;YACvB,IAAI,YAAY,KAAK,SAAS;gBAAE,OAAO,YAAY,CAAC;iBAC/C,IAAI,MAAM;gBAAE,OAAO,EAAE,CAAC;iBACtB,IAAI,KAAK;gBAAE,OAAO,EAAE,CAAC;iBACrB,IAAI,SAAS;gBAAE,OAAO,EAAE,CAAC;;gBACzB,OAAO,IAAI,CAAC;SAClB;QACD,IAAI,EAAE,GAAG,IAAI,MAAM,CAAC,IAAI,GAAG,YAAY,CAAC,CAAC;QACzC,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC9B,IAAI,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;QAErB,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACd,IAAI,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAC7B,IAAI,OAAO,GAAG,IAAI,EAAE,OAAO,IAAI,IAAI,CAAC;QACpC,IAAI,UAAU,GAAG,IAAI,EAAE,UAAU,CAAC;QAElC,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE;YAC9B,IAAI,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;gBACtC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;gBACtB,EAAE,GAAG,QAAQ,CAAC;aACf;YACD,IAAI,CAAC,OAAO,EAAE;gBACZ,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;gBACtB,EAAE,GAAG,QAAQ,CAAC;aACf;SACF;QAED,IAAI,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,IAAI,EAAE,IAAI,CAAC;QACrC,IAAI,EAAE,KAAK,QAAQ,EAAE;YAEnB,IAAI,CAAC,MAAM,IAAI,SAAS,CAAC,IAAI,OAAO;gBAAE,OAAO,iBAAiB,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAC;iBACpH,IAAI,KAAK,IAAI,OAAO;gBAAE,OAAO,gBAAgB,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;YAChF,OAAO,gBAAgB,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;SAE7C;aAAM,IAAI,EAAE,KAAK,SAAS,EAAE;YAE3B,IAAI,MAAM,IAAI,SAAS;gBAAE,OAAO,kBAAkB,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAC;iBACxG,IAAI,KAAK;gBAAE,OAAO,iBAAiB,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;YACtE,OAAO,iBAAiB,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;SAE9C;aAAM,IAAI,EAAE,KAAK,QAAQ,EAAE;YAE1B,IAAI,MAAM,IAAI,SAAS;gBAAE,OAAO,iBAAiB,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAC;iBACjG,IAAI,KAAK;gBAAE,OAAO,gBAAgB,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;YACrE,OAAO,gBAAgB,EAAE,CAAC;SAE3B;aAAM,IAAI,EAAE,KAAK,OAAO,EAAE;YACzB,IAAI,MAAM,IAAI,SAAS;gBAAE,OAAO,gBAAgB,CAAC,KAAK,CAAC,CAAC;iBACnD;gBACH,OAAO,CAAC,KAAK,CAAC,sDAAsD,CAAC,CAAC;aACvE;SAEF;aAAM,IAAI,EAAE,KAAK,OAAO,EAAE;YAEzB,OAAO,YAAY,CAAC;SAErB;aAAM,IAAI,EAAE,KAAK,MAAM,EAAE;YAExB,IAAI,MAAM,IAAI,SAAS;gBAAE,OAAO,eAAe,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAC;SAElG;aAAM;YAEL,OAAO,CAAC,KAAK,CAAC,eAAe,EAAE,qBAAqB,MAAM,CAAC,IAAI,iEAAiE,CAAC,CAAC;SAEnI;QAED,OAAO,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACpD,CAAC,CAAC;AACJ,CAAC;AAED,OAAO,EAAE,cAAc,EAAE,CAAC"}
|
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,47 +10,57 @@ 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
|
-
let newState = {...state};
|
|
39
|
+
let newState = { ...state };
|
|
31
40
|
for (let i in resp) {
|
|
32
|
-
if (resp[i]?.[action.keyName]) newState[resp[i][action.keyName]] = {...resp[i]};
|
|
41
|
+
if (resp[i]?.[action.keyName]) newState[resp[i][action.keyName]] = { ...resp[i] };
|
|
33
42
|
}
|
|
34
43
|
return newState;
|
|
35
|
-
}
|
|
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
|
-
let newState = {...state};
|
|
49
|
+
let newState = { ...state };
|
|
41
50
|
for (let i in resp) {
|
|
42
51
|
delete newState[resp[i][action.keyName]];
|
|
43
52
|
}
|
|
44
53
|
return newState;
|
|
45
|
-
}
|
|
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 = [];
|
|
@@ -60,12 +69,12 @@ const listInsertReducer = (state: ModelObj[], action: ListAction) => {
|
|
|
60
69
|
let newState = [...state];
|
|
61
70
|
let respMap: Id[] = resp.map((r: any) => r[action.keyName]);
|
|
62
71
|
let stateMap: Id[] = newState.map((r: any) => r[action.keyName]);
|
|
63
|
-
let toInsert: Id[] = respMap.filter((id
|
|
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
|
-
newState[stateIndex] = {...resp[respIndex]};
|
|
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)]);
|
|
@@ -73,7 +82,7 @@ const listInsertReducer = (state: ModelObj[], action: ListAction) => {
|
|
|
73
82
|
}
|
|
74
83
|
if (action?.sort) newState.sort(action?.sort);
|
|
75
84
|
return newState;
|
|
76
|
-
}
|
|
85
|
+
};
|
|
77
86
|
|
|
78
87
|
const listSortReducer = (state: ModelObj[], action: ListSortAction) => {
|
|
79
88
|
if (!state) state = [];
|
|
@@ -81,7 +90,7 @@ const listSortReducer = (state: ModelObj[], action: ListSortAction) => {
|
|
|
81
90
|
let sort = action?.sort ? action.sort : keySort(action.keyName);
|
|
82
91
|
newState.sort(sort);
|
|
83
92
|
return newState;
|
|
84
|
-
}
|
|
93
|
+
};
|
|
85
94
|
|
|
86
95
|
const listDeleteReducer = (state: ModelObj[], action: ListAction) => {
|
|
87
96
|
if (!state || !Array.isArray(state)) state = [];
|
|
@@ -94,65 +103,78 @@ const listDeleteReducer = (state: ModelObj[], action: ListAction) => {
|
|
|
94
103
|
if (index >= 0) newState.splice(index, 1);
|
|
95
104
|
}
|
|
96
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
|
}
|