@gdjiami/cli
Version:
CLI for build front end project.
113 lines (112 loc) • 4.82 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
var tslib_1 = require("tslib");
var fs_extra_1 = tslib_1.__importDefault(require("fs-extra"));
var os_1 = tslib_1.__importDefault(require("os"));
var path_1 = tslib_1.__importDefault(require("path"));
var chalk_1 = tslib_1.__importDefault(require("chalk"));
var child_process_1 = require("child_process");
var tar_1 = tslib_1.__importDefault(require("tar"));
var utils_1 = require("../../utils");
function getInstallPackage(templateName, cwd) {
if (templateName && templateName.match(/^file:/)) {
return "file:" + path_1.default.resolve(cwd, templateName.match(/^file:(.*)?$/)[1]);
}
return templateName;
}
function tryPack(templateName) {
var cmd = "npm pack " + templateName + " --dry-run --json";
try {
var res = child_process_1.execSync(cmd, { stdio: ['ignore', 'pipe', 'ignore'] });
return res.toString().trim();
}
catch (err) {
handleError(err);
}
}
function handleError(err) {
if (err.stdout) {
try {
var msg = JSON.parse(err.stdout.toString());
utils_1.message.error("Failed to download template:\n " + chalk_1.default.reset(msg.error.summary));
}
catch (_a) {
utils_1.message.error("Failed to download template:");
console.log(err);
}
}
else {
utils_1.message.error("Failed to download template:");
console.log(err);
}
process.exit(1);
}
function extraPack(packName, target) {
return tslib_1.__awaiter(this, void 0, void 0, function () {
return tslib_1.__generator(this, function (_a) {
fs_extra_1.default.ensureDirSync(target);
return [2 /*return*/, tar_1.default.x({
file: packName,
C: target,
})];
});
});
}
function getAbsolutePath(base) {
return path_1.default.resolve(path_1.default.join(base, 'package'));
}
/**
* 获取和下载自定义模板
*/
function getTemplate(force, ownPath, cwd, templateName) {
return tslib_1.__awaiter(this, void 0, void 0, function () {
var tempDir, templateJson, templateJsonExisted, pkg, packName, cmd, extraPath, err_1;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
if (templateName == null) {
// default template
return [2 /*return*/, path_1.default.join(ownPath, 'template')];
}
// install template from npm
templateName = getInstallPackage(templateName, cwd);
tempDir = path_1.default.join(os_1.default.tmpdir(), '.jm');
fs_extra_1.default.ensureDirSync(tempDir);
process.chdir(tempDir);
templateJson = path_1.default.join(tempDir, 'template.json');
templateJsonExisted = fs_extra_1.default.existsSync(templateJson);
pkg = {};
packName = tryPack(templateName);
// 已存在, 不需要重复下载
if (templateJsonExisted) {
pkg = fs_extra_1.default.readJsonSync(templateJson);
if (!force && templateName in pkg && pkg[templateName].packName === packName) {
return [2 /*return*/, getAbsolutePath(pkg[templateName].path)];
}
}
_a.label = 1;
case 1:
_a.trys.push([1, 3, , 4]);
utils_1.message.info("Downloading template from " + chalk_1.default.cyan(templateName) + "...");
cmd = "npm pack " + templateName + " --json";
child_process_1.execSync(cmd, { stdio: ['ignore', 'ignore', 'inherit'] });
extraPath = path_1.default.basename(packName, path_1.default.extname(packName));
return [4 /*yield*/, extraPack(packName, extraPath)];
case 2:
_a.sent();
pkg[templateName] = {
packName: packName,
path: extraPath,
};
utils_1.writeJSON('template.json', pkg);
return [2 /*return*/, getAbsolutePath(extraPath)];
case 3:
err_1 = _a.sent();
handleError(err_1);
return [2 /*return*/, ''];
case 4: return [2 /*return*/];
}
});
});
}
exports.default = getTemplate;