@veloxts/cli 0.4.12 → 0.4.13

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.
Files changed (54) hide show
  1. package/dist/cli.js +2 -2
  2. package/dist/cli.js.map +1 -1
  3. package/dist/commands/dev.d.ts +4 -1
  4. package/dist/commands/dev.d.ts.map +1 -1
  5. package/dist/commands/dev.js +29 -15
  6. package/dist/commands/dev.js.map +1 -1
  7. package/dist/commands/make.d.ts +17 -0
  8. package/dist/commands/make.d.ts.map +1 -0
  9. package/dist/commands/make.js +219 -0
  10. package/dist/commands/make.js.map +1 -0
  11. package/dist/dev/error-parser.d.ts +67 -0
  12. package/dist/dev/error-parser.d.ts.map +1 -0
  13. package/dist/dev/error-parser.js +384 -0
  14. package/dist/dev/error-parser.js.map +1 -0
  15. package/dist/dev/hmr-runner.d.ts +67 -9
  16. package/dist/dev/hmr-runner.d.ts.map +1 -1
  17. package/dist/dev/hmr-runner.js +305 -57
  18. package/dist/dev/hmr-runner.js.map +1 -1
  19. package/dist/dev/index.d.ts +6 -0
  20. package/dist/dev/index.d.ts.map +1 -1
  21. package/dist/dev/index.js +8 -0
  22. package/dist/dev/index.js.map +1 -1
  23. package/dist/dev/reload-reporter.d.ts +197 -0
  24. package/dist/dev/reload-reporter.d.ts.map +1 -0
  25. package/dist/dev/reload-reporter.js +370 -0
  26. package/dist/dev/reload-reporter.js.map +1 -0
  27. package/dist/dev/timing-tracker.d.ts +130 -0
  28. package/dist/dev/timing-tracker.d.ts.map +1 -0
  29. package/dist/dev/timing-tracker.js +175 -0
  30. package/dist/dev/timing-tracker.js.map +1 -0
  31. package/dist/generators/generators/factory.d.ts +5 -5
  32. package/dist/generators/generators/factory.js +8 -8
  33. package/dist/generators/generators/migration.d.ts +7 -7
  34. package/dist/generators/generators/migration.js +12 -12
  35. package/dist/generators/generators/model.d.ts +7 -7
  36. package/dist/generators/generators/model.js +12 -12
  37. package/dist/generators/generators/procedure.d.ts +6 -6
  38. package/dist/generators/generators/procedure.js +12 -12
  39. package/dist/generators/generators/seeder.d.ts +5 -5
  40. package/dist/generators/generators/seeder.js +9 -9
  41. package/dist/generators/generators/seeder.js.map +1 -1
  42. package/dist/generators/types.d.ts +1 -1
  43. package/dist/generators/types.d.ts.map +1 -1
  44. package/dist/migrations/commands/run.js +1 -1
  45. package/dist/migrations/commands/run.js.map +1 -1
  46. package/dist/migrations/commands/status.js +1 -1
  47. package/dist/migrations/commands/status.js.map +1 -1
  48. package/dist/migrations/errors.js +1 -1
  49. package/dist/migrations/errors.js.map +1 -1
  50. package/dist/seeding/commands/seed.js +2 -2
  51. package/dist/seeding/commands/seed.js.map +1 -1
  52. package/dist/seeding/errors.js +1 -1
  53. package/dist/seeding/errors.js.map +1 -1
  54. package/package.json +6 -6
@@ -0,0 +1,197 @@
1
+ /**
2
+ * Reload Reporter - Provides feedback during development reloads
3
+ *
4
+ * Tracks reload events and displays formatted output with timing information.
5
+ * Inspired by Laravel's artisan serve and Vite's dev server feedback.
6
+ *
7
+ * Design principles:
8
+ * - Clear visual hierarchy (icons, colors, spacing)
9
+ * - Progressive disclosure (essential info by default, details on demand)
10
+ * - Status at a glance (timestamp, duration, file changed)
11
+ * - Context-aware messages (different output for hot update vs full restart)
12
+ *
13
+ * @example
14
+ * ```typescript
15
+ * const reporter = createReloadReporter({ verbose: false, clearOnRestart: true });
16
+ *
17
+ * reporter.printHMRStatus();
18
+ * reporter.reportHotUpdate('src/procedures/users.ts', 23);
19
+ * reporter.reportFullRestart('src/config/app.ts changed');
20
+ * reporter.reportStartupComplete('http://localhost:3210', 847);
21
+ * ```
22
+ */
23
+ /**
24
+ * Configuration for the reload reporter
25
+ */
26
+ export interface ReloadReporterOptions {
27
+ /** Show verbose timing breakdown and additional details */
28
+ readonly verbose: boolean;
29
+ /** Clear console on full restart (not on hot updates) */
30
+ readonly clearOnRestart: boolean;
31
+ }
32
+ /**
33
+ * Types of reload events for tracking and analytics
34
+ */
35
+ export type ReloadEventType = 'hot-update' | 'full-restart' | 'error' | 'startup';
36
+ /**
37
+ * Details about a reload event (for logging/analytics)
38
+ */
39
+ export interface ReloadEvent {
40
+ readonly type: ReloadEventType;
41
+ readonly timestamp: number;
42
+ readonly filePath?: string;
43
+ readonly duration?: number;
44
+ readonly error?: Error;
45
+ }
46
+ /**
47
+ * HMR boundary configuration for display
48
+ */
49
+ export interface HMRBoundary {
50
+ readonly label: string;
51
+ readonly pattern: string;
52
+ }
53
+ /**
54
+ * Formats and displays reload feedback during development.
55
+ *
56
+ * This class is responsible for all HMR-related console output.
57
+ * It maintains consistent formatting and provides both terse and verbose modes.
58
+ */
59
+ export declare class ReloadReporter {
60
+ private readonly options;
61
+ /** Track reload history for statistics (verbose mode) */
62
+ private readonly reloadHistory;
63
+ /** Count of hot updates since last full restart */
64
+ private hotUpdateCount;
65
+ /** Count of full restarts since server start */
66
+ private fullRestartCount;
67
+ /** Timestamp of last reload (any type) */
68
+ private lastReloadTime;
69
+ constructor(options: ReloadReporterOptions);
70
+ /**
71
+ * Report a successful hot module update.
72
+ *
73
+ * Called when hot-hook successfully swaps a module without full restart.
74
+ *
75
+ * @param filePath - Path to the file that was hot-updated
76
+ * @param duration - Time taken for the hot update in milliseconds
77
+ */
78
+ reportHotUpdate(filePath: string, duration: number): void;
79
+ /**
80
+ * Report that a full process restart is starting.
81
+ *
82
+ * Called when a file outside HMR boundaries changes, requiring full restart.
83
+ *
84
+ * @param reason - Human-readable reason for the restart
85
+ * @param filePath - Optional path to the file that triggered restart
86
+ */
87
+ reportFullRestart(reason: string, filePath?: string): void;
88
+ /**
89
+ * Report successful startup after restart.
90
+ *
91
+ * Called when the server is ready to accept connections after a restart.
92
+ *
93
+ * @param url - Server URL (e.g., "http://localhost:3210")
94
+ * @param duration - Time taken for startup in milliseconds
95
+ */
96
+ reportStartupComplete(url: string, duration: number): void;
97
+ /**
98
+ * Report a compilation/syntax error.
99
+ *
100
+ * Called when TypeScript compilation fails or there's a syntax error.
101
+ * The server continues watching for changes to fix the error.
102
+ *
103
+ * @param error - The error object
104
+ * @param filePath - Optional path to the file that caused the error
105
+ * @param suggestion - Optional suggestion for fixing the error
106
+ */
107
+ reportCompilationError(error: Error, filePath?: string, suggestion?: string): void;
108
+ /**
109
+ * Report a runtime error (after successful compilation).
110
+ *
111
+ * Called when an error occurs during execution, not compilation.
112
+ * HMR continues watching for changes.
113
+ *
114
+ * @param error - Optional error object for verbose mode
115
+ */
116
+ reportRuntimeError(error?: Error): void;
117
+ /**
118
+ * Report that HMR failed and falling back to full restart.
119
+ *
120
+ * @param reason - Why HMR failed
121
+ */
122
+ reportHMRFallback(reason: string): void;
123
+ /**
124
+ * Print the initial HMR status banner.
125
+ *
126
+ * Shows that HMR is enabled and which file patterns are hot-reloadable.
127
+ *
128
+ * @param boundaries - Optional custom boundaries (defaults to standard patterns)
129
+ */
130
+ printHMRStatus(boundaries?: readonly HMRBoundary[]): void;
131
+ /**
132
+ * Print debug mode status banner.
133
+ *
134
+ * Shows when debug logging and request tracing are enabled via --debug flag.
135
+ */
136
+ printDebugStatus(): void;
137
+ /**
138
+ * Print legacy mode warning.
139
+ *
140
+ * Shows when user explicitly disabled HMR with --no-hmr flag.
141
+ */
142
+ printLegacyModeWarning(): void;
143
+ /**
144
+ * Print a summary of reload statistics (verbose mode only).
145
+ *
146
+ * Shows total hot updates, restarts, and session duration.
147
+ */
148
+ printStatistics(): void;
149
+ /**
150
+ * Get the number of hot updates since last full restart.
151
+ */
152
+ getHotUpdateCount(): number;
153
+ /**
154
+ * Get the number of full restarts since server start.
155
+ */
156
+ getFullRestartCount(): number;
157
+ /**
158
+ * Get the reload history (for debugging/analytics).
159
+ */
160
+ getReloadHistory(): readonly ReloadEvent[];
161
+ /**
162
+ * Clear the reload history.
163
+ */
164
+ clearHistory(): void;
165
+ /**
166
+ * Format current time as HH:MM:SS
167
+ */
168
+ private formatTimestamp;
169
+ /**
170
+ * Format file path, truncating if too long.
171
+ */
172
+ private formatFilePath;
173
+ /**
174
+ * Print verbose hot update information.
175
+ */
176
+ private printVerboseHotUpdate;
177
+ /**
178
+ * Print verbose startup information.
179
+ */
180
+ private printVerboseStartup;
181
+ /**
182
+ * Print formatted error with syntax highlighting attempt.
183
+ */
184
+ private printFormattedError;
185
+ /**
186
+ * Record an event for history/analytics.
187
+ */
188
+ private recordEvent;
189
+ }
190
+ /**
191
+ * Create a new ReloadReporter instance.
192
+ *
193
+ * @param options - Configuration options
194
+ * @returns New ReloadReporter instance
195
+ */
196
+ export declare function createReloadReporter(options: ReloadReporterOptions): ReloadReporter;
197
+ //# sourceMappingURL=reload-reporter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reload-reporter.d.ts","sourceRoot":"","sources":["../../src/dev/reload-reporter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAUH;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,2DAA2D;IAC3D,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,yDAAyD;IACzD,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;CAClC;AAED;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG,YAAY,GAAG,cAAc,GAAG,OAAO,GAAG,SAAS,CAAC;AAElF;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAwBD;;;;;GAKG;AACH,qBAAa,cAAc;IAab,OAAO,CAAC,QAAQ,CAAC,OAAO;IAZpC,yDAAyD;IACzD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAqB;IAEnD,mDAAmD;IACnD,OAAO,CAAC,cAAc,CAAK;IAE3B,gDAAgD;IAChD,OAAO,CAAC,gBAAgB,CAAK;IAE7B,0CAA0C;IAC1C,OAAO,CAAC,cAAc,CAAuB;gBAEhB,OAAO,EAAE,qBAAqB;IAM3D;;;;;;;OAOG;IACH,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAsBzD;;;;;;;OAOG;IACH,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI;IAoB1D;;;;;;;OAOG;IACH,qBAAqB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAoB1D;;;;;;;;;OASG;IACH,sBAAsB,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI;IA6BlF;;;;;;;OAOG;IACH,kBAAkB,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI;IAsBvC;;;;OAIG;IACH,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAUvC;;;;;;OAMG;IACH,cAAc,CAAC,UAAU,CAAC,EAAE,SAAS,WAAW,EAAE,GAAG,IAAI;IAgBzD;;;;OAIG;IACH,gBAAgB,IAAI,IAAI;IAMxB;;;;OAIG;IACH,sBAAsB,IAAI,IAAI;IAQ9B;;;;OAIG;IACH,eAAe,IAAI,IAAI;IAiBvB;;OAEG;IACH,iBAAiB,IAAI,MAAM;IAI3B;;OAEG;IACH,mBAAmB,IAAI,MAAM;IAI7B;;OAEG;IACH,gBAAgB,IAAI,SAAS,WAAW,EAAE;IAI1C;;OAEG;IACH,YAAY,IAAI,IAAI;IAQpB;;OAEG;IACH,OAAO,CAAC,eAAe;IAQvB;;OAEG;IACH,OAAO,CAAC,cAAc;IAYtB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAK7B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAM3B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAiB3B;;OAEG;IACH,OAAO,CAAC,WAAW;CAQpB;AAMD;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,qBAAqB,GAAG,cAAc,CAEnF"}
@@ -0,0 +1,370 @@
1
+ /**
2
+ * Reload Reporter - Provides feedback during development reloads
3
+ *
4
+ * Tracks reload events and displays formatted output with timing information.
5
+ * Inspired by Laravel's artisan serve and Vite's dev server feedback.
6
+ *
7
+ * Design principles:
8
+ * - Clear visual hierarchy (icons, colors, spacing)
9
+ * - Progressive disclosure (essential info by default, details on demand)
10
+ * - Status at a glance (timestamp, duration, file changed)
11
+ * - Context-aware messages (different output for hot update vs full restart)
12
+ *
13
+ * @example
14
+ * ```typescript
15
+ * const reporter = createReloadReporter({ verbose: false, clearOnRestart: true });
16
+ *
17
+ * reporter.printHMRStatus();
18
+ * reporter.reportHotUpdate('src/procedures/users.ts', 23);
19
+ * reporter.reportFullRestart('src/config/app.ts changed');
20
+ * reporter.reportStartupComplete('http://localhost:3210', 847);
21
+ * ```
22
+ */
23
+ import pc from 'picocolors';
24
+ import { formatDuration } from '../utils/output.js';
25
+ // ============================================================================
26
+ // Default Configuration
27
+ // ============================================================================
28
+ /**
29
+ * Default HMR boundaries shown in status banner
30
+ */
31
+ const DEFAULT_HMR_BOUNDARIES = [
32
+ { label: 'Procedures', pattern: 'src/procedures/**/*.ts' },
33
+ { label: 'Schemas', pattern: 'src/schemas/**/*.ts' },
34
+ { label: 'Handlers', pattern: 'src/handlers/**/*.ts' },
35
+ ];
36
+ /**
37
+ * Maximum file path length before truncation
38
+ */
39
+ const MAX_FILE_PATH_LENGTH = 50;
40
+ // ============================================================================
41
+ // ReloadReporter Class
42
+ // ============================================================================
43
+ /**
44
+ * Formats and displays reload feedback during development.
45
+ *
46
+ * This class is responsible for all HMR-related console output.
47
+ * It maintains consistent formatting and provides both terse and verbose modes.
48
+ */
49
+ export class ReloadReporter {
50
+ options;
51
+ /** Track reload history for statistics (verbose mode) */
52
+ reloadHistory = [];
53
+ /** Count of hot updates since last full restart */
54
+ hotUpdateCount = 0;
55
+ /** Count of full restarts since server start */
56
+ fullRestartCount = 0;
57
+ /** Timestamp of last reload (any type) */
58
+ lastReloadTime = null;
59
+ constructor(options) {
60
+ this.options = options;
61
+ }
62
+ // --------------------------------------------------------------------------
63
+ // Public API: Reporting Methods
64
+ // --------------------------------------------------------------------------
65
+ /**
66
+ * Report a successful hot module update.
67
+ *
68
+ * Called when hot-hook successfully swaps a module without full restart.
69
+ *
70
+ * @param filePath - Path to the file that was hot-updated
71
+ * @param duration - Time taken for the hot update in milliseconds
72
+ */
73
+ reportHotUpdate(filePath, duration) {
74
+ this.lastReloadTime = Date.now();
75
+ this.hotUpdateCount++;
76
+ this.recordEvent({
77
+ type: 'hot-update',
78
+ timestamp: this.lastReloadTime,
79
+ filePath,
80
+ duration,
81
+ });
82
+ const timestamp = this.formatTimestamp();
83
+ const file = this.formatFilePath(filePath);
84
+ const time = pc.dim(`(${formatDuration(duration)})`);
85
+ console.log(`${timestamp} ${pc.green('⚡')} ${pc.green('Hot updated')} ${file} ${time}`);
86
+ if (this.options.verbose) {
87
+ this.printVerboseHotUpdate(duration);
88
+ }
89
+ }
90
+ /**
91
+ * Report that a full process restart is starting.
92
+ *
93
+ * Called when a file outside HMR boundaries changes, requiring full restart.
94
+ *
95
+ * @param reason - Human-readable reason for the restart
96
+ * @param filePath - Optional path to the file that triggered restart
97
+ */
98
+ reportFullRestart(reason, filePath) {
99
+ if (this.options.clearOnRestart) {
100
+ console.clear();
101
+ }
102
+ this.fullRestartCount++;
103
+ // Reset hot update count on full restart
104
+ this.hotUpdateCount = 0;
105
+ const timestamp = this.formatTimestamp();
106
+ const reasonText = pc.dim(reason);
107
+ console.log(`${timestamp} ${pc.yellow('🔄')} ${pc.yellow('Restarting')} ${reasonText}`);
108
+ if (this.options.verbose && filePath) {
109
+ console.log(pc.dim(` └─ Triggered by: ${filePath}`));
110
+ }
111
+ }
112
+ /**
113
+ * Report successful startup after restart.
114
+ *
115
+ * Called when the server is ready to accept connections after a restart.
116
+ *
117
+ * @param url - Server URL (e.g., "http://localhost:3210")
118
+ * @param duration - Time taken for startup in milliseconds
119
+ */
120
+ reportStartupComplete(url, duration) {
121
+ this.lastReloadTime = Date.now();
122
+ this.recordEvent({
123
+ type: 'startup',
124
+ timestamp: this.lastReloadTime,
125
+ duration,
126
+ });
127
+ const timestamp = this.formatTimestamp();
128
+ const urlFormatted = pc.cyan(url);
129
+ const time = pc.dim(`(${formatDuration(duration)})`);
130
+ console.log(`${timestamp} ${pc.green('✓')} ${pc.green('Server ready')} ${urlFormatted} ${time}`);
131
+ if (this.options.verbose) {
132
+ this.printVerboseStartup(duration);
133
+ }
134
+ }
135
+ /**
136
+ * Report a compilation/syntax error.
137
+ *
138
+ * Called when TypeScript compilation fails or there's a syntax error.
139
+ * The server continues watching for changes to fix the error.
140
+ *
141
+ * @param error - The error object
142
+ * @param filePath - Optional path to the file that caused the error
143
+ * @param suggestion - Optional suggestion for fixing the error
144
+ */
145
+ reportCompilationError(error, filePath, suggestion) {
146
+ this.recordEvent({
147
+ type: 'error',
148
+ timestamp: Date.now(),
149
+ filePath,
150
+ error,
151
+ });
152
+ const timestamp = this.formatTimestamp();
153
+ const file = filePath ? this.formatFilePath(filePath) : pc.dim('unknown file');
154
+ console.log('');
155
+ console.log(`${timestamp} ${pc.red('✗')} ${pc.red('Compilation failed')} ${file}`);
156
+ console.log('');
157
+ // Format error message
158
+ this.printFormattedError(error);
159
+ // Print suggestion if available
160
+ if (suggestion) {
161
+ console.log('');
162
+ console.log(` ${pc.yellow('Suggestion:')} ${suggestion}`);
163
+ }
164
+ console.log('');
165
+ console.log(pc.dim(' Waiting for changes...'));
166
+ console.log('');
167
+ }
168
+ /**
169
+ * Report a runtime error (after successful compilation).
170
+ *
171
+ * Called when an error occurs during execution, not compilation.
172
+ * HMR continues watching for changes.
173
+ *
174
+ * @param error - Optional error object for verbose mode
175
+ */
176
+ reportRuntimeError(error) {
177
+ this.recordEvent({
178
+ type: 'error',
179
+ timestamp: Date.now(),
180
+ error,
181
+ });
182
+ const timestamp = this.formatTimestamp();
183
+ console.log(`${timestamp} ${pc.yellow('⚠')} ${pc.yellow('Runtime error occurred')}`);
184
+ console.log('');
185
+ console.log(pc.dim(' Check your application logs for details.'));
186
+ console.log(pc.dim(' HMR continues watching for changes.'));
187
+ if (this.options.verbose && error) {
188
+ console.log('');
189
+ console.log(pc.dim(` Error: ${error.message}`));
190
+ }
191
+ console.log('');
192
+ }
193
+ /**
194
+ * Report that HMR failed and falling back to full restart.
195
+ *
196
+ * @param reason - Why HMR failed
197
+ */
198
+ reportHMRFallback(reason) {
199
+ const timestamp = this.formatTimestamp();
200
+ console.log(`${timestamp} ${pc.yellow('⚠')} ${pc.yellow('HMR failed:')} ${pc.dim(reason)}`);
201
+ console.log(pc.dim(' └─ Falling back to full restart...'));
202
+ }
203
+ // --------------------------------------------------------------------------
204
+ // Public API: Status Banners
205
+ // --------------------------------------------------------------------------
206
+ /**
207
+ * Print the initial HMR status banner.
208
+ *
209
+ * Shows that HMR is enabled and which file patterns are hot-reloadable.
210
+ *
211
+ * @param boundaries - Optional custom boundaries (defaults to standard patterns)
212
+ */
213
+ printHMRStatus(boundaries) {
214
+ const boundariesToShow = boundaries ?? DEFAULT_HMR_BOUNDARIES;
215
+ console.log('');
216
+ console.log(` ${pc.green('⚡')} ${pc.green('HMR enabled')}`);
217
+ console.log(pc.dim(' Hot module replacement active for:'));
218
+ for (const boundary of boundariesToShow) {
219
+ console.log(pc.dim(` • ${boundary.label} (${boundary.pattern})`));
220
+ }
221
+ console.log('');
222
+ console.log(pc.dim(' Config/database changes trigger full restart.'));
223
+ console.log('');
224
+ }
225
+ /**
226
+ * Print debug mode status banner.
227
+ *
228
+ * Shows when debug logging and request tracing are enabled via --debug flag.
229
+ */
230
+ printDebugStatus() {
231
+ console.log(` ${pc.magenta('🔍')} ${pc.magenta('Debug mode enabled')}`);
232
+ console.log(pc.dim(' Request/response logging active'));
233
+ console.log('');
234
+ }
235
+ /**
236
+ * Print legacy mode warning.
237
+ *
238
+ * Shows when user explicitly disabled HMR with --no-hmr flag.
239
+ */
240
+ printLegacyModeWarning() {
241
+ console.log('');
242
+ console.log(` ${pc.yellow('⚠')} ${pc.yellow('Legacy watch mode')}`);
243
+ console.log(pc.dim(' HMR disabled - every change triggers full restart.'));
244
+ console.log(pc.dim(` Remove ${pc.cyan('--no-hmr')} flag for faster reloads.`));
245
+ console.log('');
246
+ }
247
+ /**
248
+ * Print a summary of reload statistics (verbose mode only).
249
+ *
250
+ * Shows total hot updates, restarts, and session duration.
251
+ */
252
+ printStatistics() {
253
+ if (!this.options.verbose) {
254
+ return;
255
+ }
256
+ console.log('');
257
+ console.log(pc.dim(' ─── Session Statistics ───'));
258
+ console.log(pc.dim(` Hot updates: ${this.hotUpdateCount}`));
259
+ console.log(pc.dim(` Full restarts: ${this.fullRestartCount}`));
260
+ console.log(pc.dim(` Total events: ${this.reloadHistory.length}`));
261
+ console.log('');
262
+ }
263
+ // --------------------------------------------------------------------------
264
+ // Public API: Accessors
265
+ // --------------------------------------------------------------------------
266
+ /**
267
+ * Get the number of hot updates since last full restart.
268
+ */
269
+ getHotUpdateCount() {
270
+ return this.hotUpdateCount;
271
+ }
272
+ /**
273
+ * Get the number of full restarts since server start.
274
+ */
275
+ getFullRestartCount() {
276
+ return this.fullRestartCount;
277
+ }
278
+ /**
279
+ * Get the reload history (for debugging/analytics).
280
+ */
281
+ getReloadHistory() {
282
+ return this.reloadHistory;
283
+ }
284
+ /**
285
+ * Clear the reload history.
286
+ */
287
+ clearHistory() {
288
+ this.reloadHistory.length = 0;
289
+ }
290
+ // --------------------------------------------------------------------------
291
+ // Private: Formatting Helpers
292
+ // --------------------------------------------------------------------------
293
+ /**
294
+ * Format current time as HH:MM:SS
295
+ */
296
+ formatTimestamp() {
297
+ const now = new Date();
298
+ const hours = now.getHours().toString().padStart(2, '0');
299
+ const minutes = now.getMinutes().toString().padStart(2, '0');
300
+ const seconds = now.getSeconds().toString().padStart(2, '0');
301
+ return pc.dim(`${hours}:${minutes}:${seconds}`);
302
+ }
303
+ /**
304
+ * Format file path, truncating if too long.
305
+ */
306
+ formatFilePath(filePath) {
307
+ // Remove leading ./ if present
308
+ let normalized = filePath.startsWith('./') ? filePath.slice(2) : filePath;
309
+ // Truncate if too long
310
+ if (normalized.length > MAX_FILE_PATH_LENGTH) {
311
+ normalized = `...${normalized.slice(-(MAX_FILE_PATH_LENGTH - 3))}`;
312
+ }
313
+ return pc.cyan(normalized);
314
+ }
315
+ /**
316
+ * Print verbose hot update information.
317
+ */
318
+ printVerboseHotUpdate(duration) {
319
+ console.log(pc.dim(' ├─ Module swap completed'));
320
+ console.log(pc.dim(` └─ Total: ${formatDuration(duration)}`));
321
+ }
322
+ /**
323
+ * Print verbose startup information.
324
+ */
325
+ printVerboseStartup(duration) {
326
+ // For MVP, just show total time
327
+ // Future enhancement: Break down into phases
328
+ console.log(pc.dim(` └─ Startup: ${formatDuration(duration)}`));
329
+ }
330
+ /**
331
+ * Print formatted error with syntax highlighting attempt.
332
+ */
333
+ printFormattedError(error) {
334
+ const lines = error.message.split('\n');
335
+ for (const line of lines) {
336
+ // Indent error lines
337
+ console.log(` ${pc.red(line)}`);
338
+ }
339
+ // If there's a stack trace and we're in verbose mode, show first few lines
340
+ if (this.options.verbose && error.stack) {
341
+ const stackLines = error.stack.split('\n').slice(1, 4);
342
+ for (const line of stackLines) {
343
+ console.log(pc.dim(` ${line.trim()}`));
344
+ }
345
+ }
346
+ }
347
+ /**
348
+ * Record an event for history/analytics.
349
+ */
350
+ recordEvent(event) {
351
+ this.reloadHistory.push(event);
352
+ // Keep history bounded to prevent memory growth
353
+ if (this.reloadHistory.length > 100) {
354
+ this.reloadHistory.shift();
355
+ }
356
+ }
357
+ }
358
+ // ============================================================================
359
+ // Factory Function
360
+ // ============================================================================
361
+ /**
362
+ * Create a new ReloadReporter instance.
363
+ *
364
+ * @param options - Configuration options
365
+ * @returns New ReloadReporter instance
366
+ */
367
+ export function createReloadReporter(options) {
368
+ return new ReloadReporter(options);
369
+ }
370
+ //# sourceMappingURL=reload-reporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reload-reporter.js","sourceRoot":"","sources":["../../src/dev/reload-reporter.ts"],"names":[],"mappings":"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"}