vike 0.4.220 → 0.4.221-commit-ab9e52a

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 (296) hide show
  1. package/dist/cjs/__internal/index.js +5 -23
  2. package/dist/cjs/node/api/build.js +33 -24
  3. package/dist/cjs/node/api/context.js +6 -8
  4. package/dist/cjs/node/api/prepareViteApiCall.js +23 -21
  5. package/dist/cjs/node/api/prerender.js +1 -0
  6. package/dist/cjs/node/api/utils.js +2 -1
  7. package/dist/cjs/node/cli/context.js +16 -0
  8. package/dist/cjs/node/cli/entry.js +2 -0
  9. package/dist/cjs/node/cli/utils.js +1 -0
  10. package/dist/cjs/node/plugin/index.js +4 -8
  11. package/dist/cjs/node/plugin/onLoad.js +6 -1
  12. package/dist/cjs/node/plugin/plugins/autoFullBuild.js +34 -33
  13. package/dist/cjs/node/plugin/plugins/baseUrls.js +2 -2
  14. package/dist/cjs/node/plugin/plugins/buildApp.js +72 -0
  15. package/dist/cjs/node/plugin/plugins/buildConfig/fixServerAssets.js +12 -12
  16. package/dist/cjs/node/plugin/plugins/buildConfig.js +17 -12
  17. package/dist/cjs/node/plugin/plugins/buildEntry/index.js +28 -24
  18. package/dist/cjs/node/plugin/plugins/commonConfig.js +9 -7
  19. package/dist/cjs/node/plugin/plugins/extractAssetsPlugin.js +7 -4
  20. package/dist/cjs/node/plugin/plugins/extractExportNamesPlugin.js +2 -1
  21. package/dist/cjs/node/plugin/plugins/importUserCode/getVirtualFileImportUserCode.js +15 -10
  22. package/dist/cjs/node/plugin/plugins/importUserCode/index.js +11 -6
  23. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/{assertExtensions.js → getVikeConfig/assertExtensions.js} +41 -36
  24. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/configDefinitionsBuiltIn.js +59 -22
  25. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/{getConfigFileExport.js → getVikeConfig/getConfigFileExport.js} +2 -2
  26. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/getPlusFilesAll.js +159 -0
  27. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/loadFileAtConfigTime.js +40 -23
  28. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/resolvePointerImport.js +9 -64
  29. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/transpileAndExecuteFile.js +11 -5
  30. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig.js +403 -590
  31. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/{debug.js → virtual-files/debug.js} +1 -1
  32. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/{getVirtualFilePageConfigValuesAll.js → virtual-files/getVirtualFilePageConfigValuesAll.js} +12 -9
  33. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/{getVirtualFilePageConfigs.js → virtual-files/getVirtualFilePageConfigs.js} +13 -11
  34. package/dist/cjs/node/plugin/plugins/packageJsonFile.js +2 -2
  35. package/dist/cjs/node/plugin/plugins/previewConfig.js +7 -7
  36. package/dist/cjs/node/plugin/plugins/setGlobalContext.js +3 -5
  37. package/dist/cjs/node/plugin/shared/findPageFiles.js +2 -1
  38. package/dist/cjs/node/plugin/shared/getFullBuildInlineConfig.js +20 -0
  39. package/dist/cjs/{utils → node/plugin/shared}/getOutDirs.js +70 -61
  40. package/dist/cjs/node/plugin/{resolveClientEntriesDev.js → shared/resolveClientEntriesDev.js} +5 -8
  41. package/dist/cjs/{utils → node/plugin/shared}/viteIsSSR.js +2 -2
  42. package/dist/cjs/node/plugin/utils.js +1 -2
  43. package/dist/cjs/node/prerender/context.js +31 -0
  44. package/dist/cjs/node/prerender/resolvePrerenderConfig.js +46 -0
  45. package/dist/cjs/node/prerender/runPrerender.js +89 -68
  46. package/dist/cjs/node/prerender/utils.js +2 -2
  47. package/dist/cjs/node/runtime/globalContext.js +222 -150
  48. package/dist/cjs/node/runtime/html/injectAssets/getHtmlTags.js +11 -7
  49. package/dist/cjs/node/runtime/html/injectAssets/getViteDevScript.js +2 -3
  50. package/dist/cjs/node/runtime/html/injectAssets.js +4 -4
  51. package/dist/cjs/node/runtime/html/renderHtml.js +4 -5
  52. package/dist/cjs/node/runtime/page-files/setup.js +1 -1
  53. package/dist/cjs/node/runtime/renderPage/analyzePage.js +2 -3
  54. package/dist/cjs/node/runtime/renderPage/getEarlyHints.js +2 -27
  55. package/dist/cjs/node/runtime/renderPage/getPageAssets/sortPageAssetsForEarlyHintsHeader.js +2 -4
  56. package/dist/cjs/node/runtime/renderPage/getPageAssets.js +4 -4
  57. package/dist/cjs/node/runtime/renderPage/handleErrorWithoutErrorPage.js +3 -5
  58. package/dist/cjs/node/runtime/renderPage/isFontFallback.js +29 -0
  59. package/dist/cjs/node/runtime/renderPage/loadUserFilesServerSide.js +5 -4
  60. package/dist/cjs/node/runtime/renderPage/log404/index.js +1 -2
  61. package/dist/cjs/node/runtime/renderPage/renderPageAlreadyRouted.js +14 -10
  62. package/dist/cjs/node/runtime/renderPage/resolveRedirects.js +6 -5
  63. package/dist/cjs/node/runtime/renderPage.js +31 -29
  64. package/dist/cjs/node/runtime/utils.js +3 -3
  65. package/dist/cjs/node/runtime-dev/createDevMiddleware.js +5 -3
  66. package/dist/cjs/node/shared/resolveBase.js +7 -0
  67. package/dist/cjs/shared/getPageConfigsRuntime.js +20 -0
  68. package/dist/cjs/shared/getPageContextUrlComputed.js +6 -1
  69. package/dist/cjs/shared/getPageFiles/fileTypes.js +0 -1
  70. package/dist/cjs/shared/getPageFiles/getAllPageIdFiles.js +0 -3
  71. package/dist/cjs/shared/getPageFiles/getPageFileObject.js +0 -5
  72. package/dist/cjs/shared/getPageFiles/parseGlobResults.js +4 -3
  73. package/dist/cjs/shared/getPageFiles.js +1 -3
  74. package/dist/cjs/shared/page-configs/getPageConfigUserFriendly.js +15 -6
  75. package/dist/cjs/shared/page-configs/loadConfigValues.js +5 -1
  76. package/dist/cjs/shared/page-configs/serialize/serializeConfigValues.js +69 -18
  77. package/dist/cjs/shared/route/loadPageRoutes.js +1 -0
  78. package/dist/cjs/shared/utils.js +0 -1
  79. package/dist/cjs/utils/PROJECT_VERSION.js +1 -1
  80. package/dist/cjs/utils/assertSetup.js +1 -1
  81. package/dist/cjs/utils/catchInfiniteLoop.js +34 -0
  82. package/dist/cjs/utils/debug.js +8 -6
  83. package/dist/cjs/utils/findFile.js +4 -3
  84. package/dist/cjs/utils/isDev.js +2 -2
  85. package/dist/cjs/utils/isFilePathAbsoluteFilesystem.js +2 -2
  86. package/dist/cjs/utils/makePublicCopy.js +32 -0
  87. package/dist/cjs/utils/objectAssignSafe.js +7 -0
  88. package/dist/cjs/utils/path.js +48 -0
  89. package/dist/cjs/utils/requireResolve.js +3 -3
  90. package/dist/esm/__internal/index.d.ts +2 -2
  91. package/dist/esm/__internal/index.js +7 -26
  92. package/dist/esm/client/client-routing-runtime/createPageContext.js +5 -9
  93. package/dist/esm/client/client-routing-runtime/history.d.ts +3 -1
  94. package/dist/esm/client/client-routing-runtime/history.js +23 -18
  95. package/dist/esm/client/client-routing-runtime/index.d.ts +0 -1
  96. package/dist/esm/client/client-routing-runtime/index.js +0 -1
  97. package/dist/esm/client/client-routing-runtime/initClientRouter.js +2 -2
  98. package/dist/esm/client/client-routing-runtime/initOnLinkClick.d.ts +0 -4
  99. package/dist/esm/client/client-routing-runtime/initOnLinkClick.js +0 -11
  100. package/dist/esm/client/client-routing-runtime/initOnPopState.d.ts +0 -10
  101. package/dist/esm/client/client-routing-runtime/initOnPopState.js +50 -70
  102. package/dist/esm/client/client-routing-runtime/renderPageClientSide.js +15 -15
  103. package/dist/esm/client/client-routing-runtime/scrollRestoration.d.ts +4 -6
  104. package/dist/esm/client/client-routing-runtime/scrollRestoration.js +17 -12
  105. package/dist/esm/client/client-routing-runtime/setScrollPosition.d.ts +1 -1
  106. package/dist/esm/client/client-routing-runtime/setScrollPosition.js +29 -5
  107. package/dist/esm/client/client-routing-runtime/skipLink.d.ts +0 -2
  108. package/dist/esm/client/client-routing-runtime/skipLink.js +0 -1
  109. package/dist/esm/client/client-routing-runtime/utils.d.ts +1 -0
  110. package/dist/esm/client/client-routing-runtime/utils.js +1 -0
  111. package/dist/esm/client/server-routing-runtime/getPageContext.js +3 -4
  112. package/dist/esm/client/shared/loadUserFilesClientSide.js +3 -2
  113. package/dist/esm/node/api/build.d.ts +1 -6
  114. package/dist/esm/node/api/build.js +31 -25
  115. package/dist/esm/node/api/context.d.ts +4 -4
  116. package/dist/esm/node/api/context.js +6 -9
  117. package/dist/esm/node/api/prepareViteApiCall.d.ts +4 -3
  118. package/dist/esm/node/api/prepareViteApiCall.js +24 -22
  119. package/dist/esm/node/api/prerender.js +1 -0
  120. package/dist/esm/node/api/utils.d.ts +2 -1
  121. package/dist/esm/node/api/utils.js +2 -1
  122. package/dist/esm/node/cli/context.d.ts +5 -0
  123. package/dist/esm/node/cli/context.js +14 -0
  124. package/dist/esm/node/cli/entry.js +2 -0
  125. package/dist/esm/node/cli/parseCli.d.ts +3 -1
  126. package/dist/esm/node/cli/utils.d.ts +1 -0
  127. package/dist/esm/node/cli/utils.js +1 -0
  128. package/dist/esm/node/plugin/index.d.ts +29 -1
  129. package/dist/esm/node/plugin/index.js +5 -9
  130. package/dist/esm/node/plugin/onLoad.js +7 -2
  131. package/dist/esm/node/plugin/plugins/autoFullBuild.js +35 -34
  132. package/dist/esm/node/plugin/plugins/baseUrls.js +2 -2
  133. package/dist/esm/node/plugin/plugins/buildApp.d.ts +3 -0
  134. package/dist/esm/node/plugin/plugins/buildApp.js +70 -0
  135. package/dist/esm/node/plugin/plugins/buildConfig/fixServerAssets.d.ts +0 -2
  136. package/dist/esm/node/plugin/plugins/buildConfig/fixServerAssets.js +11 -11
  137. package/dist/esm/node/plugin/plugins/buildConfig.js +16 -11
  138. package/dist/esm/node/plugin/plugins/buildEntry/index.d.ts +3 -3
  139. package/dist/esm/node/plugin/plugins/buildEntry/index.js +28 -24
  140. package/dist/esm/node/plugin/plugins/commonConfig.d.ts +8 -2
  141. package/dist/esm/node/plugin/plugins/commonConfig.js +7 -5
  142. package/dist/esm/node/plugin/plugins/extractAssetsPlugin.js +6 -3
  143. package/dist/esm/node/plugin/plugins/extractExportNamesPlugin.js +2 -1
  144. package/dist/esm/node/plugin/plugins/importUserCode/getVirtualFileImportUserCode.d.ts +2 -2
  145. package/dist/esm/node/plugin/plugins/importUserCode/getVirtualFileImportUserCode.js +14 -9
  146. package/dist/esm/node/plugin/plugins/importUserCode/index.js +11 -6
  147. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/assertExtensions.d.ts +6 -0
  148. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/{assertExtensions.js → getVikeConfig/assertExtensions.js} +41 -36
  149. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/configDefinitionsBuiltIn.d.ts +2 -2
  150. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/configDefinitionsBuiltIn.js +58 -21
  151. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/{getConfigFileExport.js → getVikeConfig/getConfigFileExport.js} +2 -2
  152. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/getPlusFilesAll.d.ts +39 -0
  153. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/getPlusFilesAll.js +154 -0
  154. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/loadFileAtConfigTime.d.ts +15 -9
  155. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/loadFileAtConfigTime.js +41 -24
  156. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/resolvePointerImport.d.ts +8 -18
  157. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/resolvePointerImport.js +10 -65
  158. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/transpileAndExecuteFile.d.ts +6 -2
  159. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/transpileAndExecuteFile.js +12 -6
  160. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig.d.ts +10 -122
  161. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig.js +407 -594
  162. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/{debug.js → virtual-files/debug.js} +1 -1
  163. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/{getVirtualFilePageConfigValuesAll.js → virtual-files/getVirtualFilePageConfigValuesAll.js} +12 -9
  164. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/{getVirtualFilePageConfigs.js → virtual-files/getVirtualFilePageConfigs.js} +13 -11
  165. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/{isRuntimeEnvMatch.d.ts → virtual-files/isRuntimeEnvMatch.d.ts} +1 -1
  166. package/dist/esm/node/plugin/plugins/packageJsonFile.js +1 -1
  167. package/dist/esm/node/plugin/plugins/previewConfig.js +5 -5
  168. package/dist/esm/node/plugin/plugins/setGlobalContext.js +4 -6
  169. package/dist/esm/node/plugin/shared/findPageFiles.js +2 -1
  170. package/dist/esm/node/plugin/shared/getFullBuildInlineConfig.d.ts +2 -0
  171. package/dist/esm/node/plugin/shared/getFullBuildInlineConfig.js +17 -0
  172. package/dist/esm/{utils → node/plugin/shared}/getOutDirs.d.ts +1 -1
  173. package/dist/esm/{utils → node/plugin/shared}/getOutDirs.js +52 -43
  174. package/dist/esm/node/plugin/{resolveClientEntriesDev.js → shared/resolveClientEntriesDev.js} +5 -8
  175. package/dist/esm/{utils → node/plugin/shared}/viteIsSSR.d.ts +2 -5
  176. package/dist/esm/{utils → node/plugin/shared}/viteIsSSR.js +2 -2
  177. package/dist/esm/node/plugin/utils.d.ts +0 -1
  178. package/dist/esm/node/plugin/utils.js +1 -2
  179. package/dist/esm/node/prerender/context.d.ts +11 -0
  180. package/dist/esm/node/prerender/context.js +29 -0
  181. package/dist/esm/node/prerender/resolvePrerenderConfig.d.ts +12 -0
  182. package/dist/esm/node/prerender/resolvePrerenderConfig.js +44 -0
  183. package/dist/esm/node/prerender/runPrerender.d.ts +42 -1
  184. package/dist/esm/node/prerender/runPrerender.js +90 -69
  185. package/dist/esm/node/prerender/utils.d.ts +2 -2
  186. package/dist/esm/node/prerender/utils.js +2 -2
  187. package/dist/esm/node/runtime/globalContext.d.ts +44 -36
  188. package/dist/esm/node/runtime/globalContext.js +223 -151
  189. package/dist/esm/node/runtime/html/injectAssets/getHtmlTags.d.ts +1 -1
  190. package/dist/esm/node/runtime/html/injectAssets/getHtmlTags.js +11 -7
  191. package/dist/esm/node/runtime/html/injectAssets/getViteDevScript.d.ts +4 -1
  192. package/dist/esm/node/runtime/html/injectAssets/getViteDevScript.js +2 -3
  193. package/dist/esm/node/runtime/html/injectAssets.d.ts +2 -0
  194. package/dist/esm/node/runtime/html/injectAssets.js +4 -4
  195. package/dist/esm/node/runtime/html/renderHtml.js +4 -5
  196. package/dist/esm/node/runtime/page-files/setup.js +1 -1
  197. package/dist/esm/node/runtime/renderPage/analyzePage.d.ts +2 -1
  198. package/dist/esm/node/runtime/renderPage/analyzePage.js +2 -3
  199. package/dist/esm/node/runtime/renderPage/getEarlyHints.js +1 -26
  200. package/dist/esm/node/runtime/renderPage/getPageAssets/sortPageAssetsForEarlyHintsHeader.d.ts +1 -1
  201. package/dist/esm/node/runtime/renderPage/getPageAssets/sortPageAssetsForEarlyHintsHeader.js +2 -4
  202. package/dist/esm/node/runtime/renderPage/getPageAssets.d.ts +3 -1
  203. package/dist/esm/node/runtime/renderPage/getPageAssets.js +4 -4
  204. package/dist/esm/node/runtime/renderPage/handleErrorWithoutErrorPage.d.ts +2 -0
  205. package/dist/esm/node/runtime/renderPage/handleErrorWithoutErrorPage.js +3 -5
  206. package/dist/esm/node/runtime/renderPage/isFontFallback.d.ts +3 -0
  207. package/dist/esm/node/runtime/renderPage/isFontFallback.js +27 -0
  208. package/dist/esm/node/runtime/renderPage/loadUserFilesServerSide.d.ts +2 -0
  209. package/dist/esm/node/runtime/renderPage/loadUserFilesServerSide.js +6 -5
  210. package/dist/esm/node/runtime/renderPage/log404/index.d.ts +2 -0
  211. package/dist/esm/node/runtime/renderPage/log404/index.js +1 -2
  212. package/dist/esm/node/runtime/renderPage/preparePageContextForUserConsumptionServerSide.d.ts +3 -0
  213. package/dist/esm/node/runtime/renderPage/renderPageAlreadyRouted.d.ts +26 -10
  214. package/dist/esm/node/runtime/renderPage/renderPageAlreadyRouted.js +14 -10
  215. package/dist/esm/node/runtime/renderPage/resolveRedirects.d.ts +2 -0
  216. package/dist/esm/node/runtime/renderPage/resolveRedirects.js +5 -5
  217. package/dist/esm/node/runtime/renderPage.js +32 -30
  218. package/dist/esm/node/runtime/utils.d.ts +3 -3
  219. package/dist/esm/node/runtime/utils.js +3 -3
  220. package/dist/esm/node/runtime-dev/createDevMiddleware.js +5 -3
  221. package/dist/esm/node/shared/resolveBase.d.ts +5 -1
  222. package/dist/esm/node/shared/resolveBase.js +7 -0
  223. package/dist/esm/shared/getPageConfigsRuntime.d.ts +13 -0
  224. package/dist/esm/shared/getPageConfigsRuntime.js +18 -0
  225. package/dist/esm/shared/getPageContextUrlComputed.js +6 -1
  226. package/dist/esm/shared/getPageFiles/fileTypes.js +1 -2
  227. package/dist/esm/shared/getPageFiles/getAllPageIdFiles.js +0 -3
  228. package/dist/esm/shared/getPageFiles/getPageFileObject.js +0 -5
  229. package/dist/esm/shared/getPageFiles/parseGlobResults.d.ts +1 -1
  230. package/dist/esm/shared/getPageFiles/parseGlobResults.js +4 -3
  231. package/dist/esm/shared/getPageFiles.d.ts +0 -1
  232. package/dist/esm/shared/getPageFiles.js +0 -1
  233. package/dist/esm/shared/page-configs/Config.d.ts +83 -3
  234. package/dist/esm/shared/page-configs/PageConfig.d.ts +30 -18
  235. package/dist/esm/shared/page-configs/getPageConfigUserFriendly.d.ts +6 -8
  236. package/dist/esm/shared/page-configs/getPageConfigUserFriendly.js +15 -6
  237. package/dist/esm/shared/page-configs/loadConfigValues.js +6 -2
  238. package/dist/esm/shared/page-configs/serialize/serializeConfigValues.d.ts +7 -1
  239. package/dist/esm/shared/page-configs/serialize/serializeConfigValues.js +70 -19
  240. package/dist/esm/shared/route/loadPageRoutes.js +1 -0
  241. package/dist/esm/shared/utils.d.ts +0 -1
  242. package/dist/esm/shared/utils.js +0 -1
  243. package/dist/esm/utils/PROJECT_VERSION.d.ts +1 -1
  244. package/dist/esm/utils/PROJECT_VERSION.js +1 -1
  245. package/dist/esm/utils/assertSetup.js +1 -1
  246. package/dist/esm/utils/catchInfiniteLoop.d.ts +2 -0
  247. package/dist/esm/utils/catchInfiniteLoop.js +32 -0
  248. package/dist/esm/utils/debug.d.ts +1 -1
  249. package/dist/esm/utils/debug.js +8 -6
  250. package/dist/esm/utils/findFile.js +2 -1
  251. package/dist/esm/utils/isDev.js +3 -3
  252. package/dist/esm/utils/isFilePathAbsoluteFilesystem.js +1 -1
  253. package/dist/esm/utils/makePublicCopy.d.ts +3 -0
  254. package/dist/esm/utils/makePublicCopy.js +30 -0
  255. package/dist/esm/utils/objectAssignSafe.d.ts +1 -0
  256. package/dist/esm/utils/objectAssignSafe.js +4 -0
  257. package/dist/esm/utils/path.d.ts +14 -0
  258. package/dist/esm/utils/path.js +46 -0
  259. package/dist/esm/utils/projectInfo.d.ts +1 -1
  260. package/dist/esm/utils/requireResolve.js +1 -1
  261. package/package.json +2 -2
  262. package/dist/cjs/node/plugin/plugins/buildEntry/getVikeManifest.js +0 -17
  263. package/dist/cjs/node/plugin/plugins/importUserCode/addImportStatement.js +0 -29
  264. package/dist/cjs/node/prerender/isPrerenderAutoRunEnabled.js +0 -16
  265. package/dist/cjs/node/shared/assertPluginManifest.js +0 -20
  266. package/dist/cjs/node/shared/assertRuntimeManifest.js +0 -16
  267. package/dist/cjs/shared/assertPageFilePath.js +0 -11
  268. package/dist/cjs/shared/getPageFiles/getPageFiles.js +0 -48
  269. package/dist/cjs/utils/filesystemPathHandling.js +0 -18
  270. package/dist/cjs/utils/path-shim.js +0 -19
  271. package/dist/esm/node/plugin/plugins/buildEntry/getVikeManifest.d.ts +0 -5
  272. package/dist/esm/node/plugin/plugins/buildEntry/getVikeManifest.js +0 -15
  273. package/dist/esm/node/plugin/plugins/importUserCode/addImportStatement.d.ts +0 -14
  274. package/dist/esm/node/plugin/plugins/importUserCode/addImportStatement.js +0 -27
  275. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/assertExtensions.d.ts +0 -5
  276. package/dist/esm/node/prerender/isPrerenderAutoRunEnabled.d.ts +0 -5
  277. package/dist/esm/node/prerender/isPrerenderAutoRunEnabled.js +0 -14
  278. package/dist/esm/node/shared/assertPluginManifest.d.ts +0 -12
  279. package/dist/esm/node/shared/assertPluginManifest.js +0 -18
  280. package/dist/esm/node/shared/assertRuntimeManifest.d.ts +0 -10
  281. package/dist/esm/node/shared/assertRuntimeManifest.js +0 -14
  282. package/dist/esm/shared/assertPageFilePath.d.ts +0 -2
  283. package/dist/esm/shared/assertPageFilePath.js +0 -9
  284. package/dist/esm/shared/getPageFiles/getPageFiles.d.ts +0 -15
  285. package/dist/esm/shared/getPageFiles/getPageFiles.js +0 -46
  286. package/dist/esm/utils/filesystemPathHandling.d.ts +0 -4
  287. package/dist/esm/utils/filesystemPathHandling.js +0 -16
  288. package/dist/esm/utils/path-shim.d.ts +0 -2
  289. package/dist/esm/utils/path-shim.js +0 -17
  290. /package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/{isRuntimeEnvMatch.js → virtual-files/isRuntimeEnvMatch.js} +0 -0
  291. /package/dist/esm/node/plugin/plugins/importUserCode/v1-design/{getConfigFileExport.d.ts → getVikeConfig/getConfigFileExport.d.ts} +0 -0
  292. /package/dist/esm/node/plugin/plugins/importUserCode/v1-design/{debug.d.ts → virtual-files/debug.d.ts} +0 -0
  293. /package/dist/esm/node/plugin/plugins/importUserCode/v1-design/{getVirtualFilePageConfigValuesAll.d.ts → virtual-files/getVirtualFilePageConfigValuesAll.d.ts} +0 -0
  294. /package/dist/esm/node/plugin/plugins/importUserCode/v1-design/{getVirtualFilePageConfigs.d.ts → virtual-files/getVirtualFilePageConfigs.d.ts} +0 -0
  295. /package/dist/esm/node/plugin/plugins/importUserCode/v1-design/{isRuntimeEnvMatch.js → virtual-files/isRuntimeEnvMatch.js} +0 -0
  296. /package/dist/esm/node/plugin/{resolveClientEntriesDev.d.ts → shared/resolveClientEntriesDev.d.ts} +0 -0
@@ -2,31 +2,26 @@ export { getVikeConfig };
2
2
  export { getVikeConfig2 };
3
3
  export { reloadVikeConfig };
4
4
  export { vikeConfigDependencies };
5
- export { isVikeConfigFile };
6
5
  export { isV1Design };
7
- export { getConfigValueInterfaceFile };
8
- import { assertPosixPath, assert, isObject, assertUsage, assertWarning, objectEntries, hasProp, includes, assertIsNotProductionRuntime, getMostSimilar, joinEnglish, lowerFirst, assertKeys, objectKeys, objectFromEntries, makeFirst, isNpmPackageImport, reverse } from '../../../utils.js';
9
- import path from 'path';
10
- import { configDefinitionsBuiltInAll } from './getVikeConfig/configDefinitionsBuiltIn.js';
6
+ export { getConfVal };
7
+ export { getConfigDefinitionOptional };
8
+ import { assertPosixPath, assert, isObject, assertUsage, assertWarning, objectEntries, hasProp, includes, assertIsNotProductionRuntime, getMostSimilar, joinEnglish, assertKeys, objectKeys, objectFromEntries, unique, isCallable, makeFirst, lowerFirst } from '../../../utils.js';
9
+ import { configDefinitionsBuiltIn } from './getVikeConfig/configDefinitionsBuiltIn.js';
11
10
  import { getLocationId, getFilesystemRouteString, getFilesystemRouteDefinedBy, isInherited, sortAfterInheritanceOrder, isGlobalLocation, applyFilesystemRoutingRootEffect } from './getVikeConfig/filesystemRouting.js';
12
- import { isTemporaryBuildFile } from './getVikeConfig/transpileAndExecuteFile.js';
13
11
  import { isConfigInvalid, isConfigInvalid_set } from '../../../../runtime/renderPage/isConfigInvalid.js';
14
12
  import { getViteDevServer } from '../../../../runtime/globalContext.js';
15
13
  import { logConfigError, logConfigErrorRecover } from '../../../shared/loggerNotProd.js';
16
14
  import { removeSuperfluousViteLog_enable, removeSuperfluousViteLog_disable } from '../../../shared/loggerVite/removeSuperfluousViteLog.js';
17
15
  import pc from '@brillout/picocolors';
18
16
  import { getConfigDefinedAt } from '../../../../../shared/page-configs/getConfigDefinedAt.js';
19
- import { crawlPlusFiles } from './getVikeConfig/crawlPlusFiles.js';
20
- import { getConfigFileExport } from './getConfigFileExport.js';
21
- import { loadConfigFile, loadImportedFile, loadValueFile } from './getVikeConfig/loadFileAtConfigTime.js';
22
- import { clearFilesEnvMap, resolveConfigEnvWithFileName, resolvePointerImportOfConfig } from './getVikeConfig/resolvePointerImport.js';
17
+ import { loadPointerImport, loadValueFile } from './getVikeConfig/loadFileAtConfigTime.js';
18
+ import { resolvePointerImport } from './getVikeConfig/resolvePointerImport.js';
23
19
  import { getFilePathResolved } from '../../../shared/getFilePath.js';
24
20
  import { getConfigValueBuildTime } from '../../../../../shared/page-configs/getConfigValueBuildTime.js';
25
- import { assertExtensionsPeerDependencies, assertExtensionsConventions } from './assertExtensions.js';
21
+ import { assertExtensionsRequire } from './getVikeConfig/assertExtensions.js';
26
22
  import { getPageConfigUserFriendlyNew } from '../../../../../shared/page-configs/getPageConfigUserFriendly.js';
27
23
  import { getConfigValuesBase } from '../../../../../shared/page-configs/serialize/serializeConfigValues.js';
28
- const configDefinitionsBuiltIn = getConfigDefinitionsBuiltIn();
29
- const configDefinitionsBuiltInGlobal = getConfigDefinitionsBuiltInGlobal();
24
+ import { getPlusFilesAll } from './getVikeConfig/getPlusFilesAll.js';
30
25
  assertIsNotProductionRuntime();
31
26
  let restartVite = false;
32
27
  let wasConfigInvalid = null;
@@ -37,7 +32,6 @@ function reloadVikeConfig(config) {
37
32
  const vikeVitePluginOptions = config._vikeVitePluginOptions;
38
33
  assert(vikeVitePluginOptions);
39
34
  vikeConfigDependencies.clear();
40
- clearFilesEnvMap();
41
35
  vikeConfigPromise = loadVikeConfig_withErrorHandling(userRootDir, true, vikeVitePluginOptions);
42
36
  handleReloadSideEffects();
43
37
  }
@@ -96,116 +90,6 @@ async function isV1Design(config) {
96
90
  const isV1Design = pageConfigs.length > 0;
97
91
  return isV1Design;
98
92
  }
99
- async function loadInterfaceFiles(userRootDir) {
100
- const plusFiles = await findPlusFiles(userRootDir, null);
101
- const configFiles = [];
102
- const valueFiles = [];
103
- plusFiles.forEach((f) => {
104
- if (getConfigName(f.filePathAbsoluteFilesystem) === 'config') {
105
- configFiles.push(f);
106
- }
107
- else {
108
- valueFiles.push(f);
109
- }
110
- });
111
- let interfaceFilesByLocationId = {};
112
- await Promise.all([
113
- // Config files
114
- ...configFiles.map(async (filePath) => {
115
- const { filePathAbsoluteUserRootDir } = filePath;
116
- assert(filePathAbsoluteUserRootDir);
117
- const { configFile, extendsConfigs } = await loadConfigFile(filePath, userRootDir, [], false);
118
- assert(filePath.filePathAbsoluteUserRootDir);
119
- const locationId = getLocationId(filePathAbsoluteUserRootDir);
120
- const interfaceFile = getInterfaceFileFromConfigFile(configFile, false, locationId);
121
- interfaceFilesByLocationId[locationId] = interfaceFilesByLocationId[locationId] ?? [];
122
- interfaceFilesByLocationId[locationId].push(interfaceFile);
123
- extendsConfigs.forEach((extendsConfig) => {
124
- /* We purposely use the same locationId because the Vike extension's config should only apply to where it's being extended from, for example:
125
- ```js
126
- // /pages/admin/+config.js
127
-
128
- import vikeVue from 'vike-vue/config'
129
- // Should only apply to /pages/admin/**
130
- export default { extends: [vikeVue] }
131
- ```
132
- ```js
133
- // /pages/marketing/+config.js
134
-
135
- import vikeReact from 'vike-react/config'
136
- // Should only apply to /pages/marketing/**
137
- export default { extends: [vikeReact] }
138
- ```
139
- */
140
- const interfaceFile = getInterfaceFileFromConfigFile(extendsConfig, true, locationId);
141
- assertExtensionsConventions(interfaceFile);
142
- interfaceFilesByLocationId[locationId].push(interfaceFile);
143
- });
144
- }),
145
- // Value files
146
- ...valueFiles.map(async (filePath) => {
147
- const { filePathAbsoluteUserRootDir } = filePath;
148
- assert(filePathAbsoluteUserRootDir);
149
- const configName = getConfigName(filePathAbsoluteUserRootDir);
150
- assert(configName);
151
- const locationId = getLocationId(filePathAbsoluteUserRootDir);
152
- const interfaceFile = {
153
- locationId,
154
- filePath,
155
- fileExportsByConfigName: {
156
- [configName]: {}
157
- },
158
- isConfigFile: false,
159
- isValueFile: true,
160
- configName
161
- };
162
- {
163
- // We don't have access to the custom config definitions defined by the user yet.
164
- // - If `configDef` is `undefined` => we load the file +{configName}.js later.
165
- // - We already need to load +meta.js here (to get the custom config definitions defined by the user)
166
- const configDef = getConfigDefinitionOptional(configDefinitionsBuiltIn, configName);
167
- if (configDef && isLoadableAtBuildTime(configDef)) {
168
- await loadValueFile(interfaceFile, configName, userRootDir);
169
- }
170
- }
171
- {
172
- interfaceFilesByLocationId[locationId] = interfaceFilesByLocationId[locationId] ?? [];
173
- interfaceFilesByLocationId[locationId].push(interfaceFile);
174
- }
175
- })
176
- ]);
177
- assertAllConfigsAreKnown(interfaceFilesByLocationId);
178
- return interfaceFilesByLocationId;
179
- }
180
- function getInterfaceFileFromConfigFile(configFile, isConfigExtend, locationId) {
181
- const { fileExports, filePath, extendsFilePaths } = configFile;
182
- const interfaceFile = {
183
- locationId,
184
- filePath,
185
- fileExportsByConfigName: {},
186
- isConfigFile: true,
187
- isValueFile: false,
188
- isConfigExtend,
189
- extendsFilePaths
190
- };
191
- const fileExport = getConfigFileExport(fileExports, filePath.filePathToShowToUser);
192
- Object.entries(fileExport).forEach(([configName, configValue]) => {
193
- interfaceFile.fileExportsByConfigName[configName] = { configValue };
194
- });
195
- return interfaceFile;
196
- }
197
- /** Show error message upon unknown config */
198
- function assertAllConfigsAreKnown(interfaceFilesByLocationId) {
199
- objectEntries(interfaceFilesByLocationId).forEach(([locationId, interfaceFiles]) => {
200
- const interfaceFilesRelevant = getInterfaceFilesRelevant(interfaceFilesByLocationId, locationId);
201
- const configDefinitions = getConfigDefinitions(interfaceFilesRelevant);
202
- interfaceFiles.forEach((interfaceFile) => {
203
- Object.keys(interfaceFile.fileExportsByConfigName).forEach((configName) => {
204
- assertConfigExists(configName, Object.keys(configDefinitions), interfaceFile.filePath.filePathToShowToUser);
205
- });
206
- });
207
- });
208
- }
209
93
  async function loadVikeConfig_withErrorHandling(userRootDir, isDev, vikeVitePluginOptions, doNotRestartViteOnError) {
210
94
  let hasError = false;
211
95
  let ret;
@@ -242,7 +126,6 @@ async function loadVikeConfig_withErrorHandling(userRootDir, isDev, vikeVitePlug
242
126
  configDefinitions: {},
243
127
  configValueSources: {}
244
128
  },
245
- vikeConfigGlobal: resolveVikeConfigGlobal({}, {}),
246
129
  global: getPageConfigUserFriendlyNew({ configValues: {} })
247
130
  };
248
131
  return dummyData;
@@ -250,149 +133,156 @@ async function loadVikeConfig_withErrorHandling(userRootDir, isDev, vikeVitePlug
250
133
  }
251
134
  }
252
135
  async function loadVikeConfig(userRootDir, vikeVitePluginOptions) {
253
- const interfaceFilesByLocationId = await loadInterfaceFiles(userRootDir);
254
- const importedFilesLoaded = {};
255
- const [globalConfigs, pageConfigs] = await Promise.all([
256
- getGlobalConfigs(interfaceFilesByLocationId, userRootDir, importedFilesLoaded, vikeVitePluginOptions),
257
- getPageConfigs(interfaceFilesByLocationId, userRootDir, importedFilesLoaded)
258
- ]);
259
- return { pageConfigs, ...globalConfigs };
260
- }
261
- async function getGlobalConfigs(interfaceFilesByLocationId, userRootDir, importedFilesLoaded, vikeVitePluginOptions) {
262
- const locationIds = objectKeys(interfaceFilesByLocationId);
263
- const interfaceFilesGlobal = objectFromEntries(objectEntries(interfaceFilesByLocationId).filter(([locationId]) => {
264
- return isGlobalLocation(locationId, locationIds);
136
+ const esbuildCache = {};
137
+ const plusFilesAll = await getPlusFilesAll(userRootDir, esbuildCache);
138
+ assertKnownConfigs(plusFilesAll);
139
+ const configDefinitionsResolved = await resolveConfigDefinitions(plusFilesAll, userRootDir, esbuildCache);
140
+ const { pageConfigGlobal, pageConfigs } = getPageConfigsBuildTime(configDefinitionsResolved, plusFilesAll, userRootDir);
141
+ // interop vike(options) in vite.config.js
142
+ temp_interopVikeVitePlugin(pageConfigGlobal, vikeVitePluginOptions, userRootDir);
143
+ // global
144
+ const configValues = getConfigValues(pageConfigGlobal);
145
+ const global = getPageConfigUserFriendlyNew({ configValues });
146
+ return { pageConfigs, pageConfigGlobal, global };
147
+ }
148
+ async function resolveConfigDefinitions(plusFilesAll, userRootDir, esbuildCache) {
149
+ const configDefinitionsGlobal = getConfigDefinitions(
150
+ // We use `plusFilesAll` in order to allow local Vike extensions to create global configs.
151
+ sortForGlobal(plusFilesAll), (configDef) => !!configDef.global);
152
+ await loadCustomConfigBuildTimeFiles(plusFilesAll, configDefinitionsGlobal, userRootDir, esbuildCache);
153
+ const configDefinitionsLocal = {};
154
+ await Promise.all(objectEntries(plusFilesAll).map(async ([locationId, plusFiles]) => {
155
+ const plusFilesRelevant = getPlusFilesRelevant(plusFilesAll, locationId);
156
+ const configDefinitions = getConfigDefinitions(plusFilesRelevant, (configDef) => configDef.global !== true);
157
+ await loadCustomConfigBuildTimeFiles(plusFiles, configDefinitions, userRootDir, esbuildCache);
158
+ configDefinitionsLocal[locationId] = { configDefinitions, plusFiles, plusFilesRelevant };
265
159
  }));
266
- // Validate that global configs live in global interface files
267
- {
268
- const interfaceFilesGlobalPaths = [];
269
- objectEntries(interfaceFilesGlobal).forEach(([locationId, interfaceFiles]) => {
270
- assert(isGlobalLocation(locationId, locationIds));
271
- interfaceFiles.forEach(({ filePath: { filePathAbsoluteUserRootDir } }) => {
272
- if (filePathAbsoluteUserRootDir) {
273
- interfaceFilesGlobalPaths.push(filePathAbsoluteUserRootDir);
274
- }
275
- });
276
- });
277
- const globalPaths = Array.from(new Set(interfaceFilesGlobalPaths.map((p) => path.posix.dirname(p))));
278
- objectEntries(interfaceFilesByLocationId).forEach(([locationId, interfaceFiles]) => {
279
- interfaceFiles.forEach((interfaceFile) => {
280
- Object.keys(interfaceFile.fileExportsByConfigName).forEach((configName) => {
281
- if (!isGlobalLocation(locationId, locationIds) && isGlobalConfig(configName)) {
282
- assertUsage(false, [
283
- `${interfaceFile.filePath.filePathToShowToUser} defines the config ${pc.cyan(configName)} which is global:`,
284
- globalPaths.length
285
- ? `define ${pc.cyan(configName)} in ${joinEnglish(globalPaths, 'or')} instead`
286
- : `create a global config (e.g. /pages/+config.js) and define ${pc.cyan(configName)} there instead`
287
- ].join(' '));
288
- }
289
- });
290
- });
291
- });
292
- }
293
- const pageConfigGlobalValues = {};
294
- const pageConfigGlobal = {
295
- configDefinitions: configDefinitionsBuiltInGlobal,
296
- configValueSources: {}
160
+ const configDefinitionsResolved = {
161
+ configDefinitionsGlobal,
162
+ configDefinitionsLocal
297
163
  };
298
- await Promise.all(objectEntries(configDefinitionsBuiltInGlobal).map(async ([configName, configDef]) => {
299
- const sources = await resolveConfigValueSources(configName, configDef, interfaceFilesGlobal, userRootDir, importedFilesLoaded);
300
- const configValueSource = sources[0];
301
- if (!configValueSource)
302
- return;
303
- pageConfigGlobal.configValueSources[configName] = sources;
304
- // TODO/now
305
- if (configName === 'onBeforeRoute' || configName === 'onPrerenderStart') {
306
- assert(!('value' in configValueSource));
164
+ return configDefinitionsResolved;
165
+ }
166
+ // Load value files (with `env.config===true`) of *custom* configs.
167
+ // - The value files of *built-in* configs are already loaded at `getPlusFilesAll()`.
168
+ async function loadCustomConfigBuildTimeFiles(plusFiles, configDefinitions, userRootDir, esbuildCache) {
169
+ const plusFileList = Object.values(plusFiles).flat(1);
170
+ await Promise.all(plusFileList.map(async (plusFile) => {
171
+ if (!plusFile.isConfigFile) {
172
+ await loadValueFile(plusFile, configDefinitions, userRootDir, esbuildCache);
307
173
  }
308
174
  else {
309
- assert('value' in configValueSource);
310
- // TODO/now
311
- if (configName === 'prerender' && typeof configValueSource.value === 'boolean')
312
- return;
313
- pageConfigGlobalValues[configName] = configValueSource.value;
175
+ await Promise.all(Object.entries(plusFile.pointerImportsByConfigName).map(async ([configName, pointerImport]) => {
176
+ await loadPointerImport(pointerImport, userRootDir, configName, configDefinitions, esbuildCache);
177
+ }));
314
178
  }
315
179
  }));
316
- const vikeConfigGlobal = resolveVikeConfigGlobal(vikeVitePluginOptions, pageConfigGlobalValues);
317
- {
318
- assert(isObject(vikeVitePluginOptions));
319
- Object.entries(vikeVitePluginOptions).forEach(([configName, value]) => {
320
- var _a;
321
- assert(includes(objectKeys(configDefinitionsBuiltInGlobal), configName));
322
- const configDef = configDefinitionsBuiltInGlobal[configName];
323
- const sources = ((_a = pageConfigGlobal.configValueSources)[configName] ?? (_a[configName] = []));
324
- sources.push({
325
- value,
326
- configEnv: configDef.env,
327
- definedAtFilePath: {
328
- ...getFilePathResolved({
329
- userRootDir,
330
- filePathAbsoluteUserRootDir: '/vite.config.js'
331
- }),
332
- fileExportPathToShowToUser: null
333
- },
334
- locationId: '/',
335
- isOverriden: configDef.cumulative ? false : sources.length > 0,
336
- valueIsImportedAtRuntime: false,
337
- valueIsDefinedByPlusFile: false
338
- });
339
- });
340
- }
341
- const configValues = getConfigValues(pageConfigGlobal);
342
- const global = getPageConfigUserFriendlyNew({ configValues });
343
- return { pageConfigGlobal, vikeConfigGlobal, global };
344
180
  }
345
- async function getPageConfigs(interfaceFilesByLocationId, userRootDir, importedFilesLoaded) {
346
- const pageConfigs = await Promise.all(objectEntries(interfaceFilesByLocationId)
347
- .filter(([_pageId, interfaceFiles]) => isDefiningPage(interfaceFiles))
348
- .map(async ([locationId]) => {
349
- const interfaceFilesRelevant = getInterfaceFilesRelevant(interfaceFilesByLocationId, locationId);
350
- const interfaceFilesRelevantList = Object.values(interfaceFilesRelevant).flat(1);
351
- assertExtensionsPeerDependencies(interfaceFilesRelevantList);
352
- const configDefinitions = getConfigDefinitions(interfaceFilesRelevant);
353
- // Load value files of custom config-only configs
354
- await Promise.all(interfaceFilesRelevantList.map(async (interfaceFile) => {
355
- if (!interfaceFile.isValueFile)
356
- return;
357
- const { configName } = interfaceFile;
358
- if (isGlobalConfig(configName))
359
- return;
360
- const configDef = getConfigDefinition(configDefinitions, configName, interfaceFile.filePath.filePathToShowToUser);
361
- if (!isLoadableAtBuildTime(configDef))
362
- return;
363
- const isAlreadyLoaded = interfacefileIsAlreaydLoaded(interfaceFile);
364
- if (isAlreadyLoaded)
365
- return;
366
- // Value files of built-in configs should have already been loaded at loadInterfaceFiles()
367
- assert(!(configName in configDefinitionsBuiltIn));
368
- await loadValueFile(interfaceFile, configName, userRootDir);
369
- }));
370
- let configValueSources = {};
371
- await Promise.all(objectEntries(configDefinitions)
372
- .filter(([configName]) => !isGlobalConfig(configName))
373
- .map(async ([configName, configDef]) => {
374
- const sources = await resolveConfigValueSources(configName, configDef, interfaceFilesRelevant, userRootDir, importedFilesLoaded);
181
+ function getPageConfigsBuildTime(configDefinitionsResolved, plusFilesAll, userRootDir) {
182
+ const pageConfigGlobal = {
183
+ configDefinitions: configDefinitionsResolved.configDefinitionsGlobal,
184
+ configValueSources: {}
185
+ };
186
+ objectEntries(configDefinitionsResolved.configDefinitionsGlobal).forEach(([configName, configDef]) => {
187
+ const sources = resolveConfigValueSources(configName, configDef,
188
+ // We use `plusFilesAll` in order to allow local Vike extensions to set the value of global configs (e.g. `vite`).
189
+ sortForGlobal(plusFilesAll), userRootDir, true);
190
+ if (sources.length === 0)
191
+ return;
192
+ pageConfigGlobal.configValueSources[configName] = sources;
193
+ });
194
+ assertPageConfigGlobal(pageConfigGlobal, plusFilesAll);
195
+ const pageConfigs = objectEntries(configDefinitionsResolved.configDefinitionsLocal)
196
+ .filter(([_locationId, { plusFiles }]) => isDefiningPage(plusFiles))
197
+ .map(([locationId, { configDefinitions, plusFilesRelevant }]) => {
198
+ const configDefinitionsLocal = configDefinitions;
199
+ const configValueSources = {};
200
+ objectEntries(configDefinitionsLocal)
201
+ .filter(([_configName, configDef]) => configDef.global !== true)
202
+ .forEach(([configName, configDef]) => {
203
+ const sources = resolveConfigValueSources(configName, configDef, plusFilesRelevant, userRootDir, false);
204
+ // sortConfigValueSources(sources, locationId)
375
205
  if (sources.length === 0)
376
206
  return;
377
207
  configValueSources[configName] = sources;
378
- }));
379
- configValueSources = sortConfigValueSources(configValueSources, locationId);
208
+ });
380
209
  const { routeFilesystem, isErrorPage } = determineRouteFilesystem(locationId, configValueSources);
381
- applyEffectsAll(configValueSources, configDefinitions);
382
- const configValuesComputed = getComputed(configValueSources, configDefinitions);
383
- assertUsageGlobalConfigs(interfaceFilesRelevantList, configDefinitions, interfaceFilesByLocationId);
210
+ applyEffectsAll(configValueSources, configDefinitionsLocal);
211
+ const configValuesComputed = getComputed(configValueSources, configDefinitionsLocal);
384
212
  const pageConfig = {
385
213
  pageId: locationId,
386
214
  isErrorPage,
387
215
  routeFilesystem,
388
- configDefinitions,
216
+ configDefinitions: configDefinitionsLocal,
217
+ plusFiles: plusFilesRelevant,
389
218
  configValueSources,
390
219
  configValuesComputed
391
220
  };
392
221
  return pageConfig;
393
- }));
222
+ });
394
223
  assertPageConfigs(pageConfigs);
395
- return pageConfigs;
224
+ return { pageConfigs, pageConfigGlobal };
225
+ }
226
+ function assertPageConfigGlobal(pageConfigGlobal, plusFilesAll) {
227
+ Object.entries(pageConfigGlobal.configValueSources).forEach(([configName, sources]) => {
228
+ assertGlobalConfigLocation(configName, sources, plusFilesAll, pageConfigGlobal.configDefinitions);
229
+ });
230
+ }
231
+ function assertGlobalConfigLocation(configName, sources, plusFilesAll, configDefinitionsGlobal) {
232
+ const locationIdsAll = objectKeys(plusFilesAll);
233
+ // Determine existing global +config.js files
234
+ const configFilePathsGlobal = [];
235
+ const plusFilesGlobal = Object.values(objectFromEntries(objectEntries(plusFilesAll).filter(([locationId]) => isGlobalLocation(locationId, locationIdsAll)))).flat();
236
+ plusFilesGlobal
237
+ .filter((i) => i.isConfigFile)
238
+ .forEach((plusFile) => {
239
+ const { filePathAbsoluteUserRootDir } = plusFile.filePath;
240
+ if (filePathAbsoluteUserRootDir) {
241
+ configFilePathsGlobal.push(filePathAbsoluteUserRootDir);
242
+ }
243
+ });
244
+ // Call assertWarning()
245
+ sources.forEach((source) => {
246
+ const { plusFile } = source;
247
+ // It's `null` when the config is defined by `vike(options)` in vite.config.js
248
+ assert(plusFile);
249
+ const { filePathAbsoluteUserRootDir } = plusFile.filePath;
250
+ // Allow local Vike extensions to set gloabl configs (`filePathAbsoluteUserRootDir===null` for Vike extension)
251
+ if (!filePathAbsoluteUserRootDir)
252
+ return;
253
+ assert(!plusFile.isExtensionConfig);
254
+ if (!isGlobalLocation(source.locationId, locationIdsAll)) {
255
+ const configDef = configDefinitionsGlobal[configName];
256
+ assert(configDef);
257
+ const isConditionallyGlobal = isCallable(configDef.global);
258
+ const errBeg = `${filePathAbsoluteUserRootDir} (which is a local config file) sets the config ${pc.cyan(configName)}`;
259
+ const errMid = !isConditionallyGlobal
260
+ ? "but it's a global config"
261
+ : 'to a value that is global';
262
+ const what = isConditionallyGlobal ? 'global values' : pc.cyan(configName);
263
+ const errEnd = configFilePathsGlobal.length > 0
264
+ ? `define ${what} at a global config file such as ${joinEnglish(configFilePathsGlobal, 'or')} instead`
265
+ : `create a global config file (e.g. /pages/+config.js) and define ${what} there instead`;
266
+ // When updating this error message => also update error message at https://vike.dev/warning/global-config
267
+ const errMsg = `${errBeg} ${errMid}: ${errEnd} (https://vike.dev/warning/global-config).`;
268
+ assertWarning(false, errMsg, { onlyOnce: true });
269
+ }
270
+ });
271
+ }
272
+ function assertPageConfigs(pageConfigs) {
273
+ pageConfigs.forEach((pageConfig) => {
274
+ assertExtensionsRequire(pageConfig);
275
+ assertOnBeforeRenderEnv(pageConfig);
276
+ });
277
+ }
278
+ function assertOnBeforeRenderEnv(pageConfig) {
279
+ const onBeforeRenderConfig = pageConfig.configValueSources.onBeforeRender?.[0];
280
+ if (!onBeforeRenderConfig)
281
+ return;
282
+ const onBeforeRenderEnv = onBeforeRenderConfig.configEnv;
283
+ const isClientRouting = getConfigValueBuildTime(pageConfig, 'clientRouting', 'boolean');
284
+ // When using Server Routing, loading a onBeforeRender() hook on the client-side hasn't any effect (the Server Routing's client runtime never calls it); it unnecessarily bloats client bundle sizes
285
+ assertUsage(!(onBeforeRenderEnv.client && !isClientRouting), `Page ${pageConfig.pageId} has an onBeforeRender() hook with env ${pc.cyan(JSON.stringify(onBeforeRenderEnv))} which doesn't make sense because the page is using Server Routing: onBeforeRender() can be run in the client only when using Client Routing.`);
396
286
  }
397
287
  function getConfigValues(pageConfig) {
398
288
  const configValues = {};
@@ -422,178 +312,150 @@ function getConfigValues(pageConfig) {
422
312
  });
423
313
  return configValues;
424
314
  }
425
- // TODO/now: refactor
426
- // - Dedupe: most of the assertUsageGlobalConfigs() code below is a copy-paste of the assertUsage() logic inside getGlobalConfigs()
427
- // - This assertUsage() message is slightly better: use this one for getGlobalConfigs()
428
- // Global configs should be defined at global locations
429
- function assertUsageGlobalConfigs(interfaceFilesRelevantList, configDefinitions, interfaceFilesByLocationId) {
430
- interfaceFilesRelevantList.forEach((interfaceFile) => {
431
- const configNames = [];
432
- if (interfaceFile.isValueFile) {
433
- configNames.push(interfaceFile.configName);
434
- }
435
- else {
436
- configNames.push(...Object.keys(interfaceFile.fileExportsByConfigName));
437
- }
438
- configNames.forEach((configName) => {
439
- if (isGlobalConfig(configName))
440
- return;
441
- const configDef = getConfigDefinition(configDefinitions, configName, interfaceFile.filePath.filePathToShowToUser);
442
- if (configDef.global === true) {
443
- const locationIds = objectKeys(interfaceFilesByLocationId);
444
- if (!isGlobalLocation(interfaceFile.locationId, locationIds)) {
445
- const interfaceFilesGlobal = objectFromEntries(objectEntries(interfaceFilesByLocationId).filter(([locationId]) => {
446
- return isGlobalLocation(locationId, locationIds);
447
- }));
448
- const configFilesGlobal = [];
449
- objectEntries(interfaceFilesGlobal).forEach(([locationId, interfaceFiles]) => {
450
- assert(isGlobalLocation(locationId, locationIds));
451
- interfaceFiles.forEach((interfaceFile) => {
452
- if (!interfaceFile.isConfigFile)
453
- return;
454
- const { filePath: { filePathAbsoluteUserRootDir } } = interfaceFile;
455
- if (filePathAbsoluteUserRootDir) {
456
- configFilesGlobal.push(filePathAbsoluteUserRootDir);
457
- }
458
- });
459
- });
460
- assertUsage(false, [
461
- `${interfaceFile.filePath.filePathToShowToUser} sets the config ${pc.cyan(configName)} but it's a global config:`,
462
- configFilesGlobal.length > 0
463
- ? `define ${pc.cyan(configName)} at ${joinEnglish(configFilesGlobal, 'or')} instead.`
464
- : `create a global config (e.g. /pages/+config.js) and define ${pc.cyan(configName)} there instead.`
465
- ].join(' '));
466
- }
467
- }
315
+ function temp_interopVikeVitePlugin(pageConfigGlobal, vikeVitePluginOptions, userRootDir) {
316
+ assert(isObject(vikeVitePluginOptions));
317
+ assertWarning(Object.keys(vikeVitePluginOptions).length === 0, `Define Vike settings in +config.js instead of vite.config.js ${pc.underline('https://vike.dev/migration/settings')}`, { onlyOnce: true });
318
+ Object.entries(vikeVitePluginOptions).forEach(([configName, value]) => {
319
+ var _a;
320
+ assert(includes(objectKeys(configDefinitionsBuiltIn), configName));
321
+ const configDef = configDefinitionsBuiltIn[configName];
322
+ const sources = ((_a = pageConfigGlobal.configValueSources)[configName] ?? (_a[configName] = []));
323
+ sources.push({
324
+ valueIsLoaded: true,
325
+ value,
326
+ configEnv: configDef.env,
327
+ definedAtFilePath: {
328
+ ...getFilePathResolved({
329
+ userRootDir,
330
+ filePathAbsoluteUserRootDir: '/vite.config.js'
331
+ }),
332
+ fileExportPathToShowToUser: null
333
+ },
334
+ locationId: '/',
335
+ plusFile: null,
336
+ isOverriden: configDef.cumulative ? false : sources.length > 0,
337
+ valueIsImportedAtRuntime: false,
338
+ valueIsDefinedByPlusFile: false
468
339
  });
469
340
  });
470
341
  }
471
- function assertPageConfigs(pageConfigs) {
472
- pageConfigs.forEach((pageConfig) => {
473
- assertOnBeforeRenderEnv(pageConfig);
474
- });
475
- }
476
- function assertOnBeforeRenderEnv(pageConfig) {
477
- const onBeforeRenderConfig = pageConfig.configValueSources.onBeforeRender?.[0];
478
- if (!onBeforeRenderConfig)
479
- return;
480
- const onBeforeRenderEnv = onBeforeRenderConfig.configEnv;
481
- const isClientRouting = getConfigValueBuildTime(pageConfig, 'clientRouting', 'boolean');
482
- // When using Server Routing, loading a onBeforeRender() hook on the client-side hasn't any effect (the Server Routing's client runtime never calls it); it unnecessarily bloats client bundle sizes
483
- assertUsage(!(onBeforeRenderEnv.client && !isClientRouting), `Page ${pageConfig.pageId} has an onBeforeRender() hook with env ${pc.cyan(JSON.stringify(onBeforeRenderEnv))} which doesn't make sense because the page is using Server Routing: onBeforeRender() can be run in the client only when using Client Routing.`);
484
- }
485
- function interfacefileIsAlreaydLoaded(interfaceFile) {
486
- const configMapValues = Object.values(interfaceFile.fileExportsByConfigName);
487
- const isAlreadyLoaded = configMapValues.some((conf) => 'configValue' in conf);
488
- if (isAlreadyLoaded) {
489
- assert(configMapValues.every((conf) => 'configValue' in conf));
490
- }
491
- return isAlreadyLoaded;
492
- }
493
- function getInterfaceFilesRelevant(interfaceFilesByLocationId, locationIdPage) {
494
- const interfaceFilesRelevant = Object.fromEntries(objectEntries(interfaceFilesByLocationId)
342
+ function getPlusFilesRelevant(plusFilesAll, locationIdPage) {
343
+ const plusFilesRelevant = Object.fromEntries(objectEntries(plusFilesAll)
495
344
  .filter(([locationId]) => {
496
345
  return isInherited(locationId, locationIdPage);
497
346
  })
347
+ // Sort after config inheritance.
348
+ // - Together with getPlusFilesOrdered() this implements the whole order of config inheritance.
349
+ // - See sortForGlobal() for global configs order.
498
350
  .sort(([locationId1], [locationId2]) => sortAfterInheritanceOrder(locationId1, locationId2, locationIdPage)));
499
- return interfaceFilesRelevant;
351
+ return plusFilesRelevant;
352
+ }
353
+ function sortForGlobal(plusFilesAll) {
354
+ const locationIdsAll = objectKeys(plusFilesAll);
355
+ const plusFilesAllSorted = Object.fromEntries(objectEntries(plusFilesAll)
356
+ .sort(lowerFirst(([locationId]) => locationId.split('/').length))
357
+ .sort(makeFirst(([locationId]) => isGlobalLocation(locationId, locationIdsAll))));
358
+ return plusFilesAllSorted;
359
+ }
360
+ function resolveConfigValueSources(configName, configDef, plusFilesRelevant, userRootDir, isGlobal) {
361
+ const plusFilesOrdered = getPlusFilesOrdered(configName, plusFilesRelevant);
362
+ let sources = plusFilesOrdered.map((plusFile, i) => {
363
+ const isHighestInheritancePrecedence = i === 0;
364
+ const configValueSource = getConfigValueSource(configName, plusFile, configDef, userRootDir, isHighestInheritancePrecedence);
365
+ return configValueSource;
366
+ });
367
+ if (isCallable(configDef.global)) {
368
+ const isGlobalValue = configDef.global;
369
+ assert(configDef.env.config);
370
+ sources = sources.filter((source) => {
371
+ assert(source.configEnv.config);
372
+ assert(source.valueIsLoaded);
373
+ const valueIsGlobal = isGlobalValue(source.value);
374
+ return isGlobal ? valueIsGlobal : !valueIsGlobal;
375
+ });
376
+ }
377
+ return sources;
500
378
  }
501
- async function resolveConfigValueSources(configName, configDef, interfaceFilesRelevant, userRootDir, importedFilesLoaded) {
502
- const sourcesInfo = [];
503
- // interfaceFilesRelevant is sorted by sortAfterInheritanceOrder()
504
- for (const interfaceFiles of Object.values(interfaceFilesRelevant)) {
505
- const interfaceFilesDefiningConfig = interfaceFiles.filter((interfaceFile) => interfaceFile.fileExportsByConfigName[configName]);
506
- if (interfaceFilesDefiningConfig.length === 0)
507
- continue;
508
- const visited = new WeakSet();
509
- const add = (interfaceFile) => {
510
- assert(!visited.has(interfaceFile));
511
- visited.add(interfaceFile);
512
- const isHighestInheritancePrecedence = sourcesInfo.length === 0;
513
- sourcesInfo.push([
514
- configName,
515
- interfaceFile,
516
- configDef,
517
- userRootDir,
518
- importedFilesLoaded,
519
- isHighestInheritancePrecedence
520
- ]);
379
+ // Together with sortAfterInheritanceOrder() this implements the whole order of config inheritance.
380
+ function getPlusFilesOrdered(configName, plusFilesRelevant) {
381
+ const plusFilesOrdered = [];
382
+ // `plusFilesRelevant` is already sorted by sortAfterInheritanceOrder() at getPlusFilesRelevant()
383
+ // `plusFilesAtLocationId` is already sorted by sortMakeDeterministic() at getPlusFilesAll()
384
+ for (const plusFilesAtLocationId of Object.values(plusFilesRelevant)) {
385
+ const plusFilesForConfigName = plusFilesAtLocationId.filter((plusFile) => getDefiningConfigNames(plusFile).includes(configName));
386
+ // We populate `plusFilesOrdered` with inheritance order.
387
+ const populate = (plusFile) => {
388
+ assert(!visited.has(plusFile));
389
+ visited.add(plusFile);
390
+ plusFilesOrdered.push(plusFile);
521
391
  };
522
- // Main resolution logic
392
+ const visited = new WeakSet();
393
+ // ========================
394
+ // User-land config (first)
395
+ // ========================
523
396
  {
524
- const interfaceValueFiles = interfaceFilesDefiningConfig
525
- .filter((interfaceFile) => interfaceFile.isValueFile &&
397
+ const plusFilesValue = plusFilesForConfigName.filter((plusFile) => !plusFile.isConfigFile &&
526
398
  // We consider side-effect configs (e.g. `export { frontmatter }` of .mdx files) later (i.e. with less priority)
527
- interfaceFile.configName === configName)
528
- .sort(makeOrderDeterministic);
529
- const interfaceConfigFiles = interfaceFilesDefiningConfig
530
- .filter((interfaceFile) => interfaceFile.isConfigFile &&
531
- // We consider value from extended configs (e.g. vike-react) later (i.e. with less priority)
532
- !interfaceFile.isConfigExtend)
533
- .sort(makeOrderDeterministic);
534
- const interfaceValueFile = interfaceValueFiles[0];
535
- const interfaceConfigFile = interfaceConfigFiles[0];
399
+ plusFile.configName === configName);
400
+ const plusFilesConfig = plusFilesForConfigName.filter((plusFile) => plusFile.isConfigFile &&
401
+ // We consider extensions (e.g. vike-react) later (i.e. with less priority)
402
+ !plusFile.isExtensionConfig);
536
403
  // Make this value:
537
404
  // /pages/some-page/+{configName}.js > `export default`
538
405
  // override that value:
539
406
  // /pages/some-page/+config.js > `export default { someConfig }`
540
- const interfaceFileWinner = interfaceValueFile ?? interfaceConfigFile;
541
- if (interfaceFileWinner) {
542
- const interfaceFilesOverriden = [...interfaceValueFiles, ...interfaceConfigFiles].filter((f) => f !== interfaceFileWinner);
543
- // A user-land conflict of interfaceFiles with the same locationId means that the user has superfluously defined the config twice; the user should remove such redundancy making things unnecessarily ambiguous
544
- warnOverridenConfigValues(interfaceFileWinner, interfaceFilesOverriden, configName);
545
- [interfaceFileWinner, ...interfaceFilesOverriden].forEach((interfaceFile) => {
546
- add(interfaceFile);
407
+ const plusFileWinner = plusFilesValue[0] ?? plusFilesConfig[0];
408
+ if (plusFileWinner) {
409
+ const plusFilesOverriden = [...plusFilesValue, ...plusFilesConfig].filter((f) => f !== plusFileWinner);
410
+ // A user-land conflict of plusFiles with the same `locationId` (we are iterating over `plusFilesRelevant: PlusFilesByLocationId`) means that the user has superfluously defined the config twice; the user should remove such redundancy as it makes things unnecessarily ambiguous.
411
+ assertOverwrittenConfigFile(plusFileWinner, plusFilesOverriden, configName);
412
+ [plusFileWinner, ...plusFilesOverriden].forEach((plusFile) => {
413
+ assert(plusFile.filePath.filePathAbsoluteUserRootDir); // ensure it's a user-land plus file
414
+ populate(plusFile);
547
415
  });
548
416
  }
549
417
  }
550
- // Side-effect configs such as `export { frontmatter }` in .mdx files
551
- interfaceFilesDefiningConfig
552
- .filter((interfaceFile) => interfaceFile.isValueFile &&
418
+ // ==========================
419
+ // Side-effect configs (next)
420
+ // ==========================
421
+ // - For example `export { frontmatter }` of `.mdx` files.
422
+ // - This only considers side-effect configs that are already loaded at build-time. (E.g. it actually doesn't consider `export { frontmatter }` of .mdx files since .mdx files are loaded only at runtime.)
423
+ plusFilesForConfigName
424
+ .filter((plusFile) => !plusFile.isConfigFile &&
553
425
  // Is side-effect config
554
- interfaceFile.configName !== configName)
555
- .forEach((interfaceValueFileSideEffect) => {
556
- add(interfaceValueFileSideEffect);
426
+ plusFile.configName !== configName)
427
+ .forEach((plusFile) => {
428
+ assert(plusFile.filePath.filePathAbsoluteUserRootDir); // ensure it's a user-land plus file
429
+ populate(plusFile);
557
430
  });
558
- // extends
559
- interfaceFilesDefiningConfig
560
- .filter((interfaceFile) => interfaceFile.isConfigFile && interfaceFile.isConfigExtend)
561
- // extended config files are already sorted by inheritance order
562
- .forEach((interfaceFile) => {
563
- add(interfaceFile);
431
+ // ========================
432
+ // Extensions config (last)
433
+ // ========================
434
+ plusFilesForConfigName
435
+ .filter((plusFile) => plusFile.isConfigFile && plusFile.isExtensionConfig)
436
+ // Extension config files are already sorted by inheritance order
437
+ .forEach((plusFile) => {
438
+ assert(!plusFile.filePath.filePathAbsoluteUserRootDir); // ensure it isn't a user-land plus file
439
+ populate(plusFile);
564
440
  });
565
- interfaceFilesDefiningConfig.forEach((interfaceFile) => {
566
- assert(visited.has(interfaceFile));
441
+ // ======
442
+ // Assert we didn't miss any config.
443
+ // ======
444
+ plusFilesForConfigName.forEach((plusFile) => {
445
+ assert(visited.has(plusFile));
567
446
  });
568
447
  }
569
- const sources = await Promise.all(sourcesInfo.map(async (args) => await getConfigValueSource(...args)));
570
- return sources;
571
- }
572
- function makeOrderDeterministic(interfaceFile1, interfaceFile2) {
573
- return lowerFirst((interfaceFile) => {
574
- const { filePathAbsoluteUserRootDir } = interfaceFile.filePath;
575
- assert(isInterfaceFileUserLand(interfaceFile));
576
- assert(filePathAbsoluteUserRootDir);
577
- return filePathAbsoluteUserRootDir.length;
578
- })(interfaceFile1, interfaceFile2);
579
- }
580
- function warnOverridenConfigValues(interfaceFileWinner, interfaceFilesOverriden, configName) {
581
- interfaceFilesOverriden.forEach((interfaceFileLoser) => {
582
- const loserFilePath = interfaceFileLoser.filePath.filePathToShowToUser;
583
- const winnerFilePath = interfaceFileWinner.filePath.filePathToShowToUser;
584
- const confName = pc.cyan(configName);
585
- assertWarning(false, `The value of the config ${confName} defined at ${loserFilePath} is always overwritten by the value defined at ${winnerFilePath}, remove the superfluous value defined at ${loserFilePath}`, { onlyOnce: true });
586
- });
587
- }
588
- function isInterfaceFileUserLand(interfaceFile) {
589
- return (interfaceFile.isConfigFile && !interfaceFile.isConfigExtend) || interfaceFile.isValueFile;
590
- }
591
- async function getConfigValueSource(configName, interfaceFile, configDef, userRootDir, importedFilesLoaded, isHighestInheritancePrecedence) {
592
- const conf = interfaceFile.fileExportsByConfigName[configName];
593
- assert(conf);
594
- const { locationId } = interfaceFile;
448
+ return plusFilesOrdered;
449
+ }
450
+ function getConfigValueSource(configName, plusFile, configDef, userRootDir, isHighestInheritancePrecedence) {
451
+ const confVal = getConfVal(plusFile, configName);
452
+ assert(confVal);
453
+ const configValueSourceCommon = {
454
+ locationId: plusFile.locationId,
455
+ plusFile
456
+ };
595
457
  const definedAtFilePath_ = {
596
- ...interfaceFile.filePath,
458
+ ...plusFile.filePath,
597
459
  fileExportPathToShowToUser: ['default', configName]
598
460
  };
599
461
  const isOverriden = configDef.cumulative ? false : !isHighestInheritancePrecedence;
@@ -601,25 +463,27 @@ async function getConfigValueSource(configName, interfaceFile, configDef, userRo
601
463
  if (configDef._valueIsFilePath) {
602
464
  let definedAtFilePath;
603
465
  let valueFilePath;
604
- if (interfaceFile.isConfigFile) {
466
+ if (plusFile.isConfigFile) {
605
467
  // Defined over pointer import
606
- const resolved = resolvePointerImportOfConfig(conf.configValue, interfaceFile.filePath, userRootDir, configDef.env, configName);
468
+ assert(confVal.configValueLoaded);
469
+ const pointerImport = resolvePointerImport(confVal.configValue, plusFile.filePath, userRootDir, configName);
607
470
  const configDefinedAt = getConfigDefinedAt('Config', configName, definedAtFilePath_);
608
- assertUsage(resolved, `${configDefinedAt} should be an import`);
609
- valueFilePath = resolved.pointerImport.filePathAbsoluteVite;
610
- definedAtFilePath = resolved.pointerImport;
471
+ assertUsage(pointerImport, `${configDefinedAt} should be an import`);
472
+ valueFilePath = pointerImport.fileExportPath.filePathAbsoluteVite;
473
+ definedAtFilePath = pointerImport.fileExportPath;
611
474
  }
612
475
  else {
613
476
  // Defined by value file, i.e. +{configName}.js
614
- assert(interfaceFile.isValueFile);
615
- valueFilePath = interfaceFile.filePath.filePathAbsoluteVite;
477
+ assert(!plusFile.isConfigFile);
478
+ valueFilePath = plusFile.filePath.filePathAbsoluteVite;
616
479
  definedAtFilePath = {
617
- ...interfaceFile.filePath,
480
+ ...plusFile.filePath,
618
481
  fileExportPathToShowToUser: []
619
482
  };
620
483
  }
621
484
  const configValueSource = {
622
- locationId,
485
+ ...configValueSourceCommon,
486
+ valueIsLoaded: true,
623
487
  value: valueFilePath,
624
488
  valueIsFilePath: true,
625
489
  configEnv: configDef.env,
@@ -631,38 +495,35 @@ async function getConfigValueSource(configName, interfaceFile, configDef, userRo
631
495
  return configValueSource;
632
496
  }
633
497
  // +config.js
634
- if (interfaceFile.isConfigFile) {
635
- assert('configValue' in conf);
636
- const { configValue } = conf;
498
+ if (plusFile.isConfigFile) {
499
+ assert(confVal.configValueLoaded);
500
+ const { configValue } = confVal;
637
501
  // Defined over pointer import
638
- const resolved = resolvePointerImportOfConfig(configValue, interfaceFile.filePath, userRootDir, configDef.env, configName);
639
- if (resolved) {
502
+ const pointerImport = plusFile.pointerImportsByConfigName[configName];
503
+ if (pointerImport) {
504
+ const value = pointerImport.fileExportValueLoaded
505
+ ? {
506
+ valueIsLoaded: true,
507
+ value: pointerImport.fileExportValue
508
+ }
509
+ : {
510
+ valueIsLoaded: false
511
+ };
640
512
  const configValueSource = {
641
- locationId,
642
- configEnv: resolved.configEnvResolved,
513
+ ...configValueSourceCommon,
514
+ ...value,
515
+ configEnv: resolveConfigEnv(configDef.env, pointerImport.fileExportPath),
643
516
  valueIsImportedAtRuntime: true,
644
517
  valueIsDefinedByPlusFile: false,
645
518
  isOverriden,
646
- definedAtFilePath: resolved.pointerImport
519
+ definedAtFilePath: pointerImport.fileExportPath
647
520
  };
648
- // Load pointer import
649
- if (isLoadableAtBuildTime(configDef) &&
650
- // The value of `extends` was already loaded and already used: we don't need the value of `extends` anymore
651
- configName !== 'extends') {
652
- if (resolved.pointerImport.filePathAbsoluteFilesystem) {
653
- const fileExport = await loadImportedFile(resolved.pointerImport, userRootDir, importedFilesLoaded);
654
- configValueSource.value = fileExport;
655
- }
656
- else {
657
- const configDefinedAt = getConfigDefinedAt('Config', configName, configValueSource.definedAtFilePath);
658
- assertUsage(!configDef.cumulative, `${configDefinedAt} cannot be defined over an aliased import`);
659
- }
660
- }
661
521
  return configValueSource;
662
522
  }
663
523
  // Defined inside +config.js
664
524
  const configValueSource = {
665
- locationId,
525
+ ...configValueSourceCommon,
526
+ valueIsLoaded: true,
666
527
  value: configValue,
667
528
  configEnv: configDef.env,
668
529
  valueIsImportedAtRuntime: false,
@@ -673,34 +534,48 @@ async function getConfigValueSource(configName, interfaceFile, configDef, userRo
673
534
  return configValueSource;
674
535
  }
675
536
  // Defined by value file, i.e. +{configName}.js
676
- if (interfaceFile.isValueFile) {
677
- const configEnvResolved = resolveConfigEnvWithFileName(configDef.env, interfaceFile.filePath);
678
- const valueAlreadyLoaded = 'configValue' in conf;
537
+ if (!plusFile.isConfigFile) {
538
+ const configEnvResolved = resolveConfigEnv(configDef.env, plusFile.filePath);
539
+ const valueAlreadyLoaded = confVal.configValueLoaded;
679
540
  assert(valueAlreadyLoaded === !!configEnvResolved.config);
541
+ const value = valueAlreadyLoaded
542
+ ? {
543
+ valueIsLoaded: true,
544
+ value: confVal.configValue
545
+ }
546
+ : {
547
+ valueIsLoaded: false
548
+ };
680
549
  const configValueSource = {
681
- locationId,
550
+ ...configValueSourceCommon,
551
+ ...value,
682
552
  configEnv: configEnvResolved,
683
553
  valueIsImportedAtRuntime: !valueAlreadyLoaded,
684
554
  valueIsDefinedByPlusFile: true,
685
555
  isOverriden,
686
556
  definedAtFilePath: {
687
- ...interfaceFile.filePath,
688
- fileExportPathToShowToUser: configName === interfaceFile.configName
557
+ ...plusFile.filePath,
558
+ fileExportPathToShowToUser: configName === plusFile.configName
689
559
  ? []
690
560
  : // Side-effect config (e.g. `export { frontmatter }` of .md files)
691
561
  [configName]
692
562
  }
693
563
  };
694
- if (valueAlreadyLoaded) {
695
- configValueSource.value = conf.configValue;
696
- }
697
564
  return configValueSource;
698
565
  }
699
566
  assert(false);
700
567
  }
701
- function isDefiningPage(interfaceFiles) {
702
- for (const interfaceFile of interfaceFiles) {
703
- const configNames = Object.keys(interfaceFile.fileExportsByConfigName);
568
+ function assertOverwrittenConfigFile(plusFileWinner, plusFilesOverriden, configName) {
569
+ plusFilesOverriden.forEach((plusFileLoser) => {
570
+ const loserFilePath = plusFileLoser.filePath.filePathToShowToUser;
571
+ const winnerFilePath = plusFileWinner.filePath.filePathToShowToUser;
572
+ const confName = pc.cyan(configName);
573
+ assertWarning(false, `The value of the config ${confName} defined at ${loserFilePath} is always overwritten by the value defined at ${winnerFilePath}, remove the superfluous value defined at ${loserFilePath}`, { onlyOnce: true });
574
+ });
575
+ }
576
+ function isDefiningPage(plusFiles) {
577
+ for (const plusFile of plusFiles) {
578
+ const configNames = getDefiningConfigNames(plusFile);
704
579
  if (configNames.some((configName) => isDefiningPageConfig(configName))) {
705
580
  return true;
706
581
  }
@@ -710,37 +585,52 @@ function isDefiningPage(interfaceFiles) {
710
585
  function isDefiningPageConfig(configName) {
711
586
  return ['Page', 'route'].includes(configName);
712
587
  }
713
- function getConfigDefinitions(interfaceFilesRelevant) {
714
- const configDefinitionsMerged = { ...configDefinitionsBuiltIn };
715
- Object.entries(interfaceFilesRelevant)
588
+ function getDefiningConfigNames(plusFile) {
589
+ let configNames = [];
590
+ if (!plusFile.isConfigFile) {
591
+ configNames.push(plusFile.configName);
592
+ }
593
+ if (!plusFile.isNotLoaded) {
594
+ configNames.push(...Object.keys(plusFile.fileExportsByConfigName));
595
+ }
596
+ configNames = unique(configNames);
597
+ return configNames;
598
+ }
599
+ function getConfigDefinitions(plusFilesRelevant, filter) {
600
+ let configDefinitions = { ...configDefinitionsBuiltIn };
601
+ // Add user-land meta configs
602
+ Object.entries(plusFilesRelevant)
716
603
  .reverse()
717
- .forEach(([_locationId, interfaceFiles]) => {
718
- interfaceFiles.forEach((interfaceFile) => {
719
- const configMeta = interfaceFile.fileExportsByConfigName['meta'];
720
- if (!configMeta)
604
+ .forEach(([_locationId, plusFiles]) => {
605
+ plusFiles.forEach((plusFile) => {
606
+ const confVal = getConfVal(plusFile, 'meta');
607
+ if (!confVal)
721
608
  return;
722
- const meta = configMeta.configValue;
723
- assertMetaUsage(meta, `Config ${pc.cyan('meta')} defined at ${interfaceFile.filePath.filePathToShowToUser}`);
609
+ assert(confVal.configValueLoaded);
610
+ const meta = confVal.configValue;
611
+ assertMetaUsage(meta, `Config ${pc.cyan('meta')} defined at ${plusFile.filePath.filePathToShowToUser}`);
724
612
  // Set configDef._userEffectDefinedAtFilePath
725
613
  Object.entries(meta).forEach(([configName, configDef]) => {
726
614
  if (!configDef.effect)
727
615
  return;
728
- assert(interfaceFile.isConfigFile);
616
+ assert(plusFile.isConfigFile);
729
617
  configDef._userEffectDefinedAtFilePath = {
730
- ...interfaceFile.filePath,
618
+ ...plusFile.filePath,
731
619
  fileExportPathToShowToUser: ['default', 'meta', configName, 'effect']
732
620
  };
733
621
  });
734
- objectEntries(meta).forEach(([configName, configDefinition]) => {
622
+ objectEntries(meta).forEach(([configName, configDefinitionUserLand]) => {
735
623
  // User can override an existing config definition
736
- configDefinitionsMerged[configName] = {
737
- ...configDefinitionsMerged[configName],
738
- ...configDefinition
624
+ configDefinitions[configName] = {
625
+ ...configDefinitions[configName],
626
+ ...configDefinitionUserLand
739
627
  };
740
628
  });
741
629
  });
742
630
  });
743
- const configDefinitions = configDefinitionsMerged;
631
+ if (filter) {
632
+ configDefinitions = Object.fromEntries(Object.entries(configDefinitions).filter(([_configName, configDef]) => filter(configDef)));
633
+ }
744
634
  return configDefinitions;
745
635
  }
746
636
  function assertMetaUsage(metaVal, metaConfigDefinedAt) {
@@ -857,47 +747,35 @@ function getComputed(configValueSources, configDefinitions) {
857
747
  });
858
748
  return configValuesComputed;
859
749
  }
860
- async function findPlusFiles(userRootDir, outDirRoot) {
861
- const files = await crawlPlusFiles(userRootDir, outDirRoot);
862
- const plusFiles = files.map(({ filePathAbsoluteUserRootDir }) => getFilePathResolved({ filePathAbsoluteUserRootDir, userRootDir }));
863
- return plusFiles;
864
- }
865
- function getConfigName(filePath) {
866
- assertPosixPath(filePath);
867
- if (isTemporaryBuildFile(filePath))
868
- return null;
869
- const fileName = path.posix.basename(filePath);
870
- // assertNoUnexpectedPlusSign(filePath, fileName)
871
- const basename = fileName.split('.')[0];
872
- if (!basename.startsWith('+')) {
873
- return null;
874
- }
875
- else {
876
- const configName = basename.slice(1);
877
- assertUsage(configName !== '', `${filePath} Invalid filename ${fileName}`);
878
- return configName;
879
- }
880
- }
881
- /* https://github.com/vikejs/vike/issues/1407
882
- function assertNoUnexpectedPlusSign(filePath: string, fileName: string) {
883
- const dirs = path.posix.dirname(filePath).split('/')
884
- dirs.forEach((dir, i) => {
885
- const dirPath = dirs.slice(0, i + 1).join('/')
886
- assertUsage(
887
- !dir.includes('+'),
888
- `Character '+' is a reserved character: remove '+' from the directory name ${dirPath}/`
889
- )
890
- })
891
- assertUsage(
892
- !fileName.slice(1).includes('+'),
893
- `Character '+' is only allowed at the beginning of filenames: make sure ${filePath} doesn't contain any '+' in its filename other than its first letter`
894
- )
750
+ // Show error message upon unknown config
751
+ function assertKnownConfigs(plusFilesAll) {
752
+ const configDefinitionsAll = getConfigDefinitions(plusFilesAll);
753
+ const configNamesKnownAll = Object.keys(configDefinitionsAll);
754
+ objectEntries(plusFilesAll).forEach(([locationId, plusFiles]) => {
755
+ const plusFilesRelevant = getPlusFilesRelevant(plusFilesAll, locationId);
756
+ const configDefinitionsLocal = getConfigDefinitions(plusFilesRelevant);
757
+ const configNamesKnownLocal = Object.keys(configDefinitionsLocal);
758
+ plusFiles.forEach((plusFile) => {
759
+ const configNames = getDefiningConfigNames(plusFile);
760
+ configNames.forEach((configName) => {
761
+ assertKnownConfig(configName, configNamesKnownAll, configNamesKnownLocal, plusFile);
762
+ assert(configNamesKnownLocal.includes(configName));
763
+ assert(configNamesKnownAll.includes(configName));
764
+ });
765
+ });
766
+ });
895
767
  }
896
- */
897
- function handleUnknownConfig(configName, configNames, filePathToShowToUser) {
768
+ function assertKnownConfig(configName, configNamesKnownAll, configNamesKnownLocal, plusFile) {
769
+ if (configNamesKnownLocal.includes(configName))
770
+ return;
898
771
  const configNameColored = pc.cyan(configName);
899
- let errMsg = `${filePathToShowToUser} sets an unknown config ${configNameColored}.`;
900
- // vike-{react,vue,solid} hint
772
+ const { locationId, filePath: { filePathToShowToUser } } = plusFile;
773
+ const errMsg = `${filePathToShowToUser} sets an unknown config ${configNameColored}`;
774
+ // Inheritance issue: config is known but isn't defined at `locationId`
775
+ if (configNamesKnownAll.includes(configName)) {
776
+ assertUsage(false, `${filePathToShowToUser} sets the value of the config ${configNameColored} which is a custom config that is defined with ${pc.underline('https://vike.dev/meta')} at a path that doesn't apply to ${locationId} — see ${pc.underline('https://vike.dev/config#inheritance')}`);
777
+ }
778
+ // Missing vike-{react,vue,solid} installation
901
779
  {
902
780
  const ui = ['vike-react', 'vike-vue', 'vike-solid'];
903
781
  const knownVikeExntensionConfigs = {
@@ -912,15 +790,11 @@ function handleUnknownConfig(configName, configNames, filePathToShowToUser) {
912
790
  Wrapper: ui
913
791
  };
914
792
  if (configName in knownVikeExntensionConfigs) {
915
- const requiredVikeExtension = knownVikeExntensionConfigs[configName];
916
- assertUsage(false, [
917
- errMsg,
918
- `If you want to use the configuration documented at https://vike.dev/${configName} then make sure to install the Vike extension ${requiredVikeExtension
919
- .map((e) => pc.bold(e))
920
- .join('/')}.`,
921
- `Also make sure it applies to ${filePathToShowToUser} (see https://vike.dev/extends#inheritance).`,
922
- `Alternatively, if you don't want to use the aforementioned Vike extension, define it yourself by using ${pc.cyan('meta')} (https://vike.dev/meta).`
923
- ].join(' '));
793
+ const requiredVikeExtension = knownVikeExntensionConfigs[configName]
794
+ .map((e) => pc.bold(e))
795
+ .join('/');
796
+ const errMsgEnhanced = `${errMsg}. If you want to use the configuration ${configNameColored} documented at ${pc.underline(`https://vike.dev/${configName}`)} then make sure to install ${requiredVikeExtension}. (Alternatively, you can define ${configNameColored} yourself by using ${pc.cyan('meta')}, see ${pc.underline('https://vike.dev/meta')} for more information.)`;
797
+ assertUsage(false, errMsgEnhanced);
924
798
  }
925
799
  }
926
800
  // Similarity hint
@@ -929,18 +803,15 @@ function handleUnknownConfig(configName, configNames, filePathToShowToUser) {
929
803
  configNameSimilar = 'Page';
930
804
  }
931
805
  else {
932
- configNameSimilar = getMostSimilar(configName, configNames);
806
+ configNameSimilar = getMostSimilar(configName, configNamesKnownAll);
933
807
  }
934
808
  if (configNameSimilar) {
935
809
  assert(configNameSimilar !== configName);
936
- errMsg += ` Did you mean to set ${pc.cyan(configNameSimilar)} instead?`;
810
+ let errMsgEnhanced = `${errMsg}. Did you mean ${pc.cyan(configNameSimilar)} instead?`;
937
811
  if (configName === 'page') {
938
- errMsg += ` (The name of the config ${pc.cyan('Page')} starts with a capital letter ${pc.cyan('P')} because it defines a UI component: a ubiquitous JavaScript convention is that the name of UI components start with a capital letter.)`;
812
+ errMsgEnhanced += ` (The name of the config ${pc.cyan('Page')} starts with a capital letter ${pc.cyan('P')} because it defines a UI component: a ubiquitous JavaScript convention is that the name of UI components start with a capital letter.)`;
939
813
  }
940
- }
941
- // `meta` hint
942
- if (!configNameSimilar) {
943
- errMsg += ` Make sure to define ${configNameColored} by using ${pc.cyan('meta')} (https://vike.dev/meta), and also make sure the meta configuration applies to ${filePathToShowToUser} (see https://vike.dev/config#inheritance).`;
814
+ assertUsage(false, errMsgEnhanced);
944
815
  }
945
816
  assertUsage(false, errMsg);
946
817
  }
@@ -988,9 +859,6 @@ function determineIsErrorPage(routeFilesystem) {
988
859
  assertPosixPath(routeFilesystem);
989
860
  return routeFilesystem.split('/').includes('_error');
990
861
  }
991
- function isVikeConfigFile(filePath) {
992
- return !!getConfigName(filePath);
993
- }
994
862
  function getConfigEnvValue(val, errMsgIntro) {
995
863
  const errInvalidValue = `${errMsgIntro} an invalid value ${pc.cyan(JSON.stringify(val))}`;
996
864
  // Legacy outdated values
@@ -1027,89 +895,34 @@ function getConfigEnvValue(val, errMsgIntro) {
1027
895
  */
1028
896
  return val;
1029
897
  }
1030
- function getConfigDefinition(configDefinitions, configName, filePathToShowToUser) {
1031
- const configDef = configDefinitions[configName];
1032
- assertConfigExists(configName, Object.keys(configDefinitions), filePathToShowToUser);
1033
- assert(configDef);
1034
- return configDef;
1035
- }
1036
898
  function getConfigDefinitionOptional(configDefinitions, configName) {
1037
899
  return configDefinitions[configName] ?? null;
1038
900
  }
1039
- function isLoadableAtBuildTime(configDef) {
1040
- return !!configDef.env.config && !configDef._valueIsFilePath;
1041
- }
1042
- function isGlobalConfig(configName) {
1043
- // TODO/now
1044
- if (configName === 'prerender')
1045
- return false;
1046
- const configNamesGlobal = getConfigNamesGlobal();
1047
- return includes(configNamesGlobal, configName);
1048
- }
1049
- function getConfigNamesGlobal() {
1050
- return Object.keys(configDefinitionsBuiltInGlobal);
1051
- }
1052
- function getConfigDefinitionsBuiltInGlobal() {
1053
- return objectFromEntries(objectEntries(configDefinitionsBuiltInAll).filter(([_configName, configDef]) => configDef.global !== undefined));
1054
- }
1055
- function getConfigDefinitionsBuiltIn() {
1056
- return objectFromEntries(objectEntries(configDefinitionsBuiltInAll).filter(([_configName, configDef]) => configDef.global !== true));
1057
- }
1058
- function assertConfigExists(configName, configNamesRelevant, filePathToShowToUser) {
1059
- const configNames = [...configNamesRelevant, ...getConfigNamesGlobal()];
1060
- if (configNames.includes(configName))
1061
- return;
1062
- handleUnknownConfig(configName, configNames, filePathToShowToUser);
1063
- assert(false);
1064
- }
1065
- function sortConfigValueSources(configValueSources, locationIdPage) {
1066
- return Object.fromEntries(Object.entries(configValueSources)
1067
- // Make order deterministic (no other purpose)
1068
- .sort(([, [source1]], [, [source2]]) => source1.definedAtFilePath.filePathAbsoluteVite < source2.definedAtFilePath.filePathAbsoluteVite ? -1 : 1)
1069
- // Sort after whether the config value was defined by an npm package
1070
- .sort(makeFirst(([, [source]]) => {
1071
- const { importPathAbsolute } = source.definedAtFilePath;
1072
- return (!!importPathAbsolute &&
1073
- isNpmPackageImport(importPathAbsolute, {
1074
- // Vike config files don't support path aliases. (If they do one day, then Vike will/should be able to resolve path aliases.)
1075
- cannotBePathAlias: true
1076
- }));
1077
- }))
1078
- // Sort after the filesystem inheritance of the config value
1079
- .sort(([, [source1]], [, [source2]]) => reverse(sortAfterInheritanceOrder(source1.locationId, source2.locationId, locationIdPage))));
1080
- }
1081
- function getConfigValueInterfaceFile(interfaceFile, configName) {
1082
- return interfaceFile.fileExportsByConfigName[configName]?.configValue;
1083
- }
1084
- // TODO/now: refactor code below
1085
- function resolveVikeConfigGlobal(vikeVitePluginOptions, pageConfigGlobalValues) {
1086
- const configs = [vikeVitePluginOptions, pageConfigGlobalValues];
1087
- const vikeConfigGlobal = {
1088
- disableAutoFullBuild: pickFirst(configs.map((c) => c.disableAutoFullBuild)) ?? null,
1089
- prerender: resolvePrerenderOptions(configs),
1090
- includeAssetsImportedByServer: pickFirst(configs.map((c) => c.includeAssetsImportedByServer)) ?? true,
1091
- baseServer: pickFirst(configs.map((c) => c.baseServer)) ?? null,
1092
- baseAssets: pickFirst(configs.map((c) => c.baseAssets)) ?? null,
1093
- disableUrlNormalization: pickFirst(configs.map((c) => c.disableUrlNormalization)) ?? false,
1094
- trailingSlash: pickFirst(configs.map((c) => c.trailingSlash)) ?? false
1095
- };
1096
- return vikeConfigGlobal;
1097
- }
1098
- function resolvePrerenderOptions(configs) {
1099
- if (!configs.some((c) => c.prerender)) {
1100
- return false;
901
+ function getConfVal(plusFile, configName) {
902
+ const configNames = getDefiningConfigNames(plusFile);
903
+ if (!configNames.includes(configName))
904
+ return null;
905
+ if (plusFile.isNotLoaded)
906
+ return { configValueLoaded: false };
907
+ const confVal = { configValue: plusFile.fileExportsByConfigName[configName], configValueLoaded: true };
908
+ return confVal;
909
+ }
910
+ function resolveConfigEnv(configEnv, filePath) {
911
+ const configEnvResolved = { ...configEnv };
912
+ if (filePath.filePathAbsoluteFilesystem) {
913
+ const { fileName } = filePath;
914
+ if (fileName.includes('.server.')) {
915
+ configEnvResolved.server = true;
916
+ configEnvResolved.client = false;
917
+ }
918
+ else if (fileName.includes('.client.')) {
919
+ configEnvResolved.client = true;
920
+ configEnvResolved.server = false;
921
+ }
922
+ else if (fileName.includes('.shared.')) {
923
+ configEnvResolved.server = true;
924
+ configEnvResolved.client = true;
925
+ }
1101
926
  }
1102
- const configsPrerender = configs.map((c) => c.prerender).filter(isObject2);
1103
- return {
1104
- partial: pickFirst(configsPrerender.map((c) => c.partial)) ?? false,
1105
- noExtraDir: pickFirst(configsPrerender.map((c) => c.noExtraDir)) ?? false,
1106
- parallel: pickFirst(configsPrerender.map((c) => c.parallel)) ?? true,
1107
- disableAutoRun: pickFirst(configsPrerender.map((c) => c.disableAutoRun)) ?? false
1108
- };
1109
- }
1110
- function isObject2(p) {
1111
- return typeof p === 'object';
1112
- }
1113
- function pickFirst(arr) {
1114
- return arr.filter((v) => v !== undefined)[0];
927
+ return configEnvResolved;
1115
928
  }