import url from 'node:url'; import path from 'path'; import { globSync } from 'glob'; import React from 'react'; type StyleFn = (prefix?: string) => void; interface GenCssinjsOptions { key: string; render: (component: React.FC) => void; beforeRender?: (componentName: string) => void; ignore?: string[]; } export const styleFiles = globSync( path .join( process.cwd(), 'components/!(version|config-provider|icon|auto-complete|col|row|time-picker|qrcode)/style/index.?(ts|tsx)', ) .split(path.sep) .join('/'), ); export const generateCssinjs = ({ key, beforeRender, render, ignore }: GenCssinjsOptions) => Promise.all( styleFiles.map(async (file) => { const absPath = url.pathToFileURL(file).href; const pathArr = file.split('/'); const styleIndex = pathArr.lastIndexOf('style'); const componentName = pathArr[styleIndex - 1]; if (ignore?.includes(componentName)) return; let useStyle: StyleFn = () => {}; if (file.includes('grid')) { const { useColStyle, useRowStyle } = await import(absPath); useStyle = (prefixCls: string) => { useRowStyle(prefixCls); useColStyle(prefixCls); }; } else { useStyle = (await import(absPath)).default; } const Demo: React.FC = () => { useStyle(`${key}-${componentName}`); return React.createElement('div'); }; beforeRender?.(componentName); render?.(Demo); }), );