@descope/sdk-mixins
Version:
Descope JavaScript SDK mixins
78 lines (75 loc) • 2.89 kB
JavaScript
import { UI_COMPONENTS_URL_KEY } from '../descopeUiMixin/constants.js';
const isSafeCssVarSegment = (segment) => /^[a-zA-Z0-9-]+$/.test(segment);
const serializeOverrideCssValue = (value) => {
if (typeof value === 'number') {
return Number.isFinite(value) ? String(value) : null;
}
if (typeof value !== 'string')
return null;
if (/[;{}]/.test(value))
return null;
return value.trim();
};
const flattenToVars = (obj, onError, prefix = '') => Object.entries(obj).reduce((css, [key, value]) => {
if (!isSafeCssVarSegment(key)) {
onError('Ignoring invalid override-css token path segment');
return css;
}
const path = prefix ? `${prefix}-${key}` : key;
if (typeof value === 'object' && value !== null) {
return css + flattenToVars(value, onError, path);
}
const serializedValue = serializeOverrideCssValue(value);
if (serializedValue === null) {
onError('Ignoring invalid override-css token value');
return css;
}
return `${css}--descope-${path}:${serializedValue};`;
}, '');
const loadFont = (url) => {
const font = document.createElement('link');
font.href = url;
font.rel = 'stylesheet';
document.head.appendChild(font);
};
const loadDevTheme = async () => {
const componentsUrl = localStorage.getItem(UI_COMPONENTS_URL_KEY);
const descopeDevUrl = componentsUrl === null || componentsUrl === void 0 ? void 0 : componentsUrl.replace(/[^\/]+$/, 'DescopeDev.js');
// eslint-disable-next-line no-console
console.warn('Trying to load DescopeDev.js from', descopeDevUrl);
const scriptEle = document.createElement('script');
scriptEle.src = descopeDevUrl;
document.body.appendChild(scriptEle);
await new Promise((resolve, reject) => {
scriptEle.onload = resolve;
scriptEle.onerror = reject;
});
if (globalThis.DescopeDev) {
const { themeToStyle, defaultTheme, darkTheme } = globalThis.DescopeDev;
return {
light: themeToStyle(defaultTheme),
dark: themeToStyle(darkTheme),
};
}
};
function deepMergeNonEmpty(base, override) {
const merged = Object.assign({}, base);
for (const [key, value] of Object.entries(override || {})) {
if (value === null || value === undefined)
continue;
if (typeof value === 'object') {
if (Object.keys(value).length === 0)
continue;
merged[key] = deepMergeNonEmpty(merged[key] || {}, value);
}
else if (typeof value === 'string') {
merged[key] = (merged[key] || '') + value;
}
else {
merged[key] = value;
}
}
return merged;
}
export { deepMergeNonEmpty, flattenToVars, isSafeCssVarSegment, loadDevTheme, loadFont, serializeOverrideCssValue };
//# sourceMappingURL=helpers.js.map