import { createHash } from 'crypto'; import fs from 'fs'; import path from 'path'; import createEmotionServer from '@emotion/server/create-instance'; import chalk from 'chalk'; import type { IApi, IRoute } from 'dumi'; import ReactTechStack from 'dumi/dist/techStacks/react'; import sylvanas from 'sylvanas'; import { dependencies, devDependencies } from '../../package.json'; function extractEmotionStyle(html: string) { // copy from emotion ssr // https://github.com/vercel/next.js/blob/deprecated-main/examples/with-emotion-vanilla/pages/_document.js const styles = global.__ANTD_STYLE_CACHE_MANAGER_FOR_SSR__.getCacheList().map((cache) => { const result = createEmotionServer(cache).extractCritical(html); if (!result.css) { return null; } const { css, ids } = result; return { key: cache.key, css, ids, tag: ``, }; }); return styles.filter(Boolean); } export const getHash = (str: string, length = 8) => createHash('md5').update(str).digest('hex').slice(0, length); /** * extends dumi internal tech stack, for customize previewer props */ class AntdReactTechStack extends ReactTechStack { generatePreviewerProps(...[props, opts]: any) { props.pkgDependencyList = { ...devDependencies, ...dependencies }; props.jsx ??= ''; if (opts.type === 'code-block') { props.jsx = opts?.entryPointCode ? sylvanas.parseText(opts.entryPointCode) : ''; } if (opts.type === 'external') { // try to find md file with the same name as the demo tsx file const locale = opts.mdAbsPath.match(/index\.([a-z-]+)\.md$/i)?.[1]; const mdPath = opts.fileAbsPath!.replace(/\.\w+$/, '.md'); const md = fs.existsSync(mdPath) ? fs.readFileSync(mdPath, 'utf-8') : ''; const codePath = opts.fileAbsPath!.replace(/\.\w+$/, '.tsx'); const code = fs.existsSync(codePath) ? fs.readFileSync(codePath, 'utf-8') : ''; props.jsx = sylvanas.parseText(code); if (md) { // extract description & css style from md file const blocks: Record = {}; const lines = md.split('\n'); let blockName = ''; let cacheList: string[] = []; // Get block name const getBlockName = (text: string) => { if (text.startsWith('## ')) { return text.replace('## ', '').trim(); } if (text.startsWith('```css') || text.startsWith('