vike 0.4.250-commit-193dea3 → 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 (32) hide show
  1. package/dist/client/runtime-client-routing/createPageContextClientSide.d.ts +19 -1
  2. package/dist/client/runtime-client-routing/createPageContextClientSide.js +19 -11
  3. package/dist/client/runtime-client-routing/getPageContextFromHooks.d.ts +58 -70
  4. package/dist/client/runtime-client-routing/renderPageClient.d.ts +100 -98
  5. package/dist/client/runtime-server-routing/createPageContextClientSide.d.ts +14 -1
  6. package/dist/client/runtime-server-routing/createPageContextClientSide.js +10 -4
  7. package/dist/node/prerender/runPrerender.d.ts +2 -5
  8. package/dist/node/prerender/runPrerender.js +2 -2
  9. package/dist/node/vite/shared/resolveVikeConfigInternal/configDefinitionsBuiltIn.js +5 -0
  10. package/dist/server/runtime/logErrorServer.d.ts +2 -2
  11. package/dist/server/runtime/loggerRuntime.d.ts +2 -2
  12. package/dist/server/runtime/renderPageServer/createPageContextServerSide.d.ts +12 -10
  13. package/dist/server/runtime/renderPageServer/createPageContextServerSide.js +11 -11
  14. package/dist/server/runtime/renderPageServer/execHookOnError.d.ts +2 -2
  15. package/dist/server/runtime/renderPageServer/execHookOnError.js +3 -1
  16. package/dist/server/runtime/renderPageServer/loadPageConfigsLazyServerSide.d.ts +1 -4
  17. package/dist/server/runtime/renderPageServer/renderPageServerAfterRoute.d.ts +4 -16
  18. package/dist/server/runtime/renderPageServer.d.ts +2 -9
  19. package/dist/shared-server-client/createGlobalContextShared.js +1 -1
  20. package/dist/shared-server-client/createPageContextShared.d.ts +12 -2
  21. package/dist/shared-server-client/createPageContextShared.js +1 -0
  22. package/dist/shared-server-client/getPageContextUrlComputed.d.ts +5 -2
  23. package/dist/shared-server-client/hooks/execHook.d.ts +5 -7
  24. package/dist/shared-server-client/hooks/execHook.js +77 -12
  25. package/dist/shared-server-client/prepareGlobalContextForPublicUsage.d.ts +2 -0
  26. package/dist/shared-server-client/preparePageContextForPublicUsage.d.ts +2 -3
  27. package/dist/types/Config.d.ts +10 -1
  28. package/dist/types/Config.js +1 -0
  29. package/dist/types/PageContext.d.ts +33 -26
  30. package/dist/utils/PROJECT_VERSION.d.ts +1 -1
  31. package/dist/utils/PROJECT_VERSION.js +1 -1
  32. package/package.json +1 -1
@@ -1,10 +1,10 @@
1
1
  export { createPageContextServerSide };
2
2
  export { createPageContextServerSideWithoutGlobalContext };
3
3
  export type { PageContextCreatedServer };
4
- export type { PageContextCreatedServerMinimum };
4
+ export type { PageContextCreatedServerBase };
5
5
  import type { GlobalContextServerInternal } from '../globalContext.js';
6
6
  import type { PageContextInit } from '../renderPageServer.js';
7
- type PageContextCreatedServerMinimum = ReturnType<typeof createPageContextServerSideWithoutGlobalContext>;
7
+ type PageContextCreatedServerBase = ReturnType<typeof createPageContextBase>;
8
8
  type PageContextCreatedServer = Awaited<ReturnType<typeof createPageContextServerSide>>;
9
9
  declare function createPageContextServerSide(pageContextInit: PageContextInit, globalContext: GlobalContextServerInternal, args: {
10
10
  requestId: number;
@@ -21,10 +21,7 @@ declare function createPageContextServerSide(pageContextInit: PageContextInit, g
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
+ } & PageContextInit & {
28
25
  _globalContext: ({
29
26
  _globalConfigPublic: {
30
27
  pages: {
@@ -156,7 +153,12 @@ declare function createPageContextServerSideWithoutGlobalContext(pageContextInit
156
153
  isClientSide: false;
157
154
  isPrerendering: boolean;
158
155
  _requestId: number;
159
- } & Pick<import("../../../types/PageContext.js").PageContextInternalServer, "urlOriginal" | "headersOriginal"> & {
160
- url?: string;
161
- headers?: Record<string, string>;
162
- };
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,18 +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
44
  /** Use this as last resort — prefer passing richer `pageContext` objects to the runtime logger */
45
45
  function createPageContextServerSideWithoutGlobalContext(pageContextInit, requestId) {
46
- const pageContext = createPageContext(pageContextInit, false, requestId);
46
+ const pageContext = createPageContextBase(pageContextInit, false, requestId);
47
47
  return pageContext;
48
48
  }
49
- function createPageContext(pageContextInit, isPrerendering, requestId) {
49
+ function createPageContextBase(pageContextInit, isPrerendering, requestId) {
50
50
  const pageContext = createPageContextObject();
51
51
  objectAssign(pageContext, {
52
52
  isClientSide: false,
@@ -1,3 +1,3 @@
1
1
  export { execHookOnError };
2
- import type { PageContextCreatedServerMinimum } from './createPageContextServerSide.js';
3
- declare function execHookOnError(err: unknown, pageContext: PageContextCreatedServerMinimum | null): 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);
@@ -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: {
@@ -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: {
@@ -365,10 +359,7 @@ declare function prerenderPageEntry(pageContext: PageContextCreatedServer & Page
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: PageContextCreatedServer & Page
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,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: {
@@ -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) {
@@ -1,8 +1,18 @@
1
1
  export { createPageContextShared };
2
2
  export { createPageContextObject };
3
+ export type { PageContextCreated };
4
+ export type { PageContextCreatedBase };
3
5
  import type { GlobalConfigPublic } from './page-configs/resolveVikeConfigPublic.js';
4
- import { type PageContextPrepareMinimum } from './preparePageContextForPublicUsage.js';
5
- declare function createPageContextShared<T extends PageContextPrepareMinimum>(pageContextCreated: T, globalConfigPublic: GlobalConfigPublic): T & GlobalConfigPublic;
6
+ import type { PageContextCreatedClient } from '../client/runtime-client-routing/createPageContextClientSide.js';
7
+ import type { PageContextCreatedServer } from '../server/runtime/renderPageServer/createPageContextServerSide.js';
8
+ import type { PageContextCreatedClient_ServerRouting } from '../client/runtime-server-routing/createPageContextClientSide.js';
9
+ type PageContextCreated = PageContextCreatedServer | PageContextCreatedClient | PageContextCreatedClient_ServerRouting;
10
+ type PageContextCreatedBase = {
11
+ _isOriginalObject: true;
12
+ isPageContext: true;
13
+ isClientSide: boolean;
14
+ };
15
+ declare function createPageContextShared<T extends Record<string, unknown>>(pageContextCreated: T, globalConfigPublic: GlobalConfigPublic): T & GlobalConfigPublic;
6
16
  declare function createPageContextObject(): {
7
17
  _isOriginalObject: true;
8
18
  isPageContext: true;
@@ -1,6 +1,7 @@
1
1
  export { createPageContextShared };
2
2
  export { createPageContextObject };
3
3
  import { changeEnumerable, objectAssign } from './utils.js';
4
+ //*/
4
5
  function createPageContextShared(pageContextCreated, globalConfigPublic) {
5
6
  objectAssign(pageContextCreated, globalConfigPublic);
6
7
  return pageContextCreated;
@@ -3,8 +3,9 @@ export type { PageContextUrlInternal };
3
3
  export type { PageContextUrlClient };
4
4
  export type { PageContextUrlServer };
5
5
  export type { PageContextUrlSource };
6
- import { type PageContextPrepareMinimum } from './preparePageContextForPublicUsage.js';
7
6
  import { type UrlPublic } from './utils.js';
7
+ import type { GlobalContextPrepareMinimum } from './prepareGlobalContextForPublicUsage.js';
8
+ import type { PageContextCreatedBase } from './createPageContextShared.js';
8
9
  type PageContextUrlComputed = {
9
10
  /** Parsed information about the current URL */
10
11
  urlParsed: UrlPublic;
@@ -17,8 +18,10 @@ type PageContextUrl = {
17
18
  /** The URL of the HTTP request */
18
19
  urlOriginal: string;
19
20
  } & PageContextUrlComputed;
20
- type PageContextUrlInternal = PageContextPrepareMinimum & PageContextUrl & {
21
+ type PageContextUrlInternal = PageContextUrl & {
21
22
  _urlRewrite?: string;
23
+ } & PageContextCreatedBase & {
24
+ _globalContext: GlobalContextPrepareMinimum;
22
25
  };
23
26
  type PageContextUrlClient = PageContextUrl;
24
27
  type PageContextUrlServer = PageContextUrl & {
@@ -5,6 +5,7 @@ export { execHookDirectSingle };
5
5
  export { execHookDirectSingleWithReturn };
6
6
  export { execHookDirectWithoutPageContext };
7
7
  export { execHookDirectSync };
8
+ export { execHookBase };
8
9
  export { getPageContext_sync };
9
10
  export { providePageContext };
10
11
  export { isUserHookError };
@@ -13,32 +14,29 @@ import type { PageContextClient, PageContextServer } from '../../types/PageConte
13
14
  import type { Hook, HookLoc } from './getHook.js';
14
15
  import type { PageContextConfig } from '../getPageFiles.js';
15
16
  import type { HookName, HookNameGlobal } from '../../types/Config.js';
16
- import type { PageConfigGlobalRuntime } from '../../types/PageConfig.js';
17
+ import type { PageContextCreated } from '../createPageContextShared.js';
17
18
  import type { PageContextForPublicUsageServer } from '../../server/runtime/renderPageServer/preparePageContextForPublicUsageServer.js';
18
19
  import type { PageContextForPublicUsageClientShared } from '../../client/shared/preparePageContextForPublicUsageClientShared.js';
19
20
  import { type PageContextPrepareMinimum } from '../preparePageContextForPublicUsage.js';
20
21
  import type { GlobalContextPrepareMinimum } from '../prepareGlobalContextForPublicUsage.js';
21
- import type { PageContextCreatedClient } from '../../client/runtime-client-routing/createPageContextClientSide.js';
22
- import type { PageContextCreatedServer } from '../../server/runtime/renderPageServer/createPageContextServerSide.js';
23
- import type { PageContextCreatedClient_ServerRouting } from '../../client/runtime-server-routing/createPageContextClientSide.js';
24
22
  type PageContextExecHook = PageContextCreated & PageContextConfig & PageContextForPublicUsage;
25
- type PageContextCreated = PageContextCreatedServer | PageContextCreatedClient | PageContextCreatedClient_ServerRouting;
26
23
  type PageContextForPublicUsage = PageContextForPublicUsageServer | PageContextForPublicUsageClientShared;
27
24
  type HookWithResult = Hook & {
28
25
  hookReturn: unknown;
29
26
  };
30
27
  declare function execHook<PageContext extends PageContextExecHook>(hookName: HookName, pageContext: PageContext, preparePageContextForPublicUsage: (pageContext: PageContext) => PageContext): Promise<HookWithResult[]>;
31
- declare function execHookGlobal<HookArg extends GlobalContextPrepareMinimum>(hookName: HookNameGlobal, pageConfigGlobal: PageConfigGlobalRuntime, pageContext: PageContextPrepareMinimum | null, hookArg: HookArg, prepareForPublicUsage: (hookArg: HookArg) => HookArg): Promise<void>;
28
+ declare function execHookGlobal<HookArg extends GlobalContextPrepareMinimum>(hookName: HookNameGlobal, globalContext: GlobalContextPrepareMinimum, pageContext: PageContextPrepareMinimum | null, hookArg: HookArg, prepareForPublicUsage: (hookArg: HookArg) => HookArg): Promise<void>;
32
29
  declare function execHookDirect<PageContext extends PageContextPrepareMinimum>(hooks: Hook[], pageContext: PageContext, preparePageContextForPublicUsage: (pageContext: PageContext) => PageContext): Promise<HookWithResult[]>;
33
30
  declare function execHookDirectSingle<PageContext extends PageContextExecHook>(hook: Hook, pageContext: PageContext, preparePageContextForPublicUsage: (pageContext: PageContext) => PageContext): Promise<void>;
34
31
  declare function execHookDirectSingleWithReturn<PageContext extends PageContextExecHook>(hook: Hook, pageContext: PageContext, preparePageContextForPublicUsage: (pageContext: PageContext) => PageContext): Promise<{
35
32
  hookReturn: unknown;
36
33
  }>;
37
34
  declare function isUserHookError(err: unknown): false | HookLoc;
38
- declare function execHookDirectWithoutPageContext<HookReturn>(hookFnCaller: () => HookReturn, hook: Omit<Hook, 'hookFn'>): Promise<HookReturn>;
35
+ declare function execHookDirectWithoutPageContext<HookReturn>(hookFnCaller: () => HookReturn, hook: Omit<Hook, 'hookFn'>, globalContext: GlobalContextPrepareMinimum): Promise<HookReturn>;
39
36
  declare function execHookDirectSync<PageContext extends PageContextPrepareMinimum>(hook: Omit<Hook, 'hookTimeout'>, pageContext: PageContext, preparePageContextForPublicUsage: (pageContext: PageContext) => PageContext): {
40
37
  hookReturn: unknown;
41
38
  };
39
+ declare function execHookBase<HookReturn>(hookFnCaller: () => HookReturn, hook: Omit<Hook, 'hookTimeout' | 'hookFn'>, globalContext: GlobalContextPrepareMinimum, pageContext: PageContextPrepareMinimum | null): HookReturn | Promise<HookReturn>;
42
40
  declare function getPageContext_sync<PageContext = PageContextClient | PageContextServer>(): null | PageContext;
43
41
  /**
44
42
  * Provide `pageContext` for universal hooks.
@@ -1,3 +1,4 @@
1
+ // TODO: rename all exports
1
2
  export { execHook };
2
3
  export { execHookGlobal };
3
4
  export { execHookDirect };
@@ -5,10 +6,12 @@ export { execHookDirectSingle };
5
6
  export { execHookDirectSingleWithReturn };
6
7
  export { execHookDirectWithoutPageContext };
7
8
  export { execHookDirectSync };
9
+ export { execHookBase };
8
10
  export { getPageContext_sync };
9
11
  export { providePageContext };
10
12
  export { isUserHookError };
11
- import { getProjectError, assertWarning, assertUsage } from '../../utils/assert.js';
13
+ // TODO: minor refactor maybe completely remove (some) utils.js files?
14
+ import { assert, getProjectError, assertWarning, assertUsage } from '../../utils/assert.js';
12
15
  import { getGlobalObject } from '../../utils/getGlobalObject.js';
13
16
  import { humanizeTime } from '../../utils/humanizeTime.js';
14
17
  import { isObject } from '../../utils/isObject.js';
@@ -18,15 +21,16 @@ const globalObject = getGlobalObject('utils/execHook.ts', {
18
21
  userHookErrors: new WeakMap(),
19
22
  pageContext: null,
20
23
  });
24
+ // TODO/refactor: export new type PageContextExecHookMinimum instead of PageContextPrepareMinimum ?
21
25
  async function execHook(hookName, pageContext, preparePageContextForPublicUsage) {
22
26
  const hooks = getHookFromPageContextNew(hookName, pageContext);
23
27
  return await execHookDirect(hooks, pageContext, preparePageContextForPublicUsage);
24
28
  }
25
- async function execHookGlobal(hookName, pageConfigGlobal, pageContext, hookArg, prepareForPublicUsage) {
26
- const hooks = getHookFromPageConfigGlobalCumulative(pageConfigGlobal, hookName);
29
+ async function execHookGlobal(hookName, globalContext, pageContext, hookArg, prepareForPublicUsage) {
30
+ const hooks = getHookFromPageConfigGlobalCumulative(globalContext._pageConfigGlobal, hookName);
27
31
  const hookArgForPublicUsage = prepareForPublicUsage(hookArg);
28
32
  await Promise.all(hooks.map(async (hook) => {
29
- await execHookDirectAsync(() => hook.hookFn(hookArgForPublicUsage), hook, pageContext);
33
+ await execHookDirectAsync(() => hook.hookFn(hookArgForPublicUsage), hook, globalContext, pageContext);
30
34
  }));
31
35
  }
32
36
  async function execHookDirect(hooks, pageContext, preparePageContextForPublicUsage) {
@@ -34,7 +38,7 @@ async function execHookDirect(hooks, pageContext, preparePageContextForPublicUsa
34
38
  return [];
35
39
  const pageContextForPublicUsage = preparePageContextForPublicUsage(pageContext);
36
40
  const hooksWithResult = await Promise.all(hooks.map(async (hook) => {
37
- const hookReturn = await execHookDirectAsync(() => hook.hookFn(pageContextForPublicUsage), hook, pageContextForPublicUsage);
41
+ const hookReturn = await execHookDirectAsync(() => hook.hookFn(pageContextForPublicUsage), hook, pageContext._globalContext, pageContextForPublicUsage);
38
42
  return { ...hook, hookReturn };
39
43
  }));
40
44
  return hooksWithResult;
@@ -54,12 +58,12 @@ function isUserHookError(err) {
54
58
  return false;
55
59
  return globalObject.userHookErrors.get(err) ?? false;
56
60
  }
57
- async function execHookDirectWithoutPageContext(hookFnCaller, hook) {
61
+ async function execHookDirectWithoutPageContext(hookFnCaller, hook, globalContext) {
58
62
  const { hookName, hookFilePath, hookTimeout } = hook;
59
- const hookReturn = await execHookDirectAsync(hookFnCaller, { hookName, hookFilePath, hookTimeout }, null);
63
+ const hookReturn = await execHookDirectAsync(hookFnCaller, { hookName, hookFilePath, hookTimeout }, globalContext, null);
60
64
  return hookReturn;
61
65
  }
62
- function execHookDirectAsync(hookFnCaller, hook, pageContextForPublicUsage) {
66
+ function execHookDirectAsync(hookFnCaller, hook, globalContext, pageContextForPublicUsage) {
63
67
  const { hookName, hookFilePath, hookTimeout: { error: timeoutErr, warning: timeoutWarn }, } = hook;
64
68
  let resolve;
65
69
  let reject;
@@ -90,8 +94,7 @@ function execHookDirectAsync(hookFnCaller, hook, pageContextForPublicUsage) {
90
94
  }, timeoutErr);
91
95
  (async () => {
92
96
  try {
93
- providePageContextInternal(pageContextForPublicUsage);
94
- const ret = await hookFnCaller();
97
+ const ret = await execHookBase(hookFnCaller, hook, globalContext, pageContextForPublicUsage);
95
98
  resolve(ret);
96
99
  }
97
100
  catch (err) {
@@ -105,10 +108,72 @@ function execHookDirectAsync(hookFnCaller, hook, pageContextForPublicUsage) {
105
108
  }
106
109
  function execHookDirectSync(hook, pageContext, preparePageContextForPublicUsage) {
107
110
  const pageContextForPublicUsage = preparePageContextForPublicUsage(pageContext);
108
- providePageContextInternal(pageContextForPublicUsage);
109
- const hookReturn = hook.hookFn(pageContextForPublicUsage);
111
+ const hookReturn = execHookBase(() => hook.hookFn(pageContextForPublicUsage), hook, pageContext._globalContext, pageContextForPublicUsage);
110
112
  return { hookReturn };
111
113
  }
114
+ // Every execHook* variant should call this
115
+ function execHookBase(hookFnCaller, hook, globalContext, pageContext) {
116
+ const { hookName, hookFilePath } = hook;
117
+ assert(hookName !== 'onHookCall'); // ensure no infinite loop
118
+ const configValue = globalContext._pageConfigGlobal.configValues['onHookCall'];
119
+ const callOriginal = () => {
120
+ providePageContextInternal(pageContext);
121
+ return hookFnCaller();
122
+ };
123
+ // +onHookCall doesn't exist
124
+ if (!configValue?.value)
125
+ return callOriginal();
126
+ // +onHookCall wrapping
127
+ let originalCalled = false;
128
+ let originalReturn;
129
+ let originalError;
130
+ let call = () => {
131
+ originalCalled = true;
132
+ try {
133
+ originalReturn = callOriginal();
134
+ }
135
+ catch (err) {
136
+ originalError = err;
137
+ }
138
+ return originalReturn;
139
+ };
140
+ for (const onHookCall of configValue.value) {
141
+ const hookPublic = { name: hookName, filePath: hookFilePath, call };
142
+ // Recursively wrap callOriginal() so +onHookCall can use async hooks. (E.g. vike-react-sentry integrates Sentry's `Tracer.startActiveSpan()`.)
143
+ call = () => {
144
+ ;
145
+ (async () => {
146
+ try {
147
+ await onHookCall(hookPublic, pageContext);
148
+ }
149
+ catch (err) {
150
+ console.error(err);
151
+ /* TO-DO/eventually: use dependency injection to be able to use logErrorServer() when this function runs on the server-side.
152
+ if (
153
+ !globalThis.__VIKE__IS_CLIENT &&
154
+ pageContext &&
155
+ // Avoid infinite loop
156
+ hookName !== 'onError'
157
+ ) {
158
+ assert(!pageContext.isClientSide)
159
+ logErrorServer(err, pageContext)
160
+ } else {
161
+ logErrorClient(err)
162
+ }
163
+ //*/
164
+ }
165
+ })();
166
+ // +onHookCall must run hook.call() before any `await` — https://github.com/vikejs/vike/pull/2978#discussion_r2645232953
167
+ assertUsage(originalCalled, 'onHookCall() must run hook.call()');
168
+ return originalReturn;
169
+ };
170
+ }
171
+ // Start the call() chain
172
+ call();
173
+ if (originalError)
174
+ throw originalError;
175
+ return originalReturn;
176
+ }
112
177
  function isNotDisabled(timeout) {
113
178
  return !!timeout && timeout !== Infinity;
114
179
  }
@@ -1,8 +1,10 @@
1
1
  export { prepareGlobalContextForPublicUsage };
2
2
  export type { GlobalContextPrepareMinimum };
3
+ import type { PageConfigGlobalRuntime } from '../types/PageConfig.js';
3
4
  type GlobalContextPrepareMinimum = {
4
5
  _isOriginalObject: true;
5
6
  isGlobalContext: true;
7
+ _pageConfigGlobal: PageConfigGlobalRuntime;
6
8
  };
7
9
  declare function prepareGlobalContextForPublicUsage<GlobalContext extends GlobalContextPrepareMinimum>(globalContext: GlobalContext): GlobalContext & {
8
10
  _isProxyObject: true;
@@ -2,11 +2,10 @@ export { preparePageContextForPublicUsage };
2
2
  export { assertPropertyGetters };
3
3
  export type { PageContextPrepareMinimum };
4
4
  import { type GlobalContextPrepareMinimum } from './prepareGlobalContextForPublicUsage.js';
5
+ import type { PageContextCreatedBase } from './createPageContextShared.js';
5
6
  type PageContextPrepareMinimum = {
6
- _isOriginalObject: true;
7
- isPageContext: true;
8
7
  _globalContext: GlobalContextPrepareMinimum;
9
- };
8
+ } & PageContextCreatedBase;
10
9
  declare function preparePageContextForPublicUsage<PageContext extends PageContextPrepareMinimum>(pageContext: PageContext): PageContext & {
11
10
  _isProxyObject: true;
12
11
  _originalObject: PageContext;
@@ -51,7 +51,7 @@ import type { ImportStringList } from '../node/vite/shared/importString.js';
51
51
  type HookNameOld = HookName | HookNameOldDesign;
52
52
  type HookName = HookNamePage | HookNameGlobal;
53
53
  type HookNamePage = 'onHydrationEnd' | 'onBeforePrerenderStart' | 'onBeforeRender' | 'onPageTransitionStart' | 'onPageTransitionEnd' | 'onRenderHtml' | 'onRenderClient' | 'guard' | 'data' | 'onData' | 'route';
54
- type HookNameGlobal = 'onBeforeRoute' | 'onPrerenderStart' | 'onCreatePageContext' | 'onCreateGlobalContext' | 'onError';
54
+ type HookNameGlobal = 'onBeforeRoute' | 'onPrerenderStart' | 'onCreatePageContext' | 'onCreateGlobalContext' | 'onError' | 'onHookCall';
55
55
  type HookNameOldDesign = 'render' | 'prerender' | 'onBeforePrerender';
56
56
  type ConfigNameBuiltIn = Exclude<keyof ConfigBuiltIn, keyof VikeVitePluginOptions | 'onBeforeRoute' | 'onPrerenderStart' | 'vite' | 'redirects'> | 'prerender' | 'hasServerOnlyHook' | 'isClientRuntimeLoaded' | 'onBeforeRenderEnv' | 'dataEnv' | 'guardEnv' | 'hooksTimeout' | 'clientHooks' | 'middleware';
57
57
  type ConfigNameGlobal = 'onPrerenderStart' | 'onBeforeRoute' | 'prerender' | 'disableAutoFullBuild' | 'includeAssetsImportedByServer' | 'baseAssets' | 'baseServer' | 'redirects' | 'trailingSlash' | 'disableUrlNormalization' | 'vite';
@@ -361,6 +361,15 @@ type ConfigBuiltIn = {
361
361
  * https://vike.dev/onCreateGlobalContext
362
362
  */
363
363
  onCreateGlobalContext?: ((globalContext: GlobalContext) => void) | ImportStringList | null;
364
+ /** Called whenever a hook is called.
365
+ *
366
+ * https://vike.dev/onHookCall
367
+ */
368
+ onHookCall?: ((hook: {
369
+ name: HookName;
370
+ filePath: string;
371
+ call: () => void | Promise<void>;
372
+ }, pageContext: PageContextClient | PageContextServer | null) => void | Promise<void>) | ImportStringList;
364
373
  /** Hook for fetching data.
365
374
  *
366
375
  * https://vike.dev/data
@@ -1 +1,2 @@
1
+ // TODO: rename 'Hook called' Called
1
2
  export {};
@@ -7,6 +7,7 @@ export type { PageContextInternalServer };
7
7
  export type { PageContextInternalClient };
8
8
  export type { PageContextInternalClient_ServerRouting };
9
9
  export type { PageContextInternalClient_ClientRouting };
10
+ export type { PageContextInit };
10
11
  export type { PageContextBuiltInServer_deprecated as PageContextBuiltInServer };
11
12
  export type { PageContextBuiltInClientWithClientRouting_deprecated as PageContextBuiltInClientWithClientRouting };
12
13
  export type { PageContextBuiltInClientWithServerRouting_deprecated as PageContextBuiltInClientWithServerRouting };
@@ -56,29 +57,6 @@ type PageContextBuiltInCommon<Data> = PageContextConfig & {
56
57
  * https://vike.dev/pageContext#data
57
58
  */
58
59
  data: Data;
59
- /** The URL you provided to Vike when calling `renderPage({ urlOriginal })` in your server middleware.
60
- *
61
- * https://vike.dev/renderPage
62
- */
63
- urlOriginal: string;
64
- /**
65
- * The HTTP request headers.
66
- *
67
- * As a string object normalized by Vike.
68
- *
69
- * https://vike.dev/headers
70
- * https://vike.dev/pageContext#headers
71
- */
72
- headers: Record<string, string> | null;
73
- /**
74
- * The HTTP request headers.
75
- *
76
- * The original object provided by the server.
77
- *
78
- * https://vike.dev/headers
79
- * https://vike.dev/pageContext#headersOriginal
80
- */
81
- headersOriginal?: unknown;
82
60
  /**
83
61
  * The HTTP response headers.
84
62
  *
@@ -128,8 +106,6 @@ type PageContextBuiltInCommon<Data> = PageContextConfig & {
128
106
  /** @experimental https://github.com/vikejs/vike/issues/1268 */
129
107
  sources: Sources;
130
108
  /** @deprecated */
131
- url: string;
132
- /** @deprecated */
133
109
  pageExports: Record<string, unknown>;
134
110
  /**
135
111
  * Whether the Base URL is missing in the URL of the HTTP request made to the SSR server.
@@ -139,7 +115,34 @@ type PageContextBuiltInCommon<Data> = PageContextConfig & {
139
115
  */
140
116
  isBaseMissing?: true;
141
117
  };
142
- type PageContextBuiltInServer<Data> = PageContextBuiltInCommon<Data> & PageContextUrlServer & {
118
+ type PageContextInit = {
119
+ /** The URL provided when `renderPage({ urlOriginal })` is called.
120
+ *
121
+ * https://vike.dev/renderPage
122
+ */
123
+ urlOriginal: string;
124
+ /**
125
+ * The HTTP request headers.
126
+ *
127
+ * The original object provided by the server.
128
+ *
129
+ * https://vike.dev/headers
130
+ * https://vike.dev/pageContext#headersOriginal
131
+ */
132
+ headersOriginal?: unknown;
133
+ /** @deprecated Set `pageContextInit.urlOriginal` instead */ url?: string;
134
+ /** @deprecated Set pageContextInit.headersOriginal instead */ headers?: Record<string, string>;
135
+ };
136
+ type PageContextBuiltInServer<Data> = PageContextBuiltInCommon<Data> & PageContextInit & PageContextUrlServer & {
137
+ /**
138
+ * The HTTP request headers.
139
+ *
140
+ * As a string object normalized by Vike.
141
+ *
142
+ * https://vike.dev/headers
143
+ * https://vike.dev/pageContext#headers
144
+ */
145
+ headers: Record<string, string> | null;
143
146
  /**
144
147
  * Whether the environment is the client-side:
145
148
  * - In the browser, the value is `true`.
@@ -182,6 +185,10 @@ type PageContextBuiltInServer<Data> = PageContextBuiltInCommon<Data> & PageConte
182
185
  previousPageContext?: undefined;
183
186
  };
184
187
  type PageContextBuiltInClientWithClientRouting<Data> = Partial<PageContextBuiltInCommon<Data>> & Pick<PageContextBuiltInCommon<Data>, 'Page' | 'routeParams' | 'pageExports' | 'config' | 'configEntries' | 'exports' | 'exportsAll' | 'abortReason' | 'data' | 'pageId' | 'source' | 'sources' | 'from'> & PageContextClientCommon & {
188
+ /**
189
+ * The current URL unprocessed (e.g. with the Base URL).
190
+ */
191
+ urlOriginal: string;
185
192
  /**
186
193
  * Whether the page is the first page rendered.
187
194
  *
@@ -1 +1 @@
1
- export declare const PROJECT_VERSION: "0.4.250-commit-193dea3";
1
+ export declare const PROJECT_VERSION: "0.4.250-commit-6161324";
@@ -1,2 +1,2 @@
1
1
  // Automatically updated by @brillout/release-me
2
- export const PROJECT_VERSION = '0.4.250-commit-193dea3';
2
+ export const PROJECT_VERSION = '0.4.250-commit-6161324';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vike",
3
- "version": "0.4.250-commit-193dea3",
3
+ "version": "0.4.250-commit-6161324",
4
4
  "repository": "https://github.com/vikejs/vike",
5
5
  "exports": {
6
6
  "./server": {