@iota-uz/sdk 0.4.20 → 0.4.22

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.
Files changed (40) hide show
  1. package/README.md +20 -0
  2. package/dist/applet/core.cjs +8 -4
  3. package/dist/applet/core.cjs.map +1 -1
  4. package/dist/applet/core.mjs +8 -4
  5. package/dist/applet/core.mjs.map +1 -1
  6. package/dist/applet/devtools.cjs +24 -8
  7. package/dist/applet/devtools.cjs.map +1 -1
  8. package/dist/applet/devtools.mjs +24 -8
  9. package/dist/applet/devtools.mjs.map +1 -1
  10. package/dist/applet/host.cjs +47 -16
  11. package/dist/applet/host.cjs.map +1 -1
  12. package/dist/applet/host.mjs +47 -16
  13. package/dist/applet/host.mjs.map +1 -1
  14. package/dist/applet/vite.cjs +12 -4
  15. package/dist/applet/vite.cjs.map +1 -1
  16. package/dist/applet/vite.mjs +12 -4
  17. package/dist/applet/vite.mjs.map +1 -1
  18. package/dist/applet-runtime/index.cjs.map +1 -1
  19. package/dist/applet-runtime/index.mjs.map +1 -1
  20. package/dist/bichat/index.cjs +6971 -2646
  21. package/dist/bichat/index.cjs.map +1 -1
  22. package/dist/bichat/index.css +11 -1
  23. package/dist/bichat/index.css.map +1 -1
  24. package/dist/bichat/index.d.cts +453 -157
  25. package/dist/bichat/index.d.ts +453 -157
  26. package/dist/bichat/index.mjs +6969 -2652
  27. package/dist/bichat/index.mjs.map +1 -1
  28. package/dist/bichat/styles.css +17 -4
  29. package/dist/bichat/tailwind.cjs.map +1 -1
  30. package/dist/bichat/tailwind.mjs.map +1 -1
  31. package/dist/index.cjs +73 -26
  32. package/dist/index.cjs.map +1 -1
  33. package/dist/index.mjs +73 -26
  34. package/dist/index.mjs.map +1 -1
  35. package/package.json +10 -3
  36. package/tailwind/compiled.css +1 -1
  37. package/tailwind/create-config.cjs +50 -2
  38. package/tailwind/iota.css +6 -6
  39. package/tailwind/sdk-content.cjs +177 -0
  40. package/tailwind/sdk-theme.cjs +12 -0
@@ -10,10 +10,14 @@ function defineReactAppletElement(options) {
10
10
  const existing = registry.get(tagName);
11
11
  if (existing) {
12
12
  existing.options = options;
13
- for (const a of options.observedAttributes ?? []) existing.observed.add(a);
13
+ for (const a of options.observedAttributes ?? []) {
14
+ existing.observed.add(a);
15
+ }
14
16
  } else {
15
17
  const observed = /* @__PURE__ */ new Set(["base-path", "shell-mode", "router-mode"]);
16
- for (const a of options.observedAttributes ?? []) observed.add(a);
18
+ for (const a of options.observedAttributes ?? []) {
19
+ observed.add(a);
20
+ }
17
21
  registry.set(tagName, { options, observed });
18
22
  }
19
23
  if (customElements.get(tagName)) {
@@ -24,7 +28,9 @@ function defineReactAppletElement(options) {
24
28
  }
25
29
  function getEntry() {
26
30
  const entry = getRegistry().get(tagName);
27
- if (!entry) throw new Error(`[${tagName}] applet host registry entry missing`);
31
+ if (!entry) {
32
+ throw new Error(`[${tagName}] applet host registry entry missing`);
33
+ }
28
34
  return entry;
29
35
  }
30
36
  class ReactAppletElement extends HTMLElement {
@@ -53,16 +59,22 @@ function defineReactAppletElement(options) {
53
59
  }
54
60
  const existingContainer = shadowRoot.querySelector("#react-root");
55
61
  if (!existingContainer) {
56
- if (this.styleEl) shadowRoot.appendChild(this.styleEl);
62
+ if (this.styleEl) {
63
+ shadowRoot.appendChild(this.styleEl);
64
+ }
57
65
  shadowRoot.appendChild(this.container);
58
66
  } else if (existingContainer !== this.container) {
59
67
  this.container = existingContainer;
60
68
  }
61
69
  this.syncFromRegistry();
62
70
  this.updateListener ?? (this.updateListener = (e) => {
63
- if (!(e instanceof CustomEvent)) return;
71
+ if (!(e instanceof CustomEvent)) {
72
+ return;
73
+ }
64
74
  const detail = e.detail;
65
- if (!detail || detail.tagName !== tagName) return;
75
+ if (!detail || detail.tagName !== tagName) {
76
+ return;
77
+ }
66
78
  this.syncFromRegistry();
67
79
  this.renderReact();
68
80
  });
@@ -79,8 +91,12 @@ function defineReactAppletElement(options) {
79
91
  this.reactRoot = null;
80
92
  }
81
93
  attributeChangedCallback(_name, oldValue, newValue) {
82
- if (oldValue === newValue) return;
83
- if (this.container) this.renderReact();
94
+ if (oldValue === newValue) {
95
+ return;
96
+ }
97
+ if (this.container) {
98
+ this.renderReact();
99
+ }
84
100
  }
85
101
  getHostConfig() {
86
102
  const attrs = {};
@@ -93,7 +109,9 @@ function defineReactAppletElement(options) {
93
109
  return { basePath, shellMode, routerMode, attrs };
94
110
  }
95
111
  renderReact() {
96
- if (!this.container) return;
112
+ if (!this.container) {
113
+ return;
114
+ }
97
115
  if (!this.reactRoot) {
98
116
  this.reactRoot = client.createRoot(this.container);
99
117
  }
@@ -125,10 +143,15 @@ function defineReactAppletElement(options) {
125
143
  }
126
144
  syncDarkMode() {
127
145
  const root = this.container;
128
- if (!root) throw new Error("react root container not found");
146
+ if (!root) {
147
+ throw new Error("react root container not found");
148
+ }
129
149
  const apply = () => {
130
- if (document.documentElement.classList.contains("dark")) root.classList.add("dark");
131
- else root.classList.remove("dark");
150
+ if (document.documentElement.classList.contains("dark")) {
151
+ root.classList.add("dark");
152
+ } else {
153
+ root.classList.remove("dark");
154
+ }
132
155
  };
133
156
  apply();
134
157
  const observer = new MutationObserver(apply);
@@ -146,9 +169,13 @@ function getRegistry() {
146
169
 
147
170
  // ui/src/applet-devtools/enabled.ts
148
171
  function shouldEnableAppletDevtools() {
149
- if (typeof window === "undefined") return false;
172
+ if (typeof window === "undefined") {
173
+ return false;
174
+ }
150
175
  const url = new URL(window.location.href);
151
- if (url.searchParams.get("appletDebug") === "1") return true;
176
+ if (url.searchParams.get("appletDebug") === "1") {
177
+ return true;
178
+ }
152
179
  try {
153
180
  return window.localStorage.getItem("iotaAppletDevtools") === "1";
154
181
  } catch {
@@ -250,8 +277,12 @@ function createAppletRPCClient(options) {
250
277
  return { call, callTyped };
251
278
  }
252
279
  function maybeDispatchRPCEvent(detail) {
253
- if (typeof window === "undefined") return;
254
- if (!shouldEnableAppletDevtools()) return;
280
+ if (typeof window === "undefined") {
281
+ return;
282
+ }
283
+ if (!shouldEnableAppletDevtools()) {
284
+ return;
285
+ }
255
286
  window.dispatchEvent(new CustomEvent("iota:applet-rpc", { detail }));
256
287
  }
257
288
  function elapsedMs(startedAt) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../ui/src/applet-host/react-element.ts","../../ui/src/applet-devtools/enabled.ts","../../ui/src/applet-host/rpc.ts","../../ui/src/applet-host/router.tsx"],"names":["createRoot","jsx"],"mappings":"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","file":"host.cjs","sourcesContent":["import type React from 'react'\nimport { createRoot, type Root } from 'react-dom/client'\n\nexport type RouterMode = 'url' | 'memory'\nexport type ShellMode = 'embedded' | 'standalone'\n\ntype RegistryEntry = {\n options: DefineReactAppletElementOptions\n observed: Set<string>\n}\n\nexport interface AppletHostConfig {\n basePath: string\n shellMode?: ShellMode\n routerMode: RouterMode\n attrs: Record<string, string>\n}\n\nexport interface DefineReactAppletElementOptions {\n tagName: string\n styles?: string | (() => string)\n render: (host: AppletHostConfig) => React.ReactElement\n observedAttributes?: string[]\n observeDarkMode?: boolean\n}\n\nexport function defineReactAppletElement(options: DefineReactAppletElementOptions): void {\n const tagName = options.tagName.toLowerCase()\n\n const registry = getRegistry()\n const existing = registry.get(tagName)\n if (existing) {\n existing.options = options\n for (const a of options.observedAttributes ?? []) existing.observed.add(a)\n } else {\n const observed = new Set<string>(['base-path', 'shell-mode', 'router-mode'])\n for (const a of options.observedAttributes ?? []) observed.add(a)\n registry.set(tagName, { options, observed })\n }\n\n if (customElements.get(tagName)) {\n if (typeof window !== 'undefined') {\n window.dispatchEvent(new CustomEvent('iota:applet-host-update', { detail: { tagName } }))\n }\n return\n }\n\n function getEntry(): RegistryEntry {\n const entry = getRegistry().get(tagName)\n if (!entry) throw new Error(`[${tagName}] applet host registry entry missing`)\n return entry\n }\n\n class ReactAppletElement extends HTMLElement {\n private reactRoot: Root | null = null\n private container: HTMLDivElement | null = null\n private darkModeObserver: MutationObserver | null = null\n private styleEl: HTMLStyleElement | null = null\n private updateListener: ((e: Event) => void) | null = null\n\n static get observedAttributes(): string[] {\n return Array.from(getEntry().observed)\n }\n\n connectedCallback(): void {\n const shadowRoot = this.shadowRoot ?? this.attachShadow({ mode: 'open' })\n\n if (!this.container) {\n this.container = document.createElement('div')\n this.container.id = 'react-root'\n this.container.style.display = 'flex'\n this.container.style.flexDirection = 'column'\n this.container.style.flex = '1'\n this.container.style.minHeight = '0'\n this.container.style.height = '100%'\n this.container.style.width = '100%'\n }\n\n const existingContainer = shadowRoot.querySelector('#react-root')\n if (!existingContainer) {\n if (this.styleEl) shadowRoot.appendChild(this.styleEl)\n shadowRoot.appendChild(this.container)\n } else if (existingContainer !== this.container) {\n this.container = existingContainer as HTMLDivElement\n }\n\n this.syncFromRegistry()\n\n this.updateListener ??= (e: Event) => {\n if (!(e instanceof CustomEvent)) return\n const detail = (e as CustomEvent<{ tagName?: string }>).detail\n if (!detail || detail.tagName !== tagName) return\n this.syncFromRegistry()\n this.renderReact()\n }\n window.addEventListener('iota:applet-host-update', this.updateListener as EventListener)\n\n this.renderReact()\n }\n\n disconnectedCallback(): void {\n if (this.updateListener) {\n window.removeEventListener('iota:applet-host-update', this.updateListener as EventListener)\n }\n\n this.darkModeObserver?.disconnect()\n this.darkModeObserver = null\n\n this.reactRoot?.unmount()\n this.reactRoot = null\n }\n\n attributeChangedCallback(_name: string, oldValue: string | null, newValue: string | null): void {\n if (oldValue === newValue) return\n if (this.container) this.renderReact()\n }\n\n private getHostConfig(): AppletHostConfig {\n const attrs: Record<string, string> = {}\n for (const { name, value } of Array.from(this.attributes)) {\n attrs[name] = value\n }\n\n const basePath = this.getAttribute('base-path') ?? ''\n const shellMode = (this.getAttribute('shell-mode') as ShellMode | null) ?? undefined\n const routerMode = (this.getAttribute('router-mode') as RouterMode | null) ?? 'url'\n\n return { basePath, shellMode, routerMode, attrs }\n }\n\n private renderReact(): void {\n if (!this.container) return\n\n if (!this.reactRoot) {\n this.reactRoot = createRoot(this.container)\n }\n\n try {\n this.reactRoot.render(getEntry().options.render(this.getHostConfig()))\n } catch (err) {\n console.error(`[${tagName}] failed to mount React app:`, err)\n }\n }\n\n private syncFromRegistry(): void {\n const entry = getEntry()\n\n const styles = typeof entry.options.styles === 'function' ? entry.options.styles() : entry.options.styles\n if (styles) {\n this.styleEl ??= document.createElement('style')\n this.styleEl.textContent = styles\n if (this.shadowRoot && !this.shadowRoot.contains(this.styleEl)) {\n this.shadowRoot.insertBefore(this.styleEl, this.shadowRoot.firstChild)\n }\n } else if (this.styleEl) {\n this.styleEl.remove()\n this.styleEl = null\n }\n\n if (entry.options.observeDarkMode !== false) {\n this.darkModeObserver ??= this.syncDarkMode()\n } else if (this.darkModeObserver) {\n this.darkModeObserver.disconnect()\n this.darkModeObserver = null\n }\n }\n\n private syncDarkMode(): MutationObserver {\n const root = this.container\n if (!root) throw new Error('react root container not found')\n\n const apply = () => {\n if (document.documentElement.classList.contains('dark')) root.classList.add('dark')\n else root.classList.remove('dark')\n }\n\n apply()\n\n const observer = new MutationObserver(apply)\n observer.observe(document.documentElement, { attributes: true, attributeFilter: ['class'] })\n return observer\n }\n }\n\n customElements.define(tagName, ReactAppletElement)\n}\n\nfunction getRegistry(): Map<string, RegistryEntry> {\n const g = globalThis as Record<string, unknown>\n g.__IOTA_REACT_APPLET_HOST_REGISTRY__ ??= new Map<string, RegistryEntry>()\n return g.__IOTA_REACT_APPLET_HOST_REGISTRY__ as Map<string, RegistryEntry>\n}\n","export function shouldEnableAppletDevtools(): boolean {\n if (typeof window === 'undefined') return false\n\n const url = new URL(window.location.href)\n if (url.searchParams.get('appletDebug') === '1') return true\n\n try {\n return window.localStorage.getItem('iotaAppletDevtools') === '1'\n } catch {\n return false\n }\n}\n\n","import { shouldEnableAppletDevtools } from '../applet-devtools/enabled'\n\nexport interface AppletRPCError {\n code: string\n message: string\n details?: unknown\n}\n\nexport class AppletRPCException extends Error {\n code: string\n details?: unknown\n cause?: unknown\n\n constructor(args: { code: string; message: string; details?: unknown; cause?: unknown }) {\n super(args.message)\n this.name = 'AppletRPCException'\n this.code = args.code\n this.details = args.details\n this.cause = args.cause\n }\n}\n\nexport type AppletRPCSchema = Record<string, { params: unknown; result: unknown }>\n\ninterface RPCRequest {\n id: string\n method: string\n params: unknown\n}\n\ninterface RPCResponse<TResult> {\n id: string\n result?: TResult\n error?: AppletRPCError\n}\n\nexport interface CreateAppletRPCClientOptions {\n endpoint: string\n fetcher?: typeof fetch\n timeoutMs?: number\n}\n\nexport function createAppletRPCClient(options: CreateAppletRPCClientOptions) {\n const fetcher = options.fetcher ?? fetch\n const timeoutMs = typeof options.timeoutMs === 'number' && options.timeoutMs > 0 ? options.timeoutMs : 0\n\n async function call<TParams, TResult>(method: string, params: TParams): Promise<TResult> {\n const req: RPCRequest = { id: crypto.randomUUID(), method, params }\n const startedAt = typeof performance !== 'undefined' ? performance.now() : Date.now()\n const abortController = timeoutMs > 0 ? new AbortController() : undefined\n let timeoutHandle: ReturnType<typeof setTimeout> | undefined\n let timedOut = false\n maybeDispatchRPCEvent({\n id: req.id,\n method: req.method,\n status: 'start',\n })\n\n try {\n if (abortController) {\n timeoutHandle = setTimeout(() => {\n timedOut = true\n abortController.abort()\n }, timeoutMs)\n }\n\n const resp = await fetcher(options.endpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(req),\n signal: abortController?.signal,\n })\n\n if (!resp.ok) {\n throw new AppletRPCException({\n code: 'http_error',\n message: `HTTP ${resp.status}`,\n details: { status: resp.status },\n })\n }\n\n const json = (await resp.json()) as RPCResponse<TResult>\n if (json.error) {\n throw new AppletRPCException({\n code: json.error.code,\n message: json.error.message,\n details: json.error.details,\n })\n }\n\n if (json.result === undefined) {\n throw new AppletRPCException({\n code: 'invalid_response',\n message: 'Missing result in successful response',\n })\n }\n\n maybeDispatchRPCEvent({\n id: req.id,\n method: req.method,\n status: 'success',\n durationMs: elapsedMs(startedAt),\n })\n\n return json.result as TResult\n } catch (err) {\n let rpcErr: unknown = err\n if (err instanceof Error && err.name === 'AbortError') {\n rpcErr = new AppletRPCException({\n code: timedOut ? 'timeout' : 'aborted',\n message: timedOut ? `RPC request timed out after ${timeoutMs}ms` : 'RPC request was aborted',\n cause: err,\n })\n }\n maybeDispatchRPCEvent({\n id: req.id,\n method: req.method,\n status: 'error',\n durationMs: elapsedMs(startedAt),\n error: rpcErr,\n })\n throw rpcErr\n } finally {\n if (timeoutHandle !== undefined) {\n clearTimeout(timeoutHandle)\n }\n }\n }\n\n async function callTyped<\n TRouter extends AppletRPCSchema,\n TMethod extends keyof TRouter & string,\n >(method: TMethod, params: TRouter[TMethod]['params']): Promise<TRouter[TMethod]['result']> {\n return call(method, params) as Promise<TRouter[TMethod]['result']>\n }\n\n return { call, callTyped }\n}\n\ntype RPCDevEvent = {\n id: string\n method: string\n status: 'start' | 'success' | 'error'\n durationMs?: number\n error?: unknown\n}\n\nfunction maybeDispatchRPCEvent(detail: RPCDevEvent) {\n if (typeof window === 'undefined') return\n\n if (!shouldEnableAppletDevtools()) return\n\n window.dispatchEvent(new CustomEvent('iota:applet-rpc', { detail }))\n}\n\nfunction elapsedMs(startedAt: number): number {\n const now = typeof performance !== 'undefined' ? performance.now() : Date.now()\n return Math.max(0, Math.round(now - startedAt))\n}\n","import type React from 'react'\n\nexport type RouterMode = 'url' | 'memory'\n\nexport interface CreateAppletRouterOptions {\n mode: RouterMode\n basePath?: string\n BrowserRouter: React.ComponentType<Record<string, unknown>>\n MemoryRouter: React.ComponentType<Record<string, unknown>>\n}\n\nexport function createAppletRouter(options: CreateAppletRouterOptions) {\n const basePath = options.basePath ?? ''\n\n const Router: React.FC<React.PropsWithChildren> = ({ children }) => {\n if (options.mode === 'memory') {\n const MemoryRouter = options.MemoryRouter\n return <MemoryRouter>{children}</MemoryRouter>\n }\n\n const BrowserRouter = options.BrowserRouter\n return <BrowserRouter basename={basePath}>{children}</BrowserRouter>\n }\n\n return { Router }\n}\n\n"]}
1
+ {"version":3,"sources":["../../ui/src/applet-host/react-element.ts","../../ui/src/applet-devtools/enabled.ts","../../ui/src/applet-host/rpc.ts","../../ui/src/applet-host/router.tsx"],"names":["createRoot","jsx"],"mappings":"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","file":"host.cjs","sourcesContent":["import type React from 'react';\nimport { createRoot, type Root } from 'react-dom/client';\n\nexport type RouterMode = 'url' | 'memory'\nexport type ShellMode = 'embedded' | 'standalone'\n\ntype RegistryEntry = {\n options: DefineReactAppletElementOptions\n observed: Set<string>\n}\n\nexport interface AppletHostConfig {\n basePath: string\n shellMode?: ShellMode\n routerMode: RouterMode\n attrs: Record<string, string>\n}\n\nexport interface DefineReactAppletElementOptions {\n tagName: string\n styles?: string | (() => string)\n render: (host: AppletHostConfig) => React.ReactElement\n observedAttributes?: string[]\n observeDarkMode?: boolean\n}\n\nexport function defineReactAppletElement(options: DefineReactAppletElementOptions): void {\n const tagName = options.tagName.toLowerCase();\n\n const registry = getRegistry();\n const existing = registry.get(tagName);\n if (existing) {\n existing.options = options;\n for (const a of options.observedAttributes ?? []) {existing.observed.add(a);}\n } else {\n const observed = new Set<string>(['base-path', 'shell-mode', 'router-mode']);\n for (const a of options.observedAttributes ?? []) {observed.add(a);}\n registry.set(tagName, { options, observed });\n }\n\n if (customElements.get(tagName)) {\n if (typeof window !== 'undefined') {\n window.dispatchEvent(new CustomEvent('iota:applet-host-update', { detail: { tagName } }));\n }\n return;\n }\n\n function getEntry(): RegistryEntry {\n const entry = getRegistry().get(tagName);\n if (!entry) {throw new Error(`[${tagName}] applet host registry entry missing`);}\n return entry;\n }\n\n class ReactAppletElement extends HTMLElement {\n private reactRoot: Root | null = null;\n private container: HTMLDivElement | null = null;\n private darkModeObserver: MutationObserver | null = null;\n private styleEl: HTMLStyleElement | null = null;\n private updateListener: ((e: Event) => void) | null = null;\n\n static get observedAttributes(): string[] {\n return Array.from(getEntry().observed);\n }\n\n connectedCallback(): void {\n const shadowRoot = this.shadowRoot ?? this.attachShadow({ mode: 'open' });\n\n if (!this.container) {\n this.container = document.createElement('div');\n this.container.id = 'react-root';\n this.container.style.display = 'flex';\n this.container.style.flexDirection = 'column';\n this.container.style.flex = '1';\n this.container.style.minHeight = '0';\n this.container.style.height = '100%';\n this.container.style.width = '100%';\n }\n\n const existingContainer = shadowRoot.querySelector('#react-root');\n if (!existingContainer) {\n if (this.styleEl) {shadowRoot.appendChild(this.styleEl);}\n shadowRoot.appendChild(this.container);\n } else if (existingContainer !== this.container) {\n this.container = existingContainer as HTMLDivElement;\n }\n\n this.syncFromRegistry();\n\n this.updateListener ??= (e: Event) => {\n if (!(e instanceof CustomEvent)) {return;}\n const detail = (e as CustomEvent<{ tagName?: string }>).detail;\n if (!detail || detail.tagName !== tagName) {return;}\n this.syncFromRegistry();\n this.renderReact();\n };\n window.addEventListener('iota:applet-host-update', this.updateListener as EventListener);\n\n this.renderReact();\n }\n\n disconnectedCallback(): void {\n if (this.updateListener) {\n window.removeEventListener('iota:applet-host-update', this.updateListener as EventListener);\n }\n\n this.darkModeObserver?.disconnect();\n this.darkModeObserver = null;\n\n this.reactRoot?.unmount();\n this.reactRoot = null;\n }\n\n attributeChangedCallback(_name: string, oldValue: string | null, newValue: string | null): void {\n if (oldValue === newValue) {return;}\n if (this.container) {this.renderReact();}\n }\n\n private getHostConfig(): AppletHostConfig {\n const attrs: Record<string, string> = {};\n for (const { name, value } of Array.from(this.attributes)) {\n attrs[name] = value;\n }\n\n const basePath = this.getAttribute('base-path') ?? '';\n const shellMode = (this.getAttribute('shell-mode') as ShellMode | null) ?? undefined;\n const routerMode = (this.getAttribute('router-mode') as RouterMode | null) ?? 'url';\n\n return { basePath, shellMode, routerMode, attrs };\n }\n\n private renderReact(): void {\n if (!this.container) {return;}\n\n if (!this.reactRoot) {\n this.reactRoot = createRoot(this.container);\n }\n\n try {\n this.reactRoot.render(getEntry().options.render(this.getHostConfig()));\n } catch (err) {\n console.error(`[${tagName}] failed to mount React app:`, err);\n }\n }\n\n private syncFromRegistry(): void {\n const entry = getEntry();\n\n const styles = typeof entry.options.styles === 'function' ? entry.options.styles() : entry.options.styles;\n if (styles) {\n this.styleEl ??= document.createElement('style');\n this.styleEl.textContent = styles;\n if (this.shadowRoot && !this.shadowRoot.contains(this.styleEl)) {\n this.shadowRoot.insertBefore(this.styleEl, this.shadowRoot.firstChild);\n }\n } else if (this.styleEl) {\n this.styleEl.remove();\n this.styleEl = null;\n }\n\n if (entry.options.observeDarkMode !== false) {\n this.darkModeObserver ??= this.syncDarkMode();\n } else if (this.darkModeObserver) {\n this.darkModeObserver.disconnect();\n this.darkModeObserver = null;\n }\n }\n\n private syncDarkMode(): MutationObserver {\n const root = this.container;\n if (!root) {throw new Error('react root container not found');}\n\n const apply = () => {\n if (document.documentElement.classList.contains('dark')) {root.classList.add('dark');}\n else {root.classList.remove('dark');}\n };\n\n apply();\n\n const observer = new MutationObserver(apply);\n observer.observe(document.documentElement, { attributes: true, attributeFilter: ['class'] });\n return observer;\n }\n }\n\n customElements.define(tagName, ReactAppletElement);\n}\n\nfunction getRegistry(): Map<string, RegistryEntry> {\n const g = globalThis as Record<string, unknown>;\n g.__IOTA_REACT_APPLET_HOST_REGISTRY__ ??= new Map<string, RegistryEntry>();\n return g.__IOTA_REACT_APPLET_HOST_REGISTRY__ as Map<string, RegistryEntry>;\n}\n","export function shouldEnableAppletDevtools(): boolean {\n if (typeof window === 'undefined') {return false;}\n\n const url = new URL(window.location.href);\n if (url.searchParams.get('appletDebug') === '1') {return true;}\n\n try {\n return window.localStorage.getItem('iotaAppletDevtools') === '1';\n } catch {\n return false;\n }\n}\n\n","import { shouldEnableAppletDevtools } from '../applet-devtools/enabled';\n\nexport interface AppletRPCError {\n code: string\n message: string\n details?: unknown\n}\n\nexport class AppletRPCException extends Error {\n code: string;\n details?: unknown;\n cause?: unknown;\n\n constructor(args: { code: string; message: string; details?: unknown; cause?: unknown }) {\n super(args.message);\n this.name = 'AppletRPCException';\n this.code = args.code;\n this.details = args.details;\n this.cause = args.cause;\n }\n}\n\nexport type AppletRPCSchema = Record<string, { params: unknown; result: unknown }>\n\ninterface RPCRequest {\n id: string\n method: string\n params: unknown\n}\n\ninterface RPCResponse<TResult> {\n id: string\n result?: TResult\n error?: AppletRPCError\n}\n\nexport interface CreateAppletRPCClientOptions {\n endpoint: string\n fetcher?: typeof fetch\n timeoutMs?: number\n}\n\nexport function createAppletRPCClient(options: CreateAppletRPCClientOptions) {\n const fetcher = options.fetcher ?? fetch;\n const timeoutMs = typeof options.timeoutMs === 'number' && options.timeoutMs > 0 ? options.timeoutMs : 0;\n\n async function call<TParams, TResult>(method: string, params: TParams): Promise<TResult> {\n const req: RPCRequest = { id: crypto.randomUUID(), method, params };\n const startedAt = typeof performance !== 'undefined' ? performance.now() : Date.now();\n const abortController = timeoutMs > 0 ? new AbortController() : undefined;\n let timeoutHandle: ReturnType<typeof setTimeout> | undefined;\n let timedOut = false;\n maybeDispatchRPCEvent({\n id: req.id,\n method: req.method,\n status: 'start',\n });\n\n try {\n if (abortController) {\n timeoutHandle = setTimeout(() => {\n timedOut = true;\n abortController.abort();\n }, timeoutMs);\n }\n\n const resp = await fetcher(options.endpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(req),\n signal: abortController?.signal,\n });\n\n if (!resp.ok) {\n throw new AppletRPCException({\n code: 'http_error',\n message: `HTTP ${resp.status}`,\n details: { status: resp.status },\n });\n }\n\n const json = (await resp.json()) as RPCResponse<TResult>;\n if (json.error) {\n throw new AppletRPCException({\n code: json.error.code,\n message: json.error.message,\n details: json.error.details,\n });\n }\n\n if (json.result === undefined) {\n throw new AppletRPCException({\n code: 'invalid_response',\n message: 'Missing result in successful response',\n });\n }\n\n maybeDispatchRPCEvent({\n id: req.id,\n method: req.method,\n status: 'success',\n durationMs: elapsedMs(startedAt),\n });\n\n return json.result as TResult;\n } catch (err) {\n let rpcErr: unknown = err;\n if (err instanceof Error && err.name === 'AbortError') {\n rpcErr = new AppletRPCException({\n code: timedOut ? 'timeout' : 'aborted',\n message: timedOut ? `RPC request timed out after ${timeoutMs}ms` : 'RPC request was aborted',\n cause: err,\n });\n }\n maybeDispatchRPCEvent({\n id: req.id,\n method: req.method,\n status: 'error',\n durationMs: elapsedMs(startedAt),\n error: rpcErr,\n });\n throw rpcErr;\n } finally {\n if (timeoutHandle !== undefined) {\n clearTimeout(timeoutHandle);\n }\n }\n }\n\n async function callTyped<\n TRouter extends AppletRPCSchema,\n TMethod extends keyof TRouter & string,\n >(method: TMethod, params: TRouter[TMethod]['params']): Promise<TRouter[TMethod]['result']> {\n return call(method, params) as Promise<TRouter[TMethod]['result']>;\n }\n\n return { call, callTyped };\n}\n\ntype RPCDevEvent = {\n id: string\n method: string\n status: 'start' | 'success' | 'error'\n durationMs?: number\n error?: unknown\n}\n\nfunction maybeDispatchRPCEvent(detail: RPCDevEvent) {\n if (typeof window === 'undefined') {return;}\n\n if (!shouldEnableAppletDevtools()) {return;}\n\n window.dispatchEvent(new CustomEvent('iota:applet-rpc', { detail }));\n}\n\nfunction elapsedMs(startedAt: number): number {\n const now = typeof performance !== 'undefined' ? performance.now() : Date.now();\n return Math.max(0, Math.round(now - startedAt));\n}\n","import type React from 'react';\n\nexport type RouterMode = 'url' | 'memory'\n\nexport interface CreateAppletRouterOptions {\n mode: RouterMode\n basePath?: string\n BrowserRouter: React.ComponentType<Record<string, unknown>>\n MemoryRouter: React.ComponentType<Record<string, unknown>>\n}\n\nexport function createAppletRouter(options: CreateAppletRouterOptions) {\n const basePath = options.basePath ?? '';\n\n const Router: React.FC<React.PropsWithChildren> = ({ children }) => {\n if (options.mode === 'memory') {\n const MemoryRouter = options.MemoryRouter;\n return <MemoryRouter>{children}</MemoryRouter>;\n }\n\n const BrowserRouter = options.BrowserRouter;\n return <BrowserRouter basename={basePath}>{children}</BrowserRouter>;\n };\n\n return { Router };\n}\n\n"]}
@@ -8,10 +8,14 @@ function defineReactAppletElement(options) {
8
8
  const existing = registry.get(tagName);
9
9
  if (existing) {
10
10
  existing.options = options;
11
- for (const a of options.observedAttributes ?? []) existing.observed.add(a);
11
+ for (const a of options.observedAttributes ?? []) {
12
+ existing.observed.add(a);
13
+ }
12
14
  } else {
13
15
  const observed = /* @__PURE__ */ new Set(["base-path", "shell-mode", "router-mode"]);
14
- for (const a of options.observedAttributes ?? []) observed.add(a);
16
+ for (const a of options.observedAttributes ?? []) {
17
+ observed.add(a);
18
+ }
15
19
  registry.set(tagName, { options, observed });
16
20
  }
17
21
  if (customElements.get(tagName)) {
@@ -22,7 +26,9 @@ function defineReactAppletElement(options) {
22
26
  }
23
27
  function getEntry() {
24
28
  const entry = getRegistry().get(tagName);
25
- if (!entry) throw new Error(`[${tagName}] applet host registry entry missing`);
29
+ if (!entry) {
30
+ throw new Error(`[${tagName}] applet host registry entry missing`);
31
+ }
26
32
  return entry;
27
33
  }
28
34
  class ReactAppletElement extends HTMLElement {
@@ -51,16 +57,22 @@ function defineReactAppletElement(options) {
51
57
  }
52
58
  const existingContainer = shadowRoot.querySelector("#react-root");
53
59
  if (!existingContainer) {
54
- if (this.styleEl) shadowRoot.appendChild(this.styleEl);
60
+ if (this.styleEl) {
61
+ shadowRoot.appendChild(this.styleEl);
62
+ }
55
63
  shadowRoot.appendChild(this.container);
56
64
  } else if (existingContainer !== this.container) {
57
65
  this.container = existingContainer;
58
66
  }
59
67
  this.syncFromRegistry();
60
68
  this.updateListener ?? (this.updateListener = (e) => {
61
- if (!(e instanceof CustomEvent)) return;
69
+ if (!(e instanceof CustomEvent)) {
70
+ return;
71
+ }
62
72
  const detail = e.detail;
63
- if (!detail || detail.tagName !== tagName) return;
73
+ if (!detail || detail.tagName !== tagName) {
74
+ return;
75
+ }
64
76
  this.syncFromRegistry();
65
77
  this.renderReact();
66
78
  });
@@ -77,8 +89,12 @@ function defineReactAppletElement(options) {
77
89
  this.reactRoot = null;
78
90
  }
79
91
  attributeChangedCallback(_name, oldValue, newValue) {
80
- if (oldValue === newValue) return;
81
- if (this.container) this.renderReact();
92
+ if (oldValue === newValue) {
93
+ return;
94
+ }
95
+ if (this.container) {
96
+ this.renderReact();
97
+ }
82
98
  }
83
99
  getHostConfig() {
84
100
  const attrs = {};
@@ -91,7 +107,9 @@ function defineReactAppletElement(options) {
91
107
  return { basePath, shellMode, routerMode, attrs };
92
108
  }
93
109
  renderReact() {
94
- if (!this.container) return;
110
+ if (!this.container) {
111
+ return;
112
+ }
95
113
  if (!this.reactRoot) {
96
114
  this.reactRoot = createRoot(this.container);
97
115
  }
@@ -123,10 +141,15 @@ function defineReactAppletElement(options) {
123
141
  }
124
142
  syncDarkMode() {
125
143
  const root = this.container;
126
- if (!root) throw new Error("react root container not found");
144
+ if (!root) {
145
+ throw new Error("react root container not found");
146
+ }
127
147
  const apply = () => {
128
- if (document.documentElement.classList.contains("dark")) root.classList.add("dark");
129
- else root.classList.remove("dark");
148
+ if (document.documentElement.classList.contains("dark")) {
149
+ root.classList.add("dark");
150
+ } else {
151
+ root.classList.remove("dark");
152
+ }
130
153
  };
131
154
  apply();
132
155
  const observer = new MutationObserver(apply);
@@ -144,9 +167,13 @@ function getRegistry() {
144
167
 
145
168
  // ui/src/applet-devtools/enabled.ts
146
169
  function shouldEnableAppletDevtools() {
147
- if (typeof window === "undefined") return false;
170
+ if (typeof window === "undefined") {
171
+ return false;
172
+ }
148
173
  const url = new URL(window.location.href);
149
- if (url.searchParams.get("appletDebug") === "1") return true;
174
+ if (url.searchParams.get("appletDebug") === "1") {
175
+ return true;
176
+ }
150
177
  try {
151
178
  return window.localStorage.getItem("iotaAppletDevtools") === "1";
152
179
  } catch {
@@ -248,8 +275,12 @@ function createAppletRPCClient(options) {
248
275
  return { call, callTyped };
249
276
  }
250
277
  function maybeDispatchRPCEvent(detail) {
251
- if (typeof window === "undefined") return;
252
- if (!shouldEnableAppletDevtools()) return;
278
+ if (typeof window === "undefined") {
279
+ return;
280
+ }
281
+ if (!shouldEnableAppletDevtools()) {
282
+ return;
283
+ }
253
284
  window.dispatchEvent(new CustomEvent("iota:applet-rpc", { detail }));
254
285
  }
255
286
  function elapsedMs(startedAt) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../ui/src/applet-host/react-element.ts","../../ui/src/applet-devtools/enabled.ts","../../ui/src/applet-host/rpc.ts","../../ui/src/applet-host/router.tsx"],"names":[],"mappings":"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","file":"host.mjs","sourcesContent":["import type React from 'react'\nimport { createRoot, type Root } from 'react-dom/client'\n\nexport type RouterMode = 'url' | 'memory'\nexport type ShellMode = 'embedded' | 'standalone'\n\ntype RegistryEntry = {\n options: DefineReactAppletElementOptions\n observed: Set<string>\n}\n\nexport interface AppletHostConfig {\n basePath: string\n shellMode?: ShellMode\n routerMode: RouterMode\n attrs: Record<string, string>\n}\n\nexport interface DefineReactAppletElementOptions {\n tagName: string\n styles?: string | (() => string)\n render: (host: AppletHostConfig) => React.ReactElement\n observedAttributes?: string[]\n observeDarkMode?: boolean\n}\n\nexport function defineReactAppletElement(options: DefineReactAppletElementOptions): void {\n const tagName = options.tagName.toLowerCase()\n\n const registry = getRegistry()\n const existing = registry.get(tagName)\n if (existing) {\n existing.options = options\n for (const a of options.observedAttributes ?? []) existing.observed.add(a)\n } else {\n const observed = new Set<string>(['base-path', 'shell-mode', 'router-mode'])\n for (const a of options.observedAttributes ?? []) observed.add(a)\n registry.set(tagName, { options, observed })\n }\n\n if (customElements.get(tagName)) {\n if (typeof window !== 'undefined') {\n window.dispatchEvent(new CustomEvent('iota:applet-host-update', { detail: { tagName } }))\n }\n return\n }\n\n function getEntry(): RegistryEntry {\n const entry = getRegistry().get(tagName)\n if (!entry) throw new Error(`[${tagName}] applet host registry entry missing`)\n return entry\n }\n\n class ReactAppletElement extends HTMLElement {\n private reactRoot: Root | null = null\n private container: HTMLDivElement | null = null\n private darkModeObserver: MutationObserver | null = null\n private styleEl: HTMLStyleElement | null = null\n private updateListener: ((e: Event) => void) | null = null\n\n static get observedAttributes(): string[] {\n return Array.from(getEntry().observed)\n }\n\n connectedCallback(): void {\n const shadowRoot = this.shadowRoot ?? this.attachShadow({ mode: 'open' })\n\n if (!this.container) {\n this.container = document.createElement('div')\n this.container.id = 'react-root'\n this.container.style.display = 'flex'\n this.container.style.flexDirection = 'column'\n this.container.style.flex = '1'\n this.container.style.minHeight = '0'\n this.container.style.height = '100%'\n this.container.style.width = '100%'\n }\n\n const existingContainer = shadowRoot.querySelector('#react-root')\n if (!existingContainer) {\n if (this.styleEl) shadowRoot.appendChild(this.styleEl)\n shadowRoot.appendChild(this.container)\n } else if (existingContainer !== this.container) {\n this.container = existingContainer as HTMLDivElement\n }\n\n this.syncFromRegistry()\n\n this.updateListener ??= (e: Event) => {\n if (!(e instanceof CustomEvent)) return\n const detail = (e as CustomEvent<{ tagName?: string }>).detail\n if (!detail || detail.tagName !== tagName) return\n this.syncFromRegistry()\n this.renderReact()\n }\n window.addEventListener('iota:applet-host-update', this.updateListener as EventListener)\n\n this.renderReact()\n }\n\n disconnectedCallback(): void {\n if (this.updateListener) {\n window.removeEventListener('iota:applet-host-update', this.updateListener as EventListener)\n }\n\n this.darkModeObserver?.disconnect()\n this.darkModeObserver = null\n\n this.reactRoot?.unmount()\n this.reactRoot = null\n }\n\n attributeChangedCallback(_name: string, oldValue: string | null, newValue: string | null): void {\n if (oldValue === newValue) return\n if (this.container) this.renderReact()\n }\n\n private getHostConfig(): AppletHostConfig {\n const attrs: Record<string, string> = {}\n for (const { name, value } of Array.from(this.attributes)) {\n attrs[name] = value\n }\n\n const basePath = this.getAttribute('base-path') ?? ''\n const shellMode = (this.getAttribute('shell-mode') as ShellMode | null) ?? undefined\n const routerMode = (this.getAttribute('router-mode') as RouterMode | null) ?? 'url'\n\n return { basePath, shellMode, routerMode, attrs }\n }\n\n private renderReact(): void {\n if (!this.container) return\n\n if (!this.reactRoot) {\n this.reactRoot = createRoot(this.container)\n }\n\n try {\n this.reactRoot.render(getEntry().options.render(this.getHostConfig()))\n } catch (err) {\n console.error(`[${tagName}] failed to mount React app:`, err)\n }\n }\n\n private syncFromRegistry(): void {\n const entry = getEntry()\n\n const styles = typeof entry.options.styles === 'function' ? entry.options.styles() : entry.options.styles\n if (styles) {\n this.styleEl ??= document.createElement('style')\n this.styleEl.textContent = styles\n if (this.shadowRoot && !this.shadowRoot.contains(this.styleEl)) {\n this.shadowRoot.insertBefore(this.styleEl, this.shadowRoot.firstChild)\n }\n } else if (this.styleEl) {\n this.styleEl.remove()\n this.styleEl = null\n }\n\n if (entry.options.observeDarkMode !== false) {\n this.darkModeObserver ??= this.syncDarkMode()\n } else if (this.darkModeObserver) {\n this.darkModeObserver.disconnect()\n this.darkModeObserver = null\n }\n }\n\n private syncDarkMode(): MutationObserver {\n const root = this.container\n if (!root) throw new Error('react root container not found')\n\n const apply = () => {\n if (document.documentElement.classList.contains('dark')) root.classList.add('dark')\n else root.classList.remove('dark')\n }\n\n apply()\n\n const observer = new MutationObserver(apply)\n observer.observe(document.documentElement, { attributes: true, attributeFilter: ['class'] })\n return observer\n }\n }\n\n customElements.define(tagName, ReactAppletElement)\n}\n\nfunction getRegistry(): Map<string, RegistryEntry> {\n const g = globalThis as Record<string, unknown>\n g.__IOTA_REACT_APPLET_HOST_REGISTRY__ ??= new Map<string, RegistryEntry>()\n return g.__IOTA_REACT_APPLET_HOST_REGISTRY__ as Map<string, RegistryEntry>\n}\n","export function shouldEnableAppletDevtools(): boolean {\n if (typeof window === 'undefined') return false\n\n const url = new URL(window.location.href)\n if (url.searchParams.get('appletDebug') === '1') return true\n\n try {\n return window.localStorage.getItem('iotaAppletDevtools') === '1'\n } catch {\n return false\n }\n}\n\n","import { shouldEnableAppletDevtools } from '../applet-devtools/enabled'\n\nexport interface AppletRPCError {\n code: string\n message: string\n details?: unknown\n}\n\nexport class AppletRPCException extends Error {\n code: string\n details?: unknown\n cause?: unknown\n\n constructor(args: { code: string; message: string; details?: unknown; cause?: unknown }) {\n super(args.message)\n this.name = 'AppletRPCException'\n this.code = args.code\n this.details = args.details\n this.cause = args.cause\n }\n}\n\nexport type AppletRPCSchema = Record<string, { params: unknown; result: unknown }>\n\ninterface RPCRequest {\n id: string\n method: string\n params: unknown\n}\n\ninterface RPCResponse<TResult> {\n id: string\n result?: TResult\n error?: AppletRPCError\n}\n\nexport interface CreateAppletRPCClientOptions {\n endpoint: string\n fetcher?: typeof fetch\n timeoutMs?: number\n}\n\nexport function createAppletRPCClient(options: CreateAppletRPCClientOptions) {\n const fetcher = options.fetcher ?? fetch\n const timeoutMs = typeof options.timeoutMs === 'number' && options.timeoutMs > 0 ? options.timeoutMs : 0\n\n async function call<TParams, TResult>(method: string, params: TParams): Promise<TResult> {\n const req: RPCRequest = { id: crypto.randomUUID(), method, params }\n const startedAt = typeof performance !== 'undefined' ? performance.now() : Date.now()\n const abortController = timeoutMs > 0 ? new AbortController() : undefined\n let timeoutHandle: ReturnType<typeof setTimeout> | undefined\n let timedOut = false\n maybeDispatchRPCEvent({\n id: req.id,\n method: req.method,\n status: 'start',\n })\n\n try {\n if (abortController) {\n timeoutHandle = setTimeout(() => {\n timedOut = true\n abortController.abort()\n }, timeoutMs)\n }\n\n const resp = await fetcher(options.endpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(req),\n signal: abortController?.signal,\n })\n\n if (!resp.ok) {\n throw new AppletRPCException({\n code: 'http_error',\n message: `HTTP ${resp.status}`,\n details: { status: resp.status },\n })\n }\n\n const json = (await resp.json()) as RPCResponse<TResult>\n if (json.error) {\n throw new AppletRPCException({\n code: json.error.code,\n message: json.error.message,\n details: json.error.details,\n })\n }\n\n if (json.result === undefined) {\n throw new AppletRPCException({\n code: 'invalid_response',\n message: 'Missing result in successful response',\n })\n }\n\n maybeDispatchRPCEvent({\n id: req.id,\n method: req.method,\n status: 'success',\n durationMs: elapsedMs(startedAt),\n })\n\n return json.result as TResult\n } catch (err) {\n let rpcErr: unknown = err\n if (err instanceof Error && err.name === 'AbortError') {\n rpcErr = new AppletRPCException({\n code: timedOut ? 'timeout' : 'aborted',\n message: timedOut ? `RPC request timed out after ${timeoutMs}ms` : 'RPC request was aborted',\n cause: err,\n })\n }\n maybeDispatchRPCEvent({\n id: req.id,\n method: req.method,\n status: 'error',\n durationMs: elapsedMs(startedAt),\n error: rpcErr,\n })\n throw rpcErr\n } finally {\n if (timeoutHandle !== undefined) {\n clearTimeout(timeoutHandle)\n }\n }\n }\n\n async function callTyped<\n TRouter extends AppletRPCSchema,\n TMethod extends keyof TRouter & string,\n >(method: TMethod, params: TRouter[TMethod]['params']): Promise<TRouter[TMethod]['result']> {\n return call(method, params) as Promise<TRouter[TMethod]['result']>\n }\n\n return { call, callTyped }\n}\n\ntype RPCDevEvent = {\n id: string\n method: string\n status: 'start' | 'success' | 'error'\n durationMs?: number\n error?: unknown\n}\n\nfunction maybeDispatchRPCEvent(detail: RPCDevEvent) {\n if (typeof window === 'undefined') return\n\n if (!shouldEnableAppletDevtools()) return\n\n window.dispatchEvent(new CustomEvent('iota:applet-rpc', { detail }))\n}\n\nfunction elapsedMs(startedAt: number): number {\n const now = typeof performance !== 'undefined' ? performance.now() : Date.now()\n return Math.max(0, Math.round(now - startedAt))\n}\n","import type React from 'react'\n\nexport type RouterMode = 'url' | 'memory'\n\nexport interface CreateAppletRouterOptions {\n mode: RouterMode\n basePath?: string\n BrowserRouter: React.ComponentType<Record<string, unknown>>\n MemoryRouter: React.ComponentType<Record<string, unknown>>\n}\n\nexport function createAppletRouter(options: CreateAppletRouterOptions) {\n const basePath = options.basePath ?? ''\n\n const Router: React.FC<React.PropsWithChildren> = ({ children }) => {\n if (options.mode === 'memory') {\n const MemoryRouter = options.MemoryRouter\n return <MemoryRouter>{children}</MemoryRouter>\n }\n\n const BrowserRouter = options.BrowserRouter\n return <BrowserRouter basename={basePath}>{children}</BrowserRouter>\n }\n\n return { Router }\n}\n\n"]}
1
+ {"version":3,"sources":["../../ui/src/applet-host/react-element.ts","../../ui/src/applet-devtools/enabled.ts","../../ui/src/applet-host/rpc.ts","../../ui/src/applet-host/router.tsx"],"names":[],"mappings":"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","file":"host.mjs","sourcesContent":["import type React from 'react';\nimport { createRoot, type Root } from 'react-dom/client';\n\nexport type RouterMode = 'url' | 'memory'\nexport type ShellMode = 'embedded' | 'standalone'\n\ntype RegistryEntry = {\n options: DefineReactAppletElementOptions\n observed: Set<string>\n}\n\nexport interface AppletHostConfig {\n basePath: string\n shellMode?: ShellMode\n routerMode: RouterMode\n attrs: Record<string, string>\n}\n\nexport interface DefineReactAppletElementOptions {\n tagName: string\n styles?: string | (() => string)\n render: (host: AppletHostConfig) => React.ReactElement\n observedAttributes?: string[]\n observeDarkMode?: boolean\n}\n\nexport function defineReactAppletElement(options: DefineReactAppletElementOptions): void {\n const tagName = options.tagName.toLowerCase();\n\n const registry = getRegistry();\n const existing = registry.get(tagName);\n if (existing) {\n existing.options = options;\n for (const a of options.observedAttributes ?? []) {existing.observed.add(a);}\n } else {\n const observed = new Set<string>(['base-path', 'shell-mode', 'router-mode']);\n for (const a of options.observedAttributes ?? []) {observed.add(a);}\n registry.set(tagName, { options, observed });\n }\n\n if (customElements.get(tagName)) {\n if (typeof window !== 'undefined') {\n window.dispatchEvent(new CustomEvent('iota:applet-host-update', { detail: { tagName } }));\n }\n return;\n }\n\n function getEntry(): RegistryEntry {\n const entry = getRegistry().get(tagName);\n if (!entry) {throw new Error(`[${tagName}] applet host registry entry missing`);}\n return entry;\n }\n\n class ReactAppletElement extends HTMLElement {\n private reactRoot: Root | null = null;\n private container: HTMLDivElement | null = null;\n private darkModeObserver: MutationObserver | null = null;\n private styleEl: HTMLStyleElement | null = null;\n private updateListener: ((e: Event) => void) | null = null;\n\n static get observedAttributes(): string[] {\n return Array.from(getEntry().observed);\n }\n\n connectedCallback(): void {\n const shadowRoot = this.shadowRoot ?? this.attachShadow({ mode: 'open' });\n\n if (!this.container) {\n this.container = document.createElement('div');\n this.container.id = 'react-root';\n this.container.style.display = 'flex';\n this.container.style.flexDirection = 'column';\n this.container.style.flex = '1';\n this.container.style.minHeight = '0';\n this.container.style.height = '100%';\n this.container.style.width = '100%';\n }\n\n const existingContainer = shadowRoot.querySelector('#react-root');\n if (!existingContainer) {\n if (this.styleEl) {shadowRoot.appendChild(this.styleEl);}\n shadowRoot.appendChild(this.container);\n } else if (existingContainer !== this.container) {\n this.container = existingContainer as HTMLDivElement;\n }\n\n this.syncFromRegistry();\n\n this.updateListener ??= (e: Event) => {\n if (!(e instanceof CustomEvent)) {return;}\n const detail = (e as CustomEvent<{ tagName?: string }>).detail;\n if (!detail || detail.tagName !== tagName) {return;}\n this.syncFromRegistry();\n this.renderReact();\n };\n window.addEventListener('iota:applet-host-update', this.updateListener as EventListener);\n\n this.renderReact();\n }\n\n disconnectedCallback(): void {\n if (this.updateListener) {\n window.removeEventListener('iota:applet-host-update', this.updateListener as EventListener);\n }\n\n this.darkModeObserver?.disconnect();\n this.darkModeObserver = null;\n\n this.reactRoot?.unmount();\n this.reactRoot = null;\n }\n\n attributeChangedCallback(_name: string, oldValue: string | null, newValue: string | null): void {\n if (oldValue === newValue) {return;}\n if (this.container) {this.renderReact();}\n }\n\n private getHostConfig(): AppletHostConfig {\n const attrs: Record<string, string> = {};\n for (const { name, value } of Array.from(this.attributes)) {\n attrs[name] = value;\n }\n\n const basePath = this.getAttribute('base-path') ?? '';\n const shellMode = (this.getAttribute('shell-mode') as ShellMode | null) ?? undefined;\n const routerMode = (this.getAttribute('router-mode') as RouterMode | null) ?? 'url';\n\n return { basePath, shellMode, routerMode, attrs };\n }\n\n private renderReact(): void {\n if (!this.container) {return;}\n\n if (!this.reactRoot) {\n this.reactRoot = createRoot(this.container);\n }\n\n try {\n this.reactRoot.render(getEntry().options.render(this.getHostConfig()));\n } catch (err) {\n console.error(`[${tagName}] failed to mount React app:`, err);\n }\n }\n\n private syncFromRegistry(): void {\n const entry = getEntry();\n\n const styles = typeof entry.options.styles === 'function' ? entry.options.styles() : entry.options.styles;\n if (styles) {\n this.styleEl ??= document.createElement('style');\n this.styleEl.textContent = styles;\n if (this.shadowRoot && !this.shadowRoot.contains(this.styleEl)) {\n this.shadowRoot.insertBefore(this.styleEl, this.shadowRoot.firstChild);\n }\n } else if (this.styleEl) {\n this.styleEl.remove();\n this.styleEl = null;\n }\n\n if (entry.options.observeDarkMode !== false) {\n this.darkModeObserver ??= this.syncDarkMode();\n } else if (this.darkModeObserver) {\n this.darkModeObserver.disconnect();\n this.darkModeObserver = null;\n }\n }\n\n private syncDarkMode(): MutationObserver {\n const root = this.container;\n if (!root) {throw new Error('react root container not found');}\n\n const apply = () => {\n if (document.documentElement.classList.contains('dark')) {root.classList.add('dark');}\n else {root.classList.remove('dark');}\n };\n\n apply();\n\n const observer = new MutationObserver(apply);\n observer.observe(document.documentElement, { attributes: true, attributeFilter: ['class'] });\n return observer;\n }\n }\n\n customElements.define(tagName, ReactAppletElement);\n}\n\nfunction getRegistry(): Map<string, RegistryEntry> {\n const g = globalThis as Record<string, unknown>;\n g.__IOTA_REACT_APPLET_HOST_REGISTRY__ ??= new Map<string, RegistryEntry>();\n return g.__IOTA_REACT_APPLET_HOST_REGISTRY__ as Map<string, RegistryEntry>;\n}\n","export function shouldEnableAppletDevtools(): boolean {\n if (typeof window === 'undefined') {return false;}\n\n const url = new URL(window.location.href);\n if (url.searchParams.get('appletDebug') === '1') {return true;}\n\n try {\n return window.localStorage.getItem('iotaAppletDevtools') === '1';\n } catch {\n return false;\n }\n}\n\n","import { shouldEnableAppletDevtools } from '../applet-devtools/enabled';\n\nexport interface AppletRPCError {\n code: string\n message: string\n details?: unknown\n}\n\nexport class AppletRPCException extends Error {\n code: string;\n details?: unknown;\n cause?: unknown;\n\n constructor(args: { code: string; message: string; details?: unknown; cause?: unknown }) {\n super(args.message);\n this.name = 'AppletRPCException';\n this.code = args.code;\n this.details = args.details;\n this.cause = args.cause;\n }\n}\n\nexport type AppletRPCSchema = Record<string, { params: unknown; result: unknown }>\n\ninterface RPCRequest {\n id: string\n method: string\n params: unknown\n}\n\ninterface RPCResponse<TResult> {\n id: string\n result?: TResult\n error?: AppletRPCError\n}\n\nexport interface CreateAppletRPCClientOptions {\n endpoint: string\n fetcher?: typeof fetch\n timeoutMs?: number\n}\n\nexport function createAppletRPCClient(options: CreateAppletRPCClientOptions) {\n const fetcher = options.fetcher ?? fetch;\n const timeoutMs = typeof options.timeoutMs === 'number' && options.timeoutMs > 0 ? options.timeoutMs : 0;\n\n async function call<TParams, TResult>(method: string, params: TParams): Promise<TResult> {\n const req: RPCRequest = { id: crypto.randomUUID(), method, params };\n const startedAt = typeof performance !== 'undefined' ? performance.now() : Date.now();\n const abortController = timeoutMs > 0 ? new AbortController() : undefined;\n let timeoutHandle: ReturnType<typeof setTimeout> | undefined;\n let timedOut = false;\n maybeDispatchRPCEvent({\n id: req.id,\n method: req.method,\n status: 'start',\n });\n\n try {\n if (abortController) {\n timeoutHandle = setTimeout(() => {\n timedOut = true;\n abortController.abort();\n }, timeoutMs);\n }\n\n const resp = await fetcher(options.endpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(req),\n signal: abortController?.signal,\n });\n\n if (!resp.ok) {\n throw new AppletRPCException({\n code: 'http_error',\n message: `HTTP ${resp.status}`,\n details: { status: resp.status },\n });\n }\n\n const json = (await resp.json()) as RPCResponse<TResult>;\n if (json.error) {\n throw new AppletRPCException({\n code: json.error.code,\n message: json.error.message,\n details: json.error.details,\n });\n }\n\n if (json.result === undefined) {\n throw new AppletRPCException({\n code: 'invalid_response',\n message: 'Missing result in successful response',\n });\n }\n\n maybeDispatchRPCEvent({\n id: req.id,\n method: req.method,\n status: 'success',\n durationMs: elapsedMs(startedAt),\n });\n\n return json.result as TResult;\n } catch (err) {\n let rpcErr: unknown = err;\n if (err instanceof Error && err.name === 'AbortError') {\n rpcErr = new AppletRPCException({\n code: timedOut ? 'timeout' : 'aborted',\n message: timedOut ? `RPC request timed out after ${timeoutMs}ms` : 'RPC request was aborted',\n cause: err,\n });\n }\n maybeDispatchRPCEvent({\n id: req.id,\n method: req.method,\n status: 'error',\n durationMs: elapsedMs(startedAt),\n error: rpcErr,\n });\n throw rpcErr;\n } finally {\n if (timeoutHandle !== undefined) {\n clearTimeout(timeoutHandle);\n }\n }\n }\n\n async function callTyped<\n TRouter extends AppletRPCSchema,\n TMethod extends keyof TRouter & string,\n >(method: TMethod, params: TRouter[TMethod]['params']): Promise<TRouter[TMethod]['result']> {\n return call(method, params) as Promise<TRouter[TMethod]['result']>;\n }\n\n return { call, callTyped };\n}\n\ntype RPCDevEvent = {\n id: string\n method: string\n status: 'start' | 'success' | 'error'\n durationMs?: number\n error?: unknown\n}\n\nfunction maybeDispatchRPCEvent(detail: RPCDevEvent) {\n if (typeof window === 'undefined') {return;}\n\n if (!shouldEnableAppletDevtools()) {return;}\n\n window.dispatchEvent(new CustomEvent('iota:applet-rpc', { detail }));\n}\n\nfunction elapsedMs(startedAt: number): number {\n const now = typeof performance !== 'undefined' ? performance.now() : Date.now();\n return Math.max(0, Math.round(now - startedAt));\n}\n","import type React from 'react';\n\nexport type RouterMode = 'url' | 'memory'\n\nexport interface CreateAppletRouterOptions {\n mode: RouterMode\n basePath?: string\n BrowserRouter: React.ComponentType<Record<string, unknown>>\n MemoryRouter: React.ComponentType<Record<string, unknown>>\n}\n\nexport function createAppletRouter(options: CreateAppletRouterOptions) {\n const basePath = options.basePath ?? '';\n\n const Router: React.FC<React.PropsWithChildren> = ({ children }) => {\n if (options.mode === 'memory') {\n const MemoryRouter = options.MemoryRouter;\n return <MemoryRouter>{children}</MemoryRouter>;\n }\n\n const BrowserRouter = options.BrowserRouter;\n return <BrowserRouter basename={basePath}>{children}</BrowserRouter>;\n };\n\n return { Router };\n}\n\n"]}
@@ -22,7 +22,9 @@ function getAppletAssetsBase(basePath) {
22
22
  }
23
23
  function getAppletVitePort(defaultPort = 5173) {
24
24
  const p = process.env.APPLET_VITE_PORT;
25
- if (p === void 0 || p === "") return defaultPort;
25
+ if (p === void 0 || p === "") {
26
+ return defaultPort;
27
+ }
26
28
  const n = Number(p);
27
29
  return Number.isFinite(n) ? n : defaultPort;
28
30
  }
@@ -63,7 +65,9 @@ function createAppletBackendProxy(opts) {
63
65
  function createLocalSdkAliases(opts) {
64
66
  const enabled = opts?.enabled ?? Boolean(opts?.sdkDistDir ?? process.env.IOTA_SDK_DIST);
65
67
  const dir = opts?.sdkDistDir ?? process.env.IOTA_SDK_DIST;
66
- if (!enabled || !dir) return [];
68
+ if (!enabled || !dir) {
69
+ return [];
70
+ }
67
71
  const sdkDist = path2__default.default.resolve(dir);
68
72
  return [
69
73
  { find: /^@iota-uz\/sdk\/bichat$/, replacement: path2__default.default.join(sdkDist, "bichat/index.mjs") },
@@ -127,11 +131,15 @@ function createAppletStylesVirtualModulePlugin(options = {}) {
127
131
  root = config.root;
128
132
  },
129
133
  resolveId(id) {
130
- if (id === VIRTUAL_APPLET_STYLES_ID) return RESOLVED_ID;
134
+ if (id === VIRTUAL_APPLET_STYLES_ID) {
135
+ return RESOLVED_ID;
136
+ }
131
137
  return null;
132
138
  },
133
139
  load(id) {
134
- if (id !== RESOLVED_ID) return null;
140
+ if (id !== RESOLVED_ID) {
141
+ return null;
142
+ }
135
143
  const parts = [];
136
144
  for (const p of prependCss) {
137
145
  const full = resolvePrependPath(p, root);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../ui/src/applet-vite/vite.ts","../../ui/src/applet-vite/styles-plugin.ts"],"names":["path","createRequire","fs","os","crypto","spawnSync"],"mappings":"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","file":"vite.cjs","sourcesContent":["/**\n * Applet Frontend Kit: Vite config helpers for applets running behind a base path\n * with dev proxy and optional local SDK aliasing.\n */\nimport type { UserConfig } from 'vite'\nimport path from 'node:path'\n\nexport type AppletViteOptions = {\n /** Applet base path (e.g. \"/admin/ali/chat\" or \"/bi-chat\"). */\n basePath: string\n /** Backend URL for proxy (e.g. \"http://localhost:3200\"). */\n backendUrl: string\n /** Enable Vite aliases to local SDK dist for HMR when iterating on SDK (default: from IOTA_SDK_DIST) */\n enableLocalSdkAliases?: boolean\n /** Override SDK dist directory when enableLocalSdkAliases is true (default: process.env.IOTA_SDK_DIST) */\n sdkDistDir?: string\n /** Merge additional Vite config */\n extend?: UserConfig\n}\n\nconst DEFAULT_DEDUPE = ['react', 'react-dom', 'react-router-dom', 'react-is']\n\n/**\n * Returns base URL for assets (with trailing slash). Uses APPLET_ASSETS_BASE env if set, otherwise derives from basePath.\n */\nexport function getAppletAssetsBase(basePath: string): string {\n const base = process.env.APPLET_ASSETS_BASE ?? basePath + '/assets/'\n return base.endsWith('/') ? base : base + '/'\n}\n\n/**\n * Returns dev server port from APPLET_VITE_PORT env, or the given default.\n */\nexport function getAppletVitePort(defaultPort = 5173): number {\n const p = process.env.APPLET_VITE_PORT\n if (p === undefined || p === '') return defaultPort\n const n = Number(p)\n return Number.isFinite(n) ? n : defaultPort\n}\n\n/**\n * Builds a full Vite config for an applet: base, port, dedupe, proxy, optional local SDK aliases.\n *\n * **Merge semantics for `extend`:** When you pass `extend`, it is merged with the base config as follows:\n * - **resolve.alias**: arrays are concatenated (base aliases first, then extend aliases).\n * - **plugins**: arrays are concatenated (base plugins first, then extend plugins).\n * - **server**, **base**, **resolve.dedupe** and other scalar/object fields: extend overrides base (Object.assign-style).\n * To fully override the base config, spread first: `defineConfig({ ...createAppletViteConfig(opts), ...yourOverrides })`.\n */\nexport function createAppletViteConfig(opts: AppletViteOptions): UserConfig {\n const base = getAppletAssetsBase(opts.basePath)\n const port = getAppletVitePort(5173)\n const config: UserConfig = {\n base,\n resolve: {\n dedupe: DEFAULT_DEDUPE,\n alias: createLocalSdkAliases({\n enabled: opts.enableLocalSdkAliases ?? Boolean(process.env.IOTA_SDK_DIST),\n sdkDistDir: opts.sdkDistDir ?? process.env.IOTA_SDK_DIST,\n }),\n },\n server: {\n port,\n strictPort: true,\n proxy: createAppletBackendProxy({\n basePath: opts.basePath,\n backendUrl: opts.backendUrl,\n }),\n },\n }\n if (opts.extend) {\n return mergeConfig(config, opts.extend)\n }\n return config\n}\n\n/**\n * Returns proxy entries for applet RPC and stream under basePath.\n * Use as server.proxy in Vite config.\n * Note: /stream is SSE; plain string targets do not set ws or changeOrigin. If WebSocket upgrade or SSE proxying issues arise, configure proxy with ws: true or a custom configure.\n */\nexport function createAppletBackendProxy(opts: {\n basePath: string\n backendUrl: string\n}): Record<string, string> {\n const base = opts.basePath.replace(/\\/+$/, '')\n const target = opts.backendUrl.replace(/\\/+$/, '')\n return {\n [base + '/rpc']: target,\n [base + '/stream']: target,\n }\n}\n\n/**\n * Returns resolve.alias entries to point @iota-uz/sdk and @iota-uz/sdk/bichat to a local dist.\n * Use when IOTA_SDK_DIST is set or sdkDistDir is passed, so the app uses the local SDK build with HMR.\n */\nexport function createLocalSdkAliases(opts?: {\n enabled?: boolean\n sdkDistDir?: string\n}): Array<{ find: string | RegExp; replacement: string }> {\n const enabled = opts?.enabled ?? Boolean(opts?.sdkDistDir ?? process.env.IOTA_SDK_DIST)\n const dir = opts?.sdkDistDir ?? process.env.IOTA_SDK_DIST\n if (!enabled || !dir) return []\n const sdkDist = path.resolve(dir)\n return [\n { find: /^@iota-uz\\/sdk\\/bichat$/, replacement: path.join(sdkDist, 'bichat/index.mjs') },\n { find: /^@iota-uz\\/sdk$/, replacement: path.join(sdkDist, 'index.mjs') },\n ]\n}\n\n/**\n * Merges base config with extend. Start with merged = { ...a, ...b } so no Vite fields from b are dropped.\n * We capture a.resolve, b.resolve, a.server, b.server, a.plugins, b.plugins before the spread so we never\n * read b's values as \"original\" a when merging. resolve.alias: only coerce to array when both sides are\n * actually arrays (concat); otherwise leave Record/object as-is and prefer b's value then a's.\n */\nfunction mergeConfig(a: UserConfig, b: UserConfig): UserConfig {\n const aResolve = a.resolve\n const bResolve = b.resolve\n const aServer = a.server\n const bServer = b.server\n const aPlugins = a.plugins\n const bPlugins = b.plugins\n\n const merged: UserConfig = { ...a, ...b }\n\n if (bResolve) {\n const aAlias = aResolve?.alias\n const bAlias = bResolve.alias\n const aIsArray = Array.isArray(aAlias)\n const bIsArray = Array.isArray(bAlias)\n const alias =\n aIsArray && bIsArray\n ? [...(aAlias as Array<{ find: string | RegExp; replacement: string }>), ...(bAlias as Array<{ find: string | RegExp; replacement: string }>)]\n : (bAlias !== undefined ? bAlias : aResolve?.alias)\n merged.resolve = {\n ...aResolve,\n ...bResolve,\n alias,\n dedupe: bResolve.dedupe ?? merged.resolve?.dedupe ?? aResolve?.dedupe,\n }\n }\n if (bServer) {\n merged.server = { ...aServer, ...bServer }\n }\n if (bPlugins) {\n merged.plugins = [...(aPlugins ?? []), ...bPlugins]\n }\n return merged\n}\n","/**\n * Vite plugin that provides a virtual module exporting the compiled applet CSS string\n * for Shadow DOM injection (defineReactAppletElement({ styles })).\n * Can compile CSS via Tailwind CLI in the plugin or fall back to reading a prebuilt file.\n */\nimport type { Plugin } from 'vite'\nimport { spawnSync } from 'node:child_process'\nimport crypto from 'node:crypto'\nimport fs from 'node:fs'\nimport { createRequire } from 'node:module'\nimport os from 'node:os'\nimport path from 'node:path'\n\nexport const VIRTUAL_APPLET_STYLES_ID = 'virtual:applet-styles'\nconst RESOLVED_ID = '\\0' + VIRTUAL_APPLET_STYLES_ID\n\nexport type AppletStylesVirtualModuleOptions = {\n /**\n * Input CSS for Tailwind (e.g. src/index.css). When set, the plugin tries to run Tailwind CLI to compile.\n * Default: \"src/index.css\"\n */\n inputCss?: string\n /**\n * Path to Tailwind config (optional). If not set, CLI uses its default lookup.\n */\n tailwindConfigPath?: string\n /**\n * Path to the compiled CSS file when not using Tailwind CLI (fallback), or when Tailwind is not available.\n * Default: \"dist/style.css\"\n */\n outputCssPath?: string\n /**\n * CSS to prepend: package specifiers (e.g. \"@iota-uz/sdk/bichat/styles.css\") or paths relative to project root.\n * Specifiers are resolved via Node resolution from the project root.\n * Default: []\n */\n prependCss?: string[]\n}\n\n/**\n * Resolves a prepend CSS entry: absolute paths returned as-is; non-relative, non-absolute\n * specifiers (e.g. @iota-uz/sdk/bichat/styles.css or some-lib/styles.css) are resolved via\n * Node module resolution first; relative paths are joined to root.\n */\nfunction resolvePrependPath(specifierOrPath: string, root: string): string | null {\n if (path.isAbsolute(specifierOrPath)) {\n return specifierOrPath\n }\n if (!specifierOrPath.startsWith('.') && !specifierOrPath.startsWith('/')) {\n try {\n const req = createRequire(path.join(root, 'package.json'))\n return req.resolve(specifierOrPath)\n } catch {\n return null\n }\n }\n return path.join(root, specifierOrPath)\n}\n\n/**\n * Creates a Vite plugin that registers virtual:applet-styles and exports the compiled CSS string.\n * When inputCss is set, tries to run Tailwind CLI to compile; if Tailwind is not available, falls back to reading outputCssPath.\n */\nexport function createAppletStylesVirtualModulePlugin(\n options: AppletStylesVirtualModuleOptions = {}\n): Plugin {\n const inputCss = options.inputCss ?? 'src/index.css'\n const outputCssPath = options.outputCssPath ?? 'dist/style.css'\n const tailwindConfigPath = options.tailwindConfigPath\n const prependCss = options.prependCss ?? []\n let root = process.cwd()\n\n return {\n name: 'applet-styles-virtual-module',\n configResolved(config) {\n root = config.root\n },\n resolveId(id: string) {\n if (id === VIRTUAL_APPLET_STYLES_ID) return RESOLVED_ID\n return null\n },\n load(id: string) {\n if (id !== RESOLVED_ID) return null\n\n const parts: string[] = []\n\n for (const p of prependCss) {\n const full = resolvePrependPath(p, root)\n if (full) {\n try {\n parts.push(fs.readFileSync(full, 'utf-8'))\n } catch {\n // Prepend file missing (e.g. optional SDK styles); skip\n }\n }\n }\n\n const inputPath = path.join(root, inputCss)\n let mainCss: string | null = null\n\n // Try Tailwind CLI if input file exists. spawnSync blocks the event loop; for parallel builds consider a random suffix (e.g. crypto.randomUUID()).\n if (fs.existsSync(inputPath)) {\n const tmpFile = path.join(os.tmpdir(), `applet-styles-${Date.now()}-${crypto.randomUUID()}.css`)\n const args = ['-i', inputPath, '-o', tmpFile]\n if (tailwindConfigPath) {\n const configPath = path.join(root, tailwindConfigPath)\n if (fs.existsSync(configPath)) {\n args.push('-c', configPath)\n }\n }\n // Use platform-specific executable and no shell so args (paths with spaces) are passed safely on Windows.\n const pnpmCmd = process.platform === 'win32' ? 'pnpm.cmd' : 'pnpm'\n const result = spawnSync(pnpmCmd, ['exec', 'tailwindcss', ...args], {\n cwd: root,\n stdio: 'pipe',\n })\n if (result.status === 0 && fs.existsSync(tmpFile)) {\n mainCss = fs.readFileSync(tmpFile, 'utf-8')\n try {\n fs.unlinkSync(tmpFile)\n } catch {\n /* ignore */\n }\n }\n }\n\n if (mainCss === null) {\n const fallbackPath = path.isAbsolute(outputCssPath) ? outputCssPath : path.join(root, outputCssPath)\n try {\n mainCss = fs.readFileSync(fallbackPath, 'utf-8')\n } catch {\n if (process.env.NODE_ENV !== 'production') {\n console.warn(\n `[applet-styles] Could not compile via Tailwind CLI and ${fallbackPath} not found; export empty string. Install tailwindcss in the project or build CSS first.`\n )\n }\n mainCss = ''\n }\n }\n\n parts.push(mainCss)\n const css = parts.join('\\n')\n return `export default ${JSON.stringify(css)}`\n },\n }\n}\n\n/**\n * Convenience plugin for BiChat applets: compiles app CSS and prepends SDK BiChat styles.\n * Uses default input src/index.css and package specifier @iota-uz/sdk/bichat/styles.css.\n */\nexport function createBichatStylesPlugin(\n options: Omit<AppletStylesVirtualModuleOptions, 'prependCss'> = {}\n): Plugin {\n return createAppletStylesVirtualModulePlugin({\n ...options,\n inputCss: options.inputCss ?? 'src/index.css',\n outputCssPath: options.outputCssPath ?? 'dist/style.css',\n prependCss: ['@iota-uz/sdk/bichat/styles.css'],\n })\n}\n"]}
1
+ {"version":3,"sources":["../../ui/src/applet-vite/vite.ts","../../ui/src/applet-vite/styles-plugin.ts"],"names":["path","createRequire","fs","os","crypto","spawnSync"],"mappings":"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","file":"vite.cjs","sourcesContent":["/**\n * Applet Frontend Kit: Vite config helpers for applets running behind a base path\n * with dev proxy and optional local SDK aliasing.\n */\nimport type { UserConfig } from 'vite';\nimport path from 'node:path';\n\nexport type AppletViteOptions = {\n /** Applet base path (e.g. \"/admin/ali/chat\" or \"/bi-chat\"). */\n basePath: string\n /** Backend URL for proxy (e.g. \"http://localhost:3200\"). */\n backendUrl: string\n /** Enable Vite aliases to local SDK dist for HMR when iterating on SDK (default: from IOTA_SDK_DIST) */\n enableLocalSdkAliases?: boolean\n /** Override SDK dist directory when enableLocalSdkAliases is true (default: process.env.IOTA_SDK_DIST) */\n sdkDistDir?: string\n /** Merge additional Vite config */\n extend?: UserConfig\n}\n\nconst DEFAULT_DEDUPE = ['react', 'react-dom', 'react-router-dom', 'react-is'];\n\n/**\n * Returns base URL for assets (with trailing slash). Uses APPLET_ASSETS_BASE env if set, otherwise derives from basePath.\n */\nexport function getAppletAssetsBase(basePath: string): string {\n const base = process.env.APPLET_ASSETS_BASE ?? basePath + '/assets/';\n return base.endsWith('/') ? base : base + '/';\n}\n\n/**\n * Returns dev server port from APPLET_VITE_PORT env, or the given default.\n */\nexport function getAppletVitePort(defaultPort = 5173): number {\n const p = process.env.APPLET_VITE_PORT;\n if (p === undefined || p === '') {return defaultPort;}\n const n = Number(p);\n return Number.isFinite(n) ? n : defaultPort;\n}\n\n/**\n * Builds a full Vite config for an applet: base, port, dedupe, proxy, optional local SDK aliases.\n *\n * **Merge semantics for `extend`:** When you pass `extend`, it is merged with the base config as follows:\n * - **resolve.alias**: arrays are concatenated (base aliases first, then extend aliases).\n * - **plugins**: arrays are concatenated (base plugins first, then extend plugins).\n * - **server**, **base**, **resolve.dedupe** and other scalar/object fields: extend overrides base (Object.assign-style).\n * To fully override the base config, spread first: `defineConfig({ ...createAppletViteConfig(opts), ...yourOverrides })`.\n */\nexport function createAppletViteConfig(opts: AppletViteOptions): UserConfig {\n const base = getAppletAssetsBase(opts.basePath);\n const port = getAppletVitePort(5173);\n const config: UserConfig = {\n base,\n resolve: {\n dedupe: DEFAULT_DEDUPE,\n alias: createLocalSdkAliases({\n enabled: opts.enableLocalSdkAliases ?? Boolean(process.env.IOTA_SDK_DIST),\n sdkDistDir: opts.sdkDistDir ?? process.env.IOTA_SDK_DIST,\n }),\n },\n server: {\n port,\n strictPort: true,\n proxy: createAppletBackendProxy({\n basePath: opts.basePath,\n backendUrl: opts.backendUrl,\n }),\n },\n };\n if (opts.extend) {\n return mergeConfig(config, opts.extend);\n }\n return config;\n}\n\n/**\n * Returns proxy entries for applet RPC and stream under basePath.\n * Use as server.proxy in Vite config.\n * Note: /stream is SSE; plain string targets do not set ws or changeOrigin. If WebSocket upgrade or SSE proxying issues arise, configure proxy with ws: true or a custom configure.\n */\nexport function createAppletBackendProxy(opts: {\n basePath: string\n backendUrl: string\n}): Record<string, string> {\n const base = opts.basePath.replace(/\\/+$/, '');\n const target = opts.backendUrl.replace(/\\/+$/, '');\n return {\n [base + '/rpc']: target,\n [base + '/stream']: target,\n };\n}\n\n/**\n * Returns resolve.alias entries to point @iota-uz/sdk and @iota-uz/sdk/bichat to a local dist.\n * Use when IOTA_SDK_DIST is set or sdkDistDir is passed, so the app uses the local SDK build with HMR.\n */\nexport function createLocalSdkAliases(opts?: {\n enabled?: boolean\n sdkDistDir?: string\n}): Array<{ find: string | RegExp; replacement: string }> {\n const enabled = opts?.enabled ?? Boolean(opts?.sdkDistDir ?? process.env.IOTA_SDK_DIST);\n const dir = opts?.sdkDistDir ?? process.env.IOTA_SDK_DIST;\n if (!enabled || !dir) {return [];}\n const sdkDist = path.resolve(dir);\n return [\n { find: /^@iota-uz\\/sdk\\/bichat$/, replacement: path.join(sdkDist, 'bichat/index.mjs') },\n { find: /^@iota-uz\\/sdk$/, replacement: path.join(sdkDist, 'index.mjs') },\n ];\n}\n\n/**\n * Merges base config with extend. Start with merged = { ...a, ...b } so no Vite fields from b are dropped.\n * We capture a.resolve, b.resolve, a.server, b.server, a.plugins, b.plugins before the spread so we never\n * read b's values as \"original\" a when merging. resolve.alias: only coerce to array when both sides are\n * actually arrays (concat); otherwise leave Record/object as-is and prefer b's value then a's.\n */\nfunction mergeConfig(a: UserConfig, b: UserConfig): UserConfig {\n const aResolve = a.resolve;\n const bResolve = b.resolve;\n const aServer = a.server;\n const bServer = b.server;\n const aPlugins = a.plugins;\n const bPlugins = b.plugins;\n\n const merged: UserConfig = { ...a, ...b };\n\n if (bResolve) {\n const aAlias = aResolve?.alias;\n const bAlias = bResolve.alias;\n const aIsArray = Array.isArray(aAlias);\n const bIsArray = Array.isArray(bAlias);\n const alias =\n aIsArray && bIsArray\n ? [...(aAlias as Array<{ find: string | RegExp; replacement: string }>), ...(bAlias as Array<{ find: string | RegExp; replacement: string }>)]\n : (bAlias !== undefined ? bAlias : aResolve?.alias);\n merged.resolve = {\n ...aResolve,\n ...bResolve,\n alias,\n dedupe: bResolve.dedupe ?? merged.resolve?.dedupe ?? aResolve?.dedupe,\n };\n }\n if (bServer) {\n merged.server = { ...aServer, ...bServer };\n }\n if (bPlugins) {\n merged.plugins = [...(aPlugins ?? []), ...bPlugins];\n }\n return merged;\n}\n","/**\n * Vite plugin that provides a virtual module exporting the compiled applet CSS string\n * for Shadow DOM injection (defineReactAppletElement({ styles })).\n * Can compile CSS via Tailwind CLI in the plugin or fall back to reading a prebuilt file.\n */\nimport type { Plugin } from 'vite';\nimport { spawnSync } from 'node:child_process';\nimport crypto from 'node:crypto';\nimport fs from 'node:fs';\nimport { createRequire } from 'node:module';\nimport os from 'node:os';\nimport path from 'node:path';\n\nexport const VIRTUAL_APPLET_STYLES_ID = 'virtual:applet-styles';\nconst RESOLVED_ID = '\\0' + VIRTUAL_APPLET_STYLES_ID;\n\nexport type AppletStylesVirtualModuleOptions = {\n /**\n * Input CSS for Tailwind (e.g. src/index.css). When set, the plugin tries to run Tailwind CLI to compile.\n * Default: \"src/index.css\"\n */\n inputCss?: string\n /**\n * Path to Tailwind config (optional). If not set, CLI uses its default lookup.\n */\n tailwindConfigPath?: string\n /**\n * Path to the compiled CSS file when not using Tailwind CLI (fallback), or when Tailwind is not available.\n * Default: \"dist/style.css\"\n */\n outputCssPath?: string\n /**\n * CSS to prepend: package specifiers (e.g. \"@iota-uz/sdk/bichat/styles.css\") or paths relative to project root.\n * Specifiers are resolved via Node resolution from the project root.\n * Default: []\n */\n prependCss?: string[]\n}\n\n/**\n * Resolves a prepend CSS entry: absolute paths returned as-is; non-relative, non-absolute\n * specifiers (e.g. @iota-uz/sdk/bichat/styles.css or some-lib/styles.css) are resolved via\n * Node module resolution first; relative paths are joined to root.\n */\nfunction resolvePrependPath(specifierOrPath: string, root: string): string | null {\n if (path.isAbsolute(specifierOrPath)) {\n return specifierOrPath;\n }\n if (!specifierOrPath.startsWith('.') && !specifierOrPath.startsWith('/')) {\n try {\n const req = createRequire(path.join(root, 'package.json'));\n return req.resolve(specifierOrPath);\n } catch {\n return null;\n }\n }\n return path.join(root, specifierOrPath);\n}\n\n/**\n * Creates a Vite plugin that registers virtual:applet-styles and exports the compiled CSS string.\n * When inputCss is set, tries to run Tailwind CLI to compile; if Tailwind is not available, falls back to reading outputCssPath.\n */\nexport function createAppletStylesVirtualModulePlugin(\n options: AppletStylesVirtualModuleOptions = {}\n): Plugin {\n const inputCss = options.inputCss ?? 'src/index.css';\n const outputCssPath = options.outputCssPath ?? 'dist/style.css';\n const tailwindConfigPath = options.tailwindConfigPath;\n const prependCss = options.prependCss ?? [];\n let root = process.cwd();\n\n return {\n name: 'applet-styles-virtual-module',\n configResolved(config) {\n root = config.root;\n },\n resolveId(id: string) {\n if (id === VIRTUAL_APPLET_STYLES_ID) {return RESOLVED_ID;}\n return null;\n },\n load(id: string) {\n if (id !== RESOLVED_ID) {return null;}\n\n const parts: string[] = [];\n\n for (const p of prependCss) {\n const full = resolvePrependPath(p, root);\n if (full) {\n try {\n parts.push(fs.readFileSync(full, 'utf-8'));\n } catch {\n // Prepend file missing (e.g. optional SDK styles); skip\n }\n }\n }\n\n const inputPath = path.join(root, inputCss);\n let mainCss: string | null = null;\n\n // Try Tailwind CLI if input file exists. spawnSync blocks the event loop; for parallel builds consider a random suffix (e.g. crypto.randomUUID()).\n if (fs.existsSync(inputPath)) {\n const tmpFile = path.join(os.tmpdir(), `applet-styles-${Date.now()}-${crypto.randomUUID()}.css`);\n const args = ['-i', inputPath, '-o', tmpFile];\n if (tailwindConfigPath) {\n const configPath = path.join(root, tailwindConfigPath);\n if (fs.existsSync(configPath)) {\n args.push('-c', configPath);\n }\n }\n // Use platform-specific executable and no shell so args (paths with spaces) are passed safely on Windows.\n const pnpmCmd = process.platform === 'win32' ? 'pnpm.cmd' : 'pnpm';\n const result = spawnSync(pnpmCmd, ['exec', 'tailwindcss', ...args], {\n cwd: root,\n stdio: 'pipe',\n });\n if (result.status === 0 && fs.existsSync(tmpFile)) {\n mainCss = fs.readFileSync(tmpFile, 'utf-8');\n try {\n fs.unlinkSync(tmpFile);\n } catch {\n /* ignore */\n }\n }\n }\n\n if (mainCss === null) {\n const fallbackPath = path.isAbsolute(outputCssPath) ? outputCssPath : path.join(root, outputCssPath);\n try {\n mainCss = fs.readFileSync(fallbackPath, 'utf-8');\n } catch {\n if (process.env.NODE_ENV !== 'production') {\n console.warn(\n `[applet-styles] Could not compile via Tailwind CLI and ${fallbackPath} not found; export empty string. Install tailwindcss in the project or build CSS first.`\n );\n }\n mainCss = '';\n }\n }\n\n parts.push(mainCss);\n const css = parts.join('\\n');\n return `export default ${JSON.stringify(css)}`;\n },\n };\n}\n\n/**\n * Convenience plugin for BiChat applets: compiles app CSS and prepends SDK BiChat styles.\n * Uses default input src/index.css and package specifier @iota-uz/sdk/bichat/styles.css.\n */\nexport function createBichatStylesPlugin(\n options: Omit<AppletStylesVirtualModuleOptions, 'prependCss'> = {}\n): Plugin {\n return createAppletStylesVirtualModulePlugin({\n ...options,\n inputCss: options.inputCss ?? 'src/index.css',\n outputCssPath: options.outputCssPath ?? 'dist/style.css',\n prependCss: ['@iota-uz/sdk/bichat/styles.css'],\n });\n}\n"]}