@altertable/data-app 0.59.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.
Files changed (174) hide show
  1. package/AGENTS.md +35 -0
  2. package/CONTRIBUTING.md +83 -0
  3. package/LICENSE +21 -0
  4. package/README.md +63 -0
  5. package/dist/bootstrap.js +388 -0
  6. package/dist/chunks/contract-14vxdcrs.js +192 -0
  7. package/dist/chunks/contract-14vxdcrs.js.map +10 -0
  8. package/dist/chunks/contract-8q35dcyh.js +9 -0
  9. package/dist/chunks/contract-8q35dcyh.js.map +10 -0
  10. package/dist/chunks/contract-jksbmt5q.js +133 -0
  11. package/dist/chunks/contract-jksbmt5q.js.map +10 -0
  12. package/dist/chunks/contract-mb5nfzwg.js +375 -0
  13. package/dist/chunks/contract-mb5nfzwg.js.map +12 -0
  14. package/dist/chunks/contract-mev09s5v.js +77 -0
  15. package/dist/chunks/contract-mev09s5v.js.map +10 -0
  16. package/dist/chunks/contract-nt819swq.js +321 -0
  17. package/dist/chunks/contract-nt819swq.js.map +11 -0
  18. package/dist/chunks/contract-ryyf6dme.js +21 -0
  19. package/dist/chunks/contract-ryyf6dme.js.map +10 -0
  20. package/dist/chunks/contract-tkkc28tg.js +213 -0
  21. package/dist/chunks/contract-tkkc28tg.js.map +12 -0
  22. package/dist/chunks/contract-tqrf3ykr.js +232 -0
  23. package/dist/chunks/contract-tqrf3ykr.js.map +11 -0
  24. package/dist/chunks/contract-wz59z8pq.js +8 -0
  25. package/dist/chunks/contract-wz59z8pq.js.map +10 -0
  26. package/dist/client/index.js +27 -0
  27. package/dist/client/index.js.map +9 -0
  28. package/dist/core/appearance.js +12 -0
  29. package/dist/core/appearance.js.map +9 -0
  30. package/dist/core/config.js +8 -0
  31. package/dist/core/config.js.map +9 -0
  32. package/dist/core/contract.js +55 -0
  33. package/dist/core/contract.js.map +9 -0
  34. package/dist/core/format.js +18 -0
  35. package/dist/core/format.js.map +9 -0
  36. package/dist/embed/index.js +91 -0
  37. package/dist/embed/index.js.map +11 -0
  38. package/dist/local.js +332 -0
  39. package/dist/local.js.map +15 -0
  40. package/dist/react/embed/index.js +130 -0
  41. package/dist/react/embed/index.js.map +11 -0
  42. package/dist/react/index.css +4478 -0
  43. package/dist/react/index.js +6105 -0
  44. package/dist/react/index.js.map +90 -0
  45. package/dist/react.css.d.ts +1 -0
  46. package/dist/server.js +231 -0
  47. package/dist/server.js.map +14 -0
  48. package/dist/types/client/iframe.d.ts +39 -0
  49. package/dist/types/client/index.d.ts +42 -0
  50. package/dist/types/client/location.d.ts +15 -0
  51. package/dist/types/client/messages.d.ts +7 -0
  52. package/dist/types/client/navigation.d.ts +14 -0
  53. package/dist/types/client/transport.d.ts +15 -0
  54. package/dist/types/core/appearance.d.ts +28 -0
  55. package/dist/types/core/bridge.d.ts +35 -0
  56. package/dist/types/core/config.d.ts +14 -0
  57. package/dist/types/core/contract.d.ts +139 -0
  58. package/dist/types/core/data-view.d.ts +46 -0
  59. package/dist/types/core/date-range.d.ts +20 -0
  60. package/dist/types/core/dimension.d.ts +60 -0
  61. package/dist/types/core/format.d.ts +40 -0
  62. package/dist/types/core/invariant.d.ts +2 -0
  63. package/dist/types/core/messages.d.ts +77 -0
  64. package/dist/types/core/reading.d.ts +17 -0
  65. package/dist/types/core/variables.d.ts +82 -0
  66. package/dist/types/embed/bootstrap.d.ts +5 -0
  67. package/dist/types/embed/host.d.ts +23 -0
  68. package/dist/types/embed/index.d.ts +11 -0
  69. package/dist/types/embed/navigation.d.ts +6 -0
  70. package/dist/types/embed/shell.d.ts +21 -0
  71. package/dist/types/embed/standalone.d.ts +1 -0
  72. package/dist/types/react/content.d.ts +23 -0
  73. package/dist/types/react/embed/bridge.d.ts +12 -0
  74. package/dist/types/react/embed/index.d.ts +9 -0
  75. package/dist/types/react/embed/shell.d.ts +10 -0
  76. package/dist/types/react/hooks.d.ts +831 -0
  77. package/dist/types/react/index.d.ts +11 -0
  78. package/dist/types/react/mount.d.ts +11 -0
  79. package/dist/types/react/ui/AboutData.d.ts +61 -0
  80. package/dist/types/react/ui/AltertableLogo.d.ts +3 -0
  81. package/dist/types/react/ui/AppFooter.d.ts +7 -0
  82. package/dist/types/react/ui/AppHeader.d.ts +12 -0
  83. package/dist/types/react/ui/AppLayout.d.ts +17 -0
  84. package/dist/types/react/ui/AppScope.d.ts +8 -0
  85. package/dist/types/react/ui/AppToolbar.d.ts +32 -0
  86. package/dist/types/react/ui/Breakdown.d.ts +14 -0
  87. package/dist/types/react/ui/Button.d.ts +12 -0
  88. package/dist/types/react/ui/Checkbox.d.ts +11 -0
  89. package/dist/types/react/ui/Combobox.d.ts +43 -0
  90. package/dist/types/react/ui/ComparisonVisual.d.ts +15 -0
  91. package/dist/types/react/ui/ContentSkeleton.d.ts +8 -0
  92. package/dist/types/react/ui/DataApp.d.ts +56 -0
  93. package/dist/types/react/ui/DataBoundary.d.ts +16 -0
  94. package/dist/types/react/ui/DataSection.d.ts +28 -0
  95. package/dist/types/react/ui/DataTable.d.ts +28 -0
  96. package/dist/types/react/ui/DataViewToast.d.ts +12 -0
  97. package/dist/types/react/ui/DataWidget.d.ts +39 -0
  98. package/dist/types/react/ui/DateRangePicker.d.ts +29 -0
  99. package/dist/types/react/ui/DateTimeTooltip.d.ts +10 -0
  100. package/dist/types/react/ui/DimensionPicker.d.ts +11 -0
  101. package/dist/types/react/ui/EmptyState.d.ts +9 -0
  102. package/dist/types/react/ui/GettingStarted.d.ts +9 -0
  103. package/dist/types/react/ui/GlossaryDefinition.d.ts +8 -0
  104. package/dist/types/react/ui/GlossaryExplanation.d.ts +17 -0
  105. package/dist/types/react/ui/GradientScroll.d.ts +16 -0
  106. package/dist/types/react/ui/Grid.d.ts +13 -0
  107. package/dist/types/react/ui/GridItem.d.ts +7 -0
  108. package/dist/types/react/ui/HelpPopover.d.ts +24 -0
  109. package/dist/types/react/ui/IconButton.d.ts +19 -0
  110. package/dist/types/react/ui/InspectionContext.d.ts +10 -0
  111. package/dist/types/react/ui/Kbd.d.ts +8 -0
  112. package/dist/types/react/ui/LiveControl.d.ts +11 -0
  113. package/dist/types/react/ui/MetricWidget.d.ts +48 -0
  114. package/dist/types/react/ui/PeriodSummary.d.ts +17 -0
  115. package/dist/types/react/ui/PresentStory.d.ts +34 -0
  116. package/dist/types/react/ui/QueryList.d.ts +15 -0
  117. package/dist/types/react/ui/Ranking.d.ts +14 -0
  118. package/dist/types/react/ui/RefreshControl.d.ts +11 -0
  119. package/dist/types/react/ui/RefreshRegion.d.ts +10 -0
  120. package/dist/types/react/ui/RequestHint.d.ts +21 -0
  121. package/dist/types/react/ui/SearchField.d.ts +23 -0
  122. package/dist/types/react/ui/SearchInput.d.ts +9 -0
  123. package/dist/types/react/ui/SearchMatch.d.ts +7 -0
  124. package/dist/types/react/ui/SelectableBarChart.d.ts +16 -0
  125. package/dist/types/react/ui/SelectionMark.d.ts +5 -0
  126. package/dist/types/react/ui/Sheet.d.ts +19 -0
  127. package/dist/types/react/ui/Skeleton.d.ts +6 -0
  128. package/dist/types/react/ui/Stack.d.ts +8 -0
  129. package/dist/types/react/ui/StatusPanel.d.ts +11 -0
  130. package/dist/types/react/ui/TableWidget.d.ts +57 -0
  131. package/dist/types/react/ui/Tabs.d.ts +6 -0
  132. package/dist/types/react/ui/ThemeSelector.d.ts +13 -0
  133. package/dist/types/react/ui/Tooltip.d.ts +23 -0
  134. package/dist/types/react/ui/UpdatedAt.d.ts +10 -0
  135. package/dist/types/react/ui/VariableBar.d.ts +7 -0
  136. package/dist/types/react/ui/VisualizationWidget.d.ts +52 -0
  137. package/dist/types/react/ui/WidgetDisclosure.d.ts +7 -0
  138. package/dist/types/react/ui/WidgetEvidence.d.ts +12 -0
  139. package/dist/types/react/ui/WidgetViewTabs.d.ts +17 -0
  140. package/dist/types/react/ui/chartColor.d.ts +1 -0
  141. package/dist/types/react/ui/classNames.d.ts +1 -0
  142. package/dist/types/react/ui/comparison.d.ts +30 -0
  143. package/dist/types/react/ui/data-context.d.ts +65 -0
  144. package/dist/types/react/ui/data-identifiers.d.ts +33 -0
  145. package/dist/types/react/ui/icons.d.ts +42 -0
  146. package/dist/types/react/ui/index.d.ts +129 -0
  147. package/dist/types/react/ui/metric.d.ts +11 -0
  148. package/dist/types/react/ui/search.d.ts +6 -0
  149. package/dist/types/react/ui/searchItems.d.ts +34 -0
  150. package/dist/types/react/ui/shortcuts.d.ts +32 -0
  151. package/dist/types/react/ui/story.d.ts +20 -0
  152. package/dist/types/react/ui/variables.d.ts +36 -0
  153. package/dist/types/react/ui/widget-views.d.ts +3 -0
  154. package/dist/types/react/view-controls.d.ts +17 -0
  155. package/dist/types/react/view.d.ts +49 -0
  156. package/dist/types/server/handler.d.ts +13 -0
  157. package/dist/types/server/index.d.ts +7 -0
  158. package/dist/types/server/local.d.ts +17 -0
  159. package/docs/app-authoring.md +26 -0
  160. package/docs/appearance.md +30 -0
  161. package/docs/bootstrap.md +76 -0
  162. package/docs/client.md +127 -0
  163. package/docs/config.md +21 -0
  164. package/docs/contract.md +95 -0
  165. package/docs/embed.md +98 -0
  166. package/docs/format.md +29 -0
  167. package/docs/react-embed.md +57 -0
  168. package/docs/react-styles.md +17 -0
  169. package/docs/react.md +248 -0
  170. package/docs/releasing.md +74 -0
  171. package/docs/server-bun.md +26 -0
  172. package/docs/server.md +47 -0
  173. package/docs/starter-agent-instructions.md +51 -0
  174. package/package.json +124 -0
@@ -0,0 +1,12 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/client/location.ts", "../src/client/navigation.ts", "../src/client/index.ts"],
4
+ "sourcesContent": [
5
+ "import { PARENT_PARAM, validLocation } from '@/src/core/bridge';\n\nexport type AppLocation = { search: string; hash: string };\nexport type DataAppLocation = {\n snapshot(): AppLocation;\n subscribe(listener: () => void): () => void;\n update(location: AppLocation, mode?: 'push' | 'replace'): void;\n};\n\n/** Opaque sandboxes keep app state in memory; URL frames retain their real URL for HMR. */\nexport function createAppLocation(\n frame: Window,\n virtual: boolean,\n publish: (location: AppLocation, mode: 'push' | 'replace') => void\n) {\n let state: AppLocation = { search: '', hash: '' };\n let disposed = false;\n const listeners = new Set<() => void>();\n\n function notify() {\n for (const listener of listeners) listener();\n }\n\n function snapshot(): AppLocation {\n if (virtual) return state;\n const url = new URL(frame.location.href);\n url.searchParams.delete(PARENT_PARAM);\n if (state.search !== url.search || state.hash !== url.hash)\n state = { search: url.search, hash: url.hash };\n\n return state;\n }\n\n function apply(next: AppLocation) {\n const previous = snapshot();\n if (previous.search === next.search && previous.hash === next.hash) return;\n if (virtual) state = next;\n else {\n const url = new URL(frame.location.href);\n const parent = url.searchParams.get(PARENT_PARAM);\n url.search = next.search;\n if (parent) url.searchParams.set(PARENT_PARAM, parent);\n url.hash = next.hash;\n frame.history.replaceState(null, '', url);\n frame.dispatchEvent(new Event('popstate'));\n }\n if (virtual) notify();\n }\n\n const location: DataAppLocation = {\n snapshot,\n subscribe(listener) {\n listeners.add(listener);\n if (!virtual) frame.addEventListener('popstate', listener);\n\n return () => {\n listeners.delete(listener);\n frame.removeEventListener('popstate', listener);\n };\n },\n update(next, mode = 'replace') {\n if (disposed) return;\n if (!validLocation(next)) throw new Error('Invalid app location.');\n const before = snapshot();\n if (before.search === next.search && before.hash === next.hash) return;\n apply(next);\n publish(next, mode);\n },\n };\n\n function dispose() {\n disposed = true;\n for (const listener of listeners)\n frame.removeEventListener('popstate', listener);\n listeners.clear();\n }\n\n return { location, apply, dispose };\n}\n",
6
+ "import { createAppLocation, type DataAppLocation } from '@/src/client/location';\nimport { validLocation } from '@/src/core/bridge';\nimport {\n navigationUpdateRoute,\n type NavigationUpdate,\n} from '@/src/core/messages';\nimport { createMessageClient } from '@/src/client/messages';\nimport {\n getDataAppTransport,\n localFrameBridge,\n type IframeTransport,\n} from '@/src/client/iframe';\n\nexport type DataAppNavigation = DataAppLocation & {\n /** Publish URL changes made outside the adapter, including the document title. */\n publish(mode?: 'push' | 'replace'): void;\n dispose(): void;\n};\n\n/** Attach app URL behavior to an already authenticated bridge. */\nexport function createDataAppNavigation({\n bridge,\n window: frame = window,\n}: {\n bridge: IframeTransport;\n window?: Window;\n}): DataAppNavigation {\n return attachNavigation(frame, bridge.mode === 'bundle', bridge).navigation;\n}\n\nfunction attachNavigation(\n frame: Window,\n virtual: boolean,\n connection: IframeTransport | Promise<IframeTransport>\n) {\n let disposed = false;\n let unsubscribe: (() => void) | undefined;\n let send: ((update: NavigationUpdate) => void) | undefined;\n let pendingUpdate: NavigationUpdate | undefined;\n const { location, apply, dispose } = createAppLocation(\n frame,\n virtual,\n publish\n );\n\n function publish(\n location: { search: string; hash: string },\n mode: 'push' | 'replace'\n ) {\n const update = { ...location, mode, title: frame.document.title };\n if (send) send(update);\n else pendingUpdate = update;\n }\n\n function attach(bridge: IframeTransport) {\n if (disposed) return;\n unsubscribe?.();\n const messages = createMessageClient(\n { 'navigation.update': navigationUpdateRoute },\n bridge.request\n );\n\n function sendUpdate(update: NavigationUpdate) {\n void messages.request('navigation.update', update).catch(() => {});\n }\n\n function receiveState(state: unknown) {\n if (!state || typeof state !== 'object' || !validLocation(state)) return;\n pendingUpdate = undefined;\n apply(state as { search: string; hash: string });\n }\n\n send = sendUpdate;\n unsubscribe = bridge.subscribe(receiveState);\n receiveState(bridge.snapshot());\n if (pendingUpdate) {\n sendUpdate(pendingUpdate);\n pendingUpdate = undefined;\n }\n }\n\n if ('then' in connection) void connection.then(attach).catch(() => {});\n else attach(connection);\n\n const navigation: DataAppNavigation = {\n ...location,\n publish(mode = 'replace') {\n if (!disposed) publish(location.snapshot(), mode);\n },\n dispose() {\n disposed = true;\n unsubscribe?.();\n dispose();\n send = undefined;\n pendingUpdate = undefined;\n },\n };\n\n return {\n navigation,\n attach,\n isDisposed() {\n return disposed;\n },\n };\n}\n\nconst navigationKey = Symbol.for('altertable.appNavigation');\ntype NavigationWindow = Window & {\n [navigationKey]?: ReturnType<typeof attachNavigation> & {\n bridge?: IframeTransport;\n };\n};\n\n/** URL controls attach navigation on demand; bootstrap and data-only clients do not. */\nexport function getDataAppNavigation(\n frame: Window = window\n): DataAppNavigation | undefined {\n const target = frame as NavigationWindow;\n const bridge = getDataAppTransport(frame);\n const cached = target[navigationKey]?.isDisposed()\n ? undefined\n : target[navigationKey];\n if (cached) {\n if (bridge && cached.bridge !== bridge) {\n cached.attach(bridge);\n cached.bridge = bridge;\n }\n\n return cached.navigation;\n }\n if (bridge) {\n const adapter = attachNavigation(frame, bridge.mode === 'bundle', bridge);\n target[navigationKey] = { bridge, ...adapter };\n\n return adapter.navigation;\n }\n const preview = localFrameBridge(frame);\n if (!preview?.connect) return undefined;\n const connection = preview.connect();\n const adapter = attachNavigation(frame, false, connection);\n const entry = {\n ...adapter,\n bridge: undefined as IframeTransport | undefined,\n };\n target[navigationKey] = entry;\n void connection\n .then(bridge => {\n entry.bridge = bridge;\n })\n .catch(() => {});\n\n return adapter.navigation;\n}\n",
7
+ "/**\n * Typed clients for HTTP and iframe delivery; safe to import in the browser.\n * @module @altertable/data-app/client\n * @see https://github.com/altertable-ai/data-app/blob/main/docs/client.md\n */\nimport {\n createHttpTransport,\n DataAppError,\n type DataTransport,\n} from '@/src/client/transport';\nimport { localFrameBridge } from '@/src/client/iframe';\nexport {\n createHttpTransport,\n DataAppError,\n type DataTransport,\n} from '@/src/client/transport';\nexport {\n createIframeTransport,\n installDataAppTransport,\n getDataAppTransport,\n type IframeTransport,\n} from '@/src/client/iframe';\nexport { createMessageClient } from '@/src/client/messages';\nimport type { DataOperations, DisclosedQuery } from '@/src/core/contract';\n\nexport type InputOf<T> = T extends { input: (value: unknown) => infer Input }\n ? Input\n : never;\nexport type OutputOf<T> = T extends { output: (value: unknown) => infer Output }\n ? Output\n : never;\n\n/**\n * Parsed operation data and query evidence. `queries` is present only when SQL disclosure is\n * allowed.\n */\nexport type DataResponse<Output, Input = unknown> = {\n data: Output;\n /** The exact browser input that produced this response. Never infer it from current controls. */\n input: Input;\n requestId: string;\n queriedAt: string;\n queryIds: string[];\n queries?: DisclosedQuery[];\n};\n\nexport type DataClient<Operations extends DataOperations> = {\n query<Name extends keyof Operations & string>(\n name: Name,\n input: InputOf<Operations[Name]>,\n options?: { signal?: AbortSignal }\n ): Promise<\n DataResponse<OutputOf<Operations[Name]>, InputOf<Operations[Name]>>\n >;\n};\n\n/** Browser client for named operations; it sends inputs, never SQL or lakehouse credentials. */\nexport function createDataClient<Operations extends DataOperations>(\n options: {\n transport?: DataTransport;\n endpoint?: string;\n fetch?: typeof fetch;\n } = {}\n): DataClient<Operations> {\n const http = createHttpTransport(options);\n\n return {\n async query(name, input, { signal } = {}) {\n const transport =\n options.transport ??\n (options.endpoint !== undefined || options.fetch !== undefined\n ? http\n : (localFrameBridge()?.transport ?? http));\n const response = await transport(name, input, signal);\n const ok = response.status >= 200 && response.status < 300;\n let body: Omit<\n DataResponse<OutputOf<Operations[typeof name]>>,\n 'input'\n > & {\n error?: { code: string; message: string; requestId?: string };\n };\n try {\n const parsed: unknown = response.body;\n if (\n parsed === null ||\n typeof parsed !== 'object' ||\n Array.isArray(parsed)\n )\n throw new Error('Invalid response envelope.');\n body = parsed as typeof body;\n } catch (error) {\n if (signal?.aborted) throw error;\n throw new DataAppError(\n ok ? 'The data response was invalid.' : 'Could not load data.',\n ok ? 'invalid_response' : 'request_failed'\n );\n }\n if (!ok)\n throw new DataAppError(\n body.error?.message ?? 'Could not load data.',\n body.error?.code ?? 'request_failed',\n body.error?.requestId\n );\n\n return { ...body, input };\n },\n };\n}\n\nexport type { DataAppLocation, AppLocation } from '@/src/client/location';\n\nexport {\n createDataAppNavigation,\n getDataAppNavigation,\n type DataAppNavigation,\n} from '@/src/client/navigation';\n"
8
+ ],
9
+ "mappings": "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",
10
+ "debugId": "235551129B40A86C64756E2164756E21",
11
+ "names": []
12
+ }
@@ -0,0 +1,232 @@
1
+ import {
2
+ MessageRoutingError2
3
+ } from "./contract-jksbmt5q.js";
4
+ import {
5
+ BRIDGE,
6
+ PARENT_PARAM,
7
+ MAX_PENDING,
8
+ REQUEST_TIMEOUT_MS,
9
+ isBridgeMessage,
10
+ validId
11
+ } from "./contract-ryyf6dme.js";
12
+
13
+ // src/embed/host.ts
14
+ function attachDataAppBridge2({
15
+ iframe,
16
+ connection,
17
+ javascript,
18
+ onStatusChange,
19
+ onDiagnostic,
20
+ onMessage,
21
+ window: host = window
22
+ }) {
23
+ const frameOrigin = connection.type === "origin" ? connection.origin : "null";
24
+ if (connection.type === "origin" && new URL(frameOrigin).origin !== frameOrigin)
25
+ throw new Error("Expected an exact frame origin.");
26
+ if (connection.type === "opaque" && !validId(connection.token))
27
+ throw new Error("Invalid sandbox token.");
28
+ let token = connection.type === "opaque" ? connection.token : undefined;
29
+ const targetOrigin = connection.type === "opaque" ? "*" : frameOrigin;
30
+ let documentId;
31
+ let sessionId;
32
+ const pending = new Map;
33
+ function cancelAll() {
34
+ for (const controller of pending.values())
35
+ controller.abort();
36
+ pending.clear();
37
+ }
38
+ function send(message) {
39
+ onDiagnostic?.({ direction: "send", type: message.type ?? "unknown" });
40
+ iframe.contentWindow?.postMessage({
41
+ channel: BRIDGE,
42
+ version: 1,
43
+ documentId,
44
+ sessionId,
45
+ ...connection.type === "opaque" ? { token } : {},
46
+ ...message
47
+ }, targetOrigin);
48
+ }
49
+ function error(id, code, message, requestId) {
50
+ send({ type: "error", id, code, message, requestId });
51
+ }
52
+ async function request(message) {
53
+ const id = message.id;
54
+ if (!validId(id) || pending.has(id))
55
+ return;
56
+ if (pending.size >= MAX_PENDING)
57
+ return error(id, "bridge_busy", "Too many pending data requests.");
58
+ if (typeof message.route !== "string" || !message.route || message.route.length > 256)
59
+ return error(id, "invalid_message", "Invalid message route.");
60
+ try {
61
+ const body = JSON.stringify(message.payload);
62
+ if (message.payload !== undefined && (typeof body !== "string" || body.length > 16384))
63
+ throw new Error("Invalid payload");
64
+ } catch {
65
+ return error(id, "invalid_payload", "The message payload is invalid or too large.");
66
+ }
67
+ const controller = new AbortController;
68
+ pending.set(id, controller);
69
+ const timer = setTimeout(() => {
70
+ if (pending.get(id) !== controller)
71
+ return;
72
+ pending.delete(id);
73
+ controller.abort();
74
+ error(id, "timeout", "The data request timed out.");
75
+ }, REQUEST_TIMEOUT_MS);
76
+ controller.signal.addEventListener("abort", () => clearTimeout(timer), {
77
+ once: true
78
+ });
79
+ try {
80
+ const response = await onMessage({ route: message.route, payload: message.payload }, { signal: controller.signal });
81
+ if (pending.get(id) === controller)
82
+ send({ type: "result", id, response });
83
+ } catch (failure) {
84
+ if (pending.get(id) === controller) {
85
+ if (failure instanceof MessageRoutingError2)
86
+ error(id, failure.code, failure.message, failure.requestId);
87
+ else
88
+ error(id, "request_failed", "The message request failed. Retry the request.");
89
+ }
90
+ } finally {
91
+ clearTimeout(timer);
92
+ if (pending.get(id) === controller)
93
+ pending.delete(id);
94
+ }
95
+ }
96
+ function receive(event) {
97
+ if (event.origin !== frameOrigin || event.source !== iframe.contentWindow || !isBridgeMessage(event.data))
98
+ return;
99
+ const message = event.data;
100
+ if (connection.type === "opaque" && message.token !== token)
101
+ return;
102
+ onDiagnostic?.({ direction: "receive", type: message.type });
103
+ if (message.type === "ready") {
104
+ if (message.documentId !== documentId) {
105
+ cancelAll();
106
+ documentId = message.documentId;
107
+ sessionId = crypto.randomUUID();
108
+ }
109
+ onStatusChange?.("connected");
110
+ send({
111
+ type: "initialize",
112
+ state: { search: host.location.search, hash: host.location.hash }
113
+ });
114
+ if (javascript !== undefined)
115
+ send({ type: "script.load", javascript });
116
+ return;
117
+ }
118
+ if (!sessionId || message.sessionId !== sessionId || message.documentId !== documentId)
119
+ return;
120
+ if (message.type === "runtime.ready")
121
+ onStatusChange?.("ready");
122
+ else if (message.type === "runtime.error")
123
+ onStatusChange?.("failed");
124
+ else if (message.type === "request")
125
+ request(message);
126
+ else if (message.type === "cancel" && validId(message.id)) {
127
+ pending.get(message.id)?.abort();
128
+ pending.delete(message.id);
129
+ } else if (message.type === "disconnect") {
130
+ cancelAll();
131
+ documentId = undefined;
132
+ sessionId = undefined;
133
+ onStatusChange?.("disconnected");
134
+ }
135
+ }
136
+ function navigate() {
137
+ send({
138
+ type: "state",
139
+ state: { search: host.location.search, hash: host.location.hash }
140
+ });
141
+ }
142
+ function load() {
143
+ if (connection.type === "opaque")
144
+ token = crypto.randomUUID();
145
+ cancelAll();
146
+ documentId = undefined;
147
+ sessionId = undefined;
148
+ onStatusChange?.("connecting");
149
+ send({ type: "connect", documentId: "host" });
150
+ }
151
+ function dispose() {
152
+ cancelAll();
153
+ iframe.removeEventListener("load", load);
154
+ host.removeEventListener("message", receive);
155
+ host.removeEventListener("popstate", navigate);
156
+ host.removeEventListener("pagehide", cancelAll);
157
+ }
158
+ iframe.addEventListener("load", load);
159
+ host.addEventListener("message", receive);
160
+ host.addEventListener("popstate", navigate);
161
+ host.addEventListener("pagehide", cancelAll);
162
+ onStatusChange?.("connecting");
163
+ send({ type: "connect", documentId: "host" });
164
+ return dispose;
165
+ }
166
+
167
+ // src/embed/shell.ts
168
+ function attachDataAppShell2({
169
+ iframe,
170
+ source,
171
+ onMessage,
172
+ onStatusChange,
173
+ onDiagnostic,
174
+ startupTimeoutMs = 30000
175
+ }) {
176
+ const host = iframe.ownerDocument.defaultView;
177
+ if (!host)
178
+ throw new Error("The iframe requires a host window.");
179
+ const url = new URL(source.type === "url" ? source.url : source.bootstrapUrl, host.location.href);
180
+ if (!/^https?:$/.test(url.protocol))
181
+ throw new Error("Data apps require an HTTP(S) URL.");
182
+ const opaque = source.type === "bundle";
183
+ if (!opaque && url.origin === host.location.origin)
184
+ throw new Error("URL data apps require a separate origin from the shell.");
185
+ iframe.setAttribute("sandbox", opaque ? "allow-scripts" : "allow-scripts allow-same-origin allow-downloads allow-popups allow-popups-to-escape-sandbox");
186
+ iframe.referrerPolicy = "no-referrer";
187
+ if (!opaque)
188
+ url.searchParams.set(PARENT_PARAM, host.location.origin);
189
+ let timer;
190
+ let failed = false;
191
+ function status(value) {
192
+ if (value === "connecting")
193
+ failed = false;
194
+ if (failed && value !== "connecting")
195
+ return;
196
+ clearTimeout(timer);
197
+ if (value === "connecting" || value === "connected")
198
+ timer = setTimeout(() => {
199
+ failed = true;
200
+ disposeBridge();
201
+ onStatusChange?.("failed");
202
+ }, startupTimeoutMs);
203
+ if (value === "failed") {
204
+ failed = true;
205
+ disposeBridge();
206
+ }
207
+ onStatusChange?.(value);
208
+ }
209
+ const disposeBridge = attachDataAppBridge2({
210
+ iframe,
211
+ connection: opaque ? { type: "opaque", token: crypto.randomUUID() } : { type: "origin", origin: url.origin },
212
+ javascript: opaque ? source.javascript : undefined,
213
+ onMessage,
214
+ onStatusChange: status,
215
+ onDiagnostic,
216
+ window: host
217
+ });
218
+ function error() {
219
+ return status("failed");
220
+ }
221
+ iframe.addEventListener("error", error);
222
+ iframe.src = url.href;
223
+ return () => {
224
+ clearTimeout(timer);
225
+ iframe.removeEventListener("error", error);
226
+ disposeBridge();
227
+ };
228
+ }
229
+
230
+ export { attachDataAppBridge2, attachDataAppShell2 };
231
+
232
+ //# debugId=AFE2FEFDAF8B989664756E2164756E21
@@ -0,0 +1,11 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/embed/host.ts", "../src/embed/shell.ts"],
4
+ "sourcesContent": [
5
+ "import {\n BRIDGE,\n MAX_PENDING,\n REQUEST_TIMEOUT_MS,\n isBridgeMessage,\n validId,\n type BridgeMessage,\n} from '@/src/core/bridge';\n\nimport {\n MessageRoutingError,\n type MessageDispatcher,\n} from '@/src/core/messages';\n\nexport type DataAppConnection =\n | { type: 'origin'; origin: string }\n | { type: 'opaque'; token: string };\nexport type DataAppStatus =\n | 'connecting'\n | 'connected'\n | 'ready'\n | 'failed'\n | 'disconnected';\nexport type DataAppDiagnostic = { direction: 'send' | 'receive'; type: string };\n\n/** The bridge owns delivery and cancellation; the routed handler owns validation, authorization and execution. */\nexport function attachDataAppBridge({\n iframe,\n connection,\n javascript,\n onStatusChange,\n onDiagnostic,\n onMessage,\n window: host = window,\n}: {\n iframe: HTMLIFrameElement;\n connection: DataAppConnection;\n javascript?: string;\n onStatusChange?: (status: DataAppStatus) => void;\n onDiagnostic?: (event: DataAppDiagnostic) => void;\n onMessage: MessageDispatcher;\n window?: Window;\n}) {\n const frameOrigin = connection.type === 'origin' ? connection.origin : 'null';\n if (\n connection.type === 'origin' &&\n new URL(frameOrigin).origin !== frameOrigin\n )\n throw new Error('Expected an exact frame origin.');\n if (connection.type === 'opaque' && !validId(connection.token))\n throw new Error('Invalid sandbox token.');\n let token = connection.type === 'opaque' ? connection.token : undefined;\n const targetOrigin = connection.type === 'opaque' ? '*' : frameOrigin;\n let documentId: string | undefined;\n let sessionId: string | undefined;\n const pending = new Map<string, AbortController>();\n\n function cancelAll() {\n for (const controller of pending.values()) controller.abort();\n pending.clear();\n }\n\n function send(message: Partial<BridgeMessage>) {\n onDiagnostic?.({ direction: 'send', type: message.type ?? 'unknown' });\n iframe.contentWindow?.postMessage(\n {\n channel: BRIDGE,\n version: 1,\n documentId,\n sessionId,\n ...(connection.type === 'opaque' ? { token } : {}),\n ...message,\n },\n targetOrigin\n );\n }\n\n function error(\n id: string,\n code: string,\n message: string,\n requestId?: string\n ) {\n send({ type: 'error', id, code, message, requestId });\n }\n\n async function request(message: BridgeMessage) {\n const id = message.id;\n if (!validId(id) || pending.has(id)) return;\n if (pending.size >= MAX_PENDING)\n return error(id, 'bridge_busy', 'Too many pending data requests.');\n if (\n typeof message.route !== 'string' ||\n !message.route ||\n message.route.length > 256\n )\n return error(id, 'invalid_message', 'Invalid message route.');\n try {\n const body = JSON.stringify(message.payload);\n if (\n message.payload !== undefined &&\n (typeof body !== 'string' || body.length > 16_384)\n )\n throw new Error('Invalid payload');\n } catch {\n return error(\n id,\n 'invalid_payload',\n 'The message payload is invalid or too large.'\n );\n }\n const controller = new AbortController();\n pending.set(id, controller);\n const timer = setTimeout(() => {\n if (pending.get(id) !== controller) return;\n pending.delete(id);\n controller.abort();\n error(id, 'timeout', 'The data request timed out.');\n }, REQUEST_TIMEOUT_MS);\n controller.signal.addEventListener('abort', () => clearTimeout(timer), {\n once: true,\n });\n try {\n const response = await onMessage(\n { route: message.route, payload: message.payload },\n { signal: controller.signal }\n );\n if (pending.get(id) === controller)\n send({ type: 'result', id, response });\n } catch (failure) {\n if (pending.get(id) === controller) {\n if (failure instanceof MessageRoutingError)\n error(id, failure.code, failure.message, failure.requestId);\n else\n error(\n id,\n 'request_failed',\n 'The message request failed. Retry the request.'\n );\n }\n } finally {\n clearTimeout(timer);\n if (pending.get(id) === controller) pending.delete(id);\n }\n }\n\n function receive(event: MessageEvent) {\n if (\n event.origin !== frameOrigin ||\n event.source !== iframe.contentWindow ||\n !isBridgeMessage(event.data)\n )\n return;\n const message = event.data;\n if (connection.type === 'opaque' && message.token !== token) return;\n onDiagnostic?.({ direction: 'receive', type: message.type });\n if (message.type === 'ready') {\n if (message.documentId !== documentId) {\n cancelAll();\n documentId = message.documentId;\n sessionId = crypto.randomUUID();\n }\n onStatusChange?.('connected');\n send({\n type: 'initialize',\n state: { search: host.location.search, hash: host.location.hash },\n });\n if (javascript !== undefined) send({ type: 'script.load', javascript });\n\n return;\n }\n if (\n !sessionId ||\n message.sessionId !== sessionId ||\n message.documentId !== documentId\n )\n return;\n if (message.type === 'runtime.ready') onStatusChange?.('ready');\n else if (message.type === 'runtime.error') onStatusChange?.('failed');\n else if (message.type === 'request') void request(message);\n else if (message.type === 'cancel' && validId(message.id)) {\n pending.get(message.id)?.abort();\n pending.delete(message.id);\n } else if (message.type === 'disconnect') {\n cancelAll();\n documentId = undefined;\n sessionId = undefined;\n onStatusChange?.('disconnected');\n }\n }\n\n function navigate() {\n send({\n type: 'state',\n state: { search: host.location.search, hash: host.location.hash },\n });\n }\n\n function load() {\n if (connection.type === 'opaque') token = crypto.randomUUID();\n cancelAll();\n documentId = undefined;\n sessionId = undefined;\n onStatusChange?.('connecting');\n send({ type: 'connect', documentId: 'host' });\n }\n\n function dispose() {\n cancelAll();\n iframe.removeEventListener('load', load);\n host.removeEventListener('message', receive);\n host.removeEventListener('popstate', navigate);\n host.removeEventListener('pagehide', cancelAll);\n }\n\n iframe.addEventListener('load', load);\n host.addEventListener('message', receive);\n host.addEventListener('popstate', navigate);\n host.addEventListener('pagehide', cancelAll);\n // Reconnect an already-loaded iframe when its host bridge mounts again.\n onStatusChange?.('connecting');\n send({ type: 'connect', documentId: 'host' });\n\n return dispose;\n}\n",
6
+ "import { PARENT_PARAM } from '@/src/core/bridge';\nimport type { MessageDispatcher } from '@/src/core/messages';\nimport {\n attachDataAppBridge,\n type DataAppStatus,\n type DataAppDiagnostic,\n} from '@/src/embed/host';\n\nexport type DataAppSource =\n | { type: 'url'; url: string }\n | {\n type: 'bundle';\n bootstrapUrl: string;\n javascript: string;\n revision: string;\n };\nexport type DataAppShellOptions = {\n iframe: HTMLIFrameElement;\n source: DataAppSource;\n onMessage: MessageDispatcher;\n onStatusChange?: (status: DataAppStatus) => void;\n onDiagnostic?: (event: DataAppDiagnostic) => void;\n startupTimeoutMs?: number;\n};\n\n/** Owns loading and sandbox policy. Dispose before replacing the source or retrying. */\nexport function attachDataAppShell({\n iframe,\n source,\n onMessage,\n onStatusChange,\n onDiagnostic,\n startupTimeoutMs = 30_000,\n}: DataAppShellOptions) {\n const host = iframe.ownerDocument.defaultView;\n if (!host) throw new Error('The iframe requires a host window.');\n const url = new URL(\n source.type === 'url' ? source.url : source.bootstrapUrl,\n host.location.href\n );\n if (!/^https?:$/.test(url.protocol))\n throw new Error('Data apps require an HTTP(S) URL.');\n const opaque = source.type === 'bundle';\n if (!opaque && url.origin === host.location.origin)\n throw new Error('URL data apps require a separate origin from the shell.');\n iframe.setAttribute(\n 'sandbox',\n opaque\n ? 'allow-scripts'\n : 'allow-scripts allow-same-origin allow-downloads allow-popups allow-popups-to-escape-sandbox'\n );\n iframe.referrerPolicy = 'no-referrer';\n if (!opaque) url.searchParams.set(PARENT_PARAM, host.location.origin);\n let timer: ReturnType<typeof setTimeout> | undefined;\n let failed = false;\n\n function status(value: DataAppStatus) {\n if (value === 'connecting') failed = false;\n if (failed && value !== 'connecting') return;\n clearTimeout(timer);\n if (value === 'connecting' || value === 'connected')\n timer = setTimeout(() => {\n failed = true;\n disposeBridge();\n onStatusChange?.('failed');\n }, startupTimeoutMs);\n if (value === 'failed') {\n failed = true;\n disposeBridge();\n }\n onStatusChange?.(value);\n }\n\n const disposeBridge = attachDataAppBridge({\n iframe,\n connection: opaque\n ? { type: 'opaque', token: crypto.randomUUID() }\n : { type: 'origin', origin: url.origin },\n javascript: opaque ? source.javascript : undefined,\n onMessage,\n onStatusChange: status,\n onDiagnostic,\n window: host,\n });\n\n function error() {\n return status('failed');\n }\n\n iframe.addEventListener('error', error);\n iframe.src = url.href;\n\n return () => {\n clearTimeout(timer);\n iframe.removeEventListener('error', error);\n disposeBridge();\n };\n}\n"
7
+ ],
8
+ "mappings": "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",
9
+ "debugId": "AFE2FEFDAF8B989664756E2164756E21",
10
+ "names": []
11
+ }
@@ -0,0 +1,8 @@
1
+ // src/core/config.ts
2
+ function dataAppTitle2(config) {
3
+ return `${config.title} • ${config.scope.organization}/${config.scope.environment} • Altertable app`;
4
+ }
5
+
6
+ export { dataAppTitle2 };
7
+
8
+ //# debugId=B8EA593317DFC02A64756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/core/config.ts"],
4
+ "sourcesContent": [
5
+ "/**\n * App identity and display scope shared by browser and server.\n * @module @altertable/data-app/config\n * @see https://github.com/altertable-ai/data-app/blob/main/docs/config.md\n */\nexport type DataAppConfig = {\n title: string;\n scope: { organization: string; environment: string };\n appearance: unknown;\n};\n\nexport function dataAppTitle(\n config: Pick<DataAppConfig, 'title' | 'scope'>\n): string {\n return `${config.title} • ${config.scope.organization}/${config.scope.environment} • Altertable app`;\n}\n"
6
+ ],
7
+ "mappings": ";AAWO,SAAS,aAAY,CAC1B,QACQ;AAAA,EACR,OAAO,GAAG,OAAO,WAAW,OAAO,MAAM,gBAAgB,OAAO,MAAM;AAAA;",
8
+ "debugId": "B8EA593317DFC02A64756E2164756E21",
9
+ "names": []
10
+ }
@@ -0,0 +1,27 @@
1
+ import {
2
+ createDataAppNavigation2,
3
+ getDataAppNavigation2,
4
+ createDataClient2
5
+ } from "../chunks/contract-tkkc28tg.js";
6
+ import {
7
+ DataAppError2,
8
+ createHttpTransport2,
9
+ createMessageClient2,
10
+ createIframeTransport2,
11
+ installDataAppTransport2,
12
+ getDataAppTransport2
13
+ } from "../chunks/contract-mb5nfzwg.js";
14
+ import"../chunks/contract-jksbmt5q.js";
15
+ export {
16
+ DataAppError2 as DataAppError,
17
+ createDataAppNavigation2 as createDataAppNavigation,
18
+ createDataClient2 as createDataClient,
19
+ createHttpTransport2 as createHttpTransport,
20
+ createIframeTransport2 as createIframeTransport,
21
+ createMessageClient2 as createMessageClient,
22
+ getDataAppNavigation2 as getDataAppNavigation,
23
+ getDataAppTransport2 as getDataAppTransport,
24
+ installDataAppTransport2 as installDataAppTransport
25
+ };
26
+
27
+ //# debugId=43A567C4125F87CC64756E2164756E21
@@ -0,0 +1,9 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [
5
+ ],
6
+ "mappings": "",
7
+ "debugId": "43A567C4125F87CC64756E2164756E21",
8
+ "names": []
9
+ }
@@ -0,0 +1,12 @@
1
+ import {
2
+ parseAppearance2,
3
+ applyAppearance2,
4
+ createThemeController2
5
+ } from "../chunks/contract-14vxdcrs.js";
6
+ export {
7
+ applyAppearance2 as applyAppearance,
8
+ createThemeController2 as createThemeController,
9
+ parseAppearance2 as parseAppearance
10
+ };
11
+
12
+ //# debugId=FFA707298E88F52F64756E2164756E21
@@ -0,0 +1,9 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [
5
+ ],
6
+ "mappings": "",
7
+ "debugId": "FFA707298E88F52F64756E2164756E21",
8
+ "names": []
9
+ }
@@ -0,0 +1,8 @@
1
+ import {
2
+ dataAppTitle2
3
+ } from "../chunks/contract-wz59z8pq.js";
4
+ export {
5
+ dataAppTitle2 as dataAppTitle
6
+ };
7
+
8
+ //# debugId=4C9942F1F4C00CDF64756E2164756E21
@@ -0,0 +1,9 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [
5
+ ],
6
+ "mappings": "",
7
+ "debugId": "4C9942F1F4C00CDF64756E2164756E21",
8
+ "names": []
9
+ }
@@ -0,0 +1,55 @@
1
+ import {
2
+ dimensionFilter2,
3
+ parseDimensionSelection2,
4
+ parseFacetOptions2,
5
+ dimensionPredicate2,
6
+ parseEmptyInput2,
7
+ parseTrue2,
8
+ previousDateRange2,
9
+ defineDateRangeContract2,
10
+ parseDateRangeInput2,
11
+ parseCount2,
12
+ parseLabel2,
13
+ rowsAsRecords2,
14
+ defineQueryNames2,
15
+ DataSourceError2,
16
+ defineOperation2,
17
+ connectionQueryNames2,
18
+ connectionCheck2
19
+ } from "../chunks/contract-nt819swq.js";
20
+ import"../chunks/contract-mev09s5v.js";
21
+ import {
22
+ MessageRoutingError2,
23
+ defineMessageRoute2,
24
+ createMessageRouter2,
25
+ defineDataQueryRoute2,
26
+ navigationUpdateRoute2,
27
+ dataAppRoutes2
28
+ } from "../chunks/contract-jksbmt5q.js";
29
+ export {
30
+ DataSourceError2 as DataSourceError,
31
+ MessageRoutingError2 as MessageRoutingError,
32
+ connectionCheck2 as connectionCheck,
33
+ connectionQueryNames2 as connectionQueryNames,
34
+ createMessageRouter2 as createMessageRouter,
35
+ dataAppRoutes2 as dataAppRoutes,
36
+ defineDataQueryRoute2 as defineDataQueryRoute,
37
+ defineDateRangeContract2 as defineDateRangeContract,
38
+ defineMessageRoute2 as defineMessageRoute,
39
+ defineOperation2 as defineOperation,
40
+ defineQueryNames2 as defineQueryNames,
41
+ dimensionFilter2 as dimensionFilter,
42
+ dimensionPredicate2 as dimensionPredicate,
43
+ navigationUpdateRoute2 as navigationUpdateRoute,
44
+ parseCount2 as parseCount,
45
+ parseDateRangeInput2 as parseDateRangeInput,
46
+ parseDimensionSelection2 as parseDimensionSelection,
47
+ parseEmptyInput2 as parseEmptyInput,
48
+ parseFacetOptions2 as parseFacetOptions,
49
+ parseLabel2 as parseLabel,
50
+ parseTrue2 as parseTrue,
51
+ previousDateRange2 as previousDateRange,
52
+ rowsAsRecords2 as rowsAsRecords
53
+ };
54
+
55
+ //# debugId=2AD65EB8F0F2F7AD64756E2164756E21
@@ -0,0 +1,9 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [
5
+ ],
6
+ "mappings": "",
7
+ "debugId": "2AD65EB8F0F2F7AD64756E2164756E21",
8
+ "names": []
9
+ }
@@ -0,0 +1,18 @@
1
+ import {
2
+ formatDateRange2,
3
+ formatMetric2,
4
+ formatNumber2,
5
+ formatCount2,
6
+ pluralize2,
7
+ formatPercent2
8
+ } from "../chunks/contract-mev09s5v.js";
9
+ export {
10
+ formatCount2 as formatCount,
11
+ formatDateRange2 as formatDateRange,
12
+ formatMetric2 as formatMetric,
13
+ formatNumber2 as formatNumber,
14
+ formatPercent2 as formatPercent,
15
+ pluralize2 as pluralize
16
+ };
17
+
18
+ //# debugId=B1439475DE6F46A664756E2164756E21
@@ -0,0 +1,9 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [
5
+ ],
6
+ "mappings": "",
7
+ "debugId": "B1439475DE6F46A664756E2164756E21",
8
+ "names": []
9
+ }
@@ -0,0 +1,91 @@
1
+ import"../chunks/contract-jksbmt5q.js";
2
+ import {
3
+ createIframeTransport2,
4
+ installDataAppTransport2
5
+ } from "../chunks/contract-mb5nfzwg.js";
6
+ import {
7
+ attachDataAppBridge2,
8
+ attachDataAppShell2
9
+ } from "../chunks/contract-tqrf3ykr.js";
10
+ import {
11
+ PARENT_PARAM
12
+ } from "../chunks/contract-ryyf6dme.js";
13
+ // src/embed/bootstrap.ts
14
+ function startDataAppBootstrap({
15
+ parentOrigin,
16
+ window: frame = window
17
+ }) {
18
+ let loaded;
19
+ let failed = false;
20
+ const bridge = createIframeTransport2({
21
+ parentOrigin,
22
+ window: frame,
23
+ mode: "bundle",
24
+ loadScript(javascript) {
25
+ if (loaded !== undefined) {
26
+ if (javascript === loaded) {
27
+ if (failed)
28
+ bridge.fail();
29
+ else
30
+ bridge.ready();
31
+ } else
32
+ bridge.fail();
33
+ return;
34
+ }
35
+ loaded = javascript;
36
+ try {
37
+ const script = frame.document.createElement("script");
38
+ script.textContent = javascript;
39
+ frame.document.body.append(script);
40
+ if (!failed)
41
+ bridge.ready();
42
+ } catch {
43
+ reportError();
44
+ }
45
+ }
46
+ });
47
+ function reportError() {
48
+ failed = true;
49
+ bridge.fail();
50
+ }
51
+ frame.addEventListener("error", reportError);
52
+ frame.addEventListener("unhandledrejection", reportError);
53
+ const uninstall = installDataAppTransport2(bridge, frame);
54
+ return () => {
55
+ frame.removeEventListener("error", reportError);
56
+ frame.removeEventListener("unhandledrejection", reportError);
57
+ uninstall();
58
+ };
59
+ }
60
+ // src/embed/navigation.ts
61
+ function createNavigationHandler({
62
+ window: host = window,
63
+ reservedSearchParams = []
64
+ } = {}) {
65
+ function navigate(input) {
66
+ const previous = new URL(host.location.href);
67
+ const url = new URL(previous);
68
+ url.search = input.search;
69
+ url.searchParams.delete(PARENT_PARAM);
70
+ for (const name of reservedSearchParams) {
71
+ url.searchParams.delete(name);
72
+ for (const value of previous.searchParams.getAll(name))
73
+ url.searchParams.append(name, value);
74
+ }
75
+ url.hash = input.hash;
76
+ if (url.href !== host.location.href)
77
+ host.history[input.mode === "push" ? "pushState" : "replaceState"](null, "", url);
78
+ if (input.title !== undefined)
79
+ host.document.title = input.title;
80
+ return null;
81
+ }
82
+ return navigate;
83
+ }
84
+ export {
85
+ attachDataAppBridge2 as attachDataAppBridge,
86
+ attachDataAppShell2 as attachDataAppShell,
87
+ createNavigationHandler,
88
+ startDataAppBootstrap
89
+ };
90
+
91
+ //# debugId=1E61B2F0590BD55F64756E2164756E21
@@ -0,0 +1,11 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/embed/bootstrap.ts", "../src/embed/navigation.ts"],
4
+ "sourcesContent": [
5
+ "import {\n createIframeTransport,\n installDataAppTransport,\n} from '@/src/client/iframe';\n\n/** Run from a trusted bootstrap page in an allow-scripts-only iframe. CSP can prohibit network access. */\nexport function startDataAppBootstrap({\n parentOrigin,\n window: frame = window,\n}: {\n parentOrigin: string;\n window?: Window;\n}) {\n let loaded: string | undefined;\n let failed = false;\n const bridge = createIframeTransport({\n parentOrigin,\n window: frame,\n mode: 'bundle',\n loadScript(javascript) {\n if (loaded !== undefined) {\n if (javascript === loaded) {\n if (failed) bridge.fail();\n else bridge.ready();\n } else bridge.fail();\n\n return;\n }\n loaded = javascript;\n try {\n const script = frame.document.createElement('script');\n script.textContent = javascript;\n frame.document.body.append(script);\n if (!failed) bridge.ready();\n } catch {\n reportError();\n }\n },\n });\n\n function reportError() {\n failed = true;\n bridge.fail();\n }\n\n frame.addEventListener('error', reportError);\n frame.addEventListener('unhandledrejection', reportError);\n const uninstall = installDataAppTransport(bridge, frame);\n\n return () => {\n frame.removeEventListener('error', reportError);\n frame.removeEventListener('unhandledrejection', reportError);\n uninstall();\n };\n}\n",
6
+ "import { PARENT_PARAM } from '@/src/core/bridge';\nimport type { NavigationUpdate } from '@/src/core/messages';\n\n/** Override this handler for framework routers. Reserved host parameters survive app navigation. */\nexport function createNavigationHandler({\n window: host = window,\n reservedSearchParams = [],\n}: {\n window?: Window;\n reservedSearchParams?: readonly string[];\n} = {}) {\n function navigate(input: NavigationUpdate): null {\n const previous = new URL(host.location.href);\n const url = new URL(previous);\n url.search = input.search;\n url.searchParams.delete(PARENT_PARAM);\n for (const name of reservedSearchParams) {\n url.searchParams.delete(name);\n for (const value of previous.searchParams.getAll(name))\n url.searchParams.append(name, value);\n }\n url.hash = input.hash;\n if (url.href !== host.location.href)\n host.history[input.mode === 'push' ? 'pushState' : 'replaceState'](\n null,\n '',\n url\n );\n if (input.title !== undefined) host.document.title = input.title;\n\n return null;\n }\n\n return navigate;\n}\n"
7
+ ],
8
+ "mappings": ";;;;;;;;;;;;;AAMO,SAAS,qBAAqB;AAAA,EACnC;AAAA,EACA,QAAQ,QAAQ;AAAA,GAIf;AAAA,EACD,IAAI;AAAA,EACJ,IAAI,SAAS;AAAA,EACb,MAAM,SAAS,uBAAsB;AAAA,IACnC;AAAA,IACA,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,UAAU,CAAC,YAAY;AAAA,MACrB,IAAI,WAAW,WAAW;AAAA,QACxB,IAAI,eAAe,QAAQ;AAAA,UACzB,IAAI;AAAA,YAAQ,OAAO,KAAK;AAAA,UACnB;AAAA,mBAAO,MAAM;AAAA,QACpB,EAAO;AAAA,iBAAO,KAAK;AAAA,QAEnB;AAAA,MACF;AAAA,MACA,SAAS;AAAA,MACT,IAAI;AAAA,QACF,MAAM,SAAS,MAAM,SAAS,cAAc,QAAQ;AAAA,QACpD,OAAO,cAAc;AAAA,QACrB,MAAM,SAAS,KAAK,OAAO,MAAM;AAAA,QACjC,IAAI,CAAC;AAAA,UAAQ,OAAO,MAAM;AAAA,QAC1B,MAAM;AAAA,QACN,YAAY;AAAA;AAAA;AAAA,EAGlB,CAAC;AAAA,EAED,SAAS,WAAW,GAAG;AAAA,IACrB,SAAS;AAAA,IACT,OAAO,KAAK;AAAA;AAAA,EAGd,MAAM,iBAAiB,SAAS,WAAW;AAAA,EAC3C,MAAM,iBAAiB,sBAAsB,WAAW;AAAA,EACxD,MAAM,YAAY,yBAAwB,QAAQ,KAAK;AAAA,EAEvD,OAAO,MAAM;AAAA,IACX,MAAM,oBAAoB,SAAS,WAAW;AAAA,IAC9C,MAAM,oBAAoB,sBAAsB,WAAW;AAAA,IAC3D,UAAU;AAAA;AAAA;;AChDP,SAAS,uBAAuB;AAAA,EACrC,QAAQ,OAAO;AAAA,EACf,uBAAuB,CAAC;AAAA,IAItB,CAAC,GAAG;AAAA,EACN,SAAS,QAAQ,CAAC,OAA+B;AAAA,IAC/C,MAAM,WAAW,IAAI,IAAI,KAAK,SAAS,IAAI;AAAA,IAC3C,MAAM,MAAM,IAAI,IAAI,QAAQ;AAAA,IAC5B,IAAI,SAAS,MAAM;AAAA,IACnB,IAAI,aAAa,OAAO,YAAY;AAAA,IACpC,WAAW,QAAQ,sBAAsB;AAAA,MACvC,IAAI,aAAa,OAAO,IAAI;AAAA,MAC5B,WAAW,SAAS,SAAS,aAAa,OAAO,IAAI;AAAA,QACnD,IAAI,aAAa,OAAO,MAAM,KAAK;AAAA,IACvC;AAAA,IACA,IAAI,OAAO,MAAM;AAAA,IACjB,IAAI,IAAI,SAAS,KAAK,SAAS;AAAA,MAC7B,KAAK,QAAQ,MAAM,SAAS,SAAS,cAAc,gBACjD,MACA,IACA,GACF;AAAA,IACF,IAAI,MAAM,UAAU;AAAA,MAAW,KAAK,SAAS,QAAQ,MAAM;AAAA,IAE3D,OAAO;AAAA;AAAA,EAGT,OAAO;AAAA;",
9
+ "debugId": "1E61B2F0590BD55F64756E2164756E21",
10
+ "names": []
11
+ }