vike 0.4.240-commit-bac5dee → 0.4.240-commit-a80417c
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.
|
@@ -60,7 +60,7 @@ async function renderPageClientSide(renderArgs) {
|
|
|
60
60
|
return;
|
|
61
61
|
async function renderPageNominal() {
|
|
62
62
|
const onError = async (err) => {
|
|
63
|
-
await
|
|
63
|
+
await handleError({ err });
|
|
64
64
|
};
|
|
65
65
|
const pageContext = await getPageContextBegin(false, pageContextBeginArgs);
|
|
66
66
|
if (isRenderOutdated())
|
|
@@ -229,11 +229,43 @@ async function renderPageClientSide(renderArgs) {
|
|
|
229
229
|
await renderPageView(pageContext);
|
|
230
230
|
}
|
|
231
231
|
}
|
|
232
|
-
// When the normal page threw an error
|
|
232
|
+
// When the normal page threw an error:
|
|
233
233
|
// - Can be a URL rewrite upon `throw render('/some-url')`
|
|
234
234
|
// - Can be rendering the error page
|
|
235
235
|
// - Can be rendering Vike's generic error page (if no error page is defined, or if the error page throws an error)
|
|
236
|
-
async function
|
|
236
|
+
async function handleError(args) {
|
|
237
|
+
const { err } = args;
|
|
238
|
+
assert(err);
|
|
239
|
+
// Logging
|
|
240
|
+
if (!isAbortError(err)) {
|
|
241
|
+
// We don't swallow 404 errors:
|
|
242
|
+
// - On the server-side, Vike swallows / doesn't show any 404 error log because it's expected that a user may go to some random non-existent URL. (We don't want to flood the app's error tracking with 404 logs.)
|
|
243
|
+
// - On the client-side, if the user navigates to a 404 then it means that the UI has a broken link. (It isn't expected that users can go to some random URL using the client-side router, as it would require, for example, the user to manually change the URL of a link by manually manipulating the DOM which highly unlikely.)
|
|
244
|
+
console.error(err);
|
|
245
|
+
}
|
|
246
|
+
else {
|
|
247
|
+
// We swallow throw redirect()/render() called by client-side hooks onBeforeRender()/data()/guard()
|
|
248
|
+
// We handle the abort error down below.
|
|
249
|
+
}
|
|
250
|
+
// pageContext
|
|
251
|
+
const pageContext = await getPageContextBegin(true, pageContextBeginArgs);
|
|
252
|
+
if (isRenderOutdated())
|
|
253
|
+
return;
|
|
254
|
+
objectAssign(pageContext, {
|
|
255
|
+
errorWhileRendering: err,
|
|
256
|
+
});
|
|
257
|
+
// throw redirect()/render()
|
|
258
|
+
let pageContextAbort;
|
|
259
|
+
if (isAbortError(err)) {
|
|
260
|
+
const res = await handleAbortError(err, pageContext);
|
|
261
|
+
if (res.skip)
|
|
262
|
+
return;
|
|
263
|
+
pageContextAbort = res.pageContextAbort;
|
|
264
|
+
}
|
|
265
|
+
// Render error page
|
|
266
|
+
await renderErrorPage(pageContext, args, pageContextAbort);
|
|
267
|
+
}
|
|
268
|
+
async function renderErrorPage(pageContext, args, pageContextAbort) {
|
|
237
269
|
const onError = (err) => {
|
|
238
270
|
if (!isSameErrorMessage(err, args.err)) {
|
|
239
271
|
/* When we can't render the error page, we prefer showing a blank page over letting the server-side try because otherwise:
|
|
@@ -244,81 +276,23 @@ async function renderPageClientSide(renderArgs) {
|
|
|
244
276
|
console.error(err);
|
|
245
277
|
}
|
|
246
278
|
};
|
|
247
|
-
if ('err' in args) {
|
|
248
|
-
const { err } = args;
|
|
249
|
-
assert(err);
|
|
250
|
-
if (!isAbortError(err)) {
|
|
251
|
-
// We don't swallow 404 errors:
|
|
252
|
-
// - On the server-side, Vike swallows / doesn't show any 404 error log because it's expected that a user may go to some random non-existent URL. (We don't want to flood the app's error tracking with 404 logs.)
|
|
253
|
-
// - On the client-side, if the user navigates to a 404 then it means that the UI has a broken link. (It isn't expected that users can go to some random URL using the client-side router, as it would require, for example, the user to manually change the URL of a link by manually manipulating the DOM which highly unlikely.)
|
|
254
|
-
console.error(err);
|
|
255
|
-
}
|
|
256
|
-
else {
|
|
257
|
-
// We swallow throw redirect()/render() called by client-side hooks onBeforeRender()/data()/guard()
|
|
258
|
-
// We handle the abort error down below.
|
|
259
|
-
}
|
|
260
|
-
}
|
|
261
|
-
const pageContext = await getPageContextBegin(true, pageContextBeginArgs);
|
|
262
|
-
if (isRenderOutdated())
|
|
263
|
-
return;
|
|
264
|
-
objectAssign(pageContext, { routeParams: {} });
|
|
265
|
-
if (args.pageContextError)
|
|
266
|
-
objectAssign(pageContext, args.pageContextError);
|
|
267
|
-
if ('err' in args) {
|
|
268
|
-
const { err } = args;
|
|
269
|
-
assert(!('errorWhileRendering' in pageContext));
|
|
270
|
-
objectAssign(pageContext, { errorWhileRendering: err });
|
|
271
|
-
if (isAbortError(err)) {
|
|
272
|
-
const errAbort = err;
|
|
273
|
-
logAbortErrorHandled(err, !import.meta.env.DEV, pageContext);
|
|
274
|
-
const pageContextAbort = errAbort._pageContextAbort;
|
|
275
|
-
// throw render('/some-url')
|
|
276
|
-
if (pageContextAbort._urlRewrite) {
|
|
277
|
-
await renderPageClientSide({
|
|
278
|
-
...renderArgs,
|
|
279
|
-
scrollTarget: undefined,
|
|
280
|
-
pageContextsFromRewrite: [...pageContextsFromRewrite, pageContextAbort],
|
|
281
|
-
});
|
|
282
|
-
return;
|
|
283
|
-
}
|
|
284
|
-
// throw redirect('/some-url')
|
|
285
|
-
if (pageContextAbort._urlRedirect) {
|
|
286
|
-
const urlRedirect = pageContextAbort._urlRedirect.url;
|
|
287
|
-
if (!urlRedirect.startsWith('/')) {
|
|
288
|
-
// External redirection
|
|
289
|
-
redirectHard(urlRedirect);
|
|
290
|
-
return;
|
|
291
|
-
}
|
|
292
|
-
else {
|
|
293
|
-
await renderPageClientSide({
|
|
294
|
-
...renderArgs,
|
|
295
|
-
scrollTarget: undefined,
|
|
296
|
-
urlOriginal: urlRedirect,
|
|
297
|
-
overwriteLastHistoryEntry: false,
|
|
298
|
-
isBackwardNavigation: false,
|
|
299
|
-
redirectCount: redirectCount + 1,
|
|
300
|
-
});
|
|
301
|
-
}
|
|
302
|
-
return;
|
|
303
|
-
}
|
|
304
|
-
// throw render(statusCode)
|
|
305
|
-
assert(pageContextAbort.abortStatusCode);
|
|
306
|
-
assert(!('urlOriginal' in pageContextAbort));
|
|
307
|
-
objectAssign(pageContext, pageContextAbort);
|
|
308
|
-
if (pageContextAbort.abortStatusCode === 404) {
|
|
309
|
-
objectAssign(pageContext, { is404: true });
|
|
310
|
-
}
|
|
311
|
-
}
|
|
312
|
-
else {
|
|
313
|
-
objectAssign(pageContext, { is404: false });
|
|
314
|
-
}
|
|
315
|
-
}
|
|
316
279
|
const errorPageId = getErrorPageId(pageContext._pageFilesAll, pageContext._globalContext._pageConfigs);
|
|
317
280
|
if (!errorPageId)
|
|
318
281
|
throw new Error('No error page defined.');
|
|
319
282
|
objectAssign(pageContext, {
|
|
320
283
|
pageId: errorPageId,
|
|
284
|
+
routeParams: {},
|
|
321
285
|
});
|
|
286
|
+
// throw render(statusCode)
|
|
287
|
+
if (pageContextAbort) {
|
|
288
|
+
assert(pageContextAbort.abortStatusCode);
|
|
289
|
+
assert(!('urlOriginal' in pageContextAbort));
|
|
290
|
+
objectAssign(pageContext, pageContextAbort);
|
|
291
|
+
objectAssign(pageContext, { is404: pageContextAbort.abortStatusCode === 404 });
|
|
292
|
+
}
|
|
293
|
+
else {
|
|
294
|
+
objectAssign(pageContext, { is404: false });
|
|
295
|
+
}
|
|
322
296
|
const isClientRoutable = await isClientSideRoutable(pageContext.pageId, pageContext);
|
|
323
297
|
if (isRenderOutdated())
|
|
324
298
|
return;
|
|
@@ -326,6 +300,9 @@ async function renderPageClientSide(renderArgs) {
|
|
|
326
300
|
redirectHard(urlOriginal);
|
|
327
301
|
return;
|
|
328
302
|
}
|
|
303
|
+
if (import.meta.env.DEV || globalThis.__VIKE__IS_DEBUG) {
|
|
304
|
+
assertInfo(false, `Rendering error page ${errorPageId}`, { onlyOnce: false });
|
|
305
|
+
}
|
|
329
306
|
const res = await loadPageConfigsLazyClientSideAndExecHook(pageContext, isFirstRender, isRenderOutdated);
|
|
330
307
|
/* Already called inside loadPageConfigsLazyClientSideAndExecHook()
|
|
331
308
|
if (isRenderOutdated()) return
|
|
@@ -367,10 +344,46 @@ async function renderPageClientSide(renderArgs) {
|
|
|
367
344
|
updateType(pageContext, pageContextFromClientHooks);
|
|
368
345
|
await renderPageView(pageContext, args);
|
|
369
346
|
}
|
|
347
|
+
async function handleAbortError(err, pageContext) {
|
|
348
|
+
const errAbort = err;
|
|
349
|
+
logAbortErrorHandled(err, !import.meta.env.DEV, pageContext);
|
|
350
|
+
const pageContextAbort = errAbort._pageContextAbort;
|
|
351
|
+
// throw render('/some-url')
|
|
352
|
+
if (pageContextAbort._urlRewrite) {
|
|
353
|
+
await renderPageClientSide({
|
|
354
|
+
...renderArgs,
|
|
355
|
+
scrollTarget: undefined,
|
|
356
|
+
pageContextsFromRewrite: [...pageContextsFromRewrite, pageContextAbort],
|
|
357
|
+
});
|
|
358
|
+
return { skip: true };
|
|
359
|
+
}
|
|
360
|
+
// throw redirect('/some-url')
|
|
361
|
+
if (pageContextAbort._urlRedirect) {
|
|
362
|
+
const urlRedirect = pageContextAbort._urlRedirect.url;
|
|
363
|
+
if (!urlRedirect.startsWith('/')) {
|
|
364
|
+
// External redirection
|
|
365
|
+
redirectHard(urlRedirect);
|
|
366
|
+
return { skip: true };
|
|
367
|
+
}
|
|
368
|
+
else {
|
|
369
|
+
await renderPageClientSide({
|
|
370
|
+
...renderArgs,
|
|
371
|
+
scrollTarget: undefined,
|
|
372
|
+
urlOriginal: urlRedirect,
|
|
373
|
+
overwriteLastHistoryEntry: false,
|
|
374
|
+
isBackwardNavigation: false,
|
|
375
|
+
redirectCount: redirectCount + 1,
|
|
376
|
+
});
|
|
377
|
+
}
|
|
378
|
+
return { skip: true };
|
|
379
|
+
}
|
|
380
|
+
// throw render(statusCode)
|
|
381
|
+
return { pageContextAbort };
|
|
382
|
+
}
|
|
370
383
|
async function renderPageView(pageContext, isErrorPage) {
|
|
371
384
|
const onError = async (err) => {
|
|
372
385
|
if (!isErrorPage) {
|
|
373
|
-
await
|
|
386
|
+
await handleError({ err });
|
|
374
387
|
}
|
|
375
388
|
else {
|
|
376
389
|
if (!isSameErrorMessage(err, isErrorPage.err)) {
|
|
@@ -395,6 +408,7 @@ async function renderPageClientSide(renderArgs) {
|
|
|
395
408
|
await execHookOnRenderClient(pageContext, preparePageContextForPublicUsageClient);
|
|
396
409
|
}
|
|
397
410
|
catch (err) {
|
|
411
|
+
assert(err);
|
|
398
412
|
onRenderClientError = err;
|
|
399
413
|
}
|
|
400
414
|
globalObject.onRenderClientPreviousPromise = undefined;
|
|
@@ -12,6 +12,7 @@ export type { AbortStatusCode };
|
|
|
12
12
|
export type { ErrorAbort };
|
|
13
13
|
export type { PageContextFromRewrite };
|
|
14
14
|
export type { UrlRedirect };
|
|
15
|
+
export type { PageContextAbort };
|
|
15
16
|
type RedirectStatusCode = number & Parameters<typeof redirect>[1];
|
|
16
17
|
type AbortStatusCode = number & Parameters<InferTwoOverloads<typeof render>[0]>[0];
|
|
17
18
|
type UrlRedirect = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const PROJECT_VERSION: "0.4.240-commit-
|
|
1
|
+
export declare const PROJECT_VERSION: "0.4.240-commit-a80417c";
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// Automatically updated by @brillout/release-me
|
|
2
|
-
export const PROJECT_VERSION = '0.4.240-commit-
|
|
2
|
+
export const PROJECT_VERSION = '0.4.240-commit-a80417c';
|
package/dist/esm/utils/debug.js
CHANGED
|
@@ -36,7 +36,6 @@ const flags = [
|
|
|
36
36
|
'vike:vite-rpc',
|
|
37
37
|
];
|
|
38
38
|
const flagsSkipWildcard = ['vike:log'];
|
|
39
|
-
const flagRegex = /\bvike:[a-zA-Z-]+/g;
|
|
40
39
|
// We purposely read process.env.DEBUG early, in order to avoid users from the temptation to set process.env.DEBUG with JavaScript, since reading & writing process.env.DEBUG dynamically leads to inconsistencies such as https://github.com/vikejs/vike/issues/2239
|
|
41
40
|
const DEBUG = getDEBUG() ?? '';
|
|
42
41
|
if (isDebug())
|
|
@@ -86,8 +85,8 @@ function debug_(flag, options, ...msgs) {
|
|
|
86
85
|
}
|
|
87
86
|
function isDebugActivated(flag) {
|
|
88
87
|
assert(flags.includes(flag));
|
|
89
|
-
const { flagsActivated,
|
|
90
|
-
const isActivated = flagsActivated.includes(flag) || (
|
|
88
|
+
const { flagsActivated, isAll } = getFlagsActivated();
|
|
89
|
+
const isActivated = flagsActivated.includes(flag) || (isAll && !flagsSkipWildcard.includes(flag));
|
|
91
90
|
return isActivated;
|
|
92
91
|
}
|
|
93
92
|
function formatMsg(info, options, padding, position) {
|
|
@@ -156,17 +155,15 @@ function assertFlagsActivated() {
|
|
|
156
155
|
assertUsage(flags.includes(flag), `Unknown DEBUG flag ${pc.cyan(flag)}. Valid flags:\n${flags.map((f) => ` ${pc.cyan(f)}`).join('\n')}`);
|
|
157
156
|
});
|
|
158
157
|
}
|
|
159
|
-
// TODO/now: refactor isAll
|
|
160
|
-
// TODO/now: refactor inline flagRegex
|
|
161
158
|
function getFlagsActivated() {
|
|
162
|
-
const flagsActivated = DEBUG.match(
|
|
163
|
-
const
|
|
159
|
+
const flagsActivated = DEBUG.match(/\bvike:[a-zA-Z-]+/g) ?? [];
|
|
160
|
+
const isAll = DEBUG.includes('vike:*');
|
|
164
161
|
const isGlobal = /\bvike\b[^:]/.test(DEBUG);
|
|
165
|
-
return { flagsActivated,
|
|
162
|
+
return { flagsActivated, isAll, isGlobal };
|
|
166
163
|
}
|
|
167
164
|
function isDebug() {
|
|
168
|
-
const { flagsActivated,
|
|
169
|
-
return
|
|
165
|
+
const { flagsActivated, isAll, isGlobal } = getFlagsActivated();
|
|
166
|
+
return isAll || flagsActivated.length > 0 || isGlobal;
|
|
170
167
|
}
|
|
171
168
|
function getDEBUG() {
|
|
172
169
|
let DEBUG;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "vike",
|
|
3
|
-
"version": "0.4.240-commit-
|
|
3
|
+
"version": "0.4.240-commit-a80417c",
|
|
4
4
|
"repository": "https://github.com/vikejs/vike",
|
|
5
5
|
"exports": {
|
|
6
6
|
"./server": {
|
|
@@ -247,7 +247,7 @@
|
|
|
247
247
|
"@types/source-map-support": "^0.5.10",
|
|
248
248
|
"react-streaming": "^0.4.3",
|
|
249
249
|
"rimraf": "^5.0.5",
|
|
250
|
-
"typescript": "^5.
|
|
250
|
+
"typescript": "^5.9.2",
|
|
251
251
|
"vite": "^7.1.5"
|
|
252
252
|
},
|
|
253
253
|
"scripts": {
|