@web-widget/react 0.0.7 → 0.0.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.
@@ -1,7 +1,8 @@
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';
4
+ import { ReactNode, Component } from 'react';
5
+ export * from '@web-widget/schema/client-helpers';
5
6
  import { WebWidgetContainerOptions, Loader } from '@web-widget/web-widget';
6
7
 
7
8
  declare const __ENV__: {
@@ -36,6 +37,29 @@ interface WebWidgetSuspenseProps {
36
37
  }
37
38
  declare function defineWebWidget(loader: Loader, options: DefineWebWidgetOptions): ({ children, fallback, renderStage, ...data }: WebWidgetSuspenseProps) => react.FunctionComponentElement<react.SuspenseProps>;
38
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>;
48
+ }
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
+ }>;
39
63
  declare const render: (context: _web_widget_schema.ClientWidgetRenderContext<unknown> | _web_widget_schema.ClientRouteRenderContext<unknown, Record<string, string>>) => Promise<void | {
40
64
  mount?: (() => void | Promise<void>) | undefined;
41
65
  unmount?: (() => void | Promise<void>) | undefined;
@@ -50,4 +74,4 @@ declare const render: (context: _web_widget_schema.ClientWidgetRenderContext<unk
50
74
  }) => void | Promise<void>) | undefined;
51
75
  }>;
52
76
 
53
- export { DefineWebWidgetOptions, WebWidget, WebWidgetProps, WebWidgetSuspenseProps, __ENV__, WebWidget as default, defineWebWidget, render };
77
+ export { DefineWebWidgetOptions, WebWidget, WebWidgetProps, WebWidgetSuspenseProps, __ENV__, defineReactRender, defineWebWidget, render };
@@ -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 state = context.recovering ? context.container.querySelector(
121
+ "script[as=state]"
122
+ ) : null;
123
+ const stateContent = context.recovering && state ? JSON.parse(state.textContent) : onPrefetchData ? await onPrefetchData(context, component, props) : void 0;
124
+ state == null ? void 0 : state.remove();
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(context.container, vNode);
137
+ } else {
138
+ root = createRoot(context.container);
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,7 +1,8 @@
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';
4
+ import { ReactNode, Component } from 'react';
5
+ export * from '@web-widget/schema/server-helpers';
5
6
  import { WebWidgetContainerOptions, Loader } from '@web-widget/web-widget';
6
7
 
7
8
  declare const __ENV__: {
@@ -36,6 +37,17 @@ interface WebWidgetSuspenseProps {
36
37
  }
37
38
  declare function defineWebWidget(loader: Loader, options: DefineWebWidgetOptions): ({ children, fallback, renderStage, ...data }: WebWidgetSuspenseProps) => react.FunctionComponentElement<react.SuspenseProps>;
38
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>;
48
+ }
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>>;
39
51
  declare const render: (context: _web_widget_schema.ServerWidgetRenderContext<unknown> | _web_widget_schema.ServerRouteRenderContext<unknown, Record<string, string>>) => Promise<string | ReadableStream<any>>;
40
52
 
41
- export { DefineWebWidgetOptions, WebWidget, WebWidgetProps, WebWidgetSuspenseProps, __ENV__, WebWidget as default, defineWebWidget, render };
53
+ export { DefineWebWidgetOptions, WebWidget, WebWidgetProps, WebWidgetSuspenseProps, __ENV__, defineReactRender, defineWebWidget, render };
@@ -99,6 +99,7 @@ function defineWebWidget(loader, options) {
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
+ vNode,
136
+ createElement2("script", {
137
+ as: "state",
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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@web-widget/react",
3
- "version": "0.0.7",
3
+ "version": "0.0.9",
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/html": "0.0.4",
31
32
  "@web-widget/schema": "0.0.9",
32
- "@web-widget/web-widget": "1.0.0-alpha.7"
33
- },
34
- "peerDependencies": {
35
- "@vitejs/plugin-react": "^4.0.2",
36
- "react": "^18.2.0",
37
- "react-dom": "^18.2.0"
33
+ "@web-widget/web-widget": "1.0.0-alpha.8"
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
  },