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.
@@ -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 flatExecutions = this.flattenExecutions(this._executions);
123
+ const executionData = this.prepareExecutionData(this._executions);
99
124
  // Generate the flow chart
100
- return this._asciiGenerator.generateFlowChart(flatExecutions);
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":"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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]
@@ -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 {};