topkat-utils 1.3.20 → 1.3.22

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/README.md CHANGED
@@ -183,6 +183,16 @@ recursiveGenericFunctionSync(
183
183
  }
184
184
  )
185
185
  ```
186
+ - `safeWhile`: A safer version of while loop that prevents infinite loops by limiting the maximum number of iterations
187
+ ```typescript
188
+ // Count up to 10
189
+ let i = 0;
190
+ safeWhile(
191
+ () => i < 10,
192
+ () => i++,
193
+ { nbRecursionMax: 100 } // Optional: maximum iterations before exiting
194
+ );
195
+ ```
186
196
 
187
197
  ### Date Operations
188
198
  - `getDateAsInt(date)`: Convert date to integer format (20290101)
@@ -233,7 +243,7 @@ urlPathJoin('https://api.example.com//v1', '/users/', 'userId') // => 'https://a
233
243
  - `upperCase(str)`: `upperCase('HelloWorld' as const) // type: 'HELLOWORLD'` (Equivalent of type `UpperCase<MyString>`)
234
244
  - `objEntries(obj)`: In JS object entries are not correctly typed (`Object.entries({ a: 1, b: true }) // type: [string, number | boolean]`). With this function we are typed like `objEntries({ a: 1, b: true }) // ["a", number] | ["b", boolean]`
235
245
  - `objKeys`: In JS object keys are not correctly typed (`Object.keys({ a: 1, b: 2 }) // type: string`). With this function we are typed like `objKeys({ a: 1, b: 2 }) // type: 'a' | 'b'`
236
- - `includes(str)`: Fix this always happening ts error when using includes and your search string is not typed as an array element (which is very dumb IMO)
246
+ - `includes(array, item)`: Fix this always happening ts error when using includes and your search string is not typed as an array element (which is very dumb IMO)
237
247
 
238
248
  ## Configuration
239
249
 
@@ -104,6 +104,22 @@ export declare function recursiveGenericFunctionSync(item: ObjectGeneric | any[]
104
104
  * () => i++
105
105
  * );
106
106
  */
107
- export declare function safeWhile(conditionFn: () => boolean, callback: () => any, { nbRecursionMax }?: {
107
+ export declare function safeWhile(conditionFn: (i: number) => boolean, callback: (i: number) => any, { nbRecursionMax }?: {
108
108
  nbRecursionMax?: number | undefined;
109
109
  }): void;
110
+ /** A safer version of while loop that prevents infinite loops
111
+ * @param {Function} conditionFn Function that returns a boolean to determine if loop should continue
112
+ * @param {Function} callback Function to execute on each iteration
113
+ * @param {Object} options Configuration object
114
+ * @param {number} [options.nbRecursionMax=100] Maximum number of iterations before exiting to prevent infinite loops
115
+ * @example
116
+ * // Count up to 10
117
+ * let i = 0;
118
+ * safeWhile(
119
+ * () => i < 10,
120
+ * () => i++
121
+ * );
122
+ */
123
+ export declare function safeWhileAsync(conditionFn: (i: number) => boolean, callback: (i: number) => Promise<any>, { nbRecursionMax }?: {
124
+ nbRecursionMax?: number | undefined;
125
+ }): Promise<void>;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.safeWhile = exports.recursiveGenericFunctionSync = exports.recursiveGenericFunction = exports.forIasync = exports.forI = void 0;
3
+ exports.safeWhileAsync = exports.safeWhile = exports.recursiveGenericFunctionSync = exports.recursiveGenericFunction = exports.forIasync = exports.forI = void 0;
4
4
  const error_utils_1 = require("./error-utils");
5
5
  const is_object_1 = require("./is-object");
6
6
  /**
@@ -156,12 +156,35 @@ exports.recursiveGenericFunctionSync = recursiveGenericFunctionSync;
156
156
  */
157
157
  function safeWhile(conditionFn, callback, { nbRecursionMax = 100 } = {}) {
158
158
  let nbRecursion = 0;
159
- while (conditionFn() && nbRecursion++ < nbRecursionMax) {
160
- callback();
159
+ while (conditionFn(nbRecursion) && nbRecursion++ < nbRecursionMax) {
160
+ callback(nbRecursion);
161
161
  // eslint-disable-next-line no-console
162
162
  if (nbRecursion === nbRecursionMax - 1)
163
163
  console.warn(`Too much recursion for while loop, exiting...`);
164
164
  }
165
165
  }
166
166
  exports.safeWhile = safeWhile;
167
+ /** A safer version of while loop that prevents infinite loops
168
+ * @param {Function} conditionFn Function that returns a boolean to determine if loop should continue
169
+ * @param {Function} callback Function to execute on each iteration
170
+ * @param {Object} options Configuration object
171
+ * @param {number} [options.nbRecursionMax=100] Maximum number of iterations before exiting to prevent infinite loops
172
+ * @example
173
+ * // Count up to 10
174
+ * let i = 0;
175
+ * safeWhile(
176
+ * () => i < 10,
177
+ * () => i++
178
+ * );
179
+ */
180
+ async function safeWhileAsync(conditionFn, callback, { nbRecursionMax = 100 } = {}) {
181
+ let nbRecursion = 0;
182
+ while (await conditionFn(nbRecursion) && nbRecursion++ < nbRecursionMax) {
183
+ await callback(nbRecursion);
184
+ // eslint-disable-next-line no-console
185
+ if (nbRecursion === nbRecursionMax - 1)
186
+ console.warn(`Too much recursion for while loop, exiting...`);
187
+ }
188
+ }
189
+ exports.safeWhileAsync = safeWhileAsync;
167
190
  //# sourceMappingURL=loop-utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"loop-utils.js","sourceRoot":"","sources":["../../src/loop-utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"loop-utils.js","sourceRoot":"","sources":["../../src/loop-utils.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "topkat-utils",
3
- "version": "1.3.20",
3
+ "version": "1.3.22",
4
4
  "type": "commonjs",
5
5
  "types": "index.ts",
6
6
  "main": "dist",
@@ -55,7 +55,7 @@
55
55
  "bump:minor": "yarn test:ci && yarn build && bump --minor",
56
56
  "bump:patch": "yarn test:ci && yarn build && bump --patch",
57
57
  "test": "jest --watchAll",
58
- "test:ci": "jest --ci --runInBand --maxConcurrency=1 --silent"
58
+ "test:ci": "jest --ci --runInBand --maxConcurrency=1 --silent --no-watchman"
59
59
  },
60
60
  "devDependencies": {
61
61
  "@types/jest": "^29.5.12",
package/src/loop-utils.ts CHANGED
@@ -175,10 +175,35 @@ export function recursiveGenericFunctionSync(item: ObjectGeneric | any[], callba
175
175
  * () => i++
176
176
  * );
177
177
  */
178
- export function safeWhile(conditionFn: () => boolean, callback: () => any, { nbRecursionMax = 100 } = {}) {
178
+ export function safeWhile(conditionFn: (i: number) => boolean, callback: (i: number) => any, { nbRecursionMax = 100 } = {}) {
179
179
  let nbRecursion = 0
180
- while (conditionFn() && nbRecursion++ < nbRecursionMax) {
181
- callback()
180
+ while (conditionFn(nbRecursion) && nbRecursion++ < nbRecursionMax) {
181
+ callback(nbRecursion)
182
+ // eslint-disable-next-line no-console
183
+ if (nbRecursion === nbRecursionMax - 1) console.warn(`Too much recursion for while loop, exiting...`)
184
+ }
185
+ }
186
+
187
+
188
+
189
+
190
+ /** A safer version of while loop that prevents infinite loops
191
+ * @param {Function} conditionFn Function that returns a boolean to determine if loop should continue
192
+ * @param {Function} callback Function to execute on each iteration
193
+ * @param {Object} options Configuration object
194
+ * @param {number} [options.nbRecursionMax=100] Maximum number of iterations before exiting to prevent infinite loops
195
+ * @example
196
+ * // Count up to 10
197
+ * let i = 0;
198
+ * safeWhile(
199
+ * () => i < 10,
200
+ * () => i++
201
+ * );
202
+ */
203
+ export async function safeWhileAsync(conditionFn: (i: number) => boolean, callback: (i: number) => Promise<any>, { nbRecursionMax = 100 } = {}) {
204
+ let nbRecursion = 0
205
+ while (await conditionFn(nbRecursion) && nbRecursion++ < nbRecursionMax) {
206
+ await callback(nbRecursion)
182
207
  // eslint-disable-next-line no-console
183
208
  if (nbRecursion === nbRecursionMax - 1) console.warn(`Too much recursion for while loop, exiting...`)
184
209
  }