vike-react 0.3.7 → 0.3.9

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.
@@ -0,0 +1 @@
1
+ export { useData } from '../renderer/PageContextProvider.js';
@@ -0,0 +1 @@
1
+ export { useData } from '../renderer/PageContextProvider.js';
@@ -36,6 +36,7 @@ declare const _default: {
36
36
  lang: {
37
37
  env: {
38
38
  server: true;
39
+ client: true;
39
40
  };
40
41
  };
41
42
  ssr: {
@@ -58,7 +59,7 @@ declare const _default: {
58
59
  };
59
60
  };
60
61
  export default _default;
61
- import type { Component } from './types';
62
+ import type { Component } from './types.d.ts';
62
63
  declare global {
63
64
  namespace VikePackages {
64
65
  interface ConfigVikeReact {
@@ -21,13 +21,15 @@ const toggleSsrRelatedConfig = ({ configDefinedAt, configValue }) => {
21
21
  export default {
22
22
  onRenderHtml: 'import:vike-react/renderer/onRenderHtml:onRenderHtml',
23
23
  onRenderClient: 'import:vike-react/renderer/onRenderClient:onRenderClient',
24
+ // TODO/next-major-release: remove pageProps (i.e. tell users to use data() instead of onBeforeRender() to fetch data)
25
+ // TODO/next-major-release: remove support for setting title over onBeforeRender()
24
26
  // A page can define an onBeforeRender() hook to be run on the server, which
25
27
  // can fetch data and return it as additional page context. Typically it will
26
28
  // return the page's root React component's props and additional data that can
27
29
  // be used by the renderers.
28
30
  // It is a cumulative config option, so a web app using vike-react can extend
29
31
  // this list.
30
- passToClient: ['pageProps', 'title'],
32
+ passToClient: ['pageProps', 'title', 'lang'],
31
33
  clientRouting: true,
32
34
  hydrationCanBeAborted: true,
33
35
  meta: {
@@ -47,7 +49,7 @@ export default {
47
49
  env: { server: true }
48
50
  },
49
51
  lang: {
50
- env: { server: true }
52
+ env: { server: true, client: true }
51
53
  },
52
54
  ssr: {
53
55
  env: { config: true },
@@ -1,5 +1,6 @@
1
1
  export { PageContextProvider };
2
2
  export { usePageContext };
3
+ export { useData };
3
4
  import React from 'react';
4
5
  import type { PageContext } from 'vike/types';
5
6
  declare function PageContextProvider({ pageContext, children }: {
@@ -8,3 +9,4 @@ declare function PageContextProvider({ pageContext, children }: {
8
9
  }): React.JSX.Element;
9
10
  /** Access the pageContext from any React component */
10
11
  declare function usePageContext(): PageContext;
12
+ declare function useData<Data>(): Data;
@@ -1,5 +1,6 @@
1
1
  export { PageContextProvider };
2
2
  export { usePageContext };
3
+ export { useData };
3
4
  import React, { useContext } from 'react';
4
5
  import { getGlobalObject } from './utils/getGlobalObject.js';
5
6
  const { Context } = getGlobalObject('PageContextProvider.ts', {
@@ -17,3 +18,7 @@ function usePageContext() {
17
18
  throw new Error('<PageContextProvider> is needed for being able to use usePageContext()');
18
19
  return pageContext;
19
20
  }
21
+ function useData() {
22
+ const { data } = usePageContext();
23
+ return data;
24
+ }
@@ -0,0 +1,7 @@
1
+ export { getLang };
2
+ import type { PageContext } from 'vike/types';
3
+ /**
4
+ * Get the page's lang if defined, either from the config, the additional data fetched by
5
+ * the page's data() and onBeforeRender() hooks or from other hooks.
6
+ */
7
+ declare function getLang(pageContext: PageContext): null | string;
@@ -0,0 +1,32 @@
1
+ export { getLang };
2
+ import { isCallable } from './utils/isCallable.js';
3
+ /**
4
+ * Get the page's lang if defined, either from the config, the additional data fetched by
5
+ * the page's data() and onBeforeRender() hooks or from other hooks.
6
+ */
7
+ function getLang(pageContext) {
8
+ // from onBeforeRoute() hook & other hooks, e.g. onPrerenderStart() hook
9
+ if (pageContext.lang !== undefined) {
10
+ return pageContext.lang;
11
+ }
12
+ const langConfig = pageContext.configEntries.lang?.[0];
13
+ if (!langConfig) {
14
+ return null;
15
+ }
16
+ const lang = langConfig.configValue;
17
+ if (typeof lang === 'string') {
18
+ return lang;
19
+ }
20
+ if (!lang) {
21
+ return null;
22
+ }
23
+ const { configDefinedAt } = langConfig;
24
+ if (isCallable(lang)) {
25
+ const val = lang(pageContext);
26
+ if (typeof val !== 'string') {
27
+ throw new Error(configDefinedAt + ' should return a string');
28
+ }
29
+ return val;
30
+ }
31
+ throw new Error(configDefinedAt + ' should be a string or a function returning a string');
32
+ }
@@ -2,14 +2,14 @@ export { getPageElement };
2
2
  import React from 'react';
3
3
  import { PageContextProvider } from './PageContextProvider.js';
4
4
  function getPageElement(pageContext) {
5
- var _a, _b;
6
- const Layout = (_a = pageContext.config.Layout) !== null && _a !== void 0 ? _a : PassThrough;
5
+ const Layout = pageContext.config.Layout ?? PassThrough;
7
6
  const Wrapper =
8
7
  /* Should we implement this? Enabling users to defined a wrapper that is used across all layouts.
9
8
  pageContext.config.Wrapper ??
10
9
  */
11
10
  PassThrough;
12
- const VikeReactQueryWrapper = (_b = pageContext.config.VikeReactQueryWrapper) !== null && _b !== void 0 ? _b : PassThrough;
11
+ const VikeReactQueryWrapper = pageContext.config.VikeReactQueryWrapper ?? PassThrough;
12
+ // TODO/next-major-release: remove pageProps (i.e. tell users to use data() instead of onBeforeRender() to fetch data)
13
13
  const { Page, pageProps } = pageContext;
14
14
  const page = (React.createElement(React.StrictMode, null,
15
15
  React.createElement(PageContextProvider, { pageContext: pageContext },
@@ -2,6 +2,6 @@ export { getTitle };
2
2
  import type { PageContext } from 'vike/types';
3
3
  /**
4
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.
5
+ * the page's data() and onBeforeRender() hooks or from the config.
6
6
  */
7
7
  declare function getTitle(pageContext: PageContext): null | string;
@@ -2,14 +2,19 @@ export { getTitle };
2
2
  import { isCallable } from './utils/isCallable.js';
3
3
  /**
4
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.
5
+ * the page's data() and onBeforeRender() hooks or from the config.
6
6
  */
7
7
  function getTitle(pageContext) {
8
- var _a;
8
+ // from data() hook
9
+ if (pageContext.data?.title !== undefined) {
10
+ return pageContext.data.title;
11
+ }
12
+ // TODO/next-major-release: remove support for setting title over onBeforeRender()
13
+ // from onBeforeRender() hook
9
14
  if (pageContext.title !== undefined) {
10
15
  return pageContext.title;
11
16
  }
12
- const titleConfig = (_a = pageContext.configEntries.title) === null || _a === void 0 ? void 0 : _a[0];
17
+ const titleConfig = pageContext.configEntries.title?.[0];
13
18
  if (!titleConfig) {
14
19
  return null;
15
20
  }
@@ -3,6 +3,7 @@ export { onRenderClient };
3
3
  import ReactDOM from 'react-dom/client';
4
4
  import { getTitle } from './getTitle.js';
5
5
  import { getPageElement } from './getPageElement.js';
6
+ import { getLang } from './getLang.js';
6
7
  let root;
7
8
  const onRenderClient = async (pageContext) => {
8
9
  const page = getPageElement(pageContext);
@@ -23,7 +24,9 @@ const onRenderClient = async (pageContext) => {
23
24
  // previous page. It can even be null, in which case we should unset the
24
25
  // document title.
25
26
  const title = getTitle(pageContext);
27
+ const lang = getLang(pageContext) || 'en';
26
28
  document.title = title || '';
29
+ document.documentElement.lang = lang;
27
30
  }
28
31
  root.render(page);
29
32
  }
@@ -7,14 +7,15 @@ import { getTitle } from './getTitle.js';
7
7
  import { getPageElement } from './getPageElement.js';
8
8
  import { PageContextProvider } from './PageContextProvider.js';
9
9
  import React from 'react';
10
+ import { getLang } from './getLang.js';
10
11
  checkVikeVersion();
11
12
  const onRenderHtml = async (pageContext) => {
12
- const lang = pageContext.config.lang || 'en';
13
13
  const { stream, favicon, description } = pageContext.config;
14
14
  const faviconTag = !favicon ? '' : escapeInject `<link rel="icon" href="${favicon}" />`;
15
15
  const descriptionTag = !description ? '' : escapeInject `<meta name="description" content="${description}" />`;
16
16
  const title = getTitle(pageContext);
17
17
  const titleTag = !title ? '' : escapeInject `<title>${title}</title>`;
18
+ const lang = getLang(pageContext) || 'en';
18
19
  const Head = pageContext.config.Head || (() => React.createElement(React.Fragment, null));
19
20
  const head = (React.createElement(React.StrictMode, null,
20
21
  React.createElement(PageContextProvider, { pageContext: pageContext },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vike-react",
3
- "version": "0.3.7",
3
+ "version": "0.3.9",
4
4
  "type": "module",
5
5
  "main": "./dist/renderer/+config.js",
6
6
  "types": "./dist/renderer/+config.d.ts",
@@ -9,6 +9,7 @@
9
9
  "./renderer/onRenderHtml": "./dist/renderer/onRenderHtml.js",
10
10
  "./renderer/onRenderClient": "./dist/renderer/onRenderClient.js",
11
11
  "./usePageContext": "./dist/components/usePageContext.js",
12
+ "./useData": "./dist/components/useData.js",
12
13
  "./ClientOnly": "./dist/components/ClientOnly.js"
13
14
  },
14
15
  "scripts": {
@@ -20,21 +21,21 @@
20
21
  "peerDependencies": {
21
22
  "react": "18.x.x",
22
23
  "react-dom": "18.x.x",
23
- "vike": "^0.4.149",
24
- "vite": "^4.3.8"
24
+ "vike": "^0.4.151",
25
+ "vite": "^4.3.8 || ^5.0.10"
25
26
  },
26
27
  "devDependencies": {
27
- "@brillout/release-me": "^0.1.12",
28
- "@types/node": "^18.17.18",
29
- "@types/react": "^18.2.22",
30
- "@types/react-dom": "^18.2.7",
28
+ "@brillout/release-me": "^0.1.14",
29
+ "@types/node": "^20.11.4",
30
+ "@types/react": "^18.2.48",
31
+ "@types/react-dom": "^18.2.18",
31
32
  "react": "^18.2.0",
32
33
  "react-dom": "^18.2.0",
33
- "typescript": "^5.2.2",
34
- "vike": "^0.4.149"
34
+ "typescript": "^5.3.3",
35
+ "vike": "^0.4.156"
35
36
  },
36
37
  "dependencies": {
37
- "react-streaming": "^0.3.16"
38
+ "react-streaming": "^0.3.19"
38
39
  },
39
40
  "typesVersions": {
40
41
  "*": {
@@ -44,6 +45,9 @@
44
45
  "usePageContext": [
45
46
  "./dist/components/usePageContext.d.ts"
46
47
  ],
48
+ "useData": [
49
+ "./dist/components/useData.d.ts"
50
+ ],
47
51
  "renderer/onRenderHtml": [
48
52
  "./dist/renderer/onRenderHtml.d.ts"
49
53
  ],
@@ -1,15 +0,0 @@
1
- export type { Component };
2
- import type { ReactElement } from 'react';
3
- type Component = (props: any) => ReactElement;
4
- declare global {
5
- namespace Vike {
6
- interface PageContext {
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;
12
- userAgent?: string;
13
- }
14
- }
15
- }
@@ -1 +0,0 @@
1
- export {};