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('
|
5
|
+
const globalObject = getGlobalObject('usePageContext.tsx', {
|
6
6
|
reactContext: React.createContext(undefined),
|
7
7
|
});
|
8
8
|
function PageContextProvider({ pageContext, children }) {
|
@@ -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
|
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
|
-
|
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
|
-
//
|
18
|
-
|
19
|
-
|
20
|
-
|
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,
|
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,
|
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.
|
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.
|
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.
|
48
|
+
"vite": "^7.1.5"
|
49
49
|
},
|
50
50
|
"typesVersions": {
|
51
51
|
"*": {
|