UNPKG

3.54 kBPlain TextView Raw
1import * as fs from 'fs-extra'
2import * as path from 'path'
3import * as ora from 'ora'
4import * as AdmZip from 'adm-zip'
5import * as download from 'download-git-repo'
6import * as request from 'request'
7import { chalk } from '@tarojs/helper'
8import { getTemplateSourceType, readDirWithFileTypes } from '../util'
9
10const TEMP_DOWNLOAD_FLODER = 'taro-temp'
11
12export default function fetchTemplate (templateSource: string, templateRootPath: string, clone?: boolean): Promise<any> {
13 const type = getTemplateSourceType(templateSource)
14 const tempPath = path.join(templateRootPath, TEMP_DOWNLOAD_FLODER)
15 let name: string
16
17 return new Promise(async (resolve, reject) => {
18 // 下载文件的缓存目录
19 if (fs.existsSync(tempPath)) await fs.remove(tempPath)
20 await fs.mkdir(tempPath)
21
22 const spinner = ora(`正在从 ${templateSource} 拉取远程模板...`).start()
23
24 if (type === 'git') {
25 name = path.basename(templateSource)
26 download(templateSource, path.join(tempPath, name), { clone }, async error => {
27 if (error) {
28 spinner.color = 'red'
29 spinner.fail(chalk.red('拉取远程模板仓库失败!'))
30 await fs.remove(tempPath)
31 return resolve()
32 }
33 spinner.color = 'green'
34 spinner.succeed(`${chalk.grey('拉取远程模板仓库成功!')}`)
35 resolve()
36 })
37 } else if (type === 'url') {
38 const zipPath = path.join(tempPath, 'temp.zip')
39 request
40 .get(templateSource)
41 .on('close', () => {
42 // unzip
43 const zip = new AdmZip(zipPath)
44 zip.extractAllTo(tempPath, true)
45 const files = readDirWithFileTypes(tempPath)
46 .filter(file => !file.name.startsWith('.') && file.isDirectory && file.name !== '__MACOSX')
47 if (files.length !== 1) {
48 spinner.color = 'red'
49 spinner.fail(chalk.red(`拉取远程模板仓库失败!\n${new Error('远程模板源组织格式错误')}`))
50 return resolve()
51 }
52
53 name = files[0].name
54 spinner.color = 'green'
55 spinner.succeed(`${chalk.grey('拉取远程模板仓库成功!')}`)
56 resolve()
57 })
58 .on('error', async err => {
59 spinner.color = 'red'
60 spinner.fail(chalk.red(`拉取远程模板仓库失败!\n${err}`))
61 await fs.remove(tempPath)
62 return resolve()
63 })
64 .pipe(fs.createWriteStream(zipPath))
65 }
66 })
67 .then(async () => {
68 const templateFloder = name ? path.join(tempPath, name) : ''
69
70 // 下载失败,只显示默认模板
71 if (!fs.existsSync(templateFloder)) return Promise.resolve([])
72
73 const isTemplateGroup = !fs.existsSync(path.join(templateFloder, 'package.json'))
74
75 if (isTemplateGroup) {
76 // 模板组
77 const files = readDirWithFileTypes(templateFloder)
78 .filter(file => !file.name.startsWith('.') && file.isDirectory && file.name !== '__MACOSX')
79 .map(file => file.name)
80 await Promise.all(files.map(file => {
81 const src = path.join(templateFloder, file)
82 const dest = path.join(templateRootPath, file)
83 return fs.move(src, dest, { overwrite: true })
84 }))
85 await fs.remove(tempPath)
86 return Promise.resolve(files)
87 } else {
88 // 单模板
89 await fs.move(templateFloder, path.join(templateRootPath, name), { overwrite: true })
90 await fs.remove(tempPath)
91 return Promise.resolve([name])
92 }
93 })
94}