@syntrologie/runtime-sdk 2.1.0-canary.8 → 2.1.0-canary.9
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 +273 -22
- package/dist/adaptives/faq/index.js +5 -5
- package/dist/adaptives/faq/index.js.map +4 -4
- package/dist/blocks/data/ComparisonBlock.js +9 -9
- package/dist/blocks/data/ComparisonBlock.js.map +1 -1
- package/dist/blocks/data/StatsBlock.js +10 -10
- package/dist/blocks/data/StatsBlock.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 +23 -23
- package/dist/blocks/notification/NotificationBlock.js.map +1 -1
- package/dist/bootstrap.js +13 -21
- package/dist/bootstrap.js.map +1 -1
- package/dist/components/ShadowCanvasOverlay.js +23 -22
- package/dist/components/ShadowCanvasOverlay.js.map +1 -1
- package/dist/components/TileCard.js +23 -22
- package/dist/components/TileCard.js.map +1 -1
- package/dist/components/TileWheel.js +23 -1
- package/dist/components/TileWheel.js.map +1 -1
- package/dist/editorLoader.d.ts +19 -9
- package/dist/editorLoader.js +91 -94
- package/dist/editorLoader.js.map +1 -1
- package/dist/smart-canvas.esm.js +61 -49
- package/dist/smart-canvas.esm.js.map +4 -4
- package/dist/smart-canvas.js +21757 -24175
- package/dist/smart-canvas.js.map +4 -4
- package/dist/smart-canvas.min.js +61 -49
- package/dist/smart-canvas.min.js.map +4 -4
- 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/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +17 -12
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,45 @@ 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 (cached). */
|
|
38
|
+
export function getEditorSource() {
|
|
39
|
+
if (_cachedSource === undefined) {
|
|
40
|
+
_cachedSource = decodeParam('editor_source');
|
|
41
|
+
}
|
|
42
|
+
return _cachedSource;
|
|
43
|
+
}
|
|
44
|
+
/** Get decoded editor_conf from URL (cached). */
|
|
45
|
+
export function getEditorConf() {
|
|
46
|
+
if (_cachedConf === undefined) {
|
|
47
|
+
_cachedConf = decodeParam('editor_conf');
|
|
48
|
+
}
|
|
49
|
+
return _cachedConf;
|
|
50
|
+
}
|
|
51
|
+
// =============================================================================
|
|
52
|
+
// URL validation
|
|
53
|
+
// =============================================================================
|
|
16
54
|
/**
|
|
17
55
|
* Validates that an editor URL is from an allowed host.
|
|
18
56
|
* Requires HTTPS for non-localhost URLs.
|
|
@@ -21,36 +59,22 @@ const ALLOWED_EDITOR_HOSTS = [
|
|
|
21
59
|
function validateEditorUrl(url) {
|
|
22
60
|
debug('Syntro Runtime', 'Validating editor URL:', url);
|
|
23
61
|
try {
|
|
24
|
-
// Allow relative URLs (same-origin) - they start with /
|
|
25
62
|
if (url.startsWith('/')) {
|
|
26
63
|
debug('Syntro Runtime', '✓ Relative URL allowed (same-origin):', url);
|
|
27
64
|
return true;
|
|
28
65
|
}
|
|
29
66
|
const parsed = new URL(url);
|
|
30
67
|
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
68
|
if (parsed.protocol !== 'https:' && !isLocalhost) {
|
|
38
69
|
warn('Syntro Runtime', '❌ Editor URL must use HTTPS:', url);
|
|
39
70
|
return false;
|
|
40
71
|
}
|
|
41
|
-
// Check against allowlist - handle both exact match and suffix match
|
|
42
72
|
const isAllowed = ALLOWED_EDITOR_HOSTS.some((host) => {
|
|
43
73
|
if (host.startsWith('.')) {
|
|
44
|
-
// Suffix match for wildcards like '.syntrologie.com'
|
|
45
74
|
return parsed.hostname.endsWith(host) || parsed.hostname === host.slice(1);
|
|
46
75
|
}
|
|
47
76
|
return parsed.hostname === host;
|
|
48
77
|
});
|
|
49
|
-
debug('Syntro Runtime', 'Host allowlist check:', {
|
|
50
|
-
hostname: parsed.hostname,
|
|
51
|
-
allowedHosts: ALLOWED_EDITOR_HOSTS,
|
|
52
|
-
isAllowed,
|
|
53
|
-
});
|
|
54
78
|
if (!isAllowed) {
|
|
55
79
|
warn('Syntro Runtime', '❌ Editor URL host not in allowlist:', parsed.hostname);
|
|
56
80
|
return false;
|
|
@@ -63,103 +87,79 @@ function validateEditorUrl(url) {
|
|
|
63
87
|
return false;
|
|
64
88
|
}
|
|
65
89
|
}
|
|
90
|
+
// =============================================================================
|
|
91
|
+
// Mode detection
|
|
92
|
+
// =============================================================================
|
|
66
93
|
/**
|
|
67
|
-
* Checks if the editor should be loaded
|
|
68
|
-
* Requires
|
|
94
|
+
* Checks if the editor should be loaded.
|
|
95
|
+
* Requires editor_source + editor_conf encoded params with mode === 'editor'.
|
|
69
96
|
*/
|
|
70
97
|
export const shouldLoadEditor = () => {
|
|
71
|
-
var _a;
|
|
72
98
|
debug('Syntro Runtime', '====== EDITOR LOAD CHECK ======');
|
|
73
|
-
if (typeof window === 'undefined')
|
|
74
|
-
debug('Syntro Runtime', 'Not in browser - skipping editor');
|
|
99
|
+
if (typeof window === 'undefined')
|
|
75
100
|
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');
|
|
101
|
+
const source = getEditorSource();
|
|
102
|
+
const conf = getEditorConf();
|
|
103
|
+
if (!(source === null || source === void 0 ? void 0 : source.token) || !conf) {
|
|
104
|
+
debug('Syntro Runtime', 'No encoded params found');
|
|
92
105
|
debug('Syntro Runtime', '================================');
|
|
93
106
|
return false;
|
|
94
107
|
}
|
|
95
|
-
const
|
|
96
|
-
debug('Syntro Runtime',
|
|
108
|
+
const should = conf.mode === 'editor';
|
|
109
|
+
debug('Syntro Runtime', `mode: ${conf.mode}, shouldLoad: ${should}`);
|
|
97
110
|
debug('Syntro Runtime', '================================');
|
|
98
|
-
return
|
|
111
|
+
return should;
|
|
99
112
|
};
|
|
100
113
|
/**
|
|
101
|
-
* Checks if audit mode should be activated
|
|
102
|
-
*
|
|
103
|
-
* Requires audit_token parameter for security.
|
|
114
|
+
* Checks if audit mode should be activated.
|
|
115
|
+
* Requires editor_source + editor_conf encoded params with mode === 'audit'.
|
|
104
116
|
*/
|
|
105
117
|
export const isAuditMode = () => {
|
|
106
|
-
var _a;
|
|
107
118
|
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', '================================');
|
|
119
|
+
if (typeof window === 'undefined')
|
|
126
120
|
return false;
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
if (!
|
|
130
|
-
|
|
121
|
+
const source = getEditorSource();
|
|
122
|
+
const conf = getEditorConf();
|
|
123
|
+
if (!(source === null || source === void 0 ? void 0 : source.token) || !conf) {
|
|
124
|
+
debug('Syntro Runtime', 'No encoded params found');
|
|
131
125
|
debug('Syntro Runtime', '================================');
|
|
132
126
|
return false;
|
|
133
127
|
}
|
|
134
|
-
|
|
128
|
+
const isAudit = conf.mode === 'audit';
|
|
129
|
+
debug('Syntro Runtime', `mode: ${conf.mode}, isAudit: ${isAudit}`);
|
|
135
130
|
debug('Syntro Runtime', '================================');
|
|
136
|
-
return
|
|
131
|
+
return isAudit;
|
|
137
132
|
};
|
|
138
133
|
/**
|
|
139
134
|
* Checks if any SDK mode (editor or audit) should be loaded.
|
|
140
135
|
* Returns the mode type if active, or null if neither.
|
|
141
136
|
*/
|
|
142
137
|
export const getActiveSdkMode = () => {
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
if (
|
|
146
|
-
return
|
|
138
|
+
const conf = getEditorConf();
|
|
139
|
+
const source = getEditorSource();
|
|
140
|
+
if (!(source === null || source === void 0 ? void 0 : source.token) || !conf)
|
|
141
|
+
return null;
|
|
142
|
+
if (conf.mode === 'editor' || conf.mode === 'audit')
|
|
143
|
+
return conf.mode;
|
|
147
144
|
return null;
|
|
148
145
|
};
|
|
149
146
|
/**
|
|
150
|
-
* Gets the token from
|
|
151
|
-
* Returns the token value or null if not found.
|
|
147
|
+
* Gets the auth token from editor_source encoded param.
|
|
152
148
|
*/
|
|
153
|
-
function
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
149
|
+
function getToken() {
|
|
150
|
+
var _a, _b;
|
|
151
|
+
return (_b = (_a = getEditorSource()) === null || _a === void 0 ? void 0 : _a.token) !== null && _b !== void 0 ? _b : null;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Gets the api_base from editor_source encoded param.
|
|
155
|
+
*/
|
|
156
|
+
function getApiBase() {
|
|
157
|
+
var _a, _b;
|
|
158
|
+
return (_b = (_a = getEditorSource()) === null || _a === void 0 ? void 0 : _a.api_base) !== null && _b !== void 0 ? _b : null;
|
|
158
159
|
}
|
|
159
160
|
/**
|
|
160
161
|
* Dynamically loads the Editor SDK script.
|
|
161
162
|
* Validates URL against allowlist and supports SRI integrity checking.
|
|
162
|
-
* Requires a valid token (editor_token or audit_token) in URL params.
|
|
163
163
|
*/
|
|
164
164
|
export const loadEditorSdk = async (editorUrlOrOptions) => {
|
|
165
165
|
debug('Syntro Runtime', '====== LOAD EDITOR SDK ======');
|
|
@@ -171,22 +171,22 @@ export const loadEditorSdk = async (editorUrlOrOptions) => {
|
|
|
171
171
|
debug('Syntro Runtime', 'Editor SDK already loaded (window.SyntroEditor exists)');
|
|
172
172
|
return;
|
|
173
173
|
}
|
|
174
|
-
// Handle both legacy string arg and new options object
|
|
175
174
|
const options = typeof editorUrlOrOptions === 'string'
|
|
176
175
|
? { editorUrl: editorUrlOrOptions }
|
|
177
176
|
: (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');
|
|
177
|
+
// Derive editor SDK URL from api_base in editor_source
|
|
178
|
+
const apiBase = getApiBase();
|
|
183
179
|
const derivedEditorSdk = apiBase ? `${apiBase}/api/editor/sdk/editor-sdk.js` : null;
|
|
184
|
-
// Priority:
|
|
185
|
-
const baseEditorUrl =
|
|
186
|
-
|
|
187
|
-
|
|
180
|
+
// Priority: api_base derived > options
|
|
181
|
+
const baseEditorUrl = derivedEditorSdk || options.editorUrl;
|
|
182
|
+
if (!baseEditorUrl) {
|
|
183
|
+
warn('Syntro Runtime', '❌ No editor SDK URL available (no api_base, no editorUrl option)');
|
|
184
|
+
debug('Syntro Runtime', '================================');
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
const token = getToken();
|
|
188
188
|
if (!token) {
|
|
189
|
-
warn('Syntro Runtime', '❌ No token found in
|
|
189
|
+
warn('Syntro Runtime', '❌ No token found in editor_source.');
|
|
190
190
|
debug('Syntro Runtime', '================================');
|
|
191
191
|
return;
|
|
192
192
|
}
|
|
@@ -195,7 +195,7 @@ export const loadEditorSdk = async (editorUrlOrOptions) => {
|
|
|
195
195
|
debug('Syntro Runtime', 'Editor URL:', editorUrl);
|
|
196
196
|
debug('Syntro Runtime', 'Options:', {
|
|
197
197
|
hasIntegrity: !!options.integrity,
|
|
198
|
-
|
|
198
|
+
hasEditorUrl: !!baseEditorUrl,
|
|
199
199
|
hasApiBase: !!apiBase,
|
|
200
200
|
tokenPrefix: `${token.slice(0, 10)}...`,
|
|
201
201
|
});
|
|
@@ -210,7 +210,6 @@ export const loadEditorSdk = async (editorUrlOrOptions) => {
|
|
|
210
210
|
const script = document.createElement('script');
|
|
211
211
|
script.src = editorUrl;
|
|
212
212
|
script.async = true;
|
|
213
|
-
// Add SRI integrity check if provided
|
|
214
213
|
if (options.integrity) {
|
|
215
214
|
script.integrity = options.integrity;
|
|
216
215
|
script.crossOrigin = 'anonymous';
|
|
@@ -218,14 +217,12 @@ export const loadEditorSdk = async (editorUrlOrOptions) => {
|
|
|
218
217
|
}
|
|
219
218
|
script.onload = () => {
|
|
220
219
|
debug('Syntro Runtime', '✓ Editor SDK script loaded successfully');
|
|
221
|
-
debug('Syntro Runtime', 'window.SyntroEditor:', !!window.SyntroEditor);
|
|
222
220
|
debug('Syntro Runtime', '================================');
|
|
223
221
|
resolve();
|
|
224
222
|
};
|
|
225
223
|
script.onerror = (err) => {
|
|
226
224
|
console.error('[Syntro Runtime] ❌ Failed to load Editor SDK:', err);
|
|
227
225
|
console.error('[Syntro Runtime] URL attempted:', editorUrl);
|
|
228
|
-
console.error('[Syntro Runtime] Check: Is the URL accessible? CORS? Network? Token valid?');
|
|
229
226
|
debug('Syntro Runtime', '================================');
|
|
230
227
|
reject(err);
|
|
231
228
|
};
|
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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"}
|