@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.
@@ -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 isResultArray = (data) => Array.isArray(data);
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 && !Array.isArray(value);
71
- var isKeyMapArray = (value) => Array.isArray(value) && value.every((item) => typeof item === "object" && item !== null);
72
- var isObjectKeyArray = (value) => Array.isArray(value) && value.every((item) => typeof item === "string" || typeof item === "number");
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
- if (isKeyMap(result)) {
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 (isResultArray(result)) {
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
- field[key] = value;
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 = field[key];
267
+ const current = fieldAny[key];
268
268
  const currentArr = isArray(current) ? current : [];
269
269
  const newValue = insertBefore ? [...value, ...currentArr] : [...currentArr, ...value];
270
- field[key] = newValue;
270
+ fieldAny[key] = newValue;
271
271
  } else {
272
- field[key] = value;
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 (value.length === 0) {
282
- return;
283
- }
282
+ if (valueArr.length === 0) return;
284
283
  if (currentArr.length === 0) {
285
- field.result = value;
284
+ field.result = valueArr;
286
285
  return;
287
286
  }
288
- field.result = value.concat(currentArr);
287
+ field.result = valueArr.concat(currentArr);
289
288
  } else {
290
- if (value.length === 0) {
291
- return;
292
- }
289
+ if (valueArr.length === 0) return;
293
290
  if (currentArr.length === 0) {
294
- field.result = value;
291
+ field.result = valueArr;
295
292
  return;
296
293
  }
297
- field.result = currentArr.concat(value);
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 (isResultArray(field.result)) {
370
- result.seen_ids = getSeenIdsString(field.result, uniqueKey);
371
- const targetIndex = query.is_up ? 0 : field.result.length - 1;
372
- const targetItem = field.result[targetIndex];
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 (isResultArray(field.result)) {
379
- result.seen_ids = getSeenIdsString(field.result, uniqueKey);
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 (isResultArray(field.result)) {
383
- const targetIndex = query.is_up ? 0 : field.result.length - 1;
384
- const targetItem = field.result[targetIndex];
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 = generateFieldName({ func, query });
502
- const fieldData = getter(fieldName);
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 = generateFieldName({ func, query });
567
+ const fieldName = generateFieldName2({ func, query });
525
568
  const fieldData = getter(fieldName);
526
- const queryAsParams = query;
527
- const doRefresh = !!queryAsParams?.__refresh__;
528
- const needReset = !!queryAsParams?.__reload__;
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 || generateDefaultField(),
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 (doRefresh && !needReset) {
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
- setter({
574
- key: fieldName,
575
- type: enum_default.SETTER_TYPE.RESET,
576
- value: {
577
- ...generateDefaultField(),
578
- loading: true,
579
- error: null
580
- },
581
- callback: executeFetch
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 = generateFieldName({ func, query });
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: func.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: { loading: true, error: null },
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: !!queryAsParams?.is_up
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 = generateFieldName({ func, query });
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;