vike 0.4.253-commit-d6e725f → 0.4.253-commit-56475f3

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.
@@ -8,5 +8,5 @@ import './assertEnvApiDevAndProd.js';
8
8
  * https://vike.dev/api#prerender
9
9
  */
10
10
  declare function prerender(options?: PrerenderOptions): Promise<{
11
- viteConfig: ResolvedConfig;
11
+ viteConfig: null | ResolvedConfig;
12
12
  }>;
@@ -4,7 +4,6 @@ export type { PrerenderContextPublic };
4
4
  export type { PrerenderTrigger };
5
5
  import type { PageFile } from '../../shared-server-client/getPageFiles.js';
6
6
  import { type GlobalContextServerInternal } from '../../server/runtime/globalContext.js';
7
- import { type ResolvedConfig } from 'vite';
8
7
  import type { ApiOptions } from '../api/types.js';
9
8
  type ProvidedByHook = null | {
10
9
  hookFilePath: string;
@@ -30,6 +29,8 @@ type PrerenderContext = {
30
29
  _noExtraDir: boolean | null;
31
30
  _prerenderedPageContexts: PrerenderedPageContexts;
32
31
  _requestIdCounter: number;
32
+ _userRootDir: string;
33
+ _outDirClient: string;
33
34
  };
34
35
  type Output<PageContext = PageContextPrerendered> = {
35
36
  filePath: string;
@@ -62,9 +63,7 @@ type PrerenderOptions = ApiOptions & {
62
63
  base?: string;
63
64
  };
64
65
  type PrerenderTrigger = '$ vike prerender' | 'prerender()' | 'auto-run';
65
- declare function runPrerender(options: PrerenderOptions | undefined, trigger: PrerenderTrigger): Promise<{
66
- viteConfig: ResolvedConfig;
67
- }>;
66
+ declare function runPrerender(options: PrerenderOptions | undefined, trigger: PrerenderTrigger): Promise<void>;
68
67
  declare function createPageContextPrerendering(urlOriginal: string, prerenderContext: PrerenderContext, globalContext: GlobalContextServerInternal, is404: boolean, pageId: string | undefined, providedByHook: ProvidedByHook): Promise<{
69
68
  _isOriginalObject: true;
70
69
  isPageContext: true;
@@ -124,13 +123,13 @@ declare function createPageContextPrerendering(urlOriginal: string, prerenderCon
124
123
  _isPrerendering: false;
125
124
  assetsManifest: null;
126
125
  _viteDevServer: import("vite").ViteDevServer | undefined;
127
- viteConfig: ResolvedConfig | undefined;
126
+ viteConfig: import("vite").ResolvedConfig | undefined;
128
127
  isClientSide: false;
129
128
  _pageRoutes: import("../../shared-server-client/route/loadPageRoutes.js").PageRoutes;
130
129
  _onBeforeRouteHook: import("../../shared-server-client/hooks/getHook.js").HookInternal | null;
131
130
  } | {
132
131
  _isPrerendering: true;
133
- viteConfig: ResolvedConfig;
132
+ viteConfig: import("vite").ResolvedConfig;
134
133
  _isProduction: true;
135
134
  assetsManifest: import("../../types/ViteManifest.js").ViteManifest;
136
135
  _viteDevServer: null;
@@ -25,7 +25,6 @@ import { createPageContextServer } from '../../server/runtime/renderPageServer/c
25
25
  import pc from '@brillout/picocolors';
26
26
  import { cpus } from 'node:os';
27
27
  import { getGlobalContextServerInternal, initGlobalContext_runPrerender, setGlobalContext_isPrerendering, setGlobalContext_prerenderContext, } from '../../server/runtime/globalContext.js';
28
- import { resolveConfig as resolveViteConfig } from 'vite';
29
28
  import { getPageFilesServerSide } from '../../shared-server-client/getPageFiles.js';
30
29
  import { getPageContextRequestUrl } from '../../shared-server-client/getPageContextRequestUrl.js';
31
30
  import { getUrlFromRouteString } from '../../shared-server-client/route/resolveRouteString.js';
@@ -40,7 +39,7 @@ import { getVikeConfigInternal } from '../vite/shared/resolveVikeConfigInternal.
40
39
  import { execHookSingleWithoutPageContext, isUserHookError } from '../../shared-server-client/hooks/execHook.js';
41
40
  import { setWasPrerenderRun } from './context.js';
42
41
  import { resolvePrerenderConfigGlobal, resolvePrerenderConfigLocal } from './resolvePrerenderConfig.js';
43
- import { getOutDirs } from '../vite/shared/getOutDirs.js';
42
+ import { getOutDirsAllFromRootNormalized } from '../vite/shared/getOutDirs.js';
44
43
  import fs from 'node:fs';
45
44
  import { getPublicProxy } from '../../shared-server-client/getPublicProxy.js';
46
45
  import { getStaticRedirectsForPrerender } from '../../server/runtime/renderPageServer/resolveRedirects.js';
@@ -57,9 +56,11 @@ async function runPrerender(options = {}, trigger) {
57
56
  console.log(`${pc.cyan(`vike v${PROJECT_VERSION}`)} ${pc.green('pre-rendering HTML...')}`);
58
57
  }
59
58
  await disableReactStreaming();
60
- const viteConfig = await resolveViteConfig(options.viteConfig || {}, 'build', 'production');
59
+ await initGlobalContext_runPrerender();
60
+ const { globalContext } = await getGlobalContextServerInternal();
61
+ // TO-DO/eventually: remove getVikeConfigInternal() to completely remove Vite dependency
62
+ // https://github.com/vikejs/vike/issues/3113
61
63
  const vikeConfig = await getVikeConfigInternal();
62
- const { outDirServer } = getOutDirs(viteConfig, undefined);
63
64
  const prerenderConfigGlobal = await resolvePrerenderConfigGlobal(vikeConfig);
64
65
  const { partial, noExtraDir, parallel, defaultLocalValue, isPrerenderingEnabled } = prerenderConfigGlobal;
65
66
  if (!isPrerenderingEnabled) {
@@ -72,12 +73,12 @@ async function runPrerender(options = {}, trigger) {
72
73
  `You're executing ${pc.cyan(standaloneTrigger)} but you didn't enable pre-rendering. Use the ${pc.cyan('prerender')} setting (${pc.underline('https://vike.dev/prerender')}) to enable pre-rendering for at least one page.`
73
74
  )
74
75
  */
75
- return { viteConfig };
76
+ return;
76
77
  }
77
78
  const concurrencyLimit = pLimit(parallel === false || parallel === 0 ? 1 : parallel === true || parallel === undefined ? cpus().length : parallel);
78
- await initGlobalContext_runPrerender();
79
- const { globalContext } = await getGlobalContextServerInternal();
80
79
  globalContext._pageFilesAll.forEach(assertExportNames);
80
+ const { root, build: { outDir: outDirRoot }, } = globalContext.viteConfigRuntime;
81
+ const { outDirServer, outDirClient } = getOutDirsAllFromRootNormalized(outDirRoot, root);
81
82
  const prerenderContext = {
82
83
  pageContexts: [],
83
84
  output: [],
@@ -85,6 +86,8 @@ async function runPrerender(options = {}, trigger) {
85
86
  _pageContextInit: options.pageContextInit ?? null,
86
87
  _prerenderedPageContexts: {},
87
88
  _requestIdCounter: 0,
89
+ _userRootDir: root,
90
+ _outDirClient: outDirClient,
88
91
  };
89
92
  const doNotPrerenderList = [];
90
93
  await collectDoNoPrerenderList(vikeConfig._pageConfigs, doNotPrerenderList, defaultLocalValue, concurrencyLimit, globalContext);
@@ -109,7 +112,7 @@ async function runPrerender(options = {}, trigger) {
109
112
  if (pageId) {
110
113
  prerenderContext._prerenderedPageContexts[pageId] = htmlFile.pageContext;
111
114
  }
112
- await writeFiles(htmlFile, viteConfig, options.onPagePrerender, prerenderContext, logLevel);
115
+ await writeFiles(htmlFile, prerenderContext, options.onPagePrerender, logLevel);
113
116
  };
114
117
  await prerenderPages(prerenderContext, concurrencyLimit, onComplete);
115
118
  warnContradictoryNoPrerenderList(prerenderContext._prerenderedPageContexts, doNotPrerenderList);
@@ -127,7 +130,6 @@ async function runPrerender(options = {}, trigger) {
127
130
  if (!prerenderConfigGlobal.keepDistServer) {
128
131
  fs.rmSync(outDirServer, { recursive: true });
129
132
  }
130
- return { viteConfig };
131
133
  }
132
134
  async function collectDoNoPrerenderList(pageConfigs, doNotPrerenderList, defaultLocalValue, concurrencyLimit, globalContext) {
133
135
  // V1 design
@@ -181,6 +183,7 @@ async function collectDoNoPrerenderList(pageConfigs, doNotPrerenderList, default
181
183
  }
182
184
  });
183
185
  }
186
+ // TO-DO/next-major-release: remove
184
187
  function assertExportNames(pageFile) {
185
188
  const { exportNames, fileType } = pageFile;
186
189
  assert(exportNames || fileType === '.page.route' || fileType === '.css', pageFile.filePath);
@@ -558,18 +561,16 @@ async function warnMissingPages(prerenderedPageContexts, globalContext, doNotPre
558
561
  assertWarning(partial, `Cannot pre-render page ${pageAt} because it has a non-static route, while there isn't any ${hookName}() hook returning an URL matching the page's route. You must use a ${hookName}() hook (https://vike.dev/${hookName}) for providing the list of URLs to be pre-rendered for that page. If you want to skip pre-rendering that page, you can remove this warning by setting +prerender to false at ${pageAt} (https://vike.dev/pre-rendering#partial) or by setting +prerender.partial to true (https://vike.dev/prerender#partial).`, { onlyOnce: true });
559
562
  });
560
563
  }
561
- async function writeFiles({ pageContext, htmlString, pageContextSerialized }, viteConfig, onPagePrerender, prerenderContext, logLevel) {
562
- const writeJobs = [write(pageContext, 'HTML', htmlString, viteConfig, onPagePrerender, prerenderContext, logLevel)];
564
+ async function writeFiles({ pageContext, htmlString, pageContextSerialized }, prerenderContext, onPagePrerender, logLevel) {
565
+ const writeJobs = [write(pageContext, 'HTML', htmlString, onPagePrerender, prerenderContext, logLevel)];
563
566
  if (pageContextSerialized !== null) {
564
- writeJobs.push(write(pageContext, 'JSON', pageContextSerialized, viteConfig, onPagePrerender, prerenderContext, logLevel));
567
+ writeJobs.push(write(pageContext, 'JSON', pageContextSerialized, onPagePrerender, prerenderContext, logLevel));
565
568
  }
566
569
  await Promise.all(writeJobs);
567
570
  }
568
- async function write(pageContext, fileType, fileContent, viteConfig, onPagePrerender, prerenderContext, logLevel) {
571
+ async function write(pageContext, fileType, fileContent, onPagePrerender, prerenderContext, logLevel) {
569
572
  const { urlOriginal } = pageContext;
570
573
  assert(urlOriginal.startsWith('/'));
571
- const { outDirClient } = getOutDirs(viteConfig, undefined);
572
- const { root } = viteConfig;
573
574
  let fileUrl;
574
575
  if (fileType === 'HTML') {
575
576
  const doNotCreateExtraDirectory = prerenderContext._noExtraDir ?? pageContext.is404;
@@ -585,6 +586,7 @@ async function write(pageContext, fileType, fileContent, viteConfig, onPagePrere
585
586
  assert(!filePathRelative.startsWith('/'),
586
587
  // https://github.com/vikejs/vike/issues/1929
587
588
  { urlOriginal, fileUrl });
589
+ const { _outDirClient: outDirClient } = prerenderContext;
588
590
  assertPosixPath(outDirClient);
589
591
  assertPosixPath(filePathRelative);
590
592
  const filePath = path.posix.join(outDirClient, filePathRelative);
@@ -609,9 +611,10 @@ async function write(pageContext, fileType, fileContent, viteConfig, onPagePrere
609
611
  await mkdir(path.posix.dirname(filePath), { recursive: true });
610
612
  await writeFile(filePath, fileContent);
611
613
  if (logLevel === 'info') {
612
- assertPosixPath(root);
614
+ const { _userRootDir: userRootDir } = prerenderContext;
615
+ assertPosixPath(userRootDir);
613
616
  assertPosixPath(outDirClient);
614
- let outDirClientRelative = path.posix.relative(root, outDirClient);
617
+ let outDirClientRelative = path.posix.relative(userRootDir, outDirClient);
615
618
  if (!outDirClientRelative.endsWith('/')) {
616
619
  outDirClientRelative = outDirClientRelative + '/';
617
620
  }
@@ -5,7 +5,7 @@ export { runPrerender_forceExit };
5
5
  import type { InlineConfig, ResolvedConfig } from 'vite';
6
6
  import { PrerenderOptions } from './runPrerender.js';
7
7
  declare function runPrerenderFromAPI(options?: PrerenderOptions): Promise<{
8
- viteConfig: ResolvedConfig;
8
+ viteConfig: null | ResolvedConfig;
9
9
  }>;
10
10
  declare function runPrerenderFromCLIPrerenderCommand(): Promise<void>;
11
11
  declare function runPrerenderFromAutoRun(viteConfig: InlineConfig | undefined): Promise<{
@@ -8,10 +8,13 @@ import { isVikeCli } from '../cli/context.js';
8
8
  import { isViteCli } from '../vite/shared/isViteCli.js';
9
9
  import { runPrerender } from './runPrerender.js';
10
10
  import { logErrorServer } from '../../server/runtime/logErrorServer.js';
11
+ import { getGlobalContextServerInternal } from '../../server/runtime/globalContext.js';
11
12
  async function runPrerenderFromAPI(options = {}) {
12
13
  // - We purposely propagate the error to the user land, so that the error interrupts the user land. It's also, I guess, a nice-to-have that the user has control over the error.
13
14
  // - We don't use addErrorHint() because we don't have control over what happens with the error. For example, if the user land purposely swallows the error then the hint shouldn't be logged. Also, it's best if the hint is shown to the user *after* the error, but we cannot do/guarentee that.
14
- const { viteConfig } = await runPrerender(options, 'prerender()');
15
+ await runPrerender(options, 'prerender()');
16
+ const { globalContext } = await getGlobalContextServerInternal();
17
+ const viteConfig = globalContext.viteConfig ?? null;
15
18
  return { viteConfig };
16
19
  }
17
20
  async function runPrerenderFromCLIPrerenderCommand() {
@@ -46,7 +46,7 @@ function plugin(vikeVitePluginOptions = {}) {
46
46
  // TO-DO/next-major-release: remove
47
47
  const pluginAddendum = { _vikeVitePluginOptions: vikeVitePluginOptions };
48
48
  const promise = (async () => {
49
- if (skip())
49
+ if (removeVitePlugin())
50
50
  return [];
51
51
  const vikeConfig = await getVikeConfigInternalEarly();
52
52
  const plugin = [
@@ -89,26 +89,30 @@ function pluginBuild() {
89
89
  function pluginNonRunnabeDev() {
90
90
  return [...pluginViteRPC(), ...pluginReplaceConstantsNonRunnableDev()];
91
91
  }
92
- function skip() {
92
+ function removeVitePlugin() {
93
93
  // Early resolving of user Vite configs
94
94
  if (isOnlyResolvingUserConfig()) {
95
95
  return true;
96
96
  }
97
+ // *****************/
98
+ // **** Vitest *****/
99
+ // *****************/
97
100
  // For Vitest, we only add Vike's Vite plugin if Vike's JavaScript API is used.
98
101
  // - In the context of running unit tests with Vitest, Vike's Vite plugin doesn't add any value AFAICT.
99
- // - If the user calls Vike's JavaScript API inside Vitest (e.g. `build()` inside `beforeAll()`) => vite.config.js is loaded twice: once by Vitest and once by Vike => problematic because Vitest's environment is `development` whereas Vike's `build()` environment is `production` => the globalContext.ts isProd() function throws an assertion fail (I don't know why the two globalContext.ts instances aren't independent from each other) => that's why we skip Vike's Vite plugin when it's Vitest that loads vite.config.js
100
- // - When calling `$ vitest` Vitest loads vite.config.js if it lives at process.cwd()
101
- // - The user is supposed to use Vike's API instead of Vite's API. Vike supports Vite's API only for third parties (e.g. Vitest or Storybook).
102
+ // - If the user calls Vike's JavaScript API inside Vitest (e.g. `build()` inside `beforeAll()`)
103
+ // => vite.config.js is loaded twice: once by Vitest and once by Vike
104
+ // => problematic because Vitest's environment is `development` whereas Vike's `build()` environment is `production`
105
+ // => globalContext.ts internal logic isProd() is inconsistent and assertion fails.
106
+ // I don't know why the two globalContext.ts instances aren't independent from each other.
107
+ // https://github.com/vikejs/vike/blob/2d3be474441707f05a7932240f3506517a735f0d/packages/vike/src/server/runtime/globalContext.ts#L746-L753
108
+ // => that's why we skip Vike's Vite plugin when it's Vitest that loads vite.config.js
109
+ // - When running `$ vitest` Vitest loads vite.config.js if it lives at process.cwd()
110
+ // - The user is supposed to use Vike's API instead of Vite's API. Vike supports Vite's API only for third parties (e.g. Vitest and Storybook).
102
111
  // - https://vike.dev/vitest
103
- if (
104
- /* Maybe also all third party tools such as Storybook?
105
- !isViteCli() &&
106
- /*/
107
- isVitest() &&
108
- ///*/
109
- !isVikeCliOrApi()) {
112
+ if (isVitest() && !isVikeCliOrApi()) {
110
113
  return true;
111
114
  }
115
+ // TO-DO/eventually: also skip for other third party tools such as Storybook?
112
116
  return false;
113
117
  }
114
118
  // Error upon wrong usage
@@ -1,5 +1,6 @@
1
1
  export { getOutDirs };
2
2
  export { resolveOutDir };
3
+ export { getOutDirsAllFromRootNormalized };
3
4
  export type { OutDirs };
4
5
  import type { UserConfig, ResolvedConfig } from 'vite';
5
6
  import { type ViteEnv } from './isViteServerSide.js';
@@ -15,3 +16,4 @@ type OutDirs = {
15
16
  declare function getOutDirs(configGlobal: ResolvedConfig, viteEnv: ViteEnv | undefined): OutDirs;
16
17
  /** Appends `client/` or `server/` to `config.build.outDir` */
17
18
  declare function resolveOutDir(config: UserConfig, isServerSide: boolean): string;
19
+ declare function getOutDirsAllFromRootNormalized(outDirRoot: string, root: string): OutDirs;
@@ -1,5 +1,6 @@
1
1
  export { getOutDirs };
2
2
  export { resolveOutDir };
3
+ export { getOutDirsAllFromRootNormalized };
3
4
  import pc from '@brillout/picocolors';
4
5
  import { createDebug } from '../../../utils/debug.js';
5
6
  import { pathJoin, toPosixPath } from '../../../utils/path.js';
@@ -76,9 +77,12 @@ function getOutDirsAllFromRootNormalized(outDirRoot, root) {
76
77
  outDirRoot = pathJoin(root, outDirRoot);
77
78
  }
78
79
  let { outDirClient, outDirServer } = determineOutDirs(outDirRoot);
79
- outDirRoot = outDirRoot + '/';
80
- outDirClient = outDirClient + '/';
81
- outDirServer = outDirServer + '/';
80
+ if (!outDirRoot.endsWith('/'))
81
+ outDirRoot = outDirRoot + '/';
82
+ if (!outDirClient.endsWith('/'))
83
+ outDirClient = outDirClient + '/';
84
+ if (!outDirServer.endsWith('/'))
85
+ outDirServer = outDirServer + '/';
82
86
  assertNormalization(outDirRoot);
83
87
  assertNormalization(outDirClient);
84
88
  assertNormalization(outDirServer);
@@ -1,2 +1,2 @@
1
1
  import '../../../assertEnvVite.js';
2
- export declare const ignorePatternsBuiltIn: readonly ["**/node_modules/**", "**/ejected/**", "**/*.telefunc.*", "**/.history/**", "**/*.generated.*"];
2
+ export declare const ignorePatternsBuiltIn: readonly ["**/node_modules/**", "**/ejected/**", "**/*.telefunc.*", "**/.history/**", "**/*.generated.*", "**/*.spec.*", "**/*.test.*"];
@@ -13,4 +13,7 @@ export const ignorePatternsBuiltIn = [
13
13
  '**/.history/**',
14
14
  // https://github.com/vikejs/vike/discussions/2222
15
15
  '**/*.generated.*',
16
+ // https://github.com/vikejs/vike/issues/2347
17
+ '**/*.spec.*',
18
+ '**/*.test.*',
16
19
  ];
@@ -34,6 +34,7 @@ type VikeConfigInternal = GlobalConfigPublic & {
34
34
  _pageConfigs: PageConfigBuildTime[];
35
35
  _pageConfigGlobal: PageConfigGlobalBuildTime;
36
36
  _vikeConfigDependencies: Set<string>;
37
+ _extensions: PlusFile[];
37
38
  prerenderContext: PrerenderContext;
38
39
  };
39
40
  declare function reloadVikeConfig(): void;
@@ -228,12 +228,16 @@ async function resolveVikeConfigInternal(userRootDir, vikeVitePluginOptions, esb
228
228
  _from: globalConfigPublic._from,
229
229
  _pageConfigs: pageConfigs,
230
230
  });
231
+ const _extensions = Object.values(plusFilesByLocationId)
232
+ .flat()
233
+ .filter((p) => p.isConfigFile && p.isExtensionConfig);
231
234
  const vikeConfig = {
232
235
  ...globalConfigPublic,
233
236
  prerenderContext,
234
237
  _pageConfigs: pageConfigs,
235
238
  _pageConfigGlobal: pageConfigGlobal,
236
239
  _vikeConfigDependencies: esbuildCache.vikeConfigDependencies,
240
+ _extensions,
237
241
  };
238
242
  globalObject.vikeConfigSync = vikeConfig;
239
243
  return vikeConfig;
@@ -1194,6 +1198,7 @@ async function getVikeConfigDummy(esbuildCache) {
1194
1198
  ...globalConfigPublicDummy,
1195
1199
  prerenderContext: prerenderContextDummy,
1196
1200
  _vikeConfigDependencies: esbuildCache.vikeConfigDependencies,
1201
+ _extensions: [],
1197
1202
  };
1198
1203
  globalObject.vikeConfigSync = vikeConfigDummy;
1199
1204
  globalObject.isV1Design_ = true;
@@ -16,7 +16,18 @@ async function loadAndParseVirtualFilePageEntry(pageConfig, isDev) {
16
16
  // Catch @cloudflare/vite-plugin bug
17
17
  assertVirtualFileExports(moduleExports, () => 'configValuesSerialized' in moduleExports, moduleId);
18
18
  const virtualFileExportsPageEntry = moduleExports;
19
- const configValues = parseVirtualFileExportsPageEntry(virtualFileExportsPageEntry);
19
+ let configValues;
20
+ try {
21
+ configValues = parseVirtualFileExportsPageEntry(virtualFileExportsPageEntry);
22
+ }
23
+ catch (e) {
24
+ if (!(e instanceof ReferenceError))
25
+ throw e;
26
+ // Safari WebKit bug: dynamic import() may resolve before the module body executes,
27
+ // https://github.com/vikejs/vike/issues/3121
28
+ await new Promise((resolve) => setTimeout(resolve));
29
+ configValues = parseVirtualFileExportsPageEntry(virtualFileExportsPageEntry);
30
+ }
20
31
  Object.assign(pageConfig.configValues, configValues);
21
32
  objectAssign(pageConfig, { isPageEntryLoaded: true });
22
33
  return pageConfig;
@@ -1 +1 @@
1
- export declare const PROJECT_VERSION: "0.4.253-commit-d6e725f";
1
+ export declare const PROJECT_VERSION: "0.4.253-commit-56475f3";
@@ -1,2 +1,2 @@
1
1
  // Automatically updated by @brillout/release-me
2
- export const PROJECT_VERSION = '0.4.253-commit-d6e725f';
2
+ export const PROJECT_VERSION = '0.4.253-commit-56475f3';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vike",
3
- "version": "0.4.253-commit-d6e725f",
3
+ "version": "0.4.253-commit-56475f3",
4
4
  "repository": "https://github.com/vikejs/vike",
5
5
  "exports": {
6
6
  "./server": {