@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
JavaScript
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
);
}
}