vike-react 0.6.5 → 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 }) {
@@ -2,20 +2,26 @@ export default {
2
2
  component: LoadingComponent,
3
3
  };
4
4
  import React from 'react';
5
- /* We can't import it here: https://github.com/vikejs/vike/issues/2460
6
- * - We import it inside onRenderClient.js instead.
7
- * - We'll be able to do it if Vite + Rolldown always transpiles the server-side.
8
- import './Loading.css'
9
- */
10
5
  function LoadingComponent() {
11
- return (React.createElement("div", { style: {
12
- width: '100%',
13
- height: '100%',
14
- maxHeight: '100%',
15
- background: 'linear-gradient(110deg, #ececec 8%, #f5f5f5 18%, #ececec 33%)',
16
- borderRadius: '5px',
17
- backgroundSize: '200% 100%',
18
- animation: '1.3s vike-react-shine linear infinite',
19
- aspectRatio: '2.5/1',
20
- } }));
6
+ return (React.createElement(React.Fragment, null,
7
+ React.createElement("div", { style: {
8
+ width: '100%',
9
+ height: '100%',
10
+ maxHeight: '100%',
11
+ background: 'linear-gradient(110deg, #ececec 8%, #f5f5f5 18%, #ececec 33%)',
12
+ borderRadius: '5px',
13
+ backgroundSize: '200% 100%',
14
+ animation: '1.3s vike-react-loading linear infinite',
15
+ aspectRatio: '2.5/1',
16
+ } }),
17
+ React.createElement("style", { href: "vike-react-loading",
18
+ // https://react.dev/reference/react-dom/components/style#special-rendering-behavior
19
+ // https://github.com/vikejs/vike-react/pull/184#discussion_r2348075206
20
+ precedence: "default" }, `
21
+ @keyframes vike-react-loading {
22
+ to {
23
+ background-position-x: -200%;
24
+ }
25
+ }
26
+ `)));
21
27
  }
@@ -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);
@@ -1,4 +1,3 @@
1
1
  export { onRenderClient };
2
2
  import type { OnRenderClientAsync } from 'vike/types';
3
- import './Loading.css';
4
3
  declare const onRenderClient: OnRenderClientAsync;
@@ -6,36 +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
- import './Loading.css'; // See comment inside Loading.tsx
10
- 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
11
13
  const onRenderClient = async (pageContext) => {
12
14
  pageContext._headAlreadySet = pageContext.isHydration;
13
15
  // Use case:
14
16
  // - Store hydration https://github.com/vikejs/vike-react/issues/110
15
17
  await callCumulativeHooks(pageContext.config.onBeforeRenderClient, pageContext);
16
- const { page, renderPromise } = getPageElement(pageContext);
18
+ const { page, renderPromise, renderPromiseReject } = getPageElement(pageContext);
17
19
  pageContext.page = page;
18
- // 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.
19
- // - https://react-dev-git-fork-rickhanlonii-rh-root-options-fbopensource.vercel.app/reference/react-dom/client/createRoot#show-a-dialog-for-uncaught-errors
20
- // - https://react-dev-git-fork-rickhanlonii-rh-root-options-fbopensource.vercel.app/reference/react-dom/client/hydrateRoot#show-a-dialog-for-uncaught-errors
21
- const onUncaughtError = (_error, _errorInfo) => { };
20
+ // Local callback for current page
21
+ globalObject.onUncaughtErrorLocal = (err) => {
22
+ renderPromiseReject(err);
23
+ };
22
24
  const container = document.getElementById('root');
23
25
  const { hydrateRootOptions, createRootOptions } = resolveReactOptions(pageContext);
24
26
  if (pageContext.isHydration &&
25
27
  // Whether the page was [Server-Side Rendered](https://vike.dev/ssr).
26
28
  container.innerHTML !== '') {
27
29
  // First render while using SSR, i.e. [hydration](https://vike.dev/hydration)
28
- 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
+ });
29
37
  }
30
38
  else {
31
- if (!root) {
39
+ if (!globalObject.root) {
32
40
  // First render without SSR
33
- root = ReactDOM.createRoot(container, createRootOptions);
41
+ globalObject.root = ReactDOM.createRoot(container, {
42
+ ...createRootOptions,
43
+ onUncaughtError(...args) {
44
+ onUncaughtErrorGlobal.call(this, args, createRootOptions);
45
+ },
46
+ });
34
47
  }
35
- 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;
36
56
  }
37
- pageContext.root = root;
38
- await renderPromise;
39
57
  if (!pageContext.isHydration) {
40
58
  pageContext._headAlreadySet = true;
41
59
  applyHead(pageContext);
@@ -50,3 +68,18 @@ function applyHead(pageContext) {
50
68
  const lang = getHeadSetting('lang', pageContext);
51
69
  applyHeadSettings(title, lang);
52
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",
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",
@@ -38,14 +38,14 @@
38
38
  "@biomejs/biome": "^1.9.4",
39
39
  "@brillout/release-me": "^0.4.8",
40
40
  "@types/node": "^24.0.8",
41
- "@types/react": "^19.0.10",
42
- "@types/react-dom": "^19.0.4",
43
- "react": "^19.0.0",
44
- "react-dom": "^19.0.0",
41
+ "@types/react": "^19.1.10",
42
+ "@types/react-dom": "^19.1.7",
43
+ "react": "^19.1.1",
44
+ "react-dom": "^19.1.1",
45
45
  "rimraf": "^5.0.5",
46
- "typescript": "^5.8.3",
47
- "vike": "^0.4.235",
48
- "vite": "^6.2.5"
46
+ "typescript": "^5.9.2",
47
+ "vike": "^0.4.237",
48
+ "vite": "^7.1.5"
49
49
  },
50
50
  "typesVersions": {
51
51
  "*": {
@@ -95,8 +95,7 @@
95
95
  ],
96
96
  "scripts": {
97
97
  "dev": "tsc --watch",
98
- "build": "rimraf dist/ && tsc && pnpm run build:css",
99
- "build:css": "cp src/integration/Loading.css dist/integration/Loading.css",
98
+ "build": "rimraf dist/ && tsc",
100
99
  "release": "release-me patch",
101
100
  "release:minor": "release-me minor",
102
101
  "release:commit": "release-me commit"
@@ -1,10 +0,0 @@
1
- /*
2
- This CSS is loaded for all vike-react users, even if they don't use the <Loading> component because it's imported not directly but over depednency injection, see:
3
- https://github.com/vikejs/vike/discussions/2340
4
- */
5
-
6
- @keyframes vike-react-shine {
7
- to {
8
- background-position-x: -200%;
9
- }
10
- }