ant-design/scripts/migrate.js
二货爱吃白萝卜 cbcfd38ca7
docs: v5 site upgrade (#38328)
* build: try to use dumi as doc tool

* docs: migrate demo structure to dumi way

* refactor: use type export & import

* docs: migrate demo previewer to dumi

* docs: create empty layout & components

* docs: apply custom rehype plugin

* docs: create empty extra pages

* docs: Add Banner component

* chore: move theme tsconfig.json

* docs: home page init

* docs: migrate header (#37896)

* docs: header

* docs: update

* docs: home init

* clean up

* test: fix site lint

* chore: tsc ignore demo

* chore: dumi demo migrate script

* chore: cards

* docs: home layout

* docs: Update locale logic

* docs: fix getLink logic

* chore: fix ci (#37899)

* chore: fix ci

* ci: remove check-ts-demo

* ci: preview build

* test: ignore demo.tsx

* chore: update script

* test: update snapshot

* test: update node and image test

* chore: add .surgeignore

* docs: layout providers (#37908)

* docs: add components sidebar (#37923)

* docs: sidebar

* docs: update docs title

* docs: update design doc

* chore: code clean

* docs: handle changelog page

* docs: add title

* docs: add subtitle

* docs: active header nav

* chore: code clean

* docs: overview

* chore: code clean

* docs: update intl (#37918)

* docs: update intl

* chore: code clean

* docs: update favicons

* chore: update testPathIgnorePatterns

* chore: code clean

* chore: code clean

* chore: copy 404.html (#37996)

* docs: Home page theme picker

* chore: Update migrate script

* docs: home page update

* docs: theme editor style

* docs: theme lang

* chore: update migrate.js

* docs: fix demo (#38094)

* chore: update migrate.js

* docs: update md

* docs: update demo

* test: fix snapshot

* chore: move debug to code attr in migrate script

* chore: update md

Co-authored-by: PeachScript <scdzwyxst@gmail.com>

* feat: overview page

* feat: Migrate `404` page (#38118)

* feat: migrate IconSearch component (#37916)

* feat<site/IconSearch>: copy IconDisplay from site to .dumi

* feat<site/IconSearch>: change docs of icon

* feat<site/IconSearch>: tweak

* feat<site/IconSearch>: use useIntl instead of injectIntl

* feat<site/IconSearch>: fix ts type error

* feat<site/IconSearch>: use intl.formatMessage to render text

* docs: Adjust home btn sizw

* docs: Update doc

* feat: v5 site overview page (#38131)

* feat: site

* fix: fix

* feat: v5 site overview page

* fix: fix path

* fix: fix

* fix: fix

* docs: fix margin logic

* feat: v5 site change-log page (#38137)

* feat: v5 site change-log page (#38162)

* docs: site redirect to home pag

* docs: theme picker

* docs: use react-intl from dumi (#38183)

* docs: Theme Picker

* docs: update dumi config

* docs: home back fix

* docs: picker colorful

* docs: locale of it

* docs: update components desc

* docs: site of links

* docs: update components list

* docs: update desc

* feat: Migrate `DemoWrapper` component (#38166)

* feat: Migrate `DemoWrapper` component

* feat: remove invalid comments and add comment for `key` prop

* docs: FloatButton pure panel

* chore: update demo

* chore: update dumi config

* Revert "chore: update demo"

This reverts commit 028265d3ba.

* chore: test logic adjust to support cnpm modules

* chore: add locale alias

* docs: /index to /

* docs: add locale redirect head script

* chore: adjust compact

* docs: fix missing token

* feat: compact switch

* chore: code clean

* docs: update home

* docs: fix radius token

* docs: hash of it

* chore: adjust home page

* docs: Add background map

* docs: site theme bac logic

* docs: avatar

* docs: update logo color

* docs: home banner

* docs: adjust tour size

* docs: purepanl update

* docs: transfooter

* docs: update banner gif

* docs: content (#38361)

* docs: title & EditButton

* docs: content

* chore: fix toc

* docs: resource page

* docs: transform resource data from hast

* docs: filename & Resource Card

* chore: enable prerender

* chore: remove less

* docs: toc style

* chore: fix lint

* docs: fix Layout page

* docs: fix CP page

* chore: update demos

* docs: workaround for export dynamic html

* chore: enable demo eslint

* docs: table style

* fix: header shadow

* chore: update snapshot

* fix: toc style

* docs: add title

* docs: Adjust site

* feat: helmet

* docs: site css

* fix: description

* feat: toc debug

* docs: update config-provider

* feat: use colorPanel

* fix: colorPanel value

* feat: anchor ink ball style

* feat: apply theme editor

* fix: code block style

* chore: update demo

* chore: fix lint

* chore: code clean

* chore: update snapshot

* feat: ts2js

* chore: description

* docs: site ready for ssr

includes:
- move client render logic to useEffect in site theme
- extract antd cssinjs to a single css file like bisheng
- workaround to support react@18 pipeableStream for emotion

* chore: bump testing lib

* docs: font size of title

* chore: remove react-sortable-hoc

* chore: update snapshot

* chore: update script

Co-authored-by: PeachScript <scdzwyxst@gmail.com>
Co-authored-by: MadCcc <1075746765@qq.com>
Co-authored-by: zqran <uuxnet@gmail.com>
Co-authored-by: TrickyPi <530257315@qq.com>
Co-authored-by: lijianan <574980606@qq.com>
2022-11-09 12:28:04 +08:00

207 lines
6.5 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/* eslint-disable no-console */
const fs = require('fs-extra');
// const glob = require('glob');
const chalk = require('chalk');
const path = require('path');
const yaml = require('dumi/node_modules/js-yaml');
// 检查 ~demo 文件夹是否存在,存在则说明是来自 next 的合并
// const tmpFolder = `~demo`;
// ==============================================================================
// Log 先记录flush 后才打印,以免打印过多无用信息
let consoleLines = [];
let consoleOffset = 0;
function logCache(...args) {
consoleLines.push(args);
}
function logClear() {
consoleLines = [];
}
function logFlush() {
consoleLines.forEach(args => {
const txt = args
.map(arg => (arg && typeof arg === 'object' ? JSON.stringify(arg, null, 2) : arg))
.join(' ');
const lines = txt.split(/[\n\r]+/);
lines.forEach(line => {
console.log(' '.repeat(consoleOffset), line);
});
});
logClear();
}
function log(...args) {
logCache(...args);
logFlush();
}
function logOffset(offset) {
consoleOffset = offset;
}
// ==============================================================================
// 执行迁移
// if (fs.existsSync(tmpFolder)) {
// let demoFileCount = 0;
// let apiFileCount = 0;
//
// const files = glob
// .sync(path.join(tmpFolder, `components/**`))
// .filter(file => file.endsWith('.md'));
// log('存在 ~demo 文件夹,先做迁移', files.length, '个文件');
//
// files.forEach(file => {
// const filePath = file.split(path.sep).splice(1).join(path.sep);
// if (fs.statSync(filePath).isDirectory()) {
// return;
// }
//
// if (!filePath.startsWith('components')) {
// throw new Error('Tmp demo path not correct');
// }
//
// fs.ensureDirSync(path.dirname(filePath));
// if (filePath.startsWith('components/overview')) {
// // overview 文件不需要迁移
// return;
// }
//
// if (filePath.endsWith('.en-US.md') || filePath.endsWith('.zh-CN.md')) {
// // 保留 meta 信息
// const md = fs.readFileSync(filePath, 'utf-8');
// const [, frontmatter] = md.match(/^(---[^]+?\n---)/);
// const legacyMD = fs.readFileSync(file, 'utf-8');
// fs.writeFileSync(filePath, legacyMD.replace(/^(---[^]+?\n---)/, frontmatter));
// } else {
// fs.copyFileSync(file, filePath);
// }
//
// if (filePath.includes('demo')) {
// demoFileCount += 1;
// } else {
// apiFileCount += 1;
// }
// });
//
// log('迁移完成,共迁移文件数:', apiFileCount, '个介绍文档', demoFileCount, '个 demo');
// }
// ==============================================================================
// 有一部分转换需要 hardcode这里就不做分析简单替换了
function hardcodeMD(content) {
return content.replace(/```.*\n.*IconDisplay.*\n.*mountNode.*\n```/, '<IconSearch></IconSearch>');
}
// 重新生成所有的 Demo 文件
const componentsPath = path.join(__dirname, '../components');
const components = fs
.readdirSync(componentsPath)
.filter(d => fs.existsSync(path.join(componentsPath, d, 'demo')));
components.forEach(component => {
const demoPath = path.join(componentsPath, component, 'demo');
const demos = fs.readdirSync(demoPath).filter(demo => demo.endsWith('.md'));
const codes = demos
.filter(demo => {
const mdPath = path.join(demoPath, demo);
const md = fs.readFileSync(mdPath, 'utf-8');
return md.match(/^(---[^]+?\n---)\s+([^]+?)?\s+(```(?:tsx|jsx)[^]+?\n```)([^]*)$/);
})
.map(demo => {
const mdPath = path.join(demoPath, demo);
const md = fs.readFileSync(mdPath, 'utf-8');
const [, frontmatter, content, code, extra] = md.match(
/^(---[^]+?\n---)\s+([^]+?)?\s+(```(?:tsx|jsx)[^]+?\n```)([^]*)$/,
);
const meta = yaml.load(frontmatter.replace(/^---|---$/g, ''));
const name = path.basename(demo, '.md');
return {
name,
meta,
html: {
'zh-CN': `<code src="./demo/${name}.tsx"${meta.debug ? ' debug' : ''}${
meta.iframe ? ' iframe' : ''
}>${meta.title['zh-CN']}</code>`,
'en-US': `<code src="./demo/${name}.tsx"${meta.debug ? ' debug' : ''}${
meta.iframe ? ' iframe' : ''
}>${meta.title['en-US']}</code>`,
},
md: content + extra,
code: code.replace(/^```(tsx|jsx)\n|```$/g, ''),
};
})
.sort((a, b) => a.meta.order - b.meta.order);
const zhPath = path.join(componentsPath, component, 'index.zh-CN.md');
const enPath = path.join(componentsPath, component, 'index.en-US.md');
const zh = fs.readFileSync(zhPath, 'utf-8');
const en = fs.readFileSync(enPath, 'utf-8');
// if (!/cols: /.test(zh)) {
// zh = zh.replace(/(\n---)/, '\ndemo:\n cols: 2$1');
// }
//
// if (!/cols: /.test(en)) {
// en = en.replace(/(\n---)/, '\ndemo:\n cols: 2$1');
// }
logOffset(0);
log();
log(chalk.yellow('Update', component, ':'));
logOffset(1);
// 中文
const zhContent = zh
.replace(/(\n## api)/i, `${codes.map(code => code.html['zh-CN']).join('\n')}$1`)
.replace(/\ncols: 2(.*?)(\n---)/, '$1\ndemo:\n cols: 2$2')
.replace(/\ncols: 1/, '');
fs.writeFileSync(zhPath, hardcodeMD(zhContent), 'utf-8');
// 英文
const enContent = en
.replace(/(\n## api)/i, `${codes.map(code => code.html['en-US']).join('\n')}$1`)
.replace(/\ncols: 2(.*?)(\n---)/, '$1\ndemo:\n cols: 2$2')
.replace(/\ncols: 1/, '');
fs.writeFileSync(enPath, hardcodeMD(enContent), 'utf-8');
log('写入', component, 'demo & demo md...');
codes.forEach(code => {
// const extraMeta = Object.keys(code.meta).filter(
// key => !['title', 'order', 'debug'].includes(key),
// );
// if (extraMeta.length) {
// log('写入额外的 meta', code.meta);
// code.code = `/*\n${extraMeta.map(key => ` * ${key}: ${code.meta[key]}`).join('\n')}\n */\n\n${
// code.code
// }`;
// }
let importReactContent = "import React from 'react';";
const importReactReg = /import React(\D*)from 'react';\n/;
const matchImportReact = code.code.match(importReactReg);
if (matchImportReact) {
[importReactContent] = matchImportReact;
code.code = code.code.replace(importReactReg, '').trim();
}
fs.writeFileSync(
path.join(demoPath, `${code.name}.tsx`),
`${importReactContent}${code.code}\n`,
'utf-8',
);
if (code.md.trim()) {
fs.writeFileSync(path.join(demoPath, `${code.name}.md`), code.md, 'utf-8');
} else {
fs.unlinkSync(path.join(demoPath, `${code.name}.md`));
}
});
});