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.
@@ -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 flatExecutions = this.flattenExecutions(this._executions);
126
+ const executionData = this.prepareExecutionData(this._executions);
102
127
  // Generate the flow chart
103
- return this._asciiGenerator.generateFlowChart(flatExecutions);
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":"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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,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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "traceperf",
3
- "version": "0.1.1",
3
+ "version": "0.1.4",
4
4
  "description": "Advanced console logging & performance tracking for Node.js",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/esm/index.js",