@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.
- package/dist/cli.js +2 -2
- package/dist/cli.js.map +1 -1
- package/dist/commands/dev.d.ts +4 -1
- package/dist/commands/dev.d.ts.map +1 -1
- package/dist/commands/dev.js +29 -15
- package/dist/commands/dev.js.map +1 -1
- package/dist/commands/make.d.ts +17 -0
- package/dist/commands/make.d.ts.map +1 -0
- package/dist/commands/make.js +219 -0
- package/dist/commands/make.js.map +1 -0
- package/dist/dev/error-parser.d.ts +67 -0
- package/dist/dev/error-parser.d.ts.map +1 -0
- package/dist/dev/error-parser.js +384 -0
- package/dist/dev/error-parser.js.map +1 -0
- package/dist/dev/hmr-runner.d.ts +67 -9
- package/dist/dev/hmr-runner.d.ts.map +1 -1
- package/dist/dev/hmr-runner.js +305 -57
- package/dist/dev/hmr-runner.js.map +1 -1
- package/dist/dev/index.d.ts +6 -0
- package/dist/dev/index.d.ts.map +1 -1
- package/dist/dev/index.js +8 -0
- package/dist/dev/index.js.map +1 -1
- package/dist/dev/reload-reporter.d.ts +197 -0
- package/dist/dev/reload-reporter.d.ts.map +1 -0
- package/dist/dev/reload-reporter.js +370 -0
- package/dist/dev/reload-reporter.js.map +1 -0
- package/dist/dev/timing-tracker.d.ts +130 -0
- package/dist/dev/timing-tracker.d.ts.map +1 -0
- package/dist/dev/timing-tracker.js +175 -0
- package/dist/dev/timing-tracker.js.map +1 -0
- package/dist/generators/generators/factory.d.ts +5 -5
- package/dist/generators/generators/factory.js +8 -8
- package/dist/generators/generators/migration.d.ts +7 -7
- package/dist/generators/generators/migration.js +12 -12
- package/dist/generators/generators/model.d.ts +7 -7
- package/dist/generators/generators/model.js +12 -12
- package/dist/generators/generators/procedure.d.ts +6 -6
- package/dist/generators/generators/procedure.js +12 -12
- package/dist/generators/generators/seeder.d.ts +5 -5
- package/dist/generators/generators/seeder.js +9 -9
- package/dist/generators/generators/seeder.js.map +1 -1
- package/dist/generators/types.d.ts +1 -1
- package/dist/generators/types.d.ts.map +1 -1
- package/dist/migrations/commands/run.js +1 -1
- package/dist/migrations/commands/run.js.map +1 -1
- package/dist/migrations/commands/status.js +1 -1
- package/dist/migrations/commands/status.js.map +1 -1
- package/dist/migrations/errors.js +1 -1
- package/dist/migrations/errors.js.map +1 -1
- package/dist/seeding/commands/seed.js +2 -2
- package/dist/seeding/commands/seed.js.map +1 -1
- package/dist/seeding/errors.js +1 -1
- package/dist/seeding/errors.js.map +1 -1
- 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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"}
|