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
@@ -6,9 +6,9 @@ export { getRenderContext };
6
6
  import { getErrorPageId } from '../../../shared/error-page.js';
7
7
  import { getHtmlString } from '../html/renderHtml.js';
8
8
  import { getPageFilesAll } from '../../../shared/getPageFiles.js';
9
- import { assert, assertUsage, hasProp, objectAssign } from '../utils.js';
9
+ import { assert, assertUsage, assertWarning, hasProp, normalizeHeaders, objectAssign } from '../utils.js';
10
10
  import { serializePageContextClientSide } from '../html/serializePageContextClientSide.js';
11
- import { addUrlComputedProps } from '../../../shared/addUrlComputedProps.js';
11
+ import { getPageContextUrlComputed } from '../../../shared/getPageContextUrlComputed.js';
12
12
  import { getGlobalContext } from '../globalContext.js';
13
13
  import { createHttpResponseObject, createHttpResponsePageContextJson } from './createHttpResponseObject.js';
14
14
  import { loadUserFilesServerSide } from './loadUserFilesServerSide.js';
@@ -21,7 +21,6 @@ import { executeGuardHook } from '../../../shared/route/executeGuardHook.js';
21
21
  import { loadPageRoutes } from '../../../shared/route/loadPageRoutes.js';
22
22
  import pc from '@brillout/picocolors';
23
23
  import { isServerSideError } from '../../../shared/misc/isServerSideError.js';
24
- import { assertV1Design } from '../../shared/assertV1Design.js';
25
24
  async function renderPageAlreadyRouted(pageContext) {
26
25
  // pageContext._pageId can either be the:
27
26
  // - ID of the page matching the routing, or the
@@ -106,9 +105,9 @@ async function prerender404Page(renderContext, pageContextInit_) {
106
105
  _debugRouteMatches: []
107
106
  };
108
107
  const pageContextInit = {
109
- urlOriginal: '/fake-404-url', // A URL is needed for `applyViteHtmlTransform`
110
- ...pageContextInit_
108
+ urlOriginal: '/fake-404-url' // A URL is needed for `applyViteHtmlTransform`
111
109
  };
110
+ objectAssign(pageContextInit, pageContextInit_);
112
111
  {
113
112
  const pageContextInitEnhanced = getPageContextInitEnhanced(pageContextInit, renderContext);
114
113
  objectAssign(pageContext, pageContextInitEnhanced);
@@ -116,15 +115,16 @@ async function prerender404Page(renderContext, pageContextInit_) {
116
115
  objectAssign(pageContext, await loadUserFilesServerSide(pageContext));
117
116
  return prerenderPage(pageContext);
118
117
  }
119
- function getPageContextInitEnhanced(pageContextInit, renderContext, { urlComputedPropsNonEnumerable = false, ssr: { urlRewrite, urlHandler, isClientSideNavigation } = {
118
+ function getPageContextInitEnhanced(pageContextInit, renderContext, { ssr: { urlRewrite, urlHandler, isClientSideNavigation } = {
120
119
  urlRewrite: null,
121
120
  urlHandler: null,
122
121
  isClientSideNavigation: false
123
122
  } } = {}) {
124
123
  assert(pageContextInit.urlOriginal);
125
124
  const globalContext = getGlobalContext();
126
- const pageContextInitEnhanced = {
127
- ...pageContextInit,
125
+ const pageContextInitEnhanced = {};
126
+ objectAssign(pageContextInitEnhanced, pageContextInit);
127
+ objectAssign(pageContextInitEnhanced, {
128
128
  _objectCreatedByVike: true,
129
129
  // The following is defined on `pageContext` because we can eventually make these non-global (e.g. sot that two pages can have different includeAssetsImportedByServer settings)
130
130
  _baseServer: globalContext.baseServer,
@@ -141,8 +141,27 @@ function getPageContextInitEnhanced(pageContextInit, renderContext, { urlCompute
141
141
  _urlRewrite: urlRewrite,
142
142
  _urlHandler: urlHandler,
143
143
  isClientSideNavigation
144
- };
145
- addUrlComputedProps(pageContextInitEnhanced, !urlComputedPropsNonEnumerable);
144
+ });
145
+ // pageContext.urlParsed
146
+ const pageContextUrlComputed = getPageContextUrlComputed(pageContextInitEnhanced);
147
+ objectAssign(pageContextInitEnhanced, pageContextUrlComputed);
148
+ // pageContext.headers
149
+ {
150
+ let headers;
151
+ if (pageContextInit.headersOriginal) {
152
+ headers = normalizeHeaders(pageContextInit.headersOriginal);
153
+ assertUsage(!('headers' in pageContextInit), "You're defining pageContextInit.headersOriginal as well as pageContextInit.headers but you should only define pageContextInit.headersOriginal instead, see https://vike.dev/headers");
154
+ }
155
+ else if (pageContextInit.headers) {
156
+ headers = pageContextInit.headers;
157
+ // TODO/next-major-release: assertUsage() instead of assertWarning()
158
+ assertWarning(false, 'Setting pageContextInit.headers is deprecated: set pageContextInit.headersOriginal instead, see https://vike.dev/headers', { onlyOnce: true });
159
+ }
160
+ else {
161
+ headers = null;
162
+ }
163
+ objectAssign(pageContextInitEnhanced, { headers });
164
+ }
146
165
  return pageContextInitEnhanced;
147
166
  }
148
167
  // TODO: remove getRenderContext() in favor of getGlobalObject() + reloadGlobalContext()
@@ -151,7 +170,8 @@ async function getRenderContext() {
151
170
  const globalContext = getGlobalContext();
152
171
  const { pageFilesAll, allPageIds, pageConfigs, pageConfigGlobal } = await getPageFilesAll(false, globalContext.isProduction);
153
172
  const { pageRoutes, onBeforeRouteHook } = await loadPageRoutes(pageFilesAll, pageConfigs, pageConfigGlobal, allPageIds);
154
- assertV1Design(pageFilesAll.length > 0, pageConfigs, pageFilesAll);
173
+ // We assume assertV1Design() was already called at build-time
174
+ assert(pageFilesAll.length === 0 || pageConfigs.length === 0);
155
175
  const renderContext = {
156
176
  pageFilesAll: pageFilesAll,
157
177
  pageConfigs,
@@ -199,7 +199,7 @@ function logHttpRequest(urlOriginal, httpRequestId) {
199
199
  logRuntimeInfo?.(getRequestInfoMessage(urlOriginal), httpRequestId, 'info', clearErrors);
200
200
  }
201
201
  function getRequestInfoMessage(urlOriginal) {
202
- return `HTTP request: ${pc.bold(urlOriginal)}`;
202
+ return `HTTP request: ${prettyUrl(urlOriginal)}`;
203
203
  }
204
204
  function logHttpResponse(urlOriginal, httpRequestId, pageContextReturn) {
205
205
  const statusCode = pageContextReturn.httpResponse?.statusCode ?? null;
@@ -215,7 +215,7 @@ function logHttpResponse(urlOriginal, httpRequestId, pageContextReturn) {
215
215
  // - We should show `HTTP response ${urlOriginal} ERR` instead.
216
216
  // - Maybe we can/should make the error available at pageContext.errorWhileRendering
217
217
  assert(errorWhileRendering === null || errorWhileRendering === undefined);
218
- msg = `HTTP response ${pc.bold(urlOriginal)} ${pc.dim('null')}`;
218
+ msg = `HTTP response ${prettyUrl(urlOriginal)} ${pc.dim('null')}`;
219
219
  // Erroneous value (it shoud sometimes be `false`) but it's fine as it doesn't seem to have much of an impact.
220
220
  isNominal = true;
221
221
  }
@@ -235,7 +235,7 @@ function logHttpResponse(urlOriginal, httpRequestId, pageContextReturn) {
235
235
  const urlRedirect = headerRedirect[1];
236
236
  urlOriginal = urlRedirect;
237
237
  }
238
- msg = `HTTP ${type} ${pc.bold(urlOriginal)} ${color(statusCode ?? 'ERR')}`;
238
+ msg = `HTTP ${type} ${prettyUrl(urlOriginal)} ${color(statusCode ?? 'ERR')}`;
239
239
  }
240
240
  }
241
241
  logRuntimeInfo?.(msg, httpRequestId, isNominal ? 'info' : 'error');
@@ -283,12 +283,13 @@ async function renderPageNominal(pageContext) {
283
283
  async function getPageContextErrorPageInit(pageContextInit, errNominalPage, pageContextNominalPagePartial, renderContext, httpRequestId) {
284
284
  const pageContextInitEnhanced = getPageContextInitEnhancedSSR(pageContextInit, renderContext, null, httpRequestId);
285
285
  assert(errNominalPage);
286
- const pageContext = {
287
- ...pageContextInitEnhanced,
286
+ const pageContext = {};
287
+ objectAssign(pageContext, pageContextInitEnhanced);
288
+ objectAssign(pageContext, {
288
289
  is404: false,
289
290
  errorWhileRendering: errNominalPage,
290
291
  routeParams: {}
291
- };
292
+ });
292
293
  objectAssign(pageContext, {
293
294
  _debugRouteMatches: pageContextNominalPagePartial._debugRouteMatches || 'ROUTING_ERROR'
294
295
  });
@@ -340,7 +341,9 @@ function normalizeUrl(pageContextInit, httpRequestId) {
340
341
  return null;
341
342
  logRuntimeInfo?.(`URL normalized from ${pc.cyan(urlOriginal)} to ${pc.cyan(urlNormalized)} (https://vike.dev/url-normalization)`, httpRequestId, 'info');
342
343
  const httpResponse = createHttpResponseObjectRedirect({ url: urlNormalized, statusCode: 301 }, pageContextInit.urlOriginal);
343
- const pageContextHttpResponse = { ...pageContextInit, httpResponse };
344
+ const pageContextHttpResponse = {};
345
+ objectAssign(pageContextHttpResponse, pageContextInit);
346
+ objectAssign(pageContextHttpResponse, { httpResponse });
344
347
  return pageContextHttpResponse;
345
348
  }
346
349
  function getPermanentRedirect(pageContextInit, httpRequestId) {
@@ -375,7 +378,9 @@ function getPermanentRedirect(pageContextInit, httpRequestId) {
375
378
  }
376
379
  logRuntimeInfo?.(`Permanent redirect defined by your config.redirects (https://vike.dev/redirects)`, httpRequestId, 'info');
377
380
  const httpResponse = createHttpResponseObjectRedirect({ url: urlTarget, statusCode: 301 }, urlWithoutBase);
378
- const pageContextHttpResponse = { ...pageContextInit, httpResponse };
381
+ const pageContextHttpResponse = {};
382
+ objectAssign(pageContextHttpResponse, pageContextInit);
383
+ objectAssign(pageContextHttpResponse, { httpResponse });
379
384
  return pageContextHttpResponse;
380
385
  }
381
386
  async function handleAbortError(errAbort, pageContextsFromRewrite, pageContextInit,
@@ -391,11 +396,11 @@ pageContextNominalPageInit, httpRequestId, renderContext, pageContextErrorPageIn
391
396
  assert(abortCall);
392
397
  assertUsage(errorPageId, `You called ${pc.cyan(abortCall)} but you didn't define an error page, make sure to define one https://vike.dev/error-page`);
393
398
  const pageContext = {
394
- _pageId: errorPageId,
395
- ...pageContextAbort,
396
- ...pageContextErrorPageInit,
397
- ...renderContext
399
+ _pageId: errorPageId
398
400
  };
401
+ objectAssign(pageContext, pageContextAbort);
402
+ objectAssign(pageContext, pageContextErrorPageInit);
403
+ objectAssign(pageContext, renderContext);
399
404
  objectAssign(pageContext, await loadUserFilesServerSide(pageContext));
400
405
  // We include pageContextInit: we don't only serialize pageContextAbort because the error page may need to access pageContextInit
401
406
  pageContextSerialized = serializePageContextClientSide(pageContext);
@@ -416,10 +421,9 @@ pageContextNominalPageInit, httpRequestId, renderContext, pageContextErrorPageIn
416
421
  return { pageContextReturn };
417
422
  }
418
423
  if (pageContextAbort._urlRedirect) {
419
- const pageContextReturn = {
420
- ...pageContextInit,
421
- ...pageContextAbort
422
- };
424
+ const pageContextReturn = {};
425
+ objectAssign(pageContextReturn, pageContextInit);
426
+ objectAssign(pageContextReturn, pageContextAbort);
423
427
  const httpResponse = createHttpResponseObjectRedirect(pageContextAbort._urlRedirect, (() => {
424
428
  const { pathname, searchOriginal } = pageContextNominalPageInit.urlParsed;
425
429
  const urlLogical = createUrlFromComponents(null, pathname, searchOriginal,
@@ -439,9 +443,12 @@ function checkBaseUrl(pageContextInit, httpRequestId) {
439
443
  const { urlWithoutPageContextRequestSuffix } = handlePageContextRequestUrl(urlOriginal);
440
444
  const { hasBaseServer } = parseUrl(urlWithoutPageContextRequestSuffix, baseServer);
441
445
  if (!hasBaseServer) {
442
- logRuntimeInfo?.(`${getRequestInfoMessage(urlOriginal)} skipped because URL ${pc.bold(urlOriginal)} doesn't start with Base URL ${pc.bold(baseServer)} (https://vike.dev/base-url)`, httpRequestId, 'info');
446
+ logRuntimeInfo?.(`${getRequestInfoMessage(urlOriginal)} skipped because URL ${prettyUrl(urlOriginal)} doesn't start with Base URL ${prettyUrl(baseServer)} (https://vike.dev/base-url)`, httpRequestId, 'info');
443
447
  const pageContextHttpResponseNull = getPageContextHttpResponseNull(pageContextInit);
444
448
  return pageContextHttpResponseNull;
445
449
  }
446
450
  return null;
447
451
  }
452
+ function prettyUrl(url) {
453
+ return pc.bold(decodeURI(url));
454
+ }
@@ -49,3 +49,5 @@ export * from '../../utils/truncateString.js';
49
49
  export * from '../../utils/formatHintLog.js';
50
50
  export * from '../../utils/joinEnglish.js';
51
51
  export * from '../../utils/isArrayOfStrings.js';
52
+ export * from '../../utils/escapeHtml.js';
53
+ export * from '../../utils/normalizeHeaders.js';
@@ -52,3 +52,5 @@ export * from '../../utils/truncateString.js';
52
52
  export * from '../../utils/formatHintLog.js';
53
53
  export * from '../../utils/joinEnglish.js';
54
54
  export * from '../../utils/isArrayOfStrings.js';
55
+ export * from '../../utils/escapeHtml.js';
56
+ export * from '../../utils/normalizeHeaders.js';
@@ -1,4 +1,4 @@
1
1
  export { assertV1Design };
2
2
  import { PageFile } from '../../shared/getPageFiles.js';
3
- import type { PageConfigBuildTime, PageConfigRuntime } from '../../shared/page-configs/PageConfig.js';
4
- declare function assertV1Design(isOldDesign: boolean, pageConfigs: (PageConfigRuntime | PageConfigBuildTime)[], pageFilesAll?: PageFile[]): void;
3
+ import type { PageConfigBuildTime } from '../../shared/page-configs/PageConfig.js';
4
+ declare function assertV1Design(isOldDesign: boolean, pageConfigs: PageConfigBuildTime[], pageFilesAll?: PageFile[]): void;
@@ -1,5 +1,4 @@
1
1
  export { assertV1Design };
2
- import { getConfigValueFilePathToShowToUser } from '../../shared/page-configs/helpers.js';
3
2
  import { assert, assertUsage, assertWarning, isNotNullish, unique } from './utils.js';
4
3
  function assertV1Design(isOldDesign, pageConfigs, pageFilesAll) {
5
4
  const isV1Design = pageConfigs.length > 0;
@@ -9,10 +8,10 @@ function assertV1Design(isOldDesign, pageConfigs, pageFilesAll) {
9
8
  assert(pageFilesAll.length > 0);
10
9
  const indent = '- ';
11
10
  const filesV1 = unique(pageConfigs
12
- .map((p) => Object.values(p.configValues)
13
- .map((c) => getConfigValueFilePathToShowToUser(c.definedAtData))
11
+ .map((p) => Object.values(p.configValueSources).map((sources) => sources
12
+ .map((c) => c.definedAtFilePath.filePathAbsoluteUserRootDir)
14
13
  .filter(isNotNullish)
15
- .map((filePathToShowToUser) => indent + filePathToShowToUser))
14
+ .map((filePathToShowToUser) => indent + filePathToShowToUser)))
16
15
  .flat(2));
17
16
  const filesOld = pageFilesAll.map((p) => indent + p.filePath);
18
17
  lines.push(...['V1 design files:', ...filesV1, 'Old design files:', ...filesOld]);
@@ -9,6 +9,7 @@ declare global {
9
9
  * - You can refine the type of `Config['Page']`.
10
10
  * - You can define the type of custom configurations created with `config.meta` (https://vike.dev/meta)
11
11
  *
12
+ * https://vike.dev/meta#typescript
12
13
  */
13
14
  interface Config {
14
15
  }
@@ -22,6 +23,14 @@ declare global {
22
23
  */
23
24
  interface PageContext {
24
25
  }
26
+ /** Refine the `pageContext.config` type.
27
+ *
28
+ * It's used for cumulative configs: the `pageContext.config[configName]` type is an `array` whereas `Config[configName]` isn't.
29
+ *
30
+ * https://vike.dev/meta#typescript
31
+ */
32
+ interface ConfigResolved {
33
+ }
25
34
  }
26
35
  /** This namespace is only used by:
27
36
  * - `vike-react`
@@ -0,0 +1 @@
1
+ export { getPageContext } from './hooks/executeHook.js';
@@ -0,0 +1 @@
1
+ export { getPageContext } from './hooks/executeHook.js';
@@ -1,9 +1,9 @@
1
- export { addUrlComputedProps };
2
- export { assertPageContextUrlComputedProps };
3
- export type { PageContextUrlComputedPropsInternal };
4
- export type { PageContextUrlComputedPropsClient };
5
- export type { PageContextUrlComputedPropsServer };
6
- export type { PageContextUrlSources };
1
+ export { getPageContextUrlComputed };
2
+ export { assertPageContextUrl };
3
+ export type { PageContextUrlInternal };
4
+ export type { PageContextUrlClient };
5
+ export type { PageContextUrlServer };
6
+ export type { PageContextUrlSource };
7
7
  export type { Url };
8
8
  type Url = {
9
9
  /** The URL origin, e.g. `https://example.com` of `https://example.com/product/42?details=yes#reviews` */
@@ -27,23 +27,24 @@ type Url = {
27
27
  /** @deprecated */
28
28
  searchString: null | string;
29
29
  };
30
- type PageContextUrlComputedPropsClient = {
30
+ type PageContextUrlComputed = {
31
+ /** Parsed information about the current URL */
32
+ urlParsed: Url;
33
+ /** The URL pathname, e.g. `/product/42` of `https://example.com/product/42?details=yes#reviews` */
34
+ urlPathname: string;
31
35
  /** @deprecated */
32
36
  url: string;
37
+ };
38
+ type PageContextUrl = {
33
39
  /** The URL of the HTTP request */
34
40
  urlOriginal: string;
35
- /** The URL pathname, e.g. `/product/42` of `https://example.com/product/42?details=yes#reviews` */
36
- urlPathname: string;
37
- /** Parsed information about the current URL */
38
- urlParsed: Url;
39
- };
40
- /** For Vike internal use */
41
- type PageContextUrlComputedPropsInternal = PageContextUrlComputedPropsClient & {
41
+ } & PageContextUrlComputed;
42
+ type PageContextUrlInternal = PageContextUrl & {
42
43
  _urlRewrite: string | null;
43
44
  };
44
- type HashProps = 'hash' | 'hashString' | 'hashOriginal';
45
- type PageContextUrlComputedPropsServer = PageContextUrlComputedPropsClient & {
46
- urlParsed: Omit<PageContextUrlComputedPropsClient['urlParsed'], HashProps> & {
45
+ type PageContextUrlClient = PageContextUrl;
46
+ type PageContextUrlServer = PageContextUrl & {
47
+ urlParsed: Omit<PageContextUrl['urlParsed'], HashProps> & {
47
48
  /** Only available on the client-side */
48
49
  hash: '';
49
50
  /** Only available on the client-side */
@@ -52,14 +53,15 @@ type PageContextUrlComputedPropsServer = PageContextUrlComputedPropsClient & {
52
53
  hashOriginal: null;
53
54
  };
54
55
  };
55
- declare function addUrlComputedProps<PageContext extends Record<string, unknown> & PageContextUrlSources>(pageContext: PageContext, enumerable?: boolean): asserts pageContext is PageContext & PageContextUrlComputedPropsInternal;
56
- type PageContextUrlSources = {
56
+ type HashProps = 'hash' | 'hashString' | 'hashOriginal';
57
+ declare function getPageContextUrlComputed(pageContext: PageContextUrlSource): PageContextUrlComputed;
58
+ type PageContextUrlSource = {
57
59
  urlOriginal: string;
58
60
  urlLogical?: string;
59
61
  _urlRewrite: string | null;
60
62
  _baseServer: string;
61
63
  _urlHandler: null | ((url: string) => string);
62
64
  };
63
- declare function assertPageContextUrlComputedProps(pageContext: {
65
+ declare function assertPageContextUrl(pageContext: {
64
66
  urlOriginal: string;
65
- } & PageContextUrlComputedPropsClient): void;
67
+ } & PageContextUrlClient): void;
@@ -1,45 +1,31 @@
1
- // URLs props need to be computed props, because the user can modify the URL e.g. with onBeforeRoute() for i18n
2
- export { addUrlComputedProps };
3
- export { assertPageContextUrlComputedProps };
4
- import { assert, parseUrl, assertWarning, isPlainObject, isPropertyGetter, isBrowser } from './utils.js';
5
- function addUrlComputedProps(pageContext, enumerable = true) {
6
- assert(pageContext.urlOriginal);
7
- if ('urlPathname' in pageContext) {
8
- assert(typeof pageContext.urlPathname === 'string');
9
- /* If the following assert() fails then it's most likely because Object.assign() was used instead of objectAssign(), i.e.:
10
- ```js
11
- // Add property getters such as pageContext.urlPathname to pageContext
12
- addUrlComputedProps(pageContext)
13
- // ❌ Breaks the property getters of pageContext set by addUrlComputedProps() such as pageContext.urlPathname
14
- Object.assign(pageContext2, pageContext)
15
- // ❌ Also breaks the property getters
16
- const pageContext3 = { ...pageContext }
17
- // ✅ Preserves property getters of pageContext (see objectAssign() implementation)
18
- objectAssign(pageContext2, pageContext)
19
- ```
20
- */
21
- assert(isPropertyGetter(pageContext, 'urlPathname'));
22
- }
23
- if ('urlParsed' in pageContext)
24
- assert(isPropertyGetter(pageContext, 'urlParsed'));
25
- // TODO/v1-release: move pageContext.urlParsed to pageContext.url
26
- if ('url' in pageContext)
27
- assert(isPropertyGetter(pageContext, 'url'));
28
- Object.defineProperty(pageContext, 'urlPathname', {
1
+ export { getPageContextUrlComputed };
2
+ export { assertPageContextUrl };
3
+ // =====================
4
+ // File determining the URL logic.
5
+ // URLs need to be computed, because the user can modify the URL e.g. with onBeforeRoute() for i18n.
6
+ // =====================
7
+ import { objectDefineProperty } from '../utils/objectDefineProperty.js';
8
+ import { assert, parseUrl, assertWarning, isPlainObject, isPropertyGetter, isBrowser, changeEnumerable } from './utils.js';
9
+ function getPageContextUrlComputed(pageContext) {
10
+ assert(typeof pageContext.urlOriginal === 'string');
11
+ assertPageContextUrlComputed(pageContext);
12
+ const pageContextUrlComputed = {};
13
+ objectDefineProperty(pageContextUrlComputed, 'urlPathname', {
29
14
  get: urlPathnameGetter,
30
- enumerable,
15
+ enumerable: true,
31
16
  configurable: true
32
17
  });
33
- Object.defineProperty(pageContext, 'url', {
18
+ objectDefineProperty(pageContextUrlComputed, 'url', {
34
19
  get: urlGetter,
35
20
  enumerable: false,
36
21
  configurable: true
37
22
  });
38
- Object.defineProperty(pageContext, 'urlParsed', {
23
+ objectDefineProperty(pageContextUrlComputed, 'urlParsed', {
39
24
  get: urlParsedGetter,
40
- enumerable,
25
+ enumerable: true,
41
26
  configurable: true
42
27
  });
28
+ return pageContextUrlComputed;
43
29
  }
44
30
  function getUrlParsed(pageContext) {
45
31
  // We need a url handler function because the onBeforeRoute() hook may set pageContext.urlLogical (typically for i18n)
@@ -90,7 +76,7 @@ function urlParsedGetter() {
90
76
  const { origin, pathname, pathnameOriginal, search, searchAll, searchOriginal, hash, hashOriginal } = urlParsedOriginal;
91
77
  const hashIsAvailable = isBrowser();
92
78
  const warnHashNotAvailable = (prop) => {
93
- assertWarning(hashIsAvailable, `pageContext.urlParsed.${prop} isn't available on the server-side (HTTP requests don't include the URL hash by design)`, { onlyOnce: true, showStackTrace: true });
79
+ assertWarning(hashIsAvailable, `pageContext.urlParsed.${prop} isn't available on the server-side (HTTP requests don't include the URL hash)`, { onlyOnce: true, showStackTrace: true });
94
80
  };
95
81
  const urlParsed = {
96
82
  origin,
@@ -120,21 +106,45 @@ function urlParsedGetter() {
120
106
  return searchOriginal;
121
107
  }
122
108
  };
123
- makeNonEnumerable(urlParsed, 'hashString');
124
- makeNonEnumerable(urlParsed, 'searchString');
109
+ changeEnumerable(urlParsed, 'hashString', false);
110
+ changeEnumerable(urlParsed, 'searchString', false);
125
111
  if (!hashIsAvailable) {
126
- makeNonEnumerable(urlParsed, 'hash');
127
- makeNonEnumerable(urlParsed, 'hashOriginal');
112
+ changeEnumerable(urlParsed, 'hash', false);
113
+ changeEnumerable(urlParsed, 'hashOriginal', false);
128
114
  }
129
115
  return urlParsed;
130
116
  }
131
- function makeNonEnumerable(obj, prop) {
132
- const descriptor = Object.getOwnPropertyDescriptor(obj, prop);
133
- Object.defineProperty(obj, prop, { ...descriptor, enumerable: false });
134
- }
135
- function assertPageContextUrlComputedProps(pageContext) {
117
+ function assertPageContextUrl(pageContext) {
136
118
  assert(typeof pageContext.urlOriginal === 'string');
137
119
  assert(typeof pageContext.urlPathname === 'string');
138
120
  assert(isPlainObject(pageContext.urlParsed));
139
121
  assert(pageContext.urlPathname === pageContext.urlParsed.pathname);
122
+ assertPageContextUrlComputed(pageContext);
123
+ }
124
+ function assertPageContextUrlComputed(pageContext) {
125
+ /*
126
+ If the isPropertyGetter() assertions fail then it's most likely because Object.assign() was used instead of `objectAssign()`:
127
+ ```js
128
+ const PageContextUrlComputed = getPageContextUrlComputed(pageContext)
129
+
130
+ // ❌ Breaks the property descriptors/getters of pageContext defined by getPageContextUrlComputed() such as pageContext.urlPathname
131
+ Object.assign(pageContext, pageContextUrlComputed)
132
+
133
+ // ❌ Also breaks property descriptors/getters
134
+ const pageContext = { ...pageContextUrlComputed }
135
+
136
+ // ✅ Preserves property descriptors/getters (see objectAssign() implementation)
137
+ objectAssign(pageContext, pageContextUrlComputed)
138
+ ```
139
+ */
140
+ if ('urlPathname' in pageContext) {
141
+ assert(typeof pageContext.urlPathname === 'string');
142
+ assert(isPropertyGetter(pageContext, 'urlPathname'));
143
+ assert(isPropertyGetter(pageContext, 'urlParsed'));
144
+ assert(isPropertyGetter(pageContext, 'url'));
145
+ }
146
+ else {
147
+ assert(!('urlParsed' in pageContext));
148
+ assert(!('url' in pageContext));
149
+ }
140
150
  }
@@ -1,11 +1,11 @@
1
1
  export { analyzeClientSide };
2
- import { getConfigValue } from '../page-configs/getConfigValue.js';
2
+ import { getConfigValueRuntime } from '../page-configs/getConfigValue.js';
3
3
  import { analyzePageClientSide } from './analyzePageClientSide.js';
4
4
  function analyzeClientSide(pageConfig, pageFilesAll, pageId) {
5
5
  // V1 design
6
6
  if (pageConfig) {
7
- const isClientRouting = getConfigValue(pageConfig, 'clientRouting', 'boolean')?.value ?? false;
8
- const isClientSideRenderable = getConfigValue(pageConfig, 'isClientSideRenderable', 'boolean')?.value ?? false;
7
+ const isClientRouting = getConfigValueRuntime(pageConfig, 'clientRouting', 'boolean')?.value ?? false;
8
+ const isClientSideRenderable = getConfigValueRuntime(pageConfig, 'isClientSideRenderable', 'boolean')?.value ?? false;
9
9
  return { isClientSideRenderable, isClientRouting };
10
10
  }
11
11
  else {
@@ -2,6 +2,9 @@ export { getPageContextExports };
2
2
  export type { ExportsAll };
3
3
  export type { PageContextExports };
4
4
  export type { ConfigEntries };
5
+ export type { From };
6
+ export type { Sources };
7
+ export type { Source };
5
8
  import type { FileType } from './fileTypes.js';
6
9
  import type { PageConfigRuntimeLoaded } from './../page-configs/PageConfig.js';
7
10
  import type { PageFile } from './getPageFileObject.js';
@@ -27,6 +30,9 @@ type ConfigEntries = Record<string, {
27
30
  configDefinedByFile: string | null;
28
31
  }[]>;
29
32
  type PageContextExports = {
33
+ source: Source;
34
+ sources: Sources;
35
+ from: From;
30
36
  config: Record<string, unknown>;
31
37
  configEntries: ConfigEntries;
32
38
  exports: Record<string, unknown>;
@@ -34,4 +40,34 @@ type PageContextExports = {
34
40
  /** @deprecated */
35
41
  pageExports: Record<string, unknown>;
36
42
  };
43
+ type From = {
44
+ configsStandard: Record<string, // configName
45
+ SourceConfigsStandard>;
46
+ configsCumulative: Record<string, // configName
47
+ SourceConfigsCumulative>;
48
+ configsComputed: Record<string, // configName
49
+ SourceConfigsComputed>;
50
+ };
51
+ type Source = Record<string, // configName
52
+ SourceAny>;
53
+ type Sources = Record<string, // configName
54
+ SourceAny[]>;
55
+ type SourceAny = SourceConfigs;
56
+ type SourceConfigs = SourceConfigsStandard | SourceConfigsCumulative | SourceConfigsComputed;
57
+ type SourceConfigsStandard = {
58
+ type: 'configsStandard';
59
+ value: unknown;
60
+ definedAt: string;
61
+ };
62
+ type SourceConfigsCumulative = {
63
+ type: 'configsCumulative';
64
+ values: {
65
+ value: unknown;
66
+ definedAt: string;
67
+ }[];
68
+ };
69
+ type SourceConfigsComputed = {
70
+ type: 'configsComputed';
71
+ value: unknown;
72
+ };
37
73
  declare function getPageContextExports(pageFiles: PageFile[], pageConfig: PageConfigRuntimeLoaded | null): PageContextExports;
@@ -2,7 +2,7 @@ export { getPageContextExports };
2
2
  import { isScriptFile, isTemplateFile } from '../../utils/isScriptFile.js';
3
3
  import { assert, isObject, assertWarning, assertUsage, makeLast, isBrowser } from '../utils.js';
4
4
  import { assertDefaultExports, forbiddenDefaultExports } from './assert_exports_old_design.js';
5
- import { getConfigDefinedAtOptional } from '../page-configs/getConfigDefinedAt.js';
5
+ import { getConfigDefinedAtOptional, getDefinedAtString } from '../page-configs/getConfigDefinedAt.js';
6
6
  import { getConfigValueFilePathToShowToUser } from '../page-configs/helpers.js';
7
7
  import pc from '@brillout/picocolors';
8
8
  function getPageContextExports(pageFiles, pageConfig) {
@@ -27,6 +27,18 @@ function getPageContextExports(pageFiles, pageConfig) {
27
27
  });
28
28
  });
29
29
  // V1 design
30
+ const source = {};
31
+ const sources = {};
32
+ const addSrc = (src, configName) => {
33
+ source[configName] = src;
34
+ sources[configName] ?? (sources[configName] = []);
35
+ sources[configName].push(src);
36
+ };
37
+ const from = {
38
+ configsStandard: {},
39
+ configsCumulative: {},
40
+ configsComputed: {}
41
+ };
30
42
  if (pageConfig) {
31
43
  Object.entries(pageConfig.configValues).forEach(([configName, configValue]) => {
32
44
  const { value } = configValue;
@@ -41,6 +53,39 @@ function getPageContextExports(pageFiles, pageConfig) {
41
53
  configDefinedAt,
42
54
  configDefinedByFile: configValueFilePathToShowToUser
43
55
  });
56
+ if (configValue.type === 'standard') {
57
+ const src = {
58
+ type: 'configsStandard',
59
+ value: configValue.value,
60
+ definedAt: getDefinedAtString(configValue.definedAtData, configName)
61
+ };
62
+ addSrc(src, configName);
63
+ from.configsStandard[configName] = src;
64
+ }
65
+ if (configValue.type === 'cumulative') {
66
+ const src = {
67
+ type: 'configsCumulative',
68
+ values: configValue.value.map((value, i) => {
69
+ const definedAtFile = configValue.definedAtData[i];
70
+ assert(definedAtFile);
71
+ const definedAt = getDefinedAtString(definedAtFile, configName);
72
+ return {
73
+ value,
74
+ definedAt
75
+ };
76
+ })
77
+ };
78
+ addSrc(src, configName);
79
+ from.configsCumulative[configName] = src;
80
+ }
81
+ if (configValue.type === 'computed') {
82
+ const src = {
83
+ type: 'configsComputed',
84
+ value: configValue.value
85
+ };
86
+ addSrc(src, configName);
87
+ from.configsComputed[configName] = src;
88
+ }
44
89
  // TODO/v1-release: remove
45
90
  const exportName = configName;
46
91
  exportsAll[exportName] = exportsAll[exportName] ?? [];
@@ -70,9 +115,12 @@ function getPageContextExports(pageFiles, pageConfig) {
70
115
  assert(!('default' in exports));
71
116
  assert(!('default' in exportsAll));
72
117
  const pageContextExports = {
118
+ from,
119
+ source,
120
+ sources,
121
+ // TODO/eventually: deprecate/remove every prop below
73
122
  config,
74
123
  configEntries,
75
- // TODO/v1-release: remove
76
124
  exports,
77
125
  exportsAll,
78
126
  pageExports