dragooncjw d7bdf8a078 feat: init flowgram.ai
Co-Authored-By: xiamidaxia <xiamidaxia@icloud.com>
2025-02-21 16:26:12 +08:00

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);