jgb-cli
Version:
```shell npm i -g jgb-cli #全局安装 ```
375 lines • 27.9 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var tslib_1 = require("tslib");
var chalk_1 = require("chalk");
var glob = require("fast-glob");
var fs = require("fs-extra");
var inquirer = require("inquirer");
var Logger_1 = require("jgb-shared/lib/Logger");
var beautify = require("js-beautify");
var path = require("path");
var config_1 = require("../config");
var utils_1 = require("jgb-shared/lib/utils");
var templateFile_1 = require("../utils/templateFile");
function create(templateName, folderName, program) {
if (program === void 0) { program = {}; }
return tslib_1.__awaiter(this, void 0, void 0, function () {
var config, isCreateTemplate, tmp, useComponentFolder, sourceDir, distRootDir, _a, dir, _b, fileName, distDir, outputDist, files, tasks;
return tslib_1.__generator(this, function (_c) {
switch (_c.label) {
case 0: return [4 /*yield*/, config_1.getJGBConfig(program.config)];
case 1:
config = _c.sent();
if (!program.list) return [3 /*break*/, 3];
return [4 /*yield*/, showAllTemplate()];
case 2:
_c.sent();
return [2 /*return*/];
case 3:
if (!templateName) {
return [2 /*return*/, Logger_1.logger.warning("please enter [template-name]")];
}
isCreateTemplate = !!program.template;
if (!isCreateTemplate) return [3 /*break*/, 5];
return [4 /*yield*/, generateTemplate(templateName)];
case 4:
_c.sent();
return [2 /*return*/];
case 5:
if (!config) {
Logger_1.logger.warning("cannot found jgb config file.");
return [2 /*return*/];
}
tmp = templateFile_1.generateTemplatePath("template-" + templateFile_1.md5(templateName));
if (!fs.existsSync(tmp)) {
return [2 /*return*/, Logger_1.logger.warning("cannot found template folder: " + templateName)];
}
useComponentFolder = !!program.component;
sourceDir = path.join(tmp, useComponentFolder ? 'component' : 'page');
distRootDir = path.join(process.cwd(), config.sourceDir || 'src');
_a = tslib_1.__read(folderName.split(':'), 2), dir = _a[0], _b = _a[1], fileName = _b === void 0 ? 'index' : _b;
distDir = path.join(distRootDir, dir);
fs.ensureDirSync(distDir);
outputDist = utils_1.pathToUnixType(path.join(dir, fileName));
if (!(fileName === 'index')) return [3 /*break*/, 7];
return [4 /*yield*/, fs.copy(sourceDir, distDir)];
case 6:
_c.sent();
return [3 /*break*/, 10];
case 7: return [4 /*yield*/, glob(sourceDir + "/*")];
case 8:
files = _c.sent();
tasks = files.map(function (file) {
var basename = path.basename(file);
var name = basename.replace(/index\./, fileName + ".");
return fs.copy(file, path.join(distDir, name));
});
return [4 /*yield*/, Promise.all(tasks)];
case 9:
_c.sent();
_c.label = 10;
case 10:
console.log(outputDist + " has been created");
return [2 /*return*/];
}
});
});
}
exports.default = create;
/**
* 生成模板文件
* @param templateName
* @param folderName
*/
function generateTemplate(templateName) {
return tslib_1.__awaiter(this, void 0, void 0, function () {
var mode, promise, result;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, getTemplateMode()];
case 1:
mode = _a.sent();
switch (mode) {
case 'online':
promise = createOnlineTemplate(templateName);
break;
case 'inline':
default:
promise = createInlineTemplate(templateName);
break;
}
return [4 /*yield*/, promise];
case 2:
result = _a.sent();
return [4 /*yield*/, addTemplateToAllTemplatess(result)];
case 3:
_a.sent();
return [2 /*return*/];
}
});
});
}
exports.generateTemplate = generateTemplate;
function addTemplateToAllTemplatess(result) {
return tslib_1.__awaiter(this, void 0, void 0, function () {
var templateJsonPath, templateJson;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
templateJsonPath = templateFile_1.generateTemplatePath('.templates.json');
return [4 /*yield*/, getAllTemplates()];
case 1:
templateJson = _a.sent();
templateJson[result.templateName] = result.templatePath;
return [4 /*yield*/, fs.writeFile(templateJsonPath, JSON.stringify(templateJson))];
case 2:
_a.sent();
return [2 /*return*/];
}
});
});
}
exports.addTemplateToAllTemplatess = addTemplateToAllTemplatess;
function getAllTemplates() {
return tslib_1.__awaiter(this, void 0, void 0, function () {
var templateJsonPath, templateJsonStr, templateJson, error_1;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
templateJsonPath = templateFile_1.generateTemplatePath('.templates.json');
templateJsonStr = '{}';
templateJson = {};
_a.label = 1;
case 1:
_a.trys.push([1, 3, , 4]);
return [4 /*yield*/, fs.readFile(templateJsonPath, 'utf-8')];
case 2:
templateJsonStr = _a.sent();
templateJson = JSON.parse(templateJsonStr);
return [3 /*break*/, 4];
case 3:
error_1 = _a.sent();
console.log(error_1);
return [3 /*break*/, 4];
case 4: return [2 /*return*/, templateJson];
}
});
});
}
exports.getAllTemplates = getAllTemplates;
function showAllTemplate() {
return tslib_1.__awaiter(this, void 0, void 0, function () {
var templateJson, keys;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, getAllTemplates()];
case 1:
templateJson = _a.sent();
keys = Object.keys(templateJson);
if (!keys.length) {
console.log('no list');
}
keys.forEach(function (key) {
console.log("" + chalk_1.default.yellowBright(key));
console.log(" " + chalk_1.default.gray(templateJson[key]));
});
return [2 /*return*/];
}
});
});
}
exports.showAllTemplate = showAllTemplate;
/**
* 下载并创建在线模板文件
* @param templateName
*/
function createOnlineTemplate(templateName) {
return tslib_1.__awaiter(this, void 0, void 0, function () {
var tmp, answers, templateRepo, useClone;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
tmp = templateFile_1.generateTemplatePath("template-" + templateFile_1.md5(templateName));
console.log(chalk_1.default.gray('you can find [template repository] info on https://github.com/flipxfx/download-git-repo'));
return [4 /*yield*/, makeQuestionAsync([
{
type: 'input',
name: 'templateRepo',
message: 'template repository'
},
{
type: 'confirm',
name: 'useClone',
message: 'use git clone the repo?',
default: true
}
])];
case 1:
answers = _a.sent();
templateRepo = answers.templateRepo, useClone = answers.useClone;
console.log("> cached template at " + chalk_1.default.yellow(tmp));
return [4 /*yield*/, templateFile_1.downloadAndGenerate(templateRepo, tmp, useClone)];
case 2:
_a.sent();
console.log(chalk_1.default.gray("download repository " + templateRepo + " success"));
console.log('you can use command:');
console.log(chalk_1.default.yellow(" jgb create " + templateName + " folder-name"));
return [2 /*return*/, {
templateName: templateName,
templatePath: tmp
}];
}
});
});
}
exports.createOnlineTemplate = createOnlineTemplate;
function createInlineTemplate(templateName) {
return tslib_1.__awaiter(this, void 0, void 0, function () {
var tmp, files, result, tasks;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
tmp = templateFile_1.generateTemplatePath("template-" + templateFile_1.md5(templateName));
return [4 /*yield*/, makeQuestionAsync([
{
type: 'checkbox',
message: 'pleace select choice for create template files',
name: 'files',
choices: ['js', 'wxss', 'json', 'wxml'].map(function (name) {
return {
name: name,
checked: true
};
})
}
])];
case 1:
files = (_a.sent()).files;
return [4 /*yield*/, createInlineFile(files)];
case 2:
result = _a.sent();
console.log("> template at " + chalk_1.default.yellow(tmp));
fs.ensureDirSync(tmp);
tasks = result.map(function (_a) {
var code = _a.code, filePath = _a.filePath;
var fpath = path.join(tmp, filePath);
var dir = path.parse(fpath).dir;
fs.ensureDirSync(dir);
return fs.writeFile(fpath, code);
});
return [4 /*yield*/, Promise.all(tasks)];
case 3:
_a.sent();
return [2 /*return*/, {
templateName: templateName,
templatePath: tmp
}];
}
});
});
}
exports.createInlineTemplate = createInlineTemplate;
function createInlineFile(files) {
return tslib_1.__awaiter(this, void 0, void 0, function () {
var pageDir, pageQuestions, componentDir, componentQuestions, result, keys, results;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
pageDir = 'page';
pageQuestions = files.map(function (ext) {
var filePath = pageDir + "/index." + ext;
return {
ext: ext,
filePath: filePath,
type: 'editor',
name: pageDir + "-" + ext,
message: filePath + " :"
};
});
componentDir = 'component';
componentQuestions = files.map(function (ext) {
var filePath = componentDir + "/index." + ext;
return {
ext: ext,
filePath: filePath,
type: 'editor',
name: componentDir + "-" + ext,
message: filePath + " :"
};
});
return [4 /*yield*/, makeQuestionAsync(pageQuestions.concat(componentQuestions).reduce(function (arr, question) {
var name = question.name + "-filePath";
var ext = question.ext;
var q = {
name: name,
type: 'input',
message: 'are you sure this file path ?',
default: question.filePath,
when: function (answers) {
var code = answers[question.name];
var beautifyCode = autoBeautify(code, ext);
console.log(chalk_1.default.grey(beautifyCode));
console.log("> will write file: " + chalk_1.default.yellow(question.filePath));
return true;
}
};
return arr.concat([question, q]);
}, []))];
case 1:
result = _a.sent();
keys = Object.keys(result);
results = keys.reduce(function (arr, key, idx) {
var carr = (idx % 2 === 0 ? [] : arr[arr.length - 1]) || [];
carr.push(key);
if (carr.length === 1) {
arr.push(carr);
}
return arr;
}, []);
return [2 /*return*/, results.map(function (r) {
var _a = tslib_1.__read(r, 2), codeKey = _a[0], filePathKey = _a[1];
var code = result[codeKey];
var filePath = result[filePathKey];
return {
code: code,
filePath: filePath
};
})];
}
});
});
}
exports.createInlineFile = createInlineFile;
function autoBeautify(code, ext) {
if (ext === void 0) { ext = 'js'; }
try {
switch (ext) {
case 'css':
return beautify.css(code);
case 'wxml':
return beautify.html(code);
case 'json':
return JSON.stringify(JSON.parse(code || '{}'), null, 2);
case 'js':
default:
return beautify(code);
}
}
catch (error) {
return code;
}
}
function getTemplateMode() {
return makeQuestionAsync([
{
type: 'list',
message: 'pleace select choice for create template mode',
name: 'onlineOrinline',
choices: ['inline', 'online']
}
]).then(function (res) { return res.onlineOrinline; });
}
function makeQuestionAsync(questions) {
return inquirer.prompt(questions);
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbW1hbmQvY3JlYXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLCtCQUEwQjtBQUMxQixnQ0FBa0M7QUFDbEMsNkJBQStCO0FBQy9CLG1DQUFxQztBQUNyQyxnREFBK0M7QUFDL0Msc0NBQXlDO0FBQ3pDLDJCQUE2QjtBQUM3QixvQ0FBeUM7QUFFekMsOENBQXNEO0FBQ3RELHNEQUkrQjtBQUUvQixTQUE4QixNQUFNLENBQ2xDLFlBQW9CLEVBQ3BCLFVBQWtCLEVBQ2xCLE9BQWlCO0lBQWpCLHdCQUFBLEVBQUEsWUFBaUI7Ozs7O3dCQUVGLHFCQUFNLHFCQUFZLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFBOztvQkFBM0MsTUFBTSxHQUFHLFNBQWtDO3lCQUU3QyxPQUFPLENBQUMsSUFBSSxFQUFaLHdCQUFZO29CQUNkLHFCQUFNLGVBQWUsRUFBRSxFQUFBOztvQkFBdkIsU0FBdUIsQ0FBQztvQkFDeEIsc0JBQU87O29CQUdULElBQUksQ0FBQyxZQUFZLEVBQUU7d0JBQ2pCLHNCQUFPLGVBQU0sQ0FBQyxPQUFPLENBQUMsOEJBQThCLENBQUMsRUFBQztxQkFDdkQ7b0JBR0ssZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7eUJBRXhDLGdCQUFnQixFQUFoQix3QkFBZ0I7b0JBQ2xCLHFCQUFNLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxFQUFBOztvQkFBcEMsU0FBb0MsQ0FBQztvQkFDckMsc0JBQU87O29CQUdULElBQUksQ0FBQyxNQUFNLEVBQUU7d0JBQ1gsZUFBTSxDQUFDLE9BQU8sQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO3dCQUNoRCxzQkFBTztxQkFDUjtvQkFHSyxHQUFHLEdBQUcsbUNBQW9CLENBQUMsY0FBWSxrQkFBRyxDQUFDLFlBQVksQ0FBRyxDQUFDLENBQUM7b0JBQ2xFLElBQUksQ0FBQyxFQUFFLENBQUMs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