@gateweb/react-utils 1.14.4 → 1.16.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 +36 -2
- package/dist/cjs/index.js +34 -10
- package/dist/cjs/types.d.ts +66 -1
- package/dist/cjs/useDisclosure-12s-SZtbSE4A.js +24 -0
- package/dist/es/index.d.mts +36 -2
- package/dist/es/index.mjs +27 -5
- package/dist/es/types.d.mts +66 -1
- package/dist/es/useDisclosure-12s-BQAHpAXK.mjs +24 -0
- package/package.json +2 -2
- /package/dist/cjs/{download-client-DKxkL92w.js → download-12s-DKxkL92w.js} +0 -0
- /package/dist/cjs/{queryStore-client-q_SLGgYH.js → queryStore-12s-q_SLGgYH.js} +0 -0
- /package/dist/cjs/{useCountdown-client-uiqhgllY.js → useCountdown-12s-uiqhgllY.js} +0 -0
- /package/dist/cjs/{webStorage-client-DHr9PcPl.js → webStorage-12s-DHr9PcPl.js} +0 -0
- /package/dist/es/{download-client-CnaJ0p_f.mjs → download-12s-CnaJ0p_f.mjs} +0 -0
- /package/dist/es/{queryStore-client-CFQTVwrg.mjs → queryStore-12s-CFQTVwrg.mjs} +0 -0
- /package/dist/es/{useCountdown-client-t52WIHfq.mjs → useCountdown-12s-t52WIHfq.mjs} +0 -0
- /package/dist/es/{webStorage-client-W1DItzhS.mjs → webStorage-12s-W1DItzhS.mjs} +0 -0
package/dist/cjs/index.d.ts
CHANGED
|
@@ -764,6 +764,20 @@ type PartialBy<T, K extends keyof T, RemoveUndefined extends boolean = false> =
|
|
|
764
764
|
*
|
|
765
765
|
*/
|
|
766
766
|
declare const deepClone: <T>(obj: T) => T;
|
|
767
|
+
/**
|
|
768
|
+
* A utility function to rename a key in an object.
|
|
769
|
+
*
|
|
770
|
+
* @param obj - The object to modify.
|
|
771
|
+
* @param oldKey - The key to rename.
|
|
772
|
+
* @param newKey - The new key name.
|
|
773
|
+
*
|
|
774
|
+
* @example
|
|
775
|
+
*
|
|
776
|
+
* const obj = { a: 1, b: 2 };
|
|
777
|
+
* const newObj = renameKey(obj, 'a', 'c');
|
|
778
|
+
* console.log(newObj); // { c: 1, b: 2 }
|
|
779
|
+
*/
|
|
780
|
+
declare const renameKey: <T extends object, K extends keyof T, NK extends string>(obj: T, oldKey: K, newKey: NK) => Omit<T, K> & Record<NK, T[K]>;
|
|
767
781
|
|
|
768
782
|
/**
|
|
769
783
|
* debounce function
|
|
@@ -1212,6 +1226,26 @@ type TCountdownActions = {
|
|
|
1212
1226
|
*/
|
|
1213
1227
|
declare const useCountdown: (initialCountdown: number, enableReinitialize?: boolean) => TCountdownActions;
|
|
1214
1228
|
|
|
1229
|
+
type UseDisclosureReturn = {
|
|
1230
|
+
/** Whether the disclosure is currently open. */
|
|
1231
|
+
isOpen: boolean;
|
|
1232
|
+
/** Open the disclosure (sets isOpen = true). */
|
|
1233
|
+
open: () => void;
|
|
1234
|
+
/** Close the disclosure (sets isOpen = false). */
|
|
1235
|
+
close: () => void;
|
|
1236
|
+
/** Toggle the disclosure state (open -> close or close -> open). */
|
|
1237
|
+
toggle: () => void;
|
|
1238
|
+
};
|
|
1239
|
+
/**
|
|
1240
|
+
* A small hook to control open/close state.
|
|
1241
|
+
*
|
|
1242
|
+
* Supports an optional controlled pattern by passing `isOpen` and `onChange`.
|
|
1243
|
+
*
|
|
1244
|
+
* @example
|
|
1245
|
+
* const { isOpen, open, close, toggle } = useDisclosure();
|
|
1246
|
+
*/
|
|
1247
|
+
declare function useDisclosure(initialState?: boolean): UseDisclosureReturn;
|
|
1248
|
+
|
|
1215
1249
|
type TValueOptions<T> = AtLeastOne<{
|
|
1216
1250
|
/**
|
|
1217
1251
|
* The controlled value.
|
|
@@ -1321,5 +1355,5 @@ declare const getLocalStorage: <T>(key: string, deCode?: boolean) => T | undefin
|
|
|
1321
1355
|
*/
|
|
1322
1356
|
declare const setLocalStorage: (key: string, value: Record<string, any>, enCode?: boolean) => void;
|
|
1323
1357
|
|
|
1324
|
-
export { ByteSize, MimeTypeMap, OtherMimeType, QueryProvider, adToRocEra, camelCase2PascalCase, camelCase2SnakeCase, camelString2PascalString, camelString2SnakeString, convertBytes, createDataContext, createEnumLikeObject, debounce, deepClone, deepMerge, downloadFile, extractEnumLikeObject, fakeApi, formatAmount, formatBytes, formatStarMask, generatePeriodArray, getCurrentPeriod, getLocalStorage, getMimeType, invariant, isChinese, isDateString, isDateTimeString, isEmail, isEnglish, isEqual, isNil, isNonZeroStart, isNumber, isNumberAtLeastN, isNumberN, isNumberNM, isServer, isTWMobile, isTWPhone, isTimeString, isValidPassword, maskString, mergeConfig, mergeRefs, objectToSearchParams, omit, omitByValue, parseFileInfoFromFilename, parseFilenameFromDisposition, pascalCase2CamelCase, pascalCase2SnakeCase, pascalString2CamelString, pascalString2SnakeString, pick, pickByValue, rocEraToAd, searchParamsToObject, setLocalStorage, snakeCase2CamelCase, snakeCase2PascalCase, snakeString2CamelString, snakeString2PascalString, throttle, useCountdown, useQueryContext, useValue, validTaxId, validateDateString, validateFileType, wait };
|
|
1325
|
-
export type { MimeTypeExtension, MimeTypeValue, PartialBy, RequiredBy, TCountdownActions };
|
|
1358
|
+
export { ByteSize, MimeTypeMap, OtherMimeType, QueryProvider, adToRocEra, camelCase2PascalCase, camelCase2SnakeCase, camelString2PascalString, camelString2SnakeString, convertBytes, createDataContext, createEnumLikeObject, debounce, deepClone, deepMerge, downloadFile, extractEnumLikeObject, fakeApi, formatAmount, formatBytes, formatStarMask, generatePeriodArray, getCurrentPeriod, getLocalStorage, getMimeType, invariant, isChinese, isDateString, isDateTimeString, isEmail, isEnglish, isEqual, isNil, isNonZeroStart, isNumber, isNumberAtLeastN, isNumberN, isNumberNM, isServer, isTWMobile, isTWPhone, isTimeString, isValidPassword, maskString, mergeConfig, mergeRefs, objectToSearchParams, omit, omitByValue, parseFileInfoFromFilename, parseFilenameFromDisposition, pascalCase2CamelCase, pascalCase2SnakeCase, pascalString2CamelString, pascalString2SnakeString, pick, pickByValue, renameKey, rocEraToAd, searchParamsToObject, setLocalStorage, snakeCase2CamelCase, snakeCase2PascalCase, snakeString2CamelString, snakeString2PascalString, throttle, useCountdown, useDisclosure, useQueryContext, useValue, validTaxId, validateDateString, validateFileType, wait };
|
|
1359
|
+
export type { MimeTypeExtension, MimeTypeValue, PartialBy, RequiredBy, TCountdownActions, UseDisclosureReturn };
|
package/dist/cjs/index.js
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
2
2
|
|
|
3
3
|
var dayjs = require('dayjs');
|
|
4
|
-
var
|
|
4
|
+
var queryStore12s = require('./queryStore-12s-q_SLGgYH.js');
|
|
5
5
|
var React = require('react');
|
|
6
|
-
var
|
|
7
|
-
var
|
|
8
|
-
var
|
|
6
|
+
var useCountdown12s = require('./useCountdown-12s-uiqhgllY.js');
|
|
7
|
+
var useDisclosure12s = require('./useDisclosure-12s-SZtbSE4A.js');
|
|
8
|
+
var download12s = require('./download-12s-DKxkL92w.js');
|
|
9
|
+
var webStorage12s = require('./webStorage-12s-DHr9PcPl.js');
|
|
9
10
|
|
|
10
11
|
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
11
12
|
|
|
@@ -539,6 +540,27 @@ const isObject = (value)=>value !== null && typeof value === 'object';
|
|
|
539
540
|
}, {});
|
|
540
541
|
return cloned;
|
|
541
542
|
};
|
|
543
|
+
/**
|
|
544
|
+
* A utility function to rename a key in an object.
|
|
545
|
+
*
|
|
546
|
+
* @param obj - The object to modify.
|
|
547
|
+
* @param oldKey - The key to rename.
|
|
548
|
+
* @param newKey - The new key name.
|
|
549
|
+
*
|
|
550
|
+
* @example
|
|
551
|
+
*
|
|
552
|
+
* const obj = { a: 1, b: 2 };
|
|
553
|
+
* const newObj = renameKey(obj, 'a', 'c');
|
|
554
|
+
* console.log(newObj); // { c: 1, b: 2 }
|
|
555
|
+
*/ const renameKey = (obj, oldKey, newKey)=>{
|
|
556
|
+
// 建立一個淺拷貝,避免修改原始物件
|
|
557
|
+
const { [oldKey]: oldValue, ...rest } = obj;
|
|
558
|
+
// 回傳新的物件:用新 key 存舊值,其他 key 保留
|
|
559
|
+
return {
|
|
560
|
+
...rest,
|
|
561
|
+
[newKey]: oldValue
|
|
562
|
+
};
|
|
563
|
+
};
|
|
542
564
|
|
|
543
565
|
/**
|
|
544
566
|
* 將嵌套物件的所有屬性設為指定的布林值
|
|
@@ -1399,12 +1421,13 @@ function mergeRefs(refs) {
|
|
|
1399
1421
|
return dayjs__default.default(endMonth, 'YYYYMM').subtract(1911, 'year').format('YYYYMM').substring(1);
|
|
1400
1422
|
};
|
|
1401
1423
|
|
|
1402
|
-
exports.QueryProvider =
|
|
1403
|
-
exports.useQueryContext =
|
|
1404
|
-
exports.useCountdown =
|
|
1405
|
-
exports.
|
|
1406
|
-
exports.
|
|
1407
|
-
exports.
|
|
1424
|
+
exports.QueryProvider = queryStore12s.QueryProvider;
|
|
1425
|
+
exports.useQueryContext = queryStore12s.useQueryContext;
|
|
1426
|
+
exports.useCountdown = useCountdown12s.useCountdown;
|
|
1427
|
+
exports.useDisclosure = useDisclosure12s.useDisclosure;
|
|
1428
|
+
exports.downloadFile = download12s.downloadFile;
|
|
1429
|
+
exports.getLocalStorage = webStorage12s.getLocalStorage;
|
|
1430
|
+
exports.setLocalStorage = webStorage12s.setLocalStorage;
|
|
1408
1431
|
exports.ByteSize = ByteSize;
|
|
1409
1432
|
exports.MimeTypeMap = MimeTypeMap;
|
|
1410
1433
|
exports.OtherMimeType = OtherMimeType;
|
|
@@ -1459,6 +1482,7 @@ exports.pascalString2CamelString = pascalString2CamelString;
|
|
|
1459
1482
|
exports.pascalString2SnakeString = pascalString2SnakeString;
|
|
1460
1483
|
exports.pick = pick;
|
|
1461
1484
|
exports.pickByValue = pickByValue;
|
|
1485
|
+
exports.renameKey = renameKey;
|
|
1462
1486
|
exports.rocEraToAd = rocEraToAd;
|
|
1463
1487
|
exports.searchParamsToObject = searchParamsToObject;
|
|
1464
1488
|
exports.snakeCase2CamelCase = snakeCase2CamelCase;
|
package/dist/cjs/types.d.ts
CHANGED
|
@@ -200,5 +200,70 @@ type MapToType<T extends Record<any, any>, A = any> = {
|
|
|
200
200
|
type OverrideProps<T, R extends {
|
|
201
201
|
[K in keyof R]: any;
|
|
202
202
|
}> = Omit<T, keyof R> & R;
|
|
203
|
+
/**
|
|
204
|
+
* A utility type that makes a specific property in the generic type `T` required while keeping the rest optional.
|
|
205
|
+
*
|
|
206
|
+
* @template T - The object type to modify.
|
|
207
|
+
* @template K - The key of the property to make required.
|
|
208
|
+
*
|
|
209
|
+
* @example
|
|
210
|
+
* type User = { id?: number; name?: string }
|
|
211
|
+
* type FormUser = WithRequired<User, 'id'> // { id: number; name?: string }
|
|
212
|
+
*/
|
|
213
|
+
type WithRequired<T, K extends keyof T> = Required<Pick<T, K>> & Omit<T, K>;
|
|
214
|
+
/**
|
|
215
|
+
* A utility type that makes a specific property in the generic type `T` optional while keeping the rest required.
|
|
216
|
+
*
|
|
217
|
+
* @template T - The object type to modify.
|
|
218
|
+
* @template K - The key of the property to make optional.
|
|
219
|
+
*
|
|
220
|
+
* @example
|
|
221
|
+
* type User = { id: number; name: string }
|
|
222
|
+
* type FormUser = WithOptional<User, 'id'> // { id?: number; name: string }
|
|
223
|
+
*/
|
|
224
|
+
type WithOptional<T, K extends keyof T> = Partial<Pick<T, K>> & Omit<T, K>;
|
|
225
|
+
/**
|
|
226
|
+
* 產生從 1 到 N 的「數字字面量聯集」型別。
|
|
227
|
+
*
|
|
228
|
+
* @template N - 終止數字(必須是正整數)
|
|
229
|
+
* @template A - 用於遞迴計數的輔助 tuple,預設為 [any] 代表從 1 開始
|
|
230
|
+
* @template R - 暫存累積結果的 union,預設為 1
|
|
231
|
+
*
|
|
232
|
+
* @returns 1 | 2 | ... | N
|
|
233
|
+
*
|
|
234
|
+
* @example
|
|
235
|
+
* type T1 = Num1ToN<3>;
|
|
236
|
+
* // ^? 1 | 2 | 3
|
|
237
|
+
*
|
|
238
|
+
* type T2 = Num1ToN<5>;
|
|
239
|
+
* // ^? 1 | 2 | 3 | 4 | 5
|
|
240
|
+
*
|
|
241
|
+
* @warning
|
|
242
|
+
* ⚠ **效能注意事項**:
|
|
243
|
+
* - 遞迴深度等於 `N`,因此 `N` 過大會影響 TypeScript 編譯效能
|
|
244
|
+
* - 建議 **N ≤ 100**,否則 VS Code IntelliSense 可能變慢
|
|
245
|
+
*/
|
|
246
|
+
type Num1ToN<N extends number, A extends any[] = [], R extends number = never> = A['length'] extends N ? R | N : Num1ToN<N, [...A, any], R | (A['length'] extends 0 ? never : A['length'])>;
|
|
247
|
+
/**
|
|
248
|
+
* 根據給定的前綴字串與數量,從陣列型別生成一個物件型別。
|
|
249
|
+
*
|
|
250
|
+
* @template T - 陣列型別,例如 `string[]`
|
|
251
|
+
* @template Prefix - 屬性鍵的前綴字串,例如 `'url'`
|
|
252
|
+
* @template N - 欄位數量,會生成 1..N 的鍵名
|
|
253
|
+
*
|
|
254
|
+
* @returns 一個物件型別,鍵為 `${Prefix}${1..N}`,值為 `T[number]`
|
|
255
|
+
*
|
|
256
|
+
* @example
|
|
257
|
+
* type List = string[];
|
|
258
|
+
*
|
|
259
|
+
* type Obj = BuildPrefixedObject<List, 'url', 3>;
|
|
260
|
+
* // ^? { url1: string; url2: string; url3: string }
|
|
261
|
+
*
|
|
262
|
+
* type Obj2 = BuildPrefixedObject<List, 'name', 2>;
|
|
263
|
+
* // ^? { name1: string; name2: string }
|
|
264
|
+
*/
|
|
265
|
+
type BuildPrefixedObject<T extends readonly unknown[], Prefix extends string, N extends number> = {
|
|
266
|
+
[K in Num1ToN<N> as `${Prefix}${K & number}`]: T[number];
|
|
267
|
+
};
|
|
203
268
|
|
|
204
|
-
export type { AtLeastOne, DeepPartial, Entries, MapToString, MapToType, OnlyOne, OverrideProps, PopArgs, PushArgs, ShiftArgs, TChangeKeyType, TExtractValueType, UnshiftArgs };
|
|
269
|
+
export type { AtLeastOne, BuildPrefixedObject, DeepPartial, Entries, MapToString, MapToType, Num1ToN, OnlyOne, OverrideProps, PopArgs, PushArgs, ShiftArgs, TChangeKeyType, TExtractValueType, UnshiftArgs, WithOptional, WithRequired };
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
var React = require('react');
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* A small hook to control open/close state.
|
|
6
|
+
*
|
|
7
|
+
* Supports an optional controlled pattern by passing `isOpen` and `onChange`.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* const { isOpen, open, close, toggle } = useDisclosure();
|
|
11
|
+
*/ function useDisclosure(initialState = false) {
|
|
12
|
+
const [isOpen, setIsOpen] = React.useState(initialState);
|
|
13
|
+
const open = React.useCallback(()=>setIsOpen(true), []);
|
|
14
|
+
const close = React.useCallback(()=>setIsOpen(false), []);
|
|
15
|
+
const toggle = React.useCallback(()=>setIsOpen((prev)=>!prev), []);
|
|
16
|
+
return {
|
|
17
|
+
isOpen,
|
|
18
|
+
open,
|
|
19
|
+
close,
|
|
20
|
+
toggle
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
exports.useDisclosure = useDisclosure;
|
package/dist/es/index.d.mts
CHANGED
|
@@ -764,6 +764,20 @@ type PartialBy<T, K extends keyof T, RemoveUndefined extends boolean = false> =
|
|
|
764
764
|
*
|
|
765
765
|
*/
|
|
766
766
|
declare const deepClone: <T>(obj: T) => T;
|
|
767
|
+
/**
|
|
768
|
+
* A utility function to rename a key in an object.
|
|
769
|
+
*
|
|
770
|
+
* @param obj - The object to modify.
|
|
771
|
+
* @param oldKey - The key to rename.
|
|
772
|
+
* @param newKey - The new key name.
|
|
773
|
+
*
|
|
774
|
+
* @example
|
|
775
|
+
*
|
|
776
|
+
* const obj = { a: 1, b: 2 };
|
|
777
|
+
* const newObj = renameKey(obj, 'a', 'c');
|
|
778
|
+
* console.log(newObj); // { c: 1, b: 2 }
|
|
779
|
+
*/
|
|
780
|
+
declare const renameKey: <T extends object, K extends keyof T, NK extends string>(obj: T, oldKey: K, newKey: NK) => Omit<T, K> & Record<NK, T[K]>;
|
|
767
781
|
|
|
768
782
|
/**
|
|
769
783
|
* debounce function
|
|
@@ -1212,6 +1226,26 @@ type TCountdownActions = {
|
|
|
1212
1226
|
*/
|
|
1213
1227
|
declare const useCountdown: (initialCountdown: number, enableReinitialize?: boolean) => TCountdownActions;
|
|
1214
1228
|
|
|
1229
|
+
type UseDisclosureReturn = {
|
|
1230
|
+
/** Whether the disclosure is currently open. */
|
|
1231
|
+
isOpen: boolean;
|
|
1232
|
+
/** Open the disclosure (sets isOpen = true). */
|
|
1233
|
+
open: () => void;
|
|
1234
|
+
/** Close the disclosure (sets isOpen = false). */
|
|
1235
|
+
close: () => void;
|
|
1236
|
+
/** Toggle the disclosure state (open -> close or close -> open). */
|
|
1237
|
+
toggle: () => void;
|
|
1238
|
+
};
|
|
1239
|
+
/**
|
|
1240
|
+
* A small hook to control open/close state.
|
|
1241
|
+
*
|
|
1242
|
+
* Supports an optional controlled pattern by passing `isOpen` and `onChange`.
|
|
1243
|
+
*
|
|
1244
|
+
* @example
|
|
1245
|
+
* const { isOpen, open, close, toggle } = useDisclosure();
|
|
1246
|
+
*/
|
|
1247
|
+
declare function useDisclosure(initialState?: boolean): UseDisclosureReturn;
|
|
1248
|
+
|
|
1215
1249
|
type TValueOptions<T> = AtLeastOne<{
|
|
1216
1250
|
/**
|
|
1217
1251
|
* The controlled value.
|
|
@@ -1321,5 +1355,5 @@ declare const getLocalStorage: <T>(key: string, deCode?: boolean) => T | undefin
|
|
|
1321
1355
|
*/
|
|
1322
1356
|
declare const setLocalStorage: (key: string, value: Record<string, any>, enCode?: boolean) => void;
|
|
1323
1357
|
|
|
1324
|
-
export { ByteSize, MimeTypeMap, OtherMimeType, QueryProvider, adToRocEra, camelCase2PascalCase, camelCase2SnakeCase, camelString2PascalString, camelString2SnakeString, convertBytes, createDataContext, createEnumLikeObject, debounce, deepClone, deepMerge, downloadFile, extractEnumLikeObject, fakeApi, formatAmount, formatBytes, formatStarMask, generatePeriodArray, getCurrentPeriod, getLocalStorage, getMimeType, invariant, isChinese, isDateString, isDateTimeString, isEmail, isEnglish, isEqual, isNil, isNonZeroStart, isNumber, isNumberAtLeastN, isNumberN, isNumberNM, isServer, isTWMobile, isTWPhone, isTimeString, isValidPassword, maskString, mergeConfig, mergeRefs, objectToSearchParams, omit, omitByValue, parseFileInfoFromFilename, parseFilenameFromDisposition, pascalCase2CamelCase, pascalCase2SnakeCase, pascalString2CamelString, pascalString2SnakeString, pick, pickByValue, rocEraToAd, searchParamsToObject, setLocalStorage, snakeCase2CamelCase, snakeCase2PascalCase, snakeString2CamelString, snakeString2PascalString, throttle, useCountdown, useQueryContext, useValue, validTaxId, validateDateString, validateFileType, wait };
|
|
1325
|
-
export type { MimeTypeExtension, MimeTypeValue, PartialBy, RequiredBy, TCountdownActions };
|
|
1358
|
+
export { ByteSize, MimeTypeMap, OtherMimeType, QueryProvider, adToRocEra, camelCase2PascalCase, camelCase2SnakeCase, camelString2PascalString, camelString2SnakeString, convertBytes, createDataContext, createEnumLikeObject, debounce, deepClone, deepMerge, downloadFile, extractEnumLikeObject, fakeApi, formatAmount, formatBytes, formatStarMask, generatePeriodArray, getCurrentPeriod, getLocalStorage, getMimeType, invariant, isChinese, isDateString, isDateTimeString, isEmail, isEnglish, isEqual, isNil, isNonZeroStart, isNumber, isNumberAtLeastN, isNumberN, isNumberNM, isServer, isTWMobile, isTWPhone, isTimeString, isValidPassword, maskString, mergeConfig, mergeRefs, objectToSearchParams, omit, omitByValue, parseFileInfoFromFilename, parseFilenameFromDisposition, pascalCase2CamelCase, pascalCase2SnakeCase, pascalString2CamelString, pascalString2SnakeString, pick, pickByValue, renameKey, rocEraToAd, searchParamsToObject, setLocalStorage, snakeCase2CamelCase, snakeCase2PascalCase, snakeString2CamelString, snakeString2PascalString, throttle, useCountdown, useDisclosure, useQueryContext, useValue, validTaxId, validateDateString, validateFileType, wait };
|
|
1359
|
+
export type { MimeTypeExtension, MimeTypeValue, PartialBy, RequiredBy, TCountdownActions, UseDisclosureReturn };
|
package/dist/es/index.mjs
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import dayjs from 'dayjs';
|
|
2
|
-
export { Q as QueryProvider, u as useQueryContext } from './queryStore-
|
|
2
|
+
export { Q as QueryProvider, u as useQueryContext } from './queryStore-12s-CFQTVwrg.mjs';
|
|
3
3
|
import React, { useMemo, createContext, useContext, useState, useCallback } from 'react';
|
|
4
|
-
export { u as useCountdown } from './useCountdown-
|
|
5
|
-
export {
|
|
6
|
-
export {
|
|
4
|
+
export { u as useCountdown } from './useCountdown-12s-t52WIHfq.mjs';
|
|
5
|
+
export { u as useDisclosure } from './useDisclosure-12s-BQAHpAXK.mjs';
|
|
6
|
+
export { d as downloadFile } from './download-12s-CnaJ0p_f.mjs';
|
|
7
|
+
export { g as getLocalStorage, s as setLocalStorage } from './webStorage-12s-W1DItzhS.mjs';
|
|
7
8
|
|
|
8
9
|
const FILE_SIZE_UNITS$1 = [
|
|
9
10
|
'Bytes',
|
|
@@ -532,6 +533,27 @@ const isObject = (value)=>value !== null && typeof value === 'object';
|
|
|
532
533
|
}, {});
|
|
533
534
|
return cloned;
|
|
534
535
|
};
|
|
536
|
+
/**
|
|
537
|
+
* A utility function to rename a key in an object.
|
|
538
|
+
*
|
|
539
|
+
* @param obj - The object to modify.
|
|
540
|
+
* @param oldKey - The key to rename.
|
|
541
|
+
* @param newKey - The new key name.
|
|
542
|
+
*
|
|
543
|
+
* @example
|
|
544
|
+
*
|
|
545
|
+
* const obj = { a: 1, b: 2 };
|
|
546
|
+
* const newObj = renameKey(obj, 'a', 'c');
|
|
547
|
+
* console.log(newObj); // { c: 1, b: 2 }
|
|
548
|
+
*/ const renameKey = (obj, oldKey, newKey)=>{
|
|
549
|
+
// 建立一個淺拷貝,避免修改原始物件
|
|
550
|
+
const { [oldKey]: oldValue, ...rest } = obj;
|
|
551
|
+
// 回傳新的物件:用新 key 存舊值,其他 key 保留
|
|
552
|
+
return {
|
|
553
|
+
...rest,
|
|
554
|
+
[newKey]: oldValue
|
|
555
|
+
};
|
|
556
|
+
};
|
|
535
557
|
|
|
536
558
|
/**
|
|
537
559
|
* 將嵌套物件的所有屬性設為指定的布林值
|
|
@@ -1392,4 +1414,4 @@ function mergeRefs(refs) {
|
|
|
1392
1414
|
return dayjs(endMonth, 'YYYYMM').subtract(1911, 'year').format('YYYYMM').substring(1);
|
|
1393
1415
|
};
|
|
1394
1416
|
|
|
1395
|
-
export { ByteSize, MimeTypeMap, OtherMimeType, adToRocEra, camelCase2PascalCase, camelCase2SnakeCase, camelString2PascalString, camelString2SnakeString, convertBytes, createDataContext, createEnumLikeObject, debounce, deepClone, deepMerge, extractEnumLikeObject, fakeApi, formatAmount, formatBytes, formatStarMask, generatePeriodArray, getCurrentPeriod, getMimeType, invariant, isChinese, isDateString, isDateTimeString, isEmail, isEnglish, isEqual, isNil, isNonZeroStart, isNumber, isNumberAtLeastN, isNumberN, isNumberNM, isServer, isTWMobile, isTWPhone, isTimeString, isValidPassword, maskString, mergeConfig, mergeRefs, objectToSearchParams, omit, omitByValue, parseFileInfoFromFilename, parseFilenameFromDisposition, pascalCase2CamelCase, pascalCase2SnakeCase, pascalString2CamelString, pascalString2SnakeString, pick, pickByValue, rocEraToAd, searchParamsToObject, snakeCase2CamelCase, snakeCase2PascalCase, snakeString2CamelString, snakeString2PascalString, throttle, useValue, validTaxId, validateDateString, validateFileType, wait };
|
|
1417
|
+
export { ByteSize, MimeTypeMap, OtherMimeType, adToRocEra, camelCase2PascalCase, camelCase2SnakeCase, camelString2PascalString, camelString2SnakeString, convertBytes, createDataContext, createEnumLikeObject, debounce, deepClone, deepMerge, extractEnumLikeObject, fakeApi, formatAmount, formatBytes, formatStarMask, generatePeriodArray, getCurrentPeriod, getMimeType, invariant, isChinese, isDateString, isDateTimeString, isEmail, isEnglish, isEqual, isNil, isNonZeroStart, isNumber, isNumberAtLeastN, isNumberN, isNumberNM, isServer, isTWMobile, isTWPhone, isTimeString, isValidPassword, maskString, mergeConfig, mergeRefs, objectToSearchParams, omit, omitByValue, parseFileInfoFromFilename, parseFilenameFromDisposition, pascalCase2CamelCase, pascalCase2SnakeCase, pascalString2CamelString, pascalString2SnakeString, pick, pickByValue, renameKey, rocEraToAd, searchParamsToObject, snakeCase2CamelCase, snakeCase2PascalCase, snakeString2CamelString, snakeString2PascalString, throttle, useValue, validTaxId, validateDateString, validateFileType, wait };
|
package/dist/es/types.d.mts
CHANGED
|
@@ -200,5 +200,70 @@ type MapToType<T extends Record<any, any>, A = any> = {
|
|
|
200
200
|
type OverrideProps<T, R extends {
|
|
201
201
|
[K in keyof R]: any;
|
|
202
202
|
}> = Omit<T, keyof R> & R;
|
|
203
|
+
/**
|
|
204
|
+
* A utility type that makes a specific property in the generic type `T` required while keeping the rest optional.
|
|
205
|
+
*
|
|
206
|
+
* @template T - The object type to modify.
|
|
207
|
+
* @template K - The key of the property to make required.
|
|
208
|
+
*
|
|
209
|
+
* @example
|
|
210
|
+
* type User = { id?: number; name?: string }
|
|
211
|
+
* type FormUser = WithRequired<User, 'id'> // { id: number; name?: string }
|
|
212
|
+
*/
|
|
213
|
+
type WithRequired<T, K extends keyof T> = Required<Pick<T, K>> & Omit<T, K>;
|
|
214
|
+
/**
|
|
215
|
+
* A utility type that makes a specific property in the generic type `T` optional while keeping the rest required.
|
|
216
|
+
*
|
|
217
|
+
* @template T - The object type to modify.
|
|
218
|
+
* @template K - The key of the property to make optional.
|
|
219
|
+
*
|
|
220
|
+
* @example
|
|
221
|
+
* type User = { id: number; name: string }
|
|
222
|
+
* type FormUser = WithOptional<User, 'id'> // { id?: number; name: string }
|
|
223
|
+
*/
|
|
224
|
+
type WithOptional<T, K extends keyof T> = Partial<Pick<T, K>> & Omit<T, K>;
|
|
225
|
+
/**
|
|
226
|
+
* 產生從 1 到 N 的「數字字面量聯集」型別。
|
|
227
|
+
*
|
|
228
|
+
* @template N - 終止數字(必須是正整數)
|
|
229
|
+
* @template A - 用於遞迴計數的輔助 tuple,預設為 [any] 代表從 1 開始
|
|
230
|
+
* @template R - 暫存累積結果的 union,預設為 1
|
|
231
|
+
*
|
|
232
|
+
* @returns 1 | 2 | ... | N
|
|
233
|
+
*
|
|
234
|
+
* @example
|
|
235
|
+
* type T1 = Num1ToN<3>;
|
|
236
|
+
* // ^? 1 | 2 | 3
|
|
237
|
+
*
|
|
238
|
+
* type T2 = Num1ToN<5>;
|
|
239
|
+
* // ^? 1 | 2 | 3 | 4 | 5
|
|
240
|
+
*
|
|
241
|
+
* @warning
|
|
242
|
+
* ⚠ **效能注意事項**:
|
|
243
|
+
* - 遞迴深度等於 `N`,因此 `N` 過大會影響 TypeScript 編譯效能
|
|
244
|
+
* - 建議 **N ≤ 100**,否則 VS Code IntelliSense 可能變慢
|
|
245
|
+
*/
|
|
246
|
+
type Num1ToN<N extends number, A extends any[] = [], R extends number = never> = A['length'] extends N ? R | N : Num1ToN<N, [...A, any], R | (A['length'] extends 0 ? never : A['length'])>;
|
|
247
|
+
/**
|
|
248
|
+
* 根據給定的前綴字串與數量,從陣列型別生成一個物件型別。
|
|
249
|
+
*
|
|
250
|
+
* @template T - 陣列型別,例如 `string[]`
|
|
251
|
+
* @template Prefix - 屬性鍵的前綴字串,例如 `'url'`
|
|
252
|
+
* @template N - 欄位數量,會生成 1..N 的鍵名
|
|
253
|
+
*
|
|
254
|
+
* @returns 一個物件型別,鍵為 `${Prefix}${1..N}`,值為 `T[number]`
|
|
255
|
+
*
|
|
256
|
+
* @example
|
|
257
|
+
* type List = string[];
|
|
258
|
+
*
|
|
259
|
+
* type Obj = BuildPrefixedObject<List, 'url', 3>;
|
|
260
|
+
* // ^? { url1: string; url2: string; url3: string }
|
|
261
|
+
*
|
|
262
|
+
* type Obj2 = BuildPrefixedObject<List, 'name', 2>;
|
|
263
|
+
* // ^? { name1: string; name2: string }
|
|
264
|
+
*/
|
|
265
|
+
type BuildPrefixedObject<T extends readonly unknown[], Prefix extends string, N extends number> = {
|
|
266
|
+
[K in Num1ToN<N> as `${Prefix}${K & number}`]: T[number];
|
|
267
|
+
};
|
|
203
268
|
|
|
204
|
-
export type { AtLeastOne, DeepPartial, Entries, MapToString, MapToType, OnlyOne, OverrideProps, PopArgs, PushArgs, ShiftArgs, TChangeKeyType, TExtractValueType, UnshiftArgs };
|
|
269
|
+
export type { AtLeastOne, BuildPrefixedObject, DeepPartial, Entries, MapToString, MapToType, Num1ToN, OnlyOne, OverrideProps, PopArgs, PushArgs, ShiftArgs, TChangeKeyType, TExtractValueType, UnshiftArgs, WithOptional, WithRequired };
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { useState, useCallback } from 'react';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* A small hook to control open/close state.
|
|
6
|
+
*
|
|
7
|
+
* Supports an optional controlled pattern by passing `isOpen` and `onChange`.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* const { isOpen, open, close, toggle } = useDisclosure();
|
|
11
|
+
*/ function useDisclosure(initialState = false) {
|
|
12
|
+
const [isOpen, setIsOpen] = useState(initialState);
|
|
13
|
+
const open = useCallback(()=>setIsOpen(true), []);
|
|
14
|
+
const close = useCallback(()=>setIsOpen(false), []);
|
|
15
|
+
const toggle = useCallback(()=>setIsOpen((prev)=>!prev), []);
|
|
16
|
+
return {
|
|
17
|
+
isOpen,
|
|
18
|
+
open,
|
|
19
|
+
close,
|
|
20
|
+
toggle
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export { useDisclosure as u };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gateweb/react-utils",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.16.0",
|
|
4
4
|
"description": "React Utils for GateWeb",
|
|
5
5
|
"homepage": "https://github.com/GatewebSolutions/react-utils",
|
|
6
6
|
"files": [
|
|
@@ -52,7 +52,7 @@
|
|
|
52
52
|
"@types/react": "^19.1.8",
|
|
53
53
|
"@vitest/coverage-v8": "^3.2.4",
|
|
54
54
|
"@vitest/ui": "3.2.4",
|
|
55
|
-
"bunchee": "^
|
|
55
|
+
"bunchee": "^6.6.0",
|
|
56
56
|
"eslint": "^9.31.0",
|
|
57
57
|
"husky": "^9.1.7",
|
|
58
58
|
"jest": "^30.0.5",
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|