vike-react 0.3.0 → 0.3.2

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.
package/README.md CHANGED
@@ -1,12 +1,11 @@
1
1
  <!-- WARNING: keep links absolute in this file so they work on NPM too -->
2
2
 
3
- [<img src="https://avatars.githubusercontent.com/u/86403530?s=200&v=4" align="right" width="64" height="64">](https://vike.dev)
3
+ [<img src="https://vike.dev/vike-readme.svg" align="right" height="90">](https://vike.dev)
4
4
  [![npm version](https://img.shields.io/npm/v/vike-react)](https://www.npmjs.com/package/vike-react)
5
5
 
6
6
  # `vike-react`
7
7
 
8
- React integration for [Vike](https://github.com/vikejs/vike/issues/736) (using the
9
- [V1 design](https://vike.dev/migration/v1-design)).
8
+ React integration for [Vike](https://vike.dev) (using the [V1 design](https://vike.dev/migration/v1-design)).
10
9
 
11
10
  > For integrations with Vue and Solid, see the other [`vike-*` packages](https://vike.dev/vike-packages).
12
11
 
@@ -1,31 +1,47 @@
1
1
  import type { ConfigEffect } from 'vike/types';
2
2
  declare const _default: {
3
- onRenderHtml: "import:vike-react/renderer/onRenderHtml";
4
- onRenderClient: "import:vike-react/renderer/onRenderClient";
3
+ onRenderHtml: "import:vike-react/renderer/onRenderHtml:onRenderHtml";
4
+ onRenderClient: "import:vike-react/renderer/onRenderClient:onRenderClient";
5
5
  passToClient: string[];
6
6
  clientRouting: true;
7
7
  hydrationCanBeAborted: true;
8
8
  meta: {
9
9
  Head: {
10
- env: "server-only";
10
+ env: {
11
+ server: true;
12
+ };
11
13
  };
12
14
  Layout: {
13
- env: "server-and-client";
15
+ env: {
16
+ server: true;
17
+ client: true;
18
+ };
14
19
  };
15
20
  title: {
16
- env: "server-and-client";
21
+ env: {
22
+ server: true;
23
+ client: true;
24
+ };
17
25
  };
18
26
  description: {
19
- env: "server-only";
27
+ env: {
28
+ server: true;
29
+ };
20
30
  };
21
31
  favicon: {
22
- env: "server-only";
32
+ env: {
33
+ server: true;
34
+ };
23
35
  };
24
36
  lang: {
25
- env: "server-only";
37
+ env: {
38
+ server: true;
39
+ };
26
40
  };
27
41
  ssr: {
28
- env: "config-only";
42
+ env: {
43
+ config: true;
44
+ };
29
45
  effect: ConfigEffect;
30
46
  };
31
47
  };
@@ -12,39 +12,45 @@ const toggleSsrRelatedConfig = ({ configDefinedAt, configValue }) => {
12
12
  // accessible only in the client's renderer.
13
13
  Page: {
14
14
  env: configValue
15
- ? 'server-and-client' // default
16
- : 'client-only'
15
+ ? { server: true, client: true } // default
16
+ : { client: true }
17
17
  }
18
18
  }
19
19
  };
20
20
  };
21
21
  export default {
22
- onRenderHtml: 'import:vike-react/renderer/onRenderHtml',
23
- onRenderClient: 'import:vike-react/renderer/onRenderClient',
22
+ onRenderHtml: 'import:vike-react/renderer/onRenderHtml:onRenderHtml',
23
+ onRenderClient: 'import:vike-react/renderer/onRenderClient:onRenderClient',
24
+ // A page can define an onBeforeRender() hook to be run on the server, which
25
+ // can fetch data and return it as additional page context. Typically it will
26
+ // return the page's root React component's props and additional data that can
27
+ // be used by the renderers.
28
+ // It is a cumulative config option, so a web app using vike-react can extend
29
+ // this list.
24
30
  passToClient: ['pageProps', 'title'],
25
31
  clientRouting: true,
26
32
  hydrationCanBeAborted: true,
27
33
  meta: {
28
34
  Head: {
29
- env: 'server-only'
35
+ env: { server: true }
30
36
  },
31
37
  Layout: {
32
- env: 'server-and-client'
38
+ env: { server: true, client: true }
33
39
  },
34
40
  title: {
35
- env: 'server-and-client'
41
+ env: { server: true, client: true }
36
42
  },
37
43
  description: {
38
- env: 'server-only'
44
+ env: { server: true }
39
45
  },
40
46
  favicon: {
41
- env: 'server-only'
47
+ env: { server: true }
42
48
  },
43
49
  lang: {
44
- env: 'server-only'
50
+ env: { server: true }
45
51
  },
46
52
  ssr: {
47
- env: 'config-only',
53
+ env: { config: true },
48
54
  effect: toggleSsrRelatedConfig
49
55
  }
50
56
  }
@@ -7,37 +7,4 @@ declare function PageContextProvider({ pageContext, children }: {
7
7
  children: React.ReactNode;
8
8
  }): React.JSX.Element;
9
9
  /** Access the pageContext from any React component */
10
- declare function usePageContext(): (Partial<{
11
- Page: unknown;
12
- routeParams: Record<string, string>;
13
- config: import("vike/dist/esm/shared/page-configs/Config/PageContextConfig.js").PageContextConfig;
14
- configEntries: import("vike/dist/esm/shared/getPageFiles/getExports.js").ConfigEntries;
15
- exports: Record<string, unknown>;
16
- exportsAll: import("vike/dist/esm/shared/getPageFiles/getExports.js").ExportsAll;
17
- urlOriginal: string;
18
- is404: boolean | null;
19
- isClientSideNavigation: boolean;
20
- abortReason?: unknown;
21
- abortStatusCode?: undefined;
22
- errorWhileRendering?: unknown;
23
- url: string;
24
- pageExports: Record<string, unknown>;
25
- }> & Pick<{
26
- Page: unknown;
27
- routeParams: Record<string, string>;
28
- config: import("vike/dist/esm/shared/page-configs/Config/PageContextConfig.js").PageContextConfig;
29
- configEntries: import("vike/dist/esm/shared/getPageFiles/getExports.js").ConfigEntries;
30
- exports: Record<string, unknown>;
31
- exportsAll: import("vike/dist/esm/shared/getPageFiles/getExports.js").ExportsAll;
32
- urlOriginal: string;
33
- is404: boolean | null;
34
- isClientSideNavigation: boolean;
35
- abortReason?: unknown;
36
- abortStatusCode?: undefined;
37
- errorWhileRendering?: unknown;
38
- url: string;
39
- pageExports: Record<string, unknown>;
40
- }, "Page" | "pageExports" | "config" | "configEntries" | "exports" | "exportsAll" | "abortReason"> & {
41
- isHydration: boolean;
42
- isBackwardNavigation: boolean | null;
43
- } & import("vike/dist/esm/shared/addUrlComputedProps.js").PageContextUrlComputedPropsClient & Vike.PageContext) | import("vike/dist/esm/shared/types.js").PageContextServer;
10
+ declare function usePageContext(): PageContext;
@@ -13,8 +13,7 @@ function getPageElement(pageContext) {
13
13
  const page = (React.createElement(React.StrictMode, null,
14
14
  React.createElement(PageContextProvider, { pageContext: pageContext },
15
15
  React.createElement(Wrapper, null,
16
- React.createElement(Layout, null,
17
- React.createElement(Page, { ...pageProps }))))));
16
+ React.createElement(Layout, null, Page ? React.createElement(Page, { ...pageProps }) : null)))));
18
17
  return page;
19
18
  }
20
19
  function PassThrough({ children }) {
@@ -1,6 +1,7 @@
1
1
  export { getTitle };
2
- import type { ConfigEntries } from 'vike/types';
3
- declare function getTitle(pageContext: {
4
- title?: unknown;
5
- configEntries: ConfigEntries;
6
- }): null | string;
2
+ import type { PageContext } from 'vike/types';
3
+ /**
4
+ * Get the page's title if defined, either from the additional data fetched by
5
+ * the page's onBeforeRender() hook or from the config.
6
+ */
7
+ declare function getTitle(pageContext: PageContext): null | string;
@@ -1,33 +1,32 @@
1
1
  export { getTitle };
2
2
  import { isCallable } from './utils/isCallable.js';
3
+ /**
4
+ * Get the page's title if defined, either from the additional data fetched by
5
+ * the page's onBeforeRender() hook or from the config.
6
+ */
3
7
  function getTitle(pageContext) {
4
8
  var _a;
5
- if (pageContext.title) {
6
- if (typeof pageContext.title !== 'string') {
7
- throw new Error('pageContext.title should be a string');
8
- }
9
+ if (pageContext.title !== undefined) {
9
10
  return pageContext.title;
10
11
  }
11
- else {
12
- const titleConfig = (_a = pageContext.configEntries.title) === null || _a === void 0 ? void 0 : _a[0];
13
- if (!titleConfig) {
14
- return null;
15
- }
16
- const title = titleConfig.configValue;
17
- if (typeof title === 'string') {
18
- return title;
19
- }
20
- if (!title) {
21
- return null;
22
- }
23
- const { configDefinedAt } = titleConfig;
24
- if (isCallable(title)) {
25
- const val = title(pageContext);
26
- if (typeof val !== 'string') {
27
- throw new Error(configDefinedAt + ' should return a string');
28
- }
29
- return val;
12
+ const titleConfig = (_a = pageContext.configEntries.title) === null || _a === void 0 ? void 0 : _a[0];
13
+ if (!titleConfig) {
14
+ return null;
15
+ }
16
+ const title = titleConfig.configValue;
17
+ if (typeof title === 'string') {
18
+ return title;
19
+ }
20
+ if (!title) {
21
+ return null;
22
+ }
23
+ const { configDefinedAt } = titleConfig;
24
+ if (isCallable(title)) {
25
+ const val = title(pageContext);
26
+ if (typeof val !== 'string') {
27
+ throw new Error(configDefinedAt + ' should return a string');
30
28
  }
31
- throw new Error(configDefinedAt + ' should be a string or a function returning a string');
29
+ return val;
32
30
  }
31
+ throw new Error(configDefinedAt + ' should be a string or a function returning a string');
33
32
  }
@@ -1,3 +1,3 @@
1
- export default onRenderClient;
2
- import type { PageContextClient } from 'vike/types';
3
- declare function onRenderClient(pageContext: PageContextClient): Promise<void>;
1
+ export { onRenderClient };
2
+ import type { OnRenderClientAsync } from 'vike/types';
3
+ declare const onRenderClient: OnRenderClientAsync;
@@ -1,22 +1,30 @@
1
- export default onRenderClient;
1
+ // https://vike.dev/onRenderClient
2
+ export { onRenderClient };
2
3
  import ReactDOM from 'react-dom/client';
3
4
  import { getTitle } from './getTitle.js';
4
5
  import { getPageElement } from './getPageElement.js';
5
6
  let root;
6
- async function onRenderClient(pageContext) {
7
+ const onRenderClient = async (pageContext) => {
7
8
  const page = getPageElement(pageContext);
8
9
  const container = document.getElementById('page-view');
9
10
  if (container.innerHTML !== '' && pageContext.isHydration) {
11
+ // Hydration
10
12
  root = ReactDOM.hydrateRoot(container, page);
11
13
  }
12
14
  else {
13
15
  if (!root) {
16
+ // First rendering
14
17
  root = ReactDOM.createRoot(container);
15
18
  }
19
+ else {
20
+ // Client routing
21
+ // See https://vike.dev/server-routing-vs-client-routing
22
+ // Get the page's `title` config value, which may be different from the
23
+ // previous page. It can even be null, in which case we should unset the
24
+ // document title.
25
+ const title = getTitle(pageContext);
26
+ document.title = title || '';
27
+ }
16
28
  root.render(page);
17
29
  }
18
- const title = getTitle(pageContext);
19
- if (title !== null) {
20
- document.title = title;
21
- }
22
- }
30
+ };
@@ -1,5 +1,3 @@
1
- export default onRenderHtml;
2
- import type { PageContext } from 'vike/types';
3
- declare function onRenderHtml(pageContext: PageContext): Promise<{
4
- documentHtml: import("vike/dist/esm/node/runtime/html/renderHtml.js").TemplateWrapped;
5
- }>;
1
+ export { onRenderHtml };
2
+ import type { OnRenderHtmlAsync } from 'vike/types';
3
+ declare const onRenderHtml: OnRenderHtmlAsync;
@@ -1,11 +1,13 @@
1
- export default onRenderHtml;
1
+ // https://vike.dev/onRenderHtml
2
+ export { onRenderHtml };
2
3
  import { renderToString } from 'react-dom/server';
3
- import { escapeInject, dangerouslySkipEscape } from 'vike/server';
4
+ import { escapeInject, dangerouslySkipEscape, version } from 'vike/server';
4
5
  import { getTitle } from './getTitle.js';
5
6
  import { getPageElement } from './getPageElement.js';
6
7
  import { PageContextProvider } from './PageContextProvider.js';
7
8
  import React from 'react';
8
- async function onRenderHtml(pageContext) {
9
+ checkVikeVersion();
10
+ const onRenderHtml = async (pageContext) => {
9
11
  let pageHtml = '';
10
12
  if (!!pageContext.Page) {
11
13
  const page = getPageElement(pageContext);
@@ -35,8 +37,19 @@ async function onRenderHtml(pageContext) {
35
37
  <body>
36
38
  <div id="page-view">${dangerouslySkipEscape(pageHtml)}</div>
37
39
  </body>
40
+ <!-- built with https://github.com/vikejs/vike-react -->
38
41
  </html>`;
39
- return {
40
- documentHtml
41
- };
42
+ return documentHtml;
43
+ };
44
+ function checkVikeVersion() {
45
+ if (version) {
46
+ const versionParts = version.split('.').map((s) => parseInt(s, 10));
47
+ if (versionParts[0] > 0)
48
+ return;
49
+ if (versionParts[1] > 4)
50
+ return;
51
+ if (versionParts[2] >= 147)
52
+ return;
53
+ }
54
+ throw new Error('Update Vike to its latest version (or vike@0.4.147 and any version above)');
42
55
  }
@@ -4,8 +4,11 @@ type Component = (props: any) => ReactElement;
4
4
  declare global {
5
5
  namespace Vike {
6
6
  interface PageContext {
7
- Page: Component;
8
- pageProps: Record<string, unknown>;
7
+ Page?: Component;
8
+ /** Properties of the page's root React component. */
9
+ pageProps?: Record<string, unknown>;
10
+ /** &lt;title>${title}&lt;/title> - has precedence over the config */
11
+ title?: string;
9
12
  }
10
13
  }
11
14
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vike-react",
3
- "version": "0.3.0",
3
+ "version": "0.3.2",
4
4
  "type": "module",
5
5
  "main": "./dist/renderer/+config.js",
6
6
  "types": "./dist/renderer/+config.d.ts",
@@ -19,18 +19,18 @@
19
19
  "peerDependencies": {
20
20
  "react": "18.x.x",
21
21
  "react-dom": "18.x.x",
22
- "vike": "^0.4.142",
22
+ "vike": "^0.4.147",
23
23
  "vite": "^4.3.8"
24
24
  },
25
25
  "devDependencies": {
26
- "@brillout/release-me": "^0.1.7",
26
+ "@brillout/release-me": "^0.1.9",
27
27
  "@types/node": "^18.17.18",
28
28
  "@types/react": "^18.2.22",
29
29
  "@types/react-dom": "^18.2.7",
30
30
  "react": "^18.2.0",
31
31
  "react-dom": "^18.2.0",
32
32
  "typescript": "^5.2.2",
33
- "vike": "^0.4.142"
33
+ "vike": "^0.4.147"
34
34
  },
35
35
  "typesVersions": {
36
36
  "*": {