@web-widget/vue 3.0.0-beta.0 → 3.0.0-beta.3

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,200 @@
1
+ // src/error-handler.ts
2
+ import { cacheProviderIsLoading } from "@web-widget/helpers/cache";
3
+ function installErrorHandler(app, callback, throwUnhandledErrorInProduction = false) {
4
+ app.config.throwUnhandledErrorInProduction = throwUnhandledErrorInProduction;
5
+ app.config.errorHandler = (err, instance, info) => {
6
+ if (cacheProviderIsLoading(err)) {
7
+ return;
8
+ }
9
+ app.config.warnHandler = () => {
10
+ };
11
+ callback(err);
12
+ };
13
+ }
14
+
15
+ // src/components.ts
16
+ import { WebWidgetRenderer } from "@web-widget/web-widget";
17
+ import {
18
+ h,
19
+ defineComponent,
20
+ Suspense,
21
+ useAttrs,
22
+ ref,
23
+ onErrorCaptured
24
+ } from "vue";
25
+ import { IS_CLIENT } from "@web-widget/helpers/env";
26
+ var WebWidget = /* @__PURE__ */ defineComponent({
27
+ name: "WebWidgetRoot",
28
+ props: {
29
+ base: {
30
+ type: String
31
+ },
32
+ data: {
33
+ type: Object,
34
+ default: () => ({})
35
+ },
36
+ errorFallback: {
37
+ type: Object,
38
+ default: null
39
+ },
40
+ import: {
41
+ type: String
42
+ },
43
+ inactive: {
44
+ type: Boolean,
45
+ default: false
46
+ },
47
+ loader: {
48
+ type: Function,
49
+ required: true
50
+ },
51
+ loading: {
52
+ type: String
53
+ },
54
+ meta: {
55
+ type: Object
56
+ },
57
+ name: {
58
+ type: String
59
+ },
60
+ renderStage: {
61
+ type: String
62
+ },
63
+ renderTarget: {
64
+ type: String,
65
+ default: "light"
66
+ }
67
+ },
68
+ async setup({ loader, errorFallback, ...props }, { slots }) {
69
+ if (!loader) {
70
+ throw new TypeError(`Missing loader.`);
71
+ }
72
+ if (Object.keys(slots).length > 0) {
73
+ throw new TypeError(`Slot not supported.`);
74
+ }
75
+ const widget = new WebWidgetRenderer(loader, {
76
+ ...props,
77
+ children: ""
78
+ });
79
+ const tag = widget.localName;
80
+ const attrs = widget.attributes;
81
+ const innerHTML = await widget.renderInnerHTMLToString().catch((err) => {
82
+ const error = err instanceof Error ? err : new Error(String(err));
83
+ console.error("[VueWidget] Rendering error:", error);
84
+ return error;
85
+ });
86
+ if (innerHTML instanceof Error) {
87
+ return () => errorFallback;
88
+ }
89
+ if (IS_CLIENT) {
90
+ await customElements.whenDefined(tag);
91
+ }
92
+ const data = attrs.data;
93
+ delete attrs.data;
94
+ return () => {
95
+ const nodeProps = {
96
+ ...attrs,
97
+ ...IS_CLIENT ? { "^data": data } : { data },
98
+ ...!IS_CLIENT ? { innerHTML } : null
99
+ };
100
+ return h(tag, nodeProps);
101
+ };
102
+ }
103
+ });
104
+ function resolveFallback(fallback) {
105
+ var _a;
106
+ if (fallback !== null && typeof fallback === "object" && !("__v_isVNode" in fallback) && ("pending" in fallback || "error" in fallback)) {
107
+ const obj = fallback;
108
+ return {
109
+ pendingFallback: obj.pending,
110
+ errorFallback: (_a = obj.error) != null ? _a : obj.pending
111
+ };
112
+ }
113
+ return {
114
+ pendingFallback: fallback,
115
+ errorFallback: fallback
116
+ };
117
+ }
118
+ function container(loader, options = {}) {
119
+ return defineComponent({
120
+ name: "VueWidget",
121
+ inheritAttrs: false,
122
+ props: {
123
+ widget: {
124
+ type: Object,
125
+ default: () => ({})
126
+ }
127
+ },
128
+ setup({ widget }, { slots }) {
129
+ var _a, _b;
130
+ const {
131
+ fallback,
132
+ loading = (_a = options.loading) != null ? _a : "lazy",
133
+ serverOnly,
134
+ clientOnly
135
+ } = widget;
136
+ const { pendingFallback, errorFallback } = resolveFallback(fallback);
137
+ const renderStage = serverOnly ? "server" : clientOnly ? "client" : options.renderStage;
138
+ const data = useAttrs();
139
+ if (clientOnly && !IS_CLIENT && pendingFallback) {
140
+ const renderer = new WebWidgetRenderer(loader, {
141
+ ...options,
142
+ children: "",
143
+ data,
144
+ loading,
145
+ renderStage,
146
+ renderTarget: (_b = options.renderTarget) != null ? _b : "light"
147
+ });
148
+ return () => h(
149
+ renderer.localName,
150
+ renderer.attributes,
151
+ h(
152
+ renderer.pendingLocalName,
153
+ {
154
+ "aria-busy": "true",
155
+ style: { display: "contents" }
156
+ },
157
+ pendingFallback
158
+ )
159
+ );
160
+ }
161
+ const error = ref(null);
162
+ onErrorCaptured((err) => {
163
+ error.value = err;
164
+ return false;
165
+ });
166
+ return () => {
167
+ var _a2;
168
+ if (error.value && errorFallback) {
169
+ return errorFallback;
170
+ }
171
+ return h(
172
+ Suspense,
173
+ {},
174
+ {
175
+ default: h(
176
+ WebWidget,
177
+ {
178
+ ...options,
179
+ data,
180
+ errorFallback,
181
+ loader,
182
+ loading,
183
+ renderStage,
184
+ renderTarget: (_a2 = options.renderTarget) != null ? _a2 : "light"
185
+ },
186
+ slots
187
+ ),
188
+ fallback: pendingFallback
189
+ }
190
+ );
191
+ };
192
+ }
193
+ });
194
+ }
195
+
196
+ export {
197
+ installErrorHandler,
198
+ resolveFallback,
199
+ container
200
+ };
@@ -0,0 +1,10 @@
1
+ // src/as-react-widget.ts
2
+ function asReactWidget(component) {
3
+ return component;
4
+ }
5
+ var toReact = asReactWidget;
6
+
7
+ export {
8
+ asReactWidget,
9
+ toReact
10
+ };
@@ -0,0 +1,87 @@
1
+ import { WebWidgetRendererOptions, Loader } from '@web-widget/web-widget';
2
+ import { ExtractWidgetProps } from '@web-widget/schema';
3
+ import { DefineComponent, VNode, App, Component } from 'vue';
4
+
5
+ /**
6
+ * A Vue component wrapping a widget, with props `T` plus container config.
7
+ */
8
+ type VueWidgetComponent<T = unknown> = DefineComponent<T & {
9
+ widget?: WidgetContainerConfig;
10
+ }>;
11
+ interface DefineWebWidgetOptions {
12
+ base?: WebWidgetRendererOptions['base'];
13
+ import?: WebWidgetRendererOptions['import'];
14
+ loading?: WebWidgetRendererOptions['loading'];
15
+ name?: WebWidgetRendererOptions['name'];
16
+ renderStage?: WebWidgetRendererOptions['renderStage'];
17
+ renderTarget?: WebWidgetRendererOptions['renderTarget'];
18
+ }
19
+ type WidgetFallback = VNode | {
20
+ pending?: VNode;
21
+ error?: VNode;
22
+ };
23
+ /**
24
+ * Resolve a WidgetFallback into separate pending and error VNodes.
25
+ * - `VNode` — used for both pending and error.
26
+ * - `{ pending?, error? }` — specify independently; `error` defaults to `pending`.
27
+ */
28
+ declare function resolveFallback(fallback: WidgetFallback | undefined): {
29
+ pendingFallback: VNode;
30
+ errorFallback: VNode;
31
+ };
32
+ interface WidgetContainerConfig {
33
+ /**
34
+ * Fallback UI for pending and error states.
35
+ *
36
+ * Only effective during server-side rendering: pending UI shows while the
37
+ * widget module renders; error UI shows if rendering fails. Both are
38
+ * serialized into the HTML stream — no client-side retry exists in the
39
+ * islands architecture.
40
+ * For `clientOnly`, pending UI is rendered inside the `<web-widget>` element
41
+ * and removed immediately before its client mount begins.
42
+ *
43
+ * - `VNode` — used for both pending (Suspense) and error.
44
+ * - `{ pending?, error? }` — specify independently; `error` defaults to `pending`.
45
+ *
46
+ * @example
47
+ * // Simple: same UI for both states
48
+ * <Widget :widget="{ fallback: h(Spinner) }" />
49
+ *
50
+ * // Differentiated: separate pending and error UI
51
+ * <Widget :widget="{ fallback: { pending: h(Spinner), error: h(ErrorUI) } }" />
52
+ */
53
+ fallback?: WidgetFallback;
54
+ /** Client-side module loading strategy: `'lazy'` loads on first render, `'eager'` on module parse, `'idle'` on browser idle. */
55
+ loading?: WebWidgetRendererOptions['loading'];
56
+ /** Widget renders only on the server (SSR), producing static HTML with no client-side mount. Mutually exclusive with `clientOnly`. */
57
+ serverOnly?: true;
58
+ /** Widget renders only on the client, producing no server HTML (empty placeholder until client mount). Mutually exclusive with `serverOnly`. */
59
+ clientOnly?: true;
60
+ }
61
+ /**
62
+ * Container function (WebWidgetAdapter protocol).
63
+ *
64
+ * Wraps a widget module loader into a Vue component with props type
65
+ * inference from the source module's default export.
66
+ *
67
+ * @example
68
+ * ```ts
69
+ * import { container } from '@web-widget/vue/adapter';
70
+ *
71
+ * const Counter = container(() => import('./Counter@widget.vue'));
72
+ * // ^? VueWidgetComponent<{ count: number }>
73
+ * ```
74
+ */
75
+ declare function container<M>(loader: () => Promise<M>, options?: DefineWebWidgetOptions): VueWidgetComponent<ExtractWidgetProps<M>>;
76
+ declare function container<Props>(loader: Loader, options?: DefineWebWidgetOptions): VueWidgetComponent<Props>;
77
+
78
+ interface CreateVueRenderOptions {
79
+ onCreatedApp?: (app: App<Element>, context: {
80
+ container?: Element | DocumentFragment;
81
+ data: any;
82
+ progressive?: boolean;
83
+ recovering?: boolean;
84
+ }, component: Component, props: any) => Promise<void>;
85
+ }
86
+
87
+ export { type CreateVueRenderOptions as C, type DefineWebWidgetOptions as D, type VueWidgetComponent as V, type WidgetContainerConfig as W, type WidgetFallback as a, container as c, resolveFallback as r };
@@ -0,0 +1,14 @@
1
+ import * as _web_widget_schema from '@web-widget/schema';
2
+ import { Component } from 'vue';
3
+ import { C as CreateVueRenderOptions } from './types-eCw5P8fo.js';
4
+ export { D as DefineWebWidgetOptions, V as VueWidgetComponent, W as WidgetContainerConfig, a as WidgetFallback, c as container, r as resolveFallback } from './types-eCw5P8fo.js';
5
+ export { asReactWidget, toReact } from './vue.js';
6
+ import '@web-widget/web-widget';
7
+ import '@web-widget/react/adapter';
8
+
9
+ declare const createVueRender: ({ onCreatedApp, }?: CreateVueRenderOptions) => _web_widget_schema.ClientRender<Component, unknown, _web_widget_schema.ClientRenderOptions, void | _web_widget_schema.ClientRenderResult<unknown>>;
10
+ /**@deprecated Please use `createVueRender` instead.*/
11
+ declare const defineVueRender: ({ onCreatedApp, }?: CreateVueRenderOptions) => _web_widget_schema.ClientRender<Component, unknown, _web_widget_schema.ClientRenderOptions, void | _web_widget_schema.ClientRenderResult<unknown>>;
12
+ declare const render: _web_widget_schema.ClientRender<Component, unknown, _web_widget_schema.ClientRenderOptions, void | _web_widget_schema.ClientRenderResult<unknown>>;
13
+
14
+ export { createVueRender, defineVueRender, render };
@@ -1,31 +1,32 @@
1
1
  import {
2
- asReactWidget,
3
- defineWebWidget,
2
+ container,
4
3
  installErrorHandler,
4
+ resolveFallback
5
+ } from "./chunk-7BZH43RE.js";
6
+ import {
7
+ asReactWidget,
5
8
  toReact
6
- } from "./chunk-GRYUSOXQ.js";
9
+ } from "./chunk-F3PTQ2OL.js";
7
10
 
8
- // src/client.ts
11
+ // src/adapter.client.ts
9
12
  import { defineClientRender } from "@web-widget/helpers";
10
13
  import { Suspense, createApp, createSSRApp, h } from "vue";
11
- export * from "@web-widget/helpers";
12
- import { useWidgetAsyncState } from "@web-widget/helpers/state";
13
14
  var createWidgetSuspense = (component) => (props) => h(Suspense, null, [h(component, props)]);
14
15
  var createVueRender = ({
15
16
  onCreatedApp = async () => {
16
17
  }
17
18
  } = {}) => {
18
19
  return defineClientRender(
19
- async (component, data, { recovering, container }) => {
20
+ async (component, data, { recovering, container: container2 }) => {
20
21
  data = data != null ? data : {};
21
22
  if (!component) {
22
23
  throw new TypeError(`Missing component.`);
23
24
  }
24
- if (!container) {
25
+ if (!container2) {
25
26
  throw new Error(`Missing container.`);
26
27
  }
27
28
  let app;
28
- const context = { data, recovering, container };
29
+ const context = { data, recovering, container: container2 };
29
30
  const WidgetSuspense = createWidgetSuspense(component);
30
31
  return {
31
32
  async mount() {
@@ -35,7 +36,7 @@ var createVueRender = ({
35
36
  error = err;
36
37
  });
37
38
  await onCreatedApp(app, context, component, data);
38
- app.mount(container);
39
+ app.mount(container2);
39
40
  if (error) {
40
41
  throw error;
41
42
  }
@@ -52,10 +53,10 @@ var defineVueRender = createVueRender;
52
53
  var render = createVueRender();
53
54
  export {
54
55
  asReactWidget,
56
+ container,
55
57
  createVueRender,
56
58
  defineVueRender,
57
- defineWebWidget,
58
59
  render,
59
- toReact,
60
- useWidgetAsyncState as useWidgetState
60
+ resolveFallback,
61
+ toReact
61
62
  };
@@ -0,0 +1,24 @@
1
+ import * as _web_widget_schema from '@web-widget/schema';
2
+ import { Component } from 'vue';
3
+ import { SSRContext } from 'vue/server-renderer';
4
+ import { C as CreateVueRenderOptions } from './types-eCw5P8fo.js';
5
+ export { D as DefineWebWidgetOptions, V as VueWidgetComponent, W as WidgetContainerConfig, a as WidgetFallback, c as container, r as resolveFallback } from './types-eCw5P8fo.js';
6
+ export { asReactWidget, toReact } from './vue.js';
7
+ import '@web-widget/web-widget';
8
+ import '@web-widget/react/adapter';
9
+
10
+ declare module '@web-widget/schema' {
11
+ interface ServerRenderOptions {
12
+ vue?: {};
13
+ }
14
+ }
15
+
16
+ interface VueRenderOptions {
17
+ vue?: SSRContext;
18
+ }
19
+ declare const createVueRender: ({ onCreatedApp, }?: CreateVueRenderOptions) => _web_widget_schema.ServerRender<Component, unknown, _web_widget_schema.ServerRenderOptions, _web_widget_schema.ServerRenderResult>;
20
+ /**@deprecated Please use `createVueRender` instead.*/
21
+ declare const defineVueRender: ({ onCreatedApp, }?: CreateVueRenderOptions) => _web_widget_schema.ServerRender<Component, unknown, _web_widget_schema.ServerRenderOptions, _web_widget_schema.ServerRenderResult>;
22
+ declare const render: _web_widget_schema.ServerRender<Component, unknown, _web_widget_schema.ServerRenderOptions, _web_widget_schema.ServerRenderResult>;
23
+
24
+ export { type VueRenderOptions, createVueRender, defineVueRender, render };
@@ -0,0 +1,108 @@
1
+ import {
2
+ container,
3
+ installErrorHandler,
4
+ resolveFallback
5
+ } from "./chunk-7BZH43RE.js";
6
+ import {
7
+ asReactWidget,
8
+ toReact
9
+ } from "./chunk-F3PTQ2OL.js";
10
+
11
+ // src/adapter.server.ts
12
+ import { defineServerRender } from "@web-widget/helpers";
13
+ import { createSSRApp, h, Suspense } from "vue";
14
+ import {
15
+ renderToString,
16
+ renderToWebStream
17
+ } from "vue/server-renderer";
18
+ var createWidgetSuspense = (component) => (props) => h(Suspense, null, [h(component, props)]);
19
+ var createVueRender = ({
20
+ onCreatedApp = async () => {
21
+ }
22
+ } = {}) => {
23
+ return defineServerRender(
24
+ async (component, data, { progressive, vue: options }) => {
25
+ var _a, _b;
26
+ data = data != null ? data : {};
27
+ if (!component) {
28
+ throw new TypeError(`Missing component.`);
29
+ }
30
+ const ssrContext = Object.create(options != null ? options : null);
31
+ let error;
32
+ const context = { data, progressive };
33
+ const WidgetSuspense = createWidgetSuspense(component);
34
+ const app = createSSRApp(WidgetSuspense, data);
35
+ installErrorHandler(app, (err) => {
36
+ error = err;
37
+ });
38
+ await onCreatedApp(app, context, component, data);
39
+ if (progressive) {
40
+ const stream = renderToWebStream(app, ssrContext);
41
+ const reader = stream.getReader();
42
+ const first = await reader.read();
43
+ try {
44
+ if (ssrContext == null ? void 0 : ssrContext.teleports) {
45
+ const file = (_a = Reflect.get(component, "__file")) != null ? _a : "unknown";
46
+ throw new Error(
47
+ `Teleports are not supported in SSR: ${JSON.stringify(ssrContext.teleports, null, 2)} in ${file}
48
+ Do conditionally render Teleport when mounted on the client.`
49
+ );
50
+ }
51
+ if (error) {
52
+ throw error;
53
+ }
54
+ } catch (e) {
55
+ await reader.cancel();
56
+ throw e;
57
+ }
58
+ return new ReadableStream({
59
+ start(controller) {
60
+ if (first.done) {
61
+ controller.close();
62
+ } else {
63
+ controller.enqueue(first.value);
64
+ }
65
+ },
66
+ async pull(controller) {
67
+ try {
68
+ const { value, done } = await reader.read();
69
+ if (done) {
70
+ controller.close();
71
+ } else {
72
+ controller.enqueue(value);
73
+ }
74
+ } catch (e) {
75
+ controller.error(e);
76
+ }
77
+ },
78
+ async cancel() {
79
+ await reader.cancel();
80
+ }
81
+ });
82
+ }
83
+ const html = await renderToString(app, ssrContext);
84
+ if (ssrContext == null ? void 0 : ssrContext.teleports) {
85
+ const file = (_b = Reflect.get(component, "__file")) != null ? _b : "unknown";
86
+ throw new Error(
87
+ `Teleports are not supported in SSR: ${JSON.stringify(ssrContext.teleports, null, 2)} in ${file}
88
+ Do conditionally render Teleport when mounted on the client.`
89
+ );
90
+ }
91
+ if (error) {
92
+ throw error;
93
+ }
94
+ return html;
95
+ }
96
+ );
97
+ };
98
+ var defineVueRender = createVueRender;
99
+ var render = createVueRender();
100
+ export {
101
+ asReactWidget,
102
+ container,
103
+ createVueRender,
104
+ defineVueRender,
105
+ render,
106
+ resolveFallback,
107
+ toReact
108
+ };
package/dist/vue.d.ts ADDED
@@ -0,0 +1,18 @@
1
+ import { Component, ComponentPublicInstance } from 'vue';
2
+ import { ReactWidgetComponent } from '@web-widget/react/adapter';
3
+
4
+ /**
5
+ * Adapt Vue component types to React widget component types.
6
+ *
7
+ * @deprecated Use `container()` from `@web-widget/react/adapter` instead.
8
+ * The build tool automatically infers props types for both static imports
9
+ * and explicit `container(() => import(...))` calls.
10
+ *
11
+ * This is a type-level cast only — the actual cross-framework rendering
12
+ * is handled by the `@widget` system.
13
+ */
14
+ declare function asReactWidget<T>(component: Component<T>): ReactWidgetComponent<Omit<T, keyof ComponentPublicInstance | "$route" | "$router">>;
15
+ /** @deprecated Use `container()` from `@web-widget/react/adapter` instead. */
16
+ declare const toReact: typeof asReactWidget;
17
+
18
+ export { asReactWidget, toReact };
package/dist/vue.js ADDED
@@ -0,0 +1,8 @@
1
+ import {
2
+ asReactWidget,
3
+ toReact
4
+ } from "./chunk-F3PTQ2OL.js";
5
+ export {
6
+ asReactWidget,
7
+ toReact
8
+ };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@web-widget/vue",
3
3
  "description": "Vue adapter",
4
- "version": "3.0.0-beta.0",
4
+ "version": "3.0.0-beta.3",
5
5
  "homepage": "https://github.com/web-widget/web-widget#readme",
6
6
  "repository": {
7
7
  "type": "git",
@@ -13,49 +13,64 @@
13
13
  },
14
14
  "license": "MIT",
15
15
  "dependencies": {
16
- "@rollup/pluginutils": "^5.1.4",
17
- "@web-widget/helpers": "3.0.0-beta.0",
18
- "@web-widget/vite-plugin": "3.0.0-beta.0",
19
- "@web-widget/web-widget": "3.0.0-beta.0",
20
- "@web-widget/schema": "3.0.0-beta.0",
21
- "@web-widget/react": "3.0.0-beta.0"
16
+ "@web-widget/helpers": "3.0.0-beta.3",
17
+ "@web-widget/web-widget": "3.0.0-beta.3",
18
+ "@web-widget/schema": "3.0.0-beta.3",
19
+ "@web-widget/react": "3.0.0-beta.3"
22
20
  },
23
21
  "devDependencies": {
24
22
  "tsup": "^8.3.4",
25
- "typescript": "^5.5.4",
26
- "vite": "^8.0.12",
23
+ "typescript": "^5.9.3",
27
24
  "vue": "^3.5.34"
28
25
  },
29
26
  "exports": {
30
27
  ".": {
28
+ "types": "./dist/vue.d.ts",
29
+ "default": "./dist/vue.js"
30
+ },
31
+ "./adapter": {
31
32
  "worker": {
32
- "types": "./dist/vue.server.d.ts",
33
- "default": "./dist/vue.server.js"
33
+ "types": "./dist/vue.adapter.server.d.ts",
34
+ "default": "./dist/vue.adapter.server.js"
34
35
  },
35
36
  "browser": {
36
- "types": "./dist/vue.client.d.ts",
37
- "default": "./dist/vue.client.js"
37
+ "types": "./dist/vue.adapter.client.d.ts",
38
+ "default": "./dist/vue.adapter.client.js"
38
39
  },
39
40
  "default": {
40
- "types": "./dist/vue.server.d.ts",
41
- "default": "./dist/vue.server.js"
41
+ "types": "./dist/vue.adapter.server.d.ts",
42
+ "default": "./dist/vue.adapter.server.js"
42
43
  }
43
- },
44
- "./vite": {
45
- "types": "./dist/vite.d.ts",
46
- "default": "./dist/vite.js"
47
44
  }
48
45
  },
46
+ "webWidgetAdapter": {
47
+ "version": "1.0.0",
48
+ "name": "vue",
49
+ "extensions": [
50
+ ".vue"
51
+ ],
52
+ "adapter": "./adapter",
53
+ "deriveExports": [
54
+ {
55
+ "name": "handler",
56
+ "default": "{GET({html}){return html()}}"
57
+ },
58
+ {
59
+ "name": "meta",
60
+ "default": "{}"
61
+ }
62
+ ]
63
+ },
49
64
  "files": [
50
65
  "dist"
51
66
  ],
52
67
  "peerDependencies": {
53
- "vite": "^8.0.12",
54
68
  "vue": ">3.3.3"
55
69
  },
56
70
  "publishConfig": {
57
71
  "access": "public"
58
72
  },
73
+ "sideEffects": false,
59
74
  "type": "module",
60
75
  "scripts": {
61
76
  "build": "pnpm exec tsup",
@@ -1,145 +0,0 @@
1
- // src/error-handler.ts
2
- import { cacheProviderIsLoading } from "@web-widget/helpers/cache";
3
- function installErrorHandler(app, callback, throwUnhandledErrorInProduction = false) {
4
- app.config.throwUnhandledErrorInProduction = throwUnhandledErrorInProduction;
5
- app.config.errorHandler = (err, instance, info) => {
6
- if (cacheProviderIsLoading(err)) {
7
- return;
8
- }
9
- callback(err);
10
- };
11
- }
12
-
13
- // src/components.ts
14
- import { WebWidgetRenderer } from "@web-widget/web-widget";
15
- import { h, defineComponent, Suspense, useAttrs } from "vue";
16
- import { IS_CLIENT } from "@web-widget/helpers/env";
17
- var WebWidget = /* @__PURE__ */ defineComponent({
18
- name: "WebWidgetRoot",
19
- props: {
20
- base: {
21
- type: String
22
- },
23
- data: {
24
- type: Object,
25
- default: () => ({})
26
- },
27
- import: {
28
- type: String
29
- },
30
- inactive: {
31
- type: Boolean,
32
- default: false
33
- },
34
- loader: {
35
- type: Function,
36
- required: true
37
- },
38
- loading: {
39
- type: String
40
- },
41
- meta: {
42
- type: Object
43
- },
44
- name: {
45
- type: String
46
- },
47
- renderStage: {
48
- type: String
49
- },
50
- renderTarget: {
51
- type: String,
52
- default: "light"
53
- }
54
- },
55
- async setup({ loader, ...props }, { slots }) {
56
- if (!loader) {
57
- throw new TypeError(`Missing loader.`);
58
- }
59
- if (Object.keys(slots).length > 0) {
60
- throw new TypeError(`Slot not supported.`);
61
- }
62
- const widget = new WebWidgetRenderer(loader, {
63
- ...props,
64
- children: ""
65
- });
66
- const tag = widget.localName;
67
- const attrs = widget.attributes;
68
- const innerHTML = await widget.renderInnerHTMLToString();
69
- if (IS_CLIENT) {
70
- await customElements.whenDefined(tag);
71
- }
72
- const data = attrs.data;
73
- delete attrs.data;
74
- return () => {
75
- const nodeProps = {
76
- ...attrs,
77
- ...IS_CLIENT ? { "^data": data } : { data },
78
- ...!IS_CLIENT ? { innerHTML } : null
79
- };
80
- return h(tag, nodeProps);
81
- };
82
- }
83
- });
84
- function defineWebWidget(loader, options) {
85
- var _a, _b;
86
- return defineComponent({
87
- name: "WebWidgetSuspense",
88
- inheritAttrs: false,
89
- props: {
90
- fallback: {
91
- type: Object
92
- },
93
- experimental_loading: {
94
- type: String,
95
- default: (_a = options.loading) != null ? _a : "lazy"
96
- },
97
- renderStage: {
98
- type: String,
99
- default: options.renderStage
100
- },
101
- experimental_renderTarget: {
102
- type: String,
103
- default: (_b = options.renderTarget) != null ? _b : "light"
104
- }
105
- },
106
- setup({
107
- fallback,
108
- experimental_loading,
109
- renderStage,
110
- experimental_renderTarget
111
- }, { slots }) {
112
- const data = useAttrs();
113
- return () => h(
114
- Suspense,
115
- {},
116
- {
117
- default: h(
118
- WebWidget,
119
- {
120
- ...options,
121
- data,
122
- loader,
123
- loading: experimental_loading,
124
- renderStage,
125
- renderTarget: experimental_renderTarget
126
- },
127
- slots
128
- ),
129
- fallback
130
- }
131
- );
132
- }
133
- });
134
- }
135
- function asReactWidget(component) {
136
- return component;
137
- }
138
- var toReact = asReactWidget;
139
-
140
- export {
141
- installErrorHandler,
142
- defineWebWidget,
143
- asReactWidget,
144
- toReact
145
- };
@@ -1,74 +0,0 @@
1
- import * as vue from 'vue';
2
- import { Component, ComponentPublicInstance, PropType, VNode, App } from 'vue';
3
- import { WebWidgetRendererOptions, Loader } from '@web-widget/web-widget';
4
- import { ReactWidgetComponent } from '@web-widget/react';
5
-
6
- interface DefineWebWidgetOptions {
7
- base?: WebWidgetRendererOptions['base'];
8
- import?: WebWidgetRendererOptions['import'];
9
- loading?: WebWidgetRendererOptions['loading'];
10
- name?: WebWidgetRendererOptions['name'];
11
- renderStage?: WebWidgetRendererOptions['renderStage'];
12
- renderTarget?: WebWidgetRendererOptions['renderTarget'];
13
- }
14
- declare function defineWebWidget(loader: Loader, options: DefineWebWidgetOptions): vue.DefineComponent<vue.ExtractPropTypes<{
15
- fallback: {
16
- type: PropType<VNode>;
17
- };
18
- experimental_loading: {
19
- type: PropType<WebWidgetRendererOptions["loading"]>;
20
- default: "lazy" | "eager" | "idle";
21
- };
22
- renderStage: {
23
- type: PropType<WebWidgetRendererOptions["renderStage"]>;
24
- default: "server" | "client" | undefined;
25
- };
26
- experimental_renderTarget: {
27
- type: PropType<WebWidgetRendererOptions["renderTarget"]>;
28
- default: "light" | "shadow";
29
- };
30
- }>, () => VNode<vue.RendererNode, vue.RendererElement, {
31
- [key: string]: any;
32
- }>, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {}, string, vue.PublicProps, Readonly<vue.ExtractPropTypes<{
33
- fallback: {
34
- type: PropType<VNode>;
35
- };
36
- experimental_loading: {
37
- type: PropType<WebWidgetRendererOptions["loading"]>;
38
- default: "lazy" | "eager" | "idle";
39
- };
40
- renderStage: {
41
- type: PropType<WebWidgetRendererOptions["renderStage"]>;
42
- default: "server" | "client" | undefined;
43
- };
44
- experimental_renderTarget: {
45
- type: PropType<WebWidgetRendererOptions["renderTarget"]>;
46
- default: "light" | "shadow";
47
- };
48
- }>> & Readonly<{}>, {
49
- renderStage: "server" | "client" | undefined;
50
- experimental_loading: "lazy" | "eager" | "idle" | undefined;
51
- experimental_renderTarget: "light" | "shadow" | undefined;
52
- }, {}, {}, {}, string, vue.ComponentProvideOptions, true, {}, any>;
53
- /**
54
- * Adapt Vue component types to React widget component types.
55
- *
56
- * This is a type-level cast only — the actual cross-framework rendering
57
- * is handled by the `@widget` system. Use this when importing a Vue
58
- * widget (e.g. `Counter@widget.vue`) into a React/JSX file so that
59
- * TypeScript treats it as a React component.
60
- */
61
- declare function asReactWidget<T>(component: Component<T>): ReactWidgetComponent<Omit<T, keyof ComponentPublicInstance | "$route" | "$router">>;
62
- /** @deprecated Use `asReactWidget` instead. */
63
- declare const toReact: typeof asReactWidget;
64
-
65
- interface CreateVueRenderOptions {
66
- onCreatedApp?: (app: App<Element>, context: {
67
- container?: Element | DocumentFragment;
68
- data: any;
69
- progressive?: boolean;
70
- recovering?: boolean;
71
- }, component: Component, props: any) => Promise<void>;
72
- }
73
-
74
- export { type CreateVueRenderOptions as C, type DefineWebWidgetOptions as D, asReactWidget as a, defineWebWidget as d, toReact as t };
package/dist/vite.d.ts DELETED
@@ -1,9 +0,0 @@
1
- import * as vite from 'vite';
2
- import { WebWidgetUserConfig } from '@web-widget/vite-plugin';
3
-
4
- interface VueWebWidgetPluginOptions extends Partial<WebWidgetUserConfig> {
5
- workspace?: string;
6
- }
7
- declare function vueWebWidgetPlugin(options?: VueWebWidgetPluginOptions): vite.Plugin<any>[];
8
-
9
- export { type VueWebWidgetPluginOptions, vueWebWidgetPlugin as default };
package/dist/vite.js DELETED
@@ -1,62 +0,0 @@
1
- // src/vite.ts
2
- import { webWidgetPlugin } from "@web-widget/vite-plugin";
3
- import { posix } from "path";
4
- import { normalizePath } from "@rollup/pluginutils";
5
- function escapeRegExp(path) {
6
- return path.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
7
- }
8
- function appendSlash(path) {
9
- return path.endsWith(posix.sep) ? path : `${path}${posix.sep}`;
10
- }
11
- function vueWebWidgetPlugin(options) {
12
- const {
13
- manifest,
14
- provide = "@web-widget/vue",
15
- workspace = "",
16
- export: exportWidget = {},
17
- import: importWidget = {}
18
- } = options != null ? options : {};
19
- const workspacePattern = workspace ? escapeRegExp(normalizePath(appendSlash(workspace))) : workspace;
20
- const widgetPattern = `[.@]widget`;
21
- const routePattern = `[.@]route`;
22
- const modulesPattern = `[.@](?:route|widget)`;
23
- const extensionPattern = `\\.vue`;
24
- const vueBuildModeQueryPattern = `(?:\\?vue&type=script\\b.*)`;
25
- const routeRegExp = new RegExp(
26
- `^${workspacePattern}.*${routePattern}${extensionPattern}$`
27
- );
28
- return webWidgetPlugin({
29
- manifest,
30
- provide,
31
- export: {
32
- include: new RegExp(
33
- `^${workspacePattern}[^?]*${modulesPattern}${extensionPattern}$`
34
- ),
35
- extractFromExportDefault: [
36
- {
37
- name: "handler",
38
- default: "{GET({html}){return html()}}",
39
- include: routeRegExp
40
- },
41
- {
42
- name: "meta",
43
- default: "{}",
44
- include: routeRegExp
45
- }
46
- ],
47
- ...exportWidget
48
- },
49
- import: {
50
- include: new RegExp(`^[^?]*${widgetPattern}\\.[^?]*$`),
51
- includeImporter: new RegExp(
52
- // vite dev mode: .vue
53
- // vite build mode: .vue?vue&type=script&setup=true&lang.ts
54
- `^${workspacePattern}[^?]*${extensionPattern}${vueBuildModeQueryPattern}?$`
55
- ),
56
- ...importWidget
57
- }
58
- });
59
- }
60
- export {
61
- vueWebWidgetPlugin as default
62
- };
@@ -1,15 +0,0 @@
1
- import * as _web_widget_helpers from '@web-widget/helpers';
2
- export * from '@web-widget/helpers';
3
- import { Component } from 'vue';
4
- import { C as CreateVueRenderOptions } from './types-vVhn4RGy.js';
5
- export { D as DefineWebWidgetOptions, a as asReactWidget, d as defineWebWidget, t as toReact } from './types-vVhn4RGy.js';
6
- export { useWidgetAsyncState as useWidgetState } from '@web-widget/helpers/state';
7
- import '@web-widget/web-widget';
8
- import '@web-widget/react';
9
-
10
- declare const createVueRender: ({ onCreatedApp, }?: CreateVueRenderOptions) => _web_widget_helpers.ClientRender<Component, unknown, _web_widget_helpers.ClientRenderOptions, void | _web_widget_helpers.ClientRenderResult<unknown>>;
11
- /**@deprecated Please use `createVueRender` instead.*/
12
- declare const defineVueRender: ({ onCreatedApp, }?: CreateVueRenderOptions) => _web_widget_helpers.ClientRender<Component, unknown, _web_widget_helpers.ClientRenderOptions, void | _web_widget_helpers.ClientRenderResult<unknown>>;
13
- declare const render: _web_widget_helpers.ClientRender<Component, unknown, _web_widget_helpers.ClientRenderOptions, void | _web_widget_helpers.ClientRenderResult<unknown>>;
14
-
15
- export { createVueRender, defineVueRender, render };
@@ -1,25 +0,0 @@
1
- import * as _web_widget_helpers from '@web-widget/helpers';
2
- export * from '@web-widget/helpers';
3
- import { Component } from 'vue';
4
- import { SSRContext } from 'vue/server-renderer';
5
- import { C as CreateVueRenderOptions } from './types-vVhn4RGy.js';
6
- export { D as DefineWebWidgetOptions, a as asReactWidget, d as defineWebWidget, t as toReact } from './types-vVhn4RGy.js';
7
- export { useWidgetAsyncState as useWidgetState } from '@web-widget/helpers/state';
8
- import '@web-widget/web-widget';
9
- import '@web-widget/react';
10
-
11
- declare module '@web-widget/schema' {
12
- interface ServerRenderOptions {
13
- vue?: {};
14
- }
15
- }
16
-
17
- interface VueRenderOptions {
18
- vue?: SSRContext;
19
- }
20
- declare const createVueRender: ({ onCreatedApp, }?: CreateVueRenderOptions) => _web_widget_helpers.ServerRender<Component, unknown, _web_widget_helpers.ServerRenderOptions, _web_widget_helpers.ServerRenderResult>;
21
- /**@deprecated Please use `createVueRender` instead.*/
22
- declare const defineVueRender: ({ onCreatedApp, }?: CreateVueRenderOptions) => _web_widget_helpers.ServerRender<Component, unknown, _web_widget_helpers.ServerRenderOptions, _web_widget_helpers.ServerRenderResult>;
23
- declare const render: _web_widget_helpers.ServerRender<Component, unknown, _web_widget_helpers.ServerRenderOptions, _web_widget_helpers.ServerRenderResult>;
24
-
25
- export { type VueRenderOptions, createVueRender, defineVueRender, render };
@@ -1,63 +0,0 @@
1
- import {
2
- asReactWidget,
3
- defineWebWidget,
4
- installErrorHandler,
5
- toReact
6
- } from "./chunk-GRYUSOXQ.js";
7
-
8
- // src/server.ts
9
- import { defineServerRender } from "@web-widget/helpers";
10
- import { createSSRApp, h, Suspense } from "vue";
11
- import {
12
- renderToString,
13
- renderToWebStream
14
- } from "vue/server-renderer";
15
- export * from "@web-widget/helpers";
16
- import { useWidgetAsyncState } from "@web-widget/helpers/state";
17
- var createWidgetSuspense = (component) => (props) => h(Suspense, null, [h(component, props)]);
18
- var createVueRender = ({
19
- onCreatedApp = async () => {
20
- }
21
- } = {}) => {
22
- return defineServerRender(
23
- async (component, data, { progressive, vue: options }) => {
24
- var _a;
25
- data = data != null ? data : {};
26
- if (!component) {
27
- throw new TypeError(`Missing component.`);
28
- }
29
- const ssrContext = Object.create(options != null ? options : null);
30
- let error;
31
- const context = { data, progressive };
32
- const WidgetSuspense = createWidgetSuspense(component);
33
- const app = createSSRApp(WidgetSuspense, data);
34
- installErrorHandler(app, (err) => {
35
- error = err;
36
- });
37
- await onCreatedApp(app, context, component, data);
38
- const html = progressive ? renderToWebStream(app, ssrContext) : await renderToString(app, ssrContext);
39
- if (ssrContext == null ? void 0 : ssrContext.teleports) {
40
- const file = (_a = Reflect.get(component, "__file")) != null ? _a : "unknown";
41
- throw new Error(
42
- `Teleports are not supported in SSR: ${JSON.stringify(ssrContext.teleports, null, 2)} in ${file}
43
- Do conditionally render Teleport when mounted on the client.`
44
- );
45
- }
46
- if (error) {
47
- throw error;
48
- }
49
- return html;
50
- }
51
- );
52
- };
53
- var defineVueRender = createVueRender;
54
- var render = createVueRender();
55
- export {
56
- asReactWidget,
57
- createVueRender,
58
- defineVueRender,
59
- defineWebWidget,
60
- render,
61
- toReact,
62
- useWidgetAsyncState as useWidgetState
63
- };