@h3ravel/support 0.14.2 → 0.14.4

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.
@@ -12,4 +12,4 @@ var __export = (all) => {
12
12
  };
13
13
 
14
14
  //#endregion
15
- export { __export };
15
+ export { __export as t };
package/dist/index.cjs CHANGED
@@ -461,23 +461,6 @@ const toHumanTime = (seconds = 0, worded = false) => {
461
461
 
462
462
  //#endregion
463
463
  //#region src/Helpers/Obj.ts
464
- var Obj_exports = /* @__PURE__ */ __export({
465
- Obj: () => Obj,
466
- data_fill: () => data_fill,
467
- data_forget: () => data_forget,
468
- data_get: () => data_get,
469
- data_set: () => data_set,
470
- dot: () => dot,
471
- extractProperties: () => extractProperties,
472
- getValue: () => getValue,
473
- modObj: () => modObj,
474
- safeDot: () => safeDot,
475
- setNested: () => setNested,
476
- slugifyKeys: () => slugifyKeys,
477
- toCssClasses: () => toCssClasses,
478
- toCssStyles: () => toCssStyles,
479
- undot: () => undot
480
- });
481
464
  /**
482
465
  * Flattens a nested object into a single-level object
483
466
  * with dot-separated keys.
@@ -737,6 +720,15 @@ function data_forget(obj, path) {
737
720
  }
738
721
  }
739
722
  }
723
+ /**
724
+ * Checks if a value is a plain object (not array, function, etc.)
725
+ *
726
+ * @param value
727
+ * @returns
728
+ */
729
+ function isPlainObject(value) {
730
+ return value !== null && typeof value === "object" && !Array.isArray(value) && Object.prototype.toString.call(value) === "[object Object]";
731
+ }
740
732
  var Obj = class Obj {
741
733
  /**
742
734
  * Check if the value is a non-null object (associative/accessible).
@@ -757,6 +749,27 @@ var Obj = class Obj {
757
749
  return obj;
758
750
  }
759
751
  /**
752
+ * Deeply merges two or more objects.
753
+ * - Arrays are replaced (not concatenated)
754
+ * - Objects are merged recursively
755
+ * - Non-object values overwrite previous ones
756
+ *
757
+ * @param objects
758
+ * @returns
759
+ */
760
+ static deepMerge(...objects) {
761
+ const result = {};
762
+ for (const obj of objects) {
763
+ if (!obj || typeof obj !== "object") continue;
764
+ for (const [key, value] of Object.entries(obj)) {
765
+ const existing = result[key];
766
+ if (isPlainObject(existing) && isPlainObject(value)) result[key] = Obj.deepMerge(existing, value);
767
+ else result[key] = value;
768
+ }
769
+ }
770
+ return result;
771
+ }
772
+ /**
760
773
  * Split object into [keys, values]
761
774
  */
762
775
  static divide(obj) {
@@ -6202,12 +6215,6 @@ Object.defineProperty(exports, 'Crypto', {
6202
6215
  }
6203
6216
  });
6204
6217
  exports.DateTime = DateTime;
6205
- Object.defineProperty(exports, 'DumpDie', {
6206
- enumerable: true,
6207
- get: function () {
6208
- return DumpDie_exports;
6209
- }
6210
- });
6211
6218
  exports.HtmlString = HtmlString;
6212
6219
  exports.InvalidArgumentException = InvalidArgumentException;
6213
6220
  exports.Mode = Mode;
@@ -6217,12 +6224,7 @@ Object.defineProperty(exports, 'Number', {
6217
6224
  return Number_exports;
6218
6225
  }
6219
6226
  });
6220
- Object.defineProperty(exports, 'Obj', {
6221
- enumerable: true,
6222
- get: function () {
6223
- return Obj_exports;
6224
- }
6225
- });
6227
+ exports.Obj = Obj;
6226
6228
  exports.RuntimeException = RuntimeException;
6227
6229
  exports.Str = Str;
6228
6230
  exports.Stringable = Stringable;
@@ -6245,6 +6247,7 @@ exports.getValue = getValue;
6245
6247
  exports.hash = hash;
6246
6248
  exports.hmac = hmac;
6247
6249
  exports.humanize = humanize;
6250
+ exports.isPlainObject = isPlainObject;
6248
6251
  exports.loadHelpers = loadHelpers;
6249
6252
  exports.modObj = modObj;
6250
6253
  exports.random = random;
package/dist/index.d.cts CHANGED
@@ -23,9 +23,9 @@ type ExcerptOptions = {
23
23
  radius?: number;
24
24
  omission?: string;
25
25
  };
26
- type Value<T> = boolean | ((instance: T) => boolean);
27
- type Callback<T> = (instance: T, value: boolean) => T | void | undefined;
28
- type Fallback<T> = Callback<T> | null;
26
+ type Value<T$1> = boolean | ((instance: T$1) => boolean);
27
+ type Callback<T$1> = (instance: T$1, value: boolean) => T$1 | void | undefined;
28
+ type Fallback<T$1> = Callback<T$1> | null;
29
29
  interface Function {
30
30
  (...args: any[]): any;
31
31
  }
@@ -34,12 +34,12 @@ interface Function {
34
34
  /**
35
35
  * Convert CamelCased Object keys to snake_case
36
36
  */
37
- type KeysToSnakeCase<T> = { [K in keyof T as CamelToSnakeCase<string & K>]: T[K] };
38
- type TGeneric<V = any, K extends string = string> = Record<K, V>;
39
- type XGeneric<V = TGeneric, T = any> = {
40
- [key: string]: T;
41
- } & V;
42
- type DotPath<T> = T extends object ? { [K in keyof T & (string | number)]: T[K] extends object ? `${K}` | `${K}.${DotPath<T[K]>}` : `${K}` }[keyof T & (string | number)] : never;
37
+ type KeysToSnakeCase<T$1> = { [K in keyof T$1 as CamelToSnakeCase<string & K>]: T$1[K] };
38
+ type TGeneric<V$1 = any, K$1 extends string = string> = Record<K$1, V$1>;
39
+ type XGeneric<V$1 = TGeneric, T$1 = any> = {
40
+ [key: string]: T$1;
41
+ } & V$1;
42
+ type DotPath<T$1> = T$1 extends object ? { [K in keyof T$1 & (string | number)]: T$1[K] extends object ? `${K}` | `${K}.${DotPath<T$1[K]>}` : `${K}` }[keyof T$1 & (string | number)] : never;
43
43
  //#endregion
44
44
  //#region src/Contracts/TypeCast.d.ts
45
45
  type Arrayable = {
@@ -240,7 +240,7 @@ declare const toBytes: (bytes?: number, decimals?: number, bits?: boolean) => st
240
240
  */
241
241
  declare const toHumanTime: (seconds?: number, worded?: boolean) => string;
242
242
  declare namespace Obj_d_exports {
243
- export { Obj, data_fill, data_forget, data_get, data_set, dot, extractProperties, getValue, modObj, safeDot, setNested, slugifyKeys, toCssClasses, toCssStyles, undot };
243
+ export { Obj, data_fill, data_forget, data_get, data_set, dot, extractProperties, getValue, isPlainObject, modObj, safeDot, setNested, slugifyKeys, toCssClasses, toCssStyles, undot };
244
244
  }
245
245
  /**
246
246
  * Flattens a nested object into a single-level object
@@ -294,8 +294,8 @@ declare const getValue: <T extends Record<string, any>>(key: string | [keyof T,
294
294
  * @returns A new object with transformed entries
295
295
  */
296
296
  declare const modObj: <T extends object, R>(obj: T, callback: (_entry: [keyof T & string, T[keyof T]]) => [string, R]) => Record<string, R>;
297
- declare function safeDot<T extends Record<string, any>>(_data: T): T;
298
- declare function safeDot<T extends Record<string, any>, K extends DotNestedKeys<T>>(_data: T, _key?: K): DotNestedValue<T, K>;
297
+ declare function safeDot<T$1 extends Record<string, any>>(_data: T$1): T$1;
298
+ declare function safeDot<T$1 extends Record<string, any>, K$1 extends DotNestedKeys<T$1>>(_data: T$1, _key?: K$1): DotNestedValue<T$1, K$1>;
299
299
  /**
300
300
  * Sets a nested property on an object using dot notation.
301
301
  *
@@ -328,14 +328,14 @@ declare const slugifyKeys: <T extends object>(obj: T, only?: string[], separator
328
328
  * - Objects: keys included if value is truthy
329
329
  * - Strings: included as-is
330
330
  */
331
- declare function toCssClasses<T extends string | Record<string, boolean> | Array<string | false | null | undefined>>(input: T): string;
331
+ declare function toCssClasses<T$1 extends string | Record<string, boolean> | Array<string | false | null | undefined>>(input: T$1): string;
332
332
  /**
333
333
  * toCssStyles
334
334
  *
335
335
  * Convert object input into CSS style string.
336
336
  * - Only includes truthy values (ignores null/undefined/false)
337
337
  */
338
- declare function toCssStyles<T extends Record<string, string | number | boolean | null | undefined>>(styles: T): string;
338
+ declare function toCssStyles<T$1 extends Record<string, string | number | boolean | null | undefined>>(styles: T$1): string;
339
339
  /**
340
340
  * undot
341
341
  *
@@ -350,13 +350,13 @@ declare function undot(obj: Record<string, any>): Record<string, any>;
350
350
  *
351
351
  * Get a value from an object using dot notation.
352
352
  */
353
- declare function data_get<T extends object, P extends DotPath<T> | DotPath<T>[], D = undefined>(obj: T, path: P, defaultValue?: D): T | any;
353
+ declare function data_get<T$1 extends object, P$1 extends DotPath<T$1> | DotPath<T$1>[], D$1 = undefined>(obj: T$1, path: P$1, defaultValue?: D$1): T$1 | any;
354
354
  /**
355
355
  * data_set
356
356
  *
357
357
  * Set a value in an object using dot notation. Mutates the object.
358
358
  */
359
- declare function data_set<T extends Record<string, any>, P extends string | string[], V>(obj: T, path: P, value: V): asserts obj is T & Record<P extends string ? P : P[0], V>;
359
+ declare function data_set<T$1 extends Record<string, any>, P$1 extends string | string[], V$1>(obj: T$1, path: P$1, value: V$1): asserts obj is T$1 & Record<P$1 extends string ? P$1 : P$1[0], V$1>;
360
360
  /**
361
361
  * data_fill
362
362
  *
@@ -369,6 +369,13 @@ declare function data_fill(obj: Record<string, any>, path: string | string[], va
369
369
  * Remove a key from an object using dot notation.
370
370
  */
371
371
  declare function data_forget(obj: Record<string, any>, path: string | string[]): void;
372
+ /**
373
+ * Checks if a value is a plain object (not array, function, etc.)
374
+ *
375
+ * @param value
376
+ * @returns
377
+ */
378
+ declare function isPlainObject(value: any): value is Record<string, any>;
372
379
  declare class Obj {
373
380
  /**
374
381
  * Check if the value is a non-null object (associative/accessible).
@@ -380,6 +387,16 @@ declare class Obj {
380
387
  * Returns a new object (does not mutate original).
381
388
  */
382
389
  static add<T extends Record<string, any>, K extends string, V>(obj: T, key: K, value: V): T & Record<K, V>;
390
+ /**
391
+ * Deeply merges two or more objects.
392
+ * - Arrays are replaced (not concatenated)
393
+ * - Objects are merged recursively
394
+ * - Non-object values overwrite previous ones
395
+ *
396
+ * @param objects
397
+ * @returns
398
+ */
399
+ static deepMerge<T extends Record<string, any>>(...objects: (Partial<T> | undefined | null)[]): T;
383
400
  /**
384
401
  * Split object into [keys, values]
385
402
  */
@@ -467,7 +484,7 @@ declare class Arr {
467
484
  * Arr.divide(['a','b']) -> [[0,1], ['a','b']]
468
485
  * Arr.divide({x:1,y:2}) -> [['x','y'], [1,2]]
469
486
  */
470
- static divide<A>(input: A[] | Record<string, A>): (A[] | number[])[] | (A[] | string[])[];
487
+ static divide<A>(input: A[] | Record<string, A>): (number[] | A[])[] | (string[] | A[])[];
471
488
  /**
472
489
  * Flatten a nested array/object structure into a single-level object
473
490
  * with dot-notated keys.
@@ -3147,7 +3164,7 @@ declare class HtmlString {
3147
3164
  declare function str(string?: string): Stringable;
3148
3165
  //#endregion
3149
3166
  //#region src/GlobalBootstrap.d.ts
3150
- type CollapseStatics<T extends Record<string, any>> = { [K in keyof T]: T[K] };
3167
+ type CollapseStatics<T$1 extends Record<string, any>> = { [K in keyof T$1]: T$1[K] };
3151
3168
  type Omitables = 'start' | 'take' | 'reverse' | 'chunk' | 'find' | 'pop' | 'end' | 'shift' | 'push' | 'at' | 'prototype' | 'concat' | 'join' | 'slice' | 'sort' | 'splice' | 'includes' | 'indexOf' | 'lastIndexOf' | 'findIndex' | 'every' | 'some' | 'forEach' | 'map' | 'filter' | 'reduce' | 'unshift' | 'flat' | 'flatMap' | 'keys' | 'fill' | 'copyWithin' | 'entries' | 'values' | 'reduceRight' | 'length' | 'of' | '_isObject' | '_clone' | 'crossJoin' | 'divide' | 'wrap' | 'except' | 'hasAny' | 'isList' | 'keyBy' | 'mapWithKeys' | 'only' | 'pluck' | 'pull' | 'shuffle' | 'sortDesc' | 'sortRecursive' | 'sortRecursiveDesc' | 'where' | 'whereNotNull' | 'head' | 'string' | 'boolean' | 'array' | 'float' | 'from' | 'hasAll' | 'integer' | 'mapSpread' | 'partition' | 'reject' | 'select' | 'sole' | 'alternate' | 'combine' | 'isEmpty' | 'isNotEmpty' | 'range' | typeof Symbol.unscopables | typeof Symbol.iterator;
3152
3169
  type TakeTime = Pick<typeof DateTime, 'now' | 'format' | 'fromTimestamp' | 'randomTime' | 'firstDayOfMonth' | 'lastDayOfMonth' | 'parse'>;
3153
3170
  type TakeString = Pick<typeof Str, 'after' | 'afterLast' | 'apa' | 'ascii' | 'before' | 'beforeLast' | 'between' | 'betweenFirst' | 'capitalize' | 'plural' | 'singular' | 'title'>;
@@ -3195,4 +3212,4 @@ declare function loadHelpers(target?: any): void;
3195
3212
  */
3196
3213
  declare function cleanHelpers(target?: any): void;
3197
3214
  //#endregion
3198
- export { Arr, Arrayable, Callback, CamelToSnakeCase, Crypto_d_exports as Crypto, DateTime, DotPath, DumpDie_d_exports as DumpDie, ExcerptOptions, Fallback, Function, GlobalHelpers, HtmlString, HtmlStringType, InvalidArgumentException, JsonSerializable, Jsonable, KeysToSnakeCase, Mode, Number_d_exports as Number, Obj_d_exports as Obj, RuntimeException, SnakeToCamelCase, SnakeToTitleCase, Str, Stringable, TGeneric, Value, XGeneric, abbreviate, base64Decode, base64Encode, caesarCipher, checksum, cleanHelpers, data_fill, data_forget, data_get, data_set, dd, dot, dump, extractProperties, format, getValue, hash, hmac, humanize, loadHelpers, modObj, random, randomColor, randomPassword, randomSecure, safeDot, secureToken, setNested, slugifyKeys, str, toBytes, toCssClasses, toCssStyles, toHumanTime, undot, uuid, verifyChecksum, xor };
3215
+ export { Arr, Arrayable, Callback, CamelToSnakeCase, Crypto_d_exports as Crypto, DateTime, DotPath, ExcerptOptions, Fallback, Function, GlobalHelpers, HtmlString, HtmlStringType, InvalidArgumentException, JsonSerializable, Jsonable, KeysToSnakeCase, Mode, Number_d_exports as Number, Obj, RuntimeException, SnakeToCamelCase, SnakeToTitleCase, Str, Stringable, TGeneric, Value, XGeneric, abbreviate, base64Decode, base64Encode, caesarCipher, checksum, cleanHelpers, data_fill, data_forget, data_get, data_set, dd, dot, dump, extractProperties, format, getValue, hash, hmac, humanize, isPlainObject, loadHelpers, modObj, random, randomColor, randomPassword, randomSecure, safeDot, secureToken, setNested, slugifyKeys, str, toBytes, toCssClasses, toCssStyles, toHumanTime, undot, uuid, verifyChecksum, xor };
package/dist/index.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  /// <reference path="./app.globals.d.ts" />
2
+ import { t as __export } from "./chunk-Bop6jNiL.js";
2
3
  import dayjs, { ConfigType, Dayjs, OpUnitType } from "dayjs";
3
4
  import { DotFlatten, DotNestedKeys, DotNestedValue } from "@h3ravel/shared";
4
5
 
@@ -20,9 +21,9 @@ type ExcerptOptions = {
20
21
  radius?: number;
21
22
  omission?: string;
22
23
  };
23
- type Value<T> = boolean | ((instance: T) => boolean);
24
- type Callback<T> = (instance: T, value: boolean) => T | void | undefined;
25
- type Fallback<T> = Callback<T> | null;
24
+ type Value<T$1> = boolean | ((instance: T$1) => boolean);
25
+ type Callback<T$1> = (instance: T$1, value: boolean) => T$1 | void | undefined;
26
+ type Fallback<T$1> = Callback<T$1> | null;
26
27
  interface Function {
27
28
  (...args: any[]): any;
28
29
  }
@@ -31,12 +32,12 @@ interface Function {
31
32
  /**
32
33
  * Convert CamelCased Object keys to snake_case
33
34
  */
34
- type KeysToSnakeCase<T> = { [K in keyof T as CamelToSnakeCase<string & K>]: T[K] };
35
- type TGeneric<V = any, K extends string = string> = Record<K, V>;
36
- type XGeneric<V = TGeneric, T = any> = {
37
- [key: string]: T;
38
- } & V;
39
- type DotPath<T> = T extends object ? { [K in keyof T & (string | number)]: T[K] extends object ? `${K}` | `${K}.${DotPath<T[K]>}` : `${K}` }[keyof T & (string | number)] : never;
35
+ type KeysToSnakeCase<T$1> = { [K in keyof T$1 as CamelToSnakeCase<string & K>]: T$1[K] };
36
+ type TGeneric<V$1 = any, K$1 extends string = string> = Record<K$1, V$1>;
37
+ type XGeneric<V$1 = TGeneric, T$1 = any> = {
38
+ [key: string]: T$1;
39
+ } & V$1;
40
+ type DotPath<T$1> = T$1 extends object ? { [K in keyof T$1 & (string | number)]: T$1[K] extends object ? `${K}` | `${K}.${DotPath<T$1[K]>}` : `${K}` }[keyof T$1 & (string | number)] : never;
40
41
  //#endregion
41
42
  //#region src/Contracts/TypeCast.d.ts
42
43
  type Arrayable = {
@@ -237,7 +238,7 @@ declare const toBytes: (bytes?: number, decimals?: number, bits?: boolean) => st
237
238
  */
238
239
  declare const toHumanTime: (seconds?: number, worded?: boolean) => string;
239
240
  declare namespace Obj_d_exports {
240
- export { Obj, data_fill, data_forget, data_get, data_set, dot, extractProperties, getValue, modObj, safeDot, setNested, slugifyKeys, toCssClasses, toCssStyles, undot };
241
+ export { Obj, data_fill, data_forget, data_get, data_set, dot, extractProperties, getValue, isPlainObject, modObj, safeDot, setNested, slugifyKeys, toCssClasses, toCssStyles, undot };
241
242
  }
242
243
  /**
243
244
  * Flattens a nested object into a single-level object
@@ -291,8 +292,8 @@ declare const getValue: <T extends Record<string, any>>(key: string | [keyof T,
291
292
  * @returns A new object with transformed entries
292
293
  */
293
294
  declare const modObj: <T extends object, R>(obj: T, callback: (_entry: [keyof T & string, T[keyof T]]) => [string, R]) => Record<string, R>;
294
- declare function safeDot<T extends Record<string, any>>(_data: T): T;
295
- declare function safeDot<T extends Record<string, any>, K extends DotNestedKeys<T>>(_data: T, _key?: K): DotNestedValue<T, K>;
295
+ declare function safeDot<T$1 extends Record<string, any>>(_data: T$1): T$1;
296
+ declare function safeDot<T$1 extends Record<string, any>, K$1 extends DotNestedKeys<T$1>>(_data: T$1, _key?: K$1): DotNestedValue<T$1, K$1>;
296
297
  /**
297
298
  * Sets a nested property on an object using dot notation.
298
299
  *
@@ -325,14 +326,14 @@ declare const slugifyKeys: <T extends object>(obj: T, only?: string[], separator
325
326
  * - Objects: keys included if value is truthy
326
327
  * - Strings: included as-is
327
328
  */
328
- declare function toCssClasses<T extends string | Record<string, boolean> | Array<string | false | null | undefined>>(input: T): string;
329
+ declare function toCssClasses<T$1 extends string | Record<string, boolean> | Array<string | false | null | undefined>>(input: T$1): string;
329
330
  /**
330
331
  * toCssStyles
331
332
  *
332
333
  * Convert object input into CSS style string.
333
334
  * - Only includes truthy values (ignores null/undefined/false)
334
335
  */
335
- declare function toCssStyles<T extends Record<string, string | number | boolean | null | undefined>>(styles: T): string;
336
+ declare function toCssStyles<T$1 extends Record<string, string | number | boolean | null | undefined>>(styles: T$1): string;
336
337
  /**
337
338
  * undot
338
339
  *
@@ -347,13 +348,13 @@ declare function undot(obj: Record<string, any>): Record<string, any>;
347
348
  *
348
349
  * Get a value from an object using dot notation.
349
350
  */
350
- declare function data_get<T extends object, P extends DotPath<T> | DotPath<T>[], D = undefined>(obj: T, path: P, defaultValue?: D): T | any;
351
+ declare function data_get<T$1 extends object, P$1 extends DotPath<T$1> | DotPath<T$1>[], D$1 = undefined>(obj: T$1, path: P$1, defaultValue?: D$1): T$1 | any;
351
352
  /**
352
353
  * data_set
353
354
  *
354
355
  * Set a value in an object using dot notation. Mutates the object.
355
356
  */
356
- declare function data_set<T extends Record<string, any>, P extends string | string[], V>(obj: T, path: P, value: V): asserts obj is T & Record<P extends string ? P : P[0], V>;
357
+ declare function data_set<T$1 extends Record<string, any>, P$1 extends string | string[], V$1>(obj: T$1, path: P$1, value: V$1): asserts obj is T$1 & Record<P$1 extends string ? P$1 : P$1[0], V$1>;
357
358
  /**
358
359
  * data_fill
359
360
  *
@@ -366,6 +367,13 @@ declare function data_fill(obj: Record<string, any>, path: string | string[], va
366
367
  * Remove a key from an object using dot notation.
367
368
  */
368
369
  declare function data_forget(obj: Record<string, any>, path: string | string[]): void;
370
+ /**
371
+ * Checks if a value is a plain object (not array, function, etc.)
372
+ *
373
+ * @param value
374
+ * @returns
375
+ */
376
+ declare function isPlainObject(value: any): value is Record<string, any>;
369
377
  declare class Obj {
370
378
  /**
371
379
  * Check if the value is a non-null object (associative/accessible).
@@ -377,6 +385,16 @@ declare class Obj {
377
385
  * Returns a new object (does not mutate original).
378
386
  */
379
387
  static add<T extends Record<string, any>, K extends string, V>(obj: T, key: K, value: V): T & Record<K, V>;
388
+ /**
389
+ * Deeply merges two or more objects.
390
+ * - Arrays are replaced (not concatenated)
391
+ * - Objects are merged recursively
392
+ * - Non-object values overwrite previous ones
393
+ *
394
+ * @param objects
395
+ * @returns
396
+ */
397
+ static deepMerge<T extends Record<string, any>>(...objects: (Partial<T> | undefined | null)[]): T;
380
398
  /**
381
399
  * Split object into [keys, values]
382
400
  */
@@ -464,7 +482,7 @@ declare class Arr {
464
482
  * Arr.divide(['a','b']) -> [[0,1], ['a','b']]
465
483
  * Arr.divide({x:1,y:2}) -> [['x','y'], [1,2]]
466
484
  */
467
- static divide<A>(input: A[] | Record<string, A>): (A[] | number[])[] | (A[] | string[])[];
485
+ static divide<A>(input: A[] | Record<string, A>): (number[] | A[])[] | (string[] | A[])[];
468
486
  /**
469
487
  * Flatten a nested array/object structure into a single-level object
470
488
  * with dot-notated keys.
@@ -3144,7 +3162,7 @@ declare class HtmlString {
3144
3162
  declare function str(string?: string): Stringable;
3145
3163
  //#endregion
3146
3164
  //#region src/GlobalBootstrap.d.ts
3147
- type CollapseStatics<T extends Record<string, any>> = { [K in keyof T]: T[K] };
3165
+ type CollapseStatics<T$1 extends Record<string, any>> = { [K in keyof T$1]: T$1[K] };
3148
3166
  type Omitables = 'start' | 'take' | 'reverse' | 'chunk' | 'find' | 'pop' | 'end' | 'shift' | 'push' | 'at' | 'prototype' | 'concat' | 'join' | 'slice' | 'sort' | 'splice' | 'includes' | 'indexOf' | 'lastIndexOf' | 'findIndex' | 'every' | 'some' | 'forEach' | 'map' | 'filter' | 'reduce' | 'unshift' | 'flat' | 'flatMap' | 'keys' | 'fill' | 'copyWithin' | 'entries' | 'values' | 'reduceRight' | 'length' | 'of' | '_isObject' | '_clone' | 'crossJoin' | 'divide' | 'wrap' | 'except' | 'hasAny' | 'isList' | 'keyBy' | 'mapWithKeys' | 'only' | 'pluck' | 'pull' | 'shuffle' | 'sortDesc' | 'sortRecursive' | 'sortRecursiveDesc' | 'where' | 'whereNotNull' | 'head' | 'string' | 'boolean' | 'array' | 'float' | 'from' | 'hasAll' | 'integer' | 'mapSpread' | 'partition' | 'reject' | 'select' | 'sole' | 'alternate' | 'combine' | 'isEmpty' | 'isNotEmpty' | 'range' | typeof Symbol.unscopables | typeof Symbol.iterator;
3149
3167
  type TakeTime = Pick<typeof DateTime, 'now' | 'format' | 'fromTimestamp' | 'randomTime' | 'firstDayOfMonth' | 'lastDayOfMonth' | 'parse'>;
3150
3168
  type TakeString = Pick<typeof Str, 'after' | 'afterLast' | 'apa' | 'ascii' | 'before' | 'beforeLast' | 'between' | 'betweenFirst' | 'capitalize' | 'plural' | 'singular' | 'title'>;
@@ -3192,4 +3210,4 @@ declare function loadHelpers(target?: any): void;
3192
3210
  */
3193
3211
  declare function cleanHelpers(target?: any): void;
3194
3212
  //#endregion
3195
- export { Arr, Arrayable, Callback, CamelToSnakeCase, Crypto_d_exports as Crypto, DateTime, DotPath, DumpDie_d_exports as DumpDie, ExcerptOptions, Fallback, Function, GlobalHelpers, HtmlString, HtmlStringType, InvalidArgumentException, JsonSerializable, Jsonable, KeysToSnakeCase, Mode, Number_d_exports as Number, Obj_d_exports as Obj, RuntimeException, SnakeToCamelCase, SnakeToTitleCase, Str, Stringable, TGeneric, Value, XGeneric, abbreviate, base64Decode, base64Encode, caesarCipher, checksum, cleanHelpers, data_fill, data_forget, data_get, data_set, dd, dot, dump, extractProperties, format, getValue, hash, hmac, humanize, loadHelpers, modObj, random, randomColor, randomPassword, randomSecure, safeDot, secureToken, setNested, slugifyKeys, str, toBytes, toCssClasses, toCssStyles, toHumanTime, undot, uuid, verifyChecksum, xor };
3213
+ export { Arr, Arrayable, Callback, CamelToSnakeCase, Crypto_d_exports as Crypto, DateTime, DotPath, ExcerptOptions, Fallback, Function, GlobalHelpers, HtmlString, HtmlStringType, InvalidArgumentException, JsonSerializable, Jsonable, KeysToSnakeCase, Mode, Number_d_exports as Number, Obj, RuntimeException, SnakeToCamelCase, SnakeToTitleCase, Str, Stringable, TGeneric, Value, XGeneric, abbreviate, base64Decode, base64Encode, caesarCipher, checksum, cleanHelpers, data_fill, data_forget, data_get, data_set, dd, dot, dump, extractProperties, format, getValue, hash, hmac, humanize, isPlainObject, loadHelpers, modObj, random, randomColor, randomPassword, randomSecure, safeDot, secureToken, setNested, slugifyKeys, str, toBytes, toCssClasses, toCssStyles, toHumanTime, undot, uuid, verifyChecksum, xor };
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { __export } from "./chunk-PECeCxCb.js";
1
+ import { t as __export } from "./chunk-Bop6jNiL.js";
2
2
  import { createHash, createHmac, randomBytes, randomUUID } from "crypto";
3
3
  import process from "process";
4
4
  import util from "util";
@@ -419,23 +419,6 @@ const toHumanTime = (seconds = 0, worded = false) => {
419
419
 
420
420
  //#endregion
421
421
  //#region src/Helpers/Obj.ts
422
- var Obj_exports = /* @__PURE__ */ __export({
423
- Obj: () => Obj,
424
- data_fill: () => data_fill,
425
- data_forget: () => data_forget,
426
- data_get: () => data_get,
427
- data_set: () => data_set,
428
- dot: () => dot,
429
- extractProperties: () => extractProperties,
430
- getValue: () => getValue,
431
- modObj: () => modObj,
432
- safeDot: () => safeDot,
433
- setNested: () => setNested,
434
- slugifyKeys: () => slugifyKeys,
435
- toCssClasses: () => toCssClasses,
436
- toCssStyles: () => toCssStyles,
437
- undot: () => undot
438
- });
439
422
  /**
440
423
  * Flattens a nested object into a single-level object
441
424
  * with dot-separated keys.
@@ -695,6 +678,15 @@ function data_forget(obj, path) {
695
678
  }
696
679
  }
697
680
  }
681
+ /**
682
+ * Checks if a value is a plain object (not array, function, etc.)
683
+ *
684
+ * @param value
685
+ * @returns
686
+ */
687
+ function isPlainObject(value) {
688
+ return value !== null && typeof value === "object" && !Array.isArray(value) && Object.prototype.toString.call(value) === "[object Object]";
689
+ }
698
690
  var Obj = class Obj {
699
691
  /**
700
692
  * Check if the value is a non-null object (associative/accessible).
@@ -715,6 +707,27 @@ var Obj = class Obj {
715
707
  return obj;
716
708
  }
717
709
  /**
710
+ * Deeply merges two or more objects.
711
+ * - Arrays are replaced (not concatenated)
712
+ * - Objects are merged recursively
713
+ * - Non-object values overwrite previous ones
714
+ *
715
+ * @param objects
716
+ * @returns
717
+ */
718
+ static deepMerge(...objects) {
719
+ const result = {};
720
+ for (const obj of objects) {
721
+ if (!obj || typeof obj !== "object") continue;
722
+ for (const [key, value] of Object.entries(obj)) {
723
+ const existing = result[key];
724
+ if (isPlainObject(existing) && isPlainObject(value)) result[key] = Obj.deepMerge(existing, value);
725
+ else result[key] = value;
726
+ }
727
+ }
728
+ return result;
729
+ }
730
+ /**
718
731
  * Split object into [keys, values]
719
732
  */
720
733
  static divide(obj) {
@@ -6152,4 +6165,4 @@ function cleanHelpers(target = globalThis) {
6152
6165
  }
6153
6166
 
6154
6167
  //#endregion
6155
- export { Arr, Crypto_exports as Crypto, DateTime, DumpDie_exports as DumpDie, HtmlString, InvalidArgumentException, Mode, Number_exports as Number, Obj_exports as Obj, RuntimeException, Str, Stringable, abbreviate, base64Decode, base64Encode, caesarCipher, checksum, cleanHelpers, data_fill, data_forget, data_get, data_set, dd, dot, dump, extractProperties, format, getValue, hash, hmac, humanize, loadHelpers, modObj, random, randomColor, randomPassword, randomSecure, safeDot, secureToken, setNested, slugifyKeys, str, toBytes, toCssClasses, toCssStyles, toHumanTime, undot, uuid, verifyChecksum, xor };
6168
+ export { Arr, Crypto_exports as Crypto, DateTime, HtmlString, InvalidArgumentException, Mode, Number_exports as Number, Obj, RuntimeException, Str, Stringable, abbreviate, base64Decode, base64Encode, caesarCipher, checksum, cleanHelpers, data_fill, data_forget, data_get, data_set, dd, dot, dump, extractProperties, format, getValue, hash, hmac, humanize, isPlainObject, loadHelpers, modObj, random, randomColor, randomPassword, randomSecure, safeDot, secureToken, setNested, slugifyKeys, str, toBytes, toCssClasses, toCssStyles, toHumanTime, undot, uuid, verifyChecksum, xor };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@h3ravel/support",
3
- "version": "0.14.2",
3
+ "version": "0.14.4",
4
4
  "description": "Shared helpers, facades and utilities for H3ravel.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -38,7 +38,7 @@
38
38
  "devDependencies": {
39
39
  "@types/luxon": "^3.7.1",
40
40
  "typescript": "^5.4.0",
41
- "@h3ravel/shared": "^0.22.3"
41
+ "@h3ravel/shared": "^0.25.0"
42
42
  },
43
43
  "dependencies": {
44
44
  "dayjs": "^1.11.18",