nhb-toolbox 2.8.7 → 2.8.9

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.
@@ -1 +1 @@
1
- {"version":3,"file":"transform.d.ts","sourceRoot":"","sources":["../../src/form/transform.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAkB,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAErE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE/C;;;;;;;GAOG;AACH,eAAO,MAAM,wBAAwB,GAAI,CAAC,SAAS,aAAa,QACzD,CAAC,YACG,eAAe,CAAC,CAAC,CAAC,KAC1B,QAkIF,CAAC"}
1
+ {"version":3,"file":"transform.d.ts","sourceRoot":"","sources":["../../src/form/transform.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAEX,aAAa,EAEb,MAAM,iBAAiB,CAAC;AAEzB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE/C;;;;;;;GAOG;AAGH,eAAO,MAAM,wBAAwB,GAAI,CAAC,SAAS,aAAa,QACzD,CAAC,YACG,eAAe,CAAC,CAAC,CAAC,KAC1B,QAsMF,CAAC"}
@@ -9,33 +9,85 @@ import { isCustomFile, isCustomFileArray, isFileUpload } from './guards';
9
9
  *
10
10
  * @returns FormData instance containing the sanitized and transformed data
11
11
  */
12
+ // ... (previous imports remain the same)
12
13
  export const createControlledFormData = (data, configs) => {
13
14
  const formData = new FormData();
14
15
  const { stringifyNested = '*' } = configs || {};
16
+ /** Helper to check if a key should be lowercase */
17
+ const shouldLowercase = (key) => {
18
+ return Array.isArray(configs?.lowerCaseKeys) ?
19
+ configs.lowerCaseKeys.some((path) => key === path || key.startsWith(`${path}.`))
20
+ : configs?.lowerCaseKeys === '*';
21
+ };
22
+ /** Transforms key to lowercase if needed */
23
+ const transformKey = (key) => {
24
+ return shouldLowercase(key) ? key.toLowerCase() : key;
25
+ };
26
+ /** - Helper function to check if a key matches a breakArray key. */
27
+ const isRequiredKey = (key) => {
28
+ const transformedKey = transformKey(key);
29
+ return Array.isArray(configs?.requiredKeys) ?
30
+ configs.requiredKeys.some((path) => transformedKey === path ||
31
+ transformedKey.startsWith(`${path}.`))
32
+ : configs?.requiredKeys === '*';
33
+ };
15
34
  /** - Helper function to check if a key matches a dotNotation path to preserve. */
16
35
  const shouldDotNotate = (key) => {
36
+ const transformedKey = transformKey(key);
17
37
  return Array.isArray(configs?.dotNotateNested) ?
18
- configs.dotNotateNested.some((path) => key === path || key.startsWith(`${path}.`))
38
+ configs.dotNotateNested.includes(transformedKey)
19
39
  : configs?.dotNotateNested === '*';
20
40
  };
21
41
  /** - Helper function to check if a key matches a stringifyNested key. */
22
42
  const shouldStringify = (key) => {
43
+ const transformedKey = transformKey(key);
23
44
  return Array.isArray(stringifyNested) ?
24
- stringifyNested.some((path) => key === path || key.startsWith(`${path}.`))
45
+ stringifyNested.includes(transformedKey)
25
46
  : stringifyNested === '*';
26
47
  };
27
48
  /** - Helper function to check if a key matches a breakArray key. */
28
49
  const shouldBreakArray = (key) => {
50
+ const transformedKey = transformKey(key);
29
51
  return Array.isArray(configs?.breakArray) ?
30
- configs.breakArray.some((path) => key === path || key.startsWith(`${path}.`))
52
+ configs.breakArray.includes(transformedKey)
31
53
  : configs?.breakArray === '*';
32
54
  };
55
+ /** - Helper to clean object by removing null/undefined/empty values while respecting required keys */
56
+ const _cleanObject = (obj, parentKey = '') => {
57
+ return Object.entries(obj).reduce((acc, [key, value]) => {
58
+ const transformedKey = transformKey(key);
59
+ const fullKey = parentKey ? `${parentKey}.${transformedKey}` : transformedKey;
60
+ // Skip ignored keys (don't include them in the cleaned object)
61
+ if (configs?.ignoreKeys?.includes(fullKey)) {
62
+ return acc;
63
+ }
64
+ // Keep value if:
65
+ // 1. It's required OR
66
+ // 2. It's not null/undefined AND not empty string/object
67
+ const shouldKeep = isRequiredKey(fullKey) ||
68
+ (value != null &&
69
+ (typeof value !== 'string' || value !== '') &&
70
+ (typeof value !== 'object' || !isEmptyObject(value)));
71
+ if (shouldKeep) {
72
+ if (typeof value === 'object' &&
73
+ value !== null &&
74
+ !Array.isArray(value)) {
75
+ // Recursively clean nested objects
76
+ const cleaned = _cleanObject(value, fullKey);
77
+ if (isRequiredKey(fullKey) || !isEmptyObject(cleaned)) {
78
+ acc[transformKey(key)] = cleaned;
79
+ }
80
+ }
81
+ else {
82
+ acc[transformKey(key)] = value;
83
+ }
84
+ }
85
+ return acc;
86
+ }, {});
87
+ };
33
88
  /** * Helper function to add values to formData */
34
89
  const _addToFormData = (key, value) => {
35
- const transformedKey = (configs?.lowerCaseKeys === '*' ||
36
- configs?.lowerCaseKeys?.includes(key)) ?
37
- key.toLowerCase()
38
- : key;
90
+ const transformedKey = transformKey(key);
39
91
  if (isCustomFileArray(value)) {
40
92
  value.forEach((file) => formData.append(transformedKey, file.originFileObj));
41
93
  }
@@ -69,7 +121,11 @@ export const createControlledFormData = (data, configs) => {
69
121
  value !== null &&
70
122
  !isEmptyObject(value)) {
71
123
  if (shouldStringify(key) && !shouldDotNotate(key)) {
72
- formData.append(transformedKey, JSON.stringify(value));
124
+ // Clean object before stringifying, preserving required keys
125
+ const cleanedValue = _cleanObject(value, key);
126
+ if (!isEmptyObject(cleanedValue) || isRequiredKey(key)) {
127
+ formData.append(transformedKey, JSON.stringify(cleanedValue));
128
+ }
73
129
  }
74
130
  else {
75
131
  Object.entries(value).forEach(([nestedKey, nestedValue]) => {
@@ -78,10 +134,8 @@ export const createControlledFormData = (data, configs) => {
78
134
  }
79
135
  }
80
136
  else {
81
- const isRequired = configs?.requiredKeys === '*' ||
82
- configs?.requiredKeys?.includes(key);
83
137
  const isNotNullish = value != null && value !== '';
84
- if (isNotNullish || isRequired) {
138
+ if (isNotNullish || isRequiredKey(key)) {
85
139
  formData.append(transformedKey, value);
86
140
  }
87
141
  }
@@ -89,9 +143,8 @@ export const createControlledFormData = (data, configs) => {
89
143
  /** - Helper to process object */
90
144
  const _processObject = (obj, parentKey = '') => {
91
145
  Object.entries(obj).forEach(([key, value]) => {
92
- const fullKey = (parentKey ?
93
- `${parentKey}.${key}`
94
- : key);
146
+ const transformedKey = transformKey(key);
147
+ const fullKey = parentKey ? `${parentKey}.${transformedKey}` : transformedKey;
95
148
  // Skip keys that are in ignoreKeys
96
149
  if (configs?.ignoreKeys?.includes(fullKey))
97
150
  return;
@@ -106,8 +159,8 @@ export const createControlledFormData = (data, configs) => {
106
159
  }
107
160
  else if (typeof value === 'object' &&
108
161
  !Array.isArray(value) &&
109
- value != null &&
110
- !stringifyNested) {
162
+ value !== null &&
163
+ !shouldStringify(fullKey)) {
111
164
  // Process nested objects
112
165
  _processObject(value, key);
113
166
  }
@@ -1,4 +1,4 @@
1
- import type { DotNotationKey } from '../object/types';
1
+ import type { DotNotationKey, KeyForArray, KeyForObject } from '../object/types';
2
2
  /** - Configuration options to control FormData generation behavior. */
3
3
  export interface FormDataConfigs<T> {
4
4
  /**
@@ -17,25 +17,24 @@ export interface FormDataConfigs<T> {
17
17
  */
18
18
  lowerCaseKeys?: '*' | DotNotationKey<T>[];
19
19
  /**
20
- * * An array of dot-notation paths to preserve in their original structure.
21
- * - Example: `'user.settings'` ensures `user` remains an object, and `settings` is not flattened.
22
- * - Use `*` to preserve all keys in their dot-notation format.
20
+ * * An array of keys (values must be object) to preserve in their original structure.
21
+ * - Use `*` to preserve all keys with object values in their dot-notation format.
23
22
  * - If a key exists in both `dotNotateNested` and `stringifyNested`, `dotNotateNested` takes precedence.
24
23
  */
25
- dotNotateNested?: '*' | DotNotationKey<T>[];
24
+ dotNotateNested?: '*' | KeyForObject<T>[];
26
25
  /**
27
- * * Specifies which nested objects should be stringified instead of being flattened or dot-notated.
28
- * - Defaults to `*`, meaning all nested objects will be stringified. Which is standard in modern form submissions.
26
+ * * Specifies which keys (values must be objects) should be stringified instead of being dot-notated.
27
+ * - Defaults to `*`, meaning all keys with object values will be stringified. Which is standard in modern form submissions.
29
28
  * - Use `*` to stringify all nested objects.
30
29
  * - If a key exists in both `dotNotateNested` and `stringifyNested`, `dotNotateNested` takes precedence.
31
30
  */
32
- stringifyNested?: '*' | DotNotationKey<T>[];
31
+ stringifyNested?: '*' | KeyForObject<T>[];
33
32
  /**
34
33
  * * Controls how arrays should be serialized in FormData.
35
34
  * - If a key is included, the array will be broken into individual key-value pairs (`key[0]: value, key[1]: value`).
36
35
  * - Use `*` to apply this behavior to all array keys.
37
36
  */
38
- breakArray?: '*' | DotNotationKey<T>[];
37
+ breakArray?: '*' | KeyForArray<T>[];
39
38
  /** - Enables automatic trimming of string values before appending them to FormData. */
40
39
  trimStrings?: boolean;
41
40
  }
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/form/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEtD,uEAAuE;AACvE,MAAM,WAAW,eAAe,CAAC,CAAC;IACjC;;;OAGG;IACH,UAAU,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;IAEjC;;;OAGG;IACH,YAAY,CAAC,EAAE,GAAG,GAAG,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;IAEzC;;;OAGG;IACH,aAAa,CAAC,EAAE,GAAG,GAAG,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;IAE1C;;;;;OAKG;IACH,eAAe,CAAC,EAAE,GAAG,GAAG,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;IAE5C;;;;;OAKG;IACH,eAAe,CAAC,EAAE,GAAG,GAAG,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;IAE5C;;;;OAIG;IACH,UAAU,CAAC,EAAE,GAAG,GAAG,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;IAEvC,uFAAuF;IACvF,WAAW,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,+GAA+G;AAC/G,MAAM,WAAW,UAAU;IAC1B,uCAAuC;IACvC,IAAI,EAAE,IAAI,GAAG,UAAU,CAAC;IACxB,oDAAoD;IACpD,QAAQ,EAAE,UAAU,EAAE,CAAC;CACvB;AAED,2EAA2E;AAC3E,MAAM,WAAW,UAAU;IAC1B,sCAAsC;IACtC,GAAG,EAAE,MAAM,CAAC;IACZ,oEAAoE;IACpE,YAAY,EAAE,MAAM,CAAC;IACrB,yDAAyD;IACzD,gBAAgB,EAAE,IAAI,CAAC;IACvB,4BAA4B;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,qCAAqC;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,iCAAiC;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,0CAA0C;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,2DAA2D;IAC3D,aAAa,EAAE,aAAa,CAAC;IAC7B,mDAAmD;IACnD,QAAQ,EAAE,MAAM,CAAC;IACjB,sDAAsD;IACtD,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,0DAA0D;IAC1D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,+EAA+E;IAC/E,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,sEAAsE;AACtE,MAAM,WAAW,aAAc,SAAQ,IAAI;IAC1C,+CAA+C;IAC/C,GAAG,EAAE,MAAM,CAAC;CACZ;AAED,8DAA8D;AAC9D,MAAM,WAAW,SAAU,SAAQ,KAAK;IACvC,qCAAqC;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,kEAAkE;IAClE,MAAM,EAAE,MAAM,CAAC;IACf,8CAA8C;IAC9C,GAAG,EAAE,MAAM,CAAC;CACZ"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/form/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,cAAc,EACd,WAAW,EACX,YAAY,EACZ,MAAM,iBAAiB,CAAC;AAEzB,uEAAuE;AACvE,MAAM,WAAW,eAAe,CAAC,CAAC;IACjC;;;OAGG;IACH,UAAU,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;IAEjC;;;OAGG;IACH,YAAY,CAAC,EAAE,GAAG,GAAG,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;IAEzC;;;OAGG;IACH,aAAa,CAAC,EAAE,GAAG,GAAG,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;IAE1C;;;;OAIG;IACH,eAAe,CAAC,EAAE,GAAG,GAAG,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;IAE1C;;;;;OAKG;IACH,eAAe,CAAC,EAAE,GAAG,GAAG,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;IAE1C;;;;OAIG;IACH,UAAU,CAAC,EAAE,GAAG,GAAG,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;IAEpC,uFAAuF;IACvF,WAAW,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,+GAA+G;AAC/G,MAAM,WAAW,UAAU;IAC1B,uCAAuC;IACvC,IAAI,EAAE,IAAI,GAAG,UAAU,CAAC;IACxB,oDAAoD;IACpD,QAAQ,EAAE,UAAU,EAAE,CAAC;CACvB;AAED,2EAA2E;AAC3E,MAAM,WAAW,UAAU;IAC1B,sCAAsC;IACtC,GAAG,EAAE,MAAM,CAAC;IACZ,oEAAoE;IACpE,YAAY,EAAE,MAAM,CAAC;IACrB,yDAAyD;IACzD,gBAAgB,EAAE,IAAI,CAAC;IACvB,4BAA4B;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,qCAAqC;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,iCAAiC;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,0CAA0C;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,2DAA2D;IAC3D,aAAa,EAAE,aAAa,CAAC;IAC7B,mDAAmD;IACnD,QAAQ,EAAE,MAAM,CAAC;IACjB,sDAAsD;IACtD,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,0DAA0D;IAC1D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,+EAA+E;IAC/E,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,sEAAsE;AACtE,MAAM,WAAW,aAAc,SAAQ,IAAI;IAC1C,+CAA+C;IAC/C,GAAG,EAAE,MAAM,CAAC;CACZ;AAED,8DAA8D;AAC9D,MAAM,WAAW,SAAU,SAAQ,KAAK;IACvC,qCAAqC;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,kEAAkE;IAClE,MAAM,EAAE,MAAM,CAAC;IACf,8CAA8C;IAC9C,GAAG,EAAE,MAAM,CAAC;CACZ"}
@@ -18,12 +18,20 @@ export type QueryObject = {
18
18
  /** - Object type with string or number or boolean as value for each key. */
19
19
  export type GenericObjectPrimitive = Record<string, string | number | boolean>;
20
20
  /** - Dot-notation keys for nested objects */
21
- export type DotNotationKeyStrict<T> = T extends GenericObjectStrict ? {
21
+ export type DotNotationKeyStrict<T> = T extends unknown[] ? never : T extends GenericObjectStrict ? {
22
22
  [K in keyof T & string]: T[K] extends GenericObjectStrict ? `${K}` | `${K}.${DotNotationKeyStrict<T[K]>}` : `${K}`;
23
23
  }[keyof T & string] : never;
24
- /** - Dot-notation keys for nested objects */
25
- export type DotNotationKey<T> = T extends GenericObject ? {
26
- [K in keyof T & string]: T[K] extends GenericObject ? `${K}` | `${K}.${DotNotationKey<T[K]>}` : `${K}`;
24
+ /** - Dot-notation keys for nested objects (including optional properties) */
25
+ export type DotNotationKey<T> = T extends unknown[] ? never : T extends GenericObject ? {
26
+ [K in keyof T & string]: NonNullable<T[K]> extends GenericObject ? `${K}` | `${K}.${DotNotationKey<NonNullable<T[K]>>}` : `${K}`;
27
+ }[keyof T & string] : never;
28
+ /** - Dot-notation keys where the value is an array (including optional properties) */
29
+ export type KeyForArray<T> = T extends GenericObject ? {
30
+ [K in keyof T & string]: NonNullable<T[K]> extends unknown[] ? K : never;
31
+ }[keyof T & string] : never;
32
+ /** - Dot-notation keys where the value is a non-array object (including optional properties) */
33
+ export type KeyForObject<T> = T extends GenericObject ? {
34
+ [K in keyof T & string]: NonNullable<T[K]> extends GenericObject ? NonNullable<T[K]> extends unknown[] ? never : K : never;
27
35
  }[keyof T & string] : never;
28
36
  /** - Extract only primitive keys from an object, including nested dot-notation keys. */
29
37
  export type NestedPrimitiveKey<T> = T extends GenericObject ? {
@@ -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":"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"}
@@ -2,7 +2,7 @@
2
2
  * * Utility to generate unique anagrams of a word.
3
3
  * @param word The word for generating anagrams.
4
4
  * @param limit The maximum number of anagrams to return ('all' for unlimited). Default is `100`.
5
- * @returns An array of generated anagrams. The first element is always the given word.
5
+ * @returns An array of generated anagrams. The first element is always the given word. Generated angrams are always in lowercase.
6
6
  */
7
- export declare function generateAnagrams(word: string, limit?: number | 'all'): (Lowercase<string> | string)[];
7
+ export declare function generateAnagrams(word: string, limit?: number | 'all'): Lowercase<string>[];
8
8
  //# sourceMappingURL=anagram.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"anagram.d.ts","sourceRoot":"","sources":["../../src/string/anagram.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC/B,IAAI,EAAE,MAAM,EACZ,KAAK,GAAE,MAAM,GAAG,KAAW,GACzB,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,EAAE,CA6BhC"}
1
+ {"version":3,"file":"anagram.d.ts","sourceRoot":"","sources":["../../src/string/anagram.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC/B,IAAI,EAAE,MAAM,EACZ,KAAK,GAAE,MAAM,GAAG,KAAW,GACzB,SAAS,CAAC,MAAM,CAAC,EAAE,CA+BrB"}
@@ -2,11 +2,12 @@
2
2
  * * Utility to generate unique anagrams of a word.
3
3
  * @param word The word for generating anagrams.
4
4
  * @param limit The maximum number of anagrams to return ('all' for unlimited). Default is `100`.
5
- * @returns An array of generated anagrams. The first element is always the given word.
5
+ * @returns An array of generated anagrams. The first element is always the given word. Generated angrams are always in lowercase.
6
6
  */
7
7
  export function generateAnagrams(word, limit = 100) {
8
- if (word.length <= 1)
9
- return [word];
8
+ if (word.length <= 1) {
9
+ return [word.toLowerCase()];
10
+ }
10
11
  const uniqueAnagrams = new Set();
11
12
  /**
12
13
  * * Helper function to generate permutations.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nhb-toolbox",
3
- "version": "2.8.7",
3
+ "version": "2.8.9",
4
4
  "description": "A versatile collection of smart, efficient, and reusable utility functions for everyday development needs.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",