vike 0.4.171 → 0.4.172-commit-ea2b76c

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 (201) hide show
  1. package/dist/cjs/node/plugin/plugins/buildConfig.js +3 -4
  2. package/dist/cjs/node/plugin/plugins/devConfig/determineOptimizeDeps.js +18 -15
  3. package/dist/cjs/node/plugin/plugins/devConfig/index.js +2 -1
  4. package/dist/cjs/node/plugin/plugins/envVars.js +2 -1
  5. package/dist/cjs/node/plugin/plugins/extractAssetsPlugin.js +1 -1
  6. package/dist/cjs/node/plugin/plugins/importUserCode/{generateEagerImport.js → addImportStatement.js} +8 -10
  7. package/dist/cjs/node/plugin/plugins/importUserCode/getVirtualFileImportUserCode.js +0 -1
  8. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/configDefinitionsBuiltIn.js +3 -3
  9. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/crawlPlusFiles.js +17 -6
  10. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/loadFileAtConfigTime.js +2 -2
  11. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig.js +31 -75
  12. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVirtualFilePageConfigValuesAll.js +4 -43
  13. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVirtualFilePageConfigs.js +9 -50
  14. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/isRuntimeEnvMatch.js +6 -0
  15. package/dist/cjs/node/plugin/shared/addSsrMiddleware.js +17 -2
  16. package/dist/cjs/node/prerender/runPrerender.js +35 -15
  17. package/dist/cjs/node/prerender/utils.js +1 -0
  18. package/dist/cjs/node/runtime/html/injectAssets/getHtmlTags.js +3 -3
  19. package/dist/cjs/node/runtime/html/injectAssets/getViteDevScripts.js +2 -1
  20. package/dist/cjs/node/runtime/html/injectAssets/mergeScriptTags.js +2 -8
  21. package/dist/cjs/node/runtime/html/renderHtml.js +19 -20
  22. package/dist/cjs/node/runtime/html/stream.js +9 -9
  23. package/dist/cjs/node/runtime/renderPage/analyzePage.js +9 -7
  24. package/dist/cjs/node/runtime/renderPage/createHttpResponseObject/getCacheControl.js +1 -1
  25. package/dist/cjs/node/runtime/renderPage/executeOnBeforeRenderAndDataHooks.js +2 -2
  26. package/dist/cjs/node/runtime/renderPage/executeOnRenderHtmlHook.js +8 -8
  27. package/dist/cjs/node/runtime/renderPage/getHttpResponseBody.js +2 -2
  28. package/dist/cjs/node/runtime/renderPage/loadUserFilesServerSide.js +4 -5
  29. package/dist/cjs/node/runtime/renderPage/logErrorHint.js +91 -282
  30. package/dist/cjs/node/runtime/renderPage/preparePageContextForUserConsumptionServerSide.js +2 -2
  31. package/dist/cjs/node/runtime/renderPage/renderPageAlreadyRouted.js +30 -10
  32. package/dist/cjs/node/runtime/renderPage.js +24 -17
  33. package/dist/cjs/node/runtime/utils.js +2 -0
  34. package/dist/cjs/node/shared/assertV1Design.js +3 -4
  35. package/dist/cjs/shared/getPageContext.js +5 -0
  36. package/dist/cjs/shared/{addUrlComputedProps.js → getPageContextUrlComputed.js} +52 -42
  37. package/dist/cjs/shared/getPageFiles/analyzeClientSide.js +2 -2
  38. package/dist/cjs/shared/getPageFiles/getExports.js +49 -1
  39. package/dist/cjs/shared/getPageFiles/parseGlobResults.js +15 -8
  40. package/dist/cjs/shared/hooks/executeHook.js +22 -3
  41. package/dist/cjs/shared/hooks/getHook.js +2 -2
  42. package/dist/cjs/shared/page-configs/getConfigValue.js +14 -17
  43. package/dist/cjs/shared/page-configs/getConfigValueBuildTime.js +70 -0
  44. package/dist/cjs/shared/page-configs/loadConfigValues.js +3 -12
  45. package/dist/cjs/shared/page-configs/serialize/assertPageConfigsSerialized.js +0 -18
  46. package/dist/cjs/shared/page-configs/serialize/parsePageConfigs.js +110 -16
  47. package/dist/cjs/shared/page-configs/serialize/serializeConfigValues.js +198 -0
  48. package/dist/cjs/shared/route/executeGuardHook.js +1 -1
  49. package/dist/cjs/shared/route/executeOnBeforeRouteHook.js +1 -1
  50. package/dist/cjs/shared/route/index.js +2 -2
  51. package/dist/cjs/shared/route/loadPageRoutes.js +2 -2
  52. package/dist/cjs/shared/route/resolveRouteFunction.js +2 -2
  53. package/dist/cjs/shared/sortPageContext.js +4 -8
  54. package/dist/cjs/shared/utils.js +2 -0
  55. package/dist/cjs/utils/assert.js +1 -1
  56. package/dist/cjs/utils/assertNodeVersion.js +1 -1
  57. package/dist/cjs/utils/changeEnumerable.js +9 -0
  58. package/dist/cjs/utils/escapeHtml.js +14 -0
  59. package/dist/cjs/utils/getPropAccessNotation.js +1 -4
  60. package/dist/cjs/utils/hasProp.js +5 -7
  61. package/dist/cjs/utils/normalizeHeaders.js +13 -0
  62. package/dist/cjs/utils/objectAssign.js +1 -1
  63. package/dist/cjs/utils/objectDefineProperty.js +8 -0
  64. package/dist/cjs/utils/objectKeys.js +8 -4
  65. package/dist/cjs/utils/projectInfo.js +1 -1
  66. package/dist/esm/client/client-routing-runtime/createPageContext.d.ts +6 -4
  67. package/dist/esm/client/client-routing-runtime/createPageContext.js +4 -3
  68. package/dist/esm/client/client-routing-runtime/getPageContextFromHooks.js +16 -12
  69. package/dist/esm/client/client-routing-runtime/installClientRouter.js +18 -10
  70. package/dist/esm/client/client-routing-runtime/renderPageClientSide.js +3 -3
  71. package/dist/esm/client/server-routing-runtime/getPageContext.d.ts +4 -4
  72. package/dist/esm/client/server-routing-runtime/utils.d.ts +1 -0
  73. package/dist/esm/client/server-routing-runtime/utils.js +1 -0
  74. package/dist/esm/client/shared/executeOnRenderClientHook.js +1 -1
  75. package/dist/esm/client/shared/getPageContextProxyForUser.d.ts +3 -2
  76. package/dist/esm/client/shared/getPageContextProxyForUser.js +35 -48
  77. package/dist/esm/client/shared/loadUserFilesClientSide.js +4 -4
  78. package/dist/esm/node/plugin/plugins/buildConfig.js +3 -4
  79. package/dist/esm/node/plugin/plugins/devConfig/determineOptimizeDeps.js +18 -15
  80. package/dist/esm/node/plugin/plugins/devConfig/index.js +2 -1
  81. package/dist/esm/node/plugin/plugins/envVars.js +2 -1
  82. package/dist/esm/node/plugin/plugins/extractAssetsPlugin.js +1 -1
  83. package/dist/esm/node/plugin/plugins/importUserCode/addImportStatement.d.ts +14 -0
  84. package/dist/esm/node/plugin/plugins/importUserCode/{generateEagerImport.js → addImportStatement.js} +7 -9
  85. package/dist/esm/node/plugin/plugins/importUserCode/getVirtualFileImportUserCode.js +0 -1
  86. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/configDefinitionsBuiltIn.d.ts +2 -1
  87. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/configDefinitionsBuiltIn.js +3 -3
  88. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/crawlPlusFiles.js +18 -7
  89. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/loadFileAtConfigTime.js +2 -2
  90. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig.js +31 -75
  91. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVirtualFilePageConfigValuesAll.js +4 -43
  92. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVirtualFilePageConfigs.js +9 -50
  93. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/isRuntimeEnvMatch.d.ts +1 -0
  94. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/isRuntimeEnvMatch.js +6 -0
  95. package/dist/esm/node/plugin/shared/addSsrMiddleware.js +14 -2
  96. package/dist/esm/node/prerender/runPrerender.js +37 -17
  97. package/dist/esm/node/prerender/utils.d.ts +1 -0
  98. package/dist/esm/node/prerender/utils.js +1 -0
  99. package/dist/esm/node/runtime/html/injectAssets/getHtmlTags.js +3 -3
  100. package/dist/esm/node/runtime/html/injectAssets/getViteDevScripts.js +3 -2
  101. package/dist/esm/node/runtime/html/injectAssets/mergeScriptTags.d.ts +1 -1
  102. package/dist/esm/node/runtime/html/injectAssets/mergeScriptTags.js +2 -8
  103. package/dist/esm/node/runtime/html/renderHtml.js +19 -20
  104. package/dist/esm/node/runtime/html/stream.d.ts +1 -1
  105. package/dist/esm/node/runtime/html/stream.js +9 -9
  106. package/dist/esm/node/runtime/renderPage/analyzePage.js +9 -7
  107. package/dist/esm/node/runtime/renderPage/createHttpResponseObject/getCacheControl.js +2 -2
  108. package/dist/esm/node/runtime/renderPage/executeOnBeforeRenderAndDataHooks.js +2 -2
  109. package/dist/esm/node/runtime/renderPage/executeOnRenderHtmlHook.js +8 -8
  110. package/dist/esm/node/runtime/renderPage/getHttpResponseBody.js +2 -2
  111. package/dist/esm/node/runtime/renderPage/loadUserFilesServerSide.d.ts +1 -6
  112. package/dist/esm/node/runtime/renderPage/loadUserFilesServerSide.js +4 -5
  113. package/dist/esm/node/runtime/renderPage/logErrorHint.d.ts +2 -6
  114. package/dist/esm/node/runtime/renderPage/logErrorHint.js +92 -283
  115. package/dist/esm/node/runtime/renderPage/preparePageContextForUserConsumptionServerSide.d.ts +2 -2
  116. package/dist/esm/node/runtime/renderPage/preparePageContextForUserConsumptionServerSide.js +2 -2
  117. package/dist/esm/node/runtime/renderPage/renderPageAlreadyRouted.d.ts +65 -39
  118. package/dist/esm/node/runtime/renderPage/renderPageAlreadyRouted.js +31 -11
  119. package/dist/esm/node/runtime/renderPage.js +24 -17
  120. package/dist/esm/node/runtime/utils.d.ts +2 -0
  121. package/dist/esm/node/runtime/utils.js +2 -0
  122. package/dist/esm/node/shared/assertV1Design.d.ts +2 -2
  123. package/dist/esm/node/shared/assertV1Design.js +3 -4
  124. package/dist/esm/shared/VikeNamespace.d.ts +9 -0
  125. package/dist/esm/shared/getPageContext.d.ts +1 -0
  126. package/dist/esm/shared/getPageContext.js +1 -0
  127. package/dist/esm/shared/{addUrlComputedProps.d.ts → getPageContextUrlComputed.d.ts} +23 -21
  128. package/dist/esm/shared/{addUrlComputedProps.js → getPageContextUrlComputed.js} +52 -42
  129. package/dist/esm/shared/getPageFiles/analyzeClientSide.js +3 -3
  130. package/dist/esm/shared/getPageFiles/getExports.d.ts +36 -0
  131. package/dist/esm/shared/getPageFiles/getExports.js +50 -2
  132. package/dist/esm/shared/getPageFiles/parseGlobResults.js +14 -7
  133. package/dist/esm/shared/hooks/executeHook.d.ts +10 -1
  134. package/dist/esm/shared/hooks/executeHook.js +21 -2
  135. package/dist/esm/shared/hooks/getHook.d.ts +2 -2
  136. package/dist/esm/shared/hooks/getHook.js +3 -3
  137. package/dist/esm/shared/page-configs/Config/PageContextConfig.d.ts +2 -2
  138. package/dist/esm/shared/page-configs/PageConfig.d.ts +14 -8
  139. package/dist/esm/shared/page-configs/getConfigValue.d.ts +12 -12
  140. package/dist/esm/shared/page-configs/getConfigValue.js +13 -16
  141. package/dist/esm/shared/page-configs/getConfigValueBuildTime.d.ts +9 -0
  142. package/dist/esm/shared/page-configs/getConfigValueBuildTime.js +67 -0
  143. package/dist/esm/shared/page-configs/loadConfigValues.js +3 -12
  144. package/dist/esm/shared/page-configs/serialize/PageConfigSerialized.d.ts +17 -21
  145. package/dist/esm/shared/page-configs/serialize/assertPageConfigsSerialized.d.ts +1 -5
  146. package/dist/esm/shared/page-configs/serialize/assertPageConfigsSerialized.js +1 -16
  147. package/dist/esm/shared/page-configs/serialize/parsePageConfigs.d.ts +4 -1
  148. package/dist/esm/shared/page-configs/serialize/parsePageConfigs.js +109 -15
  149. package/dist/esm/shared/page-configs/serialize/serializeConfigValues.d.ts +5 -0
  150. package/dist/esm/shared/page-configs/serialize/serializeConfigValues.js +192 -0
  151. package/dist/esm/shared/route/executeGuardHook.js +1 -1
  152. package/dist/esm/shared/route/executeOnBeforeRouteHook.js +1 -1
  153. package/dist/esm/shared/route/index.d.ts +3 -3
  154. package/dist/esm/shared/route/index.js +2 -2
  155. package/dist/esm/shared/route/loadPageRoutes.js +3 -3
  156. package/dist/esm/shared/route/resolveRouteFunction.d.ts +2 -2
  157. package/dist/esm/shared/route/resolveRouteFunction.js +2 -2
  158. package/dist/esm/shared/sortPageContext.js +4 -8
  159. package/dist/esm/shared/types.d.ts +32 -6
  160. package/dist/esm/shared/utils.d.ts +2 -0
  161. package/dist/esm/shared/utils.js +2 -0
  162. package/dist/esm/types/index.d.ts +1 -1
  163. package/dist/esm/utils/assert.js +1 -1
  164. package/dist/esm/utils/assertNodeVersion.js +1 -1
  165. package/dist/esm/utils/changeEnumerable.d.ts +2 -0
  166. package/dist/esm/utils/changeEnumerable.js +5 -0
  167. package/dist/esm/utils/escapeHtml.d.ts +1 -0
  168. package/dist/esm/utils/escapeHtml.js +10 -0
  169. package/dist/esm/utils/getPropAccessNotation.d.ts +1 -2
  170. package/dist/esm/utils/getPropAccessNotation.js +2 -6
  171. package/dist/esm/utils/hasProp.d.ts +4 -13
  172. package/dist/esm/utils/hasProp.js +5 -7
  173. package/dist/esm/utils/normalizeHeaders.d.ts +1 -0
  174. package/dist/esm/utils/normalizeHeaders.js +9 -0
  175. package/dist/esm/utils/objectAssign.js +1 -1
  176. package/dist/esm/utils/objectDefineProperty.d.ts +4 -0
  177. package/dist/esm/utils/objectDefineProperty.js +4 -0
  178. package/dist/esm/utils/objectKeys.d.ts +1 -3
  179. package/dist/esm/utils/objectKeys.js +8 -4
  180. package/dist/esm/utils/projectInfo.d.ts +2 -2
  181. package/dist/esm/utils/projectInfo.js +1 -1
  182. package/package.json +21 -12
  183. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getConfigValuesSerialized.js +0 -76
  184. package/dist/cjs/node/plugin/shared/getConfigValueSourcesNotOverriden.js +0 -14
  185. package/dist/cjs/node/shared/getClientEntry.js +0 -12
  186. package/dist/cjs/shared/page-configs/serialize/parseConfigValuesImported.js +0 -85
  187. package/dist/cjs/shared/page-configs/serialize/parseConfigValuesSerialized.js +0 -24
  188. package/dist/cjs/shared/page-configs/serialize/serializeConfigValue.js +0 -50
  189. package/dist/esm/node/plugin/plugins/importUserCode/generateEagerImport.d.ts +0 -16
  190. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getConfigValuesSerialized.d.ts +0 -5
  191. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getConfigValuesSerialized.js +0 -70
  192. package/dist/esm/node/plugin/shared/getConfigValueSourcesNotOverriden.d.ts +0 -5
  193. package/dist/esm/node/plugin/shared/getConfigValueSourcesNotOverriden.js +0 -11
  194. package/dist/esm/node/shared/getClientEntry.d.ts +0 -3
  195. package/dist/esm/node/shared/getClientEntry.js +0 -9
  196. package/dist/esm/shared/page-configs/serialize/parseConfigValuesImported.d.ts +0 -4
  197. package/dist/esm/shared/page-configs/serialize/parseConfigValuesImported.js +0 -82
  198. package/dist/esm/shared/page-configs/serialize/parseConfigValuesSerialized.d.ts +0 -4
  199. package/dist/esm/shared/page-configs/serialize/parseConfigValuesSerialized.js +0 -21
  200. package/dist/esm/shared/page-configs/serialize/serializeConfigValue.d.ts +0 -8
  201. package/dist/esm/shared/page-configs/serialize/serializeConfigValue.js +0 -47
@@ -1,5 +1,5 @@
1
1
  export { crawlPlusFiles };
2
- import { assertPosixPath, assert, toPosixPath, assertWarning, scriptFileExtensionList, scriptFileExtensions, humanizeTime, assertIsSingleModuleInstance, assertIsNotProductionRuntime, isVersionOrAbove } from '../../../../utils.js';
2
+ import { assertPosixPath, assert, assertWarning, scriptFileExtensionList, scriptFileExtensions, humanizeTime, assertIsSingleModuleInstance, assertIsNotProductionRuntime, isVersionOrAbove } from '../../../../utils.js';
3
3
  import path from 'path';
4
4
  import glob from 'fast-glob';
5
5
  import { exec } from 'child_process';
@@ -26,6 +26,7 @@ async function crawlPlusFiles(userRootDir, outDirAbsoluteFilesystem, isDev) {
26
26
  //
27
27
  !outDirRelativeFromUserRootDir.startsWith('../')));
28
28
  const timeBefore = new Date().getTime();
29
+ // Crawl
29
30
  let files = [];
30
31
  const res = await gitLsFiles(userRootDir, outDirRelativeFromUserRootDir);
31
32
  if (res &&
@@ -36,7 +37,7 @@ async function crawlPlusFiles(userRootDir, outDirAbsoluteFilesystem, isDev) {
36
37
  else {
37
38
  files = await fastGlob(userRootDir, outDirRelativeFromUserRootDir);
38
39
  }
39
- files = files.filter((file) => !isTemporaryBuildFile(file));
40
+ // Check performance
40
41
  {
41
42
  const timeAfter = new Date().getTime();
42
43
  const timeSpent = timeAfter - timeBefore;
@@ -48,10 +49,13 @@ async function crawlPlusFiles(userRootDir, outDirAbsoluteFilesystem, isDev) {
48
49
  });
49
50
  }
50
51
  }
51
- const plusFiles = files.map((p) => {
52
- p = toPosixPath(p);
53
- assert(!p.startsWith(userRootDir));
54
- const filePathAbsoluteUserRootDir = path.posix.join('/', p);
52
+ // Normalize
53
+ const plusFiles = files.map((filePath) => {
54
+ // Both `$ git-ls files` and fast-glob return posix paths
55
+ assertPosixPath(filePath);
56
+ assert(!filePath.startsWith(userRootDir));
57
+ assert(!isTemporaryBuildFile(filePath));
58
+ const filePathAbsoluteUserRootDir = path.posix.join('/', filePath);
55
59
  return { filePathAbsoluteUserRootDir };
56
60
  });
57
61
  return plusFiles;
@@ -60,10 +64,17 @@ async function crawlPlusFiles(userRootDir, outDirAbsoluteFilesystem, isDev) {
60
64
  async function gitLsFiles(userRootDir, outDirRelativeFromUserRootDir) {
61
65
  if (gitIsNotUsable)
62
66
  return null;
67
+ // Preserve UTF-8 file paths.
68
+ // https://github.com/vikejs/vike/issues/1658
69
+ // https://stackoverflow.com/questions/22827239/how-to-make-git-properly-display-utf-8-encoded-pathnames-in-the-console-window/22828826#22828826
70
+ // https://stackoverflow.com/questions/15884180/how-do-i-override-git-configuration-options-by-command-line-parameters/15884261#15884261
71
+ const preserveUTF8 = '-c core.quotepath=off';
63
72
  const ignoreAsPatterns = getIgnoreAsPatterns(outDirRelativeFromUserRootDir);
64
73
  const ignoreAsFilterFn = getIgnoreAsFilterFn(outDirRelativeFromUserRootDir);
65
74
  const cmd = [
66
- 'git ls-files',
75
+ 'git',
76
+ preserveUTF8,
77
+ 'ls-files',
67
78
  ...scriptFileExtensionList.map((ext) => `"**/+*.${ext}"`),
68
79
  ...ignoreAsPatterns.map((pattern) => `--exclude="${pattern}"`),
69
80
  // --others lists untracked files only (but using .gitignore because --exclude-standard)
@@ -10,7 +10,7 @@ import { parsePointerImportData } from './transformFileImports.js';
10
10
  import { getConfigFileExport } from '../getConfigFileExport.js';
11
11
  import { resolvePointerImport } from './resolvePointerImport.js';
12
12
  assertIsNotProductionRuntime();
13
- // Load fake import
13
+ // Load pointer import
14
14
  async function loadImportedFile(import_, userRootDir, importedFilesLoaded) {
15
15
  const f = import_.filePathAbsoluteFilesystem;
16
16
  if (!importedFilesLoaded[f]) {
@@ -30,7 +30,7 @@ async function loadValueFile(interfaceValueFile, configName, userRootDir) {
30
30
  interfaceValueFile.fileExportsByConfigName[configName_] = { configValue };
31
31
  });
32
32
  }
33
- // Load +config.js, including all its extends fake imports
33
+ // Load +config.js, including all its extends pointer imports
34
34
  async function loadConfigFile(configFilePath, userRootDir, visited, isExtensionConfig) {
35
35
  const { filePathAbsoluteFilesystem } = configFilePath;
36
36
  assertNoInfiniteLoop(visited, filePathAbsoluteFilesystem);
@@ -14,12 +14,12 @@ import { logConfigError, logConfigErrorRecover } from '../../../shared/loggerNot
14
14
  import { removeSuperfluousViteLog_enable, removeSuperfluousViteLog_disable } from '../../../shared/loggerVite/removeSuperfluousViteLog.js';
15
15
  import pc from '@brillout/picocolors';
16
16
  import { getConfigDefinedAt } from '../../../../../shared/page-configs/getConfigDefinedAt.js';
17
- import { assertConfigValueIsSerializable } from './getConfigValuesSerialized.js';
18
17
  import { crawlPlusFiles } from './getVikeConfig/crawlPlusFiles.js';
19
18
  import { getConfigFileExport } from './getConfigFileExport.js';
20
19
  import { loadConfigFile, loadImportedFile, loadValueFile } from './getVikeConfig/loadFileAtConfigTime.js';
21
20
  import { clearFilesEnvMap, resolvePointerImportOfConfig } from './getVikeConfig/resolvePointerImport.js';
22
21
  import { getFilePathResolved } from '../../../shared/getFilePath.js';
22
+ import { getConfigValueBuildTime } from '../../../../../shared/page-configs/getConfigValueBuildTime.js';
23
23
  assertIsNotProductionRuntime();
24
24
  let devServerIsCorrupt = false;
25
25
  let wasConfigInvalid = null;
@@ -166,7 +166,7 @@ async function loadInterfaceFiles(userRootDir, outDirRoot, isDev) {
166
166
  // - If `configDef` is `undefined` => we load the file +{configName}.js later.
167
167
  // - We already need to load +meta.js here (to get the custom config definitions defined by the user)
168
168
  const configDef = getConfigDefinitionOptional(configDefinitionsBuiltIn, configName);
169
- if (configDef && isConfigEnv(configDef, configName)) {
169
+ if (configDef && isLoadableAtBuildTime(configDef)) {
170
170
  await loadValueFile(interfaceFile, configName, userRootDir);
171
171
  }
172
172
  }
@@ -241,6 +241,7 @@ async function loadVikeConfig_withErrorHandling(userRootDir, outDirRoot, isDev,
241
241
  const dummyData = {
242
242
  pageConfigs: [],
243
243
  pageConfigGlobal: {
244
+ configDefinitions: {},
244
245
  configValueSources: {}
245
246
  },
246
247
  globalVikeConfig: {}
@@ -266,7 +267,7 @@ async function loadVikeConfig(userRootDir, outDirRoot, isDev) {
266
267
  if (isGlobalConfig(configName))
267
268
  return;
268
269
  const configDef = getConfigDefinition(configDefinitions, configName, interfaceFile.filePath.filePathToShowToUser);
269
- if (!isConfigEnv(configDef, configName))
270
+ if (!isLoadableAtBuildTime(configDef))
270
271
  return;
271
272
  const isAlreadyLoaded = interfacefileIsAlreaydLoaded(interfaceFile);
272
273
  if (isAlreadyLoaded)
@@ -288,14 +289,13 @@ async function loadVikeConfig(userRootDir, outDirRoot, isDev) {
288
289
  const { routeFilesystem, isErrorPage } = determineRouteFilesystem(locationId, configValueSources);
289
290
  applyEffectsAll(configValueSources, configDefinitions);
290
291
  const configValuesComputed = getComputed(configValueSources, configDefinitions);
291
- const configValues = getConfigValues(configValueSources, configValuesComputed, configDefinitions);
292
292
  const pageConfig = {
293
293
  pageId: locationId,
294
294
  isErrorPage,
295
295
  routeFilesystem,
296
+ configDefinitions,
296
297
  configValueSources,
297
- configValuesComputed,
298
- configValues
298
+ configValuesComputed
299
299
  };
300
300
  return pageConfig;
301
301
  }));
@@ -328,7 +328,7 @@ function assertOnBeforeRenderEnv(pageConfig) {
328
328
  if (!onBeforeRenderConfig)
329
329
  return;
330
330
  const onBeforeRenderEnv = onBeforeRenderConfig.configEnv;
331
- const isClientRouting = !!pageConfig.configValues.clientRouting?.value;
331
+ const isClientRouting = getConfigValueBuildTime(pageConfig, 'clientRouting', 'boolean');
332
332
  // 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
333
333
  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.`);
334
334
  }
@@ -389,6 +389,7 @@ async function getGlobalConfigs(interfaceFilesByLocationId, userRootDir, importe
389
389
  }
390
390
  const globalVikeConfig = {};
391
391
  const pageConfigGlobal = {
392
+ configDefinitions: configDefinitionsBuiltInGlobal,
392
393
  configValueSources: {}
393
394
  };
394
395
  await Promise.all(objectEntries(configDefinitionsBuiltInGlobal).map(async ([configName, configDef]) => {
@@ -422,7 +423,15 @@ async function resolveConfigValueSources(configName, configDef, interfaceFilesRe
422
423
  const add = (interfaceFile) => {
423
424
  assert(!visited.has(interfaceFile));
424
425
  visited.add(interfaceFile);
425
- sourcesInfo.push([configName, interfaceFile, configDef, userRootDir, importedFilesLoaded]);
426
+ const isHighestInheritancePrecedence = sourcesInfo.length === 0;
427
+ sourcesInfo.push([
428
+ configName,
429
+ interfaceFile,
430
+ configDef,
431
+ userRootDir,
432
+ importedFilesLoaded,
433
+ isHighestInheritancePrecedence
434
+ ]);
426
435
  };
427
436
  // Main resolution logic
428
437
  {
@@ -493,7 +502,7 @@ function warnOverridenConfigValues(interfaceFileWinner, interfaceFilesOverriden,
493
502
  function isInterfaceFileUserLand(interfaceFile) {
494
503
  return (interfaceFile.isConfigFile && !interfaceFile.isConfigExtend) || interfaceFile.isValueFile;
495
504
  }
496
- async function getConfigValueSource(configName, interfaceFile, configDef, userRootDir, importedFilesLoaded) {
505
+ async function getConfigValueSource(configName, interfaceFile, configDef, userRootDir, importedFilesLoaded, isHighestInheritancePrecedence) {
497
506
  const conf = interfaceFile.fileExportsByConfigName[configName];
498
507
  assert(conf);
499
508
  const configEnv = deriveConfigEnvFromFileName(configDef.env, interfaceFile.filePath.fileName);
@@ -502,6 +511,7 @@ async function getConfigValueSource(configName, interfaceFile, configDef, userRo
502
511
  ...interfaceFile.filePath,
503
512
  fileExportPathToShowToUser: ['default', configName]
504
513
  };
514
+ const isOverriden = configDef.cumulative ? false : !isHighestInheritancePrecedence;
505
515
  // +client.js
506
516
  if (configDef._valueIsFilePath) {
507
517
  let definedAtFilePath;
@@ -528,7 +538,8 @@ async function getConfigValueSource(configName, interfaceFile, configDef, userRo
528
538
  valueIsFilePath: true,
529
539
  configEnv,
530
540
  valueIsImportedAtRuntime: true,
531
- valueIsDefinedByValueFile: false,
541
+ valueIsDefinedByPlusFile: false,
542
+ isOverriden,
532
543
  definedAtFilePath
533
544
  };
534
545
  return configValueSource;
@@ -544,11 +555,12 @@ async function getConfigValueSource(configName, interfaceFile, configDef, userRo
544
555
  locationId,
545
556
  configEnv,
546
557
  valueIsImportedAtRuntime: true,
547
- valueIsDefinedByValueFile: false,
558
+ valueIsDefinedByPlusFile: false,
559
+ isOverriden,
548
560
  definedAtFilePath: pointerImport
549
561
  };
550
- // Load fake import
551
- if (isConfigEnv(configDef, configName) &&
562
+ // Load pointer import
563
+ if (isLoadableAtBuildTime(configDef) &&
552
564
  // The value of `extends` was already loaded and already used: we don't need the value of `extends` anymore
553
565
  configName !== 'extends') {
554
566
  if (pointerImport.filePathAbsoluteFilesystem) {
@@ -568,7 +580,8 @@ async function getConfigValueSource(configName, interfaceFile, configDef, userRo
568
580
  value: configValue,
569
581
  configEnv,
570
582
  valueIsImportedAtRuntime: false,
571
- valueIsDefinedByValueFile: false,
583
+ valueIsDefinedByPlusFile: false,
584
+ isOverriden,
572
585
  definedAtFilePath: definedAtFilePath_
573
586
  };
574
587
  return configValueSource;
@@ -581,7 +594,8 @@ async function getConfigValueSource(configName, interfaceFile, configDef, userRo
581
594
  locationId,
582
595
  configEnv,
583
596
  valueIsImportedAtRuntime: !valueAlreadyLoaded,
584
- valueIsDefinedByValueFile: true,
597
+ valueIsDefinedByPlusFile: true,
598
+ isOverriden,
585
599
  definedAtFilePath: {
586
600
  ...interfaceFile.filePath,
587
601
  fileExportPathToShowToUser: configName === interfaceFile.configName
@@ -876,59 +890,6 @@ function determineIsErrorPage(routeFilesystem) {
876
890
  function isVikeConfigFile(filePath) {
877
891
  return !!getConfigName(filePath);
878
892
  }
879
- function getConfigValues(configValueSources, configValuesComputed, configDefinitions) {
880
- const configValues = {};
881
- Object.entries(configValuesComputed).forEach(([configName, configValueComputed]) => {
882
- configValues[configName] = {
883
- type: 'computed',
884
- value: configValueComputed.value,
885
- definedAtData: null
886
- };
887
- });
888
- Object.entries(configValueSources).forEach(([configName, sources]) => {
889
- const configDef = configDefinitions[configName];
890
- assert(configDef);
891
- if (!configDef.cumulative) {
892
- const configValueSource = sources[0];
893
- if ('value' in configValueSource) {
894
- configValues[configName] = {
895
- type: 'classic',
896
- value: configValueSource.value,
897
- definedAtData: getDefinedAtFile(configValueSource)
898
- };
899
- }
900
- }
901
- else {
902
- const value = mergeCumulative(configName, sources);
903
- const definedAtData = sources.map((source) => getDefinedAtFile(source));
904
- assert(value.length === definedAtData.length);
905
- configValues[configName] = {
906
- type: 'cumulative',
907
- value,
908
- definedAtData
909
- };
910
- }
911
- });
912
- return configValues;
913
- }
914
- function getDefinedAtFile(configValueSource) {
915
- return {
916
- filePathToShowToUser: configValueSource.definedAtFilePath.filePathToShowToUser,
917
- fileExportPathToShowToUser: configValueSource.definedAtFilePath.fileExportPathToShowToUser
918
- };
919
- }
920
- function mergeCumulative(configName, configValueSources) {
921
- const configValues = [];
922
- configValueSources.forEach((configValueSource) => {
923
- // We could, in principle, also support cumulative for values that aren't loaded at config-time but it isn't completely trivial to implement.
924
- assert('value' in configValueSource);
925
- // Make sure configValueSource.value is serializable
926
- assertConfigValueIsSerializable(configValueSource.value, configName, getDefinedAtFile(configValueSource));
927
- const { value } = configValueSource;
928
- configValues.push(value);
929
- });
930
- return configValues;
931
- }
932
893
  function getConfigEnvValue(val, errMsgIntro) {
933
894
  const errInvalidValue = `${errMsgIntro} an invalid value ${pc.cyan(JSON.stringify(val))}`;
934
895
  // Legacy outdated values
@@ -971,13 +932,8 @@ function getConfigDefinition(configDefinitions, configName, filePathToShowToUser
971
932
  function getConfigDefinitionOptional(configDefinitions, configName) {
972
933
  return configDefinitions[configName] ?? null;
973
934
  }
974
- function isConfigEnv(configDef, configName) {
975
- const configEnv = configDef.env;
976
- if (configDef.cumulative) {
977
- // In principle we could lift that requirement (but it requires non-trivial modifications)
978
- assertUsage(configEnv.config, `Config ${pc.cyan(configName)} needs its ${pc.cyan('env')} to have ${pc.cyan('{ config: true }')} (because ${pc.cyan(configName)} is a ${pc.cyan('cumulative')} config)`);
979
- }
980
- return !!configEnv.config;
935
+ function isLoadableAtBuildTime(configDef) {
936
+ return !!configDef.env.config && !configDef._valueIsFilePath;
981
937
  }
982
938
  function isGlobalConfig(configName) {
983
939
  if (configName === 'prerender')
@@ -4,13 +4,11 @@ import { getVirtualFileIdPageConfigValuesAll, isVirtualFileIdPageConfigValuesAll
4
4
  import { getVikeConfig } from './getVikeConfig.js';
5
5
  import { extractAssetsAddQuery } from '../../../../shared/extractAssetsQuery.js';
6
6
  import { debug } from './debug.js';
7
- import { getConfigValue } from '../../../../../shared/page-configs/getConfigValue.js';
8
- import { getConfigValueSourcesNotOverriden } from '../../../shared/getConfigValueSourcesNotOverriden.js';
9
7
  import { isRuntimeEnvMatch } from './isRuntimeEnvMatch.js';
10
- import { serializeConfigValueImported } from '../../../../../shared/page-configs/serialize/serializeConfigValue.js';
8
+ import { serializeConfigValues } from '../../../../../shared/page-configs/serialize/serializeConfigValues.js';
11
9
  import { getConfigVike } from '../../../../shared/getConfigVike.js';
12
- import { getConfigValuesSerialized } from './getConfigValuesSerialized.js';
13
10
  import { fixServerAssets_isEnabled } from '../../buildConfig/fixServerAssets.js';
11
+ import { getConfigValueBuildTime } from '../../../../../shared/page-configs/getConfigValueBuildTime.js';
14
12
  async function getVirtualFilePageConfigValuesAll(id, isDev, config) {
15
13
  const result = isVirtualFileIdPageConfigValuesAll(id);
16
14
  assert(result);
@@ -32,16 +30,9 @@ async function getVirtualFilePageConfigValuesAll(id, isDev, config) {
32
30
  function getLoadConfigValuesAll(pageConfig, isForClientSide, pageId, includeAssetsImportedByServer, isDev) {
33
31
  const lines = [];
34
32
  const importStatements = [];
35
- const isClientRouting = getConfigValue(pageConfig, 'clientRouting', 'boolean')?.value ?? false;
36
- lines.push('export const configValuesImported = [');
37
- lines.push(getConfigValuesImported(pageConfig, isForClientSide, isClientRouting, importStatements));
38
- lines.push('];');
33
+ const isClientRouting = getConfigValueBuildTime(pageConfig, 'clientRouting', 'boolean')?.value ?? false;
39
34
  lines.push('export const configValuesSerialized = {');
40
- lines.push(getConfigValuesSerialized(pageConfig, (configEnv, configValueSource) => isEnvMatch(configEnv, !configValueSource ? false : checkWhetherIsImport(configValueSource), {
41
- isImport: false,
42
- isForClientSide,
43
- isClientRouting
44
- })));
35
+ lines.push(...serializeConfigValues(pageConfig, importStatements, (configEnv) => isRuntimeEnvMatch(configEnv, { isForClientSide, isClientRouting, isEager: false, isDev }), ''));
45
36
  lines.push('};');
46
37
  if (!fixServerAssets_isEnabled() && includeAssetsImportedByServer && isForClientSide && !isDev) {
47
38
  importStatements.push(`import '${extractAssetsAddQuery(getVirtualFileIdPageConfigValuesAll(pageId, false))}'`);
@@ -49,33 +40,3 @@ function getLoadConfigValuesAll(pageConfig, isForClientSide, pageId, includeAsse
49
40
  const code = [...importStatements, ...lines].join('\n');
50
41
  return code;
51
42
  }
52
- function getConfigValuesImported(pageConfig, isForClientSide, isClientRouting, importStatements) {
53
- const lines = [];
54
- const varCounterContainer = { varCounter: 0 };
55
- getConfigValueSourcesNotOverriden(pageConfig).forEach((configValueSource) => {
56
- if (!isEnvMatch(configValueSource.configEnv, checkWhetherIsImport(configValueSource), {
57
- isImport: true,
58
- isForClientSide,
59
- isClientRouting
60
- }))
61
- return;
62
- const whitespace = ' ';
63
- lines.push(...serializeConfigValueImported(configValueSource, configValueSource.configName, whitespace, varCounterContainer, importStatements));
64
- });
65
- const code = lines.join('\n');
66
- return code;
67
- }
68
- function checkWhetherIsImport(configValueSource) {
69
- const { valueIsImportedAtRuntime, valueIsFilePath } = configValueSource;
70
- return valueIsImportedAtRuntime && !valueIsFilePath;
71
- }
72
- function isEnvMatch(configEnv, isImport, runtime) {
73
- // Whether config value is imported or serialized
74
- if (isImport !== runtime.isImport)
75
- return false;
76
- // Runtime match
77
- const { isForClientSide, isClientRouting } = runtime;
78
- if (!isRuntimeEnvMatch(configEnv, { isForClientSide, isClientRouting, isEager: false }))
79
- return false;
80
- return true;
81
- }
@@ -1,11 +1,9 @@
1
1
  export { getVirtualFilePageConfigs };
2
- import { assert, objectEntries } from '../../../utils.js';
3
2
  import { getVirtualFileIdPageConfigValuesAll } from '../../../../shared/virtual-files/virtualFilePageConfigValuesAll.js';
4
3
  import { debug } from './debug.js';
5
4
  import { getVikeConfig } from './getVikeConfig.js';
6
5
  import { isRuntimeEnvMatch } from './isRuntimeEnvMatch.js';
7
- import { serializeConfigValueImported } from '../../../../../shared/page-configs/serialize/serializeConfigValue.js';
8
- import { getConfigValuesSerialized } from './getConfigValuesSerialized.js';
6
+ import { serializeConfigValues } from '../../../../../shared/page-configs/serialize/serializeConfigValues.js';
9
7
  async function getVirtualFilePageConfigs(isForClientSide, isDev, id, isClientRouting, config) {
10
8
  const { pageConfigs, pageConfigGlobal } = await getVikeConfig(config, isDev, true);
11
9
  return getCode(pageConfigs, pageConfigGlobal, isForClientSide, isDev, id, isClientRouting);
@@ -13,18 +11,17 @@ async function getVirtualFilePageConfigs(isForClientSide, isDev, id, isClientRou
13
11
  function getCode(pageConfigs, pageConfigGlobal, isForClientSide, isDev, id, isClientRouting) {
14
12
  const lines = [];
15
13
  const importStatements = [];
16
- const varCounterContainer = { varCounter: 0 };
17
14
  lines.push('export const pageConfigsSerialized = [');
18
- lines.push(getCodePageConfigsSerialized(pageConfigs, isForClientSide, isClientRouting, importStatements, varCounterContainer));
15
+ lines.push(getCodePageConfigsSerialized(pageConfigs, isForClientSide, isClientRouting, isDev, importStatements));
19
16
  lines.push('];');
20
17
  lines.push('export const pageConfigGlobalSerialized = {');
21
- lines.push(getCodePageConfigGlobalSerialized(pageConfigGlobal, isForClientSide, isDev, importStatements, varCounterContainer));
18
+ lines.push(getCodePageConfigGlobalSerialized(pageConfigGlobal, isForClientSide, isClientRouting, isDev, importStatements));
22
19
  lines.push('};');
23
20
  const code = [...importStatements, ...lines].join('\n');
24
21
  debug(id, isForClientSide ? 'CLIENT-SIDE' : 'SERVER-SIDE', code);
25
22
  return code;
26
23
  }
27
- function getCodePageConfigsSerialized(pageConfigs, isForClientSide, isClientRouting, importStatements, varCounterContainer) {
24
+ function getCodePageConfigsSerialized(pageConfigs, isForClientSide, isClientRouting, isDev, importStatements) {
28
25
  const lines = [];
29
26
  pageConfigs.forEach((pageConfig) => {
30
27
  const { pageId, routeFilesystem, isErrorPage } = pageConfig;
@@ -34,57 +31,19 @@ function getCodePageConfigsSerialized(pageConfigs, isForClientSide, isClientRout
34
31
  lines.push(` isErrorPage: ${JSON.stringify(isErrorPage)},`);
35
32
  lines.push(` routeFilesystem: ${JSON.stringify(routeFilesystem)},`);
36
33
  lines.push(` loadConfigValuesAll: () => import(${JSON.stringify(virtualFileIdPageConfigValuesAll)}),`);
37
- // Serialized config values
38
34
  lines.push(` configValuesSerialized: {`);
39
- lines.push(getConfigValuesSerialized(pageConfig, (configEnv) => isRuntimeEnvMatch(configEnv, { isForClientSide, isClientRouting, isEager: true })));
35
+ lines.push(...serializeConfigValues(pageConfig, importStatements, (configEnv) => isRuntimeEnvMatch(configEnv, { isForClientSide, isClientRouting, isEager: true, isDev }), ' '));
40
36
  lines.push(` },`);
41
- // Imported config values
42
- const whitespace = ' ';
43
- lines.push(`${whitespace}configValuesImported: [`);
44
- Object.entries(pageConfig.configValueSources).forEach(([configName, sources]) => {
45
- const configValue = pageConfig.configValues[configName];
46
- if (configValue)
47
- return;
48
- const configValueSource = sources[0];
49
- assert(configValueSource);
50
- if (!configValueSource.configEnv.eager)
51
- return;
52
- if (!isRuntimeEnvMatch(configValueSource.configEnv, { isForClientSide, isClientRouting, isEager: true }))
53
- return;
54
- lines.push(...serializeConfigValueImported(configValueSource, configName, whitespace, varCounterContainer, importStatements));
55
- });
56
- lines.push(`${whitespace}],`);
57
37
  lines.push(` },`);
58
38
  });
59
39
  const code = lines.join('\n');
60
40
  return code;
61
41
  }
62
- function getCodePageConfigGlobalSerialized(pageConfigGlobal, isForClientSide, isDev, importStatements, varCounterContainer) {
42
+ function getCodePageConfigGlobalSerialized(pageConfigGlobal, isForClientSide, isClientRouting, isDev, importStatements) {
63
43
  const lines = [];
64
- /* Nothing (yet)
65
- lines.push(` configValuesSerialized: {`)
66
- lines.push(` },`)
67
- */
68
- lines.push(` configValuesImported: [`);
69
- objectEntries(pageConfigGlobal.configValueSources).forEach(([configName, sources]) => {
70
- if (configName === 'onBeforeRoute') {
71
- // if( isForClientSide && !isClientRouting ) return
72
- }
73
- else if (configName === 'onPrerenderStart') {
74
- if (isDev || isForClientSide) {
75
- // Only load onPrerenderStart() in server production runtime
76
- return;
77
- }
78
- }
79
- else {
80
- assert(false);
81
- }
82
- const configValueSource = sources[0];
83
- assert(configValueSource);
84
- const whitespace = ' ';
85
- lines.push(...serializeConfigValueImported(configValueSource, configName, whitespace, varCounterContainer, importStatements));
86
- });
87
- lines.push(` ],`);
44
+ lines.push(` configValuesSerialized: {`);
45
+ lines.push(...serializeConfigValues(pageConfigGlobal, importStatements, (configEnv) => isRuntimeEnvMatch(configEnv, { isForClientSide, isClientRouting, isEager: true, isDev }), ' '));
46
+ lines.push(` },`);
88
47
  const code = lines.join('\n');
89
48
  return code;
90
49
  }
@@ -4,4 +4,5 @@ declare function isRuntimeEnvMatch(configEnv: ConfigEnvInternal, runtime: {
4
4
  isForClientSide: boolean;
5
5
  isClientRouting: boolean;
6
6
  isEager: boolean;
7
+ isDev: boolean;
7
8
  }): boolean;
@@ -14,5 +14,11 @@ function isRuntimeEnvMatch(configEnv, runtime) {
14
14
  // Eager
15
15
  if (runtime.isEager !== !!configEnv.eager)
16
16
  return false;
17
+ // Production/development
18
+ if (
19
+ //
20
+ (configEnv.production === true && runtime.isDev) ||
21
+ (configEnv.production === false && !runtime.isDev))
22
+ return false;
17
23
  return true;
18
24
  }
@@ -1,5 +1,7 @@
1
1
  export { addSsrMiddleware };
2
2
  import { renderPage } from '../../runtime/renderPage.js';
3
+ import { assertWarning } from '../utils.js';
4
+ import pc from '@brillout/picocolors';
3
5
  function addSsrMiddleware(middlewares) {
4
6
  middlewares.use(async (req, res, next) => {
5
7
  if (res.headersSent)
@@ -8,11 +10,21 @@ function addSsrMiddleware(middlewares) {
8
10
  if (!url)
9
11
  return next();
10
12
  const { headers } = req;
11
- const userAgent = headers['user-agent'];
12
13
  const pageContextInit = {
13
14
  urlOriginal: url,
14
- userAgent
15
+ headersOriginal: headers
15
16
  };
17
+ Object.defineProperty(pageContextInit, 'userAgent', {
18
+ get() {
19
+ // TODO/next-major-release: assertUsage() instead of assertWarning()
20
+ assertWarning(false, `${pc.cyan('pageContext.userAgent')} is deprecated: use ${pc.cyan("pageContext.headers['user-agent']")} instead.`, {
21
+ showStackTrace: true,
22
+ onlyOnce: true
23
+ });
24
+ return headers['user-agent'];
25
+ },
26
+ enumerable: false
27
+ });
16
28
  let pageContext;
17
29
  try {
18
30
  pageContext = await renderPage(pageContextInit);