vike 0.4.249 → 0.4.250-commit-6161324

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 (91) hide show
  1. package/bin.js +3 -0
  2. package/dist/client/runtime-client-routing/createPageContextClientSide.d.ts +20 -2
  3. package/dist/client/runtime-client-routing/createPageContextClientSide.js +19 -11
  4. package/dist/client/runtime-client-routing/getPageContext.js +0 -2
  5. package/dist/client/runtime-client-routing/getPageContextFromHooks.d.ts +180 -60
  6. package/dist/client/runtime-client-routing/history.d.ts +1 -1
  7. package/dist/client/runtime-client-routing/history.js +4 -11
  8. package/dist/client/runtime-client-routing/prefetch.d.ts +2 -2
  9. package/dist/client/runtime-client-routing/renderPageClient.d.ts +628 -31
  10. package/dist/client/runtime-client-routing/utils.d.ts +0 -1
  11. package/dist/client/runtime-client-routing/utils.js +0 -1
  12. package/dist/client/runtime-server-routing/createPageContextClientSide.d.ts +15 -6
  13. package/dist/client/runtime-server-routing/createPageContextClientSide.js +11 -25
  14. package/dist/client/runtime-server-routing/entry.js +15 -1
  15. package/dist/client/shared/execHookOnRenderClient.d.ts +4 -1
  16. package/dist/node/prerender/runPrerender.d.ts +2 -5
  17. package/dist/node/prerender/runPrerender.js +2 -2
  18. package/dist/node/vite/index.js +5 -2
  19. package/dist/node/vite/plugins/non-runnable-dev/pluginReplaceConstantsNonRunnableDev.js +38 -13
  20. package/dist/node/vite/plugins/pluginAssertFileEnv.js +22 -13
  21. package/dist/node/vite/plugins/pluginExtractAssets.js +2 -0
  22. package/dist/node/vite/plugins/pluginExtractExportNames.js +2 -0
  23. package/dist/node/vite/plugins/pluginReplaceConstantsEnvVars.js +2 -0
  24. package/dist/node/vite/plugins/pluginReplaceConstantsGlobalThis.js +3 -1
  25. package/dist/node/vite/plugins/pluginReplaceConstantsPageContext.js +2 -0
  26. package/dist/node/vite/plugins/pluginStaticReplace/applyStaticReplace.d.ts +126 -0
  27. package/dist/node/vite/plugins/pluginStaticReplace/applyStaticReplace.js +421 -0
  28. package/dist/node/vite/plugins/pluginStaticReplace.d.ts +4 -0
  29. package/dist/node/vite/plugins/pluginStaticReplace.js +88 -0
  30. package/dist/node/vite/plugins/pluginVirtualFiles.js +73 -113
  31. package/dist/node/vite/plugins/pluginViteConfigVikeExtensions.d.ts +2 -1
  32. package/dist/node/vite/plugins/pluginViteConfigVikeExtensions.js +1 -3
  33. package/dist/node/vite/shared/importString.d.ts +50 -0
  34. package/dist/node/vite/shared/importString.js +63 -0
  35. package/dist/node/vite/shared/loggerDev.d.ts +3 -3
  36. package/dist/node/vite/shared/loggerDev.js +3 -3
  37. package/dist/node/vite/shared/resolveVikeConfigInternal/assertExtensions.d.ts +1 -1
  38. package/dist/node/vite/shared/resolveVikeConfigInternal/configDefinitionsBuiltIn.js +15 -1
  39. package/dist/node/vite/shared/resolveVikeConfigInternal/{crawlPlusFiles.d.ts → crawlPlusFilePaths.d.ts} +2 -2
  40. package/dist/node/vite/shared/resolveVikeConfigInternal/{crawlPlusFiles.js → crawlPlusFilePaths.js} +4 -4
  41. package/dist/node/vite/shared/resolveVikeConfigInternal/{getPlusFilesAll.d.ts → getPlusFilesByLocationId.d.ts} +8 -6
  42. package/dist/node/vite/shared/resolveVikeConfigInternal/{getPlusFilesAll.js → getPlusFilesByLocationId.js} +47 -59
  43. package/dist/node/vite/shared/resolveVikeConfigInternal/loadFileAtConfigTime.d.ts +1 -1
  44. package/dist/node/vite/shared/resolveVikeConfigInternal/pointerImports.js +11 -18
  45. package/dist/node/vite/shared/resolveVikeConfigInternal.d.ts +1 -1
  46. package/dist/node/vite/shared/resolveVikeConfigInternal.js +66 -64
  47. package/dist/server/onLoad.js +2 -2
  48. package/dist/server/runtime/logErrorServer.d.ts +2 -2
  49. package/dist/server/runtime/logErrorServer.js +0 -2
  50. package/dist/server/runtime/loggerRuntime.d.ts +3 -2
  51. package/dist/server/runtime/renderPageServer/createHttpResponse.d.ts +4 -2
  52. package/dist/server/runtime/renderPageServer/createHttpResponse.js +16 -8
  53. package/dist/server/runtime/renderPageServer/createPageContextServerSide.d.ts +15 -10
  54. package/dist/server/runtime/renderPageServer/createPageContextServerSide.js +12 -11
  55. package/dist/server/runtime/renderPageServer/csp.js +2 -0
  56. package/dist/server/runtime/renderPageServer/execHookOnError.d.ts +2 -2
  57. package/dist/server/runtime/renderPageServer/execHookOnError.js +3 -1
  58. package/dist/server/runtime/renderPageServer/handleErrorWithoutErrorPage.d.ts +4 -4
  59. package/dist/server/runtime/renderPageServer/handleErrorWithoutErrorPage.js +3 -4
  60. package/dist/server/runtime/renderPageServer/html/serializeContext.d.ts +2 -2
  61. package/dist/server/runtime/renderPageServer/html/stream.js +12 -13
  62. package/dist/server/runtime/renderPageServer/loadPageConfigsLazyServerSide.d.ts +3 -6
  63. package/dist/server/runtime/renderPageServer/log404/index.d.ts +2 -2
  64. package/dist/server/runtime/renderPageServer/renderPageServerAfterRoute.d.ts +7 -19
  65. package/dist/server/runtime/renderPageServer/renderPageServerAfterRoute.js +2 -2
  66. package/dist/server/runtime/renderPageServer.d.ts +2 -9
  67. package/dist/server/runtime/renderPageServer.js +19 -19
  68. package/dist/shared-server-client/createGlobalContextShared.js +1 -1
  69. package/dist/shared-server-client/createPageContextShared.d.ts +12 -2
  70. package/dist/shared-server-client/createPageContextShared.js +1 -0
  71. package/dist/shared-server-client/getPageContextUrlComputed.d.ts +5 -2
  72. package/dist/shared-server-client/hooks/execHook.d.ts +6 -4
  73. package/dist/shared-server-client/hooks/execHook.js +77 -12
  74. package/dist/shared-server-client/prepareGlobalContextForPublicUsage.d.ts +2 -0
  75. package/dist/shared-server-client/preparePageContextForPublicUsage.d.ts +2 -3
  76. package/dist/types/Config/ConfigResolved.d.ts +3 -2
  77. package/dist/types/Config.d.ts +48 -32
  78. package/dist/types/Config.js +1 -0
  79. package/dist/types/PageConfig.d.ts +1 -1
  80. package/dist/types/PageContext.d.ts +33 -26
  81. package/dist/types/index.d.ts +2 -1
  82. package/dist/utils/PROJECT_VERSION.d.ts +1 -1
  83. package/dist/utils/PROJECT_VERSION.js +1 -1
  84. package/dist/utils/assert.d.ts +5 -5
  85. package/dist/utils/assert.js +8 -8
  86. package/dist/utils/debug.d.ts +1 -1
  87. package/dist/utils/debug.js +1 -0
  88. package/package.json +9 -7
  89. package/node/cli/bin.js +0 -3
  90. /package/dist/node/vite/shared/resolveVikeConfigInternal/{crawlPlusFiles → crawlPlusFilePaths}/ignorePatternsBuiltIn.d.ts +0 -0
  91. /package/dist/node/vite/shared/resolveVikeConfigInternal/{crawlPlusFiles → crawlPlusFilePaths}/ignorePatternsBuiltIn.js +0 -0
@@ -1,7 +1,8 @@
1
1
  export { createHttpResponsePage };
2
- export { createHttpResponsePageContextJson };
2
+ export { createHttpResponsePageJson };
3
3
  export { createHttpResponseErrorFallback };
4
4
  export { createHttpResponseErrorFallback_noGlobalContext };
5
+ export { createHttpResponseErrorFallbackJson };
5
6
  export { createHttpResponseRedirect };
6
7
  export { createHttpResponse404 };
7
8
  export { createHttpResponseBaseIsMissing };
@@ -36,5 +37,6 @@ declare function createHttpResponseErrorFallback(pageContext: {
36
37
  _globalContext: GlobalContextServerInternal;
37
38
  }): HttpResponse;
38
39
  declare function createHttpResponseErrorFallback_noGlobalContext(): HttpResponse;
39
- declare function createHttpResponsePageContextJson(pageContextSerialized: string): Promise<HttpResponse>;
40
+ declare function createHttpResponseErrorFallbackJson(): HttpResponse;
41
+ declare function createHttpResponsePageJson(pageContextSerialized: string): Promise<HttpResponse>;
40
42
  declare function createHttpResponseRedirect({ url, statusCode }: UrlRedirect, pageContextInit: PageContextBegin): HttpResponse;
@@ -1,7 +1,8 @@
1
1
  export { createHttpResponsePage };
2
- export { createHttpResponsePageContextJson };
2
+ export { createHttpResponsePageJson };
3
3
  export { createHttpResponseErrorFallback };
4
4
  export { createHttpResponseErrorFallback_noGlobalContext };
5
+ export { createHttpResponseErrorFallbackJson };
5
6
  export { createHttpResponseRedirect };
6
7
  export { createHttpResponse404 };
7
8
  export { createHttpResponseBaseIsMissing };
@@ -11,6 +12,9 @@ import { getHttpResponseBody, getHttpResponseBodyStreamHandlers } from './getHtt
11
12
  import { getEarlyHints } from './getEarlyHints.js';
12
13
  import { assertNoInfiniteHttpRedirect } from './createHttpResponse/assertNoInfiniteHttpRedirect.js';
13
14
  import { resolveHeadersResponseFinal } from './headersResponse.js';
15
+ import { stringify } from '@brillout/json-serializer/stringify';
16
+ const contentTypeJson = 'application/json';
17
+ const contentTypeHtml = 'text/html;charset=utf-8';
14
18
  async function createHttpResponsePage(htmlRender, renderHook, pageContext) {
15
19
  let statusCode = pageContext.abortStatusCode;
16
20
  if (!statusCode) {
@@ -29,17 +33,17 @@ async function createHttpResponsePage(htmlRender, renderHook, pageContext) {
29
33
  }
30
34
  const earlyHints = getEarlyHints(await pageContext.__getPageAssets());
31
35
  const headers = resolveHeadersResponseFinal(pageContext, statusCode);
32
- return createHttpResponse(statusCode, 'text/html;charset=utf-8', headers, htmlRender, earlyHints, renderHook);
36
+ return createHttpResponse(statusCode, contentTypeHtml, headers, htmlRender, earlyHints, renderHook);
33
37
  }
34
38
  function createHttpResponse404(errMsg404) {
35
- const httpResponse = createHttpResponse(404, 'text/html;charset=utf-8', [], `<p>${errMsg404}.</p><script>console.log('This HTML was generated by Vike.')</script>`);
39
+ const httpResponse = createHttpResponse(404, contentTypeHtml, [], `<p>${errMsg404}.</p><script>console.log('This HTML was generated by Vike.')</script>`);
36
40
  return httpResponse;
37
41
  }
38
42
  function createHttpResponseBaseIsMissing(urlOriginal, baseServer) {
39
43
  const httpResponse = createHttpResponse(
40
44
  // We use the error code `500` to signal a failing state because this HTTP response should never be used, see https://vike.dev/base-url#setup
41
45
  // In other words: this HTTP response is expected to be generated but isn't expected to be actually used.
42
- 500, 'text/html;charset=utf-8', [], `
46
+ 500, contentTypeHtml, [], `
43
47
  <h1>Error: Base URL is missing</h1>
44
48
  <p>
45
49
  <a href="https://vike.dev/renderPage"><code>renderPage(pageContextInit)</code></a> called with <code>pageContextInit.urlOriginal===${JSON.stringify(urlOriginal)}</code> which doesn't start with the Base URL <code>${baseServer}</code>.
@@ -74,11 +78,15 @@ function createHttpResponseErrorFallback_noGlobalContext() {
74
78
  return createHttpResponseError_('no error page (https://vike.dev/error-page) could be rendered');
75
79
  }
76
80
  function createHttpResponseError_(reason) {
77
- const httpResponse = createHttpResponse(500, 'text/html;charset=utf-8', [], `<p>An error occurred.</p><script>console.log(${JSON.stringify(`This HTML was generated by Vike. Vike returned this HTML because ${reason}.`)})</script>`);
81
+ const httpResponse = createHttpResponse(500, contentTypeHtml, [], `<p>An error occurred.</p><script>console.log(${JSON.stringify(`This HTML was generated by Vike. Vike returned this HTML because ${reason}.`)})</script>`);
78
82
  return httpResponse;
79
83
  }
80
- async function createHttpResponsePageContextJson(pageContextSerialized) {
81
- const httpResponse = createHttpResponse(200, 'application/json', [], pageContextSerialized, [], null);
84
+ function createHttpResponseErrorFallbackJson() {
85
+ const httpResponse = createHttpResponse(500, contentTypeJson, [], stringify({ serverSideError: true }));
86
+ return httpResponse;
87
+ }
88
+ async function createHttpResponsePageJson(pageContextSerialized) {
89
+ const httpResponse = createHttpResponse(200, contentTypeJson, [], pageContextSerialized, [], null);
82
90
  return httpResponse;
83
91
  }
84
92
  function createHttpResponseRedirect({ url, statusCode }, pageContextInit) {
@@ -87,7 +95,7 @@ function createHttpResponseRedirect({ url, statusCode }, pageContextInit) {
87
95
  assert(statusCode);
88
96
  assert(300 <= statusCode && statusCode <= 399);
89
97
  const headers = [['Location', url]];
90
- return createHttpResponse(statusCode, 'text/html;charset=utf-8', headers,
98
+ return createHttpResponse(statusCode, contentTypeHtml, headers,
91
99
  // For bots / programmatic crawlig: show what's going on.
92
100
  // For users: showing a blank page is probably better than a flickering text.
93
101
  `<p style="display: none">Redirecting to ${escapeHtml(url)}</p><script>console.log('This HTML was generated by Vike.')</script>`);
@@ -1,9 +1,11 @@
1
1
  export { createPageContextServerSide };
2
2
  export { createPageContextServerSideWithoutGlobalContext };
3
- export type { PageContextCreated };
3
+ export type { PageContextCreatedServer };
4
+ export type { PageContextCreatedServerBase };
4
5
  import type { GlobalContextServerInternal } from '../globalContext.js';
5
6
  import type { PageContextInit } from '../renderPageServer.js';
6
- type PageContextCreated = Awaited<ReturnType<typeof createPageContextServerSide>>;
7
+ type PageContextCreatedServerBase = ReturnType<typeof createPageContextBase>;
8
+ type PageContextCreatedServer = Awaited<ReturnType<typeof createPageContextServerSide>>;
7
9
  declare function createPageContextServerSide(pageContextInit: PageContextInit, globalContext: GlobalContextServerInternal, args: {
8
10
  requestId: number;
9
11
  } & ({
@@ -19,10 +21,7 @@ declare function createPageContextServerSide(pageContextInit: PageContextInit, g
19
21
  isClientSide: false;
20
22
  isPrerendering: boolean;
21
23
  _requestId: number;
22
- } & Pick<import("../../../types/PageContext.js").PageContextInternalServer, "urlOriginal" | "headersOriginal"> & {
23
- url?: string;
24
- headers?: Record<string, string>;
25
- } & {
24
+ } & PageContextInit & {
26
25
  _globalContext: ({
27
26
  _globalConfigPublic: {
28
27
  pages: {
@@ -146,6 +145,7 @@ declare function createPageContextServerSide(pageContextInit: PageContextInit, g
146
145
  } & {
147
146
  headers: Record<string, string> | null;
148
147
  };
148
+ /** Use this as last resort — prefer passing richer `pageContext` objects to the runtime logger */
149
149
  declare function createPageContextServerSideWithoutGlobalContext(pageContextInit: PageContextInit, requestId: number): {
150
150
  _isOriginalObject: true;
151
151
  isPageContext: true;
@@ -153,7 +153,12 @@ declare function createPageContextServerSideWithoutGlobalContext(pageContextInit
153
153
  isClientSide: false;
154
154
  isPrerendering: boolean;
155
155
  _requestId: number;
156
- } & Pick<import("../../../types/PageContext.js").PageContextInternalServer, "urlOriginal" | "headersOriginal"> & {
157
- url?: string;
158
- headers?: Record<string, string>;
159
- };
156
+ } & PageContextInit;
157
+ declare function createPageContextBase(pageContextInit: PageContextInit | null, isPrerendering: boolean, requestId: number): {
158
+ _isOriginalObject: true;
159
+ isPageContext: true;
160
+ } & {
161
+ isClientSide: false;
162
+ isPrerendering: boolean;
163
+ _requestId: number;
164
+ } & PageContextInit;
@@ -5,8 +5,8 @@ import { getPageContextUrlComputed } from '../../../shared-server-client/getPage
5
5
  import { createPageContextObject, createPageContextShared, } from '../../../shared-server-client/createPageContextShared.js';
6
6
  function createPageContextServerSide(pageContextInit, globalContext, args) {
7
7
  assert(pageContextInit.urlOriginal);
8
- const pageContextCreated = createPageContext(pageContextInit, args.isPrerendering, args.requestId);
9
- objectAssign(pageContextCreated, {
8
+ const pageContext = createPageContextBase(pageContextInit, args.isPrerendering, args.requestId);
9
+ objectAssign(pageContext, {
10
10
  _globalContext: globalContext,
11
11
  _pageFilesAll: globalContext._pageFilesAll, // TO-DO/next-major-release: remove
12
12
  // We use pageContext._baseServer and pageContext._baseAssets instead of pageContext._globalContext.baseServer and pageContext._globalContext.baseAssets because the Base URLs can (eventually one day if needed) be made non-global
@@ -16,10 +16,10 @@ function createPageContextServerSide(pageContextInit, globalContext, args) {
16
16
  _urlHandler: args.isPrerendering ? null : args.urlHandler,
17
17
  isClientSideNavigation: args.isPrerendering ? false : args.isClientSideNavigation,
18
18
  });
19
- objectAssign(pageContextCreated, globalContext._globalConfigPublic);
19
+ objectAssign(pageContext, globalContext._globalConfigPublic);
20
20
  // pageContext.urlParsed
21
- const pageContextUrlComputed = getPageContextUrlComputed(pageContextCreated);
22
- objectAssign(pageContextCreated, pageContextUrlComputed);
21
+ const pageContextUrlComputed = getPageContextUrlComputed(pageContext);
22
+ objectAssign(pageContext, pageContextUrlComputed);
23
23
  // pageContext.headers
24
24
  {
25
25
  let headers;
@@ -35,17 +35,18 @@ function createPageContextServerSide(pageContextInit, globalContext, args) {
35
35
  else {
36
36
  headers = null;
37
37
  }
38
- objectAssign(pageContextCreated, { headers });
38
+ objectAssign(pageContext, { headers });
39
39
  }
40
- const pageContextAugmented = createPageContextShared(pageContextCreated, globalContext._globalConfigPublic);
41
- updateType(pageContextCreated, pageContextAugmented);
42
- return pageContextCreated;
40
+ const pageContextAugmented = createPageContextShared(pageContext, globalContext._globalConfigPublic);
41
+ updateType(pageContext, pageContextAugmented);
42
+ return pageContext;
43
43
  }
44
+ /** Use this as last resort — prefer passing richer `pageContext` objects to the runtime logger */
44
45
  function createPageContextServerSideWithoutGlobalContext(pageContextInit, requestId) {
45
- const pageContext = createPageContext(pageContextInit, false, requestId);
46
+ const pageContext = createPageContextBase(pageContextInit, false, requestId);
46
47
  return pageContext;
47
48
  }
48
- function createPageContext(pageContextInit, isPrerendering, requestId) {
49
+ function createPageContextBase(pageContextInit, isPrerendering, requestId) {
49
50
  const pageContext = createPageContextObject();
50
51
  objectAssign(pageContext, {
51
52
  isClientSide: false,
@@ -32,6 +32,7 @@ async function generateNonce() {
32
32
  return cryptoModule.randomBytes(16).toString('base64url');
33
33
  }
34
34
  function inferNonceAttr(pageContext) {
35
+ // No need to escape the injected HTML — pageContext.cspNone is controlled by the developer, not by the website visitor (I wouldn't know why the developer would set +csp.none to a value coming from the database)
35
36
  const nonceAttr = pageContext.cspNonce ? ` nonce="${pageContext.cspNonce}"` : '';
36
37
  return nonceAttr;
37
38
  }
@@ -41,5 +42,6 @@ function addCspResponseHeader(pageContext, headersResponse) {
41
42
  return;
42
43
  if (headersResponse.get('Content-Security-Policy'))
43
44
  return;
45
+ // No need to sanitize the injected header — see comment above about not escaping HTML
44
46
  headersResponse.set('Content-Security-Policy', `script-src 'self' 'nonce-${pageContext.cspNonce}'`);
45
47
  }
@@ -1,3 +1,3 @@
1
1
  export { execHookOnError };
2
- import type { PageContext_logRuntime } from '../loggerRuntime.js';
3
- declare function execHookOnError(err: unknown, pageContext: PageContext_logRuntime): void;
2
+ import type { PageContextCreatedServerBase } from './createPageContextServerSide.js';
3
+ declare function execHookOnError(err: unknown, pageContext: PageContextCreatedServerBase | null): void;
@@ -1,5 +1,6 @@
1
1
  export { execHookOnError };
2
2
  import { isObject, getGlobalObject } from '../../utils.js';
3
+ import { execHookBase } from '../../../shared-server-client/hooks/execHook.js';
3
4
  import { getGlobalContextServerInternalOptional } from '../globalContext.js';
4
5
  import { getHookFromPageConfigGlobalCumulative } from '../../../shared-server-client/hooks/getHook.js';
5
6
  const globalObject = getGlobalObject('renderPageServer/execHookOnError.ts', {
@@ -17,7 +18,8 @@ function execHookOnError(err, pageContext) {
17
18
  const hooks = getHookFromPageConfigGlobalCumulative(globalContext._pageConfigGlobal, 'onError');
18
19
  for (const hook of hooks) {
19
20
  try {
20
- hook.hookFn(err, pageContext);
21
+ // TODO/refactor: stop using any
22
+ execHookBase(() => hook.hookFn(err, pageContext), hook, globalContext, pageContext);
21
23
  }
22
24
  catch (hookErr) {
23
25
  console.error(hookErr);
@@ -1,12 +1,12 @@
1
1
  export { handleErrorWithoutErrorPage };
2
2
  import type { GlobalContextServerInternal } from '../globalContext.js';
3
- import type { PageContextCreated } from './createPageContextServerSide.js';
4
- declare function handleErrorWithoutErrorPage<PageContext extends PageContextCreated & {
3
+ import type { PageContextCreatedServer } from './createPageContextServerSide.js';
4
+ declare function handleErrorWithoutErrorPage<PageContext extends PageContextCreatedServer & {
5
5
  errorWhileRendering: null | Error;
6
6
  is404: null | boolean;
7
7
  pageId: null;
8
8
  _globalContext: GlobalContextServerInternal;
9
9
  urlOriginal: string;
10
- }>(pageContext: PageContext): Promise<PageContext & {
10
+ }>(pageContext: PageContext): PageContext & {
11
11
  httpResponse: import("./createHttpResponse.js").HttpResponse;
12
- }>;
12
+ };
@@ -1,10 +1,9 @@
1
1
  export { handleErrorWithoutErrorPage };
2
- import { stringify } from '@brillout/json-serializer/stringify';
3
2
  import { assert, assertWarning, objectAssign } from '../../utils.js';
4
- import { createHttpResponsePage, createHttpResponseErrorFallback } from './createHttpResponse.js';
3
+ import { createHttpResponseErrorFallback, createHttpResponseErrorFallbackJson } from './createHttpResponse.js';
5
4
  import pc from '@brillout/picocolors';
6
5
  // When the user hasn't defined _error.page.js
7
- async function handleErrorWithoutErrorPage(pageContext) {
6
+ function handleErrorWithoutErrorPage(pageContext) {
8
7
  assert(pageContext.pageId === null);
9
8
  assert(pageContext.errorWhileRendering || pageContext.is404);
10
9
  {
@@ -19,7 +18,7 @@ async function handleErrorWithoutErrorPage(pageContext) {
19
18
  else {
20
19
  const __getPageAssets = async () => [];
21
20
  objectAssign(pageContext, { __getPageAssets });
22
- const httpResponse = await createHttpResponsePage(stringify({ serverSideError: true }), null, pageContext);
21
+ const httpResponse = createHttpResponseErrorFallbackJson();
23
22
  objectAssign(pageContext, { httpResponse });
24
23
  return pageContext;
25
24
  }
@@ -6,10 +6,10 @@ export type { PassToClient };
6
6
  export type { PassToClientPublic };
7
7
  import type { UrlRedirect } from '../../../../shared-server-client/route/abort.js';
8
8
  import type { GlobalContextServerInternal } from '../../globalContext.js';
9
- import type { PageContextCreated } from '../createPageContextServerSide.js';
9
+ import type { PageContextCreatedServer } from '../createPageContextServerSide.js';
10
10
  import type { PageContextBegin } from '../../renderPageServer.js';
11
11
  import type { PageContextCspNonce } from '../csp.js';
12
- type PageContextSerialization = PageContextCreated & {
12
+ type PageContextSerialization = PageContextCreatedServer & {
13
13
  pageId: string;
14
14
  routeParams: Record<string, string>;
15
15
  _passToClient: PassToClient;
@@ -242,7 +242,7 @@ async function processStream(streamOriginal, { injectStringAtBegin, injectString
242
242
  writeStream(injectedChunk); // Adds injectedChunk to buffer
243
243
  flushStream(); // Sets shouldFlushStream to true
244
244
  }
245
- // We call onStreamEvent() also when the stream ends in order to properly handle the situation when the stream didn't emit any data
245
+ // We call onStreamDataOrEnd() also when the stream ends in order to properly handle the situation when the stream didn't emit any data
246
246
  const onStreamDataOrEnd = (cb) => {
247
247
  assert(streamOriginalEnded === false);
248
248
  streamOriginalHasStartedEmitting = true;
@@ -277,26 +277,23 @@ async function processStream(streamOriginal, { injectStringAtBegin, injectString
277
277
  }
278
278
  });
279
279
  },
280
- async onEnd(
281
- /* Should we use this `isCancel`? Maybe we can skip `injectStringAtEnd()`?
282
- isCancel,
283
- //*/
284
- ) {
280
+ async onEnd(isCancel) {
285
281
  try {
286
282
  assert(!onEndWasCalled);
287
283
  onEndWasCalled = true;
288
284
  debug('stream end');
289
- // We call onStreamEvent() also here in case the stream didn't emit any data
285
+ // We call onStreamDataOrEnd() also here in case the stream didn't emit any data
290
286
  onStreamDataOrEnd(() => {
291
287
  streamOriginalEnded = true;
292
288
  });
293
- if (injectStringAtEnd) {
289
+ if (injectStringAtEnd && !isCancel) {
294
290
  const injectedChunk = await injectStringAtEnd();
295
291
  writeStream(injectedChunk);
296
292
  }
297
293
  await promiseReadyToWrite; // E.g. if the user calls the pipe wrapper after the original writable has ended
298
294
  assert(isReady());
299
- flushBuffer();
295
+ if (!isCancel)
296
+ flushBuffer();
300
297
  streamClosed = true;
301
298
  debug('stream ended');
302
299
  }
@@ -526,7 +523,8 @@ async function createStreamWrapper({ streamOriginal, onError, onData, onEnd, onF
526
523
  return;
527
524
  await onEnd(isCancel);
528
525
  isClosed = true;
529
- controllerProxy.close();
526
+ if (!isCancel)
527
+ controllerProxy.close();
530
528
  };
531
529
  let controllerProxy;
532
530
  assertReadableStreamConstructor();
@@ -546,6 +544,7 @@ async function createStreamWrapper({ streamOriginal, onError, onData, onEnd, onF
546
544
  });
547
545
  },
548
546
  async cancel(...args) {
547
+ debug('stream cancelled');
549
548
  isCancel = true;
550
549
  await readableOriginal.cancel(...args);
551
550
  // If readableOriginal has implemented readableOriginal.cancel() then the onEnd() callback and therefore closeStream() may already have been called at this point
@@ -553,9 +552,9 @@ async function createStreamWrapper({ streamOriginal, onError, onData, onEnd, onF
553
552
  },
554
553
  });
555
554
  const writeChunk = (chunk) => {
556
- if (
557
- // If readableOriginal doesn't implement readableOriginal.cancel() then it may still emit data after we close the stream. We therefore need to check whether the steam is closed.
558
- !isClosed) {
555
+ if (!isCancel &&
556
+ // If readableOriginal doesn't implement readableOriginal.cancel() then it may still emit data after we close the stream. We therefore need to check whether the steam is closed.
557
+ !isClosed) {
559
558
  controllerProxy.enqueue(encodeForWebStream(chunk));
560
559
  debugWithChunk('data written (Web Readable)', chunk);
561
560
  }
@@ -8,8 +8,8 @@ import { type PageAsset } from './getPageAssets.js';
8
8
  import type { PageConfigRuntime } from '../../../types/PageConfig.js';
9
9
  import type { PassToClient } from './html/serializeContext.js';
10
10
  import type { PageContextAfterRoute } from '../../../shared-server-client/route/index.js';
11
- import type { PageContextCreated } from './createPageContextServerSide.js';
12
- type PageContext_loadPageConfigsLazyServerSide = PageContextCreated & PageContextAfterRoute & {
11
+ import type { PageContextCreatedServer } from './createPageContextServerSide.js';
12
+ type PageContext_loadPageConfigsLazyServerSide = PageContextCreatedServer & PageContextAfterRoute & {
13
13
  is404: boolean | null;
14
14
  pageId: string;
15
15
  };
@@ -21,10 +21,7 @@ declare function loadPageConfigsLazyServerSide(pageContext: PageContext_loadPage
21
21
  isClientSide: false;
22
22
  isPrerendering: boolean;
23
23
  _requestId: number;
24
- } & Pick<import("../../../types/PageContext.js").PageContextInternalServer, "urlOriginal" | "headersOriginal"> & {
25
- url?: string;
26
- headers?: Record<string, string>;
27
- } & {
24
+ } & import("../renderPageServer.js").PageContextInit & {
28
25
  _globalContext: ({
29
26
  _globalConfigPublic: {
30
27
  pages: {
@@ -2,8 +2,8 @@ export { log404 };
2
2
  export { getRoutesInfo };
3
3
  import type { PageRoutes } from '../../../../shared-server-client/route/index.js';
4
4
  import type { GlobalContextServerInternal } from '../../globalContext.js';
5
- import type { PageContextCreated } from '../createPageContextServerSide.js';
6
- declare function log404(pageContext: PageContextCreated & {
5
+ import type { PageContextCreatedServer } from '../createPageContextServerSide.js';
6
+ declare function log404(pageContext: PageContextCreatedServer & {
7
7
  urlPathname: string;
8
8
  errorWhileRendering: null | Error;
9
9
  _globalContext: GlobalContextServerInternal;
@@ -5,7 +5,7 @@ export type { PageContextAfterRender };
5
5
  import { type PageContextUrlInternal } from '../../../shared-server-client/getPageContextUrlComputed.js';
6
6
  import { HttpResponse } from './createHttpResponse.js';
7
7
  import { type PageContext_loadPageConfigsLazyServerSide, type PageConfigsLazy } from './loadPageConfigsLazyServerSide.js';
8
- import type { PageContextCreated } from './createPageContextServerSide.js';
8
+ import type { PageContextCreatedServer } from './createPageContextServerSide.js';
9
9
  import type { PageContextBegin } from '../renderPageServer.js';
10
10
  type PageContextAfterRender = {
11
11
  httpResponse: HttpResponse;
@@ -18,7 +18,7 @@ declare function renderPageServerAfterRoute<PageContext extends {
18
18
  routeParams: Record<string, string>;
19
19
  errorWhileRendering: null | Error;
20
20
  _requestId: number;
21
- } & PageContextCreated & PageContextBegin & PageContextUrlInternal & PageContext_loadPageConfigsLazyServerSide>(pageContext: PageContext): Promise<PageContext & PageContextAfterRender>;
21
+ } & PageContextCreatedServer & PageContextBegin & PageContextUrlInternal & PageContext_loadPageConfigsLazyServerSide>(pageContext: PageContext): Promise<PageContext & PageContextAfterRender>;
22
22
  declare function prerenderPage(pageContext: Parameters<typeof prerenderPageEntry>[0]): Promise<{
23
23
  documentHtml: string;
24
24
  pageContextSerialized: null;
@@ -29,10 +29,7 @@ declare function prerenderPage(pageContext: Parameters<typeof prerenderPageEntry
29
29
  isClientSide: false;
30
30
  isPrerendering: boolean;
31
31
  _requestId: number;
32
- } & Pick<import("../../../types/PageContext.js").PageContextInternalServer, "urlOriginal" | "headersOriginal"> & {
33
- url?: string;
34
- headers?: Record<string, string>;
35
- } & {
32
+ } & import("../renderPageServer.js").PageContextInit & {
36
33
  _globalContext: ({
37
34
  _globalConfigPublic: {
38
35
  pages: {
@@ -193,10 +190,7 @@ declare function prerenderPage(pageContext: Parameters<typeof prerenderPageEntry
193
190
  isClientSide: false;
194
191
  isPrerendering: boolean;
195
192
  _requestId: number;
196
- } & Pick<import("../../../types/PageContext.js").PageContextInternalServer, "urlOriginal" | "headersOriginal"> & {
197
- url?: string;
198
- headers?: Record<string, string>;
199
- } & {
193
+ } & import("../renderPageServer.js").PageContextInit & {
200
194
  _globalContext: ({
201
195
  _globalConfigPublic: {
202
196
  pages: {
@@ -348,7 +342,7 @@ declare function prerenderPage(pageContext: Parameters<typeof prerenderPageEntry
348
342
  pageContextsAborted: never[];
349
343
  };
350
344
  }>;
351
- declare function prerenderPageEntry(pageContext: PageContextCreated & PageConfigsLazy & {
345
+ declare function prerenderPageEntry(pageContext: PageContextCreatedServer & PageConfigsLazy & {
352
346
  routeParams: Record<string, string>;
353
347
  pageId: string;
354
348
  _requestId: number;
@@ -365,10 +359,7 @@ declare function prerenderPageEntry(pageContext: PageContextCreated & PageConfig
365
359
  isClientSide: false;
366
360
  isPrerendering: boolean;
367
361
  _requestId: number;
368
- } & Pick<import("../../../types/PageContext.js").PageContextInternalServer, "urlOriginal" | "headersOriginal"> & {
369
- url?: string;
370
- headers?: Record<string, string>;
371
- } & {
362
+ } & import("../renderPageServer.js").PageContextInit & {
372
363
  _globalContext: ({
373
364
  _globalConfigPublic: {
374
365
  pages: {
@@ -529,10 +520,7 @@ declare function prerenderPageEntry(pageContext: PageContextCreated & PageConfig
529
520
  isClientSide: false;
530
521
  isPrerendering: boolean;
531
522
  _requestId: number;
532
- } & Pick<import("../../../types/PageContext.js").PageContextInternalServer, "urlOriginal" | "headersOriginal"> & {
533
- url?: string;
534
- headers?: Record<string, string>;
535
- } & {
523
+ } & import("../renderPageServer.js").PageContextInit & {
536
524
  _globalContext: ({
537
525
  _globalConfigPublic: {
538
526
  pages: {
@@ -5,7 +5,7 @@ import { getErrorPageId } from '../../../shared-server-client/error-page.js';
5
5
  import { getHtmlString } from './html/renderHtml.js';
6
6
  import { assert, assertUsage, updateType, hasProp, objectAssign, isSameErrorMessage } from '../../utils.js';
7
7
  import { getPageContextClientSerialized } from './html/serializeContext.js';
8
- import { createHttpResponsePage, createHttpResponsePageContextJson } from './createHttpResponse.js';
8
+ import { createHttpResponsePage, createHttpResponsePageJson } from './createHttpResponse.js';
9
9
  import { loadPageConfigsLazyServerSide, } from './loadPageConfigsLazyServerSide.js';
10
10
  import { execHookOnRenderHtml } from './execHookOnRenderHtml.js';
11
11
  import { execHookDataAndOnBeforeRender } from './execHookDataAndOnBeforeRender.js';
@@ -46,7 +46,7 @@ async function renderPageServerAfterRoute(pageContext) {
46
46
  objectAssign(pageContext, { [isServerSideError]: true });
47
47
  }
48
48
  const pageContextSerialized = getPageContextClientSerialized(pageContext, false);
49
- const httpResponse = await createHttpResponsePageContextJson(pageContextSerialized);
49
+ const httpResponse = await createHttpResponsePageJson(pageContextSerialized);
50
50
  objectAssign(pageContext, { httpResponse });
51
51
  return pageContext;
52
52
  }
@@ -5,12 +5,8 @@ import { type PageContextAborted } from '../../shared-server-client/route/abort.
5
5
  import { type GlobalContextServerInternal } from './globalContext.js';
6
6
  import { type HttpResponse } from './renderPageServer/createHttpResponse.js';
7
7
  import type { PageContextServer } from '../../types/index.js';
8
- import type { PageContextInternalServer } from '../../types/PageContext.js';
8
+ import type { PageContextInit } from '../../types/PageContext.js';
9
9
  import { type AsyncStore } from './asyncHook.js';
10
- type PageContextInit = Pick<PageContextInternalServer, 'urlOriginal' | 'headersOriginal'> & {
11
- /** @deprecated Set `pageContextInit.urlOriginal` instead */ url?: string;
12
- /** @deprecated Set pageContextInit.headersOriginal instead */ headers?: Record<string, string>;
13
- };
14
10
  type PageContextBegin = ReturnType<typeof getPageContextBegin>;
15
11
  declare function renderPageServer<PageContextUserAdded extends {}, PageContextInitUser extends PageContextInit>(pageContextInit: PageContextInitUser): Promise<PageContextInitUser & {
16
12
  httpResponse: HttpResponse;
@@ -22,10 +18,7 @@ declare function getPageContextBegin(pageContextInit: PageContextInit, globalCon
22
18
  isClientSide: false;
23
19
  isPrerendering: boolean;
24
20
  _requestId: number;
25
- } & Pick<PageContextInternalServer, "urlOriginal" | "headersOriginal"> & {
26
- /** @deprecated Set `pageContextInit.urlOriginal` instead */ url?: string;
27
- /** @deprecated Set pageContextInit.headersOriginal instead */ headers?: Record<string, string>;
28
- } & {
21
+ } & PageContextInit & {
29
22
  _globalContext: ({
30
23
  _globalConfigPublic: {
31
24
  pages: {
@@ -6,7 +6,7 @@ import { assert, hasProp, objectAssign, isUrl, parseUrl, onSetupRuntime, assertW
6
6
  import { getPageContextAddendumAbort, isAbortError, logAbort, addNewPageContextAborted, } from '../../shared-server-client/route/abort.js';
7
7
  import { getGlobalContextServerInternal, initGlobalContext_renderPage, } from './globalContext.js';
8
8
  import { handlePageContextRequestUrl } from './renderPageServer/handlePageContextRequestUrl.js';
9
- import { createHttpResponse404, createHttpResponseRedirect, createHttpResponsePageContextJson, createHttpResponseErrorFallback, createHttpResponseErrorFallback_noGlobalContext, createHttpResponseBaseIsMissing, } from './renderPageServer/createHttpResponse.js';
9
+ import { createHttpResponse404, createHttpResponseRedirect, createHttpResponsePageJson, createHttpResponseErrorFallback, createHttpResponseErrorFallback_noGlobalContext, createHttpResponseBaseIsMissing, } from './renderPageServer/createHttpResponse.js';
10
10
  import { logRuntimeError, logRuntimeInfo } from './loggerRuntime.js';
11
11
  import { assertArguments } from './renderPageServer/assertArguments.js';
12
12
  import { log404 } from './renderPageServer/log404/index.js';
@@ -40,7 +40,7 @@ async function renderPageServer(pageContextInit) {
40
40
  const pageContextFinish = !asyncLocalStorage ? await render() : await asyncLocalStorage.run(asyncStore, render);
41
41
  logHttpResponse(urlOriginalPretty, pageContextFinish);
42
42
  checkType(pageContextFinish);
43
- assert(pageContextFinish.httpResponse);
43
+ assertPageContextFinish(pageContextFinish);
44
44
  return pageContextFinish;
45
45
  }
46
46
  async function renderPageServerEntryOnce(pageContextInit, requestId, asyncStore) {
@@ -63,8 +63,8 @@ async function renderPageServerEntryOnce(pageContextInit, requestId, asyncStore)
63
63
  // ```
64
64
  // - initGlobalContext_renderPage() depends on +onCreateGlobalContext hooks
65
65
  assert(!isAbortError(err));
66
- const pageContext_logRuntime = getPageContext_logRuntimeEarly(pageContextInit, requestId);
67
- logRuntimeError(err, pageContext_logRuntime);
66
+ const pageContext = createPageContextServerSideWithoutGlobalContext(pageContextInit, requestId);
67
+ logRuntimeError(err, pageContext);
68
68
  const pageContextHttpErrorFallback = getPageContextHttpErrorFallback_noGlobalContext(err, pageContextInit, requestId);
69
69
  return pageContextHttpErrorFallback;
70
70
  }
@@ -131,7 +131,7 @@ async function renderPageServerEntryRecursive(pageContextBegin, globalContext, r
131
131
  const errorPageId = getErrorPageId(pageContextNominalPageBegin._globalContext._pageFilesAll, pageContextNominalPageBegin._globalContext._pageConfigs);
132
132
  if (!errorPageId) {
133
133
  assert(hasProp(pageContextNominalPageBegin, 'pageId', 'null')); // Help TS
134
- return await handleErrorWithoutErrorPage(pageContextNominalPageBegin);
134
+ return handleErrorWithoutErrorPage(pageContextNominalPageBegin);
135
135
  }
136
136
  objectAssign(pageContextNominalPageBegin, { pageId: errorPageId });
137
137
  }
@@ -182,7 +182,7 @@ async function renderPageServerEntryRecursive_onError(err, pageContextBegin, pag
182
182
  const errorPageId = getErrorPageId(globalContext._pageFilesAll, globalContext._pageConfigs);
183
183
  if (!errorPageId) {
184
184
  objectAssign(pageContextErrorPageInit, { pageId: null });
185
- return await handleErrorWithoutErrorPage(pageContextErrorPageInit);
185
+ return handleErrorWithoutErrorPage(pageContextErrorPageInit);
186
186
  }
187
187
  objectAssign(pageContextErrorPageInit, { pageId: errorPageId });
188
188
  }
@@ -216,8 +216,8 @@ async function renderPageServerEntryRecursive_onError(err, pageContextBegin, pag
216
216
  return pageContextErrorPage;
217
217
  }
218
218
  function logHttpRequest(urlOriginal, pageContextInit, requestId) {
219
- const pageContext_logRuntime = getPageContext_logRuntimeEarly(pageContextInit, requestId);
220
- logRuntimeInfo?.(getRequestInfoMessage(urlOriginal), pageContext_logRuntime, 'info');
219
+ const pageContext = createPageContextServerSideWithoutGlobalContext(pageContextInit, requestId);
220
+ logRuntimeInfo?.(getRequestInfoMessage(urlOriginal), pageContext, 'info');
221
221
  }
222
222
  /* Alternative icons:
223
223
  const arrowRight = pc.dim('»')
@@ -430,7 +430,7 @@ pageContextNominalPageBegin, requestId, pageContextErrorPageInit, globalContext)
430
430
  else {
431
431
  pageContextSerialized = getPageContextClientSerializedAbort(pageContextAbort, false);
432
432
  }
433
- const httpResponse = await createHttpResponsePageContextJson(pageContextSerialized);
433
+ const httpResponse = await createHttpResponsePageJson(pageContextSerialized);
434
434
  objectAssign(pageContext, { httpResponse });
435
435
  return { pageContextReturn: pageContext };
436
436
  }
@@ -486,19 +486,11 @@ function getPageContextSkipRequest(pageContextInit, requestId) {
486
486
  return pageContext;
487
487
  }
488
488
  function getPageContextInvalidVikeConfig(err, pageContextInit, requestId) {
489
- const pageContext_logRuntime = getPageContext_logRuntimeEarly(pageContextInit, requestId);
490
- logRuntimeInfo?.(pc.bold(pc.red('Error loading Vike config — see error above')), pageContext_logRuntime, 'error');
489
+ const pageContext = createPageContextServerSideWithoutGlobalContext(pageContextInit, requestId);
490
+ logRuntimeInfo?.(pc.bold(pc.red('Error loading Vike config — see error above')), pageContext, 'error');
491
491
  const pageContextHttpErrorFallback = getPageContextHttpErrorFallback_noGlobalContext(err, pageContextInit, requestId);
492
492
  return pageContextHttpErrorFallback;
493
493
  }
494
- /** Use this as last resort — prefer passing richer `pageContext` objects to the runtime logger */
495
- function getPageContext_logRuntimeEarly(pageContextInit, requestId) {
496
- const pageContext_logRuntime = {
497
- ...pageContextInit,
498
- _requestId: requestId,
499
- };
500
- return pageContext_logRuntime;
501
- }
502
494
  function fork(pageContext) {
503
495
  const pageContextNew = forkPageContext(pageContext);
504
496
  if (pageContext._asyncStore)
@@ -506,3 +498,11 @@ function fork(pageContext) {
506
498
  assert(pageContextNew._asyncStore === pageContext._asyncStore);
507
499
  return pageContextNew;
508
500
  }
501
+ function assertPageContextFinish(pageContextFinish) {
502
+ assert(pageContextFinish.httpResponse);
503
+ if (pageContextFinish.isClientSideNavigation) {
504
+ const headers = new Headers(pageContextFinish.httpResponse.headers);
505
+ const contentType = headers.get('Content-Type');
506
+ assert(contentType?.toLowerCase() === 'application/json');
507
+ }
508
+ }
@@ -54,7 +54,7 @@ addGlobalContextTmp, addGlobalContextAsync) {
54
54
  let hooksCalled = false;
55
55
  if (!hooksAreEqual(globalObject.onCreateGlobalContextHooks ?? [], onCreateGlobalContextHooks)) {
56
56
  globalObject.onCreateGlobalContextHooks = onCreateGlobalContextHooks;
57
- await execHookGlobal('onCreateGlobalContext', globalContext._pageConfigGlobal, null, globalContext, prepareGlobalContextForPublicUsage);
57
+ await execHookGlobal('onCreateGlobalContext', globalContext, null, globalContext, prepareGlobalContextForPublicUsage);
58
58
  hooksCalled = true;
59
59
  }
60
60
  if (isNewGlobalContext) {