vike 0.4.171 → 0.4.172-commit-c1b0884

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 (216) hide show
  1. package/dist/cjs/node/plugin/index.js +3 -0
  2. package/dist/cjs/node/plugin/plugins/buildConfig.js +3 -4
  3. package/dist/cjs/node/plugin/plugins/config/index.js +9 -5
  4. package/dist/cjs/node/plugin/plugins/devConfig/determineOptimizeDeps.js +18 -15
  5. package/dist/cjs/node/plugin/plugins/devConfig/index.js +2 -1
  6. package/dist/cjs/node/plugin/plugins/envVars.js +2 -1
  7. package/dist/cjs/node/plugin/plugins/extractAssetsPlugin.js +1 -1
  8. package/dist/cjs/node/plugin/plugins/importUserCode/{generateEagerImport.js → addImportStatement.js} +8 -10
  9. package/dist/cjs/node/plugin/plugins/importUserCode/getVirtualFileImportUserCode.js +0 -1
  10. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/configDefinitionsBuiltIn.js +3 -3
  11. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/crawlPlusFiles.js +19 -7
  12. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/loadFileAtConfigTime.js +2 -2
  13. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig.js +43 -85
  14. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVirtualFilePageConfigValuesAll.js +5 -44
  15. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVirtualFilePageConfigs.js +10 -51
  16. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/isRuntimeEnvMatch.js +6 -0
  17. package/dist/cjs/node/plugin/resolveClientEntriesDev.js +59 -0
  18. package/dist/cjs/node/plugin/shared/addSsrMiddleware.js +17 -2
  19. package/dist/cjs/node/prerender/runPrerender.js +35 -15
  20. package/dist/cjs/node/prerender/utils.js +1 -0
  21. package/dist/cjs/node/runtime/html/injectAssets/getHtmlTags.js +3 -3
  22. package/dist/cjs/node/runtime/html/injectAssets/getViteDevScripts.js +2 -1
  23. package/dist/cjs/node/runtime/html/injectAssets/mergeScriptTags.js +2 -8
  24. package/dist/cjs/node/runtime/html/renderHtml.js +19 -20
  25. package/dist/cjs/node/runtime/html/serializePageContextClientSide.js +1 -1
  26. package/dist/cjs/node/runtime/html/stream.js +9 -9
  27. package/dist/cjs/node/runtime/renderPage/analyzePage.js +9 -7
  28. package/dist/cjs/node/runtime/renderPage/createHttpResponseObject/getCacheControl.js +1 -1
  29. package/dist/cjs/node/runtime/renderPage/executeOnBeforeRenderAndDataHooks.js +2 -2
  30. package/dist/cjs/node/runtime/renderPage/executeOnRenderHtmlHook.js +8 -8
  31. package/dist/cjs/node/runtime/renderPage/getHttpResponseBody.js +2 -2
  32. package/dist/cjs/node/runtime/renderPage/getPageAssets.js +9 -59
  33. package/dist/cjs/node/runtime/renderPage/loadUserFilesServerSide.js +4 -5
  34. package/dist/cjs/node/runtime/renderPage/logErrorHint.js +91 -282
  35. package/dist/cjs/node/runtime/renderPage/preparePageContextForUserConsumptionServerSide.js +2 -2
  36. package/dist/cjs/node/runtime/renderPage/renderPageAlreadyRouted.js +30 -10
  37. package/dist/cjs/node/runtime/renderPage.js +24 -17
  38. package/dist/cjs/node/runtime/utils.js +2 -0
  39. package/dist/cjs/node/shared/assertV1Design.js +3 -4
  40. package/dist/cjs/shared/getPageContext.js +5 -0
  41. package/dist/cjs/shared/{addUrlComputedProps.js → getPageContextUrlComputed.js} +52 -42
  42. package/dist/cjs/shared/getPageFiles/analyzeClientSide.js +2 -2
  43. package/dist/cjs/shared/getPageFiles/getExports.js +49 -1
  44. package/dist/cjs/shared/getPageFiles/parseGlobResults.js +15 -8
  45. package/dist/cjs/shared/hooks/executeHook.js +22 -3
  46. package/dist/cjs/shared/hooks/getHook.js +2 -2
  47. package/dist/cjs/shared/page-configs/getConfigValue.js +14 -17
  48. package/dist/cjs/shared/page-configs/getConfigValueBuildTime.js +70 -0
  49. package/dist/cjs/shared/page-configs/loadConfigValues.js +3 -12
  50. package/dist/cjs/shared/page-configs/serialize/assertPageConfigsSerialized.js +0 -18
  51. package/dist/cjs/shared/page-configs/serialize/parsePageConfigs.js +110 -16
  52. package/dist/cjs/shared/page-configs/serialize/serializeConfigValues.js +198 -0
  53. package/dist/cjs/shared/route/executeGuardHook.js +1 -1
  54. package/dist/cjs/shared/route/executeOnBeforeRouteHook.js +1 -1
  55. package/dist/cjs/shared/route/index.js +2 -2
  56. package/dist/cjs/shared/route/loadPageRoutes.js +2 -2
  57. package/dist/cjs/shared/route/resolveRouteFunction.js +2 -2
  58. package/dist/cjs/shared/sortPageContext.js +4 -8
  59. package/dist/cjs/shared/utils.js +2 -0
  60. package/dist/cjs/utils/assert.js +3 -3
  61. package/dist/cjs/utils/assertNodeVersion.js +1 -1
  62. package/dist/cjs/utils/changeEnumerable.js +9 -0
  63. package/dist/cjs/utils/escapeHtml.js +14 -0
  64. package/dist/cjs/utils/getPropAccessNotation.js +1 -4
  65. package/dist/cjs/utils/hasProp.js +5 -7
  66. package/dist/cjs/utils/normalizeHeaders.js +13 -0
  67. package/dist/cjs/utils/objectAssign.js +1 -1
  68. package/dist/cjs/utils/objectDefineProperty.js +8 -0
  69. package/dist/cjs/utils/objectKeys.js +8 -4
  70. package/dist/cjs/utils/projectInfo.js +1 -1
  71. package/dist/esm/client/client-routing-runtime/createPageContext.d.ts +6 -4
  72. package/dist/esm/client/client-routing-runtime/createPageContext.js +4 -3
  73. package/dist/esm/client/client-routing-runtime/getPageContextFromHooks.js +16 -12
  74. package/dist/esm/client/client-routing-runtime/installClientRouter.js +18 -10
  75. package/dist/esm/client/client-routing-runtime/renderPageClientSide.js +3 -3
  76. package/dist/esm/client/server-routing-runtime/getPageContext.d.ts +4 -4
  77. package/dist/esm/client/server-routing-runtime/utils.d.ts +1 -0
  78. package/dist/esm/client/server-routing-runtime/utils.js +1 -0
  79. package/dist/esm/client/shared/executeOnRenderClientHook.js +1 -1
  80. package/dist/esm/client/shared/getPageContextProxyForUser.d.ts +3 -2
  81. package/dist/esm/client/shared/getPageContextProxyForUser.js +35 -48
  82. package/dist/esm/client/shared/loadUserFilesClientSide.js +4 -4
  83. package/dist/esm/node/plugin/index.js +3 -0
  84. package/dist/esm/node/plugin/plugins/buildConfig.js +3 -4
  85. package/dist/esm/node/plugin/plugins/config/index.js +9 -5
  86. package/dist/esm/node/plugin/plugins/devConfig/determineOptimizeDeps.js +18 -15
  87. package/dist/esm/node/plugin/plugins/devConfig/index.js +2 -1
  88. package/dist/esm/node/plugin/plugins/envVars.js +2 -1
  89. package/dist/esm/node/plugin/plugins/extractAssetsPlugin.js +1 -1
  90. package/dist/esm/node/plugin/plugins/importUserCode/addImportStatement.d.ts +14 -0
  91. package/dist/esm/node/plugin/plugins/importUserCode/{generateEagerImport.js → addImportStatement.js} +7 -9
  92. package/dist/esm/node/plugin/plugins/importUserCode/getVirtualFileImportUserCode.js +0 -1
  93. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/configDefinitionsBuiltIn.d.ts +2 -1
  94. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/configDefinitionsBuiltIn.js +3 -3
  95. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/crawlPlusFiles.d.ts +1 -1
  96. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/crawlPlusFiles.js +20 -8
  97. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/loadFileAtConfigTime.js +2 -2
  98. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig.d.ts +4 -1
  99. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig.js +43 -85
  100. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVirtualFilePageConfigValuesAll.js +5 -44
  101. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVirtualFilePageConfigs.js +10 -51
  102. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/isRuntimeEnvMatch.d.ts +1 -0
  103. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/isRuntimeEnvMatch.js +6 -0
  104. package/dist/esm/node/plugin/resolveClientEntriesDev.d.ts +4 -0
  105. package/dist/esm/node/plugin/resolveClientEntriesDev.js +56 -0
  106. package/dist/esm/node/plugin/shared/addSsrMiddleware.js +14 -2
  107. package/dist/esm/node/prerender/runPrerender.js +37 -17
  108. package/dist/esm/node/prerender/utils.d.ts +1 -0
  109. package/dist/esm/node/prerender/utils.js +1 -0
  110. package/dist/esm/node/runtime/html/injectAssets/getHtmlTags.js +3 -3
  111. package/dist/esm/node/runtime/html/injectAssets/getViteDevScripts.js +3 -2
  112. package/dist/esm/node/runtime/html/injectAssets/mergeScriptTags.d.ts +1 -1
  113. package/dist/esm/node/runtime/html/injectAssets/mergeScriptTags.js +2 -8
  114. package/dist/esm/node/runtime/html/renderHtml.js +19 -20
  115. package/dist/esm/node/runtime/html/serializePageContextClientSide.js +1 -1
  116. package/dist/esm/node/runtime/html/stream.d.ts +1 -1
  117. package/dist/esm/node/runtime/html/stream.js +9 -9
  118. package/dist/esm/node/runtime/renderPage/analyzePage.js +9 -7
  119. package/dist/esm/node/runtime/renderPage/createHttpResponseObject/getCacheControl.js +2 -2
  120. package/dist/esm/node/runtime/renderPage/executeOnBeforeRenderAndDataHooks.js +2 -2
  121. package/dist/esm/node/runtime/renderPage/executeOnRenderHtmlHook.js +8 -8
  122. package/dist/esm/node/runtime/renderPage/getHttpResponseBody.js +2 -2
  123. package/dist/esm/node/runtime/renderPage/getPageAssets.d.ts +3 -0
  124. package/dist/esm/node/runtime/renderPage/getPageAssets.js +9 -59
  125. package/dist/esm/node/runtime/renderPage/loadUserFilesServerSide.d.ts +1 -6
  126. package/dist/esm/node/runtime/renderPage/loadUserFilesServerSide.js +4 -5
  127. package/dist/esm/node/runtime/renderPage/logErrorHint.d.ts +2 -6
  128. package/dist/esm/node/runtime/renderPage/logErrorHint.js +92 -283
  129. package/dist/esm/node/runtime/renderPage/preparePageContextForUserConsumptionServerSide.d.ts +2 -2
  130. package/dist/esm/node/runtime/renderPage/preparePageContextForUserConsumptionServerSide.js +2 -2
  131. package/dist/esm/node/runtime/renderPage/renderPageAlreadyRouted.d.ts +65 -39
  132. package/dist/esm/node/runtime/renderPage/renderPageAlreadyRouted.js +31 -11
  133. package/dist/esm/node/runtime/renderPage.js +24 -17
  134. package/dist/esm/node/runtime/utils.d.ts +2 -0
  135. package/dist/esm/node/runtime/utils.js +2 -0
  136. package/dist/esm/node/shared/assertV1Design.d.ts +2 -2
  137. package/dist/esm/node/shared/assertV1Design.js +3 -4
  138. package/dist/esm/shared/ConfigVike.d.ts +7 -0
  139. package/dist/esm/shared/VikeNamespace.d.ts +9 -0
  140. package/dist/esm/shared/getPageContext.d.ts +1 -0
  141. package/dist/esm/shared/getPageContext.js +1 -0
  142. package/dist/esm/shared/{addUrlComputedProps.d.ts → getPageContextUrlComputed.d.ts} +23 -21
  143. package/dist/esm/shared/{addUrlComputedProps.js → getPageContextUrlComputed.js} +52 -42
  144. package/dist/esm/shared/getPageFiles/analyzeClientSide.js +3 -3
  145. package/dist/esm/shared/getPageFiles/getExports.d.ts +36 -0
  146. package/dist/esm/shared/getPageFiles/getExports.js +50 -2
  147. package/dist/esm/shared/getPageFiles/parseGlobResults.js +14 -7
  148. package/dist/esm/shared/hooks/executeHook.d.ts +10 -1
  149. package/dist/esm/shared/hooks/executeHook.js +21 -2
  150. package/dist/esm/shared/hooks/getHook.d.ts +2 -2
  151. package/dist/esm/shared/hooks/getHook.js +3 -3
  152. package/dist/esm/shared/page-configs/Config/PageContextConfig.d.ts +2 -2
  153. package/dist/esm/shared/page-configs/PageConfig.d.ts +14 -8
  154. package/dist/esm/shared/page-configs/getConfigValue.d.ts +12 -12
  155. package/dist/esm/shared/page-configs/getConfigValue.js +13 -16
  156. package/dist/esm/shared/page-configs/getConfigValueBuildTime.d.ts +9 -0
  157. package/dist/esm/shared/page-configs/getConfigValueBuildTime.js +67 -0
  158. package/dist/esm/shared/page-configs/loadConfigValues.js +3 -12
  159. package/dist/esm/shared/page-configs/serialize/PageConfigSerialized.d.ts +17 -21
  160. package/dist/esm/shared/page-configs/serialize/assertPageConfigsSerialized.d.ts +1 -5
  161. package/dist/esm/shared/page-configs/serialize/assertPageConfigsSerialized.js +1 -16
  162. package/dist/esm/shared/page-configs/serialize/parsePageConfigs.d.ts +4 -1
  163. package/dist/esm/shared/page-configs/serialize/parsePageConfigs.js +109 -15
  164. package/dist/esm/shared/page-configs/serialize/serializeConfigValues.d.ts +5 -0
  165. package/dist/esm/shared/page-configs/serialize/serializeConfigValues.js +192 -0
  166. package/dist/esm/shared/route/executeGuardHook.js +1 -1
  167. package/dist/esm/shared/route/executeOnBeforeRouteHook.js +1 -1
  168. package/dist/esm/shared/route/index.d.ts +3 -3
  169. package/dist/esm/shared/route/index.js +2 -2
  170. package/dist/esm/shared/route/loadPageRoutes.js +3 -3
  171. package/dist/esm/shared/route/resolveRouteFunction.d.ts +2 -2
  172. package/dist/esm/shared/route/resolveRouteFunction.js +2 -2
  173. package/dist/esm/shared/sortPageContext.js +4 -8
  174. package/dist/esm/shared/types.d.ts +32 -6
  175. package/dist/esm/shared/utils.d.ts +2 -0
  176. package/dist/esm/shared/utils.js +2 -0
  177. package/dist/esm/types/index.d.ts +1 -1
  178. package/dist/esm/utils/assert.js +3 -3
  179. package/dist/esm/utils/assertNodeVersion.js +1 -1
  180. package/dist/esm/utils/changeEnumerable.d.ts +2 -0
  181. package/dist/esm/utils/changeEnumerable.js +5 -0
  182. package/dist/esm/utils/escapeHtml.d.ts +1 -0
  183. package/dist/esm/utils/escapeHtml.js +10 -0
  184. package/dist/esm/utils/getPropAccessNotation.d.ts +1 -2
  185. package/dist/esm/utils/getPropAccessNotation.js +2 -6
  186. package/dist/esm/utils/hasProp.d.ts +4 -13
  187. package/dist/esm/utils/hasProp.js +5 -7
  188. package/dist/esm/utils/normalizeHeaders.d.ts +1 -0
  189. package/dist/esm/utils/normalizeHeaders.js +9 -0
  190. package/dist/esm/utils/objectAssign.js +1 -1
  191. package/dist/esm/utils/objectDefineProperty.d.ts +4 -0
  192. package/dist/esm/utils/objectDefineProperty.js +4 -0
  193. package/dist/esm/utils/objectKeys.d.ts +1 -3
  194. package/dist/esm/utils/objectKeys.js +8 -4
  195. package/dist/esm/utils/projectInfo.d.ts +2 -2
  196. package/dist/esm/utils/projectInfo.js +1 -1
  197. package/package.json +23 -14
  198. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getConfigValuesSerialized.js +0 -76
  199. package/dist/cjs/node/plugin/shared/getConfigValueSourcesNotOverriden.js +0 -14
  200. package/dist/cjs/node/shared/getClientEntry.js +0 -12
  201. package/dist/cjs/shared/page-configs/serialize/parseConfigValuesImported.js +0 -85
  202. package/dist/cjs/shared/page-configs/serialize/parseConfigValuesSerialized.js +0 -24
  203. package/dist/cjs/shared/page-configs/serialize/serializeConfigValue.js +0 -50
  204. package/dist/esm/node/plugin/plugins/importUserCode/generateEagerImport.d.ts +0 -16
  205. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getConfigValuesSerialized.d.ts +0 -5
  206. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getConfigValuesSerialized.js +0 -70
  207. package/dist/esm/node/plugin/shared/getConfigValueSourcesNotOverriden.d.ts +0 -5
  208. package/dist/esm/node/plugin/shared/getConfigValueSourcesNotOverriden.js +0 -11
  209. package/dist/esm/node/shared/getClientEntry.d.ts +0 -3
  210. package/dist/esm/node/shared/getClientEntry.js +0 -9
  211. package/dist/esm/shared/page-configs/serialize/parseConfigValuesImported.d.ts +0 -4
  212. package/dist/esm/shared/page-configs/serialize/parseConfigValuesImported.js +0 -82
  213. package/dist/esm/shared/page-configs/serialize/parseConfigValuesSerialized.d.ts +0 -4
  214. package/dist/esm/shared/page-configs/serialize/parseConfigValuesSerialized.js +0 -21
  215. package/dist/esm/shared/page-configs/serialize/serializeConfigValue.d.ts +0 -8
  216. package/dist/esm/shared/page-configs/serialize/serializeConfigValue.js +0 -47
@@ -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);
@@ -21,7 +19,7 @@ async function getVirtualFilePageConfigValuesAll(id, isDev, config) {
21
19
  }
22
20
  */
23
21
  const { pageId, isForClientSide } = result;
24
- const { pageConfigs } = await getVikeConfig(config, isDev, true);
22
+ const { pageConfigs } = await getVikeConfig(config, isDev, { tolerateInvalidConfig: true });
25
23
  const pageConfig = pageConfigs.find((pageConfig) => pageConfig.pageId === pageId);
26
24
  assert(pageConfig);
27
25
  const configVike = await getConfigVike(config);
@@ -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,30 +1,27 @@
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
- const { pageConfigs, pageConfigGlobal } = await getVikeConfig(config, isDev, true);
8
+ const { pageConfigs, pageConfigGlobal } = await getVikeConfig(config, isDev, { tolerateInvalidConfig: true });
11
9
  return getCode(pageConfigs, pageConfigGlobal, isForClientSide, isDev, id, isClientRouting);
12
10
  }
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
  }
@@ -0,0 +1,4 @@
1
+ export { resolveClientEntriesDev };
2
+ export type ResolveClientEntriesDev = typeof resolveClientEntriesDev;
3
+ import type { ViteDevServer } from 'vite';
4
+ declare function resolveClientEntriesDev(clientEntry: string, viteDevServer: ViteDevServer): Promise<string>;
@@ -0,0 +1,56 @@
1
+ export { resolveClientEntriesDev };
2
+ import { assert, assertPosixPath, toPosixPath, pathJoin, assertIsNpmPackageImport, assertIsNotProductionRuntime } from './utils.js';
3
+ import { createRequire } from 'module';
4
+ import { dirname } from 'path';
5
+ import { fileURLToPath } from 'url';
6
+ // @ts-ignore Shimmed by dist-cjs-fixup.js for CJS build.
7
+ const importMetaUrl = import.meta.url;
8
+ const require_ = createRequire(importMetaUrl);
9
+ const __dirname_ = dirname(fileURLToPath(importMetaUrl));
10
+ assertIsNotProductionRuntime();
11
+ async function resolveClientEntriesDev(clientEntry, viteDevServer) {
12
+ let root = viteDevServer.config.root;
13
+ assert(root);
14
+ root = toPosixPath(root);
15
+ // The `?import` suffix is needed for MDX to be transpiled:
16
+ // - Not transpiled: `/pages/markdown.page.mdx`
17
+ // - Transpiled: `/pages/markdown.page.mdx?import`
18
+ // But `?import` doesn't work with `/@fs/`:
19
+ // - Not transpiled: /@fs/home/runner/work/vike/vike/examples/react-full/pages/markdown.page.mdx
20
+ // - Not transpiled: /@fs/home/runner/work/vike/vike/examples/react-full/pages/markdown.page.mdx?import
21
+ if (clientEntry.endsWith('?import')) {
22
+ assert(clientEntry.startsWith('/'));
23
+ return clientEntry;
24
+ }
25
+ assertPosixPath(clientEntry);
26
+ let filePath;
27
+ if (clientEntry.startsWith('/')) {
28
+ filePath = pathJoin(root, clientEntry);
29
+ }
30
+ else {
31
+ if (clientEntry.startsWith('@@vike/')) {
32
+ assert(clientEntry.endsWith('.js'));
33
+ try {
34
+ // For Vitest (which doesn't resolve vike to its dist but to its source files)
35
+ // [RELATIVE_PATH_FROM_DIST] Current file: node_modules/vike/node/plugin/resolveClientEntriesDev.js
36
+ filePath = toPosixPath(require_.resolve(clientEntry.replace('@@vike/dist/esm/client/', '../../client/').replace('.js', '.ts')));
37
+ }
38
+ catch {
39
+ // For users
40
+ // [RELATIVE_PATH_FROM_DIST] Current file: node_modules/vike/dist/esm/node/plugin/resolveClientEntriesDev.js
41
+ filePath = toPosixPath(require_.resolve(clientEntry.replace('@@vike/dist/esm/client/', '../../../../dist/esm/client/')));
42
+ }
43
+ }
44
+ else {
45
+ assertIsNpmPackageImport(clientEntry);
46
+ filePath = require_.resolve(clientEntry);
47
+ }
48
+ }
49
+ if (!filePath.startsWith('/')) {
50
+ assert(process.platform === 'win32');
51
+ filePath = '/' + filePath;
52
+ }
53
+ filePath = '/@fs' + filePath;
54
+ assertPosixPath(filePath);
55
+ return filePath;
56
+ }
@@ -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);
@@ -5,7 +5,7 @@ export { runPrerender_forceExit };
5
5
  import '../runtime/page-files/setup.js';
6
6
  import path from 'path';
7
7
  import { route } from '../../shared/route/index.js';
8
- import { assert, assertUsage, assertWarning, hasProp, projectInfo, objectAssign, isObjectWithKeys, isCallable, getOutDirs, isPropertyGetter, assertPosixPath, urlToFile, isPlainObject, handleNodeEnv_prerender, pLimit, assertPathFilesystemAbsolute, isArray } from './utils.js';
8
+ import { assert, assertUsage, assertWarning, hasProp, projectInfo, objectAssign, isObjectWithKeys, isCallable, getOutDirs, isPropertyGetter, assertPosixPath, urlToFile, isPlainObject, handleNodeEnv_prerender, pLimit, assertPathFilesystemAbsolute, isArray, changeEnumerable } from './utils.js';
9
9
  import { prerenderPage, prerender404Page, getRenderContext, getPageContextInitEnhanced } from '../runtime/renderPage/renderPageAlreadyRouted.js';
10
10
  import pc from '@brillout/picocolors';
11
11
  import { cpus } from 'os';
@@ -16,10 +16,10 @@ import { getPageFilesServerSide } from '../../shared/getPageFiles.js';
16
16
  import { getPageContextRequestUrl } from '../../shared/getPageContextRequestUrl.js';
17
17
  import { getUrlFromRouteString } from '../../shared/route/resolveRouteString.js';
18
18
  import { getConfigValueFilePathToShowToUser } from '../../shared/page-configs/helpers.js';
19
- import { getConfigValue } from '../../shared/page-configs/getConfigValue.js';
19
+ import { getConfigValueRuntime } from '../../shared/page-configs/getConfigValue.js';
20
20
  import { loadConfigValues } from '../../shared/page-configs/loadConfigValues.js';
21
21
  import { isErrorPage } from '../../shared/error-page.js';
22
- import { addUrlComputedProps } from '../../shared/addUrlComputedProps.js';
22
+ import { getPageContextUrlComputed } from '../../shared/getPageContextUrlComputed.js';
23
23
  import { isAbortError } from '../../shared/route/abort.js';
24
24
  import { loadUserFilesServerSide } from '../runtime/renderPage/loadUserFilesServerSide.js';
25
25
  import { getHookFromPageConfig, getHookFromPageConfigGlobal, getHookTimeoutDefault, setIsPrerenderering } from '../../shared/hooks/getHook.js';
@@ -27,6 +27,7 @@ import { noRouteMatch } from '../../shared/route/noRouteMatch.js';
27
27
  import { getVikeConfig } from '../plugin/plugins/importUserCode/v1-design/getVikeConfig.js';
28
28
  import { logErrorHint } from '../runtime/renderPage/logErrorHint.js';
29
29
  import { executeHook, isUserHookError } from '../../shared/hooks/executeHook.js';
30
+ import { getConfigValueBuildTime } from '../../shared/page-configs/getConfigValueBuildTime.js';
30
31
  async function runPrerenderFromAPI(options = {}) {
31
32
  await runPrerender(options, 'prerender()');
32
33
  // - We purposely propagate the error to the user land, so that the error interrupts the user land. It's also, I guess, a nice-to-have that the user has control over the error.
@@ -114,7 +115,7 @@ async function collectDoNoPrerenderList(renderContext, pageConfigs, doNotPrerend
114
115
  // V1 design
115
116
  pageConfigs.forEach((pageConfig) => {
116
117
  const configName = 'prerender';
117
- const configValue = getConfigValue(pageConfig, configName, 'boolean');
118
+ const configValue = getConfigValueBuildTime(pageConfig, configName, 'boolean');
118
119
  if (configValue?.value === false) {
119
120
  const configValueFilePathToShowToUser = getConfigValueFilePathToShowToUser(configValue.definedAtData);
120
121
  assert(configValueFilePathToShowToUser);
@@ -217,7 +218,7 @@ async function callOnBeforePrerenderStartHooks(prerenderContext, renderContext,
217
218
  if (doNotPrerenderList.find((p) => p.pageId === pageId)) {
218
219
  return;
219
220
  }
220
- const prerenderResult = await executeHook(() => hookFn(), { hookName, hookFilePath, hookTimeout });
221
+ const prerenderResult = await executeHook(() => hookFn(), { hookName, hookFilePath, hookTimeout }, null);
221
222
  const result = normalizeOnPrerenderHookResult(prerenderResult, hookFilePath, hookName);
222
223
  result.forEach(({ url, pageContext }) => {
223
224
  {
@@ -240,9 +241,9 @@ async function callOnBeforePrerenderStartHooks(prerenderContext, renderContext,
240
241
  prerenderContext.pageContexts.push(pageContextNew);
241
242
  if (pageContext) {
242
243
  objectAssign(pageContextNew, {
243
- _pageContextAlreadyProvidedByOnPrerenderHook: true,
244
- ...pageContext
244
+ _pageContextAlreadyProvidedByOnPrerenderHook: true
245
245
  });
246
+ objectAssign(pageContextNew, pageContext);
246
247
  }
247
248
  });
248
249
  })));
@@ -300,14 +301,11 @@ function createPageContext(urlOriginal, renderContext, prerenderContext) {
300
301
  _prerenderContext: prerenderContext
301
302
  };
302
303
  const pageContextInit = {
303
- urlOriginal,
304
- ...prerenderContext.pageContextInit
304
+ urlOriginal
305
305
  };
306
+ objectAssign(pageContextInit, prerenderContext.pageContextInit);
306
307
  {
307
- const pageContextInitEnhanced = getPageContextInitEnhanced(pageContextInit, renderContext, {
308
- // We set `enumerable` to `false` to avoid computed URL properties from being iterated & copied in a onPrerenderStart() hook, e.g. /examples/i18n/
309
- urlComputedPropsNonEnumerable: true
310
- });
308
+ const pageContextInitEnhanced = getPageContextInitEnhanced(pageContextInit, renderContext);
311
309
  objectAssign(pageContext, pageContextInitEnhanced);
312
310
  }
313
311
  return pageContext;
@@ -382,6 +380,8 @@ async function callOnPrerenderStartHook(prerenderContext, renderContext) {
382
380
  pageContext._urlOriginalBeforeHook = pageContext.urlOriginal;
383
381
  });
384
382
  const docLink = 'https://vike.dev/i18n#pre-rendering';
383
+ // Set `enumerable` to `false` to avoid computed URL properties from being iterated & copied in onPrerenderStart() hook, e.g. /examples/i18n/
384
+ const { restoreEnumerable, addPageContextComputedUrl } = makePageContextComputedUrlNonEnumerable(prerenderContext.pageContexts);
385
385
  let result = await executeHook(() => hookFn({
386
386
  pageContexts: prerenderContext.pageContexts,
387
387
  // TODO/v1-release: remove warning
@@ -392,7 +392,8 @@ async function callOnPrerenderStartHook(prerenderContext, renderContext) {
392
392
  });
393
393
  return prerenderContext.pageContexts;
394
394
  }
395
- }), onPrerenderStartHook);
395
+ }), onPrerenderStartHook, null);
396
+ restoreEnumerable();
396
397
  if (result === null || result === undefined) {
397
398
  return;
398
399
  }
@@ -430,9 +431,8 @@ async function callOnPrerenderStartHook(prerenderContext, renderContext) {
430
431
  hookName
431
432
  };
432
433
  }
433
- // Restore as URL computed props are lost when user makes a pageContext copy
434
- addUrlComputedProps(pageContext);
435
434
  });
435
+ addPageContextComputedUrl(prerenderContext.pageContexts);
436
436
  }
437
437
  async function routeAndPrerender(prerenderContext, concurrencyLimit, onComplete) {
438
438
  const globalContext = getGlobalContext();
@@ -474,7 +474,7 @@ async function routeAndPrerender(prerenderContext, concurrencyLimit, onComplete)
474
474
  if (pageContext._pageConfigs.length > 0) {
475
475
  const pageConfig = pageContext._pageConfigs.find((p) => p.pageId === pageId);
476
476
  assert(pageConfig);
477
- usesClientRouter = getConfigValue(pageConfig, 'clientRouting', 'boolean')?.value ?? false;
477
+ usesClientRouter = getConfigValueRuntime(pageConfig, 'clientRouting', 'boolean')?.value ?? false;
478
478
  }
479
479
  else {
480
480
  usesClientRouter = globalContext.pluginManifest.usesClientRouter;
@@ -714,3 +714,23 @@ function assertIsNotAbort(err, urlOr404) {
714
714
  assert(abortCall);
715
715
  assertUsage(false, `${pc.cyan(abortCall)} thrown${thrownBy} while pre-rendering ${urlOr404} but ${pc.cyan(abortCaller)} isn't supported for pre-rendered pages`);
716
716
  }
717
+ function makePageContextComputedUrlNonEnumerable(pageContexts) {
718
+ change(false);
719
+ return { restoreEnumerable, addPageContextComputedUrl };
720
+ function restoreEnumerable() {
721
+ change(true);
722
+ }
723
+ function addPageContextComputedUrl(pageContexts) {
724
+ // Add URL computed props to the user-generated pageContext copies
725
+ pageContexts.forEach((pageContext) => {
726
+ const pageContextUrlComputed = getPageContextUrlComputed(pageContext);
727
+ objectAssign(pageContext, pageContextUrlComputed);
728
+ });
729
+ }
730
+ function change(enumerable) {
731
+ pageContexts.forEach((pageContext) => {
732
+ changeEnumerable(pageContext, 'urlPathname', enumerable);
733
+ changeEnumerable(pageContext, 'urlParsed', enumerable);
734
+ });
735
+ }
736
+ }
@@ -13,3 +13,4 @@ export * from '../../utils/assertNodeEnv.js';
13
13
  export * from '../../utils/pLimit.js';
14
14
  export * from '../../utils/assertPathFilesystemAbsolute.js';
15
15
  export * from '../../utils/isArray.js';
16
+ export * from '../../utils/changeEnumerable.js';
@@ -15,3 +15,4 @@ export * from '../../utils/assertNodeEnv.js';
15
15
  export * from '../../utils/pLimit.js';
16
16
  export * from '../../utils/assertPathFilesystemAbsolute.js';
17
17
  export * from '../../utils/isArray.js';
18
+ export * from '../../utils/changeEnumerable.js';
@@ -107,7 +107,7 @@ async function getHtmlTags(pageContext, injectToStream, injectFilter) {
107
107
  });
108
108
  }
109
109
  // The JavaScript entry <script> tag
110
- const scriptEntry = await mergeScriptEntries(pageAssets, isProduction);
110
+ const scriptEntry = await mergeScriptEntries(pageAssets);
111
111
  if (scriptEntry) {
112
112
  htmlTags.push({
113
113
  htmlTag: scriptEntry,
@@ -128,11 +128,11 @@ async function getHtmlTags(pageContext, injectToStream, injectFilter) {
128
128
  });
129
129
  return htmlTags;
130
130
  }
131
- async function mergeScriptEntries(pageAssets, isProduction) {
131
+ async function mergeScriptEntries(pageAssets) {
132
132
  const scriptEntries = pageAssets.filter((pageAsset) => pageAsset.isEntry && pageAsset.assetType === 'script');
133
133
  const viteScripts = await getViteDevScripts();
134
134
  const scriptTagsHtml = `${viteScripts}${scriptEntries.map((asset) => inferAssetTag(asset)).join('')}`;
135
- const scriptTag = mergeScriptTags(scriptTagsHtml, isProduction);
135
+ const scriptTag = mergeScriptTags(scriptTagsHtml);
136
136
  return scriptTag;
137
137
  }
138
138
  function getPageContextJsonScriptTag(pageContext) {
@@ -1,6 +1,6 @@
1
1
  export { getViteDevScripts };
2
2
  import { getGlobalContext } from '../../globalContext.js';
3
- import { assert, assertUsage } from '../../utils.js';
3
+ import { assert, assertUsage, assertWarning } from '../../utils.js';
4
4
  import pc from '@brillout/picocolors';
5
5
  async function getViteDevScripts() {
6
6
  const globalContext = getGlobalContext();
@@ -16,7 +16,8 @@ async function getViteDevScripts() {
16
16
  assertUsage(!fakeHtml.startsWith(fakeHtmlBegin.replace(' ', '')), 'Vite plugins that minify the HTML are not supported by vike, see https://github.com/vikejs/vike/issues/224');
17
17
  assertUsage(fakeHtml.startsWith(fakeHtmlBegin) && fakeHtml.endsWith(fakeHtmlEnd), 'You are using a Vite Plugin that transforms the HTML in a way that conflicts with vike. Create a new GitHub ticket to discuss a solution.');
18
18
  const viteInjection = fakeHtml.slice(fakeHtmlBegin.length, -1 * fakeHtmlEnd.length);
19
- assert(viteInjection.includes('script'), { viteInjection });
19
+ assert(viteInjection.includes('script'));
20
+ assertWarning(!viteInjection.includes('import('), 'Unexpected Vite HMR code. Reach out to a Vike maintainer on GitHub.', { onlyOnce: true });
20
21
  const scriptTags = viteInjection;
21
22
  return scriptTags;
22
23
  }
@@ -1,2 +1,2 @@
1
1
  export { mergeScriptTags };
2
- declare function mergeScriptTags(scriptTagsHtml: string, isProduction: boolean): string;
2
+ declare function mergeScriptTags(scriptTagsHtml: string): string;
@@ -4,7 +4,7 @@ import { scriptAttrs } from './inferHtmlTags.js';
4
4
  const scriptRE = /(<script\b(?:\s[^>]*>|>))(.*?)<\/script>/gims;
5
5
  const srcRE = /\bsrc\s*=\s*(?:"([^"]+)"|'([^']+)'|([^\s'">]+))/im;
6
6
  const typeRE = /\btype\s*=\s*(?:"([^"]+)"|'([^']+)'|([^\s'">]+))/im;
7
- function mergeScriptTags(scriptTagsHtml, isProduction) {
7
+ function mergeScriptTags(scriptTagsHtml) {
8
8
  let scriptTag = '';
9
9
  const scripts = parseScripts(scriptTagsHtml);
10
10
  // We need to merge module scripts to ensure execution order
@@ -19,13 +19,7 @@ function mergeScriptTags(scriptTagsHtml, isProduction) {
19
19
  const hasInnerHtml = !!innerHtml.trim();
20
20
  if (src) {
21
21
  assert(!hasInnerHtml);
22
- if (isProduction) {
23
- contents.push(`import ${JSON.stringify(src)};`);
24
- }
25
- else {
26
- // Ensure HMR preamble code is executed before client entries
27
- contents.push(`import(${JSON.stringify(src)});`);
28
- }
22
+ contents.push(`import ${JSON.stringify(src)};`);
29
23
  }
30
24
  else if (hasInnerHtml) {
31
25
  innerHtml = innerHtml.split('\n').filter(Boolean).join('\n');
@@ -3,7 +3,7 @@ export { dangerouslySkipEscape };
3
3
  export { renderDocumentHtml };
4
4
  export { isDocumentHtml };
5
5
  export { getHtmlString };
6
- import { assert, assertUsage, assertWarning, checkType, hasProp, isHtml, isPromise, objectAssign } from '../utils.js';
6
+ import { assert, assertUsage, assertWarning, checkType, escapeHtml, hasProp, isHtml, isPromise, objectAssign } from '../utils.js';
7
7
  import { injectHtmlTagsToString, injectHtmlTagsToStream } from './injectAssets.js';
8
8
  import { processStream, isStream, streamToString } from './stream.js';
9
9
  import { isStreamReactStreaming } from './stream/react-streaming.js';
@@ -165,31 +165,40 @@ async function renderTemplate(templateContent, pageContext) {
165
165
  setStream(templateVar);
166
166
  continue;
167
167
  }
168
- const getErrMsg = (typeText, end) => {
168
+ const getErrMsg = (msg) => {
169
169
  const { hookName, hookFilePath } = pageContext._renderHook;
170
170
  const nth = (i === 0 && '1st') || (i === 1 && '2nd') || (i === 2 && '3rd') || `${i}-th`;
171
- return [`The ${nth} HTML variable is ${typeText}, see ${hookName}() hook defined by ${hookFilePath}.`, end]
171
+ return [
172
+ `The ${nth} HTML variable is ${msg}`,
173
+ `The HTML was provided by the ${hookName}() hook at ${hookFilePath}.`
174
+ ]
172
175
  .filter(Boolean)
173
176
  .join(' ');
174
177
  };
175
- assertUsage(!isPromise(templateVar), getErrMsg('a promise', `Did you forget to ${pc.cyan('await')} the promise?`));
178
+ assertUsage(!isPromise(templateVar), getErrMsg(`a promise, did you forget to ${pc.cyan('await')} the promise?`));
176
179
  if (templateVar === undefined || templateVar === null) {
177
- assertWarning(false, getErrMsg(`${pc.cyan(String(templateVar))} which will be converted to an empty string`, `Pass the empty string ${pc.cyan("''")} instead of ${pc.cyan(String(templateVar))} to remove this warning.`), { onlyOnce: false });
180
+ const msgVal = pc.cyan(String(templateVar));
181
+ const msgEmptyString = pc.cyan("''");
182
+ const msg = `${msgVal} which will be converted to an empty string. Pass the empty string ${msgEmptyString} instead of ${msgVal} to remove this warning.`;
183
+ assertWarning(false, getErrMsg(msg), { onlyOnce: false });
178
184
  templateVar = '';
179
185
  }
180
186
  {
181
187
  const varType = typeof templateVar;
182
- const streamNote = ['boolean', 'number', 'bigint', 'symbol'].includes(varType)
183
- ? null
184
- : '(See https://vike.dev/streaming for HTML streaming.)';
185
- assertUsage(varType === 'string', getErrMsg(pc.cyan(`typeof htmlVar === "${varType}"`), streamNote));
188
+ if (varType !== 'string') {
189
+ const msgType = pc.cyan(`typeof htmlVariable === "${varType}"`);
190
+ const msg = `${msgType} but a string or stream (https://vike.dev/streaming) is expected instead.`;
191
+ assertUsage(false, getErrMsg(msg));
192
+ }
186
193
  }
187
194
  {
188
195
  const { isProduction } = getGlobalContext();
189
196
  if (isHtml(templateVar) &&
190
197
  // We don't show this warning in production because it's expected that some users may (un)willingly do some XSS injection: we avoid flooding the production logs.
191
198
  !isProduction) {
192
- assertWarning(false, getErrMsg(`${pc.cyan(templateVar)} which seems to be HTML code`, 'Did you forget to wrap the value with dangerouslySkipEscape()?'), { onlyOnce: false });
199
+ const msgVal = pc.cyan(String(templateVar));
200
+ const msg = `${msgVal} which seems to be HTML code. Did you forget to wrap the value with dangerouslySkipEscape()?`;
201
+ assertWarning(false, getErrMsg(msg), { onlyOnce: false });
193
202
  }
194
203
  }
195
204
  // Escape untrusted template variable
@@ -209,16 +218,6 @@ async function renderTemplate(templateContent, pageContext) {
209
218
  htmlPartsEnd
210
219
  };
211
220
  }
212
- function escapeHtml(unsafeString) {
213
- // Source: https://stackoverflow.com/questions/6234773/can-i-escape-html-special-chars-in-javascript/6234804#6234804
214
- const safe = unsafeString
215
- .replace(/&/g, '&amp;')
216
- .replace(/</g, '&lt;')
217
- .replace(/>/g, '&gt;')
218
- .replace(/"/g, '&quot;')
219
- .replace(/'/g, '&#039;');
220
- return safe;
221
- }
222
221
  async function getHtmlString(htmlRender) {
223
222
  if (typeof htmlRender === 'string') {
224
223
  return htmlRender;
@@ -31,7 +31,7 @@ function serializePageContextClientSide(pageContext) {
31
31
  pageContextClient[prop] = pageContext[prop];
32
32
  });
33
33
  if (Object.keys(pageContext._pageContextInit).some((p) => passToClient.includes(p))) {
34
- pageContextClient._pageContextInitIsPassedToClient = true;
34
+ pageContextClient[pageContextInitIsPassedToClient] = true;
35
35
  }
36
36
  let pageContextSerialized;
37
37
  try {
@@ -80,5 +80,5 @@ type StreamPipeWrapped = {
80
80
  };
81
81
  declare function pipeStream(pipe: StreamPipe): StreamPipeWrapped;
82
82
  declare function streamToString(stream: StreamProviderAny): Promise<string>;
83
- declare function getStreamName(type: 'pipe' | 'readable' | 'writable', standard: 'web' | 'node'): `a ${string} Stream` | `a ${string} Stream Pipe`;
83
+ declare function getStreamName(kind: 'pipe' | 'readable' | 'writable', type: 'web' | 'node'): `a ${string} Stream` | `a ${string} Stream Pipe`;
84
84
  declare function inferStreamName(stream: StreamProviderNormalized): `a ${string} Stream` | `a ${string} Stream Pipe`;
@@ -758,17 +758,17 @@ async function loadStreamNodeModule() {
758
758
  const { Readable, Writable } = streamModule;
759
759
  return { Readable, Writable };
760
760
  }
761
- function getStreamName(type, standard) {
762
- let standardName = capitalizeFirstLetter(standard);
763
- if (standardName === 'Node') {
764
- standardName = 'Node.js';
761
+ function getStreamName(kind, type) {
762
+ let typeName = capitalizeFirstLetter(type);
763
+ if (typeName === 'Node') {
764
+ typeName = 'Node.js';
765
765
  }
766
- const typeName = capitalizeFirstLetter(type);
767
- if (type !== 'pipe') {
768
- return `a ${typeName} ${standardName} Stream`;
766
+ const kindName = capitalizeFirstLetter(kind);
767
+ if (kind !== 'pipe') {
768
+ return `a ${kindName} ${typeName} Stream`;
769
769
  }
770
- if (type === 'pipe') {
771
- return `a ${standardName} Stream Pipe`;
770
+ if (kind === 'pipe') {
771
+ return `a ${typeName} Stream Pipe`;
772
772
  }
773
773
  assert(false);
774
774
  }