UNPKG

@notadd/cli

Version:

notadd core none dependence

80 lines (77 loc) 4.04 kB
import { join } from "path"; import { readdirSync, readFileSync, writeFileSync, mkdirSync } from "fs"; import { execSync } from 'child_process'; import { question, keyInSelect } from 'readline-sync'; import path = require("path"); import fs = require("fs"); import { Command } from "@notadd/cli-core"; import shelljs from 'shelljs'; import { Controller, Args } from '@notadd/core'; @Controller() export class InitCommand { @Command('init') async init(@Args('gdbc') gdbc: boolean) { const { green, yellow } = require("colorette") let projectName = question(yellow('Please enter project name :'), { charlist: '$<a-z>' }).trim(); projectName = this.specialCharacte(projectName); console.log(`init ${projectName} ing...`) let notGenerateFile = ['.git', 'node_modules', '.gitignore', 'init.ts', 'undefined.log', 'yarn.lock', 'init.js', 'package.json', '.vscode']; shelljs.exec(`mkdir ${projectName}`) let filePath = join(__dirname, gdbc ? "../init_template_v2" : "../init_template"); let writeFilePath = join(process.cwd(), `/${projectName}`); fileDisplay(filePath, writeFilePath, projectName); const value = ['npm i', 'yarn'] const index = keyInSelect(value, yellow('Please choose :')); if (index > -1) { console.log("Dependencies downloading ..."); execSync(`cd ${projectName}/ && ${value[index]} `) console.log(green('Initialization successful! ')); console.log(green('Start command: yarn start ')); } function fileDisplay(filePath: string, writeFilePath: string, projectName: string) { const files = readdirSync(filePath); files.filter(it => !notGenerateFile.includes(it)).forEach(function (filename) { var fileDir = path.join(filePath, filename); var writeFileDir = path.join(writeFilePath, filename); const stats = fs.statSync(fileDir) let isFile = stats.isFile(); let isDir = stats.isDirectory(); if (isFile) { console.log(`${green(writeFilePath.replace(join(__dirname, "/"), "") + '/' + filename)}`) const data = readFileSync(fileDir) let dataStr = data.toString(); let name = projectName.toLowerCase().charAt(0).toUpperCase() + projectName.slice(1); dataStr = dataStr.replace(new RegExp("initDemo", 'g'), projectName).replace(new RegExp("InitDemo", 'g'), name); writeFileDir = writeFileDir.replace(new RegExp("initDemo", 'g'), projectName) console.log(writeFileDir) if (filename === "package.md") { writeFileDir = writeFileDir.replace('package.md', 'package.json'); } if (filename === "env.md") { writeFileDir = writeFileDir.replace('env.md', '.env'); } writeFileSync(writeFileDir, dataStr); } if (isDir) { if (filename === "initDemo") { writeFileDir = writeFileDir.replace(new RegExp("initDemo", 'g'), projectName) } mkdirSync(writeFileDir); fileDisplay(fileDir, writeFileDir, projectName); } }) } } /* 特殊字符 */ specialCharacte(str: string): string { var reg = " .*[`~!@#$%^&*()+=|{}_'--:;'_,\\[\\].<>/?~!@#¥%……&*()——+|{}【】‘;:”“’。,、?\\\\]+.*"; for (let i = 0; i < str.length && i < 15; i++) { let index = reg.lastIndexOf(str[i]) if (index !== -1) { str = str.replace(str[i], "") i = i - 1 } } return str.toLowerCase().substring(0, 15) } }