vike 0.4.224 → 0.4.225

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 (120) hide show
  1. package/dist/cjs/node/api/build.js +1 -1
  2. package/dist/cjs/node/api/context.js +4 -4
  3. package/dist/cjs/node/api/dev.js +1 -1
  4. package/dist/cjs/node/api/prepareViteApiCall.js +3 -2
  5. package/dist/cjs/node/api/prerender.js +1 -1
  6. package/dist/cjs/node/api/preview.js +1 -1
  7. package/dist/cjs/node/cli/context.js +5 -4
  8. package/dist/cjs/node/cli/entry.js +3 -3
  9. package/dist/cjs/node/cli/parseCli.js +43 -15
  10. package/dist/cjs/node/cli/utils.js +1 -1
  11. package/dist/cjs/node/plugin/plugins/build/pluginBuildEntry.js +1 -1
  12. package/dist/cjs/node/plugin/plugins/commonConfig.js +16 -5
  13. package/dist/cjs/node/plugin/plugins/devConfig/determineOptimizeDeps.js +2 -0
  14. package/dist/cjs/node/plugin/plugins/devConfig/index.js +1 -1
  15. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/configDefinitionsBuiltIn.js +9 -1
  16. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig.js +75 -21
  17. package/dist/cjs/node/plugin/plugins/previewConfig.js +12 -7
  18. package/dist/cjs/node/plugin/shared/addSsrMiddleware.js +5 -1
  19. package/dist/cjs/node/plugin/shared/getEnvVarObject.js +9 -8
  20. package/dist/cjs/node/plugin/shared/loggerNotProd/log.js +1 -1
  21. package/dist/cjs/node/prerender/context.js +1 -1
  22. package/dist/cjs/node/prerender/resolvePrerenderConfig.js +33 -18
  23. package/dist/cjs/node/prerender/runPrerender.js +6 -8
  24. package/dist/cjs/node/prerender/utils.js +1 -1
  25. package/dist/cjs/node/runtime/globalContext.js +9 -5
  26. package/dist/cjs/node/runtime/html/stream.js +7 -0
  27. package/dist/cjs/node/runtime/renderPage/createHttpResponse/assertNoInfiniteHttpRedirect.js +13 -5
  28. package/dist/cjs/node/runtime/renderPage/createHttpResponse.js +2 -4
  29. package/dist/cjs/node/runtime/renderPage/logErrorHint.js +6 -1
  30. package/dist/cjs/node/runtime/renderPage.js +6 -10
  31. package/dist/cjs/node/runtime/utils.js +0 -1
  32. package/dist/cjs/node/runtime-dev/createDevMiddleware.js +10 -8
  33. package/dist/cjs/node/shared/assertV1Design.js +2 -1
  34. package/dist/cjs/node/shared/utils.js +0 -1
  35. package/dist/cjs/shared/page-configs/getConfigDefinedAt.js +18 -2
  36. package/dist/cjs/shared/page-configs/getConfigValueBuildTime.js +8 -5
  37. package/dist/cjs/shared/page-configs/helpers.js +1 -1
  38. package/dist/cjs/shared/page-configs/serialize/parsePageConfigs.js +2 -5
  39. package/dist/cjs/shared/page-configs/serialize/serializeConfigValues.js +6 -2
  40. package/dist/cjs/shared/route/loadPageRoutes.js +2 -2
  41. package/dist/cjs/utils/PROJECT_VERSION.js +1 -1
  42. package/dist/cjs/utils/assert.js +2 -2
  43. package/dist/cjs/utils/assertSingleInstance.js +11 -17
  44. package/dist/cjs/utils/debug.js +2 -1
  45. package/dist/cjs/utils/parseUrl-extras.js +1 -0
  46. package/dist/esm/node/api/build.js +1 -1
  47. package/dist/esm/node/api/context.d.ts +8 -2
  48. package/dist/esm/node/api/context.js +4 -4
  49. package/dist/esm/node/api/dev.js +1 -1
  50. package/dist/esm/node/api/prepareViteApiCall.d.ts +2 -2
  51. package/dist/esm/node/api/prepareViteApiCall.js +3 -2
  52. package/dist/esm/node/api/prerender.js +1 -1
  53. package/dist/esm/node/api/preview.js +1 -1
  54. package/dist/esm/node/api/types.d.ts +7 -0
  55. package/dist/esm/node/cli/context.d.ts +4 -2
  56. package/dist/esm/node/cli/context.js +5 -4
  57. package/dist/esm/node/cli/entry.js +4 -4
  58. package/dist/esm/node/cli/parseCli.d.ts +3 -0
  59. package/dist/esm/node/cli/parseCli.js +44 -16
  60. package/dist/esm/node/cli/utils.d.ts +1 -1
  61. package/dist/esm/node/cli/utils.js +1 -1
  62. package/dist/esm/node/plugin/plugins/build/pluginBuildEntry.js +2 -2
  63. package/dist/esm/node/plugin/plugins/commonConfig.d.ts +1 -0
  64. package/dist/esm/node/plugin/plugins/commonConfig.js +16 -5
  65. package/dist/esm/node/plugin/plugins/devConfig/determineOptimizeDeps.js +2 -0
  66. package/dist/esm/node/plugin/plugins/devConfig/index.js +1 -1
  67. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/configDefinitionsBuiltIn.d.ts +3 -1
  68. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/configDefinitionsBuiltIn.js +9 -1
  69. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig.js +75 -21
  70. package/dist/esm/node/plugin/plugins/previewConfig.js +12 -7
  71. package/dist/esm/node/plugin/shared/addSsrMiddleware.d.ts +1 -1
  72. package/dist/esm/node/plugin/shared/addSsrMiddleware.js +5 -1
  73. package/dist/esm/node/plugin/shared/getEnvVarObject.d.ts +3 -1
  74. package/dist/esm/node/plugin/shared/getEnvVarObject.js +9 -8
  75. package/dist/esm/node/plugin/shared/loggerNotProd/log.js +2 -2
  76. package/dist/esm/node/prerender/context.js +1 -1
  77. package/dist/esm/node/prerender/resolvePrerenderConfig.d.ts +2 -1
  78. package/dist/esm/node/prerender/resolvePrerenderConfig.js +34 -19
  79. package/dist/esm/node/prerender/runPrerender.js +7 -9
  80. package/dist/esm/node/prerender/utils.d.ts +1 -1
  81. package/dist/esm/node/prerender/utils.js +1 -1
  82. package/dist/esm/node/runtime/globalContext.d.ts +1 -1
  83. package/dist/esm/node/runtime/globalContext.js +10 -6
  84. package/dist/esm/node/runtime/html/stream.js +7 -0
  85. package/dist/esm/node/runtime/index-deprecated.d.ts +1 -3
  86. package/dist/esm/node/runtime/renderPage/createHttpResponse/assertNoInfiniteHttpRedirect.d.ts +3 -1
  87. package/dist/esm/node/runtime/renderPage/createHttpResponse/assertNoInfiniteHttpRedirect.js +14 -6
  88. package/dist/esm/node/runtime/renderPage/createHttpResponse.d.ts +3 -1
  89. package/dist/esm/node/runtime/renderPage/createHttpResponse.js +2 -4
  90. package/dist/esm/node/runtime/renderPage/logErrorHint.js +6 -1
  91. package/dist/esm/node/runtime/renderPage/renderPageAlreadyRouted.d.ts +5 -5
  92. package/dist/esm/node/runtime/renderPage.js +7 -11
  93. package/dist/esm/node/runtime/utils.d.ts +0 -1
  94. package/dist/esm/node/runtime/utils.js +0 -1
  95. package/dist/esm/node/runtime-dev/createDevMiddleware.js +10 -8
  96. package/dist/esm/node/shared/assertV1Design.js +2 -1
  97. package/dist/esm/node/shared/utils.d.ts +0 -1
  98. package/dist/esm/node/shared/utils.js +0 -1
  99. package/dist/esm/shared/page-configs/Config.d.ts +19 -1
  100. package/dist/esm/shared/page-configs/PageConfig.d.ts +16 -5
  101. package/dist/esm/shared/page-configs/getConfigDefinedAt.d.ts +3 -3
  102. package/dist/esm/shared/page-configs/getConfigDefinedAt.js +19 -3
  103. package/dist/esm/shared/page-configs/getConfigValueBuildTime.js +8 -5
  104. package/dist/esm/shared/page-configs/helpers.js +1 -1
  105. package/dist/esm/shared/page-configs/serialize/parsePageConfigs.d.ts +1 -1
  106. package/dist/esm/shared/page-configs/serialize/parsePageConfigs.js +2 -5
  107. package/dist/esm/shared/page-configs/serialize/serializeConfigValues.d.ts +3 -3
  108. package/dist/esm/shared/page-configs/serialize/serializeConfigValues.js +6 -2
  109. package/dist/esm/shared/route/loadPageRoutes.js +2 -2
  110. package/dist/esm/types/index.d.ts +2 -0
  111. package/dist/esm/utils/PROJECT_VERSION.d.ts +1 -1
  112. package/dist/esm/utils/PROJECT_VERSION.js +1 -1
  113. package/dist/esm/utils/assert.js +2 -2
  114. package/dist/esm/utils/assertSingleInstance.js +11 -17
  115. package/dist/esm/utils/debug.js +2 -1
  116. package/dist/esm/utils/parseUrl-extras.js +1 -0
  117. package/package.json +4 -3
  118. package/dist/cjs/utils/projectInfo.js +0 -8
  119. package/dist/esm/utils/projectInfo.d.ts +0 -4
  120. package/dist/esm/utils/projectInfo.js +0 -5
@@ -1,23 +1,31 @@
1
1
  export { assertNoInfiniteHttpRedirect };
2
- import { assert, assertUsage, getGlobalObject } from '../../utils.js';
2
+ import { assert, assertUsage, getGlobalObject, removeUrlOrigin } from '../../utils.js';
3
3
  import pc from '@brillout/picocolors';
4
4
  const globalObject = getGlobalObject('createHttpResponse/assertNoInfiniteHttpRedirect.ts', {
5
5
  redirectGraph: {}
6
6
  });
7
- function assertNoInfiniteHttpRedirect(urlRedirectTarget, urlLogical) {
7
+ // It's too strict, see https://github.com/vikejs/vike/issues/1270#issuecomment-1820608999
8
+ // - Let's create a new setting `+doNotCatchInfiniteRedirect` if someone complains.
9
+ function assertNoInfiniteHttpRedirect(
10
+ // The exact URL that the user will be redirected to.
11
+ // - It includes the Base URL as well as the locale (i18n) base.
12
+ urlRedirectTarget,
13
+ // Rationale for checking against `pageContextInit.urlOriginal`: https://github.com/vikejs/vike/pull/2264#issuecomment-2713890263
14
+ pageContextInit) {
8
15
  if (!urlRedirectTarget.startsWith('/')) {
9
- // We assume that urlRedirectTarget points to an origin that is external (not the same origin), and we can therefore assume that the app doesn't define an infinite loop (in itself).
10
- // - There isn't a reliable way to check whether the redirect points to an external origin or the same origin. For same origins, we assume/hope the user to pass the URL without origin.
16
+ // We assume that urlRedirectTarget points to an origin that is external (not the same origin), and we can therefore assume that the app doesn't define an infinite loop (at least not in itself).
17
+ // - There isn't a reliable way to check whether the redirect points to an external origin or the same origin; we hope/assume the user sets the URL without origin.
11
18
  // ```js
12
19
  // // For same-origin, the user usually/hopefully passes a URL without origin
13
20
  // renderPage({ urlOriginal: '/some/pathname' })
14
21
  // ```
15
22
  return;
16
23
  }
17
- assert(urlLogical.startsWith('/'));
24
+ const urlOriginalNormalized = removeUrlOrigin(pageContextInit.urlOriginal).urlModified;
25
+ assert(urlOriginalNormalized.startsWith('/'));
18
26
  const graph = copy(globalObject.redirectGraph);
19
27
  graph[urlRedirectTarget] ?? (graph[urlRedirectTarget] = new Set());
20
- graph[urlRedirectTarget].add(urlLogical);
28
+ graph[urlRedirectTarget].add(urlOriginalNormalized);
21
29
  validate(graph);
22
30
  globalObject.redirectGraph = graph;
23
31
  }
@@ -35,4 +35,6 @@ declare function createHttpResponseError(pageContext: null | {
35
35
  _pageConfigs: PageConfigRuntime[];
36
36
  }): HttpResponse;
37
37
  declare function createHttpResponsePageContextJson(pageContextSerialized: string): Promise<HttpResponse>;
38
- declare function createHttpResponseRedirect({ url, statusCode }: UrlRedirect, urlLogical: string): HttpResponse;
38
+ declare function createHttpResponseRedirect({ url, statusCode }: UrlRedirect, pageContextInit: {
39
+ urlOriginal: string;
40
+ }): HttpResponse;
@@ -82,10 +82,8 @@ async function createHttpResponsePageContextJson(pageContextSerialized) {
82
82
  const httpResponse = createHttpResponse(200, 'application/json', [], pageContextSerialized, [], null);
83
83
  return httpResponse;
84
84
  }
85
- function createHttpResponseRedirect({ url, statusCode },
86
- // The URL we assume the redirect to be logically based on
87
- urlLogical) {
88
- assertNoInfiniteHttpRedirect(url, urlLogical);
85
+ function createHttpResponseRedirect({ url, statusCode }, pageContextInit) {
86
+ assertNoInfiniteHttpRedirect(url, pageContextInit);
89
87
  assert(url);
90
88
  assert(statusCode);
91
89
  assert(300 <= statusCode && statusCode <= 399);
@@ -23,6 +23,10 @@ const errorsMisc = [
23
23
  errMsg: 'assets.json',
24
24
  link: 'https://vike.dev/getGlobalContext',
25
25
  mustMentionNodeModules: false
26
+ },
27
+ {
28
+ errMsg: 'ERR_UNKNOWN_FILE_EXTENSION',
29
+ link: 'https://vike.dev/broken-npm-package#err-unknown-file-extension'
26
30
  }
27
31
  ];
28
32
  const reactInvalidEelement = 'https://vike.dev/broken-npm-package#react-invalid-component';
@@ -73,7 +77,8 @@ const errorsCjsEsm = [
73
77
  { errMsg: 'exports is not defined' },
74
78
  { errMsg: 'module is not defined' },
75
79
  { errMsg: 'not defined in ES' },
76
- { errMsg: "Unexpected token 'export'" }
80
+ { errMsg: "Unexpected token 'export'" },
81
+ { errMsg: 'Failed to resolve entry for package' }
77
82
  ];
78
83
  function logErrorHint(error) {
79
84
  /* Collect errors for ./logErrorHint.spec.ts
@@ -62,7 +62,7 @@ declare function prerenderPage(pageContext: PageContextInitEnhanced & PageFiles
62
62
  pageRoutes: import("../../../__internal/index.js").PageRoutes;
63
63
  onBeforeRouteHook: import("../../../shared/hooks/getHook.js").Hook | null;
64
64
  pages: import("../../../shared/page-configs/getPageConfigUserFriendly.js").PageConfigsUserFriendly;
65
- config: import("../../../shared/page-configs/Config/PageContextConfig.js").ConfigResolved;
65
+ config: import("../../../types/index.js").ConfigResolved;
66
66
  } & ({
67
67
  isProduction: false;
68
68
  isPrerendering: false;
@@ -148,7 +148,7 @@ declare function prerenderPage(pageContext: PageContextInitEnhanced & PageFiles
148
148
  pageRoutes: import("../../../__internal/index.js").PageRoutes;
149
149
  onBeforeRouteHook: import("../../../shared/hooks/getHook.js").Hook | null;
150
150
  pages: import("../../../shared/page-configs/getPageConfigUserFriendly.js").PageConfigsUserFriendly;
151
- config: import("../../../shared/page-configs/Config/PageContextConfig.js").ConfigResolved;
151
+ config: import("../../../types/index.js").ConfigResolved;
152
152
  } & ({
153
153
  isProduction: false;
154
154
  isPrerendering: false;
@@ -235,7 +235,7 @@ declare function prerender404Page(pageContextInit_: Record<string, unknown> | nu
235
235
  pageRoutes: import("../../../__internal/index.js").PageRoutes;
236
236
  onBeforeRouteHook: import("../../../shared/hooks/getHook.js").Hook | null;
237
237
  pages: import("../../../shared/page-configs/getPageConfigUserFriendly.js").PageConfigsUserFriendly;
238
- config: import("../../../shared/page-configs/Config/PageContextConfig.js").ConfigResolved;
238
+ config: import("../../../types/index.js").ConfigResolved;
239
239
  } & ({
240
240
  isProduction: false;
241
241
  isPrerendering: false;
@@ -321,7 +321,7 @@ declare function prerender404Page(pageContextInit_: Record<string, unknown> | nu
321
321
  pageRoutes: import("../../../__internal/index.js").PageRoutes;
322
322
  onBeforeRouteHook: import("../../../shared/hooks/getHook.js").Hook | null;
323
323
  pages: import("../../../shared/page-configs/getPageConfigUserFriendly.js").PageConfigsUserFriendly;
324
- config: import("../../../shared/page-configs/Config/PageContextConfig.js").ConfigResolved;
324
+ config: import("../../../types/index.js").ConfigResolved;
325
325
  } & ({
326
326
  isProduction: false;
327
327
  isPrerendering: false;
@@ -416,7 +416,7 @@ declare function getPageContextInitEnhanced(pageContextInit: {
416
416
  pageRoutes: import("../../../__internal/index.js").PageRoutes;
417
417
  onBeforeRouteHook: import("../../../shared/hooks/getHook.js").Hook | null;
418
418
  pages: import("../../../shared/page-configs/getPageConfigUserFriendly.js").PageConfigsUserFriendly;
419
- config: import("../../../shared/page-configs/Config/PageContextConfig.js").ConfigResolved;
419
+ config: import("../../../types/index.js").ConfigResolved;
420
420
  } & ({
421
421
  isProduction: false;
422
422
  isPrerendering: false;
@@ -2,7 +2,7 @@ export { renderPage };
2
2
  export { renderPage_addAsyncHookwrapper };
3
3
  import { getPageContextInitEnhanced, renderPageAlreadyRouted } from './renderPage/renderPageAlreadyRouted.js';
4
4
  import { route } from '../../shared/route/index.js';
5
- import { assert, hasProp, objectAssign, isUrl, parseUrl, onSetupRuntime, assertWarning, getGlobalObject, checkType, assertUsage, normalizeUrlPathname, removeBaseServer, modifyUrlPathname, prependBase, removeUrlOrigin, setUrlOrigin, createUrlFromComponents, isUri, getUrlPretty } from './utils.js';
5
+ import { assert, hasProp, objectAssign, isUrl, parseUrl, onSetupRuntime, assertWarning, getGlobalObject, checkType, assertUsage, normalizeUrlPathname, removeBaseServer, modifyUrlPathname, prependBase, removeUrlOrigin, setUrlOrigin, isUri, getUrlPretty } from './utils.js';
6
6
  import { assertNoInfiniteAbortLoop, getPageContextFromAllRewrites, isAbortError, logAbortErrorHandled } from '../../shared/route/abort.js';
7
7
  import { getGlobalContextInternal, initGlobalContext_renderPage } from './globalContext.js';
8
8
  import { handlePageContextRequestUrl } from './renderPage/handlePageContextRequestUrl.js';
@@ -341,7 +341,7 @@ async function normalizeUrl(pageContextInit, globalContext, httpRequestId) {
341
341
  if (!urlNormalized)
342
342
  return null;
343
343
  logRuntimeInfo?.(`URL normalized from ${pc.cyan(urlOriginal)} to ${pc.cyan(urlNormalized)} (https://vike.dev/url-normalization)`, httpRequestId, 'info');
344
- const httpResponse = createHttpResponseRedirect({ url: urlNormalized, statusCode: 301 }, pageContextInit.urlOriginal);
344
+ const httpResponse = createHttpResponseRedirect({ url: urlNormalized, statusCode: 301 }, pageContextInit);
345
345
  const pageContextHttpResponse = createPageContext(pageContextInit);
346
346
  objectAssign(pageContextHttpResponse, { httpResponse });
347
347
  return pageContextHttpResponse;
@@ -383,7 +383,7 @@ async function getPermanentRedirect(pageContextInit, globalContext, httpRequestI
383
383
  assert(urlTarget !== pageContextInit.urlOriginal);
384
384
  }
385
385
  logRuntimeInfo?.(`Permanent redirection defined by config.redirects (https://vike.dev/redirects)`, httpRequestId, 'info');
386
- const httpResponse = createHttpResponseRedirect({ url: urlTarget, statusCode: 301 }, urlWithoutBase);
386
+ const httpResponse = createHttpResponseRedirect({ url: urlTarget, statusCode: 301 }, pageContextInit);
387
387
  const pageContextHttpResponse = createPageContext(pageContextInit);
388
388
  objectAssign(pageContextHttpResponse, { httpResponse });
389
389
  return pageContextHttpResponse;
@@ -391,7 +391,9 @@ async function getPermanentRedirect(pageContextInit, globalContext, httpRequestI
391
391
  function normalize(url) {
392
392
  return url || '/';
393
393
  }
394
- async function handleAbortError(errAbort, pageContextsFromRewrite, pageContextInit,
394
+ async function handleAbortError(errAbort, pageContextsFromRewrite,
395
+ // The original `pageContextInit` object passed to `renderPage(pageContextInit)`
396
+ pageContextInit,
395
397
  // handleAbortError() creates a new pageContext object and we don't merge pageContextNominalPageInit to it: we only use some pageContextNominalPageInit information.
396
398
  pageContextNominalPageInit, httpRequestId, pageContextErrorPageInit, globalContext) {
397
399
  logAbortErrorHandled(errAbort, globalContext.isProduction, pageContextNominalPageInit);
@@ -429,13 +431,7 @@ pageContextNominalPageInit, httpRequestId, pageContextErrorPageInit, globalConte
429
431
  if (pageContextAbort._urlRedirect) {
430
432
  const pageContextReturn = createPageContext(pageContextInit);
431
433
  objectAssign(pageContextReturn, pageContextAbort);
432
- const httpResponse = createHttpResponseRedirect(pageContextAbort._urlRedirect, (() => {
433
- const { pathname, searchOriginal } = pageContextNominalPageInit.urlParsed;
434
- const urlLogical = createUrlFromComponents(null, pathname, searchOriginal,
435
- // The server-side doesn't have access to the hash
436
- null);
437
- return urlLogical;
438
- })());
434
+ const httpResponse = createHttpResponseRedirect(pageContextAbort._urlRedirect, pageContextInit);
439
435
  objectAssign(pageContextReturn, { httpResponse });
440
436
  return { pageContextReturn };
441
437
  }
@@ -11,7 +11,6 @@ export * from '../../utils/parseUrl.js';
11
11
  export * from '../../utils/parseUrl-extras.js';
12
12
  export * from '../../utils/slice.js';
13
13
  export * from '../../utils/sorter.js';
14
- export * from '../../utils/projectInfo.js';
15
14
  export * from '../../utils/isArray.js';
16
15
  export * from '../../utils/isObject.js';
17
16
  export * from '../../utils/objectAssign.js';
@@ -15,7 +15,6 @@ export * from '../../utils/parseUrl.js';
15
15
  export * from '../../utils/parseUrl-extras.js';
16
16
  export * from '../../utils/slice.js';
17
17
  export * from '../../utils/sorter.js';
18
- export * from '../../utils/projectInfo.js';
19
18
  export * from '../../utils/isArray.js';
20
19
  export * from '../../utils/isObject.js';
21
20
  export * from '../../utils/objectAssign.js';
@@ -9,16 +9,18 @@ import { setGlobalContext_isProduction } from '../runtime/globalContext.js';
9
9
  */
10
10
  async function createDevMiddleware(options = {}) {
11
11
  setGlobalContext_isProduction(false);
12
- const viteConfigFromOptions = {
13
- ...options.viteConfig,
14
- server: {
15
- ...options.viteConfig?.server,
16
- middlewareMode: options.viteConfig?.server?.middlewareMode ?? true
12
+ const optionsMod = {
13
+ ...options,
14
+ viteConfig: {
15
+ ...options.viteConfig,
16
+ root: options.root ?? options.viteConfig?.root,
17
+ server: {
18
+ ...options.viteConfig?.server,
19
+ middlewareMode: options.viteConfig?.server?.middlewareMode ?? true
20
+ }
17
21
  }
18
22
  };
19
- if (options.root)
20
- viteConfigFromOptions.root = options.root;
21
- const { viteConfigEnhanced } = await prepareViteApiCall(viteConfigFromOptions, 'dev');
23
+ const { viteConfigEnhanced } = await prepareViteApiCall(optionsMod, 'dev');
22
24
  const server = await createServer(viteConfigEnhanced);
23
25
  const devMiddleware = server.middlewares;
24
26
  return { devMiddleware, viteServer: server, viteConfig: server.config };
@@ -10,7 +10,8 @@ function assertV1Design(pageConfigs, pageFilesAll) {
10
10
  assert(pageConfigs.length > 0);
11
11
  const filesV1 = unique(pageConfigs
12
12
  .map((p) => Object.values(p.configValueSources).map((sources) => sources
13
- .map((c) => c.definedAtFilePath.filePathAbsoluteUserRootDir)
13
+ .map((c) => c.definedAtFilePath)
14
+ .map((definedAt) => (definedAt.definedBy ? null : definedAt.filePathAbsoluteUserRootDir))
14
15
  .filter(isNotNullish)
15
16
  .map((filePathToShowToUser) => indent + filePathToShowToUser)))
16
17
  .flat(2));
@@ -1,7 +1,6 @@
1
1
  export * from '../../utils/assert.js';
2
2
  export * from '../../utils/getFileExtension.js';
3
3
  export * from '../../utils/isPlainObject.js';
4
- export * from '../../utils/projectInfo.js';
5
4
  export * from '../../utils/checkType.js';
6
5
  export * from '../../utils/hasProp.js';
7
6
  export * from '../../utils/objectAssign.js';
@@ -3,7 +3,6 @@ assertIsNotBrowser();
3
3
  export * from '../../utils/assert.js';
4
4
  export * from '../../utils/getFileExtension.js';
5
5
  export * from '../../utils/isPlainObject.js';
6
- export * from '../../utils/projectInfo.js';
7
6
  export * from '../../utils/checkType.js';
8
7
  export * from '../../utils/hasProp.js';
9
8
  export * from '../../utils/objectAssign.js';
@@ -297,7 +297,9 @@ type ConfigBuiltIn = {
297
297
  */
298
298
  disableAutoRun?: boolean;
299
299
  /**
300
- * Set prerender settings without enabling pre-rendering.
300
+ * Whether to enable pre-rendering.
301
+ *
302
+ * Setting `value: null` enables you to set prerender settings without activating pre-rendering. (Useful for Vike extensions.)
301
303
  *
302
304
  * https://vike.dev/prerender#value
303
305
  *
@@ -471,6 +473,22 @@ type ConfigBuiltIn = {
471
473
  * https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control
472
474
  */
473
475
  cacheControl?: string;
476
+ /**
477
+ * Make development/preview server available over LAN and public addresses.
478
+ *
479
+ * Default: `false` (or `true` if running inside Docker/Podman).
480
+ *
481
+ * https://vike.dev/host
482
+ */
483
+ host?: boolean | string;
484
+ /**
485
+ * Change port of development/preview server.
486
+ *
487
+ * @default 3000
488
+ *
489
+ * https://vike.dev/port
490
+ */
491
+ port?: number;
474
492
  /** Where scripts are injected in the HTML.
475
493
  *
476
494
  * https://vike.dev/injectScriptsAt
@@ -17,12 +17,15 @@ export type { ConfigValueSources };
17
17
  export type { ConfigValuesComputed };
18
18
  export type { DefinedAtData };
19
19
  export type { DefinedAtFile };
20
+ export type { DefinedAt };
21
+ export type { DefinedBy };
20
22
  export type { DefinedAtFilePath };
21
23
  import type { ConfigValueSerialized } from './serialize/PageConfigSerialized.js';
22
24
  import type { LocationId } from '../../node/plugin/plugins/importUserCode/v1-design/getVikeConfig/filesystemRouting.js';
23
25
  import type { FilePath } from './FilePath.js';
24
26
  import type { ConfigDefinitions } from '../../node/plugin/plugins/importUserCode/v1-design/getVikeConfig/configDefinitionsBuiltIn.js';
25
27
  import type { PlusFile } from '../../node/plugin/plugins/importUserCode/v1-design/getVikeConfig/getPlusFilesAll.js';
28
+ import type { Operation } from '../../node/api/types.js';
26
29
  type PageConfigCommon = {
27
30
  pageId: string;
28
31
  } & PageConfigRoute;
@@ -33,7 +36,7 @@ type PageConfigRoute = {
33
36
  isErrorPage?: undefined;
34
37
  routeFilesystem: {
35
38
  routeString: string;
36
- definedBy: string;
39
+ definedAtLocation: string;
37
40
  };
38
41
  };
39
42
  /** Page config, runtime data structure */
@@ -89,7 +92,7 @@ type ConfigValueSources = Record<string, // configName
89
92
  ConfigValueSource[]>;
90
93
  type ConfigValueSource = {
91
94
  configEnv: ConfigEnvInternal;
92
- definedAtFilePath: DefinedAtFilePath;
95
+ definedAtFilePath: DefinedAtFilePath | DefinedBy;
93
96
  plusFile: PlusFile | null;
94
97
  locationId: LocationId;
95
98
  /** Wether the config value is loaded at runtime, for example config.Page or config.onBeforeRender */
@@ -119,13 +122,13 @@ type ConfigValue = ConfigValueStandard | ConfigValueCumulative | ConfigValueComp
119
122
  type ConfigValueStandard = {
120
123
  type: 'standard';
121
124
  value: unknown;
122
- definedAtData: DefinedAtFile;
125
+ definedAtData: DefinedAt;
123
126
  };
124
127
  /** Defined by multiple sources (thus multiple file paths). */
125
128
  type ConfigValueCumulative = {
126
129
  type: 'cumulative';
127
130
  value: unknown[];
128
- definedAtData: DefinedAtFile[];
131
+ definedAtData: DefinedAt[];
129
132
  };
130
133
  /** Defined internally by Vike (currently, Vike doesn't support computed configs created by users). */
131
134
  type ConfigValueComputed = {
@@ -133,8 +136,16 @@ type ConfigValueComputed = {
133
136
  value: unknown;
134
137
  definedAtData: null;
135
138
  };
136
- type DefinedAtData = DefinedAtFile | DefinedAtFile[] | null;
139
+ type DefinedAtData = DefinedAt | DefinedAt[] | null;
140
+ type DefinedAt = DefinedAtFile | DefinedBy;
141
+ type DefinedBy = {
142
+ definedBy: 'cli' | 'env';
143
+ } | {
144
+ definedBy: 'api';
145
+ operation: Operation;
146
+ };
137
147
  type DefinedAtFile = {
138
148
  filePathToShowToUser: string;
139
149
  fileExportPathToShowToUser: null | string[];
150
+ definedBy?: undefined;
140
151
  };
@@ -3,9 +3,9 @@ export { getConfigDefinedAtOptional };
3
3
  export { getDefinedAtString };
4
4
  export type { ConfigDefinedAt };
5
5
  export type { ConfigDefinedAtOptional };
6
- import type { DefinedAtData, DefinedAtFile } from './PageConfig.js';
6
+ import type { DefinedAtData } from './PageConfig.js';
7
7
  type ConfigDefinedAtOptional = ConfigDefinedAt | `Config ${string} defined internally`;
8
8
  type ConfigDefinedAt = `Config ${string} defined at ${string}`;
9
- declare function getConfigDefinedAt<SentenceBegin extends 'Config' | 'config', ConfigName extends string>(sentenceBegin: SentenceBegin, configName: ConfigName, definedAtData: DefinedAtFile | DefinedAtFile[]): `${SentenceBegin} ${ConfigName} defined at ${string}`;
9
+ declare function getConfigDefinedAt<SentenceBegin extends 'Config' | 'config', ConfigName extends string>(sentenceBegin: SentenceBegin, configName: ConfigName, definedAtData: NonNullable<DefinedAtData>): `${SentenceBegin} ${ConfigName} defined at ${string}`;
10
10
  declare function getConfigDefinedAtOptional<SentenceBegin extends 'Config' | 'config', ConfigName extends string>(sentenceBegin: SentenceBegin, configName: ConfigName, definedAtData: DefinedAtData): `${SentenceBegin} ${ConfigName} defined ${'internally' | `at ${string}`}`;
11
- declare function getDefinedAtString(definedAtData: DefinedAtFile | DefinedAtFile[], configName: string): string;
11
+ declare function getDefinedAtString(definedAtData: NonNullable<DefinedAtData>, configName: string): string;
@@ -1,7 +1,7 @@
1
1
  export { getConfigDefinedAt };
2
2
  export { getConfigDefinedAtOptional };
3
3
  export { getDefinedAtString };
4
- import { assert, isArray } from '../utils.js';
4
+ import { assert, checkType, isArray } from '../utils.js';
5
5
  import pc from '@brillout/picocolors';
6
6
  import { getExportPath } from './getExportPath.js';
7
7
  function getConfigDefinedAt(sentenceBegin, configName, definedAtData) {
@@ -28,8 +28,10 @@ function getDefinedAtString(definedAtData, configName) {
28
28
  }
29
29
  assert(files.length >= 1);
30
30
  const definedAtString = files
31
- .map((source) => {
32
- const { filePathToShowToUser, fileExportPathToShowToUser } = source;
31
+ .map((definedAt) => {
32
+ if (definedAt.definedBy)
33
+ return getDefinedByString(definedAt, configName);
34
+ const { filePathToShowToUser, fileExportPathToShowToUser } = definedAt;
33
35
  let s = filePathToShowToUser;
34
36
  const exportPath = getExportPath(fileExportPathToShowToUser, configName);
35
37
  if (exportPath) {
@@ -40,3 +42,17 @@ function getDefinedAtString(definedAtData, configName) {
40
42
  .join(' / ');
41
43
  return definedAtString;
42
44
  }
45
+ function getDefinedByString(definedAt, configName) {
46
+ if (definedAt.definedBy === 'api') {
47
+ return `API call ${pc.cyan(`${definedAt.operation}({${configName}})`)}`;
48
+ }
49
+ const { definedBy } = definedAt;
50
+ if (definedBy === 'cli') {
51
+ return `CLI option ${pc.cyan(`--${configName}`)}`;
52
+ }
53
+ if (definedBy === 'env') {
54
+ return `environment variable ${pc.cyan(`VIKE_OPTIONS="{${configName}}"`)}`;
55
+ }
56
+ checkType(definedBy);
57
+ assert(false);
58
+ }
@@ -31,7 +31,7 @@ function getConfigValue(pageConfig, configName) {
31
31
  return {
32
32
  type: 'standard',
33
33
  value: configValueSource.value,
34
- definedAtData: getDefinedAtFile(configValueSource)
34
+ definedAtData: getDefinedAt(configValueSource)
35
35
  };
36
36
  }
37
37
  else {
@@ -51,13 +51,16 @@ function mergeCumulative(configValueSources) {
51
51
  assert(configValueSource.configEnv.config === true);
52
52
  assert(configValueSource.valueIsLoaded);
53
53
  value.push(configValueSource.value);
54
- definedAtData.push(getDefinedAtFile(configValueSource));
54
+ definedAtData.push(getDefinedAt(configValueSource));
55
55
  });
56
56
  return { value, definedAtData };
57
57
  }
58
- function getDefinedAtFile(configValueSource) {
58
+ function getDefinedAt(configValueSource) {
59
+ const { definedAtFilePath } = configValueSource;
60
+ if (definedAtFilePath.definedBy)
61
+ return definedAtFilePath;
59
62
  return {
60
- filePathToShowToUser: configValueSource.definedAtFilePath.filePathToShowToUser,
61
- fileExportPathToShowToUser: configValueSource.definedAtFilePath.fileExportPathToShowToUser
63
+ filePathToShowToUser: definedAtFilePath.filePathToShowToUser,
64
+ fileExportPathToShowToUser: definedAtFilePath.fileExportPathToShowToUser
62
65
  };
63
66
  }
@@ -12,7 +12,7 @@ function getConfigValueFilePathToShowToUser(definedAtData) {
12
12
  // A unique file path only exists if the config value isn't cumulative nor computed:
13
13
  // - cumulative config values have multiple file paths
14
14
  // - computed values don't have any file path
15
- if (!definedAtData || isArray(definedAtData))
15
+ if (!definedAtData || isArray(definedAtData) || definedAtData.definedBy)
16
16
  return null;
17
17
  const { filePathToShowToUser } = definedAtData;
18
18
  assert(filePathToShowToUser);
@@ -3,8 +3,8 @@ export { parseConfigValuesSerialized };
3
3
  import type { ConfigValues, PageConfigRuntime, PageConfigGlobalRuntime } from '../PageConfig.js';
4
4
  import type { PageConfigGlobalRuntimeSerialized, PageConfigRuntimeSerialized } from './PageConfigSerialized.js';
5
5
  import type { ConfigValueSerialized } from './PageConfigSerialized.js';
6
- declare function parseConfigValuesSerialized(configValuesSerialized: Record<string, ConfigValueSerialized>): ConfigValues;
7
6
  declare function parsePageConfigs(pageConfigsSerialized: PageConfigRuntimeSerialized[], pageConfigGlobalSerialized: PageConfigGlobalRuntimeSerialized): {
8
7
  pageConfigs: PageConfigRuntime[];
9
8
  pageConfigGlobal: PageConfigGlobalRuntime;
10
9
  };
10
+ declare function parseConfigValuesSerialized(configValuesSerialized: Record<string, ConfigValueSerialized>): ConfigValues;
@@ -4,10 +4,6 @@ import { assert, assertUsage, isCallable } from '../../utils.js';
4
4
  import { getConfigDefinedAt } from '../getConfigDefinedAt.js';
5
5
  import { parseTransform } from '@brillout/json-serializer/parse';
6
6
  import { assertPlusFileExport } from '../assertPlusFileExport.js';
7
- function parseConfigValuesSerialized(configValuesSerialized) {
8
- const configValues = parseConfigValuesSerialized_tmp(configValuesSerialized);
9
- return configValues;
10
- }
11
7
  function parsePageConfigs(pageConfigsSerialized, pageConfigGlobalSerialized) {
12
8
  // pageConfigs
13
9
  const pageConfigs = pageConfigsSerialized.map((pageConfigSerialized) => {
@@ -43,7 +39,7 @@ function assertRouteConfigValue(configValues) {
43
39
  }
44
40
  */
45
41
  }
46
- function parseConfigValuesSerialized_tmp(configValuesSerialized) {
42
+ function parseConfigValuesSerialized(configValuesSerialized) {
47
43
  const configValues = {};
48
44
  Object.entries(configValuesSerialized).forEach(([configName, configValueSeriliazed]) => {
49
45
  let configValue;
@@ -100,6 +96,7 @@ function parseValueSerialized(valueSerialized, configName, getDefinedAtFile) {
100
96
  if (valueSerialized.type === 'plus-file') {
101
97
  const definedAtFile = getDefinedAtFile();
102
98
  const { exportValues } = valueSerialized;
99
+ assert(!definedAtFile.definedBy);
103
100
  assertPlusFileExport(exportValues, definedAtFile.filePathToShowToUser, configName);
104
101
  let value;
105
102
  let valueWasFound = false;
@@ -2,7 +2,7 @@ export { serializeConfigValues };
2
2
  export { getConfigValuesBase };
3
3
  export { isJsonValue };
4
4
  export type { FilesEnv };
5
- import type { ConfigEnvInternal, ConfigValueSource, DefinedAtFile, PageConfigBuildTime, PageConfigGlobalBuildTime } from '../PageConfig.js';
5
+ import type { ConfigEnvInternal, ConfigValueSource, DefinedAt, PageConfigBuildTime, PageConfigGlobalBuildTime } from '../PageConfig.js';
6
6
  declare function serializeConfigValues(pageConfig: PageConfigBuildTime | PageConfigGlobalBuildTime, importStatements: string[], filesEnv: FilesEnv, isEnvMatch: (configEnv: ConfigEnvInternal) => boolean, tabspace: string, isEager: boolean | null): string[];
7
7
  declare function isJsonValue(value: unknown): boolean;
8
8
  declare function getConfigValuesBase(pageConfig: PageConfigBuildTime | PageConfigGlobalBuildTime, isEnvMatch: (configEnv: ConfigEnvInternal) => boolean, isEager: boolean | null): ConfigValuesBase;
@@ -17,14 +17,14 @@ type ConfigValuesBase = ({
17
17
  } | {
18
18
  configValueBase: {
19
19
  type: 'standard';
20
- definedAtData: DefinedAtFile;
20
+ definedAtData: DefinedAt;
21
21
  };
22
22
  sourceRelevant: ConfigValueSource;
23
23
  configName: string;
24
24
  } | {
25
25
  configValueBase: {
26
26
  type: 'cumulative';
27
- definedAtData: DefinedAtFile[];
27
+ definedAtData: DefinedAt[];
28
28
  };
29
29
  sourcesRelevant: ConfigValueSource[];
30
30
  configName: string;
@@ -99,6 +99,7 @@ function serializeConfigValue(configValueBase, valueData, configName, lines, tab
99
99
  function getValueSerializedWithImport(configValueSource, importStatements, filesEnv, configName) {
100
100
  assert(!configValueSource.valueIsFilePath);
101
101
  const { valueIsDefinedByPlusValueFile, definedAtFilePath, configEnv } = configValueSource;
102
+ assert(!definedAtFilePath.definedBy);
102
103
  const { filePathAbsoluteVite, fileExportName } = definedAtFilePath;
103
104
  if (valueIsDefinedByPlusValueFile)
104
105
  assert(fileExportName === undefined);
@@ -226,9 +227,12 @@ function getConfigValuesBase(pageConfig, isEnvMatch, isEager) {
226
227
  return [...fromComputed, ...fromSources].filter((r) => r !== 'SKIP');
227
228
  }
228
229
  function getDefinedAtFileSource(source) {
230
+ const { definedAtFilePath } = source;
231
+ if (definedAtFilePath.definedBy)
232
+ return definedAtFilePath;
229
233
  const definedAtFile = {
230
- filePathToShowToUser: source.definedAtFilePath.filePathToShowToUser,
231
- fileExportPathToShowToUser: source.definedAtFilePath.fileExportPathToShowToUser
234
+ filePathToShowToUser: definedAtFilePath.filePathToShowToUser,
235
+ fileExportPathToShowToUser: definedAtFilePath.fileExportPathToShowToUser
232
236
  };
233
237
  return definedAtFile;
234
238
  }
@@ -60,11 +60,11 @@ function getPageRoutes(filesystemRoots, pageFilesAll, pageConfigs, allPageIds) {
60
60
  if (!pageRoute) {
61
61
  const { routeFilesystem } = pageConfig;
62
62
  assert(routeFilesystem);
63
- const { routeString, definedBy } = routeFilesystem;
63
+ const { routeString, definedAtLocation } = routeFilesystem;
64
64
  assert(routeFilesystem.routeString.startsWith('/'));
65
65
  pageRoute = {
66
66
  pageId,
67
- routeFilesystemDefinedBy: definedBy,
67
+ routeFilesystemDefinedBy: definedAtLocation,
68
68
  comesFromV1PageConfig,
69
69
  routeString,
70
70
  routeDefinedAtString: null,
@@ -8,9 +8,11 @@ export type { PageContextBuiltInServer } from '../shared/types.js';
8
8
  export type { PageContextBuiltInClientWithClientRouting } from '../shared/types.js';
9
9
  export type { PageContextBuiltInClientWithServerRouting } from '../shared/types.js';
10
10
  export type { Config, ConfigMeta as Meta, ImportString, DataAsync, DataSync, GuardAsync, GuardSync, OnBeforePrerenderStartAsync, OnBeforePrerenderStartSync, OnBeforeRenderAsync, OnBeforeRenderSync, OnBeforeRouteAsync, OnBeforeRouteSync, OnHydrationEndAsync, OnHydrationEndSync, OnPageTransitionEndAsync, OnPageTransitionEndSync, OnPageTransitionStartAsync, OnPageTransitionStartSync, OnPrerenderStartAsync, OnPrerenderStartSync, OnRenderClientAsync, OnRenderClientSync, OnRenderHtmlAsync, OnRenderHtmlSync, RouteAsync, RouteSync, KeepScrollPosition } from '../shared/page-configs/Config.js';
11
+ export type { ConfigResolved } from '../shared/page-configs/Config/PageContextConfig.js';
11
12
  export type { ConfigEnv } from '../shared/page-configs/PageConfig.js';
12
13
  export type { ConfigDefinition, ConfigEffect } from '../node/plugin/plugins/importUserCode/v1-design/getVikeConfig/configDefinitionsBuiltIn.js';
13
14
  export type { ConfigEntries } from '../shared/page-configs/getPageConfigUserFriendly.js';
15
+ export type { VikeConfigPublic as VikeConfig } from '../node/plugin/plugins/commonConfig.js';
14
16
  export type { UrlPublic as Url } from '../utils/parseUrl.js';
15
17
  export type { InjectFilterEntry } from '../node/runtime/html/injectAssets/getHtmlTags.js';
16
18
  export { defineConfig } from './defineConfig.js';
@@ -1 +1 @@
1
- export declare const PROJECT_VERSION: "0.4.224";
1
+ export declare const PROJECT_VERSION: "0.4.225";
@@ -1,2 +1,2 @@
1
1
  // Automatically updated by @brillout/release-me
2
- export const PROJECT_VERSION = '0.4.224';
2
+ export const PROJECT_VERSION = '0.4.225';
@@ -12,7 +12,7 @@ import { assertSingleInstance_onAssertModuleLoad } from './assertSingleInstance.
12
12
  import { createErrorWithCleanStackTrace } from './createErrorWithCleanStackTrace.js';
13
13
  import { getGlobalObject } from './getGlobalObject.js';
14
14
  import { isObject } from './isObject.js';
15
- import { projectInfo } from './projectInfo.js';
15
+ import { PROJECT_VERSION } from './PROJECT_VERSION.js';
16
16
  import pc from '@brillout/picocolors';
17
17
  const globalObject = getGlobalObject('utils/assert.ts', {
18
18
  alreadyLogged: new Set(),
@@ -29,7 +29,7 @@ const globalObject = getGlobalObject('utils/assert.ts', {
29
29
  });
30
30
  assertSingleInstance_onAssertModuleLoad();
31
31
  const projectTag = `[vike]`;
32
- const projectTagWithVersion = `[vike@${projectInfo.projectVersion}]`;
32
+ const projectTagWithVersion = `[vike@${PROJECT_VERSION}]`;
33
33
  const bugTag = 'Bug';
34
34
  const numberOfStackTraceLinesToRemove = 2;
35
35
  function assert(condition, debugInfo) {