@flowlist/js-core 4.0.4-beta.0 → 4.0.6-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 +121 -150
- package/dist/index.d.ts +121 -150
- package/dist/index.global.js +119 -121
- package/dist/index.global.js.map +1 -1
- package/dist/index.js +119 -121
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +119 -122
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.global.js
CHANGED
|
@@ -51,25 +51,27 @@ var FlowList = (function (exports) {
|
|
|
51
51
|
generateFieldName: () => generateFieldName,
|
|
52
52
|
generateRequestParams: () => generateRequestParams,
|
|
53
53
|
getObjectDeepValue: () => getObjectDeepValue,
|
|
54
|
+
getResultAsArray: () => getResultAsArray,
|
|
54
55
|
isArray: () => isArray,
|
|
55
56
|
isKeyMap: () => isKeyMap,
|
|
56
57
|
isKeyMapArray: () => isKeyMapArray,
|
|
57
58
|
isObjectKey: () => isObjectKey,
|
|
58
59
|
isObjectKeyArray: () => isObjectKeyArray,
|
|
59
60
|
isObjectResult: () => isObjectResult,
|
|
60
|
-
isResultArray: () => isResultArray,
|
|
61
61
|
isResultObject: () => isResultObject,
|
|
62
62
|
searchValueByKey: () => searchValueByKey,
|
|
63
63
|
setReactivityField: () => setReactivityField,
|
|
64
|
+
stableSerialize: () => stableSerialize,
|
|
65
|
+
toObjectKey: () => toObjectKey,
|
|
66
|
+
updateArrayItem: () => updateArrayItem,
|
|
64
67
|
updateObjectDeepValue: () => updateObjectDeepValue
|
|
65
68
|
});
|
|
66
69
|
var isArray = (data) => Array.isArray(data);
|
|
67
|
-
var
|
|
68
|
-
var isResultObject = (data) => !Array.isArray(data) && typeof data === "object" && data !== null;
|
|
70
|
+
var isResultObject = (data) => !isArray(data) && typeof data === "object" && data !== null;
|
|
69
71
|
var isObjectKey = (value) => typeof value === "string" || typeof value === "number";
|
|
70
|
-
var isKeyMap = (value) => typeof value === "object" && value !== null && !
|
|
71
|
-
var isKeyMapArray = (value) =>
|
|
72
|
-
var isObjectKeyArray = (value) =>
|
|
72
|
+
var isKeyMap = (value) => typeof value === "object" && value !== null && !isArray(value);
|
|
73
|
+
var isKeyMapArray = (value) => isArray(value) && value.every((item) => typeof item === "object" && item !== null);
|
|
74
|
+
var isObjectKeyArray = (value) => isArray(value) && value.every((item) => typeof item === "string" || typeof item === "number");
|
|
73
75
|
var stableSerialize = (value) => {
|
|
74
76
|
if (value === null || typeof value !== "object") {
|
|
75
77
|
return String(value);
|
|
@@ -115,6 +117,7 @@ var FlowList = (function (exports) {
|
|
|
115
117
|
};
|
|
116
118
|
var generateDefaultField = (opts = {}) => ({
|
|
117
119
|
result: [],
|
|
120
|
+
// 默认为空数组,但强制转换为泛型 T
|
|
118
121
|
noMore: false,
|
|
119
122
|
nothing: false,
|
|
120
123
|
loading: false,
|
|
@@ -161,11 +164,7 @@ var FlowList = (function (exports) {
|
|
|
161
164
|
if (result == null || typeof result !== "object") {
|
|
162
165
|
return void 0;
|
|
163
166
|
}
|
|
164
|
-
|
|
165
|
-
result = result[keysArr[i]];
|
|
166
|
-
} else {
|
|
167
|
-
return void 0;
|
|
168
|
-
}
|
|
167
|
+
result = result[keysArr[i]];
|
|
169
168
|
}
|
|
170
169
|
return result;
|
|
171
170
|
};
|
|
@@ -194,7 +193,7 @@ var FlowList = (function (exports) {
|
|
|
194
193
|
}
|
|
195
194
|
};
|
|
196
195
|
var searchValueByKey = (result, id, key) => {
|
|
197
|
-
if (
|
|
196
|
+
if (isArray(result)) {
|
|
198
197
|
const index = computeMatchedItemIndex(id, result, key);
|
|
199
198
|
return index >= 0 ? result[index] : void 0;
|
|
200
199
|
}
|
|
@@ -258,18 +257,19 @@ var FlowList = (function (exports) {
|
|
|
258
257
|
}
|
|
259
258
|
};
|
|
260
259
|
var setReactivityField = (field, key, value, type, insertBefore) => {
|
|
260
|
+
const fieldAny = field;
|
|
261
261
|
if (type === enum_default.FETCH_TYPE.PAGINATION) {
|
|
262
|
-
|
|
262
|
+
fieldAny[key] = value;
|
|
263
263
|
return;
|
|
264
264
|
}
|
|
265
265
|
if (key !== enum_default.FIELD_DATA.RESULT_KEY) {
|
|
266
266
|
if (isArray(value)) {
|
|
267
|
-
const current =
|
|
267
|
+
const current = fieldAny[key];
|
|
268
268
|
const currentArr = isArray(current) ? current : [];
|
|
269
269
|
const newValue = insertBefore ? [...value, ...currentArr] : [...currentArr, ...value];
|
|
270
|
-
|
|
270
|
+
fieldAny[key] = newValue;
|
|
271
271
|
} else {
|
|
272
|
-
|
|
272
|
+
fieldAny[key] = value;
|
|
273
273
|
}
|
|
274
274
|
return;
|
|
275
275
|
}
|
|
@@ -277,24 +277,21 @@ var FlowList = (function (exports) {
|
|
|
277
277
|
const valueObj = value;
|
|
278
278
|
if (isArray(value)) {
|
|
279
279
|
const currentArr = isArray(resultField) ? resultField : [];
|
|
280
|
+
const valueArr = value;
|
|
280
281
|
if (insertBefore) {
|
|
281
|
-
if (
|
|
282
|
-
return;
|
|
283
|
-
}
|
|
282
|
+
if (valueArr.length === 0) return;
|
|
284
283
|
if (currentArr.length === 0) {
|
|
285
|
-
field.result =
|
|
284
|
+
field.result = valueArr;
|
|
286
285
|
return;
|
|
287
286
|
}
|
|
288
|
-
field.result =
|
|
287
|
+
field.result = valueArr.concat(currentArr);
|
|
289
288
|
} else {
|
|
290
|
-
if (
|
|
291
|
-
return;
|
|
292
|
-
}
|
|
289
|
+
if (valueArr.length === 0) return;
|
|
293
290
|
if (currentArr.length === 0) {
|
|
294
|
-
field.result =
|
|
291
|
+
field.result = valueArr;
|
|
295
292
|
return;
|
|
296
293
|
}
|
|
297
|
-
field.result = currentArr.concat(
|
|
294
|
+
field.result = currentArr.concat(valueArr);
|
|
298
295
|
}
|
|
299
296
|
return;
|
|
300
297
|
}
|
|
@@ -361,27 +358,28 @@ var FlowList = (function (exports) {
|
|
|
361
358
|
}) => {
|
|
362
359
|
const result = { ...query };
|
|
363
360
|
const isFetched = field.fetched;
|
|
361
|
+
const fieldResultAny = field.result;
|
|
364
362
|
const getSafeObjectKey = (item) => {
|
|
365
363
|
return extractUniqueKey(item, uniqueKey);
|
|
366
364
|
};
|
|
367
365
|
if (isFetched) {
|
|
368
366
|
if (type === enum_default.FETCH_TYPE.AUTO) {
|
|
369
|
-
if (
|
|
370
|
-
result.seen_ids = getSeenIdsString(
|
|
371
|
-
const targetIndex = query.is_up ? 0 :
|
|
372
|
-
const targetItem =
|
|
367
|
+
if (isArray(fieldResultAny)) {
|
|
368
|
+
result.seen_ids = getSeenIdsString(fieldResultAny, uniqueKey);
|
|
369
|
+
const targetIndex = query.is_up ? 0 : fieldResultAny.length - 1;
|
|
370
|
+
const targetItem = fieldResultAny[targetIndex];
|
|
373
371
|
result.since_id = getSafeObjectKey(targetItem);
|
|
374
372
|
}
|
|
375
373
|
result.is_up = query.is_up ? 1 : 0;
|
|
376
374
|
result.page = typeof query.page === "number" ? query.page : field.page + 1;
|
|
377
375
|
} else if (type === enum_default.FETCH_TYPE.HAS_LOADED_IDS) {
|
|
378
|
-
if (
|
|
379
|
-
result.seen_ids = getSeenIdsString(
|
|
376
|
+
if (isArray(fieldResultAny)) {
|
|
377
|
+
result.seen_ids = getSeenIdsString(fieldResultAny, uniqueKey);
|
|
380
378
|
}
|
|
381
379
|
} else if (type === enum_default.FETCH_TYPE.SINCE_FIRST_OR_END_ID) {
|
|
382
|
-
if (
|
|
383
|
-
const targetIndex = query.is_up ? 0 :
|
|
384
|
-
const targetItem =
|
|
380
|
+
if (isArray(fieldResultAny)) {
|
|
381
|
+
const targetIndex = query.is_up ? 0 : fieldResultAny.length - 1;
|
|
382
|
+
const targetItem = fieldResultAny[targetIndex];
|
|
385
383
|
result.since_id = getSafeObjectKey(targetItem);
|
|
386
384
|
}
|
|
387
385
|
result.is_up = query.is_up ? 1 : 0;
|
|
@@ -409,6 +407,24 @@ var FlowList = (function (exports) {
|
|
|
409
407
|
}
|
|
410
408
|
return result;
|
|
411
409
|
};
|
|
410
|
+
var toObjectKey = (id) => {
|
|
411
|
+
if (id === void 0) return void 0;
|
|
412
|
+
if (isObjectKey(id)) return id;
|
|
413
|
+
if (isObjectKeyArray(id) && id.length > 0) return id[0];
|
|
414
|
+
return void 0;
|
|
415
|
+
};
|
|
416
|
+
var getResultAsArray = (field) => {
|
|
417
|
+
const result = field[enum_default.FIELD_DATA.RESULT_KEY];
|
|
418
|
+
return isArray(result) ? result : null;
|
|
419
|
+
};
|
|
420
|
+
var updateArrayItem = (arr, index, updater) => {
|
|
421
|
+
if (index >= 0 && index < arr.length) {
|
|
422
|
+
const item = arr[index];
|
|
423
|
+
if (isKeyMap(item)) {
|
|
424
|
+
arr[index] = updater(item);
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
};
|
|
412
428
|
|
|
413
429
|
// src/setters.ts
|
|
414
430
|
var SET_DATA = ({
|
|
@@ -490,6 +506,39 @@ var FlowList = (function (exports) {
|
|
|
490
506
|
};
|
|
491
507
|
|
|
492
508
|
// src/actions.ts
|
|
509
|
+
var generateFieldName2 = ({
|
|
510
|
+
func,
|
|
511
|
+
query
|
|
512
|
+
}) => {
|
|
513
|
+
let result = func.id;
|
|
514
|
+
if (!query) return result;
|
|
515
|
+
const queryObj = query;
|
|
516
|
+
const filteredKeys = Object.keys(queryObj).filter((key) => !func.paramsIgnore.includes(key)).sort();
|
|
517
|
+
for (const key of filteredKeys) {
|
|
518
|
+
const value = queryObj[key];
|
|
519
|
+
const safeValue = typeof value === "object" && value !== null ? stableSerialize(value) : String(value);
|
|
520
|
+
result += `-${key}-${encodeURIComponent(safeValue)}`;
|
|
521
|
+
}
|
|
522
|
+
return result;
|
|
523
|
+
};
|
|
524
|
+
var createApi = (options) => {
|
|
525
|
+
const fn = ((params) => options.fetcher(params));
|
|
526
|
+
const metadata = {
|
|
527
|
+
id: options.id,
|
|
528
|
+
type: options.type || enum_default.FETCH_TYPE.SCROLL_LOAD_MORE,
|
|
529
|
+
uniqueKey: options.uniqueKey || enum_default.DEFAULT_UNIQUE_KEY_NAME,
|
|
530
|
+
paramsIgnore: [
|
|
531
|
+
"page",
|
|
532
|
+
"is_up",
|
|
533
|
+
"since_id",
|
|
534
|
+
"seen_ids",
|
|
535
|
+
"__refresh__",
|
|
536
|
+
"__reload__",
|
|
537
|
+
...options.paramsIgnore || []
|
|
538
|
+
]
|
|
539
|
+
};
|
|
540
|
+
return Object.freeze(Object.assign(fn, metadata));
|
|
541
|
+
};
|
|
493
542
|
var initState = ({
|
|
494
543
|
getter,
|
|
495
544
|
setter,
|
|
@@ -498,19 +547,13 @@ var FlowList = (function (exports) {
|
|
|
498
547
|
opts
|
|
499
548
|
}) => {
|
|
500
549
|
return new Promise((resolve) => {
|
|
501
|
-
const fieldName =
|
|
502
|
-
|
|
503
|
-
if (fieldData) {
|
|
504
|
-
resolve();
|
|
505
|
-
return;
|
|
506
|
-
}
|
|
550
|
+
const fieldName = generateFieldName2({ func, query });
|
|
551
|
+
if (getter(fieldName)) return resolve();
|
|
507
552
|
setter({
|
|
508
553
|
key: fieldName,
|
|
509
554
|
type: enum_default.SETTER_TYPE.RESET,
|
|
510
555
|
value: generateDefaultField(opts),
|
|
511
|
-
callback: () =>
|
|
512
|
-
resolve();
|
|
513
|
-
}
|
|
556
|
+
callback: () => resolve()
|
|
514
557
|
});
|
|
515
558
|
});
|
|
516
559
|
};
|
|
@@ -521,17 +564,17 @@ var FlowList = (function (exports) {
|
|
|
521
564
|
query,
|
|
522
565
|
callback
|
|
523
566
|
}) => new Promise((resolve, reject) => {
|
|
524
|
-
const fieldName =
|
|
567
|
+
const fieldName = generateFieldName2({ func, query });
|
|
525
568
|
const fieldData = getter(fieldName);
|
|
526
|
-
const
|
|
527
|
-
const
|
|
528
|
-
const
|
|
569
|
+
const doRefresh = !!query?.__refresh__;
|
|
570
|
+
const needReset = !!query?.__reload__;
|
|
571
|
+
const directlyLoadData = doRefresh && !needReset;
|
|
572
|
+
if (fieldData && fieldData.error && !doRefresh) return resolve();
|
|
529
573
|
if (fieldData && fieldData.loading) return resolve();
|
|
530
574
|
if (fieldData && fieldData.fetched && !doRefresh) return resolve();
|
|
531
575
|
const params = generateRequestParams({
|
|
532
|
-
field: fieldData
|
|
576
|
+
field: generateDefaultField({ ...fieldData, fetched: false }),
|
|
533
577
|
uniqueKey: func.uniqueKey,
|
|
534
|
-
// 自动从契约获取
|
|
535
578
|
type: func.type,
|
|
536
579
|
query
|
|
537
580
|
});
|
|
@@ -547,15 +590,11 @@ var FlowList = (function (exports) {
|
|
|
547
590
|
page: params.page || 0,
|
|
548
591
|
insertBefore: false
|
|
549
592
|
}).then(() => {
|
|
550
|
-
callback?.({
|
|
551
|
-
params,
|
|
552
|
-
data,
|
|
553
|
-
refresh: doRefresh
|
|
554
|
-
});
|
|
593
|
+
callback?.({ params, data, refresh: doRefresh });
|
|
555
594
|
resolve();
|
|
556
595
|
});
|
|
557
596
|
};
|
|
558
|
-
if (
|
|
597
|
+
if (directlyLoadData) {
|
|
559
598
|
setter({
|
|
560
599
|
key: fieldName,
|
|
561
600
|
type: enum_default.SETTER_TYPE.RESET,
|
|
@@ -570,16 +609,16 @@ var FlowList = (function (exports) {
|
|
|
570
609
|
reject(error);
|
|
571
610
|
});
|
|
572
611
|
};
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
error: null
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
}
|
|
612
|
+
if (directlyLoadData) {
|
|
613
|
+
executeFetch();
|
|
614
|
+
} else {
|
|
615
|
+
setter({
|
|
616
|
+
key: fieldName,
|
|
617
|
+
type: enum_default.SETTER_TYPE.RESET,
|
|
618
|
+
value: { ...generateDefaultField(), loading: true, error: null },
|
|
619
|
+
callback: executeFetch
|
|
620
|
+
});
|
|
621
|
+
}
|
|
583
622
|
});
|
|
584
623
|
var loadMore = ({
|
|
585
624
|
getter,
|
|
@@ -589,40 +628,38 @@ var FlowList = (function (exports) {
|
|
|
589
628
|
errorRetry,
|
|
590
629
|
callback
|
|
591
630
|
}) => new Promise((resolve, reject) => {
|
|
592
|
-
const fieldName =
|
|
631
|
+
const fieldName = generateFieldName2({ func, query });
|
|
593
632
|
const fieldData = getter(fieldName);
|
|
594
633
|
if (!fieldData || fieldData.loading || fieldData.nothing) return resolve();
|
|
595
634
|
if (fieldData.noMore && !errorRetry) return resolve();
|
|
635
|
+
const type = func.type;
|
|
636
|
+
if (type === enum_default.FETCH_TYPE.PAGINATION && query?.page != null && Number(query.page) === fieldData.page) {
|
|
637
|
+
return resolve();
|
|
638
|
+
}
|
|
639
|
+
const loadingState = type === enum_default.FETCH_TYPE.PAGINATION ? { loading: true, error: null, result: [], extra: null } : { loading: true, error: null };
|
|
596
640
|
const params = generateRequestParams({
|
|
597
641
|
field: fieldData,
|
|
598
642
|
uniqueKey: func.uniqueKey,
|
|
599
|
-
type
|
|
643
|
+
type,
|
|
600
644
|
query
|
|
601
645
|
});
|
|
602
|
-
if (fieldData.extra)
|
|
603
|
-
params[enum_default.FIELD_DATA.EXTRA_KEY] = fieldData.extra;
|
|
604
|
-
}
|
|
605
|
-
const queryAsParams = query;
|
|
646
|
+
if (fieldData.extra) params.extra = fieldData.extra;
|
|
606
647
|
setter({
|
|
607
648
|
key: fieldName,
|
|
608
649
|
type: enum_default.SETTER_TYPE.MERGE,
|
|
609
|
-
value:
|
|
650
|
+
value: loadingState,
|
|
610
651
|
callback: () => {
|
|
611
652
|
func(params).then((data) => {
|
|
612
653
|
SET_DATA({
|
|
613
654
|
getter,
|
|
614
655
|
setter,
|
|
615
656
|
data,
|
|
657
|
+
type,
|
|
616
658
|
fieldName,
|
|
617
|
-
type: func.type,
|
|
618
659
|
page: params.page || 0,
|
|
619
|
-
insertBefore: !!
|
|
660
|
+
insertBefore: !!query?.is_up
|
|
620
661
|
}).then(() => {
|
|
621
|
-
callback?.({
|
|
622
|
-
params,
|
|
623
|
-
data,
|
|
624
|
-
refresh: false
|
|
625
|
-
});
|
|
662
|
+
callback?.({ params, data, refresh: false });
|
|
626
663
|
resolve();
|
|
627
664
|
});
|
|
628
665
|
}).catch((error) => {
|
|
@@ -632,24 +669,6 @@ var FlowList = (function (exports) {
|
|
|
632
669
|
}
|
|
633
670
|
});
|
|
634
671
|
});
|
|
635
|
-
var toObjectKey = (id) => {
|
|
636
|
-
if (id === void 0) return void 0;
|
|
637
|
-
if (isObjectKey(id)) return id;
|
|
638
|
-
if (isObjectKeyArray(id) && id.length > 0) return id[0];
|
|
639
|
-
return void 0;
|
|
640
|
-
};
|
|
641
|
-
var getResultAsArray = (field) => {
|
|
642
|
-
const result = field[enum_default.FIELD_DATA.RESULT_KEY];
|
|
643
|
-
return isResultArray(result) ? result : null;
|
|
644
|
-
};
|
|
645
|
-
var updateArrayItem = (arr, index, updater) => {
|
|
646
|
-
if (index >= 0 && index < arr.length) {
|
|
647
|
-
const item = arr[index];
|
|
648
|
-
if (isKeyMap(item)) {
|
|
649
|
-
arr[index] = updater(item);
|
|
650
|
-
}
|
|
651
|
-
}
|
|
652
|
-
};
|
|
653
672
|
var updateState = ({
|
|
654
673
|
getter,
|
|
655
674
|
setter,
|
|
@@ -661,7 +680,7 @@ var FlowList = (function (exports) {
|
|
|
661
680
|
changeKey
|
|
662
681
|
}) => {
|
|
663
682
|
return new Promise((resolve, reject) => {
|
|
664
|
-
const fieldName =
|
|
683
|
+
const fieldName = generateFieldName2({ func, query });
|
|
665
684
|
const fieldData = getter(fieldName);
|
|
666
685
|
if (!fieldData) {
|
|
667
686
|
reject(new Error(`Field ${fieldName} not found.`));
|
|
@@ -820,30 +839,9 @@ var FlowList = (function (exports) {
|
|
|
820
839
|
});
|
|
821
840
|
};
|
|
822
841
|
|
|
823
|
-
// src/types.ts
|
|
824
|
-
function createApi(options) {
|
|
825
|
-
const fn = Object.assign(
|
|
826
|
-
(params) => options.fetcher(params),
|
|
827
|
-
{
|
|
828
|
-
id: options.id,
|
|
829
|
-
type: options.type || enum_default.FETCH_TYPE.SCROLL_LOAD_MORE,
|
|
830
|
-
uniqueKey: options.uniqueKey || enum_default.DEFAULT_UNIQUE_KEY_NAME,
|
|
831
|
-
paramsIgnore: [
|
|
832
|
-
"page",
|
|
833
|
-
"is_up",
|
|
834
|
-
"since_id",
|
|
835
|
-
"seen_ids",
|
|
836
|
-
"__refresh__",
|
|
837
|
-
"__reload__",
|
|
838
|
-
...options.paramsIgnore || []
|
|
839
|
-
]
|
|
840
|
-
}
|
|
841
|
-
);
|
|
842
|
-
return Object.freeze(fn);
|
|
843
|
-
}
|
|
844
|
-
|
|
845
842
|
exports.ENUM = enum_default;
|
|
846
843
|
exports.createApi = createApi;
|
|
844
|
+
exports.generateFieldName = generateFieldName2;
|
|
847
845
|
exports.initData = initData;
|
|
848
846
|
exports.initState = initState;
|
|
849
847
|
exports.loadMore = loadMore;
|