@reliverse/rse
Version:
@reliverse/rse is your all-in-one companion for bootstrapping and improving any kind of projects (especially web apps built with frameworks like Next.js) — whether you're kicking off something new or upgrading an existing app. It is also a little AI-power
118 lines (117 loc) • 3.5 kB
JavaScript
import path from "@reliverse/pathkit";
import fs from "@reliverse/relifso";
import { relinka } from "@reliverse/relinka";
import {
defineCommand,
confirmPrompt,
selectPrompt,
inputPrompt
} from "@reliverse/rempts";
import { handleDownload } from "../../libs/sdk/utils/downloading/handleDownload.js";
export default defineCommand({
meta: {
name: "get",
description: "Download a repository using the rse downloader"
},
args: {
repo: {
type: "string",
description: "Repository identifier (e.g., owner/repo)",
required: false
},
dest: {
type: "string",
description: "Destination directory for the downloaded repository",
required: false
},
dev: {
type: "boolean",
description: "Run in development mode (places project in tests-runtime folder)",
default: false
},
force: {
type: "boolean",
description: "Force overwrite if destination directory is not empty",
default: false
},
skipPrompts: {
type: "boolean",
description: "Skip interactive prompts",
default: false
},
install: {
type: "boolean",
description: "Install dependencies after download",
default: false
},
token: {
type: "string",
description: "GitHub token for private repositories",
required: false
},
cache: {
type: "boolean",
description: "Use cached version if available",
default: false
}
},
run: async ({ args }) => {
const cwd = process.cwd();
let selectedRepo = args.repo;
if (!selectedRepo && !args.skipPrompts) {
selectedRepo = await selectPrompt({
title: "Select a repository to download",
options: [
{ label: "rse/rse", value: "rse/rse" },
{ label: "rse/template", value: "rse/template" },
{ label: "Enter custom repository", value: "custom" }
]
});
if (selectedRepo === "custom") {
selectedRepo = await inputPrompt({
title: "Enter repository in owner/repo format"
});
}
}
if (!selectedRepo) {
relinka("error", "No repository specified. Aborting.");
process.exit(1);
}
const projectPath = args.dest ? path.resolve(cwd, args.dest) : path.resolve(cwd, "downloaded-repo");
if (await fs.pathExists(projectPath)) {
const files = await fs.readdir(projectPath);
if (files.length > 0 && !args.force && !args.skipPrompts) {
const overwrite = await confirmPrompt({
title: `Destination directory (${projectPath}) is not empty. Overwrite?`,
defaultValue: false
});
if (!overwrite) {
relinka("error", "Aborting download due to non-empty destination.");
process.exit(1);
}
}
}
try {
const result = await handleDownload({
cwd,
isDev: args.dev,
skipPrompts: args.skipPrompts,
projectPath,
projectName: path.basename(projectPath),
selectedRepo,
githubToken: args.token,
config: void 0,
// You may extend this to load a config if needed
preserveGit: true,
install: args.install,
isCustom: false,
isTemplateDownload: false,
cache: args.cache
});
relinka("success", `Repository successfully downloaded to ${result.dir}`);
} catch (error) {
relinka("error", "Download failed", String(error));
process.exit(1);
}
}
});