@tarojs/cli
Version:
cli tool for taro
121 lines • 5.9 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
const helper_1 = require("@tarojs/helper");
const AdmZip = require("adm-zip");
const download = require("download-git-repo");
const ora = require("ora");
const path = require("path");
const request = require("request");
const util_1 = require("../util");
const init_1 = require("./init");
const TEMP_DOWNLOAD_FOLDER = 'taro-temp';
function fetchTemplate(templateSource, templateRootPath, clone) {
const type = (0, util_1.getTemplateSourceType)(templateSource);
const tempPath = path.join(templateRootPath, TEMP_DOWNLOAD_FOLDER);
let name;
let isFromUrl = false;
// eslint-disable-next-line no-async-promise-executor
return new Promise((resolve) => __awaiter(this, void 0, void 0, function* () {
// 下载文件的缓存目录
if (helper_1.fs.existsSync(tempPath))
yield helper_1.fs.remove(tempPath);
yield helper_1.fs.mkdir(tempPath);
const spinner = ora(`正在从 ${templateSource} 拉取远程模板...`).start();
if (type === 'git') {
name = path.basename(templateSource);
download(templateSource, path.join(tempPath, name), { clone }, (error) => __awaiter(this, void 0, void 0, function* () {
if (error) {
console.log(error);
spinner.color = 'red';
spinner.fail(helper_1.chalk.red('拉取远程模板仓库失败!'));
yield helper_1.fs.remove(tempPath);
return resolve();
}
spinner.color = 'green';
spinner.succeed(`${helper_1.chalk.grey('拉取远程模板仓库成功!')}`);
resolve();
}));
}
else if (type === 'url') {
// url 模板源,因为不知道来源名称,临时取名方便后续开发者从列表中选择
name = 'from-remote-url';
isFromUrl = true;
const zipPath = path.join(tempPath, name + '.zip');
request
.get(templateSource)
.pipe(helper_1.fs.createWriteStream(zipPath))
.on('close', () => {
// unzip
const zip = new AdmZip(zipPath);
zip.extractAllTo(path.join(tempPath, name), true);
spinner.color = 'green';
spinner.succeed(`${helper_1.chalk.grey('拉取远程模板仓库成功!')}`);
resolve();
})
.on('error', (err) => __awaiter(this, void 0, void 0, function* () {
spinner.color = 'red';
spinner.fail(helper_1.chalk.red(`拉取远程模板仓库失败!\n${err}`));
yield helper_1.fs.remove(tempPath);
return resolve();
}));
}
})).then(() => __awaiter(this, void 0, void 0, function* () {
const templateFolder = name ? path.join(tempPath, name) : '';
// 下载失败,只显示默认模板
if (!helper_1.fs.existsSync(templateFolder))
return Promise.resolve([]);
const isTemplateGroup = !(helper_1.fs.existsSync(path.join(templateFolder, 'package.json')) ||
helper_1.fs.existsSync(path.join(templateFolder, 'package.json.tmpl')));
if (isTemplateGroup) {
// 模板组
const files = (0, util_1.readDirWithFileTypes)(templateFolder)
.filter(file => !file.name.startsWith('.') && file.isDirectory && file.name !== '__MACOSX')
.map(file => file.name);
yield Promise.all(files.map(file => {
const src = path.join(templateFolder, file);
const dest = path.join(templateRootPath, file);
return helper_1.fs.move(src, dest, { overwrite: true });
}));
yield helper_1.fs.remove(tempPath);
const res = files.map(name => {
const creatorFile = path.join(templateRootPath, name, init_1.TEMPLATE_CREATOR);
if (!helper_1.fs.existsSync(creatorFile))
return { name };
const { platforms = '', desc = '' } = require(creatorFile);
return {
name,
platforms,
desc
};
});
return Promise.resolve(res);
}
else {
// 单模板
yield helper_1.fs.move(templateFolder, path.join(templateRootPath, name), { overwrite: true });
yield helper_1.fs.remove(tempPath);
let res = { name, desc: isFromUrl ? templateSource : '' };
const creatorFile = path.join(templateRootPath, name, init_1.TEMPLATE_CREATOR);
if (helper_1.fs.existsSync(creatorFile)) {
const { platforms = '', desc = '' } = require(creatorFile);
res = {
name,
platforms,
desc: desc || templateSource
};
}
return Promise.resolve([res]);
}
}));
}
exports.default = fetchTemplate;
//# sourceMappingURL=fetchTemplate.js.map