@syntrologie/runtime-sdk 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +185 -0
- package/dist/SmartCanvasApp.d.ts +29 -0
- package/dist/SmartCanvasApp.js +68 -0
- package/dist/SmartCanvasApp.js.map +1 -0
- package/dist/SmartCanvasElement.d.ts +29 -0
- package/dist/SmartCanvasElement.js +133 -0
- package/dist/SmartCanvasElement.js.map +1 -0
- package/dist/SmartCanvasPortal.d.ts +7 -0
- package/dist/SmartCanvasPortal.js +17 -0
- package/dist/SmartCanvasPortal.js.map +1 -0
- package/dist/antiFlicker.d.ts +10 -0
- package/dist/antiFlicker.js +39 -0
- package/dist/antiFlicker.js.map +1 -0
- package/dist/api.d.ts +60 -0
- package/dist/api.js +159 -0
- package/dist/api.js.map +1 -0
- package/dist/bootstrap.d.ts +62 -0
- package/dist/bootstrap.js +83 -0
- package/dist/bootstrap.js.map +1 -0
- package/dist/bundle-entry.d.ts +4 -0
- package/dist/bundle-entry.js +9 -0
- package/dist/bundle-entry.js.map +1 -0
- package/dist/components/RectangleCard.d.ts +15 -0
- package/dist/components/RectangleCard.js +226 -0
- package/dist/components/RectangleCard.js.map +1 -0
- package/dist/components/RectangleWheel.d.ts +8 -0
- package/dist/components/RectangleWheel.js +30 -0
- package/dist/components/RectangleWheel.js.map +1 -0
- package/dist/components/ShadowCanvasOverlay.d.ts +26 -0
- package/dist/components/ShadowCanvasOverlay.js +163 -0
- package/dist/components/ShadowCanvasOverlay.js.map +1 -0
- package/dist/configFetcher.d.ts +15 -0
- package/dist/configFetcher.js +90 -0
- package/dist/configFetcher.js.map +1 -0
- package/dist/controller.d.ts +15 -0
- package/dist/controller.js +34 -0
- package/dist/controller.js.map +1 -0
- package/dist/earlyPatcher.d.ts +23 -0
- package/dist/earlyPatcher.js +70 -0
- package/dist/earlyPatcher.js.map +1 -0
- package/dist/editorLoader.d.ts +17 -0
- package/dist/editorLoader.js +95 -0
- package/dist/editorLoader.js.map +1 -0
- package/dist/experiments/adapters/growthbook.d.ts +45 -0
- package/dist/experiments/adapters/growthbook.js +79 -0
- package/dist/experiments/adapters/growthbook.js.map +1 -0
- package/dist/experiments/index.d.ts +3 -0
- package/dist/experiments/index.js +4 -0
- package/dist/experiments/index.js.map +1 -0
- package/dist/experiments/registry.d.ts +13 -0
- package/dist/experiments/registry.js +30 -0
- package/dist/experiments/registry.js.map +1 -0
- package/dist/experiments/types.d.ts +25 -0
- package/dist/experiments/types.js +2 -0
- package/dist/experiments/types.js.map +1 -0
- package/dist/fetchers/cdnFetcher.d.ts +35 -0
- package/dist/fetchers/cdnFetcher.js +100 -0
- package/dist/fetchers/cdnFetcher.js.map +1 -0
- package/dist/fetchers/experimentsFetcher.d.ts +33 -0
- package/dist/fetchers/experimentsFetcher.js +42 -0
- package/dist/fetchers/experimentsFetcher.js.map +1 -0
- package/dist/fetchers/index.d.ts +3 -0
- package/dist/fetchers/index.js +5 -0
- package/dist/fetchers/index.js.map +1 -0
- package/dist/fetchers/registry.d.ts +14 -0
- package/dist/fetchers/registry.js +58 -0
- package/dist/fetchers/registry.js.map +1 -0
- package/dist/fetchers/types.d.ts +26 -0
- package/dist/fetchers/types.js +2 -0
- package/dist/fetchers/types.js.map +1 -0
- package/dist/hooks/useCanvasOverlays.d.ts +13 -0
- package/dist/hooks/useCanvasOverlays.js +59 -0
- package/dist/hooks/useCanvasOverlays.js.map +1 -0
- package/dist/hooks/useHostPatches.d.ts +9 -0
- package/dist/hooks/useHostPatches.js +40 -0
- package/dist/hooks/useHostPatches.js.map +1 -0
- package/dist/hooks/useShadowCanvasConfig.d.ts +20 -0
- package/dist/hooks/useShadowCanvasConfig.js +46 -0
- package/dist/hooks/useShadowCanvasConfig.js.map +1 -0
- package/dist/hostPatcher/core/patcher.d.ts +3 -0
- package/dist/hostPatcher/core/patcher.js +173 -0
- package/dist/hostPatcher/core/patcher.js.map +1 -0
- package/dist/hostPatcher/core/sanitizer.d.ts +1 -0
- package/dist/hostPatcher/core/sanitizer.js +45 -0
- package/dist/hostPatcher/core/sanitizer.js.map +1 -0
- package/dist/hostPatcher/core/types.d.ts +94 -0
- package/dist/hostPatcher/core/types.js +2 -0
- package/dist/hostPatcher/core/types.js.map +1 -0
- package/dist/hostPatcher/index.d.ts +6 -0
- package/dist/hostPatcher/index.js +7 -0
- package/dist/hostPatcher/index.js.map +1 -0
- package/dist/hostPatcher/policy/defaultPolicy.d.ts +2 -0
- package/dist/hostPatcher/policy/defaultPolicy.js +41 -0
- package/dist/hostPatcher/policy/defaultPolicy.js.map +1 -0
- package/dist/hostPatcher/utils/anchors.d.ts +13 -0
- package/dist/hostPatcher/utils/anchors.js +107 -0
- package/dist/hostPatcher/utils/anchors.js.map +1 -0
- package/dist/hostPatcher/utils/observer.d.ts +3 -0
- package/dist/hostPatcher/utils/observer.js +11 -0
- package/dist/hostPatcher/utils/observer.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/overlays/fetcher.d.ts +4 -0
- package/dist/overlays/fetcher.js +17 -0
- package/dist/overlays/fetcher.js.map +1 -0
- package/dist/overlays/runtime/anchor/resolve.d.ts +4 -0
- package/dist/overlays/runtime/anchor/resolve.js +87 -0
- package/dist/overlays/runtime/anchor/resolve.js.map +1 -0
- package/dist/overlays/runtime/index.d.ts +6 -0
- package/dist/overlays/runtime/index.js +7 -0
- package/dist/overlays/runtime/index.js.map +1 -0
- package/dist/overlays/runtime/overlay/highlight.d.ts +10 -0
- package/dist/overlays/runtime/overlay/highlight.js +152 -0
- package/dist/overlays/runtime/overlay/highlight.js.map +1 -0
- package/dist/overlays/runtime/overlay/root.d.ts +4 -0
- package/dist/overlays/runtime/overlay/root.js +165 -0
- package/dist/overlays/runtime/overlay/root.js.map +1 -0
- package/dist/overlays/runtime/overlay/runner.d.ts +2 -0
- package/dist/overlays/runtime/overlay/runner.js +101 -0
- package/dist/overlays/runtime/overlay/runner.js.map +1 -0
- package/dist/overlays/runtime/overlay/tooltip.d.ts +14 -0
- package/dist/overlays/runtime/overlay/tooltip.js +174 -0
- package/dist/overlays/runtime/overlay/tooltip.js.map +1 -0
- package/dist/overlays/runtime/utils/dom.d.ts +2 -0
- package/dist/overlays/runtime/utils/dom.js +9 -0
- package/dist/overlays/runtime/utils/dom.js.map +1 -0
- package/dist/overlays/schema.d.ts +907 -0
- package/dist/overlays/schema.js +48 -0
- package/dist/overlays/schema.js.map +1 -0
- package/dist/overlays/types.d.ts +68 -0
- package/dist/overlays/types.js +2 -0
- package/dist/overlays/types.js.map +1 -0
- package/dist/react.d.ts +99 -0
- package/dist/react.js +119 -0
- package/dist/react.js.map +1 -0
- package/dist/smart-canvas.esm.js +202 -0
- package/dist/smart-canvas.esm.js.map +7 -0
- package/dist/smart-canvas.js +40406 -0
- package/dist/smart-canvas.js.map +7 -0
- package/dist/smart-canvas.min.js +202 -0
- package/dist/smart-canvas.min.js.map +7 -0
- package/dist/telemetry/adapters/posthog.d.ts +67 -0
- package/dist/telemetry/adapters/posthog.js +61 -0
- package/dist/telemetry/adapters/posthog.js.map +1 -0
- package/dist/telemetry/index.d.ts +3 -0
- package/dist/telemetry/index.js +3 -0
- package/dist/telemetry/index.js.map +1 -0
- package/dist/telemetry/registry.d.ts +13 -0
- package/dist/telemetry/registry.js +27 -0
- package/dist/telemetry/registry.js.map +1 -0
- package/dist/telemetry/types.d.ts +28 -0
- package/dist/telemetry/types.js +2 -0
- package/dist/telemetry/types.js.map +1 -0
- package/dist/token.d.ts +36 -0
- package/dist/token.js +47 -0
- package/dist/token.js.map +1 -0
- package/dist/types.d.ts +147 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/package.json +64 -0
- package/schema/canvas-config.schema.json +329 -0
- package/scripts/validate-config.mjs +80 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RectangleWheel.js","sourceRoot":"","sources":["../../src/components/RectangleWheel.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { ReactNode } from "react";
|
|
2
|
+
import type { RectangleConfig } from "../types";
|
|
3
|
+
import type { TelemetryClient } from "../telemetry/types";
|
|
4
|
+
import { MountableComponent } from "../api";
|
|
5
|
+
export interface CanvasTheme {
|
|
6
|
+
position: 'left' | 'right';
|
|
7
|
+
baseWidth: string;
|
|
8
|
+
expandedWidth: string;
|
|
9
|
+
zIndex: number;
|
|
10
|
+
backdropBlur: string;
|
|
11
|
+
}
|
|
12
|
+
export interface ShadowCanvasOverlayProps {
|
|
13
|
+
isOpen: boolean;
|
|
14
|
+
onToggle: () => void;
|
|
15
|
+
telemetry?: TelemetryClient;
|
|
16
|
+
launcherLabel?: string;
|
|
17
|
+
footerSlot?: ReactNode;
|
|
18
|
+
rectangles: RectangleConfig[];
|
|
19
|
+
isLoading: boolean;
|
|
20
|
+
error?: string;
|
|
21
|
+
canvasTitle?: string;
|
|
22
|
+
displayMode?: 'standard' | 'focused';
|
|
23
|
+
theme?: Partial<CanvasTheme>;
|
|
24
|
+
customRenderers?: Record<string, MountableComponent>;
|
|
25
|
+
}
|
|
26
|
+
export declare function ShadowCanvasOverlay({ isOpen, onToggle, telemetry, launcherLabel, footerSlot, rectangles, isLoading, error, canvasTitle, displayMode, theme: themeOverride, customRenderers, }: ShadowCanvasOverlayProps): import("react/jsx-runtime").JSX.Element | null;
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useState } from "react";
|
|
3
|
+
import { createPortal } from "react-dom";
|
|
4
|
+
import { RectangleCard } from "./RectangleCard";
|
|
5
|
+
const DEFAULT_THEME = {
|
|
6
|
+
position: 'right',
|
|
7
|
+
baseWidth: 'clamp(320px, 16.666vw, 420px)',
|
|
8
|
+
expandedWidth: '40vw',
|
|
9
|
+
zIndex: 2147483600,
|
|
10
|
+
backdropBlur: '18px'
|
|
11
|
+
};
|
|
12
|
+
export function ShadowCanvasOverlay({ isOpen, onToggle, telemetry, launcherLabel = "Canvas", footerSlot, rectangles, isLoading, error, canvasTitle, displayMode = 'standard', theme: themeOverride, customRenderers, }) {
|
|
13
|
+
const [mounted, setMounted] = useState(false);
|
|
14
|
+
const [expandedId, setExpandedId] = useState(null);
|
|
15
|
+
const theme = { ...DEFAULT_THEME, ...themeOverride };
|
|
16
|
+
const handleTileClick = (id) => {
|
|
17
|
+
setExpandedId(expandedId === id ? null : id);
|
|
18
|
+
};
|
|
19
|
+
useEffect(() => {
|
|
20
|
+
if (!isOpen || !telemetry)
|
|
21
|
+
return;
|
|
22
|
+
rectangles.forEach((rectangle) => {
|
|
23
|
+
telemetry.trackRectangleViewed(rectangle.id, "overlay");
|
|
24
|
+
});
|
|
25
|
+
}, [telemetry, isOpen, rectangles]);
|
|
26
|
+
useEffect(() => {
|
|
27
|
+
setMounted(true);
|
|
28
|
+
}, []);
|
|
29
|
+
const toggle = () => {
|
|
30
|
+
const next = !isOpen;
|
|
31
|
+
if (next) {
|
|
32
|
+
telemetry === null || telemetry === void 0 ? void 0 : telemetry.trackCanvasOpened("overlay");
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
telemetry === null || telemetry === void 0 ? void 0 : telemetry.trackCanvasClosed("overlay");
|
|
36
|
+
}
|
|
37
|
+
onToggle();
|
|
38
|
+
};
|
|
39
|
+
const isFocused = displayMode === 'focused';
|
|
40
|
+
const isRight = theme.position === 'right';
|
|
41
|
+
const containerStyle = {
|
|
42
|
+
display: "flex",
|
|
43
|
+
flexDirection: "column",
|
|
44
|
+
width: isFocused ? theme.expandedWidth : theme.baseWidth,
|
|
45
|
+
minWidth: "320px",
|
|
46
|
+
height: "100%",
|
|
47
|
+
maxHeight: "100%",
|
|
48
|
+
background: isFocused
|
|
49
|
+
? "linear-gradient(to top right, rgba(80, 10, 20, 0.5) 0%, rgba(12, 12, 12, 0.98) 50%, rgba(8, 8, 8, 0.99) 100%)"
|
|
50
|
+
: "linear-gradient(to top right, rgba(60, 8, 15, 0.6) 0%, rgba(12, 12, 12, 0.95) 45%, rgba(8, 8, 8, 0.97) 100%)",
|
|
51
|
+
backdropFilter: `blur(${theme.backdropBlur})`,
|
|
52
|
+
WebkitBackdropFilter: `blur(${theme.backdropBlur})`,
|
|
53
|
+
pointerEvents: "auto",
|
|
54
|
+
opacity: isOpen ? 1 : 0.8,
|
|
55
|
+
transition: "all 340ms cubic-bezier(0.16, 1, 0.3, 1)",
|
|
56
|
+
// Borders
|
|
57
|
+
border: isFocused
|
|
58
|
+
? (isRight ? undefined : "1px solid rgba(255, 255, 255, 0.06)")
|
|
59
|
+
: "1px solid rgba(80, 20, 30, 0.4)",
|
|
60
|
+
borderLeft: (isFocused && isRight) ? "1px solid rgba(255, 255, 255, 0.08)" : undefined,
|
|
61
|
+
borderRight: (isFocused && !isRight) ? "1px solid rgba(255, 255, 255, 0.08)" : undefined,
|
|
62
|
+
// Rounded corners
|
|
63
|
+
borderRadius: isFocused ? "0" : "24px",
|
|
64
|
+
// Shadow
|
|
65
|
+
boxShadow: isFocused
|
|
66
|
+
? "none"
|
|
67
|
+
: "0 25px 80px rgba(0, 0, 0, 0.7), inset 0 0 80px rgba(60, 8, 15, 0.15)",
|
|
68
|
+
// Transform logic
|
|
69
|
+
transform: isOpen
|
|
70
|
+
? "translateX(0)"
|
|
71
|
+
: (isRight ? "translateX(120%)" : "translateX(-120%)")
|
|
72
|
+
};
|
|
73
|
+
const wrapperStyle = {
|
|
74
|
+
position: "absolute",
|
|
75
|
+
inset: 0,
|
|
76
|
+
display: "flex",
|
|
77
|
+
flexDirection: isRight ? "row-reverse" : "row",
|
|
78
|
+
alignItems: "stretch",
|
|
79
|
+
pointerEvents: "none",
|
|
80
|
+
padding: isFocused ? "0" : "1rem",
|
|
81
|
+
};
|
|
82
|
+
const content = (_jsx("div", { "data-shadow-canvas-id": "overlay-root", style: {
|
|
83
|
+
position: "fixed",
|
|
84
|
+
inset: 0,
|
|
85
|
+
pointerEvents: isOpen ? "auto" : "none",
|
|
86
|
+
zIndex: theme.zIndex,
|
|
87
|
+
}, children: _jsxs("div", { style: wrapperStyle, children: [_jsxs("div", { style: containerStyle, children: [!isFocused && (_jsx("header", { style: { color: "white", padding: "1.5rem 1.5rem 0" }, children: _jsx("p", { style: { margin: 0, fontSize: "0.7rem", textTransform: "uppercase", letterSpacing: "0.5em", color: "rgba(255, 255, 255, 0.6)" }, children: canvasTitle !== null && canvasTitle !== void 0 ? canvasTitle : "Smart Canvas" }) })), _jsx("div", { style: { flex: 1, overflowY: "auto", padding: isFocused ? "0" : "1.5rem" }, children: isLoading ? (_jsx("div", { style: { color: "rgba(255, 255, 255, 0.85)", padding: isFocused ? "1rem" : "0" }, children: "Loading..." })) : error ? (_jsxs("div", { style: { color: "#fecdd3", padding: isFocused ? "1rem" : "0" }, children: ["Failed to load: ", error] })) : isFocused ? (
|
|
88
|
+
/* Focused Mode: Render first rectangle full size */
|
|
89
|
+
rectangles.length > 0 ? (_jsx(RectangleCard, { config: rectangles[0], surface: "overlay", telemetry: telemetry, customRenderers: customRenderers, isExpanded: true, onToggleExpand: () => { }, style: { width: "100%", height: "100%" } })) : null) : (
|
|
90
|
+
/* Standard Mode: Notification Center Style Grid */
|
|
91
|
+
_jsx("div", { style: {
|
|
92
|
+
display: "grid",
|
|
93
|
+
gridTemplateColumns: "repeat(2, minmax(0, 1fr))",
|
|
94
|
+
gap: "0.625rem",
|
|
95
|
+
width: "100%",
|
|
96
|
+
}, children: rectangles.map((rectangle) => {
|
|
97
|
+
var _a;
|
|
98
|
+
const isHalf = ((_a = rectangle.size) !== null && _a !== void 0 ? _a : "half") === "quarter" || rectangle.size === "half";
|
|
99
|
+
const isExpanded = expandedId === rectangle.id;
|
|
100
|
+
return (_jsx("div", { style: {
|
|
101
|
+
gridColumn: isHalf && !isExpanded ? "span 1" : "span 2",
|
|
102
|
+
transition: "all 0.25s ease",
|
|
103
|
+
}, children: _jsx(RectangleCard, { config: rectangle, surface: "overlay", telemetry: telemetry, customRenderers: customRenderers, isExpanded: isExpanded, onToggleExpand: () => handleTileClick(rectangle.id), style: { width: "100%" } }) }, rectangle.id));
|
|
104
|
+
}) })) }), footerSlot] }), _jsx("div", { onClick: toggle, style: {
|
|
105
|
+
flex: "1 1 auto",
|
|
106
|
+
pointerEvents: isOpen ? "auto" : "none",
|
|
107
|
+
cursor: "default",
|
|
108
|
+
} })] }) }));
|
|
109
|
+
if (!mounted)
|
|
110
|
+
return null;
|
|
111
|
+
return (_jsxs(_Fragment, { children: [createPortal(_jsx("div", { "data-shadow-canvas-id": "overlay-launcher", style: {
|
|
112
|
+
position: "fixed",
|
|
113
|
+
inset: 0,
|
|
114
|
+
pointerEvents: "none",
|
|
115
|
+
zIndex: theme.zIndex + 47,
|
|
116
|
+
}, children: _jsxs("button", { onClick: toggle, "aria-label": "Toggle shadow canvas", style: {
|
|
117
|
+
position: "fixed",
|
|
118
|
+
bottom: "2.5rem",
|
|
119
|
+
right: isRight ? "2.5rem" : undefined,
|
|
120
|
+
left: !isRight ? "2.5rem" : undefined,
|
|
121
|
+
pointerEvents: "auto",
|
|
122
|
+
display: "flex",
|
|
123
|
+
alignItems: "center",
|
|
124
|
+
gap: "0.75rem",
|
|
125
|
+
borderRadius: "18px",
|
|
126
|
+
color: "white",
|
|
127
|
+
boxShadow: "0 20px 45px rgba(15, 23, 42, 0.35)",
|
|
128
|
+
transition: "transform 0.2s ease",
|
|
129
|
+
outline: "none",
|
|
130
|
+
padding: "0.65rem 1.25rem",
|
|
131
|
+
border: "2px solid rgba(255, 255, 255, 0.25)",
|
|
132
|
+
backgroundColor: "rgba(2, 6, 23, 0.8)",
|
|
133
|
+
backdropFilter: "blur(12px)",
|
|
134
|
+
cursor: "pointer",
|
|
135
|
+
}, onMouseEnter: (e) => (e.currentTarget.style.transform = "translateY(-2px)"), onMouseLeave: (e) => (e.currentTarget.style.transform = "translateY(0)"), children: [_jsx("div", { style: {
|
|
136
|
+
width: "36px",
|
|
137
|
+
height: "36px",
|
|
138
|
+
borderRadius: "12px",
|
|
139
|
+
background: isOpen
|
|
140
|
+
? "linear-gradient(135deg, #f472b6, #ec4899)"
|
|
141
|
+
: "linear-gradient(135deg, #94a3b8, #0f172a)",
|
|
142
|
+
display: "flex",
|
|
143
|
+
alignItems: "center",
|
|
144
|
+
justifyContent: "center",
|
|
145
|
+
}, children: _jsx("span", { style: {
|
|
146
|
+
width: "14px",
|
|
147
|
+
height: "2px",
|
|
148
|
+
backgroundColor: "#fff",
|
|
149
|
+
display: "block",
|
|
150
|
+
transform: isOpen ? "rotate(45deg)" : "rotate(0)",
|
|
151
|
+
position: "relative",
|
|
152
|
+
transition: "transform 200ms ease",
|
|
153
|
+
}, children: !isOpen ? (_jsx("span", { style: {
|
|
154
|
+
position: "absolute",
|
|
155
|
+
top: 0,
|
|
156
|
+
left: 0,
|
|
157
|
+
width: "14px",
|
|
158
|
+
height: "2px",
|
|
159
|
+
backgroundColor: "#fff",
|
|
160
|
+
transform: "rotate(90deg)",
|
|
161
|
+
} })) : null }) }), _jsxs("div", { style: { display: "flex", flexDirection: "column", textAlign: "left" }, children: [_jsx("span", { style: { fontSize: "0.55rem", letterSpacing: "0.35em", color: "rgba(255,255,255,0.7)" }, children: isOpen ? "Hide" : "Open" }), _jsx("span", { style: { fontSize: "0.85rem", letterSpacing: "0.25em" }, children: launcherLabel })] })] }) }), document.body), isOpen ? createPortal(content, document.body) : null] }));
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=ShadowCanvasOverlay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ShadowCanvasOverlay.js","sourceRoot":"","sources":["../../src/components/ShadowCanvasOverlay.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { CanvasConfigFetcher } from "./types";
|
|
2
|
+
import type { ExperimentClient } from "./experiments/types";
|
|
3
|
+
export interface CanvasFetcherOptions {
|
|
4
|
+
configUri?: string;
|
|
5
|
+
experiments?: ExperimentClient;
|
|
6
|
+
featureKey?: string;
|
|
7
|
+
credentials?: RequestCredentials;
|
|
8
|
+
configFeatureKey?: string;
|
|
9
|
+
}
|
|
10
|
+
export declare const resolveConfigUri: ({ configUri, experiments, featureKey, }: {
|
|
11
|
+
configUri?: string;
|
|
12
|
+
experiments?: ExperimentClient;
|
|
13
|
+
featureKey?: string;
|
|
14
|
+
}) => string | undefined;
|
|
15
|
+
export declare const createCanvasConfigFetcher: ({ configUri, experiments, featureKey, credentials, configFeatureKey, }: CanvasFetcherOptions) => CanvasConfigFetcher;
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Allowed hosts for fetching config.
|
|
3
|
+
* Only config from these hosts will be fetched.
|
|
4
|
+
*/
|
|
5
|
+
const ALLOWED_CONFIG_HOSTS = [
|
|
6
|
+
'api.syntrologie.com',
|
|
7
|
+
'cdn.syntrologie.com',
|
|
8
|
+
'localhost',
|
|
9
|
+
'127.0.0.1'
|
|
10
|
+
];
|
|
11
|
+
/**
|
|
12
|
+
* Validates that a config URI is from an allowed host.
|
|
13
|
+
* Requires HTTPS for non-localhost URLs.
|
|
14
|
+
*/
|
|
15
|
+
function validateConfigUri(uri) {
|
|
16
|
+
try {
|
|
17
|
+
const parsed = new URL(uri);
|
|
18
|
+
const isLocalhost = /^(localhost|127\.0\.0\.1)$/.test(parsed.hostname);
|
|
19
|
+
// Require HTTPS for non-localhost
|
|
20
|
+
if (parsed.protocol !== 'https:' && !isLocalhost) {
|
|
21
|
+
console.warn('[SmartCanvas] Config URI must use HTTPS:', uri);
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
// Check against allowlist
|
|
25
|
+
const isAllowed = ALLOWED_CONFIG_HOSTS.some(host => parsed.hostname === host);
|
|
26
|
+
if (!isAllowed) {
|
|
27
|
+
console.warn('[SmartCanvas] Config URI host not in allowlist:', parsed.hostname);
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
return true;
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
console.warn('[SmartCanvas] Invalid config URI:', uri);
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Checks if a URI is same-origin with the current page.
|
|
39
|
+
*/
|
|
40
|
+
function isSameOrigin(uri) {
|
|
41
|
+
if (typeof window === 'undefined')
|
|
42
|
+
return false;
|
|
43
|
+
try {
|
|
44
|
+
const parsed = new URL(uri);
|
|
45
|
+
return parsed.origin === window.location.origin;
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
export const resolveConfigUri = ({ configUri, experiments, featureKey = "smart-canvas-config-uri", }) => {
|
|
52
|
+
var _a;
|
|
53
|
+
if (configUri)
|
|
54
|
+
return configUri;
|
|
55
|
+
const fromFeature = (_a = experiments === null || experiments === void 0 ? void 0 : experiments.getFeatureValue) === null || _a === void 0 ? void 0 : _a.call(experiments, featureKey, null);
|
|
56
|
+
if (fromFeature)
|
|
57
|
+
return fromFeature;
|
|
58
|
+
return undefined;
|
|
59
|
+
};
|
|
60
|
+
export const createCanvasConfigFetcher = ({ configUri, experiments, featureKey, credentials, configFeatureKey = "smart-canvas-config", }) => {
|
|
61
|
+
return async () => {
|
|
62
|
+
var _a;
|
|
63
|
+
// First check if we have a direct config object from experiment platform
|
|
64
|
+
if (experiments && configFeatureKey) {
|
|
65
|
+
const directConfig = (_a = experiments.getFeatureValue) === null || _a === void 0 ? void 0 : _a.call(experiments, configFeatureKey, null);
|
|
66
|
+
if (directConfig && typeof directConfig === 'object') {
|
|
67
|
+
// Return the config directly - no fetch needed
|
|
68
|
+
return directConfig;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
// Fall back to URI-based fetching
|
|
72
|
+
const uri = resolveConfigUri({ configUri, experiments, featureKey });
|
|
73
|
+
if (!uri) {
|
|
74
|
+
throw new Error("SmartCanvas: config URI missing (env + feature flag unset).");
|
|
75
|
+
}
|
|
76
|
+
// Security: Validate URI against allowlist
|
|
77
|
+
if (!validateConfigUri(uri)) {
|
|
78
|
+
throw new Error(`SmartCanvas: config URI not allowed: ${uri}`);
|
|
79
|
+
}
|
|
80
|
+
// Security: Only send credentials to same-origin requests
|
|
81
|
+
// This prevents leaking cookies to third-party servers
|
|
82
|
+
const effectiveCredentials = credentials !== null && credentials !== void 0 ? credentials : (isSameOrigin(uri) ? 'include' : 'omit');
|
|
83
|
+
const response = await fetch(uri, { credentials: effectiveCredentials });
|
|
84
|
+
if (!response.ok) {
|
|
85
|
+
throw new Error(`SmartCanvas: failed to fetch config (${response.status})`);
|
|
86
|
+
}
|
|
87
|
+
return await response.json();
|
|
88
|
+
};
|
|
89
|
+
};
|
|
90
|
+
//# sourceMappingURL=configFetcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configFetcher.js","sourceRoot":"","sources":["../src/configFetcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export interface SmartCanvasState {
|
|
2
|
+
open: boolean;
|
|
3
|
+
}
|
|
4
|
+
export type SmartCanvasListener = (state: SmartCanvasState) => void;
|
|
5
|
+
export declare class SmartCanvasController {
|
|
6
|
+
private state;
|
|
7
|
+
private listeners;
|
|
8
|
+
constructor(initial?: Partial<SmartCanvasState>);
|
|
9
|
+
getState(): SmartCanvasState;
|
|
10
|
+
subscribe(listener: SmartCanvasListener): () => void;
|
|
11
|
+
setOpen(open: boolean): void;
|
|
12
|
+
toggle(): void;
|
|
13
|
+
private emit;
|
|
14
|
+
}
|
|
15
|
+
export declare const createSmartCanvasController: (initial?: Partial<SmartCanvasState>) => SmartCanvasController;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export class SmartCanvasController {
|
|
2
|
+
constructor(initial) {
|
|
3
|
+
var _a;
|
|
4
|
+
this.listeners = new Set();
|
|
5
|
+
this.state = {
|
|
6
|
+
open: (_a = initial === null || initial === void 0 ? void 0 : initial.open) !== null && _a !== void 0 ? _a : false,
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
getState() {
|
|
10
|
+
return this.state;
|
|
11
|
+
}
|
|
12
|
+
subscribe(listener) {
|
|
13
|
+
this.listeners.add(listener);
|
|
14
|
+
return () => {
|
|
15
|
+
this.listeners.delete(listener);
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
setOpen(open) {
|
|
19
|
+
if (this.state.open === open)
|
|
20
|
+
return;
|
|
21
|
+
this.state = { ...this.state, open };
|
|
22
|
+
this.emit();
|
|
23
|
+
}
|
|
24
|
+
toggle() {
|
|
25
|
+
this.setOpen(!this.state.open);
|
|
26
|
+
}
|
|
27
|
+
emit() {
|
|
28
|
+
for (const listener of this.listeners) {
|
|
29
|
+
listener(this.state);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
export const createSmartCanvasController = (initial) => new SmartCanvasController(initial);
|
|
34
|
+
//# sourceMappingURL=controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"controller.js","sourceRoot":"","sources":["../src/controller.ts"],"names":[],"mappings":"AAMA,MAAM,OAAO,qBAAqB;IAIhC,YAAY,OAAmC;;QAFvC,cAAS,GAAG,IAAI,GAAG,EAAuB,CAAC;QAGjD,IAAI,CAAC,KAAK,GAAG;YACX,IAAI,EAAE,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,IAAI,mCAAI,KAAK;SAC7B,CAAC;IACJ,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,SAAS,CAAC,QAA6B;QACrC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC7B,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAClC,CAAC,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,IAAa;QACnB,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI;YAAE,OAAO;QACrC,IAAI,CAAC,KAAK,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC;QACrC,IAAI,CAAC,IAAI,EAAE,CAAC;IACd,CAAC;IAED,MAAM;QACJ,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IAEO,IAAI;QACV,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACtC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;CACF;AAED,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,OAAmC,EAAE,EAAE,CACjF,IAAI,qBAAqB,CAAC,OAAO,CAAC,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Early patch application - runs before React to prevent flashing
|
|
3
|
+
*/
|
|
4
|
+
import type { Patch } from './hostPatcher/core/types';
|
|
5
|
+
interface EarlyPatchConfig {
|
|
6
|
+
patches?: Patch[];
|
|
7
|
+
antiFlicker?: boolean;
|
|
8
|
+
onComplete?: () => void;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Revert all currently active patches
|
|
12
|
+
*/
|
|
13
|
+
export declare function revertAllPatches(): void;
|
|
14
|
+
/**
|
|
15
|
+
* Apply patches immediately (synchronously) to prevent content flash
|
|
16
|
+
* This runs before React components are mounted
|
|
17
|
+
*/
|
|
18
|
+
export declare function applyPatchesEarly(config: EarlyPatchConfig): void;
|
|
19
|
+
/**
|
|
20
|
+
* Extract patches from SDK config
|
|
21
|
+
*/
|
|
22
|
+
export declare function extractPatchesFromConfig(config: any): Patch[];
|
|
23
|
+
export {};
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Early patch application - runs before React to prevent flashing
|
|
3
|
+
*/
|
|
4
|
+
import { applyPatch, revertPatch } from './hostPatcher/core/patcher';
|
|
5
|
+
import { defaultPolicy } from './hostPatcher/policy/defaultPolicy';
|
|
6
|
+
// Track active patches so we can revert them
|
|
7
|
+
let activePatchIds = new Set();
|
|
8
|
+
/**
|
|
9
|
+
* Revert all currently active patches
|
|
10
|
+
*/
|
|
11
|
+
export function revertAllPatches() {
|
|
12
|
+
activePatchIds.forEach(id => {
|
|
13
|
+
try {
|
|
14
|
+
revertPatch(id);
|
|
15
|
+
}
|
|
16
|
+
catch (e) {
|
|
17
|
+
console.warn(`[SmartCanvas] Failed to revert patch ${id}`, e);
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
activePatchIds.clear();
|
|
21
|
+
console.log('[SmartCanvas] Reverted all patches');
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Apply patches immediately (synchronously) to prevent content flash
|
|
25
|
+
* This runs before React components are mounted
|
|
26
|
+
*/
|
|
27
|
+
export function applyPatchesEarly(config) {
|
|
28
|
+
const { patches = [], onComplete } = config;
|
|
29
|
+
// Apply each patch synchronously
|
|
30
|
+
let appliedCount = 0;
|
|
31
|
+
patches.forEach(patch => {
|
|
32
|
+
try {
|
|
33
|
+
const result = applyPatch(patch, {
|
|
34
|
+
policy: defaultPolicy,
|
|
35
|
+
shadowHost: null // No shadow DOM yet, apply to main document
|
|
36
|
+
});
|
|
37
|
+
if (result.ok) {
|
|
38
|
+
appliedCount++;
|
|
39
|
+
activePatchIds.add(patch.id);
|
|
40
|
+
console.log(`[SmartCanvas] Early patch applied: ${patch.id}`);
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
console.warn(`[SmartCanvas] Early patch failed: ${patch.id}`, result.reason);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
console.error(`[SmartCanvas] Error applying early patch: ${patch.id}`, error);
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
console.log(`[SmartCanvas] Applied ${appliedCount}/${patches.length} patches early`);
|
|
51
|
+
// Callback when done
|
|
52
|
+
if (onComplete) {
|
|
53
|
+
onComplete();
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Extract patches from SDK config
|
|
58
|
+
*/
|
|
59
|
+
export function extractPatchesFromConfig(config) {
|
|
60
|
+
if (!config || !config.patches)
|
|
61
|
+
return [];
|
|
62
|
+
return config.patches.map((patch, index) => ({
|
|
63
|
+
id: patch.id || `patch_${index}`,
|
|
64
|
+
anchor: patch.anchor,
|
|
65
|
+
operations: patch.operations || [],
|
|
66
|
+
invariants: patch.invariants,
|
|
67
|
+
tier: patch.tier || 'additive'
|
|
68
|
+
}));
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=earlyPatcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"earlyPatcher.js","sourceRoot":"","sources":["../src/earlyPatcher.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AAQnE,6CAA6C;AAC7C,IAAI,cAAc,GAAgB,IAAI,GAAG,EAAE,CAAC;AAE5C;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAC9B,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE;QAC1B,IAAI,CAAC;YACH,WAAW,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,IAAI,CAAC,wCAAwC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QAChE,CAAC;IACH,CAAC,CAAC,CAAC;IACH,cAAc,CAAC,KAAK,EAAE,CAAC;IACvB,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;AACpD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAwB;IACxD,MAAM,EAAE,OAAO,GAAG,EAAE,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC;IAE5C,iCAAiC;IACjC,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;QACtB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,EAAE;gBAC/B,MAAM,EAAE,aAAa;gBACrB,UAAU,EAAE,IAAI,CAAC,4CAA4C;aAC9D,CAAC,CAAC;YAEH,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;gBACd,YAAY,EAAE,CAAC;gBACf,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBAC7B,OAAO,CAAC,GAAG,CAAC,sCAAsC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;YAChE,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,IAAI,CAAC,qCAAqC,KAAK,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;YAC/E,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,6CAA6C,KAAK,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;QAChF,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,yBAAyB,YAAY,IAAI,OAAO,CAAC,MAAM,gBAAgB,CAAC,CAAC;IAErF,qBAAqB;IACrB,IAAI,UAAU,EAAE,CAAC;QACf,UAAU,EAAE,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,wBAAwB,CAAC,MAAW;IAClD,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC;IAE1C,OAAO,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAU,EAAE,KAAa,EAAE,EAAE,CAAC,CAAC;QACxD,EAAE,EAAE,KAAK,CAAC,EAAE,IAAI,SAAS,KAAK,EAAE;QAChC,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,UAAU,EAAE,KAAK,CAAC,UAAU,IAAI,EAAE;QAClC,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,UAAU;KAC/B,CAAC,CAAC,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export declare const DEFAULT_EDITOR_URL = "https://cdn.syntrologie.com/editor-sdk/latest/editor-sdk.js";
|
|
2
|
+
/**
|
|
3
|
+
* Checks if the editor should be loaded based on URL query parameters.
|
|
4
|
+
* Requires editor_token parameter for security (not just syntro_editor flag).
|
|
5
|
+
*/
|
|
6
|
+
export declare const shouldLoadEditor: () => boolean;
|
|
7
|
+
export interface EditorLoadOptions {
|
|
8
|
+
/** URL to load editor SDK from */
|
|
9
|
+
editorUrl?: string;
|
|
10
|
+
/** SRI hash for integrity verification (e.g., "sha384-...") */
|
|
11
|
+
integrity?: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Dynamically loads the Editor SDK script.
|
|
15
|
+
* Validates URL against allowlist and supports SRI integrity checking.
|
|
16
|
+
*/
|
|
17
|
+
export declare const loadEditorSdk: (editorUrlOrOptions?: string | EditorLoadOptions) => Promise<void>;
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
export const DEFAULT_EDITOR_URL = "https://cdn.syntrologie.com/editor-sdk/latest/editor-sdk.js";
|
|
2
|
+
/**
|
|
3
|
+
* Allowed hosts for loading the editor SDK.
|
|
4
|
+
* Only scripts from these hosts will be loaded.
|
|
5
|
+
*/
|
|
6
|
+
const ALLOWED_EDITOR_HOSTS = [
|
|
7
|
+
'cdn.syntrologie.com',
|
|
8
|
+
'localhost',
|
|
9
|
+
'127.0.0.1'
|
|
10
|
+
];
|
|
11
|
+
/**
|
|
12
|
+
* Validates that an editor URL is from an allowed host.
|
|
13
|
+
* Requires HTTPS for non-localhost URLs.
|
|
14
|
+
*/
|
|
15
|
+
function validateEditorUrl(url) {
|
|
16
|
+
try {
|
|
17
|
+
const parsed = new URL(url);
|
|
18
|
+
const isLocalhost = /^(localhost|127\.0\.0\.1)$/.test(parsed.hostname);
|
|
19
|
+
// Require HTTPS for non-localhost
|
|
20
|
+
if (parsed.protocol !== 'https:' && !isLocalhost) {
|
|
21
|
+
console.warn('[Syntro Runtime] Editor URL must use HTTPS:', url);
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
// Check against allowlist
|
|
25
|
+
const isAllowed = ALLOWED_EDITOR_HOSTS.some(host => parsed.hostname === host);
|
|
26
|
+
if (!isAllowed) {
|
|
27
|
+
console.warn('[Syntro Runtime] Editor URL host not in allowlist:', parsed.hostname);
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
return true;
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
console.warn('[Syntro Runtime] Invalid editor URL:', url);
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Checks if the editor should be loaded based on URL query parameters.
|
|
39
|
+
* Requires editor_token parameter for security (not just syntro_editor flag).
|
|
40
|
+
*/
|
|
41
|
+
export const shouldLoadEditor = () => {
|
|
42
|
+
if (typeof window === "undefined")
|
|
43
|
+
return false;
|
|
44
|
+
const params = new URLSearchParams(window.location.search);
|
|
45
|
+
// Require editor_token for security - prevents arbitrary editor activation
|
|
46
|
+
const hasEditorFlag = params.has("syntro_editor") || params.has("syntro-editor");
|
|
47
|
+
const hasEditorToken = params.has("editor_token");
|
|
48
|
+
if (hasEditorFlag && !hasEditorToken) {
|
|
49
|
+
console.warn('[Syntro Runtime] Editor activation requires editor_token parameter');
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
return hasEditorFlag && hasEditorToken;
|
|
53
|
+
};
|
|
54
|
+
/**
|
|
55
|
+
* Dynamically loads the Editor SDK script.
|
|
56
|
+
* Validates URL against allowlist and supports SRI integrity checking.
|
|
57
|
+
*/
|
|
58
|
+
export const loadEditorSdk = async (editorUrlOrOptions) => {
|
|
59
|
+
var _a;
|
|
60
|
+
if (typeof window === "undefined")
|
|
61
|
+
return;
|
|
62
|
+
if (window.SyntroEditor)
|
|
63
|
+
return; // Already loaded
|
|
64
|
+
// Handle both legacy string arg and new options object
|
|
65
|
+
const options = typeof editorUrlOrOptions === 'string'
|
|
66
|
+
? { editorUrl: editorUrlOrOptions }
|
|
67
|
+
: editorUrlOrOptions !== null && editorUrlOrOptions !== void 0 ? editorUrlOrOptions : {};
|
|
68
|
+
const editorUrl = (_a = options.editorUrl) !== null && _a !== void 0 ? _a : DEFAULT_EDITOR_URL;
|
|
69
|
+
// Security: Validate URL against allowlist
|
|
70
|
+
if (!validateEditorUrl(editorUrl)) {
|
|
71
|
+
console.error('[Syntro Runtime] Blocked loading editor from untrusted URL:', editorUrl);
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
console.log("[Syntro Runtime] Loading Editor SDK from:", editorUrl);
|
|
75
|
+
return new Promise((resolve, reject) => {
|
|
76
|
+
const script = document.createElement("script");
|
|
77
|
+
script.src = editorUrl;
|
|
78
|
+
script.async = true;
|
|
79
|
+
// Add SRI integrity check if provided
|
|
80
|
+
if (options.integrity) {
|
|
81
|
+
script.integrity = options.integrity;
|
|
82
|
+
script.crossOrigin = "anonymous";
|
|
83
|
+
}
|
|
84
|
+
script.onload = () => {
|
|
85
|
+
console.log("[Syntro Runtime] Editor SDK loaded.");
|
|
86
|
+
resolve();
|
|
87
|
+
};
|
|
88
|
+
script.onerror = (err) => {
|
|
89
|
+
console.error("[Syntro Runtime] Failed to load Editor SDK:", err);
|
|
90
|
+
reject(err);
|
|
91
|
+
};
|
|
92
|
+
document.head.appendChild(script);
|
|
93
|
+
});
|
|
94
|
+
};
|
|
95
|
+
//# sourceMappingURL=editorLoader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"editorLoader.js","sourceRoot":"","sources":["../src/editorLoader.ts"],"names":[],"mappings":"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"}
|