bytekit 0.1.12
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/LICENSE +21 -0
- package/README.md +2241 -0
- package/bin/sutils.js +9 -0
- package/dist/api-client.d.ts +2 -0
- package/dist/api-client.d.ts.map +1 -0
- package/dist/api-client.js +2 -0
- package/dist/api-client.js.map +1 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +401 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/type-generator.d.ts +12 -0
- package/dist/cli/type-generator.d.ts.map +1 -0
- package/dist/cli/type-generator.js +152 -0
- package/dist/cli/type-generator.js.map +1 -0
- package/dist/date-utils.d.ts +2 -0
- package/dist/date-utils.d.ts.map +1 -0
- package/dist/date-utils.js +2 -0
- package/dist/date-utils.js.map +1 -0
- package/dist/debug.d.ts +2 -0
- package/dist/debug.d.ts.map +1 -0
- package/dist/debug.js +2 -0
- package/dist/debug.js.map +1 -0
- package/dist/env-manager.d.ts +2 -0
- package/dist/env-manager.d.ts.map +1 -0
- package/dist/env-manager.js +2 -0
- package/dist/env-manager.js.map +1 -0
- package/dist/file-upload.d.ts +2 -0
- package/dist/file-upload.d.ts.map +1 -0
- package/dist/file-upload.js +2 -0
- package/dist/file-upload.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +2 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +2 -0
- package/dist/logger.js.map +1 -0
- package/dist/profiler.d.ts +2 -0
- package/dist/profiler.d.ts.map +1 -0
- package/dist/profiler.js +2 -0
- package/dist/profiler.js.map +1 -0
- package/dist/response-validator.d.ts +2 -0
- package/dist/response-validator.d.ts.map +1 -0
- package/dist/response-validator.js +2 -0
- package/dist/response-validator.js.map +1 -0
- package/dist/retry-policy.d.ts +2 -0
- package/dist/retry-policy.d.ts.map +1 -0
- package/dist/retry-policy.js +2 -0
- package/dist/retry-policy.js.map +1 -0
- package/dist/storage-utils.d.ts +2 -0
- package/dist/storage-utils.d.ts.map +1 -0
- package/dist/storage-utils.js +2 -0
- package/dist/storage-utils.js.map +1 -0
- package/dist/streaming.d.ts +2 -0
- package/dist/streaming.d.ts.map +1 -0
- package/dist/streaming.js +2 -0
- package/dist/streaming.js.map +1 -0
- package/dist/string-utils.d.ts +2 -0
- package/dist/string-utils.d.ts.map +1 -0
- package/dist/string-utils.js +2 -0
- package/dist/string-utils.js.map +1 -0
- package/dist/utils/core/ApiClient.d.ts +94 -0
- package/dist/utils/core/ApiClient.d.ts.map +1 -0
- package/dist/utils/core/ApiClient.js +291 -0
- package/dist/utils/core/ApiClient.js.map +1 -0
- package/dist/utils/core/ErrorBoundary.d.ts +141 -0
- package/dist/utils/core/ErrorBoundary.d.ts.map +1 -0
- package/dist/utils/core/ErrorBoundary.js +322 -0
- package/dist/utils/core/ErrorBoundary.js.map +1 -0
- package/dist/utils/core/Logger.d.ts +39 -0
- package/dist/utils/core/Logger.d.ts.map +1 -0
- package/dist/utils/core/Logger.js +154 -0
- package/dist/utils/core/Logger.js.map +1 -0
- package/dist/utils/core/Profiler.d.ts +8 -0
- package/dist/utils/core/Profiler.d.ts.map +1 -0
- package/dist/utils/core/Profiler.js +18 -0
- package/dist/utils/core/Profiler.js.map +1 -0
- package/dist/utils/core/RateLimiter.d.ts +74 -0
- package/dist/utils/core/RateLimiter.d.ts.map +1 -0
- package/dist/utils/core/RateLimiter.js +170 -0
- package/dist/utils/core/RateLimiter.js.map +1 -0
- package/dist/utils/core/RequestCache.d.ts +64 -0
- package/dist/utils/core/RequestCache.d.ts.map +1 -0
- package/dist/utils/core/RequestCache.js +139 -0
- package/dist/utils/core/RequestCache.js.map +1 -0
- package/dist/utils/core/RequestDeduplicator.d.ts +41 -0
- package/dist/utils/core/RequestDeduplicator.d.ts.map +1 -0
- package/dist/utils/core/RequestDeduplicator.js +83 -0
- package/dist/utils/core/RequestDeduplicator.js.map +1 -0
- package/dist/utils/core/ResponseValidator.d.ts +26 -0
- package/dist/utils/core/ResponseValidator.d.ts.map +1 -0
- package/dist/utils/core/ResponseValidator.js +140 -0
- package/dist/utils/core/ResponseValidator.js.map +1 -0
- package/dist/utils/core/RetryPolicy.d.ts +43 -0
- package/dist/utils/core/RetryPolicy.d.ts.map +1 -0
- package/dist/utils/core/RetryPolicy.js +119 -0
- package/dist/utils/core/RetryPolicy.js.map +1 -0
- package/dist/utils/core/debug.d.ts +46 -0
- package/dist/utils/core/debug.d.ts.map +1 -0
- package/dist/utils/core/debug.js +83 -0
- package/dist/utils/core/debug.js.map +1 -0
- package/dist/utils/core/index.d.ts +11 -0
- package/dist/utils/core/index.d.ts.map +1 -0
- package/dist/utils/core/index.js +11 -0
- package/dist/utils/core/index.js.map +1 -0
- package/dist/utils/helpers/ArrayUtils.d.ts +134 -0
- package/dist/utils/helpers/ArrayUtils.d.ts.map +1 -0
- package/dist/utils/helpers/ArrayUtils.js +301 -0
- package/dist/utils/helpers/ArrayUtils.js.map +1 -0
- package/dist/utils/helpers/CacheManager.d.ts +67 -0
- package/dist/utils/helpers/CacheManager.d.ts.map +1 -0
- package/dist/utils/helpers/CacheManager.js +222 -0
- package/dist/utils/helpers/CacheManager.js.map +1 -0
- package/dist/utils/helpers/CompressionUtils.d.ts +80 -0
- package/dist/utils/helpers/CompressionUtils.d.ts.map +1 -0
- package/dist/utils/helpers/CompressionUtils.js +224 -0
- package/dist/utils/helpers/CompressionUtils.js.map +1 -0
- package/dist/utils/helpers/CryptoUtils.d.ts +70 -0
- package/dist/utils/helpers/CryptoUtils.d.ts.map +1 -0
- package/dist/utils/helpers/CryptoUtils.js +215 -0
- package/dist/utils/helpers/CryptoUtils.js.map +1 -0
- package/dist/utils/helpers/DateUtils.d.ts +31 -0
- package/dist/utils/helpers/DateUtils.d.ts.map +1 -0
- package/dist/utils/helpers/DateUtils.js +104 -0
- package/dist/utils/helpers/DateUtils.js.map +1 -0
- package/dist/utils/helpers/DiffUtils.d.ts +61 -0
- package/dist/utils/helpers/DiffUtils.d.ts.map +1 -0
- package/dist/utils/helpers/DiffUtils.js +249 -0
- package/dist/utils/helpers/DiffUtils.js.map +1 -0
- package/dist/utils/helpers/EnvManager.d.ts +7 -0
- package/dist/utils/helpers/EnvManager.d.ts.map +1 -0
- package/dist/utils/helpers/EnvManager.js +19 -0
- package/dist/utils/helpers/EnvManager.js.map +1 -0
- package/dist/utils/helpers/EventEmitter.d.ts +78 -0
- package/dist/utils/helpers/EventEmitter.d.ts.map +1 -0
- package/dist/utils/helpers/EventEmitter.js +208 -0
- package/dist/utils/helpers/EventEmitter.js.map +1 -0
- package/dist/utils/helpers/FileUploadHelper.d.ts +44 -0
- package/dist/utils/helpers/FileUploadHelper.d.ts.map +1 -0
- package/dist/utils/helpers/FileUploadHelper.js +127 -0
- package/dist/utils/helpers/FileUploadHelper.js.map +1 -0
- package/dist/utils/helpers/FormUtils.d.ts +162 -0
- package/dist/utils/helpers/FormUtils.d.ts.map +1 -0
- package/dist/utils/helpers/FormUtils.js +378 -0
- package/dist/utils/helpers/FormUtils.js.map +1 -0
- package/dist/utils/helpers/ObjectUtils.d.ts +102 -0
- package/dist/utils/helpers/ObjectUtils.d.ts.map +1 -0
- package/dist/utils/helpers/ObjectUtils.js +297 -0
- package/dist/utils/helpers/ObjectUtils.js.map +1 -0
- package/dist/utils/helpers/PaginationHelper.d.ts +127 -0
- package/dist/utils/helpers/PaginationHelper.d.ts.map +1 -0
- package/dist/utils/helpers/PaginationHelper.js +259 -0
- package/dist/utils/helpers/PaginationHelper.js.map +1 -0
- package/dist/utils/helpers/PollingHelper.d.ts +64 -0
- package/dist/utils/helpers/PollingHelper.d.ts.map +1 -0
- package/dist/utils/helpers/PollingHelper.js +131 -0
- package/dist/utils/helpers/PollingHelper.js.map +1 -0
- package/dist/utils/helpers/StorageUtils.d.ts +9 -0
- package/dist/utils/helpers/StorageUtils.d.ts.map +1 -0
- package/dist/utils/helpers/StorageUtils.js +33 -0
- package/dist/utils/helpers/StorageUtils.js.map +1 -0
- package/dist/utils/helpers/StreamingHelper.d.ts +35 -0
- package/dist/utils/helpers/StreamingHelper.d.ts.map +1 -0
- package/dist/utils/helpers/StreamingHelper.js +167 -0
- package/dist/utils/helpers/StreamingHelper.js.map +1 -0
- package/dist/utils/helpers/StringUtils.d.ts +42 -0
- package/dist/utils/helpers/StringUtils.d.ts.map +1 -0
- package/dist/utils/helpers/StringUtils.js +173 -0
- package/dist/utils/helpers/StringUtils.js.map +1 -0
- package/dist/utils/helpers/TimeUtils.d.ts +87 -0
- package/dist/utils/helpers/TimeUtils.d.ts.map +1 -0
- package/dist/utils/helpers/TimeUtils.js +234 -0
- package/dist/utils/helpers/TimeUtils.js.map +1 -0
- package/dist/utils/helpers/Validator.d.ts +31 -0
- package/dist/utils/helpers/Validator.d.ts.map +1 -0
- package/dist/utils/helpers/Validator.js +156 -0
- package/dist/utils/helpers/Validator.js.map +1 -0
- package/dist/utils/helpers/WebSocketHelper.d.ts +63 -0
- package/dist/utils/helpers/WebSocketHelper.d.ts.map +1 -0
- package/dist/utils/helpers/WebSocketHelper.js +200 -0
- package/dist/utils/helpers/WebSocketHelper.js.map +1 -0
- package/dist/utils/helpers/index.d.ts +20 -0
- package/dist/utils/helpers/index.d.ts.map +1 -0
- package/dist/utils/helpers/index.js +20 -0
- package/dist/utils/helpers/index.js.map +1 -0
- package/dist/utils/index.d.ts +21 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +21 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/validator.d.ts +2 -0
- package/dist/validator.d.ts.map +1 -0
- package/dist/validator.js +2 -0
- package/dist/validator.js.map +1 -0
- package/dist/websocket.d.ts +2 -0
- package/dist/websocket.d.ts.map +1 -0
- package/dist/websocket.js +2 -0
- package/dist/websocket.js.map +1 -0
- package/package.json +189 -0
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export interface ValidationSchema {
|
|
2
|
+
type?: "object" | "array" | "string" | "number" | "boolean";
|
|
3
|
+
required?: boolean;
|
|
4
|
+
properties?: Record<string, ValidationSchema>;
|
|
5
|
+
items?: ValidationSchema;
|
|
6
|
+
minLength?: number;
|
|
7
|
+
maxLength?: number;
|
|
8
|
+
minimum?: number;
|
|
9
|
+
maximum?: number;
|
|
10
|
+
pattern?: RegExp | string;
|
|
11
|
+
enum?: unknown[];
|
|
12
|
+
custom?: (value: unknown) => boolean | string;
|
|
13
|
+
}
|
|
14
|
+
export interface ValidationError {
|
|
15
|
+
path: string;
|
|
16
|
+
message: string;
|
|
17
|
+
value?: unknown;
|
|
18
|
+
}
|
|
19
|
+
export declare class ResponseValidator {
|
|
20
|
+
static validate(data: unknown, schema: ValidationSchema, path?: string): ValidationError[];
|
|
21
|
+
private static validateObject;
|
|
22
|
+
private static validateArray;
|
|
23
|
+
private static validateString;
|
|
24
|
+
private static validateNumber;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=ResponseValidator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ResponseValidator.d.ts","sourceRoot":"","sources":["../../../src/utils/core/ResponseValidator.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB;IAC7B,IAAI,CAAC,EAAE,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;IAC5D,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IAC9C,KAAK,CAAC,EAAE,gBAAgB,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC1B,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC;IACjB,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,GAAG,MAAM,CAAC;CACjD;AAED,MAAM,WAAW,eAAe;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,qBAAa,iBAAiB;IAC1B,MAAM,CAAC,QAAQ,CACX,IAAI,EAAE,OAAO,EACb,MAAM,EAAE,gBAAgB,EACxB,IAAI,SAAS,GACd,eAAe,EAAE;IA0DpB,OAAO,CAAC,MAAM,CAAC,cAAc;IAkB7B,OAAO,CAAC,MAAM,CAAC,aAAa;IAiB5B,OAAO,CAAC,MAAM,CAAC,cAAc;IAgD7B,OAAO,CAAC,MAAM,CAAC,cAAc;CAiChC"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
export class ResponseValidator {
|
|
2
|
+
static validate(data, schema, path = "root") {
|
|
3
|
+
const errors = [];
|
|
4
|
+
// Check required
|
|
5
|
+
if (schema.required && (data === null || data === undefined)) {
|
|
6
|
+
errors.push({
|
|
7
|
+
path,
|
|
8
|
+
message: "Value is required",
|
|
9
|
+
value: data,
|
|
10
|
+
});
|
|
11
|
+
return errors;
|
|
12
|
+
}
|
|
13
|
+
if (data === null || data === undefined) {
|
|
14
|
+
return errors;
|
|
15
|
+
}
|
|
16
|
+
// Check type
|
|
17
|
+
if (schema.type) {
|
|
18
|
+
const actualType = Array.isArray(data)
|
|
19
|
+
? "array"
|
|
20
|
+
: typeof data;
|
|
21
|
+
if (actualType !== schema.type) {
|
|
22
|
+
errors.push({
|
|
23
|
+
path,
|
|
24
|
+
message: `Expected type ${schema.type}, got ${actualType}`,
|
|
25
|
+
value: data,
|
|
26
|
+
});
|
|
27
|
+
return errors;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
// Validate based on type
|
|
31
|
+
if (schema.type === "object" && typeof data === "object" && !Array.isArray(data)) {
|
|
32
|
+
errors.push(...this.validateObject(data, schema, path));
|
|
33
|
+
}
|
|
34
|
+
else if (schema.type === "array" && Array.isArray(data)) {
|
|
35
|
+
errors.push(...this.validateArray(data, schema, path));
|
|
36
|
+
}
|
|
37
|
+
else if (schema.type === "string" && typeof data === "string") {
|
|
38
|
+
errors.push(...this.validateString(data, schema, path));
|
|
39
|
+
}
|
|
40
|
+
else if (schema.type === "number" && typeof data === "number") {
|
|
41
|
+
errors.push(...this.validateNumber(data, schema, path));
|
|
42
|
+
}
|
|
43
|
+
// Custom validation
|
|
44
|
+
if (schema.custom) {
|
|
45
|
+
const result = schema.custom(data);
|
|
46
|
+
if (result !== true) {
|
|
47
|
+
errors.push({
|
|
48
|
+
path,
|
|
49
|
+
message: typeof result === "string" ? result : "Custom validation failed",
|
|
50
|
+
value: data,
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return errors;
|
|
55
|
+
}
|
|
56
|
+
static validateObject(obj, schema, path) {
|
|
57
|
+
const errors = [];
|
|
58
|
+
if (schema.properties) {
|
|
59
|
+
for (const [key, propSchema] of Object.entries(schema.properties)) {
|
|
60
|
+
const value = obj[key];
|
|
61
|
+
const propPath = `${path}.${key}`;
|
|
62
|
+
errors.push(...this.validate(value, propSchema, propPath));
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return errors;
|
|
66
|
+
}
|
|
67
|
+
static validateArray(arr, schema, path) {
|
|
68
|
+
const errors = [];
|
|
69
|
+
if (schema.items) {
|
|
70
|
+
arr.forEach((item, index) => {
|
|
71
|
+
const itemPath = `${path}[${index}]`;
|
|
72
|
+
errors.push(...this.validate(item, schema.items, itemPath));
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
return errors;
|
|
76
|
+
}
|
|
77
|
+
static validateString(str, schema, path) {
|
|
78
|
+
const errors = [];
|
|
79
|
+
if (schema.minLength !== undefined && str.length < schema.minLength) {
|
|
80
|
+
errors.push({
|
|
81
|
+
path,
|
|
82
|
+
message: `String length must be at least ${schema.minLength}`,
|
|
83
|
+
value: str,
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
if (schema.maxLength !== undefined && str.length > schema.maxLength) {
|
|
87
|
+
errors.push({
|
|
88
|
+
path,
|
|
89
|
+
message: `String length must be at most ${schema.maxLength}`,
|
|
90
|
+
value: str,
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
if (schema.pattern) {
|
|
94
|
+
const regex = schema.pattern instanceof RegExp
|
|
95
|
+
? schema.pattern
|
|
96
|
+
: new RegExp(schema.pattern);
|
|
97
|
+
if (!regex.test(str)) {
|
|
98
|
+
errors.push({
|
|
99
|
+
path,
|
|
100
|
+
message: `String does not match pattern ${schema.pattern}`,
|
|
101
|
+
value: str,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
if (schema.enum && !schema.enum.includes(str)) {
|
|
106
|
+
errors.push({
|
|
107
|
+
path,
|
|
108
|
+
message: `Value must be one of: ${schema.enum.join(", ")}`,
|
|
109
|
+
value: str,
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
return errors;
|
|
113
|
+
}
|
|
114
|
+
static validateNumber(num, schema, path) {
|
|
115
|
+
const errors = [];
|
|
116
|
+
if (schema.minimum !== undefined && num < schema.minimum) {
|
|
117
|
+
errors.push({
|
|
118
|
+
path,
|
|
119
|
+
message: `Number must be at least ${schema.minimum}`,
|
|
120
|
+
value: num,
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
if (schema.maximum !== undefined && num > schema.maximum) {
|
|
124
|
+
errors.push({
|
|
125
|
+
path,
|
|
126
|
+
message: `Number must be at most ${schema.maximum}`,
|
|
127
|
+
value: num,
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
if (schema.enum && !schema.enum.includes(num)) {
|
|
131
|
+
errors.push({
|
|
132
|
+
path,
|
|
133
|
+
message: `Value must be one of: ${schema.enum.join(", ")}`,
|
|
134
|
+
value: num,
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
return errors;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=ResponseValidator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ResponseValidator.js","sourceRoot":"","sources":["../../../src/utils/core/ResponseValidator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
export interface RetryConfig {
|
|
2
|
+
maxAttempts?: number;
|
|
3
|
+
initialDelayMs?: number;
|
|
4
|
+
maxDelayMs?: number;
|
|
5
|
+
backoffMultiplier?: number;
|
|
6
|
+
shouldRetry?: (error: Error, attempt: number) => boolean;
|
|
7
|
+
}
|
|
8
|
+
export interface CircuitBreakerConfig {
|
|
9
|
+
failureThreshold?: number;
|
|
10
|
+
successThreshold?: number;
|
|
11
|
+
timeoutMs?: number;
|
|
12
|
+
}
|
|
13
|
+
export type CircuitBreakerState = "closed" | "open" | "half-open";
|
|
14
|
+
export declare class CircuitBreaker {
|
|
15
|
+
private state;
|
|
16
|
+
private failureCount;
|
|
17
|
+
private successCount;
|
|
18
|
+
private lastFailureTime?;
|
|
19
|
+
private readonly failureThreshold;
|
|
20
|
+
private readonly successThreshold;
|
|
21
|
+
private readonly timeoutMs;
|
|
22
|
+
constructor(config?: CircuitBreakerConfig);
|
|
23
|
+
execute<T>(fn: () => Promise<T>): Promise<T>;
|
|
24
|
+
private onSuccess;
|
|
25
|
+
private onFailure;
|
|
26
|
+
private shouldAttemptReset;
|
|
27
|
+
private getRetryAfterMs;
|
|
28
|
+
getState(): CircuitBreakerState;
|
|
29
|
+
reset(): void;
|
|
30
|
+
}
|
|
31
|
+
export declare class RetryPolicy {
|
|
32
|
+
private readonly maxAttempts;
|
|
33
|
+
private readonly initialDelayMs;
|
|
34
|
+
private readonly maxDelayMs;
|
|
35
|
+
private readonly backoffMultiplier;
|
|
36
|
+
private readonly shouldRetry;
|
|
37
|
+
constructor(config?: RetryConfig);
|
|
38
|
+
execute<T>(fn: () => Promise<T>): Promise<T>;
|
|
39
|
+
private calculateDelay;
|
|
40
|
+
private sleep;
|
|
41
|
+
private isRetryableError;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=RetryPolicy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RetryPolicy.d.ts","sourceRoot":"","sources":["../../../src/utils/core/RetryPolicy.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC;CAC5D;AAED,MAAM,WAAW,oBAAoB;IACjC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,MAAM,mBAAmB,GAAG,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;AAElE,qBAAa,cAAc;IACvB,OAAO,CAAC,KAAK,CAAiC;IAC9C,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,eAAe,CAAC,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEvB,MAAM,GAAE,oBAAyB;IAMvC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAqBlD,OAAO,CAAC,SAAS;IAYjB,OAAO,CAAC,SAAS;IAUjB,OAAO,CAAC,kBAAkB;IAO1B,OAAO,CAAC,eAAe;IAMvB,QAAQ,IAAI,mBAAmB;IAI/B,KAAK,IAAI,IAAI;CAMhB;AAED,qBAAa,WAAW;IACpB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAS;IAC3C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA6C;gBAE7D,MAAM,GAAE,WAAgB;IAS9B,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAqBlD,OAAO,CAAC,cAAc;IAOtB,OAAO,CAAC,KAAK;IAIb,OAAO,CAAC,gBAAgB;CAU3B"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
export class CircuitBreaker {
|
|
2
|
+
state = "closed";
|
|
3
|
+
failureCount = 0;
|
|
4
|
+
successCount = 0;
|
|
5
|
+
lastFailureTime;
|
|
6
|
+
failureThreshold;
|
|
7
|
+
successThreshold;
|
|
8
|
+
timeoutMs;
|
|
9
|
+
constructor(config = {}) {
|
|
10
|
+
this.failureThreshold = config.failureThreshold ?? 5;
|
|
11
|
+
this.successThreshold = config.successThreshold ?? 2;
|
|
12
|
+
this.timeoutMs = config.timeoutMs ?? 60000;
|
|
13
|
+
}
|
|
14
|
+
async execute(fn) {
|
|
15
|
+
if (this.state === "open") {
|
|
16
|
+
if (this.shouldAttemptReset()) {
|
|
17
|
+
this.state = "half-open";
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
throw new Error(`Circuit breaker is open. Retry after ${this.getRetryAfterMs()}ms`);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
try {
|
|
24
|
+
const result = await fn();
|
|
25
|
+
this.onSuccess();
|
|
26
|
+
return result;
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
this.onFailure();
|
|
30
|
+
throw error;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
onSuccess() {
|
|
34
|
+
this.failureCount = 0;
|
|
35
|
+
if (this.state === "half-open") {
|
|
36
|
+
this.successCount++;
|
|
37
|
+
if (this.successCount >= this.successThreshold) {
|
|
38
|
+
this.state = "closed";
|
|
39
|
+
this.successCount = 0;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
onFailure() {
|
|
44
|
+
this.lastFailureTime = Date.now();
|
|
45
|
+
this.failureCount++;
|
|
46
|
+
this.successCount = 0;
|
|
47
|
+
if (this.failureCount >= this.failureThreshold) {
|
|
48
|
+
this.state = "open";
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
shouldAttemptReset() {
|
|
52
|
+
return (this.lastFailureTime !== undefined &&
|
|
53
|
+
Date.now() - this.lastFailureTime >= this.timeoutMs);
|
|
54
|
+
}
|
|
55
|
+
getRetryAfterMs() {
|
|
56
|
+
if (this.lastFailureTime === undefined)
|
|
57
|
+
return 0;
|
|
58
|
+
const elapsed = Date.now() - this.lastFailureTime;
|
|
59
|
+
return Math.max(0, this.timeoutMs - elapsed);
|
|
60
|
+
}
|
|
61
|
+
getState() {
|
|
62
|
+
return this.state;
|
|
63
|
+
}
|
|
64
|
+
reset() {
|
|
65
|
+
this.state = "closed";
|
|
66
|
+
this.failureCount = 0;
|
|
67
|
+
this.successCount = 0;
|
|
68
|
+
this.lastFailureTime = undefined;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
export class RetryPolicy {
|
|
72
|
+
maxAttempts;
|
|
73
|
+
initialDelayMs;
|
|
74
|
+
maxDelayMs;
|
|
75
|
+
backoffMultiplier;
|
|
76
|
+
shouldRetry;
|
|
77
|
+
constructor(config = {}) {
|
|
78
|
+
this.maxAttempts = config.maxAttempts ?? 3;
|
|
79
|
+
this.initialDelayMs = config.initialDelayMs ?? 100;
|
|
80
|
+
this.maxDelayMs = config.maxDelayMs ?? 10000;
|
|
81
|
+
this.backoffMultiplier = config.backoffMultiplier ?? 2;
|
|
82
|
+
this.shouldRetry =
|
|
83
|
+
config.shouldRetry ?? ((error) => this.isRetryableError(error));
|
|
84
|
+
}
|
|
85
|
+
async execute(fn) {
|
|
86
|
+
let lastError;
|
|
87
|
+
for (let attempt = 1; attempt <= this.maxAttempts; attempt++) {
|
|
88
|
+
try {
|
|
89
|
+
return await fn();
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
lastError = error instanceof Error ? error : new Error(String(error));
|
|
93
|
+
if (attempt === this.maxAttempts || !this.shouldRetry(lastError, attempt)) {
|
|
94
|
+
throw lastError;
|
|
95
|
+
}
|
|
96
|
+
const delayMs = this.calculateDelay(attempt);
|
|
97
|
+
await this.sleep(delayMs);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
throw lastError ?? new Error("Retry policy failed");
|
|
101
|
+
}
|
|
102
|
+
calculateDelay(attempt) {
|
|
103
|
+
const exponentialDelay = this.initialDelayMs * Math.pow(this.backoffMultiplier, attempt - 1);
|
|
104
|
+
const jitter = Math.random() * 0.1 * exponentialDelay;
|
|
105
|
+
return Math.min(exponentialDelay + jitter, this.maxDelayMs);
|
|
106
|
+
}
|
|
107
|
+
sleep(ms) {
|
|
108
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
109
|
+
}
|
|
110
|
+
isRetryableError(error) {
|
|
111
|
+
// Retry on network errors, timeouts, and 5xx errors
|
|
112
|
+
const message = error.message.toLowerCase();
|
|
113
|
+
return (message.includes("timeout") ||
|
|
114
|
+
message.includes("network") ||
|
|
115
|
+
message.includes("econnrefused") ||
|
|
116
|
+
message.includes("econnreset"));
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=RetryPolicy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RetryPolicy.js","sourceRoot":"","sources":["../../../src/utils/core/RetryPolicy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { Logger } from "./Logger.js";
|
|
2
|
+
/**
|
|
3
|
+
* Opciones configurables para medir tiempos de ejecución.
|
|
4
|
+
*/
|
|
5
|
+
export interface StopwatchOptions {
|
|
6
|
+
label?: string;
|
|
7
|
+
logger?: Logger;
|
|
8
|
+
precision?: number;
|
|
9
|
+
autoLog?: boolean;
|
|
10
|
+
namespace?: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Representa un cronómetro utilitario.
|
|
14
|
+
*/
|
|
15
|
+
export interface Stopwatch {
|
|
16
|
+
stop: () => number;
|
|
17
|
+
elapsed: () => number;
|
|
18
|
+
log: (context?: Record<string, unknown>) => number;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Crea un cronómetro para medir duración de operaciones.
|
|
22
|
+
*/
|
|
23
|
+
export declare const createStopwatch: ({ label, logger, precision, autoLog, namespace, }?: StopwatchOptions) => Stopwatch;
|
|
24
|
+
/**
|
|
25
|
+
* Ejecuta una función (sync o async) midiendo su tiempo total.
|
|
26
|
+
*/
|
|
27
|
+
export declare const withTiming: <T>(label: string, fn: () => Promise<T> | T, options?: StopwatchOptions) => Promise<T>;
|
|
28
|
+
/**
|
|
29
|
+
* Versión síncrona de withTiming para funciones normales.
|
|
30
|
+
*/
|
|
31
|
+
export declare const measureSync: <T>(label: string, fn: () => T, options?: StopwatchOptions) => T;
|
|
32
|
+
/**
|
|
33
|
+
* Versión asíncrona de withTiming con resultado enriquecido.
|
|
34
|
+
*/
|
|
35
|
+
export declare const measureAsync: <T>(label: string, fn: () => Promise<T> | T, options?: StopwatchOptions) => Promise<{
|
|
36
|
+
result: T;
|
|
37
|
+
durationMs: number;
|
|
38
|
+
}>;
|
|
39
|
+
/**
|
|
40
|
+
* Captura una función sin logger, útil para medir internamente y devolver datos crudos.
|
|
41
|
+
*/
|
|
42
|
+
export declare const captureDebug: <T>(fn: () => Promise<T> | T) => Promise<{
|
|
43
|
+
result: T;
|
|
44
|
+
durationMs: number;
|
|
45
|
+
}>;
|
|
46
|
+
//# sourceMappingURL=debug.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"debug.d.ts","sourceRoot":"","sources":["../../../src/utils/core/debug.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAUrC;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACtB,IAAI,EAAE,MAAM,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,MAAM,CAAC;IACtB,GAAG,EAAE,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,MAAM,CAAC;CACtD;AAED;;GAEG;AACH,eAAO,MAAM,eAAe,GAAI,oDAM7B,gBAAqB,KAAG,SA6B1B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,UAAU,GAAU,CAAC,EAC9B,OAAO,MAAM,EACb,IAAI,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,EACxB,UAAS,gBAAqB,KAC/B,OAAO,CAAC,CAAC,CAOX,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,WAAW,GAAI,CAAC,EACzB,OAAO,MAAM,EACb,IAAI,MAAM,CAAC,EACX,UAAS,gBAAqB,KAC/B,CAOF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,YAAY,GAAU,CAAC,EAChC,OAAO,MAAM,EACb,IAAI,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,EACxB,UAAS,gBAAqB,KAC/B,OAAO,CAAC;IAAE,MAAM,EAAE,CAAC,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAiB3C,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,YAAY,GAAU,CAAC,EAChC,IAAI,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,KACzB,OAAO,CAAC;IAAE,MAAM,EAAE,CAAC,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAK3C,CAAC"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Obtiene el timestamp actual con la mejor precisión disponible (browser o Node).
|
|
3
|
+
*/
|
|
4
|
+
const now = () => typeof performance !== "undefined" && typeof performance.now === "function"
|
|
5
|
+
? performance.now()
|
|
6
|
+
: Date.now();
|
|
7
|
+
/**
|
|
8
|
+
* Crea un cronómetro para medir duración de operaciones.
|
|
9
|
+
*/
|
|
10
|
+
export const createStopwatch = ({ label = "stopwatch", logger, precision = 2, autoLog = false, namespace, } = {}) => {
|
|
11
|
+
const start = now();
|
|
12
|
+
const logInstance = namespace && logger ? logger.child(namespace) : logger;
|
|
13
|
+
const elapsed = () => now() - start;
|
|
14
|
+
const stop = () => {
|
|
15
|
+
const duration = elapsed();
|
|
16
|
+
if (autoLog && logInstance) {
|
|
17
|
+
logInstance.debug(`${label} took ${duration.toFixed(precision)}ms`, {
|
|
18
|
+
duration,
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
return duration;
|
|
22
|
+
};
|
|
23
|
+
const log = (context) => {
|
|
24
|
+
const duration = stop();
|
|
25
|
+
logInstance?.debug(`${label} took ${duration.toFixed(precision)}ms`, {
|
|
26
|
+
...context,
|
|
27
|
+
duration,
|
|
28
|
+
});
|
|
29
|
+
return duration;
|
|
30
|
+
};
|
|
31
|
+
return { stop, elapsed, log };
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* Ejecuta una función (sync o async) midiendo su tiempo total.
|
|
35
|
+
*/
|
|
36
|
+
export const withTiming = async (label, fn, options = {}) => {
|
|
37
|
+
const stopwatch = createStopwatch({ ...options, label });
|
|
38
|
+
try {
|
|
39
|
+
return await fn();
|
|
40
|
+
}
|
|
41
|
+
finally {
|
|
42
|
+
stopwatch.log();
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
/**
|
|
46
|
+
* Versión síncrona de withTiming para funciones normales.
|
|
47
|
+
*/
|
|
48
|
+
export const measureSync = (label, fn, options = {}) => {
|
|
49
|
+
const stopwatch = createStopwatch({ ...options, label });
|
|
50
|
+
try {
|
|
51
|
+
return fn();
|
|
52
|
+
}
|
|
53
|
+
finally {
|
|
54
|
+
stopwatch.log();
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
/**
|
|
58
|
+
* Versión asíncrona de withTiming con resultado enriquecido.
|
|
59
|
+
*/
|
|
60
|
+
export const measureAsync = async (label, fn, options = {}) => {
|
|
61
|
+
const stopwatch = createStopwatch({ ...options, label });
|
|
62
|
+
const result = await fn();
|
|
63
|
+
const durationMs = stopwatch.stop();
|
|
64
|
+
if (options.logger) {
|
|
65
|
+
const logInstance = options.namespace && options.logger
|
|
66
|
+
? options.logger.child(options.namespace)
|
|
67
|
+
: options.logger;
|
|
68
|
+
logInstance.debug(`${label} completed in ${durationMs.toFixed(2)}ms`, {
|
|
69
|
+
durationMs,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
return { result, durationMs };
|
|
73
|
+
};
|
|
74
|
+
/**
|
|
75
|
+
* Captura una función sin logger, útil para medir internamente y devolver datos crudos.
|
|
76
|
+
*/
|
|
77
|
+
export const captureDebug = async (fn) => {
|
|
78
|
+
const start = now();
|
|
79
|
+
const result = await fn();
|
|
80
|
+
const durationMs = now() - start;
|
|
81
|
+
return { result, durationMs };
|
|
82
|
+
};
|
|
83
|
+
//# sourceMappingURL=debug.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"debug.js","sourceRoot":"","sources":["../../../src/utils/core/debug.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export * from "#core/ApiClient.js";
|
|
2
|
+
export * from "#core/Logger.js";
|
|
3
|
+
export * from "#core/Profiler.js";
|
|
4
|
+
export * from "#core/debug.js";
|
|
5
|
+
export * from "#core/RetryPolicy.js";
|
|
6
|
+
export * from "#core/ResponseValidator.js";
|
|
7
|
+
export * from "#core/RequestCache.js";
|
|
8
|
+
export * from "#core/RateLimiter.js";
|
|
9
|
+
export * from "#core/RequestDeduplicator.js";
|
|
10
|
+
export * from "#core/ErrorBoundary.js";
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utils/core/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,sBAAsB,CAAC;AACrC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export * from "#core/ApiClient.js";
|
|
2
|
+
export * from "#core/Logger.js";
|
|
3
|
+
export * from "#core/Profiler.js";
|
|
4
|
+
export * from "#core/debug.js";
|
|
5
|
+
export * from "#core/RetryPolicy.js";
|
|
6
|
+
export * from "#core/ResponseValidator.js";
|
|
7
|
+
export * from "#core/RequestCache.js";
|
|
8
|
+
export * from "#core/RateLimiter.js";
|
|
9
|
+
export * from "#core/RequestDeduplicator.js";
|
|
10
|
+
export * from "#core/ErrorBoundary.js";
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/utils/core/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,sBAAsB,CAAC;AACrC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Array manipulation utilities for everyday development tasks
|
|
3
|
+
*/
|
|
4
|
+
export declare class ArrayUtils {
|
|
5
|
+
/**
|
|
6
|
+
* Split array into chunks of specified size
|
|
7
|
+
*/
|
|
8
|
+
static chunk<T>(arr: T[], size: number): T[][];
|
|
9
|
+
/**
|
|
10
|
+
* Flatten nested arrays
|
|
11
|
+
*/
|
|
12
|
+
static flatten<T>(arr: Array<T | T[]>, depth?: number): T[];
|
|
13
|
+
/**
|
|
14
|
+
* Get unique values from array
|
|
15
|
+
*/
|
|
16
|
+
static unique<T>(arr: T[], by?: (item: T) => unknown): T[];
|
|
17
|
+
/**
|
|
18
|
+
* Remove duplicates and return unique array
|
|
19
|
+
*/
|
|
20
|
+
static deduplicate<T>(arr: T[]): T[];
|
|
21
|
+
/**
|
|
22
|
+
* Compact array (remove falsy values)
|
|
23
|
+
*/
|
|
24
|
+
static compact<T>(arr: Array<T | null | undefined | false | 0 | "">): T[];
|
|
25
|
+
/**
|
|
26
|
+
* Flatten one level deep
|
|
27
|
+
*/
|
|
28
|
+
static flat<T>(arr: Array<T | T[]>): T[];
|
|
29
|
+
/**
|
|
30
|
+
* Get first element
|
|
31
|
+
*/
|
|
32
|
+
static first<T>(arr: T[]): T | undefined;
|
|
33
|
+
/**
|
|
34
|
+
* Get last element
|
|
35
|
+
*/
|
|
36
|
+
static last<T>(arr: T[]): T | undefined;
|
|
37
|
+
/**
|
|
38
|
+
* Get element at index (supports negative indices)
|
|
39
|
+
*/
|
|
40
|
+
static at<T>(arr: T[], index: number): T | undefined;
|
|
41
|
+
/**
|
|
42
|
+
* Shuffle array (Fisher-Yates)
|
|
43
|
+
*/
|
|
44
|
+
static shuffle<T>(arr: T[]): T[];
|
|
45
|
+
/**
|
|
46
|
+
* Get random element
|
|
47
|
+
*/
|
|
48
|
+
static random<T>(arr: T[]): T | undefined;
|
|
49
|
+
/**
|
|
50
|
+
* Get N random elements
|
|
51
|
+
*/
|
|
52
|
+
static randomN<T>(arr: T[], n: number): T[];
|
|
53
|
+
/**
|
|
54
|
+
* Reverse array
|
|
55
|
+
*/
|
|
56
|
+
static reverse<T>(arr: T[]): T[];
|
|
57
|
+
/**
|
|
58
|
+
* Rotate array
|
|
59
|
+
*/
|
|
60
|
+
static rotate<T>(arr: T[], steps: number): T[];
|
|
61
|
+
/**
|
|
62
|
+
* Zip arrays together
|
|
63
|
+
*/
|
|
64
|
+
static zip<T>(...arrays: T[][]): T[][];
|
|
65
|
+
/**
|
|
66
|
+
* Unzip array of tuples
|
|
67
|
+
*/
|
|
68
|
+
static unzip<T>(arr: T[][]): T[][];
|
|
69
|
+
/**
|
|
70
|
+
* Find differences between two arrays
|
|
71
|
+
*/
|
|
72
|
+
static difference<T>(arr1: T[], arr2: T[]): T[];
|
|
73
|
+
/**
|
|
74
|
+
* Find intersection of two arrays
|
|
75
|
+
*/
|
|
76
|
+
static intersection<T>(arr1: T[], arr2: T[]): T[];
|
|
77
|
+
/**
|
|
78
|
+
* Find union of two arrays
|
|
79
|
+
*/
|
|
80
|
+
static union<T>(arr1: T[], arr2: T[]): T[];
|
|
81
|
+
/**
|
|
82
|
+
* Check if array includes all elements from another array
|
|
83
|
+
*/
|
|
84
|
+
static includesAll<T>(arr: T[], items: T[]): boolean;
|
|
85
|
+
/**
|
|
86
|
+
* Check if array includes any element from another array
|
|
87
|
+
*/
|
|
88
|
+
static includesAny<T>(arr: T[], items: T[]): boolean;
|
|
89
|
+
/**
|
|
90
|
+
* Sum array of numbers
|
|
91
|
+
*/
|
|
92
|
+
static sum(arr: number[]): number;
|
|
93
|
+
/**
|
|
94
|
+
* Average of array of numbers
|
|
95
|
+
*/
|
|
96
|
+
static average(arr: number[]): number;
|
|
97
|
+
/**
|
|
98
|
+
* Min value in array
|
|
99
|
+
*/
|
|
100
|
+
static min(arr: number[]): number | undefined;
|
|
101
|
+
/**
|
|
102
|
+
* Max value in array
|
|
103
|
+
*/
|
|
104
|
+
static max(arr: number[]): number | undefined;
|
|
105
|
+
/**
|
|
106
|
+
* Range of numbers
|
|
107
|
+
*/
|
|
108
|
+
static range(start: number, end: number, step?: number): number[];
|
|
109
|
+
/**
|
|
110
|
+
* Repeat array N times
|
|
111
|
+
*/
|
|
112
|
+
static repeat<T>(arr: T[], times: number): T[];
|
|
113
|
+
/**
|
|
114
|
+
* Fill array with value
|
|
115
|
+
*/
|
|
116
|
+
static fill<T>(length: number, value: T): T[];
|
|
117
|
+
/**
|
|
118
|
+
* Transpose 2D array
|
|
119
|
+
*/
|
|
120
|
+
static transpose<T>(arr: T[][]): T[][];
|
|
121
|
+
/**
|
|
122
|
+
* Find index of element matching predicate
|
|
123
|
+
*/
|
|
124
|
+
static findIndex<T>(arr: T[], predicate: (item: T, index: number) => boolean): number;
|
|
125
|
+
/**
|
|
126
|
+
* Find last index of element matching predicate
|
|
127
|
+
*/
|
|
128
|
+
static findLastIndex<T>(arr: T[], predicate: (item: T, index: number) => boolean): number;
|
|
129
|
+
/**
|
|
130
|
+
* Partition array into two based on predicate
|
|
131
|
+
*/
|
|
132
|
+
static partition<T>(arr: T[], predicate: (item: T) => boolean): [T[], T[]];
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=ArrayUtils.d.ts.map
|