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 renderPageOnError({ err });
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 renderPageOnError(args) {
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 renderPageOnError({ err });
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-bac5dee";
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-bac5dee';
2
+ export const PROJECT_VERSION = '0.4.240-commit-a80417c';
@@ -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, all } = getFlagsActivated();
90
- const isActivated = flagsActivated.includes(flag) || (all && !flagsSkipWildcard.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(flagRegex) ?? [];
163
- const all = DEBUG.includes('vike:*');
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, all, isGlobal };
162
+ return { flagsActivated, isAll, isGlobal };
166
163
  }
167
164
  function isDebug() {
168
- const { flagsActivated, all, isGlobal } = getFlagsActivated();
169
- return all || flagsActivated.length > 0 || isGlobal;
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-bac5dee",
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.8.3",
250
+ "typescript": "^5.9.2",
251
251
  "vite": "^7.1.5"
252
252
  },
253
253
  "scripts": {