@notadd/cli
Version:
notadd core none dependence
80 lines (77 loc) • 4.04 kB
text/typescript
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';
()
export class InitCommand {
('init')
async init('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)
}
}