mirror of
https://gitee.com/ByteDance/flowgram.ai.git
synced 2025-07-07 17:43:29 +08:00
104 lines
3.3 KiB
TypeScript
104 lines
3.3 KiB
TypeScript
import path from 'path';
|
|
|
|
import { execSync } from 'child_process';
|
|
import inquirer from 'inquirer';
|
|
import fs from 'fs-extra';
|
|
import { Command } from 'commander';
|
|
import chalk from 'chalk';
|
|
import download from 'download';
|
|
import * as tar from 'tar';
|
|
|
|
const program = new Command();
|
|
|
|
const args = process.argv.slice(2);
|
|
|
|
program
|
|
.version('1.0.0')
|
|
.description('Create a demo project')
|
|
.action(async () => {
|
|
console.log(chalk.green('Welcome to @flowgram.ai/create-app CLI!'));
|
|
const latest = execSync('npm view @flowgram.ai/core version --tag=latest latest').toString().trim();
|
|
|
|
let folderName = ''
|
|
|
|
if (!args?.length) {
|
|
// 询问用户选择 demo 项目
|
|
const { repo } = await inquirer.prompt([
|
|
{
|
|
type: 'list',
|
|
name: 'repo',
|
|
message: 'Select a demo to create:',
|
|
choices: [
|
|
{ name: 'Fixed Layout Demo', value: 'demo-fixed-layout' },
|
|
{ name: 'Free Layout Demo', value: 'demo-free-layout' },
|
|
{ name: 'Fixed Layout Demo Simple', value: 'demo-fixed-layout-simple' },
|
|
{ name: 'Free Layout Demo Simple', value: 'demo-free-layout-simple' }
|
|
],
|
|
},
|
|
]);
|
|
|
|
folderName = repo;
|
|
} else {
|
|
if (['demo-fixed-layout', 'demo-free-layout', 'demo-fixed-layout-simple', 'demo-free-layout-simple'].includes(args[0])) {
|
|
folderName = args[0];
|
|
} else {
|
|
console.error('Invalid argument. Please run "npx create-app" to choose demo.');
|
|
return;
|
|
}
|
|
}
|
|
|
|
try {
|
|
const targetDir = path.join(process.cwd());
|
|
// 下载 npm 包的 tarball
|
|
const downloadPackage = async () => {
|
|
try {
|
|
// 从 npm registry 下载 tarball 文件
|
|
const tarballBuffer = await download(`https://registry.npmjs.org/@flowgram.ai/${folderName}/-/${folderName}-${latest}.tgz`);
|
|
|
|
// 确保目标文件夹存在
|
|
fs.ensureDirSync(targetDir);
|
|
|
|
// 创建一个临时文件名来保存 tarball 数据
|
|
const tempTarballPath = path.join(process.cwd(), `${folderName}.tgz`);
|
|
|
|
// 将下载的 tarball 写入临时文件
|
|
fs.writeFileSync(tempTarballPath, tarballBuffer);
|
|
|
|
// 解压 tarball 文件到目标文件夹
|
|
await tar.x({
|
|
file: tempTarballPath,
|
|
C: targetDir,
|
|
});
|
|
|
|
fs.renameSync(path.join(targetDir, 'package'), path.join(targetDir, folderName))
|
|
|
|
// 删除下载的 tarball 文件
|
|
fs.unlinkSync(tempTarballPath);
|
|
return true;
|
|
|
|
} catch (error) {
|
|
console.error(`Error downloading or extracting package: ${error}`);
|
|
return false;
|
|
}
|
|
};
|
|
const res = await downloadPackage();
|
|
if (res) {
|
|
// 克隆项目
|
|
console.log(chalk.green(`${folderName} Demo project created successfully!`));
|
|
|
|
console.log(chalk.yellow('Run the following commands to start:'));
|
|
console.log(chalk.cyan(` cd ${folderName}`));
|
|
console.log(chalk.cyan(' npm install'));
|
|
console.log(chalk.cyan(' npm start'));
|
|
} else {
|
|
console.log(chalk.red('Download failed'))
|
|
}
|
|
|
|
} catch (error) {
|
|
console.error('Error downloading repo:', error);
|
|
return;
|
|
}
|
|
});
|
|
|
|
program.parse(process.argv);
|