vike 0.4.171-commit-75e1588 → 0.4.171-commit-6e37128

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 (116) 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/importUserCode/v1-design/getVikeConfig/configDefinitionsBuiltIn.js +3 -3
  4. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig.js +30 -74
  5. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVirtualFilePageConfigValuesAll.js +4 -42
  6. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVirtualFilePageConfigs.js +9 -49
  7. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/isRuntimeEnvMatch.js +6 -0
  8. package/dist/cjs/node/prerender/runPrerender.js +33 -13
  9. package/dist/cjs/node/prerender/utils.js +1 -0
  10. package/dist/cjs/node/runtime/renderPage/analyzePage.js +9 -7
  11. package/dist/cjs/node/runtime/renderPage/createHttpResponseObject/getCacheControl.js +1 -1
  12. package/dist/cjs/node/runtime/renderPage/executeOnRenderHtmlHook.js +7 -7
  13. package/dist/cjs/node/runtime/renderPage/loadUserFilesServerSide.js +4 -5
  14. package/dist/cjs/node/runtime/renderPage/preparePageContextForUserConsumptionServerSide.js +2 -2
  15. package/dist/cjs/node/runtime/renderPage/renderPageAlreadyRouted.js +6 -5
  16. package/dist/cjs/node/shared/assertV1Design.js +3 -4
  17. package/dist/cjs/shared/{addUrlComputedProps.js → getPageContextUrlComputed.js} +52 -42
  18. package/dist/cjs/shared/getPageFiles/analyzeClientSide.js +2 -2
  19. package/dist/cjs/shared/hooks/getHook.js +2 -2
  20. package/dist/cjs/shared/page-configs/getConfigValue.js +14 -17
  21. package/dist/cjs/shared/page-configs/getConfigValueBuildTime.js +70 -0
  22. package/dist/cjs/shared/page-configs/loadConfigValues.js +3 -12
  23. package/dist/cjs/shared/page-configs/serialize/assertPageConfigsSerialized.js +1 -2
  24. package/dist/cjs/shared/page-configs/serialize/parsePageConfigs.js +110 -16
  25. package/dist/cjs/shared/page-configs/serialize/serializeConfigValues.js +198 -0
  26. package/dist/cjs/shared/route/index.js +2 -2
  27. package/dist/cjs/shared/route/loadPageRoutes.js +2 -2
  28. package/dist/cjs/shared/route/resolveRouteFunction.js +2 -2
  29. package/dist/cjs/shared/utils.js +2 -0
  30. package/dist/cjs/utils/changeEnumerable.js +9 -0
  31. package/dist/cjs/utils/hasProp.js +5 -7
  32. package/dist/cjs/utils/objectAssign.js +1 -1
  33. package/dist/cjs/utils/objectDefineProperty.js +8 -0
  34. package/dist/cjs/utils/projectInfo.js +1 -1
  35. package/dist/esm/client/client-routing-runtime/createPageContext.d.ts +6 -4
  36. package/dist/esm/client/client-routing-runtime/createPageContext.js +4 -3
  37. package/dist/esm/client/client-routing-runtime/getPageContextFromHooks.js +14 -10
  38. package/dist/esm/client/server-routing-runtime/getPageContext.d.ts +4 -4
  39. package/dist/esm/client/shared/loadUserFilesClientSide.js +4 -4
  40. package/dist/esm/node/plugin/plugins/buildConfig.js +3 -4
  41. package/dist/esm/node/plugin/plugins/devConfig/determineOptimizeDeps.js +18 -15
  42. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/configDefinitionsBuiltIn.d.ts +2 -1
  43. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/configDefinitionsBuiltIn.js +3 -3
  44. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig.js +30 -74
  45. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVirtualFilePageConfigValuesAll.js +4 -42
  46. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVirtualFilePageConfigs.js +9 -49
  47. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/isRuntimeEnvMatch.d.ts +1 -0
  48. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/isRuntimeEnvMatch.js +6 -0
  49. package/dist/esm/node/prerender/runPrerender.js +35 -15
  50. package/dist/esm/node/prerender/utils.d.ts +1 -0
  51. package/dist/esm/node/prerender/utils.js +1 -0
  52. package/dist/esm/node/runtime/renderPage/analyzePage.js +9 -7
  53. package/dist/esm/node/runtime/renderPage/createHttpResponseObject/getCacheControl.js +2 -2
  54. package/dist/esm/node/runtime/renderPage/executeOnRenderHtmlHook.js +7 -7
  55. package/dist/esm/node/runtime/renderPage/loadUserFilesServerSide.d.ts +1 -9
  56. package/dist/esm/node/runtime/renderPage/loadUserFilesServerSide.js +4 -5
  57. package/dist/esm/node/runtime/renderPage/preparePageContextForUserConsumptionServerSide.d.ts +2 -2
  58. package/dist/esm/node/runtime/renderPage/preparePageContextForUserConsumptionServerSide.js +2 -2
  59. package/dist/esm/node/runtime/renderPage/renderPageAlreadyRouted.d.ts +27 -50
  60. package/dist/esm/node/runtime/renderPage/renderPageAlreadyRouted.js +6 -5
  61. package/dist/esm/node/shared/assertV1Design.d.ts +2 -2
  62. package/dist/esm/node/shared/assertV1Design.js +3 -4
  63. package/dist/esm/shared/{addUrlComputedProps.d.ts → getPageContextUrlComputed.d.ts} +23 -21
  64. package/dist/esm/shared/{addUrlComputedProps.js → getPageContextUrlComputed.js} +52 -42
  65. package/dist/esm/shared/getPageFiles/analyzeClientSide.js +3 -3
  66. package/dist/esm/shared/hooks/getHook.d.ts +2 -2
  67. package/dist/esm/shared/hooks/getHook.js +3 -3
  68. package/dist/esm/shared/page-configs/PageConfig.d.ts +10 -4
  69. package/dist/esm/shared/page-configs/getConfigValue.d.ts +12 -12
  70. package/dist/esm/shared/page-configs/getConfigValue.js +13 -16
  71. package/dist/esm/shared/page-configs/getConfigValueBuildTime.d.ts +9 -0
  72. package/dist/esm/shared/page-configs/getConfigValueBuildTime.js +67 -0
  73. package/dist/esm/shared/page-configs/loadConfigValues.js +3 -12
  74. package/dist/esm/shared/page-configs/serialize/PageConfigSerialized.d.ts +15 -19
  75. package/dist/esm/shared/page-configs/serialize/assertPageConfigsSerialized.js +1 -2
  76. package/dist/esm/shared/page-configs/serialize/parsePageConfigs.d.ts +4 -1
  77. package/dist/esm/shared/page-configs/serialize/parsePageConfigs.js +109 -15
  78. package/dist/esm/shared/page-configs/serialize/serializeConfigValues.d.ts +5 -0
  79. package/dist/esm/shared/page-configs/serialize/serializeConfigValues.js +192 -0
  80. package/dist/esm/shared/route/index.d.ts +3 -3
  81. package/dist/esm/shared/route/index.js +2 -2
  82. package/dist/esm/shared/route/loadPageRoutes.js +3 -3
  83. package/dist/esm/shared/route/resolveRouteFunction.d.ts +2 -2
  84. package/dist/esm/shared/route/resolveRouteFunction.js +2 -2
  85. package/dist/esm/shared/types.d.ts +4 -4
  86. package/dist/esm/shared/utils.d.ts +2 -0
  87. package/dist/esm/shared/utils.js +2 -0
  88. package/dist/esm/types/index.d.ts +1 -1
  89. package/dist/esm/utils/changeEnumerable.d.ts +2 -0
  90. package/dist/esm/utils/changeEnumerable.js +5 -0
  91. package/dist/esm/utils/hasProp.d.ts +4 -13
  92. package/dist/esm/utils/hasProp.js +5 -7
  93. package/dist/esm/utils/objectAssign.js +1 -1
  94. package/dist/esm/utils/objectDefineProperty.d.ts +4 -0
  95. package/dist/esm/utils/objectDefineProperty.js +4 -0
  96. package/dist/esm/utils/projectInfo.d.ts +2 -2
  97. package/dist/esm/utils/projectInfo.js +1 -1
  98. package/package.json +2 -2
  99. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getConfigValuesSerialized.js +0 -101
  100. package/dist/cjs/node/plugin/shared/getConfigValueSourcesNotOverriden.js +0 -14
  101. package/dist/cjs/node/shared/getClientEntry.js +0 -12
  102. package/dist/cjs/shared/page-configs/serialize/parseConfigValuesImported.js +0 -85
  103. package/dist/cjs/shared/page-configs/serialize/parseConfigValuesSerialized.js +0 -24
  104. package/dist/cjs/shared/page-configs/serialize/serializeConfigValue.js +0 -49
  105. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getConfigValuesSerialized.d.ts +0 -5
  106. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getConfigValuesSerialized.js +0 -95
  107. package/dist/esm/node/plugin/shared/getConfigValueSourcesNotOverriden.d.ts +0 -5
  108. package/dist/esm/node/plugin/shared/getConfigValueSourcesNotOverriden.js +0 -11
  109. package/dist/esm/node/shared/getClientEntry.d.ts +0 -3
  110. package/dist/esm/node/shared/getClientEntry.js +0 -9
  111. package/dist/esm/shared/page-configs/serialize/parseConfigValuesImported.d.ts +0 -4
  112. package/dist/esm/shared/page-configs/serialize/parseConfigValuesImported.js +0 -82
  113. package/dist/esm/shared/page-configs/serialize/parseConfigValuesSerialized.d.ts +0 -4
  114. package/dist/esm/shared/page-configs/serialize/parseConfigValuesSerialized.js +0 -21
  115. package/dist/esm/shared/page-configs/serialize/serializeConfigValue.d.ts +0 -6
  116. package/dist/esm/shared/page-configs/serialize/serializeConfigValue.js +0 -46
@@ -4,19 +4,18 @@ export { analyzeClientEntries };
4
4
  export { manifestTempFile };
5
5
  import { assert, resolveOutDir, viteIsSSR, addOnBeforeLogHook, removeFileExtention, unique, assertUsage, injectRollupInputs, normalizeRollupInput, getOutDirs, assertNodeEnv_build, assertIsNpmPackageImport } from '../utils.js';
6
6
  import { getVikeConfig, isV1Design } from './importUserCode/v1-design/getVikeConfig.js';
7
- import { getConfigValue } from '../../../shared/page-configs/getConfigValue.js';
8
7
  import { findPageFiles } from '../shared/findPageFiles.js';
9
8
  import { getConfigVike } from '../../shared/getConfigVike.js';
10
9
  import { getVirtualFileIdPageConfigValuesAll } from '../../shared/virtual-files/virtualFilePageConfigValuesAll.js';
11
10
  import { extractAssetsAddQuery } from '../../shared/extractAssetsQuery.js';
12
11
  import { createRequire } from 'module';
13
- import { getClientEntry } from '../../shared/getClientEntry.js';
14
12
  import fs from 'fs/promises';
15
13
  import path from 'path';
16
14
  import { fixServerAssets, fixServerAssets_isEnabled } from './buildConfig/fixServerAssets.js';
17
15
  import { set_constant_ASSETS_MAP } from './importBuild/index.js';
18
16
  import { prependEntriesDir } from '../../shared/prependEntriesDir.js';
19
17
  import { getFilePathResolved } from '../shared/getFilePath.js';
18
+ import { getConfigValueBuildTime } from '../../../shared/page-configs/getConfigValueBuildTime.js';
20
19
  // @ts-ignore Shimmed by dist-cjs-fixup.js for CJS build.
21
20
  const importMetaUrl = import.meta.url;
22
21
  const require_ = createRequire(importMetaUrl);
@@ -152,7 +151,7 @@ function analyzeClientEntries(pageConfigs, config) {
152
151
  let clientEntries = {};
153
152
  let clientEntryList = [];
154
153
  pageConfigs.forEach((pageConfig) => {
155
- const configValue = getConfigValue(pageConfig, 'clientRouting', 'boolean');
154
+ const configValue = getConfigValueBuildTime(pageConfig, 'clientRouting', 'boolean');
156
155
  if (configValue?.value) {
157
156
  hasClientRouting = true;
158
157
  }
@@ -165,7 +164,7 @@ function analyzeClientEntries(pageConfigs, config) {
165
164
  clientEntries[entryName] = entryTarget;
166
165
  }
167
166
  {
168
- const clientEntry = getClientEntry(pageConfig);
167
+ const clientEntry = getConfigValueBuildTime(pageConfig, 'client', 'string')?.value ?? null;
169
168
  if (clientEntry) {
170
169
  clientEntryList.push(clientEntry);
171
170
  }
@@ -2,7 +2,6 @@ export { determineOptimizeDeps };
2
2
  import { findPageFiles } from '../../shared/findPageFiles.js';
3
3
  import { assert, assertIsNpmPackageImport, createDebugger, isArray, unique } from '../../utils.js';
4
4
  import { getVikeConfig } from '../importUserCode/v1-design/getVikeConfig.js';
5
- import { getConfigValueSourcesNotOverriden } from '../../shared/getConfigValueSourcesNotOverriden.js';
6
5
  import { analyzeClientEntries } from '../buildConfig.js';
7
6
  import { virtualFileIdImportUserCodeClientCR, virtualFileIdImportUserCodeClientSR } from '../../../shared/virtual-files/virtualFileImportUserCode.js';
8
7
  import { getFilePathResolved } from '../../shared/getFilePath.js';
@@ -45,20 +44,24 @@ async function getPageDeps(config, pageConfigs, isDev) {
45
44
  // V1 design
46
45
  {
47
46
  pageConfigs.forEach((pageConfig) => {
48
- getConfigValueSourcesNotOverriden(pageConfig).forEach((configValueSource) => {
49
- if (!configValueSource.valueIsImportedAtRuntime)
50
- return;
51
- const { definedAtFilePath, configEnv } = configValueSource;
52
- if (!configEnv.client)
53
- return;
54
- if (definedAtFilePath.filePathAbsoluteUserRootDir !== null) {
55
- // Vite expects entries to be filesystem absolute paths (surprisingly so).
56
- addEntry(definedAtFilePath.filePathAbsoluteFilesystem);
57
- }
58
- else {
59
- // Adding definedAtFilePath.filePathAbsoluteFilesystem doesn't work for npm packages, I guess because of Vite's config.server.fs.allow
60
- addInclude(definedAtFilePath.importPathAbsolute);
61
- }
47
+ Object.values(pageConfig.configValueSources).forEach((sources) => {
48
+ sources
49
+ .filter((c) => !c.isOverriden)
50
+ .forEach((configValueSource) => {
51
+ if (!configValueSource.valueIsImportedAtRuntime)
52
+ return;
53
+ const { definedAtFilePath, configEnv } = configValueSource;
54
+ if (!configEnv.client)
55
+ return;
56
+ if (definedAtFilePath.filePathAbsoluteUserRootDir !== null) {
57
+ // Vite expects entries to be filesystem absolute paths (surprisingly so).
58
+ addEntry(definedAtFilePath.filePathAbsoluteFilesystem);
59
+ }
60
+ else {
61
+ // Adding definedAtFilePath.filePathAbsoluteFilesystem doesn't work for npm packages, I guess because of Vite's config.server.fs.allow
62
+ addInclude(definedAtFilePath.importPathAbsolute);
63
+ }
64
+ });
62
65
  });
63
66
  });
64
67
  }
@@ -56,7 +56,8 @@ type ConfigDefinitionInternal = Omit<ConfigDefinition, 'env'> & {
56
56
  _userEffectDefinedAtFilePath?: DefinedAtFilePath;
57
57
  env: ConfigEnvInternal;
58
58
  };
59
- type ConfigDefinitions = Record<string, ConfigDefinitionInternal>;
59
+ type ConfigDefinitions = Record<string, // configName
60
+ ConfigDefinitionInternal>;
60
61
  type ConfigDefinitionsBuiltIn = Record<ConfigNameBuiltIn, ConfigDefinitionInternal>;
61
62
  declare const configDefinitionsBuiltIn: ConfigDefinitionsBuiltIn;
62
63
  type ConfigNameGlobal = 'onPrerenderStart' | 'onBeforeRoute' | 'prerender' | 'disableAutoFullBuild' | 'includeAssetsImportedByServer' | 'baseAssets' | 'baseServer' | 'redirects' | 'trailingSlash' | 'disableUrlNormalization';
@@ -21,7 +21,7 @@ const configDefinitionsBuiltIn = {
21
21
  env: { server: true }
22
22
  },
23
23
  onBeforePrerenderStart: {
24
- env: { server: true }
24
+ env: { server: true, production: true }
25
25
  },
26
26
  Page: {
27
27
  env: { server: true, client: true }
@@ -47,7 +47,7 @@ const configDefinitionsBuiltIn = {
47
47
  },
48
48
  client: {
49
49
  // The value of the client config is merely the file path to the client entry file, which is only needed on the sever-side
50
- env: { server: true },
50
+ env: { server: true, config: true },
51
51
  _valueIsFilePath: true
52
52
  },
53
53
  clientRouting: {
@@ -95,7 +95,7 @@ const configDefinitionsBuiltIn = {
95
95
  };
96
96
  const configDefinitionsBuiltInGlobal = {
97
97
  onPrerenderStart: {
98
- env: { server: true }
98
+ env: { server: true, production: true }
99
99
  },
100
100
  onBeforeRoute: {
101
101
  env: { server: true, client: 'if-client-routing', eager: true }
@@ -14,12 +14,12 @@ import { logConfigError, logConfigErrorRecover } from '../../../shared/loggerNot
14
14
  import { removeSuperfluousViteLog_enable, removeSuperfluousViteLog_disable } from '../../../shared/loggerVite/removeSuperfluousViteLog.js';
15
15
  import pc from '@brillout/picocolors';
16
16
  import { getConfigDefinedAt } from '../../../../../shared/page-configs/getConfigDefinedAt.js';
17
- import { assertConfigValueIsSerializable } from './getConfigValuesSerialized.js';
18
17
  import { crawlPlusFiles } from './getVikeConfig/crawlPlusFiles.js';
19
18
  import { getConfigFileExport } from './getConfigFileExport.js';
20
19
  import { loadConfigFile, loadImportedFile, loadValueFile } from './getVikeConfig/loadFileAtConfigTime.js';
21
20
  import { clearFilesEnvMap, resolvePointerImportOfConfig } from './getVikeConfig/resolvePointerImport.js';
22
21
  import { getFilePathResolved } from '../../../shared/getFilePath.js';
22
+ import { getConfigValueBuildTime } from '../../../../../shared/page-configs/getConfigValueBuildTime.js';
23
23
  assertIsNotProductionRuntime();
24
24
  let devServerIsCorrupt = false;
25
25
  let wasConfigInvalid = null;
@@ -166,7 +166,7 @@ async function loadInterfaceFiles(userRootDir, outDirRoot, isDev) {
166
166
  // - If `configDef` is `undefined` => we load the file +{configName}.js later.
167
167
  // - We already need to load +meta.js here (to get the custom config definitions defined by the user)
168
168
  const configDef = getConfigDefinitionOptional(configDefinitionsBuiltIn, configName);
169
- if (configDef && isConfigEnv(configDef, configName)) {
169
+ if (configDef && isLoadableAtBuildTime(configDef)) {
170
170
  await loadValueFile(interfaceFile, configName, userRootDir);
171
171
  }
172
172
  }
@@ -241,6 +241,7 @@ async function loadVikeConfig_withErrorHandling(userRootDir, outDirRoot, isDev,
241
241
  const dummyData = {
242
242
  pageConfigs: [],
243
243
  pageConfigGlobal: {
244
+ configDefinitions: {},
244
245
  configValueSources: {}
245
246
  },
246
247
  globalVikeConfig: {}
@@ -266,7 +267,7 @@ async function loadVikeConfig(userRootDir, outDirRoot, isDev) {
266
267
  if (isGlobalConfig(configName))
267
268
  return;
268
269
  const configDef = getConfigDefinition(configDefinitions, configName, interfaceFile.filePath.filePathToShowToUser);
269
- if (!isConfigEnv(configDef, configName))
270
+ if (!isLoadableAtBuildTime(configDef))
270
271
  return;
271
272
  const isAlreadyLoaded = interfacefileIsAlreaydLoaded(interfaceFile);
272
273
  if (isAlreadyLoaded)
@@ -288,14 +289,13 @@ async function loadVikeConfig(userRootDir, outDirRoot, isDev) {
288
289
  const { routeFilesystem, isErrorPage } = determineRouteFilesystem(locationId, configValueSources);
289
290
  applyEffectsAll(configValueSources, configDefinitions);
290
291
  const configValuesComputed = getComputed(configValueSources, configDefinitions);
291
- const configValues = getConfigValues(configValueSources, configValuesComputed, configDefinitions);
292
292
  const pageConfig = {
293
293
  pageId: locationId,
294
294
  isErrorPage,
295
295
  routeFilesystem,
296
+ configDefinitions,
296
297
  configValueSources,
297
- configValuesComputed,
298
- configValues
298
+ configValuesComputed
299
299
  };
300
300
  return pageConfig;
301
301
  }));
@@ -328,7 +328,7 @@ function assertOnBeforeRenderEnv(pageConfig) {
328
328
  if (!onBeforeRenderConfig)
329
329
  return;
330
330
  const onBeforeRenderEnv = onBeforeRenderConfig.configEnv;
331
- const isClientRouting = !!pageConfig.configValues.clientRouting?.value;
331
+ const isClientRouting = getConfigValueBuildTime(pageConfig, 'clientRouting', 'boolean');
332
332
  // When using Server Routing, loading a onBeforeRender() hook on the client-side hasn't any effect (the Server Routing's client runtime never calls it); it unnecessarily bloats client bundle sizes
333
333
  assertUsage(!(onBeforeRenderEnv.client && !isClientRouting), `Page ${pageConfig.pageId} has an onBeforeRender() hook with env ${pc.cyan(JSON.stringify(onBeforeRenderEnv))} which doesn't make sense because the page is using Server Routing: onBeforeRender() can be run in the client only when using Client Routing.`);
334
334
  }
@@ -389,6 +389,7 @@ async function getGlobalConfigs(interfaceFilesByLocationId, userRootDir, importe
389
389
  }
390
390
  const globalVikeConfig = {};
391
391
  const pageConfigGlobal = {
392
+ configDefinitions: configDefinitionsBuiltInGlobal,
392
393
  configValueSources: {}
393
394
  };
394
395
  await Promise.all(objectEntries(configDefinitionsBuiltInGlobal).map(async ([configName, configDef]) => {
@@ -422,7 +423,15 @@ async function resolveConfigValueSources(configName, configDef, interfaceFilesRe
422
423
  const add = (interfaceFile) => {
423
424
  assert(!visited.has(interfaceFile));
424
425
  visited.add(interfaceFile);
425
- sourcesInfo.push([configName, interfaceFile, configDef, userRootDir, importedFilesLoaded]);
426
+ const isHighestInheritancePrecedence = sourcesInfo.length === 0;
427
+ sourcesInfo.push([
428
+ configName,
429
+ interfaceFile,
430
+ configDef,
431
+ userRootDir,
432
+ importedFilesLoaded,
433
+ isHighestInheritancePrecedence
434
+ ]);
426
435
  };
427
436
  // Main resolution logic
428
437
  {
@@ -493,7 +502,7 @@ function warnOverridenConfigValues(interfaceFileWinner, interfaceFilesOverriden,
493
502
  function isInterfaceFileUserLand(interfaceFile) {
494
503
  return (interfaceFile.isConfigFile && !interfaceFile.isConfigExtend) || interfaceFile.isValueFile;
495
504
  }
496
- async function getConfigValueSource(configName, interfaceFile, configDef, userRootDir, importedFilesLoaded) {
505
+ async function getConfigValueSource(configName, interfaceFile, configDef, userRootDir, importedFilesLoaded, isHighestInheritancePrecedence) {
497
506
  const conf = interfaceFile.fileExportsByConfigName[configName];
498
507
  assert(conf);
499
508
  const configEnv = deriveConfigEnvFromFileName(configDef.env, interfaceFile.filePath.fileName);
@@ -502,6 +511,7 @@ async function getConfigValueSource(configName, interfaceFile, configDef, userRo
502
511
  ...interfaceFile.filePath,
503
512
  fileExportPathToShowToUser: ['default', configName]
504
513
  };
514
+ const isOverriden = configDef.cumulative ? false : !isHighestInheritancePrecedence;
505
515
  // +client.js
506
516
  if (configDef._valueIsFilePath) {
507
517
  let definedAtFilePath;
@@ -528,7 +538,8 @@ async function getConfigValueSource(configName, interfaceFile, configDef, userRo
528
538
  valueIsFilePath: true,
529
539
  configEnv,
530
540
  valueIsImportedAtRuntime: true,
531
- valueIsDefinedByValueFile: false,
541
+ valueIsDefinedByPlusFile: false,
542
+ isOverriden,
532
543
  definedAtFilePath
533
544
  };
534
545
  return configValueSource;
@@ -544,11 +555,12 @@ async function getConfigValueSource(configName, interfaceFile, configDef, userRo
544
555
  locationId,
545
556
  configEnv,
546
557
  valueIsImportedAtRuntime: true,
547
- valueIsDefinedByValueFile: false,
558
+ valueIsDefinedByPlusFile: false,
559
+ isOverriden,
548
560
  definedAtFilePath: pointerImport
549
561
  };
550
562
  // Load pointer import
551
- if (isConfigEnv(configDef, configName) &&
563
+ if (isLoadableAtBuildTime(configDef) &&
552
564
  // The value of `extends` was already loaded and already used: we don't need the value of `extends` anymore
553
565
  configName !== 'extends') {
554
566
  if (pointerImport.filePathAbsoluteFilesystem) {
@@ -568,7 +580,8 @@ async function getConfigValueSource(configName, interfaceFile, configDef, userRo
568
580
  value: configValue,
569
581
  configEnv,
570
582
  valueIsImportedAtRuntime: false,
571
- valueIsDefinedByValueFile: false,
583
+ valueIsDefinedByPlusFile: false,
584
+ isOverriden,
572
585
  definedAtFilePath: definedAtFilePath_
573
586
  };
574
587
  return configValueSource;
@@ -581,7 +594,8 @@ async function getConfigValueSource(configName, interfaceFile, configDef, userRo
581
594
  locationId,
582
595
  configEnv,
583
596
  valueIsImportedAtRuntime: !valueAlreadyLoaded,
584
- valueIsDefinedByValueFile: true,
597
+ valueIsDefinedByPlusFile: true,
598
+ isOverriden,
585
599
  definedAtFilePath: {
586
600
  ...interfaceFile.filePath,
587
601
  fileExportPathToShowToUser: configName === interfaceFile.configName
@@ -876,59 +890,6 @@ function determineIsErrorPage(routeFilesystem) {
876
890
  function isVikeConfigFile(filePath) {
877
891
  return !!getConfigName(filePath);
878
892
  }
879
- function getConfigValues(configValueSources, configValuesComputed, configDefinitions) {
880
- const configValues = {};
881
- Object.entries(configValuesComputed).forEach(([configName, configValueComputed]) => {
882
- configValues[configName] = {
883
- type: 'computed',
884
- value: configValueComputed.value,
885
- definedAtData: null
886
- };
887
- });
888
- Object.entries(configValueSources).forEach(([configName, sources]) => {
889
- const configDef = configDefinitions[configName];
890
- assert(configDef);
891
- if (!configDef.cumulative) {
892
- const configValueSource = sources[0];
893
- if ('value' in configValueSource) {
894
- configValues[configName] = {
895
- type: 'standard',
896
- value: configValueSource.value,
897
- definedAtData: getDefinedAtFile(configValueSource)
898
- };
899
- }
900
- }
901
- else {
902
- const value = mergeCumulative(configName, sources);
903
- const definedAtData = sources.map((source) => getDefinedAtFile(source));
904
- assert(value.length === definedAtData.length);
905
- configValues[configName] = {
906
- type: 'cumulative',
907
- value,
908
- definedAtData
909
- };
910
- }
911
- });
912
- return configValues;
913
- }
914
- function getDefinedAtFile(configValueSource) {
915
- return {
916
- filePathToShowToUser: configValueSource.definedAtFilePath.filePathToShowToUser,
917
- fileExportPathToShowToUser: configValueSource.definedAtFilePath.fileExportPathToShowToUser
918
- };
919
- }
920
- function mergeCumulative(configName, configValueSources) {
921
- const configValues = [];
922
- configValueSources.forEach((configValueSource) => {
923
- // We could, in principle, also support cumulative for values that aren't loaded at config-time but it isn't completely trivial to implement.
924
- assert('value' in configValueSource);
925
- // Make sure configValueSource.value is serializable
926
- assertConfigValueIsSerializable(configValueSource.value, configName, getDefinedAtFile(configValueSource));
927
- const { value } = configValueSource;
928
- configValues.push(value);
929
- });
930
- return configValues;
931
- }
932
893
  function getConfigEnvValue(val, errMsgIntro) {
933
894
  const errInvalidValue = `${errMsgIntro} an invalid value ${pc.cyan(JSON.stringify(val))}`;
934
895
  // Legacy outdated values
@@ -971,13 +932,8 @@ function getConfigDefinition(configDefinitions, configName, filePathToShowToUser
971
932
  function getConfigDefinitionOptional(configDefinitions, configName) {
972
933
  return configDefinitions[configName] ?? null;
973
934
  }
974
- function isConfigEnv(configDef, configName) {
975
- const configEnv = configDef.env;
976
- if (configDef.cumulative) {
977
- // In principle we could lift that requirement (but it requires non-trivial modifications)
978
- assertUsage(configEnv.config, `Config ${pc.cyan(configName)} needs its ${pc.cyan('env')} to have ${pc.cyan('{ config: true }')} (because ${pc.cyan(configName)} is a ${pc.cyan('cumulative')} config)`);
979
- }
980
- return !!configEnv.config;
935
+ function isLoadableAtBuildTime(configDef) {
936
+ return !!configDef.env.config && !configDef._valueIsFilePath;
981
937
  }
982
938
  function isGlobalConfig(configName) {
983
939
  if (configName === 'prerender')
@@ -4,13 +4,11 @@ import { getVirtualFileIdPageConfigValuesAll, isVirtualFileIdPageConfigValuesAll
4
4
  import { getVikeConfig } from './getVikeConfig.js';
5
5
  import { extractAssetsAddQuery } from '../../../../shared/extractAssetsQuery.js';
6
6
  import { debug } from './debug.js';
7
- import { getConfigValue } from '../../../../../shared/page-configs/getConfigValue.js';
8
- import { getConfigValueSourcesNotOverriden } from '../../../shared/getConfigValueSourcesNotOverriden.js';
9
7
  import { isRuntimeEnvMatch } from './isRuntimeEnvMatch.js';
10
- import { serializeConfigValueImported } from '../../../../../shared/page-configs/serialize/serializeConfigValue.js';
8
+ import { serializeConfigValues } from '../../../../../shared/page-configs/serialize/serializeConfigValues.js';
11
9
  import { getConfigVike } from '../../../../shared/getConfigVike.js';
12
- import { getConfigValuesSerialized } from './getConfigValuesSerialized.js';
13
10
  import { fixServerAssets_isEnabled } from '../../buildConfig/fixServerAssets.js';
11
+ import { getConfigValueBuildTime } from '../../../../../shared/page-configs/getConfigValueBuildTime.js';
14
12
  async function getVirtualFilePageConfigValuesAll(id, isDev, config) {
15
13
  const result = isVirtualFileIdPageConfigValuesAll(id);
16
14
  assert(result);
@@ -32,16 +30,9 @@ async function getVirtualFilePageConfigValuesAll(id, isDev, config) {
32
30
  function getLoadConfigValuesAll(pageConfig, isForClientSide, pageId, includeAssetsImportedByServer, isDev) {
33
31
  const lines = [];
34
32
  const importStatements = [];
35
- const isClientRouting = getConfigValue(pageConfig, 'clientRouting', 'boolean')?.value ?? false;
36
- lines.push('export const configValuesImported = [');
37
- lines.push(getConfigValuesImported(pageConfig, isForClientSide, isClientRouting, importStatements));
38
- lines.push('];');
33
+ const isClientRouting = getConfigValueBuildTime(pageConfig, 'clientRouting', 'boolean')?.value ?? false;
39
34
  lines.push('export const configValuesSerialized = {');
40
- lines.push(getConfigValuesSerialized(pageConfig, importStatements, (configEnv, configValueSource) => isEnvMatch(configEnv, !configValueSource ? false : checkWhetherIsImport(configValueSource), {
41
- isImport: false,
42
- isForClientSide,
43
- isClientRouting
44
- })));
35
+ lines.push(...serializeConfigValues(pageConfig, importStatements, (configEnv) => isRuntimeEnvMatch(configEnv, { isForClientSide, isClientRouting, isEager: false, isDev }), ''));
45
36
  lines.push('};');
46
37
  if (!fixServerAssets_isEnabled() && includeAssetsImportedByServer && isForClientSide && !isDev) {
47
38
  importStatements.push(`import '${extractAssetsAddQuery(getVirtualFileIdPageConfigValuesAll(pageId, false))}'`);
@@ -49,32 +40,3 @@ function getLoadConfigValuesAll(pageConfig, isForClientSide, pageId, includeAsse
49
40
  const code = [...importStatements, ...lines].join('\n');
50
41
  return code;
51
42
  }
52
- function getConfigValuesImported(pageConfig, isForClientSide, isClientRouting, importStatements) {
53
- const lines = [];
54
- getConfigValueSourcesNotOverriden(pageConfig).forEach((configValueSource) => {
55
- if (!isEnvMatch(configValueSource.configEnv, checkWhetherIsImport(configValueSource), {
56
- isImport: true,
57
- isForClientSide,
58
- isClientRouting
59
- }))
60
- return;
61
- const whitespace = ' ';
62
- lines.push(...serializeConfigValueImported(configValueSource, configValueSource.configName, whitespace, importStatements));
63
- });
64
- const code = lines.join('\n');
65
- return code;
66
- }
67
- function checkWhetherIsImport(configValueSource) {
68
- const { valueIsImportedAtRuntime, valueIsFilePath } = configValueSource;
69
- return valueIsImportedAtRuntime && !valueIsFilePath;
70
- }
71
- function isEnvMatch(configEnv, isImport, runtime) {
72
- // Whether config value is imported or serialized
73
- if (isImport !== runtime.isImport)
74
- return false;
75
- // Runtime match
76
- const { isForClientSide, isClientRouting } = runtime;
77
- if (!isRuntimeEnvMatch(configEnv, { isForClientSide, isClientRouting, isEager: false }))
78
- return false;
79
- return true;
80
- }
@@ -1,11 +1,9 @@
1
1
  export { getVirtualFilePageConfigs };
2
- import { assert, objectEntries } from '../../../utils.js';
3
2
  import { getVirtualFileIdPageConfigValuesAll } from '../../../../shared/virtual-files/virtualFilePageConfigValuesAll.js';
4
3
  import { debug } from './debug.js';
5
4
  import { getVikeConfig } from './getVikeConfig.js';
6
5
  import { isRuntimeEnvMatch } from './isRuntimeEnvMatch.js';
7
- import { serializeConfigValueImported } from '../../../../../shared/page-configs/serialize/serializeConfigValue.js';
8
- import { getConfigValuesSerialized } from './getConfigValuesSerialized.js';
6
+ import { serializeConfigValues } from '../../../../../shared/page-configs/serialize/serializeConfigValues.js';
9
7
  async function getVirtualFilePageConfigs(isForClientSide, isDev, id, isClientRouting, config) {
10
8
  const { pageConfigs, pageConfigGlobal } = await getVikeConfig(config, isDev, true);
11
9
  return getCode(pageConfigs, pageConfigGlobal, isForClientSide, isDev, id, isClientRouting);
@@ -14,16 +12,16 @@ function getCode(pageConfigs, pageConfigGlobal, isForClientSide, isDev, id, isCl
14
12
  const lines = [];
15
13
  const importStatements = [];
16
14
  lines.push('export const pageConfigsSerialized = [');
17
- lines.push(getCodePageConfigsSerialized(pageConfigs, isForClientSide, isClientRouting, importStatements));
15
+ lines.push(getCodePageConfigsSerialized(pageConfigs, isForClientSide, isClientRouting, isDev, importStatements));
18
16
  lines.push('];');
19
17
  lines.push('export const pageConfigGlobalSerialized = {');
20
- lines.push(getCodePageConfigGlobalSerialized(pageConfigGlobal, isForClientSide, isDev, importStatements));
18
+ lines.push(getCodePageConfigGlobalSerialized(pageConfigGlobal, isForClientSide, isClientRouting, isDev, importStatements));
21
19
  lines.push('};');
22
20
  const code = [...importStatements, ...lines].join('\n');
23
21
  debug(id, isForClientSide ? 'CLIENT-SIDE' : 'SERVER-SIDE', code);
24
22
  return code;
25
23
  }
26
- function getCodePageConfigsSerialized(pageConfigs, isForClientSide, isClientRouting, importStatements) {
24
+ function getCodePageConfigsSerialized(pageConfigs, isForClientSide, isClientRouting, isDev, importStatements) {
27
25
  const lines = [];
28
26
  pageConfigs.forEach((pageConfig) => {
29
27
  const { pageId, routeFilesystem, isErrorPage } = pageConfig;
@@ -33,57 +31,19 @@ function getCodePageConfigsSerialized(pageConfigs, isForClientSide, isClientRout
33
31
  lines.push(` isErrorPage: ${JSON.stringify(isErrorPage)},`);
34
32
  lines.push(` routeFilesystem: ${JSON.stringify(routeFilesystem)},`);
35
33
  lines.push(` loadConfigValuesAll: () => import(${JSON.stringify(virtualFileIdPageConfigValuesAll)}),`);
36
- // Serialized config values
37
34
  lines.push(` configValuesSerialized: {`);
38
- lines.push(getConfigValuesSerialized(pageConfig, importStatements, (configEnv) => isRuntimeEnvMatch(configEnv, { isForClientSide, isClientRouting, isEager: true })));
35
+ lines.push(...serializeConfigValues(pageConfig, importStatements, (configEnv) => isRuntimeEnvMatch(configEnv, { isForClientSide, isClientRouting, isEager: true, isDev }), ' '));
39
36
  lines.push(` },`);
40
- // Imported config values
41
- const whitespace = ' ';
42
- lines.push(`${whitespace}configValuesImported: [`);
43
- Object.entries(pageConfig.configValueSources).forEach(([configName, sources]) => {
44
- const configValue = pageConfig.configValues[configName];
45
- if (configValue)
46
- return;
47
- const configValueSource = sources[0];
48
- assert(configValueSource);
49
- if (!configValueSource.configEnv.eager)
50
- return;
51
- if (!isRuntimeEnvMatch(configValueSource.configEnv, { isForClientSide, isClientRouting, isEager: true }))
52
- return;
53
- lines.push(...serializeConfigValueImported(configValueSource, configName, whitespace, importStatements));
54
- });
55
- lines.push(`${whitespace}],`);
56
37
  lines.push(` },`);
57
38
  });
58
39
  const code = lines.join('\n');
59
40
  return code;
60
41
  }
61
- function getCodePageConfigGlobalSerialized(pageConfigGlobal, isForClientSide, isDev, importStatements) {
42
+ function getCodePageConfigGlobalSerialized(pageConfigGlobal, isForClientSide, isClientRouting, isDev, importStatements) {
62
43
  const lines = [];
63
- /* Nothing (yet)
64
- lines.push(` configValuesSerialized: {`)
65
- lines.push(` },`)
66
- */
67
- lines.push(` configValuesImported: [`);
68
- objectEntries(pageConfigGlobal.configValueSources).forEach(([configName, sources]) => {
69
- if (configName === 'onBeforeRoute') {
70
- // if( isForClientSide && !isClientRouting ) return
71
- }
72
- else if (configName === 'onPrerenderStart') {
73
- if (isDev || isForClientSide) {
74
- // Only load onPrerenderStart() in server production runtime
75
- return;
76
- }
77
- }
78
- else {
79
- assert(false);
80
- }
81
- const configValueSource = sources[0];
82
- assert(configValueSource);
83
- const whitespace = ' ';
84
- lines.push(...serializeConfigValueImported(configValueSource, configName, whitespace, importStatements));
85
- });
86
- lines.push(` ],`);
44
+ lines.push(` configValuesSerialized: {`);
45
+ lines.push(...serializeConfigValues(pageConfigGlobal, importStatements, (configEnv) => isRuntimeEnvMatch(configEnv, { isForClientSide, isClientRouting, isEager: true, isDev }), ' '));
46
+ lines.push(` },`);
87
47
  const code = lines.join('\n');
88
48
  return code;
89
49
  }
@@ -4,4 +4,5 @@ declare function isRuntimeEnvMatch(configEnv: ConfigEnvInternal, runtime: {
4
4
  isForClientSide: boolean;
5
5
  isClientRouting: boolean;
6
6
  isEager: boolean;
7
+ isDev: boolean;
7
8
  }): boolean;
@@ -14,5 +14,11 @@ function isRuntimeEnvMatch(configEnv, runtime) {
14
14
  // Eager
15
15
  if (runtime.isEager !== !!configEnv.eager)
16
16
  return false;
17
+ // Production/development
18
+ if (
19
+ //
20
+ (configEnv.production === true && runtime.isDev) ||
21
+ (configEnv.production === false && !runtime.isDev))
22
+ return false;
17
23
  return true;
18
24
  }