UNPKG

@vxrn/takeout-cli

Version:

CLI tools for Takeout starter kit - interactive onboarding and project setup

138 lines (137 loc) 7.29 kB
import { defineCommand } from "citty"; import { execSync } from "node:child_process"; import { copyEnvFile, createEnvLocal, envFileExists, generateSecret, updateEnvVariable } from "../utils/env.native.js"; import { markOnboarded, updateAppConfig, updatePackageJson } from "../utils/files.native.js"; import { checkAllPorts, getConflictingPorts } from "../utils/ports.native.js"; import { checkAllPrerequisites, hasRequiredPrerequisites } from "../utils/prerequisites.native.js"; import { confirmContinue, displayOutro, displayPortConflicts, displayPrerequisites, displayWelcome, promptText, showError, showInfo, showSpinner, showStep, showSuccess, showWarning } from "../utils/prompts.native.js"; var onboardCommand = defineCommand({ meta: { name: "onboard", description: "Interactive onboarding for Takeout starter kit" }, args: { skip: { type: "boolean", description: "Skip interactive prompts", default: !1 } }, async run(param) { var { args } = param, cwd = process.cwd(); if (args.skip) { showInfo("Skipping onboarding (--skip flag)"); return; } displayWelcome(), showStep("Checking prerequisites..."), console.info(); var checks = checkAllPrerequisites(); displayPrerequisites(checks); var hasRequired = hasRequiredPrerequisites(checks); if (!hasRequired) { showWarning("Some required prerequisites are missing. You can continue, but setup may fail."); var shouldContinue = await confirmContinue("Continue anyway?", !1); if (!shouldContinue) { displayOutro("Setup cancelled. Install prerequisites and try again."); return; } } console.info(), showStep("Setting up environment files..."), console.info(); var hasEnv = envFileExists(cwd, ".env"); if (hasEnv) { showInfo(".env file already exists"); var shouldReconfigure = await confirmContinue("Reconfigure environment?", !1); shouldReconfigure ? await setupEnvironment(cwd) : showInfo("Skipping environment setup"); } else await setupEnvironment(cwd); console.info(), showStep("Configuring project identity..."), console.info(); var shouldCustomize = await confirmContinue("Customize project name and bundle identifier?", !1); shouldCustomize ? await customizeProject(cwd) : showInfo("Keeping default project configuration"), console.info(), showStep("Starting development services..."), console.info(); var portChecks = checkAllPorts(), conflicts = getConflictingPorts(portChecks); conflicts.length > 0 && (displayPortConflicts(conflicts), showWarning("Some ports are already in use. You may need to stop other services.")); var shouldStartServices = await confirmContinue("Start Docker services (PostgreSQL, Zero, MinIO)?", !0); shouldStartServices ? await startServices(cwd) : (showInfo("Skipping service startup"), showInfo("Run 'bun backend' to start services later")), console.info(), showStep("Setup complete!"), console.info(), showSuccess("\u2713 Environment configured"), showSuccess("\u2713 Project ready for development"), markOnboarded(cwd), console.info(), showInfo("Next steps:"), console.info(), console.info(" bun dev # Start development server"), console.info(" bun ios # Run iOS simulator"), console.info(" bun android # Run Android emulator"), console.info(), console.info("Documentation: /docs"), console.info(); var shouldStart = await confirmContinue("Start development server now?", !0); if (shouldStart) { console.info(), showInfo("Starting development server..."), console.info(); try { execSync("bun dev", { stdio: "inherit", cwd }); } catch { showInfo("Development server stopped"); } } displayOutro("Happy coding! \u{1F680}"); } }); async function setupEnvironment(cwd) { var copyResult = copyEnvFile(cwd, ".env.development", ".env"); if (!copyResult.success) { showError(`Failed to create .env: ${copyResult.error}`); return; } showSuccess("Created .env from .env.development"); var useExisting = await confirmContinue("Use existing BETTER_AUTH_SECRET from .env.development?", !0); if (!useExisting) { var secret = generateSecret(); updateEnvVariable(cwd, "BETTER_AUTH_SECRET", secret), showSuccess("Generated new BETTER_AUTH_SECRET"); } var setupGithub = await confirmContinue("Set up GitHub OAuth?", !1); if (setupGithub) { var clientId = await promptText("GitHub Client ID:", void 0, "Iv23liNaYfNSauaySodL"); clientId && updateEnvVariable(cwd, "ONECHAT_GITHUB_CLIENT_ID", clientId); var clientSecret = await promptText("GitHub Client Secret (optional):", void 0, "Leave empty to skip"); clientSecret && updateEnvVariable(cwd, "ONECHAT_GITHUB_CLIENT_SECRET", clientSecret); } createEnvLocal(cwd), showSuccess("Created .env.local for personal overrides"); } async function customizeProject(cwd) { var projectName = await promptText("Project name:", "takeout", "my-awesome-app"), slug = await promptText("Project slug (URL-friendly):", projectName.toLowerCase().replace(/\s+/g, "-"), "my-awesome-app"), bundleId = await promptText("Bundle identifier:", `com.${slug}.app`, "com.example.app"), domain = await promptText("Development domain:", "localhost:8081", "localhost:8081"), pkgResult = updatePackageJson(cwd, { name: projectName, description: `${projectName} - Built with Takeout starter kit` }); pkgResult.success ? showSuccess("Updated package.json") : showError(`Failed to update package.json: ${pkgResult.error}`); var configResult = updateAppConfig(cwd, { name: projectName, slug, bundleId }); configResult.success ? showSuccess("Updated app.config.ts") : showError(`Failed to update app.config.ts: ${configResult.error}`); var serverUrl = `http://${domain}`; updateEnvVariable(cwd, "BETTER_AUTH_URL", serverUrl), updateEnvVariable(cwd, "ONE_SERVER_URL", serverUrl), showSuccess("Updated environment URLs"); } async function startServices(cwd) { var spinner = showSpinner("Starting Docker services..."); try { execSync("bun backend", { stdio: "ignore", cwd }), await new Promise(function (resolve) { return setTimeout(resolve, 3e3); }), spinner.stop("Docker services started"), showSuccess("\u2713 PostgreSQL running on port 5432"), showSuccess("\u2713 Zero sync running on port 4848"), showSuccess("\u2713 MinIO (S3) running on port 9090"); var shouldMigrate = await confirmContinue("Run database migrations?", !0); if (shouldMigrate) { var migrateSpinner = showSpinner("Running migrations..."); try { execSync("bun migrate", { stdio: "ignore", cwd }), migrateSpinner.stop("Database migrated"), showSuccess("\u2713 Database migrations complete"); } catch { migrateSpinner.stop("Migration failed"), showError("Failed to run migrations"), showInfo("Try running 'bun migrate' manually"); } } } catch (error) { spinner.stop("Failed to start services"), showError(error instanceof Error ? error.message : "Unknown error"), showInfo("Try running 'bun backend' manually"); } } export { onboardCommand }; //# sourceMappingURL=onboard.native.js.map