@ntnyq/utils 0.1.1 → 0.1.3
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/dist/index.cjs +107 -0
- package/dist/index.d.cts +41 -1
- package/dist/index.d.ts +41 -1
- package/dist/index.js +91 -0
- package/package.json +8 -8
package/dist/index.cjs
CHANGED
|
@@ -24,17 +24,33 @@ __export(src_exports, {
|
|
|
24
24
|
cAF: () => cAF,
|
|
25
25
|
camelCase: () => camelCase,
|
|
26
26
|
capitalize: () => capitalize,
|
|
27
|
+
chunk: () => chunk,
|
|
28
|
+
clamp: () => clamp,
|
|
27
29
|
days: () => days,
|
|
28
30
|
flatCase: () => flatCase,
|
|
31
|
+
getObjectType: () => getObjectType,
|
|
32
|
+
hasOwnProperty: () => hasOwnProperty,
|
|
29
33
|
hours: () => hours,
|
|
34
|
+
isArray: () => isArray,
|
|
35
|
+
isBoolean: () => isBoolean,
|
|
30
36
|
isBrowser: () => isBrowser,
|
|
37
|
+
isFunction: () => isFunction,
|
|
38
|
+
isInteger: () => isInteger,
|
|
39
|
+
isNativePromise: () => isNativePromise,
|
|
40
|
+
isNull: () => isNull,
|
|
41
|
+
isNumber: () => isNumber,
|
|
42
|
+
isPromise: () => isPromise,
|
|
43
|
+
isString: () => isString,
|
|
44
|
+
isUndefined: () => isUndefined,
|
|
31
45
|
isUppercase: () => isUppercase,
|
|
32
46
|
join: () => join,
|
|
33
47
|
kebabCase: () => kebabCase,
|
|
34
48
|
lowerFirst: () => lowerFirst,
|
|
35
49
|
minutes: () => minutes,
|
|
36
50
|
noop: () => noop,
|
|
51
|
+
omit: () => omit,
|
|
37
52
|
pascalCase: () => pascalCase,
|
|
53
|
+
pick: () => pick,
|
|
38
54
|
rAF: () => rAF,
|
|
39
55
|
seconds: () => seconds,
|
|
40
56
|
snakeCase: () => snakeCase,
|
|
@@ -51,6 +67,44 @@ __export(src_exports, {
|
|
|
51
67
|
});
|
|
52
68
|
module.exports = __toCommonJS(src_exports);
|
|
53
69
|
|
|
70
|
+
// src/is/index.ts
|
|
71
|
+
function getObjectType(value) {
|
|
72
|
+
return Object.prototype.toString.call(value).slice(8, -1);
|
|
73
|
+
}
|
|
74
|
+
function isString(value) {
|
|
75
|
+
return typeof value === "string";
|
|
76
|
+
}
|
|
77
|
+
function isNumber(value) {
|
|
78
|
+
return typeof value === "number";
|
|
79
|
+
}
|
|
80
|
+
function isInteger(value) {
|
|
81
|
+
return Number.isInteger(value);
|
|
82
|
+
}
|
|
83
|
+
function isBoolean(value) {
|
|
84
|
+
return typeof value === "boolean";
|
|
85
|
+
}
|
|
86
|
+
function isFunction(value) {
|
|
87
|
+
return typeof value === "function";
|
|
88
|
+
}
|
|
89
|
+
function isArray(value) {
|
|
90
|
+
return Array.isArray(value);
|
|
91
|
+
}
|
|
92
|
+
function isUndefined(value) {
|
|
93
|
+
return value === void 0;
|
|
94
|
+
}
|
|
95
|
+
function isNull(value) {
|
|
96
|
+
return value === null;
|
|
97
|
+
}
|
|
98
|
+
function isNativePromise(value) {
|
|
99
|
+
return getObjectType(value) === "Promise";
|
|
100
|
+
}
|
|
101
|
+
function hasPromiseApi(value) {
|
|
102
|
+
return isFunction(value?.then) && isFunction(value?.catch);
|
|
103
|
+
}
|
|
104
|
+
function isPromise(value) {
|
|
105
|
+
return isNativePromise(value) || hasPromiseApi(value);
|
|
106
|
+
}
|
|
107
|
+
|
|
54
108
|
// src/fn/noop.ts
|
|
55
109
|
var noop = () => {
|
|
56
110
|
};
|
|
@@ -183,6 +237,11 @@ function weeks(count) {
|
|
|
183
237
|
return count * ONE_WEEK;
|
|
184
238
|
}
|
|
185
239
|
|
|
240
|
+
// src/misc/clamp.ts
|
|
241
|
+
function clamp(value, min = Number.NEGATIVE_INFINITY, max = Number.POSITIVE_INFINITY) {
|
|
242
|
+
return Math.min(Math.max(value, min), max);
|
|
243
|
+
}
|
|
244
|
+
|
|
186
245
|
// src/misc/waitFor.ts
|
|
187
246
|
function waitFor(ms) {
|
|
188
247
|
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
@@ -198,6 +257,15 @@ var warnOnce = (message) => {
|
|
|
198
257
|
console.warn(message);
|
|
199
258
|
};
|
|
200
259
|
|
|
260
|
+
// src/array/chunk.ts
|
|
261
|
+
function chunk(array, size) {
|
|
262
|
+
const result = [];
|
|
263
|
+
for (let i = 0; i < array.length; i += size) {
|
|
264
|
+
result.push(array.slice(i, i + size));
|
|
265
|
+
}
|
|
266
|
+
return result;
|
|
267
|
+
}
|
|
268
|
+
|
|
201
269
|
// src/array/unique.ts
|
|
202
270
|
function unique(array) {
|
|
203
271
|
return Array.from(new Set(array));
|
|
@@ -224,23 +292,62 @@ function join(array, options = {}) {
|
|
|
224
292
|
if (!Array.isArray(array) || !array.length) return "";
|
|
225
293
|
return array.filter((v) => Boolean(v) || v === 0).join(separator);
|
|
226
294
|
}
|
|
295
|
+
|
|
296
|
+
// src/object/omit.ts
|
|
297
|
+
function omit(object, ...keys) {
|
|
298
|
+
keys.forEach((key) => delete object[key]);
|
|
299
|
+
return object;
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
// src/object/hasOwnProperty.ts
|
|
303
|
+
function hasOwnProperty(object, key) {
|
|
304
|
+
return Object.prototype.hasOwnProperty.call(object, key);
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
// src/object/pick.ts
|
|
308
|
+
function pick(object, keys) {
|
|
309
|
+
return Object.assign(
|
|
310
|
+
{},
|
|
311
|
+
...keys.map((key) => {
|
|
312
|
+
if (object && hasOwnProperty(object, key)) {
|
|
313
|
+
return { [key]: object[key] };
|
|
314
|
+
}
|
|
315
|
+
})
|
|
316
|
+
);
|
|
317
|
+
}
|
|
227
318
|
// Annotate the CommonJS export names for ESM import in node:
|
|
228
319
|
0 && (module.exports = {
|
|
229
320
|
NOOP,
|
|
230
321
|
cAF,
|
|
231
322
|
camelCase,
|
|
232
323
|
capitalize,
|
|
324
|
+
chunk,
|
|
325
|
+
clamp,
|
|
233
326
|
days,
|
|
234
327
|
flatCase,
|
|
328
|
+
getObjectType,
|
|
329
|
+
hasOwnProperty,
|
|
235
330
|
hours,
|
|
331
|
+
isArray,
|
|
332
|
+
isBoolean,
|
|
236
333
|
isBrowser,
|
|
334
|
+
isFunction,
|
|
335
|
+
isInteger,
|
|
336
|
+
isNativePromise,
|
|
337
|
+
isNull,
|
|
338
|
+
isNumber,
|
|
339
|
+
isPromise,
|
|
340
|
+
isString,
|
|
341
|
+
isUndefined,
|
|
237
342
|
isUppercase,
|
|
238
343
|
join,
|
|
239
344
|
kebabCase,
|
|
240
345
|
lowerFirst,
|
|
241
346
|
minutes,
|
|
242
347
|
noop,
|
|
348
|
+
omit,
|
|
243
349
|
pascalCase,
|
|
350
|
+
pick,
|
|
244
351
|
rAF,
|
|
245
352
|
seconds,
|
|
246
353
|
snakeCase,
|
package/dist/index.d.cts
CHANGED
|
@@ -1,6 +1,23 @@
|
|
|
1
1
|
import { upperFirst } from 'scule';
|
|
2
2
|
export * from 'scule';
|
|
3
3
|
|
|
4
|
+
/**
|
|
5
|
+
* @file is utils
|
|
6
|
+
* @category is
|
|
7
|
+
* @copyright {@link https://github.com/sindresorhus/is}
|
|
8
|
+
*/
|
|
9
|
+
declare function getObjectType(value: unknown): string;
|
|
10
|
+
declare function isString(value: unknown): value is string;
|
|
11
|
+
declare function isNumber(value: unknown): value is number;
|
|
12
|
+
declare function isInteger(value: unknown): value is number;
|
|
13
|
+
declare function isBoolean(value: unknown): value is boolean;
|
|
14
|
+
declare function isFunction(value: unknown): value is Function;
|
|
15
|
+
declare function isArray(value: unknown): value is unknown[];
|
|
16
|
+
declare function isUndefined(value: unknown): value is undefined;
|
|
17
|
+
declare function isNull(value: unknown): value is null;
|
|
18
|
+
declare function isNativePromise<T = unknown>(value: unknown): value is Promise<T>;
|
|
19
|
+
declare function isPromise<T = unknown>(value: unknown): value is Promise<T>;
|
|
20
|
+
|
|
4
21
|
/**
|
|
5
22
|
* A function that does nothing.
|
|
6
23
|
*/
|
|
@@ -57,6 +74,15 @@ declare function hours(count: number): number;
|
|
|
57
74
|
declare function days(count: number): number;
|
|
58
75
|
declare function weeks(count: number): number;
|
|
59
76
|
|
|
77
|
+
/**
|
|
78
|
+
* Clamps a number between a minimum and maximum value
|
|
79
|
+
* @param value the value to clamp within the given range
|
|
80
|
+
* @param min the minimum value to clamp
|
|
81
|
+
* @param max the maximum value to clamp
|
|
82
|
+
* @returns the new value
|
|
83
|
+
*/
|
|
84
|
+
declare function clamp(value: number, min?: number, max?: number): number;
|
|
85
|
+
|
|
60
86
|
/**
|
|
61
87
|
* Wait for a number of milliseconds
|
|
62
88
|
*
|
|
@@ -74,6 +100,14 @@ declare function waitFor(ms: number): Promise<unknown>;
|
|
|
74
100
|
|
|
75
101
|
declare const warnOnce: (message: string) => void;
|
|
76
102
|
|
|
103
|
+
/**
|
|
104
|
+
* Splits an array into smaller chunks of a given size.
|
|
105
|
+
* @param array The array to split
|
|
106
|
+
* @param size The size of each chunk
|
|
107
|
+
* @returns An array of arrays, where each sub-array has `size` elements from the original array.
|
|
108
|
+
*/
|
|
109
|
+
declare function chunk<T>(array: T[], size: number): T[][];
|
|
110
|
+
|
|
77
111
|
/**
|
|
78
112
|
* Returns a new array with unique values.
|
|
79
113
|
* @param array - The array to process.
|
|
@@ -117,4 +151,10 @@ interface JoinOptions {
|
|
|
117
151
|
*/
|
|
118
152
|
declare function join(array: JoinableValue[], options?: JoinOptions): string;
|
|
119
153
|
|
|
120
|
-
|
|
154
|
+
declare function omit<T, K extends keyof T>(object: T, ...keys: K[]): Omit<T, K>;
|
|
155
|
+
|
|
156
|
+
declare function pick<T, K extends keyof T>(object: T, keys: K[]): Pick<T, K>;
|
|
157
|
+
|
|
158
|
+
declare function hasOwnProperty<T, K extends keyof T>(object: T, key: K): boolean;
|
|
159
|
+
|
|
160
|
+
export { type AnyFn, type Arrayable, type Awaitable, type MayBe, NOOP, type Nullable, type Prettify, cAF, capitalize, chunk, clamp, days, getObjectType, hasOwnProperty, hours, isArray, isBoolean, isBrowser, isFunction, isInteger, isNativePromise, isNull, isNumber, isPromise, isString, isUndefined, join, minutes, noop, omit, pick, rAF, seconds, toArray, unique, uniqueBy, waitFor, warnOnce, weeks };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,23 @@
|
|
|
1
1
|
import { upperFirst } from 'scule';
|
|
2
2
|
export * from 'scule';
|
|
3
3
|
|
|
4
|
+
/**
|
|
5
|
+
* @file is utils
|
|
6
|
+
* @category is
|
|
7
|
+
* @copyright {@link https://github.com/sindresorhus/is}
|
|
8
|
+
*/
|
|
9
|
+
declare function getObjectType(value: unknown): string;
|
|
10
|
+
declare function isString(value: unknown): value is string;
|
|
11
|
+
declare function isNumber(value: unknown): value is number;
|
|
12
|
+
declare function isInteger(value: unknown): value is number;
|
|
13
|
+
declare function isBoolean(value: unknown): value is boolean;
|
|
14
|
+
declare function isFunction(value: unknown): value is Function;
|
|
15
|
+
declare function isArray(value: unknown): value is unknown[];
|
|
16
|
+
declare function isUndefined(value: unknown): value is undefined;
|
|
17
|
+
declare function isNull(value: unknown): value is null;
|
|
18
|
+
declare function isNativePromise<T = unknown>(value: unknown): value is Promise<T>;
|
|
19
|
+
declare function isPromise<T = unknown>(value: unknown): value is Promise<T>;
|
|
20
|
+
|
|
4
21
|
/**
|
|
5
22
|
* A function that does nothing.
|
|
6
23
|
*/
|
|
@@ -57,6 +74,15 @@ declare function hours(count: number): number;
|
|
|
57
74
|
declare function days(count: number): number;
|
|
58
75
|
declare function weeks(count: number): number;
|
|
59
76
|
|
|
77
|
+
/**
|
|
78
|
+
* Clamps a number between a minimum and maximum value
|
|
79
|
+
* @param value the value to clamp within the given range
|
|
80
|
+
* @param min the minimum value to clamp
|
|
81
|
+
* @param max the maximum value to clamp
|
|
82
|
+
* @returns the new value
|
|
83
|
+
*/
|
|
84
|
+
declare function clamp(value: number, min?: number, max?: number): number;
|
|
85
|
+
|
|
60
86
|
/**
|
|
61
87
|
* Wait for a number of milliseconds
|
|
62
88
|
*
|
|
@@ -74,6 +100,14 @@ declare function waitFor(ms: number): Promise<unknown>;
|
|
|
74
100
|
|
|
75
101
|
declare const warnOnce: (message: string) => void;
|
|
76
102
|
|
|
103
|
+
/**
|
|
104
|
+
* Splits an array into smaller chunks of a given size.
|
|
105
|
+
* @param array The array to split
|
|
106
|
+
* @param size The size of each chunk
|
|
107
|
+
* @returns An array of arrays, where each sub-array has `size` elements from the original array.
|
|
108
|
+
*/
|
|
109
|
+
declare function chunk<T>(array: T[], size: number): T[][];
|
|
110
|
+
|
|
77
111
|
/**
|
|
78
112
|
* Returns a new array with unique values.
|
|
79
113
|
* @param array - The array to process.
|
|
@@ -117,4 +151,10 @@ interface JoinOptions {
|
|
|
117
151
|
*/
|
|
118
152
|
declare function join(array: JoinableValue[], options?: JoinOptions): string;
|
|
119
153
|
|
|
120
|
-
|
|
154
|
+
declare function omit<T, K extends keyof T>(object: T, ...keys: K[]): Omit<T, K>;
|
|
155
|
+
|
|
156
|
+
declare function pick<T, K extends keyof T>(object: T, keys: K[]): Pick<T, K>;
|
|
157
|
+
|
|
158
|
+
declare function hasOwnProperty<T, K extends keyof T>(object: T, key: K): boolean;
|
|
159
|
+
|
|
160
|
+
export { type AnyFn, type Arrayable, type Awaitable, type MayBe, NOOP, type Nullable, type Prettify, cAF, capitalize, chunk, clamp, days, getObjectType, hasOwnProperty, hours, isArray, isBoolean, isBrowser, isFunction, isInteger, isNativePromise, isNull, isNumber, isPromise, isString, isUndefined, join, minutes, noop, omit, pick, rAF, seconds, toArray, unique, uniqueBy, waitFor, warnOnce, weeks };
|
package/dist/index.js
CHANGED
|
@@ -1,3 +1,41 @@
|
|
|
1
|
+
// src/is/index.ts
|
|
2
|
+
function getObjectType(value) {
|
|
3
|
+
return Object.prototype.toString.call(value).slice(8, -1);
|
|
4
|
+
}
|
|
5
|
+
function isString(value) {
|
|
6
|
+
return typeof value === "string";
|
|
7
|
+
}
|
|
8
|
+
function isNumber(value) {
|
|
9
|
+
return typeof value === "number";
|
|
10
|
+
}
|
|
11
|
+
function isInteger(value) {
|
|
12
|
+
return Number.isInteger(value);
|
|
13
|
+
}
|
|
14
|
+
function isBoolean(value) {
|
|
15
|
+
return typeof value === "boolean";
|
|
16
|
+
}
|
|
17
|
+
function isFunction(value) {
|
|
18
|
+
return typeof value === "function";
|
|
19
|
+
}
|
|
20
|
+
function isArray(value) {
|
|
21
|
+
return Array.isArray(value);
|
|
22
|
+
}
|
|
23
|
+
function isUndefined(value) {
|
|
24
|
+
return value === void 0;
|
|
25
|
+
}
|
|
26
|
+
function isNull(value) {
|
|
27
|
+
return value === null;
|
|
28
|
+
}
|
|
29
|
+
function isNativePromise(value) {
|
|
30
|
+
return getObjectType(value) === "Promise";
|
|
31
|
+
}
|
|
32
|
+
function hasPromiseApi(value) {
|
|
33
|
+
return isFunction(value?.then) && isFunction(value?.catch);
|
|
34
|
+
}
|
|
35
|
+
function isPromise(value) {
|
|
36
|
+
return isNativePromise(value) || hasPromiseApi(value);
|
|
37
|
+
}
|
|
38
|
+
|
|
1
39
|
// src/fn/noop.ts
|
|
2
40
|
var noop = () => {
|
|
3
41
|
};
|
|
@@ -130,6 +168,11 @@ function weeks(count) {
|
|
|
130
168
|
return count * ONE_WEEK;
|
|
131
169
|
}
|
|
132
170
|
|
|
171
|
+
// src/misc/clamp.ts
|
|
172
|
+
function clamp(value, min = Number.NEGATIVE_INFINITY, max = Number.POSITIVE_INFINITY) {
|
|
173
|
+
return Math.min(Math.max(value, min), max);
|
|
174
|
+
}
|
|
175
|
+
|
|
133
176
|
// src/misc/waitFor.ts
|
|
134
177
|
function waitFor(ms) {
|
|
135
178
|
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
@@ -145,6 +188,15 @@ var warnOnce = (message) => {
|
|
|
145
188
|
console.warn(message);
|
|
146
189
|
};
|
|
147
190
|
|
|
191
|
+
// src/array/chunk.ts
|
|
192
|
+
function chunk(array, size) {
|
|
193
|
+
const result = [];
|
|
194
|
+
for (let i = 0; i < array.length; i += size) {
|
|
195
|
+
result.push(array.slice(i, i + size));
|
|
196
|
+
}
|
|
197
|
+
return result;
|
|
198
|
+
}
|
|
199
|
+
|
|
148
200
|
// src/array/unique.ts
|
|
149
201
|
function unique(array) {
|
|
150
202
|
return Array.from(new Set(array));
|
|
@@ -171,22 +223,61 @@ function join(array, options = {}) {
|
|
|
171
223
|
if (!Array.isArray(array) || !array.length) return "";
|
|
172
224
|
return array.filter((v) => Boolean(v) || v === 0).join(separator);
|
|
173
225
|
}
|
|
226
|
+
|
|
227
|
+
// src/object/omit.ts
|
|
228
|
+
function omit(object, ...keys) {
|
|
229
|
+
keys.forEach((key) => delete object[key]);
|
|
230
|
+
return object;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
// src/object/hasOwnProperty.ts
|
|
234
|
+
function hasOwnProperty(object, key) {
|
|
235
|
+
return Object.prototype.hasOwnProperty.call(object, key);
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
// src/object/pick.ts
|
|
239
|
+
function pick(object, keys) {
|
|
240
|
+
return Object.assign(
|
|
241
|
+
{},
|
|
242
|
+
...keys.map((key) => {
|
|
243
|
+
if (object && hasOwnProperty(object, key)) {
|
|
244
|
+
return { [key]: object[key] };
|
|
245
|
+
}
|
|
246
|
+
})
|
|
247
|
+
);
|
|
248
|
+
}
|
|
174
249
|
export {
|
|
175
250
|
NOOP,
|
|
176
251
|
cAF,
|
|
177
252
|
camelCase,
|
|
178
253
|
capitalize,
|
|
254
|
+
chunk,
|
|
255
|
+
clamp,
|
|
179
256
|
days,
|
|
180
257
|
flatCase,
|
|
258
|
+
getObjectType,
|
|
259
|
+
hasOwnProperty,
|
|
181
260
|
hours,
|
|
261
|
+
isArray,
|
|
262
|
+
isBoolean,
|
|
182
263
|
isBrowser,
|
|
264
|
+
isFunction,
|
|
265
|
+
isInteger,
|
|
266
|
+
isNativePromise,
|
|
267
|
+
isNull,
|
|
268
|
+
isNumber,
|
|
269
|
+
isPromise,
|
|
270
|
+
isString,
|
|
271
|
+
isUndefined,
|
|
183
272
|
isUppercase,
|
|
184
273
|
join,
|
|
185
274
|
kebabCase,
|
|
186
275
|
lowerFirst,
|
|
187
276
|
minutes,
|
|
188
277
|
noop,
|
|
278
|
+
omit,
|
|
189
279
|
pascalCase,
|
|
280
|
+
pick,
|
|
190
281
|
rAF,
|
|
191
282
|
seconds,
|
|
192
283
|
snakeCase,
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ntnyq/utils",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.1.
|
|
4
|
+
"version": "0.1.3",
|
|
5
5
|
"description": "Common used utils.",
|
|
6
6
|
"keywords": [
|
|
7
7
|
"utils"
|
|
@@ -40,19 +40,19 @@
|
|
|
40
40
|
"scule": "^1.3.0"
|
|
41
41
|
},
|
|
42
42
|
"devDependencies": {
|
|
43
|
-
"@ntnyq/eslint-config": "^3.0.0-beta.
|
|
43
|
+
"@ntnyq/eslint-config": "^3.0.0-beta.19",
|
|
44
44
|
"@ntnyq/prettier-config": "^1.21.3",
|
|
45
|
-
"@vitest/coverage-v8": "^2.1.
|
|
46
|
-
"bumpp": "^9.
|
|
47
|
-
"eslint": "^9.
|
|
45
|
+
"@vitest/coverage-v8": "^2.1.2",
|
|
46
|
+
"bumpp": "^9.7.1",
|
|
47
|
+
"eslint": "^9.12.0",
|
|
48
48
|
"husky": "^9.1.6",
|
|
49
49
|
"nano-staged": "^0.8.0",
|
|
50
50
|
"npm-run-all2": "^6.2.3",
|
|
51
|
-
"pnpm": "^9.
|
|
51
|
+
"pnpm": "^9.12.1",
|
|
52
52
|
"prettier": "^3.3.3",
|
|
53
53
|
"tsup": "^8.3.0",
|
|
54
|
-
"typescript": "^5.6.
|
|
55
|
-
"vitest": "^2.1.
|
|
54
|
+
"typescript": "^5.6.3",
|
|
55
|
+
"vitest": "^2.1.2"
|
|
56
56
|
},
|
|
57
57
|
"engines": {
|
|
58
58
|
"node": ">=18.18.0"
|