@gateweb/react-utils 1.8.0 → 1.10.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/cjs/index.d.ts +58 -11
- package/dist/cjs/index.js +53 -43
- package/dist/es/index.d.mts +58 -11
- package/dist/es/index.mjs +53 -44
- package/package.json +2 -1
package/dist/cjs/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { TExtractValueType, AtLeastOne } from './types.js';
|
|
2
|
-
export * from './types.js';
|
|
3
1
|
import React from 'react';
|
|
2
|
+
import { AtLeastOne } from './types.js';
|
|
3
|
+
export * from './types.js';
|
|
4
4
|
|
|
5
5
|
declare const FILE_SIZE_UNITS: readonly ["Bytes", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"];
|
|
6
6
|
type FileSizeUnit = (typeof FILE_SIZE_UNITS)[number];
|
|
@@ -301,8 +301,28 @@ declare const formatAmount: (num: number) => string;
|
|
|
301
301
|
* @example
|
|
302
302
|
*
|
|
303
303
|
* formatString('123456', 1, 4) // '1****6'
|
|
304
|
+
*
|
|
305
|
+
* @deprecated use `maskString` instead
|
|
304
306
|
*/
|
|
305
307
|
declare const formatStarMask: (str: string, n: number, m: number) => string;
|
|
308
|
+
/**
|
|
309
|
+
* 將字串的指定位置的以後的字元轉換成星號
|
|
310
|
+
*
|
|
311
|
+
* @param str 字串
|
|
312
|
+
* @param start 起始位置 (從 0 開始計算)
|
|
313
|
+
* @param length 可選,從起始位置開始要遮罩的字元數量,默認為剩餘所有字元
|
|
314
|
+
*
|
|
315
|
+
* @example
|
|
316
|
+
*
|
|
317
|
+
* ```js
|
|
318
|
+
* maskString('123456789', 2) // '12*******'
|
|
319
|
+
* maskString('123456789', 2, 5) // '12*****89'
|
|
320
|
+
* maskString('123456789', 0, 15) // '*********'
|
|
321
|
+
* maskString('123456789', 10) // '123456789' (start out of bounds)
|
|
322
|
+
* maskString('123456789', -1) // '123456789' (start out of bounds)
|
|
323
|
+
* ```
|
|
324
|
+
*/
|
|
325
|
+
declare const maskString: (str: string, start: number, length?: number) => string;
|
|
306
326
|
/**
|
|
307
327
|
* format file size to human readable string
|
|
308
328
|
*
|
|
@@ -388,23 +408,50 @@ declare const extractEnumLikeObject: <T extends Record<string, { [P in K]: any;
|
|
|
388
408
|
* @example
|
|
389
409
|
*
|
|
390
410
|
* ```ts
|
|
391
|
-
* const Status = { Enabled: { value: 'enabled', label: '啟用' }, Disabled: { value: 'disabled', label: '停用' } };
|
|
392
411
|
*
|
|
412
|
+
* // 一般使用
|
|
413
|
+
* const Status = { Enabled: { value: 'enabled', label: '啟用' }, Disabled: { value: 'disabled', label: '停用' }};
|
|
393
414
|
* const { EnumStatus, StatusList, getStatusLabel } = createEnumLikeObject(Status, 'Status');
|
|
394
|
-
*
|
|
395
415
|
* console.log(EnumStatus); // { Enabled: 'enabled', Disabled: 'disabled' }
|
|
416
|
+
* console.log(StatusList); // [ { key: 'Enabled', value: 'enabled', label: '啟用' }, { key: 'Disabled', value: 'disabled', label: '停用' }]
|
|
417
|
+
* console.log(getStatusLabel('enabled')); // '啟用'
|
|
396
418
|
*
|
|
397
|
-
*
|
|
419
|
+
* // scenes 版本
|
|
420
|
+
*
|
|
421
|
+
* Status = { Enabled: { value: 'enabled', scenes: { webA: { label: '啟用' }, webB: { label: '激活' } } }, Disabled: { value: 'disabled', scenes: { webA: { label: '停用' }, webB: { label: '停止' }}}}
|
|
422
|
+
* const { EnumStatusA, StatusAList, getStatusALabel } = createEnumLikeObject(Status, 'StatusA', 'webA');
|
|
423
|
+
* console.log(EnumStatusA); // { Enabled: 'enabled', Disabled: 'disabled' }
|
|
424
|
+
* console.log(StatusAList); // [ { key: 'Enabled', value: 'enabled', label: '啟用' }, { key: 'Disabled', value: 'disabled', label: '停用' }]
|
|
425
|
+
* console.log(getStatusALabel('enabled')); // '啟用'
|
|
426
|
+
*
|
|
427
|
+
* const { EnumStatusA, StatusAList, getStatusALabel } = createEnumLikeObject(Status, 'StatusB', 'webB');
|
|
428
|
+
* console.log(EnumStatusB); // { Enabled: 'enabled', Disabled: 'disabled' }
|
|
429
|
+
* console.log(StatusBList); // [ { key: 'Enabled', value: 'enabled', label: '激活' }, { key: 'Disabled', value: 'disabled', label: '停止' }]
|
|
430
|
+
* console.log(getStatusBLabel('enabled')); // '激活'
|
|
398
431
|
*
|
|
399
|
-
* console.log(getStatusLabel('enabled')); // '啟用'
|
|
400
432
|
* ```
|
|
401
433
|
*/
|
|
402
|
-
declare
|
|
434
|
+
declare function createEnumLikeObject<T extends Record<string, {
|
|
403
435
|
value: any;
|
|
404
436
|
label: string;
|
|
405
|
-
}>, N extends string>(obj: T, name: N)
|
|
406
|
-
|
|
407
|
-
|
|
437
|
+
}>, N extends string>(obj: T, name: N): {
|
|
438
|
+
[K in `Enum${N}` | `${N}List` | `get${N}Label`]: K extends `Enum${N}` ? {
|
|
439
|
+
[key in keyof T]: T[key]['value'];
|
|
440
|
+
} : K extends `${N}List` ? Array<{
|
|
441
|
+
key: string;
|
|
442
|
+
} & T[keyof T]> : (value: T[keyof T]['value']) => string;
|
|
443
|
+
};
|
|
444
|
+
declare function createEnumLikeObject<T extends Record<string, {
|
|
445
|
+
value: any;
|
|
446
|
+
scenes: Record<string, Record<string, any>>;
|
|
447
|
+
}>, N extends string, Scene extends keyof T[keyof T]['scenes']>(obj: T, name: N, scene: Scene): {
|
|
448
|
+
[K in `Enum${N}` | `${N}List` | `get${N}Label`]: K extends `Enum${N}` ? {
|
|
449
|
+
[key in keyof T]: T[key]['value'];
|
|
450
|
+
} : K extends `${N}List` ? Array<{
|
|
451
|
+
key: string;
|
|
452
|
+
value: T[keyof T]['value'];
|
|
453
|
+
} & T[keyof T]['scenes'][Scene]> : (value: T[keyof T]['value']) => string;
|
|
454
|
+
};
|
|
408
455
|
|
|
409
456
|
/**
|
|
410
457
|
* simulate a fake api request
|
|
@@ -1060,4 +1107,4 @@ declare const getLocalStorage: <T>(key: string, deCode?: boolean) => T | undefin
|
|
|
1060
1107
|
*/
|
|
1061
1108
|
declare const setLocalStorage: (key: string, value: Record<string, any>, enCode?: boolean) => void;
|
|
1062
1109
|
|
|
1063
|
-
export { ByteSize, type PartialBy, QueryProvider, type RequiredBy, type TCountdownActions, adToRocEra, camelCase2PascalCase, camelCase2SnakeCase, camelString2PascalString, camelString2SnakeString, convertBytes, createEnumLikeObject, debounce, deepMerge, downloadFile, extractEnumLikeObject, fakeApi, formatAmount, formatBytes, formatStarMask, generatePeriodArray, getCurrentPeriod, getLocalStorage, getMimeType, invariant, isChinese, isDateString, isDateTimeString, isEmail, isEnglish, isEqual, isNonZeroStart, isNumber, isNumberAtLeastN, isNumberN, isNumberNM, isServer, isTWMobile, isTWPhone, isTimeString, isValidPassword, mergeRefs, objectToSearchParams, omit, omitByValue, pascalCase2CamelCase, pascalCase2SnakeCase, pascalString2CamelString, pascalString2SnakeString, pick, pickByValue, rocEraToAd, searchParamsToObject, setLocalStorage, snakeCase2CamelCase, snakeCase2PascalCase, snakeString2CamelString, snakeString2PascalString, throttle, useCountdown, useQueryContext, useValue, validTaxId, validateDateString, validateFileType, wait };
|
|
1110
|
+
export { ByteSize, type PartialBy, QueryProvider, type RequiredBy, type TCountdownActions, adToRocEra, camelCase2PascalCase, camelCase2SnakeCase, camelString2PascalString, camelString2SnakeString, convertBytes, createEnumLikeObject, debounce, deepMerge, downloadFile, extractEnumLikeObject, fakeApi, formatAmount, formatBytes, formatStarMask, generatePeriodArray, getCurrentPeriod, getLocalStorage, getMimeType, invariant, isChinese, isDateString, isDateTimeString, isEmail, isEnglish, isEqual, isNonZeroStart, isNumber, isNumberAtLeastN, isNumberN, isNumberNM, isServer, isTWMobile, isTWPhone, isTimeString, isValidPassword, maskString, mergeRefs, objectToSearchParams, omit, omitByValue, pascalCase2CamelCase, pascalCase2SnakeCase, pascalString2CamelString, pascalString2SnakeString, pick, pickByValue, rocEraToAd, searchParamsToObject, setLocalStorage, snakeCase2CamelCase, snakeCase2PascalCase, snakeString2CamelString, snakeString2PascalString, throttle, useCountdown, useQueryContext, useValue, validTaxId, validateDateString, validateFileType, wait };
|
package/dist/cjs/index.js
CHANGED
|
@@ -177,56 +177,41 @@ const FILE_SIZE_UNITS$1 = [
|
|
|
177
177
|
...acc,
|
|
178
178
|
[key]: value[valueKey]
|
|
179
179
|
}), {});
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
*
|
|
183
|
-
* 輸入的物件格式為
|
|
184
|
-
*
|
|
185
|
-
* ```ts
|
|
186
|
-
* { key: { value: string, label: string }, key2: { value: string, label: string }, ... }
|
|
187
|
-
* ```
|
|
188
|
-
*
|
|
189
|
-
* 會生成以下三個物件
|
|
190
|
-
*
|
|
191
|
-
* enum 物件 - 根據 value 生成的 enum 物件
|
|
192
|
-
*
|
|
193
|
-
* enum 列表 - 根據 value 與 label 生成的列表
|
|
194
|
-
*
|
|
195
|
-
* 取得 label 的方法 - 傳入 value 可以取得對應的 label
|
|
196
|
-
*
|
|
197
|
-
* @param obj 要處理的物件
|
|
198
|
-
* @param name 生成的 enum 名稱
|
|
199
|
-
*
|
|
200
|
-
* @example
|
|
201
|
-
*
|
|
202
|
-
* ```ts
|
|
203
|
-
* const Status = { Enabled: { value: 'enabled', label: '啟用' }, Disabled: { value: 'disabled', label: '停用' } };
|
|
204
|
-
*
|
|
205
|
-
* const { EnumStatus, StatusList, getStatusLabel } = createEnumLikeObject(Status, 'Status');
|
|
206
|
-
*
|
|
207
|
-
* console.log(EnumStatus); // { Enabled: 'enabled', Disabled: 'disabled' }
|
|
208
|
-
*
|
|
209
|
-
* console.log(StatusList); // [ { key: 'Enabled', value: 'enabled', label: '啟用' }, { key: 'Disabled', value: 'disabled', label: '停用' } ]
|
|
210
|
-
*
|
|
211
|
-
* console.log(getStatusLabel('enabled')); // '啟用'
|
|
212
|
-
* ```
|
|
213
|
-
*/ const createEnumLikeObject = (obj, name)=>{
|
|
180
|
+
// 實作
|
|
181
|
+
function createEnumLikeObject(obj, name, scene) {
|
|
214
182
|
const Enum = extractEnumLikeObject(obj, 'value');
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
183
|
+
// List:根據有無 scene 做不同處理
|
|
184
|
+
let list;
|
|
185
|
+
if (scene) {
|
|
186
|
+
// scenes 版本:解構指定 scene 的 label
|
|
187
|
+
list = Object.entries(obj).map(([key, item])=>({
|
|
188
|
+
key,
|
|
189
|
+
value: item.value,
|
|
190
|
+
...item.scenes?.[scene] ?? {}
|
|
191
|
+
}));
|
|
192
|
+
} else {
|
|
193
|
+
// label only 版本
|
|
194
|
+
list = Object.entries(obj).map(([key, item])=>({
|
|
195
|
+
key,
|
|
196
|
+
...item
|
|
197
|
+
}));
|
|
198
|
+
}
|
|
199
|
+
function getLabel(value) {
|
|
220
200
|
const targetItem = list.find((item)=>item.value === value);
|
|
221
|
-
if (!targetItem) return value;
|
|
222
|
-
|
|
223
|
-
|
|
201
|
+
if (!targetItem) return String(value);
|
|
202
|
+
if ('scenes' in targetItem && scene) {
|
|
203
|
+
const sceneObj = targetItem.scenes?.[scene];
|
|
204
|
+
return sceneObj && sceneObj.label || String(value);
|
|
205
|
+
}
|
|
206
|
+
if ('label' in targetItem) return targetItem.label;
|
|
207
|
+
return String(value);
|
|
208
|
+
}
|
|
224
209
|
return {
|
|
225
210
|
[`Enum${name}`]: Enum,
|
|
226
211
|
[`${name}List`]: list,
|
|
227
212
|
[`get${name}Label`]: getLabel
|
|
228
213
|
};
|
|
229
|
-
}
|
|
214
|
+
}
|
|
230
215
|
|
|
231
216
|
/**
|
|
232
217
|
* simulate a fake api request
|
|
@@ -762,7 +747,31 @@ const transformObjectKey = (obj, transformFunName)=>{
|
|
|
762
747
|
* @example
|
|
763
748
|
*
|
|
764
749
|
* formatString('123456', 1, 4) // '1****6'
|
|
750
|
+
*
|
|
751
|
+
* @deprecated use `maskString` instead
|
|
765
752
|
*/ const formatStarMask = (str, n, m)=>str.slice(0, n) + '*'.repeat(m - n + 1) + str.slice(m + 1);
|
|
753
|
+
/**
|
|
754
|
+
* 將字串的指定位置的以後的字元轉換成星號
|
|
755
|
+
*
|
|
756
|
+
* @param str 字串
|
|
757
|
+
* @param start 起始位置 (從 0 開始計算)
|
|
758
|
+
* @param length 可選,從起始位置開始要遮罩的字元數量,默認為剩餘所有字元
|
|
759
|
+
*
|
|
760
|
+
* @example
|
|
761
|
+
*
|
|
762
|
+
* ```js
|
|
763
|
+
* maskString('123456789', 2) // '12*******'
|
|
764
|
+
* maskString('123456789', 2, 5) // '12*****89'
|
|
765
|
+
* maskString('123456789', 0, 15) // '*********'
|
|
766
|
+
* maskString('123456789', 10) // '123456789' (start out of bounds)
|
|
767
|
+
* maskString('123456789', -1) // '123456789' (start out of bounds)
|
|
768
|
+
* ```
|
|
769
|
+
*/ const maskString = (str, start, length)=>{
|
|
770
|
+
if (start < 0 || start >= str.length) return str;
|
|
771
|
+
const maxMaskLength = str.length - start;
|
|
772
|
+
const safeLength = length !== undefined ? Math.max(0, Math.min(length, maxMaskLength)) : maxMaskLength;
|
|
773
|
+
return str.slice(0, start) + '*'.repeat(safeLength) + str.slice(start + safeLength);
|
|
774
|
+
};
|
|
766
775
|
const FILE_SIZE_UNITS = [
|
|
767
776
|
'Bytes',
|
|
768
777
|
'KB',
|
|
@@ -1199,6 +1208,7 @@ exports.isTWMobile = isTWMobile;
|
|
|
1199
1208
|
exports.isTWPhone = isTWPhone;
|
|
1200
1209
|
exports.isTimeString = isTimeString;
|
|
1201
1210
|
exports.isValidPassword = isValidPassword;
|
|
1211
|
+
exports.maskString = maskString;
|
|
1202
1212
|
exports.mergeRefs = mergeRefs;
|
|
1203
1213
|
exports.objectToSearchParams = objectToSearchParams;
|
|
1204
1214
|
exports.omit = omit;
|
package/dist/es/index.d.mts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { TExtractValueType, AtLeastOne } from './types.mjs';
|
|
2
|
-
export * from './types.mjs';
|
|
3
1
|
import React from 'react';
|
|
2
|
+
import { AtLeastOne } from './types.mjs';
|
|
3
|
+
export * from './types.mjs';
|
|
4
4
|
|
|
5
5
|
declare const FILE_SIZE_UNITS: readonly ["Bytes", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"];
|
|
6
6
|
type FileSizeUnit = (typeof FILE_SIZE_UNITS)[number];
|
|
@@ -301,8 +301,28 @@ declare const formatAmount: (num: number) => string;
|
|
|
301
301
|
* @example
|
|
302
302
|
*
|
|
303
303
|
* formatString('123456', 1, 4) // '1****6'
|
|
304
|
+
*
|
|
305
|
+
* @deprecated use `maskString` instead
|
|
304
306
|
*/
|
|
305
307
|
declare const formatStarMask: (str: string, n: number, m: number) => string;
|
|
308
|
+
/**
|
|
309
|
+
* 將字串的指定位置的以後的字元轉換成星號
|
|
310
|
+
*
|
|
311
|
+
* @param str 字串
|
|
312
|
+
* @param start 起始位置 (從 0 開始計算)
|
|
313
|
+
* @param length 可選,從起始位置開始要遮罩的字元數量,默認為剩餘所有字元
|
|
314
|
+
*
|
|
315
|
+
* @example
|
|
316
|
+
*
|
|
317
|
+
* ```js
|
|
318
|
+
* maskString('123456789', 2) // '12*******'
|
|
319
|
+
* maskString('123456789', 2, 5) // '12*****89'
|
|
320
|
+
* maskString('123456789', 0, 15) // '*********'
|
|
321
|
+
* maskString('123456789', 10) // '123456789' (start out of bounds)
|
|
322
|
+
* maskString('123456789', -1) // '123456789' (start out of bounds)
|
|
323
|
+
* ```
|
|
324
|
+
*/
|
|
325
|
+
declare const maskString: (str: string, start: number, length?: number) => string;
|
|
306
326
|
/**
|
|
307
327
|
* format file size to human readable string
|
|
308
328
|
*
|
|
@@ -388,23 +408,50 @@ declare const extractEnumLikeObject: <T extends Record<string, { [P in K]: any;
|
|
|
388
408
|
* @example
|
|
389
409
|
*
|
|
390
410
|
* ```ts
|
|
391
|
-
* const Status = { Enabled: { value: 'enabled', label: '啟用' }, Disabled: { value: 'disabled', label: '停用' } };
|
|
392
411
|
*
|
|
412
|
+
* // 一般使用
|
|
413
|
+
* const Status = { Enabled: { value: 'enabled', label: '啟用' }, Disabled: { value: 'disabled', label: '停用' }};
|
|
393
414
|
* const { EnumStatus, StatusList, getStatusLabel } = createEnumLikeObject(Status, 'Status');
|
|
394
|
-
*
|
|
395
415
|
* console.log(EnumStatus); // { Enabled: 'enabled', Disabled: 'disabled' }
|
|
416
|
+
* console.log(StatusList); // [ { key: 'Enabled', value: 'enabled', label: '啟用' }, { key: 'Disabled', value: 'disabled', label: '停用' }]
|
|
417
|
+
* console.log(getStatusLabel('enabled')); // '啟用'
|
|
396
418
|
*
|
|
397
|
-
*
|
|
419
|
+
* // scenes 版本
|
|
420
|
+
*
|
|
421
|
+
* Status = { Enabled: { value: 'enabled', scenes: { webA: { label: '啟用' }, webB: { label: '激活' } } }, Disabled: { value: 'disabled', scenes: { webA: { label: '停用' }, webB: { label: '停止' }}}}
|
|
422
|
+
* const { EnumStatusA, StatusAList, getStatusALabel } = createEnumLikeObject(Status, 'StatusA', 'webA');
|
|
423
|
+
* console.log(EnumStatusA); // { Enabled: 'enabled', Disabled: 'disabled' }
|
|
424
|
+
* console.log(StatusAList); // [ { key: 'Enabled', value: 'enabled', label: '啟用' }, { key: 'Disabled', value: 'disabled', label: '停用' }]
|
|
425
|
+
* console.log(getStatusALabel('enabled')); // '啟用'
|
|
426
|
+
*
|
|
427
|
+
* const { EnumStatusA, StatusAList, getStatusALabel } = createEnumLikeObject(Status, 'StatusB', 'webB');
|
|
428
|
+
* console.log(EnumStatusB); // { Enabled: 'enabled', Disabled: 'disabled' }
|
|
429
|
+
* console.log(StatusBList); // [ { key: 'Enabled', value: 'enabled', label: '激活' }, { key: 'Disabled', value: 'disabled', label: '停止' }]
|
|
430
|
+
* console.log(getStatusBLabel('enabled')); // '激活'
|
|
398
431
|
*
|
|
399
|
-
* console.log(getStatusLabel('enabled')); // '啟用'
|
|
400
432
|
* ```
|
|
401
433
|
*/
|
|
402
|
-
declare
|
|
434
|
+
declare function createEnumLikeObject<T extends Record<string, {
|
|
403
435
|
value: any;
|
|
404
436
|
label: string;
|
|
405
|
-
}>, N extends string>(obj: T, name: N)
|
|
406
|
-
|
|
407
|
-
|
|
437
|
+
}>, N extends string>(obj: T, name: N): {
|
|
438
|
+
[K in `Enum${N}` | `${N}List` | `get${N}Label`]: K extends `Enum${N}` ? {
|
|
439
|
+
[key in keyof T]: T[key]['value'];
|
|
440
|
+
} : K extends `${N}List` ? Array<{
|
|
441
|
+
key: string;
|
|
442
|
+
} & T[keyof T]> : (value: T[keyof T]['value']) => string;
|
|
443
|
+
};
|
|
444
|
+
declare function createEnumLikeObject<T extends Record<string, {
|
|
445
|
+
value: any;
|
|
446
|
+
scenes: Record<string, Record<string, any>>;
|
|
447
|
+
}>, N extends string, Scene extends keyof T[keyof T]['scenes']>(obj: T, name: N, scene: Scene): {
|
|
448
|
+
[K in `Enum${N}` | `${N}List` | `get${N}Label`]: K extends `Enum${N}` ? {
|
|
449
|
+
[key in keyof T]: T[key]['value'];
|
|
450
|
+
} : K extends `${N}List` ? Array<{
|
|
451
|
+
key: string;
|
|
452
|
+
value: T[keyof T]['value'];
|
|
453
|
+
} & T[keyof T]['scenes'][Scene]> : (value: T[keyof T]['value']) => string;
|
|
454
|
+
};
|
|
408
455
|
|
|
409
456
|
/**
|
|
410
457
|
* simulate a fake api request
|
|
@@ -1060,4 +1107,4 @@ declare const getLocalStorage: <T>(key: string, deCode?: boolean) => T | undefin
|
|
|
1060
1107
|
*/
|
|
1061
1108
|
declare const setLocalStorage: (key: string, value: Record<string, any>, enCode?: boolean) => void;
|
|
1062
1109
|
|
|
1063
|
-
export { ByteSize, type PartialBy, QueryProvider, type RequiredBy, type TCountdownActions, adToRocEra, camelCase2PascalCase, camelCase2SnakeCase, camelString2PascalString, camelString2SnakeString, convertBytes, createEnumLikeObject, debounce, deepMerge, downloadFile, extractEnumLikeObject, fakeApi, formatAmount, formatBytes, formatStarMask, generatePeriodArray, getCurrentPeriod, getLocalStorage, getMimeType, invariant, isChinese, isDateString, isDateTimeString, isEmail, isEnglish, isEqual, isNonZeroStart, isNumber, isNumberAtLeastN, isNumberN, isNumberNM, isServer, isTWMobile, isTWPhone, isTimeString, isValidPassword, mergeRefs, objectToSearchParams, omit, omitByValue, pascalCase2CamelCase, pascalCase2SnakeCase, pascalString2CamelString, pascalString2SnakeString, pick, pickByValue, rocEraToAd, searchParamsToObject, setLocalStorage, snakeCase2CamelCase, snakeCase2PascalCase, snakeString2CamelString, snakeString2PascalString, throttle, useCountdown, useQueryContext, useValue, validTaxId, validateDateString, validateFileType, wait };
|
|
1110
|
+
export { ByteSize, type PartialBy, QueryProvider, type RequiredBy, type TCountdownActions, adToRocEra, camelCase2PascalCase, camelCase2SnakeCase, camelString2PascalString, camelString2SnakeString, convertBytes, createEnumLikeObject, debounce, deepMerge, downloadFile, extractEnumLikeObject, fakeApi, formatAmount, formatBytes, formatStarMask, generatePeriodArray, getCurrentPeriod, getLocalStorage, getMimeType, invariant, isChinese, isDateString, isDateTimeString, isEmail, isEnglish, isEqual, isNonZeroStart, isNumber, isNumberAtLeastN, isNumberN, isNumberNM, isServer, isTWMobile, isTWPhone, isTimeString, isValidPassword, maskString, mergeRefs, objectToSearchParams, omit, omitByValue, pascalCase2CamelCase, pascalCase2SnakeCase, pascalString2CamelString, pascalString2SnakeString, pick, pickByValue, rocEraToAd, searchParamsToObject, setLocalStorage, snakeCase2CamelCase, snakeCase2PascalCase, snakeString2CamelString, snakeString2PascalString, throttle, useCountdown, useQueryContext, useValue, validTaxId, validateDateString, validateFileType, wait };
|
package/dist/es/index.mjs
CHANGED
|
@@ -171,56 +171,41 @@ const FILE_SIZE_UNITS$1 = [
|
|
|
171
171
|
...acc,
|
|
172
172
|
[key]: value[valueKey]
|
|
173
173
|
}), {});
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
*
|
|
177
|
-
* 輸入的物件格式為
|
|
178
|
-
*
|
|
179
|
-
* ```ts
|
|
180
|
-
* { key: { value: string, label: string }, key2: { value: string, label: string }, ... }
|
|
181
|
-
* ```
|
|
182
|
-
*
|
|
183
|
-
* 會生成以下三個物件
|
|
184
|
-
*
|
|
185
|
-
* enum 物件 - 根據 value 生成的 enum 物件
|
|
186
|
-
*
|
|
187
|
-
* enum 列表 - 根據 value 與 label 生成的列表
|
|
188
|
-
*
|
|
189
|
-
* 取得 label 的方法 - 傳入 value 可以取得對應的 label
|
|
190
|
-
*
|
|
191
|
-
* @param obj 要處理的物件
|
|
192
|
-
* @param name 生成的 enum 名稱
|
|
193
|
-
*
|
|
194
|
-
* @example
|
|
195
|
-
*
|
|
196
|
-
* ```ts
|
|
197
|
-
* const Status = { Enabled: { value: 'enabled', label: '啟用' }, Disabled: { value: 'disabled', label: '停用' } };
|
|
198
|
-
*
|
|
199
|
-
* const { EnumStatus, StatusList, getStatusLabel } = createEnumLikeObject(Status, 'Status');
|
|
200
|
-
*
|
|
201
|
-
* console.log(EnumStatus); // { Enabled: 'enabled', Disabled: 'disabled' }
|
|
202
|
-
*
|
|
203
|
-
* console.log(StatusList); // [ { key: 'Enabled', value: 'enabled', label: '啟用' }, { key: 'Disabled', value: 'disabled', label: '停用' } ]
|
|
204
|
-
*
|
|
205
|
-
* console.log(getStatusLabel('enabled')); // '啟用'
|
|
206
|
-
* ```
|
|
207
|
-
*/ const createEnumLikeObject = (obj, name)=>{
|
|
174
|
+
// 實作
|
|
175
|
+
function createEnumLikeObject(obj, name, scene) {
|
|
208
176
|
const Enum = extractEnumLikeObject(obj, 'value');
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
177
|
+
// List:根據有無 scene 做不同處理
|
|
178
|
+
let list;
|
|
179
|
+
if (scene) {
|
|
180
|
+
// scenes 版本:解構指定 scene 的 label
|
|
181
|
+
list = Object.entries(obj).map(([key, item])=>({
|
|
182
|
+
key,
|
|
183
|
+
value: item.value,
|
|
184
|
+
...item.scenes?.[scene] ?? {}
|
|
185
|
+
}));
|
|
186
|
+
} else {
|
|
187
|
+
// label only 版本
|
|
188
|
+
list = Object.entries(obj).map(([key, item])=>({
|
|
189
|
+
key,
|
|
190
|
+
...item
|
|
191
|
+
}));
|
|
192
|
+
}
|
|
193
|
+
function getLabel(value) {
|
|
214
194
|
const targetItem = list.find((item)=>item.value === value);
|
|
215
|
-
if (!targetItem) return value;
|
|
216
|
-
|
|
217
|
-
|
|
195
|
+
if (!targetItem) return String(value);
|
|
196
|
+
if ('scenes' in targetItem && scene) {
|
|
197
|
+
const sceneObj = targetItem.scenes?.[scene];
|
|
198
|
+
return sceneObj && sceneObj.label || String(value);
|
|
199
|
+
}
|
|
200
|
+
if ('label' in targetItem) return targetItem.label;
|
|
201
|
+
return String(value);
|
|
202
|
+
}
|
|
218
203
|
return {
|
|
219
204
|
[`Enum${name}`]: Enum,
|
|
220
205
|
[`${name}List`]: list,
|
|
221
206
|
[`get${name}Label`]: getLabel
|
|
222
207
|
};
|
|
223
|
-
}
|
|
208
|
+
}
|
|
224
209
|
|
|
225
210
|
/**
|
|
226
211
|
* simulate a fake api request
|
|
@@ -756,7 +741,31 @@ const transformObjectKey = (obj, transformFunName)=>{
|
|
|
756
741
|
* @example
|
|
757
742
|
*
|
|
758
743
|
* formatString('123456', 1, 4) // '1****6'
|
|
744
|
+
*
|
|
745
|
+
* @deprecated use `maskString` instead
|
|
759
746
|
*/ const formatStarMask = (str, n, m)=>str.slice(0, n) + '*'.repeat(m - n + 1) + str.slice(m + 1);
|
|
747
|
+
/**
|
|
748
|
+
* 將字串的指定位置的以後的字元轉換成星號
|
|
749
|
+
*
|
|
750
|
+
* @param str 字串
|
|
751
|
+
* @param start 起始位置 (從 0 開始計算)
|
|
752
|
+
* @param length 可選,從起始位置開始要遮罩的字元數量,默認為剩餘所有字元
|
|
753
|
+
*
|
|
754
|
+
* @example
|
|
755
|
+
*
|
|
756
|
+
* ```js
|
|
757
|
+
* maskString('123456789', 2) // '12*******'
|
|
758
|
+
* maskString('123456789', 2, 5) // '12*****89'
|
|
759
|
+
* maskString('123456789', 0, 15) // '*********'
|
|
760
|
+
* maskString('123456789', 10) // '123456789' (start out of bounds)
|
|
761
|
+
* maskString('123456789', -1) // '123456789' (start out of bounds)
|
|
762
|
+
* ```
|
|
763
|
+
*/ const maskString = (str, start, length)=>{
|
|
764
|
+
if (start < 0 || start >= str.length) return str;
|
|
765
|
+
const maxMaskLength = str.length - start;
|
|
766
|
+
const safeLength = length !== undefined ? Math.max(0, Math.min(length, maxMaskLength)) : maxMaskLength;
|
|
767
|
+
return str.slice(0, start) + '*'.repeat(safeLength) + str.slice(start + safeLength);
|
|
768
|
+
};
|
|
760
769
|
const FILE_SIZE_UNITS = [
|
|
761
770
|
'Bytes',
|
|
762
771
|
'KB',
|
|
@@ -1152,4 +1161,4 @@ function mergeRefs(refs) {
|
|
|
1152
1161
|
return dayjs(endMonth, 'YYYYMM').subtract(1911, 'year').format('YYYYMM').substring(1);
|
|
1153
1162
|
};
|
|
1154
1163
|
|
|
1155
|
-
export { ByteSize, adToRocEra, camelCase2PascalCase, camelCase2SnakeCase, camelString2PascalString, camelString2SnakeString, convertBytes, createEnumLikeObject, debounce, deepMerge, extractEnumLikeObject, fakeApi, formatAmount, formatBytes, formatStarMask, generatePeriodArray, getCurrentPeriod, getMimeType, invariant, isChinese, isDateString, isDateTimeString, isEmail, isEnglish, isEqual, isNonZeroStart, isNumber, isNumberAtLeastN, isNumberN, isNumberNM, isServer, isTWMobile, isTWPhone, isTimeString, isValidPassword, mergeRefs, objectToSearchParams, omit, omitByValue, pascalCase2CamelCase, pascalCase2SnakeCase, pascalString2CamelString, pascalString2SnakeString, pick, pickByValue, rocEraToAd, searchParamsToObject, snakeCase2CamelCase, snakeCase2PascalCase, snakeString2CamelString, snakeString2PascalString, throttle, useValue, validTaxId, validateDateString, validateFileType, wait };
|
|
1164
|
+
export { ByteSize, adToRocEra, camelCase2PascalCase, camelCase2SnakeCase, camelString2PascalString, camelString2SnakeString, convertBytes, createEnumLikeObject, debounce, deepMerge, extractEnumLikeObject, fakeApi, formatAmount, formatBytes, formatStarMask, generatePeriodArray, getCurrentPeriod, getMimeType, invariant, isChinese, isDateString, isDateTimeString, isEmail, isEnglish, isEqual, isNonZeroStart, isNumber, isNumberAtLeastN, isNumberN, isNumberNM, isServer, isTWMobile, isTWPhone, isTimeString, isValidPassword, maskString, mergeRefs, objectToSearchParams, omit, omitByValue, pascalCase2CamelCase, pascalCase2SnakeCase, pascalString2CamelString, pascalString2SnakeString, pick, pickByValue, rocEraToAd, searchParamsToObject, snakeCase2CamelCase, snakeCase2PascalCase, snakeString2CamelString, snakeString2PascalString, throttle, useValue, validTaxId, validateDateString, validateFileType, wait };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gateweb/react-utils",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.10.0",
|
|
4
4
|
"description": "React Utils for GateWeb",
|
|
5
5
|
"homepage": "https://github.com/GatewebSolutions/react-utils",
|
|
6
6
|
"files": [
|
|
@@ -66,6 +66,7 @@
|
|
|
66
66
|
"scripts": {
|
|
67
67
|
"run-code": "ts-node src/period.ts",
|
|
68
68
|
"test": "vitest run",
|
|
69
|
+
"test:watch": "vitest",
|
|
69
70
|
"test:coverage": "vitest run --coverage",
|
|
70
71
|
"test:ui": "vitest --ui --coverage.enabled=true",
|
|
71
72
|
"build": "bunchee",
|