vike 0.4.156-commit-d07fbe8 → 0.4.156-commit-e46716d

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 (31) hide show
  1. package/dist/cjs/node/plugin/plugins/commonConfig.js +18 -19
  2. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/crawlPlusFiles.js +3 -1
  3. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig.js +2 -0
  4. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVirtualFilePageConfigs.js +2 -0
  5. package/dist/cjs/node/prerender/runPrerender.js +2 -0
  6. package/dist/cjs/node/runtime/html/serializePageContextClientSide.js +2 -2
  7. package/dist/cjs/node/runtime/renderPage/isNewError.js +3 -1
  8. package/dist/cjs/node/runtime/renderPage/renderPageAlreadyRouted.js +3 -3
  9. package/dist/cjs/shared/misc/isServerSideError.js +4 -0
  10. package/dist/cjs/utils/projectInfo.js +1 -1
  11. package/dist/esm/client/client-routing-runtime/getPageContextFromHooks.d.ts +12 -11
  12. package/dist/esm/client/client-routing-runtime/getPageContextFromHooks.js +16 -32
  13. package/dist/esm/client/client-routing-runtime/renderPageClientSide.js +65 -60
  14. package/dist/esm/client/shared/loadUserFilesClientSide.js +3 -1
  15. package/dist/esm/node/plugin/plugins/commonConfig.js +18 -19
  16. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/crawlPlusFiles.js +3 -1
  17. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig.js +2 -0
  18. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVirtualFilePageConfigs.js +2 -0
  19. package/dist/esm/node/prerender/runPrerender.js +2 -0
  20. package/dist/esm/node/runtime/html/serializePageContextClientSide.js +2 -2
  21. package/dist/esm/node/runtime/renderPage/isNewError.js +3 -1
  22. package/dist/esm/node/runtime/renderPage/renderPageAlreadyRouted.js +3 -3
  23. package/dist/esm/shared/misc/isServerSideError.d.ts +1 -0
  24. package/dist/esm/shared/misc/isServerSideError.js +1 -0
  25. package/dist/esm/shared/page-configs/Config.d.ts +2 -2
  26. package/dist/esm/utils/projectInfo.d.ts +2 -2
  27. package/dist/esm/utils/projectInfo.js +1 -1
  28. package/package.json +1 -1
  29. package/dist/cjs/shared/misc/isRenderFailure.js +0 -4
  30. package/dist/esm/shared/misc/isRenderFailure.d.ts +0 -1
  31. package/dist/esm/shared/misc/isRenderFailure.js +0 -1
@@ -4,7 +4,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.commonConfig = void 0;
7
- const vite_1 = require("vite");
8
7
  const utils_js_1 = require("../utils.js");
9
8
  const buildConfig_js_1 = require("./buildConfig.js");
10
9
  const require_shim_1 = require("@brillout/require-shim");
@@ -30,7 +29,9 @@ function commonConfig() {
30
29
  order: 'post',
31
30
  handler(config) {
32
31
  overrideViteDefaultPort(config);
33
- overrideViteDefaultSsrExternal(config);
32
+ /* TODO: do this after implementing vike.config.js and new setting transformLinkedDependencies (or probably a better name like transpileLinkedDependencies/bundleLinkedDependencies or something else)
33
+ overrideViteDefaultSsrExternal(config)
34
+ */
34
35
  workaroundCI(config);
35
36
  (0, buildConfig_js_1.assertRollupInput)(config);
36
37
  (0, assertResolveAlias_js_1.assertResolveAlias)(config);
@@ -50,13 +51,22 @@ function overrideViteDefaultPort(config) {
50
51
  config.preview ?? (config.preview = {});
51
52
  (_b = config.preview).port ?? (_b.port = 3000);
52
53
  }
53
- function overrideViteDefaultSsrExternal(config) {
54
- var _a;
55
- if (!isViteVersionWithSsrExternalTrue())
56
- return;
57
- // @ts-ignore Not released yet: https://github.com/vitejs/vite/pull/10939/files#diff-5a3d42620df2c6b17e25f440ffdb67683dee7ef57317674d19f41d5f30502310L5
58
- (_a = config.ssr).external ?? (_a.external = true);
54
+ /*
55
+ function overrideViteDefaultSsrExternal(config: ResolvedConfig) {
56
+ if (!isViteVersionWithSsrExternalTrue()) return
57
+ // @ts-ignore Not released yet: https://github.com/vitejs/vite/pull/10939/files#diff-5a3d42620df2c6b17e25f440ffdb67683dee7ef57317674d19f41d5f30502310L5
58
+ config.ssr.external ??= true
59
+ }
60
+ import { version } from 'vite'
61
+ function isViteVersionWithSsrExternalTrue(): boolean {
62
+ const versionParts = version.split('.').map((s) => parseInt(s, 10)) as [number, number, number]
63
+ assert(versionParts.length === 3)
64
+ if (versionParts[0] > 5) return true
65
+ if (versionParts[1] > 0) return true
66
+ if (versionParts[2] >= 12) return true
67
+ return false
59
68
  }
69
+ */
60
70
  // Workaround GitHub Action failing to access the server
61
71
  function workaroundCI(config) {
62
72
  var _a, _b;
@@ -79,14 +89,3 @@ function assertEsm(userViteRoot) {
79
89
  dir = picocolors_1.default.dim(dir);
80
90
  (0, utils_js_1.assertWarning)(packageJson.type === 'module', `We recommend setting ${dir}package.json#type to "module", see https://vike.dev/CJS`, { onlyOnce: true });
81
91
  }
82
- function isViteVersionWithSsrExternalTrue() {
83
- const versionParts = vite_1.version.split('.').map((s) => parseInt(s, 10));
84
- (0, utils_js_1.assert)(versionParts.length === 3);
85
- if (versionParts[0] > 5)
86
- return true;
87
- if (versionParts[1] > 0)
88
- return true;
89
- if (versionParts[2] >= 12)
90
- return true;
91
- return false;
92
- }
@@ -145,6 +145,8 @@ async function isGitMissing(userRootDir) {
145
145
  }
146
146
  async function runCmd(cmd, cwd) {
147
147
  const res = await execA(cmd, { cwd });
148
- (0, utils_js_1.assert)(res.stderr === '');
148
+ /* Not always true: https://github.com/vikejs/vike/issues/1440#issuecomment-1892831303
149
+ assert(res.stderr === '')
150
+ */
149
151
  return res.stdout.toString().split('\n').filter(Boolean);
150
152
  }
@@ -841,6 +841,7 @@ function getConfigName(filePath) {
841
841
  }
842
842
  else {
843
843
  const configName = basename.slice(1);
844
+ (0, utils_js_1.assertUsage)(configName !== '', `${filePath} Invalid filename ${fileName}`);
844
845
  return configName;
845
846
  }
846
847
  }
@@ -1033,6 +1034,7 @@ function resolveImportPath(importData, importerFilePath) {
1033
1034
  const importerFilePathAbsolute = importerFilePath.filePathAbsoluteFilesystem;
1034
1035
  (0, utils_js_1.assertPosixPath)(importerFilePathAbsolute);
1035
1036
  const cwd = path_1.default.posix.dirname(importerFilePathAbsolute);
1037
+ // We can't use import.meta.resolve() as of Junary 2023 (and probably for a lot longer): https://stackoverflow.com/questions/54977743/do-require-resolve-for-es-modules#comment137174954_62272600:~:text=But%20the%20argument%20parent%20(aka%20cwd)%20still%20requires%20a%20flag
1036
1038
  // filePathAbsoluteFilesystem is expected to be null when importData.importPath is a Vite path alias
1037
1039
  const filePathAbsoluteFilesystem = (0, utils_js_1.requireResolve)(importData.importPath, cwd);
1038
1040
  return filePathAbsoluteFilesystem;
@@ -52,6 +52,8 @@ function getCodePageConfigsSerialized(pageConfigs, isForClientSide, isClientRout
52
52
  (0, utils_js_1.assert)(configValueSource);
53
53
  if (!configValueSource.configEnv.eager)
54
54
  return;
55
+ if (!(0, isRuntimeEnvMatch_js_1.isRuntimeEnvMatch)(configValueSource.configEnv, { isForClientSide, isClientRouting, isEager: true }))
56
+ return;
55
57
  lines.push(...(0, serializeConfigValue_js_1.serializeConfigValueImported)(configValueSource, configName, whitespace, varCounterContainer, importStatements));
56
58
  });
57
59
  lines.push(`${whitespace}],`);
@@ -54,6 +54,8 @@ const getVikeConfig_js_1 = require("../plugin/plugins/importUserCode/v1-design/g
54
54
  const logHintForCjsEsmError_js_1 = require("../runtime/renderPage/logHintForCjsEsmError.js");
55
55
  async function runPrerenderFromAPI(options = {}) {
56
56
  await runPrerender(options, 'prerender()');
57
+ // - 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.
58
+ // - We don't use logHintForCjsEsmError() 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.
57
59
  }
58
60
  exports.runPrerenderFromAPI = runPrerenderFromAPI;
59
61
  async function runPrerenderFromCLI(options) {
@@ -11,7 +11,7 @@ const addIs404ToPageProps_js_1 = require("../../../shared/addIs404ToPageProps.js
11
11
  const picocolors_1 = __importDefault(require("@brillout/picocolors"));
12
12
  const notSerializable_js_1 = require("../../../shared/notSerializable.js");
13
13
  const pageContextInitIsPassedToClient_js_1 = require("../../../shared/misc/pageContextInitIsPassedToClient.js");
14
- const isRenderFailure_js_1 = require("../../../shared/misc/isRenderFailure.js");
14
+ const isServerSideError_js_1 = require("../../../shared/misc/isServerSideError.js");
15
15
  const PASS_TO_CLIENT = [
16
16
  'abortReason',
17
17
  '_urlRewrite',
@@ -25,7 +25,7 @@ const PASS_TO_CLIENT = [
25
25
  '_pageId',
26
26
  'data' // for data() hook
27
27
  ];
28
- const PASS_TO_CLIENT_ERROR_PAGE = ['pageProps', 'is404', isRenderFailure_js_1.isRenderFailure];
28
+ const PASS_TO_CLIENT_ERROR_PAGE = ['pageProps', 'is404', isServerSideError_js_1.isServerSideError];
29
29
  function serializePageContextClientSide(pageContext) {
30
30
  const passToClient = getPassToClient(pageContext);
31
31
  const pageContextClient = {};
@@ -7,7 +7,9 @@ const globalObject = (0, utils_js_1.getGlobalObject)('runtime/renderPage/isNewEr
7
7
  });
8
8
  function isNewError(errErrorPage, errNominalPage) {
9
9
  (0, utils_js_1.warnIfErrorIsNotObject)(errErrorPage);
10
- return !(0, utils_js_1.isSameErrorMessage)(errNominalPage, errErrorPage) || !hasAlreadyLogged(errNominalPage);
10
+ return (!(0, utils_js_1.isSameErrorMessage)(errNominalPage, errErrorPage) ||
11
+ // Isn't this redudant/superfluous? I think we can remove this entire file and only use isSameErrorMessage() instead.
12
+ !hasAlreadyLogged(errNominalPage));
11
13
  }
12
14
  exports.isNewError = isNewError;
13
15
  function hasAlreadyLogged(err) {
@@ -22,7 +22,7 @@ const executeGuardHook_js_1 = require("../../../shared/route/executeGuardHook.js
22
22
  const loadPageRoutes_js_1 = require("../../../shared/route/loadPageRoutes.js");
23
23
  const picocolors_1 = __importDefault(require("@brillout/picocolors"));
24
24
  const helpers_js_1 = require("../../../shared/page-configs/helpers.js");
25
- const isRenderFailure_js_1 = require("../../../shared/misc/isRenderFailure.js");
25
+ const isServerSideError_js_1 = require("../../../shared/misc/isServerSideError.js");
26
26
  async function renderPageAlreadyRouted(pageContext) {
27
27
  // pageContext._pageId can either be the:
28
28
  // - ID of the page matching the routing, or the
@@ -49,7 +49,7 @@ async function renderPageAlreadyRouted(pageContext) {
49
49
  }
50
50
  if (pageContext.isClientSideNavigation) {
51
51
  if (isError) {
52
- (0, utils_js_1.objectAssign)(pageContext, { [isRenderFailure_js_1.isRenderFailure]: true });
52
+ (0, utils_js_1.objectAssign)(pageContext, { [isServerSideError_js_1.isServerSideError]: true });
53
53
  }
54
54
  const pageContextSerialized = (0, serializePageContextClientSide_js_1.serializePageContextClientSide)(pageContext);
55
55
  const httpResponse = await (0, createHttpResponseObject_js_1.createHttpResponsePageContextJson)(pageContextSerialized);
@@ -187,5 +187,5 @@ function assertV1Design(pageFilesAll, pageConfigs) {
187
187
  ...pageFilesAll.map((p) => indent + p.filePath)
188
188
  ].join('\n'));
189
189
  }
190
- (0, utils_js_1.assertWarning)(!isDesignOld, 'You are using the old deprecated design, update to the new V1 design, see https://vike.dev/migration/v1-design', { onlyOnce: true });
190
+ (0, utils_js_1.assertWarning)(!isDesignOld, "You are using Vike's deprecated design. Update to the new V1 design, see https://vike.dev/migration/v1-design for how to migrate.", { onlyOnce: true });
191
191
  }
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isServerSideError = void 0;
4
+ exports.isServerSideError = '_isServerSideError';
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.PROJECT_VERSION = exports.projectInfo = void 0;
4
4
  const assertSingleInstance_js_1 = require("./assertSingleInstance.js");
5
- const PROJECT_VERSION = '0.4.156-commit-d07fbe8';
5
+ const PROJECT_VERSION = '0.4.156-commit-e46716d';
6
6
  exports.PROJECT_VERSION = PROJECT_VERSION;
7
7
  const projectInfo = {
8
8
  projectName: 'Vike',
@@ -1,7 +1,6 @@
1
1
  export { getPageContextFromHooks_isHydration };
2
2
  export { getPageContextFromHooks_isNotHydration };
3
3
  export { getPageContextFromHooks_serialized };
4
- export { isServerSideRouted };
5
4
  import type { PageContextExports, PageFile } from '../../shared/getPageFiles.js';
6
5
  import type { PageConfigRuntime } from '../../shared/page-configs/PageConfig.js';
7
6
  type PageContext = {
@@ -22,13 +21,15 @@ declare function getPageContextFromHooks_isHydration(pageContext: PageContextSer
22
21
  }>;
23
22
  declare function getPageContextFromHooks_isNotHydration(pageContext: {
24
23
  _pageId: string;
25
- } & PageContext & PageContextExports, isErrorPage: boolean): Promise<(Record<string, unknown> & Record<"_pageId", string> & Record<"is404", boolean> & Record<"pageProps", Record<string, unknown>> & {
26
- _hasPageContextFromServer: true;
27
- _hasPageContextFromClient: false;
28
- }) | ({
29
- isHydration: false;
30
- _hasPageContextFromClient: boolean;
31
- } & {
32
- _hasPageContextFromServer: boolean;
33
- })>;
34
- declare function isServerSideRouted(err: unknown): boolean;
24
+ } & PageContext & PageContextExports, isErrorPage: boolean): Promise<{
25
+ is404ServerSideRouted: boolean;
26
+ pageContextFromHooks?: undefined;
27
+ } | {
28
+ pageContextFromHooks: {
29
+ isHydration: false;
30
+ _hasPageContextFromClient: boolean;
31
+ } & {
32
+ _hasPageContextFromServer: boolean;
33
+ };
34
+ is404ServerSideRouted?: undefined;
35
+ }>;
@@ -1,7 +1,6 @@
1
1
  export { getPageContextFromHooks_isHydration };
2
2
  export { getPageContextFromHooks_isNotHydration };
3
3
  export { getPageContextFromHooks_serialized };
4
- export { isServerSideRouted };
5
4
  import { assert, assertUsage, hasProp, objectAssign, getProjectError, serverSideRouteTo, executeHook, isObject, getGlobalObject } from './utils.js';
6
5
  import { parse } from '@brillout/json-serializer/parse';
7
6
  import { getPageContextSerializedInHtml } from '../shared/getPageContextSerializedInHtml.js';
@@ -15,7 +14,7 @@ import { assertOnBeforeRenderHookReturn } from '../../shared/assertOnBeforeRende
15
14
  import { executeGuardHook } from '../../shared/route/executeGuardHook.js';
16
15
  import { AbortRender, isAbortPageContext } from '../../shared/route/abort.js';
17
16
  import { pageContextInitIsPassedToClient } from '../../shared/misc/pageContextInitIsPassedToClient.js';
18
- import { isRenderFailure } from '../../shared/misc/isRenderFailure.js';
17
+ import { isServerSideError } from '../../shared/misc/isServerSideError.js';
19
18
  const globalObject = getGlobalObject('router/getPageContext.ts', {});
20
19
  function getPageContextFromHooks_serialized() {
21
20
  const pageContextSerialized = getPageContextSerializedInHtml();
@@ -54,23 +53,15 @@ async function getPageContextFromHooks_isNotHydration(pageContext, isErrorPage)
54
53
  !isErrorPage &&
55
54
  // true if pageContextInit has some client data or at least one of the data() and onBeforeRender() hooks is server-side only:
56
55
  (await hasPageContextServer({ ...pageContext, ...pageContextFromHooks }))) {
57
- const pageContextFromServer = await fetchPageContextFromServer(pageContext);
56
+ const res = await fetchPageContextFromServer(pageContext);
57
+ if ('is404ServerSideRouted' in res)
58
+ return { is404ServerSideRouted: true };
59
+ const { pageContextFromServer } = res;
58
60
  hasPageContextFromServer = true;
59
- if (!pageContextFromServer[isRenderFailure] || isErrorPage) {
60
- objectAssign(pageContextFromHooks, pageContextFromServer);
61
- }
62
- else {
63
- // When the user hasn't define a `_error.page.js` file: the mechanism with `serverSideError: true` is used instead
64
- assert(!('serverSideError' in pageContextFromServer));
65
- assert(hasProp(pageContextFromServer, 'is404', 'boolean'));
66
- assert(hasProp(pageContextFromServer, 'pageProps', 'object'));
67
- assert(hasProp(pageContextFromServer.pageProps, 'is404', 'boolean'));
68
- objectAssign(pageContextFromServer, {
69
- _hasPageContextFromServer: true,
70
- _hasPageContextFromClient: false
71
- });
72
- return pageContextFromServer;
73
- }
61
+ // Already handled
62
+ assert(!(isServerSideError in pageContextFromServer));
63
+ assert(!('serverSideError' in pageContextFromServer));
64
+ objectAssign(pageContextFromHooks, pageContextFromServer);
74
65
  }
75
66
  // At this point, we need to call the client-side guard(), data() and onBeforeRender() hooks, if they exist on client
76
67
  // env. However if we have fetched pageContext from the server, some of them might have run already on the
@@ -107,7 +98,7 @@ async function getPageContextFromHooks_isNotHydration(pageContext, isErrorPage)
107
98
  objectAssign(pageContextFromHooks, {
108
99
  _hasPageContextFromServer: hasPageContextFromServer
109
100
  });
110
- return pageContextFromHooks;
101
+ return { pageContextFromHooks };
111
102
  }
112
103
  async function executeHookClientSide(hookName, pageContext) {
113
104
  const hook = getHook(pageContext, hookName);
@@ -217,32 +208,25 @@ async function fetchPageContextFromServer(pageContext) {
217
208
  // Static hosts + page doesn't exist
218
209
  if (!isCorrect && response.status === 404) {
219
210
  serverSideRouteTo(pageContext.urlOriginal);
220
- throw ServerSideRouted();
211
+ return { is404ServerSideRouted: true };
221
212
  }
222
213
  assertUsage(isCorrect, `Wrong Content-Type for ${pageContextUrl}: it should be ${contentTypeCorrect} but it's ${contentType} instead. Make sure to properly use pageContext.httpResponse.headers, see https://vike.dev/renderPage`);
223
214
  }
224
215
  const responseText = await response.text();
225
216
  const pageContextFromServer = parse(responseText);
226
217
  assert(isObject(pageContextFromServer));
227
- if ('serverSideError' in pageContextFromServer) {
228
- throw getProjectError(`The pageContext object couldn't be fetched from the server as an error occurred on the server-side. Check your server logs.`);
229
- }
230
218
  if (isAbortPageContext(pageContextFromServer)) {
231
219
  throw AbortRender(pageContextFromServer);
232
220
  }
221
+ // Is there a reason for having two different properties? Can't we use only one property? I guess/think the isServerSideError property was an attempt (a bad idea really) for rendering the error page even though an error occured on the server-side (which is a bad idea because the added complexity is non-negligible while the added value is minuscule since the error page usually doesn't have any (meaningful / server-side) hooks).
222
+ if ('serverSideError' in pageContextFromServer || isServerSideError in pageContextFromServer) {
223
+ throw getProjectError(`The pageContext object couldn't be fetched from the server as an error occurred on the server-side. Check your server logs.`);
224
+ }
233
225
  assert(hasProp(pageContextFromServer, '_pageId', 'string'));
234
226
  processPageContextFromServer(pageContextFromServer);
235
- return pageContextFromServer;
227
+ return { pageContextFromServer };
236
228
  }
237
229
  function processPageContextFromServer(pageContextFromServer) {
238
230
  setPageContextInitIsPassedToClient(pageContextFromServer);
239
231
  removeBuiltInOverrides(pageContextFromServer);
240
232
  }
241
- function isServerSideRouted(err) {
242
- return isObject(err) && !!err._alreadyServerSideRouted;
243
- }
244
- function ServerSideRouted() {
245
- const err = new Error("Page doesn't exist");
246
- Object.assign(err, { _alreadyServerSideRouted: true });
247
- return err;
248
- }
@@ -2,7 +2,7 @@ export { renderPageClientSide };
2
2
  export { getRenderCount };
3
3
  export { disableClientRouting };
4
4
  import { assert, getCurrentUrl, isSameErrorMessage, objectAssign, serverSideRouteTo, getGlobalObject, executeHook, hasProp } from './utils.js';
5
- import { getPageContextFromHooks_isHydration, getPageContextFromHooks_isNotHydration, getPageContextFromHooks_serialized, isServerSideRouted } from './getPageContextFromHooks.js';
5
+ import { getPageContextFromHooks_isHydration, getPageContextFromHooks_isNotHydration, getPageContextFromHooks_serialized } from './getPageContextFromHooks.js';
6
6
  import { createPageContext } from './createPageContext.js';
7
7
  import { addLinkPrefetchHandlers } from './prefetch.js';
8
8
  import { assertInfo, assertWarning, isReact } from './utils.js';
@@ -17,7 +17,6 @@ import { setScrollPosition } from './setScrollPosition.js';
17
17
  import { updateState } from './onBrowserHistoryNavigation.js';
18
18
  import { browserNativeScrollRestoration_disable, setInitialRenderIsDone } from './scrollRestoration.js';
19
19
  import { getErrorPageId } from '../../shared/error-page.js';
20
- import { isRenderFailure } from '../../shared/misc/isRenderFailure.js';
21
20
  const globalObject = getGlobalObject('renderPageClientSide.ts', { renderCounter: 0 });
22
21
  async function renderPageClientSide(renderArgs) {
23
22
  const { scrollTarget, urlOriginal = getCurrentUrl(), overwriteLastHistoryEntry = false, isBackwardNavigation, pageContextsFromRewrite = [], redirectCount = 0, isUserLandPushStateNavigation, isClientSideNavigation = true } = renderArgs;
@@ -32,6 +31,9 @@ async function renderPageClientSide(renderArgs) {
32
31
  await renderPageNominal();
33
32
  return;
34
33
  async function renderPageNominal() {
34
+ const onError = async (err) => {
35
+ await renderErrorPage({ err });
36
+ };
35
37
  const pageContext = await getPageContextBegin();
36
38
  if (isRenderOutdated())
37
39
  return;
@@ -47,7 +49,7 @@ async function renderPageClientSide(renderArgs) {
47
49
  pageContextFromRoute = await route(pageContext);
48
50
  }
49
51
  catch (err) {
50
- await renderErrorPage({ err });
52
+ await onError(err);
51
53
  return;
52
54
  }
53
55
  if (isRenderOutdated())
@@ -85,7 +87,9 @@ async function renderPageClientSide(renderArgs) {
85
87
  return;
86
88
  }
87
89
  else {
88
- throw err;
90
+ // A user file has a syntax error
91
+ await onError(err);
92
+ return;
89
93
  }
90
94
  }
91
95
  if (isRenderOutdated())
@@ -113,7 +117,7 @@ async function renderPageClientSide(renderArgs) {
113
117
  await executeHook(() => hookFn(pageContext), hook);
114
118
  }
115
119
  catch (err) {
116
- await renderErrorPage({ err });
120
+ await onError(err);
117
121
  return;
118
122
  }
119
123
  if (isRenderOutdated())
@@ -129,7 +133,7 @@ async function renderPageClientSide(renderArgs) {
129
133
  pageContextFromHooks = await getPageContextFromHooks_isHydration(pageContext);
130
134
  }
131
135
  catch (err) {
132
- await renderErrorPage({ err });
136
+ await onError(err);
133
137
  return;
134
138
  }
135
139
  if (isRenderOutdated())
@@ -140,20 +144,19 @@ async function renderPageClientSide(renderArgs) {
140
144
  await renderPageView(pageContext);
141
145
  }
142
146
  else {
143
- let pageContextFromHooks;
147
+ let res;
144
148
  try {
145
- pageContextFromHooks = await getPageContextFromHooks_isNotHydration(pageContext, false);
149
+ res = await getPageContextFromHooks_isNotHydration(pageContext, false);
146
150
  }
147
151
  catch (err) {
148
- await renderErrorPage({ err });
152
+ await onError(err);
149
153
  return;
150
154
  }
151
155
  if (isRenderOutdated())
152
156
  return;
153
- if (isRenderFailure in pageContextFromHooks) {
154
- await renderErrorPage({ pageContextError: pageContextFromHooks });
157
+ if ('is404ServerSideRouted' in res)
155
158
  return;
156
- }
159
+ const pageContextFromHooks = res.pageContextFromHooks;
157
160
  assert(!('urlOriginal' in pageContextFromHooks));
158
161
  objectAssign(pageContext, pageContextFromHooks);
159
162
  // Render page view
@@ -174,19 +177,19 @@ async function renderPageClientSide(renderArgs) {
174
177
  return pageContext;
175
178
  }
176
179
  async function renderErrorPage(args) {
177
- const pageContext = await getPageContextBegin();
178
- if (isRenderOutdated())
179
- return;
180
- if (args.pageContextError) {
181
- objectAssign(pageContext, args.pageContextError);
182
- }
180
+ const onError = (err) => {
181
+ if (!isSameErrorMessage(err, args.err)) {
182
+ /* When we can't render the error page, we prefer showing a blank page over letting the server-side try because otherwise:
183
+ - We risk running into an infinite loop of reloads which would overload the server.
184
+ - An infinite reloading page is a even worse UX than a blank page.
185
+ serverSideRouteTo(urlOriginal)
186
+ */
187
+ console.error(err);
188
+ }
189
+ };
183
190
  if ('err' in args) {
184
191
  const { err } = args;
185
192
  assert(err);
186
- assert(!('errorWhileRendering' in pageContext));
187
- pageContext.errorWhileRendering = err;
188
- if (shouldSwallowAndInterrupt(err))
189
- return;
190
193
  if (!isAbortError(err)) {
191
194
  // We don't swallow 404 errors:
192
195
  // - On the server-side, Vike swallows / doesn't show any 404 error log because it's expected that a user may go to some random non-existent URL. (We don't want to flood the app's error tracking with 404 logs.)
@@ -197,6 +200,17 @@ async function renderPageClientSide(renderArgs) {
197
200
  // We swallow throw redirect()/render() called by client-side hooks onBeforeRender()/data()/guard()
198
201
  // We handle the abort error down below.
199
202
  }
203
+ }
204
+ const pageContext = await getPageContextBegin();
205
+ if (isRenderOutdated())
206
+ return;
207
+ if (args.pageContextError) {
208
+ objectAssign(pageContext, args.pageContextError);
209
+ }
210
+ if ('err' in args) {
211
+ const { err } = args;
212
+ assert(!('errorWhileRendering' in pageContext));
213
+ pageContext.errorWhileRendering = err;
200
214
  if (isAbortError(err)) {
201
215
  const errAbort = err;
202
216
  logAbortErrorHandled(err, !import.meta.env.DEV, pageContext);
@@ -256,38 +270,44 @@ async function renderPageClientSide(renderArgs) {
256
270
  return;
257
271
  }
258
272
  else {
259
- throw err;
273
+ // A user file has a syntax error
274
+ onError(err);
275
+ return;
260
276
  }
261
277
  }
262
278
  if (isRenderOutdated())
263
279
  return;
264
- let pageContextFromHooks;
280
+ let res;
265
281
  try {
266
- pageContextFromHooks = await getPageContextFromHooks_isNotHydration(pageContext, true);
282
+ res = await getPageContextFromHooks_isNotHydration(pageContext, true);
267
283
  }
268
- catch (errErrorPage) {
284
+ catch (err) {
269
285
  // - When user hasn't defined a `_error.page.js` file
270
286
  // - Some Vike unpexected internal error
271
- if (shouldSwallowAndInterrupt(errErrorPage))
272
- return;
273
- if (!isSameErrorMessage(args.err, errErrorPage)) {
274
- /* When we can't render the error page, we prefer showing a blank page over letting the server-side try because otherwise:
275
- - We risk running into an infinite loop of reloads which would overload the server.
276
- - An infinite reloading page is a even worse UX than a blank page.
277
- serverSideRouteTo(urlOriginal)
278
- */
279
- console.error(errErrorPage);
280
- }
287
+ onError(err);
281
288
  return;
282
289
  }
283
290
  if (isRenderOutdated())
284
291
  return;
292
+ if ('is404ServerSideRouted' in res)
293
+ return;
294
+ const pageContextFromHooks = res.pageContextFromHooks;
285
295
  assert(pageContextFromHooks);
286
296
  assert(!('urlOriginal' in pageContextFromHooks));
287
297
  objectAssign(pageContext, pageContextFromHooks);
288
- await renderPageView(pageContext, true);
298
+ await renderPageView(pageContext, args);
289
299
  }
290
300
  async function renderPageView(pageContext, isErrorPage) {
301
+ const onError = async (err) => {
302
+ if (!isErrorPage) {
303
+ await renderErrorPage({ err });
304
+ }
305
+ else {
306
+ if (!isSameErrorMessage(err, isErrorPage.err)) {
307
+ console.error(err);
308
+ }
309
+ }
310
+ };
291
311
  // We use globalObject.renderPromise in order to ensure that there is never two concurrent onRenderClient() calls
292
312
  if (globalObject.renderPromise) {
293
313
  // Make sure that the previous render has finished
@@ -304,12 +324,8 @@ async function renderPageClientSide(renderArgs) {
304
324
  await executeOnRenderClientHook(pageContext, true);
305
325
  }
306
326
  catch (err) {
307
- if (!isErrorPage) {
308
- renderErrorPage({ err });
309
- }
310
- else {
311
- throw err;
312
- }
327
+ await onError(err);
328
+ return;
313
329
  }
314
330
  addLinkPrefetchHandlers(pageContext);
315
331
  globalObject.renderPromise = undefined;
@@ -329,12 +345,9 @@ async function renderPageClientSide(renderArgs) {
329
345
  await executeHook(() => hookFn(pageContext), hook);
330
346
  }
331
347
  catch (err) {
332
- if (!isErrorPage) {
333
- renderErrorPage({ err });
334
- }
335
- else {
336
- throw err;
337
- }
348
+ await onError(err);
349
+ if (!isErrorPage)
350
+ return;
338
351
  }
339
352
  if (isRenderOutdated(true))
340
353
  return;
@@ -354,12 +367,9 @@ async function renderPageClientSide(renderArgs) {
354
367
  await executeHook(() => hookFn(pageContext), hook);
355
368
  }
356
369
  catch (err) {
357
- if (!isErrorPage) {
358
- renderErrorPage({ err });
359
- }
360
- else {
361
- throw err;
362
- }
370
+ await onError(err);
371
+ if (!isErrorPage)
372
+ return;
363
373
  }
364
374
  if (isRenderOutdated(true))
365
375
  return;
@@ -378,11 +388,6 @@ function changeUrl(url, overwriteLastHistoryEntry) {
378
388
  pushHistory(url, overwriteLastHistoryEntry);
379
389
  updateState();
380
390
  }
381
- function shouldSwallowAndInterrupt(err) {
382
- if (isServerSideRouted(err))
383
- return true;
384
- return false;
385
- }
386
391
  function handleErrorFetchingStaticAssets(err, pageContext, isHydrationRender) {
387
392
  if (!isErrorFetchingStaticAssets(err)) {
388
393
  return false;
@@ -19,10 +19,12 @@ async function loadUserFilesClientSide(pageId, pageFilesAll, pageConfigs) {
19
19
  pageConfigLoaded = result[0];
20
20
  }
21
21
  catch (err) {
22
- // To trigger this catch: add `throw new Error()` in the global scope of +onRenderClient.js
23
22
  if (isFetchError(err)) {
24
23
  Object.assign(err, { [stamp]: true });
25
24
  }
25
+ else {
26
+ // A user file has a syntax error
27
+ }
26
28
  throw err;
27
29
  }
28
30
  const { config, configEntries, exports, exportsAll, pageExports } = getExports(pageFilesClientSide, pageConfigLoaded);
@@ -1,5 +1,4 @@
1
1
  export { commonConfig };
2
- import { version } from 'vite';
3
2
  import { assert, assertWarning, findUserPackageJsonPath } from '../utils.js';
4
3
  import { assertRollupInput } from './buildConfig.js';
5
4
  import { installRequireShim_setUserRootDir } from '@brillout/require-shim';
@@ -25,7 +24,9 @@ function commonConfig() {
25
24
  order: 'post',
26
25
  handler(config) {
27
26
  overrideViteDefaultPort(config);
28
- overrideViteDefaultSsrExternal(config);
27
+ /* TODO: do this after implementing vike.config.js and new setting transformLinkedDependencies (or probably a better name like transpileLinkedDependencies/bundleLinkedDependencies or something else)
28
+ overrideViteDefaultSsrExternal(config)
29
+ */
29
30
  workaroundCI(config);
30
31
  assertRollupInput(config);
31
32
  assertResolveAlias(config);
@@ -44,13 +45,22 @@ function overrideViteDefaultPort(config) {
44
45
  config.preview ?? (config.preview = {});
45
46
  (_b = config.preview).port ?? (_b.port = 3000);
46
47
  }
47
- function overrideViteDefaultSsrExternal(config) {
48
- var _a;
49
- if (!isViteVersionWithSsrExternalTrue())
50
- return;
51
- // @ts-ignore Not released yet: https://github.com/vitejs/vite/pull/10939/files#diff-5a3d42620df2c6b17e25f440ffdb67683dee7ef57317674d19f41d5f30502310L5
52
- (_a = config.ssr).external ?? (_a.external = true);
48
+ /*
49
+ function overrideViteDefaultSsrExternal(config: ResolvedConfig) {
50
+ if (!isViteVersionWithSsrExternalTrue()) return
51
+ // @ts-ignore Not released yet: https://github.com/vitejs/vite/pull/10939/files#diff-5a3d42620df2c6b17e25f440ffdb67683dee7ef57317674d19f41d5f30502310L5
52
+ config.ssr.external ??= true
53
+ }
54
+ import { version } from 'vite'
55
+ function isViteVersionWithSsrExternalTrue(): boolean {
56
+ const versionParts = version.split('.').map((s) => parseInt(s, 10)) as [number, number, number]
57
+ assert(versionParts.length === 3)
58
+ if (versionParts[0] > 5) return true
59
+ if (versionParts[1] > 0) return true
60
+ if (versionParts[2] >= 12) return true
61
+ return false
53
62
  }
63
+ */
54
64
  // Workaround GitHub Action failing to access the server
55
65
  function workaroundCI(config) {
56
66
  var _a, _b;
@@ -73,14 +83,3 @@ function assertEsm(userViteRoot) {
73
83
  dir = pc.dim(dir);
74
84
  assertWarning(packageJson.type === 'module', `We recommend setting ${dir}package.json#type to "module", see https://vike.dev/CJS`, { onlyOnce: true });
75
85
  }
76
- function isViteVersionWithSsrExternalTrue() {
77
- const versionParts = version.split('.').map((s) => parseInt(s, 10));
78
- assert(versionParts.length === 3);
79
- if (versionParts[0] > 5)
80
- return true;
81
- if (versionParts[1] > 0)
82
- return true;
83
- if (versionParts[2] >= 12)
84
- return true;
85
- return false;
86
- }
@@ -139,6 +139,8 @@ async function isGitMissing(userRootDir) {
139
139
  }
140
140
  async function runCmd(cmd, cwd) {
141
141
  const res = await execA(cmd, { cwd });
142
- assert(res.stderr === '');
142
+ /* Not always true: https://github.com/vikejs/vike/issues/1440#issuecomment-1892831303
143
+ assert(res.stderr === '')
144
+ */
143
145
  return res.stdout.toString().split('\n').filter(Boolean);
144
146
  }
@@ -836,6 +836,7 @@ function getConfigName(filePath) {
836
836
  }
837
837
  else {
838
838
  const configName = basename.slice(1);
839
+ assertUsage(configName !== '', `${filePath} Invalid filename ${fileName}`);
839
840
  return configName;
840
841
  }
841
842
  }
@@ -1028,6 +1029,7 @@ function resolveImportPath(importData, importerFilePath) {
1028
1029
  const importerFilePathAbsolute = importerFilePath.filePathAbsoluteFilesystem;
1029
1030
  assertPosixPath(importerFilePathAbsolute);
1030
1031
  const cwd = path.posix.dirname(importerFilePathAbsolute);
1032
+ // We can't use import.meta.resolve() as of Junary 2023 (and probably for a lot longer): https://stackoverflow.com/questions/54977743/do-require-resolve-for-es-modules#comment137174954_62272600:~:text=But%20the%20argument%20parent%20(aka%20cwd)%20still%20requires%20a%20flag
1031
1033
  // filePathAbsoluteFilesystem is expected to be null when importData.importPath is a Vite path alias
1032
1034
  const filePathAbsoluteFilesystem = requireResolve(importData.importPath, cwd);
1033
1035
  return filePathAbsoluteFilesystem;
@@ -49,6 +49,8 @@ function getCodePageConfigsSerialized(pageConfigs, isForClientSide, isClientRout
49
49
  assert(configValueSource);
50
50
  if (!configValueSource.configEnv.eager)
51
51
  return;
52
+ if (!isRuntimeEnvMatch(configValueSource.configEnv, { isForClientSide, isClientRouting, isEager: true }))
53
+ return;
52
54
  lines.push(...serializeConfigValueImported(configValueSource, configName, whitespace, varCounterContainer, importStatements));
53
55
  });
54
56
  lines.push(`${whitespace}],`);
@@ -29,6 +29,8 @@ import { getVikeConfig } from '../plugin/plugins/importUserCode/v1-design/getVik
29
29
  import { logHintForCjsEsmError } from '../runtime/renderPage/logHintForCjsEsmError.js';
30
30
  async function runPrerenderFromAPI(options = {}) {
31
31
  await runPrerender(options, 'prerender()');
32
+ // - 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.
33
+ // - We don't use logHintForCjsEsmError() 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.
32
34
  }
33
35
  async function runPrerenderFromCLI(options) {
34
36
  try {
@@ -7,7 +7,7 @@ import { addIs404ToPageProps } from '../../../shared/addIs404ToPageProps.js';
7
7
  import pc from '@brillout/picocolors';
8
8
  import { notSerializable } from '../../../shared/notSerializable.js';
9
9
  import { pageContextInitIsPassedToClient } from '../../../shared/misc/pageContextInitIsPassedToClient.js';
10
- import { isRenderFailure } from '../../../shared/misc/isRenderFailure.js';
10
+ import { isServerSideError } from '../../../shared/misc/isServerSideError.js';
11
11
  const PASS_TO_CLIENT = [
12
12
  'abortReason',
13
13
  '_urlRewrite',
@@ -21,7 +21,7 @@ const PASS_TO_CLIENT = [
21
21
  '_pageId',
22
22
  'data' // for data() hook
23
23
  ];
24
- const PASS_TO_CLIENT_ERROR_PAGE = ['pageProps', 'is404', isRenderFailure];
24
+ const PASS_TO_CLIENT_ERROR_PAGE = ['pageProps', 'is404', isServerSideError];
25
25
  function serializePageContextClientSide(pageContext) {
26
26
  const passToClient = getPassToClient(pageContext);
27
27
  const pageContextClient = {};
@@ -6,7 +6,9 @@ const globalObject = getGlobalObject('runtime/renderPage/isNewError.ts', {
6
6
  });
7
7
  function isNewError(errErrorPage, errNominalPage) {
8
8
  warnIfErrorIsNotObject(errErrorPage);
9
- return !isSameErrorMessage(errNominalPage, errErrorPage) || !hasAlreadyLogged(errNominalPage);
9
+ return (!isSameErrorMessage(errNominalPage, errErrorPage) ||
10
+ // Isn't this redudant/superfluous? I think we can remove this entire file and only use isSameErrorMessage() instead.
11
+ !hasAlreadyLogged(errNominalPage));
10
12
  }
11
13
  function hasAlreadyLogged(err) {
12
14
  if (!isObject(err))
@@ -21,7 +21,7 @@ import { executeGuardHook } from '../../../shared/route/executeGuardHook.js';
21
21
  import { loadPageRoutes } from '../../../shared/route/loadPageRoutes.js';
22
22
  import pc from '@brillout/picocolors';
23
23
  import { getConfigValueFilePathToShowToUser } from '../../../shared/page-configs/helpers.js';
24
- import { isRenderFailure } from '../../../shared/misc/isRenderFailure.js';
24
+ import { isServerSideError } from '../../../shared/misc/isServerSideError.js';
25
25
  async function renderPageAlreadyRouted(pageContext) {
26
26
  // pageContext._pageId can either be the:
27
27
  // - ID of the page matching the routing, or the
@@ -48,7 +48,7 @@ async function renderPageAlreadyRouted(pageContext) {
48
48
  }
49
49
  if (pageContext.isClientSideNavigation) {
50
50
  if (isError) {
51
- objectAssign(pageContext, { [isRenderFailure]: true });
51
+ objectAssign(pageContext, { [isServerSideError]: true });
52
52
  }
53
53
  const pageContextSerialized = serializePageContextClientSide(pageContext);
54
54
  const httpResponse = await createHttpResponsePageContextJson(pageContextSerialized);
@@ -181,5 +181,5 @@ function assertV1Design(pageFilesAll, pageConfigs) {
181
181
  ...pageFilesAll.map((p) => indent + p.filePath)
182
182
  ].join('\n'));
183
183
  }
184
- assertWarning(!isDesignOld, 'You are using the old deprecated design, update to the new V1 design, see https://vike.dev/migration/v1-design', { onlyOnce: true });
184
+ assertWarning(!isDesignOld, "You are using Vike's deprecated design. Update to the new V1 design, see https://vike.dev/migration/v1-design for how to migrate.", { onlyOnce: true });
185
185
  }
@@ -0,0 +1 @@
1
+ export declare const isServerSideError = "_isServerSideError";
@@ -0,0 +1 @@
1
+ export const isServerSideError = '_isServerSideError';
@@ -46,12 +46,12 @@ type Config = ConfigBuiltIn & Vike.Config & (VikePackages.ConfigVikeReact | Vike
46
46
  *
47
47
  * https://vike.dev/data
48
48
  */
49
- type DataAsync<Data> = (pageContext: PageContextServer) => Promise<Data>;
49
+ type DataAsync<Data = unknown> = (pageContext: PageContextServer) => Promise<Data>;
50
50
  /** Hook for fetching data.
51
51
  *
52
52
  * https://vike.dev/data
53
53
  */
54
- type DataSync<Data> = (pageContext: PageContextServer) => Data;
54
+ type DataSync<Data = unknown> = (pageContext: PageContextServer) => Data;
55
55
  /** Protect page(s), e.g. forbid unauthorized access.
56
56
  *
57
57
  * https://vike.dev/guard
@@ -1,13 +1,13 @@
1
1
  export { projectInfo };
2
2
  export type { ProjectTag };
3
3
  export { PROJECT_VERSION };
4
- declare const PROJECT_VERSION: "0.4.156-commit-d07fbe8";
4
+ declare const PROJECT_VERSION: "0.4.156-commit-e46716d";
5
5
  type PackageName = typeof projectInfo.npmPackageName;
6
6
  type ProjectVersion = typeof projectInfo.projectVersion;
7
7
  type ProjectTag = `[${PackageName}]` | `[${PackageName}@${ProjectVersion}]`;
8
8
  declare const projectInfo: {
9
9
  projectName: "Vike";
10
- projectVersion: "0.4.156-commit-d07fbe8";
10
+ projectVersion: "0.4.156-commit-e46716d";
11
11
  npmPackageName: "vike";
12
12
  githubRepository: "https://github.com/vikejs/vike";
13
13
  };
@@ -1,7 +1,7 @@
1
1
  export { projectInfo };
2
2
  export { PROJECT_VERSION };
3
3
  import { onProjectInfo } from './assertSingleInstance.js';
4
- const PROJECT_VERSION = '0.4.156-commit-d07fbe8';
4
+ const PROJECT_VERSION = '0.4.156-commit-e46716d';
5
5
  const projectInfo = {
6
6
  projectName: 'Vike',
7
7
  projectVersion: PROJECT_VERSION,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vike",
3
- "version": "0.4.156-commit-d07fbe8",
3
+ "version": "0.4.156-commit-e46716d",
4
4
  "scripts": {
5
5
  "dev": "tsc --watch",
6
6
  "build": "rimraf dist/ && pnpm run build:esm && pnpm run build:cjs",
@@ -1,4 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.isRenderFailure = void 0;
4
- exports.isRenderFailure = '_isRenderFailure';
@@ -1 +0,0 @@
1
- export declare const isRenderFailure = "_isRenderFailure";
@@ -1 +0,0 @@
1
- export const isRenderFailure = '_isRenderFailure';