@absolutejs/absolute 0.19.0-beta.834 → 0.19.0-beta.836
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/angular/components/core/streamingSlotRegistrar.js +1 -1
- package/dist/angular/components/core/streamingSlotRegistry.js +2 -2
- package/dist/build.js +4 -2
- package/dist/build.js.map +4 -4
- package/dist/dev/client/errorOverlay.ts +289 -32
- package/dist/dev/client/hmrClient.ts +6 -8
- package/dist/index.js +6 -4
- package/dist/index.js.map +6 -6
- package/dist/src/dev/moduleServer.d.ts +1 -0
- package/dist/types/client.d.ts +5 -0
- package/package.json +1 -1
|
@@ -6,6 +6,11 @@ import { OVERLAY_FADE_DURATION_MS } from './constants';
|
|
|
6
6
|
|
|
7
7
|
let errorOverlayElement: HTMLDivElement | null = null;
|
|
8
8
|
let currentOverlayKind: 'compilation' | 'runtime' | null = null;
|
|
9
|
+
// Runtime errors accumulate so a second uncaught error in the same tick
|
|
10
|
+
// doesn't silently replace the first — the overlay shows nav buttons and
|
|
11
|
+
// a "N of M" badge so you can step through them.
|
|
12
|
+
const runtimeErrors: ErrorOverlayOptions[] = [];
|
|
13
|
+
let activeRuntimeIndex = 0;
|
|
9
14
|
|
|
10
15
|
const frameworkLabels: Record<string, string> = {
|
|
11
16
|
angular: 'Angular',
|
|
@@ -39,6 +44,10 @@ const removeOverlayElement = () => {
|
|
|
39
44
|
|
|
40
45
|
export const hideErrorOverlay = () => {
|
|
41
46
|
const elm = errorOverlayElement;
|
|
47
|
+
// Clearing on dismiss — if more errors arrive after this they get a
|
|
48
|
+
// fresh overlay, otherwise stale entries accumulate forever.
|
|
49
|
+
runtimeErrors.length = 0;
|
|
50
|
+
activeRuntimeIndex = 0;
|
|
42
51
|
if (!elm || !elm.parentNode) {
|
|
43
52
|
removeOverlayElement();
|
|
44
53
|
|
|
@@ -55,6 +64,11 @@ export const hideErrorOverlay = () => {
|
|
|
55
64
|
|
|
56
65
|
export const isRuntimeErrorOverlay = () => currentOverlayKind === 'runtime';
|
|
57
66
|
|
|
67
|
+
const sectionLabelStyle =
|
|
68
|
+
'font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:0.08em;color:#94a3b8;margin-bottom:8px;';
|
|
69
|
+
const codeBlockStyle =
|
|
70
|
+
'margin:0;padding:14px 18px;background:rgba(15,23,42,0.8);border-radius:10px;border:1px solid rgba(71,85,105,0.4);color:#cbd5e1;font-size:12.5px;line-height:1.55;overflow-x:auto;white-space:pre;font-family:inherit;';
|
|
71
|
+
|
|
58
72
|
const buildLocationSection = (
|
|
59
73
|
file: string | undefined,
|
|
60
74
|
line: number | undefined,
|
|
@@ -69,8 +83,7 @@ const buildLocationSection = (
|
|
|
69
83
|
locSection.style.cssText = 'margin-bottom:20px;';
|
|
70
84
|
|
|
71
85
|
const locLabel = document.createElement('div');
|
|
72
|
-
locLabel.style.cssText =
|
|
73
|
-
'font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:0.08em;color:#94a3b8;margin-bottom:8px;';
|
|
86
|
+
locLabel.style.cssText = sectionLabelStyle;
|
|
74
87
|
locLabel.textContent = 'Where';
|
|
75
88
|
locSection.appendChild(locLabel);
|
|
76
89
|
|
|
@@ -82,14 +95,13 @@ const buildLocationSection = (
|
|
|
82
95
|
|
|
83
96
|
const locEl = document.createElement('div');
|
|
84
97
|
locEl.style.cssText =
|
|
85
|
-
'padding:12px
|
|
98
|
+
'padding:12px 18px;background:rgba(71,85,105,0.3);border-radius:10px;border:1px solid rgba(71,85,105,0.4);color:#cbd5e1;font-size:13px;word-break:break-all;';
|
|
86
99
|
locEl.textContent = loc;
|
|
87
100
|
locSection.appendChild(locEl);
|
|
88
101
|
|
|
89
102
|
if (lineText) {
|
|
90
103
|
const codeBlock = document.createElement('pre');
|
|
91
|
-
codeBlock.style.cssText =
|
|
92
|
-
'margin:8px 0 0;padding:14px 20px;background:rgba(15,23,42,0.8);border-radius:10px;border:1px solid rgba(71,85,105,0.4);color:#94a3b8;font-size:13px;overflow-x:auto;white-space:pre;';
|
|
104
|
+
codeBlock.style.cssText = codeBlockStyle + 'margin-top:8px;';
|
|
93
105
|
codeBlock.textContent = lineText;
|
|
94
106
|
locSection.appendChild(codeBlock);
|
|
95
107
|
}
|
|
@@ -97,12 +109,161 @@ const buildLocationSection = (
|
|
|
97
109
|
return locSection;
|
|
98
110
|
};
|
|
99
111
|
|
|
100
|
-
|
|
112
|
+
// Strip the leading `${ErrorName}: ${message}` line from a stack if it just
|
|
113
|
+
// repeats what's already shown in the "What went wrong" panel — keeps the
|
|
114
|
+
// stack panel focused on frames.
|
|
115
|
+
const cleanStack = (message: string, stack: string) => {
|
|
116
|
+
const firstNewline = stack.indexOf('\n');
|
|
117
|
+
if (firstNewline === -1) return stack;
|
|
118
|
+
const head = stack.slice(0, firstNewline).trim();
|
|
119
|
+
if (head === message || head.endsWith(`: ${message}`)) {
|
|
120
|
+
return stack.slice(firstNewline + 1).replace(/^\n+/, '');
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
return stack;
|
|
124
|
+
};
|
|
125
|
+
|
|
126
|
+
const buildStackSection = (stack: string | undefined, message: string) => {
|
|
127
|
+
if (!stack) return null;
|
|
128
|
+
const cleaned = cleanStack(message, stack);
|
|
129
|
+
if (!cleaned.trim()) return null;
|
|
130
|
+
const section = document.createElement('div');
|
|
131
|
+
section.style.cssText = 'margin-bottom:20px;';
|
|
132
|
+
const label = document.createElement('div');
|
|
133
|
+
label.style.cssText = sectionLabelStyle;
|
|
134
|
+
label.textContent = 'Stack';
|
|
135
|
+
section.appendChild(label);
|
|
136
|
+
const pre = document.createElement('pre');
|
|
137
|
+
pre.style.cssText = codeBlockStyle + 'max-height:300px;overflow-y:auto;';
|
|
138
|
+
pre.textContent = cleaned;
|
|
139
|
+
section.appendChild(pre);
|
|
140
|
+
|
|
141
|
+
return section;
|
|
142
|
+
};
|
|
143
|
+
|
|
144
|
+
// Reads the live document for every <script src> currently mounted.
|
|
145
|
+
// Most useful diagnostic for "I'm seeing a chunk hash that no longer
|
|
146
|
+
// exists on disk" — confirms which bundle the browser actually loaded.
|
|
147
|
+
const collectLoadedScripts = () => {
|
|
148
|
+
const scripts = Array.from(document.querySelectorAll('script[src]'));
|
|
149
|
+
const urls: string[] = [];
|
|
150
|
+
for (const script of scripts) {
|
|
151
|
+
const src = (script as HTMLScriptElement).src;
|
|
152
|
+
if (!src) continue;
|
|
153
|
+
// Filter to JS we serve — vendor chunks, generated indexes, root
|
|
154
|
+
// chunk-XXX.js outputs. Skip user-pasted CDN scripts and the like.
|
|
155
|
+
if (
|
|
156
|
+
src.includes('/vendor/') ||
|
|
157
|
+
src.includes('/generated/') ||
|
|
158
|
+
/\/chunk-[a-z0-9]+\.js(\?|$)/i.test(src) ||
|
|
159
|
+
src.includes('/_src_indexes/')
|
|
160
|
+
) {
|
|
161
|
+
urls.push(src);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
return urls;
|
|
166
|
+
};
|
|
167
|
+
|
|
168
|
+
const buildDiagnosticsSection = () => {
|
|
169
|
+
const section = document.createElement('div');
|
|
170
|
+
section.style.cssText = 'margin-bottom:20px;';
|
|
171
|
+
const label = document.createElement('div');
|
|
172
|
+
label.style.cssText = sectionLabelStyle;
|
|
173
|
+
label.textContent = 'Diagnostics';
|
|
174
|
+
section.appendChild(label);
|
|
175
|
+
|
|
176
|
+
const lines: string[] = [];
|
|
177
|
+
lines.push(`Page URL: ${window.location.href}`);
|
|
178
|
+
const ua = navigator.userAgent;
|
|
179
|
+
lines.push(`User agent: ${ua}`);
|
|
180
|
+
const scripts = collectLoadedScripts();
|
|
181
|
+
if (scripts.length > 0) {
|
|
182
|
+
lines.push('');
|
|
183
|
+
lines.push(`Loaded chunks (${scripts.length}):`);
|
|
184
|
+
for (const url of scripts) {
|
|
185
|
+
// Strip origin so the chunk hash is the focal point.
|
|
186
|
+
lines.push(
|
|
187
|
+
` ${url.replace(window.location.origin, '') || url}`
|
|
188
|
+
);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
const pre = document.createElement('pre');
|
|
193
|
+
pre.style.cssText = codeBlockStyle + 'max-height:200px;overflow-y:auto;';
|
|
194
|
+
pre.textContent = lines.join('\n');
|
|
195
|
+
section.appendChild(pre);
|
|
196
|
+
|
|
197
|
+
return section;
|
|
198
|
+
};
|
|
199
|
+
|
|
200
|
+
const buildErrorMessageSection = (message: string) => {
|
|
201
|
+
const errorSection = document.createElement('div');
|
|
202
|
+
errorSection.style.cssText = 'margin-bottom:20px;';
|
|
203
|
+
const errorLabel = document.createElement('div');
|
|
204
|
+
errorLabel.style.cssText = sectionLabelStyle;
|
|
205
|
+
errorLabel.textContent = 'What went wrong';
|
|
206
|
+
errorSection.appendChild(errorLabel);
|
|
207
|
+
const msgEl = document.createElement('pre');
|
|
208
|
+
msgEl.style.cssText =
|
|
209
|
+
'margin:0;padding:16px 20px;background:rgba(239,68,68,0.12);border:1px solid rgba(239,68,68,0.25);border-radius:10px;overflow-x:auto;white-space:pre-wrap;word-break:break-word;color:#fca5a5;font-size:13px;line-height:1.5;font-family:inherit;';
|
|
210
|
+
msgEl.textContent = message;
|
|
211
|
+
errorSection.appendChild(msgEl);
|
|
212
|
+
|
|
213
|
+
return errorSection;
|
|
214
|
+
};
|
|
215
|
+
|
|
216
|
+
const formatErrorForCopy = (opts: ErrorOverlayOptions) => {
|
|
217
|
+
const lines: string[] = [];
|
|
218
|
+
lines.push(`# ${opts.kind === 'runtime' ? 'Runtime' : 'Compilation'} error`);
|
|
219
|
+
if (opts.framework) lines.push(`Framework: ${opts.framework}`);
|
|
220
|
+
lines.push('');
|
|
221
|
+
lines.push('## Message');
|
|
222
|
+
lines.push(opts.message || '(no message)');
|
|
223
|
+
if (opts.file || opts.line !== undefined) {
|
|
224
|
+
lines.push('');
|
|
225
|
+
lines.push('## Where');
|
|
226
|
+
const locParts: string[] = [];
|
|
227
|
+
if (opts.file) locParts.push(opts.file);
|
|
228
|
+
if (opts.line !== undefined) locParts.push(String(opts.line));
|
|
229
|
+
if (opts.column !== undefined) locParts.push(String(opts.column));
|
|
230
|
+
lines.push(locParts.join(':'));
|
|
231
|
+
if (opts.lineText) {
|
|
232
|
+
lines.push('');
|
|
233
|
+
lines.push(opts.lineText);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
if (opts.stack) {
|
|
237
|
+
lines.push('');
|
|
238
|
+
lines.push('## Stack');
|
|
239
|
+
lines.push(cleanStack(opts.message || '', opts.stack));
|
|
240
|
+
}
|
|
241
|
+
lines.push('');
|
|
242
|
+
lines.push('## Diagnostics');
|
|
243
|
+
lines.push(`Page URL: ${window.location.href}`);
|
|
244
|
+
lines.push(`User agent: ${navigator.userAgent}`);
|
|
245
|
+
const scripts = collectLoadedScripts();
|
|
246
|
+
if (scripts.length > 0) {
|
|
247
|
+
lines.push('');
|
|
248
|
+
lines.push(`Loaded chunks (${scripts.length}):`);
|
|
249
|
+
for (const url of scripts) {
|
|
250
|
+
lines.push(
|
|
251
|
+
` ${url.replace(window.location.origin, '') || url}`
|
|
252
|
+
);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
return lines.join('\n');
|
|
257
|
+
};
|
|
258
|
+
|
|
259
|
+
const renderOverlay = () => {
|
|
260
|
+
const opts =
|
|
261
|
+
currentOverlayKind === 'runtime'
|
|
262
|
+
? runtimeErrors[activeRuntimeIndex]
|
|
263
|
+
: pendingCompilationOpts;
|
|
264
|
+
if (!opts) return;
|
|
101
265
|
const message = opts.message || 'Build failed';
|
|
102
|
-
const { file } = opts;
|
|
103
|
-
const { line } = opts;
|
|
104
|
-
const { column } = opts;
|
|
105
|
-
const { lineText } = opts;
|
|
266
|
+
const { file, line, column, lineText, stack } = opts;
|
|
106
267
|
const framework = (opts.framework || 'unknown').toLowerCase();
|
|
107
268
|
const frameworkLabel = frameworkLabels[framework] || framework;
|
|
108
269
|
const accent = frameworkColors[framework] || '#94a3b8';
|
|
@@ -118,7 +279,7 @@ export const showErrorOverlay = (opts: ErrorOverlayOptions) => {
|
|
|
118
279
|
|
|
119
280
|
const card = document.createElement('div');
|
|
120
281
|
card.style.cssText =
|
|
121
|
-
'max-width:
|
|
282
|
+
'max-width:780px;width:100%;background:rgba(30,41,59,0.6);border:1px solid rgba(71,85,105,0.5);border-radius:16px;box-shadow:0 25px 50px -12px rgba(0,0,0,0.5),0 0 0 1px rgba(255,255,255,0.05);overflow:hidden;';
|
|
122
283
|
|
|
123
284
|
const header = document.createElement('div');
|
|
124
285
|
header.style.cssText =
|
|
@@ -135,41 +296,109 @@ export const showErrorOverlay = (opts: ErrorOverlayOptions) => {
|
|
|
135
296
|
const content = document.createElement('div');
|
|
136
297
|
content.style.cssText = 'padding:24px;';
|
|
137
298
|
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
299
|
+
// Multi-error nav: visible only when more than one runtime error has
|
|
300
|
+
// fired since the last dismiss. Compilation errors always replace, so
|
|
301
|
+
// they never need this row.
|
|
302
|
+
if (currentOverlayKind === 'runtime' && runtimeErrors.length > 1) {
|
|
303
|
+
const navRow = document.createElement('div');
|
|
304
|
+
navRow.style.cssText =
|
|
305
|
+
'display:flex;align-items:center;gap:12px;margin-bottom:20px;padding:10px 14px;background:rgba(71,85,105,0.25);border-radius:10px;border:1px solid rgba(71,85,105,0.4);';
|
|
306
|
+
const prev = document.createElement('button');
|
|
307
|
+
prev.textContent = '◀';
|
|
308
|
+
prev.style.cssText =
|
|
309
|
+
'padding:4px 10px;background:rgba(15,23,42,0.6);color:#cbd5e1;border:1px solid rgba(71,85,105,0.6);border-radius:6px;font-size:13px;cursor:pointer;font-family:inherit;';
|
|
310
|
+
prev.disabled = activeRuntimeIndex === 0;
|
|
311
|
+
if (prev.disabled) prev.style.opacity = '0.4';
|
|
312
|
+
prev.onclick = () => {
|
|
313
|
+
if (activeRuntimeIndex > 0) {
|
|
314
|
+
activeRuntimeIndex -= 1;
|
|
315
|
+
renderOverlay();
|
|
316
|
+
}
|
|
317
|
+
};
|
|
318
|
+
const next = document.createElement('button');
|
|
319
|
+
next.textContent = '▶';
|
|
320
|
+
next.style.cssText = prev.style.cssText;
|
|
321
|
+
next.disabled = activeRuntimeIndex >= runtimeErrors.length - 1;
|
|
322
|
+
if (next.disabled) next.style.opacity = '0.4';
|
|
323
|
+
next.onclick = () => {
|
|
324
|
+
if (activeRuntimeIndex < runtimeErrors.length - 1) {
|
|
325
|
+
activeRuntimeIndex += 1;
|
|
326
|
+
renderOverlay();
|
|
327
|
+
}
|
|
328
|
+
};
|
|
329
|
+
const counter = document.createElement('span');
|
|
330
|
+
counter.style.cssText = 'color:#cbd5e1;font-size:13px;';
|
|
331
|
+
counter.textContent = `Error ${activeRuntimeIndex + 1} of ${runtimeErrors.length}`;
|
|
332
|
+
navRow.appendChild(prev);
|
|
333
|
+
navRow.appendChild(next);
|
|
334
|
+
navRow.appendChild(counter);
|
|
335
|
+
content.appendChild(navRow);
|
|
336
|
+
}
|
|
153
337
|
|
|
338
|
+
content.appendChild(buildErrorMessageSection(message));
|
|
154
339
|
const locSection = buildLocationSection(file, line, column, lineText);
|
|
155
|
-
if (locSection)
|
|
156
|
-
|
|
340
|
+
if (locSection) content.appendChild(locSection);
|
|
341
|
+
const stackSection = buildStackSection(stack, message);
|
|
342
|
+
if (stackSection) content.appendChild(stackSection);
|
|
343
|
+
if (currentOverlayKind === 'runtime') {
|
|
344
|
+
content.appendChild(buildDiagnosticsSection());
|
|
157
345
|
}
|
|
158
346
|
|
|
159
347
|
const footer = document.createElement('div');
|
|
160
348
|
footer.style.cssText =
|
|
161
|
-
'display:flex;justify-content:flex-end;padding-top:8px;';
|
|
349
|
+
'display:flex;justify-content:flex-end;gap:10px;padding-top:8px;';
|
|
350
|
+
|
|
351
|
+
const copy = document.createElement('button');
|
|
352
|
+
copy.textContent = 'Copy';
|
|
353
|
+
copy.style.cssText =
|
|
354
|
+
'padding:10px 16px;background:rgba(71,85,105,0.4);color:#e2e8f0;border:1px solid rgba(71,85,105,0.6);border-radius:10px;font-size:13px;font-weight:600;cursor:pointer;font-family:inherit;transition:opacity 0.15s,transform 0.15s;';
|
|
355
|
+
copy.onmouseover = () => {
|
|
356
|
+
copy.style.opacity = '0.85';
|
|
357
|
+
};
|
|
358
|
+
copy.onmouseout = () => {
|
|
359
|
+
copy.style.opacity = '1';
|
|
360
|
+
};
|
|
361
|
+
copy.onclick = async () => {
|
|
362
|
+
const text = formatErrorForCopy(opts);
|
|
363
|
+
try {
|
|
364
|
+
await navigator.clipboard.writeText(text);
|
|
365
|
+
copy.textContent = 'Copied';
|
|
366
|
+
setTimeout(() => {
|
|
367
|
+
copy.textContent = 'Copy';
|
|
368
|
+
}, 1500);
|
|
369
|
+
} catch {
|
|
370
|
+
// Clipboard API requires a user gesture + permissions; fall back
|
|
371
|
+
// to a textarea + execCommand so the button still does something.
|
|
372
|
+
const ta = document.createElement('textarea');
|
|
373
|
+
ta.value = text;
|
|
374
|
+
ta.style.position = 'fixed';
|
|
375
|
+
ta.style.opacity = '0';
|
|
376
|
+
document.body.appendChild(ta);
|
|
377
|
+
ta.select();
|
|
378
|
+
try {
|
|
379
|
+
document.execCommand('copy');
|
|
380
|
+
copy.textContent = 'Copied';
|
|
381
|
+
setTimeout(() => {
|
|
382
|
+
copy.textContent = 'Copy';
|
|
383
|
+
}, 1500);
|
|
384
|
+
} catch {
|
|
385
|
+
copy.textContent = 'Copy failed';
|
|
386
|
+
}
|
|
387
|
+
document.body.removeChild(ta);
|
|
388
|
+
}
|
|
389
|
+
};
|
|
390
|
+
footer.appendChild(copy);
|
|
162
391
|
|
|
163
392
|
const dismiss = document.createElement('button');
|
|
164
393
|
dismiss.textContent = 'Dismiss';
|
|
165
394
|
dismiss.style.cssText = `padding:10px 20px;background:${
|
|
166
395
|
accent
|
|
167
|
-
};color:#fff;border:none;border-radius:10px;font-size:13px;font-weight:600;cursor:pointer;box-shadow:0 2px 8px rgba(0,0,0,0.2);transition:opacity 0.15s,transform 0.15s;`;
|
|
168
|
-
dismiss.onmouseover =
|
|
396
|
+
};color:#fff;border:none;border-radius:10px;font-size:13px;font-weight:600;cursor:pointer;font-family:inherit;box-shadow:0 2px 8px rgba(0,0,0,0.2);transition:opacity 0.15s,transform 0.15s;`;
|
|
397
|
+
dismiss.onmouseover = () => {
|
|
169
398
|
dismiss.style.opacity = '0.9';
|
|
170
399
|
dismiss.style.transform = 'translateY(-1px)';
|
|
171
400
|
};
|
|
172
|
-
dismiss.onmouseout =
|
|
401
|
+
dismiss.onmouseout = () => {
|
|
173
402
|
dismiss.style.opacity = '1';
|
|
174
403
|
dismiss.style.transform = 'translateY(0)';
|
|
175
404
|
};
|
|
@@ -182,3 +411,31 @@ export const showErrorOverlay = (opts: ErrorOverlayOptions) => {
|
|
|
182
411
|
document.body.appendChild(overlay);
|
|
183
412
|
errorOverlayElement = overlay;
|
|
184
413
|
};
|
|
414
|
+
|
|
415
|
+
let pendingCompilationOpts: ErrorOverlayOptions | null = null;
|
|
416
|
+
|
|
417
|
+
export const showErrorOverlay = (opts: ErrorOverlayOptions) => {
|
|
418
|
+
const kind = opts.kind || 'compilation';
|
|
419
|
+
if (kind === 'runtime') {
|
|
420
|
+
// Suppress duplicates — Angular and other frameworks often re-throw
|
|
421
|
+
// the same error from multiple async boundaries (zone, scheduler,
|
|
422
|
+
// resolver). Identifying by message+stack catches the common case
|
|
423
|
+
// without needing structured equality.
|
|
424
|
+
const sig = `${opts.message ?? ''}::${opts.stack ?? ''}`;
|
|
425
|
+
const isDup = runtimeErrors.some(
|
|
426
|
+
(prev) => `${prev.message ?? ''}::${prev.stack ?? ''}` === sig
|
|
427
|
+
);
|
|
428
|
+
if (!isDup) {
|
|
429
|
+
runtimeErrors.push(opts);
|
|
430
|
+
activeRuntimeIndex = runtimeErrors.length - 1;
|
|
431
|
+
}
|
|
432
|
+
} else {
|
|
433
|
+
pendingCompilationOpts = opts;
|
|
434
|
+
// Compilation errors are global build state — reset runtime queue
|
|
435
|
+
// since old runtime errors from before the build attempt aren't
|
|
436
|
+
// actionable anymore.
|
|
437
|
+
runtimeErrors.length = 0;
|
|
438
|
+
activeRuntimeIndex = 0;
|
|
439
|
+
}
|
|
440
|
+
renderOverlay();
|
|
441
|
+
};
|
|
@@ -47,25 +47,23 @@ if (typeof window !== 'undefined') {
|
|
|
47
47
|
// Catch uncaught runtime errors and show the error overlay
|
|
48
48
|
window.addEventListener('error', (evt) => {
|
|
49
49
|
if (!evt.error) return;
|
|
50
|
+
const isErr = evt.error instanceof Error;
|
|
50
51
|
showErrorOverlay({
|
|
51
52
|
framework: detectCurrentFramework() || undefined,
|
|
52
53
|
kind: 'runtime',
|
|
53
|
-
message:
|
|
54
|
-
|
|
55
|
-
? evt.error.stack || evt.error.message
|
|
56
|
-
: String(evt.error)
|
|
54
|
+
message: isErr ? evt.error.message : String(evt.error),
|
|
55
|
+
stack: isErr ? evt.error.stack : undefined
|
|
57
56
|
});
|
|
58
57
|
});
|
|
59
58
|
|
|
60
59
|
window.addEventListener('unhandledrejection', (evt) => {
|
|
61
60
|
if (!evt.reason) return;
|
|
61
|
+
const isErr = evt.reason instanceof Error;
|
|
62
62
|
showErrorOverlay({
|
|
63
63
|
framework: detectCurrentFramework() || undefined,
|
|
64
64
|
kind: 'runtime',
|
|
65
|
-
message:
|
|
66
|
-
|
|
67
|
-
? evt.reason.stack || evt.reason.message
|
|
68
|
-
: String(evt.reason)
|
|
65
|
+
message: isErr ? evt.reason.message : String(evt.reason),
|
|
66
|
+
stack: isErr ? evt.reason.stack : undefined
|
|
69
67
|
});
|
|
70
68
|
});
|
|
71
69
|
|
package/dist/index.js
CHANGED
|
@@ -15357,6 +15357,7 @@ var init_ssrCache = __esm(() => {
|
|
|
15357
15357
|
// src/dev/moduleServer.ts
|
|
15358
15358
|
var exports_moduleServer = {};
|
|
15359
15359
|
__export(exports_moduleServer, {
|
|
15360
|
+
warnIfReactFastRefreshUnsupported: () => warnIfReactFastRefreshUnsupported,
|
|
15360
15361
|
warmCompilers: () => warmCompilers,
|
|
15361
15362
|
warmCache: () => warmCache,
|
|
15362
15363
|
setGlobalModuleServer: () => setGlobalModuleServer,
|
|
@@ -15536,7 +15537,6 @@ ${code}`;
|
|
|
15536
15537
|
reactFastRefreshWarningEmitted = true;
|
|
15537
15538
|
logWarn("React HMR is blocked: this Bun build ignores " + "`reactFastRefresh` on Bun.Transpiler, so component state " + "cannot be preserved across edits. Tracking " + "https://github.com/oven-sh/bun/pull/28312 \u2014 if it still has " + "not merged, leave a \uD83D\uDC4D on the PR so the Bun team knows it " + "is blocking you. Until then, React edits trigger a full " + "reload instead of a fast refresh.");
|
|
15538
15539
|
}, transformReactFile = (filePath, projectRoot, rewriter) => {
|
|
15539
|
-
warnIfReactFastRefreshUnsupported();
|
|
15540
15540
|
const raw = readFileSync16(filePath, "utf-8");
|
|
15541
15541
|
const valueExports = tsxTranspiler.scan(raw).exports;
|
|
15542
15542
|
let transpiled = reactTranspiler.transformSync(raw);
|
|
@@ -16677,6 +16677,8 @@ var moduleServerPromise, getModuleServer = () => moduleServerPromise, runSequent
|
|
|
16677
16677
|
onRebuildComplete({ hmrState: state, manifest: state.manifest });
|
|
16678
16678
|
return state.manifest;
|
|
16679
16679
|
}
|
|
16680
|
+
const { warnIfReactFastRefreshUnsupported: warnIfReactFastRefreshUnsupported2 } = await Promise.resolve().then(() => (init_moduleServer(), exports_moduleServer));
|
|
16681
|
+
warnIfReactFastRefreshUnsupported2();
|
|
16680
16682
|
return handleReactModuleServerPath(state, reactFiles, startTime, onRebuildComplete);
|
|
16681
16683
|
}, handleServerManifestUpdate = (state, serverResult) => {
|
|
16682
16684
|
if (!serverResult?.success) {
|
|
@@ -18307,7 +18309,7 @@ var STORE_KEY = "__elysiaStore", getGlobalValue = (key) => Reflect.get(globalThi
|
|
|
18307
18309
|
if (bytes) {
|
|
18308
18310
|
return new Response(new Uint8Array(bytes).buffer, {
|
|
18309
18311
|
headers: {
|
|
18310
|
-
"Cache-Control": "no-
|
|
18312
|
+
"Cache-Control": "no-store",
|
|
18311
18313
|
"Content-Type": getMimeType(pathname)
|
|
18312
18314
|
}
|
|
18313
18315
|
});
|
|
@@ -18316,7 +18318,7 @@ var STORE_KEY = "__elysiaStore", getGlobalValue = (key) => Reflect.get(globalThi
|
|
|
18316
18318
|
if (aliasedTarget) {
|
|
18317
18319
|
return new Response(null, {
|
|
18318
18320
|
headers: {
|
|
18319
|
-
"Cache-Control": "no-
|
|
18321
|
+
"Cache-Control": "no-store",
|
|
18320
18322
|
Location: aliasedTarget
|
|
18321
18323
|
},
|
|
18322
18324
|
status: 302
|
|
@@ -26749,5 +26751,5 @@ export {
|
|
|
26749
26751
|
ANGULAR_INIT_TIMEOUT_MS
|
|
26750
26752
|
};
|
|
26751
26753
|
|
|
26752
|
-
//# debugId=
|
|
26754
|
+
//# debugId=37D59544622087A264756E2164756E21
|
|
26753
26755
|
//# sourceMappingURL=index.js.map
|