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,297 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Object manipulation utilities for everyday development tasks
|
|
3
|
+
*/
|
|
4
|
+
export class ObjectUtils {
|
|
5
|
+
/**
|
|
6
|
+
* Check if value is empty (null, undefined, empty string, empty array, empty object)
|
|
7
|
+
*/
|
|
8
|
+
static isEmpty(value) {
|
|
9
|
+
if (value === null || value === undefined)
|
|
10
|
+
return true;
|
|
11
|
+
if (typeof value === "string")
|
|
12
|
+
return value.trim().length === 0;
|
|
13
|
+
if (Array.isArray(value))
|
|
14
|
+
return value.length === 0;
|
|
15
|
+
if (value instanceof Map || value instanceof Set)
|
|
16
|
+
return value.size === 0;
|
|
17
|
+
if (typeof value === "object") {
|
|
18
|
+
return Object.keys(value).length === 0;
|
|
19
|
+
}
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Check if value is NOT empty
|
|
24
|
+
*/
|
|
25
|
+
static isNotEmpty(value) {
|
|
26
|
+
return !this.isEmpty(value);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Deep clone an object
|
|
30
|
+
*/
|
|
31
|
+
static deepClone(obj) {
|
|
32
|
+
if (obj === null || typeof obj !== "object")
|
|
33
|
+
return obj;
|
|
34
|
+
if (obj instanceof Date)
|
|
35
|
+
return new Date(obj.getTime());
|
|
36
|
+
if (obj instanceof Array) {
|
|
37
|
+
return obj.map((item) => this.deepClone(item));
|
|
38
|
+
}
|
|
39
|
+
if (obj instanceof Object) {
|
|
40
|
+
const cloned = {};
|
|
41
|
+
for (const key in obj) {
|
|
42
|
+
if (Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
43
|
+
cloned[key] = this.deepClone(obj[key]);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return cloned;
|
|
47
|
+
}
|
|
48
|
+
return obj;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Shallow merge objects (right overwrites left)
|
|
52
|
+
*/
|
|
53
|
+
static merge(...objects) {
|
|
54
|
+
return objects.reduce((acc, obj) => ({ ...acc, ...obj }), {});
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Deep merge objects (recursive)
|
|
58
|
+
*/
|
|
59
|
+
static deepMerge(...objects) {
|
|
60
|
+
return objects.reduce((acc, obj) => {
|
|
61
|
+
for (const key in obj) {
|
|
62
|
+
if (Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
63
|
+
const accValue = acc[key];
|
|
64
|
+
const objValue = obj[key];
|
|
65
|
+
if (typeof accValue === "object" &&
|
|
66
|
+
accValue !== null &&
|
|
67
|
+
!Array.isArray(accValue) &&
|
|
68
|
+
typeof objValue === "object" &&
|
|
69
|
+
objValue !== null &&
|
|
70
|
+
!Array.isArray(objValue)) {
|
|
71
|
+
acc[key] = this.deepMerge(accValue, objValue);
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
acc[key] = objValue;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return acc;
|
|
79
|
+
}, {});
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Pick specific keys from object
|
|
83
|
+
*/
|
|
84
|
+
static pick(obj, keys) {
|
|
85
|
+
const result = {};
|
|
86
|
+
for (const key of keys) {
|
|
87
|
+
if (key in obj) {
|
|
88
|
+
result[key] = obj[key];
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return result;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Omit specific keys from object
|
|
95
|
+
*/
|
|
96
|
+
static omit(obj, keys) {
|
|
97
|
+
const result = { ...obj };
|
|
98
|
+
for (const key of keys) {
|
|
99
|
+
delete result[key];
|
|
100
|
+
}
|
|
101
|
+
return result;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Get nested value using dot notation
|
|
105
|
+
*/
|
|
106
|
+
static get(obj, path, defaultValue) {
|
|
107
|
+
const keys = path.split(".");
|
|
108
|
+
let value = obj;
|
|
109
|
+
for (const key of keys) {
|
|
110
|
+
if (value && typeof value === "object" && key in value) {
|
|
111
|
+
value = value[key];
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
return defaultValue;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return value;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Set nested value using dot notation
|
|
121
|
+
*/
|
|
122
|
+
static set(obj, path, value) {
|
|
123
|
+
const keys = path.split(".");
|
|
124
|
+
let current = obj;
|
|
125
|
+
for (let i = 0; i < keys.length - 1; i++) {
|
|
126
|
+
const key = keys[i];
|
|
127
|
+
if (!(key in current) || typeof current[key] !== "object") {
|
|
128
|
+
current[key] = {};
|
|
129
|
+
}
|
|
130
|
+
current = current[key];
|
|
131
|
+
}
|
|
132
|
+
current[keys[keys.length - 1]] = value;
|
|
133
|
+
return obj;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Flatten nested object
|
|
137
|
+
*/
|
|
138
|
+
static flatten(obj, prefix = "") {
|
|
139
|
+
const result = {};
|
|
140
|
+
for (const key in obj) {
|
|
141
|
+
if (Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
142
|
+
const value = obj[key];
|
|
143
|
+
const newKey = prefix ? `${prefix}.${key}` : key;
|
|
144
|
+
if (value &&
|
|
145
|
+
typeof value === "object" &&
|
|
146
|
+
!Array.isArray(value) &&
|
|
147
|
+
!(value instanceof Date)) {
|
|
148
|
+
Object.assign(result, this.flatten(value, newKey));
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
result[newKey] = value;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
return result;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Unflatten object (reverse of flatten)
|
|
159
|
+
*/
|
|
160
|
+
static unflatten(obj) {
|
|
161
|
+
const result = {};
|
|
162
|
+
for (const key in obj) {
|
|
163
|
+
if (Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
164
|
+
this.set(result, key, obj[key]);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
return result;
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Filter object by predicate
|
|
171
|
+
*/
|
|
172
|
+
static filter(obj, predicate) {
|
|
173
|
+
const result = {};
|
|
174
|
+
for (const key in obj) {
|
|
175
|
+
if (Object.prototype.hasOwnProperty.call(obj, key) &&
|
|
176
|
+
predicate(key, obj[key])) {
|
|
177
|
+
result[key] = obj[key];
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
return result;
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Map object values
|
|
184
|
+
*/
|
|
185
|
+
static mapValues(obj, mapper) {
|
|
186
|
+
const result = {};
|
|
187
|
+
for (const key in obj) {
|
|
188
|
+
if (Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
189
|
+
result[key] = mapper(obj[key], key);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
return result;
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Check if object has all keys
|
|
196
|
+
*/
|
|
197
|
+
static hasKeys(obj, keys) {
|
|
198
|
+
return keys.every((key) => key in obj);
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Check if object has any of the keys
|
|
202
|
+
*/
|
|
203
|
+
static hasAnyKey(obj, keys) {
|
|
204
|
+
return keys.some((key) => key in obj);
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Invert object keys and values
|
|
208
|
+
*/
|
|
209
|
+
static invert(obj) {
|
|
210
|
+
const result = {};
|
|
211
|
+
for (const key in obj) {
|
|
212
|
+
if (Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
213
|
+
result[obj[key]] = key;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
return result;
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Group array of objects by key
|
|
220
|
+
*/
|
|
221
|
+
static groupBy(arr, key) {
|
|
222
|
+
return arr.reduce((acc, item) => {
|
|
223
|
+
const groupKey = String(item[key]);
|
|
224
|
+
if (!acc[groupKey]) {
|
|
225
|
+
acc[groupKey] = [];
|
|
226
|
+
}
|
|
227
|
+
acc[groupKey].push(item);
|
|
228
|
+
return acc;
|
|
229
|
+
}, {});
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Index array of objects by key
|
|
233
|
+
*/
|
|
234
|
+
static indexBy(arr, key) {
|
|
235
|
+
return arr.reduce((acc, item) => {
|
|
236
|
+
acc[String(item[key])] = item;
|
|
237
|
+
return acc;
|
|
238
|
+
}, {});
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Check if two objects are deeply equal
|
|
242
|
+
*/
|
|
243
|
+
static deepEqual(a, b) {
|
|
244
|
+
if (a === b)
|
|
245
|
+
return true;
|
|
246
|
+
if (a === null || b === null)
|
|
247
|
+
return a === b;
|
|
248
|
+
if (typeof a !== "object" || typeof b !== "object")
|
|
249
|
+
return false;
|
|
250
|
+
const aKeys = Object.keys(a);
|
|
251
|
+
const bKeys = Object.keys(b);
|
|
252
|
+
if (aKeys.length !== bKeys.length)
|
|
253
|
+
return false;
|
|
254
|
+
for (const key of aKeys) {
|
|
255
|
+
if (!bKeys.includes(key))
|
|
256
|
+
return false;
|
|
257
|
+
if (!this.deepEqual(a[key], b[key])) {
|
|
258
|
+
return false;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
return true;
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Get object size (number of keys)
|
|
265
|
+
*/
|
|
266
|
+
static size(obj) {
|
|
267
|
+
return Object.keys(obj).length;
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Convert object to array of [key, value] pairs
|
|
271
|
+
*/
|
|
272
|
+
static entries(obj) {
|
|
273
|
+
return Object.entries(obj);
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Convert array of [key, value] pairs to object
|
|
277
|
+
*/
|
|
278
|
+
static fromEntries(entries) {
|
|
279
|
+
return Object.fromEntries(entries);
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Assign properties from source to target (like Object.assign)
|
|
283
|
+
*/
|
|
284
|
+
static assign(target, ...sources) {
|
|
285
|
+
return Object.assign(target, ...sources);
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* Create object from keys with same value
|
|
289
|
+
*/
|
|
290
|
+
static fromKeys(keys, value) {
|
|
291
|
+
return keys.reduce((acc, key) => {
|
|
292
|
+
acc[key] = value;
|
|
293
|
+
return acc;
|
|
294
|
+
}, {});
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
//# sourceMappingURL=ObjectUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ObjectUtils.js","sourceRoot":"","sources":["../../../src/utils/helpers/ObjectUtils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pagination helper for managing paginated data
|
|
3
|
+
* Supports offset-limit and cursor-based pagination
|
|
4
|
+
*/
|
|
5
|
+
export type PaginationMode = "offset" | "cursor";
|
|
6
|
+
export interface PaginationState {
|
|
7
|
+
currentPage: number;
|
|
8
|
+
pageSize: number;
|
|
9
|
+
total: number;
|
|
10
|
+
totalPages: number;
|
|
11
|
+
hasNextPage: boolean;
|
|
12
|
+
hasPreviousPage: boolean;
|
|
13
|
+
}
|
|
14
|
+
export interface CursorPaginationState {
|
|
15
|
+
cursor?: string;
|
|
16
|
+
nextCursor?: string;
|
|
17
|
+
previousCursor?: string;
|
|
18
|
+
hasNextPage: boolean;
|
|
19
|
+
hasPreviousPage: boolean;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Pagination helper for managing paginated data
|
|
23
|
+
*/
|
|
24
|
+
export declare class PaginationHelper<T = unknown> {
|
|
25
|
+
private items;
|
|
26
|
+
private pageSize;
|
|
27
|
+
private mode;
|
|
28
|
+
private currentPage;
|
|
29
|
+
private currentCursor?;
|
|
30
|
+
private cursorMap;
|
|
31
|
+
constructor(items: T[], options?: {
|
|
32
|
+
pageSize?: number;
|
|
33
|
+
mode?: PaginationMode;
|
|
34
|
+
});
|
|
35
|
+
/**
|
|
36
|
+
* Get current page (offset mode)
|
|
37
|
+
*/
|
|
38
|
+
getCurrentPage(): T[];
|
|
39
|
+
/**
|
|
40
|
+
* Get current page by cursor (cursor mode)
|
|
41
|
+
*/
|
|
42
|
+
getCurrentPageByCursor(): T[];
|
|
43
|
+
/**
|
|
44
|
+
* Go to next page (offset mode)
|
|
45
|
+
*/
|
|
46
|
+
next(): T[];
|
|
47
|
+
/**
|
|
48
|
+
* Go to next page by cursor (cursor mode)
|
|
49
|
+
*/
|
|
50
|
+
nextByCursor(): T[];
|
|
51
|
+
/**
|
|
52
|
+
* Go to previous page (offset mode)
|
|
53
|
+
*/
|
|
54
|
+
previous(): T[];
|
|
55
|
+
/**
|
|
56
|
+
* Go to previous page by cursor (cursor mode)
|
|
57
|
+
*/
|
|
58
|
+
previousByCursor(): T[];
|
|
59
|
+
/**
|
|
60
|
+
* Go to specific page (offset mode)
|
|
61
|
+
*/
|
|
62
|
+
goToPage(page: number): T[];
|
|
63
|
+
/**
|
|
64
|
+
* Go to specific cursor (cursor mode)
|
|
65
|
+
*/
|
|
66
|
+
goToCursor(cursor: string): T[];
|
|
67
|
+
/**
|
|
68
|
+
* Check if has next page
|
|
69
|
+
*/
|
|
70
|
+
hasNextPage(): boolean;
|
|
71
|
+
/**
|
|
72
|
+
* Check if has previous page
|
|
73
|
+
*/
|
|
74
|
+
hasPreviousPage(): boolean;
|
|
75
|
+
/**
|
|
76
|
+
* Get total pages (offset mode)
|
|
77
|
+
*/
|
|
78
|
+
getTotalPages(): number;
|
|
79
|
+
/**
|
|
80
|
+
* Get total items
|
|
81
|
+
*/
|
|
82
|
+
getTotalItems(): number;
|
|
83
|
+
/**
|
|
84
|
+
* Get current page number (offset mode)
|
|
85
|
+
*/
|
|
86
|
+
getCurrentPageNumber(): number;
|
|
87
|
+
/**
|
|
88
|
+
* Get pagination state (offset mode)
|
|
89
|
+
*/
|
|
90
|
+
getState(): PaginationState;
|
|
91
|
+
/**
|
|
92
|
+
* Get cursor pagination state (cursor mode)
|
|
93
|
+
*/
|
|
94
|
+
getCursorState(): CursorPaginationState;
|
|
95
|
+
/**
|
|
96
|
+
* Reset to first page
|
|
97
|
+
*/
|
|
98
|
+
reset(): void;
|
|
99
|
+
/**
|
|
100
|
+
* Set page size
|
|
101
|
+
*/
|
|
102
|
+
setPageSize(size: number): void;
|
|
103
|
+
/**
|
|
104
|
+
* Generate cursor from index
|
|
105
|
+
*/
|
|
106
|
+
private generateCursor;
|
|
107
|
+
/**
|
|
108
|
+
* Decode cursor to index
|
|
109
|
+
*/
|
|
110
|
+
private decodeCursor;
|
|
111
|
+
/**
|
|
112
|
+
* Get all items
|
|
113
|
+
*/
|
|
114
|
+
getAllItems(): T[];
|
|
115
|
+
/**
|
|
116
|
+
* Update items
|
|
117
|
+
*/
|
|
118
|
+
setItems(items: T[]): void;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Factory function for creating paginators
|
|
122
|
+
*/
|
|
123
|
+
export declare function createPaginator<T = unknown>(items: T[], options?: {
|
|
124
|
+
pageSize?: number;
|
|
125
|
+
mode?: PaginationMode;
|
|
126
|
+
}): PaginationHelper<T>;
|
|
127
|
+
//# sourceMappingURL=PaginationHelper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PaginationHelper.d.ts","sourceRoot":"","sources":["../../../src/utils/helpers/PaginationHelper.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEjD,MAAM,WAAW,eAAe;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;IACrB,eAAe,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,qBAAqB;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,OAAO,CAAC;IACrB,eAAe,EAAE,OAAO,CAAC;CAC5B;AAED;;GAEG;AACH,qBAAa,gBAAgB,CAAC,CAAC,GAAG,OAAO;IACrC,OAAO,CAAC,KAAK,CAAM;IACnB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,IAAI,CAAiB;IAC7B,OAAO,CAAC,WAAW,CAAa;IAChC,OAAO,CAAC,aAAa,CAAC,CAAS;IAC/B,OAAO,CAAC,SAAS,CAAkC;gBAG/C,KAAK,EAAE,CAAC,EAAE,EACV,OAAO,GAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,cAAc,CAAA;KAAO;IAO9D;;OAEG;IACH,cAAc,IAAI,CAAC,EAAE;IAUrB;;OAEG;IACH,sBAAsB,IAAI,CAAC,EAAE;IAa7B;;OAEG;IACH,IAAI,IAAI,CAAC,EAAE;IAWX;;OAEG;IACH,YAAY,IAAI,CAAC,EAAE;IAkBnB;;OAEG;IACH,QAAQ,IAAI,CAAC,EAAE;IAWf;;OAEG;IACH,gBAAgB,IAAI,CAAC,EAAE;IAkBvB;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC,EAAE;IAW3B;;OAEG;IACH,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC,EAAE;IAW/B;;OAEG;IACH,WAAW,IAAI,OAAO;IAWtB;;OAEG;IACH,eAAe,IAAI,OAAO;IAW1B;;OAEG;IACH,aAAa,IAAI,MAAM;IAIvB;;OAEG;IACH,aAAa,IAAI,MAAM;IAIvB;;OAEG;IACH,oBAAoB,IAAI,MAAM;IAI9B;;OAEG;IACH,QAAQ,IAAI,eAAe;IAW3B;;OAEG;IACH,cAAc,IAAI,qBAAqB;IAsBvC;;OAEG;IACH,KAAK,IAAI,IAAI;IAMb;;OAEG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAM/B;;OAEG;IACH,OAAO,CAAC,cAAc;IAItB;;OAEG;IACH,OAAO,CAAC,YAAY;IAQpB;;OAEG;IACH,WAAW,IAAI,CAAC,EAAE;IAIlB;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,IAAI;CAI7B;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,CAAC,GAAG,OAAO,EACvC,KAAK,EAAE,CAAC,EAAE,EACV,OAAO,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,cAAc,CAAA;CAAE,GACvD,gBAAgB,CAAC,CAAC,CAAC,CAErB"}
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pagination helper for managing paginated data
|
|
3
|
+
* Supports offset-limit and cursor-based pagination
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Pagination helper for managing paginated data
|
|
7
|
+
*/
|
|
8
|
+
export class PaginationHelper {
|
|
9
|
+
items;
|
|
10
|
+
pageSize;
|
|
11
|
+
mode;
|
|
12
|
+
currentPage = 1;
|
|
13
|
+
currentCursor;
|
|
14
|
+
cursorMap = new Map();
|
|
15
|
+
constructor(items, options = {}) {
|
|
16
|
+
this.items = items;
|
|
17
|
+
this.pageSize = options.pageSize ?? 10;
|
|
18
|
+
this.mode = options.mode ?? "offset";
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Get current page (offset mode)
|
|
22
|
+
*/
|
|
23
|
+
getCurrentPage() {
|
|
24
|
+
if (this.mode === "cursor") {
|
|
25
|
+
throw new Error("Use getCurrentPageByCursor() in cursor mode");
|
|
26
|
+
}
|
|
27
|
+
const start = (this.currentPage - 1) * this.pageSize;
|
|
28
|
+
const end = start + this.pageSize;
|
|
29
|
+
return this.items.slice(start, end);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Get current page by cursor (cursor mode)
|
|
33
|
+
*/
|
|
34
|
+
getCurrentPageByCursor() {
|
|
35
|
+
if (this.mode === "offset") {
|
|
36
|
+
throw new Error("Use getCurrentPage() in offset mode");
|
|
37
|
+
}
|
|
38
|
+
const cursorIndex = this.currentCursor
|
|
39
|
+
? this.cursorMap.get(this.currentCursor) ?? 0
|
|
40
|
+
: 0;
|
|
41
|
+
const start = cursorIndex;
|
|
42
|
+
const end = start + this.pageSize;
|
|
43
|
+
return this.items.slice(start, end);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Go to next page (offset mode)
|
|
47
|
+
*/
|
|
48
|
+
next() {
|
|
49
|
+
if (this.mode === "cursor") {
|
|
50
|
+
throw new Error("Use nextByCursor() in cursor mode");
|
|
51
|
+
}
|
|
52
|
+
if (this.hasNextPage()) {
|
|
53
|
+
this.currentPage++;
|
|
54
|
+
}
|
|
55
|
+
return this.getCurrentPage();
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Go to next page by cursor (cursor mode)
|
|
59
|
+
*/
|
|
60
|
+
nextByCursor() {
|
|
61
|
+
if (this.mode === "offset") {
|
|
62
|
+
throw new Error("Use next() in offset mode");
|
|
63
|
+
}
|
|
64
|
+
const currentIndex = this.currentCursor
|
|
65
|
+
? this.cursorMap.get(this.currentCursor) ?? 0
|
|
66
|
+
: 0;
|
|
67
|
+
const nextIndex = currentIndex + this.pageSize;
|
|
68
|
+
if (nextIndex < this.items.length) {
|
|
69
|
+
this.currentCursor = this.generateCursor(nextIndex);
|
|
70
|
+
this.cursorMap.set(this.currentCursor, nextIndex);
|
|
71
|
+
}
|
|
72
|
+
return this.getCurrentPageByCursor();
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Go to previous page (offset mode)
|
|
76
|
+
*/
|
|
77
|
+
previous() {
|
|
78
|
+
if (this.mode === "cursor") {
|
|
79
|
+
throw new Error("Use previousByCursor() in cursor mode");
|
|
80
|
+
}
|
|
81
|
+
if (this.hasPreviousPage()) {
|
|
82
|
+
this.currentPage--;
|
|
83
|
+
}
|
|
84
|
+
return this.getCurrentPage();
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Go to previous page by cursor (cursor mode)
|
|
88
|
+
*/
|
|
89
|
+
previousByCursor() {
|
|
90
|
+
if (this.mode === "offset") {
|
|
91
|
+
throw new Error("Use previous() in offset mode");
|
|
92
|
+
}
|
|
93
|
+
const currentIndex = this.currentCursor
|
|
94
|
+
? this.cursorMap.get(this.currentCursor) ?? 0
|
|
95
|
+
: 0;
|
|
96
|
+
const previousIndex = Math.max(0, currentIndex - this.pageSize);
|
|
97
|
+
if (previousIndex >= 0) {
|
|
98
|
+
this.currentCursor = this.generateCursor(previousIndex);
|
|
99
|
+
this.cursorMap.set(this.currentCursor, previousIndex);
|
|
100
|
+
}
|
|
101
|
+
return this.getCurrentPageByCursor();
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Go to specific page (offset mode)
|
|
105
|
+
*/
|
|
106
|
+
goToPage(page) {
|
|
107
|
+
if (this.mode === "cursor") {
|
|
108
|
+
throw new Error("Use goToCursor() in cursor mode");
|
|
109
|
+
}
|
|
110
|
+
if (page < 1)
|
|
111
|
+
page = 1;
|
|
112
|
+
if (page > this.getTotalPages())
|
|
113
|
+
page = this.getTotalPages();
|
|
114
|
+
this.currentPage = page;
|
|
115
|
+
return this.getCurrentPage();
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Go to specific cursor (cursor mode)
|
|
119
|
+
*/
|
|
120
|
+
goToCursor(cursor) {
|
|
121
|
+
if (this.mode === "offset") {
|
|
122
|
+
throw new Error("Use goToPage() in offset mode");
|
|
123
|
+
}
|
|
124
|
+
if (this.cursorMap.has(cursor)) {
|
|
125
|
+
this.currentCursor = cursor;
|
|
126
|
+
}
|
|
127
|
+
return this.getCurrentPageByCursor();
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Check if has next page
|
|
131
|
+
*/
|
|
132
|
+
hasNextPage() {
|
|
133
|
+
if (this.mode === "offset") {
|
|
134
|
+
return this.currentPage < this.getTotalPages();
|
|
135
|
+
}
|
|
136
|
+
const currentIndex = this.currentCursor
|
|
137
|
+
? this.cursorMap.get(this.currentCursor) ?? 0
|
|
138
|
+
: 0;
|
|
139
|
+
return currentIndex + this.pageSize < this.items.length;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Check if has previous page
|
|
143
|
+
*/
|
|
144
|
+
hasPreviousPage() {
|
|
145
|
+
if (this.mode === "offset") {
|
|
146
|
+
return this.currentPage > 1;
|
|
147
|
+
}
|
|
148
|
+
const currentIndex = this.currentCursor
|
|
149
|
+
? this.cursorMap.get(this.currentCursor) ?? 0
|
|
150
|
+
: 0;
|
|
151
|
+
return currentIndex > 0;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Get total pages (offset mode)
|
|
155
|
+
*/
|
|
156
|
+
getTotalPages() {
|
|
157
|
+
return Math.ceil(this.items.length / this.pageSize);
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Get total items
|
|
161
|
+
*/
|
|
162
|
+
getTotalItems() {
|
|
163
|
+
return this.items.length;
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Get current page number (offset mode)
|
|
167
|
+
*/
|
|
168
|
+
getCurrentPageNumber() {
|
|
169
|
+
return this.currentPage;
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Get pagination state (offset mode)
|
|
173
|
+
*/
|
|
174
|
+
getState() {
|
|
175
|
+
return {
|
|
176
|
+
currentPage: this.currentPage,
|
|
177
|
+
pageSize: this.pageSize,
|
|
178
|
+
total: this.items.length,
|
|
179
|
+
totalPages: this.getTotalPages(),
|
|
180
|
+
hasNextPage: this.hasNextPage(),
|
|
181
|
+
hasPreviousPage: this.hasPreviousPage(),
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Get cursor pagination state (cursor mode)
|
|
186
|
+
*/
|
|
187
|
+
getCursorState() {
|
|
188
|
+
const currentIndex = this.currentCursor
|
|
189
|
+
? this.cursorMap.get(this.currentCursor) ?? 0
|
|
190
|
+
: 0;
|
|
191
|
+
const nextIndex = currentIndex + this.pageSize;
|
|
192
|
+
const previousIndex = Math.max(0, currentIndex - this.pageSize);
|
|
193
|
+
return {
|
|
194
|
+
cursor: this.currentCursor,
|
|
195
|
+
nextCursor: nextIndex < this.items.length
|
|
196
|
+
? this.generateCursor(nextIndex)
|
|
197
|
+
: undefined,
|
|
198
|
+
previousCursor: previousIndex > 0
|
|
199
|
+
? this.generateCursor(previousIndex)
|
|
200
|
+
: undefined,
|
|
201
|
+
hasNextPage: nextIndex < this.items.length,
|
|
202
|
+
hasPreviousPage: currentIndex > 0,
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Reset to first page
|
|
207
|
+
*/
|
|
208
|
+
reset() {
|
|
209
|
+
this.currentPage = 1;
|
|
210
|
+
this.currentCursor = undefined;
|
|
211
|
+
this.cursorMap.clear();
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Set page size
|
|
215
|
+
*/
|
|
216
|
+
setPageSize(size) {
|
|
217
|
+
if (size <= 0)
|
|
218
|
+
throw new Error("Page size must be greater than 0");
|
|
219
|
+
this.pageSize = size;
|
|
220
|
+
this.reset();
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Generate cursor from index
|
|
224
|
+
*/
|
|
225
|
+
generateCursor(index) {
|
|
226
|
+
return Buffer.from(index.toString()).toString("base64");
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Decode cursor to index
|
|
230
|
+
*/
|
|
231
|
+
decodeCursor(cursor) {
|
|
232
|
+
try {
|
|
233
|
+
return parseInt(Buffer.from(cursor, "base64").toString(), 10);
|
|
234
|
+
}
|
|
235
|
+
catch {
|
|
236
|
+
return 0;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Get all items
|
|
241
|
+
*/
|
|
242
|
+
getAllItems() {
|
|
243
|
+
return [...this.items];
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Update items
|
|
247
|
+
*/
|
|
248
|
+
setItems(items) {
|
|
249
|
+
this.items = items;
|
|
250
|
+
this.reset();
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Factory function for creating paginators
|
|
255
|
+
*/
|
|
256
|
+
export function createPaginator(items, options) {
|
|
257
|
+
return new PaginationHelper(items, options);
|
|
258
|
+
}
|
|
259
|
+
//# sourceMappingURL=PaginationHelper.js.map
|