vike 0.4.221-commit-937dbfb → 0.4.222-commit-207e079

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 (56) hide show
  1. package/dist/cjs/node/plugin/index.js +1 -1
  2. package/dist/cjs/node/plugin/plugins/baseUrls.js +6 -1
  3. package/dist/cjs/node/plugin/plugins/commonConfig.js +4 -1
  4. package/dist/cjs/node/plugin/plugins/importUserCode/index.js +73 -39
  5. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/crawlPlusFiles.js +37 -0
  6. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/getPlusFilesAll.js +2 -40
  7. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/transpileAndExecuteFile.js +2 -0
  8. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig.js +39 -14
  9. package/dist/cjs/node/runtime/globalContext.js +24 -8
  10. package/dist/cjs/node/runtime/renderPage/renderPageAlreadyRouted.js +2 -4
  11. package/dist/cjs/node/runtime/renderPage.js +4 -8
  12. package/dist/cjs/node/shared/resolveBase.js +0 -13
  13. package/dist/cjs/shared/getPageConfigsRuntime.js +10 -1
  14. package/dist/cjs/shared/route/loadPageRoutes.js +1 -1
  15. package/dist/cjs/utils/PROJECT_VERSION.js +1 -1
  16. package/dist/cjs/utils/assertSingleInstance.js +1 -1
  17. package/dist/esm/client/client-routing-runtime/renderPageClientSide.d.ts +5 -0
  18. package/dist/esm/client/client-routing-runtime/renderPageClientSide.js +7 -0
  19. package/dist/esm/node/plugin/index.d.ts +4 -1
  20. package/dist/esm/node/plugin/index.js +1 -1
  21. package/dist/esm/node/plugin/plugins/baseUrls.js +6 -1
  22. package/dist/esm/node/plugin/plugins/commonConfig.d.ts +1 -0
  23. package/dist/esm/node/plugin/plugins/commonConfig.js +4 -1
  24. package/dist/esm/node/plugin/plugins/importUserCode/index.js +73 -39
  25. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/crawlPlusFiles.d.ts +4 -0
  26. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/crawlPlusFiles.js +38 -1
  27. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/getPlusFilesAll.d.ts +0 -2
  28. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/getPlusFilesAll.js +2 -37
  29. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/transpileAndExecuteFile.js +2 -0
  30. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig.d.ts +3 -2
  31. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig.js +39 -14
  32. package/dist/esm/node/runtime/globalContext.d.ts +10 -7
  33. package/dist/esm/node/runtime/globalContext.js +24 -8
  34. package/dist/esm/node/runtime/html/injectAssets/getViteDevScript.d.ts +2 -2
  35. package/dist/esm/node/runtime/html/injectAssets.d.ts +2 -2
  36. package/dist/esm/node/runtime/renderPage/analyzePage.d.ts +2 -2
  37. package/dist/esm/node/runtime/renderPage/getPageAssets.d.ts +2 -2
  38. package/dist/esm/node/runtime/renderPage/handleErrorWithoutErrorPage.d.ts +2 -2
  39. package/dist/esm/node/runtime/renderPage/loadUserFilesServerSide.d.ts +2 -2
  40. package/dist/esm/node/runtime/renderPage/log404/index.d.ts +2 -2
  41. package/dist/esm/node/runtime/renderPage/preparePageContextForUserConsumptionServerSide.d.ts +2 -2
  42. package/dist/esm/node/runtime/renderPage/renderPageAlreadyRouted.d.ts +8 -8
  43. package/dist/esm/node/runtime/renderPage/renderPageAlreadyRouted.js +2 -4
  44. package/dist/esm/node/runtime/renderPage.js +4 -8
  45. package/dist/esm/node/shared/resolveBase.d.ts +1 -9
  46. package/dist/esm/node/shared/resolveBase.js +0 -13
  47. package/dist/esm/shared/getPageConfigsRuntime.d.ts +2 -1
  48. package/dist/esm/shared/getPageConfigsRuntime.js +10 -1
  49. package/dist/esm/shared/page-configs/getPageConfigUserFriendly.d.ts +6 -0
  50. package/dist/esm/shared/route/loadPageRoutes.js +1 -1
  51. package/dist/esm/shared/types.d.ts +9 -0
  52. package/dist/esm/utils/PROJECT_VERSION.d.ts +1 -1
  53. package/dist/esm/utils/PROJECT_VERSION.js +1 -1
  54. package/dist/esm/utils/assertSingleInstance.js +1 -1
  55. package/dist/esm/utils/projectInfo.d.ts +1 -1
  56. package/package.json +1 -1
@@ -35,7 +35,7 @@ const workaroundVite6HmrRegression_js_1 = require("./plugins/workaroundVite6HmrR
35
35
  const buildApp_js_1 = require("./plugins/buildApp.js");
36
36
  // We don't call this in ./onLoad.ts to avoid a cyclic dependency with utils.ts
37
37
  (0, getPageAssets_js_1.setResolveClientEntriesDev)(resolveClientEntriesDev_js_1.resolveClientEntriesDev);
38
- // Return as `any` to avoid Plugin type mismatches when there are multiple Vite versions installed
38
+ // Return `PluginInterop` instead of `Plugin` to avoid type mismatch upon different Vite versions
39
39
  function plugin(vikeVitePluginOptions = {}) {
40
40
  const plugins = [
41
41
  ...(0, commonConfig_js_1.commonConfig)(vikeVitePluginOptions),
@@ -29,7 +29,7 @@ function baseUrls() {
29
29
  },
30
30
  async configResolved(config) {
31
31
  const vikeConfig = await (0, getVikeConfig_js_1.getVikeConfig)(config);
32
- const basesResolved2 = (0, resolveBase_js_1.resolveBaseFromResolvedConfig)(vikeConfig.global.config.baseServer ?? null, vikeConfig.global.config.baseAssets ?? null, config);
32
+ const basesResolved2 = resolveBaseFromResolvedConfig(vikeConfig.global.config.baseServer ?? null, vikeConfig.global.config.baseAssets ?? null, config);
33
33
  (0, utils_js_1.assert)(basesResolved2.baseServer === basesResolved.baseServer);
34
34
  (0, utils_js_1.assert)(basesResolved2.baseAssets === basesResolved.baseAssets);
35
35
  /* In dev, Vite seems buggy around setting vite.config.js#base to an absolute URL (e.g. http://localhost:8080/cdn/)
@@ -40,3 +40,8 @@ function baseUrls() {
40
40
  }
41
41
  };
42
42
  }
43
+ function resolveBaseFromResolvedConfig(baseServer, baseAssets, config) {
44
+ let baseViteOriginal = config._baseViteOriginal;
45
+ (0, utils_js_1.assert)(baseViteOriginal === null || typeof baseViteOriginal == 'string');
46
+ return (0, resolveBase_js_1.resolveBase)(baseViteOriginal, baseServer, baseAssets);
47
+ }
@@ -35,7 +35,10 @@ function commonConfig(vikeVitePluginOptions) {
35
35
  _isDev: isDev,
36
36
  _root: root,
37
37
  _vikeVitePluginOptions: vikeVitePluginOptions,
38
- vike: { config: vikeConfig.global.config },
38
+ vike: {
39
+ pages: vikeConfig.pages,
40
+ config: vikeConfig.global.config
41
+ },
39
42
  // TODO/v1-release: remove https://github.com/vikejs/vike/issues/2122
40
43
  configVikePromise: Promise.resolve({
41
44
  prerender: (0, context_js_2.isPrerenderEnabled)(vikeConfig)
@@ -15,8 +15,8 @@ const getVikeConfig_js_1 = require("./v1-design/getVikeConfig.js");
15
15
  const picocolors_1 = __importDefault(require("@brillout/picocolors"));
16
16
  const loggerNotProd_js_1 = require("../../shared/loggerNotProd.js");
17
17
  const getFilePath_js_1 = require("../../shared/getFilePath.js");
18
- const getPlusFilesAll_js_1 = require("./v1-design/getVikeConfig/getPlusFilesAll.js");
19
18
  const globalContext_js_1 = require("../../../runtime/globalContext.js");
19
+ const crawlPlusFiles_js_1 = require("./v1-design/getVikeConfig/crawlPlusFiles.js");
20
20
  function importUserCode() {
21
21
  let config;
22
22
  let vikeConfig;
@@ -73,50 +73,55 @@ function handleFileAddRemove(server, config) {
73
73
  return;
74
74
  function listener(file, isRemove) {
75
75
  file = (0, vite_1.normalizePath)(file);
76
- const isVikeConfig = isVikeConfigModule(file) || isVikeConfigFile(file);
77
- if (isVikeConfig) {
78
- const virtualModules = getVirtualModules(server);
79
- virtualModules.forEach((mod) => {
80
- server.moduleGraph.invalidateModule(mod);
81
- });
76
+ if ((0, crawlPlusFiles_js_1.isPlusFile)(file) || isVikeConfigDependency(file, server.moduleGraph)?.modifiesVikeVirtualFiles) {
77
+ invalidateVikeVirtualFiles(server);
82
78
  reloadConfig(file, config, isRemove ? 'removed' : 'created');
83
79
  }
84
80
  }
85
81
  }
82
+ function invalidateVikeVirtualFiles(server) {
83
+ const vikeVirtualFiles = getVikeVirtualFiles(server);
84
+ vikeVirtualFiles.forEach((mod) => {
85
+ server.moduleGraph.invalidateModule(mod);
86
+ });
87
+ }
86
88
  function handleHotUpdate(ctx, config) {
87
89
  const { file, server } = ctx;
88
- const isVikeConfig = isVikeConfigModule(file);
89
- const isViteModule = ctx.modules.length > 0;
90
- /* Should we show this?
91
- // - Can be useful for server files that aren't processed by Vite.
92
- // - Can be annoying for files that obviously aren't processed by Vite.
93
- if (!isVikeConfig && !isViteModule) {
94
- logViteAny(
95
- `${msg} — ${pc.cyan('no HMR')}, see https://vike.dev/on-demand-compiler`,
96
- 'info',
97
- null,
98
- true
99
- )
100
- return
101
- }
102
- //*/
103
- // It can hide an error it shouldn't hide (because the error isn't shown again), but it's ok since users can reload the page and the error will be shown again (Vite transpilation errors are shown again upon a page reload).
104
- if (!isVikeConfig && isViteModule) {
105
- return;
106
- }
90
+ const isVikeConfig = isVikeConfigDependency(ctx.file, ctx.server.moduleGraph);
107
91
  if (isVikeConfig) {
108
- /* Tailwind breaks this assertion, see https://github.com/vikejs/vike/discussions/1330#discussioncomment-7787238
109
- assert(!isViteModule)
110
- */
111
- reloadConfig(file, config, 'modified');
112
- const virtualModules = getVirtualModules(server);
113
- return virtualModules;
92
+ if (isVikeConfig.modifiesVikeVirtualFiles) {
93
+ /* Tailwind breaks this assertion, see https://github.com/vikejs/vike/discussions/1330#discussioncomment-7787238
94
+ const isViteModule = ctx.modules.length > 0
95
+ assert(!isViteModule)
96
+ */
97
+ // Ensure server.ssrLoadModule() loads fresh Vike virtual files (`reloadConfig()` > `updateUserFiles()` > `server.ssrLoadModule()`)
98
+ invalidateVikeVirtualFiles(server);
99
+ reloadConfig(file, config, 'modified');
100
+ // Triggers a full page reload
101
+ const vikeVirtualFiles = getVikeVirtualFiles(server);
102
+ return vikeVirtualFiles;
103
+ }
104
+ else {
105
+ // Ensure we invalidate `file` *before* server.ssrLoadModule() in updateUserFiles()
106
+ // Vite already invalidates it, but possibly *after* handleHotUpdate() and thus after server.ssrLoadModule()
107
+ ctx.modules.forEach((mod) => server.moduleGraph.invalidateModule(mod));
108
+ (0, globalContext_js_1.updateUserFiles)();
109
+ }
114
110
  }
115
111
  }
116
- function isVikeConfigModule(filePathAbsoluteFilesystem) {
112
+ function isVikeConfigDependency(filePathAbsoluteFilesystem, moduleGraph) {
113
+ // Check config-only files, for example all pages/+config.js dependencies. (There aren't part of Vite's module graph.)
117
114
  (0, utils_js_1.assertPosixPath)(filePathAbsoluteFilesystem);
118
115
  getVikeConfig_js_1.vikeConfigDependencies.forEach((f) => (0, utils_js_1.assertPosixPath)(f));
119
- return getVikeConfig_js_1.vikeConfigDependencies.has(filePathAbsoluteFilesystem);
116
+ if (getVikeConfig_js_1.vikeConfigDependencies.has(filePathAbsoluteFilesystem))
117
+ return { modifiesVikeVirtualFiles: true };
118
+ // Check using Vite's module graph, for example all +htmlAttributes dependencies.
119
+ // Alternatively, simply call updateUserFiles() on every handleHotUpdate() call.
120
+ const importers = getImporters(filePathAbsoluteFilesystem, moduleGraph);
121
+ const isPlusValueFileDependency = Array.from(importers).some((importer) => importer.file && (0, crawlPlusFiles_js_1.isPlusFile)(importer.file));
122
+ if (isPlusValueFileDependency)
123
+ return { modifiesVikeVirtualFiles: false };
124
+ return null;
120
125
  }
121
126
  function reloadConfig(filePath, config, op) {
122
127
  {
@@ -127,16 +132,45 @@ function reloadConfig(filePath, config, op) {
127
132
  (0, getVikeConfig_js_1.reloadVikeConfig)(config);
128
133
  (0, globalContext_js_1.updateUserFiles)();
129
134
  }
130
- function getVirtualModules(server) {
131
- const virtualModules = Array.from(server.moduleGraph.urlToModuleMap.keys())
135
+ function getVikeVirtualFiles(server) {
136
+ const vikeVirtualFiles = Array.from(server.moduleGraph.urlToModuleMap.keys())
132
137
  .filter((url) => (0, virtualFilePageConfigValuesAll_js_1.isVirtualFileIdPageConfigValuesAll)(url) || (0, virtualFileImportUserCode_js_1.isVirtualFileIdImportUserCode)(url))
133
138
  .map((url) => {
134
139
  const mod = server.moduleGraph.urlToModuleMap.get(url);
135
140
  (0, utils_js_1.assert)(mod);
136
141
  return mod;
137
142
  });
138
- return virtualModules;
143
+ return vikeVirtualFiles;
144
+ }
145
+ // Get all transitive importers (including the module itself)
146
+ function getImporters(file, moduleGraph) {
147
+ const importers = new Set();
148
+ const mods = moduleGraph.getModulesByFile(file);
149
+ if (!mods)
150
+ return importers;
151
+ for (const mod of mods) {
152
+ getModuleImporters(mod).forEach((importer) => {
153
+ if (importer)
154
+ importers.add(importer);
155
+ });
156
+ }
157
+ return importers;
139
158
  }
140
- function isVikeConfigFile(filePath) {
141
- return !!(0, getPlusFilesAll_js_1.getPlusFileValueConfigName)(filePath);
159
+ function getModuleImporters(mod, seen = new Set()) {
160
+ if (seen.has(mod))
161
+ return new Set();
162
+ seen.add(mod);
163
+ const importers = new Set();
164
+ if (mod.id)
165
+ importers.add(mod);
166
+ // Traverse through the importers (modules that import this module)
167
+ for (const importer of mod.importers) {
168
+ if (importer.id)
169
+ importers.add(importer);
170
+ getModuleImporters(importer, seen).forEach((importerTransitive) => {
171
+ if (importerTransitive)
172
+ importers.add(importerTransitive);
173
+ });
174
+ }
175
+ return importers;
142
176
  }
@@ -4,6 +4,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.crawlPlusFiles = crawlPlusFiles;
7
+ exports.isPlusFile = isPlusFile;
8
+ exports.getPlusFileValueConfigName = getPlusFileValueConfigName;
7
9
  const utils_js_1 = require("../../../../utils.js");
8
10
  const path_1 = __importDefault(require("path"));
9
11
  const fast_glob_1 = __importDefault(require("fast-glob"));
@@ -54,6 +56,7 @@ async function crawlPlusFiles(userRootDir, outDirAbsoluteFilesystem) {
54
56
  (0, utils_js_1.assertPosixPath)(filePath);
55
57
  (0, utils_js_1.assert)(!filePath.startsWith(userRootDir));
56
58
  const filePathAbsoluteUserRootDir = path_1.default.posix.join('/', filePath);
59
+ (0, utils_js_1.assert)(isPlusFile(filePathAbsoluteUserRootDir));
57
60
  return { filePathAbsoluteUserRootDir };
58
61
  });
59
62
  return plusFiles;
@@ -228,3 +231,37 @@ function isGitCrawlDisabled() {
228
231
  const crawSettings = (0, getEnvVarObject_js_1.getEnvVarObject)('VIKE_CRAWL');
229
232
  return crawSettings?.git === false;
230
233
  }
234
+ function isPlusFile(filePath) {
235
+ (0, utils_js_1.assertPosixPath)(filePath);
236
+ if ((0, transpileAndExecuteFile_js_1.isTemporaryBuildFile)(filePath))
237
+ return false;
238
+ const fileName = filePath.split('/').pop();
239
+ return fileName.startsWith('+');
240
+ }
241
+ function getPlusFileValueConfigName(filePath) {
242
+ if (!isPlusFile(filePath))
243
+ return null;
244
+ const fileName = path_1.default.posix.basename(filePath);
245
+ // assertNoUnexpectedPlusSign(filePath, fileName)
246
+ const basename = fileName.split('.')[0];
247
+ (0, utils_js_1.assert)(basename.startsWith('+'));
248
+ const configName = basename.slice(1);
249
+ (0, utils_js_1.assertUsage)(configName !== '', `${filePath} Invalid filename ${fileName}`);
250
+ return configName;
251
+ }
252
+ /* https://github.com/vikejs/vike/issues/1407
253
+ function assertNoUnexpectedPlusSign(filePath: string, fileName: string) {
254
+ const dirs = path.posix.dirname(filePath).split('/')
255
+ dirs.forEach((dir, i) => {
256
+ const dirPath = dirs.slice(0, i + 1).join('/')
257
+ assertUsage(
258
+ !dir.includes('+'),
259
+ `Character '+' is a reserved character: remove '+' from the directory name ${dirPath}/`
260
+ )
261
+ })
262
+ assertUsage(
263
+ !fileName.slice(1).includes('+'),
264
+ `Character '+' is only allowed at the beginning of filenames: make sure ${filePath} doesn't contain any '+' in its filename other than its first letter`
265
+ )
266
+ }
267
+ */
@@ -1,27 +1,21 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
3
  exports.getPlusFilesAll = getPlusFilesAll;
7
- exports.getPlusFileValueConfigName = getPlusFileValueConfigName;
8
4
  const utils_js_1 = require("../../../../utils.js");
9
5
  const configDefinitionsBuiltIn_js_1 = require("./configDefinitionsBuiltIn.js");
10
6
  const filesystemRouting_js_1 = require("./filesystemRouting.js");
11
- const transpileAndExecuteFile_js_1 = require("./transpileAndExecuteFile.js");
12
7
  const crawlPlusFiles_js_1 = require("./crawlPlusFiles.js");
13
8
  const getConfigFileExport_js_1 = require("./getConfigFileExport.js");
14
9
  const loadFileAtConfigTime_js_1 = require("./loadFileAtConfigTime.js");
15
10
  const resolvePointerImport_js_1 = require("./resolvePointerImport.js");
16
11
  const getFilePath_js_1 = require("../../../../shared/getFilePath.js");
17
12
  const assertExtensions_js_1 = require("./assertExtensions.js");
18
- const node_path_1 = __importDefault(require("node:path"));
19
13
  async function getPlusFilesAll(userRootDir, esbuildCache) {
20
14
  const plusFiles = await findPlusFiles(userRootDir, null);
21
15
  const configFiles = [];
22
16
  const valueFiles = [];
23
17
  plusFiles.forEach((f) => {
24
- if (getPlusFileValueConfigName(f.filePathAbsoluteFilesystem) === 'config') {
18
+ if ((0, crawlPlusFiles_js_1.getPlusFileValueConfigName)(f.filePathAbsoluteFilesystem) === 'config') {
25
19
  configFiles.push(f);
26
20
  }
27
21
  else {
@@ -66,7 +60,7 @@ async function getPlusFilesAll(userRootDir, esbuildCache) {
66
60
  ...valueFiles.map(async (filePath) => {
67
61
  const { filePathAbsoluteUserRootDir } = filePath;
68
62
  (0, utils_js_1.assert)(filePathAbsoluteUserRootDir);
69
- const configName = getPlusFileValueConfigName(filePathAbsoluteUserRootDir);
63
+ const configName = (0, crawlPlusFiles_js_1.getPlusFileValueConfigName)(filePathAbsoluteUserRootDir);
70
64
  (0, utils_js_1.assert)(configName);
71
65
  const locationId = (0, filesystemRouting_js_1.getLocationId)(filePathAbsoluteUserRootDir);
72
66
  const plusFile = {
@@ -125,35 +119,3 @@ async function findPlusFiles(userRootDir, outDirRoot) {
125
119
  const plusFiles = files.map(({ filePathAbsoluteUserRootDir }) => (0, getFilePath_js_1.getFilePathResolved)({ filePathAbsoluteUserRootDir, userRootDir }));
126
120
  return plusFiles;
127
121
  }
128
- function getPlusFileValueConfigName(filePath) {
129
- (0, utils_js_1.assertPosixPath)(filePath);
130
- if ((0, transpileAndExecuteFile_js_1.isTemporaryBuildFile)(filePath))
131
- return null;
132
- const fileName = node_path_1.default.posix.basename(filePath);
133
- // assertNoUnexpectedPlusSign(filePath, fileName)
134
- const basename = fileName.split('.')[0];
135
- if (!basename.startsWith('+')) {
136
- return null;
137
- }
138
- else {
139
- const configName = basename.slice(1);
140
- (0, utils_js_1.assertUsage)(configName !== '', `${filePath} Invalid filename ${fileName}`);
141
- return configName;
142
- }
143
- }
144
- /* https://github.com/vikejs/vike/issues/1407
145
- function assertNoUnexpectedPlusSign(filePath: string, fileName: string) {
146
- const dirs = path.posix.dirname(filePath).split('/')
147
- dirs.forEach((dir, i) => {
148
- const dirPath = dirs.slice(0, i + 1).join('/')
149
- assertUsage(
150
- !dir.includes('+'),
151
- `Character '+' is a reserved character: remove '+' from the directory name ${dirPath}/`
152
- )
153
- })
154
- assertUsage(
155
- !fileName.slice(1).includes('+'),
156
- `Character '+' is only allowed at the beginning of filenames: make sure ${filePath} doesn't contain any '+' in its filename other than its first letter`
157
- )
158
- }
159
- */
@@ -28,6 +28,7 @@ if (debugEsbuildResolve.isActivated)
28
28
  debugEsbuildResolve('esbuild version', esbuild_1.version);
29
29
  async function transpileAndExecuteFile(filePath, userRootDir, isExtensionConfig, esbuildCache) {
30
30
  const { filePathAbsoluteFilesystem, filePathToShowToUserResolved } = filePath;
31
+ (0, utils_js_1.assert)(filePathAbsoluteFilesystem);
31
32
  const fileExtension = getFileExtension(filePathAbsoluteFilesystem);
32
33
  if (esbuildCache[filePathAbsoluteFilesystem]) {
33
34
  return await esbuildCache[filePathAbsoluteFilesystem];
@@ -54,6 +55,7 @@ async function transpileAndExecuteFile(filePath, userRootDir, isExtensionConfig,
54
55
  }
55
56
  async function transpileFile(filePath, transformImports, userRootDir) {
56
57
  const { filePathAbsoluteFilesystem, filePathToShowToUserResolved } = filePath;
58
+ (0, utils_js_1.assert)(filePathAbsoluteFilesystem);
57
59
  (0, utils_js_1.assertPosixPath)(filePathAbsoluteFilesystem);
58
60
  getVikeConfig_js_1.vikeConfigDependencies.add(filePathAbsoluteFilesystem);
59
61
  if (debug.isActivated)
@@ -37,6 +37,7 @@ function reloadVikeConfig(config) {
37
37
  const userRootDir = config.root;
38
38
  const vikeVitePluginOptions = config._vikeVitePluginOptions;
39
39
  (0, utils_js_1.assert)(vikeVitePluginOptions);
40
+ // TODO/now: unify with esbuildCache
40
41
  vikeConfigDependencies.clear();
41
42
  vikeConfigPromise = loadVikeConfig_withErrorHandling(userRootDir, true, vikeVitePluginOptions);
42
43
  handleReloadSideEffects();
@@ -132,7 +133,8 @@ async function loadVikeConfig_withErrorHandling(userRootDir, isDev, vikeVitePlug
132
133
  configDefinitions: {},
133
134
  configValueSources: {}
134
135
  },
135
- global: (0, getPageConfigUserFriendly_js_1.getPageConfigUserFriendlyNew)({ configValues: {} })
136
+ global: (0, getPageConfigUserFriendly_js_1.getPageConfigUserFriendlyNew)({ configValues: {} }),
137
+ pages: {}
136
138
  };
137
139
  return dummyData;
138
140
  }
@@ -141,15 +143,26 @@ async function loadVikeConfig_withErrorHandling(userRootDir, isDev, vikeVitePlug
141
143
  async function loadVikeConfig(userRootDir, vikeVitePluginOptions) {
142
144
  const esbuildCache = {};
143
145
  const plusFilesAll = await (0, getPlusFilesAll_js_1.getPlusFilesAll)(userRootDir, esbuildCache);
144
- // assertKnownConfigs(plusFilesAll)
145
146
  const configDefinitionsResolved = await resolveConfigDefinitions(plusFilesAll, userRootDir, esbuildCache);
147
+ assertKnownConfigs(configDefinitionsResolved, plusFilesAll);
146
148
  const { pageConfigGlobal, pageConfigs } = getPageConfigsBuildTime(configDefinitionsResolved, plusFilesAll, userRootDir);
147
149
  // interop vike(options) in vite.config.js
148
150
  temp_interopVikeVitePlugin(pageConfigGlobal, vikeVitePluginOptions, userRootDir);
149
151
  // global
150
- const configValues = getConfigValues(pageConfigGlobal);
151
- const global = (0, getPageConfigUserFriendly_js_1.getPageConfigUserFriendlyNew)({ configValues });
152
- return { pageConfigs, pageConfigGlobal, global };
152
+ const configValuesGlobal = getConfigValues(pageConfigGlobal);
153
+ const global = (0, getPageConfigUserFriendly_js_1.getPageConfigUserFriendlyNew)({ configValues: configValuesGlobal });
154
+ // TODO/now DEDUPE
155
+ // pages
156
+ const pages = (0, utils_js_1.objectFromEntries)(pageConfigs.map((pageConfig) => {
157
+ const configValuesLocal = getConfigValues(pageConfig, true);
158
+ const configValues = { ...configValuesGlobal, ...configValuesLocal };
159
+ const page = {
160
+ ...(0, getPageConfigUserFriendly_js_1.getPageConfigUserFriendlyNew)({ configValues }),
161
+ route: pageConfig.routeFilesystem?.routeString ?? null
162
+ };
163
+ return [pageConfig.pageId, page];
164
+ }));
165
+ return { pageConfigs, pageConfigGlobal, global, pages };
153
166
  }
154
167
  async function resolveConfigDefinitions(plusFilesAll, userRootDir, esbuildCache) {
155
168
  const configDefinitionsGlobal = getConfigDefinitions(
@@ -289,7 +302,7 @@ function assertOnBeforeRenderEnv(pageConfig) {
289
302
  // 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
290
303
  (0, utils_js_1.assertUsage)(!(onBeforeRenderEnv.client && !isClientRouting), `Page ${pageConfig.pageId} has an onBeforeRender() hook with env ${picocolors_1.default.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.`);
291
304
  }
292
- function getConfigValues(pageConfig) {
305
+ function getConfigValues(pageConfig, tolerateMissingValue) {
293
306
  const configValues = {};
294
307
  (0, serializeConfigValues_js_1.getConfigValuesBase)(pageConfig, (configEnv) => !!configEnv.config, null).forEach((entry) => {
295
308
  if (entry.configValueBase.type === 'computed') {
@@ -300,7 +313,11 @@ function getConfigValues(pageConfig) {
300
313
  if (entry.configValueBase.type === 'standard') {
301
314
  (0, utils_js_1.assert)('sourceRelevant' in entry); // Help TS
302
315
  const { configValueBase, sourceRelevant, configName } = entry;
303
- (0, utils_js_1.assert)('value' in sourceRelevant);
316
+ if (!sourceRelevant.valueIsLoaded) {
317
+ if (tolerateMissingValue)
318
+ return;
319
+ (0, utils_js_1.assert)(false);
320
+ }
304
321
  const { value } = sourceRelevant;
305
322
  configValues[configName] = { ...configValueBase, value };
306
323
  }
@@ -309,9 +326,18 @@ function getConfigValues(pageConfig) {
309
326
  const { configValueBase, sourcesRelevant, configName } = entry;
310
327
  const values = [];
311
328
  sourcesRelevant.forEach((source) => {
312
- (0, utils_js_1.assert)('value' in source);
329
+ if (!source.valueIsLoaded) {
330
+ if (tolerateMissingValue)
331
+ return;
332
+ (0, utils_js_1.assert)(false);
333
+ }
313
334
  values.push(source.value);
314
335
  });
336
+ if (values.length === 0) {
337
+ if (tolerateMissingValue)
338
+ return;
339
+ (0, utils_js_1.assert)(false);
340
+ }
315
341
  configValues[configName] = { ...configValueBase, value: values };
316
342
  }
317
343
  });
@@ -356,7 +382,6 @@ function getPlusFilesRelevant(plusFilesAll, locationIdPage) {
356
382
  return plusFilesRelevant;
357
383
  }
358
384
  function sortForGlobal(plusFilesAll) {
359
- const locationIdsAll = (0, utils_js_1.objectKeys)(plusFilesAll);
360
385
  const plusFilesAllSorted = Object.fromEntries((0, utils_js_1.objectEntries)(plusFilesAll)
361
386
  .sort((0, utils_js_1.lowerFirst)(([locationId]) => locationId.split('/').length))
362
387
  .sort((0, utils_js_1.makeFirst)(([locationId]) => isGlobalLocation(locationId, plusFilesAll))));
@@ -753,13 +778,13 @@ function getComputed(configValueSources, configDefinitions) {
753
778
  return configValuesComputed;
754
779
  }
755
780
  // Show error message upon unknown config
756
- function assertKnownConfigs(plusFilesAll) {
781
+ function assertKnownConfigs(configDefinitionsResolved, plusFilesAll) {
757
782
  const configDefinitionsAll = getConfigDefinitions(plusFilesAll);
758
783
  const configNamesKnownAll = Object.keys(configDefinitionsAll);
759
- (0, utils_js_1.objectEntries)(plusFilesAll).forEach(([locationId, plusFiles]) => {
760
- const plusFilesRelevant = getPlusFilesRelevant(plusFilesAll, locationId);
761
- const configDefinitionsLocal = getConfigDefinitions(plusFilesRelevant);
762
- const configNamesKnownLocal = Object.keys(configDefinitionsLocal);
784
+ const configNamesGlobal = Object.keys(configDefinitionsResolved.configDefinitionsGlobal);
785
+ (0, utils_js_1.objectEntries)(configDefinitionsResolved.configDefinitionsLocal).forEach(([_locationId, { configDefinitions, plusFiles }]) => {
786
+ const configDefinitionsLocal = configDefinitions;
787
+ const configNamesKnownLocal = [...Object.keys(configDefinitionsLocal), ...configNamesGlobal];
763
788
  plusFiles.forEach((plusFile) => {
764
789
  const configNames = getDefiningConfigNames(plusFile);
765
790
  configNames.forEach((configName) => {
@@ -21,7 +21,7 @@ exports.assertBuildInfo = assertBuildInfo;
21
21
  exports.getViteConfigRuntime = getViteConfigRuntime;
22
22
  exports.updateUserFiles = updateUserFiles;
23
23
  // The core logic revolves around:
24
- // - globalObject.userFiles which is the main requirement for assembleGlobalContext()
24
+ // - globalObject.userFiles which is the main requirement for resolveGlobalContext()
25
25
  // - In production: globalObject.buildEntry which is the production entry set by @brillout/vite-plugin-server-entry
26
26
  // - loadBuildEntry() sets globalObject.buildEntry and then sets globalObject.userFiles
27
27
  // - With vike-server it's set at server start: @brillout/vite-plugin-server-entry injects `import './entry.mjs'` (the production entry generated by @brillout/vite-plugin-server-entry) as first line of code of dist/server/index.mjs while dist/server/entry.mjs calls setGlobalContext_buildEntry()
@@ -35,6 +35,7 @@ const picocolors_1 = __importDefault(require("@brillout/picocolors"));
35
35
  const loadPageRoutes_js_1 = require("../../shared/route/loadPageRoutes.js");
36
36
  const assertV1Design_js_1 = require("../shared/assertV1Design.js");
37
37
  const getPageConfigsRuntime_js_1 = require("../../shared/getPageConfigsRuntime.js");
38
+ const resolveBase_js_1 = require("../shared/resolveBase.js");
38
39
  const debug = (0, utils_js_1.createDebugger)('vike:globalContext');
39
40
  const globalObject = (0, utils_js_1.getGlobalObject)('globalContext.ts', getInitialGlobalContext());
40
41
  async function getGlobalContextInternal() {
@@ -78,8 +79,14 @@ async function getGlobalContextAsync(isProduction) {
78
79
  return globalContext_public;
79
80
  }
80
81
  function makePublic(globalContext) {
81
- // TODO/soon: add `pages`
82
- const globalContextPublic = (0, utils_js_1.makePublicCopy)(globalContext, 'globalContext', ['assetsManifest', 'config', 'viteConfig']);
82
+ const globalContextPublic = (0, utils_js_1.makePublicCopy)(globalContext, 'globalContext', [
83
+ 'assetsManifest',
84
+ 'config',
85
+ 'viteConfig',
86
+ 'pages',
87
+ 'baseServer',
88
+ 'baseAssets'
89
+ ]);
83
90
  return globalContextPublic;
84
91
  }
85
92
  async function setGlobalContext_viteDevServer(viteDevServer) {
@@ -183,7 +190,7 @@ function setIsProduction(isProduction) {
183
190
  globalObject.isProduction = isProduction;
184
191
  }
185
192
  function defineGlobalContext() {
186
- const globalContext = assembleGlobalContext();
193
+ const globalContext = resolveGlobalContext();
187
194
  assertIsDefined(globalContext);
188
195
  const globalContext_public = makePublic(globalContext);
189
196
  (0, utils_js_1.objectAssign)(globalContext, { globalContext_public });
@@ -192,7 +199,7 @@ function defineGlobalContext() {
192
199
  assertGlobalContextIsDefined();
193
200
  (0, utils_js_1.onSetupRuntime)();
194
201
  }
195
- function assembleGlobalContext() {
202
+ function resolveGlobalContext() {
196
203
  const { viteDevServer, viteConfig, isPrerendering, isProduction, userFiles } = globalObject;
197
204
  (0, utils_js_1.assert)(typeof isProduction === 'boolean');
198
205
  let globalContext;
@@ -211,7 +218,8 @@ function assembleGlobalContext() {
211
218
  viteDevServer,
212
219
  viteConfig,
213
220
  ...userFiles,
214
- viteConfigRuntime
221
+ viteConfigRuntime,
222
+ ...resolveBaseRuntime(viteConfigRuntime, userFiles.config)
215
223
  };
216
224
  }
217
225
  else {
@@ -228,7 +236,8 @@ function assembleGlobalContext() {
228
236
  ...userFiles,
229
237
  viteDevServer: null,
230
238
  viteConfigRuntime: buildInfo.viteConfigRuntime,
231
- usesClientRouter: buildInfo.usesClientRouter
239
+ usesClientRouter: buildInfo.usesClientRouter,
240
+ ...resolveBaseRuntime(buildInfo.viteConfigRuntime, userFiles.config)
232
241
  };
233
242
  if (isPrerendering) {
234
243
  (0, utils_js_1.assert)(viteConfig);
@@ -253,7 +262,7 @@ async function getUserFiles() {
253
262
  const globalObject_ = globalObject;
254
263
  const { pageConfigsRuntime } = globalObject_;
255
264
  (0, utils_js_1.assert)(pageConfigsRuntime);
256
- const { pageFilesAll, allPageIds, pageConfigs, pageConfigGlobal, globalConfig } = pageConfigsRuntime;
265
+ const { pageFilesAll, allPageIds, pageConfigs, pageConfigGlobal, globalConfig, pageConfigsUserFriendly } = pageConfigsRuntime;
257
266
  const { pageRoutes, onBeforeRouteHook } = await (0, loadPageRoutes_js_1.loadPageRoutes)(pageFilesAll, pageConfigs, pageConfigGlobal, allPageIds);
258
267
  const userFiles = {
259
268
  pageFilesAll,
@@ -262,6 +271,7 @@ async function getUserFiles() {
262
271
  allPageIds,
263
272
  pageRoutes,
264
273
  onBeforeRouteHook,
274
+ pages: pageConfigsUserFriendly,
265
275
  config: globalConfig.config
266
276
  };
267
277
  (0, assertV1Design_js_1.assertV1Design)(
@@ -396,3 +406,9 @@ function getInitialGlobalContext() {
396
406
  viteDevServerPromiseResolve
397
407
  };
398
408
  }
409
+ function resolveBaseRuntime(viteConfigRuntime, config) {
410
+ const baseViteOriginal = viteConfigRuntime._baseViteOriginal;
411
+ const baseServerUnresolved = config.baseServer ?? null;
412
+ const baseAssetsUnresolved = config.baseAssets ?? null;
413
+ return (0, resolveBase_js_1.resolveBase)(baseViteOriginal, baseServerUnresolved, baseAssetsUnresolved);
414
+ }
@@ -22,7 +22,6 @@ const preparePageContextForUserConsumptionServerSide_js_1 = require("./preparePa
22
22
  const executeGuardHook_js_1 = require("../../../shared/route/executeGuardHook.js");
23
23
  const picocolors_1 = __importDefault(require("@brillout/picocolors"));
24
24
  const isServerSideError_js_1 = require("../../../shared/misc/isServerSideError.js");
25
- const resolveBase_js_1 = require("../../shared/resolveBase.js");
26
25
  async function renderPageAlreadyRouted(pageContext) {
27
26
  // pageContext.pageId can either be the:
28
27
  // - ID of the page matching the routing, or the
@@ -117,14 +116,13 @@ async function getPageContextInitEnhanced(pageContextInit, globalContext, { ssr:
117
116
  isClientSideNavigation: false
118
117
  } } = {}) {
119
118
  (0, utils_js_1.assert)(pageContextInit.urlOriginal);
120
- const { baseServer, baseAssets } = (0, resolveBase_js_1.resolveBaseRuntime)(globalContext);
121
119
  const pageContextInitEnhanced = {};
122
120
  (0, utils_js_1.objectAssign)(pageContextInitEnhanced, pageContextInit);
123
121
  (0, utils_js_1.objectAssign)(pageContextInitEnhanced, {
124
122
  _objectCreatedByVike: true,
125
123
  // The following is defined on `pageContext` because we can eventually make these non-global
126
- _baseServer: baseServer,
127
- _baseAssets: baseAssets,
124
+ _baseServer: globalContext.baseServer,
125
+ _baseAssets: globalContext.baseAssets,
128
126
  // TODO/now: add meta.default
129
127
  _includeAssetsImportedByServer: globalContext.config.includeAssetsImportedByServer ?? true,
130
128
  // TODO/soon: use GloablContext instead
@@ -23,7 +23,6 @@ const error_page_js_1 = require("../../shared/error-page.js");
23
23
  const handleErrorWithoutErrorPage_js_1 = require("./renderPage/handleErrorWithoutErrorPage.js");
24
24
  const loadUserFilesServerSide_js_1 = require("./renderPage/loadUserFilesServerSide.js");
25
25
  const resolveRedirects_js_1 = require("./renderPage/resolveRedirects.js");
26
- const resolveBase_js_1 = require("../shared/resolveBase.js");
27
26
  const globalObject = (0, utils_js_1.getGlobalObject)('runtime/renderPage.ts', {
28
27
  httpRequestsCount: 0
29
28
  });
@@ -343,7 +342,6 @@ function assertIsNotViteRequest(urlPathname, urlOriginal) {
343
342
  (0, utils_js_1.assertUsage)(false, `${picocolors_1.default.code('renderPage(pageContextInit)')} called with ${picocolors_1.default.code(`pageContextInit.urlOriginal===${JSON.stringify(urlOriginal)}`)} which is unexpected because the URL ${picocolors_1.default.bold(urlOriginal)} should have already been handled by the development middleware: make sure the ${picocolors_1.default.cyan('createDevMiddleware()')} middleware is executed *before* the ${picocolors_1.default.cyan('renderPage()')} middleware, see ${picocolors_1.default.underline('https://vike.dev/renderPage')}`);
344
343
  }
345
344
  async function normalizeUrl(pageContextInit, globalContext, httpRequestId) {
346
- const { baseServer } = (0, resolveBase_js_1.resolveBaseRuntime)(globalContext);
347
345
  const { trailingSlash, disableUrlNormalization } = globalContext.config;
348
346
  if (disableUrlNormalization)
349
347
  return null;
@@ -351,7 +349,7 @@ async function normalizeUrl(pageContextInit, globalContext, httpRequestId) {
351
349
  const { isPageContextRequest } = (0, handlePageContextRequestUrl_js_1.handlePageContextRequestUrl)(urlOriginal);
352
350
  if (isPageContextRequest)
353
351
  return null;
354
- const urlNormalized = (0, utils_js_1.normalizeUrlPathname)(urlOriginal, trailingSlash ?? false, baseServer);
352
+ const urlNormalized = (0, utils_js_1.normalizeUrlPathname)(urlOriginal, trailingSlash ?? false, globalContext.baseServer);
355
353
  if (!urlNormalized)
356
354
  return null;
357
355
  (0, loggerRuntime_js_1.logRuntimeInfo)?.(`URL normalized from ${picocolors_1.default.cyan(urlOriginal)} to ${picocolors_1.default.cyan(urlNormalized)} (https://vike.dev/url-normalization)`, httpRequestId, 'info');
@@ -361,8 +359,7 @@ async function normalizeUrl(pageContextInit, globalContext, httpRequestId) {
361
359
  return pageContextHttpResponse;
362
360
  }
363
361
  async function getPermanentRedirect(pageContextInit, globalContext, httpRequestId) {
364
- const { baseServer } = (0, resolveBase_js_1.resolveBaseRuntime)(globalContext);
365
- const urlWithoutBase = (0, utils_js_1.removeBaseServer)(pageContextInit.urlOriginal, baseServer);
362
+ const urlWithoutBase = (0, utils_js_1.removeBaseServer)(pageContextInit.urlOriginal, globalContext.baseServer);
366
363
  let origin = null;
367
364
  let urlTargetExternal = null;
368
365
  let urlTarget = (0, utils_js_1.modifyUrlPathname)(urlWithoutBase, (urlPathname) => {
@@ -393,9 +390,8 @@ async function getPermanentRedirect(pageContextInit, globalContext, httpRequestI
393
390
  }
394
391
  if (normalize(urlTarget) === normalize(urlWithoutBase))
395
392
  return null;
396
- const { baseServer } = (0, resolveBase_js_1.resolveBaseRuntime)(globalContext);
397
393
  if (!originChanged)
398
- urlTarget = (0, utils_js_1.prependBase)(urlTarget, baseServer);
394
+ urlTarget = (0, utils_js_1.prependBase)(urlTarget, globalContext.baseServer);
399
395
  (0, utils_js_1.assert)(urlTarget !== pageContextInit.urlOriginal);
400
396
  }
401
397
  (0, loggerRuntime_js_1.logRuntimeInfo)?.(`Permanent redirection defined by config.redirects (https://vike.dev/redirects)`, httpRequestId, 'info');
@@ -459,7 +455,7 @@ pageContextNominalPageInit, httpRequestId, pageContextErrorPageInit, globalConte
459
455
  return { pageContextAbort };
460
456
  }
461
457
  async function assertBaseUrl(pageContextInit, globalContext) {
462
- const { baseServer } = (0, resolveBase_js_1.resolveBaseRuntime)(globalContext);
458
+ const { baseServer } = globalContext;
463
459
  const { urlOriginal } = pageContextInit;
464
460
  const { urlWithoutPageContextRequestSuffix } = (0, handlePageContextRequestUrl_js_1.handlePageContextRequestUrl)(urlOriginal);
465
461
  const { hasBaseServer } = (0, utils_js_1.parseUrl)(urlWithoutPageContextRequestSuffix, baseServer);