@flowlist/js-core 1.7.5 → 2.1.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flowlist/js-core",
3
- "version": "1.7.5",
3
+ "version": "2.1.0",
4
4
  "main": "dist/js-core.umd.js",
5
5
  "module": "dist/js-core.es.js",
6
6
  "types": "dist/index.d.ts",
@@ -31,25 +31,26 @@
31
31
  "lint": "eslint --ext js,jsx,ts,tsx,vue . --fix"
32
32
  },
33
33
  "devDependencies": {
34
- "@typescript-eslint/eslint-plugin": "^4.18.0",
35
- "@typescript-eslint/parser": "^4.18.0",
36
- "@vue/eslint-config-prettier": "^6.0.0",
37
- "@vue/eslint-config-typescript": "^7.0.0",
38
- "eslint": "^6.7.2",
39
- "eslint-plugin-prettier": "^3.3.1",
40
- "eslint-plugin-vue": "^7.0.0",
41
34
  "@babel/preset-env": "^7.14.7",
42
35
  "@babel/preset-typescript": "^7.14.5",
43
- "@types/jest": "^26.0.24",
44
- "@vue/cli-plugin-unit-jest": "~4.5.11",
45
- "@vue/cli-service": "~4.5.11",
46
- "@vue/test-utils": "^1.1.3",
47
- "faker": "^5.4.0",
36
+ "@faker-js/faker": "^6.1.2",
37
+ "@types/jest": "^27.4.1",
38
+ "@typescript-eslint/eslint-plugin": "^5.19.0",
39
+ "@typescript-eslint/parser": "^5.19.0",
40
+ "@vue/cli-plugin-unit-jest": "~5.0.4",
41
+ "@vue/cli-service": "~5.0.4",
42
+ "@vue/eslint-config-prettier": "^7.0.0",
43
+ "@vue/eslint-config-typescript": "^10.0.0",
44
+ "@vue/test-utils": "^2.0.0-rc.19",
45
+ "eslint": "^8.13.0",
46
+ "eslint-plugin-prettier": "^4.0.0",
47
+ "eslint-plugin-vue": "^8.6.0",
48
48
  "jest-localstorage-mock": "^2.4.8",
49
- "ts-babel": "^6.1.7",
50
49
  "prettier": "^2.3.2",
51
- "typescript": "^3.0.0",
50
+ "ts-babel": "^6.1.7",
51
+ "ts-jest": "^27.1.4",
52
+ "typescript": "^4.6.3",
52
53
  "vite": "^2.3.8",
53
- "vite-plugin-dts": "^0.5.2"
54
+ "vite-plugin-dts": "^1.0.5"
54
55
  }
55
56
  }
package/src/actions.ts CHANGED
@@ -25,8 +25,8 @@ export const initState = ({
25
25
  setter,
26
26
  func,
27
27
  type,
28
- query = {},
29
- opts = {}
28
+ query,
29
+ opts
30
30
  }: initStateType): Promise<null> => {
31
31
  return new Promise((resolve) => {
32
32
  const fieldName = generateFieldName({ func, type, query })
@@ -50,20 +50,18 @@ export const initState = ({
50
50
  export const initData = ({
51
51
  getter,
52
52
  setter,
53
- cache,
54
53
  func,
55
54
  type,
56
- query = {},
55
+ query,
57
56
  api,
58
- cacheTimeout,
59
57
  uniqueKey,
60
58
  callback
61
59
  }: initDataType): Promise<any> =>
62
60
  new Promise((resolve, reject) => {
63
61
  const fieldName = generateFieldName({ func, type, query })
64
62
  const fieldData = getter(fieldName)
65
- const doRefresh = !!query.__refresh__
66
- const needReset = !!query.__reload__
63
+ const doRefresh = !!query?.__refresh__
64
+ const needReset = !!query?.__reload__
67
65
  // 如果 error 了,就不再请求
68
66
  if (fieldData && fieldData.error && !doRefresh) {
69
67
  return resolve(null)
@@ -87,7 +85,6 @@ export const initData = ({
87
85
  query,
88
86
  type
89
87
  })
90
- let fromLocal = false
91
88
 
92
89
  const getData = () => {
93
90
  const loadData = () =>
@@ -103,19 +100,7 @@ export const initData = ({
103
100
  })
104
101
  }
105
102
 
106
- if (cacheTimeout && cache) {
107
- cache
108
- .get({ key: fieldName })
109
- .then((data) => {
110
- fromLocal = true
111
- res(data)
112
- })
113
- .catch(() => {
114
- getDataFromAPI()
115
- })
116
- } else {
117
- getDataFromAPI()
118
- }
103
+ getDataFromAPI()
119
104
  })
120
105
 
121
106
  loadData().then((data) => {
@@ -123,12 +108,9 @@ export const initData = ({
123
108
  SET_DATA({
124
109
  getter,
125
110
  setter,
126
- cache,
127
111
  data,
128
112
  fieldName,
129
113
  type,
130
- fromLocal,
131
- cacheTimeout,
132
114
  page: params.page || 0,
133
115
  insertBefore: false
134
116
  }).then(() => {
@@ -177,12 +159,10 @@ export const initData = ({
177
159
  export const loadMore = ({
178
160
  getter,
179
161
  setter,
180
- cache,
181
- query = {},
162
+ query,
182
163
  type,
183
164
  func,
184
165
  api,
185
- cacheTimeout,
186
166
  uniqueKey,
187
167
  errorRetry,
188
168
  callback
@@ -207,7 +187,11 @@ export const loadMore = ({
207
187
  return resolve(null)
208
188
  }
209
189
 
210
- if (type === ENUM.FETCH_TYPE.PAGINATION && +query.page === fieldData.page) {
190
+ if (
191
+ type === ENUM.FETCH_TYPE.PAGINATION &&
192
+ query &&
193
+ +query.page === fieldData.page
194
+ ) {
211
195
  return resolve(null)
212
196
  }
213
197
 
@@ -245,14 +229,11 @@ export const loadMore = ({
245
229
  SET_DATA({
246
230
  getter,
247
231
  setter,
248
- cache,
249
232
  data,
250
233
  fieldName,
251
234
  type,
252
- fromLocal: false,
253
- cacheTimeout,
254
235
  page: params.page || 0,
255
- insertBefore: !!query.is_up
236
+ insertBefore: !!query?.is_up
256
237
  }).then(() => {
257
238
  if (callback) {
258
239
  callback({
@@ -281,16 +262,14 @@ export const loadMore = ({
281
262
  export const updateState = ({
282
263
  getter,
283
264
  setter,
284
- cache,
285
265
  type,
286
266
  func,
287
- query = {},
267
+ query,
288
268
  method,
289
269
  value,
290
270
  id,
291
271
  uniqueKey,
292
- changeKey,
293
- cacheTimeout
272
+ changeKey
294
273
  }: updateStateType) => {
295
274
  return new Promise((resolve, reject) => {
296
275
  const fieldName = generateFieldName({ func, type, query })
@@ -300,6 +279,11 @@ export const updateState = ({
300
279
  return
301
280
  }
302
281
 
282
+ if (fieldData.page === -1) {
283
+ resolve(null)
284
+ return
285
+ }
286
+
303
287
  const _id = id || ''
304
288
  const _uniqueKey = uniqueKey || ENUM.DEFAULT_UNIQUE_KEY_NAME
305
289
  const _changeKey = changeKey || ENUM.FIELD_DATA.RESULT_KEY
@@ -397,18 +381,6 @@ export const updateState = ({
397
381
  type: ENUM.SETTER_TYPE.MERGE,
398
382
  value: fieldData,
399
383
  callback: () => {
400
- if (cacheTimeout && cache) {
401
- cache
402
- .set({
403
- key: fieldName,
404
- value: fieldData,
405
- timeout: cacheTimeout
406
- })
407
- .then(resolve)
408
- .catch(resolve)
409
- return
410
- }
411
-
412
384
  resolve(null)
413
385
  }
414
386
  })
package/src/setters.ts CHANGED
@@ -1,50 +1,48 @@
1
- import { computeResultLength, setReactivityField } from './utils'
1
+ import { computeResultLength, setReactivityField, isObjectResult } from './utils'
2
2
  import ENUM from './enum'
3
3
  import type { setDataType, setErrorType } from './types'
4
4
 
5
5
  export const SET_DATA = ({
6
6
  getter,
7
7
  setter,
8
- cache,
9
8
  data,
10
9
  fieldName,
11
10
  type,
12
- fromLocal,
13
- cacheTimeout,
14
11
  page,
15
12
  insertBefore
16
13
  }: setDataType): Promise<any> => {
17
14
  return new Promise((resolve, reject) => {
18
- if (fromLocal) {
19
- setter({
20
- key: fieldName,
21
- type: ENUM.SETTER_TYPE.RESET,
22
- value: data,
23
- callback: () => {
24
- resolve(null)
25
- }
26
- })
27
- return
28
- }
29
-
30
15
  const fieldData = getter(fieldName)
31
16
  if (!fieldData) {
32
17
  reject()
33
18
  return
34
19
  }
35
20
 
36
- const { result, extra } = data
37
- const isEmpty = computeResultLength(result) === 0
38
- fieldData.nothing = fieldData.fetched ? false : isEmpty
39
- fieldData.fetched = true
40
- fieldData.total = data.total || 0
41
- if (type === ENUM.FETCH_TYPE.PAGINATION) {
42
- fieldData.noMore = false
43
- fieldData.page = +page
21
+ let result
22
+ let extra
23
+
24
+ if (isObjectResult(data)) {
25
+ result = data
26
+ fieldData.nothing = false
27
+ fieldData.fetched = true
28
+ fieldData.noMore = true
29
+ fieldData.page = -1
44
30
  } else {
45
- fieldData.noMore = data.no_more || isEmpty
46
- fieldData.page = fieldData.page + 1
31
+ result = data.result
32
+ extra = data.extra
33
+ const isEmpty = computeResultLength(result) === 0
34
+ fieldData.nothing = fieldData.fetched ? false : isEmpty
35
+ fieldData.fetched = true
36
+ fieldData.total = data.total || 0
37
+ if (type === ENUM.FETCH_TYPE.PAGINATION) {
38
+ fieldData.noMore = false
39
+ fieldData.page = +page
40
+ } else {
41
+ fieldData.noMore = data.no_more || isEmpty
42
+ fieldData.page = fieldData.page + 1
43
+ }
47
44
  }
45
+
48
46
  fieldData.loading = false
49
47
  setReactivityField(
50
48
  fieldData,
@@ -68,18 +66,6 @@ export const SET_DATA = ({
68
66
  type: ENUM.SETTER_TYPE.RESET,
69
67
  value: fieldData,
70
68
  callback: () => {
71
- if (cacheTimeout && cache && !fieldData.nothing) {
72
- cache
73
- .set({
74
- key: fieldName,
75
- value: fieldData,
76
- timeout: cacheTimeout
77
- })
78
- .then(resolve)
79
- .catch(resolve)
80
- return
81
- }
82
-
83
69
  resolve(null)
84
70
  }
85
71
  })
package/src/types.ts CHANGED
@@ -33,13 +33,13 @@ export type fieldKeys =
33
33
  export type generateFieldProps = {
34
34
  func: string | (() => {})
35
35
  type: fetchTypes
36
- query: keyMap
36
+ query?: keyMap
37
37
  }
38
38
 
39
39
  export type generateParamsType = {
40
40
  field: defaultField
41
41
  uniqueKey: string
42
- query: keyMap
42
+ query?: keyMap
43
43
  type: fetchTypes
44
44
  }
45
45
 
@@ -66,24 +66,9 @@ export type initStateType = {
66
66
  opts?: keyMap
67
67
  }
68
68
 
69
- export type cacheType = {
70
- get: ({ key }: { key: string }) => Promise<any>
71
- set: ({
72
- key,
73
- value,
74
- timeout
75
- }: {
76
- key: string
77
- value: any
78
- timeout?: number
79
- }) => Promise<any>
80
- del: ({ key }: { key: string }) => void
81
- }
82
-
83
69
  export type initDataType = {
84
70
  getter: (str: string) => defaultField
85
71
  setter: (obj: setterFuncParams) => void
86
- cache: cacheType
87
72
  func: string | (() => {})
88
73
  type: fetchTypes
89
74
  query?: keyMap
@@ -96,7 +81,6 @@ export type initDataType = {
96
81
  export type loadMoreType = {
97
82
  getter: (str: string) => defaultField
98
83
  setter: (obj: setterFuncParams) => void
99
- cache: cacheType
100
84
  func: string | (() => {})
101
85
  type: fetchTypes
102
86
  query?: keyMap
@@ -110,7 +94,6 @@ export type loadMoreType = {
110
94
  export type updateStateType = {
111
95
  getter: (str: string) => defaultField
112
96
  setter: (obj: setterFuncParams) => void
113
- cache: cacheType
114
97
  func: string | (() => {})
115
98
  type: fetchTypes
116
99
  query?: keyMap
@@ -120,18 +103,14 @@ export type updateStateType = {
120
103
  changeKey: string
121
104
  cacheTimeout: number
122
105
  uniqueKey: string
123
- callback: (obj?: keyMap) => void
124
106
  }
125
107
 
126
108
  export type setDataType = {
127
109
  getter: (str: string) => defaultField
128
110
  setter: (obj: setterFuncParams) => void
129
- cache: cacheType
130
111
  data: any
131
112
  fieldName: string
132
113
  type: fetchTypes
133
- fromLocal: boolean
134
- cacheTimeout: number
135
114
  page: number
136
115
  insertBefore: boolean
137
116
  }
package/src/utils.ts CHANGED
@@ -12,6 +12,10 @@ import type {
12
12
  generateParamsResp
13
13
  } from './types'
14
14
 
15
+ export const isObjectResult = (data: Record<string, any>): boolean => {
16
+ return data.result === undefined
17
+ }
18
+
15
19
  export const generateDefaultField = (opts = {}): defaultField => ({
16
20
  ...{
17
21
  result: [],
@@ -27,7 +31,6 @@ export const generateDefaultField = (opts = {}): defaultField => ({
27
31
  ...opts
28
32
  })
29
33
 
30
- let seed = 0
31
34
  /**
32
35
  * 根据参数生成 field 的 namespace
33
36
  * @param {string} func
@@ -40,7 +43,10 @@ export const generateFieldName = ({
40
43
  type,
41
44
  query = {}
42
45
  }: generateFieldProps): string => {
43
- func = typeof func === 'string' ? func : `custom-func-${seed++}`
46
+ func =
47
+ typeof func === 'string'
48
+ ? func
49
+ : `api-${Math.random().toString(36).substring(2)}`
44
50
  type = type || 'auto'
45
51
  let result = `${func}-${type}`
46
52
  Object.keys(query)
@@ -263,11 +269,10 @@ export const computeResultLength = (data: fieldResult): number => {
263
269
  export const generateRequestParams = ({
264
270
  field,
265
271
  uniqueKey,
266
- query,
272
+ query = {},
267
273
  type
268
274
  }: generateParamsType): generateParamsResp => {
269
275
  const result: generateParamsResp = {}
270
- query = query || {}
271
276
  if (field.fetched) {
272
277
  const changing = uniqueKey || ENUM.DEFAULT_UNIQUE_KEY_NAME
273
278
  if (type === ENUM.FETCH_TYPE.AUTO) {
@@ -1,5 +0,0 @@
1
- import type { initStateType, initDataType, loadMoreType, updateStateType } from './types';
2
- export declare const initState: ({ getter, setter, func, type, query, opts }: initStateType) => Promise<null>;
3
- export declare const initData: ({ getter, setter, cache, func, type, query, api, cacheTimeout, uniqueKey, callback }: initDataType) => Promise<any>;
4
- export declare const loadMore: ({ getter, setter, cache, query, type, func, api, cacheTimeout, uniqueKey, errorRetry, callback }: loadMoreType) => Promise<any>;
5
- export declare const updateState: ({ getter, setter, cache, type, func, query, method, value, id, uniqueKey, changeKey, cacheTimeout }: updateStateType) => Promise<unknown>;
@@ -1,32 +0,0 @@
1
- declare const _default: {
2
- SETTER_TYPE: {
3
- RESET: number;
4
- MERGE: number;
5
- };
6
- FETCH_TYPE_ARRAY: string[];
7
- FETCH_TYPE: {
8
- PAGINATION: string;
9
- SINCE_FIRST_OR_END_ID: string;
10
- SCROLL_LOAD_MORE: string;
11
- HAS_LOADED_IDS: string;
12
- AUTO: string;
13
- };
14
- CHANGE_TYPE: {
15
- SEARCH_FIELD: string;
16
- RESET_FIELD: string;
17
- RESULT_UPDATE_KV: string;
18
- RESULT_ADD_AFTER: string;
19
- RESULT_ADD_BEFORE: string;
20
- RESULT_REMOVE_BY_ID: string;
21
- RESULT_INSERT_TO_BEFORE: string;
22
- RESULT_INSERT_TO_AFTER: string;
23
- RESULT_LIST_MERGE: string;
24
- RESULT_ITEM_MERGE: string;
25
- };
26
- FIELD_DATA: {
27
- RESULT_KEY: string;
28
- EXTRA_KEY: string;
29
- };
30
- DEFAULT_UNIQUE_KEY_NAME: string;
31
- };
32
- export default _default;
@@ -1,4 +0,0 @@
1
- export * from './actions';
2
- export * as utils from './utils';
3
- export { default as ENUM } from './enum';
4
- export * from './types';
@@ -1,3 +0,0 @@
1
- import type { setDataType, setErrorType } from './types';
2
- export declare const SET_DATA: ({ getter, setter, cache, data, fieldName, type, fromLocal, cacheTimeout, page, insertBefore }: setDataType) => Promise<any>;
3
- export declare const SET_ERROR: ({ setter, fieldName, error }: setErrorType) => void;
@@ -1,118 +0,0 @@
1
- export declare type objectKey = string | number;
2
- export declare type keyMap = Record<objectKey, any>;
3
- export declare type morphArray = any[];
4
- export declare type fieldResult = morphArray | keyMap;
5
- export declare type defaultField = {
6
- result: fieldResult;
7
- noMore: boolean;
8
- nothing: boolean;
9
- loading: boolean;
10
- error: null | Error;
11
- extra: null | any;
12
- fetched: boolean;
13
- page: number;
14
- total: number;
15
- };
16
- export declare type fetchTypes = 'jump' | 'sinceId' | 'page' | 'seenIds' | 'auto';
17
- export declare type fieldKeys = 'result' | 'noMore' | 'nothing' | 'loading' | 'error' | 'extra' | 'page' | 'total';
18
- export declare type generateFieldProps = {
19
- func: string | (() => {});
20
- type: fetchTypes;
21
- query: keyMap;
22
- };
23
- export declare type generateParamsType = {
24
- field: defaultField;
25
- uniqueKey: string;
26
- query: keyMap;
27
- type: fetchTypes;
28
- };
29
- export declare type generateParamsResp = {
30
- seen_ids?: string;
31
- since_id?: objectKey;
32
- is_up?: 0 | 1;
33
- page?: number;
34
- };
35
- export declare type setterFuncParams = {
36
- key: string;
37
- type: number;
38
- value: any;
39
- callback?: (obj?: keyMap) => void;
40
- };
41
- export declare type initStateType = {
42
- getter: (str: string) => defaultField;
43
- setter: (obj: setterFuncParams) => void;
44
- func: string | (() => {});
45
- type: fetchTypes;
46
- query?: keyMap;
47
- opts?: keyMap;
48
- };
49
- export declare type cacheType = {
50
- get: ({ key }: {
51
- key: string;
52
- }) => Promise<any>;
53
- set: ({ key, value, timeout }: {
54
- key: string;
55
- value: any;
56
- timeout?: number;
57
- }) => Promise<any>;
58
- del: ({ key }: {
59
- key: string;
60
- }) => void;
61
- };
62
- export declare type initDataType = {
63
- getter: (str: string) => defaultField;
64
- setter: (obj: setterFuncParams) => void;
65
- cache: cacheType;
66
- func: string | (() => {});
67
- type: fetchTypes;
68
- query?: keyMap;
69
- api: keyMap;
70
- cacheTimeout: number;
71
- uniqueKey: string;
72
- callback: (obj?: keyMap) => void;
73
- };
74
- export declare type loadMoreType = {
75
- getter: (str: string) => defaultField;
76
- setter: (obj: setterFuncParams) => void;
77
- cache: cacheType;
78
- func: string | (() => {});
79
- type: fetchTypes;
80
- query?: keyMap;
81
- api: keyMap;
82
- cacheTimeout: number;
83
- uniqueKey: string;
84
- errorRetry: boolean;
85
- callback: (obj?: keyMap) => void;
86
- };
87
- export declare type updateStateType = {
88
- getter: (str: string) => defaultField;
89
- setter: (obj: setterFuncParams) => void;
90
- cache: cacheType;
91
- func: string | (() => {});
92
- type: fetchTypes;
93
- query?: keyMap;
94
- method: string;
95
- value: any;
96
- id: string | number | objectKey[];
97
- changeKey: string;
98
- cacheTimeout: number;
99
- uniqueKey: string;
100
- callback: (obj?: keyMap) => void;
101
- };
102
- export declare type setDataType = {
103
- getter: (str: string) => defaultField;
104
- setter: (obj: setterFuncParams) => void;
105
- cache: cacheType;
106
- data: any;
107
- fieldName: string;
108
- type: fetchTypes;
109
- fromLocal: boolean;
110
- cacheTimeout: number;
111
- page: number;
112
- insertBefore: boolean;
113
- };
114
- export declare type setErrorType = {
115
- setter: (obj: setterFuncParams) => void;
116
- fieldName: string;
117
- error: null | Error;
118
- };
@@ -1,58 +0,0 @@
1
- import type { objectKey, keyMap, morphArray, fieldResult, defaultField, fetchTypes, fieldKeys, generateFieldProps, generateParamsType, generateParamsResp } from './types';
2
- export declare const generateDefaultField: (opts?: {}) => defaultField;
3
- /**
4
- * 根据参数生成 field 的 namespace
5
- * @param {string} func
6
- * @param {string} type
7
- * @param {object} query
8
- * @return {string}
9
- */
10
- export declare const generateFieldName: ({ func, type, query }: generateFieldProps) => string;
11
- /**
12
- * 根据 key 从 object 里拿 value
13
- * @param {object} field
14
- * @param {string} keys
15
- * @return {*}
16
- */
17
- export declare const getObjectDeepValue: (field: keyMap, keys: string | string[]) => any;
18
- export declare const updateObjectDeepValue: (field: keyMap, changeKey: string, value: any) => void;
19
- export declare const searchValueByKey: (result: fieldResult, id: objectKey, key: objectKey) => any;
20
- /**
21
- * 通过 id 匹配返回数组中某个对象的 index
22
- * @param {int|string} itemId
23
- * @param {array} fieldArr
24
- * @param {int|string} changingKey
25
- * @return {number}
26
- */
27
- export declare const computeMatchedItemIndex: (itemId: objectKey, fieldArr: morphArray, changingKey: objectKey) => number;
28
- export declare const combineArrayData: (fieldArray: any[], value: fieldResult, changingKey: string) => void;
29
- /**
30
- * 判断参数是否为数组
31
- * @param {object|array} data
32
- * @return {boolean}
33
- */
34
- export declare const isArray: (data: any) => boolean;
35
- /**
36
- * 设置一个响应式的数据到对象上
37
- * @param {object} field
38
- * @param {string} key
39
- * @param {array|object} value
40
- * @param {string} type
41
- * @param {boolean} insertBefore
42
- */
43
- export declare const setReactivityField: (field: defaultField, key: fieldKeys, value: any, type: fetchTypes, insertBefore: boolean) => void;
44
- /**
45
- * 计算一个数据列的长度
46
- * @param {array|object} data
47
- * @return {number}
48
- */
49
- export declare const computeResultLength: (data: fieldResult) => number;
50
- /**
51
- * 拼接请求的参数
52
- * @param {object} field
53
- * @param {string} uniqueKey
54
- * @param {object} query
55
- * @param {string} type
56
- * @return {object}
57
- */
58
- export declare const generateRequestParams: ({ field, uniqueKey, query, type }: generateParamsType) => generateParamsResp;