nhb-toolbox 4.12.31 → 4.12.32

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 CHANGED
@@ -6,6 +6,11 @@ All notable changes to the package will be documented here.
6
6
 
7
7
  ---
8
8
 
9
+ ## [4.12.32] - 2025-06-11
10
+
11
+ - **Fixed** a bug in `sanitizeData` and `createFormData` where key selections did not allow to choose keys with null/undefined value(s).
12
+ - **Fixed** a bug in `createFormData` where values of nested object(s) incorrectly converted to lowercase. Process `date-like object(s)` more efficiently in both utilities.
13
+
9
14
  ## [4.12.31] - 2025-06-10
10
15
 
11
16
  - **Added** new utility to convert number or numeric string to ordinal word.
@@ -70,26 +70,40 @@ const createControlledFormData = (data, configs) => {
70
70
  if (configs?.ignoreKeys?.includes(fullKey)) {
71
71
  return acc;
72
72
  }
73
- const isNotNullish = value != null && value !== '';
74
- // * Keep value if:
75
- // * 1. It's required OR
76
- // * 2. It's not null/undefined AND not empty string/object/array
77
- const shouldKeep = isRequiredKey(fullKey) ||
78
- isNotNullish ||
73
+ const shouldKeep = (value != null && value !== '') ||
74
+ isRequiredKey(fullKey) ||
79
75
  (0, primitives_1.isNonEmptyString)(value) ||
80
76
  (0, non_primitives_1.isValidArray)(value) ||
81
77
  (0, non_primitives_1.isNotEmptyObject)(value);
82
78
  if (shouldKeep) {
83
79
  if ((0, non_primitives_1.isNotEmptyObject)(value)) {
84
- // * Recursively clean nested objects
85
- const cleaned = _cleanObject(value, fullKey);
86
- if (isRequiredKey(fullKey) || (0, non_primitives_1.isNotEmptyObject)(cleaned)) {
87
- acc[transformedKey] = cleaned;
80
+ if ((0, guards_1.isDateLike)(value)) {
81
+ acc[transformedKey] = value;
82
+ }
83
+ else {
84
+ // * Recursively clean nested objects
85
+ const cleaned = _cleanObject(value, fullKey);
86
+ if (isRequiredKey(fullKey) ||
87
+ (0, non_primitives_1.isNotEmptyObject)(cleaned)) {
88
+ acc[transformedKey] = cleaned;
89
+ }
88
90
  }
89
91
  }
90
92
  else {
91
93
  if (typeof value === 'string') {
92
- acc[transformedKey] = value?.toLowerCase();
94
+ if ((0, primitives_1.isNonEmptyString)(value)) {
95
+ let cleanString = value;
96
+ if (configs?.trimStrings) {
97
+ cleanString = cleanString?.trim();
98
+ }
99
+ if (shouldLowercaseValue(fullKey)) {
100
+ cleanString = cleanString?.toLowerCase();
101
+ }
102
+ acc[transformedKey] = cleanString;
103
+ }
104
+ else {
105
+ acc[transformedKey] = value;
106
+ }
93
107
  }
94
108
  else if (Array.isArray(value)) {
95
109
  if (isRequiredKey(fullKey) || (0, non_primitives_1.isValidArray)(value)) {
@@ -187,7 +201,6 @@ const createControlledFormData = (data, configs) => {
187
201
  formData.append(transformedKey, value?.toLowerCase());
188
202
  }
189
203
  else {
190
- // ! CONFUSED UNGA-BUNGA
191
204
  formData.append(transformedKey, value);
192
205
  }
193
206
  }
@@ -203,7 +216,7 @@ const createControlledFormData = (data, configs) => {
203
216
  return;
204
217
  }
205
218
  // * Trim string values if trimStrings is enabled
206
- if (configs?.trimStrings && typeof value === 'string') {
219
+ if (configs?.trimStrings && (0, primitives_1.isNonEmptyString)(value)) {
207
220
  value = value?.trim();
208
221
  }
209
222
  // * Check if this key is preserved as dot-notation
@@ -211,8 +224,13 @@ const createControlledFormData = (data, configs) => {
211
224
  _addToFormData(fullKey, value);
212
225
  }
213
226
  else if ((0, non_primitives_1.isNotEmptyObject)(value) && !shouldStringify(fullKey)) {
214
- // * Process nested objects
215
- _processObject(value, key);
227
+ if ((0, guards_1.isDateLike)(value)) {
228
+ _addToFormData(key, JSON.parse(JSON.stringify(value)));
229
+ }
230
+ else {
231
+ // * Process nested objects
232
+ _processObject(value, key);
233
+ }
216
234
  }
217
235
  else if ((0, guards_2.isFileOrBlob)(value)) {
218
236
  _addToFormData(key, value);
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.sanitizeData = sanitizeData;
4
4
  exports.parseObjectValues = parseObjectValues;
5
+ const guards_1 = require("../date/guards");
5
6
  const non_primitives_1 = require("../guards/non-primitives");
6
7
  const primitives_1 = require("../guards/primitives");
7
8
  const basics_1 = require("../string/basics");
@@ -92,14 +93,22 @@ function sanitizeData(input, options, _return) {
92
93
  // Trim string values if enabled
93
94
  acc[key] = (0, basics_1.trimString)(value);
94
95
  }
96
+ else if ((0, guards_1.isDateLike)(value)) {
97
+ acc[key] = value;
98
+ }
95
99
  else if (value && (0, non_primitives_1.isObject)(value)) {
96
- // Recursively process nested objects
97
- const processedValue = _processObject(value, fullKeyPath);
98
- // Add the property conditionally if it's not an empty object
99
- if (!ignoreEmpty ||
100
- isRequiredKey(fullKeyPath) ||
101
- (0, non_primitives_1.isNotEmptyObject)(processedValue)) {
102
- acc[key] = processedValue;
100
+ if ((0, guards_1.isDateLike)(value)) {
101
+ acc[key] = value;
102
+ }
103
+ else {
104
+ // Recursively process nested objects
105
+ const processedValue = _processObject(value, fullKeyPath);
106
+ // Add the property conditionally if it's not an empty object
107
+ if (!ignoreEmpty ||
108
+ isRequiredKey(fullKeyPath) ||
109
+ (0, non_primitives_1.isNotEmptyObject)(processedValue)) {
110
+ acc[key] = processedValue;
111
+ }
103
112
  }
104
113
  }
105
114
  else if (value && Array.isArray(value)) {
@@ -1 +1 @@
1
- {"version":3,"file":"convert.d.ts","sourceRoot":"","sources":["../../../src/form/convert.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAEX,aAAa,EAEb,MAAM,iBAAiB,CAAC;AASzB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE/C;;;;;;;GAOG;AACH,eAAO,MAAM,wBAAwB,GAAI,CAAC,SAAS,aAAa,EAC/D,MAAM,CAAC,EACP,UAAU,eAAe,CAAC,CAAC,CAAC,KAC1B,QA0PF,CAAC"}
1
+ {"version":3,"file":"convert.d.ts","sourceRoot":"","sources":["../../../src/form/convert.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAEX,aAAa,EAEb,MAAM,iBAAiB,CAAC;AASzB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE/C;;;;;;;GAOG;AACH,eAAO,MAAM,wBAAwB,GAAI,CAAC,SAAS,aAAa,EAC/D,MAAM,CAAC,EACP,UAAU,eAAe,CAAC,CAAC,CAAC,KAC1B,QA2QF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"sanitize.d.ts","sourceRoot":"","sources":["../../../src/object/sanitize.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,GAAG,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAC7E,OAAO,KAAK,EAAkB,aAAa,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE9E;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;AAEpD;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC;AAExD;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAC3B,CAAC,SAAS,aAAa,EACvB,CAAC,SAAS,iBAAiB,GAAG,UAAU,EAExC,MAAM,EAAE,CAAC,EACT,OAAO,CAAC,EAAE,eAAe,CAAC,CAAC,CAAC,EAC5B,OAAO,CAAC,EAAE,CAAC,GACT,CAAC,SAAS,SAAS,GAAG,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AAE/C;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAC3B,CAAC,SAAS,aAAa,EACvB,CAAC,SAAS,iBAAiB,GAAG,UAAU,EAExC,KAAK,EAAE,CAAC,EAAE,EACV,OAAO,CAAC,EAAE,eAAe,CAAC,CAAC,CAAC,EAC5B,OAAO,CAAC,EAAE,CAAC,GACT,CAAC,SAAS,SAAS,GAAG,cAAc,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;AAwLnD;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,aAAa,EACxD,MAAM,EAAE,CAAC,EACT,WAAW,UAAO,GAChB;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,GAAG;CAAE,CA0CzB"}
1
+ {"version":3,"file":"sanitize.d.ts","sourceRoot":"","sources":["../../../src/object/sanitize.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,GAAG,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAC7E,OAAO,KAAK,EAAkB,aAAa,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE9E;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;AAEpD;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC;AAExD;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAC3B,CAAC,SAAS,aAAa,EACvB,CAAC,SAAS,iBAAiB,GAAG,UAAU,EAExC,MAAM,EAAE,CAAC,EACT,OAAO,CAAC,EAAE,eAAe,CAAC,CAAC,CAAC,EAC5B,OAAO,CAAC,EAAE,CAAC,GACT,CAAC,SAAS,SAAS,GAAG,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AAE/C;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAC3B,CAAC,SAAS,aAAa,EACvB,CAAC,SAAS,iBAAiB,GAAG,UAAU,EAExC,KAAK,EAAE,CAAC,EAAE,EACV,OAAO,CAAC,EAAE,eAAe,CAAC,CAAC,CAAC,EAC5B,OAAO,CAAC,EAAE,CAAC,GACT,CAAC,SAAS,SAAS,GAAG,cAAc,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;AAiMnD;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,aAAa,EACxD,MAAM,EAAE,CAAC,EACT,WAAW,UAAO,GAChB;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,GAAG;CAAE,CA0CzB"}
@@ -19,27 +19,27 @@ export type QueryObject = {
19
19
  export type GenericObjectPrimitive = Record<string, string | number | boolean>;
20
20
  /** - Dot-notation keys for nested objects with unknown value (including optional properties) */
21
21
  export type DotNotationKeyStrict<T> = T extends AdvancedTypes ? never : T extends StrictObject ? {
22
- [K in keyof T & string]: NonNullable<T[K]> extends Function ? never : NonNullable<T[K]> extends StrictObject ? `${K}` | `${K}.${DotNotationKey<NonNullable<T[K]>>}` : `${K}`;
22
+ [K in keyof T & string]: T[K] extends Function ? never : T[K] extends StrictObject ? `${K}` | `${K}.${DotNotationKey<T[K]>}` : `${K}`;
23
23
  }[keyof T & string] : never;
24
24
  /** - Dot-notation keys for nested objects with `any` value (including optional properties) */
25
25
  export type DotNotationKey<T> = T extends AdvancedTypes ? never : T extends GenericObject ? {
26
- [K in keyof T & string]: NonNullable<T[K]> extends Function ? never : NonNullable<T[K]> extends GenericObject ? `${K}` | `${K}.${DotNotationKey<NonNullable<T[K]>>}` : `${K}`;
26
+ [K in keyof T & string]: T[K] extends Function ? never : T[K] extends GenericObject ? `${K}` | `${K}.${DotNotationKey<T[K]>}` : `${K}`;
27
27
  }[keyof T & string] : never;
28
28
  /** - Object keys where the value is an array (including optional properties) */
29
29
  export type KeyForArray<T> = T extends GenericObject ? {
30
- [K in keyof T & string]: NonNullable<T[K]> extends Function ? never : NonNullable<T[K]> extends Array<unknown> ? K : never;
30
+ [K in keyof T & string]: T[K] extends Function ? never : T[K] extends Array<unknown> ? K : never;
31
31
  }[keyof T & string] : never;
32
32
  /** - Object keys where the value is a non-array/non-advanced type object (including optional properties) */
33
33
  export type KeyForObject<T> = T extends AdvancedTypes ? never : T extends GenericObject ? {
34
- [K in keyof T & string]: NonNullable<T[K]> extends Function ? never : NonNullable<T[K]> extends GenericObject ? NonNullable<T[K]> extends AdvancedTypes ? never : K : never;
34
+ [K in keyof T & string]: T[K] extends Function ? never : T[K] extends GenericObject ? T[K] extends AdvancedTypes ? never : K : never;
35
35
  }[keyof T & string] : never;
36
36
  /** - Extract only keys with string values from an object, including nested dot-notation keys. */
37
37
  export type NestedKeyString<T> = T extends AdvancedTypes ? never : T extends GenericObject ? {
38
- [K in keyof T & string]: NonNullable<T[K]> extends Function ? never : NonNullable<T[K]> extends string ? K : NonNullable<T[K]> extends GenericObject ? `${K}.${NestedKeyString<NonNullable<T[K]>>}` : never;
38
+ [K in keyof T & string]: T[K] extends Function ? never : T[K] extends string ? K : T[K] extends GenericObject ? `${K}.${NestedKeyString<T[K]>}` : never;
39
39
  }[keyof T & string] : never;
40
40
  /** - Extract only primitive keys from an object, including nested dot-notation keys. */
41
41
  export type NestedPrimitiveKey<T> = T extends AdvancedTypes ? never : T extends GenericObject ? {
42
- [K in keyof T & string]: NonNullable<T[K]> extends Function ? never : NonNullable<T[K]> extends NormalPrimitive ? K : NonNullable<T[K]> extends GenericObject ? `${K}.${NestedPrimitiveKey<NonNullable<T[K]>>}` : never;
42
+ [K in keyof T & string]: T[K] extends Function ? never : T[K] extends NormalPrimitive ? K : T[K] extends GenericObject ? `${K}.${NestedPrimitiveKey<T[K]>}` : never;
43
43
  }[keyof T & string] : never;
44
44
  /** - Options for `sanitizeData` utility. */
45
45
  export interface SanitizeOptions<T> {
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/object/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/object/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAErE,4CAA4C;AAC5C,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEnD,4CAA4C;AAC5C,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAEhD;;;GAGG;AACH,MAAM,MAAM,gBAAgB,GACzB,eAAe,GACf,eAAe,EAAE,GACjB,WAAW,CAAC;AAEf;;;GAGG;AACH,MAAM,MAAM,WAAW,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB,CAAA;CAAE,CAAC;AAE9D,4EAA4E;AAC5E,MAAM,MAAM,sBAAsB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC;AAE/E,gGAAgG;AAChG,MAAM,MAAM,oBAAoB,CAAC,CAAC,IACjC,CAAC,SAAS,aAAa,GAAG,KAAK,GAC7B,CAAC,SAAS,YAAY,GACvB;KACE,CAAC,IAAI,MAAM,CAAC,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,QAAQ,GAAG,KAAK,GACpD,CAAC,CAAC,CAAC,CAAC,SAAS,YAAY,GAC1B,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,IAAI,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GACtC,GAAG,CAAC,EAAE;CACR,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,GAClB,KAAK,CAAC;AAET,8FAA8F;AAC9F,MAAM,MAAM,cAAc,CAAC,CAAC,IAC3B,CAAC,SAAS,aAAa,GAAG,KAAK,GAC7B,CAAC,SAAS,aAAa,GACxB;KACE,CAAC,IAAI,MAAM,CAAC,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,QAAQ,GAAG,KAAK,GACpD,CAAC,CAAC,CAAC,CAAC,SAAS,aAAa,GAC3B,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,IAAI,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GACtC,GAAG,CAAC,EAAE;CACR,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,GAClB,KAAK,CAAC;AAET,gFAAgF;AAChF,MAAM,MAAM,WAAW,CAAC,CAAC,IACxB,CAAC,SAAS,aAAa,GACtB;KACE,CAAC,IAAI,MAAM,CAAC,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,QAAQ,GAAG,KAAK,GACpD,CAAC,CAAC,CAAC,CAAC,SAAS,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,GAC/B,KAAK;CACP,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,GAClB,KAAK,CAAC;AAET,4GAA4G;AAC5G,MAAM,MAAM,YAAY,CAAC,CAAC,IACzB,CAAC,SAAS,aAAa,GAAG,KAAK,GAC7B,CAAC,SAAS,aAAa,GACxB;KACE,CAAC,IAAI,MAAM,CAAC,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,QAAQ,GAAG,KAAK,GACpD,CAAC,CAAC,CAAC,CAAC,SAAS,aAAa,GAC3B,CAAC,CAAC,CAAC,CAAC,SAAS,aAAa,GACzB,KAAK,GACJ,CAAC,GACF,KAAK;CACP,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,GAClB,KAAK,CAAC;AAET,iGAAiG;AACjG,MAAM,MAAM,eAAe,CAAC,CAAC,IAC5B,CAAC,SAAS,aAAa,GAAG,KAAK,GAC7B,CAAC,SAAS,aAAa,GACxB;KACE,CAAC,IAAI,MAAM,CAAC,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,QAAQ,GAAG,KAAK,GACpD,CAAC,CAAC,CAAC,CAAC,SAAS,MAAM,GAAG,CAAC,GACvB,CAAC,CAAC,CAAC,CAAC,SAAS,aAAa,GAAG,GAAG,CAAC,IAAI,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAC5D,KAAK;CACP,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,GAClB,KAAK,CAAC;AAET,wFAAwF;AACxF,MAAM,MAAM,kBAAkB,CAAC,CAAC,IAC/B,CAAC,SAAS,aAAa,GAAG,KAAK,GAC7B,CAAC,SAAS,aAAa,GACxB;KACE,CAAC,IAAI,MAAM,CAAC,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,QAAQ,GAAG,KAAK,GACpD,CAAC,CAAC,CAAC,CAAC,SAAS,eAAe,GAAG,CAAC,GAChC,CAAC,CAAC,CAAC,CAAC,SAAS,aAAa,GAAG,GAAG,CAAC,IAAI,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAC/D,KAAK;CACP,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,GAClB,KAAK,CAAC;AAET,4CAA4C;AAC5C,MAAM,WAAW,eAAe,CAAC,CAAC;IACjC;;;;OAIG;IACH,YAAY,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;IAEnC,yDAAyD;IACzD,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB,sFAAsF;IACtF,aAAa,CAAC,EAAE,OAAO,CAAC;IAExB,uHAAuH;IACvH,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB,yFAAyF;IACzF,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB;;;;OAIG;IACH,YAAY,CAAC,EAAE,GAAG,GAAG,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;CACzC;AAED,iDAAiD;AACjD,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI;KAC3B,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,EAAE,GACzD,CAAC,CAAC,CAAC,CAAC,SAAS,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAC1D,CAAC,CAAC,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,GAAG,MAAM,GACrC,CAAC,CAAC,CAAC,CAAC;CACN,CAAC;AAEF,iDAAiD;AACjD,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI;KAC3B,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,EAAE,GACzD,CAAC,CAAC,CAAC,CAAC,SAAS,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAC1D,CAAC,CAAC,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,GAC5B,CAAC,CAAC,CAAC,CAAC,SAAS,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAC1B,MAAM;CACR,CAAC"}
@@ -67,26 +67,40 @@ export const createControlledFormData = (data, configs) => {
67
67
  if (configs?.ignoreKeys?.includes(fullKey)) {
68
68
  return acc;
69
69
  }
70
- const isNotNullish = value != null && value !== '';
71
- // * Keep value if:
72
- // * 1. It's required OR
73
- // * 2. It's not null/undefined AND not empty string/object/array
74
- const shouldKeep = isRequiredKey(fullKey) ||
75
- isNotNullish ||
70
+ const shouldKeep = (value != null && value !== '') ||
71
+ isRequiredKey(fullKey) ||
76
72
  isNonEmptyString(value) ||
77
73
  isValidArray(value) ||
78
74
  isNotEmptyObject(value);
79
75
  if (shouldKeep) {
80
76
  if (isNotEmptyObject(value)) {
81
- // * Recursively clean nested objects
82
- const cleaned = _cleanObject(value, fullKey);
83
- if (isRequiredKey(fullKey) || isNotEmptyObject(cleaned)) {
84
- acc[transformedKey] = cleaned;
77
+ if (isDateLike(value)) {
78
+ acc[transformedKey] = value;
79
+ }
80
+ else {
81
+ // * Recursively clean nested objects
82
+ const cleaned = _cleanObject(value, fullKey);
83
+ if (isRequiredKey(fullKey) ||
84
+ isNotEmptyObject(cleaned)) {
85
+ acc[transformedKey] = cleaned;
86
+ }
85
87
  }
86
88
  }
87
89
  else {
88
90
  if (typeof value === 'string') {
89
- acc[transformedKey] = value?.toLowerCase();
91
+ if (isNonEmptyString(value)) {
92
+ let cleanString = value;
93
+ if (configs?.trimStrings) {
94
+ cleanString = cleanString?.trim();
95
+ }
96
+ if (shouldLowercaseValue(fullKey)) {
97
+ cleanString = cleanString?.toLowerCase();
98
+ }
99
+ acc[transformedKey] = cleanString;
100
+ }
101
+ else {
102
+ acc[transformedKey] = value;
103
+ }
90
104
  }
91
105
  else if (Array.isArray(value)) {
92
106
  if (isRequiredKey(fullKey) || isValidArray(value)) {
@@ -184,7 +198,6 @@ export const createControlledFormData = (data, configs) => {
184
198
  formData.append(transformedKey, value?.toLowerCase());
185
199
  }
186
200
  else {
187
- // ! CONFUSED UNGA-BUNGA
188
201
  formData.append(transformedKey, value);
189
202
  }
190
203
  }
@@ -200,7 +213,7 @@ export const createControlledFormData = (data, configs) => {
200
213
  return;
201
214
  }
202
215
  // * Trim string values if trimStrings is enabled
203
- if (configs?.trimStrings && typeof value === 'string') {
216
+ if (configs?.trimStrings && isNonEmptyString(value)) {
204
217
  value = value?.trim();
205
218
  }
206
219
  // * Check if this key is preserved as dot-notation
@@ -208,8 +221,13 @@ export const createControlledFormData = (data, configs) => {
208
221
  _addToFormData(fullKey, value);
209
222
  }
210
223
  else if (isNotEmptyObject(value) && !shouldStringify(fullKey)) {
211
- // * Process nested objects
212
- _processObject(value, key);
224
+ if (isDateLike(value)) {
225
+ _addToFormData(key, JSON.parse(JSON.stringify(value)));
226
+ }
227
+ else {
228
+ // * Process nested objects
229
+ _processObject(value, key);
230
+ }
213
231
  }
214
232
  else if (isFileOrBlob(value)) {
215
233
  _addToFormData(key, value);
@@ -1,3 +1,4 @@
1
+ import { isDateLike } from '../date/guards.js';
1
2
  import { isArrayOfType, isNotEmptyObject, isObject, } from '../guards/non-primitives.js';
2
3
  import { isString } from '../guards/primitives.js';
3
4
  import { trimString } from '../string/basics.js';
@@ -88,14 +89,22 @@ export function sanitizeData(input, options, _return) {
88
89
  // Trim string values if enabled
89
90
  acc[key] = trimString(value);
90
91
  }
92
+ else if (isDateLike(value)) {
93
+ acc[key] = value;
94
+ }
91
95
  else if (value && isObject(value)) {
92
- // Recursively process nested objects
93
- const processedValue = _processObject(value, fullKeyPath);
94
- // Add the property conditionally if it's not an empty object
95
- if (!ignoreEmpty ||
96
- isRequiredKey(fullKeyPath) ||
97
- isNotEmptyObject(processedValue)) {
98
- acc[key] = processedValue;
96
+ if (isDateLike(value)) {
97
+ acc[key] = value;
98
+ }
99
+ else {
100
+ // Recursively process nested objects
101
+ const processedValue = _processObject(value, fullKeyPath);
102
+ // Add the property conditionally if it's not an empty object
103
+ if (!ignoreEmpty ||
104
+ isRequiredKey(fullKeyPath) ||
105
+ isNotEmptyObject(processedValue)) {
106
+ acc[key] = processedValue;
107
+ }
99
108
  }
100
109
  }
101
110
  else if (value && Array.isArray(value)) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nhb-toolbox",
3
- "version": "4.12.31",
3
+ "version": "4.12.32",
4
4
  "description": "A versatile collection of smart, efficient, and reusable utility functions and classes for everyday development needs.",
5
5
  "main": "dist/cjs/index.js",
6
6
  "module": "dist/esm/index.js",