vike 0.4.144 → 0.4.145-commit-2520555

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 (198) hide show
  1. package/dist/cjs/__internal/index.js +6 -2
  2. package/dist/cjs/node/plugin/plugins/buildConfig.js +3 -3
  3. package/dist/cjs/node/plugin/plugins/commonConfig.js +0 -3
  4. package/dist/cjs/node/plugin/plugins/config/index.js +3 -3
  5. package/dist/cjs/node/plugin/plugins/devConfig/determineOptimizeDeps.js +8 -8
  6. package/dist/cjs/node/plugin/plugins/devConfig/index.js +1 -0
  7. package/dist/cjs/node/plugin/plugins/envVars.js +34 -20
  8. package/dist/cjs/node/plugin/plugins/importBuild/index.js +3 -3
  9. package/dist/cjs/node/plugin/plugins/importUserCode/getVirtualFileImportUserCode.js +1 -1
  10. package/dist/cjs/node/plugin/plugins/importUserCode/index.js +3 -3
  11. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/configDefinitionsBuiltIn.js +5 -4
  12. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/filesystemRouting.js +12 -12
  13. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig.js +249 -228
  14. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVirtualFilePageConfigValuesAll.js +8 -6
  15. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVirtualFilePageConfigs.js +36 -14
  16. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/helpers.js +1 -14
  17. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/isRuntimeEnvMatch.js +18 -0
  18. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/transpileAndExecuteFile.js +15 -17
  19. package/dist/cjs/node/plugin/plugins/previewConfig.js +11 -2
  20. package/dist/cjs/node/prerender/runPrerender.js +34 -26
  21. package/dist/cjs/node/prerender/utils.js +1 -1
  22. package/dist/cjs/node/runtime/html/serializePageContextClientSide.js +20 -6
  23. package/dist/cjs/node/runtime/renderPage/debugPageFiles.js +5 -5
  24. package/dist/cjs/node/runtime/renderPage/log404/index.js +28 -17
  25. package/dist/cjs/node/runtime/renderPage/renderPageAlreadyRouted.js +3 -3
  26. package/dist/cjs/node/runtime/renderPage.js +3 -3
  27. package/dist/cjs/node/runtime/utils.js +1 -1
  28. package/dist/cjs/node/shared/getClientEntryFilePath.js +2 -2
  29. package/dist/cjs/node/shared/getConfigVike.js +4 -1
  30. package/dist/cjs/shared/addUrlComputedProps.js +24 -12
  31. package/dist/cjs/shared/getPageFiles/analyzeClientSide.js +4 -6
  32. package/dist/cjs/shared/getPageFiles/getExports.js +3 -3
  33. package/dist/cjs/shared/hooks/getHook.js +1 -1
  34. package/dist/cjs/shared/page-configs/getExportPath.js +3 -3
  35. package/dist/cjs/shared/page-configs/helpers/getConfigDefinedAtString.js +43 -0
  36. package/dist/cjs/shared/page-configs/helpers/getConfigValue.js +44 -0
  37. package/dist/cjs/shared/page-configs/helpers.js +33 -0
  38. package/dist/cjs/shared/page-configs/loadConfigValues.js +2 -2
  39. package/dist/cjs/shared/page-configs/serialize/parseConfigValuesImported.js +14 -13
  40. package/dist/cjs/shared/page-configs/serialize/parsePageConfigs.js +2 -2
  41. package/dist/cjs/shared/page-configs/serialize/serializeConfigValue.js +9 -10
  42. package/dist/cjs/shared/route/abort.js +1 -1
  43. package/dist/cjs/shared/route/executeOnBeforeRouteHook.js +41 -15
  44. package/dist/cjs/shared/route/index.js +22 -32
  45. package/dist/cjs/shared/route/loadPageRoutes.js +11 -10
  46. package/dist/cjs/shared/route/noRouteMatch.js +4 -0
  47. package/dist/cjs/shared/route/resolveRouteFunction.js +1 -1
  48. package/dist/cjs/shared/utils.js +1 -1
  49. package/dist/cjs/utils/getFilePathAbsolute.js +11 -11
  50. package/dist/cjs/utils/isExternalLink.js +7 -0
  51. package/dist/cjs/utils/{hasPropertyGetter.js → isPropertyGetter.js} +3 -3
  52. package/dist/cjs/utils/onPageVisibilityChange.js +19 -0
  53. package/dist/cjs/utils/parseUrl.js +1 -1
  54. package/dist/cjs/utils/projectInfo.js +1 -1
  55. package/dist/cjs/utils/truncateString.js +12 -7
  56. package/dist/esm/__internal/index.d.ts +6 -3
  57. package/dist/esm/__internal/index.js +8 -3
  58. package/dist/esm/client/client-routing-runtime/createPageContext.d.ts +2 -3
  59. package/dist/esm/client/client-routing-runtime/createPageContext.js +3 -4
  60. package/dist/esm/client/client-routing-runtime/entry.js +2 -2
  61. package/dist/esm/client/client-routing-runtime/getBaseServer.d.ts +2 -1
  62. package/dist/esm/client/client-routing-runtime/getBaseServer.js +2 -1
  63. package/dist/esm/client/client-routing-runtime/getPageContextFromHooks.d.ts +39 -0
  64. package/dist/esm/client/client-routing-runtime/{getPageContext.js → getPageContextFromHooks.js} +50 -79
  65. package/dist/esm/client/client-routing-runtime/history.d.ts +3 -1
  66. package/dist/esm/client/client-routing-runtime/history.js +31 -9
  67. package/dist/esm/client/client-routing-runtime/installClientRouter.d.ts +2 -0
  68. package/dist/esm/client/client-routing-runtime/installClientRouter.js +22 -0
  69. package/dist/esm/client/client-routing-runtime/isClientSideRoutable.d.ts +8 -0
  70. package/dist/esm/client/client-routing-runtime/isClientSideRoutable.js +12 -0
  71. package/dist/esm/client/client-routing-runtime/navigate.d.ts +0 -2
  72. package/dist/esm/client/client-routing-runtime/navigate.js +9 -8
  73. package/dist/esm/client/client-routing-runtime/onBrowserHistoryNavigation.d.ts +4 -0
  74. package/dist/esm/client/client-routing-runtime/onBrowserHistoryNavigation.js +63 -0
  75. package/dist/esm/client/client-routing-runtime/onLinkClick.d.ts +2 -0
  76. package/dist/esm/client/client-routing-runtime/onLinkClick.js +40 -0
  77. package/dist/esm/client/client-routing-runtime/prefetch.js +54 -29
  78. package/dist/esm/client/client-routing-runtime/renderPageClientSide.d.ts +19 -0
  79. package/dist/esm/client/client-routing-runtime/renderPageClientSide.js +347 -0
  80. package/dist/esm/client/client-routing-runtime/scrollRestoration.d.ts +6 -0
  81. package/dist/esm/client/client-routing-runtime/scrollRestoration.js +25 -0
  82. package/dist/esm/client/client-routing-runtime/setScrollPosition.d.ts +7 -0
  83. package/dist/esm/client/client-routing-runtime/setScrollPosition.js +77 -0
  84. package/dist/esm/client/client-routing-runtime/skipLink.d.ts +0 -1
  85. package/dist/esm/client/client-routing-runtime/skipLink.js +9 -5
  86. package/dist/esm/client/client-routing-runtime/utils.d.ts +2 -0
  87. package/dist/esm/client/client-routing-runtime/utils.js +2 -0
  88. package/dist/esm/client/server-routing-runtime/getPageContext.js +1 -1
  89. package/dist/esm/client/shared/executeOnRenderClientHook.js +6 -5
  90. package/dist/esm/client/shared/getPageContextProxyForUser.js +13 -7
  91. package/dist/esm/client/shared/loadPageFilesClientSide.d.ts +8 -3
  92. package/dist/esm/client/shared/loadPageFilesClientSide.js +5 -5
  93. package/dist/esm/node/plugin/plugins/buildConfig.js +3 -3
  94. package/dist/esm/node/plugin/plugins/commonConfig.js +0 -3
  95. package/dist/esm/node/plugin/plugins/config/index.js +4 -4
  96. package/dist/esm/node/plugin/plugins/devConfig/determineOptimizeDeps.js +9 -9
  97. package/dist/esm/node/plugin/plugins/devConfig/index.js +1 -0
  98. package/dist/esm/node/plugin/plugins/envVars.d.ts +2 -0
  99. package/dist/esm/node/plugin/plugins/envVars.js +35 -20
  100. package/dist/esm/node/plugin/plugins/importBuild/index.js +3 -3
  101. package/dist/esm/node/plugin/plugins/importUserCode/getVirtualFileImportUserCode.js +1 -1
  102. package/dist/esm/node/plugin/plugins/importUserCode/index.js +3 -3
  103. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/configDefinitionsBuiltIn.d.ts +2 -1
  104. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/configDefinitionsBuiltIn.js +5 -4
  105. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/filesystemRouting.d.ts +1 -1
  106. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/filesystemRouting.js +12 -12
  107. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig.d.ts +2 -1
  108. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig.js +250 -229
  109. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVirtualFilePageConfigValuesAll.d.ts +2 -2
  110. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVirtualFilePageConfigValuesAll.js +7 -5
  111. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVirtualFilePageConfigs.d.ts +2 -2
  112. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVirtualFilePageConfigs.js +37 -15
  113. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/helpers.js +1 -14
  114. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/isRuntimeEnvMatch.d.ts +7 -0
  115. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/isRuntimeEnvMatch.js +15 -0
  116. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/transpileAndExecuteFile.d.ts +2 -2
  117. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/transpileAndExecuteFile.js +16 -18
  118. package/dist/esm/node/plugin/plugins/previewConfig.js +11 -2
  119. package/dist/esm/node/prerender/runPrerender.js +29 -21
  120. package/dist/esm/node/prerender/utils.d.ts +1 -1
  121. package/dist/esm/node/prerender/utils.js +1 -1
  122. package/dist/esm/node/runtime/html/serializePageContextClientSide.js +21 -7
  123. package/dist/esm/node/runtime/renderPage/debugPageFiles.d.ts +5 -5
  124. package/dist/esm/node/runtime/renderPage/debugPageFiles.js +5 -5
  125. package/dist/esm/node/runtime/renderPage/loadPageFilesServerSide.d.ts +2 -2
  126. package/dist/esm/node/runtime/renderPage/log404/index.d.ts +2 -2
  127. package/dist/esm/node/runtime/renderPage/log404/index.js +28 -16
  128. package/dist/esm/node/runtime/renderPage/renderPageAlreadyRouted.js +2 -2
  129. package/dist/esm/node/runtime/renderPage.js +3 -3
  130. package/dist/esm/node/runtime/utils.d.ts +1 -1
  131. package/dist/esm/node/runtime/utils.js +1 -1
  132. package/dist/esm/node/shared/getClientEntryFilePath.js +1 -1
  133. package/dist/esm/node/shared/getConfigVike.d.ts +2 -1
  134. package/dist/esm/node/shared/getConfigVike.js +4 -1
  135. package/dist/esm/shared/addUrlComputedProps.d.ts +1 -0
  136. package/dist/esm/shared/addUrlComputedProps.js +25 -13
  137. package/dist/esm/shared/getPageFiles/analyzeClientSide.js +2 -4
  138. package/dist/esm/shared/getPageFiles/getExports.js +2 -2
  139. package/dist/esm/shared/hooks/getHook.js +1 -1
  140. package/dist/esm/shared/page-configs/PageConfig.d.ts +55 -31
  141. package/dist/esm/shared/page-configs/getExportPath.d.ts +1 -1
  142. package/dist/esm/shared/page-configs/getExportPath.js +3 -3
  143. package/dist/esm/shared/page-configs/helpers/getConfigDefinedAtString.d.ts +7 -0
  144. package/dist/esm/shared/page-configs/helpers/getConfigDefinedAtString.js +37 -0
  145. package/dist/esm/shared/page-configs/helpers/getConfigValue.d.ts +14 -0
  146. package/dist/esm/shared/page-configs/helpers/getConfigValue.js +38 -0
  147. package/dist/esm/shared/page-configs/helpers.d.ts +13 -0
  148. package/dist/esm/shared/page-configs/helpers.js +27 -0
  149. package/dist/esm/shared/page-configs/loadConfigValues.js +2 -2
  150. package/dist/esm/shared/page-configs/serialize/PageConfigSerialized.d.ts +4 -4
  151. package/dist/esm/shared/page-configs/serialize/parseConfigValuesImported.js +15 -11
  152. package/dist/esm/shared/page-configs/serialize/parsePageConfigs.js +2 -2
  153. package/dist/esm/shared/page-configs/serialize/serializeConfigValue.js +9 -10
  154. package/dist/esm/shared/route/abort.js +1 -1
  155. package/dist/esm/shared/route/executeOnBeforeRouteHook.d.ts +5 -8
  156. package/dist/esm/shared/route/executeOnBeforeRouteHook.js +41 -15
  157. package/dist/esm/shared/route/index.d.ts +12 -10
  158. package/dist/esm/shared/route/index.js +23 -33
  159. package/dist/esm/shared/route/loadPageRoutes.js +8 -7
  160. package/dist/esm/shared/route/noRouteMatch.d.ts +1 -0
  161. package/dist/esm/shared/route/noRouteMatch.js +1 -0
  162. package/dist/esm/shared/route/resolveRouteFunction.js +1 -1
  163. package/dist/esm/shared/utils.d.ts +1 -1
  164. package/dist/esm/shared/utils.js +1 -1
  165. package/dist/esm/utils/getFilePathAbsolute.d.ts +1 -1
  166. package/dist/esm/utils/getFilePathAbsolute.js +11 -11
  167. package/dist/esm/utils/isPropertyGetter.d.ts +1 -0
  168. package/dist/esm/utils/{hasPropertyGetter.js → isPropertyGetter.js} +1 -1
  169. package/dist/esm/utils/onPageVisibilityChange.d.ts +4 -0
  170. package/dist/esm/utils/onPageVisibilityChange.js +16 -0
  171. package/dist/esm/utils/parseUrl.js +1 -1
  172. package/dist/esm/utils/projectInfo.d.ts +1 -1
  173. package/dist/esm/utils/projectInfo.js +1 -1
  174. package/dist/esm/utils/truncateString.d.ts +2 -1
  175. package/dist/esm/utils/truncateString.js +10 -7
  176. package/node/cli/bin-entry.js +1 -1
  177. package/package.json +2 -3
  178. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getFilePathToShowToUser.js +0 -16
  179. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/isConfigEnvMatch.js +0 -13
  180. package/dist/cjs/shared/page-configs/utils.js +0 -103
  181. package/dist/esm/client/client-routing-runtime/getPageContext.d.ts +0 -29
  182. package/dist/esm/client/client-routing-runtime/getPageId.d.ts +0 -10
  183. package/dist/esm/client/client-routing-runtime/getPageId.js +0 -17
  184. package/dist/esm/client/client-routing-runtime/navigationState.d.ts +0 -5
  185. package/dist/esm/client/client-routing-runtime/navigationState.js +0 -14
  186. package/dist/esm/client/client-routing-runtime/skipLink/isClientSideRoutable.d.ts +0 -2
  187. package/dist/esm/client/client-routing-runtime/skipLink/isClientSideRoutable.js +0 -15
  188. package/dist/esm/client/client-routing-runtime/useClientRouter.d.ts +0 -6
  189. package/dist/esm/client/client-routing-runtime/useClientRouter.js +0 -493
  190. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getFilePathToShowToUser.d.ts +0 -24
  191. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getFilePathToShowToUser.js +0 -13
  192. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/isConfigEnvMatch.d.ts +0 -3
  193. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/isConfigEnvMatch.js +0 -10
  194. package/dist/esm/shared/page-configs/utils.d.ts +0 -35
  195. package/dist/esm/shared/page-configs/utils.js +0 -97
  196. package/dist/esm/utils/hasPropertyGetter.d.ts +0 -1
  197. /package/dist/esm/{client/client-routing-runtime → utils}/isExternalLink.d.ts +0 -0
  198. /package/dist/esm/{client/client-routing-runtime → utils}/isExternalLink.js +0 -0
@@ -26,7 +26,7 @@ async function loadPageFiles(pageId) {
26
26
  _pageFilesAll: pageFilesAll,
27
27
  _pageConfigs: pageConfigs
28
28
  });
29
- objectAssign(pageContextAddendum, await loadPageFilesClientSide(pageFilesAll, pageConfigs, pageId));
29
+ objectAssign(pageContextAddendum, await loadPageFilesClientSide(pageId, pageContextAddendum));
30
30
  pageFilesAll
31
31
  .filter((p) => p.fileType !== '.page.server')
32
32
  .forEach((p) => {
@@ -19,10 +19,11 @@ async function executeOnRenderClientHook(pageContext, isClientRouting) {
19
19
  }
20
20
  }
21
21
  if (!hook) {
22
- const urlLogical = getUrlLogical(pageContext);
22
+ const urlToShowToUser = getUrlToShowToUser(pageContext);
23
+ assert(urlToShowToUser);
23
24
  if (pageContext._pageConfigs.length > 0) {
24
25
  // V1 design
25
- assertUsage(false, `No onRenderClient() hook defined for URL '${urlLogical}', but it's needed, see https://vike.dev/onRenderClient`);
26
+ assertUsage(false, `No onRenderClient() hook defined for URL '${urlToShowToUser}', but it's needed, see https://vike.dev/onRenderClient`);
26
27
  }
27
28
  else {
28
29
  // TODO/v1-release: remove
@@ -30,11 +31,11 @@ async function executeOnRenderClientHook(pageContext, isClientRouting) {
30
31
  const pageClientsFilesLoaded = pageContext._pageFilesLoaded.filter((p) => p.fileType === '.page.client');
31
32
  let errMsg;
32
33
  if (pageClientsFilesLoaded.length === 0) {
33
- errMsg = 'No file `*.page.client.*` found for URL ' + urlLogical;
34
+ errMsg = 'No file `*.page.client.*` found for URL ' + urlToShowToUser;
34
35
  }
35
36
  else {
36
37
  errMsg =
37
- 'One of the following files should export a `render()` hook: ' +
38
+ 'One of the following files should export a render() hook: ' +
38
39
  pageClientsFilesLoaded.map((p) => p.filePath).join(' ');
39
40
  }
40
41
  assertUsage(false, errMsg);
@@ -47,7 +48,7 @@ async function executeOnRenderClientHook(pageContext, isClientRouting) {
47
48
  const hookResult = await executeHook(() => renderHook(pageContextForUserConsumption), hookName, hook.hookFilePath);
48
49
  assertUsage(hookResult === undefined, `The ${hookName}() hook defined by ${hook.hookFilePath} isn't allowed to return a value`);
49
50
  }
50
- function getUrlLogical(pageContext) {
51
+ function getUrlToShowToUser(pageContext) {
51
52
  let url;
52
53
  // try/catch to avoid passToClient assertUsage() (although: this may not be needed anymore, since we're now accessing pageContext and not pageContextForUserConsumption)
53
54
  try {
@@ -14,14 +14,14 @@ function getPageContextProxyForUser(pageContext) {
14
14
  const val = pageContext[prop];
15
15
  const propName = JSON.stringify(prop);
16
16
  assertUsage(val !== notSerializable, `pageContext[${propName}] couldn't be serialized and, therefore, is missing on the client-side. Check the server logs for more information.`);
17
- assertPassToClient(pageContext, prop, `pageContext[${propName}] isn't available on the client-side because ${propName} is missing in passToClient, see https://vike.dev/passToClient`);
17
+ assertIsDefined(pageContext, prop);
18
18
  return val;
19
19
  }
20
20
  });
21
21
  }
22
- function assertPassToClient(pageContext, prop, errMsg) {
23
- // We disable assertPassToClient() for the next attempt to read `prop`, because of how Vue's reactivity work. When changing a reactive object:
24
- // - Vue tries to read its old value first. This triggers a `assertPassToClient()` failure if e.g. `pageContextOldReactive.routeParams = pageContextNew.routeParams` and `pageContextOldReactive` has no `routeParams`.
22
+ function assertIsDefined(pageContext, prop) {
23
+ // We disable assertIsDefined() for the next attempt to read `prop`, because of how Vue's reactivity work. When changing a reactive object:
24
+ // - Vue tries to read its old value first. This triggers a `assertIsDefined()` failure if e.g. `pageContextOldReactive.routeParams = pageContextNew.routeParams` and `pageContextOldReactive` has no `routeParams`.
25
25
  // - Vue seems to read __v_raw before reading the property
26
26
  if (globalObject.prev === prop || globalObject.prev === '__v_raw')
27
27
  return;
@@ -30,17 +30,23 @@ function assertPassToClient(pageContext, prop, errMsg) {
30
30
  return;
31
31
  if (isExpected(prop))
32
32
  return;
33
+ const propName = JSON.stringify(prop);
34
+ /* This handling would be the clearest but, unfortunately, it's fundamentally problematic:
35
+ * - It would force the pageContext value consumer to be synchronized with the pageContext value provider. For example, if vike-react wants to conditionally do something dependening on wehther some optional pageContext value was provided by some optional vike-react-* integration package.
36
+ * - If a pageContext value is set by an optional hook, then it's expected that the value is undefined if the hook doesn't exist.
37
+ const errMsg = `pageContext[${propName}] is \`undefined\` on the client-side. If it's defined on the server-side then add ${propName} to passToClient (https://vike.dev/passToClient), otherwise make sure your client-side hooks always define it (e.g. set it to \`null\` instead of \`undefined\`).`
38
+ assertUsage(false, errMsg)
39
+ */
33
40
  if (pageContext._hasPageContextFromServer && !pageContext._hasPageContextFromClient) {
34
41
  // We can safely assume that the property is missing in passToClient, because the server-side defines all passToClient properties even if they have an undefined value:
35
42
  // ```
36
43
  // <script id="vike_pageContext" type="application/json">{"_pageId":"/pages/admin","user":"!undefined","pageProps":"!undefined","title":"!undefined","abortReason":"!undefined","_urlRewrite":null}</script>
37
44
  // ```
38
45
  // Note how properties have "!undefined" values => we can tell whether an undefined pageContext value exists in passToClient.
39
- assertUsage(false, errMsg);
46
+ assertUsage(false, `pageContext[${propName}] isn't available on the client-side because ${propName} is missing in passToClient, see https://vike.dev/passToClient`);
40
47
  }
41
48
  else {
42
- // Do nothing, not even a warning.
43
- // Because we don't know whether the user expects the pageContext value to be undefined. (E.g. a client-side onBeforeRender() hook conditionally setting a pageContext value.)
49
+ // Do nothing, not even a warning, because we don't know whether the user expects that the pageContext value can be undefined. (E.g. a pageContext value that is defined by an optional hook.)
44
50
  }
45
51
  }
46
52
  const IGNORE_LIST = [
@@ -1,8 +1,13 @@
1
- import { type PageFile, type PageContextExports } from '../../shared/getPageFiles.js';
2
- import type { PageConfigRuntime } from '../../shared/page-configs/PageConfig.js';
3
1
  export { loadPageFilesClientSide };
4
2
  export { isErrorFetchingStaticAssets };
5
- declare function loadPageFilesClientSide(pageFilesAll: PageFile[], pageConfigs: PageConfigRuntime[], pageId: string): Promise<PageContextExports & {
3
+ export type { PageContextPageFiles };
4
+ import { type PageFile, type PageContextExports } from '../../shared/getPageFiles.js';
5
+ import type { PageConfigRuntime } from '../../shared/page-configs/PageConfig.js';
6
+ type PageContextPageFiles = {
7
+ _pageFilesAll: PageFile[];
8
+ _pageConfigs: PageConfigRuntime[];
9
+ };
10
+ declare function loadPageFilesClientSide(pageId: string, pageContext: PageContextPageFiles): Promise<PageContextExports & {
6
11
  _pageFilesLoaded: PageFile[];
7
12
  }>;
8
13
  declare function isErrorFetchingStaticAssets(err: unknown): boolean;
@@ -1,12 +1,12 @@
1
+ export { loadPageFilesClientSide };
2
+ export { isErrorFetchingStaticAssets };
1
3
  import { getPageFilesClientSide, getExports } from '../../shared/getPageFiles.js';
2
4
  import { findPageConfig } from '../../shared/page-configs/findPageConfig.js';
3
5
  import { loadConfigValues } from '../../shared/page-configs/loadConfigValues.js';
4
- export { loadPageFilesClientSide };
5
- export { isErrorFetchingStaticAssets };
6
6
  const stamp = '__whileFetchingAssets';
7
- async function loadPageFilesClientSide(pageFilesAll, pageConfigs, pageId) {
8
- const pageFilesClientSide = getPageFilesClientSide(pageFilesAll, pageId);
9
- const pageConfig = findPageConfig(pageConfigs, pageId);
7
+ async function loadPageFilesClientSide(pageId, pageContext) {
8
+ const pageFilesClientSide = getPageFilesClientSide(pageContext._pageFilesAll, pageId);
9
+ const pageConfig = findPageConfig(pageContext._pageConfigs, pageId);
10
10
  let pageConfigLoaded;
11
11
  // @ts-ignore Since dist/cjs/client/ is never used, we can ignore this error.
12
12
  const isDev = import.meta.env.DEV;
@@ -1,10 +1,10 @@
1
1
  export { buildConfig };
2
2
  export { assertRollupInput };
3
3
  export { analyzeClientEntries };
4
- import { assert, resolveOutDir, isObject, viteIsSSR, getFilePathAbsolute, addOnBeforeLogHook, removeFileExtention, unique, assertPosixPath, assertUsage, getOutDirs, } from '../utils.js';
4
+ import { assert, resolveOutDir, isObject, viteIsSSR, getFilePathAbsolute, addOnBeforeLogHook, removeFileExtention, unique, assertPosixPath, assertUsage } from '../utils.js';
5
5
  import { virtualFileIdImportUserCodeServer } from '../../shared/virtual-files/virtualFileImportUserCode.js';
6
6
  import { getVikeConfig } from './importUserCode/v1-design/getVikeConfig.js';
7
- import { getConfigValue } from '../../../shared/page-configs/utils.js';
7
+ import { getConfigValue } from '../../../shared/page-configs/helpers.js';
8
8
  import { findPageFiles } from '../shared/findPageFiles.js';
9
9
  import { getConfigVike } from '../../shared/getConfigVike.js';
10
10
  import { getVirtualFileIdPageConfigValuesAll } from '../../shared/virtual-files/virtualFilePageConfigValuesAll.js';
@@ -69,7 +69,7 @@ function buildConfig() {
69
69
  async function getEntries(config) {
70
70
  const configVike = await getConfigVike(config);
71
71
  const pageFileEntries = await getPageFileEntries(config, configVike.includeAssetsImportedByServer); // TODO/v1-release: remove
72
- const { pageConfigs } = await getVikeConfig(config.root, getOutDirs(config).outDirRoot, false, configVike.extensions);
72
+ const { pageConfigs } = await getVikeConfig(config, false);
73
73
  assertUsage(Object.keys(pageFileEntries).length !== 0 || pageConfigs.length !== 0, 'At least one page should be defined, see https://vike.dev/add');
74
74
  if (viteIsSSR(config)) {
75
75
  const serverEntries = analyzeServerEntries(pageConfigs);
@@ -13,9 +13,6 @@ function commonConfig() {
13
13
  return [
14
14
  {
15
15
  name: 'vike-commonConfig-1',
16
- config: () => ({
17
- appType: 'custom'
18
- }),
19
16
  configResolved(config) {
20
17
  installRequireShim_setUserRootDir(config.root);
21
18
  }
@@ -1,6 +1,6 @@
1
1
  export { resolveVikeConfig };
2
2
  import { assertVikeConfig } from './assertVikeConfig.js';
3
- import { getOutDirs, isDev2 } from '../../utils.js';
3
+ import { isDev2 } from '../../utils.js';
4
4
  import { findConfigVikeFromStemPackages } from './findConfigVikeFromStemPackages.js';
5
5
  import { pickFirst } from './pickFirst.js';
6
6
  import { resolveExtensions } from './resolveExtensions.js';
@@ -12,19 +12,19 @@ function resolveVikeConfig(vikeConfig) {
12
12
  name: 'vike:resolveVikeConfig',
13
13
  enforce: 'pre',
14
14
  async configResolved(config) {
15
- const promise = resolveConfig(vikeConfig, config);
15
+ const promise = getConfigVikPromise(vikeConfig, config);
16
16
  config.configVikePromise = promise;
17
17
  await promise;
18
18
  }
19
19
  };
20
20
  }
21
- async function resolveConfig(vikeConfig, config) {
21
+ async function getConfigVikPromise(vikeConfig, config) {
22
22
  const fromPluginOptions = (vikeConfig ?? {});
23
23
  const fromViteConfig = (config.vike ?? {});
24
24
  const fromStemPackages = await findConfigVikeFromStemPackages(config.root);
25
25
  const configs = [fromPluginOptions, ...fromStemPackages, fromViteConfig];
26
26
  const extensions = resolveExtensions(configs, config);
27
- const { globalVikeConfig: fromPlusConfigFile } = await getVikeConfig(config.root, getOutDirs(config).outDirRoot, isDev2(config), extensions);
27
+ const { globalVikeConfig: fromPlusConfigFile } = await getVikeConfig(config, isDev2(config), false, extensions);
28
28
  configs.push(fromPlusConfigFile);
29
29
  assertVikeConfig(fromPlusConfigFile, ({ prop, errMsg }) => {
30
30
  // TODO: add config file path ?
@@ -1,12 +1,12 @@
1
1
  export { determineOptimizeDeps };
2
2
  import { findPageFiles } from '../../shared/findPageFiles.js';
3
- import { assert, getFilePathAbsolute, getOutDirs, isNotNullish, isNpmPackageImport, unique } from '../../utils.js';
3
+ import { assert, getFilePathAbsolute, isNotNullish, isNpmPackageImport, unique } from '../../utils.js';
4
4
  import { getVikeConfig } from '../importUserCode/v1-design/getVikeConfig.js';
5
5
  import { getConfigValueSourcesRelevant } from '../../shared/getConfigValueSourcesRelevant.js';
6
6
  import { analyzeClientEntries } from '../buildConfig.js';
7
7
  import { virtualFileIdImportUserCodeClientCR, virtualFileIdImportUserCodeClientSR } from '../../../shared/virtual-files/virtualFileImportUserCode.js';
8
8
  async function determineOptimizeDeps(config, configVike, isDev) {
9
- const { pageConfigs } = await getVikeConfig(config.root, getOutDirs(config).outDirRoot, isDev, configVike.extensions);
9
+ const { pageConfigs } = await getVikeConfig(config, isDev);
10
10
  const { entries, include } = await getPageDeps(config, pageConfigs, isDev);
11
11
  {
12
12
  // This actually doesn't work: Vite's dep optimizer doesn't seem to be able to crawl virtual files.
@@ -34,18 +34,18 @@ async function getPageDeps(config, pageConfigs, isDev) {
34
34
  configValueSourcesRelevant.forEach((configValueSource) => {
35
35
  if (!configValueSource.valueIsImportedAtRuntime)
36
36
  return;
37
- const { definedAtInfo, configEnv } = configValueSource;
37
+ const { definedAt, configEnv } = configValueSource;
38
38
  if (configEnv !== 'client-only' && configEnv !== 'server-and-client')
39
39
  return;
40
- if (definedAtInfo.filePathRelativeToUserRootDir !== null) {
41
- const { filePathAbsolute } = definedAtInfo;
42
- assert(filePathAbsolute);
40
+ if (definedAt.filePathRelativeToUserRootDir !== null) {
41
+ const { filePathAbsoluteFilesystem } = definedAt;
42
+ assert(filePathAbsoluteFilesystem);
43
43
  // Surprisingly Vite expects entries to be absolute paths
44
- entries.push(filePathAbsolute);
44
+ entries.push(filePathAbsoluteFilesystem);
45
45
  }
46
46
  else {
47
- // Adding definedAtInfo.filePathAbsolute doesn't work for npm packages, I guess because of Vite's config.server.fs.allow
48
- const { importPathAbsolute } = definedAtInfo;
47
+ // Adding definedAt.filePathAbsoluteFilesystem doesn't work for npm packages, I guess because of Vite's config.server.fs.allow
48
+ const { importPathAbsolute } = definedAt;
49
49
  assert(importPathAbsolute);
50
50
  // We need to differentiate between npm package imports and path aliases.
51
51
  // There are path aliases that cannot be distinguished from npm package names.
@@ -21,6 +21,7 @@ function devConfig() {
21
21
  apply,
22
22
  config() {
23
23
  return {
24
+ appType: 'custom',
24
25
  optimizeDeps: {
25
26
  exclude: [
26
27
  // We exclude the vike client to be able to use `import.meta.glob()`
@@ -1,3 +1,5 @@
1
1
  export { envVarsPlugin };
2
+ export { applyEnvVar };
2
3
  import type { Plugin } from 'vite';
3
4
  declare function envVarsPlugin(): Plugin;
5
+ declare function applyEnvVar(envName: string, envVal: string, code: string): string;
@@ -1,6 +1,8 @@
1
1
  export { envVarsPlugin };
2
+ // For ./envVars.spec.ts
3
+ export { applyEnvVar };
2
4
  import { loadEnv } from 'vite';
3
- import { assert, assertPosixPath, assertUsage, assertWarning, getFilePathRelativeToUserRootDir, lowerFirst } from '../utils.js';
5
+ import { assert, assertPosixPath, assertUsage, assertWarning, escapeRegex, getFilePathRelativeToUserRootDir, lowerFirst } from '../utils.js';
4
6
  function envVarsPlugin() {
5
7
  let envsAll;
6
8
  let config;
@@ -33,33 +35,46 @@ function envVarsPlugin() {
33
35
  : [config.envPrefix];
34
36
  return !envPrefix.some((prefix) => key.startsWith(prefix));
35
37
  })
36
- .forEach(([key, val]) => {
37
- const varName = `import.meta.env.${key}`;
38
- const publicPrefix = 'PUBLIC_ENV__';
39
- const keyPublic = `${publicPrefix}${key}`;
40
- const isPrivate = !key.startsWith(publicPrefix);
41
- if (isPrivate && isClientSide) {
42
- if (!code.includes(varName))
43
- return;
44
- const filePathToShowToUser = getFilePathRelativeToUserRootDir(id, config.root);
45
- const errMsgAddendum = isBuild ? '' : ' (vike will prevent your app from building for production)';
46
- const errMsg = `${varName} used in ${filePathToShowToUser} and therefore included in client-side bundle which can be be a security leak${errMsgAddendum}, remove ${varName} or rename ${key} to ${keyPublic}, see https://vike.dev/env`;
47
- if (isBuild) {
48
- assertUsage(false, errMsg);
49
- }
50
- else {
51
- // Only a warning for faster development DX (e.g. when use toggles `ssr: boolean` or `onBeforeRenderIsomorph: boolean`)
52
- assertWarning(false, errMsg, { onlyOnce: true });
38
+ .forEach(([envName, envVal]) => {
39
+ // Security check
40
+ {
41
+ const envStatement = getEnvStatement(envName);
42
+ const publicPrefix = 'PUBLIC_ENV__';
43
+ const isPrivate = !envName.startsWith(publicPrefix);
44
+ if (isPrivate && isClientSide) {
45
+ if (!code.includes(envStatement))
46
+ return;
47
+ const filePathToShowToUser = getFilePathRelativeToUserRootDir(id, config.root);
48
+ const errMsgAddendum = isBuild ? '' : ' (Vike will prevent your app from building for production)';
49
+ const keyPublic = `${publicPrefix}${envName}`;
50
+ const errMsg = `${envStatement} is used in client-side file ${filePathToShowToUser} which means that the environment variable ${envName} will be included in client-side bundles and, therefore, ${envName} will be publicly exposed which can be a security leak${errMsgAddendum}. Use ${envStatement} only in server-side files, or rename ${envName} to ${keyPublic}, see https://vike.dev/env`;
51
+ if (isBuild) {
52
+ assertUsage(false, errMsg);
53
+ }
54
+ else {
55
+ // Only a warning for faster development DX (e.g. when user toggles `ssr: boolean` or `onBeforeRenderIsomorph: boolean`)
56
+ assertWarning(false, errMsg, { onlyOnce: true });
57
+ }
53
58
  }
59
+ // Double check
60
+ assert(!(isPrivate && isClientSide) || !isBuild);
54
61
  }
55
- assert(!(isPrivate && isClientSide) || !isBuild);
56
- code = code.replaceAll(varName, JSON.stringify(val));
62
+ // Apply
63
+ code = applyEnvVar(envName, envVal, code);
57
64
  });
58
65
  // No need for low-resolution source map since line numbers didn't change. (Does Vite do high-resolution column numbers source mapping?)
59
66
  return code;
60
67
  }
61
68
  };
62
69
  }
70
+ function applyEnvVar(envName, envVal, code) {
71
+ const envStatement = getEnvStatement(envName);
72
+ const regex = new RegExp(escapeRegex(envStatement) + '\\b', 'g');
73
+ return code.replace(regex, JSON.stringify(envVal));
74
+ }
75
+ function getEnvStatement(envName) {
76
+ return `import.meta.env.${envName}`;
77
+ }
63
78
  function getIsClientSide(config, options) {
64
79
  const isBuild = config.command === 'build';
65
80
  if (isBuild) {
@@ -26,15 +26,15 @@ function importBuild() {
26
26
  ];
27
27
  }
28
28
  function getImporterCode(config, pageFilesEntry) {
29
- const importPathAbsolute = toPosixPath(
29
+ const filePathAbsolute = toPosixPath(
30
30
  // [RELATIVE_PATH_FROM_DIST] Current file: node_modules/vike/dist/esm/node/plugin/plugins/importBuild/index.js
31
31
  require_.resolve(`../../../../../../dist/esm/node/runtime/globalContext/loadImportBuild.js`));
32
32
  const { outDirServer } = getOutDirs(config);
33
- const importPath = path.posix.relative(outDirServer, importPathAbsolute);
33
+ const filePathRelative = path.posix.relative(outDirServer, filePathAbsolute);
34
34
  // The only reason we went for using CJS require() instead of ESM import() is because import() doesn't support .json files
35
35
  const importerCode = [
36
36
  '(async () => {',
37
- ` const { setImportBuildGetters } = await import('${importPath}');`,
37
+ ` const { setImportBuildGetters } = await import('${filePathRelative}');`,
38
38
  ' setImportBuildGetters({',
39
39
  ` pageFiles: () => import('./${pageFilesEntry}'),`,
40
40
  " clientManifest: () => require('../assets.json'),",
@@ -140,7 +140,7 @@ export const pageFilesList = [];
140
140
  export const neverLoaded = {};
141
141
  export const isGeneratedFile = true;
142
142
 
143
- ${await getVirtualFilePageConfigs(config.root, getOutDirs(config).outDirRoot, isForClientSide, isDev, id, configVike, isClientRouting)}
143
+ ${await getVirtualFilePageConfigs(isForClientSide, isDev, id, isClientRouting, config)}
144
144
 
145
145
  `;
146
146
  fileTypes
@@ -47,7 +47,7 @@ function importUserCode() {
47
47
  return undefined;
48
48
  id = getVirtualFileId(id);
49
49
  if (isVirtualFileIdPageConfigValuesAll(id)) {
50
- const code = await getVirtualFilePageConfigValuesAll(id, config.root, getOutDirs(config).outDirRoot, isDev, configVike);
50
+ const code = await getVirtualFilePageConfigValuesAll(id, isDev, config);
51
51
  return code;
52
52
  }
53
53
  if (isVirtualFileIdImportUserCode(id)) {
@@ -111,8 +111,8 @@ function handleHotUpdate(ctx, config, configVike) {
111
111
  return virtualModules;
112
112
  }
113
113
  }
114
- function isVikeConfigModule(filePathAbsolute) {
115
- return vikeConfigDependencies.has(filePathAbsolute);
114
+ function isVikeConfigModule(filePathAbsoluteFilesystem) {
115
+ return vikeConfigDependencies.has(filePathAbsoluteFilesystem);
116
116
  }
117
117
  function reloadConfig(filePath, config, configVike, op) {
118
118
  {
@@ -4,7 +4,7 @@ export type { ConfigDefinition };
4
4
  export type { ConfigDefinitionInternal };
5
5
  export type { ConfigNameGlobal };
6
6
  export type { ConfigEffect };
7
- import type { ConfigEnvInternal, ConfigEnv, ConfigValueSources } from '../../../../../../shared/page-configs/PageConfig.js';
7
+ import type { ConfigEnvInternal, ConfigEnv, ConfigValueSources, DefinedAtFileFullInfo } from '../../../../../../shared/page-configs/PageConfig.js';
8
8
  import type { Config, ConfigNameBuiltIn } from '../../../../../../shared/page-configs/Config.js';
9
9
  /** The meta definition of a config.
10
10
  *
@@ -46,6 +46,7 @@ type ConfigEffect = (config: {
46
46
  type ConfigDefinitionInternal = Omit<ConfigDefinition, 'env'> & {
47
47
  _computed?: (configValueSources: ConfigValueSources) => unknown;
48
48
  _valueIsFilePath?: true;
49
+ _userEffectDefinedAt?: DefinedAtFileFullInfo;
49
50
  env: ConfigEnvInternal;
50
51
  };
51
52
  type ConfigDefinitionsBuiltIn = Record<ConfigNameBuiltIn, ConfigDefinitionInternal>;
@@ -48,16 +48,17 @@ const configDefinitionsBuiltIn = {
48
48
  _valueIsFilePath: true
49
49
  },
50
50
  clientRouting: {
51
- env: 'server-and-client' // TODO: config-only instead?
51
+ // We could make it 'server-only' (we don't yet because of some legacy V0.4 design code)
52
+ env: 'server-and-client'
52
53
  },
53
54
  prerender: {
54
- env: 'server-only'
55
+ env: 'config-only'
55
56
  },
56
57
  hydrationCanBeAborted: {
57
- env: 'client-only' // TODO: config-only instead?
58
+ env: 'client-only'
58
59
  },
59
60
  prefetchStaticAssets: {
60
- env: 'client-only' // TODO: config-only instead?
61
+ env: 'client-only'
61
62
  },
62
63
  extends: {
63
64
  env: 'config-only'
@@ -11,7 +11,7 @@ export { getLogicalPath };
11
11
  * getLocationId('/pages/some-page') => '/pages/some-page'
12
12
  * getLocationId('/renderer/+config.js') => '/renderer'
13
13
  */
14
- declare function getLocationId(somePath: string): string;
14
+ declare function getLocationId(filePathAbsoluteVite: string): string;
15
15
  /** Get URL determined by filesystem path */
16
16
  declare function getFilesystemRouteString(locationId: string): string;
17
17
  /**
@@ -13,8 +13,8 @@ import { assert, assertPosixPath, getNpmPackageImportPath, isNpmPackageImport, h
13
13
  * getLocationId('/pages/some-page') => '/pages/some-page'
14
14
  * getLocationId('/renderer/+config.js') => '/renderer'
15
15
  */
16
- function getLocationId(somePath) {
17
- const locationId = removeFilename(somePath, true);
16
+ function getLocationId(filePathAbsoluteVite) {
17
+ const locationId = removeFilename(filePathAbsoluteVite, true);
18
18
  assertLocationId(locationId);
19
19
  return locationId;
20
20
  }
@@ -110,21 +110,21 @@ function removeDirectories(somePath, removeDirs) {
110
110
  somePath = '/';
111
111
  return somePath;
112
112
  }
113
- function removeFilename(filePath, optional) {
114
- assertPosixPath(filePath);
115
- assert(filePath.startsWith('/') || isNpmPackageImport(filePath));
113
+ function removeFilename(filePathAbsoluteVite, optional) {
114
+ assertPosixPath(filePathAbsoluteVite);
115
+ assert(filePathAbsoluteVite.startsWith('/') || isNpmPackageImport(filePathAbsoluteVite));
116
116
  {
117
- const filename = filePath.split('/').slice(-1)[0];
117
+ const filename = filePathAbsoluteVite.split('/').slice(-1)[0];
118
118
  if (!filename.includes('.')) {
119
119
  assert(optional);
120
- return filePath;
120
+ return filePathAbsoluteVite;
121
121
  }
122
122
  }
123
- filePath = filePath.split('/').slice(0, -1).join('/');
124
- if (filePath === '')
125
- filePath = '/';
126
- assertLocationId(filePath);
127
- return filePath;
123
+ let locationId = filePathAbsoluteVite.split('/').slice(0, -1).join('/');
124
+ if (locationId === '')
125
+ locationId = '/';
126
+ assertLocationId(locationId);
127
+ return locationId;
128
128
  }
129
129
  function getFilesystemRouteDefinedBy(locationId) {
130
130
  if (locationId === '/')
@@ -4,6 +4,7 @@ export { vikeConfigDependencies };
4
4
  export { isVikeConfigFile };
5
5
  import type { PageConfigGlobalBuildTime, PageConfigBuildTime } from '../../../../../shared/page-configs/PageConfig.js';
6
6
  import type { ExtensionResolved } from '../../../../../shared/ConfigVike.js';
7
+ import type { ResolvedConfig } from 'vite';
7
8
  type VikeConfig = {
8
9
  pageConfigs: PageConfigBuildTime[];
9
10
  pageConfigGlobal: PageConfigGlobalBuildTime;
@@ -11,5 +12,5 @@ type VikeConfig = {
11
12
  };
12
13
  declare const vikeConfigDependencies: Set<string>;
13
14
  declare function reloadVikeConfig(userRootDir: string, outDirRoot: string, extensions: ExtensionResolved[]): void;
14
- declare function getVikeConfig(userRootDir: string, outDirRoot: string, isDev: boolean, extensions: ExtensionResolved[], tolerateInvalidConfig?: boolean): Promise<VikeConfig>;
15
+ declare function getVikeConfig(config: ResolvedConfig, isDev: boolean, tolerateInvalidConfig?: boolean, extensions?: ExtensionResolved[]): Promise<VikeConfig>;
15
16
  declare function isVikeConfigFile(filePath: string): boolean;