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
|
@@ -17,6 +17,10 @@ export class ExecutionTracker {
|
|
|
17
17
|
this._callStack = new CallStackManager();
|
|
18
18
|
this._asciiGenerator = new AsciiArtGenerator({ boxWidth: options.boxWidth });
|
|
19
19
|
this._defaultThreshold = (_a = options.defaultThreshold) !== null && _a !== void 0 ? _a : 100; // ms
|
|
20
|
+
// Get a reference to the global scope (works in both Node.js and browsers)
|
|
21
|
+
this._globalScope = typeof window !== 'undefined' ? window :
|
|
22
|
+
typeof global !== 'undefined' ? global :
|
|
23
|
+
{};
|
|
20
24
|
}
|
|
21
25
|
/**
|
|
22
26
|
* Track the execution of a function
|
|
@@ -26,10 +30,11 @@ export class ExecutionTracker {
|
|
|
26
30
|
* @returns The return value of the tracked function
|
|
27
31
|
*/
|
|
28
32
|
track(fn, options) {
|
|
29
|
-
var _a, _b;
|
|
33
|
+
var _a, _b, _c;
|
|
30
34
|
const fnName = (options === null || options === void 0 ? void 0 : options.label) || getFunctionName(fn);
|
|
31
35
|
const threshold = (_a = options === null || options === void 0 ? void 0 : options.threshold) !== null && _a !== void 0 ? _a : this._defaultThreshold;
|
|
32
36
|
const includeMemory = (_b = options === null || options === void 0 ? void 0 : options.includeMemory) !== null && _b !== void 0 ? _b : true;
|
|
37
|
+
const enableNestedTracking = (_c = options === null || options === void 0 ? void 0 : options.enableNestedTracking) !== null && _c !== void 0 ? _c : true;
|
|
33
38
|
// Get memory usage before execution
|
|
34
39
|
const startMemory = includeMemory ? process.memoryUsage().heapUsed : undefined;
|
|
35
40
|
// Start timing
|
|
@@ -46,7 +51,7 @@ export class ExecutionTracker {
|
|
|
46
51
|
children: [],
|
|
47
52
|
};
|
|
48
53
|
// Set parent-child relationship
|
|
49
|
-
if (this._currentExecution) {
|
|
54
|
+
if (this._currentExecution && enableNestedTracking) {
|
|
50
55
|
execution.parent = this._currentExecution;
|
|
51
56
|
this._currentExecution.children.push(execution);
|
|
52
57
|
}
|
|
@@ -80,6 +85,26 @@ export class ExecutionTracker {
|
|
|
80
85
|
this._callStack.pop();
|
|
81
86
|
}
|
|
82
87
|
}
|
|
88
|
+
/**
|
|
89
|
+
* Create a trackable version of a function
|
|
90
|
+
*
|
|
91
|
+
* This is a helper method to create a tracked version of a function
|
|
92
|
+
* that can be used for nested function tracking.
|
|
93
|
+
*
|
|
94
|
+
* @param fn - The function to make trackable
|
|
95
|
+
* @param options - Options for tracking
|
|
96
|
+
* @returns A tracked version of the function
|
|
97
|
+
*/
|
|
98
|
+
createTrackable(fn, options) {
|
|
99
|
+
const self = this;
|
|
100
|
+
const fnName = (options === null || options === void 0 ? void 0 : options.label) || fn.name || 'anonymous';
|
|
101
|
+
return function (...args) {
|
|
102
|
+
return self.track(() => fn.apply(this, args), {
|
|
103
|
+
...options,
|
|
104
|
+
label: fnName
|
|
105
|
+
});
|
|
106
|
+
};
|
|
107
|
+
}
|
|
83
108
|
/**
|
|
84
109
|
* Get the current call stack
|
|
85
110
|
*
|
|
@@ -95,9 +120,52 @@ export class ExecutionTracker {
|
|
|
95
120
|
*/
|
|
96
121
|
generateFlowChart() {
|
|
97
122
|
// Convert execution records to execution data for the ASCII generator
|
|
98
|
-
const
|
|
123
|
+
const executionData = this.prepareExecutionData(this._executions);
|
|
99
124
|
// Generate the flow chart
|
|
100
|
-
return this._asciiGenerator.generateFlowChart(
|
|
125
|
+
return this._asciiGenerator.generateFlowChart(executionData);
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Prepare execution data for the ASCII generator
|
|
129
|
+
*
|
|
130
|
+
* @param executions - The execution records to prepare
|
|
131
|
+
* @returns A list of execution data
|
|
132
|
+
*/
|
|
133
|
+
prepareExecutionData(executions) {
|
|
134
|
+
const result = [];
|
|
135
|
+
// Process each root execution
|
|
136
|
+
executions.forEach(execution => {
|
|
137
|
+
// Add the root execution
|
|
138
|
+
result.push({
|
|
139
|
+
name: execution.name,
|
|
140
|
+
duration: execution.duration,
|
|
141
|
+
isSlow: execution.isSlow,
|
|
142
|
+
memoryUsage: execution.memoryUsage,
|
|
143
|
+
level: execution.level,
|
|
144
|
+
});
|
|
145
|
+
// Add children recursively
|
|
146
|
+
this.addChildrenToResult(execution.children, result);
|
|
147
|
+
});
|
|
148
|
+
return result;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Add children to the result list
|
|
152
|
+
*
|
|
153
|
+
* @param children - The children to add
|
|
154
|
+
* @param result - The result list
|
|
155
|
+
*/
|
|
156
|
+
addChildrenToResult(children, result) {
|
|
157
|
+
children.forEach(child => {
|
|
158
|
+
// Add the child
|
|
159
|
+
result.push({
|
|
160
|
+
name: child.name,
|
|
161
|
+
duration: child.duration,
|
|
162
|
+
isSlow: child.isSlow,
|
|
163
|
+
memoryUsage: child.memoryUsage,
|
|
164
|
+
level: child.level,
|
|
165
|
+
});
|
|
166
|
+
// Add grandchildren recursively
|
|
167
|
+
this.addChildrenToResult(child.children, result);
|
|
168
|
+
});
|
|
101
169
|
}
|
|
102
170
|
/**
|
|
103
171
|
* Clear all execution records
|
|
@@ -115,29 +183,5 @@ export class ExecutionTracker {
|
|
|
115
183
|
getExecutions() {
|
|
116
184
|
return [...this._executions];
|
|
117
185
|
}
|
|
118
|
-
/**
|
|
119
|
-
* Flatten the execution tree into a list
|
|
120
|
-
*
|
|
121
|
-
* @param executions - The execution records to flatten
|
|
122
|
-
* @returns A flat list of execution data
|
|
123
|
-
*/
|
|
124
|
-
flattenExecutions(executions) {
|
|
125
|
-
const result = [];
|
|
126
|
-
// Helper function to recursively flatten the tree
|
|
127
|
-
const flatten = (record) => {
|
|
128
|
-
result.push({
|
|
129
|
-
name: record.name,
|
|
130
|
-
duration: record.duration,
|
|
131
|
-
isSlow: record.isSlow,
|
|
132
|
-
memoryUsage: record.memoryUsage,
|
|
133
|
-
level: record.level,
|
|
134
|
-
});
|
|
135
|
-
// Process children
|
|
136
|
-
record.children.forEach(child => flatten(child));
|
|
137
|
-
};
|
|
138
|
-
// Flatten each root execution
|
|
139
|
-
executions.forEach(execution => flatten(execution));
|
|
140
|
-
return result;
|
|
141
|
-
}
|
|
142
186
|
}
|
|
143
187
|
//# sourceMappingURL=execution.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execution.js","sourceRoot":"","sources":["../../../src/trackers/execution.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9D,OAAO,EAAiB,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAiBvE;;GAEG;AACH,MAAM,OAAO,gBAAgB;
|
|
1
|
+
{"version":3,"file":"execution.js","sourceRoot":"","sources":["../../../src/trackers/execution.ts"],"names":[],"mappings":"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"}
|
|
@@ -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]
|
|
@@ -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
|
+
}
|
|
@@ -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,127 @@
|
|
|
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
|
+
/**
|
|
8
|
+
* A tracking context that manages function tracking using proxies
|
|
9
|
+
*/
|
|
10
|
+
export class ProxyTracker {
|
|
11
|
+
/**
|
|
12
|
+
* Create a new ProxyTracker
|
|
13
|
+
*
|
|
14
|
+
* @param trackFn - The function to use for tracking
|
|
15
|
+
*/
|
|
16
|
+
constructor(trackFn) {
|
|
17
|
+
this._originalFunctions = new Map();
|
|
18
|
+
this._trackedFunctions = new Map();
|
|
19
|
+
this._isEnabled = true;
|
|
20
|
+
this._trackFn = trackFn;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Enable or disable tracking
|
|
24
|
+
*
|
|
25
|
+
* @param enabled - Whether tracking is enabled
|
|
26
|
+
*/
|
|
27
|
+
setEnabled(enabled) {
|
|
28
|
+
this._isEnabled = enabled;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Check if tracking is enabled
|
|
32
|
+
*
|
|
33
|
+
* @returns Whether tracking is enabled
|
|
34
|
+
*/
|
|
35
|
+
isEnabled() {
|
|
36
|
+
return this._isEnabled;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Make a function trackable
|
|
40
|
+
*
|
|
41
|
+
* @param fn - The function to make trackable
|
|
42
|
+
* @param name - The name to use for tracking
|
|
43
|
+
* @returns A tracked version of the function
|
|
44
|
+
*/
|
|
45
|
+
makeTrackable(fn, name) {
|
|
46
|
+
// If tracking is disabled, return the original function
|
|
47
|
+
if (!this._isEnabled) {
|
|
48
|
+
return fn;
|
|
49
|
+
}
|
|
50
|
+
// If we've already tracked this function, return the tracked version
|
|
51
|
+
if (this._trackedFunctions.has(fn)) {
|
|
52
|
+
return this._trackedFunctions.get(fn);
|
|
53
|
+
}
|
|
54
|
+
// Create a tracked version of the function
|
|
55
|
+
const self = this;
|
|
56
|
+
const trackedFn = function (...args) {
|
|
57
|
+
return self._trackFn(() => fn.apply(this, args), {
|
|
58
|
+
label: name || fn.name || 'anonymous'
|
|
59
|
+
});
|
|
60
|
+
};
|
|
61
|
+
// Store the tracked version
|
|
62
|
+
this._trackedFunctions.set(fn, trackedFn);
|
|
63
|
+
return trackedFn;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Create a proxy for an object to track all its methods
|
|
67
|
+
*
|
|
68
|
+
* @param obj - The object to proxy
|
|
69
|
+
* @param namespace - The namespace to use for tracking
|
|
70
|
+
* @returns A proxied version of the object
|
|
71
|
+
*/
|
|
72
|
+
createProxy(obj, namespace = '') {
|
|
73
|
+
// If tracking is disabled, return the original object
|
|
74
|
+
if (!this._isEnabled) {
|
|
75
|
+
return obj;
|
|
76
|
+
}
|
|
77
|
+
const self = this;
|
|
78
|
+
return new Proxy(obj, {
|
|
79
|
+
get(target, prop, receiver) {
|
|
80
|
+
const value = Reflect.get(target, prop, receiver);
|
|
81
|
+
// If the property is a function, make it trackable
|
|
82
|
+
if (typeof value === 'function' && prop !== 'constructor') {
|
|
83
|
+
const name = namespace
|
|
84
|
+
? `${namespace}.${String(prop)}`
|
|
85
|
+
: String(prop);
|
|
86
|
+
return self.makeTrackable(value, name);
|
|
87
|
+
}
|
|
88
|
+
// If the property is an object (but not a built-in), proxy it too
|
|
89
|
+
if (value &&
|
|
90
|
+
typeof value === 'object' &&
|
|
91
|
+
!Array.isArray(value) &&
|
|
92
|
+
Object.getPrototypeOf(value) === Object.prototype) {
|
|
93
|
+
const nestedNamespace = namespace
|
|
94
|
+
? `${namespace}.${String(prop)}`
|
|
95
|
+
: String(prop);
|
|
96
|
+
return self.createProxy(value, nestedNamespace);
|
|
97
|
+
}
|
|
98
|
+
return value;
|
|
99
|
+
},
|
|
100
|
+
apply(target, thisArg, args) {
|
|
101
|
+
// This handles the case when the proxy itself is called as a function
|
|
102
|
+
const name = namespace || target.name || 'anonymous';
|
|
103
|
+
return self._trackFn(() => Reflect.apply(target, thisArg, args), {
|
|
104
|
+
label: name
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Track a module's exports
|
|
111
|
+
*
|
|
112
|
+
* @param moduleExports - The module's exports
|
|
113
|
+
* @param namespace - The namespace to use for tracking
|
|
114
|
+
* @returns A proxied version of the module's exports
|
|
115
|
+
*/
|
|
116
|
+
trackModule(moduleExports, namespace) {
|
|
117
|
+
return this.createProxy(moduleExports, namespace);
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Clear all tracked functions
|
|
121
|
+
*/
|
|
122
|
+
clear() {
|
|
123
|
+
this._trackedFunctions.clear();
|
|
124
|
+
this._originalFunctions.clear();
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
//# 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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"}
|
|
@@ -22,6 +22,7 @@ export declare class ExecutionTracker implements IExecutionTracker {
|
|
|
22
22
|
private _currentExecution;
|
|
23
23
|
private _asciiGenerator;
|
|
24
24
|
private _defaultThreshold;
|
|
25
|
+
private _globalScope;
|
|
25
26
|
/**
|
|
26
27
|
* Create a new ExecutionTracker instance
|
|
27
28
|
*
|
|
@@ -39,6 +40,19 @@ export declare class ExecutionTracker implements IExecutionTracker {
|
|
|
39
40
|
* @returns The return value of the tracked function
|
|
40
41
|
*/
|
|
41
42
|
track<T>(fn: () => T, options?: ITrackOptions): T;
|
|
43
|
+
/**
|
|
44
|
+
* Create a trackable version of a function
|
|
45
|
+
*
|
|
46
|
+
* This is a helper method to create a tracked version of a function
|
|
47
|
+
* that can be used for nested function tracking.
|
|
48
|
+
*
|
|
49
|
+
* @param fn - The function to make trackable
|
|
50
|
+
* @param options - Options for tracking
|
|
51
|
+
* @returns A tracked version of the function
|
|
52
|
+
*/
|
|
53
|
+
createTrackable<T extends (...args: any[]) => any>(fn: T, options?: Omit<ITrackOptions, 'label'> & {
|
|
54
|
+
label?: string;
|
|
55
|
+
}): (...args: Parameters<T>) => ReturnType<T>;
|
|
42
56
|
/**
|
|
43
57
|
* Get the current call stack
|
|
44
58
|
*
|
|
@@ -51,6 +65,20 @@ export declare class ExecutionTracker implements IExecutionTracker {
|
|
|
51
65
|
* @returns ASCII flow chart of the execution
|
|
52
66
|
*/
|
|
53
67
|
generateFlowChart(): string;
|
|
68
|
+
/**
|
|
69
|
+
* Prepare execution data for the ASCII generator
|
|
70
|
+
*
|
|
71
|
+
* @param executions - The execution records to prepare
|
|
72
|
+
* @returns A list of execution data
|
|
73
|
+
*/
|
|
74
|
+
private prepareExecutionData;
|
|
75
|
+
/**
|
|
76
|
+
* Add children to the result list
|
|
77
|
+
*
|
|
78
|
+
* @param children - The children to add
|
|
79
|
+
* @param result - The result list
|
|
80
|
+
*/
|
|
81
|
+
private addChildrenToResult;
|
|
54
82
|
/**
|
|
55
83
|
* Clear all execution records
|
|
56
84
|
*/
|
|
@@ -61,12 +89,5 @@ export declare class ExecutionTracker implements IExecutionTracker {
|
|
|
61
89
|
* @returns All execution records
|
|
62
90
|
*/
|
|
63
91
|
getExecutions(): ExecutionRecord[];
|
|
64
|
-
/**
|
|
65
|
-
* Flatten the execution tree into a list
|
|
66
|
-
*
|
|
67
|
-
* @param executions - The execution records to flatten
|
|
68
|
-
* @returns A flat list of execution data
|
|
69
|
-
*/
|
|
70
|
-
private flattenExecutions;
|
|
71
92
|
}
|
|
72
93
|
export {};
|