maskletter/tenp

View on GitHub
cli/lib/init.js

Summary

Maintainability
B
4 hrs
Test Coverage

const { execFile, spawn, fork } = require('child_process')
const path = require('path');
const fs = require('fs');
const npm = (process.platform === "win32" ? "npm.cmd" : "npm");
const Global_Pack = require('../package.json');
let directoryPath = process.cwd();
const readline = require('readline');
const validate = require("validate-npm-package-name")
const { con } = require('./tool.js');
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout
});

function readlinePromise(name){
    return new Promise((resolve, reject) => {
        rl.question(name, answer => {
            resolve(answer)
        });
    })
}

//生成package.json
async function createPackage(name){
    console.log('create init')
    let pacakge = {};
    pacakge.name = await readlinePromise(`  package name: (${name})`) || name;
    const validateresult = validate(pacakge.name);
    if(!validateresult.validForNewPackages || !validateresult.validForOldPackages){
        console.log('')
        validateresult.errors[0] && con.error(validateresult.errors[0])
        validateresult.errors[1] && con.error(validateresult.errors[1])
        console.log('')
        process.exit();
    }
    pacakge.version = await readlinePromise('  version: (1.0.0)') || '1.0.0';
    pacakge.description = await readlinePromise('  description:') || '';
    pacakge.main = await readlinePromise('  entry point: (server.js)') || 'server.js';
    const testCommand = await readlinePromise('  test command:');
    const gitRepository = await readlinePromise('  git repository:');
    pacakge.keywords = await readlinePromise('  keywords:');
    pacakge.author = await readlinePromise('  author:');
    pacakge.license = await readlinePromise('  license: (ISC)') || "ISC";

    pacakge.keywords = pacakge.keywords.split(' ');

    if(gitRepository){
        pacakge.repository = {
            "type": "git",
            "url": "git+"+gitRepository
        }
    }
    if(testCommand){
        pacakge.scripts = {
             "test": testCommand
        }
    }else{
        pacakge.scripts = {
            "dev": "tenp dev",
            "dev:build": "tenp dev --build",
            "serve": "tenp serve",
            "serve:build": "tenp serve --build",
            "test": "echo \"Error: no test specified\" && exit 1"
        }
    }


    con.log('关于生成的 package.json 信息:')
    con.yellow(JSON.stringify(pacakge, null, 4))

    const isCreate = await readlinePromise(`  Is this OK? (yes) `);

    return { pacakge, isCreate };
}


function installPack(){
    const ff = require('./install.js')(directoryPath, null);
    ff.then(result => {
        console.log(' 创建成功')
        console.log('')
        process.exit()
    }).catch(err => {
        console.log(err)
    })
}

function createAssets(isNo){
    const filename = isNo ? 'server-demo.txt' : 'server.txt';
    const content = fs.readFileSync(path.resolve(__dirname,'../dist/'+filename));
    const src = path.join(directoryPath, 'src');
    const exists = fs.existsSync(src);
    if(!exists){
        fs.mkdirSync(path.resolve(src));
    }
    
    fs.writeFileSync(path.resolve(directoryPath, 'src', 'server.ts'), content.toString());

}

function consoleVersion(){
    console.log('version:  ')
    console.log('  @tenp/core: ^'+Global_Pack.version);
    console.log('  express: ^4.16.4')
    console.log('  typescript: ^3.2.2');
    console.log('  @types/node: 10.11.2');
    console.log('  @types/express: ^4.16.0')
    console.log('  formidable: 1.2.1');
    console.log('')
}


module.exports = function(argv){

    const isNo = argv.indexOf('--no') == -1 ? false : true;
    argv = argv.filter(v => v != '--no');
    const name = argv[0];

    directoryPath = path.join(process.cwd(), name);
    if(fs.existsSync(directoryPath)){
        con.error('\r\n $ 已存在项目目录')
        process.exit();
        return;
    }

    console.log(`\r\n开始生成项目:${name}`)
    if(!isNo){
        consoleVersion();
    }

    createPackage(name).then(({ pacakge, isCreate }) => {
        if(!isCreate || isCreate == 'yes' || isCreate == 'y'){
            fs.mkdirSync(directoryPath);
            if(!isNo){
                pacakge.devDependencies = {
                    "@types/node": "^10.11.2",
                    "@types/express": "^4.16.0"
                }
                pacakge.dependencies = {
                    "formidable": "^1.2.1",
                    "express": "^4.16.4",
                    "@tenp/core": "^"+Global_Pack.version
                }
            }
                
            fs.writeFile(path.resolve(directoryPath, 'package.json'), JSON.stringify(pacakge, null, 2), function(err){
                if(err){
                    con.error(err)
                }else{
                    createAssets(isNo);
                    const tsconfig = require(path.resolve(__dirname,'../dist/tsconfig.json'))
                    fs.writeFileSync(path.resolve(directoryPath,'tsconfig.json'), JSON.stringify(tsconfig, null, 2));
                    
                    if(!isNo){
                        readlinePromise('是否自动安装依赖包文件?(y/n)').then(result => {
                            if(result == 'y' || !result){
                                installPack();
                            }else{
                                con.success(' 创建成功')
                                console.log('')
                                process.exit()
                            }
                        })
                    }else{
                        con.success(' 创建成功');
                        process.exit();
                    }

                }
            })
        }else{
            process.exit()
        }
    })

    


}