vike 0.4.259 → 0.4.260-commit-2e7fb2a

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 (104) 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} +100 -69
  15. package/dist/node/api/startupLog.d.ts +4 -0
  16. package/dist/node/api/{getStartupLogFirstLine.js → startupLog.js} +14 -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 +26 -12
  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/autoAddVikeSkill.d.ts +3 -0
  35. package/dist/node/vite/plugins/pluginDev/autoAddVikeSkill.js +174 -0
  36. package/dist/node/vite/plugins/pluginDev/optimizeDeps.js +67 -31
  37. package/dist/node/vite/plugins/pluginDev.js +17 -0
  38. package/dist/node/vite/plugins/pluginStripPointerImportAttribute.js +31 -10
  39. package/dist/node/vite/plugins/pluginVirtualFiles/generateVirtualFilePageEntry.js +5 -7
  40. package/dist/node/vite/plugins/pluginVirtualFiles/getConfigValueSourcesRelevant.d.ts +2 -2
  41. package/dist/node/vite/plugins/pluginVirtualFiles.js +1 -1
  42. package/dist/node/vite/shared/addSsrMiddleware.js +1 -1
  43. package/dist/node/vite/shared/getMagicString.d.ts +1 -1
  44. package/dist/node/vite/shared/getMagicString.js +3 -0
  45. package/dist/node/vite/shared/isVite8OrAbove.d.ts +4 -0
  46. package/dist/node/vite/shared/isVite8OrAbove.js +9 -0
  47. package/dist/node/vite/shared/isViteCli.d.ts +9 -4
  48. package/dist/node/vite/shared/isViteCli.js +24 -4
  49. package/dist/node/vite/shared/loggerDev.js +6 -5
  50. package/dist/node/vite/shared/loggerVite.js +3 -2
  51. package/dist/node/vite/shared/resolveVikeConfigInternal/assertExtensions.d.ts +3 -1
  52. package/dist/node/vite/shared/resolveVikeConfigInternal/assertExtensions.js +6 -5
  53. package/dist/node/vite/shared/resolveVikeConfigInternal/{crawlPlusFilePaths.d.ts → crawlPlusFiles.d.ts} +2 -2
  54. package/dist/node/vite/shared/resolveVikeConfigInternal/crawlPlusFiles.js +71 -0
  55. package/dist/node/vite/shared/resolveVikeConfigInternal/{getPlusFilesByLocationId.d.ts → getPlusFiles.d.ts} +5 -3
  56. package/dist/node/vite/shared/resolveVikeConfigInternal/{getPlusFilesByLocationId.js → getPlusFiles.js} +18 -17
  57. package/dist/node/vite/shared/resolveVikeConfigInternal/loadFileAtConfigTime.d.ts +1 -1
  58. package/dist/node/vite/shared/resolveVikeConfigInternal/metaBuiltIn.d.ts +15 -15
  59. package/dist/node/vite/shared/resolveVikeConfigInternal/metaBuiltIn.js +19 -0
  60. package/dist/node/vite/shared/resolveVikeConfigInternal.d.ts +19 -4
  61. package/dist/node/vite/shared/resolveVikeConfigInternal.js +217 -76
  62. package/dist/server/runtime/globalContext.js +4 -1
  63. package/dist/server/runtime/renderPageServer/createPageContextServer.d.ts +12 -3
  64. package/dist/server/runtime/renderPageServer/html/injectAssets/getHtmlTags.js +2 -3
  65. package/dist/server/runtime/renderPageServer/html/injectAssets/injectHtmlTags.js +3 -1
  66. package/dist/server/runtime/renderPageServer/html/serializeContext.js +5 -10
  67. package/dist/server/runtime/renderPageServer/loadPageConfigsLazyServerSide.d.ts +8 -2
  68. package/dist/server/runtime/renderPageServer/renderPageServerAfterRoute.d.ts +32 -8
  69. package/dist/server/runtime/renderPageServer/renderPageServerAfterRoute.js +1 -1
  70. package/dist/server/runtime/renderPageServer.d.ts +8 -2
  71. package/dist/server/runtime/renderPageServer.js +6 -4
  72. package/dist/shared-server-client/page-configs/serialize/serializeConfigValues.d.ts +3 -3
  73. package/dist/shared-server-client/page-configs/serialize/serializeConfigValues.js +8 -1
  74. package/dist/types/Config.d.ts +54 -6
  75. package/dist/types/PageConfig.d.ts +12 -10
  76. package/dist/types/PageContext.d.ts +8 -3
  77. package/dist/utils/PROJECT_VERSION.d.ts +1 -1
  78. package/dist/utils/PROJECT_VERSION.js +1 -1
  79. package/dist/utils/assert.d.ts +2 -0
  80. package/dist/utils/assert.js +8 -8
  81. package/dist/utils/assertViteVersion.js +1 -1
  82. package/dist/utils/crawlFiles/ignorePatternsBuiltIn.d.ts +1 -0
  83. package/dist/{node/vite/shared/resolveVikeConfigInternal/crawlPlusFilePaths → utils/crawlFiles}/ignorePatternsBuiltIn.js +1 -1
  84. package/dist/utils/crawlFiles.d.ts +21 -0
  85. package/dist/utils/crawlFiles.js +195 -0
  86. package/dist/utils/debug.d.ts +1 -1
  87. package/dist/utils/debug.js +1 -0
  88. package/dist/{node/vite/shared → utils}/getEnvVarObject.d.ts +0 -1
  89. package/dist/{node/vite/shared → utils}/getEnvVarObject.js +4 -3
  90. package/dist/utils/getViteRPC.js +1 -1
  91. package/dist/utils/objectMap.d.ts +2 -0
  92. package/dist/utils/objectMap.js +4 -0
  93. package/dist/utils/parseNpmPackage.js +4 -1
  94. package/dist/utils/pick.d.ts +1 -1
  95. package/dist/utils/setTimeoutUnref.d.ts +2 -0
  96. package/dist/utils/setTimeoutUnref.js +11 -0
  97. package/package.json +19 -21
  98. package/dist/node/api/getStartupLogFirstLine.d.ts +0 -7
  99. package/dist/node/vite/shared/resolveVikeConfigInternal/crawlPlusFilePaths/ignorePatternsBuiltIn.d.ts +0 -2
  100. package/dist/node/vite/shared/resolveVikeConfigInternal/crawlPlusFilePaths.js +0 -258
  101. package/dist/server/__internal/vite.d.ts +0 -2
  102. package/dist/server/__internal/vite.js +0 -2
  103. package/dist/server/runtime/renderPageServer/html/injectAssets/sanitizeJson.d.ts +0 -4
  104. 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' | 'ai' | '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
  *
@@ -562,6 +583,26 @@ type ConfigBuiltIn = {
562
583
  * https://vike.dev/vercel
563
584
  */
564
585
  vercel?: Vercel;
586
+ /**
587
+ * Setting for Vike's AI integration.
588
+ *
589
+ * https://vike.dev/ai
590
+ */
591
+ ai?: ConfigAi;
592
+ };
593
+ type ConfigAi = {
594
+ /**
595
+ * Whether Vike automatically adds and updates `vike/SKILL.md` inside skills directories (e.g. `.agents/skills/` and `.claude/skills/`).
596
+ *
597
+ * - `true`: add `vike/SKILL.md` to every existing `skills/` directory
598
+ * - `false`: never add `vike/SKILL.md`
599
+ * - `string[]`: add `vike/SKILL.md` to exactly these directories
600
+ *
601
+ * @default true
602
+ *
603
+ * https://vike.dev/ai#skill
604
+ */
605
+ skill?: boolean | string[];
565
606
  };
566
607
  type Vercel = {
567
608
  /**
@@ -655,8 +696,15 @@ type ConfigBuiltInResolved = {
655
696
  passToClient?: string[][];
656
697
  redirects?: Record<string, string>[];
657
698
  prerender?: Exclude<Config['prerender'], ImportStringList | undefined>[];
658
- middleware?: Function[];
699
+ middleware?: (EnhancedMiddleware | EnhancedMiddleware[])[];
659
700
  headersResponse?: Exclude<Config['headersResponse'], ImportStringList | undefined>[];
660
701
  staticReplace?: StaticReplace[][];
661
702
  };
662
703
  type ConfigMeta = Record<string, ConfigDefinition>;
704
+ type ConfigPageEntry = Omit<Config, 'pages' | 'extends' | 'route'> & {
705
+ /** The page's URL — a Route String or a Route Function.
706
+ *
707
+ * https://vike.dev/route
708
+ */
709
+ route: Route;
710
+ };
@@ -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 };
@@ -25,7 +24,7 @@ import type { ConfigValueSerialized } from '../shared-server-client/page-configs
25
24
  import type { LocationId } from '../node/vite/shared/resolveVikeConfigInternal/filesystemRouting.js';
26
25
  import type { FilePath } from './FilePath.js';
27
26
  import type { ConfigDefinitionsInternal } from '../node/vite/shared/resolveVikeConfigInternal/metaBuiltIn.js';
28
- import type { PlusFile } from '../node/vite/shared/resolveVikeConfigInternal/getPlusFilesByLocationId.js';
27
+ import type { PlusFile } from '../node/vite/shared/resolveVikeConfigInternal/getPlusFiles.js';
29
28
  import type { ApiOperation } from '../node/api/types.js';
30
29
  type PageConfigCommon = {
31
30
  pageId: string;
@@ -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-commit-2e7fb2a";
@@ -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-commit-2e7fb2a';
@@ -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 { assertViteVersion };
2
2
  export { viteVersionMin };
3
3
  import { assertVersion } from './assertVersion.js';
4
4
  const viteVersionMin = '6.3.0';
5
- // node_modules/vike/package.json#peerDependencies isn't enough, as users often ignore it
5
+ // package.json#peerDependencies isn't enough, as users often ignore it
6
6
  function assertViteVersion(viteVersion) {
7
7
  // - This assertion isn't reliable: the user may still use a Vite version older than 6.0.0 — see https://github.com/vitejs/vite/pull/19355
8
8
  // - TO-DO/eventually: let's also use this.meta.viteVersion
@@ -0,0 +1 @@
1
+ export declare const ignorePatternsBuiltIn: readonly ["**/node_modules/**", "**/.git/**", "**/ejected/**", "**/*.telefunc.*", "**/.history/**", "**/*.generated.*", "**/*.spec.*", "**/*.test.*"];
@@ -1,6 +1,6 @@
1
- import '../../../assertEnvVite.js';
2
1
  export const ignorePatternsBuiltIn = [
3
2
  '**/node_modules/**',
3
+ '**/.git/**',
4
4
  // Ejected Vike extensions, see https://github.com/snake-py/eject
5
5
  '**/ejected/**',
6
6
  // Allow:
@@ -0,0 +1,21 @@
1
+ export { crawlFiles };
2
+ declare const globstar = "**/";
3
+ type FilePattern = `${typeof globstar}${'+*' | 'skills/*/SKILL'}`;
4
+ /**
5
+ * Crawl the files matching `filePattern`, using `$ git ls-files` and, as a fallback, [tinyglobby](https://github.com/SuperchupuDev/tinyglobby).
6
+ */
7
+ declare function crawlFiles(options: {
8
+ filePattern: FilePattern;
9
+ fileExtension: readonly string[];
10
+ cwd: string;
11
+ /**
12
+ * Whether dotfiles and dot directories are crawled.
13
+ *
14
+ * Same as tinyglobby's `dot` option.
15
+ */
16
+ dot: boolean;
17
+ /**
18
+ * Whether to fallback to tinyglobby if `$ git ls-files` doesn't find any file.
19
+ */
20
+ globFallback: boolean;
21
+ }): Promise<string[]>;