@stackable-labs/sdk-extension-react 1.21.0 → 1.22.1
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.
- package/dist/index.d.ts +493 -7
- package/dist/index.js +428 -7
- package/package.json +3 -2
- package/dist/Surface.d.ts +0 -24
- package/dist/Surface.js +0 -176
- package/dist/Surface.js.map +0 -1
- package/dist/context.d.ts +0 -10
- package/dist/context.js +0 -8
- package/dist/context.js.map +0 -1
- package/dist/createExtension.d.ts +0 -21
- package/dist/createExtension.js +0 -35
- package/dist/createExtension.js.map +0 -1
- package/dist/hooks.d.ts +0 -33
- package/dist/hooks.js +0 -52
- package/dist/hooks.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/rpc-client.d.ts +0 -12
- package/dist/rpc-client.js +0 -56
- package/dist/rpc-client.js.map +0 -1
- package/dist/store.d.ts +0 -20
- package/dist/store.js +0 -30
- package/dist/store.js.map +0 -1
- package/dist/ui.d.ts +0 -366
- package/dist/ui.js +0 -50
- package/dist/ui.js.map +0 -1
- package/dist/useContextData.d.ts +0 -9
- package/dist/useContextData.js +0 -27
- package/dist/useContextData.js.map +0 -1
package/dist/index.js
CHANGED
|
@@ -1,7 +1,428 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __export = (target, all) => {
|
|
3
|
+
for (var name in all)
|
|
4
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
5
|
+
};
|
|
6
|
+
|
|
7
|
+
// src/createExtension.tsx
|
|
8
|
+
import { createRoot } from "react-dom/client";
|
|
9
|
+
|
|
10
|
+
// src/context.ts
|
|
11
|
+
import { createContext } from "react";
|
|
12
|
+
var SurfaceContext = createContext(null);
|
|
13
|
+
var ExtensionContext = createContext(null);
|
|
14
|
+
|
|
15
|
+
// src/rpc-client.ts
|
|
16
|
+
import { WebCrypto } from "@agnostack/verifyd";
|
|
17
|
+
|
|
18
|
+
// ../../../lib/utils-js/src/crypto.ts
|
|
19
|
+
var importKeyForEncryption = (keyBase64) => {
|
|
20
|
+
const raw = Uint8Array.from(atob(keyBase64), (c) => c.charCodeAt(0));
|
|
21
|
+
return globalThis.crypto.subtle.importKey("raw", raw, { name: "AES-GCM" }, false, ["encrypt", "decrypt"]);
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
// src/rpc-client.ts
|
|
25
|
+
var _webCrypto = null;
|
|
26
|
+
var getWebCrypto = () => _webCrypto ??= new WebCrypto({ crypto: globalThis.crypto });
|
|
27
|
+
var requestCounter = 0;
|
|
28
|
+
var registeredExtensionId = "unknown";
|
|
29
|
+
var encryptionKey = null;
|
|
30
|
+
var pendingRequests = /* @__PURE__ */ new Map();
|
|
31
|
+
var generateRequestId = () => `req_${++requestCounter}_${Date.now()}`;
|
|
32
|
+
var setEncryptionKey = async (keyBase64) => {
|
|
33
|
+
encryptionKey = await importKeyForEncryption(keyBase64);
|
|
34
|
+
};
|
|
35
|
+
var initRpcListener = (extensionId) => {
|
|
36
|
+
registeredExtensionId = extensionId;
|
|
37
|
+
window.addEventListener("message", (event) => {
|
|
38
|
+
const msg = event.data;
|
|
39
|
+
if (msg?.type === "extension-encryption-key") {
|
|
40
|
+
setEncryptionKey(msg.encryptionKey);
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
if (msg?.type === "capability-response") {
|
|
44
|
+
const response = msg;
|
|
45
|
+
const pending = pendingRequests.get(response.id);
|
|
46
|
+
if (pending) {
|
|
47
|
+
pendingRequests.delete(response.id);
|
|
48
|
+
if (response.success) {
|
|
49
|
+
pending.resolve(response.data);
|
|
50
|
+
} else {
|
|
51
|
+
pending.reject(new Error(response.error || "Capability call failed"));
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
};
|
|
57
|
+
var isEncryptedPayload = (value) => typeof value === "object" && value !== null && value.encrypted === true && Array.isArray(value.data);
|
|
58
|
+
var callCapability = async (capability, payload) => {
|
|
59
|
+
let actualPayload = payload;
|
|
60
|
+
if (capability === "data.fetch" && encryptionKey) {
|
|
61
|
+
const encrypted = await getWebCrypto().encryptMessage(JSON.stringify(payload), encryptionKey);
|
|
62
|
+
if (!encrypted) throw new Error("Failed to encrypt data.fetch payload");
|
|
63
|
+
actualPayload = { encrypted: true, data: encrypted };
|
|
64
|
+
}
|
|
65
|
+
const result = await sendCapabilityRequest(capability, actualPayload);
|
|
66
|
+
if (capability === "data.fetch" && encryptionKey) {
|
|
67
|
+
const fetchResult = result;
|
|
68
|
+
if (isEncryptedPayload(fetchResult.data)) {
|
|
69
|
+
const decrypted = await getWebCrypto().decryptMessage(fetchResult.data.data, encryptionKey);
|
|
70
|
+
fetchResult.data = JSON.parse(decrypted);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return result;
|
|
74
|
+
};
|
|
75
|
+
var sendCapabilityRequest = (capability, payload) => new Promise((resolve, reject) => {
|
|
76
|
+
const id = generateRequestId();
|
|
77
|
+
pendingRequests.set(id, {
|
|
78
|
+
resolve,
|
|
79
|
+
reject
|
|
80
|
+
});
|
|
81
|
+
const request = {
|
|
82
|
+
type: "capability-request",
|
|
83
|
+
id,
|
|
84
|
+
extensionId: registeredExtensionId,
|
|
85
|
+
capability,
|
|
86
|
+
payload
|
|
87
|
+
};
|
|
88
|
+
window.parent.postMessage(request, "*");
|
|
89
|
+
setTimeout(() => {
|
|
90
|
+
if (pendingRequests.has(id)) {
|
|
91
|
+
pendingRequests.delete(id);
|
|
92
|
+
reject(new Error(`Capability call '${capability}' timed out`));
|
|
93
|
+
}
|
|
94
|
+
}, 3e4);
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
// src/createExtension.tsx
|
|
98
|
+
import { jsx } from "react/jsx-runtime";
|
|
99
|
+
var createExtension = (factory, options) => {
|
|
100
|
+
const injectedId = window.__STACKABLE_EXTENSION_ID__ ?? new URLSearchParams(window.location.search).get("__extensionId") ?? void 0;
|
|
101
|
+
const extensionId = injectedId ?? options?.extensionId ?? "unknown";
|
|
102
|
+
console.debug(`[createExtension] extensionId resolved: "${extensionId}" (injected: ${injectedId ?? "none"}, options: ${options?.extensionId ?? "none"})`);
|
|
103
|
+
initRpcListener(extensionId);
|
|
104
|
+
const contextValue = {
|
|
105
|
+
extensionId
|
|
106
|
+
};
|
|
107
|
+
const container = document.getElementById("extension-root") ?? document.body;
|
|
108
|
+
const root = createRoot(container);
|
|
109
|
+
root.render(
|
|
110
|
+
/* @__PURE__ */ jsx(ExtensionContext.Provider, { value: contextValue, children: factory() })
|
|
111
|
+
);
|
|
112
|
+
window.parent.postMessage({ type: "extension-ready", extensionId }, "*");
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
// src/store.ts
|
|
116
|
+
var createStore = (initialState) => {
|
|
117
|
+
let state = { ...initialState };
|
|
118
|
+
const listeners = /* @__PURE__ */ new Set();
|
|
119
|
+
return {
|
|
120
|
+
get: () => state,
|
|
121
|
+
set: (partial) => {
|
|
122
|
+
state = { ...state, ...partial };
|
|
123
|
+
listeners.forEach((listener) => listener(state));
|
|
124
|
+
},
|
|
125
|
+
subscribe: (listener) => {
|
|
126
|
+
listeners.add(listener);
|
|
127
|
+
return () => {
|
|
128
|
+
listeners.delete(listener);
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
};
|
|
132
|
+
};
|
|
133
|
+
|
|
134
|
+
// src/hooks.ts
|
|
135
|
+
import { useContext, useSyncExternalStore, useCallback } from "react";
|
|
136
|
+
var useSurfaceContext = () => {
|
|
137
|
+
const ctx = useContext(SurfaceContext);
|
|
138
|
+
if (!ctx) {
|
|
139
|
+
throw new Error("useSurfaceContext must be used inside a <Surface> component");
|
|
140
|
+
}
|
|
141
|
+
return ctx;
|
|
142
|
+
};
|
|
143
|
+
var useCapabilities = () => ({
|
|
144
|
+
data: {
|
|
145
|
+
query: (payload) => callCapability("data.query", payload),
|
|
146
|
+
fetch: (url, init) => callCapability("data.fetch", { url, ...init })
|
|
147
|
+
},
|
|
148
|
+
actions: {
|
|
149
|
+
toast: (payload) => callCapability("actions.toast", payload),
|
|
150
|
+
invoke: (action, payload) => callCapability("actions.invoke", { action, payload })
|
|
151
|
+
},
|
|
152
|
+
context: {
|
|
153
|
+
read: () => callCapability("context.read")
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
var useStore = (store, selector) => {
|
|
157
|
+
const select = selector ?? ((s) => s);
|
|
158
|
+
const getSnapshot = useCallback(() => select(store.get()), [store, select]);
|
|
159
|
+
const subscribe = useCallback(
|
|
160
|
+
(onStoreChange) => store.subscribe(onStoreChange),
|
|
161
|
+
[store]
|
|
162
|
+
);
|
|
163
|
+
return useSyncExternalStore(subscribe, getSnapshot, getSnapshot);
|
|
164
|
+
};
|
|
165
|
+
var useExtension = () => {
|
|
166
|
+
const ctx = useContext(ExtensionContext);
|
|
167
|
+
if (!ctx) {
|
|
168
|
+
throw new Error("useExtension must be used inside a createExtension() tree");
|
|
169
|
+
}
|
|
170
|
+
return ctx;
|
|
171
|
+
};
|
|
172
|
+
|
|
173
|
+
// src/Surface.tsx
|
|
174
|
+
import React, { useEffect, useRef, useState, useCallback as useCallback2 } from "react";
|
|
175
|
+
import { jsx as jsx2 } from "react/jsx-runtime";
|
|
176
|
+
var useExtensionId = () => {
|
|
177
|
+
const ctx = React.useContext(ExtensionContext);
|
|
178
|
+
return ctx?.extensionId ?? "unknown";
|
|
179
|
+
};
|
|
180
|
+
var surfaceHandlers = /* @__PURE__ */ new Map();
|
|
181
|
+
var getSurfaceRegistry = (surfaceId) => {
|
|
182
|
+
let reg = surfaceHandlers.get(surfaceId);
|
|
183
|
+
if (!reg) {
|
|
184
|
+
reg = { handlers: /* @__PURE__ */ new Map(), counter: 0 };
|
|
185
|
+
surfaceHandlers.set(surfaceId, reg);
|
|
186
|
+
}
|
|
187
|
+
return reg;
|
|
188
|
+
};
|
|
189
|
+
var serializeDOMNode = (domNode, registry) => {
|
|
190
|
+
if (domNode.nodeType === Node.TEXT_NODE) {
|
|
191
|
+
const text = domNode.textContent || "";
|
|
192
|
+
if (!text.trim()) return [];
|
|
193
|
+
return [{ type: "text", text }];
|
|
194
|
+
}
|
|
195
|
+
if (domNode.nodeType !== Node.ELEMENT_NODE) return [];
|
|
196
|
+
const el = domNode;
|
|
197
|
+
const tag = el.tagName.toLowerCase();
|
|
198
|
+
if (tag === "div" && el.hasAttribute("data-surface-id")) {
|
|
199
|
+
return Array.from(el.childNodes).flatMap((child) => serializeDOMNode(child, registry));
|
|
200
|
+
}
|
|
201
|
+
const attrs = {};
|
|
202
|
+
let actionId;
|
|
203
|
+
const propsKey = Object.keys(el).find((k) => k.startsWith("__reactProps$"));
|
|
204
|
+
if (propsKey) {
|
|
205
|
+
const reactProps = el[propsKey];
|
|
206
|
+
if (reactProps) {
|
|
207
|
+
for (const [key, value] of Object.entries(reactProps)) {
|
|
208
|
+
if (key === "children") continue;
|
|
209
|
+
if ((key === "onClick" || key === "onChange") && typeof value === "function") {
|
|
210
|
+
const id = `action-${++registry.counter}`;
|
|
211
|
+
registry.handlers.set(id, value);
|
|
212
|
+
if (key === "onClick") actionId = id;
|
|
213
|
+
if (key === "onChange") attrs["data-onchange-id"] = id;
|
|
214
|
+
continue;
|
|
215
|
+
}
|
|
216
|
+
if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") {
|
|
217
|
+
attrs[key] = String(value);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
} else {
|
|
222
|
+
for (const attr of Array.from(el.attributes)) {
|
|
223
|
+
if (attr.name === "style") continue;
|
|
224
|
+
const name = attr.name === "class" ? "className" : attr.name;
|
|
225
|
+
attrs[name] = attr.value;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
const children = Array.from(el.childNodes).flatMap((child) => serializeDOMNode(child, registry));
|
|
229
|
+
return [{ type: "element", tag, attrs, actionId, children }];
|
|
230
|
+
};
|
|
231
|
+
var Surface = ({ id, children }) => {
|
|
232
|
+
const extId = useExtensionId();
|
|
233
|
+
const [context, setContext] = useState({});
|
|
234
|
+
const prevTreeRef = useRef("");
|
|
235
|
+
const containerRef = useRef(null);
|
|
236
|
+
const serializeAndSend = useCallback2(() => {
|
|
237
|
+
const container = containerRef.current;
|
|
238
|
+
if (!container) return;
|
|
239
|
+
const registry = getSurfaceRegistry(id);
|
|
240
|
+
registry.handlers.clear();
|
|
241
|
+
registry.counter = 0;
|
|
242
|
+
const serialized = serializeDOMNode(container, registry);
|
|
243
|
+
const tree = {
|
|
244
|
+
type: "element",
|
|
245
|
+
tag: "__fragment",
|
|
246
|
+
children: serialized
|
|
247
|
+
};
|
|
248
|
+
const treeForComparison = JSON.stringify(tree, (key, value) => key === "actionId" || key === "data-onchange-id" ? void 0 : value);
|
|
249
|
+
if (treeForComparison === prevTreeRef.current) return;
|
|
250
|
+
prevTreeRef.current = treeForComparison;
|
|
251
|
+
window.parent.postMessage(
|
|
252
|
+
{ type: "surface-update", surfaceId: id, tree },
|
|
253
|
+
"*"
|
|
254
|
+
);
|
|
255
|
+
}, [id]);
|
|
256
|
+
useEffect(() => {
|
|
257
|
+
serializeAndSend();
|
|
258
|
+
});
|
|
259
|
+
useEffect(() => {
|
|
260
|
+
const container = containerRef.current;
|
|
261
|
+
if (!container) return;
|
|
262
|
+
const observer = new MutationObserver(() => {
|
|
263
|
+
serializeAndSend();
|
|
264
|
+
});
|
|
265
|
+
observer.observe(container, {
|
|
266
|
+
childList: true,
|
|
267
|
+
subtree: true,
|
|
268
|
+
attributes: true,
|
|
269
|
+
characterData: true
|
|
270
|
+
});
|
|
271
|
+
return () => observer.disconnect();
|
|
272
|
+
}, [serializeAndSend]);
|
|
273
|
+
useEffect(() => {
|
|
274
|
+
const handleMessage = (event) => {
|
|
275
|
+
const msg = event.data;
|
|
276
|
+
if (!msg || typeof msg !== "object") return;
|
|
277
|
+
if (msg.type === "context-update" && msg.surfaceId === id) {
|
|
278
|
+
setContext(msg.context);
|
|
279
|
+
}
|
|
280
|
+
if (msg.type === "surface-render" && msg.surfaceId === id) {
|
|
281
|
+
if (msg.context) {
|
|
282
|
+
setContext(msg.context);
|
|
283
|
+
}
|
|
284
|
+
prevTreeRef.current = "";
|
|
285
|
+
serializeAndSend();
|
|
286
|
+
}
|
|
287
|
+
if (msg.type === "action-invoke" && msg.surfaceId === id && msg.actionId) {
|
|
288
|
+
const registry = getSurfaceRegistry(id);
|
|
289
|
+
const handler = registry.handlers.get(msg.actionId);
|
|
290
|
+
if (handler) {
|
|
291
|
+
if (msg.value !== void 0) {
|
|
292
|
+
handler({ target: { value: msg.value } });
|
|
293
|
+
} else {
|
|
294
|
+
handler();
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
};
|
|
299
|
+
window.addEventListener("message", handleMessage);
|
|
300
|
+
window.parent.postMessage({ type: "surface-ready", extensionId: extId, surfaceId: id }, "*");
|
|
301
|
+
return () => {
|
|
302
|
+
window.removeEventListener("message", handleMessage);
|
|
303
|
+
};
|
|
304
|
+
}, [id, extId, serializeAndSend]);
|
|
305
|
+
return /* @__PURE__ */ jsx2(SurfaceContext.Provider, { value: context, children: /* @__PURE__ */ jsx2("div", { ref: containerRef, "data-surface-id": id, style: { display: "none" }, children }) });
|
|
306
|
+
};
|
|
307
|
+
|
|
308
|
+
// src/ui.tsx
|
|
309
|
+
var ui_exports = {};
|
|
310
|
+
__export(ui_exports, {
|
|
311
|
+
Alert: () => Alert,
|
|
312
|
+
Avatar: () => Avatar,
|
|
313
|
+
Badge: () => Badge,
|
|
314
|
+
Button: () => Button,
|
|
315
|
+
Card: () => Card,
|
|
316
|
+
CardContent: () => CardContent,
|
|
317
|
+
CardHeader: () => CardHeader,
|
|
318
|
+
Checkbox: () => Checkbox,
|
|
319
|
+
Collapsible: () => Collapsible,
|
|
320
|
+
CollapsibleContent: () => CollapsibleContent,
|
|
321
|
+
CollapsibleTrigger: () => CollapsibleTrigger,
|
|
322
|
+
FooterLink: () => FooterLink,
|
|
323
|
+
Heading: () => Heading,
|
|
324
|
+
Icon: () => Icon,
|
|
325
|
+
Inline: () => Inline,
|
|
326
|
+
Input: () => Input,
|
|
327
|
+
Label: () => Label,
|
|
328
|
+
Link: () => Link,
|
|
329
|
+
Menu: () => Menu,
|
|
330
|
+
MenuItem: () => MenuItem,
|
|
331
|
+
Progress: () => Progress,
|
|
332
|
+
RadioGroup: () => RadioGroup,
|
|
333
|
+
RadioGroupItem: () => RadioGroupItem,
|
|
334
|
+
ScrollArea: () => ScrollArea,
|
|
335
|
+
Select: () => Select,
|
|
336
|
+
SelectOption: () => SelectOption,
|
|
337
|
+
Separator: () => Separator,
|
|
338
|
+
Skeleton: () => Skeleton,
|
|
339
|
+
Stack: () => Stack,
|
|
340
|
+
Switch: () => Switch,
|
|
341
|
+
Tabs: () => Tabs,
|
|
342
|
+
TabsContent: () => TabsContent,
|
|
343
|
+
TabsList: () => TabsList,
|
|
344
|
+
TabsTrigger: () => TabsTrigger,
|
|
345
|
+
Text: () => Text,
|
|
346
|
+
Textarea: () => Textarea,
|
|
347
|
+
Tooltip: () => Tooltip
|
|
348
|
+
});
|
|
349
|
+
import { jsx as jsx3 } from "react/jsx-runtime";
|
|
350
|
+
var Card = (props) => /* @__PURE__ */ jsx3("ui-card", { ...props, children: props.children });
|
|
351
|
+
var CardContent = (props) => /* @__PURE__ */ jsx3("ui-card-content", { ...props, children: props.children });
|
|
352
|
+
var CardHeader = (props) => /* @__PURE__ */ jsx3("ui-card-header", { ...props, children: props.children });
|
|
353
|
+
var Stack = (props) => /* @__PURE__ */ jsx3("ui-stack", { ...props, children: props.children });
|
|
354
|
+
var Inline = (props) => /* @__PURE__ */ jsx3("ui-inline", { ...props, children: props.children });
|
|
355
|
+
var Text = (props) => /* @__PURE__ */ jsx3("ui-text", { ...props, children: props.children });
|
|
356
|
+
var Heading = (props) => /* @__PURE__ */ jsx3("ui-heading", { ...props, children: props.children });
|
|
357
|
+
var Badge = (props) => /* @__PURE__ */ jsx3("ui-badge", { ...props, children: props.children });
|
|
358
|
+
var Button = (props) => /* @__PURE__ */ jsx3("ui-button", { ...props, children: props.children });
|
|
359
|
+
var Input = (props) => /* @__PURE__ */ jsx3("ui-input", { ...props });
|
|
360
|
+
var Textarea = (props) => /* @__PURE__ */ jsx3("ui-textarea", { ...props });
|
|
361
|
+
var Select = (props) => /* @__PURE__ */ jsx3("ui-select", { ...props, children: props.children });
|
|
362
|
+
var SelectOption = (props) => /* @__PURE__ */ jsx3("ui-select-option", { ...props, children: props.children });
|
|
363
|
+
var Checkbox = (props) => /* @__PURE__ */ jsx3("ui-checkbox", { ...props });
|
|
364
|
+
var Switch = (props) => /* @__PURE__ */ jsx3("ui-switch", { ...props });
|
|
365
|
+
var Label = (props) => /* @__PURE__ */ jsx3("ui-label", { ...props, children: props.children });
|
|
366
|
+
var RadioGroup = (props) => /* @__PURE__ */ jsx3("ui-radio-group", { ...props, children: props.children });
|
|
367
|
+
var RadioGroupItem = (props) => /* @__PURE__ */ jsx3("ui-radio-group-item", { ...props });
|
|
368
|
+
var Separator = (props) => /* @__PURE__ */ jsx3("ui-separator", { ...props });
|
|
369
|
+
var Tabs = (props) => /* @__PURE__ */ jsx3("ui-tabs", { ...props, children: props.children });
|
|
370
|
+
var TabsList = (props) => /* @__PURE__ */ jsx3("ui-tabs-list", { ...props, children: props.children });
|
|
371
|
+
var TabsTrigger = (props) => /* @__PURE__ */ jsx3("ui-tabs-trigger", { ...props, children: props.children });
|
|
372
|
+
var TabsContent = (props) => /* @__PURE__ */ jsx3("ui-tabs-content", { ...props, children: props.children });
|
|
373
|
+
var ScrollArea = (props) => /* @__PURE__ */ jsx3("ui-scroll-area", { ...props, children: props.children });
|
|
374
|
+
var Skeleton = (props) => /* @__PURE__ */ jsx3("ui-skeleton", { ...props });
|
|
375
|
+
var Tooltip = (props) => /* @__PURE__ */ jsx3("ui-tooltip", { ...props, children: props.children });
|
|
376
|
+
var Progress = (props) => /* @__PURE__ */ jsx3("ui-progress", { ...props });
|
|
377
|
+
var Alert = (props) => /* @__PURE__ */ jsx3("ui-alert", { ...props, children: props.children });
|
|
378
|
+
var Collapsible = (props) => /* @__PURE__ */ jsx3("ui-collapsible", { ...props, children: props.children });
|
|
379
|
+
var CollapsibleTrigger = (props) => /* @__PURE__ */ jsx3("ui-collapsible-trigger", { ...props, children: props.children });
|
|
380
|
+
var CollapsibleContent = (props) => /* @__PURE__ */ jsx3("ui-collapsible-content", { ...props, children: props.children });
|
|
381
|
+
var Avatar = (props) => /* @__PURE__ */ jsx3("ui-avatar", { ...props });
|
|
382
|
+
var Icon = (props) => /* @__PURE__ */ jsx3("ui-icon", { ...props });
|
|
383
|
+
var Link = (props) => /* @__PURE__ */ jsx3("ui-link", { ...props, children: props.children });
|
|
384
|
+
var FooterLink = (props) => /* @__PURE__ */ jsx3(
|
|
385
|
+
"ui-link",
|
|
386
|
+
{
|
|
387
|
+
...props,
|
|
388
|
+
target: "_blank",
|
|
389
|
+
rel: "noopener noreferrer",
|
|
390
|
+
className: "text-zinc-500 opacity-80 transition-colors hover:text-zinc-900 hover:opacity-100",
|
|
391
|
+
children: props.children
|
|
392
|
+
}
|
|
393
|
+
);
|
|
394
|
+
var Menu = (props) => /* @__PURE__ */ jsx3("ui-menu", { ...props, children: props.children });
|
|
395
|
+
var MenuItem = (props) => /* @__PURE__ */ jsx3("ui-menu-item", { ...props });
|
|
396
|
+
|
|
397
|
+
// src/useContextData.ts
|
|
398
|
+
import { useState as useState2, useEffect as useEffect2 } from "react";
|
|
399
|
+
var useContextData = () => {
|
|
400
|
+
const capabilities = useCapabilities();
|
|
401
|
+
const [contextData, setContextData] = useState2({});
|
|
402
|
+
const [loading, setLoading] = useState2(true);
|
|
403
|
+
useEffect2(() => {
|
|
404
|
+
const loadContext = async () => {
|
|
405
|
+
try {
|
|
406
|
+
const ctx = await capabilities.context.read();
|
|
407
|
+
setContextData(ctx);
|
|
408
|
+
} catch (err) {
|
|
409
|
+
console.error("Failed to read context:", err);
|
|
410
|
+
} finally {
|
|
411
|
+
setLoading(false);
|
|
412
|
+
}
|
|
413
|
+
};
|
|
414
|
+
loadContext();
|
|
415
|
+
}, []);
|
|
416
|
+
return { ...contextData, loading };
|
|
417
|
+
};
|
|
418
|
+
export {
|
|
419
|
+
Surface,
|
|
420
|
+
createExtension,
|
|
421
|
+
createStore,
|
|
422
|
+
ui_exports as ui,
|
|
423
|
+
useCapabilities,
|
|
424
|
+
useContextData,
|
|
425
|
+
useExtension,
|
|
426
|
+
useStore,
|
|
427
|
+
useSurfaceContext
|
|
428
|
+
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stackable-labs/sdk-extension-react",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.22.1",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -12,7 +12,8 @@
|
|
|
12
12
|
}
|
|
13
13
|
},
|
|
14
14
|
"dependencies": {
|
|
15
|
-
"@
|
|
15
|
+
"@agnostack/verifyd": "2.x",
|
|
16
|
+
"@stackable-labs/sdk-extension-contracts": "1.22.1",
|
|
16
17
|
"@remote-dom/core": "1.x",
|
|
17
18
|
"@remote-dom/react": "1.x"
|
|
18
19
|
},
|
package/dist/Surface.d.ts
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Surface component — represents a single UI surface within an extension.
|
|
3
|
-
* Each Surface maps to an extension point (target) in the host app.
|
|
4
|
-
*
|
|
5
|
-
* Serializes the React element tree (including event handler references) and
|
|
6
|
-
* sends it to the host via postMessage. The host renders using its component
|
|
7
|
-
* registry and proxies user interactions back via postMessage.
|
|
8
|
-
*/
|
|
9
|
-
import React from 'react';
|
|
10
|
-
interface SurfaceProps {
|
|
11
|
-
/** The extension point target ID (e.g., "slot.header") */
|
|
12
|
-
id: string;
|
|
13
|
-
children: React.ReactNode;
|
|
14
|
-
}
|
|
15
|
-
export interface SerializedNode {
|
|
16
|
-
type: 'element' | 'text';
|
|
17
|
-
tag?: string;
|
|
18
|
-
attrs?: Record<string, string>;
|
|
19
|
-
actionId?: string;
|
|
20
|
-
children?: SerializedNode[];
|
|
21
|
-
text?: string;
|
|
22
|
-
}
|
|
23
|
-
export declare const Surface: ({ id, children }: SurfaceProps) => import("react/jsx-runtime").JSX.Element;
|
|
24
|
-
export {};
|
package/dist/Surface.js
DELETED
|
@@ -1,176 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
/**
|
|
3
|
-
* Surface component — represents a single UI surface within an extension.
|
|
4
|
-
* Each Surface maps to an extension point (target) in the host app.
|
|
5
|
-
*
|
|
6
|
-
* Serializes the React element tree (including event handler references) and
|
|
7
|
-
* sends it to the host via postMessage. The host renders using its component
|
|
8
|
-
* registry and proxies user interactions back via postMessage.
|
|
9
|
-
*/
|
|
10
|
-
import React, { useEffect, useRef, useState, useCallback } from 'react';
|
|
11
|
-
import { SurfaceContext, ExtensionContext } from './context';
|
|
12
|
-
const useExtensionId = () => {
|
|
13
|
-
const ctx = React.useContext(ExtensionContext);
|
|
14
|
-
return ctx?.extensionId ?? 'unknown';
|
|
15
|
-
};
|
|
16
|
-
/**
|
|
17
|
-
* Per-surface action handler registry.
|
|
18
|
-
* Each Surface instance gets its own map keyed by surfaceId so they don't collide.
|
|
19
|
-
*/
|
|
20
|
-
const surfaceHandlers = new Map();
|
|
21
|
-
const getSurfaceRegistry = (surfaceId) => {
|
|
22
|
-
let reg = surfaceHandlers.get(surfaceId);
|
|
23
|
-
if (!reg) {
|
|
24
|
-
reg = { handlers: new Map(), counter: 0 };
|
|
25
|
-
surfaceHandlers.set(surfaceId, reg);
|
|
26
|
-
}
|
|
27
|
-
return reg;
|
|
28
|
-
};
|
|
29
|
-
/**
|
|
30
|
-
* Serialize the rendered DOM tree from the hidden container.
|
|
31
|
-
* This approach works with hook-based child components because React has
|
|
32
|
-
* already rendered them into actual DOM elements by the time we traverse.
|
|
33
|
-
*/
|
|
34
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
35
|
-
const serializeDOMNode = (domNode, registry) => {
|
|
36
|
-
if (domNode.nodeType === Node.TEXT_NODE) {
|
|
37
|
-
const text = domNode.textContent || '';
|
|
38
|
-
if (!text.trim())
|
|
39
|
-
return [];
|
|
40
|
-
return [{ type: 'text', text }];
|
|
41
|
-
}
|
|
42
|
-
if (domNode.nodeType !== Node.ELEMENT_NODE)
|
|
43
|
-
return [];
|
|
44
|
-
const el = domNode;
|
|
45
|
-
const tag = el.tagName.toLowerCase();
|
|
46
|
-
// Skip the container div
|
|
47
|
-
if (tag === 'div' && el.hasAttribute('data-surface-id')) {
|
|
48
|
-
return Array.from(el.childNodes).flatMap((child) => serializeDOMNode(child, registry));
|
|
49
|
-
}
|
|
50
|
-
const attrs = {};
|
|
51
|
-
let actionId;
|
|
52
|
-
// Extract props from React's internal __reactProps$ to preserve original
|
|
53
|
-
// prop names (e.g. className instead of class) and custom element props
|
|
54
|
-
// (e.g. variant, gap, direction) that may not appear as DOM attributes.
|
|
55
|
-
const propsKey = Object.keys(el).find((k) => k.startsWith('__reactProps$'));
|
|
56
|
-
if (propsKey) {
|
|
57
|
-
const reactProps = el[propsKey];
|
|
58
|
-
if (reactProps) {
|
|
59
|
-
for (const [key, value] of Object.entries(reactProps)) {
|
|
60
|
-
if (key === 'children')
|
|
61
|
-
continue;
|
|
62
|
-
if ((key === 'onClick' || key === 'onChange') && typeof value === 'function') {
|
|
63
|
-
const id = `action-${++registry.counter}`;
|
|
64
|
-
registry.handlers.set(id, value);
|
|
65
|
-
if (key === 'onClick')
|
|
66
|
-
actionId = id;
|
|
67
|
-
if (key === 'onChange')
|
|
68
|
-
attrs['data-onchange-id'] = id;
|
|
69
|
-
continue;
|
|
70
|
-
}
|
|
71
|
-
if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {
|
|
72
|
-
attrs[key] = String(value);
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
else {
|
|
78
|
-
// Fallback: copy DOM attributes if React props are unavailable
|
|
79
|
-
for (const attr of Array.from(el.attributes)) {
|
|
80
|
-
if (attr.name === 'style')
|
|
81
|
-
continue;
|
|
82
|
-
// Map 'class' back to 'className' for host components
|
|
83
|
-
const name = attr.name === 'class' ? 'className' : attr.name;
|
|
84
|
-
attrs[name] = attr.value;
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
const children = Array.from(el.childNodes).flatMap((child) => serializeDOMNode(child, registry));
|
|
88
|
-
return [{ type: 'element', tag, attrs, actionId, children }];
|
|
89
|
-
};
|
|
90
|
-
export const Surface = ({ id, children }) => {
|
|
91
|
-
const extId = useExtensionId();
|
|
92
|
-
const [context, setContext] = useState({});
|
|
93
|
-
const prevTreeRef = useRef('');
|
|
94
|
-
const containerRef = useRef(null);
|
|
95
|
-
const serializeAndSend = useCallback(() => {
|
|
96
|
-
const container = containerRef.current;
|
|
97
|
-
if (!container)
|
|
98
|
-
return;
|
|
99
|
-
const registry = getSurfaceRegistry(id);
|
|
100
|
-
// Clear previous handlers for THIS surface only
|
|
101
|
-
registry.handlers.clear();
|
|
102
|
-
registry.counter = 0;
|
|
103
|
-
const serialized = serializeDOMNode(container, registry);
|
|
104
|
-
const tree = {
|
|
105
|
-
type: 'element',
|
|
106
|
-
tag: '__fragment',
|
|
107
|
-
children: serialized,
|
|
108
|
-
};
|
|
109
|
-
// Only send if tree structure actually changed (ignore action ID changes)
|
|
110
|
-
const treeForComparison = JSON.stringify(tree, (key, value) => key === 'actionId' || key === 'data-onchange-id' ? undefined : value);
|
|
111
|
-
if (treeForComparison === prevTreeRef.current)
|
|
112
|
-
return;
|
|
113
|
-
prevTreeRef.current = treeForComparison;
|
|
114
|
-
window.parent.postMessage({ type: 'surface-update', surfaceId: id, tree }, '*');
|
|
115
|
-
}, [id]);
|
|
116
|
-
// Serialize after every Surface render
|
|
117
|
-
useEffect(() => {
|
|
118
|
-
serializeAndSend();
|
|
119
|
-
});
|
|
120
|
-
// Watch for DOM mutations from child component state changes
|
|
121
|
-
// (children may re-render without Surface itself re-rendering)
|
|
122
|
-
useEffect(() => {
|
|
123
|
-
const container = containerRef.current;
|
|
124
|
-
if (!container)
|
|
125
|
-
return;
|
|
126
|
-
const observer = new MutationObserver(() => {
|
|
127
|
-
serializeAndSend();
|
|
128
|
-
});
|
|
129
|
-
observer.observe(container, {
|
|
130
|
-
childList: true,
|
|
131
|
-
subtree: true,
|
|
132
|
-
attributes: true,
|
|
133
|
-
characterData: true,
|
|
134
|
-
});
|
|
135
|
-
return () => observer.disconnect();
|
|
136
|
-
}, [serializeAndSend]);
|
|
137
|
-
useEffect(() => {
|
|
138
|
-
// Listen for context updates and action invocations from host
|
|
139
|
-
const handleMessage = (event) => {
|
|
140
|
-
const msg = event.data;
|
|
141
|
-
if (!msg || typeof msg !== 'object')
|
|
142
|
-
return;
|
|
143
|
-
if (msg.type === 'context-update' && msg.surfaceId === id) {
|
|
144
|
-
setContext(msg.context);
|
|
145
|
-
}
|
|
146
|
-
if (msg.type === 'surface-render' && msg.surfaceId === id) {
|
|
147
|
-
// Host slot mounted late — re-send current tree
|
|
148
|
-
if (msg.context) {
|
|
149
|
-
setContext(msg.context);
|
|
150
|
-
}
|
|
151
|
-
prevTreeRef.current = '';
|
|
152
|
-
serializeAndSend();
|
|
153
|
-
}
|
|
154
|
-
if (msg.type === 'action-invoke' && msg.surfaceId === id && msg.actionId) {
|
|
155
|
-
const registry = getSurfaceRegistry(id);
|
|
156
|
-
const handler = registry.handlers.get(msg.actionId);
|
|
157
|
-
if (handler) {
|
|
158
|
-
if (msg.value !== undefined) {
|
|
159
|
-
handler({ target: { value: msg.value } });
|
|
160
|
-
}
|
|
161
|
-
else {
|
|
162
|
-
handler();
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
};
|
|
167
|
-
window.addEventListener('message', handleMessage);
|
|
168
|
-
// Notify host that this surface is ready
|
|
169
|
-
window.parent.postMessage({ type: 'surface-ready', extensionId: extId, surfaceId: id }, '*');
|
|
170
|
-
return () => {
|
|
171
|
-
window.removeEventListener('message', handleMessage);
|
|
172
|
-
};
|
|
173
|
-
}, [id, extId, serializeAndSend]);
|
|
174
|
-
return (_jsx(SurfaceContext.Provider, { value: context, children: _jsx("div", { ref: containerRef, "data-surface-id": id, style: { display: 'none' }, children: children }) }));
|
|
175
|
-
};
|
|
176
|
-
//# sourceMappingURL=Surface.js.map
|
package/dist/Surface.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Surface.js","sourceRoot":"","sources":["../src/Surface.tsx"],"names":[],"mappings":"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"}
|
package/dist/context.d.ts
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* React contexts for the extension runtime.
|
|
3
|
-
*/
|
|
4
|
-
/** Context for surface-level data (provided by host per surface) */
|
|
5
|
-
export declare const SurfaceContext: import("react").Context<Record<string, unknown> | null>;
|
|
6
|
-
/** Context for extension-level data (provided by createExtension) */
|
|
7
|
-
export interface ExtensionContextValue {
|
|
8
|
-
extensionId: string;
|
|
9
|
-
}
|
|
10
|
-
export declare const ExtensionContext: import("react").Context<ExtensionContextValue | null>;
|