@meistericons/meistericons
Version:
Meistericons, an icon library,
2 lines (1 loc) • 2.99 kB
JavaScript
import{appendFileSync as e,existsSync as t,mkdirSync as n,writeFileSync as o,readdirSync as r,readFileSync as s}from"node:fs";import a from"node:path";import{fileURLToPath as c}from"node:url";var i=(t,n)=>{const o=a.resolve(`${n}/icons`),r=`export {default as ${f(t)}} from './${f(t)}';\n`;e(a.resolve(o,"index.ts"),r,"utf-8")},l=(e,r)=>{const s=e[0],c=e[1],i=a.resolve(`${r}/icons`);t(i)||n(i);const l=`\n import createMeisterIcons from '../src/createMeisterIcons';\n\n const ${f(s)} = createMeisterIcons("${s}", ${JSON.stringify(c)})\n\n\n export default ${f(s)}\n `;o(a.join(i,`${f(s)}.ts`),l,"utf-8")};const p={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor"};var d=(r,s,c)=>{const i=a.resolve(`${c}/lib`);let l=s.includes("../")?s.replaceAll("../",""):s;const d=`meistericons-${"react"===l?"react":"static"===l?"static":"vue"===l?"vue":"vue-latest"}.d.ts`;if(!t(i)){n(i);const e=` ${"react"===l?"import { MeisterIcon } from '../src/createMeisterIcons'":"vue"===l?'import { Component } from "vue"':"vue-latest"===l?'import { FunctionalComponent, SVGAttributes } from "vue"':""}\n declare module '@meistericons/${l}'\n \n ${"vue-latest"===l?'interface SVGProps extends Partial<SVGAttributes> {\n size: 24;\n fill: "currentColor";\n }\n \n export type Icon = (props: SVGProps) => FunctionalComponent<SVGProps>;\n ':"static"===l?"":`export interface SVGProps extends Partial<SVGElement> ${JSON.stringify(p,null,2)}\n \n export declare type IconNodeChild = readonly [string, object];\n export declare type IconNode = readonly [tag: string, attrs: SVGProps, children?: IconNodeChild[]];\n export declare type CustomAttrs = { [attr:string]: any }\n export type Icons = { [key: string]: IconNode }\n \n export interface CreateIconsOptions {\n \n icons: Icons;\n \n \n nameAttr?: string;\n \n attrs?: CustomAttrs;\n }\n \n export function createElement(icon: IconNode): SVGSVGElement;\n export function createIcons(options: CreateIconsOptions): void;\n \n export declare const icons: Icons;\n `}\n // Generated icons\n `;o(a.resolve(i,d),e,"utf-8")}const m="vue-latest"===l?"Icon;":"static"===l?"string":"Component;";e(a.resolve(i,d),`export declare const ${r}: ${"react"===l?"MeisterIcon;":m}\n`,"utf-8"),console.log(`Added icon type ${r} - @meistericons/${l}`)};const m=e=>e.replace(/^([A-Z])|[\s-_]+(\w)/g,((e,t,n)=>n?n.toUpperCase():t.toLowerCase())),u=e=>e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),f=e=>m(e).charAt(0).toUpperCase()+m(e).slice(1),v=e=>c(new URL(e)),C=e=>r(e).map((e=>e.replace(/.svg/,""))),g=e=>s(e),x=e=>r(e).reduce(((e,t,n)=>(e[a.basename(t,".svg")]=g(t),e)),{});export{i as generateExportFile,l as generateIconFile,d as generateTypes,v as getCurrentDir,x as readAllMetadata,C as readIconFiles,g as readSvgCode,m as toCamelCase,u as toKebabCase,f as toPascalCase};