vike 0.4.259 → 0.4.260

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 (83) hide show
  1. package/AGENTS.md +3 -0
  2. package/README.md +2 -0
  3. package/dist/client/runtime-client-routing/renderPageClient.js +1 -1
  4. package/dist/client/shared/getJsonSerializedInHtml.js +1 -10
  5. package/dist/node/api/build.js +6 -6
  6. package/dist/node/api/dev.d.ts +2 -10
  7. package/dist/node/api/dev.js +5 -52
  8. package/dist/node/api/prepareViteApiCall.d.ts +1 -1
  9. package/dist/node/api/prepareViteApiCall.js +2 -2
  10. package/dist/node/api/prerender.js +2 -2
  11. package/dist/node/api/preview.d.ts +2 -2
  12. package/dist/node/api/preview.js +15 -16
  13. package/dist/node/api/{resolveViteConfigFromUser.d.ts → resolveViteConfigUser.d.ts} +5 -5
  14. package/dist/node/api/{resolveViteConfigFromUser.js → resolveViteConfigUser.js} +99 -68
  15. package/dist/node/api/startupLog.d.ts +4 -0
  16. package/dist/node/api/{getStartupLogFirstLine.js → startupLog.js} +15 -1
  17. package/dist/node/api/types.d.ts +9 -0
  18. package/dist/node/cli/entry.js +1 -5
  19. package/dist/node/cli/parseCli.js +25 -11
  20. package/dist/node/createDevMiddleware.js +2 -2
  21. package/dist/node/prerender/runPrerender.d.ts +8 -2
  22. package/dist/node/prerender/runPrerender.js +3 -1
  23. package/dist/node/prerender/runPrerenderEntry.js +2 -2
  24. package/dist/node/vite/index.js +2 -2
  25. package/dist/node/vite/plugins/build/handleAssetsManifest.d.ts +2 -6
  26. package/dist/node/vite/plugins/build/handleAssetsManifest.js +16 -9
  27. package/dist/node/vite/plugins/build/pluginBuildApp.js +10 -5
  28. package/dist/node/vite/plugins/build/pluginBuildConfig.d.ts +6 -1
  29. package/dist/node/vite/plugins/build/pluginBuildConfig.js +13 -11
  30. package/dist/node/vite/plugins/build/pluginDistFileNames.js +1 -6
  31. package/dist/node/vite/plugins/build/pluginModuleBanner.js +2 -4
  32. package/dist/node/vite/plugins/pluginCommon.d.ts +1 -1
  33. package/dist/node/vite/plugins/pluginCommon.js +15 -7
  34. package/dist/node/vite/plugins/pluginDev/optimizeDeps.js +67 -31
  35. package/dist/node/vite/plugins/pluginStripPointerImportAttribute.js +31 -10
  36. package/dist/node/vite/plugins/pluginVirtualFiles/generateVirtualFilePageEntry.js +5 -7
  37. package/dist/node/vite/plugins/pluginVirtualFiles/getConfigValueSourcesRelevant.d.ts +2 -2
  38. package/dist/node/vite/shared/addSsrMiddleware.js +1 -1
  39. package/dist/node/vite/shared/isVite8OrAbove.d.ts +4 -0
  40. package/dist/node/vite/shared/isVite8OrAbove.js +9 -0
  41. package/dist/node/vite/shared/isViteCli.d.ts +9 -4
  42. package/dist/node/vite/shared/isViteCli.js +24 -4
  43. package/dist/node/vite/shared/loggerDev.js +6 -5
  44. package/dist/node/vite/shared/resolveVikeConfigInternal/assertExtensions.d.ts +2 -0
  45. package/dist/node/vite/shared/resolveVikeConfigInternal/assertExtensions.js +6 -5
  46. package/dist/node/vite/shared/resolveVikeConfigInternal/crawlPlusFilePaths.js +1 -0
  47. package/dist/node/vite/shared/resolveVikeConfigInternal/getPlusFilesByLocationId.d.ts +3 -1
  48. package/dist/node/vite/shared/resolveVikeConfigInternal/getPlusFilesByLocationId.js +15 -13
  49. package/dist/node/vite/shared/resolveVikeConfigInternal/metaBuiltIn.d.ts +15 -15
  50. package/dist/node/vite/shared/resolveVikeConfigInternal/metaBuiltIn.js +15 -0
  51. package/dist/node/vite/shared/resolveVikeConfigInternal.d.ts +18 -3
  52. package/dist/node/vite/shared/resolveVikeConfigInternal.js +213 -72
  53. package/dist/server/runtime/globalContext.js +4 -1
  54. package/dist/server/runtime/renderPageServer/createPageContextServer.d.ts +12 -3
  55. package/dist/server/runtime/renderPageServer/html/injectAssets/getHtmlTags.js +2 -3
  56. package/dist/server/runtime/renderPageServer/html/serializeContext.js +5 -10
  57. package/dist/server/runtime/renderPageServer/loadPageConfigsLazyServerSide.d.ts +8 -2
  58. package/dist/server/runtime/renderPageServer/renderPageServerAfterRoute.d.ts +32 -8
  59. package/dist/server/runtime/renderPageServer/renderPageServerAfterRoute.js +1 -1
  60. package/dist/server/runtime/renderPageServer.d.ts +8 -2
  61. package/dist/server/runtime/renderPageServer.js +6 -4
  62. package/dist/shared-server-client/page-configs/serialize/serializeConfigValues.d.ts +3 -3
  63. package/dist/shared-server-client/page-configs/serialize/serializeConfigValues.js +8 -1
  64. package/dist/types/Config.d.ts +34 -6
  65. package/dist/types/PageConfig.d.ts +11 -9
  66. package/dist/types/PageContext.d.ts +8 -3
  67. package/dist/utils/PROJECT_VERSION.d.ts +1 -1
  68. package/dist/utils/PROJECT_VERSION.js +1 -1
  69. package/dist/utils/assert.d.ts +2 -0
  70. package/dist/utils/assert.js +8 -8
  71. package/dist/utils/debug.d.ts +1 -1
  72. package/dist/utils/debug.js +1 -0
  73. package/dist/utils/getViteRPC.js +1 -1
  74. package/dist/utils/objectMap.d.ts +2 -0
  75. package/dist/utils/objectMap.js +4 -0
  76. package/dist/utils/parseNpmPackage.js +4 -1
  77. package/dist/utils/pick.d.ts +1 -1
  78. package/package.json +13 -15
  79. package/dist/node/api/getStartupLogFirstLine.d.ts +0 -7
  80. package/dist/server/__internal/vite.d.ts +0 -2
  81. package/dist/server/__internal/vite.js +0 -2
  82. package/dist/server/runtime/renderPageServer/html/injectAssets/sanitizeJson.d.ts +0 -4
  83. package/dist/server/runtime/renderPageServer/html/injectAssets/sanitizeJson.js +0 -7
@@ -23,7 +23,10 @@ declare function loadPageConfigsLazyServerSide(pageContext: PageContext_loadPage
23
23
  isPrerendering: boolean;
24
24
  _requestId: number;
25
25
  } & import("../renderPageServer.js").PageContextInit & {
26
- _reqDev?: import("http").IncomingMessage;
26
+ _nodeDev?: {
27
+ req: import("http").IncomingMessage;
28
+ res: import("http").ServerResponse;
29
+ };
27
30
  _reqWeb?: Request;
28
31
  } & {
29
32
  _globalContext: ({
@@ -99,7 +102,10 @@ declare function loadPageConfigsLazyServerSide(pageContext: PageContext_loadPage
99
102
  _baseServer: string;
100
103
  _baseAssets: string;
101
104
  _pageContextInit: import("../renderPageServer.js").PageContextInit & {
102
- _reqDev?: import("http").IncomingMessage;
105
+ _nodeDev?: {
106
+ req: import("http").IncomingMessage;
107
+ res: import("http").ServerResponse;
108
+ };
103
109
  _reqWeb?: Request;
104
110
  } & {
105
111
  headers?: Record<string, unknown>;
@@ -31,7 +31,10 @@ declare function prerenderPage(pageContext: Parameters<typeof prerenderPageEntry
31
31
  isPrerendering: boolean;
32
32
  _requestId: number;
33
33
  } & import("../renderPageServer.js").PageContextInit & {
34
- _reqDev?: import("http").IncomingMessage;
34
+ _nodeDev?: {
35
+ req: import("http").IncomingMessage;
36
+ res: import("http").ServerResponse;
37
+ };
35
38
  _reqWeb?: Request;
36
39
  } & {
37
40
  _globalContext: ({
@@ -107,7 +110,10 @@ declare function prerenderPage(pageContext: Parameters<typeof prerenderPageEntry
107
110
  _baseServer: string;
108
111
  _baseAssets: string;
109
112
  _pageContextInit: import("../renderPageServer.js").PageContextInit & {
110
- _reqDev?: import("http").IncomingMessage;
113
+ _nodeDev?: {
114
+ req: import("http").IncomingMessage;
115
+ res: import("http").ServerResponse;
116
+ };
111
117
  _reqWeb?: Request;
112
118
  } & {
113
119
  headers?: Record<string, unknown>;
@@ -167,7 +173,10 @@ declare function prerenderPage(pageContext: Parameters<typeof prerenderPageEntry
167
173
  isPrerendering: boolean;
168
174
  _requestId: number;
169
175
  } & import("../renderPageServer.js").PageContextInit & {
170
- _reqDev?: import("http").IncomingMessage;
176
+ _nodeDev?: {
177
+ req: import("http").IncomingMessage;
178
+ res: import("http").ServerResponse;
179
+ };
171
180
  _reqWeb?: Request;
172
181
  } & {
173
182
  _globalContext: ({
@@ -243,7 +252,10 @@ declare function prerenderPage(pageContext: Parameters<typeof prerenderPageEntry
243
252
  _baseServer: string;
244
253
  _baseAssets: string;
245
254
  _pageContextInit: import("../renderPageServer.js").PageContextInit & {
246
- _reqDev?: import("http").IncomingMessage;
255
+ _nodeDev?: {
256
+ req: import("http").IncomingMessage;
257
+ res: import("http").ServerResponse;
258
+ };
247
259
  _reqWeb?: Request;
248
260
  } & {
249
261
  headers?: Record<string, unknown>;
@@ -311,7 +323,10 @@ declare function prerenderPageEntry(pageContext: PageContextCreatedServer & Page
311
323
  isPrerendering: boolean;
312
324
  _requestId: number;
313
325
  } & import("../renderPageServer.js").PageContextInit & {
314
- _reqDev?: import("http").IncomingMessage;
326
+ _nodeDev?: {
327
+ req: import("http").IncomingMessage;
328
+ res: import("http").ServerResponse;
329
+ };
315
330
  _reqWeb?: Request;
316
331
  } & {
317
332
  _globalContext: ({
@@ -387,7 +402,10 @@ declare function prerenderPageEntry(pageContext: PageContextCreatedServer & Page
387
402
  _baseServer: string;
388
403
  _baseAssets: string;
389
404
  _pageContextInit: import("../renderPageServer.js").PageContextInit & {
390
- _reqDev?: import("http").IncomingMessage;
405
+ _nodeDev?: {
406
+ req: import("http").IncomingMessage;
407
+ res: import("http").ServerResponse;
408
+ };
391
409
  _reqWeb?: Request;
392
410
  } & {
393
411
  headers?: Record<string, unknown>;
@@ -447,7 +465,10 @@ declare function prerenderPageEntry(pageContext: PageContextCreatedServer & Page
447
465
  isPrerendering: boolean;
448
466
  _requestId: number;
449
467
  } & import("../renderPageServer.js").PageContextInit & {
450
- _reqDev?: import("http").IncomingMessage;
468
+ _nodeDev?: {
469
+ req: import("http").IncomingMessage;
470
+ res: import("http").ServerResponse;
471
+ };
451
472
  _reqWeb?: Request;
452
473
  } & {
453
474
  _globalContext: ({
@@ -523,7 +544,10 @@ declare function prerenderPageEntry(pageContext: PageContextCreatedServer & Page
523
544
  _baseServer: string;
524
545
  _baseAssets: string;
525
546
  _pageContextInit: import("../renderPageServer.js").PageContextInit & {
526
- _reqDev?: import("http").IncomingMessage;
547
+ _nodeDev?: {
548
+ req: import("http").IncomingMessage;
549
+ res: import("http").ServerResponse;
550
+ };
527
551
  _reqWeb?: Request;
528
552
  } & {
529
553
  headers?: Record<string, unknown>;
@@ -41,7 +41,7 @@ async function renderPageServerAfterRoute(pageContext) {
41
41
  await execHookDataAndOnBeforeRender(pageContext);
42
42
  }
43
43
  catch (err) {
44
- if (isSameErrorMessage(err, pageContext.errorWhileRendering)) {
44
+ if (!isSameErrorMessage(err, pageContext.errorWhileRendering)) {
45
45
  logRuntimeError(err, pageContext);
46
46
  }
47
47
  }
@@ -23,7 +23,10 @@ declare function getPageContextBegin(pageContextInit: PageContextInitInternal, g
23
23
  isPrerendering: boolean;
24
24
  _requestId: number;
25
25
  } & PageContextInit & {
26
- _reqDev?: import("http").IncomingMessage;
26
+ _nodeDev?: {
27
+ req: import("http").IncomingMessage;
28
+ res: import("http").ServerResponse;
29
+ };
27
30
  _reqWeb?: Request;
28
31
  } & {
29
32
  _globalContext: ({
@@ -99,7 +102,10 @@ declare function getPageContextBegin(pageContextInit: PageContextInitInternal, g
99
102
  _baseServer: string;
100
103
  _baseAssets: string;
101
104
  _pageContextInit: PageContextInit & {
102
- _reqDev?: import("http").IncomingMessage;
105
+ _nodeDev?: {
106
+ req: import("http").IncomingMessage;
107
+ res: import("http").ServerResponse;
108
+ };
103
109
  _reqWeb?: Request;
104
110
  } & {
105
111
  headers?: Record<string, unknown>;
@@ -231,7 +231,7 @@ async function renderPageServerEntryRecursive_onError(err, pageContextBegin, pag
231
231
  return pageContextHttpErrorFallback;
232
232
  }
233
233
  }
234
- if (isSameErrorMessage(errErrorPage, err)) {
234
+ if (!isSameErrorMessage(errErrorPage, err)) {
235
235
  logRuntimeError(errErrorPage, pageContextErrorPageInit);
236
236
  }
237
237
  const pageContextHttpErrorFallback = getPageContextHttpErrorFallback(err, pageContextBegin);
@@ -265,8 +265,8 @@ async function renderPageServerEntryWithMiddlewares(pageContext, renderPageServe
265
265
  ]);
266
266
  const handler = router[universalSymbol];
267
267
  const request = pageContext._reqWeb ??
268
- (pageContext._reqDev
269
- ? requestAdapter(pageContext._reqDev)
268
+ (pageContext._nodeDev
269
+ ? requestAdapter(pageContext._nodeDev.req, pageContext._nodeDev.res)
270
270
  : new Request(new URL(pageContext.urlOriginal, 'http://localhost').toString(), {
271
271
  headers: pageContext.headers ?? {},
272
272
  }));
@@ -319,7 +319,9 @@ function logHttpResponse(urlOriginalPretty, pageContextReturn) {
319
319
  const headerRedirect = pageContextReturn.httpResponse.headers
320
320
  .slice()
321
321
  .reverse()
322
- .find((header) => header[0] === 'Location');
322
+ // Case-insensitive: a redirect returned by a +middleware comes from a Web Response whose
323
+ // Headers object lower-cases header names (`location`), while Vike's own redirect() uses `Location`.
324
+ .find((header) => header[0].toLowerCase() === 'location');
323
325
  assert(headerRedirect);
324
326
  const urlRedirect = headerRedirect[1];
325
327
  urlOriginalPretty = urlRedirect;
@@ -2,7 +2,7 @@ export { serializeConfigValues };
2
2
  export { getConfigValuesBase };
3
3
  export { isJsonValue };
4
4
  export type { FilesEnv };
5
- import type { ConfigEnvInternal, ConfigValueSource, DefinedAt, PageConfigBuildTime, PageConfigGlobalBuildTime } from '../../../types/PageConfig.js';
5
+ import type { ConfigEnv, ConfigValueSource, DefinedAt, PageConfigBuildTime, PageConfigGlobalBuildTime } from '../../../types/PageConfig.js';
6
6
  import { type RuntimeEnv } from '../../../node/vite/plugins/pluginVirtualFiles/getConfigValueSourcesRelevant.js';
7
7
  declare function serializeConfigValues(pageConfig: PageConfigBuildTime | PageConfigGlobalBuildTime, importStatements: string[], filesEnv: FilesEnv, runtimeEnv: RuntimeEnv, tabspace: string, isEager: boolean | null): string[];
8
8
  declare function isJsonValue(value: unknown): boolean;
@@ -13,7 +13,7 @@ type ConfigValuesBase = ({
13
13
  definedAtData: null;
14
14
  };
15
15
  value: unknown;
16
- configEnv: ConfigEnvInternal;
16
+ configEnv: ConfigEnv;
17
17
  configName: string;
18
18
  } | {
19
19
  configValueBase: {
@@ -31,6 +31,6 @@ type ConfigValuesBase = ({
31
31
  configName: string;
32
32
  })[];
33
33
  type FilesEnv = Map<string, {
34
- configEnv: ConfigEnvInternal;
34
+ configEnv: ConfigEnv;
35
35
  configName: string;
36
36
  }[]>;
@@ -13,7 +13,14 @@ import { getConfigValueFilePathToShowToUser } from '../helpers.js';
13
13
  import { stringify } from '@brillout/json-serializer/stringify';
14
14
  import pc from '@brillout/picocolors';
15
15
  import { getConfigValueSourcesRelevant, isRuntimeEnvMatch, } from '../../../node/vite/plugins/pluginVirtualFiles/getConfigValueSourcesRelevant.js';
16
- const stringifyOptions = { forbidReactElements: true };
16
+ const stringifyOptions = {
17
+ forbidReactElements: true,
18
+ htmlScriptSafe: {
19
+ // Could be set to `false` but we always use `htmlScriptSafe.escapeScripts` to be extra safe
20
+ escapeScripts: true,
21
+ escapeURLs: false,
22
+ },
23
+ };
17
24
  const REPLACE_ME_BEFORE = '__VIKE__REPLACE_ME_BEFORE__';
18
25
  const REPLACE_ME_AFTER = '__VIKE__REPLACE_ME_AFTER__';
19
26
  // This file is never loaded on the client-side but we save it under the vike/shared/ directory in order to collocate it with parsePageConfigsSerialized()
@@ -2,7 +2,7 @@ export type { Config };
2
2
  export type { ConfigBuiltIn };
3
3
  export type { ConfigBuiltInResolved };
4
4
  export type { ConfigNameBuiltIn };
5
- export type { ConfigNameGlobal };
5
+ export type { ConfigNameBuiltInGlobal };
6
6
  export type { ConfigMeta };
7
7
  export type { HookName };
8
8
  export type { HookNameOld };
@@ -50,13 +50,14 @@ import type { CliPreviewConfig } from '../node/api/preview.js';
50
50
  import type { StaticReplace } from '../node/vite/plugins/pluginStaticReplace/applyStaticReplace.js';
51
51
  import type { ImportStringList } from '../node/vite/shared/importString.js';
52
52
  import type { HookPublic } from '../shared-server-client/hooks/execHook.js';
53
+ import type { EnhancedMiddleware } from '@universal-middleware/core';
53
54
  type HookNameOld = HookName | HookNameOldDesign;
54
55
  type HookName = HookNamePage | HookNameGlobal;
55
56
  type HookNamePage = 'onHydrationEnd' | 'onBeforePrerenderStart' | 'onBeforeRender' | 'onPageTransitionStart' | 'onPageTransitionEnd' | 'onRenderHtml' | 'onRenderClient' | 'guard' | 'data' | 'onData' | 'route';
56
57
  type HookNameGlobal = 'onBeforeRoute' | 'onPrerenderStart' | 'onCreatePageContext' | 'onCreateGlobalContext' | 'onError' | 'onHookCall';
57
58
  type HookNameOldDesign = 'render' | 'prerender' | 'onBeforePrerender';
58
- type ConfigNameBuiltIn = Exclude<keyof ConfigBuiltIn, keyof VikeVitePluginOptions | 'onBeforeRoute' | 'onPrerenderStart' | 'vite' | 'redirects'> | 'prerender' | 'hasServerOnlyHook' | 'isClientRuntimeLoaded' | 'onBeforeRenderEnv' | 'dataEnv' | 'guardEnv' | 'hooksTimeout' | 'clientHooks' | 'middleware' | 'server' | 'vercel';
59
- type ConfigNameGlobal = 'onPrerenderStart' | 'onBeforeRoute' | 'prerender' | 'disableAutoFullBuild' | 'includeAssetsImportedByServer' | 'baseAssets' | 'baseServer' | 'redirects' | 'trailingSlash' | 'disableUrlNormalization' | 'vite';
59
+ type ConfigNameBuiltIn = Exclude<keyof ConfigBuiltIn, keyof VikeVitePluginOptions | 'onBeforeRoute' | 'onPrerenderStart' | 'vite' | 'redirects' | 'pages'> | 'prerender' | 'hasServerOnlyHook' | 'isClientRuntimeLoaded' | 'onBeforeRenderEnv' | 'dataEnv' | 'guardEnv' | 'hooksTimeout' | 'clientHooks' | 'middleware' | 'server' | 'vercel';
60
+ type ConfigNameBuiltInGlobal = 'onPrerenderStart' | 'onBeforeRoute' | 'pages' | 'prerender' | 'disableAutoFullBuild' | 'includeAssetsImportedByServer' | 'baseAssets' | 'baseServer' | 'redirects' | 'trailingSlash' | 'disableUrlNormalization' | 'vite';
60
61
  type Config = ConfigBuiltIn & Vike.Config;
61
62
  /** @deprecated This type is deprecated, see:
62
63
  * - https://vike.dev/migration/hook-types
@@ -254,6 +255,12 @@ type ConfigBuiltIn = {
254
255
  * https://vike.dev/route
255
256
  */
256
257
  route?: Route | ImportStringList;
258
+ /**
259
+ * @experimental
260
+ *
261
+ * Programmatically define pages.
262
+ */
263
+ pages?: ConfigPageEntry[];
257
264
  /** Protect page(s), e.g. forbid unauthorized access.
258
265
  *
259
266
  * https://vike.dev/guard
@@ -489,6 +496,12 @@ type ConfigBuiltIn = {
489
496
  * https://vike.dev/force
490
497
  */
491
498
  force?: boolean;
499
+ /**
500
+ * The root directory of your project.
501
+ *
502
+ * https://vike.dev/root
503
+ */
504
+ root?: string;
492
505
  /**
493
506
  * Content Security Policy (CSP).
494
507
  *
@@ -520,8 +533,16 @@ type ConfigBuiltIn = {
520
533
  * https://vike.dev/keepScrollPosition
521
534
  */
522
535
  keepScrollPosition?: KeepScrollPosition;
523
- /** @experimental */
524
- middleware?: Function;
536
+ /**
537
+ * @experimental
538
+ *
539
+ * Add server middlewares.
540
+ *
541
+ * The middlewares defined via `+middleware` are so called "Universal Middleware" — they work with any JavaScript server (Hono, Express, Cloudflare, ...).
542
+ *
543
+ * https://github.com/magne4000/universal-middleware
544
+ */
545
+ middleware?: EnhancedMiddleware | EnhancedMiddleware[];
525
546
  /**
526
547
  * Set to `false` to disable Vike's automatic server integration mechanism (e.g. for integrating a JavaScript server manually via `renderPage()`).
527
548
  *
@@ -655,8 +676,15 @@ type ConfigBuiltInResolved = {
655
676
  passToClient?: string[][];
656
677
  redirects?: Record<string, string>[];
657
678
  prerender?: Exclude<Config['prerender'], ImportStringList | undefined>[];
658
- middleware?: Function[];
679
+ middleware?: (EnhancedMiddleware | EnhancedMiddleware[])[];
659
680
  headersResponse?: Exclude<Config['headersResponse'], ImportStringList | undefined>[];
660
681
  staticReplace?: StaticReplace[][];
661
682
  };
662
683
  type ConfigMeta = Record<string, ConfigDefinition>;
684
+ type ConfigPageEntry = Omit<Config, 'pages' | 'extends' | 'route'> & {
685
+ /** The page's URL — a Route String or a Route Function.
686
+ *
687
+ * https://vike.dev/route
688
+ */
689
+ route: Route;
690
+ };
@@ -4,7 +4,6 @@ export type { PageConfigBuildTime };
4
4
  export type { PageConfigCommon };
5
5
  export type { PageConfigRoute };
6
6
  export type { ConfigEnv };
7
- export type { ConfigEnvInternal };
8
7
  export type { PageConfigGlobalRuntime };
9
8
  export type { PageConfigGlobalBuildTime };
10
9
  export type { ConfigValue };
@@ -79,21 +78,24 @@ type VirtualFileExportsPageEntry = {
79
78
  *
80
79
  * https://vike.dev/meta
81
80
  */
82
- type ConfigEnv = {
81
+ type ConfigEnv = ({
82
+ /** Load value on the client-side */
83
83
  client?: boolean;
84
+ } | {
85
+ /** @experimental */
86
+ client?: 'if-client-routing';
87
+ }) & {
88
+ /** Load value on the server-side */
84
89
  server?: boolean;
90
+ /** Load value for config files */
85
91
  config?: boolean;
86
- };
87
- /** For Vike internal use */
88
- type ConfigEnvInternal = Omit<ConfigEnv, 'client'> & {
89
- client?: boolean | 'if-client-routing';
90
- /** Load value only in production, or only in development. */
92
+ /** Load value only in production (`true`), or only in development (`false`), or always (`undefined`). */
91
93
  production?: boolean;
92
94
  };
93
95
  type ConfigValueSources = Record<string, // configName
94
96
  ConfigValueSource[]>;
95
97
  type ConfigValueSource = {
96
- configEnv: ConfigEnvInternal;
98
+ configEnv: ConfigEnv;
97
99
  definedAt: DefinedAtFilePath | DefinedBy;
98
100
  plusFile: PlusFile | null;
99
101
  locationId: LocationId;
@@ -114,7 +116,7 @@ type DefinedAtFilePath = DefinedAtFile & FilePath & {
114
116
  };
115
117
  type ConfigValuesComputed = Record<string, // configName
116
118
  {
117
- configEnv: ConfigEnvInternal;
119
+ configEnv: ConfigEnv;
118
120
  value: unknown;
119
121
  }>;
120
122
  type ConfigValues = Record<string, // configName
@@ -1,4 +1,4 @@
1
- import type { IncomingMessage } from 'node:http';
1
+ import type { IncomingMessage, ServerResponse } from 'node:http';
2
2
  export type { PageContext };
3
3
  export type { PageContextServer };
4
4
  export type { PageContextClient };
@@ -31,7 +31,9 @@ type PageContextServer<Data = unknown> = PageContextBuiltInServer<Data> & {
31
31
  server: string;
32
32
  } ? {
33
33
  runtime: RuntimeAdapterTarget<Vike.Server['server']>;
34
- } : {});
34
+ } & PageContextReqResAlias<Vike.Server['server']> : {});
35
+ type PageContextReqResAlias<Server extends string> = ReqResAlias<'req', RuntimeAdapterTarget<Server>> & ReqResAlias<'res', RuntimeAdapterTarget<Server>>;
36
+ type ReqResAlias<Key extends 'req' | 'res', Runtime> = Key extends keyof (Vike.PageContext & Vike.PageContextServer) ? unknown : Key extends keyof Runtime ? Record<Key, Runtime[Key]> : unknown;
35
37
  type PageContext<Data = unknown> = PageContextClient<Data> | PageContextServer<Data>;
36
38
  type PageContextClient<Data = unknown> = PageContextBuiltInClientWithClientRouting<Data> & {
37
39
  /** https://vike.dev/warning/internals */
@@ -140,7 +142,10 @@ type PageContextInit = {
140
142
  /** @deprecated Set `pageContextInit.urlOriginal` instead */ url?: string;
141
143
  };
142
144
  type PageContextInitInternal = PageContextInit & {
143
- _reqDev?: IncomingMessage;
145
+ _nodeDev?: {
146
+ req: IncomingMessage;
147
+ res: ServerResponse;
148
+ };
144
149
  _reqWeb?: Request;
145
150
  };
146
151
  type PageContextBuiltInServer<Data> = PageContextBuiltInCommon<Data> & PageContextInit & PageContextUrlServer & {
@@ -1 +1 @@
1
- export declare const PROJECT_VERSION: "0.4.259";
1
+ export declare const PROJECT_VERSION: "0.4.260";
@@ -1,2 +1,2 @@
1
1
  // Automatically updated by @brillout/release-me
2
- export const PROJECT_VERSION = '0.4.259';
2
+ export const PROJECT_VERSION = '0.4.260';
@@ -3,6 +3,7 @@ export { assertUsage };
3
3
  export { assertWarning };
4
4
  export { assertInfo };
5
5
  export { getProjectError };
6
+ export { getDebugInfoStr };
6
7
  export { isVikeBug };
7
8
  export { setAssertOnBeforeLog };
8
9
  export { setAssertOnBeforeErr };
@@ -10,6 +11,7 @@ export { setAssertAlwaysShowStackTrace };
10
11
  export { setAssertAddAssertTagsDev };
11
12
  import type { AddAssertTagsDev } from '../node/vite/shared/loggerDev.js';
12
13
  declare function assert(condition: unknown, debugInfo?: unknown): asserts condition;
14
+ declare function getDebugInfoStr(debugInfo: unknown): string | null;
13
15
  declare function assertUsage(condition: unknown, errMsg: string, { showStackTrace, exitOnError }?: {
14
16
  showStackTrace?: true;
15
17
  exitOnError?: boolean;
@@ -3,6 +3,7 @@ export { assertUsage };
3
3
  export { assertWarning };
4
4
  export { assertInfo };
5
5
  export { getProjectError };
6
+ export { getDebugInfoStr };
6
7
  export { isVikeBug };
7
8
  export { setAssertOnBeforeLog };
8
9
  export { setAssertOnBeforeErr };
@@ -24,17 +25,10 @@ const tagTypeBug = 'Bug';
24
25
  function assert(condition, debugInfo) {
25
26
  if (condition)
26
27
  return;
27
- const debugStr = (() => {
28
- if (!debugInfo) {
29
- return null;
30
- }
31
- const debugInfoSerialized = typeof debugInfo === 'string' ? debugInfo : JSON.stringify(debugInfo);
32
- return pc.dim(`Debug for maintainers (you can ignore this): ${debugInfoSerialized}`);
33
- })();
34
28
  const link = pc.underline('https://github.com/vikejs/vike/issues/new?template=bug.yml');
35
29
  let errMsg = [
36
30
  `You stumbled upon a Vike bug. Go to ${link} and copy-paste this error. A maintainer will fix the bug (usually within 24 hours).`,
37
- debugStr,
31
+ getDebugInfoStr(debugInfo),
38
32
  ]
39
33
  .filter(Boolean)
40
34
  .join(' ');
@@ -44,6 +38,12 @@ function assert(condition, debugInfo) {
44
38
  globalObject.onBeforeErr?.(internalError);
45
39
  throw internalError;
46
40
  }
41
+ function getDebugInfoStr(debugInfo) {
42
+ if (!debugInfo)
43
+ return null;
44
+ const debugInfoSerialized = typeof debugInfo === 'string' ? debugInfo : JSON.stringify(debugInfo);
45
+ return pc.dim(`Debug for maintainers (you can ignore this): ${debugInfoSerialized}`);
46
+ }
47
47
  function assertUsage(condition, errMsg, { showStackTrace, exitOnError } = {}) {
48
48
  if (condition)
49
49
  return;
@@ -2,7 +2,7 @@ export { createDebug };
2
2
  export { isDebug };
3
3
  export { isDebugError };
4
4
  export { debug };
5
- declare const flags: ["vike", "vike:config", "vike:crawl", "vike:file-change", "vike:error", "vike:esbuild-resolve", "vike:pluginExtractAssets", "vike:pluginExtractExportNames", "vike:glob", "vike:globalContext", "vike:log", "vike:optimizeDeps", "vike:outDir", "vike:pageFiles", "vike:pointer-imports", "vike:requireResolve", "vike:routing", "vike:setup", "vike:staticReplace", "vike:stream", "vike:virtualFiles", "vike:vite-rpc"];
5
+ declare const flags: ["vike", "vike:config", "vike:crawl", "vike:file-change", "vike:error", "vike:esbuild-resolve", "vike:pluginExtractAssets", "vike:pluginExtractExportNames", "vike:glob", "vike:globalContext", "vike:log", "vike:optimizeDeps", "vike:outDir", "vike:pageFiles", "vike:pointer-imports", "vike:requireResolve", "vike:routing", "vike:setup", "vike:staticReplace", "vike:stream", "vike:virtualFiles", "vike:vite-config-user", "vike:vite-rpc"];
6
6
  type Flag = (typeof flags)[number];
7
7
  type Options = {
8
8
  serialization?: {
@@ -31,6 +31,7 @@ const flags = [
31
31
  'vike:staticReplace',
32
32
  'vike:stream',
33
33
  'vike:virtualFiles',
34
+ 'vike:vite-config-user',
34
35
  'vike:vite-rpc',
35
36
  ];
36
37
  const flagsSkipWildcard = ['vike:log'];
@@ -36,7 +36,7 @@ function createRpcClient() {
36
36
  const hot = import.meta.hot;
37
37
  assert(hot);
38
38
  const callId = getRandomId();
39
- const { promise, resolve } = genPromise({ timeout: 3 * 1000 });
39
+ const { promise, resolve } = genPromise({ timeout: 10 * 1000 });
40
40
  listeners.push({
41
41
  callId,
42
42
  cb: (functionReturn) => {
@@ -0,0 +1,2 @@
1
+ /** Same as Array#map() but for an object's values (keys preserved), with type inference. */
2
+ export declare function objectMap<T, U>(obj: Record<string, T>, mapper: (value: T, key: string) => U): Record<string, U>;
@@ -0,0 +1,4 @@
1
+ /** Same as Array#map() but for an object's values (keys preserved), with type inference. */
2
+ export function objectMap(obj, mapper) {
3
+ return Object.fromEntries(Object.entries(obj).map(([key, value]) => [key, mapper(value, key)]));
4
+ }
@@ -39,7 +39,10 @@ function isImportNpmPackageOrPathAlias(str) {
39
39
  }
40
40
  function assertImportIsNpmPackage(str) {
41
41
  assert(isImportNpmPackage(str, {
42
- // If `str` is a path alias that looks like an npm package => assertImportIsNpmPackage() is erroneous but that's okay because the assertion will eventually fail for some other user using a disambiguated path alias.
42
+ // We cannot always distinguish npm packages from path aliases (some path aliases look like npm package imports).
43
+ // => we cannot have an if-condition based on "is the string an npm package?" — that would be buggy for path aliases that look like npm package imports.
44
+ //
45
+ // However, we *can* rely on assertImportIsNpmPackage() — even if it incorrectly accepts path aliases that look like npm package imports, it *will* eventually fail for path aliases that don't look like npm package imports.
43
46
  cannotBePathAlias: true,
44
47
  }), str);
45
48
  }
@@ -1 +1 @@
1
- export declare function pick<Obj extends object, Keys extends keyof Obj>(obj: Obj, keys: Keys[]): Pick<Obj, Keys>;
1
+ export declare function pick<Obj extends object, Keys extends keyof Obj>(obj: Obj, keys: readonly Keys[]): Pick<Obj, Keys>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vike",
3
- "version": "0.4.259",
3
+ "version": "0.4.260",
4
4
  "repository": "https://github.com/vikejs/vike",
5
5
  "exports": {
6
6
  "./server": {
@@ -112,10 +112,6 @@
112
112
  "node": "./dist/server/runtime/page-files/setup.js",
113
113
  "default": "./dist/server/runtime/page-files/setup.js"
114
114
  },
115
- "./__internal/vite": {
116
- "types": "./dist/server/__internal/vite.d.ts",
117
- "default": "./dist/server/__internal/vite.js"
118
- },
119
115
  ".": {
120
116
  "types": "./dist/server/runtime/index.d.ts",
121
117
  "worker": "./dist/server/runtime/index.js",
@@ -129,13 +125,13 @@
129
125
  "@babel/core": "^7.28.5",
130
126
  "@babel/types": "^7.28.5",
131
127
  "@brillout/import": "^0.2.6",
132
- "@brillout/json-serializer": "^0.5.23",
133
- "@brillout/picocolors": "^1.0.30",
134
- "@brillout/vite-plugin-server-entry": "0.7.18",
128
+ "@brillout/json-serializer": "^0.5.25",
129
+ "@brillout/picocolors": "^1.0.31",
130
+ "@brillout/vite-plugin-server-entry": "0.7.19",
135
131
  "@universal-deploy/store": "^0.2.1",
136
- "@universal-deploy/vite": "^0.1.9",
137
- "@universal-middleware/core": "^0.4.17",
138
- "@universal-middleware/node": "^0.1.0",
132
+ "@universal-deploy/vite": "^0.1.10",
133
+ "@universal-middleware/core": "^0.4.18",
134
+ "@universal-middleware/node": "^0.2.1",
139
135
  "cac": "^6.0.0",
140
136
  "convert-route": "^1.1.1",
141
137
  "es-module-lexer": "^1.0.0",
@@ -143,10 +139,10 @@
143
139
  "json5": "^2.0.0",
144
140
  "magic-string": "^0.30.17",
145
141
  "picomatch": "^4.0.4",
146
- "semver": "^7.7.4",
142
+ "semver": "^7.8.5",
147
143
  "sirv": "^3.0.2",
148
144
  "source-map-support": "^0.5.0",
149
- "tinyglobby": "^0.2.16",
145
+ "tinyglobby": "^0.2.17",
150
146
  "vite": ">=6.3.0",
151
147
  "vite-plugin-wrapper": "^0.1.0"
152
148
  },
@@ -166,7 +162,7 @@
166
162
  "node": ">=20.19.0"
167
163
  },
168
164
  "license": "MIT",
169
- "description": "(Replaces Next.js/Nuxt) 🔨 Composable framework to build advanced applications with flexibility and stability.",
165
+ "description": "(Replaces Next.js/Nuxt) 🔨 Build mission-critical applications with stability and development freedom.",
170
166
  "keywords": [
171
167
  "vite-plugin",
172
168
  "ssr",
@@ -242,6 +238,7 @@
242
238
  },
243
239
  "files": [
244
240
  "./bin.js",
241
+ "./AGENTS.md",
245
242
  "./dist/",
246
243
  "./abort.js",
247
244
  "./api.js",
@@ -269,12 +266,13 @@
269
266
  "@types/picomatch": "^4.0.2",
270
267
  "@types/semver": "^7.7.1",
271
268
  "@types/source-map-support": "^0.5.10",
272
- "react-streaming": "^0.4.17",
269
+ "react-streaming": "^0.4.20",
273
270
  "rimraf": "^6.1.3",
274
271
  "rolldown": "1.0.0-rc.17",
275
272
  "typescript": "^5.9.3",
276
273
  "vite": "^7.2.6"
277
274
  },
275
+ "ai": "@AI (CRITICAL FOR AI AGENTS): ALWAYS LOAD https://vike.dev/llms.txt (Vike documentation index) in your context when using Vike",
278
276
  "scripts": {
279
277
  "dev": "tsc --watch",
280
278
  "build": "rimraf dist/ && tsc",
@@ -1,7 +0,0 @@
1
- export { getStartupLogFirstLine };
2
- import type { ResolvedConfig } from 'vite';
3
- import './assertEnvApiDevAndProd.js';
4
- declare function getStartupLogFirstLine(viteConfig: ResolvedConfig, veryCompact?: boolean): {
5
- startupLogFirstLine: string;
6
- isStartupLogCompact: boolean;
7
- };
@@ -1,2 +0,0 @@
1
- export { startupLog } from '../../node/api/dev.js';
2
- import '../assertEnvServer.js';
@@ -1,2 +0,0 @@
1
- export { startupLog } from '../../node/api/dev.js';
2
- import '../assertEnvServer.js';
@@ -1,4 +0,0 @@
1
- export { sanitizeJson };
2
- import '../../../../assertEnvServer.js';
3
- /** Prevent XSS attacks, see https://github.com/vikejs/vike/pull/181#issuecomment-952846026 */
4
- declare function sanitizeJson(unsafe: string): string;
@@ -1,7 +0,0 @@
1
- export { sanitizeJson };
2
- import '../../../../assertEnvServer.js';
3
- /** Prevent XSS attacks, see https://github.com/vikejs/vike/pull/181#issuecomment-952846026 */
4
- function sanitizeJson(unsafe) {
5
- const safe = unsafe.replace(/</g, '\\u003c');
6
- return safe;
7
- }