@flowlist/js-core 4.0.1-beta.0 → 4.0.3-beta.0

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.mts CHANGED
@@ -4,6 +4,7 @@
4
4
  type ObjectKey = string | number;
5
5
  /**
6
6
  * 通用键值对映射 - 使用 Record 以保持灵活性和性能
7
+ * 通过索引签名支持动态属性访问
7
8
  */
8
9
  type KeyMap = Record<string, unknown>;
9
10
  /**
@@ -62,7 +63,8 @@ type FetchType = 'jump' | 'sinceId' | 'page' | 'seenIds' | 'auto';
62
63
  /**
63
64
  * 请求参数的基础约束
64
65
  */
65
- interface RequestParams extends KeyMap {
66
+ interface RequestParams {
67
+ [key: string]: unknown;
66
68
  __refresh__?: boolean;
67
69
  __reload__?: boolean;
68
70
  is_up?: 0 | 1 | boolean;
@@ -105,75 +107,74 @@ type FetchResultCallback<P, R> = (_obj: {
105
107
  data: ApiResponse<R>;
106
108
  refresh: boolean;
107
109
  }) => void;
108
- interface CommonParams<P extends RequestParams = RequestParams, R extends ResultType = ResultType> {
110
+ interface CommonParams<P = RequestParams, R = ResultType> {
109
111
  readonly func: ApiContract<P, R>;
110
112
  readonly type?: FetchType;
111
113
  readonly query?: P;
112
114
  readonly uniqueKey?: string;
113
115
  readonly callback?: FetchResultCallback<P, R>;
114
116
  }
115
- interface BaseFetchConfig<P extends RequestParams = RequestParams, R extends ResultType = ResultType> extends CommonParams<P, R> {
117
+ interface BaseFetchConfig<P = RequestParams, R = ResultType> extends CommonParams<P, R> {
116
118
  readonly getter: FieldGetter;
117
119
  readonly setter: FieldSetter;
118
120
  }
119
121
  /**
120
122
  * 初始化状态的参数对外接口
121
123
  */
122
- interface InitStateParams<P extends RequestParams = RequestParams, R extends ResultType = ResultType> {
124
+ interface InitStateParams<P = RequestParams, R = ResultType> {
123
125
  readonly func: ApiContract<P, R>;
124
- readonly type: FetchType;
125
126
  readonly query?: P;
126
127
  readonly opts?: Partial<DefaultField>;
127
128
  }
128
129
  /**
129
130
  * 初始化状态的参数(内部)
130
131
  */
131
- interface InitStateType<P extends RequestParams = RequestParams, R extends ResultType = ResultType> extends InitStateParams<P, R> {
132
+ interface InitStateType<P = RequestParams, R = ResultType> extends InitStateParams<P, R> {
132
133
  readonly getter: FieldGetter;
133
134
  readonly setter: FieldSetter;
134
135
  }
135
136
  /**
136
137
  * 初始化数据的参数对外接口
137
138
  */
138
- type InitDataParams<P extends RequestParams = RequestParams, R extends ResultType = ResultType> = CommonParams<P, R>;
139
+ type InitDataParams<P = RequestParams, R = ResultType> = CommonParams<P, R>;
139
140
  /**
140
141
  * 初始化数据的参数(内部)
141
142
  */
142
- type InitDataType<P extends RequestParams = RequestParams, R extends ResultType = ResultType> = BaseFetchConfig<P, R>;
143
+ type InitDataType<P = RequestParams, R = ResultType> = BaseFetchConfig<P, R>;
143
144
  /**
144
145
  * 加载更多的参数对外接口
145
146
  */
146
- interface LoadMoreParams<P extends RequestParams = RequestParams, R extends ResultType = ResultType> extends CommonParams<P, R> {
147
+ interface LoadMoreParams<P = RequestParams, R = ResultType> extends CommonParams<P, R> {
147
148
  readonly errorRetry?: boolean;
148
149
  }
149
150
  /**
150
151
  * 加载更多的参数(内部)
151
152
  */
152
- interface LoadMoreType<P extends RequestParams = RequestParams, R extends ResultType = ResultType> extends BaseFetchConfig<P, R> {
153
+ interface LoadMoreType<P = RequestParams, R = ResultType> extends BaseFetchConfig<P, R> {
153
154
  readonly errorRetry?: boolean;
154
155
  }
155
156
  /**
156
157
  * 更新状态的参数(内部使用)
157
158
  */
158
- interface UpdateStateType<P extends RequestParams = RequestParams, R extends ResultType = ResultType, T extends KeyMap = KeyMap> {
159
+ interface UpdateStateType<P = RequestParams, R = ResultType, T = KeyMap> {
159
160
  readonly getter: FieldGetter;
160
161
  readonly setter: FieldSetter;
161
162
  readonly func: ApiContract<P, R>;
162
163
  readonly query?: P;
163
164
  readonly method: string;
164
- readonly value: T;
165
+ readonly value: T | T[] | KeyMap | KeyMap[];
165
166
  readonly id?: ObjectKey | ObjectKey[];
166
167
  readonly changeKey?: string;
167
168
  }
168
169
  /**
169
170
  * 更新状态的参数(对外接口)
170
171
  */
171
- interface UpdateStateParams<P extends RequestParams = RequestParams, R extends ResultType = ResultType, T extends KeyMap = KeyMap> {
172
+ interface UpdateStateParams<P = RequestParams, R = ResultType, T = KeyMap> {
172
173
  readonly func: ApiContract<P, R>;
173
174
  readonly type: FetchType;
174
175
  readonly query?: P;
175
176
  readonly method: string;
176
- readonly value: T | ResultArrayType | ResultObjectType | KeyMap;
177
+ readonly value: T | T[] | KeyMap | KeyMap[];
177
178
  readonly id?: ObjectKey | ObjectKey[];
178
179
  readonly changeKey?: string;
179
180
  readonly uniqueKey?: string;
@@ -198,14 +199,14 @@ interface SetErrorType {
198
199
  readonly fieldName: string;
199
200
  readonly error: Error | null;
200
201
  }
201
- interface ApiContract<P extends RequestParams = RequestParams, R extends ResultType = ResultType> {
202
+ interface ApiContract<P = RequestParams, R = ResultType> {
202
203
  (params: P): Promise<ApiResponse<R>>;
203
204
  readonly id: string;
204
205
  readonly type: FetchType;
205
206
  readonly uniqueKey: string;
206
207
  readonly paramsIgnore: string[];
207
208
  }
208
- declare function createApi<P extends RequestParams, R extends ResultType>(options: {
209
+ declare function createApi<P = RequestParams, R = ResultType>(options: {
209
210
  id: string;
210
211
  type?: FetchType;
211
212
  uniqueKey?: string;
@@ -213,13 +214,13 @@ declare function createApi<P extends RequestParams, R extends ResultType>(option
213
214
  fetcher: (params: P) => Promise<ApiResponse<R>>;
214
215
  }): ApiContract<P, R>;
215
216
 
216
- declare const initState: <P extends RequestParams = RequestParams, R extends ResultType = ResultType>({ getter, setter, func, query, opts }: InitStateType<P, R>) => Promise<void>;
217
- declare const initData: <P extends RequestParams = RequestParams, R extends ResultType = ResultType>({ getter, setter, func, query, callback }: InitDataType<P, R>) => Promise<void>;
217
+ declare const initState: <P = RequestParams, R = ResultType>({ getter, setter, func, query, opts }: InitStateType<P, R>) => Promise<void>;
218
+ declare const initData: <P = RequestParams, R = ResultType>({ getter, setter, func, query, callback }: InitDataType<P, R>) => Promise<void>;
218
219
  /**
219
220
  * 加载更多数据
220
221
  */
221
- declare const loadMore: <P extends RequestParams = RequestParams, R extends ResultType = ResultType>({ getter, setter, query, func, errorRetry, callback }: LoadMoreType<P, R>) => Promise<void>;
222
- declare const updateState: <P extends RequestParams = RequestParams, R extends ResultType = ResultType, T extends KeyMap = KeyMap>({ getter, setter, func, query, method, value, id, changeKey }: UpdateStateType<P, R, T>) => Promise<unknown>;
222
+ declare const loadMore: <P = RequestParams, R = ResultType>({ getter, setter, query, func, errorRetry, callback }: LoadMoreType<P, R>) => Promise<void>;
223
+ declare const updateState: <P = RequestParams, R = ResultType, T = KeyMap>({ getter, setter, func, query, method, id, value, changeKey }: UpdateStateType<P, R, T>) => Promise<unknown>;
223
224
 
224
225
  declare const isArray: (data: unknown) => data is unknown[];
225
226
  /**
@@ -248,7 +249,7 @@ declare const isKeyMapArray: (value: unknown) => value is KeyMap[];
248
249
  declare const isObjectKeyArray: (value: unknown) => value is ObjectKey[];
249
250
  declare const isObjectResult: (data: unknown) => data is Record<string, unknown>;
250
251
  declare const generateDefaultField: (opts?: Partial<DefaultField>) => DefaultField;
251
- declare const generateFieldName: <P extends RequestParams = RequestParams, R extends ResultType = ResultType>({ func, query }: {
252
+ declare const generateFieldName: <P = RequestParams, R = ResultType>({ func, query }: {
252
253
  func: ApiContract<P, R>;
253
254
  query?: P;
254
255
  }) => string;
package/dist/index.d.ts CHANGED
@@ -4,6 +4,7 @@
4
4
  type ObjectKey = string | number;
5
5
  /**
6
6
  * 通用键值对映射 - 使用 Record 以保持灵活性和性能
7
+ * 通过索引签名支持动态属性访问
7
8
  */
8
9
  type KeyMap = Record<string, unknown>;
9
10
  /**
@@ -62,7 +63,8 @@ type FetchType = 'jump' | 'sinceId' | 'page' | 'seenIds' | 'auto';
62
63
  /**
63
64
  * 请求参数的基础约束
64
65
  */
65
- interface RequestParams extends KeyMap {
66
+ interface RequestParams {
67
+ [key: string]: unknown;
66
68
  __refresh__?: boolean;
67
69
  __reload__?: boolean;
68
70
  is_up?: 0 | 1 | boolean;
@@ -105,75 +107,74 @@ type FetchResultCallback<P, R> = (_obj: {
105
107
  data: ApiResponse<R>;
106
108
  refresh: boolean;
107
109
  }) => void;
108
- interface CommonParams<P extends RequestParams = RequestParams, R extends ResultType = ResultType> {
110
+ interface CommonParams<P = RequestParams, R = ResultType> {
109
111
  readonly func: ApiContract<P, R>;
110
112
  readonly type?: FetchType;
111
113
  readonly query?: P;
112
114
  readonly uniqueKey?: string;
113
115
  readonly callback?: FetchResultCallback<P, R>;
114
116
  }
115
- interface BaseFetchConfig<P extends RequestParams = RequestParams, R extends ResultType = ResultType> extends CommonParams<P, R> {
117
+ interface BaseFetchConfig<P = RequestParams, R = ResultType> extends CommonParams<P, R> {
116
118
  readonly getter: FieldGetter;
117
119
  readonly setter: FieldSetter;
118
120
  }
119
121
  /**
120
122
  * 初始化状态的参数对外接口
121
123
  */
122
- interface InitStateParams<P extends RequestParams = RequestParams, R extends ResultType = ResultType> {
124
+ interface InitStateParams<P = RequestParams, R = ResultType> {
123
125
  readonly func: ApiContract<P, R>;
124
- readonly type: FetchType;
125
126
  readonly query?: P;
126
127
  readonly opts?: Partial<DefaultField>;
127
128
  }
128
129
  /**
129
130
  * 初始化状态的参数(内部)
130
131
  */
131
- interface InitStateType<P extends RequestParams = RequestParams, R extends ResultType = ResultType> extends InitStateParams<P, R> {
132
+ interface InitStateType<P = RequestParams, R = ResultType> extends InitStateParams<P, R> {
132
133
  readonly getter: FieldGetter;
133
134
  readonly setter: FieldSetter;
134
135
  }
135
136
  /**
136
137
  * 初始化数据的参数对外接口
137
138
  */
138
- type InitDataParams<P extends RequestParams = RequestParams, R extends ResultType = ResultType> = CommonParams<P, R>;
139
+ type InitDataParams<P = RequestParams, R = ResultType> = CommonParams<P, R>;
139
140
  /**
140
141
  * 初始化数据的参数(内部)
141
142
  */
142
- type InitDataType<P extends RequestParams = RequestParams, R extends ResultType = ResultType> = BaseFetchConfig<P, R>;
143
+ type InitDataType<P = RequestParams, R = ResultType> = BaseFetchConfig<P, R>;
143
144
  /**
144
145
  * 加载更多的参数对外接口
145
146
  */
146
- interface LoadMoreParams<P extends RequestParams = RequestParams, R extends ResultType = ResultType> extends CommonParams<P, R> {
147
+ interface LoadMoreParams<P = RequestParams, R = ResultType> extends CommonParams<P, R> {
147
148
  readonly errorRetry?: boolean;
148
149
  }
149
150
  /**
150
151
  * 加载更多的参数(内部)
151
152
  */
152
- interface LoadMoreType<P extends RequestParams = RequestParams, R extends ResultType = ResultType> extends BaseFetchConfig<P, R> {
153
+ interface LoadMoreType<P = RequestParams, R = ResultType> extends BaseFetchConfig<P, R> {
153
154
  readonly errorRetry?: boolean;
154
155
  }
155
156
  /**
156
157
  * 更新状态的参数(内部使用)
157
158
  */
158
- interface UpdateStateType<P extends RequestParams = RequestParams, R extends ResultType = ResultType, T extends KeyMap = KeyMap> {
159
+ interface UpdateStateType<P = RequestParams, R = ResultType, T = KeyMap> {
159
160
  readonly getter: FieldGetter;
160
161
  readonly setter: FieldSetter;
161
162
  readonly func: ApiContract<P, R>;
162
163
  readonly query?: P;
163
164
  readonly method: string;
164
- readonly value: T;
165
+ readonly value: T | T[] | KeyMap | KeyMap[];
165
166
  readonly id?: ObjectKey | ObjectKey[];
166
167
  readonly changeKey?: string;
167
168
  }
168
169
  /**
169
170
  * 更新状态的参数(对外接口)
170
171
  */
171
- interface UpdateStateParams<P extends RequestParams = RequestParams, R extends ResultType = ResultType, T extends KeyMap = KeyMap> {
172
+ interface UpdateStateParams<P = RequestParams, R = ResultType, T = KeyMap> {
172
173
  readonly func: ApiContract<P, R>;
173
174
  readonly type: FetchType;
174
175
  readonly query?: P;
175
176
  readonly method: string;
176
- readonly value: T | ResultArrayType | ResultObjectType | KeyMap;
177
+ readonly value: T | T[] | KeyMap | KeyMap[];
177
178
  readonly id?: ObjectKey | ObjectKey[];
178
179
  readonly changeKey?: string;
179
180
  readonly uniqueKey?: string;
@@ -198,14 +199,14 @@ interface SetErrorType {
198
199
  readonly fieldName: string;
199
200
  readonly error: Error | null;
200
201
  }
201
- interface ApiContract<P extends RequestParams = RequestParams, R extends ResultType = ResultType> {
202
+ interface ApiContract<P = RequestParams, R = ResultType> {
202
203
  (params: P): Promise<ApiResponse<R>>;
203
204
  readonly id: string;
204
205
  readonly type: FetchType;
205
206
  readonly uniqueKey: string;
206
207
  readonly paramsIgnore: string[];
207
208
  }
208
- declare function createApi<P extends RequestParams, R extends ResultType>(options: {
209
+ declare function createApi<P = RequestParams, R = ResultType>(options: {
209
210
  id: string;
210
211
  type?: FetchType;
211
212
  uniqueKey?: string;
@@ -213,13 +214,13 @@ declare function createApi<P extends RequestParams, R extends ResultType>(option
213
214
  fetcher: (params: P) => Promise<ApiResponse<R>>;
214
215
  }): ApiContract<P, R>;
215
216
 
216
- declare const initState: <P extends RequestParams = RequestParams, R extends ResultType = ResultType>({ getter, setter, func, query, opts }: InitStateType<P, R>) => Promise<void>;
217
- declare const initData: <P extends RequestParams = RequestParams, R extends ResultType = ResultType>({ getter, setter, func, query, callback }: InitDataType<P, R>) => Promise<void>;
217
+ declare const initState: <P = RequestParams, R = ResultType>({ getter, setter, func, query, opts }: InitStateType<P, R>) => Promise<void>;
218
+ declare const initData: <P = RequestParams, R = ResultType>({ getter, setter, func, query, callback }: InitDataType<P, R>) => Promise<void>;
218
219
  /**
219
220
  * 加载更多数据
220
221
  */
221
- declare const loadMore: <P extends RequestParams = RequestParams, R extends ResultType = ResultType>({ getter, setter, query, func, errorRetry, callback }: LoadMoreType<P, R>) => Promise<void>;
222
- declare const updateState: <P extends RequestParams = RequestParams, R extends ResultType = ResultType, T extends KeyMap = KeyMap>({ getter, setter, func, query, method, value, id, changeKey }: UpdateStateType<P, R, T>) => Promise<unknown>;
222
+ declare const loadMore: <P = RequestParams, R = ResultType>({ getter, setter, query, func, errorRetry, callback }: LoadMoreType<P, R>) => Promise<void>;
223
+ declare const updateState: <P = RequestParams, R = ResultType, T = KeyMap>({ getter, setter, func, query, method, id, value, changeKey }: UpdateStateType<P, R, T>) => Promise<unknown>;
223
224
 
224
225
  declare const isArray: (data: unknown) => data is unknown[];
225
226
  /**
@@ -248,7 +249,7 @@ declare const isKeyMapArray: (value: unknown) => value is KeyMap[];
248
249
  declare const isObjectKeyArray: (value: unknown) => value is ObjectKey[];
249
250
  declare const isObjectResult: (data: unknown) => data is Record<string, unknown>;
250
251
  declare const generateDefaultField: (opts?: Partial<DefaultField>) => DefaultField;
251
- declare const generateFieldName: <P extends RequestParams = RequestParams, R extends ResultType = ResultType>({ func, query }: {
252
+ declare const generateFieldName: <P = RequestParams, R = ResultType>({ func, query }: {
252
253
  func: ApiContract<P, R>;
253
254
  query?: P;
254
255
  }) => string;
@@ -133,11 +133,12 @@ var FlowList = (function (exports) {
133
133
  if (!query) {
134
134
  return result;
135
135
  }
136
- const filteredKeys = Object.keys(query).filter((key) => !func.paramsIgnore.includes(key)).sort();
136
+ const queryObj = query;
137
+ const filteredKeys = Object.keys(queryObj).filter((key) => !func.paramsIgnore.includes(key)).sort();
137
138
  const len = filteredKeys.length;
138
139
  for (let i = 0; i < len; i++) {
139
140
  const key = filteredKeys[i];
140
- const value = query[key];
141
+ const value = queryObj[key];
141
142
  let safeValue;
142
143
  if (typeof value === "object" && value !== null) {
143
144
  safeValue = stableSerialize(value);
@@ -234,7 +235,10 @@ var FlowList = (function (exports) {
234
235
  const stringifyId = String(getObjectDeepValue(col, changingKey));
235
236
  const index = fieldArrayMap.get(stringifyId);
236
237
  if (index !== void 0) {
237
- fieldArray[index] = { ...fieldArray[index], ...col };
238
+ const existingItem = fieldArray[index];
239
+ if (isKeyMap(existingItem)) {
240
+ Object.assign(existingItem, col);
241
+ }
238
242
  }
239
243
  }
240
244
  } else if (isKeyMap(value)) {
@@ -245,7 +249,10 @@ var FlowList = (function (exports) {
245
249
  if (!isKeyMap(col)) continue;
246
250
  const index = fieldArrayMap.get(uniqueId);
247
251
  if (index !== void 0) {
248
- fieldArray[index] = { ...fieldArray[index], ...col };
252
+ const existingItem = fieldArray[index];
253
+ if (isKeyMap(existingItem)) {
254
+ Object.assign(existingItem, col);
255
+ }
249
256
  }
250
257
  }
251
258
  }
@@ -270,8 +277,25 @@ var FlowList = (function (exports) {
270
277
  const valueObj = value;
271
278
  if (isArray(value)) {
272
279
  const currentArr = isArray(resultField) ? resultField : [];
273
- const newValue = insertBefore ? [...value, ...currentArr] : [...currentArr, ...value];
274
- field.result = newValue;
280
+ if (insertBefore) {
281
+ if (value.length === 0) {
282
+ return;
283
+ }
284
+ if (currentArr.length === 0) {
285
+ field.result = value;
286
+ return;
287
+ }
288
+ field.result = value.concat(currentArr);
289
+ } else {
290
+ if (value.length === 0) {
291
+ return;
292
+ }
293
+ if (currentArr.length === 0) {
294
+ field.result = value;
295
+ return;
296
+ }
297
+ field.result = currentArr.concat(value);
298
+ }
275
299
  return;
276
300
  }
277
301
  let target = resultField;
@@ -499,8 +523,9 @@ var FlowList = (function (exports) {
499
523
  }) => new Promise((resolve, reject) => {
500
524
  const fieldName = generateFieldName({ func, query });
501
525
  const fieldData = getter(fieldName);
502
- const doRefresh = !!query?.__refresh__;
503
- const needReset = !!query?.__reload__;
526
+ const queryAsParams = query;
527
+ const doRefresh = !!queryAsParams?.__refresh__;
528
+ const needReset = !!queryAsParams?.__reload__;
504
529
  if (fieldData && fieldData.loading) return resolve();
505
530
  if (fieldData && fieldData.fetched && !doRefresh) return resolve();
506
531
  const params = generateRequestParams({
@@ -577,6 +602,7 @@ var FlowList = (function (exports) {
577
602
  if (fieldData.extra) {
578
603
  params[enum_default.FIELD_DATA.EXTRA_KEY] = fieldData.extra;
579
604
  }
605
+ const queryAsParams = query;
580
606
  setter({
581
607
  key: fieldName,
582
608
  type: enum_default.SETTER_TYPE.MERGE,
@@ -590,7 +616,7 @@ var FlowList = (function (exports) {
590
616
  fieldName,
591
617
  type: func.type,
592
618
  page: params.page || 0,
593
- insertBefore: !!query?.is_up
619
+ insertBefore: !!queryAsParams?.is_up
594
620
  }).then(() => {
595
621
  callback?.({
596
622
  params,
@@ -630,8 +656,8 @@ var FlowList = (function (exports) {
630
656
  func,
631
657
  query,
632
658
  method,
633
- value,
634
659
  id,
660
+ value,
635
661
  changeKey
636
662
  }) => {
637
663
  return new Promise((resolve, reject) => {