vike-react 0.6.5-commit-b8ba930 → 0.6.6

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.
@@ -2,7 +2,7 @@ export { usePageContext };
2
2
  export { PageContextProvider };
3
3
  import React, { useContext } from 'react';
4
4
  import { getGlobalObject } from '../utils/getGlobalObject.js';
5
- const globalObject = getGlobalObject('PageContextProvider.ts', {
5
+ const globalObject = getGlobalObject('usePageContext.tsx', {
6
6
  reactContext: React.createContext(undefined),
7
7
  });
8
8
  function PageContextProvider({ pageContext, children }) {
@@ -4,4 +4,5 @@ import type { PageContext } from 'vike/types';
4
4
  declare function getPageElement(pageContext: PageContext): {
5
5
  page: React.JSX.Element;
6
6
  renderPromise: Promise<void>;
7
+ renderPromiseReject: (err: unknown) => void;
7
8
  };
@@ -20,14 +20,20 @@ function getPageElement(pageContext) {
20
20
  page = React.createElement(Wrap, null, page);
21
21
  page = addSuspense(page);
22
22
  });
23
+ // TODO/now rename
23
24
  page = React.createElement(PageContextProvider, { pageContext: pageContext }, page);
24
25
  let renderPromiseResolve;
25
- let renderPromise = new Promise((r) => (renderPromiseResolve = r));
26
+ let renderPromiseReject;
27
+ let renderPromise = new Promise((resolve, reject) => {
28
+ renderPromiseResolve = resolve;
29
+ renderPromiseReject = reject;
30
+ });
31
+ // TODO/now rename
26
32
  page = React.createElement(RenderPromiseProvider, { renderPromiseResolve: renderPromiseResolve }, page);
27
33
  if (pageContext.config.reactStrictMode !== false) {
28
34
  page = React.createElement(React.StrictMode, null, page);
29
35
  }
30
- return { page, renderPromise };
36
+ return { page, renderPromise, renderPromiseReject };
31
37
  }
32
38
  function RenderPromiseProvider({ children, renderPromiseResolve, }) {
33
39
  useEffect(renderPromiseResolve);
@@ -6,35 +6,54 @@ import { getPageElement } from './getPageElement.js';
6
6
  import { callCumulativeHooks } from '../utils/callCumulativeHooks.js';
7
7
  import { applyHeadSettings } from './applyHeadSettings.js';
8
8
  import { resolveReactOptions } from './resolveReactOptions.js';
9
- let root;
9
+ import { getGlobalObject } from '../utils/getGlobalObject.js';
10
+ import { isObject } from '../utils/isObject.js';
11
+ const globalObject = getGlobalObject('onRenderClient.tsx', {});
12
+ // TODO/now: update TS
10
13
  const onRenderClient = async (pageContext) => {
11
14
  pageContext._headAlreadySet = pageContext.isHydration;
12
15
  // Use case:
13
16
  // - Store hydration https://github.com/vikejs/vike-react/issues/110
14
17
  await callCumulativeHooks(pageContext.config.onBeforeRenderClient, pageContext);
15
- const { page, renderPromise } = getPageElement(pageContext);
18
+ const { page, renderPromise, renderPromiseReject } = getPageElement(pageContext);
16
19
  pageContext.page = page;
17
- // TODO: implement this? So that, upon errors, onRenderClient() throws an error and Vike can render the error page. As of April 2024 it isn't released yet.
18
- // - https://react-dev-git-fork-rickhanlonii-rh-root-options-fbopensource.vercel.app/reference/react-dom/client/createRoot#show-a-dialog-for-uncaught-errors
19
- // - https://react-dev-git-fork-rickhanlonii-rh-root-options-fbopensource.vercel.app/reference/react-dom/client/hydrateRoot#show-a-dialog-for-uncaught-errors
20
- const onUncaughtError = (_error, _errorInfo) => { };
20
+ // Local callback for current page
21
+ globalObject.onUncaughtErrorLocal = (err) => {
22
+ renderPromiseReject(err);
23
+ };
21
24
  const container = document.getElementById('root');
22
25
  const { hydrateRootOptions, createRootOptions } = resolveReactOptions(pageContext);
23
26
  if (pageContext.isHydration &&
24
27
  // Whether the page was [Server-Side Rendered](https://vike.dev/ssr).
25
28
  container.innerHTML !== '') {
26
29
  // First render while using SSR, i.e. [hydration](https://vike.dev/hydration)
27
- root = ReactDOM.hydrateRoot(container, page, hydrateRootOptions);
30
+ globalObject.root = ReactDOM.hydrateRoot(container, page, {
31
+ ...hydrateRootOptions,
32
+ // onUncaughtError is the right callback: https://gist.github.com/brillout/b9516e83a7a4517f4dbd0ef50e9dd716
33
+ onUncaughtError(...args) {
34
+ onUncaughtErrorGlobal.call(this, args, hydrateRootOptions);
35
+ },
36
+ });
28
37
  }
29
38
  else {
30
- if (!root) {
39
+ if (!globalObject.root) {
31
40
  // First render without SSR
32
- root = ReactDOM.createRoot(container, createRootOptions);
41
+ globalObject.root = ReactDOM.createRoot(container, {
42
+ ...createRootOptions,
43
+ onUncaughtError(...args) {
44
+ onUncaughtErrorGlobal.call(this, args, createRootOptions);
45
+ },
46
+ });
33
47
  }
34
- root.render(page);
48
+ globalObject.root.render(page);
49
+ }
50
+ pageContext.root = globalObject.root;
51
+ try {
52
+ await renderPromise;
53
+ }
54
+ finally {
55
+ delete globalObject.onUncaughtErrorLocal;
35
56
  }
36
- pageContext.root = root;
37
- await renderPromise;
38
57
  if (!pageContext.isHydration) {
39
58
  pageContext._headAlreadySet = true;
40
59
  applyHead(pageContext);
@@ -49,3 +68,18 @@ function applyHead(pageContext) {
49
68
  const lang = getHeadSetting('lang', pageContext);
50
69
  applyHeadSettings(title, lang);
51
70
  }
71
+ // Global callback, attached once upon hydration.
72
+ function onUncaughtErrorGlobal(args, userOptions) {
73
+ logUncaughtError(args);
74
+ const [error] = args;
75
+ globalObject.onUncaughtErrorLocal?.(error);
76
+ userOptions?.onUncaughtError?.apply(this, args);
77
+ }
78
+ async function logUncaughtError(args) {
79
+ const [error, errorInfo] = args;
80
+ console.error('%o\n%s', error, `The above error occurred at:${errorInfo.componentStack}`);
81
+ // Used by Vike:
82
+ // https://github.com/vikejs/vike/blob/8ce2cbda756892f0ff083256291515b5a45fe319/packages/vike/client/runtime-client-routing/renderPageClientSide.ts#L838-L844
83
+ if (isObject(error))
84
+ error.isAlreadyLogged = true;
85
+ }
@@ -1 +1 @@
1
- export declare function getGlobalObject<T extends Record<string, unknown> = never>(key: `${string}.ts`, defaultValue: T): T;
1
+ export declare function getGlobalObject<T extends Record<string, unknown> = never>(key: `${string}.ts` | `${string}.tsx`, defaultValue: T): T;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vike-react",
3
- "version": "0.6.5-commit-b8ba930",
3
+ "version": "0.6.6",
4
4
  "repository": "https://github.com/vikejs/vike-react",
5
5
  "type": "module",
6
6
  "exports": {
@@ -27,7 +27,7 @@
27
27
  "./__internal/integration/Loading": "./dist/integration/Loading.js"
28
28
  },
29
29
  "dependencies": {
30
- "react-streaming": "^0.4.3"
30
+ "react-streaming": "^0.4.4"
31
31
  },
32
32
  "peerDependencies": {
33
33
  "react": ">=19",
@@ -45,7 +45,7 @@
45
45
  "rimraf": "^5.0.5",
46
46
  "typescript": "^5.9.2",
47
47
  "vike": "^0.4.237",
48
- "vite": "^7.1.2"
48
+ "vite": "^7.1.5"
49
49
  },
50
50
  "typesVersions": {
51
51
  "*": {