traceperf 0.1.1 → 0.1.4
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/README.md +122 -1
- package/dist/browser.d.ts +76 -2
- package/dist/browser.js +166 -28
- package/dist/browser.js.map +1 -1
- package/dist/core/logger.d.ts +14 -1
- package/dist/core/logger.js +16 -4
- package/dist/core/logger.js.map +1 -1
- package/dist/esm/browser.d.ts +76 -2
- package/dist/esm/browser.js +166 -28
- package/dist/esm/browser.js.map +1 -1
- package/dist/esm/core/logger.d.ts +14 -1
- package/dist/esm/core/logger.js +16 -4
- package/dist/esm/core/logger.js.map +1 -1
- package/dist/esm/trackers/execution.d.ts +28 -7
- package/dist/esm/trackers/execution.js +72 -28
- package/dist/esm/trackers/execution.js.map +1 -1
- package/dist/esm/types/config.d.ts +35 -17
- package/dist/esm/types/index.d.ts +82 -0
- package/dist/esm/types/logger.d.ts +11 -0
- package/dist/esm/utils/proxy-tracker.d.ts +68 -0
- package/dist/esm/utils/proxy-tracker.js +127 -0
- package/dist/esm/utils/proxy-tracker.js.map +1 -0
- package/dist/trackers/execution.d.ts +28 -7
- package/dist/trackers/execution.js +72 -28
- package/dist/trackers/execution.js.map +1 -1
- package/dist/types/config.d.ts +35 -17
- package/dist/types/index.d.ts +82 -0
- package/dist/types/logger.d.ts +11 -0
- package/dist/utils/proxy-tracker.d.ts +68 -0
- package/dist/utils/proxy-tracker.js +131 -0
- package/dist/utils/proxy-tracker.js.map +1 -0
- package/package.json +1 -1
|
@@ -20,6 +20,10 @@ class ExecutionTracker {
|
|
|
20
20
|
this._callStack = new stack_1.CallStackManager();
|
|
21
21
|
this._asciiGenerator = new ascii_1.AsciiArtGenerator({ boxWidth: options.boxWidth });
|
|
22
22
|
this._defaultThreshold = (_a = options.defaultThreshold) !== null && _a !== void 0 ? _a : 100; // ms
|
|
23
|
+
// Get a reference to the global scope (works in both Node.js and browsers)
|
|
24
|
+
this._globalScope = typeof window !== 'undefined' ? window :
|
|
25
|
+
typeof global !== 'undefined' ? global :
|
|
26
|
+
{};
|
|
23
27
|
}
|
|
24
28
|
/**
|
|
25
29
|
* Track the execution of a function
|
|
@@ -29,10 +33,11 @@ class ExecutionTracker {
|
|
|
29
33
|
* @returns The return value of the tracked function
|
|
30
34
|
*/
|
|
31
35
|
track(fn, options) {
|
|
32
|
-
var _a, _b;
|
|
36
|
+
var _a, _b, _c;
|
|
33
37
|
const fnName = (options === null || options === void 0 ? void 0 : options.label) || (0, stack_1.getFunctionName)(fn);
|
|
34
38
|
const threshold = (_a = options === null || options === void 0 ? void 0 : options.threshold) !== null && _a !== void 0 ? _a : this._defaultThreshold;
|
|
35
39
|
const includeMemory = (_b = options === null || options === void 0 ? void 0 : options.includeMemory) !== null && _b !== void 0 ? _b : true;
|
|
40
|
+
const enableNestedTracking = (_c = options === null || options === void 0 ? void 0 : options.enableNestedTracking) !== null && _c !== void 0 ? _c : true;
|
|
36
41
|
// Get memory usage before execution
|
|
37
42
|
const startMemory = includeMemory ? process.memoryUsage().heapUsed : undefined;
|
|
38
43
|
// Start timing
|
|
@@ -49,7 +54,7 @@ class ExecutionTracker {
|
|
|
49
54
|
children: [],
|
|
50
55
|
};
|
|
51
56
|
// Set parent-child relationship
|
|
52
|
-
if (this._currentExecution) {
|
|
57
|
+
if (this._currentExecution && enableNestedTracking) {
|
|
53
58
|
execution.parent = this._currentExecution;
|
|
54
59
|
this._currentExecution.children.push(execution);
|
|
55
60
|
}
|
|
@@ -83,6 +88,26 @@ class ExecutionTracker {
|
|
|
83
88
|
this._callStack.pop();
|
|
84
89
|
}
|
|
85
90
|
}
|
|
91
|
+
/**
|
|
92
|
+
* Create a trackable version of a function
|
|
93
|
+
*
|
|
94
|
+
* This is a helper method to create a tracked version of a function
|
|
95
|
+
* that can be used for nested function tracking.
|
|
96
|
+
*
|
|
97
|
+
* @param fn - The function to make trackable
|
|
98
|
+
* @param options - Options for tracking
|
|
99
|
+
* @returns A tracked version of the function
|
|
100
|
+
*/
|
|
101
|
+
createTrackable(fn, options) {
|
|
102
|
+
const self = this;
|
|
103
|
+
const fnName = (options === null || options === void 0 ? void 0 : options.label) || fn.name || 'anonymous';
|
|
104
|
+
return function (...args) {
|
|
105
|
+
return self.track(() => fn.apply(this, args), {
|
|
106
|
+
...options,
|
|
107
|
+
label: fnName
|
|
108
|
+
});
|
|
109
|
+
};
|
|
110
|
+
}
|
|
86
111
|
/**
|
|
87
112
|
* Get the current call stack
|
|
88
113
|
*
|
|
@@ -98,9 +123,52 @@ class ExecutionTracker {
|
|
|
98
123
|
*/
|
|
99
124
|
generateFlowChart() {
|
|
100
125
|
// Convert execution records to execution data for the ASCII generator
|
|
101
|
-
const
|
|
126
|
+
const executionData = this.prepareExecutionData(this._executions);
|
|
102
127
|
// Generate the flow chart
|
|
103
|
-
return this._asciiGenerator.generateFlowChart(
|
|
128
|
+
return this._asciiGenerator.generateFlowChart(executionData);
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Prepare execution data for the ASCII generator
|
|
132
|
+
*
|
|
133
|
+
* @param executions - The execution records to prepare
|
|
134
|
+
* @returns A list of execution data
|
|
135
|
+
*/
|
|
136
|
+
prepareExecutionData(executions) {
|
|
137
|
+
const result = [];
|
|
138
|
+
// Process each root execution
|
|
139
|
+
executions.forEach(execution => {
|
|
140
|
+
// Add the root execution
|
|
141
|
+
result.push({
|
|
142
|
+
name: execution.name,
|
|
143
|
+
duration: execution.duration,
|
|
144
|
+
isSlow: execution.isSlow,
|
|
145
|
+
memoryUsage: execution.memoryUsage,
|
|
146
|
+
level: execution.level,
|
|
147
|
+
});
|
|
148
|
+
// Add children recursively
|
|
149
|
+
this.addChildrenToResult(execution.children, result);
|
|
150
|
+
});
|
|
151
|
+
return result;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Add children to the result list
|
|
155
|
+
*
|
|
156
|
+
* @param children - The children to add
|
|
157
|
+
* @param result - The result list
|
|
158
|
+
*/
|
|
159
|
+
addChildrenToResult(children, result) {
|
|
160
|
+
children.forEach(child => {
|
|
161
|
+
// Add the child
|
|
162
|
+
result.push({
|
|
163
|
+
name: child.name,
|
|
164
|
+
duration: child.duration,
|
|
165
|
+
isSlow: child.isSlow,
|
|
166
|
+
memoryUsage: child.memoryUsage,
|
|
167
|
+
level: child.level,
|
|
168
|
+
});
|
|
169
|
+
// Add grandchildren recursively
|
|
170
|
+
this.addChildrenToResult(child.children, result);
|
|
171
|
+
});
|
|
104
172
|
}
|
|
105
173
|
/**
|
|
106
174
|
* Clear all execution records
|
|
@@ -118,30 +186,6 @@ class ExecutionTracker {
|
|
|
118
186
|
getExecutions() {
|
|
119
187
|
return [...this._executions];
|
|
120
188
|
}
|
|
121
|
-
/**
|
|
122
|
-
* Flatten the execution tree into a list
|
|
123
|
-
*
|
|
124
|
-
* @param executions - The execution records to flatten
|
|
125
|
-
* @returns A flat list of execution data
|
|
126
|
-
*/
|
|
127
|
-
flattenExecutions(executions) {
|
|
128
|
-
const result = [];
|
|
129
|
-
// Helper function to recursively flatten the tree
|
|
130
|
-
const flatten = (record) => {
|
|
131
|
-
result.push({
|
|
132
|
-
name: record.name,
|
|
133
|
-
duration: record.duration,
|
|
134
|
-
isSlow: record.isSlow,
|
|
135
|
-
memoryUsage: record.memoryUsage,
|
|
136
|
-
level: record.level,
|
|
137
|
-
});
|
|
138
|
-
// Process children
|
|
139
|
-
record.children.forEach(child => flatten(child));
|
|
140
|
-
};
|
|
141
|
-
// Flatten each root execution
|
|
142
|
-
executions.forEach(execution => flatten(execution));
|
|
143
|
-
return result;
|
|
144
|
-
}
|
|
145
189
|
}
|
|
146
190
|
exports.ExecutionTracker = ExecutionTracker;
|
|
147
191
|
//# sourceMappingURL=execution.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execution.js","sourceRoot":"","sources":["../../src/trackers/execution.ts"],"names":[],"mappings":";;;AACA,0CAAmE;AACnE,4CAA8D;AAC9D,+CAAuE;AAiBvE;;GAEG;AACH,MAAa,gBAAgB;
|
|
1
|
+
{"version":3,"file":"execution.js","sourceRoot":"","sources":["../../src/trackers/execution.ts"],"names":[],"mappings":"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"}
|
package/dist/types/config.d.ts
CHANGED
|
@@ -62,41 +62,59 @@ export interface ITrackOptions {
|
|
|
62
62
|
* Whether to suppress logging for this tracking
|
|
63
63
|
*/
|
|
64
64
|
silent?: boolean;
|
|
65
|
+
/**
|
|
66
|
+
* Whether to enable nested tracking
|
|
67
|
+
*
|
|
68
|
+
* When enabled, TracePerf will track nested function calls
|
|
69
|
+
* if they are also wrapped with track().
|
|
70
|
+
*
|
|
71
|
+
* @default true
|
|
72
|
+
*/
|
|
73
|
+
enableNestedTracking?: boolean;
|
|
65
74
|
}
|
|
66
75
|
/**
|
|
67
|
-
*
|
|
76
|
+
* Logger configuration
|
|
68
77
|
*/
|
|
69
78
|
export interface ILoggerConfig {
|
|
70
79
|
/**
|
|
71
80
|
* Operational mode
|
|
72
|
-
*
|
|
81
|
+
*
|
|
82
|
+
* - dev: All logs are shown
|
|
83
|
+
* - staging: Only warn and error logs are shown
|
|
84
|
+
* - prod: Only error logs are shown
|
|
73
85
|
*/
|
|
74
|
-
mode
|
|
86
|
+
mode: LogMode;
|
|
75
87
|
/**
|
|
76
|
-
* Minimum log level to
|
|
77
|
-
* @default 'debug'
|
|
88
|
+
* Minimum log level to show
|
|
78
89
|
*/
|
|
79
|
-
level
|
|
90
|
+
level: LogLevel;
|
|
80
91
|
/**
|
|
81
|
-
* Whether to colorize
|
|
82
|
-
* @default true
|
|
92
|
+
* Whether to colorize logs
|
|
83
93
|
*/
|
|
84
|
-
colorize
|
|
94
|
+
colorize: boolean;
|
|
85
95
|
/**
|
|
86
96
|
* Whether to include timestamps in logs
|
|
87
|
-
* @default true
|
|
88
97
|
*/
|
|
89
|
-
timestamp
|
|
98
|
+
timestamp: boolean;
|
|
99
|
+
/**
|
|
100
|
+
* Performance threshold in milliseconds
|
|
101
|
+
*
|
|
102
|
+
* Functions that take longer than this threshold will be marked as bottlenecks
|
|
103
|
+
*/
|
|
104
|
+
performanceThreshold: number;
|
|
90
105
|
/**
|
|
91
|
-
*
|
|
92
|
-
* @default 100
|
|
106
|
+
* Indentation size for nested logs
|
|
93
107
|
*/
|
|
94
|
-
|
|
108
|
+
indentSize: number;
|
|
95
109
|
/**
|
|
96
|
-
*
|
|
97
|
-
*
|
|
110
|
+
* Whether to automatically track nested function calls
|
|
111
|
+
*
|
|
112
|
+
* When enabled, TracePerf will automatically track nested function calls
|
|
113
|
+
* using a proxy-based approach.
|
|
114
|
+
*
|
|
115
|
+
* @default true
|
|
98
116
|
*/
|
|
99
|
-
|
|
117
|
+
autoTracking?: boolean;
|
|
100
118
|
/**
|
|
101
119
|
* Log output destinations
|
|
102
120
|
* @default [ConsoleTransport]
|
package/dist/types/index.d.ts
CHANGED
|
@@ -1,2 +1,84 @@
|
|
|
1
1
|
export * from './config';
|
|
2
2
|
export * from './logger';
|
|
3
|
+
/**
|
|
4
|
+
* Options for tracking function execution
|
|
5
|
+
*/
|
|
6
|
+
export interface ITrackOptions {
|
|
7
|
+
/**
|
|
8
|
+
* Custom label for the function
|
|
9
|
+
*/
|
|
10
|
+
label?: string;
|
|
11
|
+
/**
|
|
12
|
+
* Performance threshold in milliseconds
|
|
13
|
+
*/
|
|
14
|
+
threshold?: number;
|
|
15
|
+
/**
|
|
16
|
+
* Whether to include memory usage in the tracking
|
|
17
|
+
*/
|
|
18
|
+
includeMemory?: boolean;
|
|
19
|
+
/**
|
|
20
|
+
* Whether to track nested function calls
|
|
21
|
+
*
|
|
22
|
+
* Note: With automatic tracking enabled, TracePerf will attempt to
|
|
23
|
+
* automatically detect and track nested function calls without requiring
|
|
24
|
+
* manual tracking of each function.
|
|
25
|
+
*
|
|
26
|
+
* @default true
|
|
27
|
+
*/
|
|
28
|
+
enableNestedTracking?: boolean;
|
|
29
|
+
/**
|
|
30
|
+
* Whether to automatically track nested function calls
|
|
31
|
+
*
|
|
32
|
+
* When enabled, TracePerf will analyze the function source code to identify
|
|
33
|
+
* potential function calls and automatically track them.
|
|
34
|
+
*
|
|
35
|
+
* @default true
|
|
36
|
+
*/
|
|
37
|
+
autoTracking?: boolean;
|
|
38
|
+
/**
|
|
39
|
+
* Whether to suppress logging
|
|
40
|
+
*/
|
|
41
|
+
silent?: boolean;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Interface for execution trackers
|
|
45
|
+
*/
|
|
46
|
+
export interface IExecutionTracker {
|
|
47
|
+
/**
|
|
48
|
+
* Track the execution of a function
|
|
49
|
+
*
|
|
50
|
+
* @param fn - The function to track
|
|
51
|
+
* @param options - Options for tracking
|
|
52
|
+
* @returns The return value of the tracked function
|
|
53
|
+
*/
|
|
54
|
+
track<T>(fn: () => T, options?: ITrackOptions): T;
|
|
55
|
+
/**
|
|
56
|
+
* Create a trackable version of a function
|
|
57
|
+
*
|
|
58
|
+
* This is a helper method to create a tracked version of a function
|
|
59
|
+
* that can be used for nested function tracking.
|
|
60
|
+
*
|
|
61
|
+
* @param fn - The function to make trackable
|
|
62
|
+
* @param options - Options for tracking
|
|
63
|
+
* @returns A tracked version of the function
|
|
64
|
+
*/
|
|
65
|
+
createTrackable<T extends (...args: any[]) => any>(fn: T, options?: Omit<ITrackOptions, 'label'> & {
|
|
66
|
+
label?: string;
|
|
67
|
+
}): (...args: Parameters<T>) => ReturnType<T>;
|
|
68
|
+
/**
|
|
69
|
+
* Get the current call stack
|
|
70
|
+
*
|
|
71
|
+
* @returns The current call stack
|
|
72
|
+
*/
|
|
73
|
+
getCallStack(): string[];
|
|
74
|
+
/**
|
|
75
|
+
* Generate a visual representation of the execution flow
|
|
76
|
+
*
|
|
77
|
+
* @returns ASCII flow chart of the execution
|
|
78
|
+
*/
|
|
79
|
+
generateFlowChart(): string;
|
|
80
|
+
/**
|
|
81
|
+
* Clear all execution records
|
|
82
|
+
*/
|
|
83
|
+
clear(): void;
|
|
84
|
+
}
|
package/dist/types/logger.d.ts
CHANGED
|
@@ -61,6 +61,17 @@ export interface ILogger {
|
|
|
61
61
|
* @returns The return value of the tracked function
|
|
62
62
|
*/
|
|
63
63
|
track<T>(fn: () => T, options?: ITrackOptions): T;
|
|
64
|
+
/**
|
|
65
|
+
* Create a trackable version of a function
|
|
66
|
+
*
|
|
67
|
+
* This is a helper method to create a tracked version of a function
|
|
68
|
+
* that can be used for nested function tracking.
|
|
69
|
+
*
|
|
70
|
+
* @param fn - The function to make trackable
|
|
71
|
+
* @param options - Options for tracking
|
|
72
|
+
* @returns A tracked version of the function
|
|
73
|
+
*/
|
|
74
|
+
createTrackable<T extends (...args: any[]) => any>(fn: T, options?: any): (...args: Parameters<T>) => ReturnType<T>;
|
|
64
75
|
}
|
|
65
76
|
/**
|
|
66
77
|
* IExecutionTracker - Interface for tracking function execution
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Proxy-based function tracking utility
|
|
3
|
+
*
|
|
4
|
+
* This module provides utilities for automatically tracking nested function calls
|
|
5
|
+
* using JavaScript Proxies without modifying the original code structure.
|
|
6
|
+
*/
|
|
7
|
+
import { ITrackOptions } from '../types';
|
|
8
|
+
/**
|
|
9
|
+
* Interface for a function that can track other functions
|
|
10
|
+
*/
|
|
11
|
+
export interface ITrackFunction {
|
|
12
|
+
<T>(fn: () => T, options?: ITrackOptions): T;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* A tracking context that manages function tracking using proxies
|
|
16
|
+
*/
|
|
17
|
+
export declare class ProxyTracker {
|
|
18
|
+
private _trackFn;
|
|
19
|
+
private _originalFunctions;
|
|
20
|
+
private _trackedFunctions;
|
|
21
|
+
private _isEnabled;
|
|
22
|
+
/**
|
|
23
|
+
* Create a new ProxyTracker
|
|
24
|
+
*
|
|
25
|
+
* @param trackFn - The function to use for tracking
|
|
26
|
+
*/
|
|
27
|
+
constructor(trackFn: ITrackFunction);
|
|
28
|
+
/**
|
|
29
|
+
* Enable or disable tracking
|
|
30
|
+
*
|
|
31
|
+
* @param enabled - Whether tracking is enabled
|
|
32
|
+
*/
|
|
33
|
+
setEnabled(enabled: boolean): void;
|
|
34
|
+
/**
|
|
35
|
+
* Check if tracking is enabled
|
|
36
|
+
*
|
|
37
|
+
* @returns Whether tracking is enabled
|
|
38
|
+
*/
|
|
39
|
+
isEnabled(): boolean;
|
|
40
|
+
/**
|
|
41
|
+
* Make a function trackable
|
|
42
|
+
*
|
|
43
|
+
* @param fn - The function to make trackable
|
|
44
|
+
* @param name - The name to use for tracking
|
|
45
|
+
* @returns A tracked version of the function
|
|
46
|
+
*/
|
|
47
|
+
makeTrackable(fn: Function, name?: string): Function;
|
|
48
|
+
/**
|
|
49
|
+
* Create a proxy for an object to track all its methods
|
|
50
|
+
*
|
|
51
|
+
* @param obj - The object to proxy
|
|
52
|
+
* @param namespace - The namespace to use for tracking
|
|
53
|
+
* @returns A proxied version of the object
|
|
54
|
+
*/
|
|
55
|
+
createProxy<T extends object>(obj: T, namespace?: string): T;
|
|
56
|
+
/**
|
|
57
|
+
* Track a module's exports
|
|
58
|
+
*
|
|
59
|
+
* @param moduleExports - The module's exports
|
|
60
|
+
* @param namespace - The namespace to use for tracking
|
|
61
|
+
* @returns A proxied version of the module's exports
|
|
62
|
+
*/
|
|
63
|
+
trackModule<T extends object>(moduleExports: T, namespace: string): T;
|
|
64
|
+
/**
|
|
65
|
+
* Clear all tracked functions
|
|
66
|
+
*/
|
|
67
|
+
clear(): void;
|
|
68
|
+
}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Proxy-based function tracking utility
|
|
4
|
+
*
|
|
5
|
+
* This module provides utilities for automatically tracking nested function calls
|
|
6
|
+
* using JavaScript Proxies without modifying the original code structure.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.ProxyTracker = void 0;
|
|
10
|
+
/**
|
|
11
|
+
* A tracking context that manages function tracking using proxies
|
|
12
|
+
*/
|
|
13
|
+
class ProxyTracker {
|
|
14
|
+
/**
|
|
15
|
+
* Create a new ProxyTracker
|
|
16
|
+
*
|
|
17
|
+
* @param trackFn - The function to use for tracking
|
|
18
|
+
*/
|
|
19
|
+
constructor(trackFn) {
|
|
20
|
+
this._originalFunctions = new Map();
|
|
21
|
+
this._trackedFunctions = new Map();
|
|
22
|
+
this._isEnabled = true;
|
|
23
|
+
this._trackFn = trackFn;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Enable or disable tracking
|
|
27
|
+
*
|
|
28
|
+
* @param enabled - Whether tracking is enabled
|
|
29
|
+
*/
|
|
30
|
+
setEnabled(enabled) {
|
|
31
|
+
this._isEnabled = enabled;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Check if tracking is enabled
|
|
35
|
+
*
|
|
36
|
+
* @returns Whether tracking is enabled
|
|
37
|
+
*/
|
|
38
|
+
isEnabled() {
|
|
39
|
+
return this._isEnabled;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Make a function trackable
|
|
43
|
+
*
|
|
44
|
+
* @param fn - The function to make trackable
|
|
45
|
+
* @param name - The name to use for tracking
|
|
46
|
+
* @returns A tracked version of the function
|
|
47
|
+
*/
|
|
48
|
+
makeTrackable(fn, name) {
|
|
49
|
+
// If tracking is disabled, return the original function
|
|
50
|
+
if (!this._isEnabled) {
|
|
51
|
+
return fn;
|
|
52
|
+
}
|
|
53
|
+
// If we've already tracked this function, return the tracked version
|
|
54
|
+
if (this._trackedFunctions.has(fn)) {
|
|
55
|
+
return this._trackedFunctions.get(fn);
|
|
56
|
+
}
|
|
57
|
+
// Create a tracked version of the function
|
|
58
|
+
const self = this;
|
|
59
|
+
const trackedFn = function (...args) {
|
|
60
|
+
return self._trackFn(() => fn.apply(this, args), {
|
|
61
|
+
label: name || fn.name || 'anonymous'
|
|
62
|
+
});
|
|
63
|
+
};
|
|
64
|
+
// Store the tracked version
|
|
65
|
+
this._trackedFunctions.set(fn, trackedFn);
|
|
66
|
+
return trackedFn;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Create a proxy for an object to track all its methods
|
|
70
|
+
*
|
|
71
|
+
* @param obj - The object to proxy
|
|
72
|
+
* @param namespace - The namespace to use for tracking
|
|
73
|
+
* @returns A proxied version of the object
|
|
74
|
+
*/
|
|
75
|
+
createProxy(obj, namespace = '') {
|
|
76
|
+
// If tracking is disabled, return the original object
|
|
77
|
+
if (!this._isEnabled) {
|
|
78
|
+
return obj;
|
|
79
|
+
}
|
|
80
|
+
const self = this;
|
|
81
|
+
return new Proxy(obj, {
|
|
82
|
+
get(target, prop, receiver) {
|
|
83
|
+
const value = Reflect.get(target, prop, receiver);
|
|
84
|
+
// If the property is a function, make it trackable
|
|
85
|
+
if (typeof value === 'function' && prop !== 'constructor') {
|
|
86
|
+
const name = namespace
|
|
87
|
+
? `${namespace}.${String(prop)}`
|
|
88
|
+
: String(prop);
|
|
89
|
+
return self.makeTrackable(value, name);
|
|
90
|
+
}
|
|
91
|
+
// If the property is an object (but not a built-in), proxy it too
|
|
92
|
+
if (value &&
|
|
93
|
+
typeof value === 'object' &&
|
|
94
|
+
!Array.isArray(value) &&
|
|
95
|
+
Object.getPrototypeOf(value) === Object.prototype) {
|
|
96
|
+
const nestedNamespace = namespace
|
|
97
|
+
? `${namespace}.${String(prop)}`
|
|
98
|
+
: String(prop);
|
|
99
|
+
return self.createProxy(value, nestedNamespace);
|
|
100
|
+
}
|
|
101
|
+
return value;
|
|
102
|
+
},
|
|
103
|
+
apply(target, thisArg, args) {
|
|
104
|
+
// This handles the case when the proxy itself is called as a function
|
|
105
|
+
const name = namespace || target.name || 'anonymous';
|
|
106
|
+
return self._trackFn(() => Reflect.apply(target, thisArg, args), {
|
|
107
|
+
label: name
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Track a module's exports
|
|
114
|
+
*
|
|
115
|
+
* @param moduleExports - The module's exports
|
|
116
|
+
* @param namespace - The namespace to use for tracking
|
|
117
|
+
* @returns A proxied version of the module's exports
|
|
118
|
+
*/
|
|
119
|
+
trackModule(moduleExports, namespace) {
|
|
120
|
+
return this.createProxy(moduleExports, namespace);
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Clear all tracked functions
|
|
124
|
+
*/
|
|
125
|
+
clear() {
|
|
126
|
+
this._trackedFunctions.clear();
|
|
127
|
+
this._originalFunctions.clear();
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
exports.ProxyTracker = ProxyTracker;
|
|
131
|
+
//# sourceMappingURL=proxy-tracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proxy-tracker.js","sourceRoot":"","sources":["../../src/utils/proxy-tracker.ts"],"names":[],"mappings":"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"}
|