@mwakidenis/logx-react 0.0.0-stage → 0.1.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/CHANGELOG.md +18 -0
- package/LICENSE +23 -0
- package/README.md +151 -3
- package/dist/components/index.d.mts +71 -0
- package/dist/components/index.d.ts +71 -0
- package/dist/components/index.js +268 -0
- package/dist/components/index.js.map +1 -0
- package/dist/components/index.mjs +262 -0
- package/dist/components/index.mjs.map +1 -0
- package/dist/hooks/index.d.mts +316 -0
- package/dist/hooks/index.d.ts +316 -0
- package/dist/hooks/index.js +638 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/index.mjs +615 -0
- package/dist/hooks/index.mjs.map +1 -0
- package/dist/hooks/storage/index.d.mts +40 -0
- package/dist/hooks/storage/index.d.ts +40 -0
- package/dist/hooks/storage/index.js +119 -0
- package/dist/hooks/storage/index.js.map +1 -0
- package/dist/hooks/storage/index.mjs +116 -0
- package/dist/hooks/storage/index.mjs.map +1 -0
- package/dist/index.d.mts +16 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.js +1066 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +974 -0
- package/dist/index.mjs.map +1 -0
- package/dist/providers/LogxProvider.d.mts +134 -0
- package/dist/providers/LogxProvider.d.ts +134 -0
- package/dist/providers/LogxProvider.js +117 -0
- package/dist/providers/LogxProvider.js.map +1 -0
- package/dist/providers/LogxProvider.mjs +114 -0
- package/dist/providers/LogxProvider.mjs.map +1 -0
- package/dist/types/index.d.mts +87 -0
- package/dist/types/index.d.ts +87 -0
- package/dist/types/index.js +4 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/index.mjs +3 -0
- package/dist/types/index.mjs.map +1 -0
- package/dist/utilities/index.d.mts +140 -0
- package/dist/utilities/index.d.ts +140 -0
- package/dist/utilities/index.js +167 -0
- package/dist/utilities/index.js.map +1 -0
- package/dist/utilities/index.mjs +104 -0
- package/dist/utilities/index.mjs.map +1 -0
- package/package.json +127 -6
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,974 @@
|
|
|
1
|
+
import { createContext, useState, useCallback, useRef, useEffect, Component, useContext } from 'react';
|
|
2
|
+
import { throttle, debounce } from '@mwakidenis/logx/function';
|
|
3
|
+
import { hasLocalStorage as hasLocalStorage$1, hasSessionStorage as hasSessionStorage$1, isBrowser as isBrowser$1, isNode as isNode$1, sessionStorageHelpers, safeStorage, localStorageHelpers } from '@mwakidenis/logx/browser';
|
|
4
|
+
import { isArray, isBoolean, isEmail, isEmpty, isFunction, isNil, isNull, isNumber, isObject, isString, isURL } from '@mwakidenis/logx/validation';
|
|
5
|
+
import { clone, deepClone, entries, get, has, keys, mapKeys, mapValues, merge, omit, pick, set, values, invert } from '@mwakidenis/logx/object';
|
|
6
|
+
import { clamp, inRange, percentage, randomInt, round } from '@mwakidenis/logx/number';
|
|
7
|
+
import { chunk, compact, difference, drop, flatten, flattenDeep, intersection, last, partition, sample, shuffle, take, union, unique, first } from '@mwakidenis/logx/array';
|
|
8
|
+
import { withTimeout, timeout, sleep, retry } from '@mwakidenis/logx/async';
|
|
9
|
+
import { addDays, isValidDate } from '@mwakidenis/logx/date';
|
|
10
|
+
import { camelCase, capitalize, escapeHtml, kebabCase, pascalCase, snakeCase, trim, truncate } from '@mwakidenis/logx/string';
|
|
11
|
+
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
12
|
+
|
|
13
|
+
var __defProp = Object.defineProperty;
|
|
14
|
+
var __export = (target, all) => {
|
|
15
|
+
for (var name in all)
|
|
16
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
17
|
+
};
|
|
18
|
+
function useToggle(initialValue = false) {
|
|
19
|
+
const [value, setValue] = useState(!!initialValue);
|
|
20
|
+
const toggle = useCallback(() => setValue((current) => !current), []);
|
|
21
|
+
const setTrue = useCallback(() => setValue(true), []);
|
|
22
|
+
const setFalse = useCallback(() => setValue(false), []);
|
|
23
|
+
const set3 = useCallback(
|
|
24
|
+
(next) => setValue((current) => typeof next === "boolean" ? next : !current),
|
|
25
|
+
[]
|
|
26
|
+
);
|
|
27
|
+
return [value, { toggle, set: set3, setTrue, setFalse }];
|
|
28
|
+
}
|
|
29
|
+
function useBoolean(initialValue = false) {
|
|
30
|
+
const [value, setValue] = useState(!!initialValue);
|
|
31
|
+
const setTrue = useCallback(() => setValue(true), []);
|
|
32
|
+
const setFalse = useCallback(() => setValue(false), []);
|
|
33
|
+
const toggle = useCallback(() => setValue((current) => !current), []);
|
|
34
|
+
const set3 = useCallback(
|
|
35
|
+
(next) => setValue((current) => typeof next === "boolean" ? next : !current),
|
|
36
|
+
[]
|
|
37
|
+
);
|
|
38
|
+
return [value, { setTrue, setFalse, toggle, set: set3 }];
|
|
39
|
+
}
|
|
40
|
+
function useCounter(initialValue = 0) {
|
|
41
|
+
const [count, setCount] = useState(initialValue);
|
|
42
|
+
const increment = useCallback(
|
|
43
|
+
(step = 1) => setCount((current) => current + step),
|
|
44
|
+
[]
|
|
45
|
+
);
|
|
46
|
+
const decrement = useCallback(
|
|
47
|
+
(step = 1) => setCount((current) => current - step),
|
|
48
|
+
[]
|
|
49
|
+
);
|
|
50
|
+
const reset = useCallback(() => setCount(initialValue), [initialValue]);
|
|
51
|
+
const set3 = useCallback((value) => setCount(value), []);
|
|
52
|
+
return { count, increment, decrement, reset, set: set3 };
|
|
53
|
+
}
|
|
54
|
+
function usePrevious(value) {
|
|
55
|
+
const ref = useRef(void 0);
|
|
56
|
+
useEffect(() => {
|
|
57
|
+
ref.current = value;
|
|
58
|
+
});
|
|
59
|
+
return ref.current;
|
|
60
|
+
}
|
|
61
|
+
function useLatest(value) {
|
|
62
|
+
const ref = useRef(value);
|
|
63
|
+
ref.current = value;
|
|
64
|
+
return ref;
|
|
65
|
+
}
|
|
66
|
+
function useMounted() {
|
|
67
|
+
const [mounted, setMounted] = useState(false);
|
|
68
|
+
useEffect(() => {
|
|
69
|
+
setMounted(true);
|
|
70
|
+
return () => setMounted(false);
|
|
71
|
+
}, []);
|
|
72
|
+
return mounted;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// src/internal/logx.ts
|
|
76
|
+
var logx_exports = {};
|
|
77
|
+
__export(logx_exports, {
|
|
78
|
+
addDays: () => addDays,
|
|
79
|
+
camelCase: () => camelCase,
|
|
80
|
+
capitalize: () => capitalize,
|
|
81
|
+
chunk: () => chunk,
|
|
82
|
+
clamp: () => clamp,
|
|
83
|
+
clone: () => clone,
|
|
84
|
+
compact: () => compact,
|
|
85
|
+
createLogxDebounce: () => createLogxDebounce,
|
|
86
|
+
debounce: () => debounce,
|
|
87
|
+
deepClone: () => deepClone,
|
|
88
|
+
difference: () => difference,
|
|
89
|
+
drop: () => drop,
|
|
90
|
+
entries: () => entries,
|
|
91
|
+
escapeHtml: () => escapeHtml,
|
|
92
|
+
first: () => first,
|
|
93
|
+
flatten: () => flatten,
|
|
94
|
+
flattenDeep: () => flattenDeep,
|
|
95
|
+
get: () => get,
|
|
96
|
+
has: () => has,
|
|
97
|
+
hasLocalStorage: () => hasLocalStorage$1,
|
|
98
|
+
hasSessionStorage: () => hasSessionStorage$1,
|
|
99
|
+
inRange: () => inRange,
|
|
100
|
+
intersection: () => intersection,
|
|
101
|
+
invert: () => invert,
|
|
102
|
+
isArray: () => isArray,
|
|
103
|
+
isBoolean: () => isBoolean,
|
|
104
|
+
isBrowser: () => isBrowser$1,
|
|
105
|
+
isEmail: () => isEmail,
|
|
106
|
+
isEmpty: () => isEmpty,
|
|
107
|
+
isFunction: () => isFunction,
|
|
108
|
+
isNil: () => isNil,
|
|
109
|
+
isNode: () => isNode$1,
|
|
110
|
+
isNull: () => isNull,
|
|
111
|
+
isNumber: () => isNumber,
|
|
112
|
+
isObject: () => isObject,
|
|
113
|
+
isString: () => isString,
|
|
114
|
+
isURL: () => isURL,
|
|
115
|
+
isValidDate: () => isValidDate,
|
|
116
|
+
kebabCase: () => kebabCase,
|
|
117
|
+
keys: () => keys,
|
|
118
|
+
last: () => last,
|
|
119
|
+
localStorageHelpers: () => localStorageHelpers,
|
|
120
|
+
mapKeys: () => mapKeys,
|
|
121
|
+
mapValues: () => mapValues,
|
|
122
|
+
merge: () => merge,
|
|
123
|
+
omit: () => omit,
|
|
124
|
+
partition: () => partition,
|
|
125
|
+
pascalCase: () => pascalCase,
|
|
126
|
+
percentage: () => percentage,
|
|
127
|
+
pick: () => pick,
|
|
128
|
+
randomInt: () => randomInt,
|
|
129
|
+
retry: () => retry,
|
|
130
|
+
round: () => round,
|
|
131
|
+
safeStorage: () => safeStorage,
|
|
132
|
+
sample: () => sample,
|
|
133
|
+
sessionStorageHelpers: () => sessionStorageHelpers,
|
|
134
|
+
set: () => set,
|
|
135
|
+
shuffle: () => shuffle,
|
|
136
|
+
sleep: () => sleep,
|
|
137
|
+
snakeCase: () => snakeCase,
|
|
138
|
+
take: () => take,
|
|
139
|
+
throttle: () => throttle,
|
|
140
|
+
timeout: () => timeout,
|
|
141
|
+
trim: () => trim,
|
|
142
|
+
truncate: () => truncate,
|
|
143
|
+
union: () => union,
|
|
144
|
+
unique: () => unique,
|
|
145
|
+
values: () => values,
|
|
146
|
+
withTimeout: () => withTimeout
|
|
147
|
+
});
|
|
148
|
+
function createLogxDebounce(func, wait) {
|
|
149
|
+
if (!Number.isFinite(wait) || wait < 0) {
|
|
150
|
+
throw new RangeError("debounce: wait must be a non-negative number");
|
|
151
|
+
}
|
|
152
|
+
const debounced = debounce(func, wait);
|
|
153
|
+
return {
|
|
154
|
+
fn: debounced,
|
|
155
|
+
cancel: () => debounced.cancel(),
|
|
156
|
+
flush: () => debounced.flush(),
|
|
157
|
+
pending: () => debounced.pending()
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
// src/hooks/useArray.ts
|
|
162
|
+
function useArray(initialValue = []) {
|
|
163
|
+
const [array, setArray] = useState(initialValue);
|
|
164
|
+
const set3 = useCallback(
|
|
165
|
+
(value) => setArray(
|
|
166
|
+
(prev) => typeof value === "function" ? value(prev) : value
|
|
167
|
+
),
|
|
168
|
+
[]
|
|
169
|
+
);
|
|
170
|
+
const push = useCallback((...items) => setArray((prev) => [...prev, ...items]), []);
|
|
171
|
+
const unshift = useCallback((...items) => setArray((prev) => [...items, ...prev]), []);
|
|
172
|
+
const remove = useCallback(
|
|
173
|
+
(index) => setArray((prev) => prev.filter((_, i) => i !== index)),
|
|
174
|
+
[]
|
|
175
|
+
);
|
|
176
|
+
const removeBy = useCallback(
|
|
177
|
+
(predicate) => setArray((prev) => prev.filter((v, i) => !predicate(v, i))),
|
|
178
|
+
[]
|
|
179
|
+
);
|
|
180
|
+
const update = useCallback(
|
|
181
|
+
(index, value) => setArray((prev) => prev.map((v, i) => i === index ? value : v)),
|
|
182
|
+
[]
|
|
183
|
+
);
|
|
184
|
+
const clear = useCallback(() => setArray([]), []);
|
|
185
|
+
const reset = useCallback(() => setArray(initialValue), [initialValue]);
|
|
186
|
+
const unique3 = useCallback(() => setArray((prev) => unique(prev)), []);
|
|
187
|
+
const compact3 = useCallback(() => setArray((prev) => compact(prev)), []);
|
|
188
|
+
const shuffle3 = useCallback(() => setArray((prev) => shuffle(prev)), []);
|
|
189
|
+
const firstValue = useCallback(() => first(array), [array]);
|
|
190
|
+
const lastValue = useCallback(() => last(array), [array]);
|
|
191
|
+
const takeValue = useCallback(
|
|
192
|
+
(count) => take(array, count),
|
|
193
|
+
[array]
|
|
194
|
+
);
|
|
195
|
+
const dropValue = useCallback(
|
|
196
|
+
(count) => drop(array, count),
|
|
197
|
+
[array]
|
|
198
|
+
);
|
|
199
|
+
return {
|
|
200
|
+
array,
|
|
201
|
+
set: set3,
|
|
202
|
+
push,
|
|
203
|
+
unshift,
|
|
204
|
+
remove,
|
|
205
|
+
removeBy,
|
|
206
|
+
update,
|
|
207
|
+
clear,
|
|
208
|
+
reset,
|
|
209
|
+
unique: unique3,
|
|
210
|
+
compact: compact3,
|
|
211
|
+
shuffle: shuffle3,
|
|
212
|
+
first: firstValue,
|
|
213
|
+
last: lastValue,
|
|
214
|
+
take: takeValue,
|
|
215
|
+
drop: dropValue,
|
|
216
|
+
// Expose LOGX-derived pure helpers for consumers who need them.
|
|
217
|
+
difference: useCallback(
|
|
218
|
+
(...others) => difference(array, ...others),
|
|
219
|
+
[array]
|
|
220
|
+
),
|
|
221
|
+
intersection: useCallback(
|
|
222
|
+
(...others) => intersection(array, ...others),
|
|
223
|
+
[array]
|
|
224
|
+
),
|
|
225
|
+
union: useCallback(
|
|
226
|
+
(...others) => union(array, ...others),
|
|
227
|
+
[array]
|
|
228
|
+
),
|
|
229
|
+
partition: useCallback(
|
|
230
|
+
(predicate) => partition(array, predicate),
|
|
231
|
+
[array]
|
|
232
|
+
),
|
|
233
|
+
flatten: useCallback(() => flatten(array), [array])
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
function useObject(initialValue = {}) {
|
|
237
|
+
const [object, setObject] = useState(initialValue);
|
|
238
|
+
const set3 = useCallback(
|
|
239
|
+
(value) => setObject(
|
|
240
|
+
(prev) => typeof value === "function" ? value(prev) : value
|
|
241
|
+
),
|
|
242
|
+
[]
|
|
243
|
+
);
|
|
244
|
+
const setKey = useCallback(
|
|
245
|
+
(key, value) => setObject((prev) => ({ ...prev, [key]: value })),
|
|
246
|
+
[]
|
|
247
|
+
);
|
|
248
|
+
const removeKey = useCallback(
|
|
249
|
+
(key) => setObject((prev) => {
|
|
250
|
+
const next = { ...prev };
|
|
251
|
+
delete next[key];
|
|
252
|
+
return next;
|
|
253
|
+
}),
|
|
254
|
+
[]
|
|
255
|
+
);
|
|
256
|
+
const clear = useCallback(() => setObject({}), []);
|
|
257
|
+
const reset = useCallback(() => setObject(initialValue), [initialValue]);
|
|
258
|
+
const pickValue = useCallback(
|
|
259
|
+
(pickedKeys) => pick(object, pickedKeys),
|
|
260
|
+
[object]
|
|
261
|
+
);
|
|
262
|
+
const omitValue = useCallback(
|
|
263
|
+
(omittedKeys) => omit(object, omittedKeys),
|
|
264
|
+
[object]
|
|
265
|
+
);
|
|
266
|
+
const mergeValue = useCallback(
|
|
267
|
+
(sources) => merge(object, ...sources),
|
|
268
|
+
[object]
|
|
269
|
+
);
|
|
270
|
+
const getValue = useCallback(
|
|
271
|
+
(path) => get(object, path),
|
|
272
|
+
[object]
|
|
273
|
+
);
|
|
274
|
+
const keysValue = useCallback(() => keys(object), [object]);
|
|
275
|
+
const valuesValue = useCallback(() => values(object), [object]);
|
|
276
|
+
const entriesValue = useCallback(() => entries(object), [object]);
|
|
277
|
+
const cloneValue = useCallback(() => clone(object), [object]);
|
|
278
|
+
const deepCloneValue = useCallback(() => deepClone(object), [object]);
|
|
279
|
+
const mapValuesValue = useCallback(
|
|
280
|
+
(iteratee) => mapValues(object, iteratee),
|
|
281
|
+
[object]
|
|
282
|
+
);
|
|
283
|
+
return {
|
|
284
|
+
object,
|
|
285
|
+
set: set3,
|
|
286
|
+
setKey,
|
|
287
|
+
removeKey,
|
|
288
|
+
clear,
|
|
289
|
+
reset,
|
|
290
|
+
pick: pickValue,
|
|
291
|
+
omit: omitValue,
|
|
292
|
+
merge: mergeValue,
|
|
293
|
+
get: getValue,
|
|
294
|
+
keys: keysValue,
|
|
295
|
+
values: valuesValue,
|
|
296
|
+
entries: entriesValue,
|
|
297
|
+
clone: cloneValue,
|
|
298
|
+
deepClone: deepCloneValue,
|
|
299
|
+
mapValues: mapValuesValue
|
|
300
|
+
};
|
|
301
|
+
}
|
|
302
|
+
function useDebouncedValue(value, options = {}) {
|
|
303
|
+
const { delay = 300, leading = false } = options;
|
|
304
|
+
const [debounced, setDebounced] = useState(value);
|
|
305
|
+
const latest = useLatest(value);
|
|
306
|
+
const timerRef = useRef(null);
|
|
307
|
+
const lastLeadingRef = useRef(void 0);
|
|
308
|
+
useEffect(() => {
|
|
309
|
+
if (timerRef.current !== null) {
|
|
310
|
+
clearTimeout(timerRef.current);
|
|
311
|
+
timerRef.current = null;
|
|
312
|
+
}
|
|
313
|
+
timerRef.current = setTimeout(() => {
|
|
314
|
+
setDebounced(latest.current);
|
|
315
|
+
timerRef.current = null;
|
|
316
|
+
}, delay);
|
|
317
|
+
return () => {
|
|
318
|
+
if (timerRef.current !== null) {
|
|
319
|
+
clearTimeout(timerRef.current);
|
|
320
|
+
timerRef.current = null;
|
|
321
|
+
}
|
|
322
|
+
};
|
|
323
|
+
}, [value, delay]);
|
|
324
|
+
useEffect(() => {
|
|
325
|
+
if (!leading) return;
|
|
326
|
+
const current = latest.current;
|
|
327
|
+
if (lastLeadingRef.current !== current) {
|
|
328
|
+
lastLeadingRef.current = current;
|
|
329
|
+
setDebounced(current);
|
|
330
|
+
}
|
|
331
|
+
}, [value, leading]);
|
|
332
|
+
return debounced;
|
|
333
|
+
}
|
|
334
|
+
function useDebouncedCallback(callback, delay) {
|
|
335
|
+
const latest = useLatest(callback);
|
|
336
|
+
const debouncedRef = useRef(null);
|
|
337
|
+
useEffect(() => {
|
|
338
|
+
const debounced = debounce(
|
|
339
|
+
(...args) => {
|
|
340
|
+
latest.current(...args);
|
|
341
|
+
},
|
|
342
|
+
delay
|
|
343
|
+
);
|
|
344
|
+
debouncedRef.current = debounced;
|
|
345
|
+
return () => {
|
|
346
|
+
debounced.cancel();
|
|
347
|
+
};
|
|
348
|
+
}, [delay]);
|
|
349
|
+
const invoke = useCallback((...args) => {
|
|
350
|
+
debouncedRef.current?.(...args);
|
|
351
|
+
}, []);
|
|
352
|
+
const cancel = useCallback(() => {
|
|
353
|
+
debouncedRef.current?.cancel();
|
|
354
|
+
}, []);
|
|
355
|
+
const flush = useCallback(() => {
|
|
356
|
+
debouncedRef.current?.flush();
|
|
357
|
+
}, []);
|
|
358
|
+
const pending = useCallback(() => debouncedRef.current?.pending() ?? false, []);
|
|
359
|
+
return Object.assign(invoke, { cancel, flush, pending });
|
|
360
|
+
}
|
|
361
|
+
function useThrottle(callback, wait) {
|
|
362
|
+
const latest = useLatest(callback);
|
|
363
|
+
const throttledRef = useRef(null);
|
|
364
|
+
useEffect(() => {
|
|
365
|
+
const throttled = throttle(
|
|
366
|
+
(...args) => {
|
|
367
|
+
latest.current(...args);
|
|
368
|
+
},
|
|
369
|
+
wait
|
|
370
|
+
);
|
|
371
|
+
throttledRef.current = throttled;
|
|
372
|
+
return () => {
|
|
373
|
+
throttled.cancel();
|
|
374
|
+
};
|
|
375
|
+
}, [wait]);
|
|
376
|
+
const invoke = useCallback((...args) => {
|
|
377
|
+
throttledRef.current?.(...args);
|
|
378
|
+
}, []);
|
|
379
|
+
const cancel = useCallback(() => {
|
|
380
|
+
throttledRef.current?.cancel();
|
|
381
|
+
}, []);
|
|
382
|
+
const flush = useCallback(() => {
|
|
383
|
+
throttledRef.current?.flush();
|
|
384
|
+
}, []);
|
|
385
|
+
const pending = useCallback(() => throttledRef.current?.pending() ?? false, []);
|
|
386
|
+
return Object.assign(invoke, { cancel, flush, pending });
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
// src/internal/storage.ts
|
|
390
|
+
var jsonSerializer = {
|
|
391
|
+
serialize: (value) => JSON.stringify(value),
|
|
392
|
+
deserialize: (raw) => {
|
|
393
|
+
if (raw === null) return null;
|
|
394
|
+
try {
|
|
395
|
+
return JSON.parse(raw);
|
|
396
|
+
} catch {
|
|
397
|
+
return null;
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
};
|
|
401
|
+
|
|
402
|
+
// src/hooks/storage/useLocalStorage.ts
|
|
403
|
+
function useLocalStorage(key, initialValue, options) {
|
|
404
|
+
const serializer = options?.serializer ?? jsonSerializer;
|
|
405
|
+
const [value, setValue] = useState(initialValue);
|
|
406
|
+
useEffect(() => {
|
|
407
|
+
const helpers = localStorageHelpers();
|
|
408
|
+
if (!helpers) return;
|
|
409
|
+
const raw = helpers.get(key);
|
|
410
|
+
if (raw === null) return;
|
|
411
|
+
const parsed = serializer.deserialize(raw);
|
|
412
|
+
if (parsed !== null) setValue(parsed);
|
|
413
|
+
}, [key, serializer]);
|
|
414
|
+
const set3 = useCallback(
|
|
415
|
+
(next) => setValue((prev) => {
|
|
416
|
+
const resolved = typeof next === "function" ? next(prev) : next;
|
|
417
|
+
const helpers = localStorageHelpers();
|
|
418
|
+
if (helpers) {
|
|
419
|
+
try {
|
|
420
|
+
helpers.set(key, serializer.serialize(resolved));
|
|
421
|
+
} catch {
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
return resolved;
|
|
425
|
+
}),
|
|
426
|
+
[key, serializer]
|
|
427
|
+
);
|
|
428
|
+
const remove = useCallback(() => {
|
|
429
|
+
setValue(initialValue);
|
|
430
|
+
const helpers = localStorageHelpers();
|
|
431
|
+
if (helpers) {
|
|
432
|
+
try {
|
|
433
|
+
helpers.remove(key);
|
|
434
|
+
} catch {
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
}, [key, initialValue]);
|
|
438
|
+
useEffect(() => {
|
|
439
|
+
if (typeof window === "undefined") return;
|
|
440
|
+
const handle = (event) => {
|
|
441
|
+
if (event.key === key && event.storageArea === localStorage) {
|
|
442
|
+
const parsed = event.newValue === null ? null : serializer.deserialize(event.newValue);
|
|
443
|
+
if (parsed !== null) setValue(parsed);
|
|
444
|
+
}
|
|
445
|
+
};
|
|
446
|
+
window.addEventListener("storage", handle);
|
|
447
|
+
return () => window.removeEventListener("storage", handle);
|
|
448
|
+
}, [key, serializer]);
|
|
449
|
+
return [value, set3, remove];
|
|
450
|
+
}
|
|
451
|
+
function useSessionStorage(key, initialValue, options) {
|
|
452
|
+
const serializer = options?.serializer ?? jsonSerializer;
|
|
453
|
+
const [value, setValue] = useState(initialValue);
|
|
454
|
+
useEffect(() => {
|
|
455
|
+
const helpers = sessionStorageHelpers();
|
|
456
|
+
if (!helpers) return;
|
|
457
|
+
const raw = helpers.get(key);
|
|
458
|
+
if (raw === null) return;
|
|
459
|
+
const parsed = serializer.deserialize(raw);
|
|
460
|
+
if (parsed !== null) setValue(parsed);
|
|
461
|
+
}, [key, serializer]);
|
|
462
|
+
const set3 = useCallback(
|
|
463
|
+
(next) => setValue((prev) => {
|
|
464
|
+
const resolved = typeof next === "function" ? next(prev) : next;
|
|
465
|
+
const helpers = sessionStorageHelpers();
|
|
466
|
+
if (helpers) {
|
|
467
|
+
try {
|
|
468
|
+
helpers.set(key, serializer.serialize(resolved));
|
|
469
|
+
} catch {
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
return resolved;
|
|
473
|
+
}),
|
|
474
|
+
[key, serializer]
|
|
475
|
+
);
|
|
476
|
+
const remove = useCallback(() => {
|
|
477
|
+
setValue(initialValue);
|
|
478
|
+
const helpers = sessionStorageHelpers();
|
|
479
|
+
if (helpers) {
|
|
480
|
+
try {
|
|
481
|
+
helpers.remove(key);
|
|
482
|
+
} catch {
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
}, [key, initialValue]);
|
|
486
|
+
return [value, set3, remove];
|
|
487
|
+
}
|
|
488
|
+
function useMediaQuery(query) {
|
|
489
|
+
const [matches, setMatches] = useState(false);
|
|
490
|
+
useEffect(() => {
|
|
491
|
+
if (typeof window === "undefined") return;
|
|
492
|
+
const media = window.matchMedia(query);
|
|
493
|
+
setMatches(media.matches);
|
|
494
|
+
const handler = (event) => setMatches(event.matches);
|
|
495
|
+
media.addEventListener("change", handler);
|
|
496
|
+
return () => {
|
|
497
|
+
media.removeEventListener("change", handler);
|
|
498
|
+
};
|
|
499
|
+
}, [query]);
|
|
500
|
+
return matches;
|
|
501
|
+
}
|
|
502
|
+
function useWindowSize() {
|
|
503
|
+
const [size, setSize] = useState(
|
|
504
|
+
() => typeof window !== "undefined" ? { width: window.innerWidth, height: window.innerHeight } : { width: 0, height: 0 }
|
|
505
|
+
);
|
|
506
|
+
useEffect(() => {
|
|
507
|
+
if (typeof window === "undefined") return;
|
|
508
|
+
const handler = () => setSize({ width: window.innerWidth, height: window.innerHeight });
|
|
509
|
+
window.addEventListener("resize", handler);
|
|
510
|
+
return () => window.removeEventListener("resize", handler);
|
|
511
|
+
}, []);
|
|
512
|
+
return size;
|
|
513
|
+
}
|
|
514
|
+
function useClickOutside(ref, handler) {
|
|
515
|
+
const latest = useRef(handler);
|
|
516
|
+
latest.current = handler;
|
|
517
|
+
useEffect(() => {
|
|
518
|
+
const handle = (event) => {
|
|
519
|
+
if (ref.current && !ref.current.contains(event.target)) {
|
|
520
|
+
latest.current(event);
|
|
521
|
+
}
|
|
522
|
+
};
|
|
523
|
+
if (typeof document !== "undefined") {
|
|
524
|
+
document.addEventListener("mousedown", handle);
|
|
525
|
+
document.addEventListener("touchstart", handle);
|
|
526
|
+
return () => {
|
|
527
|
+
document.removeEventListener("mousedown", handle);
|
|
528
|
+
document.removeEventListener("touchstart", handle);
|
|
529
|
+
};
|
|
530
|
+
}
|
|
531
|
+
return void 0;
|
|
532
|
+
}, [ref]);
|
|
533
|
+
}
|
|
534
|
+
function useEventListener(target, type, listener, options) {
|
|
535
|
+
const latest = useRef(listener);
|
|
536
|
+
latest.current = listener;
|
|
537
|
+
useEffect(() => {
|
|
538
|
+
if (!target) return void 0;
|
|
539
|
+
const handle = (event) => latest.current(event);
|
|
540
|
+
target.addEventListener(type, handle, options);
|
|
541
|
+
return () => {
|
|
542
|
+
target.removeEventListener(type, handle, options);
|
|
543
|
+
};
|
|
544
|
+
}, [target, type, options]);
|
|
545
|
+
}
|
|
546
|
+
function useClipboard() {
|
|
547
|
+
const isSupported = typeof navigator !== "undefined" && !!navigator.clipboard && !!navigator.clipboard.writeText;
|
|
548
|
+
const copy = useCallback(async (text) => {
|
|
549
|
+
try {
|
|
550
|
+
if (isSupported && typeof navigator !== "undefined") {
|
|
551
|
+
await navigator.clipboard.writeText(text);
|
|
552
|
+
return true;
|
|
553
|
+
}
|
|
554
|
+
if (typeof document !== "undefined") {
|
|
555
|
+
const textarea = document.createElement("textarea");
|
|
556
|
+
textarea.value = text;
|
|
557
|
+
textarea.setAttribute("readonly", "");
|
|
558
|
+
textarea.style.position = "absolute";
|
|
559
|
+
textarea.style.position = "fixed";
|
|
560
|
+
textarea.style.opacity = "0";
|
|
561
|
+
document.body.appendChild(textarea);
|
|
562
|
+
textarea.select();
|
|
563
|
+
try {
|
|
564
|
+
document.execCommand("copy");
|
|
565
|
+
} finally {
|
|
566
|
+
document.body.removeChild(textarea);
|
|
567
|
+
}
|
|
568
|
+
return true;
|
|
569
|
+
}
|
|
570
|
+
return false;
|
|
571
|
+
} catch {
|
|
572
|
+
return false;
|
|
573
|
+
}
|
|
574
|
+
}, [isSupported]);
|
|
575
|
+
return { copy, isSupported };
|
|
576
|
+
}
|
|
577
|
+
function useOnlineStatus() {
|
|
578
|
+
const [online, setOnline] = useState(
|
|
579
|
+
() => typeof navigator !== "undefined" ? navigator.onLine : true
|
|
580
|
+
);
|
|
581
|
+
useEffect(() => {
|
|
582
|
+
if (typeof window === "undefined") return;
|
|
583
|
+
setOnline(navigator.onLine);
|
|
584
|
+
const onOnline = () => setOnline(true);
|
|
585
|
+
const onOffline = () => setOnline(false);
|
|
586
|
+
window.addEventListener("online", onOnline);
|
|
587
|
+
window.addEventListener("offline", onOffline);
|
|
588
|
+
return () => {
|
|
589
|
+
window.removeEventListener("online", onOnline);
|
|
590
|
+
window.removeEventListener("offline", onOffline);
|
|
591
|
+
};
|
|
592
|
+
}, []);
|
|
593
|
+
return online;
|
|
594
|
+
}
|
|
595
|
+
function useTimeout(callback, delay) {
|
|
596
|
+
const latest = useLatest(callback);
|
|
597
|
+
const timerRef = useRef(null);
|
|
598
|
+
const [active, setActive] = useState(false);
|
|
599
|
+
const stop = useCallback(() => {
|
|
600
|
+
if (timerRef.current !== null) {
|
|
601
|
+
clearTimeout(timerRef.current);
|
|
602
|
+
timerRef.current = null;
|
|
603
|
+
}
|
|
604
|
+
setActive(false);
|
|
605
|
+
}, []);
|
|
606
|
+
const start = useCallback(() => {
|
|
607
|
+
stop();
|
|
608
|
+
if (delay !== null && delay >= 0) {
|
|
609
|
+
timerRef.current = setTimeout(() => {
|
|
610
|
+
timerRef.current = null;
|
|
611
|
+
setActive(false);
|
|
612
|
+
latest.current();
|
|
613
|
+
}, delay);
|
|
614
|
+
setActive(true);
|
|
615
|
+
}
|
|
616
|
+
}, [delay]);
|
|
617
|
+
const reset = useCallback(() => {
|
|
618
|
+
start();
|
|
619
|
+
}, [start]);
|
|
620
|
+
useEffect(() => {
|
|
621
|
+
start();
|
|
622
|
+
return () => stop();
|
|
623
|
+
}, [delay, start, stop]);
|
|
624
|
+
return { start, stop, reset, active };
|
|
625
|
+
}
|
|
626
|
+
function useInterval(callback, delay) {
|
|
627
|
+
const latest = useLatest(callback);
|
|
628
|
+
const timerRef = useRef(null);
|
|
629
|
+
const [active, setActive] = useState(false);
|
|
630
|
+
const stop = useCallback(() => {
|
|
631
|
+
if (timerRef.current !== null) {
|
|
632
|
+
clearInterval(timerRef.current);
|
|
633
|
+
timerRef.current = null;
|
|
634
|
+
}
|
|
635
|
+
setActive(false);
|
|
636
|
+
}, []);
|
|
637
|
+
const start = useCallback(() => {
|
|
638
|
+
stop();
|
|
639
|
+
if (delay !== null && delay >= 0) {
|
|
640
|
+
timerRef.current = setInterval(() => latest.current(), delay);
|
|
641
|
+
setActive(true);
|
|
642
|
+
}
|
|
643
|
+
}, [delay]);
|
|
644
|
+
useEffect(() => {
|
|
645
|
+
start();
|
|
646
|
+
return () => stop();
|
|
647
|
+
}, [delay, start, stop]);
|
|
648
|
+
return { start, stop, active };
|
|
649
|
+
}
|
|
650
|
+
function useAsync(asyncFn, immediate = true) {
|
|
651
|
+
const [state, setState] = useState({
|
|
652
|
+
data: null,
|
|
653
|
+
error: null,
|
|
654
|
+
isLoading: false,
|
|
655
|
+
isSuccess: false,
|
|
656
|
+
isError: false
|
|
657
|
+
});
|
|
658
|
+
const latest = useLatest(asyncFn);
|
|
659
|
+
const abortRef = useRef(null);
|
|
660
|
+
const seqRef = useRef(0);
|
|
661
|
+
const cancel = useCallback(() => {
|
|
662
|
+
if (abortRef.current) {
|
|
663
|
+
abortRef.current.abort();
|
|
664
|
+
abortRef.current = null;
|
|
665
|
+
setState({ data: null, error: null, isLoading: false, isSuccess: false, isError: false });
|
|
666
|
+
}
|
|
667
|
+
}, []);
|
|
668
|
+
const setData = useCallback((data) => {
|
|
669
|
+
setState({ data, error: null, isLoading: false, isSuccess: true, isError: false });
|
|
670
|
+
}, []);
|
|
671
|
+
const setError = useCallback((error) => {
|
|
672
|
+
setState({ data: null, error, isLoading: false, isSuccess: false, isError: true });
|
|
673
|
+
}, []);
|
|
674
|
+
const reset = useCallback(() => {
|
|
675
|
+
cancel();
|
|
676
|
+
setState({ data: null, error: null, isLoading: false, isSuccess: false, isError: false });
|
|
677
|
+
}, [cancel]);
|
|
678
|
+
const execute = useCallback(async () => {
|
|
679
|
+
cancel();
|
|
680
|
+
const controller = new AbortController();
|
|
681
|
+
abortRef.current = controller;
|
|
682
|
+
const seq = ++seqRef.current;
|
|
683
|
+
setState({ data: null, error: null, isLoading: true, isSuccess: false, isError: false });
|
|
684
|
+
try {
|
|
685
|
+
const data = await latest.current();
|
|
686
|
+
if (controller.signal.aborted || seq !== seqRef.current) return;
|
|
687
|
+
setState({ data, error: null, isLoading: false, isSuccess: true, isError: false });
|
|
688
|
+
} catch (err) {
|
|
689
|
+
if (controller.signal.aborted || seq !== seqRef.current) return;
|
|
690
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
691
|
+
setState({ data: null, error, isLoading: false, isSuccess: false, isError: true });
|
|
692
|
+
} finally {
|
|
693
|
+
if (abortRef.current === controller) abortRef.current = null;
|
|
694
|
+
}
|
|
695
|
+
}, []);
|
|
696
|
+
useEffect(() => {
|
|
697
|
+
if (!immediate) return;
|
|
698
|
+
void execute();
|
|
699
|
+
return () => cancel();
|
|
700
|
+
}, [immediate, execute, cancel]);
|
|
701
|
+
return { ...state, execute, setData, setError, reset, cancel };
|
|
702
|
+
}
|
|
703
|
+
function CopyButton({
|
|
704
|
+
text,
|
|
705
|
+
label = "Copy",
|
|
706
|
+
copyingLabel = "Copying...",
|
|
707
|
+
successLabel = "Copied!",
|
|
708
|
+
errorLabel = "Error",
|
|
709
|
+
className,
|
|
710
|
+
onCopy,
|
|
711
|
+
onError,
|
|
712
|
+
timeout: timeout2 = 2e3
|
|
713
|
+
}) {
|
|
714
|
+
const [status, setStatus] = useState("idle");
|
|
715
|
+
const { copy } = useClipboard();
|
|
716
|
+
const handleCopy = useCallback(async () => {
|
|
717
|
+
setStatus("copying");
|
|
718
|
+
try {
|
|
719
|
+
const ok = await copy(text);
|
|
720
|
+
if (ok) {
|
|
721
|
+
setStatus("success");
|
|
722
|
+
onCopy?.(text);
|
|
723
|
+
} else {
|
|
724
|
+
setStatus("error");
|
|
725
|
+
onError?.(new Error("Failed to copy to clipboard"));
|
|
726
|
+
}
|
|
727
|
+
} catch (err) {
|
|
728
|
+
setStatus("error");
|
|
729
|
+
onError?.(err);
|
|
730
|
+
}
|
|
731
|
+
setTimeout(() => setStatus("idle"), timeout2);
|
|
732
|
+
}, [text, copy, onCopy, onError, timeout2]);
|
|
733
|
+
const displayLabel = status === "copying" ? copyingLabel : status === "success" ? successLabel : status === "error" ? errorLabel : label;
|
|
734
|
+
return /* @__PURE__ */ jsx(
|
|
735
|
+
"button",
|
|
736
|
+
{
|
|
737
|
+
type: "button",
|
|
738
|
+
className,
|
|
739
|
+
disabled: status === "copying",
|
|
740
|
+
onClick: handleCopy,
|
|
741
|
+
"aria-label": status === "success" ? "Copied to clipboard" : label,
|
|
742
|
+
"aria-pressed": status === "success",
|
|
743
|
+
children: displayLabel
|
|
744
|
+
}
|
|
745
|
+
);
|
|
746
|
+
}
|
|
747
|
+
function DebouncedInput({
|
|
748
|
+
value,
|
|
749
|
+
defaultValue,
|
|
750
|
+
onChange,
|
|
751
|
+
onDebouncedChange,
|
|
752
|
+
delay = 300,
|
|
753
|
+
...rest
|
|
754
|
+
}) {
|
|
755
|
+
const [internalValue, setInternalValue] = useState(defaultValue ?? "");
|
|
756
|
+
const isControlled = value !== void 0;
|
|
757
|
+
const currentValue = isControlled ? value ?? "" : internalValue;
|
|
758
|
+
const handleChange = useCallback(
|
|
759
|
+
(event) => {
|
|
760
|
+
const next = event.target.value;
|
|
761
|
+
if (!isControlled) setInternalValue(next);
|
|
762
|
+
onChange?.(next);
|
|
763
|
+
},
|
|
764
|
+
[isControlled, onChange]
|
|
765
|
+
);
|
|
766
|
+
const debounced = useDebouncedValue(currentValue, { delay });
|
|
767
|
+
const initialized = useRef(false);
|
|
768
|
+
useEffect(() => {
|
|
769
|
+
if (!initialized.current) {
|
|
770
|
+
initialized.current = true;
|
|
771
|
+
return;
|
|
772
|
+
}
|
|
773
|
+
onDebouncedChange?.(debounced);
|
|
774
|
+
}, [debounced, onDebouncedChange]);
|
|
775
|
+
return /* @__PURE__ */ jsx("input", { ...rest, value: currentValue, onChange: handleChange });
|
|
776
|
+
}
|
|
777
|
+
function PasswordInput({
|
|
778
|
+
value,
|
|
779
|
+
defaultValue,
|
|
780
|
+
onChange,
|
|
781
|
+
label = "Password",
|
|
782
|
+
placeholder,
|
|
783
|
+
disabled = false,
|
|
784
|
+
required: required2 = false,
|
|
785
|
+
name,
|
|
786
|
+
id,
|
|
787
|
+
showToggle = true,
|
|
788
|
+
className
|
|
789
|
+
}) {
|
|
790
|
+
const [show, setShow] = useState(false);
|
|
791
|
+
const [internalValue, setInternalValue] = useState(defaultValue ?? "");
|
|
792
|
+
const isControlled = value !== void 0;
|
|
793
|
+
const currentValue = isControlled ? value ?? "" : internalValue;
|
|
794
|
+
const handleChange = useCallback(
|
|
795
|
+
(event) => {
|
|
796
|
+
const next = event.target.value;
|
|
797
|
+
if (!isControlled) setInternalValue(next);
|
|
798
|
+
onChange?.(next);
|
|
799
|
+
},
|
|
800
|
+
[isControlled, onChange]
|
|
801
|
+
);
|
|
802
|
+
const toggle = useCallback(() => setShow((current) => !current), []);
|
|
803
|
+
return /* @__PURE__ */ jsxs("div", { className, children: [
|
|
804
|
+
label && /* @__PURE__ */ jsx("label", { htmlFor: id, children: label }),
|
|
805
|
+
/* @__PURE__ */ jsx(
|
|
806
|
+
"input",
|
|
807
|
+
{
|
|
808
|
+
id,
|
|
809
|
+
name,
|
|
810
|
+
type: show ? "text" : "password",
|
|
811
|
+
value: currentValue,
|
|
812
|
+
onChange: handleChange,
|
|
813
|
+
placeholder,
|
|
814
|
+
disabled,
|
|
815
|
+
required: required2,
|
|
816
|
+
"aria-label": label
|
|
817
|
+
}
|
|
818
|
+
),
|
|
819
|
+
showToggle && /* @__PURE__ */ jsx(
|
|
820
|
+
"button",
|
|
821
|
+
{
|
|
822
|
+
type: "button",
|
|
823
|
+
onClick: toggle,
|
|
824
|
+
"aria-label": show ? "Hide password" : "Show password",
|
|
825
|
+
"aria-pressed": show,
|
|
826
|
+
children: show ? "Hide password" : "Show password"
|
|
827
|
+
}
|
|
828
|
+
)
|
|
829
|
+
] });
|
|
830
|
+
}
|
|
831
|
+
function Responsive({ children, query, fallback }) {
|
|
832
|
+
const matches = useMediaQuery(query);
|
|
833
|
+
const renderChildren = useCallback(
|
|
834
|
+
(m) => m ? children(m) : fallback ?? null,
|
|
835
|
+
[children, fallback]
|
|
836
|
+
);
|
|
837
|
+
return /* @__PURE__ */ jsx(Fragment, { children: renderChildren(matches) });
|
|
838
|
+
}
|
|
839
|
+
var ErrorBoundary = class extends Component {
|
|
840
|
+
constructor() {
|
|
841
|
+
super(...arguments);
|
|
842
|
+
this.state = { hasError: false, error: null, info: null };
|
|
843
|
+
}
|
|
844
|
+
static getDerivedStateFromError(error) {
|
|
845
|
+
return { hasError: true, error, info: null };
|
|
846
|
+
}
|
|
847
|
+
componentDidCatch(error, info) {
|
|
848
|
+
this.setState({ info });
|
|
849
|
+
this.props.onError?.(error, info);
|
|
850
|
+
}
|
|
851
|
+
componentDidUpdate(prevProps) {
|
|
852
|
+
if (this.props.resetKeys !== prevProps.resetKeys) {
|
|
853
|
+
const prev = JSON.stringify(prevProps.resetKeys);
|
|
854
|
+
const next = JSON.stringify(this.props.resetKeys);
|
|
855
|
+
if (prev !== next) {
|
|
856
|
+
this.setState({ hasError: false, error: null, info: null });
|
|
857
|
+
}
|
|
858
|
+
}
|
|
859
|
+
}
|
|
860
|
+
render() {
|
|
861
|
+
if (this.state.hasError) {
|
|
862
|
+
const { fallback } = this.props;
|
|
863
|
+
if (fallback === void 0) return null;
|
|
864
|
+
if (typeof fallback === "function") {
|
|
865
|
+
return fallback(
|
|
866
|
+
this.state.error,
|
|
867
|
+
this.state.info
|
|
868
|
+
);
|
|
869
|
+
}
|
|
870
|
+
return fallback;
|
|
871
|
+
}
|
|
872
|
+
return this.props.children;
|
|
873
|
+
}
|
|
874
|
+
};
|
|
875
|
+
|
|
876
|
+
// src/utilities/array.ts
|
|
877
|
+
var chunk2 = chunk;
|
|
878
|
+
var compact2 = compact;
|
|
879
|
+
var difference2 = difference;
|
|
880
|
+
var drop2 = drop;
|
|
881
|
+
var flatten2 = flatten;
|
|
882
|
+
var flattenDeep2 = flattenDeep;
|
|
883
|
+
var intersection2 = intersection;
|
|
884
|
+
var last2 = last;
|
|
885
|
+
var partition2 = partition;
|
|
886
|
+
var sample2 = sample;
|
|
887
|
+
var shuffle2 = shuffle;
|
|
888
|
+
var take2 = take;
|
|
889
|
+
var union2 = union;
|
|
890
|
+
var unique2 = unique;
|
|
891
|
+
function first2(array) {
|
|
892
|
+
return array[0];
|
|
893
|
+
}
|
|
894
|
+
function distinct(array) {
|
|
895
|
+
return unique2(array);
|
|
896
|
+
}
|
|
897
|
+
|
|
898
|
+
// src/utilities/object.ts
|
|
899
|
+
var clone2 = clone;
|
|
900
|
+
var deepClone2 = deepClone;
|
|
901
|
+
var entries2 = entries;
|
|
902
|
+
var get2 = get;
|
|
903
|
+
var has2 = has;
|
|
904
|
+
var keys2 = keys;
|
|
905
|
+
var mapKeys2 = mapKeys;
|
|
906
|
+
var mapValues2 = mapValues;
|
|
907
|
+
var merge2 = merge;
|
|
908
|
+
var omit2 = omit;
|
|
909
|
+
var pick2 = pick;
|
|
910
|
+
var set2 = set;
|
|
911
|
+
var values2 = values;
|
|
912
|
+
function safeGet(object, path) {
|
|
913
|
+
const result = get(object, path);
|
|
914
|
+
return result === void 0 ? void 0 : result;
|
|
915
|
+
}
|
|
916
|
+
|
|
917
|
+
// src/utilities/string.ts
|
|
918
|
+
var camelCase2 = camelCase;
|
|
919
|
+
var capitalize2 = capitalize;
|
|
920
|
+
var escapeHtml2 = escapeHtml;
|
|
921
|
+
var kebabCase2 = kebabCase;
|
|
922
|
+
var pascalCase2 = pascalCase;
|
|
923
|
+
var snakeCase2 = snakeCase;
|
|
924
|
+
var trim2 = trim;
|
|
925
|
+
var truncate2 = truncate;
|
|
926
|
+
function htmlEscape(input) {
|
|
927
|
+
return escapeHtml2(input);
|
|
928
|
+
}
|
|
929
|
+
|
|
930
|
+
// src/utilities/number.ts
|
|
931
|
+
var clamp2 = clamp;
|
|
932
|
+
var inRange2 = inRange;
|
|
933
|
+
var round2 = round;
|
|
934
|
+
var percentage2 = percentage;
|
|
935
|
+
var randomInt2 = randomInt;
|
|
936
|
+
|
|
937
|
+
// src/utilities/validation.ts
|
|
938
|
+
var isArray2 = isArray;
|
|
939
|
+
var isBoolean2 = isBoolean;
|
|
940
|
+
var isEmail2 = isEmail;
|
|
941
|
+
var isEmpty2 = isEmpty;
|
|
942
|
+
var isFunction2 = isFunction;
|
|
943
|
+
var isNil2 = isNil;
|
|
944
|
+
var isNull2 = isNull;
|
|
945
|
+
var isNumber2 = isNumber;
|
|
946
|
+
var isObject2 = isObject;
|
|
947
|
+
var isString2 = isString;
|
|
948
|
+
var isURL2 = isURL;
|
|
949
|
+
function required(value, fieldName = "This field") {
|
|
950
|
+
if (isNil2(value)) return `${fieldName} is required`;
|
|
951
|
+
if (isString2(value) && value.trim() === "") return `${fieldName} is required`;
|
|
952
|
+
return null;
|
|
953
|
+
}
|
|
954
|
+
|
|
955
|
+
// src/utilities/date.ts
|
|
956
|
+
var addDays2 = addDays;
|
|
957
|
+
var isValidDate2 = isValidDate;
|
|
958
|
+
|
|
959
|
+
// src/utilities/browser.ts
|
|
960
|
+
var hasLocalStorage = hasLocalStorage$1;
|
|
961
|
+
var hasSessionStorage = hasSessionStorage$1;
|
|
962
|
+
var isBrowser = isBrowser$1;
|
|
963
|
+
var isNode = isNode$1;
|
|
964
|
+
var LogxContext = createContext(null);
|
|
965
|
+
function LogxProvider({ children }) {
|
|
966
|
+
return /* @__PURE__ */ jsx(LogxContext.Provider, { value: { logx: logx_exports }, children });
|
|
967
|
+
}
|
|
968
|
+
function useLogx() {
|
|
969
|
+
return useContext(LogxContext);
|
|
970
|
+
}
|
|
971
|
+
|
|
972
|
+
export { CopyButton, DebouncedInput, ErrorBoundary, LogxProvider, PasswordInput, Responsive, addDays2 as addDays, camelCase2 as camelCase, capitalize2 as capitalize, chunk2 as chunk, clamp2 as clamp, clone2 as clone, compact2 as compact, deepClone2 as deepClone, difference2 as difference, distinct, drop2 as drop, entries2 as entries, escapeHtml2 as escapeHtml, first2 as first, flatten2 as flatten, flattenDeep2 as flattenDeep, get2 as get, has2 as has, hasLocalStorage, hasSessionStorage, htmlEscape, inRange2 as inRange, intersection2 as intersection, isArray2 as isArray, isBoolean2 as isBoolean, isBrowser, isEmail2 as isEmail, isEmpty2 as isEmpty, isFunction2 as isFunction, isNil2 as isNil, isNode, isNull2 as isNull, isNumber2 as isNumber, isObject2 as isObject, isString2 as isString, isURL2 as isURL, isValidDate2 as isValidDate, kebabCase2 as kebabCase, keys2 as keys, last2 as last, mapKeys2 as mapKeys, mapValues2 as mapValues, merge2 as merge, omit2 as omit, partition2 as partition, pascalCase2 as pascalCase, percentage2 as percentage, pick2 as pick, randomInt2 as randomInt, required, round2 as round, safeGet, sample2 as sample, set2 as set, shuffle2 as shuffle, snakeCase2 as snakeCase, take2 as take, trim2 as trim, truncate2 as truncate, union2 as union, unique2 as unique, useArray, useAsync, useBoolean, useClickOutside, useClipboard, useCounter, useDebouncedCallback, useDebouncedValue, useEventListener, useInterval, useLatest, useLocalStorage, useLogx, useMediaQuery, useMounted, useObject, useOnlineStatus, usePrevious, useSessionStorage, useThrottle, useTimeout, useToggle, useWindowSize, values2 as values };
|
|
973
|
+
//# sourceMappingURL=index.mjs.map
|
|
974
|
+
//# sourceMappingURL=index.mjs.map
|