@revealui/cli 0.0.1-pre.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/LICENSE +22 -202
  2. package/README.md +86 -0
  3. package/bin/create-revealui.js +6 -0
  4. package/dist/cli.d.ts +14 -0
  5. package/dist/cli.js +1075 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/index.d.ts +11 -2
  8. package/dist/index.js +1071 -123
  9. package/dist/index.js.map +1 -0
  10. package/package.json +42 -44
  11. package/templates/minimal/.env.example +36 -0
  12. package/templates/minimal/_gitignore +26 -0
  13. package/templates/minimal/next.config.mjs +10 -0
  14. package/templates/minimal/package.json +34 -0
  15. package/templates/minimal/revealui.config.ts +18 -0
  16. package/templates/minimal/src/app/globals.css +15 -0
  17. package/templates/minimal/src/app/layout.tsx +15 -0
  18. package/templates/minimal/src/app/page.tsx +20 -0
  19. package/templates/minimal/tsconfig.json +11 -0
  20. package/dist/commands/add.d.ts +0 -28
  21. package/dist/commands/add.d.ts.map +0 -1
  22. package/dist/commands/add.js +0 -115
  23. package/dist/commands/check.d.ts +0 -7
  24. package/dist/commands/check.d.ts.map +0 -1
  25. package/dist/commands/check.js +0 -34
  26. package/dist/commands/doctor/checks/build.d.ts +0 -10
  27. package/dist/commands/doctor/checks/build.d.ts.map +0 -1
  28. package/dist/commands/doctor/checks/build.js +0 -74
  29. package/dist/commands/doctor/checks/config.d.ts +0 -14
  30. package/dist/commands/doctor/checks/config.d.ts.map +0 -1
  31. package/dist/commands/doctor/checks/config.js +0 -116
  32. package/dist/commands/doctor/checks/dependencies.d.ts +0 -14
  33. package/dist/commands/doctor/checks/dependencies.d.ts.map +0 -1
  34. package/dist/commands/doctor/checks/dependencies.js +0 -126
  35. package/dist/commands/doctor/checks/practices.d.ts +0 -14
  36. package/dist/commands/doctor/checks/practices.d.ts.map +0 -1
  37. package/dist/commands/doctor/checks/practices.js +0 -142
  38. package/dist/commands/doctor/checks/structure.d.ts +0 -14
  39. package/dist/commands/doctor/checks/structure.d.ts.map +0 -1
  40. package/dist/commands/doctor/checks/structure.js +0 -107
  41. package/dist/commands/doctor/fixes/index.d.ts +0 -26
  42. package/dist/commands/doctor/fixes/index.d.ts.map +0 -1
  43. package/dist/commands/doctor/fixes/index.js +0 -108
  44. package/dist/commands/doctor/index.d.ts +0 -11
  45. package/dist/commands/doctor/index.d.ts.map +0 -1
  46. package/dist/commands/doctor/index.js +0 -37
  47. package/dist/commands/doctor/print.d.ts +0 -6
  48. package/dist/commands/doctor/print.d.ts.map +0 -1
  49. package/dist/commands/doctor/print.js +0 -31
  50. package/dist/commands/doctor/types.d.ts +0 -16
  51. package/dist/commands/doctor/types.d.ts.map +0 -1
  52. package/dist/commands/doctor/types.js +0 -1
  53. package/dist/commands/fix.d.ts +0 -5
  54. package/dist/commands/fix.d.ts.map +0 -1
  55. package/dist/commands/fix.js +0 -129
  56. package/dist/commands/init.d.ts +0 -35
  57. package/dist/commands/init.d.ts.map +0 -1
  58. package/dist/commands/init.js +0 -104
  59. package/dist/commands/upgrade.d.ts +0 -9
  60. package/dist/commands/upgrade.d.ts.map +0 -1
  61. package/dist/commands/upgrade.js +0 -85
  62. package/dist/index.d.ts.map +0 -1
  63. package/dist/onLoad.d.ts +0 -3
  64. package/dist/onLoad.d.ts.map +0 -1
  65. package/dist/onLoad.js +0 -5
  66. package/dist/utils.d.ts +0 -3
  67. package/dist/utils.d.ts.map +0 -1
  68. package/dist/utils.js +0 -6
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../node_modules/.pnpm/tsup@8.5.1_@microsoft+api-extractor@7.56.2_@types+node@25.3.0__@swc+core@1.15.11_@swc+h_406b258ea3c313c6308725a34065a5eb/node_modules/tsup/assets/esm_shims.js","../src/validators/node-version.ts","../src/generators/devbox.ts","../src/generators/devcontainer.ts","../src/generators/readme.ts","../src/installers/dependencies.ts","../src/utils/git.ts","../src/commands/create.ts","../src/validators/credentials.ts","../src/prompts/database.ts","../src/prompts/devenv.ts","../src/prompts/payments.ts","../src/prompts/project.ts","../src/prompts/storage.ts","../src/index.ts","../src/cli.ts"],"sourcesContent":["// Shim globals in esm bundle\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n","/**\n * Node version validation\n */\n\nimport { createLogger } from '@revealui/setup/utils'\n\nconst logger = createLogger({ prefix: 'Setup' })\n\nconst REQUIRED_NODE_VERSION = '24.12.0'\n\nexport function validateNodeVersion(): boolean {\n const currentVersion = process.version.slice(1) // Remove 'v' prefix\n const [currentMajor, currentMinor] = currentVersion.split('.').map(Number)\n const [requiredMajor, requiredMinor] = REQUIRED_NODE_VERSION.split('.').map(Number)\n\n if (\n currentMajor < requiredMajor ||\n (currentMajor === requiredMajor && currentMinor < requiredMinor)\n ) {\n logger.error(\n `Node.js ${REQUIRED_NODE_VERSION} or higher is required. You have ${currentVersion}.`,\n )\n logger.info('Please upgrade Node.js: https://nodejs.org/')\n return false\n }\n\n return true\n}\n","/**\n * Devbox configuration generator\n */\n\nimport fs from 'node:fs/promises'\nimport path from 'node:path'\n\nexport async function generateDevbox(projectPath: string): Promise<void> {\n const devboxConfig = {\n packages: ['nodejs@24.12.0', 'pnpm@10.28.2', 'postgresql@16', 'stripe-cli@latest'],\n shell: {\n init_hook: [\n 'corepack enable',\n 'echo \"šŸš€ RevealUI Devbox shell ready!\"',\n 'echo \"Run: pnpm dev to start development\"',\n ],\n scripts: {\n dev: 'pnpm dev',\n setup: 'pnpm install && pnpm db:init',\n test: 'pnpm test',\n },\n },\n env: {\n NODE_ENV: 'development',\n },\n }\n\n await fs.writeFile(\n path.join(projectPath, 'devbox.json'),\n JSON.stringify(devboxConfig, null, 2),\n 'utf-8',\n )\n}\n","/**\n * Dev Container configuration generator\n */\n\nimport fs from 'node:fs/promises'\nimport path from 'node:path'\n\nexport async function generateDevContainer(projectPath: string): Promise<void> {\n const devcontainerDir = path.join(projectPath, '.devcontainer')\n await fs.mkdir(devcontainerDir, { recursive: true })\n\n // Create devcontainer.json\n const devcontainerConfig = {\n name: 'RevealUI Development',\n image: 'mcr.microsoft.com/devcontainers/typescript-node:24',\n features: {\n 'ghcr.io/devcontainers/features/common-utils:2': {\n installZsh: true,\n installOhMyZsh: true,\n },\n },\n forwardPorts: [3000, 4000, 5432],\n portsAttributes: {\n '3000': {\n label: 'Web App',\n onAutoForward: 'notify',\n },\n '4000': {\n label: 'CMS',\n onAutoForward: 'notify',\n },\n '5432': {\n label: 'PostgreSQL',\n onAutoForward: 'silent',\n },\n },\n postCreateCommand: 'corepack enable && pnpm install',\n customizations: {\n vscode: {\n extensions: [\n 'dbaeumer.vscode-eslint',\n 'biomejs.biome',\n 'bradlc.vscode-tailwindcss',\n 'Prisma.prisma',\n 'ms-azuretools.vscode-docker',\n 'streetsidesoftware.code-spell-checker',\n ],\n settings: {\n 'editor.defaultFormatter': 'biomejs.biome',\n 'editor.formatOnSave': true,\n 'editor.codeActionsOnSave': {\n 'quickfix.biome': 'explicit',\n 'source.organizeImports.biome': 'explicit',\n },\n },\n },\n },\n remoteUser: 'node',\n }\n\n await fs.writeFile(\n path.join(devcontainerDir, 'devcontainer.json'),\n JSON.stringify(devcontainerConfig, null, 2),\n 'utf-8',\n )\n\n // Create docker-compose.yml for services\n const dockerCompose = `version: '3.8'\n\nservices:\n app:\n build:\n context: ..\n dockerfile: .devcontainer/Dockerfile\n volumes:\n - ..:/workspace:cached\n command: sleep infinity\n network_mode: service:db\n\n db:\n image: pgvector/pgvector:pg16\n restart: unless-stopped\n environment:\n POSTGRES_USER: postgres\n POSTGRES_PASSWORD: postgres\n POSTGRES_DB: revealui\n volumes:\n - postgres-data:/var/lib/postgresql/data\n\nvolumes:\n postgres-data:\n`\n\n await fs.writeFile(path.join(devcontainerDir, 'docker-compose.yml'), dockerCompose, 'utf-8')\n\n // Create Dockerfile\n const dockerfile = `FROM mcr.microsoft.com/devcontainers/typescript-node:24\n\n# Install additional tools\nRUN apt-get update && export DEBIAN_FRONTEND=noninteractive \\\\\n && apt-get -y install --no-install-recommends postgresql-client\n\n# Enable pnpm\nRUN corepack enable\n`\n\n await fs.writeFile(path.join(devcontainerDir, 'Dockerfile'), dockerfile, 'utf-8')\n\n // Create README\n const readme = `# Dev Container Setup\n\nThis directory contains the Dev Container configuration for RevealUI.\n\n## Usage\n\n### VS Code\n\n1. Install the \"Dev Containers\" extension\n2. Open this folder in VS Code\n3. Press F1 and select \"Dev Containers: Reopen in Container\"\n\n### GitHub Codespaces\n\n1. Click the green \"Code\" button on GitHub\n2. Select \"Codespaces\" tab\n3. Click \"Create codespace on main\"\n\n## What's Included\n\n- Node.js 24.12.0\n- pnpm package manager\n- PostgreSQL 16 with pgvector\n- VS Code extensions:\n - ESLint\n - Biome\n - Tailwind CSS\n - Prisma\n - Docker\n - Code Spell Checker\n\n## Environment Variables\n\nEnvironment variables are loaded from \\`.env.development.local\\`.\nFor GitHub Codespaces, set secrets in your repository settings.\n\n## Ports\n\n- 3000: Web application\n- 4000: CMS\n- 5432: PostgreSQL database\n`\n\n await fs.writeFile(path.join(devcontainerDir, 'README.md'), readme, 'utf-8')\n}\n","/**\n * Project README generator\n */\n\nimport fs from 'node:fs/promises'\nimport path from 'node:path'\nimport type { ProjectConfig } from '../prompts/project.js'\n\nexport async function generateReadme(\n projectPath: string,\n projectConfig: ProjectConfig,\n): Promise<void> {\n const readme = `# ${projectConfig.projectName}\n\nA RevealUI project created with @revealui/cli.\n\n## Getting Started\n\nFirst, install dependencies:\n\n\\`\\`\\`bash\npnpm install\n\\`\\`\\`\n\nThen, initialize the database:\n\n\\`\\`\\`bash\npnpm db:init\npnpm db:migrate\n\\`\\`\\`\n\nRun the development server:\n\n\\`\\`\\`bash\npnpm dev\n\\`\\`\\`\n\nOpen [http://localhost:4000](http://localhost:4000) with your browser to access the CMS.\n\nThe web application runs on [http://localhost:3000](http://localhost:3000).\n\n## Development Environments\n\n### Standard Setup\n\nRequirements:\n- Node.js 24.12.0 or higher\n- pnpm 10.28.2 or higher\n- PostgreSQL 16\n\n### Dev Containers\n\nOpen in VS Code and select \"Reopen in Container\", or use GitHub Codespaces.\n\n### Devbox\n\nInstall Devbox:\n\n\\`\\`\\`bash\ncurl -fsSL https://get.jetpack.io/devbox | bash\n\\`\\`\\`\n\nThen start the Devbox shell:\n\n\\`\\`\\`bash\ndevbox shell\npnpm dev\n\\`\\`\\`\n\n## Project Structure\n\n\\`\\`\\`\n${projectConfig.projectName}/\nā”œā”€ā”€ apps/\n│ ā”œā”€ā”€ cms/ # CMS application\n│ └── web/ # Frontend application\nā”œā”€ā”€ packages/\n│ ā”œā”€ā”€ auth/ # Authentication\n│ ā”œā”€ā”€ db/ # Database\n│ └── ... # Other shared packages\nā”œā”€ā”€ .devcontainer/ # Dev Container configuration\nā”œā”€ā”€ devbox.json # Devbox configuration\n└── .env.development.local # Environment variables\n\\`\\`\\`\n\n## Available Scripts\n\n- \\`pnpm dev\\` - Start development servers\n- \\`pnpm build\\` - Build for production\n- \\`pnpm test\\` - Run tests\n- \\`pnpm lint\\` - Run linters\n- \\`pnpm typecheck\\` - Type check\n- \\`pnpm db:init\\` - Initialize database\n- \\`pnpm db:migrate\\` - Run migrations\n- \\`pnpm db:seed\\` - Seed database\n\n## Learn More\n\n- [RevealUI Documentation](https://github.com/your-org/RevealUI)\n- [Next.js Documentation](https://nextjs.org/docs)\n- [Hono Documentation](https://hono.dev)\n\n## Template\n\nThis project was created using the **${projectConfig.template}** template.\n\n## License\n\nMIT\n`\n\n await fs.writeFile(path.join(projectPath, 'README.md'), readme, 'utf-8')\n}\n","/**\n * Dependency installation\n */\n\nimport { createLogger } from '@revealui/setup/utils'\nimport { execa } from 'execa'\nimport ora from 'ora'\n\nconst logger = createLogger({ prefix: 'Install' })\n\nexport async function installDependencies(projectPath: string): Promise<void> {\n const spinner = ora('Installing dependencies with pnpm...').start()\n\n try {\n await execa('pnpm', ['install'], {\n cwd: projectPath,\n stdio: 'pipe',\n })\n spinner.succeed('Dependencies installed successfully')\n } catch (error) {\n spinner.fail('Failed to install dependencies')\n logger.error('Please run \"pnpm install\" manually')\n throw error\n }\n}\n\nexport async function isPnpmInstalled(): Promise<boolean> {\n try {\n await execa('pnpm', ['--version'])\n return true\n } catch {\n return false\n }\n}\n\nexport async function checkPnpmVersion(): Promise<{ version: string; valid: boolean }> {\n try {\n const { stdout } = await execa('pnpm', ['--version'])\n const version = stdout.trim()\n const [major, minor] = version.split('.').map(Number)\n\n // Require pnpm 10.28.2 or higher\n const valid = major > 10 || (major === 10 && minor >= 28)\n\n return { version, valid }\n } catch {\n return { version: 'unknown', valid: false }\n }\n}\n","/**\n * Git utilities for project initialization\n */\n\nimport { createLogger } from '@revealui/setup/utils'\nimport { execa } from 'execa'\n\nconst logger = createLogger({ prefix: 'Git' })\n\nexport async function initializeGitRepo(projectPath: string): Promise<void> {\n try {\n await execa('git', ['init'], { cwd: projectPath })\n logger.success('Initialized git repository')\n } catch (error) {\n logger.warn('Failed to initialize git repository')\n throw error\n }\n}\n\nexport async function createInitialCommit(projectPath: string): Promise<void> {\n try {\n await execa('git', ['add', '.'], { cwd: projectPath })\n await execa('git', ['commit', '-m', 'Initial commit from @revealui/cli'], { cwd: projectPath })\n logger.success('Created initial commit')\n } catch (error) {\n logger.warn('Failed to create initial commit')\n throw error\n }\n}\n\nexport async function isGitInstalled(): Promise<boolean> {\n try {\n await execa('git', ['--version'])\n return true\n } catch {\n return false\n }\n}\n","/**\n * Project creation command\n *\n * Copies template files, writes .env.local, installs dependencies,\n * and initialises a git repo.\n */\n\nimport crypto from 'node:crypto'\nimport fs from 'node:fs/promises'\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport { createLogger } from '@revealui/setup/utils'\nimport ora from 'ora'\nimport { generateDevbox } from '../generators/devbox.js'\nimport { generateDevContainer } from '../generators/devcontainer.js'\nimport { generateReadme } from '../generators/readme.js'\nimport { installDependencies, isPnpmInstalled } from '../installers/dependencies.js'\nimport type { DatabaseConfig } from '../prompts/database.js'\nimport type { DevEnvConfig } from '../prompts/devenv.js'\nimport type { PaymentConfig } from '../prompts/payments.js'\nimport type { ProjectConfig } from '../prompts/project.js'\nimport type { StorageConfig } from '../prompts/storage.js'\nimport { createInitialCommit, initializeGitRepo, isGitInstalled } from '../utils/git.js'\n\nconst logger = createLogger({ prefix: 'Create' })\n\nconst __filename = fileURLToPath(import.meta.url)\nconst __dirname = path.dirname(__filename)\n\n// Templates live next to the compiled output: packages/cli/templates/\nconst TEMPLATES_DIR = path.resolve(__dirname, '../../templates')\n\nexport interface CreateProjectConfig {\n project: ProjectConfig\n database: DatabaseConfig\n storage: StorageConfig\n payment: PaymentConfig\n devenv: DevEnvConfig\n skipGit?: boolean\n skipInstall?: boolean\n}\n\n/**\n * Build the .env.local content from user-provided config values.\n */\nfunction buildEnvLocal(cfg: CreateProjectConfig): string {\n const lines: string[] = [\n '# Generated by @revealui/cli — fill in the remaining placeholders before running `pnpm dev`',\n '',\n '# Core',\n `REVEALUI_SECRET=${generateSecret()}`,\n `REVEALUI_PUBLIC_SERVER_URL=http://localhost:4000`,\n `NEXT_PUBLIC_SERVER_URL=http://localhost:4000`,\n '',\n '# Database',\n ]\n\n if (cfg.database.postgresUrl) {\n lines.push(`POSTGRES_URL=${cfg.database.postgresUrl}`)\n } else {\n lines.push('POSTGRES_URL=postgresql://postgres:postgres@localhost:5432/revealui')\n }\n\n lines.push('', '# Storage (Vercel Blob)')\n if (cfg.storage.provider === 'vercel-blob' && cfg.storage.blobToken) {\n lines.push(`BLOB_READ_WRITE_TOKEN=${cfg.storage.blobToken}`)\n } else {\n lines.push('BLOB_READ_WRITE_TOKEN=vercel_blob_rw_placeholder')\n }\n\n lines.push('', '# Stripe')\n if (cfg.payment.enabled && cfg.payment.stripeSecretKey) {\n lines.push(`STRIPE_SECRET_KEY=${cfg.payment.stripeSecretKey}`)\n lines.push(`STRIPE_WEBHOOK_SECRET=${cfg.payment.stripeWebhookSecret || 'whsec_placeholder'}`)\n lines.push(\n `NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=${cfg.payment.stripePublishableKey || 'pk_test_placeholder'}`,\n )\n } else {\n lines.push('STRIPE_SECRET_KEY=sk_test_placeholder')\n lines.push('STRIPE_WEBHOOK_SECRET=whsec_placeholder')\n lines.push('NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=pk_test_placeholder')\n }\n\n lines.push('', '# Admin bootstrap (used on first run only)')\n lines.push('REVEALUI_ADMIN_EMAIL=admin@example.com')\n lines.push('REVEALUI_ADMIN_PASSWORD=changeme-min-12-chars')\n\n return `${lines.join('\\n')}\\n`\n}\n\n/** Generate a cryptographically random 48-char hex secret */\nfunction generateSecret(): string {\n return crypto.randomBytes(24).toString('hex')\n}\n\n/**\n * Copy a template directory recursively into the target path.\n */\nasync function copyTemplate(templateName: string, targetPath: string): Promise<void> {\n const templatePath = path.join(TEMPLATES_DIR, templateName)\n\n // Verify the template exists\n try {\n await fs.access(templatePath)\n } catch {\n throw new Error(\n `Template \"${templateName}\" not found at ${templatePath}. ` +\n `Available templates: minimal, basic-blog, e-commerce, portfolio`,\n )\n }\n\n await copyDir(templatePath, targetPath)\n}\n\nasync function copyDir(src: string, dest: string): Promise<void> {\n await fs.mkdir(dest, { recursive: true })\n const entries = await fs.readdir(src, { withFileTypes: true })\n\n for (const entry of entries) {\n const srcPath = path.join(src, entry.name)\n // npm always strips .gitignore from tarballs; we store it as _gitignore and rename on copy\n const destName = entry.name === '_gitignore' ? '.gitignore' : entry.name\n const destPath = path.join(dest, destName)\n\n if (entry.isDirectory()) {\n await copyDir(srcPath, destPath)\n } else {\n await fs.copyFile(srcPath, destPath)\n }\n }\n}\n\n/**\n * Map the CLI template name to the directory name under templates/.\n * All non-minimal templates fall back to minimal for now.\n */\nfunction resolveTemplateName(template: ProjectConfig['template']): string {\n const map: Record<ProjectConfig['template'], string> = {\n 'basic-blog': 'minimal',\n 'e-commerce': 'minimal',\n portfolio: 'minimal',\n }\n return map[template] ?? 'minimal'\n}\n\n/**\n * Main project creation function — wires everything together.\n */\nexport async function createProject(cfg: CreateProjectConfig): Promise<void> {\n const { project, skipGit = false, skipInstall = false } = cfg\n const { projectPath, projectName, template } = project\n\n // 1. Copy template files\n const spinner = ora(`Copying template \"${template}\"...`).start()\n try {\n await copyTemplate(resolveTemplateName(template), projectPath)\n spinner.succeed('Template files copied')\n } catch (err) {\n spinner.fail('Failed to copy template files')\n throw err\n }\n\n // 2. Replace {{PROJECT_NAME}} placeholders in package.json / other files\n const pkgJsonPath = path.join(projectPath, 'package.json')\n try {\n const raw = await fs.readFile(pkgJsonPath, 'utf-8')\n await fs.writeFile(pkgJsonPath, raw.replaceAll('{{PROJECT_NAME}}', projectName), 'utf-8')\n } catch {\n // package.json placeholder replacement is best-effort\n }\n\n // 3. Write .env.local\n const envSpinner = ora('Writing .env.local...').start()\n try {\n await fs.writeFile(path.join(projectPath, '.env.local'), buildEnvLocal(cfg), 'utf-8')\n envSpinner.succeed('.env.local written')\n } catch (err) {\n envSpinner.fail('Failed to write .env.local')\n throw err\n }\n\n // 4. Generate README\n await generateReadme(projectPath, project)\n logger.success('README.md generated')\n\n // 4b. Generate dev environment configs\n if (cfg.devenv.createDevContainer) {\n await generateDevContainer(projectPath)\n logger.success('.devcontainer/ generated')\n }\n if (cfg.devenv.createDevbox) {\n await generateDevbox(projectPath)\n logger.success('devbox.json generated')\n }\n\n // 5. Install dependencies\n if (!skipInstall) {\n const pnpmOk = await isPnpmInstalled()\n if (!pnpmOk) {\n logger.warn('pnpm not found — skipping dependency installation. Run `pnpm install` manually.')\n } else {\n await installDependencies(projectPath)\n }\n } else {\n logger.info('Skipping dependency installation (--skip-install)')\n }\n\n // 6. Git init\n if (!skipGit) {\n const gitOk = await isGitInstalled()\n if (!gitOk) {\n logger.warn('git not found — skipping repository initialisation.')\n } else {\n await initializeGitRepo(projectPath)\n await createInitialCommit(projectPath)\n }\n } else {\n logger.info('Skipping git initialisation (--skip-git)')\n }\n}\n","/**\n * API credential validation\n */\n\nimport { createLogger } from '@revealui/setup/utils'\n\nconst logger = createLogger({ prefix: 'Validator' })\n\nexport interface CredentialValidation {\n valid: boolean\n message?: string\n}\n\nexport async function validateStripeKey(key: string): Promise<CredentialValidation> {\n if (!(key.startsWith('sk_test_') || key.startsWith('sk_live_'))) {\n return {\n valid: false,\n message: 'Stripe key must start with sk_test_ or sk_live_',\n }\n }\n // Basic validation - full validation would require API call\n return { valid: true }\n}\n\nexport async function validateNeonUrl(url: string): Promise<CredentialValidation> {\n try {\n const parsed = new URL(url)\n if (!parsed.protocol.startsWith('postgres')) {\n return {\n valid: false,\n message: 'Database URL must use postgres:// or postgresql:// protocol',\n }\n }\n return { valid: true }\n } catch {\n return {\n valid: false,\n message: 'Invalid database URL format',\n }\n }\n}\n\nexport async function validateVercelToken(token: string): Promise<CredentialValidation> {\n if (!token || token.length < 20) {\n return {\n valid: false,\n message: 'Vercel token appears invalid (too short)',\n }\n }\n return { valid: true }\n}\n\nexport async function validateSupabaseUrl(url: string): Promise<CredentialValidation> {\n try {\n const parsed = new URL(url)\n if (!parsed.hostname.includes('supabase')) {\n logger.warn('URL does not appear to be a Supabase URL')\n }\n return { valid: true }\n } catch {\n return {\n valid: false,\n message: 'Invalid Supabase URL format',\n }\n }\n}\n\nexport async function validateOpenAIKey(key: string): Promise<CredentialValidation> {\n if (!key.startsWith('sk-')) {\n return {\n valid: false,\n message: 'OpenAI key must start with sk-',\n }\n }\n return { valid: true }\n}\n","/**\n * Database configuration prompts\n */\n\nimport inquirer from 'inquirer'\nimport { validateNeonUrl } from '../validators/credentials.js'\n\nexport interface DatabaseConfig {\n provider: 'neon' | 'supabase' | 'local' | 'skip'\n postgresUrl?: string\n}\n\nexport async function promptDatabaseConfig(): Promise<DatabaseConfig> {\n const { provider } = await inquirer.prompt([\n {\n type: 'list',\n name: 'provider',\n message: 'Which database provider would you like to use?',\n choices: [\n {\n name: 'NeonDB - Serverless PostgreSQL (recommended)',\n value: 'neon',\n },\n {\n name: 'Supabase - PostgreSQL with built-in features',\n value: 'supabase',\n },\n {\n name: 'Local PostgreSQL - Use existing local database',\n value: 'local',\n },\n {\n name: 'Skip - Configure later',\n value: 'skip',\n },\n ],\n default: 'neon',\n },\n ])\n\n if (provider === 'skip') {\n return { provider: 'skip' }\n }\n\n if (provider === 'local') {\n const { postgresUrl } = await inquirer.prompt([\n {\n type: 'input',\n name: 'postgresUrl',\n message: 'Enter your PostgreSQL connection string:',\n default: 'postgresql://postgres:postgres@localhost:5432/revealui',\n validate: async (input: string) => {\n const result = await validateNeonUrl(input)\n return result.valid ? true : result.message || 'Invalid database URL'\n },\n },\n ])\n return { provider: 'local', postgresUrl }\n }\n\n // For Neon or Supabase, get the connection string\n const { postgresUrl } = await inquirer.prompt([\n {\n type: 'input',\n name: 'postgresUrl',\n message: `Enter your ${provider === 'neon' ? 'Neon' : 'Supabase'} database connection string:`,\n validate: async (input: string) => {\n if (!input || input.trim() === '') {\n return 'Database URL is required'\n }\n const result = await validateNeonUrl(input)\n return result.valid ? true : result.message || 'Invalid database URL'\n },\n },\n ])\n\n return { provider, postgresUrl }\n}\n","/**\n * Development environment configuration prompts\n */\n\nimport inquirer from 'inquirer'\n\nexport interface DevEnvConfig {\n createDevContainer: boolean\n createDevbox: boolean\n}\n\nexport async function promptDevEnvConfig(): Promise<DevEnvConfig> {\n const answers = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'createDevContainer',\n message: 'Create Dev Container configuration for VS Code / GitHub Codespaces?',\n default: true,\n },\n {\n type: 'confirm',\n name: 'createDevbox',\n message: 'Create Devbox configuration for Nix-powered development?',\n default: true,\n },\n ])\n\n return answers\n}\n","/**\n * Payment configuration prompts\n */\n\nimport inquirer from 'inquirer'\nimport { validateStripeKey } from '../validators/credentials.js'\n\nexport interface PaymentConfig {\n enabled: boolean\n stripeSecretKey?: string\n stripePublishableKey?: string\n stripeWebhookSecret?: string\n}\n\nexport async function promptPaymentConfig(): Promise<PaymentConfig> {\n const { enabled } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'enabled',\n message: 'Do you want to configure Stripe payments?',\n default: true,\n },\n ])\n\n if (!enabled) {\n return { enabled: false }\n }\n\n const answers = await inquirer.prompt([\n {\n type: 'input',\n name: 'stripeSecretKey',\n message: 'Enter your Stripe secret key (sk_test_... or sk_live_...):',\n validate: async (input: string) => {\n if (!input || input.trim() === '') {\n return 'Stripe secret key is required'\n }\n const result = await validateStripeKey(input)\n return result.valid ? true : result.message || 'Invalid Stripe key'\n },\n },\n {\n type: 'input',\n name: 'stripePublishableKey',\n message: 'Enter your Stripe publishable key (pk_test_... or pk_live_...):',\n validate: (input: string) => {\n if (!input || input.trim() === '') {\n return 'Stripe publishable key is required'\n }\n if (!(input.startsWith('pk_test_') || input.startsWith('pk_live_'))) {\n return 'Stripe publishable key must start with pk_test_ or pk_live_'\n }\n return true\n },\n },\n {\n type: 'input',\n name: 'stripeWebhookSecret',\n message: 'Enter your Stripe webhook secret (whsec_..., optional - press Enter to skip):',\n default: '',\n },\n ])\n\n return {\n enabled: true,\n stripeSecretKey: answers.stripeSecretKey,\n stripePublishableKey: answers.stripePublishableKey,\n stripeWebhookSecret: answers.stripeWebhookSecret || undefined,\n }\n}\n","/**\n * Project configuration prompts\n */\n\nimport fs from 'node:fs'\nimport path from 'node:path'\nimport inquirer from 'inquirer'\n\nexport interface ProjectConfig {\n projectName: string\n projectPath: string\n template: 'basic-blog' | 'e-commerce' | 'portfolio'\n}\n\nexport async function promptProjectConfig(defaultName?: string): Promise<ProjectConfig> {\n const answers = await inquirer.prompt([\n {\n type: 'input',\n name: 'projectName',\n message: 'What is your project name?',\n default: defaultName || 'my-revealui-project',\n validate: (input: string) => {\n if (!/^[a-z0-9-]+$/.test(input)) {\n return 'Project name must contain only lowercase letters, numbers, and hyphens'\n }\n const projectPath = path.resolve(process.cwd(), input)\n if (fs.existsSync(projectPath)) {\n return `Directory \"${input}\" already exists`\n }\n return true\n },\n },\n {\n type: 'list',\n name: 'template',\n message: 'Which template would you like to use?',\n choices: [\n {\n name: 'Basic Blog - A simple blog with posts and pages',\n value: 'basic-blog',\n },\n {\n name: 'E-commerce - Product catalog with checkout',\n value: 'e-commerce',\n },\n {\n name: 'Portfolio - Personal portfolio site',\n value: 'portfolio',\n },\n ],\n default: 'basic-blog',\n },\n ])\n\n return {\n projectName: answers.projectName,\n projectPath: path.resolve(process.cwd(), answers.projectName),\n template: answers.template,\n }\n}\n","/**\n * Storage configuration prompts\n */\n\nimport inquirer from 'inquirer'\nimport { validateSupabaseUrl, validateVercelToken } from '../validators/credentials.js'\n\nexport interface StorageConfig {\n provider: 'vercel-blob' | 'supabase' | 'skip'\n blobToken?: string\n supabaseUrl?: string\n supabaseAnonKey?: string\n}\n\nexport async function promptStorageConfig(): Promise<StorageConfig> {\n const { provider } = await inquirer.prompt([\n {\n type: 'list',\n name: 'provider',\n message: 'Which storage provider would you like to use?',\n choices: [\n {\n name: 'Vercel Blob - Simple object storage (recommended)',\n value: 'vercel-blob',\n },\n {\n name: 'Supabase Storage - Integrated with Supabase',\n value: 'supabase',\n },\n {\n name: 'Skip - Configure later',\n value: 'skip',\n },\n ],\n default: 'vercel-blob',\n },\n ])\n\n if (provider === 'skip') {\n return { provider: 'skip' }\n }\n\n if (provider === 'vercel-blob') {\n const { blobToken } = await inquirer.prompt([\n {\n type: 'input',\n name: 'blobToken',\n message: 'Enter your Vercel Blob read/write token:',\n validate: async (input: string) => {\n if (!input || input.trim() === '') {\n return 'Blob token is required'\n }\n const result = await validateVercelToken(input)\n return result.valid ? true : result.message || 'Invalid token'\n },\n },\n ])\n return { provider: 'vercel-blob', blobToken }\n }\n\n // Supabase storage\n const answers = await inquirer.prompt([\n {\n type: 'input',\n name: 'supabaseUrl',\n message: 'Enter your Supabase project URL:',\n validate: async (input: string) => {\n if (!input || input.trim() === '') {\n return 'Supabase URL is required'\n }\n const result = await validateSupabaseUrl(input)\n return result.valid ? true : result.message || 'Invalid URL'\n },\n },\n {\n type: 'input',\n name: 'supabaseAnonKey',\n message: 'Enter your Supabase anonymous key:',\n validate: (input: string) => {\n if (!input || input.trim() === '') {\n return 'Supabase anonymous key is required'\n }\n return true\n },\n },\n ])\n\n return {\n provider: 'supabase',\n supabaseUrl: answers.supabaseUrl,\n supabaseAnonKey: answers.supabaseAnonKey,\n }\n}\n","#!/usr/bin/env node\n\n/**\n * @revealui/cli - Main orchestrator\n */\n\nimport { readFileSync } from 'node:fs'\nimport { homedir } from 'node:os'\nimport { join } from 'node:path'\nimport { createLogger } from '@revealui/setup/utils'\nimport { type CliOptions, createCli } from './cli.js'\nimport { validateNodeVersion } from './validators/node-version.js'\n\nconst logger = createLogger({ prefix: '@revealui/cli' })\n\nimport { createProject } from './commands/create.js'\nimport { promptDatabaseConfig } from './prompts/database.js'\nimport { promptDevEnvConfig } from './prompts/devenv.js'\nimport { promptPaymentConfig } from './prompts/payments.js'\nimport { promptProjectConfig } from './prompts/project.js'\nimport { promptStorageConfig } from './prompts/storage.js'\n\n/** Templates that require a Pro or Enterprise license. */\nconst PRO_TEMPLATES = new Set<string>(['e-commerce', 'portfolio'])\n\n/**\n * Lightweight Pro license check for the CLI.\n *\n * Reads REVEALUI_LICENSE_KEY env var or ~/.revealui/license.json.\n * Decodes the JWT payload without signature verification (server validates on use).\n * Returns true if the license tier is 'pro' or 'enterprise'.\n */\nfunction checkProLicense(): boolean {\n let key: string | undefined = process.env.REVEALUI_LICENSE_KEY\n\n if (!key) {\n try {\n const licenseFile = join(homedir(), '.revealui', 'license.json')\n const parsed = JSON.parse(readFileSync(licenseFile, 'utf8')) as { key?: string }\n key = parsed.key\n } catch {\n // No license file — free tier\n }\n }\n\n if (!key) return false\n\n try {\n const parts = key.split('.')\n if (parts.length < 2) return false\n const payload = JSON.parse(Buffer.from(parts[1] ?? '', 'base64').toString('utf8')) as {\n tier?: string\n }\n const tier = payload.tier ?? 'free'\n return tier === 'pro' || tier === 'enterprise'\n } catch {\n return false\n }\n}\n\nexport async function run(projectName: string | undefined, _options: CliOptions): Promise<void> {\n try {\n // Step 1: Validate Node version\n logger.info('[1/8] Validating Node.js version...')\n if (!validateNodeVersion()) {\n process.exit(1)\n }\n logger.success(`Node.js version: ${process.version}`)\n\n // Step 2: Collect project configuration\n logger.info('[2/8] Configure your project')\n const projectConfig = await promptProjectConfig(projectName)\n logger.success(`Project: ${projectConfig.projectName}`)\n logger.success(`Template: ${projectConfig.template}`)\n\n // Step 2b: License check for Pro templates\n if (PRO_TEMPLATES.has(projectConfig.template)) {\n if (!checkProLicense()) {\n logger.error(`The \"${projectConfig.template}\" template requires a RevealUI Pro license.`)\n logger.info('Get Pro at https://revealui.com/pricing')\n logger.info('Set your license key: export REVEALUI_LICENSE_KEY=<your-key>')\n process.exit(2)\n }\n logger.success('Pro license verified')\n }\n\n // Step 3: Database configuration\n logger.info('[3/8] Configure database')\n const databaseConfig = await promptDatabaseConfig()\n if (databaseConfig.provider !== 'skip') {\n logger.success(`Database: ${databaseConfig.provider}`)\n } else {\n logger.info('Database configuration skipped')\n }\n\n // Step 4: Storage configuration\n logger.info('[4/8] Configure storage')\n const storageConfig = await promptStorageConfig()\n if (storageConfig.provider !== 'skip') {\n logger.success(`Storage: ${storageConfig.provider}`)\n } else {\n logger.info('Storage configuration skipped')\n }\n\n // Step 5: Payment configuration\n logger.info('[5/8] Configure payments')\n const paymentConfig = await promptPaymentConfig()\n if (paymentConfig.enabled) {\n logger.success('Stripe configured')\n } else {\n logger.info('Payments disabled')\n }\n\n // Step 6: Development environment\n logger.info('[6/8] Configure development environment')\n const devEnvConfig = await promptDevEnvConfig()\n logger.success(\n `Dev Container: ${devEnvConfig.createDevContainer ? 'Yes' : 'No'}, Devbox: ${devEnvConfig.createDevbox ? 'Yes' : 'No'}`,\n )\n\n // Step 7: Create project\n logger.info('[7/8] Creating project...')\n\n await createProject({\n project: projectConfig,\n database: databaseConfig,\n storage: storageConfig,\n payment: paymentConfig,\n devenv: devEnvConfig,\n skipGit: _options.skipGit,\n skipInstall: _options.skipInstall,\n })\n\n logger.success('Project created successfully')\n\n // Step 8: Next steps\n logger.info('[8/8] Next steps')\n logger.divider()\n logger.info(`cd ${projectConfig.projectName}`)\n logger.info('pnpm install')\n logger.info('pnpm dev')\n logger.divider()\n\n logger.success(`šŸŽ‰ Project ${projectConfig.projectName} created successfully!`)\n } catch (error) {\n if (error instanceof Error) {\n logger.error(`Failed to create project: ${error.message}`)\n } else {\n logger.error('An unexpected error occurred')\n }\n process.exit(1)\n }\n}\n\n// If running as main module\nif (import.meta.url === `file://${process.argv[1]}`) {\n const cli = createCli()\n cli.parse(process.argv)\n}\n","/**\n * CLI definition using Commander.js\n */\n\nimport { createLogger } from '@revealui/setup/utils'\nimport { Command } from 'commander'\n\nconst logger = createLogger({ prefix: 'CLI' })\n\nexport interface CliOptions {\n template?: string\n skipGit?: boolean\n skipInstall?: boolean\n}\n\nexport function createCli(): Command {\n const program = new Command()\n\n program\n .name('create-revealui')\n .description('Create a new RevealUI project')\n .version('0.1.0')\n .argument('[project-name]', 'Name of the project')\n .option('-t, --template <name>', 'Template to use (basic-blog, e-commerce, portfolio)')\n .option('--skip-git', 'Skip git initialization', false)\n .option('--skip-install', 'Skip dependency installation', false)\n .action(async (projectName: string | undefined, options: CliOptions) => {\n logger.header('šŸš€ Create RevealUI Project')\n\n // Import main orchestrator dynamically to avoid circular deps\n const { run } = await import('./index.js')\n await run(projectName, options)\n })\n\n return program\n}\n"],"mappings":"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","names":["path","fs","path","fs","path","createLogger","logger","createLogger","execa","logger","fs","path","fileURLToPath","createLogger","ora","logger","__filename","__dirname","createLogger","logger","postgresUrl","inquirer","inquirer","fs","path","inquirer","inquirer","createLogger","logger","createLogger","logger","run"]}
package/dist/index.d.ts CHANGED
@@ -1,2 +1,11 @@
1
- export {};
2
- //# sourceMappingURL=index.d.ts.map
1
+ #!/usr/bin/env node
2
+ import { CliOptions } from './cli.js';
3
+ import 'commander';
4
+
5
+ /**
6
+ * @revealui/cli - Main orchestrator
7
+ */
8
+
9
+ declare function run(projectName: string | undefined, _options: CliOptions): Promise<void>;
10
+
11
+ export { run };