@gateweb/react-utils 1.9.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.
@@ -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];
@@ -408,23 +408,50 @@ declare const extractEnumLikeObject: <T extends Record<string, { [P in K]: any;
408
408
  * @example
409
409
  *
410
410
  * ```ts
411
- * const Status = { Enabled: { value: 'enabled', label: '啟用' }, Disabled: { value: 'disabled', label: '停用' } };
412
411
  *
412
+ * // 一般使用
413
+ * const Status = { Enabled: { value: 'enabled', label: '啟用' }, Disabled: { value: 'disabled', label: '停用' }};
413
414
  * const { EnumStatus, StatusList, getStatusLabel } = createEnumLikeObject(Status, 'Status');
414
- *
415
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')); // '啟用'
416
418
  *
417
- * console.log(StatusList); // [ { key: 'Enabled', value: 'enabled', label: '啟用' }, { key: 'Disabled', value: 'disabled', label: '停用' } ]
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')); // '激活'
418
431
  *
419
- * console.log(getStatusLabel('enabled')); // '啟用'
420
432
  * ```
421
433
  */
422
- declare const createEnumLikeObject: <T extends Record<string, {
434
+ declare function createEnumLikeObject<T extends Record<string, {
423
435
  value: any;
424
436
  label: string;
425
- }>, N extends string>(obj: T, name: N) => { [K in `Enum${N}` | `${N}List` | `get${N}Label`]: K extends `Enum${N}` ? { [key in keyof T]: T[key]["value"]; } : K extends `${N}List` ? ({
426
- key: keyof T;
427
- } & T[keyof T])[] : (value: TExtractValueType<T, "value">) => string | TExtractValueType<T, "value">; };
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
+ };
428
455
 
429
456
  /**
430
457
  * simulate a fake api request
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
- * 將指定格式的物件生成 enum 物件、enum 列表、取得 label 的方法
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
- const list = Object.entries(obj).map(([key, item])=>({
216
- key,
217
- ...item
218
- }));
219
- const getLabel = (value)=>{
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
- return targetItem.label;
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
@@ -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];
@@ -408,23 +408,50 @@ declare const extractEnumLikeObject: <T extends Record<string, { [P in K]: any;
408
408
  * @example
409
409
  *
410
410
  * ```ts
411
- * const Status = { Enabled: { value: 'enabled', label: '啟用' }, Disabled: { value: 'disabled', label: '停用' } };
412
411
  *
412
+ * // 一般使用
413
+ * const Status = { Enabled: { value: 'enabled', label: '啟用' }, Disabled: { value: 'disabled', label: '停用' }};
413
414
  * const { EnumStatus, StatusList, getStatusLabel } = createEnumLikeObject(Status, 'Status');
414
- *
415
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')); // '啟用'
416
418
  *
417
- * console.log(StatusList); // [ { key: 'Enabled', value: 'enabled', label: '啟用' }, { key: 'Disabled', value: 'disabled', label: '停用' } ]
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')); // '激活'
418
431
  *
419
- * console.log(getStatusLabel('enabled')); // '啟用'
420
432
  * ```
421
433
  */
422
- declare const createEnumLikeObject: <T extends Record<string, {
434
+ declare function createEnumLikeObject<T extends Record<string, {
423
435
  value: any;
424
436
  label: string;
425
- }>, N extends string>(obj: T, name: N) => { [K in `Enum${N}` | `${N}List` | `get${N}Label`]: K extends `Enum${N}` ? { [key in keyof T]: T[key]["value"]; } : K extends `${N}List` ? ({
426
- key: keyof T;
427
- } & T[keyof T])[] : (value: TExtractValueType<T, "value">) => string | TExtractValueType<T, "value">; };
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
+ };
428
455
 
429
456
  /**
430
457
  * simulate a fake api request
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
- * 將指定格式的物件生成 enum 物件、enum 列表、取得 label 的方法
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
- const list = Object.entries(obj).map(([key, item])=>({
210
- key,
211
- ...item
212
- }));
213
- const getLabel = (value)=>{
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
- return targetItem.label;
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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gateweb/react-utils",
3
- "version": "1.9.0",
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",