@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.
@@ -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
- * A: { value: 'a' },
380
- * B: { value: 'b', other: 'other' },
381
- * }
382
- *
377
+ * A: { value: 'a' },
378
+ * B: { value: 'b', other: 'other' },
379
+ * } as const;
383
380
  * const enumCode = extractEnumLikeObject(myObj, 'value');
384
- * console.log(enumCode); // { A: 'a', B: 'b' }
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
- * @param obj 要處理的物件
406
- * @param name 生成的 enum 名稱
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 { EnumStatusA, StatusAList, getStatusALabel } = createEnumLikeObject(Status, 'StatusB', 'webB');
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, name: N, scene: Scene): {
452
- [K in `Enum${N}` | `${N}List` | `get${N}Label`]: K extends `Enum${N}` ? {
453
- [key in keyof T]: T[key]['value'];
454
- } : K extends `${N}List` ? Array<{
455
- key: string;
456
- value: T[keyof T]['value'];
457
- } & T[keyof T]['scenes'][Scene]> : (value: T[keyof T]['value']) => string;
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
- * A: { value: 'a' },
171
- * B: { value: 'b', other: 'other' },
172
- * }
173
- *
168
+ * A: { value: 'a' },
169
+ * B: { value: 'b', other: 'other' },
170
+ * } as const;
174
171
  * const enumCode = extractEnumLikeObject(myObj, 'value');
175
- * console.log(enumCode); // { A: 'a', B: 'b' }
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, name, scene) {
183
- const Enum = extractEnumLikeObject(obj, 'value');
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.value,
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)=>item.value === value);
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
- [`Enum${name}`]: Enum,
208
- [`${name}List`]: list,
209
- [`get${name}Label`]: getLabel
217
+ Enum,
218
+ List: list,
219
+ getLabel
210
220
  };
211
221
  }
212
222
 
@@ -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
- * A: { value: 'a' },
380
- * B: { value: 'b', other: 'other' },
381
- * }
382
- *
377
+ * A: { value: 'a' },
378
+ * B: { value: 'b', other: 'other' },
379
+ * } as const;
383
380
  * const enumCode = extractEnumLikeObject(myObj, 'value');
384
- * console.log(enumCode); // { A: 'a', B: 'b' }
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
- * @param obj 要處理的物件
406
- * @param name 生成的 enum 名稱
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 { EnumStatusA, StatusAList, getStatusALabel } = createEnumLikeObject(Status, 'StatusB', 'webB');
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, name: N, scene: Scene): {
452
- [K in `Enum${N}` | `${N}List` | `get${N}Label`]: K extends `Enum${N}` ? {
453
- [key in keyof T]: T[key]['value'];
454
- } : K extends `${N}List` ? Array<{
455
- key: string;
456
- value: T[keyof T]['value'];
457
- } & T[keyof T]['scenes'][Scene]> : (value: T[keyof T]['value']) => string;
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
- * A: { value: 'a' },
164
- * B: { value: 'b', other: 'other' },
165
- * }
166
- *
161
+ * A: { value: 'a' },
162
+ * B: { value: 'b', other: 'other' },
163
+ * } as const;
167
164
  * const enumCode = extractEnumLikeObject(myObj, 'value');
168
- * console.log(enumCode); // { A: 'a', B: 'b' }
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, name, scene) {
176
- const Enum = extractEnumLikeObject(obj, 'value');
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.value,
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)=>item.value === value);
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
- [`Enum${name}`]: Enum,
201
- [`${name}List`]: list,
202
- [`get${name}Label`]: getLabel
210
+ Enum,
211
+ List: list,
212
+ getLabel
203
213
  };
204
214
  }
205
215
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gateweb/react-utils",
3
- "version": "1.14.1",
3
+ "version": "1.14.3",
4
4
  "description": "React Utils for GateWeb",
5
5
  "homepage": "https://github.com/GatewebSolutions/react-utils",
6
6
  "files": [