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.
Files changed (200) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +2241 -0
  3. package/bin/sutils.js +9 -0
  4. package/dist/api-client.d.ts +2 -0
  5. package/dist/api-client.d.ts.map +1 -0
  6. package/dist/api-client.js +2 -0
  7. package/dist/api-client.js.map +1 -0
  8. package/dist/cli/index.d.ts +2 -0
  9. package/dist/cli/index.d.ts.map +1 -0
  10. package/dist/cli/index.js +401 -0
  11. package/dist/cli/index.js.map +1 -0
  12. package/dist/cli/type-generator.d.ts +12 -0
  13. package/dist/cli/type-generator.d.ts.map +1 -0
  14. package/dist/cli/type-generator.js +152 -0
  15. package/dist/cli/type-generator.js.map +1 -0
  16. package/dist/date-utils.d.ts +2 -0
  17. package/dist/date-utils.d.ts.map +1 -0
  18. package/dist/date-utils.js +2 -0
  19. package/dist/date-utils.js.map +1 -0
  20. package/dist/debug.d.ts +2 -0
  21. package/dist/debug.d.ts.map +1 -0
  22. package/dist/debug.js +2 -0
  23. package/dist/debug.js.map +1 -0
  24. package/dist/env-manager.d.ts +2 -0
  25. package/dist/env-manager.d.ts.map +1 -0
  26. package/dist/env-manager.js +2 -0
  27. package/dist/env-manager.js.map +1 -0
  28. package/dist/file-upload.d.ts +2 -0
  29. package/dist/file-upload.d.ts.map +1 -0
  30. package/dist/file-upload.js +2 -0
  31. package/dist/file-upload.js.map +1 -0
  32. package/dist/index.d.ts +2 -0
  33. package/dist/index.d.ts.map +1 -0
  34. package/dist/index.js +2 -0
  35. package/dist/index.js.map +1 -0
  36. package/dist/logger.d.ts +2 -0
  37. package/dist/logger.d.ts.map +1 -0
  38. package/dist/logger.js +2 -0
  39. package/dist/logger.js.map +1 -0
  40. package/dist/profiler.d.ts +2 -0
  41. package/dist/profiler.d.ts.map +1 -0
  42. package/dist/profiler.js +2 -0
  43. package/dist/profiler.js.map +1 -0
  44. package/dist/response-validator.d.ts +2 -0
  45. package/dist/response-validator.d.ts.map +1 -0
  46. package/dist/response-validator.js +2 -0
  47. package/dist/response-validator.js.map +1 -0
  48. package/dist/retry-policy.d.ts +2 -0
  49. package/dist/retry-policy.d.ts.map +1 -0
  50. package/dist/retry-policy.js +2 -0
  51. package/dist/retry-policy.js.map +1 -0
  52. package/dist/storage-utils.d.ts +2 -0
  53. package/dist/storage-utils.d.ts.map +1 -0
  54. package/dist/storage-utils.js +2 -0
  55. package/dist/storage-utils.js.map +1 -0
  56. package/dist/streaming.d.ts +2 -0
  57. package/dist/streaming.d.ts.map +1 -0
  58. package/dist/streaming.js +2 -0
  59. package/dist/streaming.js.map +1 -0
  60. package/dist/string-utils.d.ts +2 -0
  61. package/dist/string-utils.d.ts.map +1 -0
  62. package/dist/string-utils.js +2 -0
  63. package/dist/string-utils.js.map +1 -0
  64. package/dist/utils/core/ApiClient.d.ts +94 -0
  65. package/dist/utils/core/ApiClient.d.ts.map +1 -0
  66. package/dist/utils/core/ApiClient.js +291 -0
  67. package/dist/utils/core/ApiClient.js.map +1 -0
  68. package/dist/utils/core/ErrorBoundary.d.ts +141 -0
  69. package/dist/utils/core/ErrorBoundary.d.ts.map +1 -0
  70. package/dist/utils/core/ErrorBoundary.js +322 -0
  71. package/dist/utils/core/ErrorBoundary.js.map +1 -0
  72. package/dist/utils/core/Logger.d.ts +39 -0
  73. package/dist/utils/core/Logger.d.ts.map +1 -0
  74. package/dist/utils/core/Logger.js +154 -0
  75. package/dist/utils/core/Logger.js.map +1 -0
  76. package/dist/utils/core/Profiler.d.ts +8 -0
  77. package/dist/utils/core/Profiler.d.ts.map +1 -0
  78. package/dist/utils/core/Profiler.js +18 -0
  79. package/dist/utils/core/Profiler.js.map +1 -0
  80. package/dist/utils/core/RateLimiter.d.ts +74 -0
  81. package/dist/utils/core/RateLimiter.d.ts.map +1 -0
  82. package/dist/utils/core/RateLimiter.js +170 -0
  83. package/dist/utils/core/RateLimiter.js.map +1 -0
  84. package/dist/utils/core/RequestCache.d.ts +64 -0
  85. package/dist/utils/core/RequestCache.d.ts.map +1 -0
  86. package/dist/utils/core/RequestCache.js +139 -0
  87. package/dist/utils/core/RequestCache.js.map +1 -0
  88. package/dist/utils/core/RequestDeduplicator.d.ts +41 -0
  89. package/dist/utils/core/RequestDeduplicator.d.ts.map +1 -0
  90. package/dist/utils/core/RequestDeduplicator.js +83 -0
  91. package/dist/utils/core/RequestDeduplicator.js.map +1 -0
  92. package/dist/utils/core/ResponseValidator.d.ts +26 -0
  93. package/dist/utils/core/ResponseValidator.d.ts.map +1 -0
  94. package/dist/utils/core/ResponseValidator.js +140 -0
  95. package/dist/utils/core/ResponseValidator.js.map +1 -0
  96. package/dist/utils/core/RetryPolicy.d.ts +43 -0
  97. package/dist/utils/core/RetryPolicy.d.ts.map +1 -0
  98. package/dist/utils/core/RetryPolicy.js +119 -0
  99. package/dist/utils/core/RetryPolicy.js.map +1 -0
  100. package/dist/utils/core/debug.d.ts +46 -0
  101. package/dist/utils/core/debug.d.ts.map +1 -0
  102. package/dist/utils/core/debug.js +83 -0
  103. package/dist/utils/core/debug.js.map +1 -0
  104. package/dist/utils/core/index.d.ts +11 -0
  105. package/dist/utils/core/index.d.ts.map +1 -0
  106. package/dist/utils/core/index.js +11 -0
  107. package/dist/utils/core/index.js.map +1 -0
  108. package/dist/utils/helpers/ArrayUtils.d.ts +134 -0
  109. package/dist/utils/helpers/ArrayUtils.d.ts.map +1 -0
  110. package/dist/utils/helpers/ArrayUtils.js +301 -0
  111. package/dist/utils/helpers/ArrayUtils.js.map +1 -0
  112. package/dist/utils/helpers/CacheManager.d.ts +67 -0
  113. package/dist/utils/helpers/CacheManager.d.ts.map +1 -0
  114. package/dist/utils/helpers/CacheManager.js +222 -0
  115. package/dist/utils/helpers/CacheManager.js.map +1 -0
  116. package/dist/utils/helpers/CompressionUtils.d.ts +80 -0
  117. package/dist/utils/helpers/CompressionUtils.d.ts.map +1 -0
  118. package/dist/utils/helpers/CompressionUtils.js +224 -0
  119. package/dist/utils/helpers/CompressionUtils.js.map +1 -0
  120. package/dist/utils/helpers/CryptoUtils.d.ts +70 -0
  121. package/dist/utils/helpers/CryptoUtils.d.ts.map +1 -0
  122. package/dist/utils/helpers/CryptoUtils.js +215 -0
  123. package/dist/utils/helpers/CryptoUtils.js.map +1 -0
  124. package/dist/utils/helpers/DateUtils.d.ts +31 -0
  125. package/dist/utils/helpers/DateUtils.d.ts.map +1 -0
  126. package/dist/utils/helpers/DateUtils.js +104 -0
  127. package/dist/utils/helpers/DateUtils.js.map +1 -0
  128. package/dist/utils/helpers/DiffUtils.d.ts +61 -0
  129. package/dist/utils/helpers/DiffUtils.d.ts.map +1 -0
  130. package/dist/utils/helpers/DiffUtils.js +249 -0
  131. package/dist/utils/helpers/DiffUtils.js.map +1 -0
  132. package/dist/utils/helpers/EnvManager.d.ts +7 -0
  133. package/dist/utils/helpers/EnvManager.d.ts.map +1 -0
  134. package/dist/utils/helpers/EnvManager.js +19 -0
  135. package/dist/utils/helpers/EnvManager.js.map +1 -0
  136. package/dist/utils/helpers/EventEmitter.d.ts +78 -0
  137. package/dist/utils/helpers/EventEmitter.d.ts.map +1 -0
  138. package/dist/utils/helpers/EventEmitter.js +208 -0
  139. package/dist/utils/helpers/EventEmitter.js.map +1 -0
  140. package/dist/utils/helpers/FileUploadHelper.d.ts +44 -0
  141. package/dist/utils/helpers/FileUploadHelper.d.ts.map +1 -0
  142. package/dist/utils/helpers/FileUploadHelper.js +127 -0
  143. package/dist/utils/helpers/FileUploadHelper.js.map +1 -0
  144. package/dist/utils/helpers/FormUtils.d.ts +162 -0
  145. package/dist/utils/helpers/FormUtils.d.ts.map +1 -0
  146. package/dist/utils/helpers/FormUtils.js +378 -0
  147. package/dist/utils/helpers/FormUtils.js.map +1 -0
  148. package/dist/utils/helpers/ObjectUtils.d.ts +102 -0
  149. package/dist/utils/helpers/ObjectUtils.d.ts.map +1 -0
  150. package/dist/utils/helpers/ObjectUtils.js +297 -0
  151. package/dist/utils/helpers/ObjectUtils.js.map +1 -0
  152. package/dist/utils/helpers/PaginationHelper.d.ts +127 -0
  153. package/dist/utils/helpers/PaginationHelper.d.ts.map +1 -0
  154. package/dist/utils/helpers/PaginationHelper.js +259 -0
  155. package/dist/utils/helpers/PaginationHelper.js.map +1 -0
  156. package/dist/utils/helpers/PollingHelper.d.ts +64 -0
  157. package/dist/utils/helpers/PollingHelper.d.ts.map +1 -0
  158. package/dist/utils/helpers/PollingHelper.js +131 -0
  159. package/dist/utils/helpers/PollingHelper.js.map +1 -0
  160. package/dist/utils/helpers/StorageUtils.d.ts +9 -0
  161. package/dist/utils/helpers/StorageUtils.d.ts.map +1 -0
  162. package/dist/utils/helpers/StorageUtils.js +33 -0
  163. package/dist/utils/helpers/StorageUtils.js.map +1 -0
  164. package/dist/utils/helpers/StreamingHelper.d.ts +35 -0
  165. package/dist/utils/helpers/StreamingHelper.d.ts.map +1 -0
  166. package/dist/utils/helpers/StreamingHelper.js +167 -0
  167. package/dist/utils/helpers/StreamingHelper.js.map +1 -0
  168. package/dist/utils/helpers/StringUtils.d.ts +42 -0
  169. package/dist/utils/helpers/StringUtils.d.ts.map +1 -0
  170. package/dist/utils/helpers/StringUtils.js +173 -0
  171. package/dist/utils/helpers/StringUtils.js.map +1 -0
  172. package/dist/utils/helpers/TimeUtils.d.ts +87 -0
  173. package/dist/utils/helpers/TimeUtils.d.ts.map +1 -0
  174. package/dist/utils/helpers/TimeUtils.js +234 -0
  175. package/dist/utils/helpers/TimeUtils.js.map +1 -0
  176. package/dist/utils/helpers/Validator.d.ts +31 -0
  177. package/dist/utils/helpers/Validator.d.ts.map +1 -0
  178. package/dist/utils/helpers/Validator.js +156 -0
  179. package/dist/utils/helpers/Validator.js.map +1 -0
  180. package/dist/utils/helpers/WebSocketHelper.d.ts +63 -0
  181. package/dist/utils/helpers/WebSocketHelper.d.ts.map +1 -0
  182. package/dist/utils/helpers/WebSocketHelper.js +200 -0
  183. package/dist/utils/helpers/WebSocketHelper.js.map +1 -0
  184. package/dist/utils/helpers/index.d.ts +20 -0
  185. package/dist/utils/helpers/index.d.ts.map +1 -0
  186. package/dist/utils/helpers/index.js +20 -0
  187. package/dist/utils/helpers/index.js.map +1 -0
  188. package/dist/utils/index.d.ts +21 -0
  189. package/dist/utils/index.d.ts.map +1 -0
  190. package/dist/utils/index.js +21 -0
  191. package/dist/utils/index.js.map +1 -0
  192. package/dist/validator.d.ts +2 -0
  193. package/dist/validator.d.ts.map +1 -0
  194. package/dist/validator.js +2 -0
  195. package/dist/validator.js.map +1 -0
  196. package/dist/websocket.d.ts +2 -0
  197. package/dist/websocket.d.ts.map +1 -0
  198. package/dist/websocket.js +2 -0
  199. package/dist/websocket.js.map +1 -0
  200. 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