UNPKG

@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

180 lines (179 loc) 4.8 kB
import { detectProjectsWithRseConfig } from "@reliverse/cfg"; import path from "@reliverse/pathkit"; import { re } from "@reliverse/relico"; import fs from "@reliverse/relifso"; import { relinka } from "@reliverse/relinka"; import { selectPrompt } from "@reliverse/rempts"; import { handleOpenProjectMenu } from "../../app/init/impl/mm-deprecated/editor-menu.js"; import { endTitle, UNKNOWN_VALUE } from "../../libs/sdk/constants.js"; import { getRandomMessage } from "../../libs/sdk/db/messages.js"; import { createMobileProject } from "../../libs/sdk/init/use-template/cp-mod.js"; import { optionCreateBrowserExtension, optionCreateVSCodeExtension, optionCreateWebProject } from "../../libs/sdk/providers/reliverse-stack/rs-impl.js"; import { experimental } from "../../libs/sdk/utils/badgeNotifiers.js"; async function handleProjectCategory(params) { const { cwd, isDev, memory, config, mrse, skipPrompts } = params; let projectCategory = config.projectCategory; if (projectCategory === UNKNOWN_VALUE) { const selectedType = await selectPrompt({ endTitle, title: getRandomMessage("initial"), options: [ { label: "Web Application", value: "website", hint: re.dim("Create a website with Next.js") }, { label: "Mobile Application", value: "mobile", hint: experimental }, { label: "VS Code Extension", value: "vscode", hint: experimental }, { label: "Browser Extension", value: "browser", hint: experimental }, { label: "CLI Project", value: "cli", hint: experimental }, { separator: true }, { label: re.italic( re.dim("More types of projects and frameworks coming soon \u{1F9BE}") ), value: UNKNOWN_VALUE, disabled: true } ] }); projectCategory = selectedType; } if (projectCategory === "vscode") { await optionCreateVSCodeExtension( params.projectName, cwd, isDev, memory, config, skipPrompts ); } else if (projectCategory === "browser") { await optionCreateBrowserExtension( params.projectName, cwd, isDev, memory, config, skipPrompts ); } else if (projectCategory === "mobile") { await optionCreateMobileProject( params.projectName, cwd, isDev, memory, config, skipPrompts ); } else { await optionCreateWebProject( params.projectName, cwd, isDev, memory, config, false, mrse, skipPrompts ); } } async function optionCreateMobileProject(projectName, cwd, isDev, memory, config, skipPrompts) { const mobileFramework = await selectPrompt({ endTitle, title: "Which mobile framework would you like to use?", options: [ { label: "Lynx", value: "lynx", hint: re.dim("iOS \u2022 Android \u2022 Web") }, { label: "React Native", value: "react-native", hint: re.dim("iOS \u2022 Android \u2022 Web \u2022 macOS \u2022 Windows") } ] }); let selectedRepo; if (mobileFramework === "react-native") { selectedRepo = "blefnk/relivator-react-native-template"; } else if (mobileFramework === "lynx") { selectedRepo = "blefnk/relivator-lynxjs-template"; } else { relinka("error", "Invalid mobile framework selected"); return; } await createMobileProject({ projectName, initialProjectName: projectName, selectedRepo, message: `Setting up ${mobileFramework} project...`, isDev, config, memory, cwd, skipPrompts }); } export async function showNewProjectMenu(params) { const { cwd, isDev, memory, config, mrse, skipPrompts, projectName } = params; const isMultiConfig = mrse.length > 0; if (isMultiConfig) { relinka( "info", "Continuing with the multi-config mode (currently only web projects are supported)..." ); await optionCreateWebProject( projectName, cwd, isDev, memory, config, isMultiConfig, mrse, skipPrompts ); } else { await handleProjectCategory(params); } } export async function showOpenProjectMenu(params) { const { cwd, isDev, memory, config } = params; const searchPath = isDev ? path.join(cwd, "tests-runtime") : cwd; if (await fs.pathExists(searchPath)) { const detectedProjects = await detectProjectsWithRseConfig( searchPath, isDev ); await handleOpenProjectMenu( detectedProjects, isDev, memory, cwd, true, config ); } }