diff --git a/packages/preset-icons/src/core.ts b/packages/preset-icons/src/core.ts index 18014a18cd..d1041e402d 100644 --- a/packages/preset-icons/src/core.ts +++ b/packages/preset-icons/src/core.ts @@ -118,3 +118,13 @@ export function createPresetIcons(lookupIconLoader: (options: IconsOptions) => P } } } + +export function combineLoaders(loaders: UniversalIconLoader[]) { + return ((...args) => { + for (const loader of loaders) { + const result = loader(...args) + if (result) + return result + } + }) +} diff --git a/packages/preset-icons/src/index.ts b/packages/preset-icons/src/index.ts index 3fc851af3a..bdedd88d10 100644 --- a/packages/preset-icons/src/index.ts +++ b/packages/preset-icons/src/index.ts @@ -1,29 +1,38 @@ +import type { UniversalIconLoader } from '@iconify/utils' import { loadIcon } from '@iconify/utils' import { createCDNLoader } from './cdn' -import { createPresetIcons } from './core' +import { combineLoaders, createPresetIcons } from './core' import { isNode, isVSCode } from './utils' export * from './core' +async function createNodeLoader() { + try { + return await import('@iconify/utils/lib/loader/node-loader').then(i => i?.loadNodeIcon) + } + catch { } + try { + return require('@iconify/utils/lib/loader/node-loader.cjs') + } + catch { } +} + export const presetIcons = createPresetIcons(async (options) => { const { cdn, } = options + const loaders: UniversalIconLoader[] = [] + + if (isNode && !isVSCode) + loaders.push(await createNodeLoader()) + if (cdn) - return createCDNLoader(cdn) - - if (isNode && !isVSCode) { - try { - return await import('@iconify/utils/lib/loader/node-loader').then(i => i?.loadNodeIcon) - } - catch {} - try { - return require('@iconify/utils/lib/loader/node-loader.cjs') - } - catch {} - } - return loadIcon + loaders.push(createCDNLoader(cdn)) + + loaders.push(loadIcon) + + return combineLoaders(loaders) }) export default presetIcons