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 () => { return 'http://platform.kuopu.net:9999/gitlab/nemean-group/nemean-simple.git'; }; 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: ['JavaScript', 'TypeScript'], }, ]; 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; 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;