vike 0.4.250-commit-6161324 → 0.4.250-commit-2686732

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.
@@ -4,7 +4,7 @@ export { wasPrerenderRun };
4
4
  export { setWasPrerenderRun };
5
5
  import type { VikeConfigInternal } from '../vite/shared/resolveVikeConfigInternal.js';
6
6
  import type { PrerenderTrigger } from './runPrerender.js';
7
- declare function isPrerenderAutoRunEnabled(vikeConfig: VikeConfigInternal): boolean;
7
+ declare function isPrerenderAutoRunEnabled(vikeConfig: VikeConfigInternal): Promise<boolean>;
8
8
  declare function temp_disablePrerenderAutoRun(): void;
9
9
  declare function wasPrerenderRun(): false | PrerenderTrigger;
10
10
  declare function setWasPrerenderRun(trigger: PrerenderTrigger): void;
@@ -5,8 +5,8 @@ export { setWasPrerenderRun };
5
5
  import { getGlobalObject } from '../../utils/getGlobalObject.js';
6
6
  import { resolvePrerenderConfigGlobal } from './resolvePrerenderConfig.js';
7
7
  const globalObject = getGlobalObject('prerender/context.ts', {});
8
- function isPrerenderAutoRunEnabled(vikeConfig) {
9
- const prerenderConfigGlobal = resolvePrerenderConfigGlobal(vikeConfig);
8
+ async function isPrerenderAutoRunEnabled(vikeConfig) {
9
+ const prerenderConfigGlobal = await resolvePrerenderConfigGlobal(vikeConfig);
10
10
  return (prerenderConfigGlobal.isPrerenderingEnabled &&
11
11
  !(prerenderConfigGlobal || {}).disableAutoRun &&
12
12
  !globalObject.isDisabled &&
@@ -2,7 +2,7 @@ export { resolvePrerenderConfigGlobal };
2
2
  export { resolvePrerenderConfigLocal };
3
3
  import { VikeConfigInternal } from '../vite/shared/resolveVikeConfigInternal.js';
4
4
  import type { PageConfigBuildTime } from '../../types/PageConfig.js';
5
- declare function resolvePrerenderConfigGlobal(vikeConfig: Pick<VikeConfigInternal, 'config' | '_pageConfigs' | '_from'>): {
5
+ declare function resolvePrerenderConfigGlobal(vikeConfig: Pick<VikeConfigInternal, 'config' | '_pageConfigs' | '_from'>): Promise<{
6
6
  partial: boolean;
7
7
  redirects: boolean | null;
8
8
  noExtraDir: boolean | null;
@@ -13,7 +13,7 @@ declare function resolvePrerenderConfigGlobal(vikeConfig: Pick<VikeConfigInterna
13
13
  defaultLocalValue: boolean;
14
14
  isPrerenderingEnabledForAllPages: boolean;
15
15
  isPrerenderingEnabled: boolean;
16
- };
17
- declare function resolvePrerenderConfigLocal(pageConfig: PageConfigBuildTime): {
16
+ }>;
17
+ declare function resolvePrerenderConfigLocal(pageConfig: PageConfigBuildTime): Promise<{
18
18
  value: boolean;
19
- } | null;
19
+ } | null>;
@@ -3,11 +3,14 @@ export { resolvePrerenderConfigLocal };
3
3
  import { assert, assertUsage, isArray, isObject, objectAssign } from './utils.js';
4
4
  import { getConfigValueBuildTime } from '../../shared-server-client/page-configs/getConfigValueBuildTime.js';
5
5
  import { getConfigDefinedAt } from '../../shared-server-client/page-configs/getConfigDefinedAt.js';
6
- // When setting +prerender to an object => it also enables pre-rendering
6
+ import { isCallable } from '../../utils/isCallable.js';
7
+ // +prerender is callable but getGlobalContext() cannot be used (see https://github.com/vikejs/vike/issues/3002#issuecomment-3703878380) but it's still useful (see https://github.com/vikejs/vike/issues/3002#issuecomment-3704141813)
8
+ // When setting +prerender to an object => it activates pre-rendering
7
9
  const defaultValueForObject = true;
8
- function resolvePrerenderConfigGlobal(vikeConfig) {
10
+ async function resolvePrerenderConfigGlobal(vikeConfig) {
9
11
  const prerenderConfigs = vikeConfig.config.prerender || [];
10
- const prerenderSettings = prerenderConfigs.filter(isObject2);
12
+ const prerenderConfigsResolved = await Promise.all(prerenderConfigs.map((config) => (isCallable(config) ? config() : config)));
13
+ const prerenderSettings = prerenderConfigsResolved.filter(isObject2);
11
14
  const prerenderConfigGlobal = {
12
15
  partial: pickFirst(prerenderSettings.map((c) => c.partial)) ?? false,
13
16
  redirects: pickFirst(prerenderSettings.map((c) => c.redirects)) ?? null,
@@ -18,7 +21,7 @@ function resolvePrerenderConfigGlobal(vikeConfig) {
18
21
  };
19
22
  let defaultLocalValue = false;
20
23
  {
21
- const valueFirst = prerenderConfigs.filter((p) => !isObject(p) || p.enable !== null)[0];
24
+ const valueFirst = prerenderConfigsResolved.filter((p) => !isObject(p) || p.enable !== null)[0];
22
25
  if (valueFirst === true || (isObject(valueFirst) && (valueFirst.enable ?? defaultValueForObject))) {
23
26
  defaultLocalValue = true;
24
27
  }
@@ -31,28 +34,31 @@ function resolvePrerenderConfigGlobal(vikeConfig) {
31
34
  defaultLocalValue = true;
32
35
  }
33
36
  }
37
+ const pageConfigs = vikeConfig._pageConfigs;
38
+ const prerenderConfigLocalList = await Promise.all(pageConfigs.map(resolvePrerenderConfigLocal));
39
+ const isEnable = (prerenderConfigLocal) => prerenderConfigLocal?.value ?? defaultLocalValue;
34
40
  objectAssign(prerenderConfigGlobal, {
35
41
  defaultLocalValue,
36
- isPrerenderingEnabledForAllPages: vikeConfig._pageConfigs.length > 0 &&
37
- vikeConfig._pageConfigs.every((pageConfig) => resolvePrerenderConfigLocal(pageConfig)?.value ?? defaultLocalValue),
38
- isPrerenderingEnabled: vikeConfig._pageConfigs.length > 0 &&
39
- vikeConfig._pageConfigs.some((pageConfig) => resolvePrerenderConfigLocal(pageConfig)?.value ?? defaultLocalValue),
42
+ isPrerenderingEnabledForAllPages: pageConfigs.length > 0 && prerenderConfigLocalList.every(isEnable),
43
+ isPrerenderingEnabled: pageConfigs.length > 0 && prerenderConfigLocalList.some(isEnable),
40
44
  });
41
45
  // TO-DO/next-major-release: remove
42
46
  if (vikeConfig._pageConfigs.length === 0 && defaultLocalValue)
43
47
  prerenderConfigGlobal.isPrerenderingEnabled = true;
44
48
  return prerenderConfigGlobal;
45
49
  }
46
- function resolvePrerenderConfigLocal(pageConfig) {
50
+ async function resolvePrerenderConfigLocal(pageConfig) {
47
51
  const configValue = getConfigValueBuildTime(pageConfig, 'prerender');
48
52
  if (!configValue)
49
53
  return null;
50
54
  const values = configValue.value;
51
55
  assert(isArray(values));
52
- const value = values[0];
56
+ let value = values[0];
57
+ if (isCallable(value))
58
+ value = await value();
53
59
  assert(isArray(configValue.definedAtData));
54
60
  const configDefinedAt = getConfigDefinedAt('Config', 'prerender', configValue.definedAtData);
55
- assertUsage(typeof value === 'boolean', `${configDefinedAt} must be a boolean (it isn't defined at a global location)`);
61
+ assertUsage(typeof value === 'boolean', `${configDefinedAt} must be a boolean (or a function that returns a boolean) because it's defined as a page setting (not as a global setting)`);
56
62
  const prerenderConfigLocal = { value };
57
63
  return prerenderConfigLocal;
58
64
  }
@@ -45,7 +45,7 @@ async function runPrerender(options = {}, trigger) {
45
45
  const viteConfig = await resolveViteConfig(options.viteConfig || {}, 'build', 'production');
46
46
  const vikeConfig = await getVikeConfigInternal();
47
47
  const { outDirServer } = getOutDirs(viteConfig, undefined);
48
- const prerenderConfigGlobal = resolvePrerenderConfigGlobal(vikeConfig);
48
+ const prerenderConfigGlobal = await resolvePrerenderConfigGlobal(vikeConfig);
49
49
  const { partial, noExtraDir, parallel, defaultLocalValue, isPrerenderingEnabled } = prerenderConfigGlobal;
50
50
  if (!isPrerenderingEnabled) {
51
51
  assert(trigger !== 'auto-run');
@@ -117,8 +117,8 @@ async function runPrerender(options = {}, trigger) {
117
117
  }
118
118
  async function collectDoNoPrerenderList(pageConfigs, doNotPrerenderList, defaultLocalValue, concurrencyLimit, globalContext) {
119
119
  // V1 design
120
- pageConfigs.forEach((pageConfig) => {
121
- const prerenderConfigLocal = resolvePrerenderConfigLocal(pageConfig);
120
+ await Promise.all(pageConfigs.map(async (pageConfig) => {
121
+ const prerenderConfigLocal = await resolvePrerenderConfigLocal(pageConfig);
122
122
  const { pageId } = pageConfig;
123
123
  if (!prerenderConfigLocal) {
124
124
  if (!defaultLocalValue) {
@@ -131,7 +131,7 @@ async function collectDoNoPrerenderList(pageConfigs, doNotPrerenderList, default
131
131
  doNotPrerenderList.push({ pageId });
132
132
  }
133
133
  }
134
- });
134
+ }));
135
135
  // Old design
136
136
  // TO-DO/next-major-release: remove
137
137
  await Promise.all(globalContext._pageFilesAll
@@ -4,11 +4,12 @@ import { assertIsNotProductionRuntime, markSetup_vikeVitePlugin } from '../../ut
4
4
  import { assertNodeVersion } from '../../utils/assertNodeVersion.js';
5
5
  import { version as viteVersion } from 'vite';
6
6
  import { assertViteVersion } from '../../utils/assertViteVersion.js';
7
+ import { installUncaughtErrorHandlers } from '../../utils/installUncaughtErrorHandlers.js';
7
8
  function onLoad() {
8
9
  markSetup_vikeVitePlugin();
9
10
  assertIsNotBrowser();
10
11
  assertNodeVersion();
11
12
  assertViteVersion(viteVersion);
12
- // Ensure we don't bloat the server runtime with heavy dependencies such Vite and esbuild
13
- assertIsNotProductionRuntime();
13
+ assertIsNotProductionRuntime(); // Don't bloat server with heavy dependencies like Vite and esbuild
14
+ installUncaughtErrorHandlers();
14
15
  }
@@ -129,7 +129,7 @@ async function triggerPrerendering(config, viteEnv, bundle) {
129
129
  // - Issue & reproduction: https://github.com/vikejs/vike/issues/1154#issuecomment-1965954636
130
130
  if (!bundle[getManifestFilePathRelative(config.build.manifest)])
131
131
  return;
132
- if (!isPrerenderAutoRunEnabled(vikeConfig))
132
+ if (!(await isPrerenderAutoRunEnabled(vikeConfig)))
133
133
  return;
134
134
  const configInline = getFullBuildInlineConfig(config);
135
135
  const res = await runPrerenderFromAutoRun(configInline);
@@ -6,7 +6,8 @@ import { getMagicString } from '../../shared/getMagicString.js';
6
6
  // - Terser removes legal comments, but I guess users use terser to minify JavaScript so I guess it's a good thing that comment is removed.
7
7
  // - Rollup's banner feature doesn't work with Vite: https://github.com/vitejs/vite/issues/8412
8
8
  // - But, anyways, we want to prepend the banner at the beginning of each module, not at the beginning of each file (I believe that's what Rollup's banner feature does).
9
- // - Potential alternative: https://github.com/vitejs/vite/issues/21228#issuecomment-3627899741
9
+ // - Potential alternative: Rolldown's `postBanner` https://x.com/voidzerodev/status/2001683010446299613
10
+ // - Potential alternative: Rolldown's `//#region` https://github.com/vitejs/vite/issues/21228#issuecomment-3627899741
10
11
  function pluginModuleBanner() {
11
12
  let config;
12
13
  let isEnabled = false;
@@ -164,7 +164,7 @@ async function resolveVikeConfigInternal_withErrorHandling(userRootDir, isDev, v
164
164
  }
165
165
  else {
166
166
  logErrorServerDev(err, null);
167
- resolve(getVikeConfigDummy(esbuildCache));
167
+ resolve(await getVikeConfigDummy(esbuildCache));
168
168
  }
169
169
  }
170
170
  }
@@ -178,7 +178,7 @@ async function resolveVikeConfigInternal(userRootDir, vikeVitePluginOptions, esb
178
178
  temp_interopVikeVitePlugin(pageConfigGlobal, vikeVitePluginOptions, userRootDir);
179
179
  setCliAndApiOptions(pageConfigGlobal, configDefinitionsResolved);
180
180
  const globalConfigPublic = resolveGlobalConfig(pageConfigGlobal, pageConfigs);
181
- const prerenderContext = resolvePrerenderContext({
181
+ const prerenderContext = await resolvePrerenderContext({
182
182
  config: globalConfigPublic.config,
183
183
  _from: globalConfigPublic._from,
184
184
  _pageConfigs: pageConfigs,
@@ -1092,8 +1092,8 @@ function isGlobalLocation(locationId, plusFilesByLocationId) {
1092
1092
  .map(([locationId]) => locationId);
1093
1093
  return locationIdsPage.every((locId) => isInherited(locationId, locId));
1094
1094
  }
1095
- function resolvePrerenderContext(vikeConfig) {
1096
- const { isPrerenderingEnabled, isPrerenderingEnabledForAllPages } = resolvePrerenderConfigGlobal(vikeConfig);
1095
+ async function resolvePrerenderContext(vikeConfig) {
1096
+ const { isPrerenderingEnabled, isPrerenderingEnabledForAllPages } = await resolvePrerenderConfigGlobal(vikeConfig);
1097
1097
  globalObject.prerenderContext ?? (globalObject.prerenderContext = {
1098
1098
  isPrerenderingEnabled: false,
1099
1099
  isPrerenderingEnabledForAllPages: false,
@@ -1121,14 +1121,14 @@ function restartViteDevServer() {
1121
1121
  })();
1122
1122
  swallowViteLogForceOptimization_disable();
1123
1123
  }
1124
- function getVikeConfigDummy(esbuildCache) {
1124
+ async function getVikeConfigDummy(esbuildCache) {
1125
1125
  const pageConfigsDummy = [];
1126
1126
  const pageConfigGlobalDummy = {
1127
1127
  configValueSources: {},
1128
1128
  configDefinitions: {},
1129
1129
  };
1130
1130
  const globalConfigPublicDummy = resolveGlobalConfig(pageConfigGlobalDummy, pageConfigsDummy);
1131
- const prerenderContextDummy = resolvePrerenderContext({
1131
+ const prerenderContextDummy = await resolvePrerenderContext({
1132
1132
  config: globalConfigPublicDummy.config,
1133
1133
  _from: globalConfigPublicDummy._from,
1134
1134
  _pageConfigs: pageConfigsDummy,
@@ -4,9 +4,11 @@ import { assertNodeVersion } from '../utils/assertNodeVersion.js';
4
4
  import { setAssertAlwaysShowStackTrace } from '../utils/assert.js';
5
5
  import { installRequireShim } from '@brillout/require-shim';
6
6
  import { isDebugError } from '../utils/debug.js';
7
+ import { installUncaughtErrorHandlers } from '../utils/installUncaughtErrorHandlers.js';
7
8
  function onLoad() {
8
9
  assertIsNotBrowser();
9
10
  assertNodeVersion();
11
+ installUncaughtErrorHandlers();
10
12
  if (isDebugError()) {
11
13
  // Is also executed upon `$ vike build` because node/vite/utils.ts imports server/utils.ts
12
14
  Error.stackTraceLimit = Infinity;
@@ -265,76 +265,7 @@ type ConfigBuiltIn = {
265
265
  *
266
266
  * @default false
267
267
  */
268
- prerender?: boolean | ImportStringList | {
269
- /**
270
- * Allow only some of your pages to be pre-rendered.
271
- *
272
- * This setting doesn't affect the pre-rendering process: it merely suppresses the warnings when some of your pages cannot be pre-rendered.
273
- *
274
- * https://vike.dev/prerender#partial
275
- *
276
- * @default false
277
- */
278
- partial?: boolean;
279
- /**
280
- * Whether +redirects should be pre-rendered to HTML documents that redirect the user.
281
- *
282
- * https://vike.dev/prerender#redirects
283
- */
284
- redirects?: boolean;
285
- /**
286
- * Don't create a new directory for each HTML file.
287
- *
288
- * For example, generate `dist/client/about.html` instead of `dist/client/about/index.html`.
289
- *
290
- * https://vike.dev/prerender#noextradir
291
- *
292
- * @default false
293
- */
294
- noExtraDir?: boolean;
295
- /**
296
- * Number of concurrent pre-render jobs.
297
- *
298
- * Set to `false` to disable concurrency.
299
- *
300
- * https://vike.dev/prerender#parallel
301
- *
302
- * @default os.cpus().length
303
- */
304
- parallel?: boolean | number;
305
- /**
306
- * Disable the automatic initiation of the pre-rendering process when running `$ vike build`.
307
- *
308
- * Use this if you want to programmatically initiate the pre-rendering process instead.
309
- *
310
- * https://vike.dev/prerender#disableautorun
311
- *
312
- * @default false
313
- */
314
- disableAutoRun?: boolean;
315
- /**
316
- * Whether to enable pre-rendering.
317
- *
318
- * Setting `enable: null` enables you to set prerender settings without enabling pre-rendering by default.
319
- *
320
- * This is useful, for example, if you want pre-rendering to stay opt-in instead of opt-out while setting pre-render settings globally.
321
- *
322
- * https://vike.dev/prerender#enable
323
- *
324
- * @default true
325
- */
326
- enable?: boolean | null;
327
- /**
328
- * If you pre-render all your pages then Vike removes the `dist/server/` directory after pre-rendering has finished.
329
- *
330
- * If you set this setting to `true` then Vike won't remove the `dist/server/` directory.
331
- *
332
- * https://vike.dev/prerender#keepDistServer
333
- *
334
- * @default false
335
- */
336
- keepDistServer?: boolean;
337
- };
268
+ prerender?: PrerenderSetting | (() => PrerenderSetting | Promise<PrerenderSetting>) | ImportStringList;
338
269
  /**
339
270
  * Install Vike extensions.
340
271
  *
@@ -604,6 +535,76 @@ type ConfigBuiltIn = {
604
535
  */
605
536
  staticReplace?: StaticReplace[];
606
537
  };
538
+ type PrerenderSetting = boolean | {
539
+ /**
540
+ * Allow only some of your pages to be pre-rendered.
541
+ *
542
+ * This setting doesn't affect the pre-rendering process: it merely suppresses the warnings when some of your pages cannot be pre-rendered.
543
+ *
544
+ * https://vike.dev/prerender#partial
545
+ *
546
+ * @default false
547
+ */
548
+ partial?: boolean;
549
+ /**
550
+ * Whether +redirects should be pre-rendered to HTML documents that redirect the user.
551
+ *
552
+ * https://vike.dev/prerender#redirects
553
+ */
554
+ redirects?: boolean;
555
+ /**
556
+ * Don't create a new directory for each HTML file.
557
+ *
558
+ * For example, generate `dist/client/about.html` instead of `dist/client/about/index.html`.
559
+ *
560
+ * https://vike.dev/prerender#noextradir
561
+ *
562
+ * @default false
563
+ */
564
+ noExtraDir?: boolean;
565
+ /**
566
+ * Number of concurrent pre-render jobs.
567
+ *
568
+ * Set to `false` to disable concurrency.
569
+ *
570
+ * https://vike.dev/prerender#parallel
571
+ *
572
+ * @default os.cpus().length
573
+ */
574
+ parallel?: boolean | number;
575
+ /**
576
+ * Disable the automatic initiation of the pre-rendering process when running `$ vike build`.
577
+ *
578
+ * Use this if you want to programmatically initiate the pre-rendering process instead.
579
+ *
580
+ * https://vike.dev/prerender#disableautorun
581
+ *
582
+ * @default false
583
+ */
584
+ disableAutoRun?: boolean;
585
+ /**
586
+ * Whether to enable pre-rendering.
587
+ *
588
+ * Setting `enable: null` enables you to set prerender settings without enabling pre-rendering by default.
589
+ *
590
+ * This is useful, for example, if you want pre-rendering to stay opt-in instead of opt-out while setting pre-render settings globally.
591
+ *
592
+ * https://vike.dev/prerender#enable
593
+ *
594
+ * @default true
595
+ */
596
+ enable?: boolean | null;
597
+ /**
598
+ * If you pre-render all your pages then Vike removes the `dist/server/` directory after pre-rendering has finished.
599
+ *
600
+ * If you set this setting to `true` then Vike won't remove the `dist/server/` directory.
601
+ *
602
+ * https://vike.dev/prerender#keepDistServer
603
+ *
604
+ * @default false
605
+ */
606
+ keepDistServer?: boolean;
607
+ };
607
608
  type ConfigBuiltInResolved = {
608
609
  passToClient?: string[][];
609
610
  redirects?: Record<string, string>[];
@@ -1 +1 @@
1
- export declare const PROJECT_VERSION: "0.4.250-commit-6161324";
1
+ export declare const PROJECT_VERSION: "0.4.250-commit-2686732";
@@ -1,2 +1,2 @@
1
1
  // Automatically updated by @brillout/release-me
2
- export const PROJECT_VERSION = '0.4.250-commit-6161324';
2
+ export const PROJECT_VERSION = '0.4.250-commit-2686732';
@@ -0,0 +1,2 @@
1
+ export { installUncaughtErrorHandlers };
2
+ declare function installUncaughtErrorHandlers(): void;
@@ -0,0 +1,20 @@
1
+ export { installUncaughtErrorHandlers };
2
+ import { getGlobalObject } from './getGlobalObject.js';
3
+ const globalObject = getGlobalObject('./installUncaughtErrorHandlers.ts', {
4
+ installed: false,
5
+ });
6
+ // Avoid server shutdown upon uncaught errors, e.g. `setTimeout(() => throw new Error('Uncaught error'), 10)`
7
+ // If in the future we want to call +onError then let's use different handlers
8
+ function installUncaughtErrorHandlers() {
9
+ if (globalObject.installed)
10
+ return;
11
+ globalObject.installed = true;
12
+ if (typeof process === 'undefined')
13
+ return;
14
+ process?.addListener?.('uncaughtException', (err) => {
15
+ console.error(err);
16
+ });
17
+ process?.addListener?.('unhandledRejection', (err) => {
18
+ console.error(err);
19
+ });
20
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vike",
3
- "version": "0.4.250-commit-6161324",
3
+ "version": "0.4.250-commit-2686732",
4
4
  "repository": "https://github.com/vikejs/vike",
5
5
  "exports": {
6
6
  "./server": {
@@ -124,7 +124,7 @@
124
124
  "@brillout/json-serializer": "^0.5.21",
125
125
  "@brillout/picocolors": "^1.0.30",
126
126
  "@brillout/require-shim": "^0.1.2",
127
- "@brillout/vite-plugin-server-entry": "^0.7.15",
127
+ "@brillout/vite-plugin-server-entry": "^0.7.17",
128
128
  "cac": "^6.0.0",
129
129
  "es-module-lexer": "^1.0.0",
130
130
  "esbuild": ">=0.19.0",