vike 0.4.224-commit-00ed9fe → 0.4.225-commit-37a36a5

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 (112) 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 +15 -4
  13. package/dist/cjs/node/plugin/plugins/devConfig/determineOptimizeDeps.js +6 -4
  14. package/dist/cjs/node/plugin/plugins/importUserCode/index.js +14 -10
  15. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/configDefinitionsBuiltIn.js +10 -2
  16. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/transpileAndExecuteFile.js +11 -12
  17. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig.js +138 -83
  18. package/dist/cjs/node/plugin/plugins/setGlobalContext.js +10 -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/resolvePrerenderConfig.js +25 -17
  22. package/dist/cjs/node/prerender/runPrerender.js +2 -2
  23. package/dist/cjs/node/prerender/utils.js +1 -1
  24. package/dist/cjs/node/runtime/globalContext.js +9 -5
  25. package/dist/cjs/node/runtime/html/injectAssets/getViteDevScript.js +6 -3
  26. package/dist/cjs/node/runtime/renderPage/createHttpResponse/assertNoInfiniteHttpRedirect.js +3 -2
  27. package/dist/cjs/node/runtime/utils.js +0 -1
  28. package/dist/cjs/node/runtime-dev/createDevMiddleware.js +10 -8
  29. package/dist/cjs/node/shared/assertV1Design.js +2 -1
  30. package/dist/cjs/node/shared/utils.js +0 -1
  31. package/dist/cjs/shared/page-configs/getConfigDefinedAt.js +19 -2
  32. package/dist/cjs/shared/page-configs/getConfigValueBuildTime.js +8 -5
  33. package/dist/cjs/shared/page-configs/helpers.js +1 -1
  34. package/dist/cjs/shared/page-configs/serialize/parsePageConfigs.js +2 -5
  35. package/dist/cjs/shared/page-configs/serialize/serializeConfigValues.js +9 -5
  36. package/dist/cjs/shared/route/loadPageRoutes.js +2 -2
  37. package/dist/cjs/utils/PROJECT_VERSION.js +1 -1
  38. package/dist/cjs/utils/assert.js +11 -4
  39. package/dist/cjs/utils/assertSingleInstance.js +11 -17
  40. package/dist/cjs/utils/getRandomId.js +1 -1
  41. package/dist/cjs/utils/normalizeHeaders.js +1 -1
  42. package/dist/esm/client/client-routing-runtime/createPageContext.d.ts +1 -1
  43. package/dist/esm/client/client-routing-runtime/createPageContext.js +2 -2
  44. package/dist/esm/node/api/build.js +1 -1
  45. package/dist/esm/node/api/context.d.ts +8 -2
  46. package/dist/esm/node/api/context.js +4 -4
  47. package/dist/esm/node/api/dev.js +1 -1
  48. package/dist/esm/node/api/prepareViteApiCall.d.ts +2 -2
  49. package/dist/esm/node/api/prepareViteApiCall.js +3 -2
  50. package/dist/esm/node/api/prerender.js +1 -1
  51. package/dist/esm/node/api/preview.js +1 -1
  52. package/dist/esm/node/api/types.d.ts +7 -0
  53. package/dist/esm/node/cli/context.d.ts +4 -2
  54. package/dist/esm/node/cli/context.js +5 -4
  55. package/dist/esm/node/cli/entry.js +4 -4
  56. package/dist/esm/node/cli/parseCli.d.ts +3 -0
  57. package/dist/esm/node/cli/parseCli.js +44 -16
  58. package/dist/esm/node/cli/utils.d.ts +1 -1
  59. package/dist/esm/node/cli/utils.js +1 -1
  60. package/dist/esm/node/plugin/plugins/build/pluginBuildEntry.js +2 -2
  61. package/dist/esm/node/plugin/plugins/commonConfig.js +15 -4
  62. package/dist/esm/node/plugin/plugins/devConfig/determineOptimizeDeps.js +6 -4
  63. package/dist/esm/node/plugin/plugins/importUserCode/index.js +15 -11
  64. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/configDefinitionsBuiltIn.d.ts +3 -1
  65. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/configDefinitionsBuiltIn.js +10 -2
  66. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/transpileAndExecuteFile.d.ts +5 -2
  67. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/transpileAndExecuteFile.js +11 -12
  68. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig.d.ts +3 -2
  69. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig.js +140 -84
  70. package/dist/esm/node/plugin/plugins/setGlobalContext.js +11 -2
  71. package/dist/esm/node/plugin/shared/getEnvVarObject.d.ts +3 -1
  72. package/dist/esm/node/plugin/shared/getEnvVarObject.js +9 -8
  73. package/dist/esm/node/plugin/shared/loggerNotProd/log.js +2 -2
  74. package/dist/esm/node/prerender/resolvePrerenderConfig.js +26 -18
  75. package/dist/esm/node/prerender/runPrerender.js +3 -3
  76. package/dist/esm/node/prerender/utils.d.ts +1 -1
  77. package/dist/esm/node/prerender/utils.js +1 -1
  78. package/dist/esm/node/runtime/globalContext.js +10 -6
  79. package/dist/esm/node/runtime/html/injectAssets/getViteDevScript.js +6 -3
  80. package/dist/esm/node/runtime/index-deprecated.d.ts +1 -3
  81. package/dist/esm/node/runtime/renderPage/createHttpResponse/assertNoInfiniteHttpRedirect.d.ts +1 -1
  82. package/dist/esm/node/runtime/renderPage/createHttpResponse/assertNoInfiniteHttpRedirect.js +3 -2
  83. package/dist/esm/node/runtime/utils.d.ts +0 -1
  84. package/dist/esm/node/runtime/utils.js +0 -1
  85. package/dist/esm/node/runtime-dev/createDevMiddleware.js +10 -8
  86. package/dist/esm/node/shared/assertV1Design.js +2 -1
  87. package/dist/esm/node/shared/utils.d.ts +0 -1
  88. package/dist/esm/node/shared/utils.js +0 -1
  89. package/dist/esm/shared/page-configs/Config.d.ts +19 -1
  90. package/dist/esm/shared/page-configs/PageConfig.d.ts +16 -5
  91. package/dist/esm/shared/page-configs/getConfigDefinedAt.d.ts +5 -3
  92. package/dist/esm/shared/page-configs/getConfigDefinedAt.js +20 -3
  93. package/dist/esm/shared/page-configs/getConfigValueBuildTime.js +8 -5
  94. package/dist/esm/shared/page-configs/helpers.js +1 -1
  95. package/dist/esm/shared/page-configs/serialize/parsePageConfigs.d.ts +1 -1
  96. package/dist/esm/shared/page-configs/serialize/parsePageConfigs.js +2 -5
  97. package/dist/esm/shared/page-configs/serialize/serializeConfigValues.d.ts +3 -3
  98. package/dist/esm/shared/page-configs/serialize/serializeConfigValues.js +9 -5
  99. package/dist/esm/shared/route/loadPageRoutes.js +2 -2
  100. package/dist/esm/shared/types.d.ts +5 -1
  101. package/dist/esm/utils/PROJECT_VERSION.d.ts +1 -1
  102. package/dist/esm/utils/PROJECT_VERSION.js +1 -1
  103. package/dist/esm/utils/assert.d.ts +2 -1
  104. package/dist/esm/utils/assert.js +11 -4
  105. package/dist/esm/utils/assertSingleInstance.js +11 -17
  106. package/dist/esm/utils/getRandomId.d.ts +1 -1
  107. package/dist/esm/utils/getRandomId.js +1 -1
  108. package/dist/esm/utils/normalizeHeaders.js +1 -1
  109. package/package.json +5 -3
  110. package/dist/cjs/utils/projectInfo.js +0 -8
  111. package/dist/esm/utils/projectInfo.d.ts +0 -4
  112. package/dist/esm/utils/projectInfo.js +0 -5
@@ -1,25 +1,33 @@
1
1
  export { resolvePrerenderConfigGlobal };
2
2
  export { resolvePrerenderConfigLocal };
3
- import { assert, isArray, objectAssign } from './utils.js';
3
+ import { assert, isArray, isObject, objectAssign } from './utils.js';
4
4
  import { getConfigValueBuildTime } from '../../shared/page-configs/getConfigValueBuildTime.js';
5
+ // When setting +prerender to an object => it also enables pre-rendering
6
+ const defaultValueForObject = true;
5
7
  function resolvePrerenderConfigGlobal(vikeConfig) {
6
- const prerenderConfigs = vikeConfig.global.config.prerender;
7
- let prerenderConfigList = prerenderConfigs || [];
8
- // Needed because of backwards compatibility of `vike({prerender:true})` in `vite.config.js`; after we remove it we can remove this line.
9
- prerenderConfigList = prerenderConfigList.filter(isObject2);
10
- assert(prerenderConfigList.every(isObject2)); // Help TS
8
+ const prerenderConfigs = vikeConfig.global.config.prerender || [];
9
+ const prerenderSettings = prerenderConfigs.filter(isObject2);
11
10
  const prerenderConfigGlobal = {
12
- partial: pickFirst(prerenderConfigList.map((c) => c.partial)) ?? false,
13
- noExtraDir: pickFirst(prerenderConfigList.map((c) => c.noExtraDir)) ?? false,
14
- parallel: pickFirst(prerenderConfigList.map((c) => c.parallel)) ?? true,
15
- disableAutoRun: pickFirst(prerenderConfigList.map((c) => c.disableAutoRun)) ?? false
11
+ partial: pickFirst(prerenderSettings.map((c) => c.partial)) ?? false,
12
+ noExtraDir: pickFirst(prerenderSettings.map((c) => c.noExtraDir)) ?? false,
13
+ parallel: pickFirst(prerenderSettings.map((c) => c.parallel)) ?? true,
14
+ disableAutoRun: pickFirst(prerenderSettings.map((c) => c.disableAutoRun)) ?? false
16
15
  };
17
- const prerenderConfigGlobalLocalValue = prerenderConfigList.map((c) => c.value).filter((v) => v !== null);
18
- const defaultLocalValue = pickFirst(prerenderConfigGlobalLocalValue) ??
19
- (prerenderConfigGlobalLocalValue.length > 0 ||
20
- // Backwards compatibility for with vike({ prerender: true }) in vite.config.js
21
- prerenderConfigs?.some((p) => p === true) ||
22
- false);
16
+ let defaultLocalValue = false;
17
+ {
18
+ const valueFirst = prerenderConfigs.filter((p) => !isObject(p) || p.value !== null)[0];
19
+ if (valueFirst === true || (isObject(valueFirst) && (valueFirst.value ?? defaultValueForObject))) {
20
+ defaultLocalValue = true;
21
+ }
22
+ }
23
+ // TODO/next-major: remove
24
+ // Backwards compatibility for `vike({prerender:true})` in vite.config.js
25
+ {
26
+ const valuesWithDefinedAt = vikeConfig.global._from.configsCumulative.prerender?.values ?? [];
27
+ if (valuesWithDefinedAt.some((v) => v.definedAt.includes('vite.config.js') && v.value)) {
28
+ defaultLocalValue = true;
29
+ }
30
+ }
23
31
  objectAssign(prerenderConfigGlobal, {
24
32
  defaultLocalValue,
25
33
  isPrerenderingEnabledForAllPages: vikeConfig.pageConfigs.length > 0 &&
@@ -45,8 +53,8 @@ function resolvePrerenderConfigLocal(pageConfig) {
45
53
  const prerenderConfigLocal = { value };
46
54
  return prerenderConfigLocal;
47
55
  }
48
- function isObject2(p) {
49
- return typeof p === 'object' && p !== null;
56
+ function isObject2(value) {
57
+ return typeof value === 'object' && value !== null;
50
58
  }
51
59
  function pickFirst(arr) {
52
60
  return arr.filter((v) => v !== undefined)[0];
@@ -4,7 +4,7 @@ export { runPrerenderFromAutoRun };
4
4
  export { runPrerender_forceExit };
5
5
  import path from 'path';
6
6
  import { route } from '../../shared/route/index.js';
7
- import { assert, assertUsage, assertWarning, hasProp, projectInfo, objectAssign, isObjectWithKeys, isCallable, isPropertyGetter, assertPosixPath, urlToFile, isPlainObject, pLimit, isArray, changeEnumerable, onSetupPrerender, isObject, makePublicCopy } from './utils.js';
7
+ import { assert, assertUsage, assertWarning, hasProp, objectAssign, isObjectWithKeys, isCallable, isPropertyGetter, assertPosixPath, urlToFile, isPlainObject, pLimit, isArray, changeEnumerable, onSetupPrerender, isObject, makePublicCopy, PROJECT_VERSION } from './utils.js';
8
8
  import { prerenderPage, prerender404Page, getPageContextInitEnhanced } from '../runtime/renderPage/renderPageAlreadyRouted.js';
9
9
  import pc from '@brillout/picocolors';
10
10
  import { cpus } from 'os';
@@ -38,7 +38,7 @@ async function runPrerenderFromAPI(options = {}) {
38
38
  }
39
39
  async function runPrerenderFromCLIPrerenderCommand() {
40
40
  try {
41
- const { viteConfigEnhanced } = await prepareViteApiCall(undefined, 'prerender');
41
+ const { viteConfigEnhanced } = await prepareViteApiCall({}, 'prerender');
42
42
  await runPrerender({ viteConfig: viteConfigEnhanced }, '$ vike prerender');
43
43
  }
44
44
  catch (err) {
@@ -75,7 +75,7 @@ async function runPrerender(options = {}, standaloneTrigger) {
75
75
  getHook_setIsPrerenderering();
76
76
  const logLevel = !!options.onPagePrerender ? 'warn' : 'info';
77
77
  if (logLevel === 'info') {
78
- console.log(`${pc.cyan(`vike v${projectInfo.projectVersion}`)} ${pc.green('pre-rendering HTML...')}`);
78
+ console.log(`${pc.cyan(`vike v${PROJECT_VERSION}`)} ${pc.green('pre-rendering HTML...')}`);
79
79
  }
80
80
  await disableReactStreaming();
81
81
  const viteConfig = await resolveConfig(options.viteConfig || {}, 'build', 'production');
@@ -1,6 +1,6 @@
1
1
  export * from '../../utils/assert.js';
2
2
  export * from '../../utils/hasProp.js';
3
- export * from '../../utils/projectInfo.js';
3
+ export * from '../../utils/PROJECT_VERSION.js';
4
4
  export * from '../../utils/objectAssign.js';
5
5
  export * from '../../utils/isObjectWithKeys.js';
6
6
  export * from '../../utils/isCallable.js';
@@ -2,7 +2,7 @@ import { assertIsNotBrowser } from '../../utils/assertIsNotBrowser.js';
2
2
  assertIsNotBrowser();
3
3
  export * from '../../utils/assert.js';
4
4
  export * from '../../utils/hasProp.js';
5
- export * from '../../utils/projectInfo.js';
5
+ export * from '../../utils/PROJECT_VERSION.js';
6
6
  export * from '../../utils/objectAssign.js';
7
7
  export * from '../../utils/isObjectWithKeys.js';
8
8
  export * from '../../utils/isCallable.js';
@@ -25,7 +25,7 @@ export { updateUserFiles };
25
25
  // - Without vike-server it's manually loaded here using importServerProductionEntry() which uses @brillout/vite-plugin-server-entry's autoImporter or crawler
26
26
  // - In development: globalObject.viteDevServer which is Vite's development server
27
27
  // - globalObject.viteDevServer is used by updateUserFiles() which then sets globalConfig.userFiles
28
- import { assert, onSetupRuntime, assertUsage, assertWarning, isPlainObject, objectAssign, objectReplace, isObject, hasProp, debugGlob, getGlobalObject, genPromise, createDebugger, makePublicCopy, projectInfo, checkType } from './utils.js';
28
+ import { assert, onSetupRuntime, assertUsage, assertWarning, isPlainObject, objectAssign, objectReplace, isObject, hasProp, debugGlob, getGlobalObject, genPromise, createDebugger, makePublicCopy, checkType, PROJECT_VERSION } from './utils.js';
29
29
  import { importServerProductionEntry } from '@brillout/vite-plugin-server-entry/runtime';
30
30
  import { virtualFileIdImportUserCodeServer } from '../shared/virtual-files/virtualFileImportUserCode.js';
31
31
  import pc from '@brillout/picocolors';
@@ -89,9 +89,10 @@ function makePublic(globalContext) {
89
89
  async function setGlobalContext_viteDevServer(viteDevServer) {
90
90
  debug('setGlobalContext_viteDevServer()');
91
91
  setIsProduction(false);
92
- if (globalObject.viteDevServer)
93
- return;
94
- assertIsNotInitilizedYet();
92
+ // We cannot cache globalObject.viteDevServer because it's fully replaced when the user modifies vite.config.js => Vite's dev server is fully reloaded and a new viteDevServer replaces the previous one.
93
+ if (!globalObject.viteDevServer) {
94
+ assertIsNotInitilizedYet();
95
+ }
95
96
  assert(globalObject.viteConfig);
96
97
  globalObject.viteDevServer = viteDevServer;
97
98
  await updateUserFiles();
@@ -351,7 +352,7 @@ function assertBuildInfo(buildInfo) {
351
352
  checkType({ ...buildInfo, viteConfigRuntime: buildInfo.viteConfigRuntime });
352
353
  }
353
354
  function assertVersionAtBuildTime(versionAtBuildTime) {
354
- const versionAtRuntime = projectInfo.projectVersion;
355
+ const versionAtRuntime = PROJECT_VERSION;
355
356
  const pretty = (version) => pc.bold(`vike@${version}`);
356
357
  assertUsage(versionAtBuildTime === versionAtRuntime, `Re-build your app (you're using ${pretty(versionAtRuntime)} but your app was built with ${pretty(versionAtBuildTime)})`);
357
358
  }
@@ -369,7 +370,7 @@ async function updateUserFiles() {
369
370
  const { promise, resolve } = genPromise();
370
371
  assert(!globalObject.isProduction);
371
372
  globalObject.waitForUserFilesUpdate = promise;
372
- const viteDevServer = getViteDevServer();
373
+ const { viteDevServer } = globalObject;
373
374
  assert(viteDevServer);
374
375
  let virtualFileExports;
375
376
  try {
@@ -381,6 +382,9 @@ async function updateUserFiles() {
381
382
  }
382
383
  virtualFileExports = virtualFileExports.default || virtualFileExports;
383
384
  debugGlob('Glob result: ', virtualFileExports);
385
+ // Avoid race condition: abort if there is a new globalObject.viteDevServer (happens when vite.config.js is modified => Vite's dev server is fully reloaded).
386
+ if (viteDevServer !== globalObject.viteDevServer)
387
+ return;
384
388
  await setUserFiles(virtualFileExports);
385
389
  resolve();
386
390
  }
@@ -1,6 +1,7 @@
1
1
  export { getViteDevScript };
2
2
  import { assert, assertUsage, assertWarning } from '../../utils.js';
3
3
  import pc from '@brillout/picocolors';
4
+ const reachOutCTA = 'Create a new GitHub issue to discuss a solution.';
4
5
  async function getViteDevScript(pageContext) {
5
6
  const globalContext = pageContext._globalContext;
6
7
  if (globalContext.isProduction) {
@@ -12,11 +13,13 @@ async function getViteDevScript(pageContext) {
12
13
  let fakeHtml = fakeHtmlBegin + fakeHtmlEnd;
13
14
  fakeHtml = await viteDevServer.transformIndexHtml('/', fakeHtml);
14
15
  assertUsage(!fakeHtml.includes('vite-plugin-pwa'), `The HTML transformer of ${pc.cyan('vite-plugin-pwa')} cannot be applied, see workaround at https://github.com/vikejs/vike/issues/388#issuecomment-1199280084`);
15
- assertUsage(!fakeHtml.startsWith(fakeHtmlBegin.replace(' ', '')), 'Vite plugins that minify the HTML are not supported by vike, see https://github.com/vikejs/vike/issues/224');
16
- assertUsage(fakeHtml.startsWith(fakeHtmlBegin) && fakeHtml.endsWith(fakeHtmlEnd), 'You are using a Vite Plugin that transforms the HTML in a way that conflicts with vike. Create a new GitHub ticket to discuss a solution.');
16
+ assertUsage(!fakeHtml.startsWith(fakeHtmlBegin.replace(' ', '')), `Vite plugins that minify the HTML cannot be applied, see https://github.com/vikejs/vike/issues/224`);
17
+ assertUsage(fakeHtml.startsWith(fakeHtmlBegin) && fakeHtml.endsWith(fakeHtmlEnd), `You are using a Vite Plugin that transforms the HTML in a way that conflicts with Vike. ${reachOutCTA}`);
17
18
  const viteInjection = fakeHtml.slice(fakeHtmlBegin.length, -1 * fakeHtmlEnd.length);
18
19
  assert(viteInjection.includes('script'));
19
- assertWarning(!viteInjection.includes('import('), 'Unexpected Vite HMR code. Reach out to a Vike maintainer on GitHub.', { onlyOnce: true });
20
+ assertWarning(!viteInjection.includes('import('), `Unexpected Vite injected HMR code. ${reachOutCTA}`, {
21
+ onlyOnce: true
22
+ });
20
23
  const viteDevScript = viteInjection;
21
24
  return viteDevScript;
22
25
  }
@@ -13,6 +13,4 @@ import { RenderErrorPage as RenderErrorPage_ } from '../../shared/route/abort.js
13
13
  *
14
14
  * See https://vike.dev/render
15
15
  */
16
- export declare const RenderErrorPage: (args_0?: {
17
- pageContext?: Record<string, unknown>;
18
- } | undefined) => Error;
16
+ export declare const RenderErrorPage: (...args: Parameters<typeof RenderErrorPage_>) => Error;
@@ -1,4 +1,4 @@
1
1
  export { assertNoInfiniteHttpRedirect };
2
2
  declare function assertNoInfiniteHttpRedirect(urlRedirectTarget: string, pageContextInit: {
3
3
  urlOriginal: string;
4
- }): void;
4
+ }): "DISABLED" | undefined;
@@ -4,14 +4,15 @@ import pc from '@brillout/picocolors';
4
4
  const globalObject = getGlobalObject('createHttpResponse/assertNoInfiniteHttpRedirect.ts', {
5
5
  redirectGraph: {}
6
6
  });
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
7
  function assertNoInfiniteHttpRedirect(
10
8
  // The exact URL that the user will be redirected to.
11
9
  // - It includes the Base URL as well as the locale (i18n) base.
12
10
  urlRedirectTarget,
13
11
  // Rationale for checking against `pageContextInit.urlOriginal`: https://github.com/vikejs/vike/pull/2264#issuecomment-2713890263
14
12
  pageContextInit) {
13
+ // TO-DO/eventually: use cookie as described at https://github.com/vikejs/vike/pull/2273
14
+ if (true)
15
+ return 'DISABLED'; // Disabled until we make it reliable.
15
16
  if (!urlRedirectTarget.startsWith('/')) {
16
17
  // 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
18
  // - 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,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.definedAt)
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
+ definedAt: 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
  };
@@ -1,11 +1,13 @@
1
1
  export { getConfigDefinedAt };
2
2
  export { getConfigDefinedAtOptional };
3
3
  export { getDefinedAtString };
4
+ export { getDefinedByString };
4
5
  export type { ConfigDefinedAt };
5
6
  export type { ConfigDefinedAtOptional };
6
- import type { DefinedAtData, DefinedAtFile } from './PageConfig.js';
7
+ import type { DefinedAtData, DefinedBy } from './PageConfig.js';
7
8
  type ConfigDefinedAtOptional = ConfigDefinedAt | `Config ${string} defined internally`;
8
9
  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}`;
10
+ declare function getConfigDefinedAt<SentenceBegin extends 'Config' | 'config', ConfigName extends string>(sentenceBegin: SentenceBegin, configName: ConfigName, definedAtData: NonNullable<DefinedAtData>): `${SentenceBegin} ${ConfigName} defined at ${string}`;
10
11
  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;
12
+ declare function getDefinedAtString(definedAtData: NonNullable<DefinedAtData>, configName: string): string;
13
+ declare function getDefinedByString(definedAt: DefinedBy, configName: string): `API call dev({ vikeConfig: { ${string} } })` | `API call build({ vikeConfig: { ${string} } })` | `API call preview({ vikeConfig: { ${string} } })` | `API call prerender({ vikeConfig: { ${string} } })` | `CLI option --${string}` | `environment variable VIKE_CONFIG="{${string}}"`;
@@ -1,7 +1,8 @@
1
1
  export { getConfigDefinedAt };
2
2
  export { getConfigDefinedAtOptional };
3
3
  export { getDefinedAtString };
4
- import { assert, isArray } from '../utils.js';
4
+ export { getDefinedByString };
5
+ import { assert, checkType, isArray } from '../utils.js';
5
6
  import pc from '@brillout/picocolors';
6
7
  import { getExportPath } from './getExportPath.js';
7
8
  function getConfigDefinedAt(sentenceBegin, configName, definedAtData) {
@@ -28,8 +29,10 @@ function getDefinedAtString(definedAtData, configName) {
28
29
  }
29
30
  assert(files.length >= 1);
30
31
  const definedAtString = files
31
- .map((source) => {
32
- const { filePathToShowToUser, fileExportPathToShowToUser } = source;
32
+ .map((definedAt) => {
33
+ if (definedAt.definedBy)
34
+ return getDefinedByString(definedAt, configName);
35
+ const { filePathToShowToUser, fileExportPathToShowToUser } = definedAt;
33
36
  let s = filePathToShowToUser;
34
37
  const exportPath = getExportPath(fileExportPathToShowToUser, configName);
35
38
  if (exportPath) {
@@ -40,3 +43,17 @@ function getDefinedAtString(definedAtData, configName) {
40
43
  .join(' / ');
41
44
  return definedAtString;
42
45
  }
46
+ function getDefinedByString(definedAt, configName) {
47
+ if (definedAt.definedBy === 'api') {
48
+ return `API call ${pc.cyan(`${definedAt.operation}({ vikeConfig: { ${configName} } })`)}`;
49
+ }
50
+ const { definedBy } = definedAt;
51
+ if (definedBy === 'cli') {
52
+ return `CLI option ${pc.cyan(`--${configName}`)}`;
53
+ }
54
+ if (definedBy === 'env') {
55
+ return `environment variable ${pc.cyan(`VIKE_CONFIG="{${configName}}"`)}`;
56
+ }
57
+ checkType(definedBy);
58
+ assert(false);
59
+ }
@@ -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 { definedAt } = configValueSource;
60
+ if (definedAt.definedBy)
61
+ return definedAt;
59
62
  return {
60
- filePathToShowToUser: configValueSource.definedAtFilePath.filePathToShowToUser,
61
- fileExportPathToShowToUser: configValueSource.definedAtFilePath.fileExportPathToShowToUser
63
+ filePathToShowToUser: definedAt.filePathToShowToUser,
64
+ fileExportPathToShowToUser: definedAt.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;
@@ -47,7 +47,7 @@ function serializeConfigValues(pageConfig, importStatements, filesEnv, isEnvMatc
47
47
  function getValueSerializedFromSource(configValueSource, configName, importStatements, filesEnv) {
48
48
  let valueData;
49
49
  if (configValueSource.valueIsLoaded && !configValueSource.valueIsLoadedWithImport) {
50
- valueData = getValueSerializedWithJson(configValueSource.value, configName, configValueSource.definedAtFilePath, importStatements, filesEnv, configValueSource.configEnv);
50
+ valueData = getValueSerializedWithJson(configValueSource.value, configName, configValueSource.definedAt, importStatements, filesEnv, configValueSource.configEnv);
51
51
  }
52
52
  else {
53
53
  valueData = getValueSerializedWithImport(configValueSource, importStatements, filesEnv, configName);
@@ -98,8 +98,9 @@ function serializeConfigValue(configValueBase, valueData, configName, lines, tab
98
98
  }
99
99
  function getValueSerializedWithImport(configValueSource, importStatements, filesEnv, configName) {
100
100
  assert(!configValueSource.valueIsFilePath);
101
- const { valueIsDefinedByPlusValueFile, definedAtFilePath, configEnv } = configValueSource;
102
- const { filePathAbsoluteVite, fileExportName } = definedAtFilePath;
101
+ const { valueIsDefinedByPlusValueFile, definedAt, configEnv } = configValueSource;
102
+ assert(!definedAt.definedBy);
103
+ const { filePathAbsoluteVite, fileExportName } = definedAt;
103
104
  if (valueIsDefinedByPlusValueFile)
104
105
  assert(fileExportName === undefined);
105
106
  const { importName } = addImportStatement(importStatements, filePathAbsoluteVite, fileExportName || '*', filesEnv, configEnv, configName);
@@ -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 { definedAt } = source;
231
+ if (definedAt.definedBy)
232
+ return definedAt;
229
233
  const definedAtFile = {
230
- filePathToShowToUser: source.definedAtFilePath.filePathToShowToUser,
231
- fileExportPathToShowToUser: source.definedAtFilePath.fileExportPathToShowToUser
234
+ filePathToShowToUser: definedAt.filePathToShowToUser,
235
+ fileExportPathToShowToUser: definedAt.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,
@@ -138,7 +138,11 @@ type PageContextBuiltInCommon<Data> = {
138
138
  */
139
139
  isBaseMissing?: true;
140
140
  };
141
- type PageContextBuiltInServer<Data> = PageContextBuiltInCommon<Data> & PageContextUrlServer;
141
+ type PageContextBuiltInServer<Data> = PageContextBuiltInCommon<Data> & PageContextUrlServer & {
142
+ isHydration?: undefined;
143
+ isBackwardNavigation?: undefined;
144
+ previousPageContext?: undefined;
145
+ };
142
146
  type PageContextBuiltInClientWithClientRouting<Data> = Partial<PageContextBuiltInCommon<Data>> & Pick<PageContextBuiltInCommon<Data>, 'Page' | 'routeParams' | 'pageExports' | 'config' | 'configEntries' | 'exports' | 'exportsAll' | 'abortReason' | 'data' | 'pageId' | 'source' | 'sources' | 'from'> & {
143
147
  /** Whether the current page is already rendered to HTML */
144
148
  isHydration: boolean;