traceperf 0.1.2 → 0.1.5

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.
@@ -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 _instrumentedFunctions;
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
- * Instrument a function to track nested function calls
44
+ * Create a trackable version of a function
46
45
  *
47
- * @param fn - The function to instrument
48
- * @returns The instrumented function
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
- private instrumentFunction;
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
- // If this is the top-level call and nested tracking is enabled, instrument the function
71
- if (enableNestedTracking && !wasInstrumented) {
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
- * Instrument a function to track nested function calls
92
+ * Create a trackable version of a function
106
93
  *
107
- * @param fn - The function to instrument
108
- * @returns The instrumented function
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
- instrumentFunction(fn) {
111
- // If we've already instrumented this function, return the instrumented version
112
- if (this._instrumentedFunctions.has(fn)) {
113
- return this._instrumentedFunctions.get(fn);
114
- }
115
- // Create a new instrumented function
116
- const instrumentedFn = () => {
117
- try {
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":"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"}
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
- * LoggerConfig - Configuration options for the logger
76
+ * Logger configuration
68
77
  */
69
78
  export interface ILoggerConfig {
70
79
  /**
71
80
  * Operational mode
72
- * @default 'dev'
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?: LogMode;
86
+ mode: LogMode;
75
87
  /**
76
- * Minimum log level to display
77
- * @default 'debug'
88
+ * Minimum log level to show
78
89
  */
79
- level?: LogLevel;
90
+ level: LogLevel;
80
91
  /**
81
- * Whether to colorize output
82
- * @default true
92
+ * Whether to colorize logs
83
93
  */
84
- colorize?: boolean;
94
+ colorize: boolean;
85
95
  /**
86
96
  * Whether to include timestamps in logs
87
- * @default true
88
97
  */
89
- timestamp?: boolean;
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
- * Default performance threshold in milliseconds
92
- * @default 100
106
+ * Indentation size for nested logs
93
107
  */
94
- performanceThreshold?: number;
108
+ indentSize: number;
95
109
  /**
96
- * Number of spaces for each indentation level
97
- * @default 2
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
- indentSize?: number;
117
+ autoTracking?: boolean;
100
118
  /**
101
119
  * Log output destinations
102
120
  * @default [ConsoleTransport]
@@ -19,16 +19,66 @@ export interface ITrackOptions {
19
19
  /**
20
20
  * Whether to track nested function calls
21
21
  *
22
- * Note: This option doesn't automatically track all nested function calls.
23
- * It only enables the infrastructure for tracking nested calls, but you still
24
- * need to manually track each nested function using one of the approaches
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
+ }
@@ -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
+ }