@web-widget/react 0.0.6 → 0.0.8

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.
@@ -1,39 +1,65 @@
1
1
  import * as _web_widget_schema from '@web-widget/schema';
2
- export * from '@web-widget/schema/client-helpers';
2
+ import { RenderContext, ComponentProps } from '@web-widget/schema';
3
3
  import * as react from 'react';
4
- import { ReactNode } from 'react';
5
- import { WebWidgetContainerProps, Loader } from '@web-widget/web-widget';
4
+ import { ReactNode, Component } from 'react';
5
+ export * from '@web-widget/schema/client-helpers';
6
+ import { WebWidgetContainerOptions, Loader } from '@web-widget/web-widget';
6
7
 
7
8
  declare const __ENV__: {
8
9
  server: boolean;
9
10
  };
10
11
  interface WebWidgetProps {
11
- base?: WebWidgetContainerProps["base"];
12
+ base?: WebWidgetContainerOptions["base"];
12
13
  children?: ReactNode;
13
- data?: WebWidgetContainerProps["data"];
14
- import?: WebWidgetContainerProps["import"];
14
+ data?: WebWidgetContainerOptions["data"];
15
+ import?: WebWidgetContainerOptions["import"];
16
+ inactive?: WebWidgetContainerOptions["inactive"];
15
17
  loader: Loader;
16
- loading?: WebWidgetContainerProps["loading"];
17
- name?: WebWidgetContainerProps["name"];
18
- recovering: WebWidgetContainerProps["recovering"];
19
- renderTarget?: WebWidgetContainerProps["renderTarget"];
18
+ meta?: WebWidgetContainerOptions["meta"];
19
+ loading?: WebWidgetContainerOptions["loading"];
20
+ name?: WebWidgetContainerOptions["name"];
21
+ renderStage?: WebWidgetContainerOptions["renderStage"];
22
+ renderTarget?: WebWidgetContainerOptions["renderTarget"];
20
23
  }
21
24
  declare function WebWidget({ children, loader, ...props }: WebWidgetProps): react.FunctionComponentElement<any>;
22
25
  interface DefineWebWidgetOptions {
23
- base?: WebWidgetContainerProps["base"];
24
- import?: WebWidgetContainerProps["import"];
25
- loading?: WebWidgetContainerProps["loading"];
26
- name?: WebWidgetContainerProps["name"];
27
- recovering?: WebWidgetContainerProps["recovering"];
28
- renderTarget?: WebWidgetContainerProps["renderTarget"];
26
+ base?: WebWidgetContainerOptions["base"];
27
+ import?: WebWidgetContainerOptions["import"];
28
+ loading?: WebWidgetContainerOptions["loading"];
29
+ name?: WebWidgetContainerOptions["name"];
30
+ renderStage?: WebWidgetContainerOptions["renderStage"];
31
+ renderTarget?: WebWidgetContainerOptions["renderTarget"];
29
32
  }
30
33
  interface WebWidgetSuspenseProps {
31
34
  children?: ReactNode;
32
- clientOnly?: boolean;
33
35
  fallback?: ReactNode;
36
+ renderStage?: WebWidgetContainerOptions["renderStage"];
37
+ }
38
+ declare function defineWebWidget(loader: Loader, options: DefineWebWidgetOptions): ({ children, fallback, renderStage, ...data }: WebWidgetSuspenseProps) => react.FunctionComponentElement<react.SuspenseProps>;
39
+
40
+ type JSONValue = string | number | boolean | {
41
+ [x: string]: JSONValue;
42
+ } | Array<JSONValue>;
43
+ type JSONProps = {
44
+ [x: string]: JSONValue;
45
+ };
46
+ interface DefineVueRenderOptions {
47
+ onPrefetchData?: (context: RenderContext, component: Component, props: ComponentProps) => Promise<JSONProps>;
34
48
  }
35
- declare function defineWebWidget(loader: Loader, options: DefineWebWidgetOptions): ({ children, clientOnly, fallback, ...data }: WebWidgetSuspenseProps) => react.FunctionComponentElement<react.SuspenseProps>;
36
49
 
50
+ declare const defineReactRender: ({ onPrefetchData, }?: DefineVueRenderOptions) => (context: _web_widget_schema.ClientWidgetRenderContext<unknown> | _web_widget_schema.ClientRouteRenderContext<unknown, Record<string, string>>) => Promise<void | {
51
+ mount?: (() => void | Promise<void>) | undefined;
52
+ unmount?: (() => void | Promise<void>) | undefined;
53
+ update?: (({ data }: {
54
+ data: Record<string, any>;
55
+ }) => void | Promise<void>) | undefined;
56
+ } | {
57
+ mount?: (() => void | Promise<void>) | undefined;
58
+ unmount?: (() => void | Promise<void>) | undefined;
59
+ update?: (({ data }: {
60
+ data: Record<string, any>;
61
+ }) => void | Promise<void>) | undefined;
62
+ }>;
37
63
  declare const render: (context: _web_widget_schema.ClientWidgetRenderContext<unknown> | _web_widget_schema.ClientRouteRenderContext<unknown, Record<string, string>>) => Promise<void | {
38
64
  mount?: (() => void | Promise<void>) | undefined;
39
65
  unmount?: (() => void | Promise<void>) | undefined;
@@ -48,4 +74,4 @@ declare const render: (context: _web_widget_schema.ClientWidgetRenderContext<unk
48
74
  }) => void | Promise<void>) | undefined;
49
75
  }>;
50
76
 
51
- export { DefineWebWidgetOptions, WebWidget, WebWidgetProps, WebWidgetSuspenseProps, __ENV__, WebWidget as default, defineWebWidget, render };
77
+ export { DefineWebWidgetOptions, WebWidget, WebWidgetProps, WebWidgetSuspenseProps, __ENV__, defineReactRender, defineWebWidget, render };
@@ -44,7 +44,7 @@ function WebWidget(_a) {
44
44
  "children",
45
45
  "loader"
46
46
  ]);
47
- if (props.recovering && !loader) {
47
+ if (!loader) {
48
48
  throw new TypeError(`Missing loader.`);
49
49
  }
50
50
  if (children) {
@@ -79,12 +79,12 @@ function defineWebWidget(loader, options) {
79
79
  return function WebWidgetSuspense(_a) {
80
80
  var _b = _a, {
81
81
  children,
82
- clientOnly = !options.recovering,
83
- fallback
82
+ fallback,
83
+ renderStage = options.renderStage
84
84
  } = _b, data = __objRest(_b, [
85
85
  "children",
86
- "clientOnly",
87
- "fallback"
86
+ "fallback",
87
+ "renderStage"
88
88
  ]);
89
89
  return createElement(Suspense, {
90
90
  fallback,
@@ -92,7 +92,7 @@ function defineWebWidget(loader, options) {
92
92
  children,
93
93
  data,
94
94
  loader,
95
- recovering: !clientOnly
95
+ renderStage
96
96
  }))
97
97
  });
98
98
  };
@@ -106,37 +106,51 @@ export * from "@web-widget/schema/client-helpers";
106
106
  Reflect.defineProperty(__ENV__, "server", {
107
107
  value: false
108
108
  });
109
- var render = defineRender(async (context, component, props) => {
110
- const { recovering, container } = context;
111
- if (!container) {
112
- throw new Error(`Container required.`);
113
- }
114
- let root;
115
- return {
116
- async mount() {
117
- let vnode;
118
- if (typeof component === "function" && component.constructor.name === "AsyncFunction") {
119
- vnode = await component(props);
120
- } else {
121
- vnode = createElement2(component, props);
122
- }
123
- if (recovering) {
124
- root = hydrateRoot(container, vnode);
125
- } else {
126
- root = createRoot(container);
127
- root.render(vnode);
128
- }
129
- },
130
- async unmount() {
131
- root == null ? void 0 : root.unmount();
132
- root = null;
109
+ var defineReactRender = ({
110
+ onPrefetchData
111
+ } = {}) => {
112
+ return defineRender(async (context, component, props) => {
113
+ const { recovering, container } = context;
114
+ if (!container) {
115
+ throw new Error(`Container required.`);
133
116
  }
134
- };
135
- });
117
+ let root;
118
+ return {
119
+ async mount() {
120
+ const shell = context.recovering && context.container.querySelector("[webwidgetshell]") || context.container;
121
+ const state = context.recovering ? context.container.querySelector(
122
+ "[webwidgetstate]"
123
+ ) : null;
124
+ const stateContent = context.recovering && state ? JSON.parse(state.textContent) : onPrefetchData ? await onPrefetchData(context, component, props) : void 0;
125
+ const mergedProps = stateContent ? Object.assign({}, stateContent, props) : props;
126
+ let vNode;
127
+ if (typeof component === "function" && component.constructor.name === "AsyncFunction") {
128
+ vNode = await component(mergedProps);
129
+ } else {
130
+ vNode = createElement2(
131
+ component,
132
+ mergedProps
133
+ );
134
+ }
135
+ if (recovering) {
136
+ root = hydrateRoot(shell, vNode);
137
+ } else {
138
+ root = createRoot(shell);
139
+ root.render(vNode);
140
+ }
141
+ },
142
+ async unmount() {
143
+ root == null ? void 0 : root.unmount();
144
+ root = null;
145
+ }
146
+ };
147
+ });
148
+ };
149
+ var render = defineReactRender();
136
150
  export {
137
151
  WebWidget,
138
152
  __ENV__,
139
- WebWidget as default,
153
+ defineReactRender,
140
154
  defineWebWidget,
141
155
  render
142
156
  };
@@ -1,39 +1,53 @@
1
1
  import * as _web_widget_schema from '@web-widget/schema';
2
- export * from '@web-widget/schema/server-helpers';
2
+ import { RenderContext, ComponentProps } from '@web-widget/schema';
3
3
  import * as react from 'react';
4
- import { ReactNode } from 'react';
5
- import { WebWidgetContainerProps, Loader } from '@web-widget/web-widget';
4
+ import { ReactNode, Component } from 'react';
5
+ export * from '@web-widget/schema/server-helpers';
6
+ import { WebWidgetContainerOptions, Loader } from '@web-widget/web-widget';
6
7
 
7
8
  declare const __ENV__: {
8
9
  server: boolean;
9
10
  };
10
11
  interface WebWidgetProps {
11
- base?: WebWidgetContainerProps["base"];
12
+ base?: WebWidgetContainerOptions["base"];
12
13
  children?: ReactNode;
13
- data?: WebWidgetContainerProps["data"];
14
- import?: WebWidgetContainerProps["import"];
14
+ data?: WebWidgetContainerOptions["data"];
15
+ import?: WebWidgetContainerOptions["import"];
16
+ inactive?: WebWidgetContainerOptions["inactive"];
15
17
  loader: Loader;
16
- loading?: WebWidgetContainerProps["loading"];
17
- name?: WebWidgetContainerProps["name"];
18
- recovering: WebWidgetContainerProps["recovering"];
19
- renderTarget?: WebWidgetContainerProps["renderTarget"];
18
+ meta?: WebWidgetContainerOptions["meta"];
19
+ loading?: WebWidgetContainerOptions["loading"];
20
+ name?: WebWidgetContainerOptions["name"];
21
+ renderStage?: WebWidgetContainerOptions["renderStage"];
22
+ renderTarget?: WebWidgetContainerOptions["renderTarget"];
20
23
  }
21
24
  declare function WebWidget({ children, loader, ...props }: WebWidgetProps): react.FunctionComponentElement<any>;
22
25
  interface DefineWebWidgetOptions {
23
- base?: WebWidgetContainerProps["base"];
24
- import?: WebWidgetContainerProps["import"];
25
- loading?: WebWidgetContainerProps["loading"];
26
- name?: WebWidgetContainerProps["name"];
27
- recovering?: WebWidgetContainerProps["recovering"];
28
- renderTarget?: WebWidgetContainerProps["renderTarget"];
26
+ base?: WebWidgetContainerOptions["base"];
27
+ import?: WebWidgetContainerOptions["import"];
28
+ loading?: WebWidgetContainerOptions["loading"];
29
+ name?: WebWidgetContainerOptions["name"];
30
+ renderStage?: WebWidgetContainerOptions["renderStage"];
31
+ renderTarget?: WebWidgetContainerOptions["renderTarget"];
29
32
  }
30
33
  interface WebWidgetSuspenseProps {
31
34
  children?: ReactNode;
32
- clientOnly?: boolean;
33
35
  fallback?: ReactNode;
36
+ renderStage?: WebWidgetContainerOptions["renderStage"];
37
+ }
38
+ declare function defineWebWidget(loader: Loader, options: DefineWebWidgetOptions): ({ children, fallback, renderStage, ...data }: WebWidgetSuspenseProps) => react.FunctionComponentElement<react.SuspenseProps>;
39
+
40
+ type JSONValue = string | number | boolean | {
41
+ [x: string]: JSONValue;
42
+ } | Array<JSONValue>;
43
+ type JSONProps = {
44
+ [x: string]: JSONValue;
45
+ };
46
+ interface DefineVueRenderOptions {
47
+ onPrefetchData?: (context: RenderContext, component: Component, props: ComponentProps) => Promise<JSONProps>;
34
48
  }
35
- declare function defineWebWidget(loader: Loader, options: DefineWebWidgetOptions): ({ children, clientOnly, fallback, ...data }: WebWidgetSuspenseProps) => react.FunctionComponentElement<react.SuspenseProps>;
36
49
 
50
+ declare const defineReactRender: ({ onPrefetchData, }?: DefineVueRenderOptions) => (context: _web_widget_schema.ServerWidgetRenderContext<unknown> | _web_widget_schema.ServerRouteRenderContext<unknown, Record<string, string>>) => Promise<string | ReadableStream<any>>;
37
51
  declare const render: (context: _web_widget_schema.ServerWidgetRenderContext<unknown> | _web_widget_schema.ServerRouteRenderContext<unknown, Record<string, string>>) => Promise<string | ReadableStream<any>>;
38
52
 
39
- export { DefineWebWidgetOptions, WebWidget, WebWidgetProps, WebWidgetSuspenseProps, __ENV__, WebWidget as default, defineWebWidget, render };
53
+ export { DefineWebWidgetOptions, WebWidget, WebWidgetProps, WebWidgetSuspenseProps, __ENV__, defineReactRender, defineWebWidget, render };
@@ -44,7 +44,7 @@ function WebWidget(_a) {
44
44
  "children",
45
45
  "loader"
46
46
  ]);
47
- if (props.recovering && !loader) {
47
+ if (!loader) {
48
48
  throw new TypeError(`Missing loader.`);
49
49
  }
50
50
  if (children) {
@@ -79,12 +79,12 @@ function defineWebWidget(loader, options) {
79
79
  return function WebWidgetSuspense(_a) {
80
80
  var _b = _a, {
81
81
  children,
82
- clientOnly = !options.recovering,
83
- fallback
82
+ fallback,
83
+ renderStage = options.renderStage
84
84
  } = _b, data = __objRest(_b, [
85
85
  "children",
86
- "clientOnly",
87
- "fallback"
86
+ "fallback",
87
+ "renderStage"
88
88
  ]);
89
89
  return createElement(Suspense, {
90
90
  fallback,
@@ -92,13 +92,14 @@ function defineWebWidget(loader, options) {
92
92
  children,
93
93
  data,
94
94
  loader,
95
- recovering: !clientOnly
95
+ renderStage
96
96
  }))
97
97
  });
98
98
  };
99
99
  }
100
100
 
101
101
  // src/server.ts
102
+ import { Fragment } from "react";
102
103
  import { createElement as createElement2 } from "react";
103
104
  import * as ReactDOMServer from "react-dom/server.browser";
104
105
  import { defineRender } from "@web-widget/schema/server-helpers";
@@ -106,19 +107,51 @@ export * from "@web-widget/schema/server-helpers";
106
107
  Reflect.defineProperty(__ENV__, "server", {
107
108
  value: true
108
109
  });
109
- var render = defineRender(async (context, component, props) => {
110
- let vnode;
111
- if (typeof component === "function" && component.constructor.name === "AsyncFunction") {
112
- vnode = await component(props);
113
- } else {
114
- vnode = createElement2(component, props);
115
- }
116
- return ReactDOMServer.renderToReadableStream(vnode);
117
- });
110
+ var ESCAPE_LOOKUP = {
111
+ ">": "\\u003e",
112
+ "<": "\\u003c",
113
+ "\u2028": "\\u2028",
114
+ "\u2029": "\\u2029"
115
+ };
116
+ var ESCAPE_REGEX = /[><\u2028\u2029]/g;
117
+ function htmlEscapeJsonString(str) {
118
+ return str.replace(ESCAPE_REGEX, (match) => ESCAPE_LOOKUP[match]);
119
+ }
120
+ var defineReactRender = ({
121
+ onPrefetchData
122
+ } = {}) => {
123
+ return defineRender(async (context, component, props) => {
124
+ const state = onPrefetchData ? await onPrefetchData(context, component, props) : void 0;
125
+ const mergedProps = state ? Object.assign({}, state, props) : props;
126
+ let vNode;
127
+ if (typeof component === "function" && component.constructor.name === "AsyncFunction") {
128
+ vNode = await component(mergedProps);
129
+ } else {
130
+ vNode = createElement2(component, mergedProps);
131
+ }
132
+ if (state) {
133
+ return ReactDOMServer.renderToReadableStream(
134
+ createElement2(Fragment, null, [
135
+ createElement2("div", { webwidgetshell: "" }, vNode),
136
+ createElement2("script", {
137
+ webwidgetstate: "",
138
+ type: "application/json",
139
+ dangerouslySetInnerHTML: {
140
+ __html: htmlEscapeJsonString(JSON.stringify(state))
141
+ }
142
+ })
143
+ ])
144
+ );
145
+ } else {
146
+ return ReactDOMServer.renderToReadableStream(vNode);
147
+ }
148
+ });
149
+ };
150
+ var render = defineReactRender();
118
151
  export {
119
152
  WebWidget,
120
153
  __ENV__,
121
- WebWidget as default,
154
+ defineReactRender,
122
155
  defineWebWidget,
123
156
  render
124
157
  };
package/globals.d.ts CHANGED
@@ -1,20 +1,19 @@
1
1
  import type { ReactNode, ComponentProps } from "react";
2
2
 
3
- type _IntrinsicAttributes = IntrinsicAttributes;
4
-
5
- declare namespace JSX {
6
- interface IntrinsicAttributes extends _IntrinsicAttributes {
7
- as?: "web-widget" | "web-widget:server" | "web-widget:client" | any;
8
- clientOnly?: boolean;
9
- loading?: "lazy" | any;
10
- fallback?: ReactNode;
3
+ declare global {
4
+ declare namespace JSX {
5
+ interface IntrinsicAttributes {
6
+ key?: Key | null | undefined;
7
+ renderStage?: "server" | "client";
8
+ fallback?: ReactNode;
9
+ }
11
10
  }
12
11
  }
13
12
 
14
13
  interface ReactWidgetComponent extends ComponentProps<any> {
15
14
  (props: {
16
15
  children?: ReactNode;
17
- clientOnly?: boolean;
16
+ renderStage?: "server" | "client";
18
17
  fallback?: ReactNode;
19
18
  }): ReactNode;
20
19
  }
@@ -24,7 +23,7 @@ declare module "*.widget.jsx" {
24
23
  export default reactWidgetComponent;
25
24
  }
26
25
 
27
- declare module "*.widget.tsx" {
26
+ declare module "*.route.tsx" {
28
27
  const reactWidgetComponent: ReactWidgetComponent;
29
28
  export default reactWidgetComponent;
30
29
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@web-widget/react",
3
- "version": "0.0.6",
3
+ "version": "0.0.8",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -28,13 +28,9 @@
28
28
  "@babel/helper-module-imports": "^7.22.5",
29
29
  "@babel/helper-plugin-utils": "^7.22.5",
30
30
  "@babel/traverse": "^7.22.5",
31
- "@web-widget/schema": "0.0.8",
32
- "@web-widget/web-widget": "1.0.0-alpha.6"
33
- },
34
- "peerDependencies": {
35
- "@vitejs/plugin-react": "^4.0.2",
36
- "react": "^18.2.0",
37
- "react-dom": "^18.2.0"
31
+ "@web-widget/html": "0.0.4",
32
+ "@web-widget/schema": "0.0.9",
33
+ "@web-widget/web-widget": "1.0.0-alpha.7"
38
34
  },
39
35
  "devDependencies": {
40
36
  "@types/babel__core": "^7.20.1",
@@ -48,6 +44,11 @@
48
44
  "typescript": "^5.0.4",
49
45
  "vite": "^4.4.9"
50
46
  },
47
+ "peerDependencies": {
48
+ "@vitejs/plugin-react": "^4.0.2",
49
+ "react": "^18.2.0",
50
+ "react-dom": "^18.2.0"
51
+ },
51
52
  "publishConfig": {
52
53
  "access": "public"
53
54
  },