import { addAPIProvider, _api, setCustomIconsLoader } from "@iconify/vue"; import { defineNuxtPlugin, useAppConfig, useRuntimeConfig } from "#imports"; export default defineNuxtPlugin({ name: "@nuxt/icon", setup() { const configs = useRuntimeConfig(); const options = useAppConfig().icon; _api.setFetch($fetch.native); const resources = []; if (options.provider === "server") { const baseURL = configs.app?.baseURL?.replace(/\/$/, "") ?? ""; resources.push(baseURL + (options.localApiEndpoint || "/api/_nuxt_icon")); if (options.fallbackToApi === true || options.fallbackToApi === "client-only") { resources.push(options.iconifyApiEndpoint); } } else if (options.provider === "none") { _api.setFetch(() => Promise.resolve(new Response())); } else { resources.push(options.iconifyApiEndpoint); } async function customIconLoader(icons, prefix) { try { const data = await $fetch(resources[0] + "/" + prefix + ".json", { query: { icons: icons.join(",") } }); if (!data || data.prefix !== prefix || !data.icons) throw new Error("Invalid data" + JSON.stringify(data)); return data; } catch (e) { console.error("Failed to load custom icons", e); return null; } } addAPIProvider("", { resources }); for (const prefix of options.customCollections || []) { if (prefix) setCustomIconsLoader(customIconLoader, prefix); } } // For type portability // eslint-disable-next-line @typescript-eslint/no-explicit-any });