@rudderstack/integrations-lib 0.2.34 → 0.2.36
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/build/sdks/sfmc/index.d.ts +26 -3
- package/build/sdks/sfmc/index.d.ts.map +1 -1
- package/build/sdks/sfmc/index.js +108 -16
- package/build/sdks/sfmc/type.d.ts +44 -24
- package/build/sdks/sfmc/type.d.ts.map +1 -1
- package/build/sdks/sfmc/type.js +1 -1
- package/build/utils/benchmark.d.ts +180 -0
- package/build/utils/benchmark.d.ts.map +1 -0
- package/build/utils/benchmark.js +288 -0
- package/build/utils/misc.d.ts +24 -7
- package/build/utils/misc.d.ts.map +1 -1
- package/build/utils/misc.js +48 -11
- package/package.json +1 -1
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Benchmark utilities for performance testing
|
|
3
|
+
*
|
|
4
|
+
* Provides easy-to-use tools for measuring function performance,
|
|
5
|
+
* memory usage, and creating performance comparisons.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* import { benchmark, createBenchmarkSuite } from './benchmark';
|
|
10
|
+
*
|
|
11
|
+
* // Simple benchmark
|
|
12
|
+
* const result = await benchmark('myFunction', () => myFunction(data));
|
|
13
|
+
* console.log(`Duration: ${result.duration}ms`);
|
|
14
|
+
*
|
|
15
|
+
* // Benchmark suite
|
|
16
|
+
* const suite = createBenchmarkSuite('Array Operations');
|
|
17
|
+
* suite.add('native map', () => data.map(x => x * 2));
|
|
18
|
+
* suite.add('custom map', () => customMap(data, x => x * 2));
|
|
19
|
+
* await suite.run();
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
/**
|
|
23
|
+
* Result of a benchmark measurement
|
|
24
|
+
*/
|
|
25
|
+
export type BenchmarkResult = {
|
|
26
|
+
/** Name of the benchmark */
|
|
27
|
+
name: string;
|
|
28
|
+
/** Total duration in milliseconds */
|
|
29
|
+
duration: number;
|
|
30
|
+
/** Operations per second */
|
|
31
|
+
opsPerSecond: number;
|
|
32
|
+
/** Memory used in bytes (heap difference) */
|
|
33
|
+
memoryUsed: number;
|
|
34
|
+
/** Number of iterations run */
|
|
35
|
+
iterations: number;
|
|
36
|
+
/** Average duration per iteration in milliseconds */
|
|
37
|
+
avgDuration: number;
|
|
38
|
+
/** Standard deviation of durations */
|
|
39
|
+
stdDev: number;
|
|
40
|
+
/** Minimum duration observed */
|
|
41
|
+
minDuration: number;
|
|
42
|
+
/** Maximum duration observed */
|
|
43
|
+
maxDuration: number;
|
|
44
|
+
};
|
|
45
|
+
/**
|
|
46
|
+
* Configuration options for benchmarks
|
|
47
|
+
*/
|
|
48
|
+
export type BenchmarkOptions = {
|
|
49
|
+
/** Number of iterations to run (default: 1) */
|
|
50
|
+
iterations?: number;
|
|
51
|
+
/** Number of warmup runs before measuring (default: 1) */
|
|
52
|
+
warmupRuns?: number;
|
|
53
|
+
/** Whether to force garbage collection between runs (default: false) */
|
|
54
|
+
forceGC?: boolean;
|
|
55
|
+
/** Whether to measure memory usage (default: true) */
|
|
56
|
+
measureMemory?: boolean;
|
|
57
|
+
/** Timeout in milliseconds for the entire benchmark (default: 30000) */
|
|
58
|
+
timeout?: number;
|
|
59
|
+
};
|
|
60
|
+
/**
|
|
61
|
+
* Benchmark function type
|
|
62
|
+
*/
|
|
63
|
+
export type BenchmarkFunction<T = unknown> = () => T | Promise<T>;
|
|
64
|
+
/**
|
|
65
|
+
* Run a benchmark for a single function
|
|
66
|
+
*
|
|
67
|
+
* @param name - Name of the benchmark
|
|
68
|
+
* @param fn - Function to benchmark
|
|
69
|
+
* @param options - Benchmark configuration options
|
|
70
|
+
* @returns Promise resolving to benchmark results
|
|
71
|
+
*
|
|
72
|
+
* @example
|
|
73
|
+
* ```typescript
|
|
74
|
+
* const result = await benchmark('Array.map', () => {
|
|
75
|
+
* return largeArray.map(x => x * 2);
|
|
76
|
+
* }, { iterations: 10, warmupRuns: 3 });
|
|
77
|
+
*
|
|
78
|
+
* console.log(`${result.name}: ${result.avgDuration.toFixed(2)}ms avg`);
|
|
79
|
+
* ```
|
|
80
|
+
*/
|
|
81
|
+
export declare function benchmark(name: string, fn: BenchmarkFunction, options?: BenchmarkOptions): Promise<BenchmarkResult>;
|
|
82
|
+
/**
|
|
83
|
+
* Compare multiple functions with the same benchmark configuration
|
|
84
|
+
*
|
|
85
|
+
* @param benchmarks - Object with benchmark names and functions
|
|
86
|
+
* @param options - Benchmark configuration options
|
|
87
|
+
* @returns Promise resolving to array of benchmark results
|
|
88
|
+
*
|
|
89
|
+
* @example
|
|
90
|
+
* ```typescript
|
|
91
|
+
* const results = await compareBenchmarks({
|
|
92
|
+
* 'native map': () => data.map(x => x * 2),
|
|
93
|
+
* 'for loop': () => {
|
|
94
|
+
* const result = [];
|
|
95
|
+
* for (let i = 0; i < data.length; i++) {
|
|
96
|
+
* result.push(data[i] * 2);
|
|
97
|
+
* }
|
|
98
|
+
* return result;
|
|
99
|
+
* }
|
|
100
|
+
* }, { iterations: 5 });
|
|
101
|
+
*
|
|
102
|
+
* results.forEach(result => {
|
|
103
|
+
* console.log(`${result.name}: ${result.avgDuration.toFixed(2)}ms`);
|
|
104
|
+
* });
|
|
105
|
+
* ```
|
|
106
|
+
*/
|
|
107
|
+
export declare function compareBenchmarks(benchmarks: Record<string, BenchmarkFunction>, options?: BenchmarkOptions): Promise<BenchmarkResult[]>;
|
|
108
|
+
/**
|
|
109
|
+
* Benchmark suite for organizing and running multiple related benchmarks
|
|
110
|
+
*/
|
|
111
|
+
export declare class BenchmarkSuite {
|
|
112
|
+
readonly suiteName: string;
|
|
113
|
+
private benchmarks;
|
|
114
|
+
private options;
|
|
115
|
+
constructor(suiteName: string, options?: BenchmarkOptions);
|
|
116
|
+
/**
|
|
117
|
+
* Add a benchmark to the suite
|
|
118
|
+
*
|
|
119
|
+
* @param name - Name of the benchmark
|
|
120
|
+
* @param fn - Function to benchmark
|
|
121
|
+
* @returns This suite instance for chaining
|
|
122
|
+
*/
|
|
123
|
+
add(name: string, fn: BenchmarkFunction): this;
|
|
124
|
+
/**
|
|
125
|
+
* Run all benchmarks in the suite
|
|
126
|
+
*
|
|
127
|
+
* @param customOptions - Override suite options for this run
|
|
128
|
+
* @returns Promise resolving to array of benchmark results
|
|
129
|
+
*/
|
|
130
|
+
run(customOptions?: BenchmarkOptions): Promise<BenchmarkResult[]>;
|
|
131
|
+
/**
|
|
132
|
+
* Get the number of benchmarks in the suite
|
|
133
|
+
*/
|
|
134
|
+
get size(): number;
|
|
135
|
+
/**
|
|
136
|
+
* Clear all benchmarks from the suite
|
|
137
|
+
*/
|
|
138
|
+
clear(): this;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Create a new benchmark suite
|
|
142
|
+
*
|
|
143
|
+
* @param suiteName - Name of the benchmark suite
|
|
144
|
+
* @param options - Default options for all benchmarks in the suite
|
|
145
|
+
* @returns New BenchmarkSuite instance
|
|
146
|
+
*
|
|
147
|
+
* @example
|
|
148
|
+
* ```typescript
|
|
149
|
+
* const suite = createBenchmarkSuite('String Operations', {
|
|
150
|
+
* iterations: 10,
|
|
151
|
+
* warmupRuns: 2
|
|
152
|
+
* });
|
|
153
|
+
*
|
|
154
|
+
* suite
|
|
155
|
+
* .add('concat', () => str1 + str2)
|
|
156
|
+
* .add('template', () => `${str1}${str2}`)
|
|
157
|
+
* .add('join', () => [str1, str2].join(''));
|
|
158
|
+
*
|
|
159
|
+
* await suite.run();
|
|
160
|
+
* ```
|
|
161
|
+
*/
|
|
162
|
+
export declare function createBenchmarkSuite(suiteName: string, options?: BenchmarkOptions): BenchmarkSuite;
|
|
163
|
+
/**
|
|
164
|
+
* Utility to measure memory usage of a function
|
|
165
|
+
*
|
|
166
|
+
* @param fn - Function to measure
|
|
167
|
+
* @param forceGC - Whether to force garbage collection before measuring
|
|
168
|
+
* @returns Memory usage in bytes
|
|
169
|
+
*
|
|
170
|
+
* @example
|
|
171
|
+
* ```typescript
|
|
172
|
+
* const memoryUsed = await measureMemory(() => {
|
|
173
|
+
* return new Array(100000).fill(0).map(x => ({ value: x }));
|
|
174
|
+
* });
|
|
175
|
+
*
|
|
176
|
+
* console.log(`Memory used: ${(memoryUsed / 1024 / 1024).toFixed(2)}MB`);
|
|
177
|
+
* ```
|
|
178
|
+
*/
|
|
179
|
+
export declare function measureMemory(fn: BenchmarkFunction, forceGC?: boolean): Promise<number>;
|
|
180
|
+
//# sourceMappingURL=benchmark.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"benchmark.d.ts","sourceRoot":"","sources":["../../src/utils/benchmark.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B,4BAA4B;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,qCAAqC;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,4BAA4B;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,6CAA6C;IAC7C,UAAU,EAAE,MAAM,CAAC;IACnB,+BAA+B;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,qDAAqD;IACrD,WAAW,EAAE,MAAM,CAAC;IACpB,sCAAsC;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,gCAAgC;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,gCAAgC;IAChC,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC7B,+CAA+C;IAC/C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,0DAA0D;IAC1D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,wEAAwE;IACxE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,sDAAsD;IACtD,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,wEAAwE;IACxE,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,iBAAiB,CAAC,CAAC,GAAG,OAAO,IAAI,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;AAqBlE;;;;;;;;;;;;;;;;GAgBG;AAEH,wBAAsB,SAAS,CAC7B,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,iBAAiB,EACrB,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,eAAe,CAAC,CA4E1B;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAsB,iBAAiB,CACrC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,EAC7C,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,eAAe,EAAE,CAAC,CAM5B;AAED;;GAEG;AACH,qBAAa,cAAc;aAKG,SAAS,EAAE,MAAM;IAJ7C,OAAO,CAAC,UAAU,CAAsD;IAExE,OAAO,CAAC,OAAO,CAAmB;gBAEN,SAAS,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB;IAI7E;;;;;;OAMG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,iBAAiB,GAAG,IAAI;IAK9C;;;;;OAKG;IACG,GAAG,CAAC,aAAa,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAkEvE;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED;;OAEG;IACH,KAAK,IAAI,IAAI;CAId;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,gBAAgB,GACzB,cAAc,CAEhB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,aAAa,CAAC,EAAE,EAAE,iBAAiB,EAAE,OAAO,UAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAU1F"}
|
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Benchmark utilities for performance testing
|
|
4
|
+
*
|
|
5
|
+
* Provides easy-to-use tools for measuring function performance,
|
|
6
|
+
* memory usage, and creating performance comparisons.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```typescript
|
|
10
|
+
* import { benchmark, createBenchmarkSuite } from './benchmark';
|
|
11
|
+
*
|
|
12
|
+
* // Simple benchmark
|
|
13
|
+
* const result = await benchmark('myFunction', () => myFunction(data));
|
|
14
|
+
* console.log(`Duration: ${result.duration}ms`);
|
|
15
|
+
*
|
|
16
|
+
* // Benchmark suite
|
|
17
|
+
* const suite = createBenchmarkSuite('Array Operations');
|
|
18
|
+
* suite.add('native map', () => data.map(x => x * 2));
|
|
19
|
+
* suite.add('custom map', () => customMap(data, x => x * 2));
|
|
20
|
+
* await suite.run();
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
24
|
+
exports.BenchmarkSuite = void 0;
|
|
25
|
+
exports.benchmark = benchmark;
|
|
26
|
+
exports.compareBenchmarks = compareBenchmarks;
|
|
27
|
+
exports.createBenchmarkSuite = createBenchmarkSuite;
|
|
28
|
+
exports.measureMemory = measureMemory;
|
|
29
|
+
/**
|
|
30
|
+
* Force garbage collection if available
|
|
31
|
+
*/
|
|
32
|
+
function forceGarbageCollection() {
|
|
33
|
+
if (typeof global !== 'undefined' && global.gc) {
|
|
34
|
+
global.gc();
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Calculate standard deviation of an array of numbers
|
|
39
|
+
*/
|
|
40
|
+
function calculateStdDev(values) {
|
|
41
|
+
const mean = values.reduce((sum, val) => sum + val, 0) / values.length;
|
|
42
|
+
const squaredDiffs = values.map((val) => (val - mean) ** 2);
|
|
43
|
+
const avgSquaredDiff = squaredDiffs.reduce((sum, val) => sum + val, 0) / values.length;
|
|
44
|
+
return Math.sqrt(avgSquaredDiff);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Run a benchmark for a single function
|
|
48
|
+
*
|
|
49
|
+
* @param name - Name of the benchmark
|
|
50
|
+
* @param fn - Function to benchmark
|
|
51
|
+
* @param options - Benchmark configuration options
|
|
52
|
+
* @returns Promise resolving to benchmark results
|
|
53
|
+
*
|
|
54
|
+
* @example
|
|
55
|
+
* ```typescript
|
|
56
|
+
* const result = await benchmark('Array.map', () => {
|
|
57
|
+
* return largeArray.map(x => x * 2);
|
|
58
|
+
* }, { iterations: 10, warmupRuns: 3 });
|
|
59
|
+
*
|
|
60
|
+
* console.log(`${result.name}: ${result.avgDuration.toFixed(2)}ms avg`);
|
|
61
|
+
* ```
|
|
62
|
+
*/
|
|
63
|
+
// eslint-disable-next-line require-await
|
|
64
|
+
async function benchmark(name, fn, options = {}) {
|
|
65
|
+
const { iterations = 1, warmupRuns = 1, forceGC = false, measureMemory: shouldMeasureMemory = true, timeout = 30000, } = options;
|
|
66
|
+
// Timeout protection
|
|
67
|
+
let timeoutId;
|
|
68
|
+
const timeoutPromise = new Promise((_, reject) => {
|
|
69
|
+
timeoutId = setTimeout(() => reject(new Error(`Benchmark "${name}" timed out after ${timeout}ms`)), timeout);
|
|
70
|
+
});
|
|
71
|
+
const benchmarkPromise = async () => {
|
|
72
|
+
// Warmup runs
|
|
73
|
+
await Promise.all(Array.from({ length: warmupRuns }, async () => {
|
|
74
|
+
await fn();
|
|
75
|
+
}));
|
|
76
|
+
if (forceGC) {
|
|
77
|
+
forceGarbageCollection();
|
|
78
|
+
}
|
|
79
|
+
const durations = [];
|
|
80
|
+
const startMemory = shouldMeasureMemory ? process.memoryUsage().heapUsed : 0;
|
|
81
|
+
const overallStart = performance.now();
|
|
82
|
+
// Actual benchmark runs
|
|
83
|
+
for (let i = 0; i < iterations; i += 1) {
|
|
84
|
+
if (forceGC && i > 0) {
|
|
85
|
+
forceGarbageCollection();
|
|
86
|
+
}
|
|
87
|
+
const iterationStart = performance.now();
|
|
88
|
+
// eslint-disable-next-line no-await-in-loop
|
|
89
|
+
await fn();
|
|
90
|
+
const iterationEnd = performance.now();
|
|
91
|
+
durations.push(iterationEnd - iterationStart);
|
|
92
|
+
}
|
|
93
|
+
const overallEnd = performance.now();
|
|
94
|
+
const endMemory = shouldMeasureMemory ? process.memoryUsage().heapUsed : 0;
|
|
95
|
+
const totalDuration = overallEnd - overallStart;
|
|
96
|
+
const avgDuration = durations.length > 0 ? durations.reduce((sum, d) => sum + d, 0) / durations.length : 0;
|
|
97
|
+
const minDuration = durations.length > 0 ? Math.min(...durations) : 0;
|
|
98
|
+
const maxDuration = durations.length > 0 ? Math.max(...durations) : 0;
|
|
99
|
+
const stdDev = durations.length > 0 ? calculateStdDev(durations) : 0;
|
|
100
|
+
const opsPerSecond = totalDuration > 0 ? iterations / (totalDuration / 1000) : 0;
|
|
101
|
+
const memoryUsed = endMemory - startMemory;
|
|
102
|
+
return {
|
|
103
|
+
name,
|
|
104
|
+
duration: totalDuration,
|
|
105
|
+
opsPerSecond,
|
|
106
|
+
memoryUsed,
|
|
107
|
+
iterations,
|
|
108
|
+
avgDuration,
|
|
109
|
+
stdDev,
|
|
110
|
+
minDuration,
|
|
111
|
+
maxDuration,
|
|
112
|
+
};
|
|
113
|
+
};
|
|
114
|
+
return Promise.race([benchmarkPromise(), timeoutPromise]).finally(() => {
|
|
115
|
+
clearTimeout(timeoutId);
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Compare multiple functions with the same benchmark configuration
|
|
120
|
+
*
|
|
121
|
+
* @param benchmarks - Object with benchmark names and functions
|
|
122
|
+
* @param options - Benchmark configuration options
|
|
123
|
+
* @returns Promise resolving to array of benchmark results
|
|
124
|
+
*
|
|
125
|
+
* @example
|
|
126
|
+
* ```typescript
|
|
127
|
+
* const results = await compareBenchmarks({
|
|
128
|
+
* 'native map': () => data.map(x => x * 2),
|
|
129
|
+
* 'for loop': () => {
|
|
130
|
+
* const result = [];
|
|
131
|
+
* for (let i = 0; i < data.length; i++) {
|
|
132
|
+
* result.push(data[i] * 2);
|
|
133
|
+
* }
|
|
134
|
+
* return result;
|
|
135
|
+
* }
|
|
136
|
+
* }, { iterations: 5 });
|
|
137
|
+
*
|
|
138
|
+
* results.forEach(result => {
|
|
139
|
+
* console.log(`${result.name}: ${result.avgDuration.toFixed(2)}ms`);
|
|
140
|
+
* });
|
|
141
|
+
* ```
|
|
142
|
+
*/
|
|
143
|
+
async function compareBenchmarks(benchmarks, options = {}) {
|
|
144
|
+
const results = await Promise.all(Object.entries(benchmarks).map(([name, fn]) => benchmark(name, fn, options)));
|
|
145
|
+
return results.sort((a, b) => a.avgDuration - b.avgDuration);
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Benchmark suite for organizing and running multiple related benchmarks
|
|
149
|
+
*/
|
|
150
|
+
class BenchmarkSuite {
|
|
151
|
+
constructor(suiteName, options = {}) {
|
|
152
|
+
this.suiteName = suiteName;
|
|
153
|
+
this.benchmarks = [];
|
|
154
|
+
this.options = options;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Add a benchmark to the suite
|
|
158
|
+
*
|
|
159
|
+
* @param name - Name of the benchmark
|
|
160
|
+
* @param fn - Function to benchmark
|
|
161
|
+
* @returns This suite instance for chaining
|
|
162
|
+
*/
|
|
163
|
+
add(name, fn) {
|
|
164
|
+
this.benchmarks.push({ name, fn });
|
|
165
|
+
return this;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Run all benchmarks in the suite
|
|
169
|
+
*
|
|
170
|
+
* @param customOptions - Override suite options for this run
|
|
171
|
+
* @returns Promise resolving to array of benchmark results
|
|
172
|
+
*/
|
|
173
|
+
async run(customOptions) {
|
|
174
|
+
const options = { ...this.options, ...customOptions };
|
|
175
|
+
const results = [];
|
|
176
|
+
// eslint-disable-next-line no-console
|
|
177
|
+
console.log(`\n🚀 Running benchmark suite: ${this.suiteName}`);
|
|
178
|
+
// eslint-disable-next-line no-console
|
|
179
|
+
console.log('='.repeat(60));
|
|
180
|
+
// eslint-disable-next-line no-restricted-syntax
|
|
181
|
+
for (const { name, fn } of this.benchmarks) {
|
|
182
|
+
// eslint-disable-next-line no-console
|
|
183
|
+
console.log(`\n⏱️ Running: ${name}...`);
|
|
184
|
+
try {
|
|
185
|
+
// eslint-disable-next-line no-await-in-loop
|
|
186
|
+
const result = await benchmark(name, fn, options);
|
|
187
|
+
results.push(result);
|
|
188
|
+
// eslint-disable-next-line no-console
|
|
189
|
+
console.log(` ✅ ${result.avgDuration.toFixed(2)}ms avg (${result.opsPerSecond.toFixed(0)} ops/sec)`);
|
|
190
|
+
if (options.measureMemory) {
|
|
191
|
+
// eslint-disable-next-line no-console
|
|
192
|
+
console.log(` 💾 Memory: ${(result.memoryUsed / 1024 / 1024).toFixed(2)}MB`);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
catch (error) {
|
|
196
|
+
// eslint-disable-next-line no-console
|
|
197
|
+
console.log(` ❌ Failed: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
// Summary
|
|
201
|
+
if (results.length > 1) {
|
|
202
|
+
// eslint-disable-next-line no-console
|
|
203
|
+
console.log(`\n📊 Summary (sorted by performance):`);
|
|
204
|
+
const sortedResults = [...results].sort((a, b) => a.avgDuration - b.avgDuration);
|
|
205
|
+
const fastest = sortedResults[0];
|
|
206
|
+
sortedResults.forEach((result, index) => {
|
|
207
|
+
const relative = result.avgDuration / fastest.avgDuration;
|
|
208
|
+
let icon = ' ';
|
|
209
|
+
if (index === 0)
|
|
210
|
+
icon = '🥇';
|
|
211
|
+
else if (index === 1)
|
|
212
|
+
icon = '🥈';
|
|
213
|
+
else if (index === 2)
|
|
214
|
+
icon = '🥉';
|
|
215
|
+
// eslint-disable-next-line no-console
|
|
216
|
+
console.log(` ${icon} ${result.name.padEnd(25)} | ${result.avgDuration.toFixed(2)}ms | ${relative.toFixed(2)}x`);
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
// eslint-disable-next-line no-console
|
|
220
|
+
console.log(`\n✅ Suite completed: ${results.length}/${this.benchmarks.length} benchmarks successful\n`);
|
|
221
|
+
return results;
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Get the number of benchmarks in the suite
|
|
225
|
+
*/
|
|
226
|
+
get size() {
|
|
227
|
+
return this.benchmarks.length;
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Clear all benchmarks from the suite
|
|
231
|
+
*/
|
|
232
|
+
clear() {
|
|
233
|
+
this.benchmarks = [];
|
|
234
|
+
return this;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
exports.BenchmarkSuite = BenchmarkSuite;
|
|
238
|
+
/**
|
|
239
|
+
* Create a new benchmark suite
|
|
240
|
+
*
|
|
241
|
+
* @param suiteName - Name of the benchmark suite
|
|
242
|
+
* @param options - Default options for all benchmarks in the suite
|
|
243
|
+
* @returns New BenchmarkSuite instance
|
|
244
|
+
*
|
|
245
|
+
* @example
|
|
246
|
+
* ```typescript
|
|
247
|
+
* const suite = createBenchmarkSuite('String Operations', {
|
|
248
|
+
* iterations: 10,
|
|
249
|
+
* warmupRuns: 2
|
|
250
|
+
* });
|
|
251
|
+
*
|
|
252
|
+
* suite
|
|
253
|
+
* .add('concat', () => str1 + str2)
|
|
254
|
+
* .add('template', () => `${str1}${str2}`)
|
|
255
|
+
* .add('join', () => [str1, str2].join(''));
|
|
256
|
+
*
|
|
257
|
+
* await suite.run();
|
|
258
|
+
* ```
|
|
259
|
+
*/
|
|
260
|
+
function createBenchmarkSuite(suiteName, options) {
|
|
261
|
+
return new BenchmarkSuite(suiteName, options);
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Utility to measure memory usage of a function
|
|
265
|
+
*
|
|
266
|
+
* @param fn - Function to measure
|
|
267
|
+
* @param forceGC - Whether to force garbage collection before measuring
|
|
268
|
+
* @returns Memory usage in bytes
|
|
269
|
+
*
|
|
270
|
+
* @example
|
|
271
|
+
* ```typescript
|
|
272
|
+
* const memoryUsed = await measureMemory(() => {
|
|
273
|
+
* return new Array(100000).fill(0).map(x => ({ value: x }));
|
|
274
|
+
* });
|
|
275
|
+
*
|
|
276
|
+
* console.log(`Memory used: ${(memoryUsed / 1024 / 1024).toFixed(2)}MB`);
|
|
277
|
+
* ```
|
|
278
|
+
*/
|
|
279
|
+
async function measureMemory(fn, forceGC = true) {
|
|
280
|
+
if (forceGC) {
|
|
281
|
+
forceGarbageCollection();
|
|
282
|
+
}
|
|
283
|
+
const startMemory = process.memoryUsage().heapUsed;
|
|
284
|
+
await fn();
|
|
285
|
+
const endMemory = process.memoryUsage().heapUsed;
|
|
286
|
+
return endMemory - startMemory;
|
|
287
|
+
}
|
|
288
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmVuY2htYXJrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL2JlbmNobWFyay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHOzs7QUFvRkgsOEJBZ0ZDO0FBMkJELDhDQVNDO0FBd0lELG9EQUtDO0FBa0JELHNDQVVDO0FBbFVEOztHQUVHO0FBQ0gsU0FBUyxzQkFBc0I7SUFDN0IsSUFBSSxPQUFPLE1BQU0sS0FBSyxXQUFXLElBQUksTUFBTSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQy9DLE1BQU0sQ0FBQyxFQUFFLEVBQUUsQ0FBQztJQUNkLENBQUM7QUFDSCxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFTLGVBQWUsQ0FBQyxNQUFnQjtJQUN2QyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQ3ZFLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzVELE1BQU0sY0FBYyxHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDdkYsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0FBQ25DLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUNILHlDQUF5QztBQUNsQyxLQUFLLFVBQVUsU0FBUyxDQUM3QixJQUFZLEVBQ1osRUFBcUIsRUFDckIsVUFBNEIs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QUksY0FBYyxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNoRCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0ksS0FBSyxVQUFVLGFBQWEsQ0FBQyxFQUFxQixFQUFFLE9BQU8sR0FBRyxJQUFJO0lBQ3ZFLElBQUksT0FBTyxFQUFFLENBQUM7UUFDWixzQkFBc0IsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRCxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDO0lBQ25ELE1BQU0sRUFBRSxFQUFFLENBQUM7SUFDWCxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDO0lBRWpELE9BQU8sU0FBUyxHQUFHLFdBQVcsQ0FBQztBQUNqQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBCZW5jaG1hcmsgdXRpbGl0aWVzIGZvciBwZXJmb3JtYW5jZSB0ZXN0aW5nXG4gKlxuICogUHJvdmlkZXMgZWFzeS10by11c2UgdG9vbHMgZm9yIG1lYXN1cmluZyBmdW5jdGlvbiBwZXJmb3JtYW5jZSxcbiAqIG1lbW9yeSB1c2FnZSwgYW5kIGNyZWF0aW5nIHBlcmZvcm1hbmNlIGNvbXBhcmlzb25zLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBiZW5jaG1hcmssIGNyZWF0ZUJlbmNobWFya1N1aXRlIH0gZnJvbSAnLi9iZW5jaG1hcmsnO1xuICpcbiAqIC8vIFNpbXBsZSBiZW5jaG1hcmtcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGJlbmNobWFyaygnbXlGdW5jdGlvbicsICgpID0+IG15RnVuY3Rpb24oZGF0YSkpO1xuICogY29uc29sZS5sb2coYER1cmF0aW9uOiAke3Jlc3VsdC5kdXJhdGlvbn1tc2ApO1xuICpcbiAqIC8vIEJlbmNobWFyayBzdWl0ZVxuICogY29uc3Qgc3VpdGUgPSBjcmVhdGVCZW5jaG1hcmtTdWl0ZSgnQXJyYXkgT3BlcmF0aW9ucycpO1xuICogc3VpdGUuYWRkKCduYXRpdmUgbWFwJywgKCkgPT4gZGF0YS5tYXAoeCA9PiB4ICogMikpO1xuICogc3VpdGUuYWRkKCdjdXN0b20gbWFwJywgKCkgPT4gY3VzdG9tTWFwKGRhdGEsIHggPT4geCAqIDIpKTtcbiAqIGF3YWl0IHN1aXRlLnJ1bigpO1xuICogYGBgXG4gKi9cblxuLyoqXG4gKiBSZXN1bHQgb2YgYSBiZW5jaG1hcmsgbWVhc3VyZW1lbnRcbiAqL1xuZXhwb3J0IHR5cGUgQmVuY2htYXJrUmVzdWx0ID0ge1xuICAvKiogTmFtZSBvZiB0aGUgYmVuY2htYXJrICovXG4gIG5hbWU6IHN0cmluZztcbiAgLyoqIFRvdGFsIGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kcyAqL1xuICBkdXJhdGlvbjogbnVtYmVyO1xuICAvKiogT3BlcmF0aW9ucyBwZXIgc2Vjb25kICovXG4gIG9wc1BlclNlY29uZDogbnVtYmVyO1xuICAvKiogTWVtb3J5IHVzZWQgaW4gYnl0ZXMgKGhlYXAgZGlmZmVyZW5jZSkgKi9cbiAgbWVtb3J5VXNlZDogbnVtYmVyO1xuICAvKiogTnVtYmVyIG9mIGl0ZXJhdGlvbnMgcnVuICovXG4gIGl0ZXJhdGlvbnM6IG51bWJlcjtcbiAgLyoqIEF2ZXJhZ2UgZHVyYXRpb24gcGVyIGl0ZXJhdGlvbiBpbiBtaWxsaXNlY29uZHMgKi9cbiAgYXZnRHVyYXRpb246IG51bWJlcjtcbiAgLyoqIFN0YW5kYXJkIGRldmlhdGlvbiBvZiBkdXJhdGlvbnMgKi9cbiAgc3RkRGV2OiBudW1iZXI7XG4gIC8qKiBNaW5pbXVtIGR1cmF0aW9uIG9ic2VydmVkICovXG4gIG1pbkR1cmF0aW9uOiBudW1iZXI7XG4gIC8qKiBNYXhpbXVtIGR1cmF0aW9uIG9ic2VydmVkICovXG4gIG1heER1cmF0aW9uOiBudW1iZXI7XG59O1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgYmVuY2htYXJrc1xuICovXG5leHBvcnQgdHlwZSBCZW5jaG1hcmtPcHRpb25zID0ge1xuICAvKiogTnVtYmVyIG9mIGl0ZXJhdGlvbnMgdG8gcnVuIChkZWZhdWx0OiAxKSAqL1xuICBpdGVyYXRpb25zPzogbnVtYmVyO1xuICAvKiogTnVtYmVyIG9mIHdhcm11cCBydW5zIGJlZm9yZSBtZWFzdXJpbmcgKGRlZmF1bHQ6IDEpICovXG4gIHdhcm11cFJ1bnM/OiBudW1iZXI7XG4gIC8qKiBXaGV0aGVyIHRvIGZvcmNlIGdhcmJhZ2UgY29sbGVjdGlvbiBiZXR3ZWVuIHJ1bnMgKGRlZmF1bHQ6IGZhbHNlKSAqL1xuICBmb3JjZUdDPzogYm9vbGVhbjtcbiAgLyoqIFdoZXRoZXIgdG8gbWVhc3VyZSBtZW1vcnkgdXNhZ2UgKGRlZmF1bHQ6IHRydWUpICovXG4gIG1lYXN1cmVNZW1vcnk/OiBib29sZWFuO1xuICAvKiogVGltZW91dCBpbiBtaWxsaXNlY29uZHMgZm9yIHRoZSBlbnRpcmUgYmVuY2htYXJrIChkZWZhdWx0OiAzMDAwMCkgKi9cbiAgdGltZW91dD86IG51bWJlcjtcbn07XG5cbi8qKlxuICogQmVuY2htYXJrIGZ1bmN0aW9uIHR5cGVcbiAqL1xuZXhwb3J0IHR5cGUgQmVuY2htYXJrRnVuY3Rpb248VCA9IHVua25vd24+ID0gKCkgPT4gVCB8IFByb21pc2U8VD47XG5cbi8qKlxuICogRm9yY2UgZ2FyYmFnZSBjb2xsZWN0aW9uIGlmIGF2YWlsYWJsZVxuICovXG5mdW5jdGlvbiBmb3JjZUdhcmJhZ2VDb2xsZWN0aW9uKCk6IHZvaWQge1xuICBpZiAodHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcgJiYgZ2xvYmFsLmdjKSB7XG4gICAgZ2xvYmFsLmdjKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBDYWxjdWxhdGUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIGFuIGFycmF5IG9mIG51bWJlcnNcbiAqL1xuZnVuY3Rpb24gY2FsY3VsYXRlU3RkRGV2KHZhbHVlczogbnVtYmVyW10pOiBudW1iZXIge1xuICBjb25zdCBtZWFuID0gdmFsdWVzLnJlZHVjZSgoc3VtLCB2YWwpID0+IHN1bSArIHZhbCwgMCkgLyB2YWx1ZXMubGVuZ3RoO1xuICBjb25zdCBzcXVhcmVkRGlmZnMgPSB2YWx1ZXMubWFwKCh2YWwpID0+ICh2YWwgLSBtZWFuKSAqKiAyKTtcbiAgY29uc3QgYXZnU3F1YXJlZERpZmYgPSBzcXVhcmVkRGlmZnMucmVkdWNlKChzdW0sIHZhbCkgPT4gc3VtICsgdmFsLCAwKSAvIHZhbHVlcy5sZW5ndGg7XG4gIHJldHVybiBNYXRoLnNxcnQoYXZnU3F1YXJlZERpZmYpO1xufVxuXG4vKipcbiAqIFJ1biBhIGJlbmNobWFyayBmb3IgYSBzaW5nbGUgZnVuY3Rpb25cbiAqXG4gKiBAcGFyYW0gbmFtZSAtIE5hbWUgb2YgdGhlIGJlbmNobWFya1xuICogQHBhcmFtIGZuIC0gRnVuY3Rpb24gdG8gYmVuY2htYXJrXG4gKiBAcGFyYW0gb3B0aW9ucyAtIEJlbmNobWFyayBjb25maWd1cmF0aW9uIG9wdGlvbnNcbiAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIGJlbmNobWFyayByZXN1bHRzXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGJlbmNobWFyaygnQXJyYXkubWFwJywgKCkgPT4ge1xuICogICByZXR1cm4gbGFyZ2VBcnJheS5tYXAoeCA9PiB4ICogMik7XG4gKiB9LCB7IGl0ZXJhdGlvbnM6IDEwLCB3YXJtdXBSdW5zOiAzIH0pO1xuICpcbiAqIGNvbnNvbGUubG9nKGAke3Jlc3VsdC5uYW1lfTogJHtyZXN1bHQuYXZnRHVyYXRpb24udG9GaXhlZCgyKX1tcyBhdmdgKTtcbiAqIGBgYFxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVxdWlyZS1hd2FpdFxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJlbmNobWFyayhcbiAgbmFtZTogc3RyaW5nLFxuICBmbjogQmVuY2htYXJrRnVuY3Rpb24sXG4gIG9wdGlvbnM6IEJlbmNobWFya09wdGlvbnMgPSB7fSxcbik6IFByb21pc2U8QmVuY2htYXJrUmVzdWx0PiB7XG4gIGNvbnN0IHtcbiAgICBpdGVyYXRpb25zID0gMSxcbiAgICB3YXJtdXBSdW5zID0gMSxcbiAgICBmb3JjZUdDID0gZmFsc2UsXG4gICAgbWVhc3VyZU1lbW9yeTogc2hvdWxkTWVhc3VyZU1lbW9yeSA9IHRydWUsXG4gICAgdGltZW91dCA9IDMwMDAwLFxuICB9ID0gb3B0aW9ucztcblxuICAvLyBUaW1lb3V0IHByb3RlY3Rpb25cbiAgbGV0IHRpbWVvdXRJZDogTm9kZUpTLlRpbWVvdXQ7XG4gIGNvbnN0IHRpbWVvdXRQcm9taXNlID0gbmV3IFByb21pc2U8bmV2ZXI+KChfLCByZWplY3QpID0+IHtcbiAgICB0aW1lb3V0SWQgPSBzZXRUaW1lb3V0KFxuICAgICAgKCkgPT4gcmVqZWN0KG5ldyBFcnJvcihgQmVuY2htYXJrIFwiJHtuYW1lfVwiIHRpbWVkIG91dCBhZnRlciAke3RpbWVvdXR9bXNgKSksXG4gICAgICB0aW1lb3V0LFxuICAgICk7XG4gIH0pO1xuXG4gIGNvbnN0IGJlbmNobWFya1Byb21pc2UgPSBhc3luYyAoKTogUHJvbWlzZTxCZW5jaG1hcmtSZXN1bHQ+ID0+IHtcbiAgICAvLyBXYXJtdXAgcnVuc1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgQXJyYXkuZnJvbSh7IGxlbmd0aDogd2FybXVwUnVucyB9LCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IGZuKCk7XG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgaWYgKGZvcmNlR0MpIHtcbiAgICAgIGZvcmNlR2FyYmFnZUNvbGxlY3Rpb24oKTtcbiAgICB9XG5cbiAgICBjb25zdCBkdXJhdGlvbnM6IG51bWJlcltdID0gW107XG4gICAgY29uc3Qgc3RhcnRNZW1vcnkgPSBzaG91bGRNZWFzdXJlTWVtb3J5ID8gcHJvY2Vzcy5tZW1vcnlVc2FnZSgpLmhlYXBVc2VkIDogMDtcbiAgICBjb25zdCBvdmVyYWxsU3RhcnQgPSBwZXJmb3JtYW5jZS5ub3coKTtcblxuICAgIC8vIEFjdHVhbCBiZW5jaG1hcmsgcnVuc1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlcmF0aW9uczsgaSArPSAxKSB7XG4gICAgICBpZiAoZm9yY2VHQyAmJiBpID4gMCkge1xuICAgICAgICBmb3JjZUdhcmJhZ2VDb2xsZWN0aW9uKCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGl0ZXJhdGlvblN0YXJ0ID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXdhaXQtaW4tbG9vcFxuICAgICAgYXdhaXQgZm4oKTtcbiAgICAgIGNvbnN0IGl0ZXJhdGlvbkVuZCA9IHBlcmZvcm1hbmNlLm5vdygpO1xuXG4gICAgICBkdXJhdGlvbnMucHVzaChpdGVyYXRpb25FbmQgLSBpdGVyYXRpb25TdGFydCk7XG4gICAgfVxuXG4gICAgY29uc3Qgb3ZlcmFsbEVuZCA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAgIGNvbnN0IGVuZE1lbW9yeSA9IHNob3VsZE1lYXN1cmVNZW1vcnkgPyBwcm9jZXNzLm1lbW9yeVVzYWdlKCkuaGVhcFVzZWQgOiAwO1xuXG4gICAgY29uc3QgdG90YWxEdXJhdGlvbiA9IG92ZXJhbGxFbmQgLSBvdmVyYWxsU3RhcnQ7XG4gICAgY29uc3QgYXZnRHVyYXRpb24gPVxuICAgICAgZHVyYXRpb25zLmxlbmd0aCA+IDAgPyBkdXJhdGlvbnMucmVkdWNlKChzdW0sIGQpID0+IHN1bSArIGQsIDApIC8gZHVyYXRpb25zLmxlbmd0aCA6IDA7XG4gICAgY29uc3QgbWluRHVyYXRpb24gPSBkdXJhdGlvbnMubGVuZ3RoID4gMCA/IE1hdGgubWluKC4uLmR1cmF0aW9ucykgOiAwO1xuICAgIGNvbnN0IG1heER1cmF0aW9uID0gZHVyYXRpb25zLmxlbmd0aCA+IDAgPyBNYXRoLm1heCguLi5kdXJhdGlvbnMpIDogMDtcbiAgICBjb25zdCBzdGREZXYgPSBkdXJhdGlvbnMubGVuZ3RoID4gMCA/IGNhbGN1bGF0ZVN0ZERldihkdXJhdGlvbnMpIDogMDtcbiAgICBjb25zdCBvcHNQZXJTZWNvbmQgPSB0b3RhbER1cmF0aW9uID4gMCA/IGl0ZXJhdGlvbnMgLyAodG90YWxEdXJhdGlvbiAvIDEwMDApIDogMDtcbiAgICBjb25zdCBtZW1vcnlVc2VkID0gZW5kTWVtb3J5IC0gc3RhcnRNZW1vcnk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgbmFtZSxcbiAgICAgIGR1cmF0aW9uOiB0b3RhbER1cmF0aW9uLFxuICAgICAgb3BzUGVyU2Vjb25kLFxuICAgICAgbWVtb3J5VXNlZCxcbiAgICAgIGl0ZXJhdGlvbnMsXG4gICAgICBhdmdEdXJhdGlvbixcbiAgICAgIHN0ZERldixcbiAgICAgIG1pbkR1cmF0aW9uLFxuICAgICAgbWF4RHVyYXRpb24sXG4gICAgfTtcbiAgfTtcblxuICByZXR1cm4gUHJvbWlzZS5yYWNlKFtiZW5jaG1hcmtQcm9taXNlKCksIHRpbWVvdXRQcm9taXNlXSkuZmluYWxseSgoKSA9PiB7XG4gICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gIH0pO1xufVxuXG4vKipcbiAqIENvbXBhcmUgbXVsdGlwbGUgZnVuY3Rpb25zIHdpdGggdGhlIHNhbWUgYmVuY2htYXJrIGNvbmZpZ3VyYXRpb25cbiAqXG4gKiBAcGFyYW0gYmVuY2htYXJrcyAtIE9iamVjdCB3aXRoIGJlbmNobWFyayBuYW1lcyBhbmQgZnVuY3Rpb25zXG4gKiBAcGFyYW0gb3B0aW9ucyAtIEJlbmNobWFyayBjb25maWd1cmF0aW9uIG9wdGlvbnNcbiAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIGFycmF5IG9mIGJlbmNobWFyayByZXN1bHRzXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBjb21wYXJlQmVuY2htYXJrcyh7XG4gKiAgICduYXRpdmUgbWFwJzogKCkgPT4gZGF0YS5tYXAoeCA9PiB4ICogMiksXG4gKiAgICdmb3IgbG9vcCc6ICgpID0+IHtcbiAqICAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAqICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcbiAqICAgICAgIHJlc3VsdC5wdXNoKGRhdGFbaV0gKiAyKTtcbiAqICAgICB9XG4gKiAgICAgcmV0dXJuIHJlc3VsdDtcbiAqICAgfVxuICogfSwgeyBpdGVyYXRpb25zOiA1IH0pO1xuICpcbiAqIHJlc3VsdHMuZm9yRWFjaChyZXN1bHQgPT4ge1xuICogICBjb25zb2xlLmxvZyhgJHtyZXN1bHQubmFtZX06ICR7cmVzdWx0LmF2Z0R1cmF0aW9uLnRvRml4ZWQoMil9bXNgKTtcbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb21wYXJlQmVuY2htYXJrcyhcbiAgYmVuY2htYXJrczogUmVjb3JkPHN0cmluZywgQmVuY2htYXJrRnVuY3Rpb24+LFxuICBvcHRpb25zOiBCZW5jaG1hcmtPcHRpb25zID0ge30sXG4pOiBQcm9taXNlPEJlbmNobWFya1Jlc3VsdFtdPiB7XG4gIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICBPYmplY3QuZW50cmllcyhiZW5jaG1hcmtzKS5tYXAoKFtuYW1lLCBmbl0pID0+IGJlbmNobWFyayhuYW1lLCBmbiwgb3B0aW9ucykpLFxuICApO1xuXG4gIHJldHVybiByZXN1bHRzLnNvcnQoKGEsIGIpID0+IGEuYXZnRHVyYXRpb24gLSBiLmF2Z0R1cmF0aW9uKTtcbn1cblxuLyoqXG4gKiBCZW5jaG1hcmsgc3VpdGUgZm9yIG9yZ2FuaXppbmcgYW5kIHJ1bm5pbmcgbXVsdGlwbGUgcmVsYXRlZCBiZW5jaG1hcmtzXG4gKi9cbmV4cG9ydCBjbGFzcyBCZW5jaG1hcmtTdWl0ZSB7XG4gIHByaXZhdGUgYmVuY2htYXJrczogQXJyYXk8eyBuYW1lOiBzdHJpbmc7IGZuOiBCZW5jaG1hcmtGdW5jdGlvbiB9PiA9IFtdO1xuXG4gIHByaXZhdGUgb3B0aW9uczogQmVuY2htYXJrT3B0aW9ucztcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgc3VpdGVOYW1lOiBzdHJpbmcsIG9wdGlvbnM6IEJlbmNobWFya09wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgYmVuY2htYXJrIHRvIHRoZSBzdWl0ZVxuICAgKlxuICAgKiBAcGFyYW0gbmFtZSAtIE5hbWUgb2YgdGhlIGJlbmNobWFya1xuICAgKiBAcGFyYW0gZm4gLSBGdW5jdGlvbiB0byBiZW5jaG1hcmtcbiAgICogQHJldHVybnMgVGhpcyBzdWl0ZSBpbnN0YW5jZSBmb3IgY2hhaW5pbmdcbiAgICovXG4gIGFkZChuYW1lOiBzdHJpbmcsIGZuOiBCZW5jaG1hcmtGdW5jdGlvbik6IHRoaXMge1xuICAgIHRoaXMuYmVuY2htYXJrcy5wdXNoKHsgbmFtZSwgZm4gfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUnVuIGFsbCBiZW5jaG1hcmtzIGluIHRoZSBzdWl0ZVxuICAgKlxuICAgKiBAcGFyYW0gY3VzdG9tT3B0aW9ucyAtIE92ZXJyaWRlIHN1aXRlIG9wdGlvbnMgZm9yIHRoaXMgcnVuXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIGFycmF5IG9mIGJlbmNobWFyayByZXN1bHRzXG4gICAqL1xuICBhc3luYyBydW4oY3VzdG9tT3B0aW9ucz86IEJlbmNobWFya09wdGlvbnMpOiBQcm9taXNlPEJlbmNobWFya1Jlc3VsdFtdPiB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHsgLi4udGhpcy5vcHRpb25zLCAuLi5jdXN0b21PcHRpb25zIH07XG4gICAgY29uc3QgcmVzdWx0czogQmVuY2htYXJrUmVzdWx0W10gPSBbXTtcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgY29uc29sZS5sb2coYFxcbvCfmoAgUnVubmluZyBiZW5jaG1hcmsgc3VpdGU6ICR7dGhpcy5zdWl0ZU5hbWV9YCk7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICBjb25zb2xlLmxvZygnPScucmVwZWF0KDYwKSk7XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXhcbiAgICBmb3IgKGNvbnN0IHsgbmFtZSwgZm4gfSBvZiB0aGlzLmJlbmNobWFya3MpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLmxvZyhgXFxu4o+x77iPICBSdW5uaW5nOiAke25hbWV9Li4uYCk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hd2FpdC1pbi1sb29wXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGJlbmNobWFyayhuYW1lLCBmbiwgb3B0aW9ucyk7XG4gICAgICAgIHJlc3VsdHMucHVzaChyZXN1bHQpO1xuXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgIGAgICDinIUgJHtyZXN1bHQuYXZnRHVyYXRpb24udG9GaXhlZCgyKX1tcyBhdmcgKCR7cmVzdWx0Lm9wc1BlclNlY29uZC50b0ZpeGVkKFxuICAgICAgICAgICAgMCxcbiAgICAgICAgICApfSBvcHMvc2VjKWAsXG4gICAgICAgICk7XG4gICAgICAgIGlmIChvcHRpb25zLm1lYXN1cmVNZW1vcnkpIHtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICAgIGNvbnNvbGUubG9nKGAgICDwn5K+IE1lbW9yeTogJHsocmVzdWx0Lm1lbW9yeVVzZWQgLyAxMDI0IC8gMTAyNCkudG9GaXhlZCgyKX1NQmApO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICBjb25zb2xlLmxvZyhgICAg4p2MIEZhaWxlZDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJ31gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTdW1tYXJ5XG4gICAgaWYgKHJlc3VsdHMubGVuZ3RoID4gMSkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUubG9nKGBcXG7wn5OKIFN1bW1hcnkgKHNvcnRlZCBieSBwZXJmb3JtYW5jZSk6YCk7XG4gICAgICBjb25zdCBzb3J0ZWRSZXN1bHRzID0gWy4uLnJlc3VsdHNdLnNvcnQoKGEsIGIpID0+IGEuYXZnRHVyYXRpb24gLSBiLmF2Z0R1cmF0aW9uKTtcbiAgICAgIGNvbnN0IGZhc3Rlc3QgPSBzb3J0ZWRSZXN1bHRzWzBdO1xuXG4gICAgICBzb3J0ZWRSZXN1bHRzLmZvckVhY2goKHJlc3VsdCwgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgcmVsYXRpdmUgPSByZXN1bHQuYXZnRHVyYXRpb24gLyBmYXN0ZXN0LmF2Z0R1cmF0aW9uO1xuICAgICAgICBsZXQgaWNvbiA9ICcgICc7XG4gICAgICAgIGlmIChpbmRleCA9PT0gMCkgaWNvbiA9ICfwn6WHJztcbiAgICAgICAgZWxzZSBpZiAoaW5kZXggPT09IDEpIGljb24gPSAn8J+liCc7XG4gICAgICAgIGVsc2UgaWYgKGluZGV4ID09PSAyKSBpY29uID0gJ/CfpYknO1xuXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgIGAgICAke2ljb259ICR7cmVzdWx0Lm5hbWUucGFkRW5kKDI1KX0gfCAke3Jlc3VsdC5hdmdEdXJhdGlvbi50b0ZpeGVkKFxuICAgICAgICAgICAgMixcbiAgICAgICAgICApfW1zIHwgJHtyZWxhdGl2ZS50b0ZpeGVkKDIpfXhgLFxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIGBcXG7inIUgU3VpdGUgY29tcGxldGVkOiAke3Jlc3VsdHMubGVuZ3RofS8ke3RoaXMuYmVuY2htYXJrcy5sZW5ndGh9IGJlbmNobWFya3Mgc3VjY2Vzc2Z1bFxcbmAsXG4gICAgKTtcblxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbnVtYmVyIG9mIGJlbmNobWFya3MgaW4gdGhlIHN1aXRlXG4gICAqL1xuICBnZXQgc2l6ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmJlbmNobWFya3MubGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIGFsbCBiZW5jaG1hcmtzIGZyb20gdGhlIHN1aXRlXG4gICAqL1xuICBjbGVhcigpOiB0aGlzIHtcbiAgICB0aGlzLmJlbmNobWFya3MgPSBbXTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZSBhIG5ldyBiZW5jaG1hcmsgc3VpdGVcbiAqXG4gKiBAcGFyYW0gc3VpdGVOYW1lIC0gTmFtZSBvZiB0aGUgYmVuY2htYXJrIHN1aXRlXG4gKiBAcGFyYW0gb3B0aW9ucyAtIERlZmF1bHQgb3B0aW9ucyBmb3IgYWxsIGJlbmNobWFya3MgaW4gdGhlIHN1aXRlXG4gKiBAcmV0dXJucyBOZXcgQmVuY2htYXJrU3VpdGUgaW5zdGFuY2VcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3Qgc3VpdGUgPSBjcmVhdGVCZW5jaG1hcmtTdWl0ZSgnU3RyaW5nIE9wZXJhdGlvbnMnLCB7XG4gKiAgIGl0ZXJhdGlvbnM6IDEwLFxuICogICB3YXJtdXBSdW5zOiAyXG4gKiB9KTtcbiAqXG4gKiBzdWl0ZVxuICogICAuYWRkKCdjb25jYXQnLCAoKSA9PiBzdHIxICsgc3RyMilcbiAqICAgLmFkZCgndGVtcGxhdGUnLCAoKSA9PiBgJHtzdHIxfSR7c3RyMn1gKVxuICogICAuYWRkKCdqb2luJywgKCkgPT4gW3N0cjEsIHN0cjJdLmpvaW4oJycpKTtcbiAqXG4gKiBhd2FpdCBzdWl0ZS5ydW4oKTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQmVuY2htYXJrU3VpdGUoXG4gIHN1aXRlTmFtZTogc3RyaW5nLFxuICBvcHRpb25zPzogQmVuY2htYXJrT3B0aW9ucyxcbik6IEJlbmNobWFya1N1aXRlIHtcbiAgcmV0dXJuIG5ldyBCZW5jaG1hcmtTdWl0ZShzdWl0ZU5hbWUsIG9wdGlvbnMpO1xufVxuXG4vKipcbiAqIFV0aWxpdHkgdG8gbWVhc3VyZSBtZW1vcnkgdXNhZ2Ugb2YgYSBmdW5jdGlvblxuICpcbiAqIEBwYXJhbSBmbiAtIEZ1bmN0aW9uIHRvIG1lYXN1cmVcbiAqIEBwYXJhbSBmb3JjZUdDIC0gV2hldGhlciB0byBmb3JjZSBnYXJiYWdlIGNvbGxlY3Rpb24gYmVmb3JlIG1lYXN1cmluZ1xuICogQHJldHVybnMgTWVtb3J5IHVzYWdlIGluIGJ5dGVzXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IG1lbW9yeVVzZWQgPSBhd2FpdCBtZWFzdXJlTWVtb3J5KCgpID0+IHtcbiAqICAgcmV0dXJuIG5ldyBBcnJheSgxMDAwMDApLmZpbGwoMCkubWFwKHggPT4gKHsgdmFsdWU6IHggfSkpO1xuICogfSk7XG4gKlxuICogY29uc29sZS5sb2coYE1lbW9yeSB1c2VkOiAkeyhtZW1vcnlVc2VkIC8gMTAyNCAvIDEwMjQpLnRvRml4ZWQoMil9TUJgKTtcbiAqIGBgYFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbWVhc3VyZU1lbW9yeShmbjogQmVuY2htYXJrRnVuY3Rpb24sIGZvcmNlR0MgPSB0cnVlKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgaWYgKGZvcmNlR0MpIHtcbiAgICBmb3JjZUdhcmJhZ2VDb2xsZWN0aW9uKCk7XG4gIH1cblxuICBjb25zdCBzdGFydE1lbW9yeSA9IHByb2Nlc3MubWVtb3J5VXNhZ2UoKS5oZWFwVXNlZDtcbiAgYXdhaXQgZm4oKTtcbiAgY29uc3QgZW5kTWVtb3J5ID0gcHJvY2Vzcy5tZW1vcnlVc2FnZSgpLmhlYXBVc2VkO1xuXG4gIHJldHVybiBlbmRNZW1vcnkgLSBzdGFydE1lbW9yeTtcbn1cbiJdfQ==
|
package/build/utils/misc.d.ts
CHANGED
|
@@ -137,16 +137,33 @@ export declare const generateRandomString: (length?: number) => string;
|
|
|
137
137
|
*/
|
|
138
138
|
export declare const flattenQueryParams: (qParams: Record<string, any | any[]>) => Record<string, any>;
|
|
139
139
|
/**
|
|
140
|
-
*
|
|
141
|
-
*
|
|
142
|
-
*
|
|
143
|
-
* @
|
|
144
|
-
|
|
145
|
-
|
|
140
|
+
* Locks a property of an object, making it immutable.
|
|
141
|
+
* @param obj - The object to lock the property of.
|
|
142
|
+
* @param key - The key of the property to lock.
|
|
143
|
+
* @returns The object with the property locked.
|
|
144
|
+
*/
|
|
145
|
+
export declare const lockProperty: <T extends object, K extends keyof T>(obj: T, key: K) => T;
|
|
146
|
+
/**
|
|
147
|
+
* Deep freezes an object, making it immutable.
|
|
148
|
+
* @param obj - The object to deep freeze.
|
|
149
|
+
* @returns {T | Readonly<T>} - If `propKey` is provided, returns the original object `T` with `obj[propKey]` deep frozen and `propKey` locked. Otherwise, returns a `Readonly<T>` version of the entire object.
|
|
146
150
|
*
|
|
147
151
|
* @example
|
|
148
152
|
* const config = deepFreeze({ api: { key: 'secret', timeout: 1000 } });
|
|
149
153
|
* // Attempting to modify config.api.key will throw an error in strict mode
|
|
150
154
|
*/
|
|
151
|
-
export declare const deepFreeze: <T
|
|
155
|
+
export declare const deepFreeze: <T extends Record<string, unknown>>(obj: T) => Readonly<T>;
|
|
156
|
+
/**
|
|
157
|
+
* Deep freezes a specific property of an object and locks that property from reassignment.
|
|
158
|
+
* @template T - The type of the object.
|
|
159
|
+
* @param {T} obj - The object containing the property to freeze.
|
|
160
|
+
* @param {keyof T} propKey - The key of the property to deep freeze and lock.
|
|
161
|
+
* @returns {T} - The original object `T` with `obj[propKey]` deep frozen and `propKey` locked.
|
|
162
|
+
*
|
|
163
|
+
* @example
|
|
164
|
+
* const myObject = { data: { value: 123 } };
|
|
165
|
+
* deepFreezeProperty(myObject, 'data');
|
|
166
|
+
* // myObject.data is now immutable, and myObject.data cannot be reassigned.
|
|
167
|
+
*/
|
|
168
|
+
export declare const deepFreezeProperty: <T extends Record<string, unknown>>(obj: T, propKey: keyof T) => T;
|
|
152
169
|
//# sourceMappingURL=misc.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"misc.d.ts","sourceRoot":"","sources":["../../src/utils/misc.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"misc.d.ts","sourceRoot":"","sources":["../../src/utils/misc.ts"],"names":[],"mappings":"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"}
|