vike 0.4.232 → 0.4.233-commit-e534fd6

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 (61) hide show
  1. package/dist/cjs/node/prerender/runPrerender.js +9 -4
  2. package/dist/cjs/node/runtime/html/injectAssets/getHtmlTags.js +20 -3
  3. package/dist/cjs/node/runtime/html/injectAssets/mergeScriptTags.js +7 -1
  4. package/dist/cjs/node/runtime/renderPage/{executeOnBeforeRenderAndDataHooks.js → execHookDataAndOnBeforeRender.js} +2 -2
  5. package/dist/cjs/node/runtime/renderPage/{executeOnRenderHtmlHook.js → execHookOnRenderHtml.js} +3 -3
  6. package/dist/cjs/node/runtime/renderPage/execHookServer.js +1 -4
  7. package/dist/cjs/node/runtime/renderPage/loadPageConfigsLazyServerSide.js +18 -13
  8. package/dist/cjs/node/runtime/renderPage/renderPageAlreadyRouted.js +11 -11
  9. package/dist/cjs/node/runtime/renderPage.js +55 -48
  10. package/dist/cjs/node/vite/shared/resolveVikeConfigInternal/configDefinitionsBuiltIn.js +0 -2
  11. package/dist/cjs/shared/createPageContextShared.js +1 -3
  12. package/dist/cjs/shared/hooks/execHook.js +31 -54
  13. package/dist/cjs/shared/route/{executeGuardHook.js → execHookGuard.js} +3 -3
  14. package/dist/cjs/shared/route/{executeOnBeforeRouteHook.js → execHookOnBeforeRoute.js} +4 -4
  15. package/dist/cjs/shared/route/index.js +3 -2
  16. package/dist/cjs/shared/route/resolveRouteFunction.js +1 -1
  17. package/dist/cjs/utils/PROJECT_VERSION.js +1 -1
  18. package/dist/cjs/utils/styleFileRE.js +1 -0
  19. package/dist/esm/client/runtime-client-routing/getPageContextFromHooks.d.ts +2 -2
  20. package/dist/esm/client/runtime-client-routing/getPageContextFromHooks.js +9 -9
  21. package/dist/esm/client/runtime-client-routing/renderPageClientSide.d.ts +1 -1
  22. package/dist/esm/client/runtime-client-routing/renderPageClientSide.js +97 -62
  23. package/dist/esm/client/runtime-server-routing/createPageContextClientSide.js +11 -4
  24. package/dist/esm/client/runtime-server-routing/entry.js +2 -2
  25. package/dist/esm/client/shared/{executeOnRenderClientHook.d.ts → execHookOnRenderClient.d.ts} +2 -2
  26. package/dist/esm/client/shared/{executeOnRenderClientHook.js → execHookOnRenderClient.js} +4 -4
  27. package/dist/esm/client/shared/loadPageConfigsLazyClientSide.d.ts +12 -4
  28. package/dist/esm/client/shared/loadPageConfigsLazyClientSide.js +4 -4
  29. package/dist/esm/node/prerender/runPrerender.d.ts +250 -4
  30. package/dist/esm/node/prerender/runPrerender.js +11 -6
  31. package/dist/esm/node/runtime/html/injectAssets/getHtmlTags.js +20 -3
  32. package/dist/esm/node/runtime/html/injectAssets/mergeScriptTags.js +7 -1
  33. package/dist/esm/node/runtime/renderPage/createHttpResponse.d.ts +1 -1
  34. package/dist/esm/node/runtime/renderPage/execHookDataAndOnBeforeRender.d.ts +6 -0
  35. package/dist/esm/node/runtime/renderPage/{executeOnBeforeRenderAndDataHooks.js → execHookDataAndOnBeforeRender.js} +2 -2
  36. package/dist/esm/node/runtime/renderPage/{executeOnRenderHtmlHook.d.ts → execHookOnRenderHtml.d.ts} +2 -2
  37. package/dist/esm/node/runtime/renderPage/{executeOnRenderHtmlHook.js → execHookOnRenderHtml.js} +4 -4
  38. package/dist/esm/node/runtime/renderPage/execHookServer.d.ts +3 -3
  39. package/dist/esm/node/runtime/renderPage/execHookServer.js +1 -4
  40. package/dist/esm/node/runtime/renderPage/getHttpResponseBody.d.ts +1 -1
  41. package/dist/esm/node/runtime/renderPage/loadPageConfigsLazyServerSide.d.ts +15 -6
  42. package/dist/esm/node/runtime/renderPage/loadPageConfigsLazyServerSide.js +18 -13
  43. package/dist/esm/node/runtime/renderPage/renderPageAlreadyRouted.d.ts +2 -2
  44. package/dist/esm/node/runtime/renderPage/renderPageAlreadyRouted.js +13 -13
  45. package/dist/esm/node/runtime/renderPage.js +57 -50
  46. package/dist/esm/node/vite/shared/resolveVikeConfigInternal/configDefinitionsBuiltIn.js +0 -2
  47. package/dist/esm/shared/createPageContextShared.js +1 -3
  48. package/dist/esm/shared/hooks/execHook.d.ts +14 -28
  49. package/dist/esm/shared/hooks/execHook.js +31 -54
  50. package/dist/esm/shared/route/execHookGuard.d.ts +8 -0
  51. package/dist/esm/shared/route/{executeGuardHook.js → execHookGuard.js} +4 -4
  52. package/dist/esm/shared/route/{executeOnBeforeRouteHook.d.ts → execHookOnBeforeRoute.d.ts} +2 -2
  53. package/dist/esm/shared/route/{executeOnBeforeRouteHook.js → execHookOnBeforeRoute.js} +5 -5
  54. package/dist/esm/shared/route/index.js +3 -2
  55. package/dist/esm/shared/route/resolveRouteFunction.js +2 -2
  56. package/dist/esm/utils/PROJECT_VERSION.d.ts +1 -1
  57. package/dist/esm/utils/PROJECT_VERSION.js +1 -1
  58. package/dist/esm/utils/styleFileRE.js +1 -0
  59. package/package.json +1 -1
  60. package/dist/esm/node/runtime/renderPage/executeOnBeforeRenderAndDataHooks.d.ts +0 -6
  61. package/dist/esm/shared/route/executeGuardHook.d.ts +0 -8
@@ -171,7 +171,7 @@ declare function createPageContextPrerendering(urlOriginal: string, prerenderCon
171
171
  _sources: import("../../shared/page-configs/resolveVikeConfigPublic.js").Sources;
172
172
  _from: import("../../shared/page-configs/resolveVikeConfigPublic.js").From;
173
173
  } & {
174
- urlParsed: import("../shared/utils.js").UrlPublic;
174
+ urlParsed: import("../runtime/utils.js").UrlPublic;
175
175
  urlPathname: string;
176
176
  url: string;
177
177
  } & {
@@ -292,7 +292,7 @@ declare function createPageContextPrerendering(urlOriginal: string, prerenderCon
292
292
  _sources: import("../../shared/page-configs/resolveVikeConfigPublic.js").Sources;
293
293
  _from: import("../../shared/page-configs/resolveVikeConfigPublic.js").From;
294
294
  } & {
295
- urlParsed: import("../shared/utils.js").UrlPublic;
295
+ urlParsed: import("../runtime/utils.js").UrlPublic;
296
296
  urlPathname: string;
297
297
  url: string;
298
298
  } & {
@@ -310,13 +310,259 @@ declare function createPageContextPrerendering(urlOriginal: string, prerenderCon
310
310
  pageId: string;
311
311
  _debugRouteMatches: never[];
312
312
  routeParams: {};
313
- })) & import("../../shared/getPageFiles.js").VikeConfigPublicPageLazy & {
313
+ })) & (((({
314
+ _isOriginalObject: true;
315
+ isPageContext: true;
316
+ } & {
317
+ isClientSide: false;
318
+ isPrerendering: boolean;
319
+ } & Pick<import("../../types/PageContext.js").PageContextInternalServer, "urlOriginal" | "headersOriginal"> & {
320
+ url?: string;
321
+ headers?: Record<string, string>;
322
+ } & {
323
+ _globalContext: {
324
+ isGlobalContext: true;
325
+ _isOriginalObject: true;
326
+ _virtualFileExports: unknown;
327
+ _pageFilesAll: PageFile[];
328
+ _pageConfigs: import("../../types/PageConfig.js").PageConfigRuntime[];
329
+ _pageConfigGlobal: import("../../types/PageConfig.js").PageConfigGlobalRuntime;
330
+ _allPageIds: string[];
331
+ _vikeConfigPublicGlobal: {
332
+ config: import("../../types/index.js").ConfigResolved;
333
+ _source: import("../../shared/page-configs/resolveVikeConfigPublic.js").Source;
334
+ _sources: import("../../shared/page-configs/resolveVikeConfigPublic.js").Sources;
335
+ _from: import("../../shared/page-configs/resolveVikeConfigPublic.js").From;
336
+ };
337
+ config: import("../../types/index.js").ConfigResolved;
338
+ pages: {
339
+ [k: string]: import("../../shared/page-configs/resolveVikeConfigPublic.js").VikeConfigPublicPageEager;
340
+ };
341
+ } & ({
342
+ _isProduction: false;
343
+ _isPrerendering: false;
344
+ assetsManifest: null;
345
+ _viteDevServer: import("vite").ViteDevServer;
346
+ viteConfig: ResolvedConfig;
347
+ viteConfigRuntime: {
348
+ root: string;
349
+ build: {
350
+ outDir: string;
351
+ };
352
+ _baseViteOriginal: string;
353
+ vitePluginServerEntry: {
354
+ inject: boolean | undefined;
355
+ };
356
+ };
357
+ baseServer: string;
358
+ baseAssets: string;
359
+ isClientSide: false;
360
+ _pageRoutes: import("../../shared/route/loadPageRoutes.js").PageRoutes;
361
+ _onBeforeRouteHook: import("../../shared/hooks/getHook.js").Hook | null;
362
+ } | {
363
+ _isPrerendering: true;
364
+ viteConfig: ResolvedConfig;
365
+ _isProduction: true;
366
+ assetsManifest: import("../../types/ViteManifest.js").ViteManifest;
367
+ _viteDevServer: null;
368
+ viteConfigRuntime: {
369
+ root: string;
370
+ build: {
371
+ outDir: string;
372
+ };
373
+ _baseViteOriginal: string;
374
+ vitePluginServerEntry: {
375
+ inject: boolean | undefined;
376
+ };
377
+ };
378
+ _usesClientRouter: boolean;
379
+ baseServer: string;
380
+ baseAssets: string;
381
+ isClientSide: false;
382
+ _pageRoutes: import("../../shared/route/loadPageRoutes.js").PageRoutes;
383
+ _onBeforeRouteHook: import("../../shared/hooks/getHook.js").Hook | null;
384
+ } | {
385
+ _isPrerendering: false;
386
+ viteConfig: null;
387
+ _isProduction: true;
388
+ assetsManifest: import("../../types/ViteManifest.js").ViteManifest;
389
+ _viteDevServer: null;
390
+ viteConfigRuntime: {
391
+ root: string;
392
+ build: {
393
+ outDir: string;
394
+ };
395
+ _baseViteOriginal: string;
396
+ vitePluginServerEntry: {
397
+ inject: boolean | undefined;
398
+ };
399
+ };
400
+ _usesClientRouter: boolean;
401
+ baseServer: string;
402
+ baseAssets: string;
403
+ isClientSide: false;
404
+ _pageRoutes: import("../../shared/route/loadPageRoutes.js").PageRoutes;
405
+ _onBeforeRouteHook: import("../../shared/hooks/getHook.js").Hook | null;
406
+ });
407
+ _pageFilesAll: PageFile[];
408
+ _baseServer: string;
409
+ _baseAssets: string;
410
+ _pageContextInit: import("../runtime/renderPage.js").PageContextInit;
411
+ _urlRewrite: null;
412
+ _urlHandler: ((url: string) => string) | null;
413
+ isClientSideNavigation: boolean;
414
+ } & {
415
+ config: import("../../types/index.js").ConfigResolved;
416
+ _source: import("../../shared/page-configs/resolveVikeConfigPublic.js").Source;
417
+ _sources: import("../../shared/page-configs/resolveVikeConfigPublic.js").Sources;
418
+ _from: import("../../shared/page-configs/resolveVikeConfigPublic.js").From;
419
+ } & {
420
+ urlParsed: import("../runtime/utils.js").UrlPublic;
421
+ urlPathname: string;
422
+ url: string;
423
+ } & {
424
+ headers: Record<string, string> | null;
425
+ } & {
426
+ _urlHandler: null;
427
+ _httpRequestId: null;
428
+ _urlRewrite: null;
429
+ _noExtraDir: boolean | null;
430
+ _prerenderContext: PrerenderContext;
431
+ _providedByHook: ProvidedByHook;
432
+ _urlOriginalModifiedByHook: ProvidedByHookTransformer;
433
+ is404: boolean;
434
+ } & import("../../shared/route/index.js").PageContextFromRoute & Record<"pageId", string>) | ({
435
+ _isOriginalObject: true;
436
+ isPageContext: true;
437
+ } & {
438
+ isClientSide: false;
439
+ isPrerendering: boolean;
440
+ } & Pick<import("../../types/PageContext.js").PageContextInternalServer, "urlOriginal" | "headersOriginal"> & {
441
+ url?: string;
442
+ headers?: Record<string, string>;
443
+ } & {
444
+ _globalContext: {
445
+ isGlobalContext: true;
446
+ _isOriginalObject: true;
447
+ _virtualFileExports: unknown;
448
+ _pageFilesAll: PageFile[];
449
+ _pageConfigs: import("../../types/PageConfig.js").PageConfigRuntime[];
450
+ _pageConfigGlobal: import("../../types/PageConfig.js").PageConfigGlobalRuntime;
451
+ _allPageIds: string[];
452
+ _vikeConfigPublicGlobal: {
453
+ config: import("../../types/index.js").ConfigResolved;
454
+ _source: import("../../shared/page-configs/resolveVikeConfigPublic.js").Source;
455
+ _sources: import("../../shared/page-configs/resolveVikeConfigPublic.js").Sources;
456
+ _from: import("../../shared/page-configs/resolveVikeConfigPublic.js").From;
457
+ };
458
+ config: import("../../types/index.js").ConfigResolved;
459
+ pages: {
460
+ [k: string]: import("../../shared/page-configs/resolveVikeConfigPublic.js").VikeConfigPublicPageEager;
461
+ };
462
+ } & ({
463
+ _isProduction: false;
464
+ _isPrerendering: false;
465
+ assetsManifest: null;
466
+ _viteDevServer: import("vite").ViteDevServer;
467
+ viteConfig: ResolvedConfig;
468
+ viteConfigRuntime: {
469
+ root: string;
470
+ build: {
471
+ outDir: string;
472
+ };
473
+ _baseViteOriginal: string;
474
+ vitePluginServerEntry: {
475
+ inject: boolean | undefined;
476
+ };
477
+ };
478
+ baseServer: string;
479
+ baseAssets: string;
480
+ isClientSide: false;
481
+ _pageRoutes: import("../../shared/route/loadPageRoutes.js").PageRoutes;
482
+ _onBeforeRouteHook: import("../../shared/hooks/getHook.js").Hook | null;
483
+ } | {
484
+ _isPrerendering: true;
485
+ viteConfig: ResolvedConfig;
486
+ _isProduction: true;
487
+ assetsManifest: import("../../types/ViteManifest.js").ViteManifest;
488
+ _viteDevServer: null;
489
+ viteConfigRuntime: {
490
+ root: string;
491
+ build: {
492
+ outDir: string;
493
+ };
494
+ _baseViteOriginal: string;
495
+ vitePluginServerEntry: {
496
+ inject: boolean | undefined;
497
+ };
498
+ };
499
+ _usesClientRouter: boolean;
500
+ baseServer: string;
501
+ baseAssets: string;
502
+ isClientSide: false;
503
+ _pageRoutes: import("../../shared/route/loadPageRoutes.js").PageRoutes;
504
+ _onBeforeRouteHook: import("../../shared/hooks/getHook.js").Hook | null;
505
+ } | {
506
+ _isPrerendering: false;
507
+ viteConfig: null;
508
+ _isProduction: true;
509
+ assetsManifest: import("../../types/ViteManifest.js").ViteManifest;
510
+ _viteDevServer: null;
511
+ viteConfigRuntime: {
512
+ root: string;
513
+ build: {
514
+ outDir: string;
515
+ };
516
+ _baseViteOriginal: string;
517
+ vitePluginServerEntry: {
518
+ inject: boolean | undefined;
519
+ };
520
+ };
521
+ _usesClientRouter: boolean;
522
+ baseServer: string;
523
+ baseAssets: string;
524
+ isClientSide: false;
525
+ _pageRoutes: import("../../shared/route/loadPageRoutes.js").PageRoutes;
526
+ _onBeforeRouteHook: import("../../shared/hooks/getHook.js").Hook | null;
527
+ });
528
+ _pageFilesAll: PageFile[];
529
+ _baseServer: string;
530
+ _baseAssets: string;
531
+ _pageContextInit: import("../runtime/renderPage.js").PageContextInit;
532
+ _urlRewrite: null;
533
+ _urlHandler: ((url: string) => string) | null;
534
+ isClientSideNavigation: boolean;
535
+ } & {
536
+ config: import("../../types/index.js").ConfigResolved;
537
+ _source: import("../../shared/page-configs/resolveVikeConfigPublic.js").Source;
538
+ _sources: import("../../shared/page-configs/resolveVikeConfigPublic.js").Sources;
539
+ _from: import("../../shared/page-configs/resolveVikeConfigPublic.js").From;
540
+ } & {
541
+ urlParsed: import("../runtime/utils.js").UrlPublic;
542
+ urlPathname: string;
543
+ url: string;
544
+ } & {
545
+ headers: Record<string, string> | null;
546
+ } & {
547
+ _urlHandler: null;
548
+ _httpRequestId: null;
549
+ _urlRewrite: null;
550
+ _noExtraDir: boolean | null;
551
+ _prerenderContext: PrerenderContext;
552
+ _providedByHook: ProvidedByHook;
553
+ _urlOriginalModifiedByHook: ProvidedByHookTransformer;
554
+ is404: boolean;
555
+ } & {
556
+ pageId: string;
557
+ _debugRouteMatches: never[];
558
+ routeParams: {};
559
+ })) & import("../../shared/getPageFiles.js").VikeConfigPublicPageLazy) & {
314
560
  Page: unknown;
315
561
  _isHtmlOnly: boolean;
316
562
  _passToClient: string[];
317
563
  _pageFilePathsLoaded: string[];
318
564
  } & {
319
565
  __getPageAssets: () => Promise<import("../runtime/renderPage/getPageAssets.js").PageAsset[]>;
320
- }) & {
566
+ })) & {
321
567
  _usesClientRouter: boolean;
322
568
  }>;
@@ -18,17 +18,18 @@ import { getConfigValueRuntime } from '../../shared/page-configs/getConfigValueR
18
18
  import { loadConfigValues } from '../../shared/page-configs/loadConfigValues.js';
19
19
  import { getErrorPageId, isErrorPage } from '../../shared/error-page.js';
20
20
  import { isAbortError } from '../../shared/route/abort.js';
21
- import { loadPageConfigsLazyServerSide } from '../runtime/renderPage/loadPageConfigsLazyServerSide.js';
21
+ import { loadPageConfigsLazyServerSideAndExecHook } from '../runtime/renderPage/loadPageConfigsLazyServerSide.js';
22
22
  import { getHookFromPageConfig, getHookFromPageConfigGlobal, getHookTimeoutDefault, getHook_setIsPrerenderering, } from '../../shared/hooks/getHook.js';
23
23
  import { noRouteMatch } from '../../shared/route/noRouteMatch.js';
24
24
  import { getVikeConfigInternal } from '../vite/shared/resolveVikeConfigInternal.js';
25
- import { execHookWithoutPageContext, isUserHookError } from '../../shared/hooks/execHook.js';
25
+ import { execHookDirectWithoutPageContext, isUserHookError } from '../../shared/hooks/execHook.js';
26
26
  import { setWasPrerenderRun } from './context.js';
27
27
  import { resolvePrerenderConfigGlobal, resolvePrerenderConfigLocal } from './resolvePrerenderConfig.js';
28
28
  import { getOutDirs } from '../vite/shared/getOutDirs.js';
29
29
  import fs from 'node:fs';
30
30
  import { getProxyForPublicUsage } from '../../shared/getProxyForPublicUsage.js';
31
31
  import { getStaticRedirectsForPrerender } from '../runtime/renderPage/resolveRedirects.js';
32
+ import { augmentType } from '../runtime/utils.js';
32
33
  const docLink = 'https://vike.dev/i18n#pre-rendering';
33
34
  async function runPrerender(options = {}, trigger) {
34
35
  setWasPrerenderRun(trigger);
@@ -215,7 +216,7 @@ async function callOnBeforePrerenderStartHooks(prerenderContext, globalContext,
215
216
  if (doNotPrerenderList.find((p) => p.pageId === pageId))
216
217
  return;
217
218
  const { hookName, hookFilePath } = hook;
218
- const prerenderResult = await execHookWithoutPageContext(() => hook.hookFn(), hook);
219
+ const prerenderResult = await execHookDirectWithoutPageContext(() => hook.hookFn(), hook);
219
220
  const result = normalizeOnPrerenderHookResult(prerenderResult, hookFilePath, hookName);
220
221
  // Handle result
221
222
  await Promise.all(result.map(async ({ url, pageContext }) => {
@@ -322,7 +323,7 @@ async function createPageContextPrerendering(urlOriginal, prerenderContext, glob
322
323
  routeParams: {},
323
324
  });
324
325
  }
325
- objectAssign(pageContext, await loadPageConfigsLazyServerSide(pageContext));
326
+ augmentType(pageContext, await loadPageConfigsLazyServerSideAndExecHook(pageContext));
326
327
  let usesClientRouter;
327
328
  {
328
329
  const { pageId } = pageContext;
@@ -443,7 +444,7 @@ async function callOnPrerenderStartHook(prerenderContext, globalContext, concurr
443
444
  preservePropertyGetters(pageContext);
444
445
  });
445
446
  const prerenderContextPublic = preparePrerenderContextForPublicUsage(prerenderContext);
446
- let result = await execHookWithoutPageContext(() => hookFn(prerenderContextPublic), onPrerenderStartHook);
447
+ let result = await execHookDirectWithoutPageContext(() => hookFn(prerenderContextPublic), onPrerenderStartHook);
447
448
  // Before applying result
448
449
  prerenderContext.pageContexts.forEach((pageContext) => {
449
450
  ;
@@ -725,9 +726,13 @@ function getRedirectHtml(urlTarget) {
725
726
  <meta charset="UTF-8">
726
727
  <meta http-equiv="refresh" content="0;url=${urlTargetSafe}">
727
728
  <title>Redirect ${urlTargetSafe}</title>
729
+ <style>body{opacity:0}</style>
730
+ <noscript>
731
+ <style>body{opacity:1}</style>
732
+ </noscript>
728
733
  </head>
729
734
  <body style="min-height: 100vh; margin: 0; font-family: sans-serif; display: flex; justify-content: center; align-items: center; transition: opacity 0.3s;">
730
- <script>document.body.style.opacity=0; setTimeout(()=>{document.body.style.opacity=1},1000);</script>
735
+ <script>setTimeout(()=>{document.body.style.opacity=1},2000)</script>
731
736
  <div>
732
737
  <h1>Redirect <a href="${urlTargetSafe}"><code style="background-color: #eaeaea; padding: 3px 5px; border-radius: 4px;">${urlTargetSafe}</code></a></h1>
733
738
  <p>If you aren't redirected, click the link above.</p>
@@ -160,9 +160,26 @@ async function getHtmlTags(pageContext, streamFromReactStreamingPackage, injectF
160
160
  }
161
161
  function mergeScriptEntries(pageAssets, viteDevScript) {
162
162
  const scriptEntries = pageAssets.filter((pageAsset) => pageAsset.isEntry && pageAsset.assetType === 'script');
163
- const scriptTagsHtml = `${viteDevScript}${scriptEntries.map((asset) => inferAssetTag(asset)).join('')}`;
164
- const scriptTag = mergeScriptTags(scriptTagsHtml);
165
- return scriptTag;
163
+ let scriptEntry = `${viteDevScript}${scriptEntries.map((asset) => inferAssetTag(asset)).join('')}`;
164
+ // We merge scripts to avoid the infamous HMR preamble error.
165
+ // - Infamous HMR preamble error:
166
+ // ```browser-console
167
+ // usePageContext.tsx:10 Uncaught (in promise) Error: @vitejs/plugin-react can't detect preamble. Something is wrong.
168
+ // at usePageContext.tsx:10:10
169
+ // ```
170
+ // - Note the following race condition. Maybe making the second script non-async ensures execution order?
171
+ // ```html
172
+ // <script type="module">console.log("I can be printed *after* the other log")</script>
173
+ // <script src="entry.js" type="module" async></script>
174
+ // ```
175
+ // ```js
176
+ // // entry.js
177
+ // console.log("I can be printed *before* the other log")
178
+ // ```
179
+ // - Maybe an alternative would be to make Vike's client runtime entry <script> tag non-async. Would that work? Would it be a performance issue?
180
+ // - The entry <script> shouldn't be `<script defer>` upon HTML streaming, otherwise progressive hydration while SSR streaming won't work.
181
+ scriptEntry = mergeScriptTags(scriptEntry);
182
+ return scriptEntry;
166
183
  }
167
184
  function getPageContextJsonScriptTag(pageContext) {
168
185
  const pageContextClientSerialized = sanitizeJson(getPageContextClientSerialized(pageContext));
@@ -19,7 +19,13 @@ function mergeScriptTags(scriptTagsHtml) {
19
19
  const hasInnerHtml = !!innerHtml.trim();
20
20
  if (src) {
21
21
  assert(!hasInnerHtml);
22
- contents.push(`import ${JSON.stringify(src)};`);
22
+ // - We don't use a static import because static imports are hoisted => React's HMR preamble can be executed after user land code => triggering this error:
23
+ // ```
24
+ // [22:28:57.885][/test-dev.test.ts][pnpm run dev][Browser Error] Error: @vitejs/plugin-react-swc can't detect preamble. Something is wrong.
25
+ // at http://localhost:3000/@fs/home/rom/code/docpress/src/renderer/usePageContext.tsx:9:11
26
+ // ```
27
+ // - We don't use `await` the dynamic import() to avoid waterfall
28
+ contents.push(`import(${JSON.stringify(src)});`);
23
29
  }
24
30
  else if (hasInnerHtml) {
25
31
  innerHtml = innerHtml.split('\n').filter(Boolean).join('\n');
@@ -8,7 +8,7 @@ export { createHttpResponseBaseIsMissing };
8
8
  export type { HttpResponse };
9
9
  import type { GetPageAssets } from './getPageAssets.js';
10
10
  import type { HtmlRender } from '../html/renderHtml.js';
11
- import type { RenderHook } from './executeOnRenderHtmlHook.js';
11
+ import type { RenderHook } from './execHookOnRenderHtml.js';
12
12
  import type { RedirectStatusCode, AbortStatusCode, UrlRedirect } from '../../../shared/route/abort.js';
13
13
  import { HttpResponseBody } from './getHttpResponseBody.js';
14
14
  import { type EarlyHint } from './getEarlyHints.js';
@@ -0,0 +1,6 @@
1
+ export { execHookDataAndOnBeforeRender };
2
+ import { type PageContextExecHookServer } from './execHookServer.js';
3
+ declare function execHookDataAndOnBeforeRender(pageContext: {
4
+ pageId: string;
5
+ _pageContextAlreadyProvidedByOnPrerenderHook?: true;
6
+ } & PageContextExecHookServer): Promise<void>;
@@ -1,7 +1,7 @@
1
- export { executeOnBeforeRenderAndDataHooks };
1
+ export { execHookDataAndOnBeforeRender };
2
2
  import { assertOnBeforeRenderHookReturn } from '../../../shared/assertOnBeforeRenderHookReturn.js';
3
3
  import { execHookServer } from './execHookServer.js';
4
- async function executeOnBeforeRenderAndDataHooks(pageContext) {
4
+ async function execHookDataAndOnBeforeRender(pageContext) {
5
5
  if (pageContext._pageContextAlreadyProvidedByOnPrerenderHook) {
6
6
  return;
7
7
  }
@@ -1,4 +1,4 @@
1
- export { executeOnRenderHtmlHook };
1
+ export { execHookOnRenderHtml };
2
2
  export type { RenderHook };
3
3
  import { type HtmlRender } from '../html/renderHtml.js';
4
4
  import { type Hook } from '../../../shared/hooks/getHook.js';
@@ -11,7 +11,7 @@ type RenderHook = Hook & {
11
11
  hookName: HookName;
12
12
  };
13
13
  type HookName = 'onRenderHtml' | 'render';
14
- declare function executeOnRenderHtmlHook(pageContext: PageContextForPublicUsageServer & PageContextSerialization & {
14
+ declare function execHookOnRenderHtml(pageContext: PageContextForPublicUsageServer & PageContextSerialization & {
15
15
  pageId: string;
16
16
  _globalContext: GlobalContextServerInternal;
17
17
  __getPageAssets: GetPageAssets;
@@ -1,4 +1,4 @@
1
- export { executeOnRenderHtmlHook };
1
+ export { execHookOnRenderHtml };
2
2
  import { isDocumentHtml, renderDocumentHtml, dangerouslySkipEscape, } from '../html/renderHtml.js';
3
3
  import { getHookFromPageContext } from '../../../shared/hooks/getHook.js';
4
4
  import { assert, assertUsage, assertWarning, isObject, objectAssign, isPromise, isCallable } from '../utils.js';
@@ -8,11 +8,11 @@ import { preparePageContextForPublicUsageServer, } from './preparePageContextFor
8
8
  import { assertHookReturnedObject } from '../../../shared/assertHookReturnedObject.js';
9
9
  import { logRuntimeError } from '../loggerRuntime.js';
10
10
  import pc from '@brillout/picocolors';
11
- import { execHookSingleWithReturn } from '../../../shared/hooks/execHook.js';
12
- async function executeOnRenderHtmlHook(pageContext) {
11
+ import { execHookDirectSingleWithReturn } from '../../../shared/hooks/execHook.js';
12
+ async function execHookOnRenderHtml(pageContext) {
13
13
  const hook = getRenderHook(pageContext);
14
14
  objectAssign(pageContext, { _renderHook: hook });
15
- const { hookReturn } = await execHookSingleWithReturn(hook, pageContext, preparePageContextForPublicUsageServer);
15
+ const { hookReturn } = await execHookDirectSingleWithReturn(hook, pageContext, preparePageContextForPublicUsageServer);
16
16
  const { documentHtml, pageContextProvidedByRenderHook, pageContextPromise, injectFilter } = processHookReturnValue(hookReturn, hook);
17
17
  Object.assign(pageContext, pageContextProvidedByRenderHook);
18
18
  objectAssign(pageContext, { _pageContextPromise: pageContextPromise });
@@ -1,10 +1,10 @@
1
1
  export { execHookServer };
2
- export type { PageContextExecuteHookServer };
2
+ export type { PageContextExecHookServer };
3
3
  import { type PageContextForPublicUsageServer } from './preparePageContextForPublicUsageServer.js';
4
4
  import type { VikeConfigPublicPageLazy } from '../../../shared/getPageFiles.js';
5
5
  import type { HookName } from '../../../types/Config.js';
6
- type PageContextExecuteHookServer = VikeConfigPublicPageLazy & PageContextForPublicUsageServer;
7
- declare function execHookServer(hookName: HookName, pageContext: PageContextExecuteHookServer): Promise<(import("../../../shared/hooks/getHook.js").HookLoc & {
6
+ type PageContextExecHookServer = VikeConfigPublicPageLazy & PageContextForPublicUsageServer;
7
+ declare function execHookServer(hookName: HookName, pageContext: PageContextExecHookServer): Promise<(import("../../../shared/hooks/getHook.js").HookLoc & {
8
8
  hookFn: (arg: import("../../../shared/preparePageContextForPublicUsage.js").PageContextPrepareMinimum | import("../../../shared/prepareGlobalContextForPublicUsage.js").GlobalContextPrepareMinimum) => unknown;
9
9
  hookTimeout: import("../../../shared/hooks/getHook.js").HookTimeout;
10
10
  } & {
@@ -2,8 +2,5 @@ export { execHookServer };
2
2
  import { execHook } from '../../../shared/hooks/execHook.js';
3
3
  import { preparePageContextForPublicUsageServer, } from './preparePageContextForPublicUsageServer.js';
4
4
  async function execHookServer(hookName, pageContext) {
5
- return await execHook(hookName, pageContext, (p) => {
6
- preparePageContextForPublicUsageServer(p);
7
- return p;
8
- });
5
+ return await execHook(hookName, pageContext, preparePageContextForPublicUsageServer);
9
6
  }
@@ -3,7 +3,7 @@ export { getHttpResponseBodyStreamHandlers };
3
3
  export type { HttpResponseBody };
4
4
  import { StreamPipeNode, StreamPipeWeb, StreamReadableNode, StreamReadableWeb, StreamWritableNode, StreamWritableWeb } from '../html/stream.js';
5
5
  import { type HtmlRender } from '../html/renderHtml.js';
6
- import type { RenderHook } from './executeOnRenderHtmlHook.js';
6
+ import type { RenderHook } from './execHookOnRenderHtml.js';
7
7
  type HttpResponseBody = {
8
8
  body: string;
9
9
  pipe: (writable: StreamWritableWeb | StreamWritableNode) => void;
@@ -1,18 +1,27 @@
1
- export { loadPageConfigsLazyServerSide };
2
- export type { PageFiles };
1
+ export { loadPageConfigsLazyServerSideAndExecHook };
3
2
  export type { PageContext_loadPageConfigsLazyServerSide };
3
+ export type { PageConfigsLazy };
4
4
  import { PromiseType } from '../utils.js';
5
5
  import { PageContextGetPageAssets, type PageAsset } from './getPageAssets.js';
6
6
  import { type PageContextDebugRouteMatches } from './debugPageFiles.js';
7
7
  import type { GlobalContextServerInternal } from '../globalContext.js';
8
+ import { type PageContextExecHookServer } from './execHookServer.js';
9
+ type PageContextExecuteHook = Omit<PageContextExecHookServer, keyof Awaited<ReturnType<typeof loadPageConfigsLazyServerSide>>>;
8
10
  type PageContext_loadPageConfigsLazyServerSide = PageContextGetPageAssets & PageContextDebugRouteMatches & {
11
+ pageId: string;
9
12
  urlOriginal: string;
10
13
  _globalContext: GlobalContextServerInternal;
11
14
  };
12
- type PageFiles = PromiseType<ReturnType<typeof loadPageConfigsLazyServerSide>>;
13
- declare function loadPageConfigsLazyServerSide(pageContext: {
14
- pageId: string;
15
- } & PageContext_loadPageConfigsLazyServerSide): Promise<import("../../../shared/getPageFiles.js").VikeConfigPublicPageLazy & {
15
+ type PageConfigsLazy = PromiseType<ReturnType<typeof loadPageConfigsLazyServerSide>>;
16
+ declare function loadPageConfigsLazyServerSideAndExecHook<PageContext extends PageContext_loadPageConfigsLazyServerSide & PageContextExecuteHook>(pageContext: PageContext): Promise<PageContext & import("../../../shared/getPageFiles.js").VikeConfigPublicPageLazy & {
17
+ Page: unknown;
18
+ _isHtmlOnly: boolean;
19
+ _passToClient: string[];
20
+ _pageFilePathsLoaded: string[];
21
+ } & {
22
+ __getPageAssets: () => Promise<PageAsset[]>;
23
+ }>;
24
+ declare function loadPageConfigsLazyServerSide(pageContext: PageContext_loadPageConfigsLazyServerSide): Promise<import("../../../shared/getPageFiles.js").VikeConfigPublicPageLazy & {
16
25
  Page: unknown;
17
26
  _isHtmlOnly: boolean;
18
27
  _passToClient: string[];
@@ -1,4 +1,4 @@
1
- export { loadPageConfigsLazyServerSide };
1
+ export { loadPageConfigsLazyServerSideAndExecHook };
2
2
  import { getPageFilesServerSide } from '../../../shared/getPageFiles.js';
3
3
  import { resolveVikeConfigPublicPageLazy } from '../../../shared/page-configs/resolveVikeConfigPublic.js';
4
4
  import { analyzePageClientSideInit } from '../../../shared/getPageFiles/analyzePageClientSide.js';
@@ -8,6 +8,13 @@ import { debugPageFiles } from './debugPageFiles.js';
8
8
  import { findPageConfig } from '../../../shared/page-configs/findPageConfig.js';
9
9
  import { analyzePage } from './analyzePage.js';
10
10
  import { loadConfigValues } from '../../../shared/page-configs/loadConfigValues.js';
11
+ import { execHookServer } from './execHookServer.js';
12
+ async function loadPageConfigsLazyServerSideAndExecHook(pageContext) {
13
+ const pageContextAddendum = await loadPageConfigsLazyServerSide(pageContext);
14
+ objectAssign(pageContext, pageContextAddendum);
15
+ await execHookServer('onCreatePageContext', pageContext);
16
+ return pageContext;
17
+ }
11
18
  async function loadPageConfigsLazyServerSide(pageContext) {
12
19
  const pageConfig = findPageConfig(pageContext._globalContext._pageConfigs, pageContext.pageId); // Make pageConfig globally available as pageContext._pageConfig ?
13
20
  const globalContext = pageContext._globalContext;
@@ -84,18 +91,16 @@ async function loadPageConfigsLazyServerSide(pageContext) {
84
91
  return pageAssetsOldFormat;
85
92
  },
86
93
  });
87
- {
88
- debugPageFiles({
89
- pageContext,
90
- isHtmlOnly,
91
- isClientRouting,
92
- pageFilesLoaded,
93
- pageFilesClientSide,
94
- pageFilesServerSide,
95
- clientEntries,
96
- clientDependencies,
97
- });
98
- }
94
+ debugPageFiles({
95
+ pageContext,
96
+ isHtmlOnly,
97
+ isClientRouting,
98
+ pageFilesLoaded,
99
+ pageFilesClientSide,
100
+ pageFilesServerSide,
101
+ clientEntries,
102
+ clientDependencies,
103
+ });
99
104
  return pageContextAddendum;
100
105
  }
101
106
  async function loadPageUserFiles(pageFilesAll, pageConfig, pageConfigGlobal, pageId, isDev) {
@@ -3,7 +3,7 @@ export { prerenderPage };
3
3
  export type { PageContextAfterRender };
4
4
  import { type PageContextUrlInternal } from '../../../shared/getPageContextUrlComputed.js';
5
5
  import { HttpResponse } from './createHttpResponse.js';
6
- import { PageContext_loadPageConfigsLazyServerSide, type PageFiles } from './loadPageConfigsLazyServerSide.js';
6
+ import { PageContext_loadPageConfigsLazyServerSide, type PageConfigsLazy } from './loadPageConfigsLazyServerSide.js';
7
7
  import type { PageContextCreated } from './createPageContextServerSide.js';
8
8
  type PageContextAfterRender = {
9
9
  httpResponse: HttpResponse;
@@ -17,7 +17,7 @@ declare function renderPageAlreadyRouted<PageContext extends {
17
17
  errorWhileRendering: null | Error;
18
18
  _httpRequestId: number;
19
19
  } & PageContextCreated & PageContextUrlInternal & PageContext_loadPageConfigsLazyServerSide>(pageContext: PageContext): Promise<PageContext & PageContextAfterRender>;
20
- declare function prerenderPage(pageContext: PageContextCreated & PageFiles & {
20
+ declare function prerenderPage(pageContext: PageContextCreated & PageConfigsLazy & {
21
21
  routeParams: Record<string, string>;
22
22
  pageId: string;
23
23
  _urlRewrite: null;