traceperf 0.1.2 → 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 +93 -50
- package/dist/browser.d.ts +24 -6
- package/dist/browser.js +35 -48
- 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 +24 -6
- package/dist/esm/browser.js +35 -48
- 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 +11 -6
- package/dist/esm/trackers/execution.js +22 -49
- 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 +54 -4
- 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 +11 -6
- package/dist/trackers/execution.js +22 -49
- package/dist/trackers/execution.js.map +1 -1
- package/dist/types/config.d.ts +35 -17
- package/dist/types/index.d.ts +54 -4
- 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
|
@@ -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,8 +22,7 @@ export declare class ExecutionTracker implements IExecutionTracker {
|
|
|
22
22
|
private _currentExecution;
|
|
23
23
|
private _asciiGenerator;
|
|
24
24
|
private _defaultThreshold;
|
|
25
|
-
private
|
|
26
|
-
private _isInstrumented;
|
|
25
|
+
private _globalScope;
|
|
27
26
|
/**
|
|
28
27
|
* Create a new ExecutionTracker instance
|
|
29
28
|
*
|
|
@@ -42,12 +41,18 @@ export declare class ExecutionTracker implements IExecutionTracker {
|
|
|
42
41
|
*/
|
|
43
42
|
track<T>(fn: () => T, options?: ITrackOptions): T;
|
|
44
43
|
/**
|
|
45
|
-
*
|
|
44
|
+
* Create a trackable version of a function
|
|
46
45
|
*
|
|
47
|
-
*
|
|
48
|
-
*
|
|
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
|
|
49
52
|
*/
|
|
50
|
-
|
|
53
|
+
createTrackable<T extends (...args: any[]) => any>(fn: T, options?: Omit<ITrackOptions, 'label'> & {
|
|
54
|
+
label?: string;
|
|
55
|
+
}): (...args: Parameters<T>) => ReturnType<T>;
|
|
51
56
|
/**
|
|
52
57
|
* Get the current call stack
|
|
53
58
|
*
|
|
@@ -17,11 +17,13 @@ class ExecutionTracker {
|
|
|
17
17
|
var _a;
|
|
18
18
|
this._executions = [];
|
|
19
19
|
this._currentExecution = null;
|
|
20
|
-
this._instrumentedFunctions = new Map();
|
|
21
|
-
this._isInstrumented = false;
|
|
22
20
|
this._callStack = new stack_1.CallStackManager();
|
|
23
21
|
this._asciiGenerator = new ascii_1.AsciiArtGenerator({ boxWidth: options.boxWidth });
|
|
24
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
|
+
{};
|
|
25
27
|
}
|
|
26
28
|
/**
|
|
27
29
|
* Track the execution of a function
|
|
@@ -52,7 +54,7 @@ class ExecutionTracker {
|
|
|
52
54
|
children: [],
|
|
53
55
|
};
|
|
54
56
|
// Set parent-child relationship
|
|
55
|
-
if (this._currentExecution) {
|
|
57
|
+
if (this._currentExecution && enableNestedTracking) {
|
|
56
58
|
execution.parent = this._currentExecution;
|
|
57
59
|
this._currentExecution.children.push(execution);
|
|
58
60
|
}
|
|
@@ -64,20 +66,9 @@ class ExecutionTracker {
|
|
|
64
66
|
const previousExecution = this._currentExecution;
|
|
65
67
|
// Set this as the current execution
|
|
66
68
|
this._currentExecution = execution;
|
|
67
|
-
// Flag to track if we're already instrumenting to avoid recursion
|
|
68
|
-
const wasInstrumented = this._isInstrumented;
|
|
69
69
|
try {
|
|
70
|
-
//
|
|
71
|
-
|
|
72
|
-
this._isInstrumented = true;
|
|
73
|
-
// Instrument the function to track nested calls
|
|
74
|
-
const instrumentedFn = this.instrumentFunction(fn);
|
|
75
|
-
return instrumentedFn();
|
|
76
|
-
}
|
|
77
|
-
else {
|
|
78
|
-
// Execute the function normally
|
|
79
|
-
return fn();
|
|
80
|
-
}
|
|
70
|
+
// Execute the function
|
|
71
|
+
return fn();
|
|
81
72
|
}
|
|
82
73
|
finally {
|
|
83
74
|
// End timing
|
|
@@ -95,44 +86,27 @@ class ExecutionTracker {
|
|
|
95
86
|
this._currentExecution = previousExecution;
|
|
96
87
|
// Remove from call stack
|
|
97
88
|
this._callStack.pop();
|
|
98
|
-
// Reset instrumentation flag if this was the top-level call
|
|
99
|
-
if (!wasInstrumented) {
|
|
100
|
-
this._isInstrumented = false;
|
|
101
|
-
}
|
|
102
89
|
}
|
|
103
90
|
}
|
|
104
91
|
/**
|
|
105
|
-
*
|
|
92
|
+
* Create a trackable version of a function
|
|
106
93
|
*
|
|
107
|
-
*
|
|
108
|
-
*
|
|
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
|
|
109
100
|
*/
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
// We can't actually modify the function at runtime to track nested calls
|
|
119
|
-
// in a generic way. The best we can do is execute the function and rely
|
|
120
|
-
// on the call stack for visualization.
|
|
121
|
-
//
|
|
122
|
-
// For proper nested function tracking, users should wrap each function
|
|
123
|
-
// they want to track with tracePerf.track() or use a more advanced
|
|
124
|
-
// instrumentation approach like aspect-oriented programming or
|
|
125
|
-
// code transformation.
|
|
126
|
-
return fn();
|
|
127
|
-
}
|
|
128
|
-
catch (error) {
|
|
129
|
-
// Re-throw any errors
|
|
130
|
-
throw error;
|
|
131
|
-
}
|
|
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
|
+
});
|
|
132
109
|
};
|
|
133
|
-
// Cache the instrumented function
|
|
134
|
-
this._instrumentedFunctions.set(fn, instrumentedFn);
|
|
135
|
-
return instrumentedFn;
|
|
136
110
|
}
|
|
137
111
|
/**
|
|
138
112
|
* Get the current call stack
|
|
@@ -203,7 +177,6 @@ class ExecutionTracker {
|
|
|
203
177
|
this._executions = [];
|
|
204
178
|
this._currentExecution = null;
|
|
205
179
|
this._callStack.clear();
|
|
206
|
-
this._instrumentedFunctions.clear();
|
|
207
180
|
}
|
|
208
181
|
/**
|
|
209
182
|
* Get all execution records
|
|
@@ -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
|
@@ -19,16 +19,66 @@ export interface ITrackOptions {
|
|
|
19
19
|
/**
|
|
20
20
|
* Whether to track nested function calls
|
|
21
21
|
*
|
|
22
|
-
* Note:
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
* described in the documentation.
|
|
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.
|
|
26
25
|
*
|
|
27
26
|
* @default true
|
|
28
27
|
*/
|
|
29
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;
|
|
30
38
|
/**
|
|
31
39
|
* Whether to suppress logging
|
|
32
40
|
*/
|
|
33
41
|
silent?: boolean;
|
|
34
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
|
+
}
|