const fs = require("fs-extra"); const path = require("path"); const chalk = require("chalk"); const glob = require("glob"); const exec = require("execa"); const BasicGenerator = require("../../BasicGenerator"); const filterPkg = require("./filterPkg"); const prettier = require("prettier"); const sylvanas = require("sylvanas"); const sortPackage = require("sort-package-json"); const { getFastGithub } = require("umi-utils"); function log(...args) { console.log(`${chalk.gray(">")}`, ...args); } function globList(patternList, options) { let fileList = []; patternList.forEach(pattern => { fileList = [...fileList, ...glob.sync(pattern, options)]; }); return fileList; } const getGithubUrl = async () => { const fastGithub = await getFastGithub(); if (fastGithub === "github.com.cnpmjs.org") { return "https://github.com.cnpmjs.org/ant-design/ant-design-pro"; } return "https://github.com/ant-design/ant-design-pro"; }; const PRO_PATH = process.env.INIT_CWD || process.env.npm_rootpath || process.cwd(); class AntDesignProGenerator extends BasicGenerator { prompting() { if (this.opts.args.language) { this.prompts = { language: this.opts.args.language }; } else { const prompts = [ { name: "language", type: "list", message: "Which language do you want to use?", choices: ["TypeScript", "JavaScript"] } ]; return this.prompt(prompts).then(props => { this.prompts = props; }); } } async writing() { const { language } = this.prompts; const isTypeScript = language === "TypeScript"; const projectName = this.opts.name || this.opts.env.cwd; console.log(`this.opts::::${JSON.stringify(this.opts)}`); const projectPath = path.resolve(projectName); const envOptions = { cwd: projectPath }; const githubUrl = await getGithubUrl(); const gitArgs = [`clone`, githubUrl, `--depth=1`]; // Set branch if provided if (this.opts.args.branch) { gitArgs.push("--branch", this.opts.args.branch); } gitArgs.push(projectName); // Clone remote branch log(`git ${gitArgs.join(" ")}`); await exec(`git`, gitArgs); const packageJsonPath = path.resolve(projectPath, "package.json"); const pkg = require(packageJsonPath); // Handle js version if (!isTypeScript) { log("[Sylvanas] Prepare js environment..."); const tsFiles = globList(["**/*.tsx", "**/*.ts"], { ...envOptions, ignore: ["**/*.d.ts"] }); sylvanas(tsFiles, { ...envOptions, action: "overwrite" }); log("[JS] Clean up..."); const removeTsFiles = globList( ["tsconfig.json", "**/*.d.ts"], envOptions ); removeTsFiles.forEach(filePath => { const targetPath = path.resolve(projectPath, filePath); fs.removeSync(targetPath); }); } // copy readme const babelConfig = path.resolve(__dirname, "README.md"); fs.copySync(babelConfig, path.resolve(projectPath, "README.md")); // gen package.json if (pkg["create-nemean"]) { const { ignoreScript = [], ignoreDependencies = [] } = pkg[ "create-nemean" ]; // filter scripts and devDependencies const projectPkg = { ...pkg, version: "1.0.0", scripts: filterPkg(pkg.scripts, ignoreScript), devDependencies: filterPkg(pkg.devDependencies, ignoreDependencies) }; // remove create-nemean config delete projectPkg["create-nemean"]; fs.writeFileSync( path.resolve(projectPath, "package.json"), // 删除一个包之后 json会多了一些空行。sortPackage 可以删除掉并且排序 // prettier 会容忍一个空行 prettier.format(JSON.stringify(sortPackage(projectPkg)), { parser: "json" }) ); } // Clean up useless files if (pkg["create-nemean"] && pkg["create-nemean"].ignore) { log("Clean up..."); const ignoreFiles = pkg["create-nemean"].ignore; const fileList = globList(ignoreFiles, envOptions); fileList.forEach(filePath => { const targetPath = path.resolve(projectPath, filePath); fs.removeSync(targetPath); }); } } } module.exports = AntDesignProGenerator;