vike 0.4.191-commit-7e0cd43 → 0.4.191-commit-e99a55e

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 (33) hide show
  1. package/dist/cjs/__internal/index.js +7 -9
  2. package/dist/cjs/node/plugin/plugins/autoFullBuild.js +9 -5
  3. package/dist/cjs/node/plugin/plugins/config/assertVikeConfig.js +4 -2
  4. package/dist/cjs/node/plugin/plugins/setGlobalContext.js +5 -0
  5. package/dist/cjs/node/prerender/runPrerender.js +4 -5
  6. package/dist/cjs/node/runtime/globalContext.js +73 -26
  7. package/dist/cjs/node/runtime/html/stream.js +37 -24
  8. package/dist/cjs/node/runtime/renderPage.js +3 -3
  9. package/dist/cjs/node/runtime/utils.js +1 -0
  10. package/dist/cjs/shared/hooks/getHook.js +4 -6
  11. package/dist/cjs/utils/PROJECT_VERSION.js +1 -1
  12. package/dist/cjs/utils/genPromise.js +9 -0
  13. package/dist/esm/__internal/index.d.ts +1 -1
  14. package/dist/esm/__internal/index.js +8 -10
  15. package/dist/esm/node/plugin/plugins/autoFullBuild.js +9 -5
  16. package/dist/esm/node/plugin/plugins/config/assertVikeConfig.js +4 -2
  17. package/dist/esm/node/plugin/plugins/setGlobalContext.js +7 -2
  18. package/dist/esm/node/prerender/runPrerender.js +7 -8
  19. package/dist/esm/node/runtime/globalContext.d.ts +12 -6
  20. package/dist/esm/node/runtime/globalContext.js +74 -27
  21. package/dist/esm/node/runtime/html/stream.js +37 -24
  22. package/dist/esm/node/runtime/renderPage.js +4 -4
  23. package/dist/esm/node/runtime/utils.d.ts +1 -0
  24. package/dist/esm/node/runtime/utils.js +1 -0
  25. package/dist/esm/shared/ConfigVike.d.ts +3 -3
  26. package/dist/esm/shared/hooks/getHook.d.ts +2 -2
  27. package/dist/esm/shared/hooks/getHook.js +3 -5
  28. package/dist/esm/utils/PROJECT_VERSION.d.ts +1 -1
  29. package/dist/esm/utils/PROJECT_VERSION.js +1 -1
  30. package/dist/esm/utils/genPromise.d.ts +4 -0
  31. package/dist/esm/utils/genPromise.js +5 -0
  32. package/dist/esm/utils/projectInfo.d.ts +1 -1
  33. package/package.json +1 -1
@@ -5,7 +5,6 @@ const index_js_1 = require("../shared/route/index.js");
5
5
  const getPageFiles_js_1 = require("../shared/getPageFiles.js");
6
6
  const globalContext_js_1 = require("../node/runtime/globalContext.js");
7
7
  const assertNodeEnv_js_1 = require("../utils/assertNodeEnv.js");
8
- const assert_js_1 = require("../utils/assert.js");
9
8
  const renderPageAlreadyRouted_js_1 = require("../node/runtime/renderPage/renderPageAlreadyRouted.js");
10
9
  /**
11
10
  * Used by {@link https://github.com/magne4000/vite-plugin-vercel|vite-plugin-vercel}
@@ -15,11 +14,10 @@ const renderPageAlreadyRouted_js_1 = require("../node/runtime/renderPage/renderP
15
14
  */
16
15
  async function getPagesAndRoutes() {
17
16
  (0, assertNodeEnv_js_1.handleNodeEnv_vitePluginVercel)();
18
- await (0, globalContext_js_1.initGlobalContext)(true);
19
- const globalContext = (0, globalContext_js_1.getGlobalContext)();
20
- (0, assert_js_1.assert)(globalContext.isProduction === true);
21
17
  const renderContext = await (0, renderPageAlreadyRouted_js_1.getRenderContext)();
22
- const { pageFilesAll, pageConfigs, allPageIds, pageRoutes } = renderContext;
18
+ const {
19
+ //
20
+ pageRoutes, pageFilesAll, pageConfigs, allPageIds } = renderContext;
23
21
  return {
24
22
  pageRoutes,
25
23
  pageFilesAll,
@@ -28,10 +26,10 @@ async function getPagesAndRoutes() {
28
26
  };
29
27
  }
30
28
  exports.getPagesAndRoutes = getPagesAndRoutes;
31
- // TODO: make it cleaner once the internal refactoring about global configs is done
32
- async function getPageFilesAllSafe() {
33
- await (0, globalContext_js_1.initGlobalContext)(false);
34
- await (0, globalContext_js_1.getGlobalContextAsync)();
29
+ // TODO: make it cleaner once the internal refactoring about global configs is done.
30
+ // Demo usage: https://github.com/vikejs/vike/pull/1823
31
+ async function getPageFilesAllSafe(isProduction) {
32
+ await (0, globalContext_js_1.initGlobalContext_getGlobalContextAsync)(isProduction);
35
33
  const globalContext = (0, globalContext_js_1.getGlobalContext)();
36
34
  const pageFilesAll = await (0, getPageFiles_js_1.getPageFilesAll)(false, globalContext.isProduction);
37
35
  return pageFilesAll;
@@ -94,23 +94,27 @@ async function triggerFullBuild(config, configVike, bundle) {
94
94
  (0, logErrorHint_js_1.logErrorHint)(err);
95
95
  process.exit(1);
96
96
  }
97
- if (configVike.prerender && !configVike.prerender.disableAutoRun) {
97
+ if (configVike.prerender && !configVike.prerender.disableAutoRun && configVike.disableAutoFullBuild !== 'prerender') {
98
98
  await (0, runPrerender_js_1.runPrerenderFromAutoFullBuild)({ viteConfig: configInline });
99
99
  forceExit = true;
100
100
  }
101
101
  }
102
102
  function abortViteBuildSsr(configVike) {
103
- if (!configVike.disableAutoFullBuild && (0, isViteCliCall_js_1.isViteCliCall)() && (0, isViteCliCall_js_1.getViteConfigFromCli)()?.build.ssr) {
103
+ if (configVike.disableAutoFullBuild !== true && (0, isViteCliCall_js_1.isViteCliCall)() && (0, isViteCliCall_js_1.getViteConfigFromCli)()?.build.ssr) {
104
104
  (0, utils_js_1.assertWarning)(false, `The CLI call ${picocolors_1.default.cyan('$ vite build --ssr')} is superfluous since ${picocolors_1.default.cyan('$ vite build')} also builds the server-side. If you want two separate build steps then use https://vike.dev/disableAutoFullBuild or use Vite's ${picocolors_1.default.cyan('build()')} API.`, { onlyOnce: true });
105
105
  process.exit(0);
106
106
  }
107
107
  }
108
108
  function isDisabled(configVike) {
109
- if (configVike.disableAutoFullBuild === null) {
110
- // TODO/v1-release: also enable autoFullBuild when running Vite's build() API
109
+ const { disableAutoFullBuild } = configVike;
110
+ if (disableAutoFullBuild === null || disableAutoFullBuild === 'prerender') {
111
+ // TODO/v1-release: remove autoFullBuild for both Vite's build() API and Vite's CLI
112
+ // - Tell users to use `$ vike build` instead of `$ vite build`
113
+ // - Remove the whole writeBundle() hook logic
114
+ // - make `$ vite build` only build the client-side
111
115
  return !(0, isViteCliCall_js_1.isViteCliCall)();
112
116
  }
113
117
  else {
114
- return configVike.disableAutoFullBuild;
118
+ return disableAutoFullBuild;
115
119
  }
116
120
  }
@@ -30,8 +30,10 @@ function checkConfigVike(configVike) {
30
30
  }
31
31
  {
32
32
  const prop = 'disableAutoFullBuild';
33
- if (!(0, utils_js_1.hasProp)(configVike, prop, 'boolean') && !(0, utils_js_1.hasProp)(configVike, prop, 'undefined'))
34
- return { prop, errMsg: 'should be a boolean' };
33
+ if (!(0, utils_js_1.hasProp)(configVike, prop, 'boolean') &&
34
+ !(0, utils_js_1.hasProp)(configVike, prop, 'undefined') &&
35
+ !(configVike[prop] === 'prerender'))
36
+ return { prop, errMsg: "should be a boolean or 'prerender'" };
35
37
  }
36
38
  {
37
39
  const prop = 'includeAssetsImportedByServer';
@@ -18,6 +18,11 @@ function setGlobalContext() {
18
18
  const isDev = (0, utils_js_1.isDev3)(env);
19
19
  (0, globalContext_js_1.setGlobalContext_isDev)(isDev);
20
20
  }
21
+ },
22
+ configResolved(config) {
23
+ const { outDirRoot } = (0, utils_js_1.getOutDirs)(config);
24
+ (0, utils_js_1.assertFilePathAbsoluteFilesystem)(outDirRoot); // Needed for loadImportBuild(outDir) of @brillout/vite-plugin-server-entry
25
+ (0, globalContext_js_1.setGlobalContext_viteConfig)(config, outDirRoot);
21
26
  }
22
27
  };
23
28
  }
@@ -83,7 +83,8 @@ async function runPrerenderFromAutoFullBuild(options) {
83
83
  exports.runPrerenderFromAutoFullBuild = runPrerenderFromAutoFullBuild;
84
84
  async function runPrerender(options, manuallyTriggered) {
85
85
  checkOutdatedOptions(options);
86
- (0, getHook_js_1.setIsPrerenderering)();
86
+ (0, globalContext_js_1.setGlobalContext_isPrerendering)();
87
+ (0, getHook_js_1.getHook_setIsPrerenderering)();
87
88
  const logLevel = !!options.onPagePrerender ? 'warn' : 'info';
88
89
  if (logLevel === 'info') {
89
90
  console.log(`${picocolors_1.default.cyan(`vike v${utils_js_1.projectInfo.projectVersion}`)} ${picocolors_1.default.green('pre-rendering HTML...')}`);
@@ -91,10 +92,9 @@ async function runPrerender(options, manuallyTriggered) {
91
92
  (0, utils_js_1.handleNodeEnv_prerender)();
92
93
  await disableReactStreaming();
93
94
  const viteConfig = await (0, vite_1.resolveConfig)(options.viteConfig || {}, 'vike pre-rendering', 'production');
94
- (0, globalContext_js_1.setGlobalContext_prerender)(viteConfig);
95
95
  assertLoadedConfig(viteConfig, options);
96
96
  const configVike = await (0, getConfigVike_js_1.getConfigVike)(viteConfig);
97
- const { outDirClient, outDirRoot } = (0, utils_js_1.getOutDirs)(viteConfig);
97
+ const { outDirClient } = (0, utils_js_1.getOutDirs)(viteConfig);
98
98
  const { root } = viteConfig;
99
99
  const prerenderConfig = configVike.prerender;
100
100
  if (!prerenderConfig) {
@@ -105,8 +105,7 @@ async function runPrerender(options, manuallyTriggered) {
105
105
  }
106
106
  const { partial = false, noExtraDir = false, parallel = true } = prerenderConfig || {};
107
107
  const concurrencyLimit = (0, utils_js_1.pLimit)(parallel === false || parallel === 0 ? 1 : parallel === true || parallel === undefined ? (0, os_1.cpus)().length : parallel);
108
- (0, utils_js_1.assertFilePathAbsoluteFilesystem)(outDirRoot); // Needed for loadImportBuild(outDir) of @brillout/vite-plugin-server-entry
109
- await (0, globalContext_js_1.initGlobalContext)(true, outDirRoot);
108
+ await (0, globalContext_js_1.initGlobalContext_runPrerender)();
110
109
  const renderContext = await (0, renderPageAlreadyRouted_js_1.getRenderContext)();
111
110
  renderContext.pageFilesAll.forEach(assertExportNames);
112
111
  const prerenderContext = {};
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.getRuntimeManifest = exports.setGlobalContext_prerender = exports.setGlobalContext_isDev = exports.setGlobalContext_viteDevServer = exports.getViteConfig = exports.getViteDevServer = exports.getGlobalContext = exports.initGlobalContext = exports.getGlobalContextAsync = exports.getGlobalContextSync = void 0;
6
+ exports.setGlobalContext_isPrerendering = exports.setGlobalContext_isDev = exports.setGlobalContext_viteConfig = exports.setGlobalContext_viteDevServer = exports.initGlobalContext_getGlobalContextAsync = exports.initGlobalContext_runPrerender = exports.initGlobalContext_renderPage = exports.getRuntimeManifest = exports.getViteConfig = exports.getViteDevServer = exports.getGlobalContext = exports.getGlobalContextAsync = exports.getGlobalContextSync = void 0;
7
7
  const utils_js_1 = require("./utils.js");
8
8
  const loadImportBuild_js_1 = require("./globalContext/loadImportBuild.js");
9
9
  const getPageFiles_js_1 = require("../../shared/getPageFiles.js");
@@ -12,10 +12,13 @@ const getConfigVike_js_1 = require("../shared/getConfigVike.js");
12
12
  const assertRuntimeManifest_js_1 = require("../shared/assertRuntimeManifest.js");
13
13
  const picocolors_1 = __importDefault(require("@brillout/picocolors"));
14
14
  const getPageFilesExports_js_1 = require("./page-files/getPageFilesExports.js");
15
- let resolveGlobalContext;
16
- const globalObject = (0, utils_js_1.getGlobalObject)('globalContext.ts', {
17
- globalContextPromise: new Promise((r) => (resolveGlobalContext = r))
18
- });
15
+ const globalObject = (0, utils_js_1.getGlobalObject)('globalContext.ts', (() => {
16
+ const { promise: viteDevServerPromise, resolve: viteDevServerPromiseResolve } = (0, utils_js_1.genPromise)();
17
+ return {
18
+ viteDevServerPromise,
19
+ viteDevServerPromiseResolve
20
+ };
21
+ })());
19
22
  function getGlobalContext() {
20
23
  (0, utils_js_1.assert)(globalObject.globalContext);
21
24
  return globalObject.globalContext;
@@ -28,10 +31,12 @@ function getGlobalContextSync() {
28
31
  }
29
32
  exports.getGlobalContextSync = getGlobalContextSync;
30
33
  /** @experimental https://vike.dev/getGlobalContext */
31
- async function getGlobalContextAsync() {
32
- await globalObject.globalContextPromise;
33
- (0, utils_js_1.assert)(globalObject.globalContext);
34
- return makePublic(globalObject.globalContext);
34
+ async function getGlobalContextAsync(isProduction) {
35
+ (0, utils_js_1.assertUsage)(typeof isProduction === 'boolean', `[getGlobalContextAsync(isProduction)] Argument ${picocolors_1.default.cyan('isProduction')} ${isProduction === undefined ? 'is missing' : `should be ${picocolors_1.default.cyan('true')} or ${picocolors_1.default.cyan('false')}`}`);
36
+ await initGlobalContext_getGlobalContextAsync(isProduction);
37
+ const { globalContext } = globalObject;
38
+ (0, utils_js_1.assert)(globalContext);
39
+ return makePublic(globalContext);
35
40
  }
36
41
  exports.getGlobalContextAsync = getGlobalContextAsync;
37
42
  function makePublic(globalContext) {
@@ -61,40 +66,84 @@ function makePublic(globalContext) {
61
66
  function setGlobalContext_viteDevServer(viteDevServer) {
62
67
  if (globalObject.viteDevServer)
63
68
  return;
64
- (0, utils_js_1.assert)(!globalObject.globalContext);
65
- globalObject.viteConfig = viteDevServer.config;
69
+ assertIsNotInitilizedYet();
70
+ (0, utils_js_1.assert)(globalObject.viteConfig);
66
71
  globalObject.viteDevServer = viteDevServer;
72
+ globalObject.viteDevServerPromiseResolve(viteDevServer);
67
73
  eagerlyLoadUserFiles();
68
74
  }
69
75
  exports.setGlobalContext_viteDevServer = setGlobalContext_viteDevServer;
76
+ function setGlobalContext_viteConfig(viteConfig, outDirRoot) {
77
+ if (globalObject.viteConfig)
78
+ return;
79
+ assertIsNotInitilizedYet();
80
+ globalObject.viteConfig = viteConfig;
81
+ globalObject.outDirRoot = outDirRoot;
82
+ }
83
+ exports.setGlobalContext_viteConfig = setGlobalContext_viteConfig;
84
+ function assertIsNotInitilizedYet() {
85
+ // In develpoment, globalObject.viteDevServer always needs to be awaited for before initializing globalObject.globalContext
86
+ (0, utils_js_1.assert)(!globalObject.globalContext);
87
+ }
70
88
  function setGlobalContext_isDev(isDev) {
71
89
  globalObject.isDev = isDev;
72
90
  }
73
91
  exports.setGlobalContext_isDev = setGlobalContext_isDev;
92
+ function setGlobalContext_isPrerendering() {
93
+ globalObject.isPrerendering = true;
94
+ }
95
+ exports.setGlobalContext_isPrerendering = setGlobalContext_isPrerendering;
74
96
  function getViteDevServer() {
75
97
  return globalObject.viteDevServer ?? null;
76
98
  }
77
99
  exports.getViteDevServer = getViteDevServer;
78
- function setGlobalContext_prerender(viteConfig) {
79
- if (globalObject.viteConfig)
80
- return;
81
- (0, utils_js_1.assert)(!globalObject.globalContext);
82
- globalObject.viteConfig = viteConfig;
83
- }
84
- exports.setGlobalContext_prerender = setGlobalContext_prerender;
85
100
  function getViteConfig() {
86
101
  return globalObject.viteConfig ?? null;
87
102
  }
88
103
  exports.getViteConfig = getViteConfig;
89
- async function initGlobalContext(isPrerendering = false, outDir) {
90
- if (globalObject.globalContext)
104
+ async function initGlobalContext_renderPage() {
105
+ await initGlobalContext(!globalObject.isDev);
106
+ }
107
+ exports.initGlobalContext_renderPage = initGlobalContext_renderPage;
108
+ async function initGlobalContext_runPrerender() {
109
+ (0, utils_js_1.assert)(globalObject.isPrerendering);
110
+ (0, utils_js_1.assert)(globalObject.viteConfig);
111
+ (0, utils_js_1.assert)(globalObject.outDirRoot);
112
+ // We assume initGlobalContext_runPrerender() to be called before:
113
+ // - initGlobalContext_renderPage()
114
+ // - initGlobalContext_getGlobalContextAsync()
115
+ (0, utils_js_1.assert)(!globalObject.globalContext);
116
+ await initGlobalContext(true);
117
+ }
118
+ exports.initGlobalContext_runPrerender = initGlobalContext_runPrerender;
119
+ async function initGlobalContext_getGlobalContextAsync(isProduction) {
120
+ if (!isProduction) {
121
+ const waitFor = 20;
122
+ const timeout = setTimeout(() => {
123
+ (0, utils_js_1.assertWarning)(false, `Vite's development server still not created after ${waitFor} seconds.`, {
124
+ onlyOnce: false,
125
+ showStackTrace: true
126
+ });
127
+ }, waitFor * 1000);
128
+ await globalObject.viteDevServerPromise;
129
+ clearTimeout(timeout);
130
+ }
131
+ await initGlobalContext(isProduction);
132
+ }
133
+ exports.initGlobalContext_getGlobalContextAsync = initGlobalContext_getGlobalContextAsync;
134
+ async function initGlobalContext(isProduction) {
135
+ if (globalObject.globalContext) {
136
+ (0, utils_js_1.assert)(globalObject.globalContext.isProduction === isProduction);
137
+ // We assume setGlobalContext_isPrerendering() is called before initGlobalContext()
138
+ (0, utils_js_1.assert)(globalObject.globalContext.isPrerendering === (globalObject.isPrerendering ?? false));
91
139
  return;
92
- const { viteDevServer, viteConfig, isDev } = globalObject;
140
+ }
141
+ const { viteDevServer, viteConfig, isDev, isPrerendering } = globalObject;
93
142
  (0, utils_js_1.assertNodeEnv_runtime)(isDev ?? false);
94
- if (isDev) {
143
+ if (!isProduction) {
95
144
  (0, utils_js_1.assert)(viteConfig);
96
- (0, utils_js_1.assert)(!isPrerendering);
97
145
  (0, utils_js_1.assert)(viteDevServer);
146
+ (0, utils_js_1.assert)(!isPrerendering);
98
147
  const configVike = await (0, getConfigVike_js_1.getConfigVike)(viteConfig);
99
148
  const pluginManifest = getRuntimeManifest(configVike);
100
149
  globalObject.globalContext = {
@@ -113,7 +162,7 @@ async function initGlobalContext(isPrerendering = false, outDir) {
113
162
  };
114
163
  }
115
164
  else {
116
- const buildEntries = await (0, loadImportBuild_js_1.loadImportBuild)(outDir);
165
+ const buildEntries = await (0, loadImportBuild_js_1.loadImportBuild)(globalObject.outDirRoot);
117
166
  assertBuildEntries(buildEntries, isPrerendering ?? false);
118
167
  const { pageFiles, assetsManifest, pluginManifest } = buildEntries;
119
168
  (0, getPageFiles_js_1.setPageFiles)(pageFiles);
@@ -149,9 +198,7 @@ async function initGlobalContext(isPrerendering = false, outDir) {
149
198
  globalObject.globalContext = globalContext;
150
199
  }
151
200
  }
152
- resolveGlobalContext(globalObject.globalContext);
153
201
  }
154
- exports.initGlobalContext = initGlobalContext;
155
202
  function getRuntimeManifest(configVike) {
156
203
  const { includeAssetsImportedByServer, baseServer, baseAssets, redirects, trailingSlash, disableUrlNormalization } = configVike;
157
204
  const manifest = {
@@ -44,16 +44,15 @@ async function streamReadableNodeToString(readableNode) {
44
44
  }
45
45
  async function streamReadableWebToString(readableWeb) {
46
46
  const reader = readableWeb.getReader();
47
- const decoder = new TextDecoder();
47
+ const { decode, getClosingChunk } = decodeChunks();
48
48
  let str = '';
49
49
  while (true) {
50
50
  const { done, value } = await reader.read();
51
51
  if (done)
52
52
  break;
53
- str += decoder.decode(value, { stream: true });
53
+ str += decode(value);
54
54
  }
55
- // https://github.com/vikejs/vike/pull/1799#discussion_r1713554096
56
- str += decoder.decode();
55
+ str += getClosingChunk();
57
56
  return str;
58
57
  }
59
58
  exports.streamReadableWebToString = streamReadableWebToString;
@@ -119,15 +118,16 @@ async function streamPipeNodeToString(streamPipeNode) {
119
118
  }
120
119
  exports.streamPipeNodeToString = streamPipeNodeToString;
121
120
  function streamPipeWebToString(streamPipeWeb) {
121
+ const { decode, getClosingChunk } = decodeChunks();
122
122
  let str = '';
123
123
  let resolve;
124
124
  const promise = new Promise((r) => (resolve = r));
125
125
  const writable = new WritableStream({
126
126
  write(chunk) {
127
- (0, utils_js_1.assert)(typeof chunk === 'string');
128
- str += chunk;
127
+ str += decode(chunk);
129
128
  },
130
129
  close() {
130
+ str += getClosingChunk();
131
131
  resolve(str);
132
132
  }
133
133
  });
@@ -384,9 +384,7 @@ async function createStreamWrapper({ streamOriginal, onError, onData, onEnd, onF
384
384
  const writeChunk = (chunk) => {
385
385
  (0, utils_js_1.assert)(writableOriginal);
386
386
  writableOriginal.write(chunk);
387
- if (debug.isActivated) {
388
- debug('data written (Node.js Writable)', getChunkAsString(chunk));
389
- }
387
+ debugWithChunk('data written (Node.js Writable)', chunk);
390
388
  };
391
389
  // For libraries such as https://www.npmjs.com/package/compression
392
390
  // - React calls writable.flush() when available
@@ -457,9 +455,7 @@ async function createStreamWrapper({ streamOriginal, onError, onData, onEnd, onF
457
455
  const writeChunk = (chunk) => {
458
456
  (0, utils_js_1.assert)(writerOriginal);
459
457
  writerOriginal.write(encodeForWebStream(chunk));
460
- if (debug.isActivated) {
461
- debug('data written (Web Writable)', getChunkAsString(chunk));
462
- }
458
+ debugWithChunk('data written (Web Writable)', chunk);
463
459
  };
464
460
  // Web Streams have compression built-in
465
461
  // - https://developer.mozilla.org/en-US/docs/Web/API/Compression_Streams_API
@@ -550,14 +546,10 @@ async function createStreamWrapper({ streamOriginal, onError, onData, onEnd, onF
550
546
  // If readableOriginal doesn't implement readableOriginal.cancel() then it may still emit data after we close the stream. We therefore need to check whether we closed `controllerProxy`.
551
547
  !controllerProxyIsClosed) {
552
548
  controllerProxy.enqueue(encodeForWebStream(chunk));
553
- if (debug.isActivated) {
554
- debug('data written (Web Readable)', getChunkAsString(chunk));
555
- }
549
+ debugWithChunk('data written (Web Readable)', chunk);
556
550
  }
557
551
  else {
558
- if (debug.isActivated) {
559
- debug('data emitted but not written (Web Readable)', getChunkAsString(chunk));
560
- }
552
+ debugWithChunk('data emitted but not written (Web Readable)', chunk);
561
553
  }
562
554
  };
563
555
  // Readables don't have the notion of flushing
@@ -577,9 +569,7 @@ async function createStreamWrapper({ streamOriginal, onError, onData, onEnd, onF
577
569
  }
578
570
  const writeChunk = (chunk) => {
579
571
  readableProxy.push(chunk);
580
- if (debug.isActivated) {
581
- debug('data written (Node.js Readable)', getChunkAsString(chunk));
582
- }
572
+ debugWithChunk('data written (Node.js Readable)', chunk);
583
573
  };
584
574
  // Readables don't have the notion of flushing
585
575
  const flushStream = null;
@@ -802,11 +792,34 @@ function inferStreamName(stream) {
802
792
  (0, utils_js_1.assert)(false);
803
793
  }
804
794
  exports.inferStreamName = inferStreamName;
805
- function getChunkAsString(chunk) {
795
+ function decodeChunks() {
796
+ const decoder = new TextDecoder();
797
+ const decode = (chunk) => {
798
+ if (typeof chunk === 'string') {
799
+ return chunk;
800
+ }
801
+ else if (chunk instanceof Uint8Array) {
802
+ return decoder.decode(chunk, { stream: true });
803
+ }
804
+ else {
805
+ (0, utils_js_1.assert)(false);
806
+ }
807
+ };
808
+ // https://github.com/vikejs/vike/pull/1799#discussion_r1713554096
809
+ const getClosingChunk = () => {
810
+ return decoder.decode();
811
+ };
812
+ return { decode, getClosingChunk };
813
+ }
814
+ function debugWithChunk(msg, chunk) {
815
+ if (!debug.isActivated)
816
+ return;
817
+ let chunkStr;
806
818
  try {
807
- return new TextDecoder().decode(chunk);
819
+ chunkStr = new TextDecoder().decode(chunk);
808
820
  }
809
821
  catch (err) {
810
- return String(chunk);
822
+ chunkStr = String(chunk);
811
823
  }
824
+ debug(msg, chunkStr);
812
825
  }
@@ -67,12 +67,12 @@ async function renderPageAndPrepare(pageContextInit, httpRequestId) {
67
67
  // Prepare context
68
68
  let renderContext;
69
69
  try {
70
- await (0, globalContext_js_1.initGlobalContext)();
70
+ await (0, globalContext_js_1.initGlobalContext_renderPage)();
71
71
  renderContext = await (0, renderPageAlreadyRouted_js_1.getRenderContext)();
72
72
  }
73
73
  catch (err) {
74
- // Errors are expected since assertUsage() is used in both initGlobalContext() and getRenderContext().
75
- // initGlobalContext() and getRenderContext() don't call any user hooks => err isn't thrown from user code
74
+ // Errors are expected since assertUsage() is used in both initGlobalContext_renderPage() and getRenderContext().
75
+ // initGlobalContext_renderPage() and getRenderContext() don't call any user hooks => err isn't thrown from user code.
76
76
  (0, utils_js_1.assert)(!(0, abort_js_1.isAbortError)(err));
77
77
  (0, loggerRuntime_js_1.logRuntimeError)(err, httpRequestId);
78
78
  const pageContextHttpResponseNull = getPageContextHttpResponseNullWithError(err, pageContextInit);
@@ -75,3 +75,4 @@ __exportStar(require("../../utils/normalizeHeaders.js"), exports);
75
75
  __exportStar(require("../../utils/isVikeReactApp.js"), exports);
76
76
  __exportStar(require("../../utils/getPropAccessNotation.js"), exports);
77
77
  __exportStar(require("../../utils/PROJECT_VERSION.js"), exports);
78
+ __exportStar(require("../../utils/genPromise.js"), exports);
@@ -3,15 +3,13 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.getHookTimeoutDefault = exports.setIsPrerenderering = exports.assertHook = exports.getHookFromPageConfigGlobal = exports.getHookFromPageConfig = exports.getHook = void 0;
6
+ exports.getHookTimeoutDefault = exports.getHook_setIsPrerenderering = exports.assertHook = exports.getHookFromPageConfigGlobal = exports.getHookFromPageConfig = exports.getHook = void 0;
7
7
  const getGlobalObject_js_1 = require("../../utils/getGlobalObject.js");
8
8
  const helpers_js_1 = require("../page-configs/helpers.js");
9
9
  const getConfigValue_js_1 = require("../page-configs/getConfigValue.js");
10
10
  const utils_js_1 = require("../utils.js");
11
11
  const picocolors_1 = __importDefault(require("@brillout/picocolors"));
12
- const globalObject = (0, getGlobalObject_js_1.getGlobalObject)('getHook.ts', {
13
- isPrerendering: false
14
- });
12
+ const globalObject = (0, getGlobalObject_js_1.getGlobalObject)('getHook.ts', {});
15
13
  function getHook(pageContext, hookName) {
16
14
  if (!(hookName in pageContext.exports)) {
17
15
  return null;
@@ -133,7 +131,7 @@ function getHookTimeoutDefault(hookName) {
133
131
  };
134
132
  }
135
133
  exports.getHookTimeoutDefault = getHookTimeoutDefault;
136
- function setIsPrerenderering() {
134
+ function getHook_setIsPrerenderering() {
137
135
  globalObject.isPrerendering = true;
138
136
  }
139
- exports.setIsPrerenderering = setIsPrerenderering;
137
+ exports.getHook_setIsPrerenderering = getHook_setIsPrerenderering;
@@ -2,4 +2,4 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.PROJECT_VERSION = void 0;
4
4
  // Automatically updated by @brillout/release-me
5
- exports.PROJECT_VERSION = '0.4.191-commit-7e0cd43';
5
+ exports.PROJECT_VERSION = '0.4.191-commit-e99a55e';
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.genPromise = void 0;
4
+ function genPromise() {
5
+ let resolve;
6
+ const promise = new Promise((r) => (resolve = r));
7
+ return { promise, resolve };
8
+ }
9
+ exports.genPromise = genPromise;
@@ -16,7 +16,7 @@ declare function getPagesAndRoutes(): Promise<{
16
16
  pageConfigs: PageConfigRuntime[];
17
17
  allPageIds: string[];
18
18
  }>;
19
- declare function getPageFilesAllSafe(): Promise<{
19
+ declare function getPageFilesAllSafe(isProduction: boolean): Promise<{
20
20
  pageFilesAll: PageFile[];
21
21
  allPageIds: string[];
22
22
  pageConfigs: PageConfigRuntime[];
@@ -4,9 +4,8 @@ export { route, getPagesAndRoutes };
4
4
  export { getPageFilesAllSafe };
5
5
  import { route as routeInternal } from '../shared/route/index.js';
6
6
  import { getPageFilesAll } from '../shared/getPageFiles.js';
7
- import { getGlobalContext, getGlobalContextAsync, initGlobalContext } from '../node/runtime/globalContext.js';
7
+ import { getGlobalContext, initGlobalContext_getGlobalContextAsync } from '../node/runtime/globalContext.js';
8
8
  import { handleNodeEnv_vitePluginVercel } from '../utils/assertNodeEnv.js';
9
- import { assert } from '../utils/assert.js';
10
9
  import { getRenderContext } from '../node/runtime/renderPage/renderPageAlreadyRouted.js';
11
10
  /**
12
11
  * Used by {@link https://github.com/magne4000/vite-plugin-vercel|vite-plugin-vercel}
@@ -16,11 +15,10 @@ import { getRenderContext } from '../node/runtime/renderPage/renderPageAlreadyRo
16
15
  */
17
16
  async function getPagesAndRoutes() {
18
17
  handleNodeEnv_vitePluginVercel();
19
- await initGlobalContext(true);
20
- const globalContext = getGlobalContext();
21
- assert(globalContext.isProduction === true);
22
18
  const renderContext = await getRenderContext();
23
- const { pageFilesAll, pageConfigs, allPageIds, pageRoutes } = renderContext;
19
+ const {
20
+ //
21
+ pageRoutes, pageFilesAll, pageConfigs, allPageIds } = renderContext;
24
22
  return {
25
23
  pageRoutes,
26
24
  pageFilesAll,
@@ -28,10 +26,10 @@ async function getPagesAndRoutes() {
28
26
  allPageIds
29
27
  };
30
28
  }
31
- // TODO: make it cleaner once the internal refactoring about global configs is done
32
- async function getPageFilesAllSafe() {
33
- await initGlobalContext(false);
34
- await getGlobalContextAsync();
29
+ // TODO: make it cleaner once the internal refactoring about global configs is done.
30
+ // Demo usage: https://github.com/vikejs/vike/pull/1823
31
+ async function getPageFilesAllSafe(isProduction) {
32
+ await initGlobalContext_getGlobalContextAsync(isProduction);
35
33
  const globalContext = getGlobalContext();
36
34
  const pageFilesAll = await getPageFilesAll(false, globalContext.isProduction);
37
35
  return pageFilesAll;
@@ -88,23 +88,27 @@ async function triggerFullBuild(config, configVike, bundle) {
88
88
  logErrorHint(err);
89
89
  process.exit(1);
90
90
  }
91
- if (configVike.prerender && !configVike.prerender.disableAutoRun) {
91
+ if (configVike.prerender && !configVike.prerender.disableAutoRun && configVike.disableAutoFullBuild !== 'prerender') {
92
92
  await runPrerenderFromAutoFullBuild({ viteConfig: configInline });
93
93
  forceExit = true;
94
94
  }
95
95
  }
96
96
  function abortViteBuildSsr(configVike) {
97
- if (!configVike.disableAutoFullBuild && isViteCliCall() && getViteConfigFromCli()?.build.ssr) {
97
+ if (configVike.disableAutoFullBuild !== true && isViteCliCall() && getViteConfigFromCli()?.build.ssr) {
98
98
  assertWarning(false, `The CLI call ${pc.cyan('$ vite build --ssr')} is superfluous since ${pc.cyan('$ vite build')} also builds the server-side. If you want two separate build steps then use https://vike.dev/disableAutoFullBuild or use Vite's ${pc.cyan('build()')} API.`, { onlyOnce: true });
99
99
  process.exit(0);
100
100
  }
101
101
  }
102
102
  function isDisabled(configVike) {
103
- if (configVike.disableAutoFullBuild === null) {
104
- // TODO/v1-release: also enable autoFullBuild when running Vite's build() API
103
+ const { disableAutoFullBuild } = configVike;
104
+ if (disableAutoFullBuild === null || disableAutoFullBuild === 'prerender') {
105
+ // TODO/v1-release: remove autoFullBuild for both Vite's build() API and Vite's CLI
106
+ // - Tell users to use `$ vike build` instead of `$ vite build`
107
+ // - Remove the whole writeBundle() hook logic
108
+ // - make `$ vite build` only build the client-side
105
109
  return !isViteCliCall();
106
110
  }
107
111
  else {
108
- return configVike.disableAutoFullBuild;
112
+ return disableAutoFullBuild;
109
113
  }
110
114
  }
@@ -27,8 +27,10 @@ function checkConfigVike(configVike) {
27
27
  }
28
28
  {
29
29
  const prop = 'disableAutoFullBuild';
30
- if (!hasProp(configVike, prop, 'boolean') && !hasProp(configVike, prop, 'undefined'))
31
- return { prop, errMsg: 'should be a boolean' };
30
+ if (!hasProp(configVike, prop, 'boolean') &&
31
+ !hasProp(configVike, prop, 'undefined') &&
32
+ !(configVike[prop] === 'prerender'))
33
+ return { prop, errMsg: "should be a boolean or 'prerender'" };
32
34
  }
33
35
  {
34
36
  const prop = 'includeAssetsImportedByServer';
@@ -1,6 +1,6 @@
1
1
  export { setGlobalContext };
2
- import { setGlobalContext_isDev, setGlobalContext_viteDevServer } from '../../runtime/globalContext.js';
3
- import { isDev3 } from '../utils.js';
2
+ import { setGlobalContext_isDev, setGlobalContext_viteDevServer, setGlobalContext_viteConfig } from '../../runtime/globalContext.js';
3
+ import { assertFilePathAbsoluteFilesystem, getOutDirs, isDev3 } from '../utils.js';
4
4
  function setGlobalContext() {
5
5
  return {
6
6
  name: 'vike:setGlobalContext',
@@ -16,6 +16,11 @@ function setGlobalContext() {
16
16
  const isDev = isDev3(env);
17
17
  setGlobalContext_isDev(isDev);
18
18
  }
19
+ },
20
+ configResolved(config) {
21
+ const { outDirRoot } = getOutDirs(config);
22
+ assertFilePathAbsoluteFilesystem(outDirRoot); // Needed for loadImportBuild(outDir) of @brillout/vite-plugin-server-entry
23
+ setGlobalContext_viteConfig(config, outDirRoot);
19
24
  }
20
25
  };
21
26
  }
@@ -5,11 +5,11 @@ export { runPrerender_forceExit };
5
5
  import '../runtime/page-files/setup.js';
6
6
  import path from 'path';
7
7
  import { route } from '../../shared/route/index.js';
8
- import { assert, assertUsage, assertWarning, hasProp, projectInfo, objectAssign, isObjectWithKeys, isCallable, getOutDirs, isPropertyGetter, assertPosixPath, urlToFile, isPlainObject, handleNodeEnv_prerender, pLimit, assertFilePathAbsoluteFilesystem, isArray, changeEnumerable } from './utils.js';
8
+ import { assert, assertUsage, assertWarning, hasProp, projectInfo, objectAssign, isObjectWithKeys, isCallable, getOutDirs, isPropertyGetter, assertPosixPath, urlToFile, isPlainObject, handleNodeEnv_prerender, pLimit, isArray, changeEnumerable } from './utils.js';
9
9
  import { prerenderPage, prerender404Page, getRenderContext, getPageContextInitEnhanced } from '../runtime/renderPage/renderPageAlreadyRouted.js';
10
10
  import pc from '@brillout/picocolors';
11
11
  import { cpus } from 'os';
12
- import { getGlobalContext, initGlobalContext, setGlobalContext_prerender } from '../runtime/globalContext.js';
12
+ import { getGlobalContext, initGlobalContext_runPrerender, setGlobalContext_isPrerendering } from '../runtime/globalContext.js';
13
13
  import { resolveConfig } from 'vite';
14
14
  import { getConfigVike } from '../shared/getConfigVike.js';
15
15
  import { getPageFilesServerSide } from '../../shared/getPageFiles.js';
@@ -22,7 +22,7 @@ import { isErrorPage } from '../../shared/error-page.js';
22
22
  import { getPageContextUrlComputed } from '../../shared/getPageContextUrlComputed.js';
23
23
  import { isAbortError } from '../../shared/route/abort.js';
24
24
  import { loadUserFilesServerSide } from '../runtime/renderPage/loadUserFilesServerSide.js';
25
- import { getHookFromPageConfig, getHookFromPageConfigGlobal, getHookTimeoutDefault, setIsPrerenderering } from '../../shared/hooks/getHook.js';
25
+ import { getHookFromPageConfig, getHookFromPageConfigGlobal, getHookTimeoutDefault, getHook_setIsPrerenderering } from '../../shared/hooks/getHook.js';
26
26
  import { noRouteMatch } from '../../shared/route/noRouteMatch.js';
27
27
  import { getVikeConfig } from '../plugin/plugins/importUserCode/v1-design/getVikeConfig.js';
28
28
  import { logErrorHint } from '../runtime/renderPage/logErrorHint.js';
@@ -55,7 +55,8 @@ async function runPrerenderFromAutoFullBuild(options) {
55
55
  }
56
56
  async function runPrerender(options, manuallyTriggered) {
57
57
  checkOutdatedOptions(options);
58
- setIsPrerenderering();
58
+ setGlobalContext_isPrerendering();
59
+ getHook_setIsPrerenderering();
59
60
  const logLevel = !!options.onPagePrerender ? 'warn' : 'info';
60
61
  if (logLevel === 'info') {
61
62
  console.log(`${pc.cyan(`vike v${projectInfo.projectVersion}`)} ${pc.green('pre-rendering HTML...')}`);
@@ -63,10 +64,9 @@ async function runPrerender(options, manuallyTriggered) {
63
64
  handleNodeEnv_prerender();
64
65
  await disableReactStreaming();
65
66
  const viteConfig = await resolveConfig(options.viteConfig || {}, 'vike pre-rendering', 'production');
66
- setGlobalContext_prerender(viteConfig);
67
67
  assertLoadedConfig(viteConfig, options);
68
68
  const configVike = await getConfigVike(viteConfig);
69
- const { outDirClient, outDirRoot } = getOutDirs(viteConfig);
69
+ const { outDirClient } = getOutDirs(viteConfig);
70
70
  const { root } = viteConfig;
71
71
  const prerenderConfig = configVike.prerender;
72
72
  if (!prerenderConfig) {
@@ -77,8 +77,7 @@ async function runPrerender(options, manuallyTriggered) {
77
77
  }
78
78
  const { partial = false, noExtraDir = false, parallel = true } = prerenderConfig || {};
79
79
  const concurrencyLimit = pLimit(parallel === false || parallel === 0 ? 1 : parallel === true || parallel === undefined ? cpus().length : parallel);
80
- assertFilePathAbsoluteFilesystem(outDirRoot); // Needed for loadImportBuild(outDir) of @brillout/vite-plugin-server-entry
81
- await initGlobalContext(true, outDirRoot);
80
+ await initGlobalContext_runPrerender();
82
81
  const renderContext = await getRenderContext();
83
82
  renderContext.pageFilesAll.forEach(assertExportNames);
84
83
  const prerenderContext = {};
@@ -1,13 +1,16 @@
1
1
  export { getGlobalContextSync };
2
2
  export { getGlobalContextAsync };
3
- export { initGlobalContext };
4
3
  export { getGlobalContext };
5
4
  export { getViteDevServer };
6
5
  export { getViteConfig };
6
+ export { getRuntimeManifest };
7
+ export { initGlobalContext_renderPage };
8
+ export { initGlobalContext_runPrerender };
9
+ export { initGlobalContext_getGlobalContextAsync };
7
10
  export { setGlobalContext_viteDevServer };
11
+ export { setGlobalContext_viteConfig };
8
12
  export { setGlobalContext_isDev };
9
- export { setGlobalContext_prerender };
10
- export { getRuntimeManifest };
13
+ export { setGlobalContext_isPrerendering };
11
14
  import type { ViteManifest } from '../shared/ViteManifest.js';
12
15
  import type { ResolvedConfig, ViteDevServer } from 'vite';
13
16
  import { PluginManifest } from '../shared/assertPluginManifest.js';
@@ -46,11 +49,14 @@ declare function getGlobalContext(): GlobalContext;
46
49
  /** @experimental https://vike.dev/getGlobalContext */
47
50
  declare function getGlobalContextSync(): GlobalContextPublic;
48
51
  /** @experimental https://vike.dev/getGlobalContext */
49
- declare function getGlobalContextAsync(): Promise<GlobalContextPublic>;
52
+ declare function getGlobalContextAsync(isProduction: boolean): Promise<GlobalContextPublic>;
50
53
  declare function setGlobalContext_viteDevServer(viteDevServer: ViteDevServer): void;
54
+ declare function setGlobalContext_viteConfig(viteConfig: ResolvedConfig, outDirRoot: string): void;
51
55
  declare function setGlobalContext_isDev(isDev: boolean): void;
56
+ declare function setGlobalContext_isPrerendering(): void;
52
57
  declare function getViteDevServer(): ViteDevServer | null;
53
- declare function setGlobalContext_prerender(viteConfig: ResolvedConfig): void;
54
58
  declare function getViteConfig(): ResolvedConfig | null;
55
- declare function initGlobalContext(isPrerendering?: boolean, outDir?: string): Promise<void>;
59
+ declare function initGlobalContext_renderPage(): Promise<void>;
60
+ declare function initGlobalContext_runPrerender(): Promise<void>;
61
+ declare function initGlobalContext_getGlobalContextAsync(isProduction: boolean): Promise<void>;
56
62
  declare function getRuntimeManifest(configVike: ConfigVikeResolved): RuntimeManifest;
@@ -2,15 +2,18 @@
2
2
  export { getGlobalContextSync };
3
3
  export { getGlobalContextAsync };
4
4
  // Internal use
5
- export { initGlobalContext };
6
5
  export { getGlobalContext };
7
6
  export { getViteDevServer };
8
7
  export { getViteConfig };
8
+ export { getRuntimeManifest };
9
+ export { initGlobalContext_renderPage };
10
+ export { initGlobalContext_runPrerender };
11
+ export { initGlobalContext_getGlobalContextAsync };
9
12
  export { setGlobalContext_viteDevServer };
13
+ export { setGlobalContext_viteConfig };
10
14
  export { setGlobalContext_isDev };
11
- export { setGlobalContext_prerender };
12
- export { getRuntimeManifest };
13
- import { assert, assertNodeEnv_runtime, assertUsage, assertWarning, getGlobalObject, isPlainObject, objectAssign, objectKeys } from './utils.js';
15
+ export { setGlobalContext_isPrerendering };
16
+ import { assert, assertNodeEnv_runtime, assertUsage, assertWarning, getGlobalObject, isPlainObject, objectAssign, objectKeys, genPromise } from './utils.js';
14
17
  import { loadImportBuild } from './globalContext/loadImportBuild.js';
15
18
  import { setPageFiles } from '../../shared/getPageFiles.js';
16
19
  import { assertPluginManifest } from '../shared/assertPluginManifest.js';
@@ -18,10 +21,13 @@ import { getConfigVike } from '../shared/getConfigVike.js';
18
21
  import { assertRuntimeManifest } from '../shared/assertRuntimeManifest.js';
19
22
  import pc from '@brillout/picocolors';
20
23
  import { getPageFilesExports } from './page-files/getPageFilesExports.js';
21
- let resolveGlobalContext;
22
- const globalObject = getGlobalObject('globalContext.ts', {
23
- globalContextPromise: new Promise((r) => (resolveGlobalContext = r))
24
- });
24
+ const globalObject = getGlobalObject('globalContext.ts', (() => {
25
+ const { promise: viteDevServerPromise, resolve: viteDevServerPromiseResolve } = genPromise();
26
+ return {
27
+ viteDevServerPromise,
28
+ viteDevServerPromiseResolve
29
+ };
30
+ })());
25
31
  function getGlobalContext() {
26
32
  assert(globalObject.globalContext);
27
33
  return globalObject.globalContext;
@@ -32,10 +38,12 @@ function getGlobalContextSync() {
32
38
  return makePublic(globalObject.globalContext);
33
39
  }
34
40
  /** @experimental https://vike.dev/getGlobalContext */
35
- async function getGlobalContextAsync() {
36
- await globalObject.globalContextPromise;
37
- assert(globalObject.globalContext);
38
- return makePublic(globalObject.globalContext);
41
+ async function getGlobalContextAsync(isProduction) {
42
+ assertUsage(typeof isProduction === 'boolean', `[getGlobalContextAsync(isProduction)] Argument ${pc.cyan('isProduction')} ${isProduction === undefined ? 'is missing' : `should be ${pc.cyan('true')} or ${pc.cyan('false')}`}`);
43
+ await initGlobalContext_getGlobalContextAsync(isProduction);
44
+ const { globalContext } = globalObject;
45
+ assert(globalContext);
46
+ return makePublic(globalContext);
39
47
  }
40
48
  function makePublic(globalContext) {
41
49
  const globalContextPublic = {
@@ -64,35 +72,75 @@ function makePublic(globalContext) {
64
72
  function setGlobalContext_viteDevServer(viteDevServer) {
65
73
  if (globalObject.viteDevServer)
66
74
  return;
67
- assert(!globalObject.globalContext);
68
- globalObject.viteConfig = viteDevServer.config;
75
+ assertIsNotInitilizedYet();
76
+ assert(globalObject.viteConfig);
69
77
  globalObject.viteDevServer = viteDevServer;
78
+ globalObject.viteDevServerPromiseResolve(viteDevServer);
70
79
  eagerlyLoadUserFiles();
71
80
  }
81
+ function setGlobalContext_viteConfig(viteConfig, outDirRoot) {
82
+ if (globalObject.viteConfig)
83
+ return;
84
+ assertIsNotInitilizedYet();
85
+ globalObject.viteConfig = viteConfig;
86
+ globalObject.outDirRoot = outDirRoot;
87
+ }
88
+ function assertIsNotInitilizedYet() {
89
+ // In develpoment, globalObject.viteDevServer always needs to be awaited for before initializing globalObject.globalContext
90
+ assert(!globalObject.globalContext);
91
+ }
72
92
  function setGlobalContext_isDev(isDev) {
73
93
  globalObject.isDev = isDev;
74
94
  }
95
+ function setGlobalContext_isPrerendering() {
96
+ globalObject.isPrerendering = true;
97
+ }
75
98
  function getViteDevServer() {
76
99
  return globalObject.viteDevServer ?? null;
77
100
  }
78
- function setGlobalContext_prerender(viteConfig) {
79
- if (globalObject.viteConfig)
80
- return;
81
- assert(!globalObject.globalContext);
82
- globalObject.viteConfig = viteConfig;
83
- }
84
101
  function getViteConfig() {
85
102
  return globalObject.viteConfig ?? null;
86
103
  }
87
- async function initGlobalContext(isPrerendering = false, outDir) {
88
- if (globalObject.globalContext)
104
+ async function initGlobalContext_renderPage() {
105
+ await initGlobalContext(!globalObject.isDev);
106
+ }
107
+ async function initGlobalContext_runPrerender() {
108
+ assert(globalObject.isPrerendering);
109
+ assert(globalObject.viteConfig);
110
+ assert(globalObject.outDirRoot);
111
+ // We assume initGlobalContext_runPrerender() to be called before:
112
+ // - initGlobalContext_renderPage()
113
+ // - initGlobalContext_getGlobalContextAsync()
114
+ assert(!globalObject.globalContext);
115
+ await initGlobalContext(true);
116
+ }
117
+ async function initGlobalContext_getGlobalContextAsync(isProduction) {
118
+ if (!isProduction) {
119
+ const waitFor = 20;
120
+ const timeout = setTimeout(() => {
121
+ assertWarning(false, `Vite's development server still not created after ${waitFor} seconds.`, {
122
+ onlyOnce: false,
123
+ showStackTrace: true
124
+ });
125
+ }, waitFor * 1000);
126
+ await globalObject.viteDevServerPromise;
127
+ clearTimeout(timeout);
128
+ }
129
+ await initGlobalContext(isProduction);
130
+ }
131
+ async function initGlobalContext(isProduction) {
132
+ if (globalObject.globalContext) {
133
+ assert(globalObject.globalContext.isProduction === isProduction);
134
+ // We assume setGlobalContext_isPrerendering() is called before initGlobalContext()
135
+ assert(globalObject.globalContext.isPrerendering === (globalObject.isPrerendering ?? false));
89
136
  return;
90
- const { viteDevServer, viteConfig, isDev } = globalObject;
137
+ }
138
+ const { viteDevServer, viteConfig, isDev, isPrerendering } = globalObject;
91
139
  assertNodeEnv_runtime(isDev ?? false);
92
- if (isDev) {
140
+ if (!isProduction) {
93
141
  assert(viteConfig);
94
- assert(!isPrerendering);
95
142
  assert(viteDevServer);
143
+ assert(!isPrerendering);
96
144
  const configVike = await getConfigVike(viteConfig);
97
145
  const pluginManifest = getRuntimeManifest(configVike);
98
146
  globalObject.globalContext = {
@@ -111,7 +159,7 @@ async function initGlobalContext(isPrerendering = false, outDir) {
111
159
  };
112
160
  }
113
161
  else {
114
- const buildEntries = await loadImportBuild(outDir);
162
+ const buildEntries = await loadImportBuild(globalObject.outDirRoot);
115
163
  assertBuildEntries(buildEntries, isPrerendering ?? false);
116
164
  const { pageFiles, assetsManifest, pluginManifest } = buildEntries;
117
165
  setPageFiles(pageFiles);
@@ -147,7 +195,6 @@ async function initGlobalContext(isPrerendering = false, outDir) {
147
195
  globalObject.globalContext = globalContext;
148
196
  }
149
197
  }
150
- resolveGlobalContext(globalObject.globalContext);
151
198
  }
152
199
  function getRuntimeManifest(configVike) {
153
200
  const { includeAssetsImportedByServer, baseServer, baseAssets, redirects, trailingSlash, disableUrlNormalization } = configVike;
@@ -55,16 +55,15 @@ async function streamReadableNodeToString(readableNode) {
55
55
  }
56
56
  async function streamReadableWebToString(readableWeb) {
57
57
  const reader = readableWeb.getReader();
58
- const decoder = new TextDecoder();
58
+ const { decode, getClosingChunk } = decodeChunks();
59
59
  let str = '';
60
60
  while (true) {
61
61
  const { done, value } = await reader.read();
62
62
  if (done)
63
63
  break;
64
- str += decoder.decode(value, { stream: true });
64
+ str += decode(value);
65
65
  }
66
- // https://github.com/vikejs/vike/pull/1799#discussion_r1713554096
67
- str += decoder.decode();
66
+ str += getClosingChunk();
68
67
  return str;
69
68
  }
70
69
  async function stringToStreamReadableNode(str) {
@@ -128,15 +127,16 @@ async function streamPipeNodeToString(streamPipeNode) {
128
127
  return promise;
129
128
  }
130
129
  function streamPipeWebToString(streamPipeWeb) {
130
+ const { decode, getClosingChunk } = decodeChunks();
131
131
  let str = '';
132
132
  let resolve;
133
133
  const promise = new Promise((r) => (resolve = r));
134
134
  const writable = new WritableStream({
135
135
  write(chunk) {
136
- assert(typeof chunk === 'string');
137
- str += chunk;
136
+ str += decode(chunk);
138
137
  },
139
138
  close() {
139
+ str += getClosingChunk();
140
140
  resolve(str);
141
141
  }
142
142
  });
@@ -388,9 +388,7 @@ async function createStreamWrapper({ streamOriginal, onError, onData, onEnd, onF
388
388
  const writeChunk = (chunk) => {
389
389
  assert(writableOriginal);
390
390
  writableOriginal.write(chunk);
391
- if (debug.isActivated) {
392
- debug('data written (Node.js Writable)', getChunkAsString(chunk));
393
- }
391
+ debugWithChunk('data written (Node.js Writable)', chunk);
394
392
  };
395
393
  // For libraries such as https://www.npmjs.com/package/compression
396
394
  // - React calls writable.flush() when available
@@ -461,9 +459,7 @@ async function createStreamWrapper({ streamOriginal, onError, onData, onEnd, onF
461
459
  const writeChunk = (chunk) => {
462
460
  assert(writerOriginal);
463
461
  writerOriginal.write(encodeForWebStream(chunk));
464
- if (debug.isActivated) {
465
- debug('data written (Web Writable)', getChunkAsString(chunk));
466
- }
462
+ debugWithChunk('data written (Web Writable)', chunk);
467
463
  };
468
464
  // Web Streams have compression built-in
469
465
  // - https://developer.mozilla.org/en-US/docs/Web/API/Compression_Streams_API
@@ -554,14 +550,10 @@ async function createStreamWrapper({ streamOriginal, onError, onData, onEnd, onF
554
550
  // If readableOriginal doesn't implement readableOriginal.cancel() then it may still emit data after we close the stream. We therefore need to check whether we closed `controllerProxy`.
555
551
  !controllerProxyIsClosed) {
556
552
  controllerProxy.enqueue(encodeForWebStream(chunk));
557
- if (debug.isActivated) {
558
- debug('data written (Web Readable)', getChunkAsString(chunk));
559
- }
553
+ debugWithChunk('data written (Web Readable)', chunk);
560
554
  }
561
555
  else {
562
- if (debug.isActivated) {
563
- debug('data emitted but not written (Web Readable)', getChunkAsString(chunk));
564
- }
556
+ debugWithChunk('data emitted but not written (Web Readable)', chunk);
565
557
  }
566
558
  };
567
559
  // Readables don't have the notion of flushing
@@ -581,9 +573,7 @@ async function createStreamWrapper({ streamOriginal, onError, onData, onEnd, onF
581
573
  }
582
574
  const writeChunk = (chunk) => {
583
575
  readableProxy.push(chunk);
584
- if (debug.isActivated) {
585
- debug('data written (Node.js Readable)', getChunkAsString(chunk));
586
- }
576
+ debugWithChunk('data written (Node.js Readable)', chunk);
587
577
  };
588
578
  // Readables don't have the notion of flushing
589
579
  const flushStream = null;
@@ -796,11 +786,34 @@ function inferStreamName(stream) {
796
786
  }
797
787
  assert(false);
798
788
  }
799
- function getChunkAsString(chunk) {
789
+ function decodeChunks() {
790
+ const decoder = new TextDecoder();
791
+ const decode = (chunk) => {
792
+ if (typeof chunk === 'string') {
793
+ return chunk;
794
+ }
795
+ else if (chunk instanceof Uint8Array) {
796
+ return decoder.decode(chunk, { stream: true });
797
+ }
798
+ else {
799
+ assert(false);
800
+ }
801
+ };
802
+ // https://github.com/vikejs/vike/pull/1799#discussion_r1713554096
803
+ const getClosingChunk = () => {
804
+ return decoder.decode();
805
+ };
806
+ return { decode, getClosingChunk };
807
+ }
808
+ function debugWithChunk(msg, chunk) {
809
+ if (!debug.isActivated)
810
+ return;
811
+ let chunkStr;
800
812
  try {
801
- return new TextDecoder().decode(chunk);
813
+ chunkStr = new TextDecoder().decode(chunk);
802
814
  }
803
815
  catch (err) {
804
- return String(chunk);
816
+ chunkStr = String(chunk);
805
817
  }
818
+ debug(msg, chunkStr);
806
819
  }
@@ -4,7 +4,7 @@ import { getRenderContext, getPageContextInitEnhanced, renderPageAlreadyRouted }
4
4
  import { route } from '../../shared/route/index.js';
5
5
  import { assert, hasProp, objectAssign, isUrl, parseUrl, assertEnv, assertWarning, getGlobalObject, checkType, assertUsage, normalizeUrlPathname, removeBaseServer, modifyUrlPathname, prependBase, removeUrlOrigin, addUrlOrigin, createUrlFromComponents, isUri } from './utils.js';
6
6
  import { assertNoInfiniteAbortLoop, getPageContextFromAllRewrites, isAbortError, logAbortErrorHandled } from '../../shared/route/abort.js';
7
- import { getGlobalContext, initGlobalContext } from './globalContext.js';
7
+ import { getGlobalContext, initGlobalContext_renderPage } from './globalContext.js';
8
8
  import { handlePageContextRequestUrl } from './renderPage/handlePageContextRequestUrl.js';
9
9
  import { createHttpResponseObjectRedirect, createHttpResponsePageContextJson } from './renderPage/createHttpResponseObject.js';
10
10
  import { logRuntimeError, logRuntimeInfo } from './renderPage/loggerRuntime.js';
@@ -61,12 +61,12 @@ async function renderPageAndPrepare(pageContextInit, httpRequestId) {
61
61
  // Prepare context
62
62
  let renderContext;
63
63
  try {
64
- await initGlobalContext();
64
+ await initGlobalContext_renderPage();
65
65
  renderContext = await getRenderContext();
66
66
  }
67
67
  catch (err) {
68
- // Errors are expected since assertUsage() is used in both initGlobalContext() and getRenderContext().
69
- // initGlobalContext() and getRenderContext() don't call any user hooks => err isn't thrown from user code
68
+ // Errors are expected since assertUsage() is used in both initGlobalContext_renderPage() and getRenderContext().
69
+ // initGlobalContext_renderPage() and getRenderContext() don't call any user hooks => err isn't thrown from user code.
70
70
  assert(!isAbortError(err));
71
71
  logRuntimeError(err, httpRequestId);
72
72
  const pageContextHttpResponseNull = getPageContextHttpResponseNullWithError(err, pageContextInit);
@@ -56,3 +56,4 @@ export * from '../../utils/normalizeHeaders.js';
56
56
  export * from '../../utils/isVikeReactApp.js';
57
57
  export * from '../../utils/getPropAccessNotation.js';
58
58
  export * from '../../utils/PROJECT_VERSION.js';
59
+ export * from '../../utils/genPromise.js';
@@ -59,3 +59,4 @@ export * from '../../utils/normalizeHeaders.js';
59
59
  export * from '../../utils/isVikeReactApp.js';
60
60
  export * from '../../utils/getPropAccessNotation.js';
61
61
  export * from '../../utils/PROJECT_VERSION.js';
62
+ export * from '../../utils/genPromise.js';
@@ -7,7 +7,7 @@ type ConfigVikeResolved = {
7
7
  partial: boolean;
8
8
  disableAutoRun: boolean;
9
9
  };
10
- disableAutoFullBuild: boolean | null;
10
+ disableAutoFullBuild: boolean | 'prerender' | null;
11
11
  includeAssetsImportedByServer: boolean;
12
12
  baseAssets: string;
13
13
  baseServer: string;
@@ -63,13 +63,13 @@ type ConfigVikeUserProvided = {
63
63
  disableAutoRun?: boolean;
64
64
  };
65
65
  /**
66
- * Set to `true` to disable the automatic chaining of all the build steps.
66
+ * Disable the automatic chaining of build steps.
67
67
  *
68
68
  * https://vike.dev/disableAutoFullBuild
69
69
  *
70
70
  * @default false
71
71
  */
72
- disableAutoFullBuild?: boolean;
72
+ disableAutoFullBuild?: boolean | 'prerender';
73
73
  /** The Base URL of your server.
74
74
  *
75
75
  * https://vike.dev/base-url
@@ -2,7 +2,7 @@ export { getHook };
2
2
  export { getHookFromPageConfig };
3
3
  export { getHookFromPageConfigGlobal };
4
4
  export { assertHook };
5
- export { setIsPrerenderering };
5
+ export { getHook_setIsPrerenderering };
6
6
  export type { Hook };
7
7
  export type { HookName };
8
8
  export type { HookLoc };
@@ -33,4 +33,4 @@ declare function assertHook<TPageContext extends PageContextExports, THookName e
33
33
  exports: Record<THookName, Function | undefined>;
34
34
  };
35
35
  declare function getHookTimeoutDefault(hookName: HookName): HookTimeout;
36
- declare function setIsPrerenderering(): void;
36
+ declare function getHook_setIsPrerenderering(): void;
@@ -2,7 +2,7 @@ export { getHook };
2
2
  export { getHookFromPageConfig };
3
3
  export { getHookFromPageConfigGlobal };
4
4
  export { assertHook };
5
- export { setIsPrerenderering };
5
+ export { getHook_setIsPrerenderering };
6
6
  // TODO/v1-release: remove
7
7
  // We export for old V0.4 design which doesn't support configooksTimeout
8
8
  export { getHookTimeoutDefault };
@@ -11,9 +11,7 @@ import { getHookFilePathToShowToUser } from '../page-configs/helpers.js';
11
11
  import { getConfigValueRuntime } from '../page-configs/getConfigValue.js';
12
12
  import { assert, assertUsage, checkType, isCallable, isObject } from '../utils.js';
13
13
  import pc from '@brillout/picocolors';
14
- const globalObject = getGlobalObject('getHook.ts', {
15
- isPrerendering: false
16
- });
14
+ const globalObject = getGlobalObject('getHook.ts', {});
17
15
  function getHook(pageContext, hookName) {
18
16
  if (!(hookName in pageContext.exports)) {
19
17
  return null;
@@ -130,6 +128,6 @@ function getHookTimeoutDefault(hookName) {
130
128
  warning: 4 * 1000
131
129
  };
132
130
  }
133
- function setIsPrerenderering() {
131
+ function getHook_setIsPrerenderering() {
134
132
  globalObject.isPrerendering = true;
135
133
  }
@@ -1 +1 @@
1
- export declare const PROJECT_VERSION: "0.4.191-commit-7e0cd43";
1
+ export declare const PROJECT_VERSION: "0.4.191-commit-e99a55e";
@@ -1,2 +1,2 @@
1
1
  // Automatically updated by @brillout/release-me
2
- export const PROJECT_VERSION = '0.4.191-commit-7e0cd43';
2
+ export const PROJECT_VERSION = '0.4.191-commit-e99a55e';
@@ -0,0 +1,4 @@
1
+ export declare function genPromise<T>(): {
2
+ promise: Promise<T>;
3
+ resolve: (val: T) => void;
4
+ };
@@ -0,0 +1,5 @@
1
+ export function genPromise() {
2
+ let resolve;
3
+ const promise = new Promise((r) => (resolve = r));
4
+ return { promise, resolve };
5
+ }
@@ -1,4 +1,4 @@
1
1
  export declare const projectInfo: {
2
2
  projectName: "Vike";
3
- projectVersion: "0.4.191-commit-7e0cd43";
3
+ projectVersion: "0.4.191-commit-e99a55e";
4
4
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vike",
3
- "version": "0.4.191-commit-7e0cd43",
3
+ "version": "0.4.191-commit-e99a55e",
4
4
  "scripts": {
5
5
  "dev": "tsc --watch",
6
6
  "build": "rimraf dist/ && pnpm run build:esm && pnpm run build:cjs",