@zleap-ai/icons 0.0.28
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +155 -0
- package/dist/cjs/changelog-generator.js +300 -0
- package/dist/cjs/changelog-generator.js.map +1 -0
- package/dist/cjs/component-generator.js +434 -0
- package/dist/cjs/component-generator.js.map +1 -0
- package/dist/cjs/figma-client.js +260 -0
- package/dist/cjs/figma-client.js.map +1 -0
- package/dist/cjs/icon-filter.js +278 -0
- package/dist/cjs/icon-filter.js.map +1 -0
- package/dist/cjs/icon-search.js +43 -0
- package/dist/cjs/icon-search.js.map +1 -0
- package/dist/cjs/icon-validator.js +369 -0
- package/dist/cjs/icon-validator.js.map +1 -0
- package/dist/cjs/icons/IconArrowRight.js +17 -0
- package/dist/cjs/icons/IconArrowRight.js.map +1 -0
- package/dist/cjs/icons/IconBack.js +17 -0
- package/dist/cjs/icons/IconBack.js.map +1 -0
- package/dist/cjs/icons/IconBack1.js +17 -0
- package/dist/cjs/icons/IconBack1.js.map +1 -0
- package/dist/cjs/icons/IconBangZhuShuoMing.js +17 -0
- package/dist/cjs/icons/IconBangZhuShuoMing.js.map +1 -0
- package/dist/cjs/icons/IconBaoGaoZhuShou.js +20 -0
- package/dist/cjs/icons/IconBaoGaoZhuShou.js.map +1 -0
- package/dist/cjs/icons/IconCheck.js +17 -0
- package/dist/cjs/icons/IconCheck.js.map +1 -0
- package/dist/cjs/icons/IconCheck1.js +17 -0
- package/dist/cjs/icons/IconCheck1.js.map +1 -0
- package/dist/cjs/icons/IconChengYuanGuanLi.js +20 -0
- package/dist/cjs/icons/IconChengYuanGuanLi.js.map +1 -0
- package/dist/cjs/icons/IconChongXinFaSong.js +17 -0
- package/dist/cjs/icons/IconChongXinFaSong.js.map +1 -0
- package/dist/cjs/icons/IconCloseCircle.js +17 -0
- package/dist/cjs/icons/IconCloseCircle.js.map +1 -0
- package/dist/cjs/icons/IconCuoWu.js +17 -0
- package/dist/cjs/icons/IconCuoWu.js.map +1 -0
- package/dist/cjs/icons/IconDingDing.js +17 -0
- package/dist/cjs/icons/IconDingDing.js.map +1 -0
- package/dist/cjs/icons/IconEdit03.js +17 -0
- package/dist/cjs/icons/IconEdit03.js.map +1 -0
- package/dist/cjs/icons/IconFanHui.js +17 -0
- package/dist/cjs/icons/IconFanHui.js.map +1 -0
- package/dist/cjs/icons/IconFangDa.js +17 -0
- package/dist/cjs/icons/IconFangDa.js.map +1 -0
- package/dist/cjs/icons/IconFrame.js +17 -0
- package/dist/cjs/icons/IconFrame.js.map +1 -0
- package/dist/cjs/icons/IconFrame1261156242.js +17 -0
- package/dist/cjs/icons/IconFrame1261156242.js.map +1 -0
- package/dist/cjs/icons/IconGuanBi.js +17 -0
- package/dist/cjs/icons/IconGuanBi.js.map +1 -0
- package/dist/cjs/icons/IconGuanBi1.js +17 -0
- package/dist/cjs/icons/IconGuanBi1.js.map +1 -0
- package/dist/cjs/icons/IconGuanBiXiao.js +17 -0
- package/dist/cjs/icons/IconGuanBiXiao.js.map +1 -0
- package/dist/cjs/icons/IconGuanBiXiao1.js +17 -0
- package/dist/cjs/icons/IconGuanBiXiao1.js.map +1 -0
- package/dist/cjs/icons/IconLianJie.js +17 -0
- package/dist/cjs/icons/IconLianJie.js.map +1 -0
- package/dist/cjs/icons/IconLianJie1.js +17 -0
- package/dist/cjs/icons/IconLianJie1.js.map +1 -0
- package/dist/cjs/icons/IconQiWeiJiQiRen.js +17 -0
- package/dist/cjs/icons/IconQiWeiJiQiRen.js.map +1 -0
- package/dist/cjs/icons/IconQiYeBan.js +20 -0
- package/dist/cjs/icons/IconQiYeBan.js.map +1 -0
- package/dist/cjs/icons/IconRss.js +17 -0
- package/dist/cjs/icons/IconRss.js.map +1 -0
- package/dist/cjs/icons/IconSearch.js +17 -0
- package/dist/cjs/icons/IconSearch.js.map +1 -0
- package/dist/cjs/icons/IconSearch1.js +17 -0
- package/dist/cjs/icons/IconSearch1.js.map +1 -0
- package/dist/cjs/icons/IconSheZhi.js +17 -0
- package/dist/cjs/icons/IconSheZhi.js.map +1 -0
- package/dist/cjs/icons/IconShengCheng.js +17 -0
- package/dist/cjs/icons/IconShengCheng.js.map +1 -0
- package/dist/cjs/icons/IconShiBai.js +17 -0
- package/dist/cjs/icons/IconShiBai.js.map +1 -0
- package/dist/cjs/icons/IconShouQi.js +17 -0
- package/dist/cjs/icons/IconShouQi.js.map +1 -0
- package/dist/cjs/icons/IconSouSuoZhuShou.js +20 -0
- package/dist/cjs/icons/IconSouSuoZhuShou.js.map +1 -0
- package/dist/cjs/icons/IconSuoXiao.js +17 -0
- package/dist/cjs/icons/IconSuoXiao.js.map +1 -0
- package/dist/cjs/icons/IconTianJia.js +17 -0
- package/dist/cjs/icons/IconTianJia.js.map +1 -0
- package/dist/cjs/icons/IconTongZhi.js +17 -0
- package/dist/cjs/icons/IconTongZhi.js.map +1 -0
- package/dist/cjs/icons/IconTongZhi1.js +17 -0
- package/dist/cjs/icons/IconTongZhi1.js.map +1 -0
- package/dist/cjs/icons/IconTuiChu.js +17 -0
- package/dist/cjs/icons/IconTuiChu.js.map +1 -0
- package/dist/cjs/icons/IconWangLuoJianSuo.js +17 -0
- package/dist/cjs/icons/IconWangLuoJianSuo.js.map +1 -0
- package/dist/cjs/icons/IconWangYeXiaZai.js +17 -0
- package/dist/cjs/icons/IconWangYeXiaZai.js.map +1 -0
- package/dist/cjs/icons/IconWeiBiaoTi1HuaBan11.js +17 -0
- package/dist/cjs/icons/IconWeiBiaoTi1HuaBan11.js.map +1 -0
- package/dist/cjs/icons/IconWenDaZhuShou.js +20 -0
- package/dist/cjs/icons/IconWenDaZhuShou.js.map +1 -0
- package/dist/cjs/icons/IconWenDang.js +17 -0
- package/dist/cjs/icons/IconWenDang.js.map +1 -0
- package/dist/cjs/icons/IconWenDang1.js +17 -0
- package/dist/cjs/icons/IconWenDang1.js.map +1 -0
- package/dist/cjs/icons/IconWenJian.js +17 -0
- package/dist/cjs/icons/IconWenJian.js.map +1 -0
- package/dist/cjs/icons/IconXiTongPeiZhi.js +20 -0
- package/dist/cjs/icons/IconXiTongPeiZhi.js.map +1 -0
- package/dist/cjs/icons/IconXiaZai.js +17 -0
- package/dist/cjs/icons/IconXiaZai.js.map +1 -0
- package/dist/cjs/icons/IconXiaZaiZhuShou.js +20 -0
- package/dist/cjs/icons/IconXiaZaiZhuShou.js.map +1 -0
- package/dist/cjs/icons/IconXiaoXi.js +17 -0
- package/dist/cjs/icons/IconXiaoXi.js.map +1 -0
- package/dist/cjs/icons/IconXinXiGuanLi.js +20 -0
- package/dist/cjs/icons/IconXinXiGuanLi.js.map +1 -0
- package/dist/cjs/icons/IconXinZeng.js +17 -0
- package/dist/cjs/icons/IconXinZeng.js.map +1 -0
- package/dist/cjs/icons/IconYanZhengMa.js +17 -0
- package/dist/cjs/icons/IconYanZhengMa.js.map +1 -0
- package/dist/cjs/icons/IconYunYingGuanLi.js +20 -0
- package/dist/cjs/icons/IconYunYingGuanLi.js.map +1 -0
- package/dist/cjs/icons/IconZengJia.js +17 -0
- package/dist/cjs/icons/IconZengJia.js.map +1 -0
- package/dist/cjs/icons/IconZhanKai.js +17 -0
- package/dist/cjs/icons/IconZhanKai.js.map +1 -0
- package/dist/cjs/icons/IconZhanKai1.js +17 -0
- package/dist/cjs/icons/IconZhanKai1.js.map +1 -0
- package/dist/cjs/icons/IconZhengQue.js +17 -0
- package/dist/cjs/icons/IconZhengQue.js.map +1 -0
- package/dist/cjs/icons/IconZhiShiKu.js +17 -0
- package/dist/cjs/icons/IconZhiShiKu.js.map +1 -0
- package/dist/cjs/icons/IconZhiShiKu1.js +17 -0
- package/dist/cjs/icons/IconZhiShiKu1.js.map +1 -0
- package/dist/cjs/index.js +95 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/manifest-generator.js +281 -0
- package/dist/cjs/manifest-generator.js.map +1 -0
- package/dist/cjs/multi-format-output.js +233 -0
- package/dist/cjs/multi-format-output.js.map +1 -0
- package/dist/cjs/svg-exporter.js +283 -0
- package/dist/cjs/svg-exporter.js.map +1 -0
- package/dist/cjs/svg-transformer.js +327 -0
- package/dist/cjs/svg-transformer.js.map +1 -0
- package/dist/cjs/types.js +3 -0
- package/dist/cjs/types.js.map +1 -0
- package/dist/cjs/version-manager.js +175 -0
- package/dist/cjs/version-manager.js.map +1 -0
- package/dist/esm/changelog-generator.js +288 -0
- package/dist/esm/changelog-generator.js.map +1 -0
- package/dist/esm/component-generator.js +426 -0
- package/dist/esm/component-generator.js.map +1 -0
- package/dist/esm/figma-client.js +254 -0
- package/dist/esm/figma-client.js.map +1 -0
- package/dist/esm/icon-filter.js +268 -0
- package/dist/esm/icon-filter.js.map +1 -0
- package/dist/esm/icon-search.js +39 -0
- package/dist/esm/icon-search.js.map +1 -0
- package/dist/esm/icon-validator.js +358 -0
- package/dist/esm/icon-validator.js.map +1 -0
- package/dist/esm/icons/IconArrowRight.js +14 -0
- package/dist/esm/icons/IconArrowRight.js.map +1 -0
- package/dist/esm/icons/IconBack.js +14 -0
- package/dist/esm/icons/IconBack.js.map +1 -0
- package/dist/esm/icons/IconBack1.js +14 -0
- package/dist/esm/icons/IconBack1.js.map +1 -0
- package/dist/esm/icons/IconBangZhuShuoMing.js +14 -0
- package/dist/esm/icons/IconBangZhuShuoMing.js.map +1 -0
- package/dist/esm/icons/IconBaoGaoZhuShou.js +17 -0
- package/dist/esm/icons/IconBaoGaoZhuShou.js.map +1 -0
- package/dist/esm/icons/IconCheck.js +14 -0
- package/dist/esm/icons/IconCheck.js.map +1 -0
- package/dist/esm/icons/IconCheck1.js +14 -0
- package/dist/esm/icons/IconCheck1.js.map +1 -0
- package/dist/esm/icons/IconChengYuanGuanLi.js +17 -0
- package/dist/esm/icons/IconChengYuanGuanLi.js.map +1 -0
- package/dist/esm/icons/IconChongXinFaSong.js +14 -0
- package/dist/esm/icons/IconChongXinFaSong.js.map +1 -0
- package/dist/esm/icons/IconCloseCircle.js +14 -0
- package/dist/esm/icons/IconCloseCircle.js.map +1 -0
- package/dist/esm/icons/IconCuoWu.js +14 -0
- package/dist/esm/icons/IconCuoWu.js.map +1 -0
- package/dist/esm/icons/IconDingDing.js +14 -0
- package/dist/esm/icons/IconDingDing.js.map +1 -0
- package/dist/esm/icons/IconEdit03.js +14 -0
- package/dist/esm/icons/IconEdit03.js.map +1 -0
- package/dist/esm/icons/IconFanHui.js +14 -0
- package/dist/esm/icons/IconFanHui.js.map +1 -0
- package/dist/esm/icons/IconFangDa.js +14 -0
- package/dist/esm/icons/IconFangDa.js.map +1 -0
- package/dist/esm/icons/IconFrame.js +14 -0
- package/dist/esm/icons/IconFrame.js.map +1 -0
- package/dist/esm/icons/IconFrame1261156242.js +14 -0
- package/dist/esm/icons/IconFrame1261156242.js.map +1 -0
- package/dist/esm/icons/IconGuanBi.js +14 -0
- package/dist/esm/icons/IconGuanBi.js.map +1 -0
- package/dist/esm/icons/IconGuanBi1.js +14 -0
- package/dist/esm/icons/IconGuanBi1.js.map +1 -0
- package/dist/esm/icons/IconGuanBiXiao.js +14 -0
- package/dist/esm/icons/IconGuanBiXiao.js.map +1 -0
- package/dist/esm/icons/IconGuanBiXiao1.js +14 -0
- package/dist/esm/icons/IconGuanBiXiao1.js.map +1 -0
- package/dist/esm/icons/IconLianJie.js +14 -0
- package/dist/esm/icons/IconLianJie.js.map +1 -0
- package/dist/esm/icons/IconLianJie1.js +14 -0
- package/dist/esm/icons/IconLianJie1.js.map +1 -0
- package/dist/esm/icons/IconQiWeiJiQiRen.js +14 -0
- package/dist/esm/icons/IconQiWeiJiQiRen.js.map +1 -0
- package/dist/esm/icons/IconQiYeBan.js +17 -0
- package/dist/esm/icons/IconQiYeBan.js.map +1 -0
- package/dist/esm/icons/IconRss.js +14 -0
- package/dist/esm/icons/IconRss.js.map +1 -0
- package/dist/esm/icons/IconSearch.js +14 -0
- package/dist/esm/icons/IconSearch.js.map +1 -0
- package/dist/esm/icons/IconSearch1.js +14 -0
- package/dist/esm/icons/IconSearch1.js.map +1 -0
- package/dist/esm/icons/IconSheZhi.js +14 -0
- package/dist/esm/icons/IconSheZhi.js.map +1 -0
- package/dist/esm/icons/IconShengCheng.js +14 -0
- package/dist/esm/icons/IconShengCheng.js.map +1 -0
- package/dist/esm/icons/IconShiBai.js +14 -0
- package/dist/esm/icons/IconShiBai.js.map +1 -0
- package/dist/esm/icons/IconShouQi.js +14 -0
- package/dist/esm/icons/IconShouQi.js.map +1 -0
- package/dist/esm/icons/IconSouSuoZhuShou.js +17 -0
- package/dist/esm/icons/IconSouSuoZhuShou.js.map +1 -0
- package/dist/esm/icons/IconSuoXiao.js +14 -0
- package/dist/esm/icons/IconSuoXiao.js.map +1 -0
- package/dist/esm/icons/IconTianJia.js +14 -0
- package/dist/esm/icons/IconTianJia.js.map +1 -0
- package/dist/esm/icons/IconTongZhi.js +14 -0
- package/dist/esm/icons/IconTongZhi.js.map +1 -0
- package/dist/esm/icons/IconTongZhi1.js +14 -0
- package/dist/esm/icons/IconTongZhi1.js.map +1 -0
- package/dist/esm/icons/IconTuiChu.js +14 -0
- package/dist/esm/icons/IconTuiChu.js.map +1 -0
- package/dist/esm/icons/IconWangLuoJianSuo.js +14 -0
- package/dist/esm/icons/IconWangLuoJianSuo.js.map +1 -0
- package/dist/esm/icons/IconWangYeXiaZai.js +14 -0
- package/dist/esm/icons/IconWangYeXiaZai.js.map +1 -0
- package/dist/esm/icons/IconWeiBiaoTi1HuaBan11.js +14 -0
- package/dist/esm/icons/IconWeiBiaoTi1HuaBan11.js.map +1 -0
- package/dist/esm/icons/IconWenDaZhuShou.js +17 -0
- package/dist/esm/icons/IconWenDaZhuShou.js.map +1 -0
- package/dist/esm/icons/IconWenDang.js +14 -0
- package/dist/esm/icons/IconWenDang.js.map +1 -0
- package/dist/esm/icons/IconWenDang1.js +14 -0
- package/dist/esm/icons/IconWenDang1.js.map +1 -0
- package/dist/esm/icons/IconWenJian.js +14 -0
- package/dist/esm/icons/IconWenJian.js.map +1 -0
- package/dist/esm/icons/IconXiTongPeiZhi.js +17 -0
- package/dist/esm/icons/IconXiTongPeiZhi.js.map +1 -0
- package/dist/esm/icons/IconXiaZai.js +14 -0
- package/dist/esm/icons/IconXiaZai.js.map +1 -0
- package/dist/esm/icons/IconXiaZaiZhuShou.js +17 -0
- package/dist/esm/icons/IconXiaZaiZhuShou.js.map +1 -0
- package/dist/esm/icons/IconXiaoXi.js +14 -0
- package/dist/esm/icons/IconXiaoXi.js.map +1 -0
- package/dist/esm/icons/IconXinXiGuanLi.js +17 -0
- package/dist/esm/icons/IconXinXiGuanLi.js.map +1 -0
- package/dist/esm/icons/IconXinZeng.js +14 -0
- package/dist/esm/icons/IconXinZeng.js.map +1 -0
- package/dist/esm/icons/IconYanZhengMa.js +14 -0
- package/dist/esm/icons/IconYanZhengMa.js.map +1 -0
- package/dist/esm/icons/IconYunYingGuanLi.js +17 -0
- package/dist/esm/icons/IconYunYingGuanLi.js.map +1 -0
- package/dist/esm/icons/IconZengJia.js +14 -0
- package/dist/esm/icons/IconZengJia.js.map +1 -0
- package/dist/esm/icons/IconZhanKai.js +14 -0
- package/dist/esm/icons/IconZhanKai.js.map +1 -0
- package/dist/esm/icons/IconZhanKai1.js +14 -0
- package/dist/esm/icons/IconZhanKai1.js.map +1 -0
- package/dist/esm/icons/IconZhengQue.js +14 -0
- package/dist/esm/icons/IconZhengQue.js.map +1 -0
- package/dist/esm/icons/IconZhiShiKu.js +14 -0
- package/dist/esm/icons/IconZhiShiKu.js.map +1 -0
- package/dist/esm/icons/IconZhiShiKu1.js +14 -0
- package/dist/esm/icons/IconZhiShiKu1.js.map +1 -0
- package/dist/esm/index.js +72 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/manifest-generator.js +267 -0
- package/dist/esm/manifest-generator.js.map +1 -0
- package/dist/esm/multi-format-output.js +221 -0
- package/dist/esm/multi-format-output.js.map +1 -0
- package/dist/esm/svg-exporter.js +244 -0
- package/dist/esm/svg-exporter.js.map +1 -0
- package/dist/esm/svg-transformer.js +314 -0
- package/dist/esm/svg-transformer.js.map +1 -0
- package/dist/esm/types.js +2 -0
- package/dist/esm/types.js.map +1 -0
- package/dist/esm/version-manager.js +167 -0
- package/dist/esm/version-manager.js.map +1 -0
- package/dist/types/changelog-generator.d.ts +112 -0
- package/dist/types/changelog-generator.d.ts.map +1 -0
- package/dist/types/component-generator.d.ts +88 -0
- package/dist/types/component-generator.d.ts.map +1 -0
- package/dist/types/figma-client.d.ts +107 -0
- package/dist/types/figma-client.d.ts.map +1 -0
- package/dist/types/icon-filter.d.ts +126 -0
- package/dist/types/icon-filter.d.ts.map +1 -0
- package/dist/types/icon-search.d.ts +31 -0
- package/dist/types/icon-search.d.ts.map +1 -0
- package/dist/types/icon-validator.d.ts +110 -0
- package/dist/types/icon-validator.d.ts.map +1 -0
- package/dist/types/icons/IconArrowRight.d.ts +17 -0
- package/dist/types/icons/IconArrowRight.d.ts.map +1 -0
- package/dist/types/icons/IconBack.d.ts +17 -0
- package/dist/types/icons/IconBack.d.ts.map +1 -0
- package/dist/types/icons/IconBack1.d.ts +17 -0
- package/dist/types/icons/IconBack1.d.ts.map +1 -0
- package/dist/types/icons/IconBangZhuShuoMing.d.ts +17 -0
- package/dist/types/icons/IconBangZhuShuoMing.d.ts.map +1 -0
- package/dist/types/icons/IconBaoGaoZhuShou.d.ts +17 -0
- package/dist/types/icons/IconBaoGaoZhuShou.d.ts.map +1 -0
- package/dist/types/icons/IconCheck.d.ts +17 -0
- package/dist/types/icons/IconCheck.d.ts.map +1 -0
- package/dist/types/icons/IconCheck1.d.ts +17 -0
- package/dist/types/icons/IconCheck1.d.ts.map +1 -0
- package/dist/types/icons/IconChengYuanGuanLi.d.ts +17 -0
- package/dist/types/icons/IconChengYuanGuanLi.d.ts.map +1 -0
- package/dist/types/icons/IconChongXinFaSong.d.ts +17 -0
- package/dist/types/icons/IconChongXinFaSong.d.ts.map +1 -0
- package/dist/types/icons/IconCloseCircle.d.ts +17 -0
- package/dist/types/icons/IconCloseCircle.d.ts.map +1 -0
- package/dist/types/icons/IconCuoWu.d.ts +17 -0
- package/dist/types/icons/IconCuoWu.d.ts.map +1 -0
- package/dist/types/icons/IconDingDing.d.ts +17 -0
- package/dist/types/icons/IconDingDing.d.ts.map +1 -0
- package/dist/types/icons/IconEdit03.d.ts +17 -0
- package/dist/types/icons/IconEdit03.d.ts.map +1 -0
- package/dist/types/icons/IconFanHui.d.ts +17 -0
- package/dist/types/icons/IconFanHui.d.ts.map +1 -0
- package/dist/types/icons/IconFangDa.d.ts +17 -0
- package/dist/types/icons/IconFangDa.d.ts.map +1 -0
- package/dist/types/icons/IconFrame.d.ts +17 -0
- package/dist/types/icons/IconFrame.d.ts.map +1 -0
- package/dist/types/icons/IconFrame1261156242.d.ts +17 -0
- package/dist/types/icons/IconFrame1261156242.d.ts.map +1 -0
- package/dist/types/icons/IconGuanBi.d.ts +17 -0
- package/dist/types/icons/IconGuanBi.d.ts.map +1 -0
- package/dist/types/icons/IconGuanBi1.d.ts +17 -0
- package/dist/types/icons/IconGuanBi1.d.ts.map +1 -0
- package/dist/types/icons/IconGuanBiXiao.d.ts +17 -0
- package/dist/types/icons/IconGuanBiXiao.d.ts.map +1 -0
- package/dist/types/icons/IconGuanBiXiao1.d.ts +17 -0
- package/dist/types/icons/IconGuanBiXiao1.d.ts.map +1 -0
- package/dist/types/icons/IconLianJie.d.ts +17 -0
- package/dist/types/icons/IconLianJie.d.ts.map +1 -0
- package/dist/types/icons/IconLianJie1.d.ts +17 -0
- package/dist/types/icons/IconLianJie1.d.ts.map +1 -0
- package/dist/types/icons/IconQiWeiJiQiRen.d.ts +17 -0
- package/dist/types/icons/IconQiWeiJiQiRen.d.ts.map +1 -0
- package/dist/types/icons/IconQiYeBan.d.ts +17 -0
- package/dist/types/icons/IconQiYeBan.d.ts.map +1 -0
- package/dist/types/icons/IconRss.d.ts +17 -0
- package/dist/types/icons/IconRss.d.ts.map +1 -0
- package/dist/types/icons/IconSearch.d.ts +17 -0
- package/dist/types/icons/IconSearch.d.ts.map +1 -0
- package/dist/types/icons/IconSearch1.d.ts +17 -0
- package/dist/types/icons/IconSearch1.d.ts.map +1 -0
- package/dist/types/icons/IconSheZhi.d.ts +17 -0
- package/dist/types/icons/IconSheZhi.d.ts.map +1 -0
- package/dist/types/icons/IconShengCheng.d.ts +17 -0
- package/dist/types/icons/IconShengCheng.d.ts.map +1 -0
- package/dist/types/icons/IconShiBai.d.ts +17 -0
- package/dist/types/icons/IconShiBai.d.ts.map +1 -0
- package/dist/types/icons/IconShouQi.d.ts +17 -0
- package/dist/types/icons/IconShouQi.d.ts.map +1 -0
- package/dist/types/icons/IconSouSuoZhuShou.d.ts +17 -0
- package/dist/types/icons/IconSouSuoZhuShou.d.ts.map +1 -0
- package/dist/types/icons/IconSuoXiao.d.ts +17 -0
- package/dist/types/icons/IconSuoXiao.d.ts.map +1 -0
- package/dist/types/icons/IconTianJia.d.ts +17 -0
- package/dist/types/icons/IconTianJia.d.ts.map +1 -0
- package/dist/types/icons/IconTongZhi.d.ts +17 -0
- package/dist/types/icons/IconTongZhi.d.ts.map +1 -0
- package/dist/types/icons/IconTongZhi1.d.ts +17 -0
- package/dist/types/icons/IconTongZhi1.d.ts.map +1 -0
- package/dist/types/icons/IconTuiChu.d.ts +17 -0
- package/dist/types/icons/IconTuiChu.d.ts.map +1 -0
- package/dist/types/icons/IconWangLuoJianSuo.d.ts +17 -0
- package/dist/types/icons/IconWangLuoJianSuo.d.ts.map +1 -0
- package/dist/types/icons/IconWangYeXiaZai.d.ts +17 -0
- package/dist/types/icons/IconWangYeXiaZai.d.ts.map +1 -0
- package/dist/types/icons/IconWeiBiaoTi1HuaBan11.d.ts +17 -0
- package/dist/types/icons/IconWeiBiaoTi1HuaBan11.d.ts.map +1 -0
- package/dist/types/icons/IconWenDaZhuShou.d.ts +17 -0
- package/dist/types/icons/IconWenDaZhuShou.d.ts.map +1 -0
- package/dist/types/icons/IconWenDang.d.ts +17 -0
- package/dist/types/icons/IconWenDang.d.ts.map +1 -0
- package/dist/types/icons/IconWenDang1.d.ts +17 -0
- package/dist/types/icons/IconWenDang1.d.ts.map +1 -0
- package/dist/types/icons/IconWenJian.d.ts +17 -0
- package/dist/types/icons/IconWenJian.d.ts.map +1 -0
- package/dist/types/icons/IconXiTongPeiZhi.d.ts +17 -0
- package/dist/types/icons/IconXiTongPeiZhi.d.ts.map +1 -0
- package/dist/types/icons/IconXiaZai.d.ts +17 -0
- package/dist/types/icons/IconXiaZai.d.ts.map +1 -0
- package/dist/types/icons/IconXiaZaiZhuShou.d.ts +17 -0
- package/dist/types/icons/IconXiaZaiZhuShou.d.ts.map +1 -0
- package/dist/types/icons/IconXiaoXi.d.ts +17 -0
- package/dist/types/icons/IconXiaoXi.d.ts.map +1 -0
- package/dist/types/icons/IconXinXiGuanLi.d.ts +17 -0
- package/dist/types/icons/IconXinXiGuanLi.d.ts.map +1 -0
- package/dist/types/icons/IconXinZeng.d.ts +17 -0
- package/dist/types/icons/IconXinZeng.d.ts.map +1 -0
- package/dist/types/icons/IconYanZhengMa.d.ts +17 -0
- package/dist/types/icons/IconYanZhengMa.d.ts.map +1 -0
- package/dist/types/icons/IconYunYingGuanLi.d.ts +17 -0
- package/dist/types/icons/IconYunYingGuanLi.d.ts.map +1 -0
- package/dist/types/icons/IconZengJia.d.ts +17 -0
- package/dist/types/icons/IconZengJia.d.ts.map +1 -0
- package/dist/types/icons/IconZhanKai.d.ts +17 -0
- package/dist/types/icons/IconZhanKai.d.ts.map +1 -0
- package/dist/types/icons/IconZhanKai1.d.ts +17 -0
- package/dist/types/icons/IconZhanKai1.d.ts.map +1 -0
- package/dist/types/icons/IconZhengQue.d.ts +17 -0
- package/dist/types/icons/IconZhengQue.d.ts.map +1 -0
- package/dist/types/icons/IconZhiShiKu.d.ts +17 -0
- package/dist/types/icons/IconZhiShiKu.d.ts.map +1 -0
- package/dist/types/icons/IconZhiShiKu1.d.ts +17 -0
- package/dist/types/icons/IconZhiShiKu1.d.ts.map +1 -0
- package/dist/types/index.d.ts +56 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/manifest-generator.d.ts +113 -0
- package/dist/types/manifest-generator.d.ts.map +1 -0
- package/dist/types/multi-format-output.d.ts +151 -0
- package/dist/types/multi-format-output.d.ts.map +1 -0
- package/dist/types/svg-exporter.d.ts +103 -0
- package/dist/types/svg-exporter.d.ts.map +1 -0
- package/dist/types/svg-transformer.d.ts +103 -0
- package/dist/types/svg-transformer.d.ts.map +1 -0
- package/dist/types/types.d.ts +346 -0
- package/dist/types/types.d.ts.map +1 -0
- package/dist/types/version-manager.d.ts +82 -0
- package/dist/types/version-manager.d.ts.map +1 -0
- package/icons.json +227 -0
- package/package.json +66 -0
- package/svg/back.svg +1 -0
- package/svg/back1.svg +1 -0
- package/svg/check.svg +1 -0
- package/svg/check1.svg +1 -0
- package/svg/search.svg +1 -0
- package/svg/search1.svg +1 -0
- package/svg//345/205/263/351/227/255-/345/260/217.svg +1 -0
- package/svg//345/205/263/351/227/255-/345/260/2171.svg +1 -0
- package/svg//345/205/263/351/227/255.svg +1 -0
- package/svg//345/205/263/351/227/2551.svg +1 -0
- package/svg//345/261/225/345/274/200.svg +1 -0
- package/svg//345/261/225/345/274/2001.svg +1 -0
- package/svg//346/226/207/346/241/243.svg +1 -0
- package/svg//346/226/207/346/241/2431.svg +1 -0
- package/svg//347/237/245/350/257/206/345/272/223.svg +1 -0
- package/svg//347/237/245/350/257/206/345/272/2231.svg +1 -0
- package/svg//351/200/232/347/237/245.svg +1 -0
- package/svg//351/200/232/347/237/2451.svg +1 -0
- package/svg//351/223/276/346/216/245.svg +1 -0
- package/svg//351/223/276/346/216/2451.svg +1 -0
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Figma API Client
|
|
4
|
+
*
|
|
5
|
+
* Provides methods to interact with the Figma API for fetching files and exporting images.
|
|
6
|
+
* Implements error handling and retry logic for robust API interactions.
|
|
7
|
+
*
|
|
8
|
+
* Requirements: 2.1, 2.5
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.FigmaClient = exports.FigmaApiError = exports.FigmaErrorCode = void 0;
|
|
12
|
+
exports.createFigmaClient = createFigmaClient;
|
|
13
|
+
/**
|
|
14
|
+
* Figma API base URL
|
|
15
|
+
*/
|
|
16
|
+
const FIGMA_API_BASE = 'https://api.figma.com/v1';
|
|
17
|
+
/**
|
|
18
|
+
* Default retry configuration
|
|
19
|
+
* 针对 Figma API 限速优化:
|
|
20
|
+
* - Starter/Pro 用户: Tier 1 限制 10次/分钟
|
|
21
|
+
* - Organization 用户: Tier 1 限制 15次/分钟
|
|
22
|
+
* - Enterprise 用户: Tier 1 限制 20次/分钟
|
|
23
|
+
*/
|
|
24
|
+
const DEFAULT_RETRY_CONFIG = {
|
|
25
|
+
maxRetries: 5,
|
|
26
|
+
baseDelayMs: 2000,
|
|
27
|
+
maxDelayMs: 60000, // 最长等待 60 秒
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* Figma API error codes
|
|
31
|
+
*/
|
|
32
|
+
var FigmaErrorCode;
|
|
33
|
+
(function (FigmaErrorCode) {
|
|
34
|
+
FigmaErrorCode["INVALID_TOKEN"] = "FIGMA_INVALID_TOKEN";
|
|
35
|
+
FigmaErrorCode["RATE_LIMIT"] = "FIGMA_RATE_LIMIT";
|
|
36
|
+
FigmaErrorCode["FILE_NOT_FOUND"] = "FIGMA_FILE_NOT_FOUND";
|
|
37
|
+
FigmaErrorCode["NETWORK_ERROR"] = "FIGMA_NETWORK_ERROR";
|
|
38
|
+
FigmaErrorCode["UNKNOWN_ERROR"] = "FIGMA_UNKNOWN_ERROR";
|
|
39
|
+
})(FigmaErrorCode || (exports.FigmaErrorCode = FigmaErrorCode = {}));
|
|
40
|
+
/**
|
|
41
|
+
* Custom error class for Figma API errors
|
|
42
|
+
*/
|
|
43
|
+
class FigmaApiError extends Error {
|
|
44
|
+
constructor(code, message, recoverable = false, suggestion, details) {
|
|
45
|
+
super(message);
|
|
46
|
+
this.code = code;
|
|
47
|
+
this.recoverable = recoverable;
|
|
48
|
+
this.suggestion = suggestion;
|
|
49
|
+
this.details = details;
|
|
50
|
+
this.name = 'FigmaApiError';
|
|
51
|
+
}
|
|
52
|
+
toErrorResponse() {
|
|
53
|
+
return {
|
|
54
|
+
code: this.code,
|
|
55
|
+
message: this.message,
|
|
56
|
+
recoverable: this.recoverable,
|
|
57
|
+
suggestion: this.suggestion,
|
|
58
|
+
details: this.details,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
exports.FigmaApiError = FigmaApiError;
|
|
63
|
+
/**
|
|
64
|
+
* Figma API Client class
|
|
65
|
+
*/
|
|
66
|
+
class FigmaClient {
|
|
67
|
+
constructor(token, retryConfig = {}) {
|
|
68
|
+
if (!token) {
|
|
69
|
+
throw new FigmaApiError(FigmaErrorCode.INVALID_TOKEN, 'Figma API token is required', false, 'Please provide a valid Figma Personal Access Token');
|
|
70
|
+
}
|
|
71
|
+
this.token = token;
|
|
72
|
+
this.retryConfig = { ...DEFAULT_RETRY_CONFIG, ...retryConfig };
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Makes an authenticated request to the Figma API with retry logic
|
|
76
|
+
* Properly handles Retry-After header for rate limiting
|
|
77
|
+
*/
|
|
78
|
+
async fetchWithRetry(url, options = {}) {
|
|
79
|
+
let lastError = null;
|
|
80
|
+
let delay = this.retryConfig.baseDelayMs;
|
|
81
|
+
for (let attempt = 0; attempt <= this.retryConfig.maxRetries; attempt++) {
|
|
82
|
+
try {
|
|
83
|
+
const response = await fetch(url, {
|
|
84
|
+
...options,
|
|
85
|
+
headers: {
|
|
86
|
+
'X-Figma-Token': this.token,
|
|
87
|
+
...options.headers,
|
|
88
|
+
},
|
|
89
|
+
});
|
|
90
|
+
if (response.ok) {
|
|
91
|
+
return (await response.json());
|
|
92
|
+
}
|
|
93
|
+
// Handle rate limiting with Retry-After header
|
|
94
|
+
if (response.status === 429) {
|
|
95
|
+
const retryAfter = response.headers.get('Retry-After');
|
|
96
|
+
if (retryAfter) {
|
|
97
|
+
// Retry-After is in seconds, convert to ms and add buffer
|
|
98
|
+
const waitTime = (parseInt(retryAfter, 10) + 1) * 1000;
|
|
99
|
+
console.log(`⏳ 限速中,等待 ${retryAfter} 秒后重试...`);
|
|
100
|
+
await this.sleep(waitTime);
|
|
101
|
+
// Don't count this as an attempt since we're respecting the server's request
|
|
102
|
+
attempt--;
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
// Handle specific HTTP errors
|
|
107
|
+
const errorBody = await response.text();
|
|
108
|
+
const error = this.handleHttpError(response.status, errorBody);
|
|
109
|
+
// Don't retry non-recoverable errors
|
|
110
|
+
if (!error.recoverable) {
|
|
111
|
+
throw error;
|
|
112
|
+
}
|
|
113
|
+
lastError = error;
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
if (error instanceof FigmaApiError && !error.recoverable) {
|
|
117
|
+
throw error;
|
|
118
|
+
}
|
|
119
|
+
lastError =
|
|
120
|
+
error instanceof Error
|
|
121
|
+
? error
|
|
122
|
+
: new FigmaApiError(FigmaErrorCode.UNKNOWN_ERROR, 'Unknown error occurred', true);
|
|
123
|
+
}
|
|
124
|
+
// Wait before retrying (exponential backoff)
|
|
125
|
+
if (attempt < this.retryConfig.maxRetries) {
|
|
126
|
+
console.log(`⏳ 重试中 (${attempt + 1}/${this.retryConfig.maxRetries}),等待 ${Math.min(delay, this.retryConfig.maxDelayMs) / 1000} 秒...`);
|
|
127
|
+
await this.sleep(Math.min(delay, this.retryConfig.maxDelayMs));
|
|
128
|
+
delay *= 2;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
throw (lastError ||
|
|
132
|
+
new FigmaApiError(FigmaErrorCode.UNKNOWN_ERROR, 'Request failed after retries', false));
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Handles HTTP error responses and converts them to FigmaApiError
|
|
136
|
+
*/
|
|
137
|
+
handleHttpError(status, body) {
|
|
138
|
+
switch (status) {
|
|
139
|
+
case 401:
|
|
140
|
+
case 403:
|
|
141
|
+
return new FigmaApiError(FigmaErrorCode.INVALID_TOKEN, 'Invalid or expired Figma API token', false, 'Please check your Figma Personal Access Token and ensure it has the required permissions');
|
|
142
|
+
case 404:
|
|
143
|
+
return new FigmaApiError(FigmaErrorCode.FILE_NOT_FOUND, 'Figma file not found', false, 'Please verify the file key and ensure you have access to the file', { responseBody: body });
|
|
144
|
+
case 429:
|
|
145
|
+
return new FigmaApiError(FigmaErrorCode.RATE_LIMIT, 'Figma API rate limit exceeded', true, 'The request will be retried automatically with exponential backoff');
|
|
146
|
+
default:
|
|
147
|
+
return new FigmaApiError(FigmaErrorCode.UNKNOWN_ERROR, `Figma API error: HTTP ${status}`, status >= 500, // Server errors are recoverable
|
|
148
|
+
status >= 500
|
|
149
|
+
? 'Server error, retrying...'
|
|
150
|
+
: 'Please check the request parameters', { status, responseBody: body });
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Sleep utility for retry delays
|
|
155
|
+
*/
|
|
156
|
+
sleep(ms) {
|
|
157
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Gets a Figma file by its key
|
|
161
|
+
*
|
|
162
|
+
* @param fileKey - The Figma file key
|
|
163
|
+
* @returns The file data including document structure and components
|
|
164
|
+
*/
|
|
165
|
+
async getFile(fileKey) {
|
|
166
|
+
if (!fileKey) {
|
|
167
|
+
throw new FigmaApiError(FigmaErrorCode.FILE_NOT_FOUND, 'File key is required', false, 'Please provide a valid Figma file key');
|
|
168
|
+
}
|
|
169
|
+
const url = `${FIGMA_API_BASE}/files/${fileKey}`;
|
|
170
|
+
return this.fetchWithRetry(url);
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Exports images for specified node IDs
|
|
174
|
+
*
|
|
175
|
+
* @param fileKey - The Figma file key
|
|
176
|
+
* @param nodeIds - Array of node IDs to export
|
|
177
|
+
* @param options - Export options (format, scale, etc.)
|
|
178
|
+
* @returns Map of node IDs to image URLs
|
|
179
|
+
*/
|
|
180
|
+
async getImages(fileKey, nodeIds, options = { format: 'svg' }) {
|
|
181
|
+
if (!fileKey) {
|
|
182
|
+
throw new FigmaApiError(FigmaErrorCode.FILE_NOT_FOUND, 'File key is required', false, 'Please provide a valid Figma file key');
|
|
183
|
+
}
|
|
184
|
+
if (!nodeIds || nodeIds.length === 0) {
|
|
185
|
+
return {};
|
|
186
|
+
}
|
|
187
|
+
const params = new URLSearchParams({
|
|
188
|
+
ids: nodeIds.join(','),
|
|
189
|
+
format: options.format,
|
|
190
|
+
});
|
|
191
|
+
if (options.scale !== undefined) {
|
|
192
|
+
params.set('scale', options.scale.toString());
|
|
193
|
+
}
|
|
194
|
+
if (options.format === 'svg') {
|
|
195
|
+
if (options.svgIncludeId !== undefined) {
|
|
196
|
+
params.set('svg_include_id', options.svgIncludeId.toString());
|
|
197
|
+
}
|
|
198
|
+
if (options.svgSimplifyStroke !== undefined) {
|
|
199
|
+
params.set('svg_simplify_stroke', options.svgSimplifyStroke.toString());
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
const url = `${FIGMA_API_BASE}/images/${fileKey}?${params.toString()}`;
|
|
203
|
+
const response = await this.fetchWithRetry(url);
|
|
204
|
+
if (response.err) {
|
|
205
|
+
throw new FigmaApiError(FigmaErrorCode.UNKNOWN_ERROR, `Failed to export images: ${response.err}`, false, 'Please check the node IDs and try again');
|
|
206
|
+
}
|
|
207
|
+
return response.images;
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Downloads SVG content from a URL
|
|
211
|
+
*
|
|
212
|
+
* @param url - The URL to download from
|
|
213
|
+
* @returns The SVG content as a string
|
|
214
|
+
*/
|
|
215
|
+
async downloadSvg(url) {
|
|
216
|
+
let lastError = null;
|
|
217
|
+
let delay = this.retryConfig.baseDelayMs;
|
|
218
|
+
for (let attempt = 0; attempt <= this.retryConfig.maxRetries; attempt++) {
|
|
219
|
+
try {
|
|
220
|
+
const response = await fetch(url);
|
|
221
|
+
if (response.ok) {
|
|
222
|
+
return await response.text();
|
|
223
|
+
}
|
|
224
|
+
if (response.status >= 500) {
|
|
225
|
+
lastError = new FigmaApiError(FigmaErrorCode.NETWORK_ERROR, `Failed to download SVG: HTTP ${response.status}`, true);
|
|
226
|
+
}
|
|
227
|
+
else {
|
|
228
|
+
throw new FigmaApiError(FigmaErrorCode.NETWORK_ERROR, `Failed to download SVG: HTTP ${response.status}`, false);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
catch (error) {
|
|
232
|
+
if (error instanceof FigmaApiError && !error.recoverable) {
|
|
233
|
+
throw error;
|
|
234
|
+
}
|
|
235
|
+
lastError =
|
|
236
|
+
error instanceof Error
|
|
237
|
+
? error
|
|
238
|
+
: new FigmaApiError(FigmaErrorCode.NETWORK_ERROR, 'Network error while downloading SVG', true);
|
|
239
|
+
}
|
|
240
|
+
if (attempt < this.retryConfig.maxRetries) {
|
|
241
|
+
await this.sleep(Math.min(delay, this.retryConfig.maxDelayMs));
|
|
242
|
+
delay *= 2;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
throw (lastError ||
|
|
246
|
+
new FigmaApiError(FigmaErrorCode.NETWORK_ERROR, 'Failed to download SVG after retries', false));
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
exports.FigmaClient = FigmaClient;
|
|
250
|
+
/**
|
|
251
|
+
* Creates a new Figma client instance
|
|
252
|
+
*
|
|
253
|
+
* @param token - Figma Personal Access Token
|
|
254
|
+
* @param retryConfig - Optional retry configuration
|
|
255
|
+
* @returns A new FigmaClient instance
|
|
256
|
+
*/
|
|
257
|
+
function createFigmaClient(token, retryConfig) {
|
|
258
|
+
return new FigmaClient(token, retryConfig);
|
|
259
|
+
}
|
|
260
|
+
//# sourceMappingURL=figma-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"figma-client.js","sourceRoot":"","sources":["../../src/figma-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Icon Component Filtering Module
|
|
4
|
+
*
|
|
5
|
+
* Provides functions to filter and identify icon components from Figma file data.
|
|
6
|
+
* Filters components based on type and naming conventions.
|
|
7
|
+
*
|
|
8
|
+
* Requirements: 2.2
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.DEFAULT_FILTER_CONFIG = exports.DEFAULT_ICON_NAME_PATTERN = void 0;
|
|
12
|
+
exports.matchesIconNamingConvention = matchesIconNamingConvention;
|
|
13
|
+
exports.hasValidIconDimensions = hasValidIconDimensions;
|
|
14
|
+
exports.isComponentType = isComponentType;
|
|
15
|
+
exports.filterIconComponent = filterIconComponent;
|
|
16
|
+
exports.filterIconComponents = filterIconComponents;
|
|
17
|
+
exports.extractComponentIds = extractComponentIds;
|
|
18
|
+
exports.filterIconsFromNodes = filterIconsFromNodes;
|
|
19
|
+
/**
|
|
20
|
+
* Default icon naming pattern - matches lowercase names with hyphens
|
|
21
|
+
* Examples: "arrow-right", "check-circle", "user-profile"
|
|
22
|
+
*/
|
|
23
|
+
exports.DEFAULT_ICON_NAME_PATTERN = /^[a-z][a-z0-9-]*$/;
|
|
24
|
+
/**
|
|
25
|
+
* Default filter configuration
|
|
26
|
+
*/
|
|
27
|
+
exports.DEFAULT_FILTER_CONFIG = {
|
|
28
|
+
namePattern: exports.DEFAULT_ICON_NAME_PATTERN,
|
|
29
|
+
minSize: 8,
|
|
30
|
+
maxSize: 128,
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Checks if a component matches the icon naming convention
|
|
34
|
+
*
|
|
35
|
+
* @param name - Component name to check
|
|
36
|
+
* @param config - Filter configuration
|
|
37
|
+
* @returns True if the name matches the icon naming convention
|
|
38
|
+
*/
|
|
39
|
+
function matchesIconNamingConvention(name, config = exports.DEFAULT_FILTER_CONFIG) {
|
|
40
|
+
if (!name || typeof name !== 'string') {
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
// Check name pattern
|
|
44
|
+
if (!config.namePattern.test(name)) {
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
// Check prefix if specified
|
|
48
|
+
if (config.namePrefix && !name.startsWith(config.namePrefix)) {
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
// Check suffix if specified
|
|
52
|
+
if (config.nameSuffix && !name.endsWith(config.nameSuffix)) {
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Checks if a component has valid icon dimensions
|
|
59
|
+
*
|
|
60
|
+
* @param width - Component width
|
|
61
|
+
* @param height - Component height
|
|
62
|
+
* @param config - Filter configuration
|
|
63
|
+
* @returns True if dimensions are within valid range
|
|
64
|
+
*/
|
|
65
|
+
function hasValidIconDimensions(width, height, config = exports.DEFAULT_FILTER_CONFIG) {
|
|
66
|
+
if (typeof width !== 'number' || typeof height !== 'number') {
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
if (width <= 0 || height <= 0) {
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
if (config.minSize !== undefined) {
|
|
73
|
+
if (width < config.minSize || height < config.minSize) {
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
if (config.maxSize !== undefined) {
|
|
78
|
+
if (width > config.maxSize || height > config.maxSize) {
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return true;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Checks if a Figma node is a COMPONENT or FRAME type (SVGs are imported as frames)
|
|
86
|
+
*
|
|
87
|
+
* @param node - Figma node or component to check
|
|
88
|
+
* @returns True if the node is a COMPONENT or FRAME type
|
|
89
|
+
*/
|
|
90
|
+
function isComponentType(node) {
|
|
91
|
+
return node && (node.type === 'COMPONENT' || node.type === 'FRAME');
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Filters a single component to determine if it's a valid icon
|
|
95
|
+
*
|
|
96
|
+
* @param component - Figma component to check
|
|
97
|
+
* @param config - Filter configuration
|
|
98
|
+
* @returns Object with isIcon flag and reason if not an icon
|
|
99
|
+
*/
|
|
100
|
+
function filterIconComponent(component, config = exports.DEFAULT_FILTER_CONFIG) {
|
|
101
|
+
// Check if it's a component type
|
|
102
|
+
if (!isComponentType(component)) {
|
|
103
|
+
return { isIcon: false, reason: 'Not a COMPONENT type' };
|
|
104
|
+
}
|
|
105
|
+
// Check naming convention
|
|
106
|
+
if (!matchesIconNamingConvention(component.name, config)) {
|
|
107
|
+
return {
|
|
108
|
+
isIcon: false,
|
|
109
|
+
reason: `Name "${component.name}" does not match icon naming convention`,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
// Check dimensions
|
|
113
|
+
const { width, height } = component.absoluteBoundingBox || {
|
|
114
|
+
width: 0,
|
|
115
|
+
height: 0,
|
|
116
|
+
};
|
|
117
|
+
if (!hasValidIconDimensions(width, height, config)) {
|
|
118
|
+
return {
|
|
119
|
+
isIcon: false,
|
|
120
|
+
reason: `Dimensions ${width}x${height} are outside valid range`,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
return { isIcon: true };
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Filters icon components from a Figma file response
|
|
127
|
+
* Searches both the components map and the document tree for FRAME nodes (imported SVGs)
|
|
128
|
+
*
|
|
129
|
+
* @param fileResponse - Figma file API response
|
|
130
|
+
* @param config - Filter configuration
|
|
131
|
+
* @returns Filter result with icons and skipped components
|
|
132
|
+
*/
|
|
133
|
+
function filterIconComponents(fileResponse, config = exports.DEFAULT_FILTER_CONFIG) {
|
|
134
|
+
const icons = [];
|
|
135
|
+
const skipped = [];
|
|
136
|
+
const processedIds = new Set();
|
|
137
|
+
// First, process components from the components map
|
|
138
|
+
const components = fileResponse.components || {};
|
|
139
|
+
const componentEntries = Object.entries(components);
|
|
140
|
+
for (const [id, component] of componentEntries) {
|
|
141
|
+
processedIds.add(id);
|
|
142
|
+
const result = filterIconComponent(component, config);
|
|
143
|
+
if (result.isIcon) {
|
|
144
|
+
const { width, height } = component.absoluteBoundingBox;
|
|
145
|
+
icons.push({
|
|
146
|
+
id,
|
|
147
|
+
name: component.name,
|
|
148
|
+
width,
|
|
149
|
+
height,
|
|
150
|
+
original: component,
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
skipped.push({
|
|
155
|
+
id,
|
|
156
|
+
name: component.name,
|
|
157
|
+
reason: result.reason || 'Unknown reason',
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
// Then, traverse the document tree to find FRAME nodes (imported SVGs)
|
|
162
|
+
if (fileResponse.document) {
|
|
163
|
+
traverseForFrames(fileResponse.document, config, icons, skipped, processedIds);
|
|
164
|
+
}
|
|
165
|
+
return {
|
|
166
|
+
icons,
|
|
167
|
+
skipped,
|
|
168
|
+
totalProcessed: processedIds.size,
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Recursively traverses the document tree to find FRAME nodes that could be icons
|
|
173
|
+
*/
|
|
174
|
+
function traverseForFrames(node, config, icons, skipped, processedIds) {
|
|
175
|
+
// Skip if already processed
|
|
176
|
+
if (processedIds.has(node.id)) {
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
// Check if this is a FRAME that could be an icon
|
|
180
|
+
if (node.type === 'FRAME' && node.absoluteBoundingBox) {
|
|
181
|
+
processedIds.add(node.id);
|
|
182
|
+
const { width, height } = node.absoluteBoundingBox;
|
|
183
|
+
// Check if dimensions are valid for an icon
|
|
184
|
+
if (hasValidIconDimensions(width, height, config)) {
|
|
185
|
+
// Check aspect ratio - icons should be roughly square
|
|
186
|
+
const aspectRatio = width / height;
|
|
187
|
+
if (aspectRatio >= 0.5 && aspectRatio <= 2) {
|
|
188
|
+
// Create a component-like object
|
|
189
|
+
const component = {
|
|
190
|
+
id: node.id,
|
|
191
|
+
name: node.name,
|
|
192
|
+
type: 'FRAME',
|
|
193
|
+
absoluteBoundingBox: { width, height },
|
|
194
|
+
};
|
|
195
|
+
// Use a more lenient name check for frames
|
|
196
|
+
const nameIsValid = config.namePattern.test(node.name) ||
|
|
197
|
+
/^[a-zA-Z][a-zA-Z0-9-_\s]*$/.test(node.name);
|
|
198
|
+
if (nameIsValid) {
|
|
199
|
+
icons.push({
|
|
200
|
+
id: node.id,
|
|
201
|
+
name: node.name,
|
|
202
|
+
width,
|
|
203
|
+
height,
|
|
204
|
+
original: component,
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
else {
|
|
208
|
+
skipped.push({
|
|
209
|
+
id: node.id,
|
|
210
|
+
name: node.name,
|
|
211
|
+
reason: `Name "${node.name}" does not match icon naming convention`,
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
// Recursively process children
|
|
218
|
+
if (node.children && Array.isArray(node.children)) {
|
|
219
|
+
for (const child of node.children) {
|
|
220
|
+
traverseForFrames(child, config, icons, skipped, processedIds);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Extracts component IDs from filtered icons
|
|
226
|
+
*
|
|
227
|
+
* @param icons - Array of filtered icon components
|
|
228
|
+
* @returns Array of component IDs
|
|
229
|
+
*/
|
|
230
|
+
function extractComponentIds(icons) {
|
|
231
|
+
return icons.map((icon) => icon.id);
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Filters components from a mixed list of Figma nodes
|
|
235
|
+
* Recursively searches through the node tree to find COMPONENT nodes
|
|
236
|
+
*
|
|
237
|
+
* @param nodes - Array of Figma nodes
|
|
238
|
+
* @param config - Filter configuration
|
|
239
|
+
* @returns Array of filtered icon components
|
|
240
|
+
*/
|
|
241
|
+
function filterIconsFromNodes(nodes, config = exports.DEFAULT_FILTER_CONFIG) {
|
|
242
|
+
const icons = [];
|
|
243
|
+
function traverse(node) {
|
|
244
|
+
if (node.type === 'COMPONENT') {
|
|
245
|
+
// Create a FigmaComponent-like object for filtering
|
|
246
|
+
const component = {
|
|
247
|
+
id: node.id,
|
|
248
|
+
name: node.name,
|
|
249
|
+
type: 'COMPONENT',
|
|
250
|
+
absoluteBoundingBox: {
|
|
251
|
+
width: 24, // Default size if not available
|
|
252
|
+
height: 24,
|
|
253
|
+
},
|
|
254
|
+
};
|
|
255
|
+
const result = filterIconComponent(component, config);
|
|
256
|
+
if (result.isIcon) {
|
|
257
|
+
icons.push({
|
|
258
|
+
id: node.id,
|
|
259
|
+
name: node.name,
|
|
260
|
+
width: component.absoluteBoundingBox.width,
|
|
261
|
+
height: component.absoluteBoundingBox.height,
|
|
262
|
+
original: component,
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
// Recursively process children
|
|
267
|
+
if (node.children && Array.isArray(node.children)) {
|
|
268
|
+
for (const child of node.children) {
|
|
269
|
+
traverse(child);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
for (const node of nodes) {
|
|
274
|
+
traverse(node);
|
|
275
|
+
}
|
|
276
|
+
return icons;
|
|
277
|
+
}
|
|
278
|
+
//# sourceMappingURL=icon-filter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"icon-filter.js","sourceRoot":"","sources":["../../src/icon-filter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Icon search/filter functionality
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.filterIcons = filterIcons;
|
|
7
|
+
exports.iconMatchesQuery = iconMatchesQuery;
|
|
8
|
+
/**
|
|
9
|
+
* Filter icons by search query
|
|
10
|
+
* Returns only icons whose names contain the search query (case-insensitive)
|
|
11
|
+
*
|
|
12
|
+
* @param icons - Array of icon objects
|
|
13
|
+
* @param query - Search query string
|
|
14
|
+
* @returns Filtered icons matching the query
|
|
15
|
+
*/
|
|
16
|
+
function filterIcons(icons, query) {
|
|
17
|
+
if (!query || query.trim() === '') {
|
|
18
|
+
return icons;
|
|
19
|
+
}
|
|
20
|
+
const normalizedQuery = query.toLowerCase().trim();
|
|
21
|
+
return icons.filter((icon) => {
|
|
22
|
+
const name = (icon.name || '').toLowerCase();
|
|
23
|
+
const originalName = (icon.originalName || '').toLowerCase();
|
|
24
|
+
return (name.includes(normalizedQuery) || originalName.includes(normalizedQuery));
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Check if an icon matches a search query
|
|
29
|
+
*
|
|
30
|
+
* @param icon - Icon object to check
|
|
31
|
+
* @param query - Search query string
|
|
32
|
+
* @returns True if icon matches the query
|
|
33
|
+
*/
|
|
34
|
+
function iconMatchesQuery(icon, query) {
|
|
35
|
+
if (!query || query.trim() === '') {
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
const normalizedQuery = query.toLowerCase().trim();
|
|
39
|
+
const name = (icon.name || '').toLowerCase();
|
|
40
|
+
const originalName = (icon.originalName || '').toLowerCase();
|
|
41
|
+
return (name.includes(normalizedQuery) || originalName.includes(normalizedQuery));
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=icon-search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"icon-search.js","sourceRoot":"","sources":["../../src/icon-search.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAqBH,kCAcC;AASD,4CAYC;AA3CD;;;;;;;GAOG;AACH,SAAgB,WAAW,CAAC,KAAiB,EAAE,KAAa;IAC1D,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAClC,OAAO,KAAK,CAAA;IACd,CAAC;IAED,MAAM,eAAe,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAA;IAElD,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;QAC3B,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAA;QAC5C,MAAM,YAAY,GAAG,CAAC,IAAI,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAA;QAC5D,OAAO,CACL,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,eAAe,CAAC,CACzE,CAAA;IACH,CAAC,CAAC,CAAA;AACJ,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,gBAAgB,CAAC,IAAc,EAAE,KAAa;IAC5D,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAClC,OAAO,IAAI,CAAA;IACb,CAAC;IAED,MAAM,eAAe,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAA;IAClD,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAA;IAC5C,MAAM,YAAY,GAAG,CAAC,IAAI,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAA;IAE5D,OAAO,CACL,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,eAAe,CAAC,CACzE,CAAA;AACH,CAAC"}
|