@syntrologie/runtime-sdk 1.0.0-canary.1 → 1.0.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/CAPABILITIES.md +274 -31
- package/README.md +87 -0
- package/dist/RuntimeProvider.d.ts +1 -1
- package/dist/RuntimeProvider.js.map +1 -1
- package/dist/SmartCanvasApp.d.ts +4 -4
- package/dist/SmartCanvasApp.js +4 -4
- package/dist/SmartCanvasApp.js.map +1 -1
- package/dist/SmartCanvasElement.d.ts +2 -2
- package/dist/SmartCanvasElement.js +1 -1
- package/dist/SmartCanvasElement.js.map +1 -1
- package/dist/SmartCanvasPortal.js.map +1 -1
- package/dist/actions/ActionEngine.js +2 -4
- package/dist/actions/ActionEngine.js.map +1 -1
- package/dist/actions/executors/index.d.ts +1 -2
- package/dist/actions/executors/index.js +5 -7
- package/dist/actions/executors/index.js.map +1 -1
- package/dist/actions/executors/tour.js +3 -3
- package/dist/actions/executors/tour.js.map +1 -1
- package/dist/actions/validation.js +6 -31
- package/dist/actions/validation.js.map +1 -1
- package/dist/adaptives/adaptive-chatbot/index.js +9 -0
- package/dist/adaptives/adaptive-chatbot/index.js.map +7 -0
- package/dist/adaptives/adaptive-content/index.js +2 -0
- package/dist/adaptives/adaptive-content/index.js.map +7 -0
- package/dist/adaptives/adaptive-faq/index.js +11 -0
- package/dist/adaptives/adaptive-faq/index.js.map +7 -0
- package/dist/adaptives/adaptive-gamification/index.js +2 -0
- package/dist/adaptives/adaptive-gamification/index.js.map +7 -0
- package/dist/adaptives/adaptive-nav/index.js +11 -0
- package/dist/adaptives/adaptive-nav/index.js.map +7 -0
- package/dist/adaptives/adaptive-overlays/index.js +91 -0
- package/dist/adaptives/adaptive-overlays/index.js.map +7 -0
- package/dist/api.d.ts +5 -5
- package/dist/api.js +4 -7
- package/dist/api.js.map +1 -1
- package/dist/apps/AppContext.js +3 -5
- package/dist/apps/AppContext.js.map +1 -1
- package/dist/apps/AppLoader.d.ts +2 -1
- package/dist/apps/AppLoader.js +35 -9
- package/dist/apps/AppLoader.js.map +1 -1
- package/dist/apps/AppRegistry.js.map +1 -1
- package/dist/apps/examples/gamification-app.example.d.ts +8 -8
- package/dist/apps/examples/gamification-app.example.js.map +1 -1
- package/dist/apps/index.d.ts +0 -1
- package/dist/apps/index.js +0 -1
- package/dist/apps/index.js.map +1 -1
- package/dist/apps/types.d.ts +1 -1
- package/dist/blocks/data/ComparisonBlock.js +9 -9
- package/dist/blocks/data/ComparisonBlock.js.map +1 -1
- package/dist/blocks/data/StatsBlock.js +12 -14
- package/dist/blocks/data/StatsBlock.js.map +1 -1
- package/dist/blocks/index.d.ts +2 -2
- package/dist/blocks/index.js +3 -4
- package/dist/blocks/index.js.map +1 -1
- package/dist/blocks/interactive/ChecklistBlock.js +12 -12
- package/dist/blocks/interactive/ChecklistBlock.js.map +1 -1
- package/dist/blocks/interactive/RatingBlock.js +12 -14
- package/dist/blocks/interactive/RatingBlock.js.map +1 -1
- package/dist/blocks/notification/NotificationBlock.js +24 -24
- package/dist/blocks/notification/NotificationBlock.js.map +1 -1
- package/dist/bootstrap.d.ts +5 -5
- package/dist/bootstrap.js +30 -33
- package/dist/bootstrap.js.map +1 -1
- package/dist/components/ShadowCanvasOverlay.d.ts +2 -2
- package/dist/components/ShadowCanvasOverlay.js +25 -24
- package/dist/components/ShadowCanvasOverlay.js.map +1 -1
- package/dist/components/TileCard.d.ts +2 -2
- package/dist/components/TileCard.js +24 -23
- package/dist/components/TileCard.js.map +1 -1
- package/dist/components/TileWheel.d.ts +1 -1
- package/dist/components/TileWheel.js +23 -1
- package/dist/components/TileWheel.js.map +1 -1
- package/dist/configFetcher.d.ts +6 -2
- package/dist/configFetcher.js +65 -36
- package/dist/configFetcher.js.map +1 -1
- package/dist/context/ContextManager.d.ts +1 -1
- package/dist/context/ContextManager.js +4 -3
- package/dist/context/ContextManager.js.map +1 -1
- package/dist/context/schema.d.ts +8 -8
- package/dist/context/schema.js +1 -1
- package/dist/context/schema.js.map +1 -1
- package/dist/decisions/engine.d.ts +2 -2
- package/dist/decisions/engine.js.map +1 -1
- package/dist/decisions/schema.d.ts +34 -34
- package/dist/decisions/schema.js +1 -1
- package/dist/decisions/schema.js.map +1 -1
- package/dist/editorLoader.d.ts +19 -9
- package/dist/editorLoader.js +107 -96
- package/dist/editorLoader.js.map +1 -1
- package/dist/events/normalizers/canvas.d.ts +1 -1
- package/dist/events/normalizers/canvas.js.map +1 -1
- package/dist/events/schema.d.ts +4 -4
- package/dist/events/schema.js +1 -1
- package/dist/events/schema.js.map +1 -1
- package/dist/experiments/adapters/growthbook.d.ts +2 -1
- package/dist/experiments/adapters/growthbook.js +9 -1
- package/dist/experiments/adapters/growthbook.js.map +1 -1
- package/dist/experiments/types.d.ts +5 -0
- package/dist/fetchers/cdnFetcher.js.map +1 -1
- package/dist/fetchers/experimentsFetcher.d.ts +24 -2
- package/dist/fetchers/experimentsFetcher.js +48 -1
- package/dist/fetchers/experimentsFetcher.js.map +1 -1
- package/dist/fetchers/mergeConfigs.d.ts +29 -0
- package/dist/fetchers/mergeConfigs.js +38 -0
- package/dist/fetchers/mergeConfigs.js.map +1 -0
- package/dist/hooks/useCanvasOverlays.d.ts +1 -1
- package/dist/hooks/useCanvasOverlays.js +2 -2
- package/dist/hooks/useCanvasOverlays.js.map +1 -1
- package/dist/hooks/useHostPatches.js.map +1 -1
- package/dist/hooks/useShadowCanvasConfig.d.ts +1 -1
- package/dist/hooks/useShadowCanvasConfig.js.map +1 -1
- package/dist/hostPatcher/core/patcher.js.map +1 -1
- package/dist/hostPatcher/policy/defaultPolicy.js.map +1 -1
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -1
- package/dist/overlays/fetcher.d.ts +1 -1
- package/dist/overlays/fetcher.js +12 -14
- package/dist/overlays/fetcher.js.map +1 -1
- package/dist/overlays/runtime/overlay/runner.js +18 -5
- package/dist/overlays/runtime/overlay/runner.js.map +1 -1
- package/dist/overlays/runtime/overlay/tooltip.js +3 -5
- package/dist/overlays/runtime/overlay/tooltip.js.map +1 -1
- package/dist/react.d.ts +1 -1
- package/dist/react.js.map +1 -1
- package/dist/render/RenderContext.js.map +1 -1
- package/dist/runtime.d.ts +6 -6
- package/dist/runtime.js +38 -16
- package/dist/runtime.js.map +1 -1
- package/dist/smart-canvas.esm.js +97 -85
- package/dist/smart-canvas.esm.js.map +4 -4
- package/dist/smart-canvas.js +41814 -44141
- package/dist/smart-canvas.js.map +4 -4
- package/dist/smart-canvas.min.js +97 -85
- package/dist/smart-canvas.min.js.map +4 -4
- package/dist/state/StateStore.d.ts +0 -6
- package/dist/state/StateStore.js +7 -1
- package/dist/state/StateStore.js.map +1 -1
- package/dist/surfaces/Surfaces.js +1 -1
- package/dist/surfaces/Surfaces.js.map +1 -1
- package/dist/surfaces/positioning.js.map +1 -1
- package/dist/telemetry/adapters/posthog.js +1 -1
- package/dist/telemetry/adapters/posthog.js.map +1 -1
- package/dist/telemetry/registry.d.ts +0 -7
- package/dist/telemetry/registry.js +1 -1
- package/dist/telemetry/registry.js.map +1 -1
- package/dist/theme/ThemeProvider.js.map +1 -1
- package/dist/theme/defaultTheme.d.ts +2 -3
- package/dist/theme/defaultTheme.js +60 -51
- package/dist/theme/defaultTheme.js.map +1 -1
- package/dist/theme/extractHostTheme.js +1 -1
- package/dist/theme/extractHostTheme.js.map +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/types.js +0 -1
- package/dist/types.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/dist/widgets/WidgetRegistry.d.ts +6 -0
- package/dist/widgets/WidgetRegistry.js +12 -3
- package/dist/widgets/WidgetRegistry.js.map +1 -1
- package/package.json +20 -16
- package/dist/apps/adaptive-chatbot/index.js +0 -7
- package/dist/apps/adaptive-chatbot/index.js.map +0 -7
- package/dist/apps/faq/index.js +0 -11
- package/dist/apps/faq/index.js.map +0 -7
- package/dist/apps/gamification/index.js +0 -2
- package/dist/apps/gamification/index.js.map +0 -7
- package/dist/apps/nav/index.js +0 -11
- package/dist/apps/nav/index.js.map +0 -7
package/dist/editorLoader.js
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { debug, warn } from './logger';
|
|
2
|
-
export const DEFAULT_EDITOR_URL = 'https://cdn.syntrologie.com/editor-sdk/latest/editor-sdk.js';
|
|
3
2
|
/**
|
|
4
3
|
* Allowed hosts for loading the editor SDK.
|
|
5
4
|
* Only scripts from these hosts will be loaded.
|
|
@@ -13,6 +12,59 @@ const ALLOWED_EDITOR_HOSTS = [
|
|
|
13
12
|
// Allow any .syntrologie.com subdomain for dev/staging
|
|
14
13
|
'.syntrologie.com',
|
|
15
14
|
];
|
|
15
|
+
/**
|
|
16
|
+
* Decode a base64url-encoded JSON param from the URL.
|
|
17
|
+
* Returns null if param missing or malformed.
|
|
18
|
+
*/
|
|
19
|
+
function decodeParam(paramName) {
|
|
20
|
+
if (typeof window === 'undefined')
|
|
21
|
+
return null;
|
|
22
|
+
const params = new URLSearchParams(window.location.search);
|
|
23
|
+
const raw = params.get(paramName);
|
|
24
|
+
if (!raw)
|
|
25
|
+
return null;
|
|
26
|
+
try {
|
|
27
|
+
const b64 = raw.replace(/-/g, '+').replace(/_/g, '/');
|
|
28
|
+
return JSON.parse(atob(b64));
|
|
29
|
+
}
|
|
30
|
+
catch (e) {
|
|
31
|
+
warn('Syntro Runtime', `Failed to decode ${paramName}:`, e);
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
let _cachedSource;
|
|
36
|
+
let _cachedConf;
|
|
37
|
+
/** Get decoded editor_source from URL or global (cached). */
|
|
38
|
+
export function getEditorSource() {
|
|
39
|
+
if (_cachedSource === undefined) {
|
|
40
|
+
// Check global variable first (set by Chrome extension)
|
|
41
|
+
const globalParams = typeof window !== 'undefined' ? window.__SYNTRO_EDITOR_PARAMS__ : null;
|
|
42
|
+
if (globalParams === null || globalParams === void 0 ? void 0 : globalParams.token) {
|
|
43
|
+
_cachedSource = { token: globalParams.token, api_base: globalParams.apiBase || '' };
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
_cachedSource = decodeParam('editor_source');
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return _cachedSource;
|
|
50
|
+
}
|
|
51
|
+
/** Get decoded editor_conf from URL or global (cached). */
|
|
52
|
+
export function getEditorConf() {
|
|
53
|
+
if (_cachedConf === undefined) {
|
|
54
|
+
// Check global variable first (set by Chrome extension)
|
|
55
|
+
const globalParams = typeof window !== 'undefined' ? window.__SYNTRO_EDITOR_PARAMS__ : null;
|
|
56
|
+
if (globalParams === null || globalParams === void 0 ? void 0 : globalParams.mode) {
|
|
57
|
+
_cachedConf = { mode: globalParams.mode, audit_session_id: globalParams.auditSessionId };
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
_cachedConf = decodeParam('editor_conf');
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return _cachedConf;
|
|
64
|
+
}
|
|
65
|
+
// =============================================================================
|
|
66
|
+
// URL validation
|
|
67
|
+
// =============================================================================
|
|
16
68
|
/**
|
|
17
69
|
* Validates that an editor URL is from an allowed host.
|
|
18
70
|
* Requires HTTPS for non-localhost URLs.
|
|
@@ -21,36 +73,22 @@ const ALLOWED_EDITOR_HOSTS = [
|
|
|
21
73
|
function validateEditorUrl(url) {
|
|
22
74
|
debug('Syntro Runtime', 'Validating editor URL:', url);
|
|
23
75
|
try {
|
|
24
|
-
// Allow relative URLs (same-origin) - they start with /
|
|
25
76
|
if (url.startsWith('/')) {
|
|
26
77
|
debug('Syntro Runtime', '✓ Relative URL allowed (same-origin):', url);
|
|
27
78
|
return true;
|
|
28
79
|
}
|
|
29
80
|
const parsed = new URL(url);
|
|
30
81
|
const isLocalhost = /^(localhost|127\.0\.0\.1)$/.test(parsed.hostname);
|
|
31
|
-
debug('Syntro Runtime', 'Parsed URL:', {
|
|
32
|
-
hostname: parsed.hostname,
|
|
33
|
-
protocol: parsed.protocol,
|
|
34
|
-
isLocalhost,
|
|
35
|
-
});
|
|
36
|
-
// Require HTTPS for non-localhost
|
|
37
82
|
if (parsed.protocol !== 'https:' && !isLocalhost) {
|
|
38
83
|
warn('Syntro Runtime', '❌ Editor URL must use HTTPS:', url);
|
|
39
84
|
return false;
|
|
40
85
|
}
|
|
41
|
-
// Check against allowlist - handle both exact match and suffix match
|
|
42
86
|
const isAllowed = ALLOWED_EDITOR_HOSTS.some((host) => {
|
|
43
87
|
if (host.startsWith('.')) {
|
|
44
|
-
// Suffix match for wildcards like '.syntrologie.com'
|
|
45
88
|
return parsed.hostname.endsWith(host) || parsed.hostname === host.slice(1);
|
|
46
89
|
}
|
|
47
90
|
return parsed.hostname === host;
|
|
48
91
|
});
|
|
49
|
-
debug('Syntro Runtime', 'Host allowlist check:', {
|
|
50
|
-
hostname: parsed.hostname,
|
|
51
|
-
allowedHosts: ALLOWED_EDITOR_HOSTS,
|
|
52
|
-
isAllowed,
|
|
53
|
-
});
|
|
54
92
|
if (!isAllowed) {
|
|
55
93
|
warn('Syntro Runtime', '❌ Editor URL host not in allowlist:', parsed.hostname);
|
|
56
94
|
return false;
|
|
@@ -59,107 +97,83 @@ function validateEditorUrl(url) {
|
|
|
59
97
|
return true;
|
|
60
98
|
}
|
|
61
99
|
catch (e) {
|
|
62
|
-
warn('Syntro Runtime',
|
|
100
|
+
warn('Syntro Runtime', `❌ Invalid editor URL: ${url}`, e);
|
|
63
101
|
return false;
|
|
64
102
|
}
|
|
65
103
|
}
|
|
104
|
+
// =============================================================================
|
|
105
|
+
// Mode detection
|
|
106
|
+
// =============================================================================
|
|
66
107
|
/**
|
|
67
|
-
* Checks if the editor should be loaded
|
|
68
|
-
* Requires
|
|
108
|
+
* Checks if the editor should be loaded.
|
|
109
|
+
* Requires editor_source + editor_conf encoded params with mode === 'editor'.
|
|
69
110
|
*/
|
|
70
111
|
export const shouldLoadEditor = () => {
|
|
71
|
-
var _a;
|
|
72
112
|
debug('Syntro Runtime', '====== EDITOR LOAD CHECK ======');
|
|
73
|
-
if (typeof window === 'undefined')
|
|
74
|
-
debug('Syntro Runtime', 'Not in browser - skipping editor');
|
|
113
|
+
if (typeof window === 'undefined')
|
|
75
114
|
return false;
|
|
76
|
-
|
|
77
|
-
const
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
// Require editor_token for security - prevents arbitrary editor activation
|
|
81
|
-
const hasEditorFlag = params.has('syntro_editor') || params.has('syntro-editor');
|
|
82
|
-
const hasEditorToken = params.has('editor_token');
|
|
83
|
-
debug('Syntro Runtime', 'Editor flags:', {
|
|
84
|
-
hasEditorFlag,
|
|
85
|
-
hasEditorToken,
|
|
86
|
-
syntro_editor: params.get('syntro_editor'),
|
|
87
|
-
'syntro-editor': params.get('syntro-editor'),
|
|
88
|
-
editor_token: hasEditorToken ? `${(_a = params.get('editor_token')) === null || _a === void 0 ? void 0 : _a.slice(0, 10)}...` : 'none',
|
|
89
|
-
});
|
|
90
|
-
if (hasEditorFlag && !hasEditorToken) {
|
|
91
|
-
warn('Syntro Runtime', '❌ Editor activation requires editor_token parameter');
|
|
115
|
+
const source = getEditorSource();
|
|
116
|
+
const conf = getEditorConf();
|
|
117
|
+
if (!(source === null || source === void 0 ? void 0 : source.token) || !conf) {
|
|
118
|
+
debug('Syntro Runtime', 'No encoded params found');
|
|
92
119
|
debug('Syntro Runtime', '================================');
|
|
93
120
|
return false;
|
|
94
121
|
}
|
|
95
|
-
const
|
|
96
|
-
debug('Syntro Runtime',
|
|
122
|
+
const should = conf.mode === 'editor';
|
|
123
|
+
debug('Syntro Runtime', `mode: ${conf.mode}, shouldLoad: ${should}`);
|
|
97
124
|
debug('Syntro Runtime', '================================');
|
|
98
|
-
return
|
|
125
|
+
return should;
|
|
99
126
|
};
|
|
100
127
|
/**
|
|
101
|
-
* Checks if audit mode should be activated
|
|
102
|
-
*
|
|
103
|
-
* Requires audit_token parameter for security.
|
|
128
|
+
* Checks if audit mode should be activated.
|
|
129
|
+
* Requires editor_source + editor_conf encoded params with mode === 'audit'.
|
|
104
130
|
*/
|
|
105
131
|
export const isAuditMode = () => {
|
|
106
|
-
var _a;
|
|
107
132
|
debug('Syntro Runtime', '====== AUDIT MODE CHECK ======');
|
|
108
|
-
if (typeof window === 'undefined')
|
|
109
|
-
debug('Syntro Runtime', 'Not in browser - skipping audit');
|
|
110
|
-
return false;
|
|
111
|
-
}
|
|
112
|
-
const params = new URLSearchParams(window.location.search);
|
|
113
|
-
const hasAuditFlag = params.has('syntro_audit');
|
|
114
|
-
const hasAuditToken = params.has('audit_token');
|
|
115
|
-
const auditSessionId = params.get('audit_session_id');
|
|
116
|
-
debug('Syntro Runtime', 'Audit flags:', {
|
|
117
|
-
hasAuditFlag,
|
|
118
|
-
hasAuditToken,
|
|
119
|
-
auditSessionId: auditSessionId ? `${auditSessionId.slice(0, 8)}...` : 'none',
|
|
120
|
-
audit_token: hasAuditToken ? `${(_a = params.get('audit_token')) === null || _a === void 0 ? void 0 : _a.slice(0, 10)}...` : 'none',
|
|
121
|
-
});
|
|
122
|
-
// Require syntro_audit flag to activate audit mode
|
|
123
|
-
if (!hasAuditFlag) {
|
|
124
|
-
debug('Syntro Runtime', 'No syntro_audit param - not in audit mode');
|
|
125
|
-
debug('Syntro Runtime', '================================');
|
|
133
|
+
if (typeof window === 'undefined')
|
|
126
134
|
return false;
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
if (!
|
|
130
|
-
|
|
135
|
+
const source = getEditorSource();
|
|
136
|
+
const conf = getEditorConf();
|
|
137
|
+
if (!(source === null || source === void 0 ? void 0 : source.token) || !conf) {
|
|
138
|
+
debug('Syntro Runtime', 'No encoded params found');
|
|
131
139
|
debug('Syntro Runtime', '================================');
|
|
132
140
|
return false;
|
|
133
141
|
}
|
|
134
|
-
|
|
142
|
+
const isAudit = conf.mode === 'audit';
|
|
143
|
+
debug('Syntro Runtime', `mode: ${conf.mode}, isAudit: ${isAudit}`);
|
|
135
144
|
debug('Syntro Runtime', '================================');
|
|
136
|
-
return
|
|
145
|
+
return isAudit;
|
|
137
146
|
};
|
|
138
147
|
/**
|
|
139
148
|
* Checks if any SDK mode (editor or audit) should be loaded.
|
|
140
149
|
* Returns the mode type if active, or null if neither.
|
|
141
150
|
*/
|
|
142
151
|
export const getActiveSdkMode = () => {
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
if (
|
|
146
|
-
return
|
|
152
|
+
const conf = getEditorConf();
|
|
153
|
+
const source = getEditorSource();
|
|
154
|
+
if (!(source === null || source === void 0 ? void 0 : source.token) || !conf)
|
|
155
|
+
return null;
|
|
156
|
+
if (conf.mode === 'editor' || conf.mode === 'audit')
|
|
157
|
+
return conf.mode;
|
|
147
158
|
return null;
|
|
148
159
|
};
|
|
149
160
|
/**
|
|
150
|
-
* Gets the token from
|
|
151
|
-
* Returns the token value or null if not found.
|
|
161
|
+
* Gets the auth token from editor_source encoded param.
|
|
152
162
|
*/
|
|
153
|
-
function
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
163
|
+
function getToken() {
|
|
164
|
+
var _a, _b;
|
|
165
|
+
return (_b = (_a = getEditorSource()) === null || _a === void 0 ? void 0 : _a.token) !== null && _b !== void 0 ? _b : null;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Gets the api_base from editor_source encoded param.
|
|
169
|
+
*/
|
|
170
|
+
function getApiBase() {
|
|
171
|
+
var _a, _b;
|
|
172
|
+
return (_b = (_a = getEditorSource()) === null || _a === void 0 ? void 0 : _a.api_base) !== null && _b !== void 0 ? _b : null;
|
|
158
173
|
}
|
|
159
174
|
/**
|
|
160
175
|
* Dynamically loads the Editor SDK script.
|
|
161
176
|
* Validates URL against allowlist and supports SRI integrity checking.
|
|
162
|
-
* Requires a valid token (editor_token or audit_token) in URL params.
|
|
163
177
|
*/
|
|
164
178
|
export const loadEditorSdk = async (editorUrlOrOptions) => {
|
|
165
179
|
debug('Syntro Runtime', '====== LOAD EDITOR SDK ======');
|
|
@@ -171,22 +185,22 @@ export const loadEditorSdk = async (editorUrlOrOptions) => {
|
|
|
171
185
|
debug('Syntro Runtime', 'Editor SDK already loaded (window.SyntroEditor exists)');
|
|
172
186
|
return;
|
|
173
187
|
}
|
|
174
|
-
// Handle both legacy string arg and new options object
|
|
175
188
|
const options = typeof editorUrlOrOptions === 'string'
|
|
176
189
|
? { editorUrl: editorUrlOrOptions }
|
|
177
190
|
: (editorUrlOrOptions !== null && editorUrlOrOptions !== void 0 ? editorUrlOrOptions : {});
|
|
178
|
-
//
|
|
179
|
-
const
|
|
180
|
-
const urlParamEditorSdk = params.get('syntro_editor_sdk_url');
|
|
181
|
-
// If api_base is provided, derive editor SDK URL from it
|
|
182
|
-
const apiBase = params.get('api_base');
|
|
191
|
+
// Derive editor SDK URL from api_base in editor_source
|
|
192
|
+
const apiBase = getApiBase();
|
|
183
193
|
const derivedEditorSdk = apiBase ? `${apiBase}/api/editor/sdk/editor-sdk.js` : null;
|
|
184
|
-
// Priority:
|
|
185
|
-
const baseEditorUrl =
|
|
186
|
-
|
|
187
|
-
|
|
194
|
+
// Priority: api_base derived > options
|
|
195
|
+
const baseEditorUrl = derivedEditorSdk || options.editorUrl;
|
|
196
|
+
if (!baseEditorUrl) {
|
|
197
|
+
warn('Syntro Runtime', '❌ No editor SDK URL available (no api_base, no editorUrl option)');
|
|
198
|
+
debug('Syntro Runtime', '================================');
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
const token = getToken();
|
|
188
202
|
if (!token) {
|
|
189
|
-
warn('Syntro Runtime', '❌ No token found in
|
|
203
|
+
warn('Syntro Runtime', '❌ No token found in editor_source.');
|
|
190
204
|
debug('Syntro Runtime', '================================');
|
|
191
205
|
return;
|
|
192
206
|
}
|
|
@@ -195,9 +209,9 @@ export const loadEditorSdk = async (editorUrlOrOptions) => {
|
|
|
195
209
|
debug('Syntro Runtime', 'Editor URL:', editorUrl);
|
|
196
210
|
debug('Syntro Runtime', 'Options:', {
|
|
197
211
|
hasIntegrity: !!options.integrity,
|
|
198
|
-
|
|
212
|
+
hasEditorUrl: !!baseEditorUrl,
|
|
199
213
|
hasApiBase: !!apiBase,
|
|
200
|
-
tokenPrefix: token.slice(0, 10)
|
|
214
|
+
tokenPrefix: `${token.slice(0, 10)}...`,
|
|
201
215
|
});
|
|
202
216
|
// Security: Validate URL against allowlist (check base URL without token)
|
|
203
217
|
if (!validateEditorUrl(baseEditorUrl)) {
|
|
@@ -210,7 +224,6 @@ export const loadEditorSdk = async (editorUrlOrOptions) => {
|
|
|
210
224
|
const script = document.createElement('script');
|
|
211
225
|
script.src = editorUrl;
|
|
212
226
|
script.async = true;
|
|
213
|
-
// Add SRI integrity check if provided
|
|
214
227
|
if (options.integrity) {
|
|
215
228
|
script.integrity = options.integrity;
|
|
216
229
|
script.crossOrigin = 'anonymous';
|
|
@@ -218,14 +231,12 @@ export const loadEditorSdk = async (editorUrlOrOptions) => {
|
|
|
218
231
|
}
|
|
219
232
|
script.onload = () => {
|
|
220
233
|
debug('Syntro Runtime', '✓ Editor SDK script loaded successfully');
|
|
221
|
-
debug('Syntro Runtime', 'window.SyntroEditor:', !!window.SyntroEditor);
|
|
222
234
|
debug('Syntro Runtime', '================================');
|
|
223
235
|
resolve();
|
|
224
236
|
};
|
|
225
237
|
script.onerror = (err) => {
|
|
226
238
|
console.error('[Syntro Runtime] ❌ Failed to load Editor SDK:', err);
|
|
227
239
|
console.error('[Syntro Runtime] URL attempted:', editorUrl);
|
|
228
|
-
console.error('[Syntro Runtime] Check: Is the URL accessible? CORS? Network? Token valid?');
|
|
229
240
|
debug('Syntro Runtime', '================================');
|
|
230
241
|
reject(err);
|
|
231
242
|
};
|
package/dist/editorLoader.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"editorLoader.js","sourceRoot":"","sources":["../src/editorLoader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAEvC
|
|
1
|
+
{"version":3,"file":"editorLoader.js","sourceRoot":"","sources":["../src/editorLoader.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Transforms Smart Canvas events into normalized events for the EventBus.
|
|
5
5
|
*/
|
|
6
|
-
import type { NormalizedEvent } from '../types';
|
|
7
6
|
import type { CanvasSurface } from '../../telemetry/types';
|
|
7
|
+
import type { NormalizedEvent } from '../types';
|
|
8
8
|
/**
|
|
9
9
|
* Canvas opened event.
|
|
10
10
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"canvas.js","sourceRoot":"","sources":["../../../src/events/normalizers/canvas.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"canvas.js","sourceRoot":"","sources":["../../../src/events/normalizers/canvas.ts"],"names":[],"mappings":"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"}
|
package/dist/events/schema.d.ts
CHANGED
|
@@ -10,14 +10,14 @@ export declare const NormalizedEventZ: z.ZodObject<{
|
|
|
10
10
|
props: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
11
11
|
schemaVersion: z.ZodString;
|
|
12
12
|
}, "strip", z.ZodTypeAny, {
|
|
13
|
-
name: string;
|
|
14
13
|
source: "posthog" | "canvas" | "derived";
|
|
14
|
+
name: string;
|
|
15
15
|
schemaVersion: string;
|
|
16
16
|
ts: number;
|
|
17
17
|
props?: Record<string, unknown> | undefined;
|
|
18
18
|
}, {
|
|
19
|
-
name: string;
|
|
20
19
|
source: "posthog" | "canvas" | "derived";
|
|
20
|
+
name: string;
|
|
21
21
|
schemaVersion: string;
|
|
22
22
|
ts: number;
|
|
23
23
|
props?: Record<string, unknown> | undefined;
|
|
@@ -39,14 +39,14 @@ export declare const EventFilterZ: z.ZodObject<{
|
|
|
39
39
|
* Validate a NormalizedEvent object.
|
|
40
40
|
*/
|
|
41
41
|
export declare function validateNormalizedEvent(data: unknown): z.SafeParseReturnType<{
|
|
42
|
-
name: string;
|
|
43
42
|
source: "posthog" | "canvas" | "derived";
|
|
43
|
+
name: string;
|
|
44
44
|
schemaVersion: string;
|
|
45
45
|
ts: number;
|
|
46
46
|
props?: Record<string, unknown> | undefined;
|
|
47
47
|
}, {
|
|
48
|
-
name: string;
|
|
49
48
|
source: "posthog" | "canvas" | "derived";
|
|
49
|
+
name: string;
|
|
50
50
|
schemaVersion: string;
|
|
51
51
|
ts: number;
|
|
52
52
|
props?: Record<string, unknown> | undefined;
|
package/dist/events/schema.js
CHANGED
|
@@ -7,7 +7,7 @@ export const NormalizedEventZ = z.object({
|
|
|
7
7
|
ts: z.number(),
|
|
8
8
|
name: z.string(),
|
|
9
9
|
source: EventSourceZ,
|
|
10
|
-
props: z.record(z.unknown()).optional(),
|
|
10
|
+
props: z.record(z.string(), z.unknown()).optional(),
|
|
11
11
|
schemaVersion: z.string(),
|
|
12
12
|
});
|
|
13
13
|
export const EventFilterZ = z.object({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/events/schema.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC;AAErE,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,MAAM,EAAE,YAAY;IACpB,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE;
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/events/schema.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC;AAErE,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,MAAM,EAAE,YAAY;IACpB,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE;IACnD,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE;CAC1B,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IACrC,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IACxC,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,QAAQ,EAAE;CAC1C,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,UAAU,uBAAuB,CAAC,IAAa;IACnD,OAAO,gBAAgB,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;AAC1C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAa;IAC/C,OAAO,YAAY,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;AACtC,CAAC"}
|
|
@@ -6,8 +6,8 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import { GrowthBook } from '@growthbook/growthbook';
|
|
8
8
|
import type { Context as GrowthBookInitOptions } from '@growthbook/growthbook';
|
|
9
|
-
import type { ExperimentClient } from '../types';
|
|
10
9
|
import type { TileConfig } from '../../types';
|
|
10
|
+
import type { ExperimentClient } from '../types';
|
|
11
11
|
/**
|
|
12
12
|
* Callback fired when a user is assigned to an experiment.
|
|
13
13
|
*/
|
|
@@ -53,6 +53,7 @@ export declare class GrowthBookAdapter implements ExperimentClient {
|
|
|
53
53
|
setAttributes(attrs: Record<string, unknown>): void;
|
|
54
54
|
setForcedVariations(variations: Record<string, number>): void;
|
|
55
55
|
getFeatureValue<T>(key: string, fallback: T): T;
|
|
56
|
+
getAllFeatures(): Record<string, unknown>;
|
|
56
57
|
shouldRenderRectangle(tile: TileConfig): boolean;
|
|
57
58
|
}
|
|
58
59
|
/**
|
|
@@ -58,8 +58,16 @@ export class GrowthBookAdapter {
|
|
|
58
58
|
getFeatureValue(key, fallback) {
|
|
59
59
|
return this.gb.getFeatureValue(key, fallback);
|
|
60
60
|
}
|
|
61
|
+
getAllFeatures() {
|
|
62
|
+
const features = this.gb.getFeatures();
|
|
63
|
+
const result = {};
|
|
64
|
+
for (const key of Object.keys(features)) {
|
|
65
|
+
result[key] = this.gb.getFeatureValue(key, null);
|
|
66
|
+
}
|
|
67
|
+
return result;
|
|
68
|
+
}
|
|
61
69
|
shouldRenderRectangle(tile) {
|
|
62
|
-
const experiment = tile
|
|
70
|
+
const { experiment } = tile;
|
|
63
71
|
if (!experiment)
|
|
64
72
|
return true;
|
|
65
73
|
if (!experiment.featureKey)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"growthbook.js","sourceRoot":"","sources":["../../../src/experiments/adapters/growthbook.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"growthbook.js","sourceRoot":"","sources":["../../../src/experiments/adapters/growthbook.ts"],"names":[],"mappings":"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"}
|
|
@@ -27,6 +27,11 @@ export interface ExperimentClient {
|
|
|
27
27
|
* Refresh/load feature flags from the server.
|
|
28
28
|
*/
|
|
29
29
|
refreshFeatures?(): Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
* Get all loaded features (for prefix-based discovery).
|
|
32
|
+
* Returns a map of feature key -> feature value.
|
|
33
|
+
*/
|
|
34
|
+
getAllFeatures?(): Record<string, unknown>;
|
|
30
35
|
}
|
|
31
36
|
/**
|
|
32
37
|
* @deprecated Use ExperimentClient instead
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cdnFetcher.js","sourceRoot":"","sources":["../../src/fetchers/cdnFetcher.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"cdnFetcher.js","sourceRoot":"","sources":["../../src/fetchers/cdnFetcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,15 +1,26 @@
|
|
|
1
|
-
import type { ConfigFetcher, FetchResult } from './types';
|
|
2
1
|
import type { ExperimentClient } from '../experiments/types';
|
|
2
|
+
import type { ConfigFetcher, FetchResult } from './types';
|
|
3
3
|
export interface ExperimentsFetcherOptions {
|
|
4
4
|
/**
|
|
5
5
|
* Experiment client instance (e.g., from createGrowthBookClient).
|
|
6
6
|
*/
|
|
7
7
|
client: ExperimentClient;
|
|
8
8
|
/**
|
|
9
|
-
*
|
|
9
|
+
* Single feature key for the monolithic config (legacy mode).
|
|
10
10
|
* @default "smart-canvas-config"
|
|
11
11
|
*/
|
|
12
12
|
featureKey?: string;
|
|
13
|
+
/**
|
|
14
|
+
* Feature key for the variant manifest (lists active variant flag keys).
|
|
15
|
+
* When set, enables multi-flag mode.
|
|
16
|
+
*/
|
|
17
|
+
manifestKey?: string;
|
|
18
|
+
/**
|
|
19
|
+
* Prefix for convention-based variant flag discovery.
|
|
20
|
+
* All GrowthBook features matching this prefix will be evaluated.
|
|
21
|
+
* Used as fallback when manifestKey is not set or returns empty.
|
|
22
|
+
*/
|
|
23
|
+
variantFlagPrefix?: string;
|
|
13
24
|
}
|
|
14
25
|
/**
|
|
15
26
|
* Fetches config from an experiment/feature flag system.
|
|
@@ -24,8 +35,19 @@ export declare class ExperimentsFetcher implements ConfigFetcher {
|
|
|
24
35
|
readonly name = "experiments";
|
|
25
36
|
private client;
|
|
26
37
|
private featureKey;
|
|
38
|
+
private manifestKey?;
|
|
39
|
+
private variantFlagPrefix?;
|
|
27
40
|
constructor(options: ExperimentsFetcherOptions);
|
|
28
41
|
fetch(): Promise<FetchResult>;
|
|
42
|
+
/**
|
|
43
|
+
* Resolve config from multiple variant feature flags.
|
|
44
|
+
* Returns the first active variant config, or null if none match.
|
|
45
|
+
*/
|
|
46
|
+
private fetchMultiFlag;
|
|
47
|
+
/**
|
|
48
|
+
* Get variant flag keys from manifest or prefix discovery.
|
|
49
|
+
*/
|
|
50
|
+
private getVariantFlagKeys;
|
|
29
51
|
}
|
|
30
52
|
/**
|
|
31
53
|
* Factory function for creating an experiments-based fetcher.
|