@gateweb/react-utils 1.14.1 → 1.14.3
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 +94 -34
- package/dist/cjs/index.js +25 -15
- package/dist/es/index.d.mts +94 -34
- package/dist/es/index.mjs +25 -15
- package/package.json +1 -1
package/dist/cjs/index.d.ts
CHANGED
|
@@ -373,18 +373,75 @@ declare const isEqual: (value1: unknown, value2: unknown) => boolean;
|
|
|
373
373
|
* @param valueKey value 的 key
|
|
374
374
|
*
|
|
375
375
|
* @example
|
|
376
|
-
*
|
|
377
|
-
* ```js
|
|
378
376
|
* const myObj = {
|
|
379
|
-
*
|
|
380
|
-
*
|
|
381
|
-
* }
|
|
382
|
-
*
|
|
377
|
+
* A: { value: 'a' },
|
|
378
|
+
* B: { value: 'b', other: 'other' },
|
|
379
|
+
* } as const;
|
|
383
380
|
* const enumCode = extractEnumLikeObject(myObj, 'value');
|
|
384
|
-
*
|
|
385
|
-
* ```
|
|
381
|
+
* // => { A: 'a', B: 'b' }
|
|
386
382
|
*/
|
|
387
383
|
declare const extractEnumLikeObject: <T extends Record<string, { [P in K]: any; }>, K extends string>(enumObject: T, valueKey: K) => { [key in keyof T]: T[key][K]; };
|
|
384
|
+
type EnumMap<T extends Record<string, any>, VK extends keyof T[keyof T] & string> = {
|
|
385
|
+
[K in keyof T]: T[K][VK];
|
|
386
|
+
};
|
|
387
|
+
type NormalList<T extends Record<string, any>> = Array<{
|
|
388
|
+
key: string;
|
|
389
|
+
} & T[keyof T]>;
|
|
390
|
+
type ScenesList<T extends Record<string, {
|
|
391
|
+
scenes: Record<string, Record<string, any>>;
|
|
392
|
+
}>, Scene extends keyof T[keyof T]['scenes'] & string, VK extends keyof T[keyof T] & string> = Array<{
|
|
393
|
+
key: string;
|
|
394
|
+
value: T[keyof T][VK];
|
|
395
|
+
} & T[keyof T]['scenes'][Scene]>;
|
|
396
|
+
type NormalReturn<T extends Record<string, any>, VK extends keyof T[keyof T] & string> = {
|
|
397
|
+
Enum: EnumMap<T, VK>;
|
|
398
|
+
List: NormalList<T>;
|
|
399
|
+
getLabel: (value: T[keyof T][VK]) => string;
|
|
400
|
+
};
|
|
401
|
+
type ScenesReturn<T extends Record<string, {
|
|
402
|
+
scenes: Record<string, Record<string, any>>;
|
|
403
|
+
}>, Scene extends keyof T[keyof T]['scenes'] & string, VK extends keyof T[keyof T] & string> = {
|
|
404
|
+
Enum: EnumMap<T, VK>;
|
|
405
|
+
List: ScenesList<T, Scene, VK>;
|
|
406
|
+
getLabel: (value: T[keyof T][VK]) => string;
|
|
407
|
+
};
|
|
408
|
+
type AsNamed<R, N extends string> = {
|
|
409
|
+
[K in keyof R as K extends 'Enum' ? `Enum${N}` : K extends 'List' ? `${N}List` : K extends 'getLabel' ? `get${N}Label` : never]: R[K];
|
|
410
|
+
};
|
|
411
|
+
/**
|
|
412
|
+
* 指定 value 欄位的鍵名選項。
|
|
413
|
+
* @template VK value 對應的鍵名型別
|
|
414
|
+
*/
|
|
415
|
+
type ValueKeyOption<VK extends string> = {
|
|
416
|
+
/**
|
|
417
|
+
* 指定 value 欄位的鍵名,當輸入物件的值欄位不是 `value` 時使用,預設為 `'value'`。
|
|
418
|
+
*/
|
|
419
|
+
valueKey?: VK;
|
|
420
|
+
};
|
|
421
|
+
/**
|
|
422
|
+
* 命名選項,用於產生 `Enum${name}`、`${name}List`、`get${name}Label`。
|
|
423
|
+
* @template N 自訂名稱型別
|
|
424
|
+
*/
|
|
425
|
+
type NamedOption<N extends string> = {
|
|
426
|
+
/**
|
|
427
|
+
* 自訂輸出鍵名的名稱,用於產生 `Enum${name}`、`${name}List`、`get${name}Label`。
|
|
428
|
+
*/
|
|
429
|
+
name: N;
|
|
430
|
+
};
|
|
431
|
+
/**
|
|
432
|
+
* 場景選項,指定要取用的場景 key。
|
|
433
|
+
* @template Scene 場景鍵名型別
|
|
434
|
+
*/
|
|
435
|
+
type SceneOption<Scene extends string> = {
|
|
436
|
+
/**
|
|
437
|
+
* 指定要取用的場景 key,會從 `scenes[scene]` 中取出 label 與其餘屬性。
|
|
438
|
+
*/
|
|
439
|
+
scene: Scene;
|
|
440
|
+
};
|
|
441
|
+
type NormalNamedOptions<N extends string, VK extends string> = NamedOption<N> & ValueKeyOption<VK>;
|
|
442
|
+
type NormalOptions<VK extends string> = ValueKeyOption<VK>;
|
|
443
|
+
type ScenesNamedOptions<N extends string, Scene extends string, VK extends string> = NamedOption<N> & SceneOption<Scene> & ValueKeyOption<VK>;
|
|
444
|
+
type ScenesOptions<Scene extends string, VK extends string> = SceneOption<Scene> & ValueKeyOption<VK>;
|
|
388
445
|
/**
|
|
389
446
|
* 將指定格式的物件生成 enum 物件、enum 列表、取得 label 的方法
|
|
390
447
|
*
|
|
@@ -402,8 +459,9 @@ declare const extractEnumLikeObject: <T extends Record<string, { [P in K]: any;
|
|
|
402
459
|
*
|
|
403
460
|
* 取得 label 的方法 - 傳入 value 可以取得對應的 label
|
|
404
461
|
*
|
|
405
|
-
*
|
|
406
|
-
*
|
|
462
|
+
* 參數:
|
|
463
|
+
* - obj:要處理的物件
|
|
464
|
+
* - options:設定物件(可選)。若未提供 name,將使用預設鍵名:`Enum`、`List`、`getLabel`。
|
|
407
465
|
*
|
|
408
466
|
* @remarks
|
|
409
467
|
* 若需多場景 label,請傳入第三參數 scene,詳細用法請見範例。
|
|
@@ -412,50 +470,52 @@ declare const extractEnumLikeObject: <T extends Record<string, { [P in K]: any;
|
|
|
412
470
|
*
|
|
413
471
|
* ```ts
|
|
414
472
|
*
|
|
415
|
-
* //
|
|
473
|
+
* // 一般使用(命名版)
|
|
416
474
|
* const Status = { Enabled: { value: 'enabled', label: '啟用' }, Disabled: { value: 'disabled', label: '停用' }};
|
|
417
|
-
* const { EnumStatus, StatusList, getStatusLabel } = createEnumLikeObject(Status, 'Status');
|
|
475
|
+
* const { EnumStatus, StatusList, getStatusLabel } = createEnumLikeObject(Status, { name: 'Status' });
|
|
418
476
|
* console.log(EnumStatus); // { Enabled: 'enabled', Disabled: 'disabled' }
|
|
419
477
|
* console.log(StatusList); // [ { key: 'Enabled', value: 'enabled', label: '啟用' }, { key: 'Disabled', value: 'disabled', label: '停用' }]
|
|
420
478
|
* console.log(getStatusLabel('enabled')); // '啟用'
|
|
421
479
|
*
|
|
480
|
+
* // 一般使用(未命名,使用預設鍵名)
|
|
481
|
+
* const { Enum, List, getLabel } = createEnumLikeObject(Status);
|
|
482
|
+
* console.log(Enum); // { Enabled: 'enabled', Disabled: 'disabled' }
|
|
483
|
+
* console.log(List); // [ { key: 'Enabled', value: 'enabled', label: '啟用' }, { key: 'Disabled', value: 'disabled', label: '停用' }]
|
|
484
|
+
* console.log(getLabel('enabled')); // '啟用'
|
|
485
|
+
*
|
|
422
486
|
* // scenes 版本
|
|
423
487
|
*
|
|
424
488
|
* const Status = { Enabled: { value: 'enabled', scenes: { webA: { label: '啟用' }, webB: { label: '激活' } } }, Disabled: { value: 'disabled', scenes: { webA: { label: '停用' }, webB: { label: '停止' }}}}
|
|
425
|
-
* const { EnumStatusA, StatusAList, getStatusALabel } = createEnumLikeObject(Status, 'StatusA', 'webA');
|
|
489
|
+
* const { EnumStatusA, StatusAList, getStatusALabel } = createEnumLikeObject(Status, { name: 'StatusA', scene: 'webA' });
|
|
426
490
|
* console.log(EnumStatusA); // { Enabled: 'enabled', Disabled: 'disabled' }
|
|
427
491
|
* console.log(StatusAList); // [ { key: 'Enabled', value: 'enabled', label: '啟用' }, { key: 'Disabled', value: 'disabled', label: '停用' }]
|
|
428
492
|
* console.log(getStatusALabel('enabled')); // '啟用'
|
|
429
493
|
*
|
|
430
|
-
* const {
|
|
494
|
+
* const { EnumStatusB, StatusBList, getStatusBLabel } = createEnumLikeObject(Status, { name: 'StatusB', scene: 'webB' });
|
|
431
495
|
* console.log(EnumStatusB); // { Enabled: 'enabled', Disabled: 'disabled' }
|
|
432
496
|
* console.log(StatusBList); // [ { key: 'Enabled', value: 'enabled', label: '激活' }, { key: 'Disabled', value: 'disabled', label: '停止' }]
|
|
433
497
|
* console.log(getStatusBLabel('enabled')); // '激活'
|
|
434
498
|
*
|
|
499
|
+
* // scenes 版本(未命名,使用預設鍵名)
|
|
500
|
+
* const { Enum, List, getLabel } = createEnumLikeObject(Status, { scene: 'webA' });
|
|
501
|
+
* console.log(Enum); // { Enabled: 'enabled', Disabled: 'disabled' }
|
|
502
|
+
* console.log(List); // [ { key: 'Enabled', value: 'enabled', label: '啟用' }, { key: 'Disabled', value: 'disabled', label: '停用' }]
|
|
503
|
+
* console.log(getLabel('enabled')); // '啟用'
|
|
435
504
|
* ```
|
|
436
505
|
*
|
|
437
506
|
*/
|
|
438
|
-
declare function createEnumLikeObject<T extends Record<string, {
|
|
439
|
-
value: any;
|
|
440
|
-
label: string;
|
|
441
|
-
}>, N extends string>(obj: T, name: N): {
|
|
442
|
-
[K in `Enum${N}` | `${N}List` | `get${N}Label`]: K extends `Enum${N}` ? {
|
|
443
|
-
[key in keyof T]: T[key]['value'];
|
|
444
|
-
} : K extends `${N}List` ? Array<{
|
|
445
|
-
key: string;
|
|
446
|
-
} & T[keyof T]> : (value: T[keyof T]['value']) => string;
|
|
447
|
-
};
|
|
448
|
-
declare function createEnumLikeObject<T extends Record<string, {
|
|
449
|
-
value: any;
|
|
507
|
+
declare function createEnumLikeObject<T extends Record<string, Record<VK, any> & {
|
|
450
508
|
scenes: Record<string, Record<string, any>>;
|
|
451
|
-
}>, N extends string, Scene extends keyof T[keyof T]['scenes']>(obj: T,
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
509
|
+
}>, N extends string, Scene extends keyof T[keyof T]['scenes'] & string, VK extends keyof T[keyof T] & string>(obj: T, options: ScenesNamedOptions<N, Scene, VK>): AsNamed<ScenesReturn<T, Scene, VK>, N>;
|
|
510
|
+
declare function createEnumLikeObject<T extends Record<string, Record<VK, any> & {
|
|
511
|
+
scenes: Record<string, Record<string, any>>;
|
|
512
|
+
}>, Scene extends keyof T[keyof T]['scenes'] & string, VK extends keyof T[keyof T] & string>(obj: T, options: ScenesOptions<Scene, VK>): ScenesReturn<T, Scene, VK>;
|
|
513
|
+
declare function createEnumLikeObject<T extends Record<string, Record<VK, any> & {
|
|
514
|
+
label: string;
|
|
515
|
+
}>, N extends string, VK extends keyof T[keyof T] & string>(obj: T, options: NormalNamedOptions<N, VK>): AsNamed<NormalReturn<T, VK>, N>;
|
|
516
|
+
declare function createEnumLikeObject<T extends Record<string, Record<VK, any> & {
|
|
517
|
+
label: string;
|
|
518
|
+
}>, VK extends keyof T[keyof T] & string>(obj: T, options?: NormalOptions<VK>): NormalReturn<T, VK>;
|
|
459
519
|
|
|
460
520
|
/**
|
|
461
521
|
* simulate a fake api request
|
package/dist/cjs/index.js
CHANGED
|
@@ -164,49 +164,59 @@ const FILE_SIZE_UNITS$1 = [
|
|
|
164
164
|
* @param valueKey value 的 key
|
|
165
165
|
*
|
|
166
166
|
* @example
|
|
167
|
-
*
|
|
168
|
-
* ```js
|
|
169
167
|
* const myObj = {
|
|
170
|
-
*
|
|
171
|
-
*
|
|
172
|
-
* }
|
|
173
|
-
*
|
|
168
|
+
* A: { value: 'a' },
|
|
169
|
+
* B: { value: 'b', other: 'other' },
|
|
170
|
+
* } as const;
|
|
174
171
|
* const enumCode = extractEnumLikeObject(myObj, 'value');
|
|
175
|
-
*
|
|
176
|
-
* ```
|
|
172
|
+
* // => { A: 'a', B: 'b' }
|
|
177
173
|
*/ const extractEnumLikeObject = (enumObject, valueKey)=>Object.entries(enumObject).reduce((acc, [key, value])=>({
|
|
178
174
|
...acc,
|
|
179
175
|
[key]: value[valueKey]
|
|
180
176
|
}), {});
|
|
181
177
|
// 實作
|
|
182
|
-
function createEnumLikeObject(obj,
|
|
183
|
-
const
|
|
178
|
+
function createEnumLikeObject(obj, options) {
|
|
179
|
+
const name = options?.name;
|
|
180
|
+
const scene = options?.scene;
|
|
181
|
+
const valueKey = options?.valueKey ?? 'value';
|
|
182
|
+
const Enum = extractEnumLikeObject(obj, valueKey);
|
|
184
183
|
// List:根據有無 scene 做不同處理
|
|
185
184
|
let list;
|
|
186
185
|
if (scene) {
|
|
187
186
|
// scenes 版本:解構指定 scene 的 label
|
|
188
187
|
list = Object.entries(obj).map(([key, item])=>({
|
|
189
188
|
key,
|
|
190
|
-
value: item
|
|
189
|
+
value: item?.[valueKey],
|
|
191
190
|
...item.scenes?.[scene] ?? {}
|
|
192
191
|
}));
|
|
193
192
|
} else {
|
|
194
193
|
// label only 版本
|
|
195
194
|
list = Object.entries(obj).map(([key, item])=>({
|
|
196
195
|
key,
|
|
196
|
+
value: item?.[valueKey],
|
|
197
197
|
...item
|
|
198
198
|
}));
|
|
199
199
|
}
|
|
200
200
|
function getLabel(value) {
|
|
201
|
-
const targetItem = list.find((item)
|
|
201
|
+
const targetItem = list.find((item)=>// 如果 list 項目內含有 valueKey 對應欄位,優先以該欄位比對;否則以 value 欄位比對
|
|
202
|
+
valueKey in item ? item[valueKey] === value : item.value === value);
|
|
202
203
|
if (!targetItem) return String(value);
|
|
203
204
|
if ('label' in targetItem) return targetItem.label;
|
|
204
205
|
return String(value);
|
|
205
206
|
}
|
|
207
|
+
if (name) {
|
|
208
|
+
// 命名版:使用 Enum${name}, ${name}List, get${name}Label 鍵名
|
|
209
|
+
return {
|
|
210
|
+
[`Enum${name}`]: Enum,
|
|
211
|
+
[`${name}List`]: list,
|
|
212
|
+
[`get${name}Label`]: getLabel
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
// 未命名:提供預設鍵名 Enum, List, getLabel
|
|
206
216
|
return {
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
217
|
+
Enum,
|
|
218
|
+
List: list,
|
|
219
|
+
getLabel
|
|
210
220
|
};
|
|
211
221
|
}
|
|
212
222
|
|
package/dist/es/index.d.mts
CHANGED
|
@@ -373,18 +373,75 @@ declare const isEqual: (value1: unknown, value2: unknown) => boolean;
|
|
|
373
373
|
* @param valueKey value 的 key
|
|
374
374
|
*
|
|
375
375
|
* @example
|
|
376
|
-
*
|
|
377
|
-
* ```js
|
|
378
376
|
* const myObj = {
|
|
379
|
-
*
|
|
380
|
-
*
|
|
381
|
-
* }
|
|
382
|
-
*
|
|
377
|
+
* A: { value: 'a' },
|
|
378
|
+
* B: { value: 'b', other: 'other' },
|
|
379
|
+
* } as const;
|
|
383
380
|
* const enumCode = extractEnumLikeObject(myObj, 'value');
|
|
384
|
-
*
|
|
385
|
-
* ```
|
|
381
|
+
* // => { A: 'a', B: 'b' }
|
|
386
382
|
*/
|
|
387
383
|
declare const extractEnumLikeObject: <T extends Record<string, { [P in K]: any; }>, K extends string>(enumObject: T, valueKey: K) => { [key in keyof T]: T[key][K]; };
|
|
384
|
+
type EnumMap<T extends Record<string, any>, VK extends keyof T[keyof T] & string> = {
|
|
385
|
+
[K in keyof T]: T[K][VK];
|
|
386
|
+
};
|
|
387
|
+
type NormalList<T extends Record<string, any>> = Array<{
|
|
388
|
+
key: string;
|
|
389
|
+
} & T[keyof T]>;
|
|
390
|
+
type ScenesList<T extends Record<string, {
|
|
391
|
+
scenes: Record<string, Record<string, any>>;
|
|
392
|
+
}>, Scene extends keyof T[keyof T]['scenes'] & string, VK extends keyof T[keyof T] & string> = Array<{
|
|
393
|
+
key: string;
|
|
394
|
+
value: T[keyof T][VK];
|
|
395
|
+
} & T[keyof T]['scenes'][Scene]>;
|
|
396
|
+
type NormalReturn<T extends Record<string, any>, VK extends keyof T[keyof T] & string> = {
|
|
397
|
+
Enum: EnumMap<T, VK>;
|
|
398
|
+
List: NormalList<T>;
|
|
399
|
+
getLabel: (value: T[keyof T][VK]) => string;
|
|
400
|
+
};
|
|
401
|
+
type ScenesReturn<T extends Record<string, {
|
|
402
|
+
scenes: Record<string, Record<string, any>>;
|
|
403
|
+
}>, Scene extends keyof T[keyof T]['scenes'] & string, VK extends keyof T[keyof T] & string> = {
|
|
404
|
+
Enum: EnumMap<T, VK>;
|
|
405
|
+
List: ScenesList<T, Scene, VK>;
|
|
406
|
+
getLabel: (value: T[keyof T][VK]) => string;
|
|
407
|
+
};
|
|
408
|
+
type AsNamed<R, N extends string> = {
|
|
409
|
+
[K in keyof R as K extends 'Enum' ? `Enum${N}` : K extends 'List' ? `${N}List` : K extends 'getLabel' ? `get${N}Label` : never]: R[K];
|
|
410
|
+
};
|
|
411
|
+
/**
|
|
412
|
+
* 指定 value 欄位的鍵名選項。
|
|
413
|
+
* @template VK value 對應的鍵名型別
|
|
414
|
+
*/
|
|
415
|
+
type ValueKeyOption<VK extends string> = {
|
|
416
|
+
/**
|
|
417
|
+
* 指定 value 欄位的鍵名,當輸入物件的值欄位不是 `value` 時使用,預設為 `'value'`。
|
|
418
|
+
*/
|
|
419
|
+
valueKey?: VK;
|
|
420
|
+
};
|
|
421
|
+
/**
|
|
422
|
+
* 命名選項,用於產生 `Enum${name}`、`${name}List`、`get${name}Label`。
|
|
423
|
+
* @template N 自訂名稱型別
|
|
424
|
+
*/
|
|
425
|
+
type NamedOption<N extends string> = {
|
|
426
|
+
/**
|
|
427
|
+
* 自訂輸出鍵名的名稱,用於產生 `Enum${name}`、`${name}List`、`get${name}Label`。
|
|
428
|
+
*/
|
|
429
|
+
name: N;
|
|
430
|
+
};
|
|
431
|
+
/**
|
|
432
|
+
* 場景選項,指定要取用的場景 key。
|
|
433
|
+
* @template Scene 場景鍵名型別
|
|
434
|
+
*/
|
|
435
|
+
type SceneOption<Scene extends string> = {
|
|
436
|
+
/**
|
|
437
|
+
* 指定要取用的場景 key,會從 `scenes[scene]` 中取出 label 與其餘屬性。
|
|
438
|
+
*/
|
|
439
|
+
scene: Scene;
|
|
440
|
+
};
|
|
441
|
+
type NormalNamedOptions<N extends string, VK extends string> = NamedOption<N> & ValueKeyOption<VK>;
|
|
442
|
+
type NormalOptions<VK extends string> = ValueKeyOption<VK>;
|
|
443
|
+
type ScenesNamedOptions<N extends string, Scene extends string, VK extends string> = NamedOption<N> & SceneOption<Scene> & ValueKeyOption<VK>;
|
|
444
|
+
type ScenesOptions<Scene extends string, VK extends string> = SceneOption<Scene> & ValueKeyOption<VK>;
|
|
388
445
|
/**
|
|
389
446
|
* 將指定格式的物件生成 enum 物件、enum 列表、取得 label 的方法
|
|
390
447
|
*
|
|
@@ -402,8 +459,9 @@ declare const extractEnumLikeObject: <T extends Record<string, { [P in K]: any;
|
|
|
402
459
|
*
|
|
403
460
|
* 取得 label 的方法 - 傳入 value 可以取得對應的 label
|
|
404
461
|
*
|
|
405
|
-
*
|
|
406
|
-
*
|
|
462
|
+
* 參數:
|
|
463
|
+
* - obj:要處理的物件
|
|
464
|
+
* - options:設定物件(可選)。若未提供 name,將使用預設鍵名:`Enum`、`List`、`getLabel`。
|
|
407
465
|
*
|
|
408
466
|
* @remarks
|
|
409
467
|
* 若需多場景 label,請傳入第三參數 scene,詳細用法請見範例。
|
|
@@ -412,50 +470,52 @@ declare const extractEnumLikeObject: <T extends Record<string, { [P in K]: any;
|
|
|
412
470
|
*
|
|
413
471
|
* ```ts
|
|
414
472
|
*
|
|
415
|
-
* //
|
|
473
|
+
* // 一般使用(命名版)
|
|
416
474
|
* const Status = { Enabled: { value: 'enabled', label: '啟用' }, Disabled: { value: 'disabled', label: '停用' }};
|
|
417
|
-
* const { EnumStatus, StatusList, getStatusLabel } = createEnumLikeObject(Status, 'Status');
|
|
475
|
+
* const { EnumStatus, StatusList, getStatusLabel } = createEnumLikeObject(Status, { name: 'Status' });
|
|
418
476
|
* console.log(EnumStatus); // { Enabled: 'enabled', Disabled: 'disabled' }
|
|
419
477
|
* console.log(StatusList); // [ { key: 'Enabled', value: 'enabled', label: '啟用' }, { key: 'Disabled', value: 'disabled', label: '停用' }]
|
|
420
478
|
* console.log(getStatusLabel('enabled')); // '啟用'
|
|
421
479
|
*
|
|
480
|
+
* // 一般使用(未命名,使用預設鍵名)
|
|
481
|
+
* const { Enum, List, getLabel } = createEnumLikeObject(Status);
|
|
482
|
+
* console.log(Enum); // { Enabled: 'enabled', Disabled: 'disabled' }
|
|
483
|
+
* console.log(List); // [ { key: 'Enabled', value: 'enabled', label: '啟用' }, { key: 'Disabled', value: 'disabled', label: '停用' }]
|
|
484
|
+
* console.log(getLabel('enabled')); // '啟用'
|
|
485
|
+
*
|
|
422
486
|
* // scenes 版本
|
|
423
487
|
*
|
|
424
488
|
* const Status = { Enabled: { value: 'enabled', scenes: { webA: { label: '啟用' }, webB: { label: '激活' } } }, Disabled: { value: 'disabled', scenes: { webA: { label: '停用' }, webB: { label: '停止' }}}}
|
|
425
|
-
* const { EnumStatusA, StatusAList, getStatusALabel } = createEnumLikeObject(Status, 'StatusA', 'webA');
|
|
489
|
+
* const { EnumStatusA, StatusAList, getStatusALabel } = createEnumLikeObject(Status, { name: 'StatusA', scene: 'webA' });
|
|
426
490
|
* console.log(EnumStatusA); // { Enabled: 'enabled', Disabled: 'disabled' }
|
|
427
491
|
* console.log(StatusAList); // [ { key: 'Enabled', value: 'enabled', label: '啟用' }, { key: 'Disabled', value: 'disabled', label: '停用' }]
|
|
428
492
|
* console.log(getStatusALabel('enabled')); // '啟用'
|
|
429
493
|
*
|
|
430
|
-
* const {
|
|
494
|
+
* const { EnumStatusB, StatusBList, getStatusBLabel } = createEnumLikeObject(Status, { name: 'StatusB', scene: 'webB' });
|
|
431
495
|
* console.log(EnumStatusB); // { Enabled: 'enabled', Disabled: 'disabled' }
|
|
432
496
|
* console.log(StatusBList); // [ { key: 'Enabled', value: 'enabled', label: '激活' }, { key: 'Disabled', value: 'disabled', label: '停止' }]
|
|
433
497
|
* console.log(getStatusBLabel('enabled')); // '激活'
|
|
434
498
|
*
|
|
499
|
+
* // scenes 版本(未命名,使用預設鍵名)
|
|
500
|
+
* const { Enum, List, getLabel } = createEnumLikeObject(Status, { scene: 'webA' });
|
|
501
|
+
* console.log(Enum); // { Enabled: 'enabled', Disabled: 'disabled' }
|
|
502
|
+
* console.log(List); // [ { key: 'Enabled', value: 'enabled', label: '啟用' }, { key: 'Disabled', value: 'disabled', label: '停用' }]
|
|
503
|
+
* console.log(getLabel('enabled')); // '啟用'
|
|
435
504
|
* ```
|
|
436
505
|
*
|
|
437
506
|
*/
|
|
438
|
-
declare function createEnumLikeObject<T extends Record<string, {
|
|
439
|
-
value: any;
|
|
440
|
-
label: string;
|
|
441
|
-
}>, N extends string>(obj: T, name: N): {
|
|
442
|
-
[K in `Enum${N}` | `${N}List` | `get${N}Label`]: K extends `Enum${N}` ? {
|
|
443
|
-
[key in keyof T]: T[key]['value'];
|
|
444
|
-
} : K extends `${N}List` ? Array<{
|
|
445
|
-
key: string;
|
|
446
|
-
} & T[keyof T]> : (value: T[keyof T]['value']) => string;
|
|
447
|
-
};
|
|
448
|
-
declare function createEnumLikeObject<T extends Record<string, {
|
|
449
|
-
value: any;
|
|
507
|
+
declare function createEnumLikeObject<T extends Record<string, Record<VK, any> & {
|
|
450
508
|
scenes: Record<string, Record<string, any>>;
|
|
451
|
-
}>, N extends string, Scene extends keyof T[keyof T]['scenes']>(obj: T,
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
509
|
+
}>, N extends string, Scene extends keyof T[keyof T]['scenes'] & string, VK extends keyof T[keyof T] & string>(obj: T, options: ScenesNamedOptions<N, Scene, VK>): AsNamed<ScenesReturn<T, Scene, VK>, N>;
|
|
510
|
+
declare function createEnumLikeObject<T extends Record<string, Record<VK, any> & {
|
|
511
|
+
scenes: Record<string, Record<string, any>>;
|
|
512
|
+
}>, Scene extends keyof T[keyof T]['scenes'] & string, VK extends keyof T[keyof T] & string>(obj: T, options: ScenesOptions<Scene, VK>): ScenesReturn<T, Scene, VK>;
|
|
513
|
+
declare function createEnumLikeObject<T extends Record<string, Record<VK, any> & {
|
|
514
|
+
label: string;
|
|
515
|
+
}>, N extends string, VK extends keyof T[keyof T] & string>(obj: T, options: NormalNamedOptions<N, VK>): AsNamed<NormalReturn<T, VK>, N>;
|
|
516
|
+
declare function createEnumLikeObject<T extends Record<string, Record<VK, any> & {
|
|
517
|
+
label: string;
|
|
518
|
+
}>, VK extends keyof T[keyof T] & string>(obj: T, options?: NormalOptions<VK>): NormalReturn<T, VK>;
|
|
459
519
|
|
|
460
520
|
/**
|
|
461
521
|
* simulate a fake api request
|
package/dist/es/index.mjs
CHANGED
|
@@ -157,49 +157,59 @@ const FILE_SIZE_UNITS$1 = [
|
|
|
157
157
|
* @param valueKey value 的 key
|
|
158
158
|
*
|
|
159
159
|
* @example
|
|
160
|
-
*
|
|
161
|
-
* ```js
|
|
162
160
|
* const myObj = {
|
|
163
|
-
*
|
|
164
|
-
*
|
|
165
|
-
* }
|
|
166
|
-
*
|
|
161
|
+
* A: { value: 'a' },
|
|
162
|
+
* B: { value: 'b', other: 'other' },
|
|
163
|
+
* } as const;
|
|
167
164
|
* const enumCode = extractEnumLikeObject(myObj, 'value');
|
|
168
|
-
*
|
|
169
|
-
* ```
|
|
165
|
+
* // => { A: 'a', B: 'b' }
|
|
170
166
|
*/ const extractEnumLikeObject = (enumObject, valueKey)=>Object.entries(enumObject).reduce((acc, [key, value])=>({
|
|
171
167
|
...acc,
|
|
172
168
|
[key]: value[valueKey]
|
|
173
169
|
}), {});
|
|
174
170
|
// 實作
|
|
175
|
-
function createEnumLikeObject(obj,
|
|
176
|
-
const
|
|
171
|
+
function createEnumLikeObject(obj, options) {
|
|
172
|
+
const name = options?.name;
|
|
173
|
+
const scene = options?.scene;
|
|
174
|
+
const valueKey = options?.valueKey ?? 'value';
|
|
175
|
+
const Enum = extractEnumLikeObject(obj, valueKey);
|
|
177
176
|
// List:根據有無 scene 做不同處理
|
|
178
177
|
let list;
|
|
179
178
|
if (scene) {
|
|
180
179
|
// scenes 版本:解構指定 scene 的 label
|
|
181
180
|
list = Object.entries(obj).map(([key, item])=>({
|
|
182
181
|
key,
|
|
183
|
-
value: item
|
|
182
|
+
value: item?.[valueKey],
|
|
184
183
|
...item.scenes?.[scene] ?? {}
|
|
185
184
|
}));
|
|
186
185
|
} else {
|
|
187
186
|
// label only 版本
|
|
188
187
|
list = Object.entries(obj).map(([key, item])=>({
|
|
189
188
|
key,
|
|
189
|
+
value: item?.[valueKey],
|
|
190
190
|
...item
|
|
191
191
|
}));
|
|
192
192
|
}
|
|
193
193
|
function getLabel(value) {
|
|
194
|
-
const targetItem = list.find((item)
|
|
194
|
+
const targetItem = list.find((item)=>// 如果 list 項目內含有 valueKey 對應欄位,優先以該欄位比對;否則以 value 欄位比對
|
|
195
|
+
valueKey in item ? item[valueKey] === value : item.value === value);
|
|
195
196
|
if (!targetItem) return String(value);
|
|
196
197
|
if ('label' in targetItem) return targetItem.label;
|
|
197
198
|
return String(value);
|
|
198
199
|
}
|
|
200
|
+
if (name) {
|
|
201
|
+
// 命名版:使用 Enum${name}, ${name}List, get${name}Label 鍵名
|
|
202
|
+
return {
|
|
203
|
+
[`Enum${name}`]: Enum,
|
|
204
|
+
[`${name}List`]: list,
|
|
205
|
+
[`get${name}Label`]: getLabel
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
// 未命名:提供預設鍵名 Enum, List, getLabel
|
|
199
209
|
return {
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
210
|
+
Enum,
|
|
211
|
+
List: list,
|
|
212
|
+
getLabel
|
|
203
213
|
};
|
|
204
214
|
}
|
|
205
215
|
|