Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: icons插件增加ant-design/icons类型提示 #11891

Open
wants to merge 7 commits into
base: master
Choose a base branch
from
Open
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
fix: collections type
fz6m committed Nov 23, 2023

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature. The key has expired.
commit 0f780c66ab2e361262bc50645ef652278e9a41e4
330 changes: 169 additions & 161 deletions packages/preset-umi/src/features/icons/icons.ts
Original file line number Diff line number Diff line change
@@ -13,7 +13,8 @@ import type { IApi } from '../../types';
import { addDeps } from '../depsOnDemand/depsOnDemand';

interface IIconsType {
iconsType: string;
type: string;
collections?: string;
}

interface IIconsJson {
@@ -22,8 +23,6 @@ interface IIconsJson {
aliases?: Record<string, any>;
}

const ICON_TYPES_WHITE_LIST = ['ant-design'];

export default (api: IApi) => {
const iconPlugin: typeof import('./esbuildIconPlugin') = importLazy(
require.resolve('./esbuildIconPlugin'),
@@ -146,6 +145,7 @@ export default (api: IApi) => {
...pkg?.dependencies,
...pkg?.devDependencies,
}).filter((name) => name.startsWith(`${prefix}/`));
const collectionsExcludes: string[] = [];
const icons: IIconsType[] = [];
iconifyDeps.forEach((name) => {
try {
@@ -156,36 +156,34 @@ export default (api: IApi) => {
if (!map?.prefix?.length) {
return;
}
const isWhite = ICON_TYPES_WHITE_LIST.some(
(prefix) => prefix === map.prefix,
);
if (!isWhite) {
return;
}
collectionsExcludes.push(map.prefix);
const iconKeys = Object.keys({
...map?.icons,
...map?.aliases,
});
const iconsType = iconKeys
const type = iconKeys
.map((name) => {
return `\`${map.prefix}:${name}\``;
})
.join(' | ');
icons.push({
iconsType,
type,
});
} catch {}
});
const finalIconifyDeps: IIconsType = icons.reduce(
(memo, curr) => {
return {
iconsType: `${memo.iconsType} | ${curr.iconsType}`,
type: `${memo.type} | ${curr.type}`,
};
},
{
iconsType: '',
type: '',
},
);
finalIconifyDeps.collections = getCollectionsType({
excludes: collectionsExcludes,
});
return finalIconifyDeps;
}

@@ -220,158 +218,12 @@ const alias = ${JSON.stringify(api.config.icons.alias || {})};
type AliasKeys = keyof typeof alias;
const localIcons = ${JSON.stringify(localIcons)} as const;
type LocalIconsKeys = typeof localIcons[number];
${iconsType.iconsMapType}

type IconCollections = 'academicons' |
'akar-icons' |
'arcticons' |
'basil' |
'bi' |
'bpmn' |
'brandico' |
'bx' |
'bxl' |
'bxs' |
'bytesize' |
'carbon' |
'charm' |
'ci' |
'cib' |
'cif' |
'cil' |
'circle-flags' |
'circum' |
'clarity' |
'codicon' |
'cryptocurrency-color' |
'cryptocurrency' |
'dashicons' |
'ei' |
'el' |
'emblemicons' |
'emojione-monotone' |
'emojione-v1' |
'emojione' |
'entypo-social' |
'entypo' |
'eos-icons' |
'ep' |
'et' |
'eva' |
'fa-brands' |
'fa-regular' |
'fa-solid' |
'fa' |
'fa6-brands' |
'fa6-regular' |
'fa6-solid' |
'fad' |
'fe' |
'feather' |
'file-icons' |
'flag' |
'flagpack' |
'flat-color-icons' |
'flat-ui' |
'fluent-emoji-flat' |
'fluent-emoji-high-contrast' |
'fluent-emoji' |
'fluent-mdl2' |
'fluent' |
'fontelico' |
'fontisto' |
'foundation' |
'fxemoji' |
'gala' |
'game-icons' |
'geo' |
'gg' |
'gis' |
'gridicons' |
'grommet-icons' |
'healthicons' |
'heroicons-outline' |
'heroicons-solid' |
'heroicons' |
'humbleicons' |
'ic' |
'icomoon-free' |
'icon-park-outline' |
'icon-park-solid' |
'icon-park-twotone' |
'icon-park' |
'iconoir' |
'icons8' |
'il' |
'ion' |
'iwwa' |
'jam' |
'la' |
'line-md' |
'logos' |
'ls' |
'lucide' |
'majesticons' |
'maki' |
'map' |
'material-symbols' |
'mdi-light' |
'mdi' |
'medical-icon' |
'memory' |
'mi' |
'mingcute' |
'mono-icons' |
'nimbus' |
'nonicons' |
'noto-v1' |
'noto' |
'octicon' |
'oi' |
'ooui' |
'openmoji' |
'pajamas' |
'pepicons-pop' |
'pepicons-print' |
'pepicons' |
'ph' |
'pixelarticons' |
'prime' |
'ps' |
'quill' |
'radix-icons' |
'raphael' |
'ri' |
'si-glyph' |
'simple-icons' |
'simple-line-icons' |
'skill-icons' |
'subway' |
'svg-spinners' |
'system-uicons' |
'tabler' |
'teenyicons' |
'topcoat' |
'twemoji' |
'typcn' |
'uil' |
'uim' |
'uis' |
'uit' |
'uiw' |
'vaadin' |
'vs' |
'vscode-icons' |
'websymbol' |
'whh' |
'wi' |
'wpf' |
'zmdi' |
'zondicons';
type IconCollections = ${iconsType.collections};
type Icon = \`\${IconCollections}:\${string}\`;

interface IUmiIconProps extends React.SVGAttributes<SVGElement> {
icon: AliasKeys | Icon | \`local:\${LocalIconsKeys}\` ${iconsType.iconsType};
icon: AliasKeys ${iconsType.type} | Icon | \`local:\${LocalIconsKeys}\`;
hover?: AliasKeys | string;
className?: string;
viewBox?: string;
@@ -516,3 +368,159 @@ function readIconsFromDir(dir: string) {

return icons;
}

function getCollectionsType(opts: { excludes: string[] }) {
const { excludes = [] } = opts;
const collections = [
'academicons',
'akar-icons',
'arcticons',
'basil',
'bi',
'bpmn',
'brandico',
'bx',
'bxl',
'bxs',
'bytesize',
'carbon',
'charm',
'ci',
'cib',
'cif',
'cil',
'circle-flags',
'circum',
'clarity',
'codicon',
'cryptocurrency-color',
'cryptocurrency',
'dashicons',
'ei',
'el',
'emblemicons',
'emojione-monotone',
'emojione-v1',
'emojione',
'entypo-social',
'entypo',
'eos-icons',
'ep',
'et',
'eva',
'fa-brands',
'fa-regular',
'fa-solid',
'fa',
'fa6-brands',
'fa6-regular',
'fa6-solid',
'fad',
'fe',
'feather',
'file-icons',
'flag',
'flagpack',
'flat-color-icons',
'flat-ui',
'fluent-emoji-flat',
'fluent-emoji-high-contrast',
'fluent-emoji',
'fluent-mdl2',
'fluent',
'fontelico',
'fontisto',
'foundation',
'fxemoji',
'gala',
'game-icons',
'geo',
'gg',
'gis',
'gridicons',
'grommet-icons',
'healthicons',
'heroicons-outline',
'heroicons-solid',
'heroicons',
'humbleicons',
'ic',
'icomoon-free',
'icon-park-outline',
'icon-park-solid',
'icon-park-twotone',
'icon-park',
'iconoir',
'icons8',
'il',
'ion',
'iwwa',
'jam',
'la',
'line-md',
'logos',
'ls',
'lucide',
'majesticons',
'maki',
'map',
'material-symbols',
'mdi-light',
'mdi',
'medical-icon',
'memory',
'mi',
'mingcute',
'mono-icons',
'nimbus',
'nonicons',
'noto-v1',
'noto',
'octicon',
'oi',
'ooui',
'openmoji',
'pajamas',
'pepicons-pop',
'pepicons-print',
'pepicons',
'ph',
'pixelarticons',
'prime',
'ps',
'quill',
'radix-icons',
'raphael',
'ri',
'si-glyph',
'simple-icons',
'simple-line-icons',
'skill-icons',
'subway',
'svg-spinners',
'system-uicons',
'tabler',
'teenyicons',
'topcoat',
'twemoji',
'typcn',
'uil',
'uim',
'uis',
'uit',
'uiw',
'vaadin',
'vs',
'vscode-icons',
'websymbol',
'whh',
'wi',
'wpf',
'zmdi',
'zondicons',
]
.filter((name) => !excludes.includes(name))
.map((name) => `'${name}'`)
.join(' | ');
return `(${collections})`;
}