@reliverse/rse-sdk
Version:
@reliverse/rse-sdk without cli. @reliverse/rse-sdk allows you to create new plugins for @reliverse/rse CLI, interact with reliverse.org, and even extend your own CLI functionality (you may also try @reliverse/dler-sdk for this case).
63 lines (62 loc) • 2.14 kB
JavaScript
import { re } from "@reliverse/relico";
import fs from "@reliverse/relifso";
import { cancel, isCancel, text } from "@reliverse/rempts";
import path from "node:path";
import { DEFAULT_CONFIG } from "../constants.js";
import { ProjectNameSchema } from "../types.js";
function validateDirectoryName(name) {
if (name === ".") return void 0;
const result = ProjectNameSchema.safeParse(name);
if (!result.success) {
return result.error.issues[0]?.message || "Invalid project name";
}
return void 0;
}
export async function getProjectName(initialName) {
if (initialName) {
if (initialName === ".") {
return initialName;
}
const finalDirName = path.basename(initialName);
const validationError = validateDirectoryName(finalDirName);
if (!validationError) {
return initialName;
}
}
let isValid = false;
let projectPath = "";
let defaultName = DEFAULT_CONFIG.projectName;
let counter = 1;
while (fs.pathExistsSync(path.resolve(process.cwd(), defaultName)) && fs.readdirSync(path.resolve(process.cwd(), defaultName)).length > 0) {
defaultName = `${DEFAULT_CONFIG.projectName}-${counter}`;
counter++;
}
while (!isValid) {
const response = await text({
message: "Enter your project name or path (relative to current directory)",
placeholder: defaultName,
initialValue: initialName,
defaultValue: defaultName,
validate: (value) => {
const nameToUse = value.trim() || defaultName;
const finalDirName = path.basename(nameToUse);
const validationError = validateDirectoryName(finalDirName);
if (validationError) return validationError;
if (nameToUse !== ".") {
const projectDir = path.resolve(process.cwd(), nameToUse);
if (!projectDir.startsWith(process.cwd())) {
return "Project path must be within current directory";
}
}
return void 0;
}
});
if (isCancel(response)) {
cancel(re.red("Operation cancelled."));
process.exit(0);
}
projectPath = response || defaultName;
isValid = true;
}
return projectPath;
}