in packages/cli/src/utils/index.ts [134:160]
export async function downloadAndExtractTo(resUrl: string, targetDir: string): Promise<void> {
const { protocol, pathname } = url.parse(resUrl);
if (!protocol || !pathname) {
throw new TypeError('invalid url');
}
const filename = path.basename(pathname);
const extname = path.extname(filename);
if (protocol === 'file:') {
if (extname === '.zip') {
await this.unZipData(pathname, targetDir);
} else {
await fs.copy(pathname, targetDir);
}
} else if (protocol === 'http:' || protocol === 'https:') {
if (extname === '.zip') {
const tmpPath = path.join(constants.PIPCOOK_TMPDIR, this.generateId());
await this.downloadWithProgress(resUrl, tmpPath);
this.logger.start('extracting');
await this.unZipData(tmpPath, targetDir);
await fs.remove(tmpPath);
} else {
await this.downloadWithProgress(resUrl, targetDir);
}
} else {
throw new TypeError(`[${extname}] file format is not supported.`);
}
}