@web-widget/react 0.0.1 → 0.0.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.
@@ -1,6 +1,26 @@
1
1
  import { PluginPass } from '@babel/core';
2
2
  import { Visitor } from '@babel/traverse';
3
3
 
4
+ /**
5
+ * This adds web-widget source path to JSX tags.
6
+ *
7
+ * == JSX Literals ==
8
+ *
9
+ * import MyComponent from "../widgets/my-component.jsx";
10
+ * ...
11
+ * <MyComponent as="web-widget" title="My component" />
12
+ *
13
+ * becomes:
14
+ *
15
+ * import { defineWebWidget } from "@web-widget/react/web-widget";
16
+ * const MyComponent = defineWebWidget(() => import("../widgets/my-component.jsx"), "/routes/", {
17
+ * name: "MyComponent",
18
+ * recovering: true
19
+ * });
20
+ * ...
21
+ * <MyComponent title="My component" />
22
+ */
23
+
4
24
  type Config = {
5
25
  base: string;
6
26
  root: string;
@@ -2,6 +2,7 @@
2
2
  import { addNamed } from "@babel/helper-module-imports";
3
3
  import { declare } from "@babel/helper-plugin-utils";
4
4
  import { types as t } from "@babel/core";
5
+ var TAGNAME = "web-widget";
5
6
  function createWebWidgetVariableDeclaration(definer, component, source, base, options) {
6
7
  const getType = (object) => Object.prototype.toString.call(object).slice(8, -1).toLocaleLowerCase();
7
8
  return t.variableDeclaration("const", [
@@ -81,21 +82,25 @@ var babel_plugin_default = declare((api) => {
81
82
  return;
82
83
  }
83
84
  const attributes = container.openingElement.attributes;
84
- const clientAttr = attributes.find(
85
- (attr) => t.isJSXAttribute(attr) && (attr.name.name === "client" || attr.name.name === "clientOnly")
85
+ const widgetAttr = attributes.find(
86
+ (attr) => t.isJSXAttribute(attr) && attr.name.name === "as" && t.isStringLiteral(attr.value) && attr.value.value.startsWith(TAGNAME)
86
87
  );
87
- if (!clientAttr) {
88
+ if (!widgetAttr) {
88
89
  return;
89
90
  }
91
+ const mode = t.isStringLiteral(widgetAttr.value) ? widgetAttr.value.value.replace(TAGNAME + ":", "") : "";
92
+ const loadingAttr = attributes.find(
93
+ (attr) => t.isJSXAttribute(attr) && attr.name.name === "loading"
94
+ ) || void 0;
90
95
  container.openingElement.attributes = container.openingElement.attributes.filter(
91
- (attr) => attr !== clientAttr
96
+ (attr) => attr !== widgetAttr && attr !== loadingAttr
92
97
  );
93
98
  const options = {
94
99
  name: container.openingElement.name.name,
95
- recovering: config.isServer && clientAttr.name.name !== "clientOnly"
100
+ recovering: config.isServer && mode !== "client"
96
101
  };
97
- if (t.isStringLiteral(clientAttr.value) && clientAttr.value.value) {
98
- options.loading = clientAttr.value.value;
102
+ if (loadingAttr && loadingAttr.value && t.isStringLiteral(loadingAttr.value)) {
103
+ options.loading = loadingAttr.value.value;
99
104
  }
100
105
  const importDeclaration = binding.path.parent;
101
106
  const source = importDeclaration.source.value;
@@ -1,5 +1,5 @@
1
1
  import * as _web_widget_schema from '@web-widget/schema';
2
- export * from '@web-widget/schema/client';
2
+ export * from '@web-widget/schema/client-helpers';
3
3
  export { C as ClientOptions, D as DefineWebWidgetOptions, W as WebWidget, b as WebWidgetClient, a as WebWidgetClientProps, c as WebWidgetProps, _ as __ENV__, W as default, e as defineClient, f as defineClientOnly, d as defineWebWidget, r as renderServerWidget } from './web-widget-ec342172.js';
4
4
  import 'react/jsx-runtime';
5
5
  import 'react';
@@ -4,7 +4,7 @@ import { jsx } from "react/jsx-runtime";
4
4
  var __ENV__ = {
5
5
  server: true
6
6
  };
7
- var MODULE_REG = /\b(?:import|__vite_ssr_dynamic_import__)\(["']([^"']*?)["']\)/;
7
+ var MODULE_REG = /\b(?:import|__vite_ssr_dynamic_import__)\(["']([^"']*)["']\)/;
8
8
  function getFilename(loader) {
9
9
  const match = String(loader).match(MODULE_REG);
10
10
  const id = match?.[1];
@@ -167,34 +167,45 @@ function defineClientOnly(loader, base, { loading, name } = {}) {
167
167
  // src/client.ts
168
168
  import { createElement as createElement2 } from "react";
169
169
  import { createRoot, hydrateRoot } from "react-dom/client";
170
- import { defineRender, isRouteRenderContext } from "@web-widget/schema/client";
171
- export * from "@web-widget/schema/client";
170
+ import {
171
+ defineRender,
172
+ isRouteRenderContext
173
+ } from "@web-widget/schema/client-helpers";
174
+ export * from "@web-widget/schema/client-helpers";
172
175
  Reflect.defineProperty(__ENV__, "server", {
173
176
  value: false
174
177
  });
175
- var render = defineRender(
176
- async (context, component, props) => {
177
- const { recovering, container } = context;
178
- if (!container) {
179
- throw new Error(`Container required.`);
180
- }
181
- let vnode;
182
- if (typeof component === "function" && component.constructor.name === "AsyncFunction") {
183
- if (isRouteRenderContext(context)) {
184
- vnode = await component(props);
178
+ var render = defineRender(async (context, component, props) => {
179
+ const { recovering, container } = context;
180
+ if (!container) {
181
+ throw new Error(`Container required.`);
182
+ }
183
+ let root;
184
+ return {
185
+ async mount() {
186
+ let vnode;
187
+ if (typeof component === "function" && component.constructor.name === "AsyncFunction") {
188
+ if (isRouteRenderContext(context)) {
189
+ vnode = await component(props);
190
+ } else {
191
+ throw new Error("Async widget components are not supported.");
192
+ }
185
193
  } else {
186
- throw new Error("Async widget components are not supported.");
194
+ vnode = createElement2(component, props);
187
195
  }
188
- } else {
189
- vnode = createElement2(component, props);
190
- }
191
- if (recovering) {
192
- hydrateRoot(container, vnode);
193
- } else {
194
- createRoot(container).render(vnode);
196
+ if (recovering) {
197
+ root = hydrateRoot(container, vnode);
198
+ } else {
199
+ root = createRoot(container);
200
+ root.render(vnode);
201
+ }
202
+ },
203
+ async unmount() {
204
+ root?.unmount();
205
+ root = null;
195
206
  }
196
- }
197
- );
207
+ };
208
+ });
198
209
  export {
199
210
  WebWidget,
200
211
  WebWidgetClient,
@@ -1,5 +1,5 @@
1
1
  import * as _web_widget_schema from '@web-widget/schema';
2
- export * from '@web-widget/schema/server';
2
+ export * from '@web-widget/schema/server-helpers';
3
3
  export { C as ClientOptions, D as DefineWebWidgetOptions, W as WebWidget, b as WebWidgetClient, a as WebWidgetClientProps, c as WebWidgetProps, _ as __ENV__, W as default, e as defineClient, f as defineClientOnly, d as defineWebWidget, r as renderServerWidget } from './web-widget-ec342172.js';
4
4
  import 'react/jsx-runtime';
5
5
  import 'react';
@@ -4,7 +4,7 @@ import { jsx } from "react/jsx-runtime";
4
4
  var __ENV__ = {
5
5
  server: true
6
6
  };
7
- var MODULE_REG = /\b(?:import|__vite_ssr_dynamic_import__)\(["']([^"']*?)["']\)/;
7
+ var MODULE_REG = /\b(?:import|__vite_ssr_dynamic_import__)\(["']([^"']*)["']\)/;
8
8
  function getFilename(loader) {
9
9
  const match = String(loader).match(MODULE_REG);
10
10
  const id = match?.[1];
@@ -167,26 +167,24 @@ function defineClientOnly(loader, base, { loading, name } = {}) {
167
167
  // src/server.ts
168
168
  import { createElement as createElement2 } from "react";
169
169
  import * as ReactDOMServer from "react-dom/server.browser";
170
- import { defineRender, isRouteRenderContext } from "@web-widget/schema/server";
171
- export * from "@web-widget/schema/server";
170
+ import { defineRender, isRouteRenderContext } from "@web-widget/schema/server-helpers";
171
+ export * from "@web-widget/schema/server-helpers";
172
172
  Reflect.defineProperty(__ENV__, "server", {
173
173
  value: true
174
174
  });
175
- var render = defineRender(
176
- async (context, component, props) => {
177
- let vnode;
178
- if (typeof component === "function" && component.constructor.name === "AsyncFunction") {
179
- if (isRouteRenderContext(context)) {
180
- vnode = await component(props);
181
- } else {
182
- throw new Error("Async widget components are not supported.");
183
- }
175
+ var render = defineRender(async (context, component, props) => {
176
+ let vnode;
177
+ if (typeof component === "function" && component.constructor.name === "AsyncFunction") {
178
+ if (isRouteRenderContext(context)) {
179
+ vnode = await component(props);
184
180
  } else {
185
- vnode = createElement2(component, props);
181
+ throw new Error("Async widget components are not supported.");
186
182
  }
187
- return ReactDOMServer.renderToReadableStream(vnode);
183
+ } else {
184
+ vnode = createElement2(component, props);
188
185
  }
189
- );
186
+ return ReactDOMServer.renderToReadableStream(vnode);
187
+ });
190
188
  export {
191
189
  WebWidget,
192
190
  WebWidgetClient,
package/globals.d.ts CHANGED
@@ -1,9 +1,8 @@
1
1
  type _IntrinsicAttributes = IntrinsicAttributes;
2
- type loading = boolean | "lazy";
3
2
 
4
3
  declare namespace JSX {
5
4
  interface IntrinsicAttributes extends _IntrinsicAttributes {
6
- client?: loading;
7
- clientOnly?: loading;
5
+ as?: "web-widget" | "web-widget:server" | "web-widget:client" | any;
6
+ loading?: "lazy" | any;
8
7
  }
9
8
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@web-widget/react",
3
- "version": "0.0.1",
3
+ "version": "0.0.2",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -36,7 +36,7 @@
36
36
  "@babel/helper-module-imports": "^7.22.5",
37
37
  "@babel/helper-plugin-utils": "^7.22.5",
38
38
  "@babel/traverse": "^7.22.5",
39
- "@web-widget/schema": "0.0.1"
39
+ "@web-widget/schema": "0.0.4"
40
40
  },
41
41
  "peerDependencies": {
42
42
  "@vitejs/plugin-react": "^4.0.2",