@redocly/theme
Version:
Shared UI components lib
52 lines • 1.93 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.resolveIcon = resolveIcon;
const FA_ICON_STYLES = ['solid', 'regular', 'duotone', 'brands'];
const FA_ICON_NAME_PATTERN = /^[a-z0-9-]+$/i;
/**
* Resolves an icon value from configuration into a structured object.
*
* Supports:
* - URLs (absolute or relative paths to image files)
* - Font Awesome icons in formats:
* - "solid camera" (style + name)
* - "camera" (name only, default style: 'regular')
*
* @param icon - The icon string from config.
* @returns A structured object describing the icon:
* - type: 'url' | 'font-awesome' | 'invalid'
* - value: for URLs
* - name and style: for Font Awesome icons
* - reason: for invalid entries
*/
function resolveIcon(icon) {
if (!icon || typeof icon !== 'string') {
return { type: 'invalid', reason: 'Icon must be a non-empty string' };
}
const trimmed = icon.trim();
const isLink = trimmed.match(/\.(svg|png|jpg|jpeg|gif|ico|webp)$/) || /^https?:\/\//.test(trimmed);
if (isLink) {
return { type: 'link', value: trimmed };
}
const [first, second] = trimmed.split(/\s+/);
if (first) {
if (second) {
// Format: "style name" (e.g., "solid camera")
if (FA_ICON_STYLES.includes(first) && FA_ICON_NAME_PATTERN.test(second)) {
return { type: 'font-awesome', style: first, name: second };
}
else {
return { type: 'invalid', reason: 'Unrecognized icon format' };
}
}
else if (!FA_ICON_STYLES.includes(first) && FA_ICON_NAME_PATTERN.test(first)) {
return {
type: 'font-awesome',
name: first,
style: 'regular',
};
}
}
return { type: 'invalid', reason: 'Unrecognized icon format' };
}
//# sourceMappingURL=icon-resolver.js.map