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 +5 -0
- package/dist/cjs/form/convert.js +33 -15
- package/dist/cjs/object/sanitize.js +16 -7
- package/dist/dts/form/convert.d.ts.map +1 -1
- package/dist/dts/object/sanitize.d.ts.map +1 -1
- package/dist/dts/object/types.d.ts +6 -6
- package/dist/dts/object/types.d.ts.map +1 -1
- package/dist/esm/form/convert.js +33 -15
- package/dist/esm/object/sanitize.js +16 -7
- package/package.json +1 -1
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.
|
package/dist/cjs/form/convert.js
CHANGED
|
@@ -70,26 +70,40 @@ const createControlledFormData = (data, configs) => {
|
|
|
70
70
|
if (configs?.ignoreKeys?.includes(fullKey)) {
|
|
71
71
|
return acc;
|
|
72
72
|
}
|
|
73
|
-
const
|
|
74
|
-
|
|
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
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
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
|
-
|
|
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 &&
|
|
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
|
-
|
|
215
|
-
|
|
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
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
(
|
|
102
|
-
|
|
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,
|
|
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":"
|
|
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]:
|
|
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]:
|
|
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]:
|
|
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]:
|
|
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]:
|
|
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]:
|
|
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":"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,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/object/types.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/form/convert.js
CHANGED
|
@@ -67,26 +67,40 @@ export const createControlledFormData = (data, configs) => {
|
|
|
67
67
|
if (configs?.ignoreKeys?.includes(fullKey)) {
|
|
68
68
|
return acc;
|
|
69
69
|
}
|
|
70
|
-
const
|
|
71
|
-
|
|
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
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
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
|
-
|
|
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 &&
|
|
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
|
-
|
|
212
|
-
|
|
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
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
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.
|
|
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",
|