@tarojs/cli
Version: 
cli tool for taro
137 lines • 7.05 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 path = require("node:path");
const helper_1 = require("@tarojs/helper");
const AdmZip = require("adm-zip");
const axios_1 = require("axios");
const download = require("download-git-repo");
const ora = require("ora");
const util_1 = require("../util");
const constants_1 = require("./constants");
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;
    // 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.mkdirp(templateRootPath);
        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';
            const zipPath = path.join(tempPath, name + '.zip');
            const unZipPath = path.join(tempPath, name);
            axios_1.default.get(templateSource, { responseType: 'stream' })
                .then(response => {
                const ws = helper_1.fs.createWriteStream(zipPath);
                response.data.pipe(ws);
                ws.on('finish', () => {
                    // unzip
                    const zip = new AdmZip(zipPath);
                    zip.extractAllTo(unZipPath, true);
                    const files = (0, util_1.readDirWithFileTypes)(unZipPath).filter(file => !file.name.startsWith('.') && file.isDirectory && file.name !== '__MACOSX');
                    if (files.length !== 1) {
                        spinner.color = 'red';
                        spinner.fail(helper_1.chalk.red(`拉取远程模板仓库失败!\n${new Error('远程模板源组织格式错误')}`));
                        return resolve();
                    }
                    name = path.join(name, files[0].name);
                    spinner.color = 'green';
                    spinner.succeed(`${helper_1.chalk.grey('拉取远程模板仓库成功!')}`);
                    resolve();
                });
                ws.on('error', error => { throw error; });
            })
                .catch((error) => __awaiter(this, void 0, void 0, function* () {
                spinner.color = 'red';
                spinner.fail(helper_1.chalk.red(`拉取远程模板仓库失败!\n${error}`));
                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, constants_1.TEMPLATE_CREATOR);
                if (!helper_1.fs.existsSync(creatorFile))
                    return { name, value: name };
                const { name: displayName, platforms = '', desc = '', isPrivate = false, compiler } = require(creatorFile);
                if (isPrivate)
                    return null;
                return {
                    name: displayName || name,
                    value: name,
                    platforms,
                    compiler,
                    desc
                };
            }).filter(Boolean);
            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, value: name, desc: type === 'url' ? templateSource : '' };
            const creatorFile = path.join(templateRootPath, name, constants_1.TEMPLATE_CREATOR);
            if (helper_1.fs.existsSync(creatorFile)) {
                const { name: displayName, platforms = '', desc = '', compiler } = require(creatorFile);
                res = {
                    name: displayName || name,
                    value: name,
                    platforms,
                    compiler,
                    desc: desc || templateSource
                };
            }
            return Promise.resolve([res]);
        }
    }));
}
exports.default = fetchTemplate;
//# sourceMappingURL=fetchTemplate.js.map