vike 0.4.223 → 0.4.224-commit-f0d0f8a

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 (173) hide show
  1. package/dist/cjs/node/api/build.js +4 -37
  2. package/dist/cjs/node/api/prepareViteApiCall.js +9 -3
  3. package/dist/cjs/node/plugin/index.js +8 -20
  4. package/dist/cjs/node/plugin/plugins/baseUrls.js +3 -1
  5. package/dist/cjs/node/plugin/plugins/{buildConfig/fixServerAssets.js → build/handleAssetsManifest.js} +130 -52
  6. package/dist/cjs/node/plugin/plugins/build/pluginAutoFullBuild.js +145 -0
  7. package/dist/cjs/node/plugin/plugins/build/pluginBuildApp.js +52 -0
  8. package/dist/cjs/node/plugin/plugins/{buildConfig.js → build/pluginBuildConfig.js} +22 -84
  9. package/dist/cjs/node/plugin/plugins/{buildEntry/index.js → build/pluginBuildEntry.js} +9 -9
  10. package/dist/cjs/node/plugin/plugins/{distFileNames.js → build/pluginDistFileNames.js} +7 -7
  11. package/dist/cjs/node/plugin/plugins/{packageJsonFile.js → build/pluginDistPackageJsonFile.js} +6 -6
  12. package/dist/cjs/node/plugin/plugins/{suppressRollupWarning.js → build/pluginSuppressRollupWarning.js} +3 -3
  13. package/dist/cjs/node/plugin/plugins/build.js +21 -0
  14. package/dist/cjs/node/plugin/plugins/commonConfig.js +22 -4
  15. package/dist/cjs/node/plugin/plugins/devConfig/determineFsAllowList.js +1 -1
  16. package/dist/cjs/node/plugin/plugins/devConfig/determineOptimizeDeps.js +5 -5
  17. package/dist/cjs/node/plugin/plugins/devConfig/index.js +1 -1
  18. package/dist/cjs/node/plugin/plugins/envVars.js +2 -2
  19. package/dist/cjs/node/plugin/plugins/extractAssetsPlugin.js +9 -9
  20. package/dist/cjs/node/plugin/plugins/extractExportNamesPlugin.js +2 -2
  21. package/dist/cjs/node/plugin/plugins/fileEnv.js +5 -2
  22. package/dist/cjs/node/plugin/plugins/importUserCode/getVirtualFileImportUserCode.js +3 -3
  23. package/dist/cjs/node/plugin/plugins/importUserCode/index.js +2 -5
  24. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/assertExtensions.js +5 -5
  25. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/configDefinitionsBuiltIn.js +7 -2
  26. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/crawlPlusFiles/ignorePatternsBuiltIn.js +16 -0
  27. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/crawlPlusFiles.js +50 -64
  28. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/filesystemRouting.js +2 -1
  29. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/getPlusFilesAll.js +3 -3
  30. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/transpileAndExecuteFile.js +19 -7
  31. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig.js +277 -212
  32. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/virtual-files/getVirtualFilePageConfigValuesAll.js +4 -4
  33. package/dist/cjs/node/plugin/plugins/previewConfig.js +12 -7
  34. package/dist/cjs/node/plugin/shared/addSsrMiddleware.js +5 -1
  35. package/dist/cjs/node/plugin/shared/findPageFiles.js +3 -3
  36. package/dist/cjs/node/plugin/shared/getOutDirs.js +8 -7
  37. package/dist/cjs/node/plugin/shared/isViteServerBuild.js +47 -0
  38. package/dist/cjs/node/plugin/shared/resolveClientEntriesDev.js +1 -1
  39. package/dist/cjs/node/plugin/utils.js +1 -0
  40. package/dist/cjs/node/prerender/context.js +3 -8
  41. package/dist/cjs/node/prerender/resolvePrerenderConfig.js +30 -21
  42. package/dist/cjs/node/prerender/runPrerender.js +28 -30
  43. package/dist/cjs/node/prerender/utils.js +1 -0
  44. package/dist/cjs/node/runtime/html/stream.js +7 -0
  45. package/dist/cjs/node/runtime/renderPage/logErrorHint.js +13 -2
  46. package/dist/cjs/shared/getPageContextUrlComputed.js +1 -1
  47. package/dist/cjs/shared/page-configs/getConfigValueBuildTime.js +2 -5
  48. package/dist/cjs/shared/page-configs/serialize/parsePageConfigs.js +3 -1
  49. package/dist/cjs/shared/page-configs/serialize/serializeConfigValues.js +20 -9
  50. package/dist/cjs/utils/PROJECT_VERSION.js +1 -1
  51. package/dist/cjs/utils/debug.js +2 -1
  52. package/dist/cjs/utils/findFile.js +1 -1
  53. package/dist/cjs/utils/findPackageJson.js +1 -1
  54. package/dist/cjs/utils/isFilePathAbsoluteFilesystem.js +10 -4
  55. package/dist/cjs/utils/path.js +1 -0
  56. package/dist/cjs/utils/requireResolve.js +11 -4
  57. package/dist/cjs/utils/sorter.js +0 -3
  58. package/dist/esm/client/client-routing-runtime/index.d.ts +1 -0
  59. package/dist/esm/client/client-routing-runtime/index.js +1 -0
  60. package/dist/esm/client/client-routing-runtime/renderPageClientSide.d.ts +8 -0
  61. package/dist/esm/client/client-routing-runtime/renderPageClientSide.js +10 -1
  62. package/dist/esm/node/api/build.js +4 -4
  63. package/dist/esm/node/api/prepareViteApiCall.js +9 -3
  64. package/dist/esm/node/plugin/index.d.ts +2 -1
  65. package/dist/esm/node/plugin/index.js +4 -17
  66. package/dist/esm/node/plugin/plugins/baseUrls.js +3 -1
  67. package/dist/esm/node/plugin/plugins/build/handleAssetsManifest.d.ts +18 -0
  68. package/dist/esm/node/plugin/plugins/{buildConfig/fixServerAssets.js → build/handleAssetsManifest.js} +131 -53
  69. package/dist/esm/node/plugin/plugins/build/pluginAutoFullBuild.d.ts +5 -0
  70. package/dist/esm/node/plugin/plugins/build/pluginAutoFullBuild.js +140 -0
  71. package/dist/esm/node/plugin/plugins/build/pluginBuildApp.d.ts +3 -0
  72. package/dist/esm/node/plugin/plugins/build/pluginBuildApp.js +50 -0
  73. package/dist/esm/node/plugin/plugins/{buildConfig.d.ts → build/pluginBuildConfig.d.ts} +3 -3
  74. package/dist/esm/node/plugin/plugins/{buildConfig.js → build/pluginBuildConfig.js} +22 -81
  75. package/dist/esm/node/plugin/plugins/build/pluginBuildEntry.d.ts +7 -0
  76. package/dist/esm/node/plugin/plugins/{buildEntry/index.js → build/pluginBuildEntry.js} +9 -9
  77. package/dist/esm/node/plugin/plugins/build/pluginDistFileNames.d.ts +3 -0
  78. package/dist/esm/node/plugin/plugins/{distFileNames.js → build/pluginDistFileNames.js} +7 -7
  79. package/dist/esm/node/plugin/plugins/build/pluginDistPackageJsonFile.d.ts +3 -0
  80. package/dist/esm/node/plugin/plugins/{packageJsonFile.js → build/pluginDistPackageJsonFile.js} +7 -6
  81. package/dist/esm/node/plugin/plugins/build/pluginSuppressRollupWarning.d.ts +3 -0
  82. package/dist/esm/node/plugin/plugins/{suppressRollupWarning.js → build/pluginSuppressRollupWarning.js} +3 -3
  83. package/dist/esm/node/plugin/plugins/build.d.ts +3 -0
  84. package/dist/esm/node/plugin/plugins/build.js +19 -0
  85. package/dist/esm/node/plugin/plugins/commonConfig.d.ts +16 -6
  86. package/dist/esm/node/plugin/plugins/commonConfig.js +22 -4
  87. package/dist/esm/node/plugin/plugins/devConfig/determineFsAllowList.js +1 -1
  88. package/dist/esm/node/plugin/plugins/devConfig/determineOptimizeDeps.js +5 -5
  89. package/dist/esm/node/plugin/plugins/devConfig/index.js +1 -1
  90. package/dist/esm/node/plugin/plugins/envVars.js +2 -2
  91. package/dist/esm/node/plugin/plugins/extractAssetsPlugin.js +10 -10
  92. package/dist/esm/node/plugin/plugins/extractExportNamesPlugin.js +2 -2
  93. package/dist/esm/node/plugin/plugins/fileEnv.js +5 -2
  94. package/dist/esm/node/plugin/plugins/importUserCode/getVirtualFileImportUserCode.js +3 -3
  95. package/dist/esm/node/plugin/plugins/importUserCode/index.js +2 -5
  96. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/assertExtensions.js +5 -5
  97. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/configDefinitionsBuiltIn.js +7 -2
  98. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/crawlPlusFiles/ignorePatternsBuiltIn.d.ts +1 -0
  99. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/crawlPlusFiles/ignorePatternsBuiltIn.js +13 -0
  100. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/crawlPlusFiles.d.ts +1 -1
  101. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/crawlPlusFiles.js +50 -64
  102. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/filesystemRouting.js +2 -1
  103. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/getPlusFilesAll.js +3 -3
  104. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/transpileAndExecuteFile.d.ts +0 -1
  105. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/transpileAndExecuteFile.js +20 -8
  106. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig.d.ts +8 -6
  107. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig.js +279 -214
  108. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/virtual-files/getVirtualFilePageConfigValuesAll.js +4 -4
  109. package/dist/esm/node/plugin/plugins/previewConfig.js +12 -7
  110. package/dist/esm/node/plugin/shared/addSsrMiddleware.d.ts +1 -1
  111. package/dist/esm/node/plugin/shared/addSsrMiddleware.js +5 -1
  112. package/dist/esm/node/plugin/shared/findPageFiles.js +3 -3
  113. package/dist/esm/node/plugin/shared/getHttpRequestAsyncStore.js +1 -3
  114. package/dist/esm/node/plugin/shared/getOutDirs.d.ts +2 -2
  115. package/dist/esm/node/plugin/shared/getOutDirs.js +8 -7
  116. package/dist/esm/node/plugin/shared/isViteServerBuild.d.ts +15 -0
  117. package/dist/esm/node/plugin/shared/isViteServerBuild.js +45 -0
  118. package/dist/esm/node/plugin/shared/resolveClientEntriesDev.js +1 -1
  119. package/dist/esm/node/plugin/utils.d.ts +1 -0
  120. package/dist/esm/node/plugin/utils.js +1 -0
  121. package/dist/esm/node/prerender/context.d.ts +0 -2
  122. package/dist/esm/node/prerender/context.js +4 -9
  123. package/dist/esm/node/prerender/resolvePrerenderConfig.d.ts +11 -6
  124. package/dist/esm/node/prerender/resolvePrerenderConfig.js +31 -22
  125. package/dist/esm/node/prerender/runPrerender.d.ts +7 -25
  126. package/dist/esm/node/prerender/runPrerender.js +29 -31
  127. package/dist/esm/node/prerender/utils.d.ts +1 -0
  128. package/dist/esm/node/prerender/utils.js +1 -0
  129. package/dist/esm/node/runtime/globalContext.d.ts +3 -2
  130. package/dist/esm/node/runtime/html/stream.js +7 -0
  131. package/dist/esm/node/runtime/renderPage/logErrorHint.js +13 -2
  132. package/dist/esm/node/runtime/renderPage/renderPageAlreadyRouted.d.ts +165 -5
  133. package/dist/esm/shared/getPageContextUrlComputed.js +1 -1
  134. package/dist/esm/shared/page-configs/Config.d.ts +12 -2
  135. package/dist/esm/shared/page-configs/PageConfig.d.ts +5 -5
  136. package/dist/esm/shared/page-configs/getConfigValueBuildTime.js +2 -5
  137. package/dist/esm/shared/page-configs/serialize/parsePageConfigs.js +3 -1
  138. package/dist/esm/shared/page-configs/serialize/serializeConfigValues.d.ts +2 -0
  139. package/dist/esm/shared/page-configs/serialize/serializeConfigValues.js +20 -9
  140. package/dist/esm/types/index.d.ts +2 -0
  141. package/dist/esm/utils/PROJECT_VERSION.d.ts +1 -1
  142. package/dist/esm/utils/PROJECT_VERSION.js +1 -1
  143. package/dist/esm/utils/debug.js +2 -1
  144. package/dist/esm/utils/findFile.js +1 -1
  145. package/dist/esm/utils/findPackageJson.js +1 -1
  146. package/dist/esm/utils/isFilePathAbsoluteFilesystem.js +8 -2
  147. package/dist/esm/utils/path.js +1 -0
  148. package/dist/esm/utils/projectInfo.d.ts +1 -1
  149. package/dist/esm/utils/requireResolve.js +11 -4
  150. package/dist/esm/utils/sorter.d.ts +18 -5
  151. package/dist/esm/utils/sorter.js +0 -3
  152. package/package.json +9 -16
  153. package/dist/cjs/node/plugin/plugins/autoFullBuild.js +0 -119
  154. package/dist/cjs/node/plugin/plugins/buildApp.js +0 -76
  155. package/dist/cjs/node/plugin/plugins/removeRequireHookPlugin.js +0 -17
  156. package/dist/cjs/node/plugin/shared/getFullBuildInlineConfig.js +0 -20
  157. package/dist/cjs/node/plugin/shared/viteIsSSR.js +0 -31
  158. package/dist/esm/node/plugin/plugins/autoFullBuild.d.ts +0 -3
  159. package/dist/esm/node/plugin/plugins/autoFullBuild.js +0 -114
  160. package/dist/esm/node/plugin/plugins/buildApp.d.ts +0 -3
  161. package/dist/esm/node/plugin/plugins/buildApp.js +0 -74
  162. package/dist/esm/node/plugin/plugins/buildConfig/fixServerAssets.d.ts +0 -20
  163. package/dist/esm/node/plugin/plugins/buildEntry/index.d.ts +0 -8
  164. package/dist/esm/node/plugin/plugins/distFileNames.d.ts +0 -3
  165. package/dist/esm/node/plugin/plugins/packageJsonFile.d.ts +0 -3
  166. package/dist/esm/node/plugin/plugins/removeRequireHookPlugin.d.ts +0 -3
  167. package/dist/esm/node/plugin/plugins/removeRequireHookPlugin.js +0 -15
  168. package/dist/esm/node/plugin/plugins/suppressRollupWarning.d.ts +0 -3
  169. package/dist/esm/node/plugin/shared/getFullBuildInlineConfig.d.ts +0 -2
  170. package/dist/esm/node/plugin/shared/getFullBuildInlineConfig.js +0 -17
  171. package/dist/esm/node/plugin/shared/viteIsSSR.d.ts +0 -11
  172. package/dist/esm/node/plugin/shared/viteIsSSR.js +0 -29
  173. package/dist-cjs-fixup.mjs +0 -41
@@ -10,6 +10,7 @@ exports.reloadVikeConfig = reloadVikeConfig;
10
10
  exports.isV1Design = isV1Design;
11
11
  exports.getConfVal = getConfVal;
12
12
  exports.getConfigDefinitionOptional = getConfigDefinitionOptional;
13
+ exports.isOverriden = isOverriden;
13
14
  const utils_js_1 = require("../../../utils.js");
14
15
  const configDefinitionsBuiltIn_js_1 = require("./getVikeConfig/configDefinitionsBuiltIn.js");
15
16
  const filesystemRouting_js_1 = require("./getVikeConfig/filesystemRouting.js");
@@ -73,6 +74,7 @@ async function handleReloadSideEffects() {
73
74
  }
74
75
  }
75
76
  }
77
+ // TODO/soon: predominantly use getVikeConfigPublic() instead of getVikeConfig() then maybe refector?
76
78
  async function getVikeConfig(config, { doNotRestartViteOnError } = {}) {
77
79
  const userRootDir = config.root;
78
80
  const vikeVitePluginOptions = config._vikeVitePluginOptions;
@@ -91,8 +93,9 @@ async function getVikeConfigEntry(userRootDir, isDev, vikeVitePluginOptions, doN
91
93
  }
92
94
  return await vikeConfigPromise;
93
95
  }
94
- async function isV1Design(config) {
95
- const vikeConfig = await getVikeConfig(config);
96
+ function isV1Design(config) {
97
+ const vikeConfig = config._vikeConfigObject;
98
+ (0, utils_js_1.assert)(vikeConfig);
96
99
  const { pageConfigs } = vikeConfig;
97
100
  const isV1Design = pageConfigs.length > 0;
98
101
  return isV1Design;
@@ -146,7 +149,7 @@ async function loadVikeConfig(userRootDir, vikeVitePluginOptions) {
146
149
  const configDefinitionsResolved = await resolveConfigDefinitions(plusFilesAll, userRootDir, esbuildCache);
147
150
  assertKnownConfigs(configDefinitionsResolved, plusFilesAll);
148
151
  const { pageConfigGlobal, pageConfigs } = getPageConfigsBuildTime(configDefinitionsResolved, plusFilesAll, userRootDir);
149
- // interop vike(options) in vite.config.js
152
+ // Backwards compatibility for vike(options) in vite.config.js
150
153
  temp_interopVikeVitePlugin(pageConfigGlobal, vikeVitePluginOptions, userRootDir);
151
154
  // global
152
155
  const pageConfigGlobalValues = getConfigValues(pageConfigGlobal);
@@ -159,16 +162,23 @@ async function loadVikeConfig(userRootDir, vikeVitePluginOptions) {
159
162
  return { pageConfigs, pageConfigGlobal, global, pages };
160
163
  }
161
164
  async function resolveConfigDefinitions(plusFilesAll, userRootDir, esbuildCache) {
165
+ const plusFilesAllOrdered = Object.values(plusFilesAll)
166
+ .flat()
167
+ .sort((plusFile1, plusFile2) => sortAfterInheritanceOrderGlobal(plusFile1, plusFile2, plusFilesAll, null));
162
168
  const configDefinitionsGlobal = getConfigDefinitions(
163
- // We use `plusFilesAll` in order to allow local Vike extensions to create global configs.
164
- sortForGlobal(plusFilesAll), (configDef) => !!configDef.global);
169
+ // We use `plusFilesAll` in order to allow local Vike extensions to create global configs, and to set the value of global configs such as `+vite` (enabling Vike extensions to add Vite plugins).
170
+ plusFilesAllOrdered, (configDef) => !!configDef.global);
165
171
  await loadCustomConfigBuildTimeFiles(plusFilesAll, configDefinitionsGlobal, userRootDir, esbuildCache);
166
172
  const configDefinitionsLocal = {};
167
- await Promise.all((0, utils_js_1.objectEntries)(plusFilesAll).map(async ([locationId, plusFiles]) => {
168
- const plusFilesRelevant = getPlusFilesRelevant(plusFilesAll, locationId);
173
+ await Promise.all((0, utils_js_1.objectEntries)(plusFilesAll).map(async ([locationIdPage, plusFiles]) => {
174
+ const plusFilesRelevant = (0, utils_js_1.objectEntries)(plusFilesAll)
175
+ .filter(([locationId]) => (0, filesystemRouting_js_1.isInherited)(locationId, locationIdPage))
176
+ .map(([, plusFiles]) => plusFiles)
177
+ .flat()
178
+ .sort((plusFile1, plusFile2) => sortAfterInheritanceOrderPage(plusFile1, plusFile2, locationIdPage, null));
169
179
  const configDefinitions = getConfigDefinitions(plusFilesRelevant, (configDef) => configDef.global !== true);
170
180
  await loadCustomConfigBuildTimeFiles(plusFiles, configDefinitions, userRootDir, esbuildCache);
171
- configDefinitionsLocal[locationId] = { configDefinitions, plusFiles, plusFilesRelevant };
181
+ configDefinitionsLocal[locationIdPage] = { configDefinitions, plusFiles, plusFilesRelevant };
172
182
  }));
173
183
  const configDefinitionsResolved = {
174
184
  configDefinitionsGlobal,
@@ -198,12 +208,15 @@ function getPageConfigsBuildTime(configDefinitionsResolved, plusFilesAll, userRo
198
208
  };
199
209
  (0, utils_js_1.objectEntries)(configDefinitionsResolved.configDefinitionsGlobal).forEach(([configName, configDef]) => {
200
210
  const sources = resolveConfigValueSources(configName, configDef,
201
- // We use `plusFilesAll` in order to allow local Vike extensions to set the value of global configs (e.g. `vite`).
202
- sortForGlobal(plusFilesAll), userRootDir, true);
211
+ // We use `plusFilesAll` in order to allow local Vike extensions to create global configs, and to set the value of global configs such as `+vite` (enabling Vike extensions to add Vite plugins).
212
+ Object.values(plusFilesAll).flat(), userRootDir, true);
203
213
  if (sources.length === 0)
204
214
  return;
205
215
  pageConfigGlobal.configValueSources[configName] = sources;
206
216
  });
217
+ applyEffectsMetaEnv(pageConfigGlobal.configValueSources, configDefinitionsResolved.configDefinitionsGlobal);
218
+ applyEffectsConfVal(pageConfigGlobal.configValueSources, configDefinitionsResolved.configDefinitionsGlobal);
219
+ sortConfigValueSources(pageConfigGlobal.configValueSources, null);
207
220
  assertPageConfigGlobal(pageConfigGlobal, plusFilesAll);
208
221
  const pageConfigs = (0, utils_js_1.objectEntries)(configDefinitionsResolved.configDefinitionsLocal)
209
222
  .filter(([_locationId, { plusFiles }]) => isDefiningPage(plusFiles))
@@ -214,13 +227,14 @@ function getPageConfigsBuildTime(configDefinitionsResolved, plusFilesAll, userRo
214
227
  .filter(([_configName, configDef]) => configDef.global !== true)
215
228
  .forEach(([configName, configDef]) => {
216
229
  const sources = resolveConfigValueSources(configName, configDef, plusFilesRelevant, userRootDir, false);
217
- // sortConfigValueSources(sources, locationId)
218
230
  if (sources.length === 0)
219
231
  return;
220
232
  configValueSources[configName] = sources;
221
233
  });
222
234
  const pageConfigRoute = determineRouteFilesystem(locationId, configValueSources);
223
- applyEffectsAll(configValueSources, configDefinitionsLocal);
235
+ applyEffectsMetaEnv(configValueSources, configDefinitionsLocal);
236
+ applyEffectsConfVal(configValueSources, configDefinitionsLocal);
237
+ sortConfigValueSources(configValueSources, locationId);
224
238
  const configValuesComputed = getComputed(configValueSources, configDefinitionsLocal);
225
239
  const pageConfig = {
226
240
  pageId: locationId,
@@ -357,110 +371,122 @@ function temp_interopVikeVitePlugin(pageConfigGlobal, vikeVitePluginOptions, use
357
371
  },
358
372
  locationId: '/',
359
373
  plusFile: null,
360
- isOverriden: configDef.cumulative ? false : sources.length > 0,
361
- valueIsImportedAtRuntime: false,
362
- valueIsDefinedByPlusFile: false
374
+ valueIsLoadedWithImport: false,
375
+ valueIsDefinedByPlusValueFile: false
363
376
  });
364
377
  });
365
378
  }
366
- function getPlusFilesRelevant(plusFilesAll, locationIdPage) {
367
- const plusFilesRelevant = Object.fromEntries((0, utils_js_1.objectEntries)(plusFilesAll)
368
- .filter(([locationId]) => {
369
- return (0, filesystemRouting_js_1.isInherited)(locationId, locationIdPage);
370
- })
371
- // Sort after config inheritance.
372
- // - Together with getPlusFilesOrdered() this implements the whole order of config inheritance.
373
- // - See sortForGlobal() for global configs order.
374
- .sort(([locationId1], [locationId2]) => (0, filesystemRouting_js_1.sortAfterInheritanceOrder)(locationId1, locationId2, locationIdPage)));
375
- return plusFilesRelevant;
376
- }
377
- function sortForGlobal(plusFilesAll) {
378
- const plusFilesAllSorted = Object.fromEntries((0, utils_js_1.objectEntries)(plusFilesAll)
379
- .sort((0, utils_js_1.lowerFirst)(([locationId]) => locationId.split('/').length))
380
- .sort((0, utils_js_1.makeFirst)(([locationId]) => isGlobalLocation(locationId, plusFilesAll))));
381
- return plusFilesAllSorted;
379
+ function sortConfigValueSources(configValueSources, locationIdPage) {
380
+ Object.entries(configValueSources).forEach(([configName, sources]) => {
381
+ sources
382
+ .sort((source1, source2) => {
383
+ if (!source1.plusFile || !source2.plusFile)
384
+ return 0;
385
+ const isGlobal = !locationIdPage;
386
+ if (isGlobal) {
387
+ return sortAfterInheritanceOrderGlobal(source1.plusFile, source2.plusFile, null, configName);
388
+ }
389
+ else {
390
+ return sortAfterInheritanceOrderPage(source1.plusFile, source2.plusFile, locationIdPage, configName);
391
+ }
392
+ })
393
+ // TODO/next-major: remove
394
+ // Interop with vike(options) in vite.config.js — make it least precedence.
395
+ .sort((0, utils_js_1.makeLast)((source) => !source.plusFile));
396
+ });
397
+ }
398
+ function sortAfterInheritanceOrderPage(plusFile1, plusFile2, locationIdPage, configName) {
399
+ {
400
+ const ret = (0, filesystemRouting_js_1.sortAfterInheritanceOrder)(plusFile1.locationId, plusFile2.locationId, locationIdPage);
401
+ if (ret !== 0)
402
+ return ret;
403
+ (0, utils_js_1.assert)(plusFile1.locationId === plusFile2.locationId);
404
+ }
405
+ if (configName) {
406
+ const ret = sortPlusFilesSameLocationId(plusFile1, plusFile2, configName);
407
+ if (ret !== 0)
408
+ return ret;
409
+ }
410
+ return 0;
411
+ }
412
+ function sortAfterInheritanceOrderGlobal(plusFile1, plusFile2, plusFilesAll, configName) {
413
+ if (plusFilesAll) {
414
+ const ret = (0, utils_js_1.makeFirst)((plusFile) => isGlobalLocation(plusFile.locationId, plusFilesAll))(plusFile1, plusFile2);
415
+ if (ret !== 0)
416
+ return ret;
417
+ }
418
+ {
419
+ const ret = (0, utils_js_1.lowerFirst)((plusFile) => plusFile.locationId.split('/').length)(plusFile1, plusFile2);
420
+ if (ret !== 0)
421
+ return ret;
422
+ }
423
+ if (plusFile1.locationId !== plusFile2.locationId) {
424
+ // Same as `sort()` in `['some', 'string', 'array'].sort()`
425
+ return plusFile1.locationId > plusFile2.locationId ? 1 : -1;
426
+ }
427
+ if (configName) {
428
+ (0, utils_js_1.assert)(plusFile1.locationId === plusFile2.locationId);
429
+ const ret = sortPlusFilesSameLocationId(plusFile1, plusFile2, configName);
430
+ if (ret !== 0)
431
+ return ret;
432
+ }
433
+ return 0;
434
+ }
435
+ function sortPlusFilesSameLocationId(plusFile1, plusFile2, configName) {
436
+ (0, utils_js_1.assert)(plusFile1.locationId === plusFile2.locationId);
437
+ (0, utils_js_1.assert)(isDefiningConfig(plusFile1, configName));
438
+ (0, utils_js_1.assert)(isDefiningConfig(plusFile2, configName));
439
+ // Config set by extensions (lowest precedence)
440
+ {
441
+ const ret = (0, utils_js_1.makeLast)((plusFile) => !!plusFile.isExtensionConfig)(plusFile1, plusFile2);
442
+ if (ret !== 0)
443
+ return ret;
444
+ }
445
+ // Config set by side-export (lower precedence)
446
+ {
447
+ // - For example `export { frontmatter }` of `.mdx` files.
448
+ // - This only considers side-export configs that are already loaded at build-time. (E.g. it actually doesn't consider `export { frontmatter }` of .mdx files since .mdx files are loaded only at runtime.)
449
+ const ret = (0, utils_js_1.makeLast)((plusFile) => !plusFile.isConfigFile &&
450
+ // Is side-export
451
+ plusFile.configName !== configName)(plusFile1, plusFile2);
452
+ if (ret !== 0)
453
+ return ret;
454
+ }
455
+ // Config set by +config.js
456
+ {
457
+ const ret = (0, utils_js_1.makeLast)((plusFile) => plusFile.isConfigFile)(plusFile1, plusFile2);
458
+ if (ret !== 0)
459
+ return ret;
460
+ }
461
+ // Config set by +{configName}.js (highest precedence)
462
+ // No need to make it deterministic: the overall order is arleady deterministic, see sortMakeDeterministic() at getPlusFilesAll()
463
+ return 0;
382
464
  }
383
465
  function resolveConfigValueSources(configName, configDef, plusFilesRelevant, userRootDir, isGlobal) {
384
- const plusFilesOrdered = getPlusFilesOrdered(configName, plusFilesRelevant);
385
- let sources = plusFilesOrdered.map((plusFile, i) => {
386
- const isHighestInheritancePrecedence = i === 0;
387
- const configValueSource = getConfigValueSource(configName, plusFile, configDef, userRootDir, isHighestInheritancePrecedence);
388
- return configValueSource;
389
- });
390
- if ((0, utils_js_1.isCallable)(configDef.global)) {
391
- const isGlobalValue = configDef.global;
466
+ let sources = plusFilesRelevant
467
+ .filter((plusFile) => isDefiningConfig(plusFile, configName))
468
+ .map((plusFile) => getConfigValueSource(configName, plusFile, configDef, userRootDir));
469
+ // Filter hydrid global-local configs
470
+ if (!(0, utils_js_1.isCallable)(configDef.global)) {
471
+ // Already filtered
472
+ (0, utils_js_1.assert)((configDef.global ?? false) === isGlobal);
473
+ }
474
+ else {
475
+ // We cannot filter earlier
392
476
  (0, utils_js_1.assert)(configDef.env.config);
393
477
  sources = sources.filter((source) => {
394
478
  (0, utils_js_1.assert)(source.configEnv.config);
395
479
  (0, utils_js_1.assert)(source.valueIsLoaded);
396
- const valueIsGlobal = isGlobalValue(source.value);
480
+ const valueIsGlobal = resolveIsGlobalValue(configDef.global, source.value);
397
481
  return isGlobal ? valueIsGlobal : !valueIsGlobal;
398
482
  });
399
483
  }
400
484
  return sources;
401
485
  }
402
- // Together with sortAfterInheritanceOrder() this implements the whole order of config inheritance.
403
- function getPlusFilesOrdered(configName, plusFilesRelevant) {
404
- const plusFilesOrdered = [];
405
- // `plusFilesRelevant` is already sorted by sortAfterInheritanceOrder() at getPlusFilesRelevant()
406
- // `plusFilesAtLocationId` is already sorted by sortMakeDeterministic() at getPlusFilesAll()
407
- for (const plusFilesAtLocationId of Object.values(plusFilesRelevant)) {
408
- const plusFilesForConfigName = plusFilesAtLocationId.filter((plusFile) => getDefiningConfigNames(plusFile).includes(configName));
409
- // We populate `plusFilesOrdered` with inheritance order.
410
- const populate = (plusFile) => {
411
- (0, utils_js_1.assert)(!visited.has(plusFile));
412
- visited.add(plusFile);
413
- plusFilesOrdered.push(plusFile);
414
- };
415
- const visited = new WeakSet();
416
- // ========================
417
- // User-land config (first)
418
- // ========================
419
- {
420
- const plusFilesValue = plusFilesForConfigName.filter((plusFile) => !plusFile.isConfigFile &&
421
- // We consider side-effect configs (e.g. `export { frontmatter }` of .mdx files) later (i.e. with less priority)
422
- plusFile.configName === configName);
423
- const plusFilesConfig = plusFilesForConfigName.filter((plusFile) => plusFile.isConfigFile &&
424
- // We consider extensions (e.g. vike-react) later (i.e. with less priority)
425
- !plusFile.isExtensionConfig);
426
- [...plusFilesValue, ...plusFilesConfig].forEach((plusFile) => {
427
- (0, utils_js_1.assert)(plusFile.filePath.filePathAbsoluteUserRootDir); // ensure it's a user-land plus file
428
- populate(plusFile);
429
- });
430
- }
431
- // ==========================
432
- // Side-effect configs (next)
433
- // ==========================
434
- // - For example `export { frontmatter }` of `.mdx` files.
435
- // - This only considers side-effect configs that are already loaded at build-time. (E.g. it actually doesn't consider `export { frontmatter }` of .mdx files since .mdx files are loaded only at runtime.)
436
- plusFilesForConfigName
437
- .filter((plusFile) => !plusFile.isConfigFile &&
438
- // Is side-effect config
439
- plusFile.configName !== configName)
440
- .forEach((plusFile) => {
441
- (0, utils_js_1.assert)(plusFile.filePath.filePathAbsoluteUserRootDir); // ensure it's a user-land plus file
442
- populate(plusFile);
443
- });
444
- // ========================
445
- // Extensions config (last)
446
- // ========================
447
- plusFilesForConfigName
448
- .filter((plusFile) => plusFile.isConfigFile && plusFile.isExtensionConfig)
449
- // Extension config files are already sorted by inheritance order
450
- .forEach((plusFile) => {
451
- (0, utils_js_1.assert)(!plusFile.filePath.filePathAbsoluteUserRootDir); // ensure it isn't a user-land plus file
452
- populate(plusFile);
453
- });
454
- // ======
455
- // Assert we didn't miss any config.
456
- // ======
457
- plusFilesForConfigName.forEach((plusFile) => {
458
- (0, utils_js_1.assert)(visited.has(plusFile));
459
- });
460
- }
461
- return plusFilesOrdered;
486
+ function isDefiningConfig(plusFile, configName) {
487
+ return getDefiningConfigNames(plusFile).includes(configName);
462
488
  }
463
- function getConfigValueSource(configName, plusFile, configDef, userRootDir, isHighestInheritancePrecedence) {
489
+ function getConfigValueSource(configName, plusFile, configDef, userRootDir) {
464
490
  const confVal = getConfVal(plusFile, configName);
465
491
  (0, utils_js_1.assert)(confVal);
466
492
  const configValueSourceCommon = {
@@ -471,15 +497,14 @@ function getConfigValueSource(configName, plusFile, configDef, userRootDir, isHi
471
497
  ...plusFile.filePath,
472
498
  fileExportPathToShowToUser: ['default', configName]
473
499
  };
474
- const isOverriden = configDef.cumulative ? false : !isHighestInheritancePrecedence;
475
500
  // +client.js
476
501
  if (configDef._valueIsFilePath) {
477
502
  let definedAtFilePath;
478
503
  let valueFilePath;
479
504
  if (plusFile.isConfigFile) {
480
505
  // Defined over pointer import
481
- (0, utils_js_1.assert)(confVal.configValueLoaded);
482
- const pointerImport = (0, resolvePointerImport_js_1.resolvePointerImport)(confVal.configValue, plusFile.filePath, userRootDir, configName);
506
+ (0, utils_js_1.assert)(confVal.valueIsLoaded);
507
+ const pointerImport = (0, resolvePointerImport_js_1.resolvePointerImport)(confVal.value, plusFile.filePath, userRootDir, configName);
483
508
  const configDefinedAt = (0, getConfigDefinedAt_js_1.getConfigDefinedAt)('Config', configName, definedAtFilePath_);
484
509
  (0, utils_js_1.assertUsage)(pointerImport, `${configDefinedAt} should be an import`);
485
510
  valueFilePath = pointerImport.fileExportPath.filePathAbsoluteVite;
@@ -500,17 +525,15 @@ function getConfigValueSource(configName, plusFile, configDef, userRootDir, isHi
500
525
  value: valueFilePath,
501
526
  valueIsFilePath: true,
502
527
  configEnv: configDef.env,
503
- valueIsImportedAtRuntime: true,
504
- valueIsDefinedByPlusFile: false,
505
- isOverriden,
528
+ valueIsLoadedWithImport: false,
529
+ valueIsDefinedByPlusValueFile: false,
506
530
  definedAtFilePath
507
531
  };
508
532
  return configValueSource;
509
533
  }
510
534
  // +config.js
511
535
  if (plusFile.isConfigFile) {
512
- (0, utils_js_1.assert)(confVal.configValueLoaded);
513
- const { configValue } = confVal;
536
+ (0, utils_js_1.assert)(confVal.valueIsLoaded);
514
537
  // Defined over pointer import
515
538
  const pointerImport = plusFile.pointerImportsByConfigName[configName];
516
539
  if (pointerImport) {
@@ -526,9 +549,8 @@ function getConfigValueSource(configName, plusFile, configDef, userRootDir, isHi
526
549
  ...configValueSourceCommon,
527
550
  ...value,
528
551
  configEnv: resolveConfigEnv(configDef.env, pointerImport.fileExportPath),
529
- valueIsImportedAtRuntime: true,
530
- valueIsDefinedByPlusFile: false,
531
- isOverriden,
552
+ valueIsLoadedWithImport: true,
553
+ valueIsDefinedByPlusValueFile: false,
532
554
  definedAtFilePath: pointerImport.fileExportPath
533
555
  };
534
556
  return configValueSource;
@@ -537,11 +559,10 @@ function getConfigValueSource(configName, plusFile, configDef, userRootDir, isHi
537
559
  const configValueSource = {
538
560
  ...configValueSourceCommon,
539
561
  valueIsLoaded: true,
540
- value: configValue,
562
+ value: confVal.value,
541
563
  configEnv: configDef.env,
542
- valueIsImportedAtRuntime: false,
543
- valueIsDefinedByPlusFile: false,
544
- isOverriden,
564
+ valueIsLoadedWithImport: false,
565
+ valueIsDefinedByPlusValueFile: false,
545
566
  definedAtFilePath: definedAtFilePath_
546
567
  };
547
568
  return configValueSource;
@@ -549,23 +570,13 @@ function getConfigValueSource(configName, plusFile, configDef, userRootDir, isHi
549
570
  // Defined by value file, i.e. +{configName}.js
550
571
  if (!plusFile.isConfigFile) {
551
572
  const configEnvResolved = resolveConfigEnv(configDef.env, plusFile.filePath);
552
- const valueAlreadyLoaded = confVal.configValueLoaded;
553
- (0, utils_js_1.assert)(valueAlreadyLoaded === !!configEnvResolved.config);
554
- const value = valueAlreadyLoaded
555
- ? {
556
- valueIsLoaded: true,
557
- value: confVal.configValue
558
- }
559
- : {
560
- valueIsLoaded: false
561
- };
573
+ (0, utils_js_1.assert)(confVal.valueIsLoaded === !!configEnvResolved.config);
562
574
  const configValueSource = {
563
575
  ...configValueSourceCommon,
564
- ...value,
576
+ ...confVal,
565
577
  configEnv: configEnvResolved,
566
- valueIsImportedAtRuntime: !valueAlreadyLoaded,
567
- valueIsDefinedByPlusFile: true,
568
- isOverriden,
578
+ valueIsLoadedWithImport: !confVal.valueIsLoaded || !(0, serializeConfigValues_js_1.isJsonValue)(confVal.value),
579
+ valueIsDefinedByPlusValueFile: true,
569
580
  definedAtFilePath: {
570
581
  ...plusFile.filePath,
571
582
  fileExportPathToShowToUser: configName === plusFile.configName
@@ -590,6 +601,15 @@ function isDefiningPage(plusFiles) {
590
601
  function isDefiningPageConfig(configName) {
591
602
  return ['Page', 'route'].includes(configName);
592
603
  }
604
+ function resolveIsGlobalValue(configDefGlobal, configValue) {
605
+ let isGlobal;
606
+ if ((0, utils_js_1.isCallable)(configDefGlobal))
607
+ isGlobal = configDefGlobal(configValue);
608
+ else
609
+ isGlobal = configDefGlobal ?? false;
610
+ (0, utils_js_1.assert)(typeof isGlobal === 'boolean');
611
+ return isGlobal;
612
+ }
593
613
  function getDefiningConfigNames(plusFile) {
594
614
  let configNames = [];
595
615
  if (!plusFile.isConfigFile) {
@@ -604,33 +624,32 @@ function getDefiningConfigNames(plusFile) {
604
624
  function getConfigDefinitions(plusFilesRelevant, filter) {
605
625
  let configDefinitions = { ...configDefinitionsBuiltIn_js_1.configDefinitionsBuiltIn };
606
626
  // Add user-land meta configs
607
- Object.entries(plusFilesRelevant)
627
+ plusFilesRelevant
628
+ .slice()
608
629
  .reverse()
609
- .forEach(([_locationId, plusFiles]) => {
610
- plusFiles.forEach((plusFile) => {
611
- const confVal = getConfVal(plusFile, 'meta');
612
- if (!confVal)
630
+ .forEach((plusFile) => {
631
+ const confVal = getConfVal(plusFile, 'meta');
632
+ if (!confVal)
633
+ return;
634
+ (0, utils_js_1.assert)(confVal.valueIsLoaded);
635
+ const meta = confVal.value;
636
+ assertMetaUsage(meta, `Config ${picocolors_1.default.cyan('meta')} defined at ${plusFile.filePath.filePathToShowToUser}`);
637
+ // Set configDef._userEffectDefinedAtFilePath
638
+ Object.entries(meta).forEach(([configName, configDef]) => {
639
+ if (!configDef.effect)
613
640
  return;
614
- (0, utils_js_1.assert)(confVal.configValueLoaded);
615
- const meta = confVal.configValue;
616
- assertMetaUsage(meta, `Config ${picocolors_1.default.cyan('meta')} defined at ${plusFile.filePath.filePathToShowToUser}`);
617
- // Set configDef._userEffectDefinedAtFilePath
618
- Object.entries(meta).forEach(([configName, configDef]) => {
619
- if (!configDef.effect)
620
- return;
621
- (0, utils_js_1.assert)(plusFile.isConfigFile);
622
- configDef._userEffectDefinedAtFilePath = {
623
- ...plusFile.filePath,
624
- fileExportPathToShowToUser: ['default', 'meta', configName, 'effect']
625
- };
626
- });
627
- (0, utils_js_1.objectEntries)(meta).forEach(([configName, configDefinitionUserLand]) => {
628
- // User can override an existing config definition
629
- configDefinitions[configName] = {
630
- ...configDefinitions[configName],
631
- ...configDefinitionUserLand
632
- };
633
- });
641
+ (0, utils_js_1.assert)(plusFile.isConfigFile);
642
+ configDef._userEffectDefinedAtFilePath = {
643
+ ...plusFile.filePath,
644
+ fileExportPathToShowToUser: ['default', 'meta', configName, 'effect']
645
+ };
646
+ });
647
+ (0, utils_js_1.objectEntries)(meta).forEach(([configName, configDefinitionUserLand]) => {
648
+ // User can override an existing config definition
649
+ configDefinitions[configName] = {
650
+ ...configDefinitions[configName],
651
+ ...configDefinitionUserLand
652
+ };
634
653
  });
635
654
  });
636
655
  if (filter) {
@@ -674,67 +693,102 @@ function assertMetaUsage(metaVal, metaConfigDefinedAt) {
674
693
  }
675
694
  });
676
695
  }
677
- function applyEffectsAll(configValueSources, configDefinitions) {
678
- (0, utils_js_1.objectEntries)(configDefinitions).forEach(([configName, configDef]) => {
679
- if (!configDef.effect)
696
+ // Test: https://github.com/vikejs/vike/blob/441a37c4c1a3b07bb8f6efb1d1f7be297a53974a/test/playground/vite.config.ts#L39
697
+ function applyEffectsConfVal(configValueSources, configDefinitions) {
698
+ (0, utils_js_1.objectEntries)(configDefinitions).forEach(([configNameEffect, configDefEffect]) => {
699
+ const sourceEffect = configValueSources[configNameEffect]?.[0];
700
+ if (!sourceEffect)
680
701
  return;
681
- // The value needs to be loaded at config time, that's why we only support effect for configs that are config-only for now.
682
- // (We could support effect for non config-only by always loading its value at config time, regardless of the config's `env` value.)
683
- (0, utils_js_1.assertUsage)(configDef.env.config, [
684
- `Cannot add effect to ${picocolors_1.default.cyan(configName)} because its ${picocolors_1.default.cyan('env')} is ${picocolors_1.default.cyan(JSON.stringify(configDef.env))}: effects can only be added to configs with an ${picocolors_1.default.cyan('env')} with ${picocolors_1.default.cyan('{ config: true }')}.`
685
- ].join(' '));
686
- const source = configValueSources[configName]?.[0];
687
- if (!source)
702
+ const effect = runEffect(configNameEffect, configDefEffect, sourceEffect);
703
+ if (!effect)
688
704
  return;
689
- // The config value is eagerly loaded since `configDef.env === 'config-only``
690
- (0, utils_js_1.assert)('value' in source);
691
- // Call effect
692
- const configModFromEffect = configDef.effect({
693
- configValue: source.value,
694
- configDefinedAt: (0, getConfigDefinedAt_js_1.getConfigDefinedAt)('Config', configName, source.definedAtFilePath)
695
- });
696
- if (!configModFromEffect)
705
+ const { configModFromEffect, configValueEffectSource } = effect;
706
+ applyEffectConfVal(configModFromEffect, sourceEffect, configValueSources, configNameEffect, configDefEffect, configDefinitions, configValueEffectSource);
707
+ });
708
+ }
709
+ // Test: https://github.com/vikejs/vike/blob/441a37c4c1a3b07bb8f6efb1d1f7be297a53974a/test/playground/pages/config-meta/effect/e2e-test.ts#L16
710
+ function applyEffectsMetaEnv(configValueSources, configDefinitions) {
711
+ (0, utils_js_1.objectEntries)(configDefinitions).forEach(([configNameEffect, configDefEffect]) => {
712
+ const sourceEffect = configValueSources[configNameEffect]?.[0];
713
+ if (!sourceEffect)
714
+ return;
715
+ const effect = runEffect(configNameEffect, configDefEffect, sourceEffect);
716
+ if (!effect)
697
717
  return;
698
- (0, utils_js_1.assert)((0, utils_js_1.hasProp)(source, 'value')); // We need to assume that the config value is loaded at build-time
699
- applyEffect(configModFromEffect, configValueSources, configDef);
718
+ const { configModFromEffect } = effect;
719
+ applyEffectMetaEnv(configModFromEffect, configValueSources, configDefEffect);
700
720
  });
701
721
  }
702
- function applyEffect(configModFromEffect, configValueSources, configDefEffect) {
703
- const notSupported = `Effects currently only supports modifying the the ${picocolors_1.default.cyan('env')} of a config.`;
704
- (0, utils_js_1.objectEntries)(configModFromEffect).forEach(([configName, configValue]) => {
705
- if (configName === 'meta') {
706
- let configDefinedAt;
707
- if (configDefEffect._userEffectDefinedAtFilePath) {
708
- configDefinedAt = (0, getConfigDefinedAt_js_1.getConfigDefinedAt)('Config', configName, configDefEffect._userEffectDefinedAtFilePath);
709
- }
710
- else {
711
- configDefinedAt = null;
712
- }
713
- assertMetaUsage(configValue, configDefinedAt);
714
- (0, utils_js_1.objectEntries)(configValue).forEach(([configTargetName, configTargetDef]) => {
715
- {
716
- const keys = Object.keys(configTargetDef);
717
- (0, utils_js_1.assertUsage)(keys.includes('env'), notSupported);
718
- (0, utils_js_1.assertUsage)(keys.length === 1, notSupported);
719
- }
720
- const envOverriden = configTargetDef.env;
721
- const sources = configValueSources[configTargetName];
722
- sources?.forEach((configValueSource) => {
723
- // Apply effect
724
- configValueSource.configEnv = envOverriden;
725
- });
726
- });
722
+ function runEffect(configName, configDef, source) {
723
+ if (!configDef.effect)
724
+ return null;
725
+ // The value needs to be loaded at config time, that's why we only support effect for configs that are config-only for now.
726
+ (0, utils_js_1.assertUsage)(configDef.env.config, [
727
+ `Cannot add meta.effect to ${picocolors_1.default.cyan(configName)} because its meta.env is ${picocolors_1.default.cyan(JSON.stringify(configDef.env))} but an effect can only be added to a config that has a meta.env with ${picocolors_1.default.cyan('{ config: true }')}.`
728
+ ].join(' '));
729
+ (0, utils_js_1.assert)(source.valueIsLoaded);
730
+ const configValueEffectSource = source.value;
731
+ // Call effect
732
+ const configModFromEffect = configDef.effect({
733
+ configValue: configValueEffectSource,
734
+ configDefinedAt: (0, getConfigDefinedAt_js_1.getConfigDefinedAt)('Config', configName, source.definedAtFilePath)
735
+ });
736
+ if (!configModFromEffect)
737
+ return null;
738
+ return { configModFromEffect, configValueEffectSource };
739
+ }
740
+ function applyEffectConfVal(configModFromEffect, sourceEffect, configValueSources, configNameEffect, configDefEffect, configDefinitions, configValueEffectSource) {
741
+ (0, utils_js_1.objectEntries)(configModFromEffect).forEach(([configNameTarget, configValue]) => {
742
+ if (configNameTarget === 'meta')
743
+ return;
744
+ const configDef = configDefinitions[configNameTarget];
745
+ (0, utils_js_1.assert)(configDef);
746
+ (0, utils_js_1.assert)(configDefEffect._userEffectDefinedAtFilePath);
747
+ const configValueSource = {
748
+ definedAtFilePath: configDefEffect._userEffectDefinedAtFilePath,
749
+ plusFile: sourceEffect.plusFile,
750
+ locationId: sourceEffect.locationId,
751
+ configEnv: configDef.env,
752
+ valueIsLoadedWithImport: false,
753
+ valueIsDefinedByPlusValueFile: false,
754
+ valueIsLoaded: true,
755
+ value: configValue
756
+ };
757
+ const isValueGlobalSource = resolveIsGlobalValue(configDefEffect.global, configValueEffectSource);
758
+ const isValueGlobalTarget = resolveIsGlobalValue(configDef.global, configValue);
759
+ const isGlobalHumanReadable = (isGlobal) => `${isGlobal ? 'non-' : ''}global`;
760
+ // The error message make it sound like it's an inherent limitation, it actually isn't (both ways can make senses).
761
+ (0, utils_js_1.assertUsage)(isValueGlobalSource === isValueGlobalTarget, `The configuration ${picocolors_1.default.cyan(configNameEffect)} is set to ${picocolors_1.default.cyan(JSON.stringify(configValueEffectSource))} which is considered ${isGlobalHumanReadable(isValueGlobalSource)}. However, it has a meta.effect that sets the configuration ${picocolors_1.default.cyan(configNameTarget)} to ${picocolors_1.default.cyan(JSON.stringify(configValue))} which is considered ${isGlobalHumanReadable(isValueGlobalTarget)}. This is contradictory: make sure the values are either both non-global or both global.`);
762
+ configValueSources[configNameTarget] ?? (configValueSources[configNameTarget] = []);
763
+ configValueSources[configNameTarget].push(configValueSource);
764
+ });
765
+ }
766
+ function applyEffectMetaEnv(configModFromEffect, configValueSources, configDefEffect) {
767
+ const notSupported = `${picocolors_1.default.cyan('meta.effect')} currently only supports setting the value of a config, or modifying the ${picocolors_1.default.cyan('meta.env')} of a config.`;
768
+ (0, utils_js_1.objectEntries)(configModFromEffect).forEach(([configNameTarget, configValue]) => {
769
+ if (configNameTarget !== 'meta')
770
+ return;
771
+ let configDefinedAt;
772
+ if (configDefEffect._userEffectDefinedAtFilePath) {
773
+ configDefinedAt = (0, getConfigDefinedAt_js_1.getConfigDefinedAt)('Config', configNameTarget, configDefEffect._userEffectDefinedAtFilePath);
727
774
  }
728
775
  else {
729
- (0, utils_js_1.assertUsage)(false, notSupported);
730
- /* To implement being able to set a config value in an effect:
731
- * - Copy and append definedAtFile.fileExportPathToShowToUser with ['meta', configName, 'effect']
732
- * - Copying the definedAtFile of the config that defines the effect
733
- * - Same precedence as the config that sets the value triggering the effect (not the config defining the effect)
734
- * - Apply sortConfigValueSources() again?
735
- configValueSources.push()
736
- */
776
+ configDefinedAt = null;
737
777
  }
778
+ assertMetaUsage(configValue, configDefinedAt);
779
+ (0, utils_js_1.objectEntries)(configValue).forEach(([configTargetName, configTargetDef]) => {
780
+ {
781
+ const keys = Object.keys(configTargetDef);
782
+ (0, utils_js_1.assertUsage)(keys.includes('env'), notSupported);
783
+ (0, utils_js_1.assertUsage)(keys.length === 1, notSupported);
784
+ }
785
+ const envOverriden = configTargetDef.env;
786
+ const sources = configValueSources[configTargetName];
787
+ sources?.forEach((configValueSource) => {
788
+ // Apply effect
789
+ configValueSource.configEnv = envOverriden;
790
+ });
791
+ });
738
792
  });
739
793
  }
740
794
  function getComputed(configValueSources, configDefinitions) {
@@ -754,7 +808,7 @@ function getComputed(configValueSources, configDefinitions) {
754
808
  }
755
809
  // Show error message upon unknown config
756
810
  function assertKnownConfigs(configDefinitionsResolved, plusFilesAll) {
757
- const configDefinitionsAll = getConfigDefinitions(plusFilesAll);
811
+ const configDefinitionsAll = getConfigDefinitions(Object.values(plusFilesAll).flat());
758
812
  const configNamesKnownAll = Object.keys(configDefinitionsAll);
759
813
  const configNamesGlobal = Object.keys(configDefinitionsResolved.configDefinitionsGlobal);
760
814
  (0, utils_js_1.objectEntries)(configDefinitionsResolved.configDefinitionsLocal).forEach(([_locationId, { configDefinitions, plusFiles }]) => {
@@ -848,7 +902,7 @@ function determineRouteFilesystem(locationId, configValueSources) {
848
902
  function getFilesystemRoutingRootEffect(configFilesystemRoutingRoot, configName) {
849
903
  (0, utils_js_1.assert)(configFilesystemRoutingRoot.configEnv.config);
850
904
  // Eagerly loaded since it's config-only
851
- (0, utils_js_1.assert)('value' in configFilesystemRoutingRoot);
905
+ (0, utils_js_1.assert)(configFilesystemRoutingRoot.valueIsLoaded);
852
906
  const { value } = configFilesystemRoutingRoot;
853
907
  const configDefinedAt = (0, getConfigDefinedAt_js_1.getConfigDefinedAt)('Config', configName, configFilesystemRoutingRoot.definedAtFilePath);
854
908
  (0, utils_js_1.assertUsage)(typeof value === 'string', `${configDefinedAt} should be a string`);
@@ -908,8 +962,8 @@ function getConfVal(plusFile, configName) {
908
962
  if (!configNames.includes(configName))
909
963
  return null;
910
964
  if (plusFile.isNotLoaded)
911
- return { configValueLoaded: false };
912
- const confVal = { configValue: plusFile.fileExportsByConfigName[configName], configValueLoaded: true };
965
+ return { valueIsLoaded: false };
966
+ const confVal = { value: plusFile.fileExportsByConfigName[configName], valueIsLoaded: true };
913
967
  return confVal;
914
968
  }
915
969
  function resolveConfigEnv(configEnv, filePath) {
@@ -938,3 +992,14 @@ function isGlobalLocation(locationId, plusFilesAll) {
938
992
  .map(([locationId]) => locationId);
939
993
  return locationIdsPage.every((locId) => (0, filesystemRouting_js_1.isInherited)(locationId, locId));
940
994
  }
995
+ function isOverriden(source, configName, pageConfig) {
996
+ const configDef = pageConfig.configDefinitions[configName];
997
+ (0, utils_js_1.assert)(configDef);
998
+ if (configDef.cumulative)
999
+ return false;
1000
+ const sources = pageConfig.configValueSources[configName];
1001
+ (0, utils_js_1.assert)(sources);
1002
+ const idx = sources.indexOf(source);
1003
+ (0, utils_js_1.assert)(idx >= 0);
1004
+ return idx > 0;
1005
+ }