diff --git a/packages/mermaid/src/rendering-util/icons.ts b/packages/mermaid/src/rendering-util/icons.ts
index 76a03cde5..199bc4206 100644
--- a/packages/mermaid/src/rendering-util/icons.ts
+++ b/packages/mermaid/src/rendering-util/icons.ts
@@ -1,8 +1,14 @@
import { log } from '$root/logger.js';
-import type { IconifyJSON } from '@iconify/types';
+import type { ExtendedIconifyIcon, IconifyIcon, IconifyJSON } from '@iconify/types';
import type { IconifyIconCustomisations } from '@iconify/utils';
import { getIconData, iconToHTML, iconToSVG, replaceIDs, stringToIcon } from '@iconify/utils';
+export const unknownIcon: IconifyIcon = {
+ body: '?',
+ height: 80,
+ width: 80,
+};
+
export const iconsStore = new Map();
export const registerIconPacks = (...iconPacks: IconifyJSON[]) => {
@@ -11,26 +17,47 @@ export const registerIconPacks = (...iconPacks: IconifyJSON[]) => {
}
};
-export const getIconSVG = (iconName: string, customisations?: IconifyIconCustomisations) => {
+const getRegisteredIconData = (iconName: string, fallbackPrefix?: string) => {
+ const data = stringToIcon(iconName, true, fallbackPrefix !== undefined);
+ if (!data) {
+ throw new Error(`Invalid icon name: ${iconName}`);
+ }
+ const prefix = data.prefix || fallbackPrefix;
+ if (!prefix) {
+ throw new Error(`Icon name must contain a prefix: ${iconName}`);
+ }
+ const icons = iconsStore.get(prefix);
+ if (!icons) {
+ throw new Error(`Icon set not found: ${data.prefix}`);
+ }
+ const iconData = getIconData(icons, data.name);
+ if (!iconData) {
+ throw new Error(`Icon not found: ${iconName}`);
+ }
+ return iconData;
+};
+
+export const isIconAvailable = (iconName: string) => {
try {
- const data = stringToIcon(iconName, true, true);
- if (!data) {
- throw new Error(`Invalid icon name: ${iconName}`);
- }
- const icons = iconsStore.get(data.prefix || 'default');
- if (!icons) {
- throw new Error(`Icon set not found: ${data.prefix}`);
- }
- const iconData = getIconData(icons, data.name);
- if (!iconData) {
- throw new Error(`Icon not found: ${iconName}`);
- }
- const renderData = iconToSVG(iconData, customisations);
- const svg = iconToHTML(replaceIDs(renderData.body), renderData.attributes);
- return svg;
- } catch (e) {
- log.error(e);
- // Return unknown icon svg.
- return '?';
+ getRegisteredIconData(iconName);
+ return true;
+ } catch {
+ return false;
}
};
+
+export const getIconSVG = (
+ iconName: string,
+ customisations?: IconifyIconCustomisations & { fallbackPrefix?: string }
+) => {
+ let iconData: ExtendedIconifyIcon;
+ try {
+ iconData = getRegisteredIconData(iconName, customisations?.fallbackPrefix);
+ } catch (e) {
+ log.error(e);
+ iconData = unknownIcon;
+ }
+ const renderData = iconToSVG(iconData, customisations);
+ const svg = iconToHTML(replaceIDs(renderData.body), renderData.attributes);
+ return svg;
+};