@rebasepro/cli 0.0.1-canary.ca2cb6e → 0.0.1-canary.eae7889

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.
package/dist/index.cjs CHANGED
@@ -90,8 +90,8 @@ ${chalk.bold("Rebase")} — Create a new project 🚀
90
90
  });
91
91
  }
92
92
  const answers = await inquirer.prompt(questions);
93
- const targetDirectory = path.resolve(process.cwd(), nameArg || answers.projectName);
94
- const projectName = path.basename(targetDirectory);
93
+ const projectName = nameArg || answers.projectName;
94
+ const targetDirectory = path.resolve(process.cwd(), projectName);
95
95
  const templateDirectory = path.resolve(cliRoot, "templates", "template");
96
96
  return {
97
97
  projectName,
@@ -202,18 +202,11 @@ POSTGRES_PASSWORD=${dbPassword}
202
202
  "config/package.json",
203
203
  "frontend/index.html"
204
204
  ];
205
- const packageJsonPath = path.resolve(cliRoot, "package.json");
206
- let cliVersion = "latest";
207
- if (fs.existsSync(packageJsonPath)) {
208
- const pkg = JSON.parse(fs.readFileSync(packageJsonPath, "utf-8"));
209
- cliVersion = pkg.version || "latest";
210
- }
211
205
  for (const file of filesToProcess) {
212
206
  const fullPath = path.resolve(options.targetDirectory, file);
213
207
  if (!fs.existsSync(fullPath)) continue;
214
208
  let content = fs.readFileSync(fullPath, "utf-8");
215
209
  content = content.replace(/\{\{PROJECT_NAME\}\}/g, options.projectName);
216
- content = content.replace(/("@rebasepro\/[^"]+":\s*)"workspace:\*"/g, `$1"${cliVersion}"`);
217
210
  fs.writeFileSync(fullPath, content, "utf-8");
218
211
  }
219
212
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../src/commands/init.ts","../src/commands/generate_sdk.ts","../src/utils/project.ts","../src/commands/schema.ts","../src/commands/db.ts","../src/commands/dev.ts","../src/commands/auth.ts","../src/commands/doctor.ts","../src/cli.ts","../src/auth.ts"],"sourcesContent":["import arg from \"arg\";\nimport inquirer from \"inquirer\";\nimport chalk from \"chalk\";\nimport path from \"path\";\nimport fs from \"fs\";\nimport { promisify } from \"util\";\nimport execa from \"execa\";\nimport ncp from \"ncp\";\nimport { fileURLToPath } from \"url\";\nimport crypto from \"crypto\";\n\nconst access = promisify(fs.access);\nconst copy = promisify(ncp);\n\n// Resolve template path relative to this file\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\nfunction findParentDir(currentDir: string, targetName: string): string | null {\n const root = path.parse(currentDir).root;\n while (currentDir && currentDir !== root) {\n if (path.basename(currentDir) === targetName) {\n return currentDir;\n }\n currentDir = path.dirname(currentDir);\n }\n return null;\n}\n\nconst cliRoot = findParentDir(__dirname, \"cli\");\n\nexport interface InitOptions {\n projectName: string;\n git: boolean;\n installDeps: boolean;\n targetDirectory: string;\n templateDirectory: string;\n}\n\nexport async function createRebaseApp(rawArgs: string[]) {\n console.log(`\n${chalk.bold(\"Rebase\")} — Create a new project 🚀\n`);\n\n const options = await promptForOptions(rawArgs);\n await createProject(options);\n}\n\nasync function promptForOptions(rawArgs: string[]): Promise<InitOptions> {\n const args = arg(\n {\n \"--git\": Boolean,\n \"--install\": Boolean,\n \"-g\": \"--git\",\n \"-i\": \"--install\"\n },\n {\n argv: rawArgs.slice(3), // skip \"node\", \"rebase\", \"init\"\n permissive: true\n }\n );\n\n // The first positional arg after \"init\" is the project name\n const nameArg = args._[0];\n\n const questions: Record<string, unknown>[] = [];\n\n if (!nameArg) {\n questions.push({\n type: \"input\",\n name: \"projectName\",\n message: \"Project name:\",\n default: \"my-rebase-app\",\n validate: (input: string) => {\n if (!input.trim()) return \"Project name is required\";\n if (!/^[a-z0-9][a-z0-9._-]*$/.test(input)) {\n return \"Project name must start with a lowercase letter or number and contain only lowercase letters, numbers, hyphens, dots, or underscores\";\n }\n return true;\n }\n });\n }\n\n if (!args[\"--git\"]) {\n questions.push({\n type: \"confirm\",\n name: \"git\",\n message: \"Initialize a git repository?\",\n default: true\n });\n }\n\n if (!args[\"--install\"]) {\n questions.push({\n type: \"confirm\",\n name: \"installDeps\",\n message: \"Install dependencies with pnpm?\",\n default: true\n });\n }\n\n const answers = await inquirer.prompt(questions as unknown as Parameters<typeof inquirer.prompt>[0]);\n\n const targetDirectory = path.resolve(process.cwd(), nameArg || answers.projectName);\n const projectName = path.basename(targetDirectory);\n const templateDirectory = path.resolve(cliRoot!, \"templates\", \"template\");\n\n return {\n projectName,\n git: args[\"--git\"] || answers.git || false,\n installDeps: args[\"--install\"] || answers.installDeps || false,\n targetDirectory,\n templateDirectory\n };\n}\n\nasync function createProject(options: InitOptions) {\n // Check if directory already exists and is not empty\n if (fs.existsSync(options.targetDirectory)) {\n if (fs.readdirSync(options.targetDirectory).length !== 0) {\n console.error(`${chalk.red.bold(\"ERROR\")} Directory \"${options.projectName}\" already exists and is not empty`);\n process.exit(1);\n }\n } else {\n fs.mkdirSync(options.targetDirectory, { recursive: true });\n }\n\n // Verify template exists\n try {\n await access(options.templateDirectory, fs.constants.R_OK);\n } catch {\n console.error(`${chalk.red.bold(\"ERROR\")} Template not found at ${options.templateDirectory}`);\n process.exit(1);\n }\n\n // Copy template files\n console.log(chalk.gray(\" Copying project files...\"));\n try {\n await copy(options.templateDirectory, options.targetDirectory, {\n clobber: false,\n dot: true,\n filter: (source: string) => {\n const basename = path.basename(source);\n // Skip node_modules and .DS_Store\n return basename !== \"node_modules\" && basename !== \".DS_Store\";\n }\n });\n } catch (err: unknown) {\n console.error(`${chalk.red.bold(\"ERROR\")} Failed to copy template files: ${err instanceof Error ? err.message : String(err)}`);\n process.exit(1);\n }\n\n // Replace placeholder project name in package.json files\n await replacePlaceholders(options);\n\n // Rename .env.template to .env if it exists and randomize secrets\n const envTemplatePath = path.join(options.targetDirectory, \".env.template\");\n const envPath = path.join(options.targetDirectory, \".env\");\n if (fs.existsSync(envTemplatePath) && !fs.existsSync(envPath)) {\n fs.renameSync(envTemplatePath, envPath);\n\n // Generate secure random strings\n const jwtSecret = crypto.randomBytes(32).toString(\"hex\");\n const dbPassword = crypto.randomBytes(16).toString(\"hex\");\n\n let envContent = fs.readFileSync(envPath, \"utf-8\");\n envContent = envContent.replace(\n \"postgresql://rebase:password@localhost:5432/rebase\",\n `postgresql://rebase:${dbPassword}@localhost:5432/rebase`\n );\n envContent = envContent.replace(\n \"change-this-to-a-secure-random-string\",\n jwtSecret\n );\n\n // Append POSTGRES_PASSWORD for docker-compose interpolation\n envContent += `\\n# Docker Compose Database Password\\nPOSTGRES_PASSWORD=${dbPassword}\\n`;\n\n fs.writeFileSync(envPath, envContent, \"utf-8\");\n }\n\n // Initialize git\n if (options.git) {\n console.log(chalk.gray(\" Initializing git repository...\"));\n try {\n await execa(\"git\", [\"init\"], { cwd: options.targetDirectory });\n } catch {\n console.warn(chalk.yellow(\" Warning: Failed to initialize git repository\"));\n }\n }\n\n if (options.installDeps) {\n console.log(\"\");\n console.log(chalk.gray(\" Installing dependencies with pnpm...\"));\n console.log(\"\");\n try {\n await execa(\"pnpm\", [\"install\"], {\n cwd: options.targetDirectory,\n stdio: \"inherit\"\n });\n } catch {\n console.warn(chalk.yellow(\" Warning: Failed to install dependencies. You may need to run `pnpm install` manually.\"));\n }\n }\n\n // Success message\n console.log(\"\");\n console.log(`${chalk.green.bold(\"✓\")} Project ${chalk.bold(options.projectName)} created successfully!`);\n console.log(\"\");\n console.log(chalk.bold(\"Next steps:\"));\n console.log(\"\");\n console.log(` ${chalk.cyan(\"cd\")} ${options.projectName}`);\n if (!options.installDeps) {\n console.log(` ${chalk.cyan(\"pnpm install\")}`);\n }\n console.log(\"\");\n console.log(chalk.gray(\" # Set up your database connection in .env\"));\n console.log(chalk.gray(\" # Then run:\"));\n console.log(\"\");\n console.log(` ${chalk.cyan(\"pnpm dev\")}`);\n console.log(\"\");\n console.log(chalk.gray(\"This starts both the backend (Hono + PostgreSQL)\")\n + chalk.gray(\" and the frontend (Vite + React) concurrently.\"));\n console.log(\"\");\n console.log(chalk.gray(\"Docs: https://rebase.pro/docs\"));\n console.log(chalk.gray(\"GitHub: https://github.com/rebasepro/rebase\"));\n console.log(\"\");\n}\n\nasync function replacePlaceholders(options: InitOptions) {\n const filesToProcess = [\n \"package.json\",\n \"frontend/package.json\",\n \"backend/package.json\",\n \"config/package.json\",\n \"frontend/index.html\"\n ];\n\n const packageJsonPath = path.resolve(cliRoot!, \"package.json\");\n let cliVersion = \"latest\";\n if (fs.existsSync(packageJsonPath)) {\n const pkg = JSON.parse(fs.readFileSync(packageJsonPath, \"utf-8\"));\n cliVersion = pkg.version || \"latest\";\n }\n\n for (const file of filesToProcess) {\n const fullPath = path.resolve(options.targetDirectory, file);\n if (!fs.existsSync(fullPath)) continue;\n\n let content = fs.readFileSync(fullPath, \"utf-8\");\n content = content.replace(/\\{\\{PROJECT_NAME\\}\\}/g, options.projectName);\n content = content.replace(/(\"@rebasepro\\/[^\"]+\":\\s*)\"workspace:\\*\"/g, `$1\"${cliVersion}\"`);\n fs.writeFileSync(fullPath, content, \"utf-8\");\n }\n}\n","/**\n * CLI command: generate-sdk\n *\n * Reads collection definitions from a specified directory (default: ./config/collections),\n * generates a typed JS SDK, and writes it to the output directory (default: ./generated/sdk).\n *\n * Uses jiti for dynamic TypeScript import of collection files.\n */\n\nimport fs from \"fs\";\nimport path from \"path\";\nimport chalk from \"chalk\";\nimport { EntityCollection } from \"@rebasepro/types\";\nimport { generateSDK, GeneratedFile } from \"@rebasepro/sdk-generator\";\n\ninterface GenerateSDKArgs {\n collectionsDir: string;\n output: string;\n cwd: string;\n}\n\n/**\n * Dynamically load collection definitions from a directory.\n *\n * Expects the directory to have an index.ts/index.js that exports a default\n * array of EntityCollection objects (matching the app/config/collections pattern).\n */\nasync function loadCollections(collectionsDir: string): Promise<EntityCollection[]> {\n const absDir = path.resolve(collectionsDir);\n\n if (!fs.existsSync(absDir)) {\n throw new Error(`Collections directory not found: ${absDir}`);\n }\n\n // Try to import the index file using jiti (supports TypeScript natively)\n let jiti: (id: string, userOptions?: Record<string, unknown>) => (modulePath: string) => Record<string, unknown>;\n try {\n const jitiModule = await import(\"jiti\");\n jiti = (jitiModule.default || jitiModule) as unknown as typeof jiti;\n } catch {\n throw new Error(\n \"Could not load 'jiti'. Install it with: pnpm add -D jiti\\n\" +\n \"jiti is required to dynamically import TypeScript collection definitions.\"\n );\n }\n\n const jitiInstance = jiti(absDir, {\n interopDefault: true,\n esmResolve: true\n });\n\n // Look for index file\n const indexCandidates = [\"index.ts\", \"index.js\", \"index.mjs\"];\n let indexPath: string | null = null;\n\n for (const candidate of indexCandidates) {\n const p = path.join(absDir, candidate);\n if (fs.existsSync(p)) {\n indexPath = p;\n break;\n }\n }\n\n if (!indexPath) {\n // Fallback: load each .ts/.js file individually\n console.log(chalk.yellow(\" No index file found, scanning individual collection files...\"));\n const collections: EntityCollection[] = [];\n const files = fs.readdirSync(absDir).filter(f =>\n (f.endsWith(\".ts\") || f.endsWith(\".js\")) && !f.startsWith(\".\")\n );\n\n for (const file of files) {\n try {\n const mod = jitiInstance(path.join(absDir, file));\n const exported = mod.default || mod;\n if (exported && typeof exported === \"object\" && \"slug\" in exported) {\n collections.push(exported as EntityCollection);\n } else if (Array.isArray(exported)) {\n collections.push(...exported);\n }\n } catch (err) {\n console.warn(chalk.yellow(` ⚠ Skipping ${file}: ${(err as Error).message}`));\n }\n }\n\n return collections;\n }\n\n // Import the index\n const mod = jitiInstance(indexPath);\n const exported = mod.default || mod;\n\n if (Array.isArray(exported)) {\n return exported as EntityCollection[];\n } else if (typeof exported === \"object\" && exported !== null) {\n // Could be a named export like { collections: [...] }\n if (\"collections\" in exported && Array.isArray(exported.collections)) {\n return exported.collections;\n }\n // Or individual named exports\n const collections: EntityCollection[] = [];\n for (const value of Object.values(exported)) {\n if (value && typeof value === \"object\" && \"slug\" in (value as EntityCollection)) {\n collections.push(value as EntityCollection);\n }\n }\n if (collections.length > 0) return collections;\n }\n\n throw new Error(\n `Could not extract collections from ${indexPath}.\\n` +\n \"Expected a default export of EntityCollection[] or an object with named collection exports.\"\n );\n}\n\n/**\n * Write generated files to the output directory.\n */\nfunction writeFiles(outputDir: string, files: GeneratedFile[]): void {\n const absOutput = path.resolve(outputDir);\n\n // Create output directory\n fs.mkdirSync(absOutput, { recursive: true });\n\n for (const file of files) {\n const filePath = path.join(absOutput, file.path);\n const dir = path.dirname(filePath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n fs.writeFileSync(filePath, file.content, \"utf-8\");\n }\n}\n\n/**\n * Main entry point for the generate-sdk command.\n */\nexport async function generateSdkCommand(args: GenerateSDKArgs): Promise<void> {\n const { collectionsDir, output, cwd } = args;\n\n const resolvedCollectionsDir = path.isAbsolute(collectionsDir)\n ? collectionsDir\n : path.join(cwd, collectionsDir);\n\n const resolvedOutput = path.isAbsolute(output)\n ? output\n : path.join(cwd, output);\n\n console.log(\"\");\n console.log(chalk.bold(\" 🔧 Rebase SDK Generator\"));\n console.log(\"\");\n console.log(` ${chalk.gray(\"Collections:\")} ${resolvedCollectionsDir}`);\n console.log(` ${chalk.gray(\"Output:\")} ${resolvedOutput}`);\n console.log(\"\");\n\n // 1. Load collections\n console.log(chalk.cyan(\" → Loading collection definitions...\"));\n const collections = await loadCollections(resolvedCollectionsDir);\n\n if (collections.length === 0) {\n console.log(chalk.red(\" ✗ No collections found. Nothing to generate.\"));\n process.exit(1);\n }\n\n console.log(chalk.green(` ✓ Found ${collections.length} collection(s): ${collections.map(c => c.slug).join(\", \")}`));\n console.log(\"\");\n\n // 2. Generate SDK files\n console.log(chalk.cyan(\" → Generating SDK files...\"));\n const files = generateSDK(collections);\n console.log(chalk.green(` ✓ Generated ${files.length} file(s)`));\n\n // 3. Write to disk\n console.log(chalk.cyan(` → Writing to ${resolvedOutput}...`));\n writeFiles(resolvedOutput, files);\n\n console.log(\"\");\n console.log(chalk.green.bold(\" ✓ SDK generated successfully!\"));\n console.log(\"\");\n console.log(chalk.gray(\" Usage:\"));\n console.log(chalk.gray(\" import { createRebaseClient } from '@rebasepro/client';\"));\n console.log(chalk.gray(` import type { Database } from './${path.relative(cwd, path.join(resolvedOutput, \"database.types\"))}';`));\n console.log(\"\");\n console.log(chalk.gray(\" const rebase = createRebaseClient<Database>({\"));\n console.log(chalk.gray(\" baseUrl: 'http://localhost:3001',\"));\n console.log(chalk.gray(\" // token: 'your-jwt-token',\"));\n console.log(chalk.gray(\" });\"));\n console.log(\"\");\n console.log(chalk.gray(` const { data } = await rebase.collection('${collections[0]?.slug || \"my_collection\"}').find();`));\n console.log(\"\");\n}\n","/**\n * Project discovery utilities for the Rebase CLI.\n *\n * These helpers locate the project root, backend directory, .env file,\n * and local binaries — used by all CLI command modules.\n */\nimport fs from \"fs\";\nimport path from \"path\";\nimport { execSync } from \"child_process\";\nimport chalk from \"chalk\";\n\n/**\n * Walk up from `startDir` to find the Rebase project root.\n *\n * The root is identified by a `package.json` that either:\n * - has `workspaces` containing \"backend\" or \"frontend\", OR\n * - has a sibling `backend/` directory\n */\nexport function findProjectRoot(startDir: string = process.cwd()): string | null {\n let dir = path.resolve(startDir);\n const root = path.parse(dir).root;\n\n while (dir !== root) {\n const pkgPath = path.join(dir, \"package.json\");\n\n if (fs.existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, \"utf-8\"));\n // Check for workspace-based project (monorepo root)\n if (pkg.workspaces && Array.isArray(pkg.workspaces)) {\n const hasBackend = pkg.workspaces.some((w: string) =>\n w === \"backend\" || w.includes(\"backend\")\n );\n if (hasBackend) return dir;\n }\n } catch {\n // ignore parse errors\n }\n\n // Check for sibling backend directory\n if (fs.existsSync(path.join(dir, \"backend\")) && fs.existsSync(path.join(dir, \"config\"))) {\n return dir;\n }\n }\n\n dir = path.dirname(dir);\n }\n\n return null;\n}\n\n/**\n * Locate the backend directory within the project root.\n */\nexport function findBackendDir(projectRoot: string): string | null {\n const backendDir = path.join(projectRoot, \"backend\");\n return fs.existsSync(backendDir) ? backendDir : null;\n}\n\n/**\n * Detect the active backend plugin (e.g. @rebasepro/server-postgresql) from the backend's package.json.\n */\nexport function getActiveBackendPlugin(backendDir: string): string | null {\n const pkgPath = path.join(backendDir, \"package.json\");\n if (!fs.existsSync(pkgPath)) return null;\n\n try {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, \"utf-8\"));\n const deps = { ...pkg.dependencies,\n...pkg.devDependencies };\n\n // Find the first dependency that matches @rebasepro/server-* (database driver plugins),\n // but not @rebasepro/server-core which is the framework itself\n for (const dep of Object.keys(deps)) {\n if (dep.startsWith(\"@rebasepro/server-\") && dep !== \"@rebasepro/server-core\") {\n return dep;\n }\n }\n } catch {\n // Ignore parse errors\n }\n return null;\n}\n\n/**\n * Resolve the active plugin's CLI script.\n */\nexport function resolvePluginCliScript(backendDir: string, pluginName: string): string | null {\n const candidates = [\n path.join(backendDir, \"node_modules\", pluginName, \"src\", \"cli.ts\"),\n path.join(backendDir, \"node_modules\", pluginName, \"dist\", \"cli.js\"),\n // For monorepo dev mode:\n path.resolve(backendDir, \"..\", \"..\", \"packages\", pluginName.replace(\"@rebasepro/\", \"\"), \"src\", \"cli.ts\"),\n path.resolve(backendDir, \"..\", \"packages\", pluginName.replace(\"@rebasepro/\", \"\"), \"src\", \"cli.ts\")\n ];\n\n for (const candidate of candidates) {\n if (fs.existsSync(candidate)) return candidate;\n }\n return null;\n}\n\n/**\n * Locate the frontend directory within the project root.\n */\nexport function findFrontendDir(projectRoot: string): string | null {\n const frontendDir = path.join(projectRoot, \"frontend\");\n return fs.existsSync(frontendDir) ? frontendDir : null;\n}\n\n/**\n * Find the .env file. Checks the project root first, then backend.\n */\nexport function findEnvFile(projectRoot: string): string | null {\n const candidates = [\n path.join(projectRoot, \".env\"),\n path.join(projectRoot, \"backend\", \".env\")\n ];\n\n for (const candidate of candidates) {\n if (fs.existsSync(candidate)) return candidate;\n }\n\n return null;\n}\n\n/**\n * Resolve a binary from the project's node_modules/.bin.\n * Checks backend, root, parent monorepo root, then falls back to PATH.\n */\nexport function resolveLocalBin(projectRoot: string, binName: string): string | null {\n const candidates = [\n path.join(projectRoot, \"backend\", \"node_modules\", \".bin\", binName),\n path.join(projectRoot, \"node_modules\", \".bin\", binName)\n ];\n\n // Also check parent directories (for monorepo setups where app/ is nested)\n let parent = path.dirname(projectRoot);\n const rootDir = path.parse(parent).root;\n while (parent !== rootDir) {\n candidates.push(path.join(parent, \"node_modules\", \".bin\", binName));\n parent = path.dirname(parent);\n }\n\n for (const candidate of candidates) {\n if (fs.existsSync(candidate)) return candidate;\n }\n\n // Fall back to globally installed binary via which\n try {\n const globalPath = execSync(`which ${binName}`, { encoding: \"utf-8\" }).trim();\n if (globalPath && fs.existsSync(globalPath)) return globalPath;\n } catch {\n // not found globally\n }\n\n return null;\n}\n\n/**\n * Resolve the tsx binary. Checks backend node_modules first, then root.\n */\nexport function resolveTsx(projectRoot: string): string | null {\n return resolveLocalBin(projectRoot, \"tsx\");\n}\n\n/**\n * Require the project root or exit with a helpful error.\n */\nexport function requireProjectRoot(): string {\n const root = findProjectRoot();\n if (!root) {\n console.error(chalk.red(\"✗ Could not find a Rebase project root.\"));\n console.error(chalk.gray(\" Make sure you are inside a Rebase project directory\"));\n console.error(chalk.gray(\" (one with backend/, frontend/, and shared/ directories).\"));\n process.exit(1);\n }\n return root;\n}\n\n/**\n * Require the backend directory or exit with a helpful error.\n */\nexport function requireBackendDir(projectRoot: string): string {\n const backendDir = findBackendDir(projectRoot);\n if (!backendDir) {\n console.error(chalk.red(\"✗ Could not find a backend/ directory.\"));\n console.error(chalk.gray(` Expected at: ${path.join(projectRoot, \"backend\")}`));\n process.exit(1);\n }\n return backendDir;\n}\n","/**\n * CLI command: rebase schema <action>\n */\nimport chalk from \"chalk\";\nimport execa from \"execa\";\nimport {\n requireProjectRoot,\n requireBackendDir,\n getActiveBackendPlugin,\n resolvePluginCliScript,\n resolveTsx,\n findEnvFile\n} from \"../utils/project\";\n\nexport async function schemaCommand(subcommand: string | undefined, rawArgs: string[]): Promise<void> {\n if (!subcommand || subcommand === \"--help\") {\n printSchemaHelp();\n return;\n }\n\n const projectRoot = requireProjectRoot();\n const backendDir = requireBackendDir(projectRoot);\n\n const activePlugin = getActiveBackendPlugin(backendDir);\n if (!activePlugin) {\n console.error(chalk.red(\"✗ Could not detect an active database plugin.\"));\n console.error(chalk.gray(\" Make sure a package like @rebasepro/server-postgresql is installed in backend/package.json.\"));\n process.exit(1);\n }\n\n const pluginCli = resolvePluginCliScript(backendDir, activePlugin);\n if (!pluginCli) {\n console.error(chalk.red(`✗ Could not find CLI entry point for ${activePlugin}.`));\n process.exit(1);\n }\n\n // Set up environment with DOTENV_CONFIG_PATH\n const envFile = findEnvFile(projectRoot);\n const env: Record<string, string> = { ...process.env as Record<string, string> };\n if (envFile) {\n env.DOTENV_CONFIG_PATH = envFile;\n }\n\n try {\n const isTs = pluginCli.endsWith(\".ts\");\n if (isTs) {\n const tsxBin = resolveTsx(projectRoot);\n if (!tsxBin) {\n console.error(chalk.red(\"✗ Could not find tsx binary.\"));\n process.exit(1);\n }\n await execa(tsxBin, [pluginCli, ...rawArgs.slice(2)], {\n cwd: backendDir,\n stdio: \"inherit\",\n env\n });\n } else {\n await execa(\"node\", [pluginCli, ...rawArgs.slice(2)], {\n cwd: backendDir,\n stdio: \"inherit\",\n env\n });\n }\n } catch (err: unknown) {\n process.exit(1);\n }\n}\n\nfunction printSchemaHelp() {\n console.log(`\n${chalk.bold(\"rebase schema\")} — Schema management commands\n\n${chalk.green.bold(\"Usage\")}\n rebase schema ${chalk.blue(\"<command>\")} [options]\n\n${chalk.green.bold(\"Commands\")}\n ${chalk.gray(\"(Commands are provided by your active database driver plugin)\")}\n ${chalk.blue.bold(\"generate\")} Generate Schema from collection definitions\n\n${chalk.green.bold(\"generate Options\")}\n ${chalk.blue(\"--collections, -c\")} Path to collections directory\n ${chalk.blue(\"--output, -o\")} Output path for generated schema\n ${chalk.blue(\"--watch, -w\")} Watch for changes and regenerate automatically\n`);\n}\n","/**\n * CLI command: rebase db <action>\n */\nimport chalk from \"chalk\";\nimport execa from \"execa\";\nimport {\n requireProjectRoot,\n requireBackendDir,\n getActiveBackendPlugin,\n resolvePluginCliScript,\n resolveTsx,\n findEnvFile\n} from \"../utils/project\";\n\nexport async function dbCommand(subcommand: string | undefined, rawArgs: string[]): Promise<void> {\n if (!subcommand || subcommand === \"--help\") {\n printDbHelp();\n return;\n }\n\n const projectRoot = requireProjectRoot();\n const backendDir = requireBackendDir(projectRoot);\n\n const activePlugin = getActiveBackendPlugin(backendDir);\n if (!activePlugin) {\n console.error(chalk.red(\"✗ Could not detect an active database plugin.\"));\n console.error(chalk.gray(\" Make sure a package like @rebasepro/server-postgresql is installed in backend/package.json.\"));\n process.exit(1);\n }\n\n const pluginCli = resolvePluginCliScript(backendDir, activePlugin);\n if (!pluginCli) {\n console.error(chalk.red(`✗ Could not find CLI entry point for ${activePlugin}.`));\n process.exit(1);\n }\n\n // Set up environment with DOTENV_CONFIG_PATH\n const envFile = findEnvFile(projectRoot);\n const env: Record<string, string> = { ...process.env as Record<string, string> };\n if (envFile) {\n env.DOTENV_CONFIG_PATH = envFile;\n }\n\n try {\n const isTs = pluginCli.endsWith(\".ts\");\n if (isTs) {\n const tsxBin = resolveTsx(projectRoot);\n if (!tsxBin) {\n console.error(chalk.red(\"✗ Could not find tsx binary.\"));\n process.exit(1);\n }\n await execa(tsxBin, [pluginCli, ...rawArgs.slice(2)], {\n cwd: backendDir,\n stdio: \"inherit\",\n env\n });\n } else {\n await execa(\"node\", [pluginCli, ...rawArgs.slice(2)], {\n cwd: backendDir,\n stdio: \"inherit\",\n env\n });\n }\n } catch (err: unknown) {\n // If the process exits with an error code, execa will throw,\n // but inherit stdio means the user already saw the output.\n process.exit(1);\n }\n}\n\nfunction printDbHelp() {\n console.log(`\n${chalk.bold(\"rebase db\")} — Database management commands\n\n${chalk.green.bold(\"Usage\")}\n rebase db ${chalk.blue(\"<command>\")} [options]\n\n${chalk.green.bold(\"Commands\")}\n ${chalk.gray(\"(Commands are provided by your active database driver plugin)\")}\n ${chalk.blue.bold(\"push\")} Apply schema directly to database (development)\n ${chalk.blue.bold(\"pull\")} Introspect database → Schema\n ${chalk.blue.bold(\"generate\")} Generate migration files\n ${chalk.blue.bold(\"migrate\")} Run pending migrations\n ${chalk.blue.bold(\"studio\")} Open Studio viewer\n ${chalk.blue.bold(\"branch\")} Database branching (create, list, delete, info)\n\n${chalk.green.bold(\"Examples\")}\n ${chalk.gray(\"# Quick development workflow\")}\n rebase schema generate && rebase db push\n\n ${chalk.gray(\"# Production migration workflow\")}\n rebase db generate\n rebase db migrate\n\n ${chalk.gray(\"# Create a database branch\")}\n rebase db branch create feature_auth\n`);\n}\n","/**\n * CLI command: rebase dev\n *\n * Starts the full development environment:\n * - Backend: tsx watch with auto-reload\n * - Frontend: vite dev server\n *\n * Both processes stream output with color-coded prefixes.\n *\n * When the backend uses port-retry (i.e. the configured port is busy and it\n * binds to the next free one), the CLI detects the actual port from stdout\n * and injects VITE_API_URL into the frontend so it connects automatically.\n *\n * Each project gets a deterministic default port derived from the project\n * root path, so multiple Rebase instances never collide.\n */\nimport arg from \"arg\";\nimport chalk from \"chalk\";\nimport execa, { ExecaChildProcess } from \"execa\";\nimport path from \"path\";\nimport fs from \"fs\";\nimport {\n requireProjectRoot,\n findBackendDir,\n findFrontendDir,\n findEnvFile,\n resolveTsx\n} from \"../utils/project\";\n\n/** Well-known filename the backend writes its actual port to. */\nconst DEV_PORT_FILENAME = \".rebase-dev-port\";\n\n/**\n * Compute a deterministic port from the project root path.\n * Range: 3001–3999 (avoids privileged ports and common services).\n * Two different project directories will almost always get different ports.\n */\nfunction getProjectPort(projectRoot: string): number {\n let hash = 0;\n for (let i = 0; i < projectRoot.length; i++) {\n hash = ((hash << 5) - hash + projectRoot.charCodeAt(i)) | 0;\n }\n return 3001 + (Math.abs(hash) % 999);\n}\n\n/**\n * Resolve the best starting port for this project:\n * 1. Explicit --port flag (highest priority)\n * 2. PORT env var\n * 3. Previously used port from .rebase-dev-port (port affinity across restarts)\n * 4. Deterministic hash from project path (unique per project)\n */\nfunction resolveStartPort(projectRoot: string, explicitPort?: number): number {\n // 1. Explicit flag\n if (explicitPort) return explicitPort;\n\n // 2. PORT env var\n if (process.env.PORT) return parseInt(process.env.PORT, 10);\n\n // 3. Port affinity — check if we wrote a port file from a previous run\n try {\n const portFile = path.join(projectRoot, DEV_PORT_FILENAME);\n if (fs.existsSync(portFile)) {\n const saved = parseInt(fs.readFileSync(portFile, \"utf-8\").trim(), 10);\n if (saved > 0 && saved < 65536) return saved;\n }\n } catch { /* ignore */ }\n\n // 4. Deterministic hash\n return getProjectPort(projectRoot);\n}\n\nexport async function devCommand(rawArgs: string[]): Promise<void> {\n const args = arg(\n {\n \"--backend-only\": Boolean,\n \"--frontend-only\": Boolean,\n \"--port\": Number,\n \"--help\": Boolean,\n \"-b\": \"--backend-only\",\n \"-f\": \"--frontend-only\",\n \"-p\": \"--port\",\n \"-h\": \"--help\"\n },\n {\n argv: rawArgs.slice(3), // skip \"node rebase dev\"\n permissive: true\n }\n );\n\n if (args[\"--help\"]) {\n printDevHelp();\n return;\n }\n\n const projectRoot = requireProjectRoot();\n const backendDir = findBackendDir(projectRoot);\n const frontendDir = findFrontendDir(projectRoot);\n const backendOnly = args[\"--backend-only\"] || false;\n const frontendOnly = args[\"--frontend-only\"] || false;\n\n // Resolve the port ONCE, before starting anything\n const startPort = resolveStartPort(projectRoot, args[\"--port\"]);\n\n console.log(\"\");\n console.log(chalk.bold(\" 🚀 Rebase Dev Server\"));\n console.log(\"\");\n\n const children: ExecaChildProcess[] = [];\n\n // --- State for printing the banner ---\n let frontendUrl = \"\";\n let backendUrl = \"\";\n let debounceSummary: NodeJS.Timeout | null = null;\n let bannerPrinted = false;\n\n /** Actual backend port, resolved once the server prints its URL. */\n let resolvedBackendPort: number | null = null;\n\n // Use regex to strip ANSI codes before matching\n // eslint-disable-next-line no-control-regex\n const stripAnsi = (str: string) => str.replace(/[\\u001b\\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g, \"\");\n\n function printSummary() {\n if (!frontendUrl || !backendUrl) return;\n if (debounceSummary) clearTimeout(debounceSummary);\n debounceSummary = setTimeout(() => {\n if (bannerPrinted) return;\n console.log(\"\");\n console.log(chalk.cyan(\"┌────────────────────────────────────────────────────────────┐\"));\n console.log(chalk.cyan(\"│ │\"));\n console.log(chalk.cyan(\"│ ✨ Rebase Admin App is ready! │\"));\n const cleanUrl = stripAnsi(frontendUrl);\n const paddedUrl = cleanUrl.padEnd(40);\n console.log(chalk.cyan(\"│ 👉 Frontend URL: \") + chalk.white(paddedUrl) + chalk.cyan(\"│\"));\n console.log(chalk.cyan(\"│ │\"));\n console.log(chalk.cyan(\"└────────────────────────────────────────────────────────────┘\"));\n console.log(\"\");\n bannerPrinted = true;\n }, 500);\n }\n\n // Handle graceful shutdown\n const cleanup = () => {\n // Clean up dev port file\n try {\n const portFile = path.join(projectRoot, DEV_PORT_FILENAME);\n if (fs.existsSync(portFile)) fs.unlinkSync(portFile);\n\n const urlFile = path.join(projectRoot, \".rebase-dev-url\");\n if (fs.existsSync(urlFile)) fs.unlinkSync(urlFile);\n } catch { /* ignore */ }\n\n children.forEach((child) => {\n if (child.pid && !child.killed) {\n try {\n if (process.platform === \"win32\") {\n execa.commandSync(`taskkill /pid ${child.pid} /T /F`);\n } else {\n process.kill(-child.pid, \"SIGKILL\");\n }\n } catch (e) {\n try {\n child.kill(\"SIGKILL\");\n } catch (err) {\n // ignore\n }\n }\n }\n });\n process.exit(0);\n };\n process.on(\"SIGINT\", cleanup);\n process.on(\"SIGTERM\", cleanup);\n\n /**\n * Start the Vite frontend, optionally injecting the backend port.\n */\n function startFrontend(backendPort: number | null) {\n if (!frontendDir) return;\n\n console.log(` ${chalk.magenta(\"▶\")} Frontend: ${chalk.gray(frontendDir)}`);\n\n const frontendEnv: Record<string, string> = { ...process.env as Record<string, string> };\n\n // Inject the resolved backend URL so Vite picks it up\n if (backendPort) {\n frontendEnv.VITE_API_URL = `http://localhost:${backendPort}`;\n console.log(` ${chalk.gray(\"↳ VITE_API_URL\")} = ${chalk.white(`http://localhost:${backendPort}`)}`);\n }\n\n const frontendChild = execa(\n \"pnpm\",\n [\"run\", \"dev\"],\n {\n cwd: frontendDir,\n stdio: [\"inherit\", \"pipe\", \"pipe\"],\n env: frontendEnv,\n shell: true,\n detached: process.platform !== \"win32\"\n }\n );\n frontendChild.catch(() => {}); // prevent unhandled promise rejection on exit\n\n frontendChild.stdout?.on(\"data\", (data: Buffer) => {\n const lines = data.toString().split(\"\\n\").filter(Boolean);\n lines.forEach((line: string) => {\n console.log(`${chalk.magenta.bold(\"[admin]\")} ${line}`);\n const cleanLine = stripAnsi(line);\n const urlMatch = cleanLine.match(/(http:\\/\\/(?:localhost|127\\.0\\.0\\.1):\\d+)/);\n if (cleanLine.includes(\"Local:\") && urlMatch) {\n frontendUrl = urlMatch[1];\n printSummary();\n }\n });\n });\n\n frontendChild.stderr?.on(\"data\", (data: Buffer) => {\n const lines = data.toString().split(\"\\n\").filter(Boolean);\n lines.forEach((line: string) => {\n console.log(`${chalk.magenta.bold(\"[admin]\")} ${line}`);\n });\n });\n\n children.push(frontendChild);\n }\n\n // Start backend\n if (!frontendOnly && backendDir) {\n const tsxBin = resolveTsx(projectRoot);\n if (!tsxBin) {\n console.error(chalk.red(\" ✗ Could not find tsx binary for backend.\"));\n console.error(chalk.gray(\" Install it with: pnpm add -D tsx\"));\n process.exit(1);\n }\n\n const envFile = findEnvFile(projectRoot);\n const env: Record<string, string> = { ...process.env as Record<string, string> };\n if (envFile) {\n env.DOTENV_CONFIG_PATH = envFile;\n }\n\n // Always inject PORT so the backend uses our resolved port instead of\n // its hardcoded default (3001). This prevents cross-project collisions\n // when multiple Rebase instances run simultaneously.\n env.PORT = String(startPort);\n\n console.log(` ${chalk.cyan(\"▶\")} Backend: ${chalk.gray(backendDir)}`);\n console.log(` ${chalk.gray(\"↳ PORT\")} = ${chalk.white(String(startPort))}`);\n\n /** Whether the frontend has been launched (we only launch it once). */\n let frontendLaunched = false;\n\n const backendChild = execa(\n tsxBin,\n [\"watch\", `--watch=\"${path.join(\"..\", \"config\", \"**\", \"*\")}\"`, \"--conditions\", \"development\", \"src/index.ts\"],\n {\n cwd: backendDir,\n stdio: [\"inherit\", \"pipe\", \"pipe\"],\n env,\n shell: true,\n detached: process.platform !== \"win32\"\n }\n );\n backendChild.catch(() => {}); // prevent unhandled promise rejection on exit\n\n backendChild.stdout?.on(\"data\", (data: Buffer) => {\n const lines = data.toString().split(\"\\n\").filter(Boolean);\n lines.forEach((line: string) => {\n console.log(`${chalk.cyan.bold(\"[backend]\")} ${line}`);\n const cleanLine = stripAnsi(line);\n const serverMatch = cleanLine.match(/Server running at http:\\/\\/(?:localhost|127\\.0\\.0\\.1):(\\d+)/);\n if (serverMatch) {\n resolvedBackendPort = parseInt(serverMatch[1], 10);\n backendUrl = \"started\";\n printSummary();\n\n // Save the url to a temp file for scripts to pick up\n const urlFile = path.join(projectRoot, \".rebase-dev-url\");\n fs.writeFileSync(urlFile, `http://localhost:${resolvedBackendPort}`, \"utf-8\");\n\n // Save the port to .rebase-dev-port for port affinity\n const portFile = path.join(projectRoot, DEV_PORT_FILENAME);\n fs.writeFileSync(portFile, String(resolvedBackendPort), \"utf-8\");\n\n // Start frontend now that we know the real port\n if (!backendOnly && frontendDir && !frontendLaunched) {\n frontendLaunched = true;\n startFrontend(resolvedBackendPort);\n }\n }\n });\n });\n\n backendChild.stderr?.on(\"data\", (data: Buffer) => {\n const lines = data.toString().split(\"\\n\").filter(Boolean);\n lines.forEach((line: string) => {\n console.log(`${chalk.cyan.bold(\"[backend]\")} ${line}`);\n });\n });\n\n children.push(backendChild);\n } else if (!frontendOnly && !backendDir) {\n console.warn(chalk.yellow(\" ⚠ No backend/ directory found, skipping backend.\"));\n }\n\n // Start frontend immediately if backend-only mode or no backend\n if (!backendOnly && frontendDir && (frontendOnly || !backendDir)) {\n startFrontend(null);\n } else if (!backendOnly && !frontendDir) {\n console.warn(chalk.yellow(\" ⚠ No frontend/ directory found, skipping frontend.\"));\n }\n\n if (children.length === 0) {\n console.error(chalk.red(\" ✗ Nothing to start. Check your project structure.\"));\n process.exit(1);\n }\n\n console.log(\"\");\n console.log(chalk.gray(\" Press Ctrl+C to stop all servers.\"));\n console.log(\"\");\n\n // Wait for all children to exit\n await Promise.all(\n children.map(\n (child) =>\n new Promise<void>((resolve) => {\n child.finally(() => resolve());\n })\n )\n );\n}\n\nfunction printDevHelp() {\n console.log(`\n${chalk.bold(\"rebase dev\")} — Start the development server\n\n${chalk.green.bold(\"Usage\")}\n rebase dev [options]\n\n${chalk.green.bold(\"Options\")}\n ${chalk.blue(\"--backend-only, -b\")} Only start the backend server\n ${chalk.blue(\"--frontend-only, -f\")} Only start the frontend server\n ${chalk.blue(\"--port, -p\")} Backend port (default: auto-detected per project)\n\n${chalk.green.bold(\"Description\")}\n Starts both the backend (tsx watch + Hono) and frontend (Vite)\n dev servers concurrently with color-coded output prefixes.\n\n Each project automatically receives a unique default port derived\n from its directory path, preventing collisions when running multiple\n Rebase instances simultaneously.\n\n If the assigned port is already in use, the server will automatically\n try the next available port. The frontend is started only after the\n backend is ready, and VITE_API_URL is injected automatically.\n`);\n}\n","/**\n * CLI command: rebase auth <action>\n *\n * Subcommands:\n * reset-password — Reset a user's password\n */\nimport arg from \"arg\";\nimport chalk from \"chalk\";\nimport path from \"path\";\nimport fs from \"fs\";\nimport { spawn } from \"child_process\";\nimport {\n requireProjectRoot,\n requireBackendDir,\n findEnvFile,\n resolveTsx\n} from \"../utils/project\";\n\nexport async function authCommand(subcommand: string | undefined, rawArgs: string[]): Promise<void> {\n if (!subcommand || subcommand === \"--help\") {\n printAuthHelp();\n return;\n }\n\n switch (subcommand) {\n case \"reset-password\":\n await resetPassword(rawArgs);\n break;\n default:\n console.error(chalk.red(`Unknown auth command: ${subcommand}`));\n console.log(\"\");\n printAuthHelp();\n process.exit(1);\n }\n}\n\nasync function resetPassword(rawArgs: string[]): Promise<void> {\n const args = arg(\n {\n \"--email\": String,\n \"--password\": String,\n \"-e\": \"--email\",\n \"-p\": \"--password\"\n },\n {\n argv: rawArgs.slice(4), // skip \"node rebase auth reset-password\"\n permissive: true\n }\n );\n\n // Support both --email flag and positional args\n const email = args[\"--email\"] || args._[0];\n const newPassword = args[\"--password\"] || args._[1];\n\n if (!email) {\n console.error(chalk.red(\"✗ Email is required.\"));\n console.log(\"\");\n console.log(chalk.gray(\" Usage: rebase auth reset-password <email> [new-password]\"));\n console.log(chalk.gray(\" rebase auth reset-password --email user@example.com --password NewPass123!\"));\n process.exit(1);\n }\n\n const projectRoot = requireProjectRoot();\n const backendDir = requireBackendDir(projectRoot);\n const tsxBin = resolveTsx(projectRoot);\n\n if (!tsxBin) {\n console.error(chalk.red(\"✗ Could not find tsx binary.\"));\n process.exit(1);\n }\n\n // Create a temporary script that performs the password reset\n const envFile = findEnvFile(projectRoot);\n const env: Record<string, string> = { ...process.env as Record<string, string> };\n if (envFile) {\n env.DOTENV_CONFIG_PATH = envFile;\n }\n\n const scriptContent = `\nimport { createPostgresDatabaseConnection } from \"@rebasepro/server-core\";\nimport { hashPassword } from \"@rebasepro/server-core/src/auth/password\";\nimport { eq } from \"drizzle-orm\";\nimport { users } from \"@rebasepro/server-core/src/db/auth-schema\";\nimport * as dotenv from \"dotenv\";\nimport path from \"path\";\n\ndotenv.config({ path: \"${envFile || path.join(projectRoot, \".env\")}\" });\n\nconst email = \"${email}\";\nconst newPassword = \"${newPassword || \"NewPassword123!\"}\";\n\nasync function resetPassword() {\n const { db } = createPostgresDatabaseConnection(process.env.DATABASE_URL!);\n const hash = await hashPassword(newPassword);\n\n const result = await db.update(users)\n .set({ passwordHash: hash })\n .where(eq(users.email, email))\n .returning({\n id: users.id,\n email: users.email\n });\n\n if (result.length > 0) {\n console.log(\"✅ Password reset for: \" + result[0].email);\n ${!newPassword ? 'console.log(\" New password: \" + newPassword);' : \"\"}\n } else {\n console.log(\"✗ User not found: \" + email);\n }\n process.exit(0);\n}\n\nresetPassword().catch(console.error);\n`;\n\n const tmpScriptPath = path.join(backendDir, \".tmp-reset-password.ts\");\n fs.writeFileSync(tmpScriptPath, scriptContent, \"utf-8\");\n\n console.log(\"\");\n console.log(chalk.bold(\" 🔑 Rebase Auth — Reset Password\"));\n console.log(\"\");\n console.log(` ${chalk.gray(\"Email:\")} ${email}`);\n if (newPassword) {\n console.log(` ${chalk.gray(\"Password:\")} ${\"*\".repeat(newPassword.length)}`);\n }\n console.log(\"\");\n\n const child = spawn(tsxBin, [tmpScriptPath], {\n cwd: backendDir,\n stdio: \"inherit\",\n env\n });\n\n return new Promise((resolve) => {\n child.on(\"close\", (code) => {\n // Clean up temp script\n try { fs.unlinkSync(tmpScriptPath); } catch { /* ignore */ }\n if (code !== 0) {\n process.exit(code ?? 1);\n }\n resolve();\n });\n });\n}\n\nfunction printAuthHelp() {\n console.log(`\n${chalk.bold(\"rebase auth\")} — Authentication management commands\n\n${chalk.green.bold(\"Usage\")}\n rebase auth ${chalk.blue(\"<command>\")} [options]\n\n${chalk.green.bold(\"Commands\")}\n ${chalk.blue.bold(\"reset-password\")} Reset a user's password\n\n${chalk.green.bold(\"reset-password Options\")}\n ${chalk.blue(\"--email, -e\")} User's email address\n ${chalk.blue(\"--password, -p\")} New password (default: NewPassword123!)\n\n${chalk.green.bold(\"Examples\")}\n rebase auth reset-password user@example.com\n rebase auth reset-password --email user@example.com --password MyNewPass!\n`);\n}\n","/**\n * CLI command: rebase doctor\n *\n * Detects three-way schema drift between collection definitions,\n * the generated Drizzle schema, and the live PostgreSQL database.\n */\nimport chalk from \"chalk\";\nimport execa from \"execa\";\nimport {\n requireProjectRoot,\n requireBackendDir,\n getActiveBackendPlugin,\n resolvePluginCliScript,\n resolveTsx,\n findEnvFile\n} from \"../utils/project\";\n\nexport async function doctorCommand(rawArgs: string[]): Promise<void> {\n const projectRoot = requireProjectRoot();\n const backendDir = requireBackendDir(projectRoot);\n\n const activePlugin = getActiveBackendPlugin(backendDir);\n if (!activePlugin) {\n console.error(chalk.red(\"✗ Could not detect an active database plugin.\"));\n console.error(chalk.gray(\" Make sure a package like @rebasepro/server-postgresql is installed in backend/package.json.\"));\n process.exit(1);\n }\n\n const pluginCli = resolvePluginCliScript(backendDir, activePlugin);\n if (!pluginCli) {\n console.error(chalk.red(`✗ Could not find CLI entry point for ${activePlugin}.`));\n process.exit(1);\n }\n\n // Set up environment with DOTENV_CONFIG_PATH\n const envFile = findEnvFile(projectRoot);\n const env: Record<string, string> = { ...process.env as Record<string, string> };\n if (envFile) {\n env.DOTENV_CONFIG_PATH = envFile;\n }\n\n try {\n const isTs = pluginCli.endsWith(\".ts\");\n if (isTs) {\n const tsxBin = resolveTsx(projectRoot);\n if (!tsxBin) {\n console.error(chalk.red(\"✗ Could not find tsx binary.\"));\n process.exit(1);\n }\n await execa(tsxBin, [pluginCli, ...rawArgs.slice(2)], {\n cwd: backendDir,\n stdio: \"inherit\",\n env\n });\n } else {\n await execa(\"node\", [pluginCli, ...rawArgs.slice(2)], {\n cwd: backendDir,\n stdio: \"inherit\",\n env\n });\n }\n } catch {\n // If the process exits with an error code, execa will throw,\n // but inherit stdio means the user already saw the output.\n process.exit(1);\n }\n}\n","import chalk from \"chalk\";\nimport arg from \"arg\";\nimport { createRebaseApp } from \"./commands/init\";\nimport { generateSdkCommand } from \"./commands/generate_sdk\";\nimport { schemaCommand } from \"./commands/schema\";\nimport { dbCommand } from \"./commands/db\";\nimport { devCommand } from \"./commands/dev\";\nimport { authCommand } from \"./commands/auth\";\nimport { doctorCommand } from \"./commands/doctor\";\nimport fs from \"fs\";\nimport path from \"path\";\nimport { fileURLToPath } from \"url\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\nfunction getVersion(): string {\n try {\n // Try to read version from package.json\n const pkgPath = path.resolve(__dirname, \"../package.json\");\n if (fs.existsSync(pkgPath)) {\n return JSON.parse(fs.readFileSync(pkgPath, \"utf-8\")).version;\n }\n } catch {\n // ignore\n }\n return \"unknown\";\n}\n\nexport async function entry(args: string[]) {\n const parsedArgs = arg(\n {\n \"--version\": Boolean,\n \"--help\": Boolean,\n \"-v\": \"--version\",\n \"-h\": \"--help\"\n },\n {\n argv: args.slice(2),\n permissive: true\n }\n );\n\n if (parsedArgs[\"--version\"]) {\n console.log(getVersion());\n return;\n }\n\n const command = parsedArgs._[0];\n const subcommand = parsedArgs._[1];\n\n // Show global help only when no command given, or --help with no recognized command\n const namespacedCommands = [\"schema\", \"db\", \"dev\", \"auth\", \"doctor\"];\n if (!command || (parsedArgs[\"--help\"] && !namespacedCommands.includes(command))) {\n printHelp();\n return;\n }\n\n // For namespaced commands with --help, pass it through as subcommand\n const effectiveSubcommand = parsedArgs[\"--help\"] ? \"--help\" : subcommand;\n\n switch (command) {\n case \"init\":\n await createRebaseApp(args);\n break;\n\n case \"generate-sdk\": {\n // Legacy command — kept for backward compatibility\n const sdkArgs = arg(\n {\n \"--collections-dir\": String,\n \"--output\": String,\n \"-c\": \"--collections-dir\",\n \"-o\": \"--output\"\n },\n {\n argv: args.slice(3),\n permissive: true\n }\n );\n await generateSdkCommand({\n collectionsDir: sdkArgs[\"--collections-dir\"] || \"./config/collections\",\n output: sdkArgs[\"--output\"] || \"./generated/sdk\",\n cwd: process.cwd()\n });\n break;\n }\n\n case \"schema\":\n await schemaCommand(effectiveSubcommand, args);\n break;\n\n case \"db\":\n await dbCommand(effectiveSubcommand, args);\n break;\n\n case \"dev\":\n await devCommand(args);\n break;\n\n case \"auth\":\n await authCommand(effectiveSubcommand, args);\n break;\n\n case \"doctor\":\n await doctorCommand(args);\n break;\n\n default:\n console.log(chalk.red(`Unknown command: ${command}`));\n console.log(\"\");\n printHelp();\n }\n}\n\nfunction printHelp() {\n console.log(`\n${chalk.bold(\"Rebase CLI\")} — Developer tools for Rebase projects\n\n${chalk.green.bold(\"Usage\")}\n rebase ${chalk.blue(\"<command>\")} [options]\n\n${chalk.green.bold(\"Commands\")}\n ${chalk.blue.bold(\"init\")} Create a new Rebase project\n ${chalk.blue.bold(\"dev\")} Start the development server\n\n${chalk.green.bold(\"Schema\")}\n ${chalk.blue.bold(\"schema generate\")} Generate Drizzle schema from collections\n ${chalk.blue.bold(\"schema\")} ${chalk.gray(\"--help\")} Show schema command help\n\n${chalk.green.bold(\"Database\")}\n ${chalk.blue.bold(\"db push\")} Apply schema directly to database ${chalk.gray(\"(dev)\")}\n ${chalk.blue.bold(\"db pull\")} Introspect database → Drizzle schema\n ${chalk.blue.bold(\"db generate\")} Generate SQL migration files\n ${chalk.blue.bold(\"db migrate\")} Run pending migrations\n ${chalk.blue.bold(\"db studio\")} Open Drizzle Studio\n ${chalk.blue.bold(\"db\")} ${chalk.gray(\"--help\")} Show database command help\n\n${chalk.green.bold(\"SDK\")}\n ${chalk.blue.bold(\"generate-sdk\")} Generate a typed JS SDK from collections\n\n${chalk.green.bold(\"Auth\")}\n ${chalk.blue.bold(\"auth reset-password\")} Reset a user's password\n ${chalk.blue.bold(\"auth\")} ${chalk.gray(\"--help\")} Show auth command help\n\n${chalk.green.bold(\"Diagnostics\")}\n ${chalk.blue.bold(\"doctor\")} Detect schema drift between collections, schema, and DB\n\n${chalk.green.bold(\"Options\")}\n ${chalk.blue(\"--version, -v\")} Show version number\n ${chalk.blue(\"--help, -h\")} Show this help message\n\n${chalk.gray(\"Documentation: https://rebase.pro/docs\")}\n`);\n}\n","/**\n * Authentication helpers for the Rebase CLI.\n *\n * Token storage lives at ~/.rebase/tokens.json (prod) or\n * ~/.rebase/staging.tokens.json (dev).\n */\nimport fs from \"fs\";\nimport path from \"path\";\nimport * as os from \"os\";\n\nconst TOKEN_DIR = path.join(os.homedir(), \".rebase\");\n\nfunction tokenPath(env: \"prod\" | \"dev\"): string {\n return path.join(TOKEN_DIR, (env === \"dev\" ? \"staging.\" : \"\") + \"tokens.json\");\n}\n\n// ─── Token persistence ────────────────────────────────────\n\nfunction saveTokens(tokens: object, env: \"prod\" | \"dev\") {\n if (!fs.existsSync(TOKEN_DIR)) {\n fs.mkdirSync(TOKEN_DIR, { recursive: true });\n }\n fs.writeFileSync(tokenPath(env), JSON.stringify(tokens));\n}\n\n// ─── Public API ───────────────────────────────────────────\n\nexport async function getTokens(env: \"prod\" | \"dev\", _debug?: boolean): Promise<object | null> {\n const fp = tokenPath(env);\n if (!fs.existsSync(fp)) return null;\n try {\n const data = fs.readFileSync(fp, \"utf-8\");\n return JSON.parse(data);\n } catch {\n return null;\n }\n}\n\nexport function parseJwt(token: string): object {\n if (!token) throw new Error(\"No JWT token\");\n const base64Url = token.split(\".\")[1];\n const base64 = base64Url.replace(/-/g, \"+\").replace(/_/g, \"/\");\n const buffer = Buffer.from(base64, \"base64\");\n return JSON.parse(buffer.toString());\n}\n\nexport async function refreshCredentials(\n env: \"dev\" | \"prod\",\n credentials?: object | null,\n _onErr?: (e: unknown) => void\n): Promise<object | null> {\n if (!credentials) return null;\n // If the token hasn't expired, just return it.\n const expiryDate = new Date((credentials as Record<string, unknown>)[\"expiry_date\"] as number);\n if (expiryDate.getTime() > Date.now()) {\n return credentials;\n }\n // Without a server endpoint we can't actually refresh –\n // the caller should handle the null return by re-authenticating.\n return null;\n}\n\nexport async function login(env: \"prod\" | \"dev\", _debug?: boolean): Promise<void> {\n console.log(\n \"Interactive login is not yet implemented in @rebasepro/cli.\\n\" +\n \"Please authenticate via the Rebase dashboard and copy your tokens to \" +\n tokenPath(env)\n );\n}\n\nexport async function logout(env: \"prod\" | \"dev\", _debug?: boolean): Promise<void> {\n const fp = tokenPath(env);\n if (fs.existsSync(fp)) {\n fs.unlinkSync(fp);\n console.log(\"You have been logged out.\");\n } else {\n console.log(\"You are not logged in.\");\n }\n}\n"],"names":["promisify","__filename","fileURLToPath","__dirname","mod","exported","generateSDK","execSync","spawn","os"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../src/commands/init.ts","../src/commands/generate_sdk.ts","../src/utils/project.ts","../src/commands/schema.ts","../src/commands/db.ts","../src/commands/dev.ts","../src/commands/auth.ts","../src/commands/doctor.ts","../src/cli.ts","../src/auth.ts"],"sourcesContent":["import arg from \"arg\";\nimport inquirer from \"inquirer\";\nimport chalk from \"chalk\";\nimport path from \"path\";\nimport fs from \"fs\";\nimport { promisify } from \"util\";\nimport execa from \"execa\";\nimport ncp from \"ncp\";\nimport { fileURLToPath } from \"url\";\nimport crypto from \"crypto\";\n\nconst access = promisify(fs.access);\nconst copy = promisify(ncp);\n\n// Resolve template path relative to this file\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\nfunction findParentDir(currentDir: string, targetName: string): string | null {\n const root = path.parse(currentDir).root;\n while (currentDir && currentDir !== root) {\n if (path.basename(currentDir) === targetName) {\n return currentDir;\n }\n currentDir = path.dirname(currentDir);\n }\n return null;\n}\n\nconst cliRoot = findParentDir(__dirname, \"cli\");\n\nexport interface InitOptions {\n projectName: string;\n git: boolean;\n installDeps: boolean;\n targetDirectory: string;\n templateDirectory: string;\n}\n\nexport async function createRebaseApp(rawArgs: string[]) {\n console.log(`\n${chalk.bold(\"Rebase\")} — Create a new project 🚀\n`);\n\n const options = await promptForOptions(rawArgs);\n await createProject(options);\n}\n\nasync function promptForOptions(rawArgs: string[]): Promise<InitOptions> {\n const args = arg(\n {\n \"--git\": Boolean,\n \"--install\": Boolean,\n \"-g\": \"--git\",\n \"-i\": \"--install\"\n },\n {\n argv: rawArgs.slice(3), // skip \"node\", \"rebase\", \"init\"\n permissive: true\n }\n );\n\n // The first positional arg after \"init\" is the project name\n const nameArg = args._[0];\n\n const questions: Record<string, unknown>[] = [];\n\n if (!nameArg) {\n questions.push({\n type: \"input\",\n name: \"projectName\",\n message: \"Project name:\",\n default: \"my-rebase-app\",\n validate: (input: string) => {\n if (!input.trim()) return \"Project name is required\";\n if (!/^[a-z0-9][a-z0-9._-]*$/.test(input)) {\n return \"Project name must start with a lowercase letter or number and contain only lowercase letters, numbers, hyphens, dots, or underscores\";\n }\n return true;\n }\n });\n }\n\n if (!args[\"--git\"]) {\n questions.push({\n type: \"confirm\",\n name: \"git\",\n message: \"Initialize a git repository?\",\n default: true\n });\n }\n\n if (!args[\"--install\"]) {\n questions.push({\n type: \"confirm\",\n name: \"installDeps\",\n message: \"Install dependencies with pnpm?\",\n default: true\n });\n }\n\n const answers = await inquirer.prompt(questions as unknown as Parameters<typeof inquirer.prompt>[0]);\n\n const projectName = nameArg || answers.projectName;\n const targetDirectory = path.resolve(process.cwd(), projectName);\n const templateDirectory = path.resolve(cliRoot!, \"templates\", \"template\");\n\n return {\n projectName,\n git: args[\"--git\"] || answers.git || false,\n installDeps: args[\"--install\"] || answers.installDeps || false,\n targetDirectory,\n templateDirectory\n };\n}\n\nasync function createProject(options: InitOptions) {\n // Check if directory already exists and is not empty\n if (fs.existsSync(options.targetDirectory)) {\n if (fs.readdirSync(options.targetDirectory).length !== 0) {\n console.error(`${chalk.red.bold(\"ERROR\")} Directory \"${options.projectName}\" already exists and is not empty`);\n process.exit(1);\n }\n } else {\n fs.mkdirSync(options.targetDirectory, { recursive: true });\n }\n\n // Verify template exists\n try {\n await access(options.templateDirectory, fs.constants.R_OK);\n } catch {\n console.error(`${chalk.red.bold(\"ERROR\")} Template not found at ${options.templateDirectory}`);\n process.exit(1);\n }\n\n // Copy template files\n console.log(chalk.gray(\" Copying project files...\"));\n try {\n await copy(options.templateDirectory, options.targetDirectory, {\n clobber: false,\n dot: true,\n filter: (source: string) => {\n const basename = path.basename(source);\n // Skip node_modules and .DS_Store\n return basename !== \"node_modules\" && basename !== \".DS_Store\";\n }\n });\n } catch (err: unknown) {\n console.error(`${chalk.red.bold(\"ERROR\")} Failed to copy template files: ${err instanceof Error ? err.message : String(err)}`);\n process.exit(1);\n }\n\n // Replace placeholder project name in package.json files\n await replacePlaceholders(options);\n\n // Rename .env.template to .env if it exists and randomize secrets\n const envTemplatePath = path.join(options.targetDirectory, \".env.template\");\n const envPath = path.join(options.targetDirectory, \".env\");\n if (fs.existsSync(envTemplatePath) && !fs.existsSync(envPath)) {\n fs.renameSync(envTemplatePath, envPath);\n\n // Generate secure random strings\n const jwtSecret = crypto.randomBytes(32).toString(\"hex\");\n const dbPassword = crypto.randomBytes(16).toString(\"hex\");\n\n let envContent = fs.readFileSync(envPath, \"utf-8\");\n envContent = envContent.replace(\n \"postgresql://rebase:password@localhost:5432/rebase\",\n `postgresql://rebase:${dbPassword}@localhost:5432/rebase`\n );\n envContent = envContent.replace(\n \"change-this-to-a-secure-random-string\",\n jwtSecret\n );\n\n // Append POSTGRES_PASSWORD for docker-compose interpolation\n envContent += `\\n# Docker Compose Database Password\\nPOSTGRES_PASSWORD=${dbPassword}\\n`;\n\n fs.writeFileSync(envPath, envContent, \"utf-8\");\n }\n\n // Initialize git\n if (options.git) {\n console.log(chalk.gray(\" Initializing git repository...\"));\n try {\n await execa(\"git\", [\"init\"], { cwd: options.targetDirectory });\n } catch {\n console.warn(chalk.yellow(\" Warning: Failed to initialize git repository\"));\n }\n }\n\n if (options.installDeps) {\n console.log(\"\");\n console.log(chalk.gray(\" Installing dependencies with pnpm...\"));\n console.log(\"\");\n try {\n await execa(\"pnpm\", [\"install\"], {\n cwd: options.targetDirectory,\n stdio: \"inherit\"\n });\n } catch {\n console.warn(chalk.yellow(\" Warning: Failed to install dependencies. You may need to run `pnpm install` manually.\"));\n }\n }\n\n // Success message\n console.log(\"\");\n console.log(`${chalk.green.bold(\"✓\")} Project ${chalk.bold(options.projectName)} created successfully!`);\n console.log(\"\");\n console.log(chalk.bold(\"Next steps:\"));\n console.log(\"\");\n console.log(` ${chalk.cyan(\"cd\")} ${options.projectName}`);\n if (!options.installDeps) {\n console.log(` ${chalk.cyan(\"pnpm install\")}`);\n }\n console.log(\"\");\n console.log(chalk.gray(\" # Set up your database connection in .env\"));\n console.log(chalk.gray(\" # Then run:\"));\n console.log(\"\");\n console.log(` ${chalk.cyan(\"pnpm dev\")}`);\n console.log(\"\");\n console.log(chalk.gray(\"This starts both the backend (Hono + PostgreSQL)\")\n + chalk.gray(\" and the frontend (Vite + React) concurrently.\"));\n console.log(\"\");\n console.log(chalk.gray(\"Docs: https://rebase.pro/docs\"));\n console.log(chalk.gray(\"GitHub: https://github.com/rebasepro/rebase\"));\n console.log(\"\");\n}\n\nasync function replacePlaceholders(options: InitOptions) {\n const filesToProcess = [\n \"package.json\",\n \"frontend/package.json\",\n \"backend/package.json\",\n \"config/package.json\",\n \"frontend/index.html\"\n ];\n\n for (const file of filesToProcess) {\n const fullPath = path.resolve(options.targetDirectory, file);\n if (!fs.existsSync(fullPath)) continue;\n\n let content = fs.readFileSync(fullPath, \"utf-8\");\n content = content.replace(/\\{\\{PROJECT_NAME\\}\\}/g, options.projectName);\n fs.writeFileSync(fullPath, content, \"utf-8\");\n }\n}\n","/**\n * CLI command: generate-sdk\n *\n * Reads collection definitions from a specified directory (default: ./config/collections),\n * generates a typed JS SDK, and writes it to the output directory (default: ./generated/sdk).\n *\n * Uses jiti for dynamic TypeScript import of collection files.\n */\n\nimport fs from \"fs\";\nimport path from \"path\";\nimport chalk from \"chalk\";\nimport { EntityCollection } from \"@rebasepro/types\";\nimport { generateSDK, GeneratedFile } from \"@rebasepro/sdk-generator\";\n\ninterface GenerateSDKArgs {\n collectionsDir: string;\n output: string;\n cwd: string;\n}\n\n/**\n * Dynamically load collection definitions from a directory.\n *\n * Expects the directory to have an index.ts/index.js that exports a default\n * array of EntityCollection objects (matching the app/config/collections pattern).\n */\nasync function loadCollections(collectionsDir: string): Promise<EntityCollection[]> {\n const absDir = path.resolve(collectionsDir);\n\n if (!fs.existsSync(absDir)) {\n throw new Error(`Collections directory not found: ${absDir}`);\n }\n\n // Try to import the index file using jiti (supports TypeScript natively)\n let jiti: (id: string, userOptions?: Record<string, unknown>) => (modulePath: string) => Record<string, unknown>;\n try {\n const jitiModule = await import(\"jiti\");\n jiti = (jitiModule.default || jitiModule) as unknown as typeof jiti;\n } catch {\n throw new Error(\n \"Could not load 'jiti'. Install it with: pnpm add -D jiti\\n\" +\n \"jiti is required to dynamically import TypeScript collection definitions.\"\n );\n }\n\n const jitiInstance = jiti(absDir, {\n interopDefault: true,\n esmResolve: true\n });\n\n // Look for index file\n const indexCandidates = [\"index.ts\", \"index.js\", \"index.mjs\"];\n let indexPath: string | null = null;\n\n for (const candidate of indexCandidates) {\n const p = path.join(absDir, candidate);\n if (fs.existsSync(p)) {\n indexPath = p;\n break;\n }\n }\n\n if (!indexPath) {\n // Fallback: load each .ts/.js file individually\n console.log(chalk.yellow(\" No index file found, scanning individual collection files...\"));\n const collections: EntityCollection[] = [];\n const files = fs.readdirSync(absDir).filter(f =>\n (f.endsWith(\".ts\") || f.endsWith(\".js\")) && !f.startsWith(\".\")\n );\n\n for (const file of files) {\n try {\n const mod = jitiInstance(path.join(absDir, file));\n const exported = mod.default || mod;\n if (exported && typeof exported === \"object\" && \"slug\" in exported) {\n collections.push(exported as EntityCollection);\n } else if (Array.isArray(exported)) {\n collections.push(...exported);\n }\n } catch (err) {\n console.warn(chalk.yellow(` ⚠ Skipping ${file}: ${(err as Error).message}`));\n }\n }\n\n return collections;\n }\n\n // Import the index\n const mod = jitiInstance(indexPath);\n const exported = mod.default || mod;\n\n if (Array.isArray(exported)) {\n return exported as EntityCollection[];\n } else if (typeof exported === \"object\" && exported !== null) {\n // Could be a named export like { collections: [...] }\n if (\"collections\" in exported && Array.isArray(exported.collections)) {\n return exported.collections;\n }\n // Or individual named exports\n const collections: EntityCollection[] = [];\n for (const value of Object.values(exported)) {\n if (value && typeof value === \"object\" && \"slug\" in (value as EntityCollection)) {\n collections.push(value as EntityCollection);\n }\n }\n if (collections.length > 0) return collections;\n }\n\n throw new Error(\n `Could not extract collections from ${indexPath}.\\n` +\n \"Expected a default export of EntityCollection[] or an object with named collection exports.\"\n );\n}\n\n/**\n * Write generated files to the output directory.\n */\nfunction writeFiles(outputDir: string, files: GeneratedFile[]): void {\n const absOutput = path.resolve(outputDir);\n\n // Create output directory\n fs.mkdirSync(absOutput, { recursive: true });\n\n for (const file of files) {\n const filePath = path.join(absOutput, file.path);\n const dir = path.dirname(filePath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n fs.writeFileSync(filePath, file.content, \"utf-8\");\n }\n}\n\n/**\n * Main entry point for the generate-sdk command.\n */\nexport async function generateSdkCommand(args: GenerateSDKArgs): Promise<void> {\n const { collectionsDir, output, cwd } = args;\n\n const resolvedCollectionsDir = path.isAbsolute(collectionsDir)\n ? collectionsDir\n : path.join(cwd, collectionsDir);\n\n const resolvedOutput = path.isAbsolute(output)\n ? output\n : path.join(cwd, output);\n\n console.log(\"\");\n console.log(chalk.bold(\" 🔧 Rebase SDK Generator\"));\n console.log(\"\");\n console.log(` ${chalk.gray(\"Collections:\")} ${resolvedCollectionsDir}`);\n console.log(` ${chalk.gray(\"Output:\")} ${resolvedOutput}`);\n console.log(\"\");\n\n // 1. Load collections\n console.log(chalk.cyan(\" → Loading collection definitions...\"));\n const collections = await loadCollections(resolvedCollectionsDir);\n\n if (collections.length === 0) {\n console.log(chalk.red(\" ✗ No collections found. Nothing to generate.\"));\n process.exit(1);\n }\n\n console.log(chalk.green(` ✓ Found ${collections.length} collection(s): ${collections.map(c => c.slug).join(\", \")}`));\n console.log(\"\");\n\n // 2. Generate SDK files\n console.log(chalk.cyan(\" → Generating SDK files...\"));\n const files = generateSDK(collections);\n console.log(chalk.green(` ✓ Generated ${files.length} file(s)`));\n\n // 3. Write to disk\n console.log(chalk.cyan(` → Writing to ${resolvedOutput}...`));\n writeFiles(resolvedOutput, files);\n\n console.log(\"\");\n console.log(chalk.green.bold(\" ✓ SDK generated successfully!\"));\n console.log(\"\");\n console.log(chalk.gray(\" Usage:\"));\n console.log(chalk.gray(\" import { createRebaseClient } from '@rebasepro/client';\"));\n console.log(chalk.gray(` import type { Database } from './${path.relative(cwd, path.join(resolvedOutput, \"database.types\"))}';`));\n console.log(\"\");\n console.log(chalk.gray(\" const rebase = createRebaseClient<Database>({\"));\n console.log(chalk.gray(\" baseUrl: 'http://localhost:3001',\"));\n console.log(chalk.gray(\" // token: 'your-jwt-token',\"));\n console.log(chalk.gray(\" });\"));\n console.log(\"\");\n console.log(chalk.gray(` const { data } = await rebase.collection('${collections[0]?.slug || \"my_collection\"}').find();`));\n console.log(\"\");\n}\n","/**\n * Project discovery utilities for the Rebase CLI.\n *\n * These helpers locate the project root, backend directory, .env file,\n * and local binaries — used by all CLI command modules.\n */\nimport fs from \"fs\";\nimport path from \"path\";\nimport { execSync } from \"child_process\";\nimport chalk from \"chalk\";\n\n/**\n * Walk up from `startDir` to find the Rebase project root.\n *\n * The root is identified by a `package.json` that either:\n * - has `workspaces` containing \"backend\" or \"frontend\", OR\n * - has a sibling `backend/` directory\n */\nexport function findProjectRoot(startDir: string = process.cwd()): string | null {\n let dir = path.resolve(startDir);\n const root = path.parse(dir).root;\n\n while (dir !== root) {\n const pkgPath = path.join(dir, \"package.json\");\n\n if (fs.existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, \"utf-8\"));\n // Check for workspace-based project (monorepo root)\n if (pkg.workspaces && Array.isArray(pkg.workspaces)) {\n const hasBackend = pkg.workspaces.some((w: string) =>\n w === \"backend\" || w.includes(\"backend\")\n );\n if (hasBackend) return dir;\n }\n } catch {\n // ignore parse errors\n }\n\n // Check for sibling backend directory\n if (fs.existsSync(path.join(dir, \"backend\")) && fs.existsSync(path.join(dir, \"config\"))) {\n return dir;\n }\n }\n\n dir = path.dirname(dir);\n }\n\n return null;\n}\n\n/**\n * Locate the backend directory within the project root.\n */\nexport function findBackendDir(projectRoot: string): string | null {\n const backendDir = path.join(projectRoot, \"backend\");\n return fs.existsSync(backendDir) ? backendDir : null;\n}\n\n/**\n * Detect the active backend plugin (e.g. @rebasepro/server-postgresql) from the backend's package.json.\n */\nexport function getActiveBackendPlugin(backendDir: string): string | null {\n const pkgPath = path.join(backendDir, \"package.json\");\n if (!fs.existsSync(pkgPath)) return null;\n\n try {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, \"utf-8\"));\n const deps = { ...pkg.dependencies,\n...pkg.devDependencies };\n\n // Find the first dependency that matches @rebasepro/server-* (database driver plugins),\n // but not @rebasepro/server-core which is the framework itself\n for (const dep of Object.keys(deps)) {\n if (dep.startsWith(\"@rebasepro/server-\") && dep !== \"@rebasepro/server-core\") {\n return dep;\n }\n }\n } catch {\n // Ignore parse errors\n }\n return null;\n}\n\n/**\n * Resolve the active plugin's CLI script.\n */\nexport function resolvePluginCliScript(backendDir: string, pluginName: string): string | null {\n const candidates = [\n path.join(backendDir, \"node_modules\", pluginName, \"src\", \"cli.ts\"),\n path.join(backendDir, \"node_modules\", pluginName, \"dist\", \"cli.js\"),\n // For monorepo dev mode:\n path.resolve(backendDir, \"..\", \"..\", \"packages\", pluginName.replace(\"@rebasepro/\", \"\"), \"src\", \"cli.ts\"),\n path.resolve(backendDir, \"..\", \"packages\", pluginName.replace(\"@rebasepro/\", \"\"), \"src\", \"cli.ts\")\n ];\n\n for (const candidate of candidates) {\n if (fs.existsSync(candidate)) return candidate;\n }\n return null;\n}\n\n/**\n * Locate the frontend directory within the project root.\n */\nexport function findFrontendDir(projectRoot: string): string | null {\n const frontendDir = path.join(projectRoot, \"frontend\");\n return fs.existsSync(frontendDir) ? frontendDir : null;\n}\n\n/**\n * Find the .env file. Checks the project root first, then backend.\n */\nexport function findEnvFile(projectRoot: string): string | null {\n const candidates = [\n path.join(projectRoot, \".env\"),\n path.join(projectRoot, \"backend\", \".env\")\n ];\n\n for (const candidate of candidates) {\n if (fs.existsSync(candidate)) return candidate;\n }\n\n return null;\n}\n\n/**\n * Resolve a binary from the project's node_modules/.bin.\n * Checks backend, root, parent monorepo root, then falls back to PATH.\n */\nexport function resolveLocalBin(projectRoot: string, binName: string): string | null {\n const candidates = [\n path.join(projectRoot, \"backend\", \"node_modules\", \".bin\", binName),\n path.join(projectRoot, \"node_modules\", \".bin\", binName)\n ];\n\n // Also check parent directories (for monorepo setups where app/ is nested)\n let parent = path.dirname(projectRoot);\n const rootDir = path.parse(parent).root;\n while (parent !== rootDir) {\n candidates.push(path.join(parent, \"node_modules\", \".bin\", binName));\n parent = path.dirname(parent);\n }\n\n for (const candidate of candidates) {\n if (fs.existsSync(candidate)) return candidate;\n }\n\n // Fall back to globally installed binary via which\n try {\n const globalPath = execSync(`which ${binName}`, { encoding: \"utf-8\" }).trim();\n if (globalPath && fs.existsSync(globalPath)) return globalPath;\n } catch {\n // not found globally\n }\n\n return null;\n}\n\n/**\n * Resolve the tsx binary. Checks backend node_modules first, then root.\n */\nexport function resolveTsx(projectRoot: string): string | null {\n return resolveLocalBin(projectRoot, \"tsx\");\n}\n\n/**\n * Require the project root or exit with a helpful error.\n */\nexport function requireProjectRoot(): string {\n const root = findProjectRoot();\n if (!root) {\n console.error(chalk.red(\"✗ Could not find a Rebase project root.\"));\n console.error(chalk.gray(\" Make sure you are inside a Rebase project directory\"));\n console.error(chalk.gray(\" (one with backend/, frontend/, and shared/ directories).\"));\n process.exit(1);\n }\n return root;\n}\n\n/**\n * Require the backend directory or exit with a helpful error.\n */\nexport function requireBackendDir(projectRoot: string): string {\n const backendDir = findBackendDir(projectRoot);\n if (!backendDir) {\n console.error(chalk.red(\"✗ Could not find a backend/ directory.\"));\n console.error(chalk.gray(` Expected at: ${path.join(projectRoot, \"backend\")}`));\n process.exit(1);\n }\n return backendDir;\n}\n","/**\n * CLI command: rebase schema <action>\n */\nimport chalk from \"chalk\";\nimport execa from \"execa\";\nimport {\n requireProjectRoot,\n requireBackendDir,\n getActiveBackendPlugin,\n resolvePluginCliScript,\n resolveTsx,\n findEnvFile\n} from \"../utils/project\";\n\nexport async function schemaCommand(subcommand: string | undefined, rawArgs: string[]): Promise<void> {\n if (!subcommand || subcommand === \"--help\") {\n printSchemaHelp();\n return;\n }\n\n const projectRoot = requireProjectRoot();\n const backendDir = requireBackendDir(projectRoot);\n\n const activePlugin = getActiveBackendPlugin(backendDir);\n if (!activePlugin) {\n console.error(chalk.red(\"✗ Could not detect an active database plugin.\"));\n console.error(chalk.gray(\" Make sure a package like @rebasepro/server-postgresql is installed in backend/package.json.\"));\n process.exit(1);\n }\n\n const pluginCli = resolvePluginCliScript(backendDir, activePlugin);\n if (!pluginCli) {\n console.error(chalk.red(`✗ Could not find CLI entry point for ${activePlugin}.`));\n process.exit(1);\n }\n\n // Set up environment with DOTENV_CONFIG_PATH\n const envFile = findEnvFile(projectRoot);\n const env: Record<string, string> = { ...process.env as Record<string, string> };\n if (envFile) {\n env.DOTENV_CONFIG_PATH = envFile;\n }\n\n try {\n const isTs = pluginCli.endsWith(\".ts\");\n if (isTs) {\n const tsxBin = resolveTsx(projectRoot);\n if (!tsxBin) {\n console.error(chalk.red(\"✗ Could not find tsx binary.\"));\n process.exit(1);\n }\n await execa(tsxBin, [pluginCli, ...rawArgs.slice(2)], {\n cwd: backendDir,\n stdio: \"inherit\",\n env\n });\n } else {\n await execa(\"node\", [pluginCli, ...rawArgs.slice(2)], {\n cwd: backendDir,\n stdio: \"inherit\",\n env\n });\n }\n } catch (err: unknown) {\n process.exit(1);\n }\n}\n\nfunction printSchemaHelp() {\n console.log(`\n${chalk.bold(\"rebase schema\")} — Schema management commands\n\n${chalk.green.bold(\"Usage\")}\n rebase schema ${chalk.blue(\"<command>\")} [options]\n\n${chalk.green.bold(\"Commands\")}\n ${chalk.gray(\"(Commands are provided by your active database driver plugin)\")}\n ${chalk.blue.bold(\"generate\")} Generate Schema from collection definitions\n\n${chalk.green.bold(\"generate Options\")}\n ${chalk.blue(\"--collections, -c\")} Path to collections directory\n ${chalk.blue(\"--output, -o\")} Output path for generated schema\n ${chalk.blue(\"--watch, -w\")} Watch for changes and regenerate automatically\n`);\n}\n","/**\n * CLI command: rebase db <action>\n */\nimport chalk from \"chalk\";\nimport execa from \"execa\";\nimport {\n requireProjectRoot,\n requireBackendDir,\n getActiveBackendPlugin,\n resolvePluginCliScript,\n resolveTsx,\n findEnvFile\n} from \"../utils/project\";\n\nexport async function dbCommand(subcommand: string | undefined, rawArgs: string[]): Promise<void> {\n if (!subcommand || subcommand === \"--help\") {\n printDbHelp();\n return;\n }\n\n const projectRoot = requireProjectRoot();\n const backendDir = requireBackendDir(projectRoot);\n\n const activePlugin = getActiveBackendPlugin(backendDir);\n if (!activePlugin) {\n console.error(chalk.red(\"✗ Could not detect an active database plugin.\"));\n console.error(chalk.gray(\" Make sure a package like @rebasepro/server-postgresql is installed in backend/package.json.\"));\n process.exit(1);\n }\n\n const pluginCli = resolvePluginCliScript(backendDir, activePlugin);\n if (!pluginCli) {\n console.error(chalk.red(`✗ Could not find CLI entry point for ${activePlugin}.`));\n process.exit(1);\n }\n\n // Set up environment with DOTENV_CONFIG_PATH\n const envFile = findEnvFile(projectRoot);\n const env: Record<string, string> = { ...process.env as Record<string, string> };\n if (envFile) {\n env.DOTENV_CONFIG_PATH = envFile;\n }\n\n try {\n const isTs = pluginCli.endsWith(\".ts\");\n if (isTs) {\n const tsxBin = resolveTsx(projectRoot);\n if (!tsxBin) {\n console.error(chalk.red(\"✗ Could not find tsx binary.\"));\n process.exit(1);\n }\n await execa(tsxBin, [pluginCli, ...rawArgs.slice(2)], {\n cwd: backendDir,\n stdio: \"inherit\",\n env\n });\n } else {\n await execa(\"node\", [pluginCli, ...rawArgs.slice(2)], {\n cwd: backendDir,\n stdio: \"inherit\",\n env\n });\n }\n } catch (err: unknown) {\n // If the process exits with an error code, execa will throw,\n // but inherit stdio means the user already saw the output.\n process.exit(1);\n }\n}\n\nfunction printDbHelp() {\n console.log(`\n${chalk.bold(\"rebase db\")} — Database management commands\n\n${chalk.green.bold(\"Usage\")}\n rebase db ${chalk.blue(\"<command>\")} [options]\n\n${chalk.green.bold(\"Commands\")}\n ${chalk.gray(\"(Commands are provided by your active database driver plugin)\")}\n ${chalk.blue.bold(\"push\")} Apply schema directly to database (development)\n ${chalk.blue.bold(\"pull\")} Introspect database → Schema\n ${chalk.blue.bold(\"generate\")} Generate migration files\n ${chalk.blue.bold(\"migrate\")} Run pending migrations\n ${chalk.blue.bold(\"studio\")} Open Studio viewer\n ${chalk.blue.bold(\"branch\")} Database branching (create, list, delete, info)\n\n${chalk.green.bold(\"Examples\")}\n ${chalk.gray(\"# Quick development workflow\")}\n rebase schema generate && rebase db push\n\n ${chalk.gray(\"# Production migration workflow\")}\n rebase db generate\n rebase db migrate\n\n ${chalk.gray(\"# Create a database branch\")}\n rebase db branch create feature_auth\n`);\n}\n","/**\n * CLI command: rebase dev\n *\n * Starts the full development environment:\n * - Backend: tsx watch with auto-reload\n * - Frontend: vite dev server\n *\n * Both processes stream output with color-coded prefixes.\n *\n * When the backend uses port-retry (i.e. the configured port is busy and it\n * binds to the next free one), the CLI detects the actual port from stdout\n * and injects VITE_API_URL into the frontend so it connects automatically.\n *\n * Each project gets a deterministic default port derived from the project\n * root path, so multiple Rebase instances never collide.\n */\nimport arg from \"arg\";\nimport chalk from \"chalk\";\nimport execa, { ExecaChildProcess } from \"execa\";\nimport path from \"path\";\nimport fs from \"fs\";\nimport {\n requireProjectRoot,\n findBackendDir,\n findFrontendDir,\n findEnvFile,\n resolveTsx\n} from \"../utils/project\";\n\n/** Well-known filename the backend writes its actual port to. */\nconst DEV_PORT_FILENAME = \".rebase-dev-port\";\n\n/**\n * Compute a deterministic port from the project root path.\n * Range: 3001–3999 (avoids privileged ports and common services).\n * Two different project directories will almost always get different ports.\n */\nfunction getProjectPort(projectRoot: string): number {\n let hash = 0;\n for (let i = 0; i < projectRoot.length; i++) {\n hash = ((hash << 5) - hash + projectRoot.charCodeAt(i)) | 0;\n }\n return 3001 + (Math.abs(hash) % 999);\n}\n\n/**\n * Resolve the best starting port for this project:\n * 1. Explicit --port flag (highest priority)\n * 2. PORT env var\n * 3. Previously used port from .rebase-dev-port (port affinity across restarts)\n * 4. Deterministic hash from project path (unique per project)\n */\nfunction resolveStartPort(projectRoot: string, explicitPort?: number): number {\n // 1. Explicit flag\n if (explicitPort) return explicitPort;\n\n // 2. PORT env var\n if (process.env.PORT) return parseInt(process.env.PORT, 10);\n\n // 3. Port affinity — check if we wrote a port file from a previous run\n try {\n const portFile = path.join(projectRoot, DEV_PORT_FILENAME);\n if (fs.existsSync(portFile)) {\n const saved = parseInt(fs.readFileSync(portFile, \"utf-8\").trim(), 10);\n if (saved > 0 && saved < 65536) return saved;\n }\n } catch { /* ignore */ }\n\n // 4. Deterministic hash\n return getProjectPort(projectRoot);\n}\n\nexport async function devCommand(rawArgs: string[]): Promise<void> {\n const args = arg(\n {\n \"--backend-only\": Boolean,\n \"--frontend-only\": Boolean,\n \"--port\": Number,\n \"--help\": Boolean,\n \"-b\": \"--backend-only\",\n \"-f\": \"--frontend-only\",\n \"-p\": \"--port\",\n \"-h\": \"--help\"\n },\n {\n argv: rawArgs.slice(3), // skip \"node rebase dev\"\n permissive: true\n }\n );\n\n if (args[\"--help\"]) {\n printDevHelp();\n return;\n }\n\n const projectRoot = requireProjectRoot();\n const backendDir = findBackendDir(projectRoot);\n const frontendDir = findFrontendDir(projectRoot);\n const backendOnly = args[\"--backend-only\"] || false;\n const frontendOnly = args[\"--frontend-only\"] || false;\n\n // Resolve the port ONCE, before starting anything\n const startPort = resolveStartPort(projectRoot, args[\"--port\"]);\n\n console.log(\"\");\n console.log(chalk.bold(\" 🚀 Rebase Dev Server\"));\n console.log(\"\");\n\n const children: ExecaChildProcess[] = [];\n\n // --- State for printing the banner ---\n let frontendUrl = \"\";\n let backendUrl = \"\";\n let debounceSummary: NodeJS.Timeout | null = null;\n let bannerPrinted = false;\n\n /** Actual backend port, resolved once the server prints its URL. */\n let resolvedBackendPort: number | null = null;\n\n // Use regex to strip ANSI codes before matching\n // eslint-disable-next-line no-control-regex\n const stripAnsi = (str: string) => str.replace(/[\\u001b\\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g, \"\");\n\n function printSummary() {\n if (!frontendUrl || !backendUrl) return;\n if (debounceSummary) clearTimeout(debounceSummary);\n debounceSummary = setTimeout(() => {\n if (bannerPrinted) return;\n console.log(\"\");\n console.log(chalk.cyan(\"┌────────────────────────────────────────────────────────────┐\"));\n console.log(chalk.cyan(\"│ │\"));\n console.log(chalk.cyan(\"│ ✨ Rebase Admin App is ready! │\"));\n const cleanUrl = stripAnsi(frontendUrl);\n const paddedUrl = cleanUrl.padEnd(40);\n console.log(chalk.cyan(\"│ 👉 Frontend URL: \") + chalk.white(paddedUrl) + chalk.cyan(\"│\"));\n console.log(chalk.cyan(\"│ │\"));\n console.log(chalk.cyan(\"└────────────────────────────────────────────────────────────┘\"));\n console.log(\"\");\n bannerPrinted = true;\n }, 500);\n }\n\n // Handle graceful shutdown\n const cleanup = () => {\n // Clean up dev port file\n try {\n const portFile = path.join(projectRoot, DEV_PORT_FILENAME);\n if (fs.existsSync(portFile)) fs.unlinkSync(portFile);\n\n const urlFile = path.join(projectRoot, \".rebase-dev-url\");\n if (fs.existsSync(urlFile)) fs.unlinkSync(urlFile);\n } catch { /* ignore */ }\n\n children.forEach((child) => {\n if (child.pid && !child.killed) {\n try {\n if (process.platform === \"win32\") {\n execa.commandSync(`taskkill /pid ${child.pid} /T /F`);\n } else {\n process.kill(-child.pid, \"SIGKILL\");\n }\n } catch (e) {\n try {\n child.kill(\"SIGKILL\");\n } catch (err) {\n // ignore\n }\n }\n }\n });\n process.exit(0);\n };\n process.on(\"SIGINT\", cleanup);\n process.on(\"SIGTERM\", cleanup);\n\n /**\n * Start the Vite frontend, optionally injecting the backend port.\n */\n function startFrontend(backendPort: number | null) {\n if (!frontendDir) return;\n\n console.log(` ${chalk.magenta(\"▶\")} Frontend: ${chalk.gray(frontendDir)}`);\n\n const frontendEnv: Record<string, string> = { ...process.env as Record<string, string> };\n\n // Inject the resolved backend URL so Vite picks it up\n if (backendPort) {\n frontendEnv.VITE_API_URL = `http://localhost:${backendPort}`;\n console.log(` ${chalk.gray(\"↳ VITE_API_URL\")} = ${chalk.white(`http://localhost:${backendPort}`)}`);\n }\n\n const frontendChild = execa(\n \"pnpm\",\n [\"run\", \"dev\"],\n {\n cwd: frontendDir,\n stdio: [\"inherit\", \"pipe\", \"pipe\"],\n env: frontendEnv,\n shell: true,\n detached: process.platform !== \"win32\"\n }\n );\n frontendChild.catch(() => {}); // prevent unhandled promise rejection on exit\n\n frontendChild.stdout?.on(\"data\", (data: Buffer) => {\n const lines = data.toString().split(\"\\n\").filter(Boolean);\n lines.forEach((line: string) => {\n console.log(`${chalk.magenta.bold(\"[admin]\")} ${line}`);\n const cleanLine = stripAnsi(line);\n const urlMatch = cleanLine.match(/(http:\\/\\/(?:localhost|127\\.0\\.0\\.1):\\d+)/);\n if (cleanLine.includes(\"Local:\") && urlMatch) {\n frontendUrl = urlMatch[1];\n printSummary();\n }\n });\n });\n\n frontendChild.stderr?.on(\"data\", (data: Buffer) => {\n const lines = data.toString().split(\"\\n\").filter(Boolean);\n lines.forEach((line: string) => {\n console.log(`${chalk.magenta.bold(\"[admin]\")} ${line}`);\n });\n });\n\n children.push(frontendChild);\n }\n\n // Start backend\n if (!frontendOnly && backendDir) {\n const tsxBin = resolveTsx(projectRoot);\n if (!tsxBin) {\n console.error(chalk.red(\" ✗ Could not find tsx binary for backend.\"));\n console.error(chalk.gray(\" Install it with: pnpm add -D tsx\"));\n process.exit(1);\n }\n\n const envFile = findEnvFile(projectRoot);\n const env: Record<string, string> = { ...process.env as Record<string, string> };\n if (envFile) {\n env.DOTENV_CONFIG_PATH = envFile;\n }\n\n // Always inject PORT so the backend uses our resolved port instead of\n // its hardcoded default (3001). This prevents cross-project collisions\n // when multiple Rebase instances run simultaneously.\n env.PORT = String(startPort);\n\n console.log(` ${chalk.cyan(\"▶\")} Backend: ${chalk.gray(backendDir)}`);\n console.log(` ${chalk.gray(\"↳ PORT\")} = ${chalk.white(String(startPort))}`);\n\n /** Whether the frontend has been launched (we only launch it once). */\n let frontendLaunched = false;\n\n const backendChild = execa(\n tsxBin,\n [\"watch\", `--watch=\"${path.join(\"..\", \"config\", \"**\", \"*\")}\"`, \"--conditions\", \"development\", \"src/index.ts\"],\n {\n cwd: backendDir,\n stdio: [\"inherit\", \"pipe\", \"pipe\"],\n env,\n shell: true,\n detached: process.platform !== \"win32\"\n }\n );\n backendChild.catch(() => {}); // prevent unhandled promise rejection on exit\n\n backendChild.stdout?.on(\"data\", (data: Buffer) => {\n const lines = data.toString().split(\"\\n\").filter(Boolean);\n lines.forEach((line: string) => {\n console.log(`${chalk.cyan.bold(\"[backend]\")} ${line}`);\n const cleanLine = stripAnsi(line);\n const serverMatch = cleanLine.match(/Server running at http:\\/\\/(?:localhost|127\\.0\\.0\\.1):(\\d+)/);\n if (serverMatch) {\n resolvedBackendPort = parseInt(serverMatch[1], 10);\n backendUrl = \"started\";\n printSummary();\n\n // Save the url to a temp file for scripts to pick up\n const urlFile = path.join(projectRoot, \".rebase-dev-url\");\n fs.writeFileSync(urlFile, `http://localhost:${resolvedBackendPort}`, \"utf-8\");\n\n // Save the port to .rebase-dev-port for port affinity\n const portFile = path.join(projectRoot, DEV_PORT_FILENAME);\n fs.writeFileSync(portFile, String(resolvedBackendPort), \"utf-8\");\n\n // Start frontend now that we know the real port\n if (!backendOnly && frontendDir && !frontendLaunched) {\n frontendLaunched = true;\n startFrontend(resolvedBackendPort);\n }\n }\n });\n });\n\n backendChild.stderr?.on(\"data\", (data: Buffer) => {\n const lines = data.toString().split(\"\\n\").filter(Boolean);\n lines.forEach((line: string) => {\n console.log(`${chalk.cyan.bold(\"[backend]\")} ${line}`);\n });\n });\n\n children.push(backendChild);\n } else if (!frontendOnly && !backendDir) {\n console.warn(chalk.yellow(\" ⚠ No backend/ directory found, skipping backend.\"));\n }\n\n // Start frontend immediately if backend-only mode or no backend\n if (!backendOnly && frontendDir && (frontendOnly || !backendDir)) {\n startFrontend(null);\n } else if (!backendOnly && !frontendDir) {\n console.warn(chalk.yellow(\" ⚠ No frontend/ directory found, skipping frontend.\"));\n }\n\n if (children.length === 0) {\n console.error(chalk.red(\" ✗ Nothing to start. Check your project structure.\"));\n process.exit(1);\n }\n\n console.log(\"\");\n console.log(chalk.gray(\" Press Ctrl+C to stop all servers.\"));\n console.log(\"\");\n\n // Wait for all children to exit\n await Promise.all(\n children.map(\n (child) =>\n new Promise<void>((resolve) => {\n child.finally(() => resolve());\n })\n )\n );\n}\n\nfunction printDevHelp() {\n console.log(`\n${chalk.bold(\"rebase dev\")} — Start the development server\n\n${chalk.green.bold(\"Usage\")}\n rebase dev [options]\n\n${chalk.green.bold(\"Options\")}\n ${chalk.blue(\"--backend-only, -b\")} Only start the backend server\n ${chalk.blue(\"--frontend-only, -f\")} Only start the frontend server\n ${chalk.blue(\"--port, -p\")} Backend port (default: auto-detected per project)\n\n${chalk.green.bold(\"Description\")}\n Starts both the backend (tsx watch + Hono) and frontend (Vite)\n dev servers concurrently with color-coded output prefixes.\n\n Each project automatically receives a unique default port derived\n from its directory path, preventing collisions when running multiple\n Rebase instances simultaneously.\n\n If the assigned port is already in use, the server will automatically\n try the next available port. The frontend is started only after the\n backend is ready, and VITE_API_URL is injected automatically.\n`);\n}\n","/**\n * CLI command: rebase auth <action>\n *\n * Subcommands:\n * reset-password — Reset a user's password\n */\nimport arg from \"arg\";\nimport chalk from \"chalk\";\nimport path from \"path\";\nimport fs from \"fs\";\nimport { spawn } from \"child_process\";\nimport {\n requireProjectRoot,\n requireBackendDir,\n findEnvFile,\n resolveTsx\n} from \"../utils/project\";\n\nexport async function authCommand(subcommand: string | undefined, rawArgs: string[]): Promise<void> {\n if (!subcommand || subcommand === \"--help\") {\n printAuthHelp();\n return;\n }\n\n switch (subcommand) {\n case \"reset-password\":\n await resetPassword(rawArgs);\n break;\n default:\n console.error(chalk.red(`Unknown auth command: ${subcommand}`));\n console.log(\"\");\n printAuthHelp();\n process.exit(1);\n }\n}\n\nasync function resetPassword(rawArgs: string[]): Promise<void> {\n const args = arg(\n {\n \"--email\": String,\n \"--password\": String,\n \"-e\": \"--email\",\n \"-p\": \"--password\"\n },\n {\n argv: rawArgs.slice(4), // skip \"node rebase auth reset-password\"\n permissive: true\n }\n );\n\n // Support both --email flag and positional args\n const email = args[\"--email\"] || args._[0];\n const newPassword = args[\"--password\"] || args._[1];\n\n if (!email) {\n console.error(chalk.red(\"✗ Email is required.\"));\n console.log(\"\");\n console.log(chalk.gray(\" Usage: rebase auth reset-password <email> [new-password]\"));\n console.log(chalk.gray(\" rebase auth reset-password --email user@example.com --password NewPass123!\"));\n process.exit(1);\n }\n\n const projectRoot = requireProjectRoot();\n const backendDir = requireBackendDir(projectRoot);\n const tsxBin = resolveTsx(projectRoot);\n\n if (!tsxBin) {\n console.error(chalk.red(\"✗ Could not find tsx binary.\"));\n process.exit(1);\n }\n\n // Create a temporary script that performs the password reset\n const envFile = findEnvFile(projectRoot);\n const env: Record<string, string> = { ...process.env as Record<string, string> };\n if (envFile) {\n env.DOTENV_CONFIG_PATH = envFile;\n }\n\n const scriptContent = `\nimport { createPostgresDatabaseConnection } from \"@rebasepro/server-core\";\nimport { hashPassword } from \"@rebasepro/server-core/src/auth/password\";\nimport { eq } from \"drizzle-orm\";\nimport { users } from \"@rebasepro/server-core/src/db/auth-schema\";\nimport * as dotenv from \"dotenv\";\nimport path from \"path\";\n\ndotenv.config({ path: \"${envFile || path.join(projectRoot, \".env\")}\" });\n\nconst email = \"${email}\";\nconst newPassword = \"${newPassword || \"NewPassword123!\"}\";\n\nasync function resetPassword() {\n const { db } = createPostgresDatabaseConnection(process.env.DATABASE_URL!);\n const hash = await hashPassword(newPassword);\n\n const result = await db.update(users)\n .set({ passwordHash: hash })\n .where(eq(users.email, email))\n .returning({\n id: users.id,\n email: users.email\n });\n\n if (result.length > 0) {\n console.log(\"✅ Password reset for: \" + result[0].email);\n ${!newPassword ? 'console.log(\" New password: \" + newPassword);' : \"\"}\n } else {\n console.log(\"✗ User not found: \" + email);\n }\n process.exit(0);\n}\n\nresetPassword().catch(console.error);\n`;\n\n const tmpScriptPath = path.join(backendDir, \".tmp-reset-password.ts\");\n fs.writeFileSync(tmpScriptPath, scriptContent, \"utf-8\");\n\n console.log(\"\");\n console.log(chalk.bold(\" 🔑 Rebase Auth — Reset Password\"));\n console.log(\"\");\n console.log(` ${chalk.gray(\"Email:\")} ${email}`);\n if (newPassword) {\n console.log(` ${chalk.gray(\"Password:\")} ${\"*\".repeat(newPassword.length)}`);\n }\n console.log(\"\");\n\n const child = spawn(tsxBin, [tmpScriptPath], {\n cwd: backendDir,\n stdio: \"inherit\",\n env\n });\n\n return new Promise((resolve) => {\n child.on(\"close\", (code) => {\n // Clean up temp script\n try { fs.unlinkSync(tmpScriptPath); } catch { /* ignore */ }\n if (code !== 0) {\n process.exit(code ?? 1);\n }\n resolve();\n });\n });\n}\n\nfunction printAuthHelp() {\n console.log(`\n${chalk.bold(\"rebase auth\")} — Authentication management commands\n\n${chalk.green.bold(\"Usage\")}\n rebase auth ${chalk.blue(\"<command>\")} [options]\n\n${chalk.green.bold(\"Commands\")}\n ${chalk.blue.bold(\"reset-password\")} Reset a user's password\n\n${chalk.green.bold(\"reset-password Options\")}\n ${chalk.blue(\"--email, -e\")} User's email address\n ${chalk.blue(\"--password, -p\")} New password (default: NewPassword123!)\n\n${chalk.green.bold(\"Examples\")}\n rebase auth reset-password user@example.com\n rebase auth reset-password --email user@example.com --password MyNewPass!\n`);\n}\n","/**\n * CLI command: rebase doctor\n *\n * Detects three-way schema drift between collection definitions,\n * the generated Drizzle schema, and the live PostgreSQL database.\n */\nimport chalk from \"chalk\";\nimport execa from \"execa\";\nimport {\n requireProjectRoot,\n requireBackendDir,\n getActiveBackendPlugin,\n resolvePluginCliScript,\n resolveTsx,\n findEnvFile\n} from \"../utils/project\";\n\nexport async function doctorCommand(rawArgs: string[]): Promise<void> {\n const projectRoot = requireProjectRoot();\n const backendDir = requireBackendDir(projectRoot);\n\n const activePlugin = getActiveBackendPlugin(backendDir);\n if (!activePlugin) {\n console.error(chalk.red(\"✗ Could not detect an active database plugin.\"));\n console.error(chalk.gray(\" Make sure a package like @rebasepro/server-postgresql is installed in backend/package.json.\"));\n process.exit(1);\n }\n\n const pluginCli = resolvePluginCliScript(backendDir, activePlugin);\n if (!pluginCli) {\n console.error(chalk.red(`✗ Could not find CLI entry point for ${activePlugin}.`));\n process.exit(1);\n }\n\n // Set up environment with DOTENV_CONFIG_PATH\n const envFile = findEnvFile(projectRoot);\n const env: Record<string, string> = { ...process.env as Record<string, string> };\n if (envFile) {\n env.DOTENV_CONFIG_PATH = envFile;\n }\n\n try {\n const isTs = pluginCli.endsWith(\".ts\");\n if (isTs) {\n const tsxBin = resolveTsx(projectRoot);\n if (!tsxBin) {\n console.error(chalk.red(\"✗ Could not find tsx binary.\"));\n process.exit(1);\n }\n await execa(tsxBin, [pluginCli, ...rawArgs.slice(2)], {\n cwd: backendDir,\n stdio: \"inherit\",\n env\n });\n } else {\n await execa(\"node\", [pluginCli, ...rawArgs.slice(2)], {\n cwd: backendDir,\n stdio: \"inherit\",\n env\n });\n }\n } catch {\n // If the process exits with an error code, execa will throw,\n // but inherit stdio means the user already saw the output.\n process.exit(1);\n }\n}\n","import chalk from \"chalk\";\nimport arg from \"arg\";\nimport { createRebaseApp } from \"./commands/init\";\nimport { generateSdkCommand } from \"./commands/generate_sdk\";\nimport { schemaCommand } from \"./commands/schema\";\nimport { dbCommand } from \"./commands/db\";\nimport { devCommand } from \"./commands/dev\";\nimport { authCommand } from \"./commands/auth\";\nimport { doctorCommand } from \"./commands/doctor\";\nimport fs from \"fs\";\nimport path from \"path\";\nimport { fileURLToPath } from \"url\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\nfunction getVersion(): string {\n try {\n // Try to read version from package.json\n const pkgPath = path.resolve(__dirname, \"../package.json\");\n if (fs.existsSync(pkgPath)) {\n return JSON.parse(fs.readFileSync(pkgPath, \"utf-8\")).version;\n }\n } catch {\n // ignore\n }\n return \"unknown\";\n}\n\nexport async function entry(args: string[]) {\n const parsedArgs = arg(\n {\n \"--version\": Boolean,\n \"--help\": Boolean,\n \"-v\": \"--version\",\n \"-h\": \"--help\"\n },\n {\n argv: args.slice(2),\n permissive: true\n }\n );\n\n if (parsedArgs[\"--version\"]) {\n console.log(getVersion());\n return;\n }\n\n const command = parsedArgs._[0];\n const subcommand = parsedArgs._[1];\n\n // Show global help only when no command given, or --help with no recognized command\n const namespacedCommands = [\"schema\", \"db\", \"dev\", \"auth\", \"doctor\"];\n if (!command || (parsedArgs[\"--help\"] && !namespacedCommands.includes(command))) {\n printHelp();\n return;\n }\n\n // For namespaced commands with --help, pass it through as subcommand\n const effectiveSubcommand = parsedArgs[\"--help\"] ? \"--help\" : subcommand;\n\n switch (command) {\n case \"init\":\n await createRebaseApp(args);\n break;\n\n case \"generate-sdk\": {\n // Legacy command — kept for backward compatibility\n const sdkArgs = arg(\n {\n \"--collections-dir\": String,\n \"--output\": String,\n \"-c\": \"--collections-dir\",\n \"-o\": \"--output\"\n },\n {\n argv: args.slice(3),\n permissive: true\n }\n );\n await generateSdkCommand({\n collectionsDir: sdkArgs[\"--collections-dir\"] || \"./config/collections\",\n output: sdkArgs[\"--output\"] || \"./generated/sdk\",\n cwd: process.cwd()\n });\n break;\n }\n\n case \"schema\":\n await schemaCommand(effectiveSubcommand, args);\n break;\n\n case \"db\":\n await dbCommand(effectiveSubcommand, args);\n break;\n\n case \"dev\":\n await devCommand(args);\n break;\n\n case \"auth\":\n await authCommand(effectiveSubcommand, args);\n break;\n\n case \"doctor\":\n await doctorCommand(args);\n break;\n\n default:\n console.log(chalk.red(`Unknown command: ${command}`));\n console.log(\"\");\n printHelp();\n }\n}\n\nfunction printHelp() {\n console.log(`\n${chalk.bold(\"Rebase CLI\")} — Developer tools for Rebase projects\n\n${chalk.green.bold(\"Usage\")}\n rebase ${chalk.blue(\"<command>\")} [options]\n\n${chalk.green.bold(\"Commands\")}\n ${chalk.blue.bold(\"init\")} Create a new Rebase project\n ${chalk.blue.bold(\"dev\")} Start the development server\n\n${chalk.green.bold(\"Schema\")}\n ${chalk.blue.bold(\"schema generate\")} Generate Drizzle schema from collections\n ${chalk.blue.bold(\"schema\")} ${chalk.gray(\"--help\")} Show schema command help\n\n${chalk.green.bold(\"Database\")}\n ${chalk.blue.bold(\"db push\")} Apply schema directly to database ${chalk.gray(\"(dev)\")}\n ${chalk.blue.bold(\"db pull\")} Introspect database → Drizzle schema\n ${chalk.blue.bold(\"db generate\")} Generate SQL migration files\n ${chalk.blue.bold(\"db migrate\")} Run pending migrations\n ${chalk.blue.bold(\"db studio\")} Open Drizzle Studio\n ${chalk.blue.bold(\"db\")} ${chalk.gray(\"--help\")} Show database command help\n\n${chalk.green.bold(\"SDK\")}\n ${chalk.blue.bold(\"generate-sdk\")} Generate a typed JS SDK from collections\n\n${chalk.green.bold(\"Auth\")}\n ${chalk.blue.bold(\"auth reset-password\")} Reset a user's password\n ${chalk.blue.bold(\"auth\")} ${chalk.gray(\"--help\")} Show auth command help\n\n${chalk.green.bold(\"Diagnostics\")}\n ${chalk.blue.bold(\"doctor\")} Detect schema drift between collections, schema, and DB\n\n${chalk.green.bold(\"Options\")}\n ${chalk.blue(\"--version, -v\")} Show version number\n ${chalk.blue(\"--help, -h\")} Show this help message\n\n${chalk.gray(\"Documentation: https://rebase.pro/docs\")}\n`);\n}\n","/**\n * Authentication helpers for the Rebase CLI.\n *\n * Token storage lives at ~/.rebase/tokens.json (prod) or\n * ~/.rebase/staging.tokens.json (dev).\n */\nimport fs from \"fs\";\nimport path from \"path\";\nimport * as os from \"os\";\n\nconst TOKEN_DIR = path.join(os.homedir(), \".rebase\");\n\nfunction tokenPath(env: \"prod\" | \"dev\"): string {\n return path.join(TOKEN_DIR, (env === \"dev\" ? \"staging.\" : \"\") + \"tokens.json\");\n}\n\n// ─── Token persistence ────────────────────────────────────\n\nfunction saveTokens(tokens: object, env: \"prod\" | \"dev\") {\n if (!fs.existsSync(TOKEN_DIR)) {\n fs.mkdirSync(TOKEN_DIR, { recursive: true });\n }\n fs.writeFileSync(tokenPath(env), JSON.stringify(tokens));\n}\n\n// ─── Public API ───────────────────────────────────────────\n\nexport async function getTokens(env: \"prod\" | \"dev\", _debug?: boolean): Promise<object | null> {\n const fp = tokenPath(env);\n if (!fs.existsSync(fp)) return null;\n try {\n const data = fs.readFileSync(fp, \"utf-8\");\n return JSON.parse(data);\n } catch {\n return null;\n }\n}\n\nexport function parseJwt(token: string): object {\n if (!token) throw new Error(\"No JWT token\");\n const base64Url = token.split(\".\")[1];\n const base64 = base64Url.replace(/-/g, \"+\").replace(/_/g, \"/\");\n const buffer = Buffer.from(base64, \"base64\");\n return JSON.parse(buffer.toString());\n}\n\nexport async function refreshCredentials(\n env: \"dev\" | \"prod\",\n credentials?: object | null,\n _onErr?: (e: unknown) => void\n): Promise<object | null> {\n if (!credentials) return null;\n // If the token hasn't expired, just return it.\n const expiryDate = new Date((credentials as Record<string, unknown>)[\"expiry_date\"] as number);\n if (expiryDate.getTime() > Date.now()) {\n return credentials;\n }\n // Without a server endpoint we can't actually refresh –\n // the caller should handle the null return by re-authenticating.\n return null;\n}\n\nexport async function login(env: \"prod\" | \"dev\", _debug?: boolean): Promise<void> {\n console.log(\n \"Interactive login is not yet implemented in @rebasepro/cli.\\n\" +\n \"Please authenticate via the Rebase dashboard and copy your tokens to \" +\n tokenPath(env)\n );\n}\n\nexport async function logout(env: \"prod\" | \"dev\", _debug?: boolean): Promise<void> {\n const fp = tokenPath(env);\n if (fs.existsSync(fp)) {\n fs.unlinkSync(fp);\n console.log(\"You have been logged out.\");\n } else {\n console.log(\"You are not logged in.\");\n }\n}\n"],"names":["promisify","__filename","fileURLToPath","__dirname","mod","exported","generateSDK","execSync","spawn","os"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAWA,QAAM,SAASA,KAAAA,UAAU,GAAG,MAAM;AAClC,QAAM,OAAOA,KAAAA,UAAU,GAAG;AAG1B,QAAMC,eAAaC,IAAAA,qVAA6B;AAChD,QAAMC,cAAY,KAAK,QAAQF,YAAU;AAEzC,WAAS,cAAc,YAAoB,YAAmC;AAC1E,UAAM,OAAO,KAAK,MAAM,UAAU,EAAE;AACpC,WAAO,cAAc,eAAe,MAAM;AACtC,UAAI,KAAK,SAAS,UAAU,MAAM,YAAY;AAC1C,eAAO;AAAA,MACX;AACA,mBAAa,KAAK,QAAQ,UAAU;AAAA,IACxC;AACA,WAAO;AAAA,EACX;AAEA,QAAM,UAAU,cAAcE,aAAW,KAAK;AAU9C,iBAAsB,gBAAgB,SAAmB;AACrD,YAAQ,IAAI;AAAA,EACd,MAAM,KAAK,QAAQ,CAAC;AAAA,CACrB;AAEG,UAAM,UAAU,MAAM,iBAAiB,OAAO;AAC9C,UAAM,cAAc,OAAO;AAAA,EAC/B;AAEA,iBAAe,iBAAiB,SAAyC;AACrE,UAAM,OAAO;AAAA,MACT;AAAA,QACI,SAAS;AAAA,QACT,aAAa;AAAA,QACb,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAEV;AAAA,QACI,MAAM,QAAQ,MAAM,CAAC;AAAA;AAAA,QACrB,YAAY;AAAA,MAAA;AAAA,IAChB;AAIJ,UAAM,UAAU,KAAK,EAAE,CAAC;AAExB,UAAM,YAAuC,CAAA;AAE7C,QAAI,CAAC,SAAS;AACV,gBAAU,KAAK;AAAA,QACX,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS;AAAA,QACT,SAAS;AAAA,QACT,UAAU,CAAC,UAAkB;AACzB,cAAI,CAAC,MAAM,KAAA,EAAQ,QAAO;AAC1B,cAAI,CAAC,yBAAyB,KAAK,KAAK,GAAG;AACvC,mBAAO;AAAA,UACX;AACA,iBAAO;AAAA,QACX;AAAA,MAAA,CACH;AAAA,IACL;AAEA,QAAI,CAAC,KAAK,OAAO,GAAG;AAChB,gBAAU,KAAK;AAAA,QACX,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS;AAAA,QACT,SAAS;AAAA,MAAA,CACZ;AAAA,IACL;AAEA,QAAI,CAAC,KAAK,WAAW,GAAG;AACpB,gBAAU,KAAK;AAAA,QACX,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS;AAAA,QACT,SAAS;AAAA,MAAA,CACZ;AAAA,IACL;AAEA,UAAM,UAAU,MAAM,SAAS,OAAO,SAA6D;AAEnG,UAAM,cAAc,WAAW,QAAQ;AACvC,UAAM,kBAAkB,KAAK,QAAQ,QAAQ,IAAA,GAAO,WAAW;AAC/D,UAAM,oBAAoB,KAAK,QAAQ,SAAU,aAAa,UAAU;AAExE,WAAO;AAAA,MACH;AAAA,MACA,KAAK,KAAK,OAAO,KAAK,QAAQ,OAAO;AAAA,MACrC,aAAa,KAAK,WAAW,KAAK,QAAQ,eAAe;AAAA,MACzD;AAAA,MACA;AAAA,IAAA;AAAA,EAER;AAEA,iBAAe,cAAc,SAAsB;AAE/C,QAAI,GAAG,WAAW,QAAQ,eAAe,GAAG;AACxC,UAAI,GAAG,YAAY,QAAQ,eAAe,EAAE,WAAW,GAAG;AACtD,gBAAQ,MAAM,GAAG,MAAM,IAAI,KAAK,OAAO,CAAC,eAAe,QAAQ,WAAW,mCAAmC;AAC7G,gBAAQ,KAAK,CAAC;AAAA,MAClB;AAAA,IACJ,OAAO;AACH,SAAG,UAAU,QAAQ,iBAAiB,EAAE,WAAW,MAAM;AAAA,IAC7D;AAGA,QAAI;AACA,YAAM,OAAO,QAAQ,mBAAmB,GAAG,UAAU,IAAI;AAAA,IAC7D,QAAQ;AACJ,cAAQ,MAAM,GAAG,MAAM,IAAI,KAAK,OAAO,CAAC,0BAA0B,QAAQ,iBAAiB,EAAE;AAC7F,cAAQ,KAAK,CAAC;AAAA,IAClB;AAGA,YAAQ,IAAI,MAAM,KAAK,4BAA4B,CAAC;AACpD,QAAI;AACA,YAAM,KAAK,QAAQ,mBAAmB,QAAQ,iBAAiB;AAAA,QAC3D,SAAS;AAAA,QACT,KAAK;AAAA,QACL,QAAQ,CAAC,WAAmB;AACxB,gBAAM,WAAW,KAAK,SAAS,MAAM;AAErC,iBAAO,aAAa,kBAAkB,aAAa;AAAA,QACvD;AAAA,MAAA,CACH;AAAA,IACL,SAAS,KAAc;AACnB,cAAQ,MAAM,GAAG,MAAM,IAAI,KAAK,OAAO,CAAC,mCAAmC,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,EAAE;AAC7H,cAAQ,KAAK,CAAC;AAAA,IAClB;AAGA,UAAM,oBAAoB,OAAO;AAGjC,UAAM,kBAAkB,KAAK,KAAK,QAAQ,iBAAiB,eAAe;AAC1E,UAAM,UAAU,KAAK,KAAK,QAAQ,iBAAiB,MAAM;AACzD,QAAI,GAAG,WAAW,eAAe,KAAK,CAAC,GAAG,WAAW,OAAO,GAAG;AAC3D,SAAG,WAAW,iBAAiB,OAAO;AAGtC,YAAM,YAAY,OAAO,YAAY,EAAE,EAAE,SAAS,KAAK;AACvD,YAAM,aAAa,OAAO,YAAY,EAAE,EAAE,SAAS,KAAK;AAExD,UAAI,aAAa,GAAG,aAAa,SAAS,OAAO;AACjD,mBAAa,WAAW;AAAA,QACpB;AAAA,QACA,uBAAuB,UAAU;AAAA,MAAA;AAErC,mBAAa,WAAW;AAAA,QACpB;AAAA,QACA;AAAA,MAAA;AAIJ,oBAAc;AAAA;AAAA,oBAA2D,UAAU;AAAA;AAEnF,SAAG,cAAc,SAAS,YAAY,OAAO;AAAA,IACjD;AAGA,QAAI,QAAQ,KAAK;AACb,cAAQ,IAAI,MAAM,KAAK,kCAAkC,CAAC;AAC1D,UAAI;AACA,cAAM,MAAM,OAAO,CAAC,MAAM,GAAG,EAAE,KAAK,QAAQ,iBAAiB;AAAA,MACjE,QAAQ;AACJ,gBAAQ,KAAK,MAAM,OAAO,gDAAgD,CAAC;AAAA,MAC/E;AAAA,IACJ;AAEA,QAAI,QAAQ,aAAa;AACrB,cAAQ,IAAI,EAAE;AACd,cAAQ,IAAI,MAAM,KAAK,wCAAwC,CAAC;AAChE,cAAQ,IAAI,EAAE;AACd,UAAI;AACA,cAAM,MAAM,QAAQ,CAAC,SAAS,GAAG;AAAA,UAC7B,KAAK,QAAQ;AAAA,UACb,OAAO;AAAA,QAAA,CACV;AAAA,MACL,QAAQ;AACJ,gBAAQ,KAAK,MAAM,OAAO,yFAAyF,CAAC;AAAA,MACxH;AAAA,IACJ;AAGA,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,GAAG,MAAM,MAAM,KAAK,GAAG,CAAC,YAAY,MAAM,KAAK,QAAQ,WAAW,CAAC,wBAAwB;AACvG,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,MAAM,KAAK,aAAa,CAAC;AACrC,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,KAAK,MAAM,KAAK,IAAI,CAAC,IAAI,QAAQ,WAAW,EAAE;AAC1D,QAAI,CAAC,QAAQ,aAAa;AACtB,cAAQ,IAAI,KAAK,MAAM,KAAK,cAAc,CAAC,EAAE;AAAA,IACjD;AACA,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,MAAM,KAAK,6CAA6C,CAAC;AACrE,YAAQ,IAAI,MAAM,KAAK,eAAe,CAAC;AACvC,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,KAAK,MAAM,KAAK,UAAU,CAAC,EAAE;AACzC,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,MAAM,KAAK,kDAAkD,IACnE,MAAM,KAAK,gDAAgD,CAAC;AAClE,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,MAAM,KAAK,+BAA+B,CAAC;AACvD,YAAQ,IAAI,MAAM,KAAK,6CAA6C,CAAC;AACrE,YAAQ,IAAI,EAAE;AAAA,EAClB;AAEA,iBAAe,oBAAoB,SAAsB;AACrD,UAAM,iBAAiB;AAAA,MACnB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAGJ,eAAW,QAAQ,gBAAgB;AAC/B,YAAM,WAAW,KAAK,QAAQ,QAAQ,iBAAiB,IAAI;AAC3D,UAAI,CAAC,GAAG,WAAW,QAAQ,EAAG;AAE9B,UAAI,UAAU,GAAG,aAAa,UAAU,OAAO;AAC/C,gBAAU,QAAQ,QAAQ,yBAAyB,QAAQ,WAAW;AACtE,SAAG,cAAc,UAAU,SAAS,OAAO;AAAA,IAC/C;AAAA,EACJ;AC3NA,iBAAe,gBAAgB,gBAAqD;AAChF,UAAM,SAAS,KAAK,QAAQ,cAAc;AAE1C,QAAI,CAAC,GAAG,WAAW,MAAM,GAAG;AACxB,YAAM,IAAI,MAAM,oCAAoC,MAAM,EAAE;AAAA,IAChE;AAGA,QAAI;AACJ,QAAI;AACA,YAAM,aAAa,MAAM,OAAO,MAAM;AACtC,aAAQ,WAAW,WAAW;AAAA,IAClC,QAAQ;AACJ,YAAM,IAAI;AAAA,QACN;AAAA,MAAA;AAAA,IAGR;AAEA,UAAM,eAAe,KAAK,QAAQ;AAAA,MAC9B,gBAAgB;AAAA,MAChB,YAAY;AAAA,IAAA,CACf;AAGD,UAAM,kBAAkB,CAAC,YAAY,YAAY,WAAW;AAC5D,QAAI,YAA2B;AAE/B,eAAW,aAAa,iBAAiB;AACrC,YAAM,IAAI,KAAK,KAAK,QAAQ,SAAS;AACrC,UAAI,GAAG,WAAW,CAAC,GAAG;AAClB,oBAAY;AACZ;AAAA,MACJ;AAAA,IACJ;AAEA,QAAI,CAAC,WAAW;AAEZ,cAAQ,IAAI,MAAM,OAAO,gEAAgE,CAAC;AAC1F,YAAM,cAAkC,CAAA;AACxC,YAAM,QAAQ,GAAG,YAAY,MAAM,EAAE;AAAA,QAAO,CAAA,OACvC,EAAE,SAAS,KAAK,KAAK,EAAE,SAAS,KAAK,MAAM,CAAC,EAAE,WAAW,GAAG;AAAA,MAAA;AAGjE,iBAAW,QAAQ,OAAO;AACtB,YAAI;AACA,gBAAMC,OAAM,aAAa,KAAK,KAAK,QAAQ,IAAI,CAAC;AAChD,gBAAMC,YAAWD,KAAI,WAAWA;AAChC,cAAIC,aAAY,OAAOA,cAAa,YAAY,UAAUA,WAAU;AAChE,wBAAY,KAAKA,SAA4B;AAAA,UACjD,WAAW,MAAM,QAAQA,SAAQ,GAAG;AAChC,wBAAY,KAAK,GAAGA,SAAQ;AAAA,UAChC;AAAA,QACJ,SAAS,KAAK;AACV,kBAAQ,KAAK,MAAM,OAAO,gBAAgB,IAAI,KAAM,IAAc,OAAO,EAAE,CAAC;AAAA,QAChF;AAAA,MACJ;AAEA,aAAO;AAAA,IACX;AAGA,UAAM,MAAM,aAAa,SAAS;AAClC,UAAM,WAAW,IAAI,WAAW;AAEhC,QAAI,MAAM,QAAQ,QAAQ,GAAG;AACzB,aAAO;AAAA,IACX,WAAW,OAAO,aAAa,YAAY,aAAa,MAAM;AAE1D,UAAI,iBAAiB,YAAY,MAAM,QAAQ,SAAS,WAAW,GAAG;AAClE,eAAO,SAAS;AAAA,MACpB;AAEA,YAAM,cAAkC,CAAA;AACxC,iBAAW,SAAS,OAAO,OAAO,QAAQ,GAAG;AACzC,YAAI,SAAS,OAAO,UAAU,YAAY,UAAW,OAA4B;AAC7E,sBAAY,KAAK,KAAyB;AAAA,QAC9C;AAAA,MACJ;AACA,UAAI,YAAY,SAAS,EAAG,QAAO;AAAA,IACvC;AAEA,UAAM,IAAI;AAAA,MACN,sCAAsC,SAAS;AAAA;AAAA,IAAA;AAAA,EAGvD;AAKA,WAAS,WAAW,WAAmB,OAA8B;AACjE,UAAM,YAAY,KAAK,QAAQ,SAAS;AAGxC,OAAG,UAAU,WAAW,EAAE,WAAW,MAAM;AAE3C,eAAW,QAAQ,OAAO;AACtB,YAAM,WAAW,KAAK,KAAK,WAAW,KAAK,IAAI;AAC/C,YAAM,MAAM,KAAK,QAAQ,QAAQ;AACjC,UAAI,CAAC,GAAG,WAAW,GAAG,GAAG;AACrB,WAAG,UAAU,KAAK,EAAE,WAAW,MAAM;AAAA,MACzC;AACA,SAAG,cAAc,UAAU,KAAK,SAAS,OAAO;AAAA,IACpD;AAAA,EACJ;AAKA,iBAAsB,mBAAmB,MAAsC;AAC3E,UAAM,EAAE,gBAAgB,QAAQ,IAAA,IAAQ;AAExC,UAAM,yBAAyB,KAAK,WAAW,cAAc,IACvD,iBACA,KAAK,KAAK,KAAK,cAAc;AAEnC,UAAM,iBAAiB,KAAK,WAAW,MAAM,IACvC,SACA,KAAK,KAAK,KAAK,MAAM;AAE3B,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,MAAM,KAAK,2BAA2B,CAAC;AACnD,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,KAAK,MAAM,KAAK,cAAc,CAAC,IAAI,sBAAsB,EAAE;AACvE,YAAQ,IAAI,KAAK,MAAM,KAAK,SAAS,CAAC,SAAS,cAAc,EAAE;AAC/D,YAAQ,IAAI,EAAE;AAGd,YAAQ,IAAI,MAAM,KAAK,uCAAuC,CAAC;AAC/D,UAAM,cAAc,MAAM,gBAAgB,sBAAsB;AAEhE,QAAI,YAAY,WAAW,GAAG;AAC1B,cAAQ,IAAI,MAAM,IAAI,gDAAgD,CAAC;AACvE,cAAQ,KAAK,CAAC;AAAA,IAClB;AAEA,YAAQ,IAAI,MAAM,MAAM,aAAa,YAAY,MAAM,mBAAmB,YAAY,IAAI,CAAA,MAAK,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;AACpH,YAAQ,IAAI,EAAE;AAGd,YAAQ,IAAI,MAAM,KAAK,6BAA6B,CAAC;AACrD,UAAM,QAAQC,aAAAA,YAAY,WAAW;AACrC,YAAQ,IAAI,MAAM,MAAM,iBAAiB,MAAM,MAAM,UAAU,CAAC;AAGhE,YAAQ,IAAI,MAAM,KAAK,kBAAkB,cAAc,KAAK,CAAC;AAC7D,eAAW,gBAAgB,KAAK;AAEhC,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,MAAM,MAAM,KAAK,iCAAiC,CAAC;AAC/D,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,MAAM,KAAK,UAAU,CAAC;AAClC,YAAQ,IAAI,MAAM,KAAK,6DAA6D,CAAC;AACrF,YAAQ,IAAI,MAAM,KAAK,wCAAwC,KAAK,SAAS,KAAK,KAAK,KAAK,gBAAgB,gBAAgB,CAAC,CAAC,IAAI,CAAC;AACnI,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,MAAM,KAAK,mDAAmD,CAAC;AAC3E,YAAQ,IAAI,MAAM,KAAK,2CAA2C,CAAC;AACnE,YAAQ,IAAI,MAAM,KAAK,qCAAqC,CAAC;AAC7D,YAAQ,IAAI,MAAM,KAAK,SAAS,CAAC;AACjC,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,MAAM,KAAK,iDAAiD,YAAY,CAAC,GAAG,QAAQ,eAAe,YAAY,CAAC;AAC5H,YAAQ,IAAI,EAAE;AAAA,EAClB;AC5KO,WAAS,gBAAgB,WAAmB,QAAQ,OAAsB;AAC7E,QAAI,MAAM,KAAK,QAAQ,QAAQ;AAC/B,UAAM,OAAO,KAAK,MAAM,GAAG,EAAE;AAE7B,WAAO,QAAQ,MAAM;AACjB,YAAM,UAAU,KAAK,KAAK,KAAK,cAAc;AAE7C,UAAI,GAAG,WAAW,OAAO,GAAG;AACxB,YAAI;AACA,gBAAM,MAAM,KAAK,MAAM,GAAG,aAAa,SAAS,OAAO,CAAC;AAExD,cAAI,IAAI,cAAc,MAAM,QAAQ,IAAI,UAAU,GAAG;AACjD,kBAAM,aAAa,IAAI,WAAW;AAAA,cAAK,CAAC,MACpC,MAAM,aAAa,EAAE,SAAS,SAAS;AAAA,YAAA;AAE3C,gBAAI,WAAY,QAAO;AAAA,UAC3B;AAAA,QACJ,QAAQ;AAAA,QAER;AAGA,YAAI,GAAG,WAAW,KAAK,KAAK,KAAK,SAAS,CAAC,KAAK,GAAG,WAAW,KAAK,KAAK,KAAK,QAAQ,CAAC,GAAG;AACrF,iBAAO;AAAA,QACX;AAAA,MACJ;AAEA,YAAM,KAAK,QAAQ,GAAG;AAAA,IAC1B;AAEA,WAAO;AAAA,EACX;AAKO,WAAS,eAAe,aAAoC;AAC/D,UAAM,aAAa,KAAK,KAAK,aAAa,SAAS;AACnD,WAAO,GAAG,WAAW,UAAU,IAAI,aAAa;AAAA,EACpD;AAKO,WAAS,uBAAuB,YAAmC;AACtE,UAAM,UAAU,KAAK,KAAK,YAAY,cAAc;AACpD,QAAI,CAAC,GAAG,WAAW,OAAO,EAAG,QAAO;AAEpC,QAAI;AACA,YAAM,MAAM,KAAK,MAAM,GAAG,aAAa,SAAS,OAAO,CAAC;AACxD,YAAM,OAAO;AAAA,QAAE,GAAG,IAAI;AAAA,QAC9B,GAAG,IAAI;AAAA,MAAA;AAIC,iBAAW,OAAO,OAAO,KAAK,IAAI,GAAG;AACjC,YAAI,IAAI,WAAW,oBAAoB,KAAK,QAAQ,0BAA0B;AAC1E,iBAAO;AAAA,QACX;AAAA,MACJ;AAAA,IACJ,QAAQ;AAAA,IAER;AACA,WAAO;AAAA,EACX;AAKO,WAAS,uBAAuB,YAAoB,YAAmC;AAC1F,UAAM,aAAa;AAAA,MACf,KAAK,KAAK,YAAY,gBAAgB,YAAY,OAAO,QAAQ;AAAA,MACjE,KAAK,KAAK,YAAY,gBAAgB,YAAY,QAAQ,QAAQ;AAAA;AAAA,MAElE,KAAK,QAAQ,YAAY,MAAM,MAAM,YAAY,WAAW,QAAQ,eAAe,EAAE,GAAG,OAAO,QAAQ;AAAA,MACvG,KAAK,QAAQ,YAAY,MAAM,YAAY,WAAW,QAAQ,eAAe,EAAE,GAAG,OAAO,QAAQ;AAAA,IAAA;AAGrG,eAAW,aAAa,YAAY;AAChC,UAAI,GAAG,WAAW,SAAS,EAAG,QAAO;AAAA,IACzC;AACA,WAAO;AAAA,EACX;AAKO,WAAS,gBAAgB,aAAoC;AAChE,UAAM,cAAc,KAAK,KAAK,aAAa,UAAU;AACrD,WAAO,GAAG,WAAW,WAAW,IAAI,cAAc;AAAA,EACtD;AAKO,WAAS,YAAY,aAAoC;AAC5D,UAAM,aAAa;AAAA,MACf,KAAK,KAAK,aAAa,MAAM;AAAA,MAC7B,KAAK,KAAK,aAAa,WAAW,MAAM;AAAA,IAAA;AAG5C,eAAW,aAAa,YAAY;AAChC,UAAI,GAAG,WAAW,SAAS,EAAG,QAAO;AAAA,IACzC;AAEA,WAAO;AAAA,EACX;AAMO,WAAS,gBAAgB,aAAqB,SAAgC;AACjF,UAAM,aAAa;AAAA,MACf,KAAK,KAAK,aAAa,WAAW,gBAAgB,QAAQ,OAAO;AAAA,MACjE,KAAK,KAAK,aAAa,gBAAgB,QAAQ,OAAO;AAAA,IAAA;AAI1D,QAAI,SAAS,KAAK,QAAQ,WAAW;AACrC,UAAM,UAAU,KAAK,MAAM,MAAM,EAAE;AACnC,WAAO,WAAW,SAAS;AACvB,iBAAW,KAAK,KAAK,KAAK,QAAQ,gBAAgB,QAAQ,OAAO,CAAC;AAClE,eAAS,KAAK,QAAQ,MAAM;AAAA,IAChC;AAEA,eAAW,aAAa,YAAY;AAChC,UAAI,GAAG,WAAW,SAAS,EAAG,QAAO;AAAA,IACzC;AAGA,QAAI;AACA,YAAM,aAAaC,cAAAA,SAAS,SAAS,OAAO,IAAI,EAAE,UAAU,SAAS,EAAE,KAAA;AACvE,UAAI,cAAc,GAAG,WAAW,UAAU,EAAG,QAAO;AAAA,IACxD,QAAQ;AAAA,IAER;AAEA,WAAO;AAAA,EACX;AAKO,WAAS,WAAW,aAAoC;AAC3D,WAAO,gBAAgB,aAAa,KAAK;AAAA,EAC7C;AAKO,WAAS,qBAA6B;AACzC,UAAM,OAAO,gBAAA;AACb,QAAI,CAAC,MAAM;AACP,cAAQ,MAAM,MAAM,IAAI,yCAAyC,CAAC;AAClE,cAAQ,MAAM,MAAM,KAAK,uDAAuD,CAAC;AACjF,cAAQ,MAAM,MAAM,KAAK,4DAA4D,CAAC;AACtF,cAAQ,KAAK,CAAC;AAAA,IAClB;AACA,WAAO;AAAA,EACX;AAKO,WAAS,kBAAkB,aAA6B;AAC3D,UAAM,aAAa,eAAe,WAAW;AAC7C,QAAI,CAAC,YAAY;AACb,cAAQ,MAAM,MAAM,IAAI,wCAAwC,CAAC;AACjE,cAAQ,MAAM,MAAM,KAAK,kBAAkB,KAAK,KAAK,aAAa,SAAS,CAAC,EAAE,CAAC;AAC/E,cAAQ,KAAK,CAAC;AAAA,IAClB;AACA,WAAO;AAAA,EACX;ACjLA,iBAAsB,cAAc,YAAgC,SAAkC;AAClG,QAAI,CAAC,cAAc,eAAe,UAAU;AACxC,sBAAA;AACA;AAAA,IACJ;AAEA,UAAM,cAAc,mBAAA;AACpB,UAAM,aAAa,kBAAkB,WAAW;AAEhD,UAAM,eAAe,uBAAuB,UAAU;AACtD,QAAI,CAAC,cAAc;AACf,cAAQ,MAAM,MAAM,IAAI,+CAA+C,CAAC;AACxE,cAAQ,MAAM,MAAM,KAAK,+FAA+F,CAAC;AACzH,cAAQ,KAAK,CAAC;AAAA,IAClB;AAEA,UAAM,YAAY,uBAAuB,YAAY,YAAY;AACjE,QAAI,CAAC,WAAW;AACZ,cAAQ,MAAM,MAAM,IAAI,wCAAwC,YAAY,GAAG,CAAC;AAChF,cAAQ,KAAK,CAAC;AAAA,IAClB;AAGA,UAAM,UAAU,YAAY,WAAW;AACvC,UAAM,MAA8B,EAAE,GAAG,QAAQ,IAAA;AACjD,QAAI,SAAS;AACT,UAAI,qBAAqB;AAAA,IAC7B;AAEA,QAAI;AACA,YAAM,OAAO,UAAU,SAAS,KAAK;AACrC,UAAI,MAAM;AACN,cAAM,SAAS,WAAW,WAAW;AACrC,YAAI,CAAC,QAAQ;AACT,kBAAQ,MAAM,MAAM,IAAI,8BAA8B,CAAC;AACvD,kBAAQ,KAAK,CAAC;AAAA,QAClB;AACA,cAAM,MAAM,QAAQ,CAAC,WAAW,GAAG,QAAQ,MAAM,CAAC,CAAC,GAAG;AAAA,UAClD,KAAK;AAAA,UACL,OAAO;AAAA,UACP;AAAA,QAAA,CACH;AAAA,MACL,OAAO;AACH,cAAM,MAAM,QAAQ,CAAC,WAAW,GAAG,QAAQ,MAAM,CAAC,CAAC,GAAG;AAAA,UAClD,KAAK;AAAA,UACL,OAAO;AAAA,UACP;AAAA,QAAA,CACH;AAAA,MACL;AAAA,IACJ,SAAS,KAAc;AACnB,cAAQ,KAAK,CAAC;AAAA,IAClB;AAAA,EACJ;AAEA,WAAS,kBAAkB;AACvB,YAAQ,IAAI;AAAA,EACd,MAAM,KAAK,eAAe,CAAC;AAAA;AAAA,EAE3B,MAAM,MAAM,KAAK,OAAO,CAAC;AAAA,kBACT,MAAM,KAAK,WAAW,CAAC;AAAA;AAAA,EAEvC,MAAM,MAAM,KAAK,UAAU,CAAC;AAAA,IAC1B,MAAM,KAAK,+DAA+D,CAAC;AAAA,IAC3E,MAAM,KAAK,KAAK,UAAU,CAAC;AAAA;AAAA,EAE7B,MAAM,MAAM,KAAK,kBAAkB,CAAC;AAAA,IAClC,MAAM,KAAK,mBAAmB,CAAC;AAAA,IAC/B,MAAM,KAAK,cAAc,CAAC;AAAA,IAC1B,MAAM,KAAK,aAAa,CAAC;AAAA,CAC5B;AAAA,EACD;ACtEA,iBAAsB,UAAU,YAAgC,SAAkC;AAC9F,QAAI,CAAC,cAAc,eAAe,UAAU;AACxC,kBAAA;AACA;AAAA,IACJ;AAEA,UAAM,cAAc,mBAAA;AACpB,UAAM,aAAa,kBAAkB,WAAW;AAEhD,UAAM,eAAe,uBAAuB,UAAU;AACtD,QAAI,CAAC,cAAc;AACf,cAAQ,MAAM,MAAM,IAAI,+CAA+C,CAAC;AACxE,cAAQ,MAAM,MAAM,KAAK,+FAA+F,CAAC;AACzH,cAAQ,KAAK,CAAC;AAAA,IAClB;AAEA,UAAM,YAAY,uBAAuB,YAAY,YAAY;AACjE,QAAI,CAAC,WAAW;AACZ,cAAQ,MAAM,MAAM,IAAI,wCAAwC,YAAY,GAAG,CAAC;AAChF,cAAQ,KAAK,CAAC;AAAA,IAClB;AAGA,UAAM,UAAU,YAAY,WAAW;AACvC,UAAM,MAA8B,EAAE,GAAG,QAAQ,IAAA;AACjD,QAAI,SAAS;AACT,UAAI,qBAAqB;AAAA,IAC7B;AAEA,QAAI;AACA,YAAM,OAAO,UAAU,SAAS,KAAK;AACrC,UAAI,MAAM;AACN,cAAM,SAAS,WAAW,WAAW;AACrC,YAAI,CAAC,QAAQ;AACT,kBAAQ,MAAM,MAAM,IAAI,8BAA8B,CAAC;AACvD,kBAAQ,KAAK,CAAC;AAAA,QAClB;AACA,cAAM,MAAM,QAAQ,CAAC,WAAW,GAAG,QAAQ,MAAM,CAAC,CAAC,GAAG;AAAA,UAClD,KAAK;AAAA,UACL,OAAO;AAAA,UACP;AAAA,QAAA,CACH;AAAA,MACL,OAAO;AACH,cAAM,MAAM,QAAQ,CAAC,WAAW,GAAG,QAAQ,MAAM,CAAC,CAAC,GAAG;AAAA,UAClD,KAAK;AAAA,UACL,OAAO;AAAA,UACP;AAAA,QAAA,CACH;AAAA,MACL;AAAA,IACJ,SAAS,KAAc;AAGnB,cAAQ,KAAK,CAAC;AAAA,IAClB;AAAA,EACJ;AAEA,WAAS,cAAc;AACnB,YAAQ,IAAI;AAAA,EACd,MAAM,KAAK,WAAW,CAAC;AAAA;AAAA,EAEvB,MAAM,MAAM,KAAK,OAAO,CAAC;AAAA,cACb,MAAM,KAAK,WAAW,CAAC;AAAA;AAAA,EAEnC,MAAM,MAAM,KAAK,UAAU,CAAC;AAAA,IAC1B,MAAM,KAAK,+DAA+D,CAAC;AAAA,IAC3E,MAAM,KAAK,KAAK,MAAM,CAAC;AAAA,IACvB,MAAM,KAAK,KAAK,MAAM,CAAC;AAAA,IACvB,MAAM,KAAK,KAAK,UAAU,CAAC;AAAA,IAC3B,MAAM,KAAK,KAAK,SAAS,CAAC;AAAA,IAC1B,MAAM,KAAK,KAAK,QAAQ,CAAC;AAAA,IACzB,MAAM,KAAK,KAAK,QAAQ,CAAC;AAAA;AAAA,EAE3B,MAAM,MAAM,KAAK,UAAU,CAAC;AAAA,IAC1B,MAAM,KAAK,8BAA8B,CAAC;AAAA;AAAA;AAAA,IAG1C,MAAM,KAAK,iCAAiC,CAAC;AAAA;AAAA;AAAA;AAAA,IAI7C,MAAM,KAAK,4BAA4B,CAAC;AAAA;AAAA,CAE3C;AAAA,EACD;ACnEA,QAAM,oBAAoB;AAO1B,WAAS,eAAe,aAA6B;AACjD,QAAI,OAAO;AACX,aAAS,IAAI,GAAG,IAAI,YAAY,QAAQ,KAAK;AACzC,cAAS,QAAQ,KAAK,OAAO,YAAY,WAAW,CAAC,IAAK;AAAA,IAC9D;AACA,WAAO,OAAQ,KAAK,IAAI,IAAI,IAAI;AAAA,EACpC;AASA,WAAS,iBAAiB,aAAqB,cAA+B;AAE1E,QAAI,aAAc,QAAO;AAGzB,QAAI,QAAQ,IAAI,KAAM,QAAO,SAAS,QAAQ,IAAI,MAAM,EAAE;AAG1D,QAAI;AACA,YAAM,WAAW,KAAK,KAAK,aAAa,iBAAiB;AACzD,UAAI,GAAG,WAAW,QAAQ,GAAG;AACzB,cAAM,QAAQ,SAAS,GAAG,aAAa,UAAU,OAAO,EAAE,KAAA,GAAQ,EAAE;AACpE,YAAI,QAAQ,KAAK,QAAQ,MAAO,QAAO;AAAA,MAC3C;AAAA,IACJ,QAAQ;AAAA,IAAe;AAGvB,WAAO,eAAe,WAAW;AAAA,EACrC;AAEA,iBAAsB,WAAW,SAAkC;AAC/D,UAAM,OAAO;AAAA,MACT;AAAA,QACI,kBAAkB;AAAA,QAClB,mBAAmB;AAAA,QACnB,UAAU;AAAA,QACV,UAAU;AAAA,QACV,MAAM;AAAA,QACN,MAAM;AAAA,QACN,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAEV;AAAA,QACI,MAAM,QAAQ,MAAM,CAAC;AAAA;AAAA,QACrB,YAAY;AAAA,MAAA;AAAA,IAChB;AAGJ,QAAI,KAAK,QAAQ,GAAG;AAChB,mBAAA;AACA;AAAA,IACJ;AAEA,UAAM,cAAc,mBAAA;AACpB,UAAM,aAAa,eAAe,WAAW;AAC7C,UAAM,cAAc,gBAAgB,WAAW;AAC/C,UAAM,cAAc,KAAK,gBAAgB,KAAK;AAC9C,UAAM,eAAe,KAAK,iBAAiB,KAAK;AAGhD,UAAM,YAAY,iBAAiB,aAAa,KAAK,QAAQ,CAAC;AAE9D,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,MAAM,KAAK,wBAAwB,CAAC;AAChD,YAAQ,IAAI,EAAE;AAEd,UAAM,WAAgC,CAAA;AAGtC,QAAI,cAAc;AAClB,QAAI,aAAa;AACjB,QAAI,kBAAyC;AAC7C,QAAI,gBAAgB;AAGpB,QAAI,sBAAqC;AAIzC,UAAM,YAAY,CAAC,QAAgB,IAAI,QAAQ,+EAA+E,EAAE;AAEhI,aAAS,eAAe;AACpB,UAAI,CAAC,eAAe,CAAC,WAAY;AACjC,UAAI,8BAA8B,eAAe;AACjD,wBAAkB,WAAW,MAAM;AAC/B,YAAI,cAAe;AACnB,gBAAQ,IAAI,EAAE;AACd,gBAAQ,IAAI,MAAM,KAAK,gEAAgE,CAAC;AACxF,gBAAQ,IAAI,MAAM,KAAK,gEAAgE,CAAC;AACxF,gBAAQ,IAAI,MAAM,KAAK,+DAA+D,CAAC;AACvF,cAAM,WAAW,UAAU,WAAW;AACtC,cAAM,YAAY,SAAS,OAAO,EAAE;AACpC,gBAAQ,IAAI,MAAM,KAAK,uBAAuB,IAAI,MAAM,MAAM,SAAS,IAAI,MAAM,KAAK,GAAG,CAAC;AAC1F,gBAAQ,IAAI,MAAM,KAAK,gEAAgE,CAAC;AACxF,gBAAQ,IAAI,MAAM,KAAK,gEAAgE,CAAC;AACxF,gBAAQ,IAAI,EAAE;AACd,wBAAgB;AAAA,MACpB,GAAG,GAAG;AAAA,IACV;AAGA,UAAM,UAAU,MAAM;AAElB,UAAI;AACA,cAAM,WAAW,KAAK,KAAK,aAAa,iBAAiB;AACzD,YAAI,GAAG,WAAW,QAAQ,EAAG,IAAG,WAAW,QAAQ;AAEnD,cAAM,UAAU,KAAK,KAAK,aAAa,iBAAiB;AACxD,YAAI,GAAG,WAAW,OAAO,EAAG,IAAG,WAAW,OAAO;AAAA,MACrD,QAAQ;AAAA,MAAe;AAEvB,eAAS,QAAQ,CAAC,UAAU;AACxB,YAAI,MAAM,OAAO,CAAC,MAAM,QAAQ;AAC5B,cAAI;AACA,gBAAI,QAAQ,aAAa,SAAS;AAC9B,oBAAM,YAAY,iBAAiB,MAAM,GAAG,QAAQ;AAAA,YACxD,OAAO;AACH,sBAAQ,KAAK,CAAC,MAAM,KAAK,SAAS;AAAA,YACtC;AAAA,UACJ,SAAS,GAAG;AACR,gBAAI;AACA,oBAAM,KAAK,SAAS;AAAA,YACxB,SAAS,KAAK;AAAA,YAEd;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ,CAAC;AACD,cAAQ,KAAK,CAAC;AAAA,IAClB;AACA,YAAQ,GAAG,UAAU,OAAO;AAC5B,YAAQ,GAAG,WAAW,OAAO;AAK7B,aAAS,cAAc,aAA4B;AAC/C,UAAI,CAAC,YAAa;AAElB,cAAQ,IAAI,KAAK,MAAM,QAAQ,GAAG,CAAC,cAAc,MAAM,KAAK,WAAW,CAAC,EAAE;AAE1E,YAAM,cAAsC,EAAE,GAAG,QAAQ,IAAA;AAGzD,UAAI,aAAa;AACb,oBAAY,eAAe,oBAAoB,WAAW;AAC1D,gBAAQ,IAAI,KAAK,MAAM,KAAK,gBAAgB,CAAC,MAAM,MAAM,MAAM,oBAAoB,WAAW,EAAE,CAAC,EAAE;AAAA,MACvG;AAEA,YAAM,gBAAgB;AAAA,QAClB;AAAA,QACA,CAAC,OAAO,KAAK;AAAA,QACb;AAAA,UACI,KAAK;AAAA,UACL,OAAO,CAAC,WAAW,QAAQ,MAAM;AAAA,UACjC,KAAK;AAAA,UACL,OAAO;AAAA,UACP,UAAU,QAAQ,aAAa;AAAA,QAAA;AAAA,MACnC;AAEJ,oBAAc,MAAM,MAAM;AAAA,MAAC,CAAC;AAE5B,oBAAc,QAAQ,GAAG,QAAQ,CAAC,SAAiB;AAC/C,cAAM,QAAQ,KAAK,SAAA,EAAW,MAAM,IAAI,EAAE,OAAO,OAAO;AACxD,cAAM,QAAQ,CAAC,SAAiB;AAC5B,kBAAQ,IAAI,GAAG,MAAM,QAAQ,KAAK,SAAS,CAAC,IAAI,IAAI,EAAE;AACtD,gBAAM,YAAY,UAAU,IAAI;AAChC,gBAAM,WAAW,UAAU,MAAM,2CAA2C;AAC5E,cAAI,UAAU,SAAS,QAAQ,KAAK,UAAU;AAC1C,0BAAc,SAAS,CAAC;AACxB,yBAAA;AAAA,UACJ;AAAA,QACJ,CAAC;AAAA,MACL,CAAC;AAED,oBAAc,QAAQ,GAAG,QAAQ,CAAC,SAAiB;AAC/C,cAAM,QAAQ,KAAK,SAAA,EAAW,MAAM,IAAI,EAAE,OAAO,OAAO;AACxD,cAAM,QAAQ,CAAC,SAAiB;AAC5B,kBAAQ,IAAI,GAAG,MAAM,QAAQ,KAAK,SAAS,CAAC,IAAI,IAAI,EAAE;AAAA,QAC1D,CAAC;AAAA,MACL,CAAC;AAED,eAAS,KAAK,aAAa;AAAA,IAC/B;AAGA,QAAI,CAAC,gBAAgB,YAAY;AAC7B,YAAM,SAAS,WAAW,WAAW;AACrC,UAAI,CAAC,QAAQ;AACT,gBAAQ,MAAM,MAAM,IAAI,4CAA4C,CAAC;AACrE,gBAAQ,MAAM,MAAM,KAAK,sCAAsC,CAAC;AAChE,gBAAQ,KAAK,CAAC;AAAA,MAClB;AAEA,YAAM,UAAU,YAAY,WAAW;AACvC,YAAM,MAA8B,EAAE,GAAG,QAAQ,IAAA;AACjD,UAAI,SAAS;AACT,YAAI,qBAAqB;AAAA,MAC7B;AAKA,UAAI,OAAO,OAAO,SAAS;AAE3B,cAAQ,IAAI,KAAK,MAAM,KAAK,GAAG,CAAC,cAAc,MAAM,KAAK,UAAU,CAAC,EAAE;AACtE,cAAQ,IAAI,KAAK,MAAM,KAAK,QAAQ,CAAC,MAAM,MAAM,MAAM,OAAO,SAAS,CAAC,CAAC,EAAE;AAG3E,UAAI,mBAAmB;AAEvB,YAAM,eAAe;AAAA,QACjB;AAAA,QACA,CAAC,SAAS,YAAY,KAAK,KAAK,MAAM,UAAU,MAAM,GAAG,CAAC,KAAK,gBAAgB,eAAe,cAAc;AAAA,QAC5G;AAAA,UACI,KAAK;AAAA,UACL,OAAO,CAAC,WAAW,QAAQ,MAAM;AAAA,UACjC;AAAA,UACA,OAAO;AAAA,UACP,UAAU,QAAQ,aAAa;AAAA,QAAA;AAAA,MACnC;AAEJ,mBAAa,MAAM,MAAM;AAAA,MAAC,CAAC;AAE3B,mBAAa,QAAQ,GAAG,QAAQ,CAAC,SAAiB;AAC9C,cAAM,QAAQ,KAAK,SAAA,EAAW,MAAM,IAAI,EAAE,OAAO,OAAO;AACxD,cAAM,QAAQ,CAAC,SAAiB;AAC5B,kBAAQ,IAAI,GAAG,MAAM,KAAK,KAAK,WAAW,CAAC,KAAK,IAAI,EAAE;AACtD,gBAAM,YAAY,UAAU,IAAI;AAChC,gBAAM,cAAc,UAAU,MAAM,6DAA6D;AACjG,cAAI,aAAa;AACb,kCAAsB,SAAS,YAAY,CAAC,GAAG,EAAE;AACjD,yBAAa;AACb,yBAAA;AAGA,kBAAM,UAAU,KAAK,KAAK,aAAa,iBAAiB;AACxD,eAAG,cAAc,SAAS,oBAAoB,mBAAmB,IAAI,OAAO;AAG5E,kBAAM,WAAW,KAAK,KAAK,aAAa,iBAAiB;AACzD,eAAG,cAAc,UAAU,OAAO,mBAAmB,GAAG,OAAO;AAG/D,gBAAI,CAAC,eAAe,eAAe,CAAC,kBAAkB;AAClD,iCAAmB;AACnB,4BAAc,mBAAmB;AAAA,YACrC;AAAA,UACJ;AAAA,QACJ,CAAC;AAAA,MACL,CAAC;AAED,mBAAa,QAAQ,GAAG,QAAQ,CAAC,SAAiB;AAC9C,cAAM,QAAQ,KAAK,SAAA,EAAW,MAAM,IAAI,EAAE,OAAO,OAAO;AACxD,cAAM,QAAQ,CAAC,SAAiB;AAC5B,kBAAQ,IAAI,GAAG,MAAM,KAAK,KAAK,WAAW,CAAC,KAAK,IAAI,EAAE;AAAA,QAC1D,CAAC;AAAA,MACL,CAAC;AAED,eAAS,KAAK,YAAY;AAAA,IAC9B,WAAW,CAAC,gBAAgB,CAAC,YAAY;AACrC,cAAQ,KAAK,MAAM,OAAO,oDAAoD,CAAC;AAAA,IACnF;AAGA,QAAI,CAAC,eAAe,gBAAgB,gBAAgB,CAAC,aAAa;AAC9D,oBAAc,IAAI;AAAA,IACtB,WAAW,CAAC,eAAe,CAAC,aAAa;AACrC,cAAQ,KAAK,MAAM,OAAO,sDAAsD,CAAC;AAAA,IACrF;AAEA,QAAI,SAAS,WAAW,GAAG;AACvB,cAAQ,MAAM,MAAM,IAAI,qDAAqD,CAAC;AAC9E,cAAQ,KAAK,CAAC;AAAA,IAClB;AAEA,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,MAAM,KAAK,qCAAqC,CAAC;AAC7D,YAAQ,IAAI,EAAE;AAGd,UAAM,QAAQ;AAAA,MACV,SAAS;AAAA,QACL,CAAC,UACG,IAAI,QAAc,CAAC,YAAY;AAC3B,gBAAM,QAAQ,MAAM,SAAS;AAAA,QACjC,CAAC;AAAA,MAAA;AAAA,IACT;AAAA,EAER;AAEA,WAAS,eAAe;AACpB,YAAQ,IAAI;AAAA,EACd,MAAM,KAAK,YAAY,CAAC;AAAA;AAAA,EAExB,MAAM,MAAM,KAAK,OAAO,CAAC;AAAA;AAAA;AAAA,EAGzB,MAAM,MAAM,KAAK,SAAS,CAAC;AAAA,IACzB,MAAM,KAAK,oBAAoB,CAAC;AAAA,IAChC,MAAM,KAAK,qBAAqB,CAAC;AAAA,IACjC,MAAM,KAAK,YAAY,CAAC;AAAA;AAAA,EAE1B,MAAM,MAAM,KAAK,aAAa,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAWhC;AAAA,EACD;ACnVA,iBAAsB,YAAY,YAAgC,SAAkC;AAChG,QAAI,CAAC,cAAc,eAAe,UAAU;AACxC,oBAAA;AACA;AAAA,IACJ;AAEA,YAAQ,YAAA;AAAA,MACJ,KAAK;AACD,cAAM,cAAc,OAAO;AAC3B;AAAA,MACJ;AACI,gBAAQ,MAAM,MAAM,IAAI,yBAAyB,UAAU,EAAE,CAAC;AAC9D,gBAAQ,IAAI,EAAE;AACd,sBAAA;AACA,gBAAQ,KAAK,CAAC;AAAA,IAAA;AAAA,EAE1B;AAEA,iBAAe,cAAc,SAAkC;AAC3D,UAAM,OAAO;AAAA,MACT;AAAA,QACI,WAAW;AAAA,QACX,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAEV;AAAA,QACI,MAAM,QAAQ,MAAM,CAAC;AAAA;AAAA,QACrB,YAAY;AAAA,MAAA;AAAA,IAChB;AAIJ,UAAM,QAAQ,KAAK,SAAS,KAAK,KAAK,EAAE,CAAC;AACzC,UAAM,cAAc,KAAK,YAAY,KAAK,KAAK,EAAE,CAAC;AAElD,QAAI,CAAC,OAAO;AACR,cAAQ,MAAM,MAAM,IAAI,sBAAsB,CAAC;AAC/C,cAAQ,IAAI,EAAE;AACd,cAAQ,IAAI,MAAM,KAAK,4DAA4D,CAAC;AACpF,cAAQ,IAAI,MAAM,KAAK,qFAAqF,CAAC;AAC7G,cAAQ,KAAK,CAAC;AAAA,IAClB;AAEA,UAAM,cAAc,mBAAA;AACpB,UAAM,aAAa,kBAAkB,WAAW;AAChD,UAAM,SAAS,WAAW,WAAW;AAErC,QAAI,CAAC,QAAQ;AACT,cAAQ,MAAM,MAAM,IAAI,8BAA8B,CAAC;AACvD,cAAQ,KAAK,CAAC;AAAA,IAClB;AAGA,UAAM,UAAU,YAAY,WAAW;AACvC,UAAM,MAA8B,EAAE,GAAG,QAAQ,IAAA;AACjD,QAAI,SAAS;AACT,UAAI,qBAAqB;AAAA,IAC7B;AAEA,UAAM,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAQD,WAAW,KAAK,KAAK,aAAa,MAAM,CAAC;AAAA;AAAA,iBAEjD,KAAK;AAAA,uBACC,eAAe,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAgB7C,CAAC,cAAc,oDAAoD,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAU3E,UAAM,gBAAgB,KAAK,KAAK,YAAY,wBAAwB;AACpE,OAAG,cAAc,eAAe,eAAe,OAAO;AAEtD,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,MAAM,KAAK,mCAAmC,CAAC;AAC3D,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,KAAK,MAAM,KAAK,QAAQ,CAAC,IAAI,KAAK,EAAE;AAChD,QAAI,aAAa;AACb,cAAQ,IAAI,KAAK,MAAM,KAAK,WAAW,CAAC,IAAI,IAAI,OAAO,YAAY,MAAM,CAAC,EAAE;AAAA,IAChF;AACA,YAAQ,IAAI,EAAE;AAEd,UAAM,QAAQC,cAAAA,MAAM,QAAQ,CAAC,aAAa,GAAG;AAAA,MACzC,KAAK;AAAA,MACL,OAAO;AAAA,MACP;AAAA,IAAA,CACH;AAED,WAAO,IAAI,QAAQ,CAAC,YAAY;AAC5B,YAAM,GAAG,SAAS,CAAC,SAAS;AAExB,YAAI;AAAE,aAAG,WAAW,aAAa;AAAA,QAAG,QAAQ;AAAA,QAAe;AAC3D,YAAI,SAAS,GAAG;AACZ,kBAAQ,KAAK,QAAQ,CAAC;AAAA,QAC1B;AACA,gBAAA;AAAA,MACJ,CAAC;AAAA,IACL,CAAC;AAAA,EACL;AAEA,WAAS,gBAAgB;AACrB,YAAQ,IAAI;AAAA,EACd,MAAM,KAAK,aAAa,CAAC;AAAA;AAAA,EAEzB,MAAM,MAAM,KAAK,OAAO,CAAC;AAAA,gBACX,MAAM,KAAK,WAAW,CAAC;AAAA;AAAA,EAErC,MAAM,MAAM,KAAK,UAAU,CAAC;AAAA,IAC1B,MAAM,KAAK,KAAK,gBAAgB,CAAC;AAAA;AAAA,EAEnC,MAAM,MAAM,KAAK,wBAAwB,CAAC;AAAA,IACxC,MAAM,KAAK,aAAa,CAAC;AAAA,IACzB,MAAM,KAAK,gBAAgB,CAAC;AAAA;AAAA,EAE9B,MAAM,MAAM,KAAK,UAAU,CAAC;AAAA;AAAA;AAAA,CAG7B;AAAA,EACD;AClJA,iBAAsB,cAAc,SAAkC;AAClE,UAAM,cAAc,mBAAA;AACpB,UAAM,aAAa,kBAAkB,WAAW;AAEhD,UAAM,eAAe,uBAAuB,UAAU;AACtD,QAAI,CAAC,cAAc;AACf,cAAQ,MAAM,MAAM,IAAI,+CAA+C,CAAC;AACxE,cAAQ,MAAM,MAAM,KAAK,+FAA+F,CAAC;AACzH,cAAQ,KAAK,CAAC;AAAA,IAClB;AAEA,UAAM,YAAY,uBAAuB,YAAY,YAAY;AACjE,QAAI,CAAC,WAAW;AACZ,cAAQ,MAAM,MAAM,IAAI,wCAAwC,YAAY,GAAG,CAAC;AAChF,cAAQ,KAAK,CAAC;AAAA,IAClB;AAGA,UAAM,UAAU,YAAY,WAAW;AACvC,UAAM,MAA8B,EAAE,GAAG,QAAQ,IAAA;AACjD,QAAI,SAAS;AACT,UAAI,qBAAqB;AAAA,IAC7B;AAEA,QAAI;AACA,YAAM,OAAO,UAAU,SAAS,KAAK;AACrC,UAAI,MAAM;AACN,cAAM,SAAS,WAAW,WAAW;AACrC,YAAI,CAAC,QAAQ;AACT,kBAAQ,MAAM,MAAM,IAAI,8BAA8B,CAAC;AACvD,kBAAQ,KAAK,CAAC;AAAA,QAClB;AACA,cAAM,MAAM,QAAQ,CAAC,WAAW,GAAG,QAAQ,MAAM,CAAC,CAAC,GAAG;AAAA,UAClD,KAAK;AAAA,UACL,OAAO;AAAA,UACP;AAAA,QAAA,CACH;AAAA,MACL,OAAO;AACH,cAAM,MAAM,QAAQ,CAAC,WAAW,GAAG,QAAQ,MAAM,CAAC,CAAC,GAAG;AAAA,UAClD,KAAK;AAAA,UACL,OAAO;AAAA,UACP;AAAA,QAAA,CACH;AAAA,MACL;AAAA,IACJ,QAAQ;AAGJ,cAAQ,KAAK,CAAC;AAAA,IAClB;AAAA,EACJ;ACrDA,QAAMP,eAAaC,IAAAA,qVAA6B;AAChD,QAAMC,cAAY,KAAK,QAAQF,YAAU;AAEzC,WAAS,aAAqB;AAC1B,QAAI;AAEA,YAAM,UAAU,KAAK,QAAQE,aAAW,iBAAiB;AACzD,UAAI,GAAG,WAAW,OAAO,GAAG;AACxB,eAAO,KAAK,MAAM,GAAG,aAAa,SAAS,OAAO,CAAC,EAAE;AAAA,MACzD;AAAA,IACJ,QAAQ;AAAA,IAER;AACA,WAAO;AAAA,EACX;AAEA,iBAAsB,MAAM,MAAgB;AACxC,UAAM,aAAa;AAAA,MACf;AAAA,QACI,aAAa;AAAA,QACb,UAAU;AAAA,QACV,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAEV;AAAA,QACI,MAAM,KAAK,MAAM,CAAC;AAAA,QAClB,YAAY;AAAA,MAAA;AAAA,IAChB;AAGJ,QAAI,WAAW,WAAW,GAAG;AACzB,cAAQ,IAAI,YAAY;AACxB;AAAA,IACJ;AAEA,UAAM,UAAU,WAAW,EAAE,CAAC;AAC9B,UAAM,aAAa,WAAW,EAAE,CAAC;AAGjC,UAAM,qBAAqB,CAAC,UAAU,MAAM,OAAO,QAAQ,QAAQ;AACnE,QAAI,CAAC,WAAY,WAAW,QAAQ,KAAK,CAAC,mBAAmB,SAAS,OAAO,GAAI;AAC7E,gBAAA;AACA;AAAA,IACJ;AAGA,UAAM,sBAAsB,WAAW,QAAQ,IAAI,WAAW;AAE9D,YAAQ,SAAA;AAAA,MACJ,KAAK;AACD,cAAM,gBAAgB,IAAI;AAC1B;AAAA,MAEJ,KAAK,gBAAgB;AAEjB,cAAM,UAAU;AAAA,UACZ;AAAA,YACI,qBAAqB;AAAA,YACrB,YAAY;AAAA,YACZ,MAAM;AAAA,YACN,MAAM;AAAA,UAAA;AAAA,UAEV;AAAA,YACI,MAAM,KAAK,MAAM,CAAC;AAAA,YAClB,YAAY;AAAA,UAAA;AAAA,QAChB;AAEJ,cAAM,mBAAmB;AAAA,UACrB,gBAAgB,QAAQ,mBAAmB,KAAK;AAAA,UAChD,QAAQ,QAAQ,UAAU,KAAK;AAAA,UAC/B,KAAK,QAAQ,IAAA;AAAA,QAAI,CACpB;AACD;AAAA,MACJ;AAAA,MAEA,KAAK;AACD,cAAM,cAAc,qBAAqB,IAAI;AAC7C;AAAA,MAEJ,KAAK;AACD,cAAM,UAAU,qBAAqB,IAAI;AACzC;AAAA,MAEJ,KAAK;AACD,cAAM,WAAW,IAAI;AACrB;AAAA,MAEJ,KAAK;AACD,cAAM,YAAY,qBAAqB,IAAI;AAC3C;AAAA,MAEJ,KAAK;AACD,cAAM,cAAc,IAAI;AACxB;AAAA,MAEJ;AACI,gBAAQ,IAAI,MAAM,IAAI,oBAAoB,OAAO,EAAE,CAAC;AACpD,gBAAQ,IAAI,EAAE;AACd,kBAAA;AAAA,IAAU;AAAA,EAEtB;AAEA,WAAS,YAAY;AACjB,YAAQ,IAAI;AAAA,EACd,MAAM,KAAK,YAAY,CAAC;AAAA;AAAA,EAExB,MAAM,MAAM,KAAK,OAAO,CAAC;AAAA,WAChB,MAAM,KAAK,WAAW,CAAC;AAAA;AAAA,EAEhC,MAAM,MAAM,KAAK,UAAU,CAAC;AAAA,IAC1B,MAAM,KAAK,KAAK,MAAM,CAAC;AAAA,IACvB,MAAM,KAAK,KAAK,KAAK,CAAC;AAAA;AAAA,EAExB,MAAM,MAAM,KAAK,QAAQ,CAAC;AAAA,IACxB,MAAM,KAAK,KAAK,iBAAiB,CAAC;AAAA,IAClC,MAAM,KAAK,KAAK,QAAQ,CAAC,IAAI,MAAM,KAAK,QAAQ,CAAC;AAAA;AAAA,EAEnD,MAAM,MAAM,KAAK,UAAU,CAAC;AAAA,IAC1B,MAAM,KAAK,KAAK,SAAS,CAAC,sDAAsD,MAAM,KAAK,OAAO,CAAC;AAAA,IACnG,MAAM,KAAK,KAAK,SAAS,CAAC;AAAA,IAC1B,MAAM,KAAK,KAAK,aAAa,CAAC;AAAA,IAC9B,MAAM,KAAK,KAAK,YAAY,CAAC;AAAA,IAC7B,MAAM,KAAK,KAAK,WAAW,CAAC;AAAA,IAC5B,MAAM,KAAK,KAAK,IAAI,CAAC,IAAI,MAAM,KAAK,QAAQ,CAAC;AAAA;AAAA,EAE/C,MAAM,MAAM,KAAK,KAAK,CAAC;AAAA,IACrB,MAAM,KAAK,KAAK,cAAc,CAAC;AAAA;AAAA,EAEjC,MAAM,MAAM,KAAK,MAAM,CAAC;AAAA,IACtB,MAAM,KAAK,KAAK,qBAAqB,CAAC;AAAA,IACtC,MAAM,KAAK,KAAK,MAAM,CAAC,IAAI,MAAM,KAAK,QAAQ,CAAC;AAAA;AAAA,EAEjD,MAAM,MAAM,KAAK,aAAa,CAAC;AAAA,IAC7B,MAAM,KAAK,KAAK,QAAQ,CAAC;AAAA;AAAA,EAE3B,MAAM,MAAM,KAAK,SAAS,CAAC;AAAA,IACzB,MAAM,KAAK,eAAe,CAAC;AAAA,IAC3B,MAAM,KAAK,YAAY,CAAC;AAAA;AAAA,EAE1B,MAAM,KAAK,wCAAwC,CAAC;AAAA,CACrD;AAAA,EACD;AChJA,QAAM,YAAY,KAAK,KAAKM,cAAG,QAAA,GAAW,SAAS;AAEnD,WAAS,UAAU,KAA6B;AAC5C,WAAO,KAAK,KAAK,YAAY,QAAQ,QAAQ,aAAa,MAAM,aAAa;AAAA,EACjF;AAaA,iBAAsB,UAAU,KAAqB,QAA0C;AAC3F,UAAM,KAAK,UAAU,GAAG;AACxB,QAAI,CAAC,GAAG,WAAW,EAAE,EAAG,QAAO;AAC/B,QAAI;AACA,YAAM,OAAO,GAAG,aAAa,IAAI,OAAO;AACxC,aAAO,KAAK,MAAM,IAAI;AAAA,IAC1B,QAAQ;AACJ,aAAO;AAAA,IACX;AAAA,EACJ;AAEO,WAAS,SAAS,OAAuB;AAC5C,QAAI,CAAC,MAAO,OAAM,IAAI,MAAM,cAAc;AAC1C,UAAM,YAAY,MAAM,MAAM,GAAG,EAAE,CAAC;AACpC,UAAM,SAAS,UAAU,QAAQ,MAAM,GAAG,EAAE,QAAQ,MAAM,GAAG;AAC7D,UAAM,SAAS,OAAO,KAAK,QAAQ,QAAQ;AAC3C,WAAO,KAAK,MAAM,OAAO,SAAA,CAAU;AAAA,EACvC;AAEA,iBAAsB,mBAClB,KACA,aACA,QACsB;AACtB,QAAI,CAAC,YAAa,QAAO;AAEzB,UAAM,aAAa,IAAI,KAAM,YAAwC,aAAa,CAAW;AAC7F,QAAI,WAAW,QAAA,IAAY,KAAK,OAAO;AACnC,aAAO;AAAA,IACX;AAGA,WAAO;AAAA,EACX;AAEA,iBAAsB,MAAM,KAAqB,QAAiC;AAC9E,YAAQ;AAAA,MACJ,uIAEA,UAAU,GAAG;AAAA,IAAA;AAAA,EAErB;AAEA,iBAAsB,OAAO,KAAqB,QAAiC;AAC/E,UAAM,KAAK,UAAU,GAAG;AACxB,QAAI,GAAG,WAAW,EAAE,GAAG;AACnB,SAAG,WAAW,EAAE;AAChB,cAAQ,IAAI,2BAA2B;AAAA,IAC3C,OAAO;AACH,cAAQ,IAAI,wBAAwB;AAAA,IACxC;AAAA,EACJ;;;;;;;;;;;;;;;;;;;;;;;;"}
package/dist/index.es.js CHANGED
@@ -81,8 +81,8 @@ async function promptForOptions(rawArgs) {
81
81
  });
82
82
  }
83
83
  const answers = await inquirer.prompt(questions);
84
- const targetDirectory = path.resolve(process.cwd(), nameArg || answers.projectName);
85
- const projectName = path.basename(targetDirectory);
84
+ const projectName = nameArg || answers.projectName;
85
+ const targetDirectory = path.resolve(process.cwd(), projectName);
86
86
  const templateDirectory = path.resolve(cliRoot, "templates", "template");
87
87
  return {
88
88
  projectName,
@@ -193,18 +193,11 @@ async function replacePlaceholders(options) {
193
193
  "config/package.json",
194
194
  "frontend/index.html"
195
195
  ];
196
- const packageJsonPath = path.resolve(cliRoot, "package.json");
197
- let cliVersion = "latest";
198
- if (fs.existsSync(packageJsonPath)) {
199
- const pkg = JSON.parse(fs.readFileSync(packageJsonPath, "utf-8"));
200
- cliVersion = pkg.version || "latest";
201
- }
202
196
  for (const file of filesToProcess) {
203
197
  const fullPath = path.resolve(options.targetDirectory, file);
204
198
  if (!fs.existsSync(fullPath)) continue;
205
199
  let content = fs.readFileSync(fullPath, "utf-8");
206
200
  content = content.replace(/\{\{PROJECT_NAME\}\}/g, options.projectName);
207
- content = content.replace(/("@rebasepro\/[^"]+":\s*)"workspace:\*"/g, `$1"${cliVersion}"`);
208
201
  fs.writeFileSync(fullPath, content, "utf-8");
209
202
  }
210
203
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.es.js","sources":["../src/commands/init.ts","../src/commands/generate_sdk.ts","../src/utils/project.ts","../src/commands/schema.ts","../src/commands/db.ts","../src/commands/dev.ts","../src/commands/auth.ts","../src/commands/doctor.ts","../src/cli.ts","../src/auth.ts"],"sourcesContent":["import arg from \"arg\";\nimport inquirer from \"inquirer\";\nimport chalk from \"chalk\";\nimport path from \"path\";\nimport fs from \"fs\";\nimport { promisify } from \"util\";\nimport execa from \"execa\";\nimport ncp from \"ncp\";\nimport { fileURLToPath } from \"url\";\nimport crypto from \"crypto\";\n\nconst access = promisify(fs.access);\nconst copy = promisify(ncp);\n\n// Resolve template path relative to this file\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\nfunction findParentDir(currentDir: string, targetName: string): string | null {\n const root = path.parse(currentDir).root;\n while (currentDir && currentDir !== root) {\n if (path.basename(currentDir) === targetName) {\n return currentDir;\n }\n currentDir = path.dirname(currentDir);\n }\n return null;\n}\n\nconst cliRoot = findParentDir(__dirname, \"cli\");\n\nexport interface InitOptions {\n projectName: string;\n git: boolean;\n installDeps: boolean;\n targetDirectory: string;\n templateDirectory: string;\n}\n\nexport async function createRebaseApp(rawArgs: string[]) {\n console.log(`\n${chalk.bold(\"Rebase\")} — Create a new project 🚀\n`);\n\n const options = await promptForOptions(rawArgs);\n await createProject(options);\n}\n\nasync function promptForOptions(rawArgs: string[]): Promise<InitOptions> {\n const args = arg(\n {\n \"--git\": Boolean,\n \"--install\": Boolean,\n \"-g\": \"--git\",\n \"-i\": \"--install\"\n },\n {\n argv: rawArgs.slice(3), // skip \"node\", \"rebase\", \"init\"\n permissive: true\n }\n );\n\n // The first positional arg after \"init\" is the project name\n const nameArg = args._[0];\n\n const questions: Record<string, unknown>[] = [];\n\n if (!nameArg) {\n questions.push({\n type: \"input\",\n name: \"projectName\",\n message: \"Project name:\",\n default: \"my-rebase-app\",\n validate: (input: string) => {\n if (!input.trim()) return \"Project name is required\";\n if (!/^[a-z0-9][a-z0-9._-]*$/.test(input)) {\n return \"Project name must start with a lowercase letter or number and contain only lowercase letters, numbers, hyphens, dots, or underscores\";\n }\n return true;\n }\n });\n }\n\n if (!args[\"--git\"]) {\n questions.push({\n type: \"confirm\",\n name: \"git\",\n message: \"Initialize a git repository?\",\n default: true\n });\n }\n\n if (!args[\"--install\"]) {\n questions.push({\n type: \"confirm\",\n name: \"installDeps\",\n message: \"Install dependencies with pnpm?\",\n default: true\n });\n }\n\n const answers = await inquirer.prompt(questions as unknown as Parameters<typeof inquirer.prompt>[0]);\n\n const targetDirectory = path.resolve(process.cwd(), nameArg || answers.projectName);\n const projectName = path.basename(targetDirectory);\n const templateDirectory = path.resolve(cliRoot!, \"templates\", \"template\");\n\n return {\n projectName,\n git: args[\"--git\"] || answers.git || false,\n installDeps: args[\"--install\"] || answers.installDeps || false,\n targetDirectory,\n templateDirectory\n };\n}\n\nasync function createProject(options: InitOptions) {\n // Check if directory already exists and is not empty\n if (fs.existsSync(options.targetDirectory)) {\n if (fs.readdirSync(options.targetDirectory).length !== 0) {\n console.error(`${chalk.red.bold(\"ERROR\")} Directory \"${options.projectName}\" already exists and is not empty`);\n process.exit(1);\n }\n } else {\n fs.mkdirSync(options.targetDirectory, { recursive: true });\n }\n\n // Verify template exists\n try {\n await access(options.templateDirectory, fs.constants.R_OK);\n } catch {\n console.error(`${chalk.red.bold(\"ERROR\")} Template not found at ${options.templateDirectory}`);\n process.exit(1);\n }\n\n // Copy template files\n console.log(chalk.gray(\" Copying project files...\"));\n try {\n await copy(options.templateDirectory, options.targetDirectory, {\n clobber: false,\n dot: true,\n filter: (source: string) => {\n const basename = path.basename(source);\n // Skip node_modules and .DS_Store\n return basename !== \"node_modules\" && basename !== \".DS_Store\";\n }\n });\n } catch (err: unknown) {\n console.error(`${chalk.red.bold(\"ERROR\")} Failed to copy template files: ${err instanceof Error ? err.message : String(err)}`);\n process.exit(1);\n }\n\n // Replace placeholder project name in package.json files\n await replacePlaceholders(options);\n\n // Rename .env.template to .env if it exists and randomize secrets\n const envTemplatePath = path.join(options.targetDirectory, \".env.template\");\n const envPath = path.join(options.targetDirectory, \".env\");\n if (fs.existsSync(envTemplatePath) && !fs.existsSync(envPath)) {\n fs.renameSync(envTemplatePath, envPath);\n\n // Generate secure random strings\n const jwtSecret = crypto.randomBytes(32).toString(\"hex\");\n const dbPassword = crypto.randomBytes(16).toString(\"hex\");\n\n let envContent = fs.readFileSync(envPath, \"utf-8\");\n envContent = envContent.replace(\n \"postgresql://rebase:password@localhost:5432/rebase\",\n `postgresql://rebase:${dbPassword}@localhost:5432/rebase`\n );\n envContent = envContent.replace(\n \"change-this-to-a-secure-random-string\",\n jwtSecret\n );\n\n // Append POSTGRES_PASSWORD for docker-compose interpolation\n envContent += `\\n# Docker Compose Database Password\\nPOSTGRES_PASSWORD=${dbPassword}\\n`;\n\n fs.writeFileSync(envPath, envContent, \"utf-8\");\n }\n\n // Initialize git\n if (options.git) {\n console.log(chalk.gray(\" Initializing git repository...\"));\n try {\n await execa(\"git\", [\"init\"], { cwd: options.targetDirectory });\n } catch {\n console.warn(chalk.yellow(\" Warning: Failed to initialize git repository\"));\n }\n }\n\n if (options.installDeps) {\n console.log(\"\");\n console.log(chalk.gray(\" Installing dependencies with pnpm...\"));\n console.log(\"\");\n try {\n await execa(\"pnpm\", [\"install\"], {\n cwd: options.targetDirectory,\n stdio: \"inherit\"\n });\n } catch {\n console.warn(chalk.yellow(\" Warning: Failed to install dependencies. You may need to run `pnpm install` manually.\"));\n }\n }\n\n // Success message\n console.log(\"\");\n console.log(`${chalk.green.bold(\"✓\")} Project ${chalk.bold(options.projectName)} created successfully!`);\n console.log(\"\");\n console.log(chalk.bold(\"Next steps:\"));\n console.log(\"\");\n console.log(` ${chalk.cyan(\"cd\")} ${options.projectName}`);\n if (!options.installDeps) {\n console.log(` ${chalk.cyan(\"pnpm install\")}`);\n }\n console.log(\"\");\n console.log(chalk.gray(\" # Set up your database connection in .env\"));\n console.log(chalk.gray(\" # Then run:\"));\n console.log(\"\");\n console.log(` ${chalk.cyan(\"pnpm dev\")}`);\n console.log(\"\");\n console.log(chalk.gray(\"This starts both the backend (Hono + PostgreSQL)\")\n + chalk.gray(\" and the frontend (Vite + React) concurrently.\"));\n console.log(\"\");\n console.log(chalk.gray(\"Docs: https://rebase.pro/docs\"));\n console.log(chalk.gray(\"GitHub: https://github.com/rebasepro/rebase\"));\n console.log(\"\");\n}\n\nasync function replacePlaceholders(options: InitOptions) {\n const filesToProcess = [\n \"package.json\",\n \"frontend/package.json\",\n \"backend/package.json\",\n \"config/package.json\",\n \"frontend/index.html\"\n ];\n\n const packageJsonPath = path.resolve(cliRoot!, \"package.json\");\n let cliVersion = \"latest\";\n if (fs.existsSync(packageJsonPath)) {\n const pkg = JSON.parse(fs.readFileSync(packageJsonPath, \"utf-8\"));\n cliVersion = pkg.version || \"latest\";\n }\n\n for (const file of filesToProcess) {\n const fullPath = path.resolve(options.targetDirectory, file);\n if (!fs.existsSync(fullPath)) continue;\n\n let content = fs.readFileSync(fullPath, \"utf-8\");\n content = content.replace(/\\{\\{PROJECT_NAME\\}\\}/g, options.projectName);\n content = content.replace(/(\"@rebasepro\\/[^\"]+\":\\s*)\"workspace:\\*\"/g, `$1\"${cliVersion}\"`);\n fs.writeFileSync(fullPath, content, \"utf-8\");\n }\n}\n","/**\n * CLI command: generate-sdk\n *\n * Reads collection definitions from a specified directory (default: ./config/collections),\n * generates a typed JS SDK, and writes it to the output directory (default: ./generated/sdk).\n *\n * Uses jiti for dynamic TypeScript import of collection files.\n */\n\nimport fs from \"fs\";\nimport path from \"path\";\nimport chalk from \"chalk\";\nimport { EntityCollection } from \"@rebasepro/types\";\nimport { generateSDK, GeneratedFile } from \"@rebasepro/sdk-generator\";\n\ninterface GenerateSDKArgs {\n collectionsDir: string;\n output: string;\n cwd: string;\n}\n\n/**\n * Dynamically load collection definitions from a directory.\n *\n * Expects the directory to have an index.ts/index.js that exports a default\n * array of EntityCollection objects (matching the app/config/collections pattern).\n */\nasync function loadCollections(collectionsDir: string): Promise<EntityCollection[]> {\n const absDir = path.resolve(collectionsDir);\n\n if (!fs.existsSync(absDir)) {\n throw new Error(`Collections directory not found: ${absDir}`);\n }\n\n // Try to import the index file using jiti (supports TypeScript natively)\n let jiti: (id: string, userOptions?: Record<string, unknown>) => (modulePath: string) => Record<string, unknown>;\n try {\n const jitiModule = await import(\"jiti\");\n jiti = (jitiModule.default || jitiModule) as unknown as typeof jiti;\n } catch {\n throw new Error(\n \"Could not load 'jiti'. Install it with: pnpm add -D jiti\\n\" +\n \"jiti is required to dynamically import TypeScript collection definitions.\"\n );\n }\n\n const jitiInstance = jiti(absDir, {\n interopDefault: true,\n esmResolve: true\n });\n\n // Look for index file\n const indexCandidates = [\"index.ts\", \"index.js\", \"index.mjs\"];\n let indexPath: string | null = null;\n\n for (const candidate of indexCandidates) {\n const p = path.join(absDir, candidate);\n if (fs.existsSync(p)) {\n indexPath = p;\n break;\n }\n }\n\n if (!indexPath) {\n // Fallback: load each .ts/.js file individually\n console.log(chalk.yellow(\" No index file found, scanning individual collection files...\"));\n const collections: EntityCollection[] = [];\n const files = fs.readdirSync(absDir).filter(f =>\n (f.endsWith(\".ts\") || f.endsWith(\".js\")) && !f.startsWith(\".\")\n );\n\n for (const file of files) {\n try {\n const mod = jitiInstance(path.join(absDir, file));\n const exported = mod.default || mod;\n if (exported && typeof exported === \"object\" && \"slug\" in exported) {\n collections.push(exported as EntityCollection);\n } else if (Array.isArray(exported)) {\n collections.push(...exported);\n }\n } catch (err) {\n console.warn(chalk.yellow(` ⚠ Skipping ${file}: ${(err as Error).message}`));\n }\n }\n\n return collections;\n }\n\n // Import the index\n const mod = jitiInstance(indexPath);\n const exported = mod.default || mod;\n\n if (Array.isArray(exported)) {\n return exported as EntityCollection[];\n } else if (typeof exported === \"object\" && exported !== null) {\n // Could be a named export like { collections: [...] }\n if (\"collections\" in exported && Array.isArray(exported.collections)) {\n return exported.collections;\n }\n // Or individual named exports\n const collections: EntityCollection[] = [];\n for (const value of Object.values(exported)) {\n if (value && typeof value === \"object\" && \"slug\" in (value as EntityCollection)) {\n collections.push(value as EntityCollection);\n }\n }\n if (collections.length > 0) return collections;\n }\n\n throw new Error(\n `Could not extract collections from ${indexPath}.\\n` +\n \"Expected a default export of EntityCollection[] or an object with named collection exports.\"\n );\n}\n\n/**\n * Write generated files to the output directory.\n */\nfunction writeFiles(outputDir: string, files: GeneratedFile[]): void {\n const absOutput = path.resolve(outputDir);\n\n // Create output directory\n fs.mkdirSync(absOutput, { recursive: true });\n\n for (const file of files) {\n const filePath = path.join(absOutput, file.path);\n const dir = path.dirname(filePath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n fs.writeFileSync(filePath, file.content, \"utf-8\");\n }\n}\n\n/**\n * Main entry point for the generate-sdk command.\n */\nexport async function generateSdkCommand(args: GenerateSDKArgs): Promise<void> {\n const { collectionsDir, output, cwd } = args;\n\n const resolvedCollectionsDir = path.isAbsolute(collectionsDir)\n ? collectionsDir\n : path.join(cwd, collectionsDir);\n\n const resolvedOutput = path.isAbsolute(output)\n ? output\n : path.join(cwd, output);\n\n console.log(\"\");\n console.log(chalk.bold(\" 🔧 Rebase SDK Generator\"));\n console.log(\"\");\n console.log(` ${chalk.gray(\"Collections:\")} ${resolvedCollectionsDir}`);\n console.log(` ${chalk.gray(\"Output:\")} ${resolvedOutput}`);\n console.log(\"\");\n\n // 1. Load collections\n console.log(chalk.cyan(\" → Loading collection definitions...\"));\n const collections = await loadCollections(resolvedCollectionsDir);\n\n if (collections.length === 0) {\n console.log(chalk.red(\" ✗ No collections found. Nothing to generate.\"));\n process.exit(1);\n }\n\n console.log(chalk.green(` ✓ Found ${collections.length} collection(s): ${collections.map(c => c.slug).join(\", \")}`));\n console.log(\"\");\n\n // 2. Generate SDK files\n console.log(chalk.cyan(\" → Generating SDK files...\"));\n const files = generateSDK(collections);\n console.log(chalk.green(` ✓ Generated ${files.length} file(s)`));\n\n // 3. Write to disk\n console.log(chalk.cyan(` → Writing to ${resolvedOutput}...`));\n writeFiles(resolvedOutput, files);\n\n console.log(\"\");\n console.log(chalk.green.bold(\" ✓ SDK generated successfully!\"));\n console.log(\"\");\n console.log(chalk.gray(\" Usage:\"));\n console.log(chalk.gray(\" import { createRebaseClient } from '@rebasepro/client';\"));\n console.log(chalk.gray(` import type { Database } from './${path.relative(cwd, path.join(resolvedOutput, \"database.types\"))}';`));\n console.log(\"\");\n console.log(chalk.gray(\" const rebase = createRebaseClient<Database>({\"));\n console.log(chalk.gray(\" baseUrl: 'http://localhost:3001',\"));\n console.log(chalk.gray(\" // token: 'your-jwt-token',\"));\n console.log(chalk.gray(\" });\"));\n console.log(\"\");\n console.log(chalk.gray(` const { data } = await rebase.collection('${collections[0]?.slug || \"my_collection\"}').find();`));\n console.log(\"\");\n}\n","/**\n * Project discovery utilities for the Rebase CLI.\n *\n * These helpers locate the project root, backend directory, .env file,\n * and local binaries — used by all CLI command modules.\n */\nimport fs from \"fs\";\nimport path from \"path\";\nimport { execSync } from \"child_process\";\nimport chalk from \"chalk\";\n\n/**\n * Walk up from `startDir` to find the Rebase project root.\n *\n * The root is identified by a `package.json` that either:\n * - has `workspaces` containing \"backend\" or \"frontend\", OR\n * - has a sibling `backend/` directory\n */\nexport function findProjectRoot(startDir: string = process.cwd()): string | null {\n let dir = path.resolve(startDir);\n const root = path.parse(dir).root;\n\n while (dir !== root) {\n const pkgPath = path.join(dir, \"package.json\");\n\n if (fs.existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, \"utf-8\"));\n // Check for workspace-based project (monorepo root)\n if (pkg.workspaces && Array.isArray(pkg.workspaces)) {\n const hasBackend = pkg.workspaces.some((w: string) =>\n w === \"backend\" || w.includes(\"backend\")\n );\n if (hasBackend) return dir;\n }\n } catch {\n // ignore parse errors\n }\n\n // Check for sibling backend directory\n if (fs.existsSync(path.join(dir, \"backend\")) && fs.existsSync(path.join(dir, \"config\"))) {\n return dir;\n }\n }\n\n dir = path.dirname(dir);\n }\n\n return null;\n}\n\n/**\n * Locate the backend directory within the project root.\n */\nexport function findBackendDir(projectRoot: string): string | null {\n const backendDir = path.join(projectRoot, \"backend\");\n return fs.existsSync(backendDir) ? backendDir : null;\n}\n\n/**\n * Detect the active backend plugin (e.g. @rebasepro/server-postgresql) from the backend's package.json.\n */\nexport function getActiveBackendPlugin(backendDir: string): string | null {\n const pkgPath = path.join(backendDir, \"package.json\");\n if (!fs.existsSync(pkgPath)) return null;\n\n try {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, \"utf-8\"));\n const deps = { ...pkg.dependencies,\n...pkg.devDependencies };\n\n // Find the first dependency that matches @rebasepro/server-* (database driver plugins),\n // but not @rebasepro/server-core which is the framework itself\n for (const dep of Object.keys(deps)) {\n if (dep.startsWith(\"@rebasepro/server-\") && dep !== \"@rebasepro/server-core\") {\n return dep;\n }\n }\n } catch {\n // Ignore parse errors\n }\n return null;\n}\n\n/**\n * Resolve the active plugin's CLI script.\n */\nexport function resolvePluginCliScript(backendDir: string, pluginName: string): string | null {\n const candidates = [\n path.join(backendDir, \"node_modules\", pluginName, \"src\", \"cli.ts\"),\n path.join(backendDir, \"node_modules\", pluginName, \"dist\", \"cli.js\"),\n // For monorepo dev mode:\n path.resolve(backendDir, \"..\", \"..\", \"packages\", pluginName.replace(\"@rebasepro/\", \"\"), \"src\", \"cli.ts\"),\n path.resolve(backendDir, \"..\", \"packages\", pluginName.replace(\"@rebasepro/\", \"\"), \"src\", \"cli.ts\")\n ];\n\n for (const candidate of candidates) {\n if (fs.existsSync(candidate)) return candidate;\n }\n return null;\n}\n\n/**\n * Locate the frontend directory within the project root.\n */\nexport function findFrontendDir(projectRoot: string): string | null {\n const frontendDir = path.join(projectRoot, \"frontend\");\n return fs.existsSync(frontendDir) ? frontendDir : null;\n}\n\n/**\n * Find the .env file. Checks the project root first, then backend.\n */\nexport function findEnvFile(projectRoot: string): string | null {\n const candidates = [\n path.join(projectRoot, \".env\"),\n path.join(projectRoot, \"backend\", \".env\")\n ];\n\n for (const candidate of candidates) {\n if (fs.existsSync(candidate)) return candidate;\n }\n\n return null;\n}\n\n/**\n * Resolve a binary from the project's node_modules/.bin.\n * Checks backend, root, parent monorepo root, then falls back to PATH.\n */\nexport function resolveLocalBin(projectRoot: string, binName: string): string | null {\n const candidates = [\n path.join(projectRoot, \"backend\", \"node_modules\", \".bin\", binName),\n path.join(projectRoot, \"node_modules\", \".bin\", binName)\n ];\n\n // Also check parent directories (for monorepo setups where app/ is nested)\n let parent = path.dirname(projectRoot);\n const rootDir = path.parse(parent).root;\n while (parent !== rootDir) {\n candidates.push(path.join(parent, \"node_modules\", \".bin\", binName));\n parent = path.dirname(parent);\n }\n\n for (const candidate of candidates) {\n if (fs.existsSync(candidate)) return candidate;\n }\n\n // Fall back to globally installed binary via which\n try {\n const globalPath = execSync(`which ${binName}`, { encoding: \"utf-8\" }).trim();\n if (globalPath && fs.existsSync(globalPath)) return globalPath;\n } catch {\n // not found globally\n }\n\n return null;\n}\n\n/**\n * Resolve the tsx binary. Checks backend node_modules first, then root.\n */\nexport function resolveTsx(projectRoot: string): string | null {\n return resolveLocalBin(projectRoot, \"tsx\");\n}\n\n/**\n * Require the project root or exit with a helpful error.\n */\nexport function requireProjectRoot(): string {\n const root = findProjectRoot();\n if (!root) {\n console.error(chalk.red(\"✗ Could not find a Rebase project root.\"));\n console.error(chalk.gray(\" Make sure you are inside a Rebase project directory\"));\n console.error(chalk.gray(\" (one with backend/, frontend/, and shared/ directories).\"));\n process.exit(1);\n }\n return root;\n}\n\n/**\n * Require the backend directory or exit with a helpful error.\n */\nexport function requireBackendDir(projectRoot: string): string {\n const backendDir = findBackendDir(projectRoot);\n if (!backendDir) {\n console.error(chalk.red(\"✗ Could not find a backend/ directory.\"));\n console.error(chalk.gray(` Expected at: ${path.join(projectRoot, \"backend\")}`));\n process.exit(1);\n }\n return backendDir;\n}\n","/**\n * CLI command: rebase schema <action>\n */\nimport chalk from \"chalk\";\nimport execa from \"execa\";\nimport {\n requireProjectRoot,\n requireBackendDir,\n getActiveBackendPlugin,\n resolvePluginCliScript,\n resolveTsx,\n findEnvFile\n} from \"../utils/project\";\n\nexport async function schemaCommand(subcommand: string | undefined, rawArgs: string[]): Promise<void> {\n if (!subcommand || subcommand === \"--help\") {\n printSchemaHelp();\n return;\n }\n\n const projectRoot = requireProjectRoot();\n const backendDir = requireBackendDir(projectRoot);\n\n const activePlugin = getActiveBackendPlugin(backendDir);\n if (!activePlugin) {\n console.error(chalk.red(\"✗ Could not detect an active database plugin.\"));\n console.error(chalk.gray(\" Make sure a package like @rebasepro/server-postgresql is installed in backend/package.json.\"));\n process.exit(1);\n }\n\n const pluginCli = resolvePluginCliScript(backendDir, activePlugin);\n if (!pluginCli) {\n console.error(chalk.red(`✗ Could not find CLI entry point for ${activePlugin}.`));\n process.exit(1);\n }\n\n // Set up environment with DOTENV_CONFIG_PATH\n const envFile = findEnvFile(projectRoot);\n const env: Record<string, string> = { ...process.env as Record<string, string> };\n if (envFile) {\n env.DOTENV_CONFIG_PATH = envFile;\n }\n\n try {\n const isTs = pluginCli.endsWith(\".ts\");\n if (isTs) {\n const tsxBin = resolveTsx(projectRoot);\n if (!tsxBin) {\n console.error(chalk.red(\"✗ Could not find tsx binary.\"));\n process.exit(1);\n }\n await execa(tsxBin, [pluginCli, ...rawArgs.slice(2)], {\n cwd: backendDir,\n stdio: \"inherit\",\n env\n });\n } else {\n await execa(\"node\", [pluginCli, ...rawArgs.slice(2)], {\n cwd: backendDir,\n stdio: \"inherit\",\n env\n });\n }\n } catch (err: unknown) {\n process.exit(1);\n }\n}\n\nfunction printSchemaHelp() {\n console.log(`\n${chalk.bold(\"rebase schema\")} — Schema management commands\n\n${chalk.green.bold(\"Usage\")}\n rebase schema ${chalk.blue(\"<command>\")} [options]\n\n${chalk.green.bold(\"Commands\")}\n ${chalk.gray(\"(Commands are provided by your active database driver plugin)\")}\n ${chalk.blue.bold(\"generate\")} Generate Schema from collection definitions\n\n${chalk.green.bold(\"generate Options\")}\n ${chalk.blue(\"--collections, -c\")} Path to collections directory\n ${chalk.blue(\"--output, -o\")} Output path for generated schema\n ${chalk.blue(\"--watch, -w\")} Watch for changes and regenerate automatically\n`);\n}\n","/**\n * CLI command: rebase db <action>\n */\nimport chalk from \"chalk\";\nimport execa from \"execa\";\nimport {\n requireProjectRoot,\n requireBackendDir,\n getActiveBackendPlugin,\n resolvePluginCliScript,\n resolveTsx,\n findEnvFile\n} from \"../utils/project\";\n\nexport async function dbCommand(subcommand: string | undefined, rawArgs: string[]): Promise<void> {\n if (!subcommand || subcommand === \"--help\") {\n printDbHelp();\n return;\n }\n\n const projectRoot = requireProjectRoot();\n const backendDir = requireBackendDir(projectRoot);\n\n const activePlugin = getActiveBackendPlugin(backendDir);\n if (!activePlugin) {\n console.error(chalk.red(\"✗ Could not detect an active database plugin.\"));\n console.error(chalk.gray(\" Make sure a package like @rebasepro/server-postgresql is installed in backend/package.json.\"));\n process.exit(1);\n }\n\n const pluginCli = resolvePluginCliScript(backendDir, activePlugin);\n if (!pluginCli) {\n console.error(chalk.red(`✗ Could not find CLI entry point for ${activePlugin}.`));\n process.exit(1);\n }\n\n // Set up environment with DOTENV_CONFIG_PATH\n const envFile = findEnvFile(projectRoot);\n const env: Record<string, string> = { ...process.env as Record<string, string> };\n if (envFile) {\n env.DOTENV_CONFIG_PATH = envFile;\n }\n\n try {\n const isTs = pluginCli.endsWith(\".ts\");\n if (isTs) {\n const tsxBin = resolveTsx(projectRoot);\n if (!tsxBin) {\n console.error(chalk.red(\"✗ Could not find tsx binary.\"));\n process.exit(1);\n }\n await execa(tsxBin, [pluginCli, ...rawArgs.slice(2)], {\n cwd: backendDir,\n stdio: \"inherit\",\n env\n });\n } else {\n await execa(\"node\", [pluginCli, ...rawArgs.slice(2)], {\n cwd: backendDir,\n stdio: \"inherit\",\n env\n });\n }\n } catch (err: unknown) {\n // If the process exits with an error code, execa will throw,\n // but inherit stdio means the user already saw the output.\n process.exit(1);\n }\n}\n\nfunction printDbHelp() {\n console.log(`\n${chalk.bold(\"rebase db\")} — Database management commands\n\n${chalk.green.bold(\"Usage\")}\n rebase db ${chalk.blue(\"<command>\")} [options]\n\n${chalk.green.bold(\"Commands\")}\n ${chalk.gray(\"(Commands are provided by your active database driver plugin)\")}\n ${chalk.blue.bold(\"push\")} Apply schema directly to database (development)\n ${chalk.blue.bold(\"pull\")} Introspect database → Schema\n ${chalk.blue.bold(\"generate\")} Generate migration files\n ${chalk.blue.bold(\"migrate\")} Run pending migrations\n ${chalk.blue.bold(\"studio\")} Open Studio viewer\n ${chalk.blue.bold(\"branch\")} Database branching (create, list, delete, info)\n\n${chalk.green.bold(\"Examples\")}\n ${chalk.gray(\"# Quick development workflow\")}\n rebase schema generate && rebase db push\n\n ${chalk.gray(\"# Production migration workflow\")}\n rebase db generate\n rebase db migrate\n\n ${chalk.gray(\"# Create a database branch\")}\n rebase db branch create feature_auth\n`);\n}\n","/**\n * CLI command: rebase dev\n *\n * Starts the full development environment:\n * - Backend: tsx watch with auto-reload\n * - Frontend: vite dev server\n *\n * Both processes stream output with color-coded prefixes.\n *\n * When the backend uses port-retry (i.e. the configured port is busy and it\n * binds to the next free one), the CLI detects the actual port from stdout\n * and injects VITE_API_URL into the frontend so it connects automatically.\n *\n * Each project gets a deterministic default port derived from the project\n * root path, so multiple Rebase instances never collide.\n */\nimport arg from \"arg\";\nimport chalk from \"chalk\";\nimport execa, { ExecaChildProcess } from \"execa\";\nimport path from \"path\";\nimport fs from \"fs\";\nimport {\n requireProjectRoot,\n findBackendDir,\n findFrontendDir,\n findEnvFile,\n resolveTsx\n} from \"../utils/project\";\n\n/** Well-known filename the backend writes its actual port to. */\nconst DEV_PORT_FILENAME = \".rebase-dev-port\";\n\n/**\n * Compute a deterministic port from the project root path.\n * Range: 3001–3999 (avoids privileged ports and common services).\n * Two different project directories will almost always get different ports.\n */\nfunction getProjectPort(projectRoot: string): number {\n let hash = 0;\n for (let i = 0; i < projectRoot.length; i++) {\n hash = ((hash << 5) - hash + projectRoot.charCodeAt(i)) | 0;\n }\n return 3001 + (Math.abs(hash) % 999);\n}\n\n/**\n * Resolve the best starting port for this project:\n * 1. Explicit --port flag (highest priority)\n * 2. PORT env var\n * 3. Previously used port from .rebase-dev-port (port affinity across restarts)\n * 4. Deterministic hash from project path (unique per project)\n */\nfunction resolveStartPort(projectRoot: string, explicitPort?: number): number {\n // 1. Explicit flag\n if (explicitPort) return explicitPort;\n\n // 2. PORT env var\n if (process.env.PORT) return parseInt(process.env.PORT, 10);\n\n // 3. Port affinity — check if we wrote a port file from a previous run\n try {\n const portFile = path.join(projectRoot, DEV_PORT_FILENAME);\n if (fs.existsSync(portFile)) {\n const saved = parseInt(fs.readFileSync(portFile, \"utf-8\").trim(), 10);\n if (saved > 0 && saved < 65536) return saved;\n }\n } catch { /* ignore */ }\n\n // 4. Deterministic hash\n return getProjectPort(projectRoot);\n}\n\nexport async function devCommand(rawArgs: string[]): Promise<void> {\n const args = arg(\n {\n \"--backend-only\": Boolean,\n \"--frontend-only\": Boolean,\n \"--port\": Number,\n \"--help\": Boolean,\n \"-b\": \"--backend-only\",\n \"-f\": \"--frontend-only\",\n \"-p\": \"--port\",\n \"-h\": \"--help\"\n },\n {\n argv: rawArgs.slice(3), // skip \"node rebase dev\"\n permissive: true\n }\n );\n\n if (args[\"--help\"]) {\n printDevHelp();\n return;\n }\n\n const projectRoot = requireProjectRoot();\n const backendDir = findBackendDir(projectRoot);\n const frontendDir = findFrontendDir(projectRoot);\n const backendOnly = args[\"--backend-only\"] || false;\n const frontendOnly = args[\"--frontend-only\"] || false;\n\n // Resolve the port ONCE, before starting anything\n const startPort = resolveStartPort(projectRoot, args[\"--port\"]);\n\n console.log(\"\");\n console.log(chalk.bold(\" 🚀 Rebase Dev Server\"));\n console.log(\"\");\n\n const children: ExecaChildProcess[] = [];\n\n // --- State for printing the banner ---\n let frontendUrl = \"\";\n let backendUrl = \"\";\n let debounceSummary: NodeJS.Timeout | null = null;\n let bannerPrinted = false;\n\n /** Actual backend port, resolved once the server prints its URL. */\n let resolvedBackendPort: number | null = null;\n\n // Use regex to strip ANSI codes before matching\n // eslint-disable-next-line no-control-regex\n const stripAnsi = (str: string) => str.replace(/[\\u001b\\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g, \"\");\n\n function printSummary() {\n if (!frontendUrl || !backendUrl) return;\n if (debounceSummary) clearTimeout(debounceSummary);\n debounceSummary = setTimeout(() => {\n if (bannerPrinted) return;\n console.log(\"\");\n console.log(chalk.cyan(\"┌────────────────────────────────────────────────────────────┐\"));\n console.log(chalk.cyan(\"│ │\"));\n console.log(chalk.cyan(\"│ ✨ Rebase Admin App is ready! │\"));\n const cleanUrl = stripAnsi(frontendUrl);\n const paddedUrl = cleanUrl.padEnd(40);\n console.log(chalk.cyan(\"│ 👉 Frontend URL: \") + chalk.white(paddedUrl) + chalk.cyan(\"│\"));\n console.log(chalk.cyan(\"│ │\"));\n console.log(chalk.cyan(\"└────────────────────────────────────────────────────────────┘\"));\n console.log(\"\");\n bannerPrinted = true;\n }, 500);\n }\n\n // Handle graceful shutdown\n const cleanup = () => {\n // Clean up dev port file\n try {\n const portFile = path.join(projectRoot, DEV_PORT_FILENAME);\n if (fs.existsSync(portFile)) fs.unlinkSync(portFile);\n\n const urlFile = path.join(projectRoot, \".rebase-dev-url\");\n if (fs.existsSync(urlFile)) fs.unlinkSync(urlFile);\n } catch { /* ignore */ }\n\n children.forEach((child) => {\n if (child.pid && !child.killed) {\n try {\n if (process.platform === \"win32\") {\n execa.commandSync(`taskkill /pid ${child.pid} /T /F`);\n } else {\n process.kill(-child.pid, \"SIGKILL\");\n }\n } catch (e) {\n try {\n child.kill(\"SIGKILL\");\n } catch (err) {\n // ignore\n }\n }\n }\n });\n process.exit(0);\n };\n process.on(\"SIGINT\", cleanup);\n process.on(\"SIGTERM\", cleanup);\n\n /**\n * Start the Vite frontend, optionally injecting the backend port.\n */\n function startFrontend(backendPort: number | null) {\n if (!frontendDir) return;\n\n console.log(` ${chalk.magenta(\"▶\")} Frontend: ${chalk.gray(frontendDir)}`);\n\n const frontendEnv: Record<string, string> = { ...process.env as Record<string, string> };\n\n // Inject the resolved backend URL so Vite picks it up\n if (backendPort) {\n frontendEnv.VITE_API_URL = `http://localhost:${backendPort}`;\n console.log(` ${chalk.gray(\"↳ VITE_API_URL\")} = ${chalk.white(`http://localhost:${backendPort}`)}`);\n }\n\n const frontendChild = execa(\n \"pnpm\",\n [\"run\", \"dev\"],\n {\n cwd: frontendDir,\n stdio: [\"inherit\", \"pipe\", \"pipe\"],\n env: frontendEnv,\n shell: true,\n detached: process.platform !== \"win32\"\n }\n );\n frontendChild.catch(() => {}); // prevent unhandled promise rejection on exit\n\n frontendChild.stdout?.on(\"data\", (data: Buffer) => {\n const lines = data.toString().split(\"\\n\").filter(Boolean);\n lines.forEach((line: string) => {\n console.log(`${chalk.magenta.bold(\"[admin]\")} ${line}`);\n const cleanLine = stripAnsi(line);\n const urlMatch = cleanLine.match(/(http:\\/\\/(?:localhost|127\\.0\\.0\\.1):\\d+)/);\n if (cleanLine.includes(\"Local:\") && urlMatch) {\n frontendUrl = urlMatch[1];\n printSummary();\n }\n });\n });\n\n frontendChild.stderr?.on(\"data\", (data: Buffer) => {\n const lines = data.toString().split(\"\\n\").filter(Boolean);\n lines.forEach((line: string) => {\n console.log(`${chalk.magenta.bold(\"[admin]\")} ${line}`);\n });\n });\n\n children.push(frontendChild);\n }\n\n // Start backend\n if (!frontendOnly && backendDir) {\n const tsxBin = resolveTsx(projectRoot);\n if (!tsxBin) {\n console.error(chalk.red(\" ✗ Could not find tsx binary for backend.\"));\n console.error(chalk.gray(\" Install it with: pnpm add -D tsx\"));\n process.exit(1);\n }\n\n const envFile = findEnvFile(projectRoot);\n const env: Record<string, string> = { ...process.env as Record<string, string> };\n if (envFile) {\n env.DOTENV_CONFIG_PATH = envFile;\n }\n\n // Always inject PORT so the backend uses our resolved port instead of\n // its hardcoded default (3001). This prevents cross-project collisions\n // when multiple Rebase instances run simultaneously.\n env.PORT = String(startPort);\n\n console.log(` ${chalk.cyan(\"▶\")} Backend: ${chalk.gray(backendDir)}`);\n console.log(` ${chalk.gray(\"↳ PORT\")} = ${chalk.white(String(startPort))}`);\n\n /** Whether the frontend has been launched (we only launch it once). */\n let frontendLaunched = false;\n\n const backendChild = execa(\n tsxBin,\n [\"watch\", `--watch=\"${path.join(\"..\", \"config\", \"**\", \"*\")}\"`, \"--conditions\", \"development\", \"src/index.ts\"],\n {\n cwd: backendDir,\n stdio: [\"inherit\", \"pipe\", \"pipe\"],\n env,\n shell: true,\n detached: process.platform !== \"win32\"\n }\n );\n backendChild.catch(() => {}); // prevent unhandled promise rejection on exit\n\n backendChild.stdout?.on(\"data\", (data: Buffer) => {\n const lines = data.toString().split(\"\\n\").filter(Boolean);\n lines.forEach((line: string) => {\n console.log(`${chalk.cyan.bold(\"[backend]\")} ${line}`);\n const cleanLine = stripAnsi(line);\n const serverMatch = cleanLine.match(/Server running at http:\\/\\/(?:localhost|127\\.0\\.0\\.1):(\\d+)/);\n if (serverMatch) {\n resolvedBackendPort = parseInt(serverMatch[1], 10);\n backendUrl = \"started\";\n printSummary();\n\n // Save the url to a temp file for scripts to pick up\n const urlFile = path.join(projectRoot, \".rebase-dev-url\");\n fs.writeFileSync(urlFile, `http://localhost:${resolvedBackendPort}`, \"utf-8\");\n\n // Save the port to .rebase-dev-port for port affinity\n const portFile = path.join(projectRoot, DEV_PORT_FILENAME);\n fs.writeFileSync(portFile, String(resolvedBackendPort), \"utf-8\");\n\n // Start frontend now that we know the real port\n if (!backendOnly && frontendDir && !frontendLaunched) {\n frontendLaunched = true;\n startFrontend(resolvedBackendPort);\n }\n }\n });\n });\n\n backendChild.stderr?.on(\"data\", (data: Buffer) => {\n const lines = data.toString().split(\"\\n\").filter(Boolean);\n lines.forEach((line: string) => {\n console.log(`${chalk.cyan.bold(\"[backend]\")} ${line}`);\n });\n });\n\n children.push(backendChild);\n } else if (!frontendOnly && !backendDir) {\n console.warn(chalk.yellow(\" ⚠ No backend/ directory found, skipping backend.\"));\n }\n\n // Start frontend immediately if backend-only mode or no backend\n if (!backendOnly && frontendDir && (frontendOnly || !backendDir)) {\n startFrontend(null);\n } else if (!backendOnly && !frontendDir) {\n console.warn(chalk.yellow(\" ⚠ No frontend/ directory found, skipping frontend.\"));\n }\n\n if (children.length === 0) {\n console.error(chalk.red(\" ✗ Nothing to start. Check your project structure.\"));\n process.exit(1);\n }\n\n console.log(\"\");\n console.log(chalk.gray(\" Press Ctrl+C to stop all servers.\"));\n console.log(\"\");\n\n // Wait for all children to exit\n await Promise.all(\n children.map(\n (child) =>\n new Promise<void>((resolve) => {\n child.finally(() => resolve());\n })\n )\n );\n}\n\nfunction printDevHelp() {\n console.log(`\n${chalk.bold(\"rebase dev\")} — Start the development server\n\n${chalk.green.bold(\"Usage\")}\n rebase dev [options]\n\n${chalk.green.bold(\"Options\")}\n ${chalk.blue(\"--backend-only, -b\")} Only start the backend server\n ${chalk.blue(\"--frontend-only, -f\")} Only start the frontend server\n ${chalk.blue(\"--port, -p\")} Backend port (default: auto-detected per project)\n\n${chalk.green.bold(\"Description\")}\n Starts both the backend (tsx watch + Hono) and frontend (Vite)\n dev servers concurrently with color-coded output prefixes.\n\n Each project automatically receives a unique default port derived\n from its directory path, preventing collisions when running multiple\n Rebase instances simultaneously.\n\n If the assigned port is already in use, the server will automatically\n try the next available port. The frontend is started only after the\n backend is ready, and VITE_API_URL is injected automatically.\n`);\n}\n","/**\n * CLI command: rebase auth <action>\n *\n * Subcommands:\n * reset-password — Reset a user's password\n */\nimport arg from \"arg\";\nimport chalk from \"chalk\";\nimport path from \"path\";\nimport fs from \"fs\";\nimport { spawn } from \"child_process\";\nimport {\n requireProjectRoot,\n requireBackendDir,\n findEnvFile,\n resolveTsx\n} from \"../utils/project\";\n\nexport async function authCommand(subcommand: string | undefined, rawArgs: string[]): Promise<void> {\n if (!subcommand || subcommand === \"--help\") {\n printAuthHelp();\n return;\n }\n\n switch (subcommand) {\n case \"reset-password\":\n await resetPassword(rawArgs);\n break;\n default:\n console.error(chalk.red(`Unknown auth command: ${subcommand}`));\n console.log(\"\");\n printAuthHelp();\n process.exit(1);\n }\n}\n\nasync function resetPassword(rawArgs: string[]): Promise<void> {\n const args = arg(\n {\n \"--email\": String,\n \"--password\": String,\n \"-e\": \"--email\",\n \"-p\": \"--password\"\n },\n {\n argv: rawArgs.slice(4), // skip \"node rebase auth reset-password\"\n permissive: true\n }\n );\n\n // Support both --email flag and positional args\n const email = args[\"--email\"] || args._[0];\n const newPassword = args[\"--password\"] || args._[1];\n\n if (!email) {\n console.error(chalk.red(\"✗ Email is required.\"));\n console.log(\"\");\n console.log(chalk.gray(\" Usage: rebase auth reset-password <email> [new-password]\"));\n console.log(chalk.gray(\" rebase auth reset-password --email user@example.com --password NewPass123!\"));\n process.exit(1);\n }\n\n const projectRoot = requireProjectRoot();\n const backendDir = requireBackendDir(projectRoot);\n const tsxBin = resolveTsx(projectRoot);\n\n if (!tsxBin) {\n console.error(chalk.red(\"✗ Could not find tsx binary.\"));\n process.exit(1);\n }\n\n // Create a temporary script that performs the password reset\n const envFile = findEnvFile(projectRoot);\n const env: Record<string, string> = { ...process.env as Record<string, string> };\n if (envFile) {\n env.DOTENV_CONFIG_PATH = envFile;\n }\n\n const scriptContent = `\nimport { createPostgresDatabaseConnection } from \"@rebasepro/server-core\";\nimport { hashPassword } from \"@rebasepro/server-core/src/auth/password\";\nimport { eq } from \"drizzle-orm\";\nimport { users } from \"@rebasepro/server-core/src/db/auth-schema\";\nimport * as dotenv from \"dotenv\";\nimport path from \"path\";\n\ndotenv.config({ path: \"${envFile || path.join(projectRoot, \".env\")}\" });\n\nconst email = \"${email}\";\nconst newPassword = \"${newPassword || \"NewPassword123!\"}\";\n\nasync function resetPassword() {\n const { db } = createPostgresDatabaseConnection(process.env.DATABASE_URL!);\n const hash = await hashPassword(newPassword);\n\n const result = await db.update(users)\n .set({ passwordHash: hash })\n .where(eq(users.email, email))\n .returning({\n id: users.id,\n email: users.email\n });\n\n if (result.length > 0) {\n console.log(\"✅ Password reset for: \" + result[0].email);\n ${!newPassword ? 'console.log(\" New password: \" + newPassword);' : \"\"}\n } else {\n console.log(\"✗ User not found: \" + email);\n }\n process.exit(0);\n}\n\nresetPassword().catch(console.error);\n`;\n\n const tmpScriptPath = path.join(backendDir, \".tmp-reset-password.ts\");\n fs.writeFileSync(tmpScriptPath, scriptContent, \"utf-8\");\n\n console.log(\"\");\n console.log(chalk.bold(\" 🔑 Rebase Auth — Reset Password\"));\n console.log(\"\");\n console.log(` ${chalk.gray(\"Email:\")} ${email}`);\n if (newPassword) {\n console.log(` ${chalk.gray(\"Password:\")} ${\"*\".repeat(newPassword.length)}`);\n }\n console.log(\"\");\n\n const child = spawn(tsxBin, [tmpScriptPath], {\n cwd: backendDir,\n stdio: \"inherit\",\n env\n });\n\n return new Promise((resolve) => {\n child.on(\"close\", (code) => {\n // Clean up temp script\n try { fs.unlinkSync(tmpScriptPath); } catch { /* ignore */ }\n if (code !== 0) {\n process.exit(code ?? 1);\n }\n resolve();\n });\n });\n}\n\nfunction printAuthHelp() {\n console.log(`\n${chalk.bold(\"rebase auth\")} — Authentication management commands\n\n${chalk.green.bold(\"Usage\")}\n rebase auth ${chalk.blue(\"<command>\")} [options]\n\n${chalk.green.bold(\"Commands\")}\n ${chalk.blue.bold(\"reset-password\")} Reset a user's password\n\n${chalk.green.bold(\"reset-password Options\")}\n ${chalk.blue(\"--email, -e\")} User's email address\n ${chalk.blue(\"--password, -p\")} New password (default: NewPassword123!)\n\n${chalk.green.bold(\"Examples\")}\n rebase auth reset-password user@example.com\n rebase auth reset-password --email user@example.com --password MyNewPass!\n`);\n}\n","/**\n * CLI command: rebase doctor\n *\n * Detects three-way schema drift between collection definitions,\n * the generated Drizzle schema, and the live PostgreSQL database.\n */\nimport chalk from \"chalk\";\nimport execa from \"execa\";\nimport {\n requireProjectRoot,\n requireBackendDir,\n getActiveBackendPlugin,\n resolvePluginCliScript,\n resolveTsx,\n findEnvFile\n} from \"../utils/project\";\n\nexport async function doctorCommand(rawArgs: string[]): Promise<void> {\n const projectRoot = requireProjectRoot();\n const backendDir = requireBackendDir(projectRoot);\n\n const activePlugin = getActiveBackendPlugin(backendDir);\n if (!activePlugin) {\n console.error(chalk.red(\"✗ Could not detect an active database plugin.\"));\n console.error(chalk.gray(\" Make sure a package like @rebasepro/server-postgresql is installed in backend/package.json.\"));\n process.exit(1);\n }\n\n const pluginCli = resolvePluginCliScript(backendDir, activePlugin);\n if (!pluginCli) {\n console.error(chalk.red(`✗ Could not find CLI entry point for ${activePlugin}.`));\n process.exit(1);\n }\n\n // Set up environment with DOTENV_CONFIG_PATH\n const envFile = findEnvFile(projectRoot);\n const env: Record<string, string> = { ...process.env as Record<string, string> };\n if (envFile) {\n env.DOTENV_CONFIG_PATH = envFile;\n }\n\n try {\n const isTs = pluginCli.endsWith(\".ts\");\n if (isTs) {\n const tsxBin = resolveTsx(projectRoot);\n if (!tsxBin) {\n console.error(chalk.red(\"✗ Could not find tsx binary.\"));\n process.exit(1);\n }\n await execa(tsxBin, [pluginCli, ...rawArgs.slice(2)], {\n cwd: backendDir,\n stdio: \"inherit\",\n env\n });\n } else {\n await execa(\"node\", [pluginCli, ...rawArgs.slice(2)], {\n cwd: backendDir,\n stdio: \"inherit\",\n env\n });\n }\n } catch {\n // If the process exits with an error code, execa will throw,\n // but inherit stdio means the user already saw the output.\n process.exit(1);\n }\n}\n","import chalk from \"chalk\";\nimport arg from \"arg\";\nimport { createRebaseApp } from \"./commands/init\";\nimport { generateSdkCommand } from \"./commands/generate_sdk\";\nimport { schemaCommand } from \"./commands/schema\";\nimport { dbCommand } from \"./commands/db\";\nimport { devCommand } from \"./commands/dev\";\nimport { authCommand } from \"./commands/auth\";\nimport { doctorCommand } from \"./commands/doctor\";\nimport fs from \"fs\";\nimport path from \"path\";\nimport { fileURLToPath } from \"url\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\nfunction getVersion(): string {\n try {\n // Try to read version from package.json\n const pkgPath = path.resolve(__dirname, \"../package.json\");\n if (fs.existsSync(pkgPath)) {\n return JSON.parse(fs.readFileSync(pkgPath, \"utf-8\")).version;\n }\n } catch {\n // ignore\n }\n return \"unknown\";\n}\n\nexport async function entry(args: string[]) {\n const parsedArgs = arg(\n {\n \"--version\": Boolean,\n \"--help\": Boolean,\n \"-v\": \"--version\",\n \"-h\": \"--help\"\n },\n {\n argv: args.slice(2),\n permissive: true\n }\n );\n\n if (parsedArgs[\"--version\"]) {\n console.log(getVersion());\n return;\n }\n\n const command = parsedArgs._[0];\n const subcommand = parsedArgs._[1];\n\n // Show global help only when no command given, or --help with no recognized command\n const namespacedCommands = [\"schema\", \"db\", \"dev\", \"auth\", \"doctor\"];\n if (!command || (parsedArgs[\"--help\"] && !namespacedCommands.includes(command))) {\n printHelp();\n return;\n }\n\n // For namespaced commands with --help, pass it through as subcommand\n const effectiveSubcommand = parsedArgs[\"--help\"] ? \"--help\" : subcommand;\n\n switch (command) {\n case \"init\":\n await createRebaseApp(args);\n break;\n\n case \"generate-sdk\": {\n // Legacy command — kept for backward compatibility\n const sdkArgs = arg(\n {\n \"--collections-dir\": String,\n \"--output\": String,\n \"-c\": \"--collections-dir\",\n \"-o\": \"--output\"\n },\n {\n argv: args.slice(3),\n permissive: true\n }\n );\n await generateSdkCommand({\n collectionsDir: sdkArgs[\"--collections-dir\"] || \"./config/collections\",\n output: sdkArgs[\"--output\"] || \"./generated/sdk\",\n cwd: process.cwd()\n });\n break;\n }\n\n case \"schema\":\n await schemaCommand(effectiveSubcommand, args);\n break;\n\n case \"db\":\n await dbCommand(effectiveSubcommand, args);\n break;\n\n case \"dev\":\n await devCommand(args);\n break;\n\n case \"auth\":\n await authCommand(effectiveSubcommand, args);\n break;\n\n case \"doctor\":\n await doctorCommand(args);\n break;\n\n default:\n console.log(chalk.red(`Unknown command: ${command}`));\n console.log(\"\");\n printHelp();\n }\n}\n\nfunction printHelp() {\n console.log(`\n${chalk.bold(\"Rebase CLI\")} — Developer tools for Rebase projects\n\n${chalk.green.bold(\"Usage\")}\n rebase ${chalk.blue(\"<command>\")} [options]\n\n${chalk.green.bold(\"Commands\")}\n ${chalk.blue.bold(\"init\")} Create a new Rebase project\n ${chalk.blue.bold(\"dev\")} Start the development server\n\n${chalk.green.bold(\"Schema\")}\n ${chalk.blue.bold(\"schema generate\")} Generate Drizzle schema from collections\n ${chalk.blue.bold(\"schema\")} ${chalk.gray(\"--help\")} Show schema command help\n\n${chalk.green.bold(\"Database\")}\n ${chalk.blue.bold(\"db push\")} Apply schema directly to database ${chalk.gray(\"(dev)\")}\n ${chalk.blue.bold(\"db pull\")} Introspect database → Drizzle schema\n ${chalk.blue.bold(\"db generate\")} Generate SQL migration files\n ${chalk.blue.bold(\"db migrate\")} Run pending migrations\n ${chalk.blue.bold(\"db studio\")} Open Drizzle Studio\n ${chalk.blue.bold(\"db\")} ${chalk.gray(\"--help\")} Show database command help\n\n${chalk.green.bold(\"SDK\")}\n ${chalk.blue.bold(\"generate-sdk\")} Generate a typed JS SDK from collections\n\n${chalk.green.bold(\"Auth\")}\n ${chalk.blue.bold(\"auth reset-password\")} Reset a user's password\n ${chalk.blue.bold(\"auth\")} ${chalk.gray(\"--help\")} Show auth command help\n\n${chalk.green.bold(\"Diagnostics\")}\n ${chalk.blue.bold(\"doctor\")} Detect schema drift between collections, schema, and DB\n\n${chalk.green.bold(\"Options\")}\n ${chalk.blue(\"--version, -v\")} Show version number\n ${chalk.blue(\"--help, -h\")} Show this help message\n\n${chalk.gray(\"Documentation: https://rebase.pro/docs\")}\n`);\n}\n","/**\n * Authentication helpers for the Rebase CLI.\n *\n * Token storage lives at ~/.rebase/tokens.json (prod) or\n * ~/.rebase/staging.tokens.json (dev).\n */\nimport fs from \"fs\";\nimport path from \"path\";\nimport * as os from \"os\";\n\nconst TOKEN_DIR = path.join(os.homedir(), \".rebase\");\n\nfunction tokenPath(env: \"prod\" | \"dev\"): string {\n return path.join(TOKEN_DIR, (env === \"dev\" ? \"staging.\" : \"\") + \"tokens.json\");\n}\n\n// ─── Token persistence ────────────────────────────────────\n\nfunction saveTokens(tokens: object, env: \"prod\" | \"dev\") {\n if (!fs.existsSync(TOKEN_DIR)) {\n fs.mkdirSync(TOKEN_DIR, { recursive: true });\n }\n fs.writeFileSync(tokenPath(env), JSON.stringify(tokens));\n}\n\n// ─── Public API ───────────────────────────────────────────\n\nexport async function getTokens(env: \"prod\" | \"dev\", _debug?: boolean): Promise<object | null> {\n const fp = tokenPath(env);\n if (!fs.existsSync(fp)) return null;\n try {\n const data = fs.readFileSync(fp, \"utf-8\");\n return JSON.parse(data);\n } catch {\n return null;\n }\n}\n\nexport function parseJwt(token: string): object {\n if (!token) throw new Error(\"No JWT token\");\n const base64Url = token.split(\".\")[1];\n const base64 = base64Url.replace(/-/g, \"+\").replace(/_/g, \"/\");\n const buffer = Buffer.from(base64, \"base64\");\n return JSON.parse(buffer.toString());\n}\n\nexport async function refreshCredentials(\n env: \"dev\" | \"prod\",\n credentials?: object | null,\n _onErr?: (e: unknown) => void\n): Promise<object | null> {\n if (!credentials) return null;\n // If the token hasn't expired, just return it.\n const expiryDate = new Date((credentials as Record<string, unknown>)[\"expiry_date\"] as number);\n if (expiryDate.getTime() > Date.now()) {\n return credentials;\n }\n // Without a server endpoint we can't actually refresh –\n // the caller should handle the null return by re-authenticating.\n return null;\n}\n\nexport async function login(env: \"prod\" | \"dev\", _debug?: boolean): Promise<void> {\n console.log(\n \"Interactive login is not yet implemented in @rebasepro/cli.\\n\" +\n \"Please authenticate via the Rebase dashboard and copy your tokens to \" +\n tokenPath(env)\n );\n}\n\nexport async function logout(env: \"prod\" | \"dev\", _debug?: boolean): Promise<void> {\n const fp = tokenPath(env);\n if (fs.existsSync(fp)) {\n fs.unlinkSync(fp);\n console.log(\"You have been logged out.\");\n } else {\n console.log(\"You are not logged in.\");\n }\n}\n"],"names":["__filename","__dirname","mod","exported"],"mappings":"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"}
1
+ {"version":3,"file":"index.es.js","sources":["../src/commands/init.ts","../src/commands/generate_sdk.ts","../src/utils/project.ts","../src/commands/schema.ts","../src/commands/db.ts","../src/commands/dev.ts","../src/commands/auth.ts","../src/commands/doctor.ts","../src/cli.ts","../src/auth.ts"],"sourcesContent":["import arg from \"arg\";\nimport inquirer from \"inquirer\";\nimport chalk from \"chalk\";\nimport path from \"path\";\nimport fs from \"fs\";\nimport { promisify } from \"util\";\nimport execa from \"execa\";\nimport ncp from \"ncp\";\nimport { fileURLToPath } from \"url\";\nimport crypto from \"crypto\";\n\nconst access = promisify(fs.access);\nconst copy = promisify(ncp);\n\n// Resolve template path relative to this file\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\nfunction findParentDir(currentDir: string, targetName: string): string | null {\n const root = path.parse(currentDir).root;\n while (currentDir && currentDir !== root) {\n if (path.basename(currentDir) === targetName) {\n return currentDir;\n }\n currentDir = path.dirname(currentDir);\n }\n return null;\n}\n\nconst cliRoot = findParentDir(__dirname, \"cli\");\n\nexport interface InitOptions {\n projectName: string;\n git: boolean;\n installDeps: boolean;\n targetDirectory: string;\n templateDirectory: string;\n}\n\nexport async function createRebaseApp(rawArgs: string[]) {\n console.log(`\n${chalk.bold(\"Rebase\")} — Create a new project 🚀\n`);\n\n const options = await promptForOptions(rawArgs);\n await createProject(options);\n}\n\nasync function promptForOptions(rawArgs: string[]): Promise<InitOptions> {\n const args = arg(\n {\n \"--git\": Boolean,\n \"--install\": Boolean,\n \"-g\": \"--git\",\n \"-i\": \"--install\"\n },\n {\n argv: rawArgs.slice(3), // skip \"node\", \"rebase\", \"init\"\n permissive: true\n }\n );\n\n // The first positional arg after \"init\" is the project name\n const nameArg = args._[0];\n\n const questions: Record<string, unknown>[] = [];\n\n if (!nameArg) {\n questions.push({\n type: \"input\",\n name: \"projectName\",\n message: \"Project name:\",\n default: \"my-rebase-app\",\n validate: (input: string) => {\n if (!input.trim()) return \"Project name is required\";\n if (!/^[a-z0-9][a-z0-9._-]*$/.test(input)) {\n return \"Project name must start with a lowercase letter or number and contain only lowercase letters, numbers, hyphens, dots, or underscores\";\n }\n return true;\n }\n });\n }\n\n if (!args[\"--git\"]) {\n questions.push({\n type: \"confirm\",\n name: \"git\",\n message: \"Initialize a git repository?\",\n default: true\n });\n }\n\n if (!args[\"--install\"]) {\n questions.push({\n type: \"confirm\",\n name: \"installDeps\",\n message: \"Install dependencies with pnpm?\",\n default: true\n });\n }\n\n const answers = await inquirer.prompt(questions as unknown as Parameters<typeof inquirer.prompt>[0]);\n\n const projectName = nameArg || answers.projectName;\n const targetDirectory = path.resolve(process.cwd(), projectName);\n const templateDirectory = path.resolve(cliRoot!, \"templates\", \"template\");\n\n return {\n projectName,\n git: args[\"--git\"] || answers.git || false,\n installDeps: args[\"--install\"] || answers.installDeps || false,\n targetDirectory,\n templateDirectory\n };\n}\n\nasync function createProject(options: InitOptions) {\n // Check if directory already exists and is not empty\n if (fs.existsSync(options.targetDirectory)) {\n if (fs.readdirSync(options.targetDirectory).length !== 0) {\n console.error(`${chalk.red.bold(\"ERROR\")} Directory \"${options.projectName}\" already exists and is not empty`);\n process.exit(1);\n }\n } else {\n fs.mkdirSync(options.targetDirectory, { recursive: true });\n }\n\n // Verify template exists\n try {\n await access(options.templateDirectory, fs.constants.R_OK);\n } catch {\n console.error(`${chalk.red.bold(\"ERROR\")} Template not found at ${options.templateDirectory}`);\n process.exit(1);\n }\n\n // Copy template files\n console.log(chalk.gray(\" Copying project files...\"));\n try {\n await copy(options.templateDirectory, options.targetDirectory, {\n clobber: false,\n dot: true,\n filter: (source: string) => {\n const basename = path.basename(source);\n // Skip node_modules and .DS_Store\n return basename !== \"node_modules\" && basename !== \".DS_Store\";\n }\n });\n } catch (err: unknown) {\n console.error(`${chalk.red.bold(\"ERROR\")} Failed to copy template files: ${err instanceof Error ? err.message : String(err)}`);\n process.exit(1);\n }\n\n // Replace placeholder project name in package.json files\n await replacePlaceholders(options);\n\n // Rename .env.template to .env if it exists and randomize secrets\n const envTemplatePath = path.join(options.targetDirectory, \".env.template\");\n const envPath = path.join(options.targetDirectory, \".env\");\n if (fs.existsSync(envTemplatePath) && !fs.existsSync(envPath)) {\n fs.renameSync(envTemplatePath, envPath);\n\n // Generate secure random strings\n const jwtSecret = crypto.randomBytes(32).toString(\"hex\");\n const dbPassword = crypto.randomBytes(16).toString(\"hex\");\n\n let envContent = fs.readFileSync(envPath, \"utf-8\");\n envContent = envContent.replace(\n \"postgresql://rebase:password@localhost:5432/rebase\",\n `postgresql://rebase:${dbPassword}@localhost:5432/rebase`\n );\n envContent = envContent.replace(\n \"change-this-to-a-secure-random-string\",\n jwtSecret\n );\n\n // Append POSTGRES_PASSWORD for docker-compose interpolation\n envContent += `\\n# Docker Compose Database Password\\nPOSTGRES_PASSWORD=${dbPassword}\\n`;\n\n fs.writeFileSync(envPath, envContent, \"utf-8\");\n }\n\n // Initialize git\n if (options.git) {\n console.log(chalk.gray(\" Initializing git repository...\"));\n try {\n await execa(\"git\", [\"init\"], { cwd: options.targetDirectory });\n } catch {\n console.warn(chalk.yellow(\" Warning: Failed to initialize git repository\"));\n }\n }\n\n if (options.installDeps) {\n console.log(\"\");\n console.log(chalk.gray(\" Installing dependencies with pnpm...\"));\n console.log(\"\");\n try {\n await execa(\"pnpm\", [\"install\"], {\n cwd: options.targetDirectory,\n stdio: \"inherit\"\n });\n } catch {\n console.warn(chalk.yellow(\" Warning: Failed to install dependencies. You may need to run `pnpm install` manually.\"));\n }\n }\n\n // Success message\n console.log(\"\");\n console.log(`${chalk.green.bold(\"✓\")} Project ${chalk.bold(options.projectName)} created successfully!`);\n console.log(\"\");\n console.log(chalk.bold(\"Next steps:\"));\n console.log(\"\");\n console.log(` ${chalk.cyan(\"cd\")} ${options.projectName}`);\n if (!options.installDeps) {\n console.log(` ${chalk.cyan(\"pnpm install\")}`);\n }\n console.log(\"\");\n console.log(chalk.gray(\" # Set up your database connection in .env\"));\n console.log(chalk.gray(\" # Then run:\"));\n console.log(\"\");\n console.log(` ${chalk.cyan(\"pnpm dev\")}`);\n console.log(\"\");\n console.log(chalk.gray(\"This starts both the backend (Hono + PostgreSQL)\")\n + chalk.gray(\" and the frontend (Vite + React) concurrently.\"));\n console.log(\"\");\n console.log(chalk.gray(\"Docs: https://rebase.pro/docs\"));\n console.log(chalk.gray(\"GitHub: https://github.com/rebasepro/rebase\"));\n console.log(\"\");\n}\n\nasync function replacePlaceholders(options: InitOptions) {\n const filesToProcess = [\n \"package.json\",\n \"frontend/package.json\",\n \"backend/package.json\",\n \"config/package.json\",\n \"frontend/index.html\"\n ];\n\n for (const file of filesToProcess) {\n const fullPath = path.resolve(options.targetDirectory, file);\n if (!fs.existsSync(fullPath)) continue;\n\n let content = fs.readFileSync(fullPath, \"utf-8\");\n content = content.replace(/\\{\\{PROJECT_NAME\\}\\}/g, options.projectName);\n fs.writeFileSync(fullPath, content, \"utf-8\");\n }\n}\n","/**\n * CLI command: generate-sdk\n *\n * Reads collection definitions from a specified directory (default: ./config/collections),\n * generates a typed JS SDK, and writes it to the output directory (default: ./generated/sdk).\n *\n * Uses jiti for dynamic TypeScript import of collection files.\n */\n\nimport fs from \"fs\";\nimport path from \"path\";\nimport chalk from \"chalk\";\nimport { EntityCollection } from \"@rebasepro/types\";\nimport { generateSDK, GeneratedFile } from \"@rebasepro/sdk-generator\";\n\ninterface GenerateSDKArgs {\n collectionsDir: string;\n output: string;\n cwd: string;\n}\n\n/**\n * Dynamically load collection definitions from a directory.\n *\n * Expects the directory to have an index.ts/index.js that exports a default\n * array of EntityCollection objects (matching the app/config/collections pattern).\n */\nasync function loadCollections(collectionsDir: string): Promise<EntityCollection[]> {\n const absDir = path.resolve(collectionsDir);\n\n if (!fs.existsSync(absDir)) {\n throw new Error(`Collections directory not found: ${absDir}`);\n }\n\n // Try to import the index file using jiti (supports TypeScript natively)\n let jiti: (id: string, userOptions?: Record<string, unknown>) => (modulePath: string) => Record<string, unknown>;\n try {\n const jitiModule = await import(\"jiti\");\n jiti = (jitiModule.default || jitiModule) as unknown as typeof jiti;\n } catch {\n throw new Error(\n \"Could not load 'jiti'. Install it with: pnpm add -D jiti\\n\" +\n \"jiti is required to dynamically import TypeScript collection definitions.\"\n );\n }\n\n const jitiInstance = jiti(absDir, {\n interopDefault: true,\n esmResolve: true\n });\n\n // Look for index file\n const indexCandidates = [\"index.ts\", \"index.js\", \"index.mjs\"];\n let indexPath: string | null = null;\n\n for (const candidate of indexCandidates) {\n const p = path.join(absDir, candidate);\n if (fs.existsSync(p)) {\n indexPath = p;\n break;\n }\n }\n\n if (!indexPath) {\n // Fallback: load each .ts/.js file individually\n console.log(chalk.yellow(\" No index file found, scanning individual collection files...\"));\n const collections: EntityCollection[] = [];\n const files = fs.readdirSync(absDir).filter(f =>\n (f.endsWith(\".ts\") || f.endsWith(\".js\")) && !f.startsWith(\".\")\n );\n\n for (const file of files) {\n try {\n const mod = jitiInstance(path.join(absDir, file));\n const exported = mod.default || mod;\n if (exported && typeof exported === \"object\" && \"slug\" in exported) {\n collections.push(exported as EntityCollection);\n } else if (Array.isArray(exported)) {\n collections.push(...exported);\n }\n } catch (err) {\n console.warn(chalk.yellow(` ⚠ Skipping ${file}: ${(err as Error).message}`));\n }\n }\n\n return collections;\n }\n\n // Import the index\n const mod = jitiInstance(indexPath);\n const exported = mod.default || mod;\n\n if (Array.isArray(exported)) {\n return exported as EntityCollection[];\n } else if (typeof exported === \"object\" && exported !== null) {\n // Could be a named export like { collections: [...] }\n if (\"collections\" in exported && Array.isArray(exported.collections)) {\n return exported.collections;\n }\n // Or individual named exports\n const collections: EntityCollection[] = [];\n for (const value of Object.values(exported)) {\n if (value && typeof value === \"object\" && \"slug\" in (value as EntityCollection)) {\n collections.push(value as EntityCollection);\n }\n }\n if (collections.length > 0) return collections;\n }\n\n throw new Error(\n `Could not extract collections from ${indexPath}.\\n` +\n \"Expected a default export of EntityCollection[] or an object with named collection exports.\"\n );\n}\n\n/**\n * Write generated files to the output directory.\n */\nfunction writeFiles(outputDir: string, files: GeneratedFile[]): void {\n const absOutput = path.resolve(outputDir);\n\n // Create output directory\n fs.mkdirSync(absOutput, { recursive: true });\n\n for (const file of files) {\n const filePath = path.join(absOutput, file.path);\n const dir = path.dirname(filePath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n fs.writeFileSync(filePath, file.content, \"utf-8\");\n }\n}\n\n/**\n * Main entry point for the generate-sdk command.\n */\nexport async function generateSdkCommand(args: GenerateSDKArgs): Promise<void> {\n const { collectionsDir, output, cwd } = args;\n\n const resolvedCollectionsDir = path.isAbsolute(collectionsDir)\n ? collectionsDir\n : path.join(cwd, collectionsDir);\n\n const resolvedOutput = path.isAbsolute(output)\n ? output\n : path.join(cwd, output);\n\n console.log(\"\");\n console.log(chalk.bold(\" 🔧 Rebase SDK Generator\"));\n console.log(\"\");\n console.log(` ${chalk.gray(\"Collections:\")} ${resolvedCollectionsDir}`);\n console.log(` ${chalk.gray(\"Output:\")} ${resolvedOutput}`);\n console.log(\"\");\n\n // 1. Load collections\n console.log(chalk.cyan(\" → Loading collection definitions...\"));\n const collections = await loadCollections(resolvedCollectionsDir);\n\n if (collections.length === 0) {\n console.log(chalk.red(\" ✗ No collections found. Nothing to generate.\"));\n process.exit(1);\n }\n\n console.log(chalk.green(` ✓ Found ${collections.length} collection(s): ${collections.map(c => c.slug).join(\", \")}`));\n console.log(\"\");\n\n // 2. Generate SDK files\n console.log(chalk.cyan(\" → Generating SDK files...\"));\n const files = generateSDK(collections);\n console.log(chalk.green(` ✓ Generated ${files.length} file(s)`));\n\n // 3. Write to disk\n console.log(chalk.cyan(` → Writing to ${resolvedOutput}...`));\n writeFiles(resolvedOutput, files);\n\n console.log(\"\");\n console.log(chalk.green.bold(\" ✓ SDK generated successfully!\"));\n console.log(\"\");\n console.log(chalk.gray(\" Usage:\"));\n console.log(chalk.gray(\" import { createRebaseClient } from '@rebasepro/client';\"));\n console.log(chalk.gray(` import type { Database } from './${path.relative(cwd, path.join(resolvedOutput, \"database.types\"))}';`));\n console.log(\"\");\n console.log(chalk.gray(\" const rebase = createRebaseClient<Database>({\"));\n console.log(chalk.gray(\" baseUrl: 'http://localhost:3001',\"));\n console.log(chalk.gray(\" // token: 'your-jwt-token',\"));\n console.log(chalk.gray(\" });\"));\n console.log(\"\");\n console.log(chalk.gray(` const { data } = await rebase.collection('${collections[0]?.slug || \"my_collection\"}').find();`));\n console.log(\"\");\n}\n","/**\n * Project discovery utilities for the Rebase CLI.\n *\n * These helpers locate the project root, backend directory, .env file,\n * and local binaries — used by all CLI command modules.\n */\nimport fs from \"fs\";\nimport path from \"path\";\nimport { execSync } from \"child_process\";\nimport chalk from \"chalk\";\n\n/**\n * Walk up from `startDir` to find the Rebase project root.\n *\n * The root is identified by a `package.json` that either:\n * - has `workspaces` containing \"backend\" or \"frontend\", OR\n * - has a sibling `backend/` directory\n */\nexport function findProjectRoot(startDir: string = process.cwd()): string | null {\n let dir = path.resolve(startDir);\n const root = path.parse(dir).root;\n\n while (dir !== root) {\n const pkgPath = path.join(dir, \"package.json\");\n\n if (fs.existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, \"utf-8\"));\n // Check for workspace-based project (monorepo root)\n if (pkg.workspaces && Array.isArray(pkg.workspaces)) {\n const hasBackend = pkg.workspaces.some((w: string) =>\n w === \"backend\" || w.includes(\"backend\")\n );\n if (hasBackend) return dir;\n }\n } catch {\n // ignore parse errors\n }\n\n // Check for sibling backend directory\n if (fs.existsSync(path.join(dir, \"backend\")) && fs.existsSync(path.join(dir, \"config\"))) {\n return dir;\n }\n }\n\n dir = path.dirname(dir);\n }\n\n return null;\n}\n\n/**\n * Locate the backend directory within the project root.\n */\nexport function findBackendDir(projectRoot: string): string | null {\n const backendDir = path.join(projectRoot, \"backend\");\n return fs.existsSync(backendDir) ? backendDir : null;\n}\n\n/**\n * Detect the active backend plugin (e.g. @rebasepro/server-postgresql) from the backend's package.json.\n */\nexport function getActiveBackendPlugin(backendDir: string): string | null {\n const pkgPath = path.join(backendDir, \"package.json\");\n if (!fs.existsSync(pkgPath)) return null;\n\n try {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, \"utf-8\"));\n const deps = { ...pkg.dependencies,\n...pkg.devDependencies };\n\n // Find the first dependency that matches @rebasepro/server-* (database driver plugins),\n // but not @rebasepro/server-core which is the framework itself\n for (const dep of Object.keys(deps)) {\n if (dep.startsWith(\"@rebasepro/server-\") && dep !== \"@rebasepro/server-core\") {\n return dep;\n }\n }\n } catch {\n // Ignore parse errors\n }\n return null;\n}\n\n/**\n * Resolve the active plugin's CLI script.\n */\nexport function resolvePluginCliScript(backendDir: string, pluginName: string): string | null {\n const candidates = [\n path.join(backendDir, \"node_modules\", pluginName, \"src\", \"cli.ts\"),\n path.join(backendDir, \"node_modules\", pluginName, \"dist\", \"cli.js\"),\n // For monorepo dev mode:\n path.resolve(backendDir, \"..\", \"..\", \"packages\", pluginName.replace(\"@rebasepro/\", \"\"), \"src\", \"cli.ts\"),\n path.resolve(backendDir, \"..\", \"packages\", pluginName.replace(\"@rebasepro/\", \"\"), \"src\", \"cli.ts\")\n ];\n\n for (const candidate of candidates) {\n if (fs.existsSync(candidate)) return candidate;\n }\n return null;\n}\n\n/**\n * Locate the frontend directory within the project root.\n */\nexport function findFrontendDir(projectRoot: string): string | null {\n const frontendDir = path.join(projectRoot, \"frontend\");\n return fs.existsSync(frontendDir) ? frontendDir : null;\n}\n\n/**\n * Find the .env file. Checks the project root first, then backend.\n */\nexport function findEnvFile(projectRoot: string): string | null {\n const candidates = [\n path.join(projectRoot, \".env\"),\n path.join(projectRoot, \"backend\", \".env\")\n ];\n\n for (const candidate of candidates) {\n if (fs.existsSync(candidate)) return candidate;\n }\n\n return null;\n}\n\n/**\n * Resolve a binary from the project's node_modules/.bin.\n * Checks backend, root, parent monorepo root, then falls back to PATH.\n */\nexport function resolveLocalBin(projectRoot: string, binName: string): string | null {\n const candidates = [\n path.join(projectRoot, \"backend\", \"node_modules\", \".bin\", binName),\n path.join(projectRoot, \"node_modules\", \".bin\", binName)\n ];\n\n // Also check parent directories (for monorepo setups where app/ is nested)\n let parent = path.dirname(projectRoot);\n const rootDir = path.parse(parent).root;\n while (parent !== rootDir) {\n candidates.push(path.join(parent, \"node_modules\", \".bin\", binName));\n parent = path.dirname(parent);\n }\n\n for (const candidate of candidates) {\n if (fs.existsSync(candidate)) return candidate;\n }\n\n // Fall back to globally installed binary via which\n try {\n const globalPath = execSync(`which ${binName}`, { encoding: \"utf-8\" }).trim();\n if (globalPath && fs.existsSync(globalPath)) return globalPath;\n } catch {\n // not found globally\n }\n\n return null;\n}\n\n/**\n * Resolve the tsx binary. Checks backend node_modules first, then root.\n */\nexport function resolveTsx(projectRoot: string): string | null {\n return resolveLocalBin(projectRoot, \"tsx\");\n}\n\n/**\n * Require the project root or exit with a helpful error.\n */\nexport function requireProjectRoot(): string {\n const root = findProjectRoot();\n if (!root) {\n console.error(chalk.red(\"✗ Could not find a Rebase project root.\"));\n console.error(chalk.gray(\" Make sure you are inside a Rebase project directory\"));\n console.error(chalk.gray(\" (one with backend/, frontend/, and shared/ directories).\"));\n process.exit(1);\n }\n return root;\n}\n\n/**\n * Require the backend directory or exit with a helpful error.\n */\nexport function requireBackendDir(projectRoot: string): string {\n const backendDir = findBackendDir(projectRoot);\n if (!backendDir) {\n console.error(chalk.red(\"✗ Could not find a backend/ directory.\"));\n console.error(chalk.gray(` Expected at: ${path.join(projectRoot, \"backend\")}`));\n process.exit(1);\n }\n return backendDir;\n}\n","/**\n * CLI command: rebase schema <action>\n */\nimport chalk from \"chalk\";\nimport execa from \"execa\";\nimport {\n requireProjectRoot,\n requireBackendDir,\n getActiveBackendPlugin,\n resolvePluginCliScript,\n resolveTsx,\n findEnvFile\n} from \"../utils/project\";\n\nexport async function schemaCommand(subcommand: string | undefined, rawArgs: string[]): Promise<void> {\n if (!subcommand || subcommand === \"--help\") {\n printSchemaHelp();\n return;\n }\n\n const projectRoot = requireProjectRoot();\n const backendDir = requireBackendDir(projectRoot);\n\n const activePlugin = getActiveBackendPlugin(backendDir);\n if (!activePlugin) {\n console.error(chalk.red(\"✗ Could not detect an active database plugin.\"));\n console.error(chalk.gray(\" Make sure a package like @rebasepro/server-postgresql is installed in backend/package.json.\"));\n process.exit(1);\n }\n\n const pluginCli = resolvePluginCliScript(backendDir, activePlugin);\n if (!pluginCli) {\n console.error(chalk.red(`✗ Could not find CLI entry point for ${activePlugin}.`));\n process.exit(1);\n }\n\n // Set up environment with DOTENV_CONFIG_PATH\n const envFile = findEnvFile(projectRoot);\n const env: Record<string, string> = { ...process.env as Record<string, string> };\n if (envFile) {\n env.DOTENV_CONFIG_PATH = envFile;\n }\n\n try {\n const isTs = pluginCli.endsWith(\".ts\");\n if (isTs) {\n const tsxBin = resolveTsx(projectRoot);\n if (!tsxBin) {\n console.error(chalk.red(\"✗ Could not find tsx binary.\"));\n process.exit(1);\n }\n await execa(tsxBin, [pluginCli, ...rawArgs.slice(2)], {\n cwd: backendDir,\n stdio: \"inherit\",\n env\n });\n } else {\n await execa(\"node\", [pluginCli, ...rawArgs.slice(2)], {\n cwd: backendDir,\n stdio: \"inherit\",\n env\n });\n }\n } catch (err: unknown) {\n process.exit(1);\n }\n}\n\nfunction printSchemaHelp() {\n console.log(`\n${chalk.bold(\"rebase schema\")} — Schema management commands\n\n${chalk.green.bold(\"Usage\")}\n rebase schema ${chalk.blue(\"<command>\")} [options]\n\n${chalk.green.bold(\"Commands\")}\n ${chalk.gray(\"(Commands are provided by your active database driver plugin)\")}\n ${chalk.blue.bold(\"generate\")} Generate Schema from collection definitions\n\n${chalk.green.bold(\"generate Options\")}\n ${chalk.blue(\"--collections, -c\")} Path to collections directory\n ${chalk.blue(\"--output, -o\")} Output path for generated schema\n ${chalk.blue(\"--watch, -w\")} Watch for changes and regenerate automatically\n`);\n}\n","/**\n * CLI command: rebase db <action>\n */\nimport chalk from \"chalk\";\nimport execa from \"execa\";\nimport {\n requireProjectRoot,\n requireBackendDir,\n getActiveBackendPlugin,\n resolvePluginCliScript,\n resolveTsx,\n findEnvFile\n} from \"../utils/project\";\n\nexport async function dbCommand(subcommand: string | undefined, rawArgs: string[]): Promise<void> {\n if (!subcommand || subcommand === \"--help\") {\n printDbHelp();\n return;\n }\n\n const projectRoot = requireProjectRoot();\n const backendDir = requireBackendDir(projectRoot);\n\n const activePlugin = getActiveBackendPlugin(backendDir);\n if (!activePlugin) {\n console.error(chalk.red(\"✗ Could not detect an active database plugin.\"));\n console.error(chalk.gray(\" Make sure a package like @rebasepro/server-postgresql is installed in backend/package.json.\"));\n process.exit(1);\n }\n\n const pluginCli = resolvePluginCliScript(backendDir, activePlugin);\n if (!pluginCli) {\n console.error(chalk.red(`✗ Could not find CLI entry point for ${activePlugin}.`));\n process.exit(1);\n }\n\n // Set up environment with DOTENV_CONFIG_PATH\n const envFile = findEnvFile(projectRoot);\n const env: Record<string, string> = { ...process.env as Record<string, string> };\n if (envFile) {\n env.DOTENV_CONFIG_PATH = envFile;\n }\n\n try {\n const isTs = pluginCli.endsWith(\".ts\");\n if (isTs) {\n const tsxBin = resolveTsx(projectRoot);\n if (!tsxBin) {\n console.error(chalk.red(\"✗ Could not find tsx binary.\"));\n process.exit(1);\n }\n await execa(tsxBin, [pluginCli, ...rawArgs.slice(2)], {\n cwd: backendDir,\n stdio: \"inherit\",\n env\n });\n } else {\n await execa(\"node\", [pluginCli, ...rawArgs.slice(2)], {\n cwd: backendDir,\n stdio: \"inherit\",\n env\n });\n }\n } catch (err: unknown) {\n // If the process exits with an error code, execa will throw,\n // but inherit stdio means the user already saw the output.\n process.exit(1);\n }\n}\n\nfunction printDbHelp() {\n console.log(`\n${chalk.bold(\"rebase db\")} — Database management commands\n\n${chalk.green.bold(\"Usage\")}\n rebase db ${chalk.blue(\"<command>\")} [options]\n\n${chalk.green.bold(\"Commands\")}\n ${chalk.gray(\"(Commands are provided by your active database driver plugin)\")}\n ${chalk.blue.bold(\"push\")} Apply schema directly to database (development)\n ${chalk.blue.bold(\"pull\")} Introspect database → Schema\n ${chalk.blue.bold(\"generate\")} Generate migration files\n ${chalk.blue.bold(\"migrate\")} Run pending migrations\n ${chalk.blue.bold(\"studio\")} Open Studio viewer\n ${chalk.blue.bold(\"branch\")} Database branching (create, list, delete, info)\n\n${chalk.green.bold(\"Examples\")}\n ${chalk.gray(\"# Quick development workflow\")}\n rebase schema generate && rebase db push\n\n ${chalk.gray(\"# Production migration workflow\")}\n rebase db generate\n rebase db migrate\n\n ${chalk.gray(\"# Create a database branch\")}\n rebase db branch create feature_auth\n`);\n}\n","/**\n * CLI command: rebase dev\n *\n * Starts the full development environment:\n * - Backend: tsx watch with auto-reload\n * - Frontend: vite dev server\n *\n * Both processes stream output with color-coded prefixes.\n *\n * When the backend uses port-retry (i.e. the configured port is busy and it\n * binds to the next free one), the CLI detects the actual port from stdout\n * and injects VITE_API_URL into the frontend so it connects automatically.\n *\n * Each project gets a deterministic default port derived from the project\n * root path, so multiple Rebase instances never collide.\n */\nimport arg from \"arg\";\nimport chalk from \"chalk\";\nimport execa, { ExecaChildProcess } from \"execa\";\nimport path from \"path\";\nimport fs from \"fs\";\nimport {\n requireProjectRoot,\n findBackendDir,\n findFrontendDir,\n findEnvFile,\n resolveTsx\n} from \"../utils/project\";\n\n/** Well-known filename the backend writes its actual port to. */\nconst DEV_PORT_FILENAME = \".rebase-dev-port\";\n\n/**\n * Compute a deterministic port from the project root path.\n * Range: 3001–3999 (avoids privileged ports and common services).\n * Two different project directories will almost always get different ports.\n */\nfunction getProjectPort(projectRoot: string): number {\n let hash = 0;\n for (let i = 0; i < projectRoot.length; i++) {\n hash = ((hash << 5) - hash + projectRoot.charCodeAt(i)) | 0;\n }\n return 3001 + (Math.abs(hash) % 999);\n}\n\n/**\n * Resolve the best starting port for this project:\n * 1. Explicit --port flag (highest priority)\n * 2. PORT env var\n * 3. Previously used port from .rebase-dev-port (port affinity across restarts)\n * 4. Deterministic hash from project path (unique per project)\n */\nfunction resolveStartPort(projectRoot: string, explicitPort?: number): number {\n // 1. Explicit flag\n if (explicitPort) return explicitPort;\n\n // 2. PORT env var\n if (process.env.PORT) return parseInt(process.env.PORT, 10);\n\n // 3. Port affinity — check if we wrote a port file from a previous run\n try {\n const portFile = path.join(projectRoot, DEV_PORT_FILENAME);\n if (fs.existsSync(portFile)) {\n const saved = parseInt(fs.readFileSync(portFile, \"utf-8\").trim(), 10);\n if (saved > 0 && saved < 65536) return saved;\n }\n } catch { /* ignore */ }\n\n // 4. Deterministic hash\n return getProjectPort(projectRoot);\n}\n\nexport async function devCommand(rawArgs: string[]): Promise<void> {\n const args = arg(\n {\n \"--backend-only\": Boolean,\n \"--frontend-only\": Boolean,\n \"--port\": Number,\n \"--help\": Boolean,\n \"-b\": \"--backend-only\",\n \"-f\": \"--frontend-only\",\n \"-p\": \"--port\",\n \"-h\": \"--help\"\n },\n {\n argv: rawArgs.slice(3), // skip \"node rebase dev\"\n permissive: true\n }\n );\n\n if (args[\"--help\"]) {\n printDevHelp();\n return;\n }\n\n const projectRoot = requireProjectRoot();\n const backendDir = findBackendDir(projectRoot);\n const frontendDir = findFrontendDir(projectRoot);\n const backendOnly = args[\"--backend-only\"] || false;\n const frontendOnly = args[\"--frontend-only\"] || false;\n\n // Resolve the port ONCE, before starting anything\n const startPort = resolveStartPort(projectRoot, args[\"--port\"]);\n\n console.log(\"\");\n console.log(chalk.bold(\" 🚀 Rebase Dev Server\"));\n console.log(\"\");\n\n const children: ExecaChildProcess[] = [];\n\n // --- State for printing the banner ---\n let frontendUrl = \"\";\n let backendUrl = \"\";\n let debounceSummary: NodeJS.Timeout | null = null;\n let bannerPrinted = false;\n\n /** Actual backend port, resolved once the server prints its URL. */\n let resolvedBackendPort: number | null = null;\n\n // Use regex to strip ANSI codes before matching\n // eslint-disable-next-line no-control-regex\n const stripAnsi = (str: string) => str.replace(/[\\u001b\\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g, \"\");\n\n function printSummary() {\n if (!frontendUrl || !backendUrl) return;\n if (debounceSummary) clearTimeout(debounceSummary);\n debounceSummary = setTimeout(() => {\n if (bannerPrinted) return;\n console.log(\"\");\n console.log(chalk.cyan(\"┌────────────────────────────────────────────────────────────┐\"));\n console.log(chalk.cyan(\"│ │\"));\n console.log(chalk.cyan(\"│ ✨ Rebase Admin App is ready! │\"));\n const cleanUrl = stripAnsi(frontendUrl);\n const paddedUrl = cleanUrl.padEnd(40);\n console.log(chalk.cyan(\"│ 👉 Frontend URL: \") + chalk.white(paddedUrl) + chalk.cyan(\"│\"));\n console.log(chalk.cyan(\"│ │\"));\n console.log(chalk.cyan(\"└────────────────────────────────────────────────────────────┘\"));\n console.log(\"\");\n bannerPrinted = true;\n }, 500);\n }\n\n // Handle graceful shutdown\n const cleanup = () => {\n // Clean up dev port file\n try {\n const portFile = path.join(projectRoot, DEV_PORT_FILENAME);\n if (fs.existsSync(portFile)) fs.unlinkSync(portFile);\n\n const urlFile = path.join(projectRoot, \".rebase-dev-url\");\n if (fs.existsSync(urlFile)) fs.unlinkSync(urlFile);\n } catch { /* ignore */ }\n\n children.forEach((child) => {\n if (child.pid && !child.killed) {\n try {\n if (process.platform === \"win32\") {\n execa.commandSync(`taskkill /pid ${child.pid} /T /F`);\n } else {\n process.kill(-child.pid, \"SIGKILL\");\n }\n } catch (e) {\n try {\n child.kill(\"SIGKILL\");\n } catch (err) {\n // ignore\n }\n }\n }\n });\n process.exit(0);\n };\n process.on(\"SIGINT\", cleanup);\n process.on(\"SIGTERM\", cleanup);\n\n /**\n * Start the Vite frontend, optionally injecting the backend port.\n */\n function startFrontend(backendPort: number | null) {\n if (!frontendDir) return;\n\n console.log(` ${chalk.magenta(\"▶\")} Frontend: ${chalk.gray(frontendDir)}`);\n\n const frontendEnv: Record<string, string> = { ...process.env as Record<string, string> };\n\n // Inject the resolved backend URL so Vite picks it up\n if (backendPort) {\n frontendEnv.VITE_API_URL = `http://localhost:${backendPort}`;\n console.log(` ${chalk.gray(\"↳ VITE_API_URL\")} = ${chalk.white(`http://localhost:${backendPort}`)}`);\n }\n\n const frontendChild = execa(\n \"pnpm\",\n [\"run\", \"dev\"],\n {\n cwd: frontendDir,\n stdio: [\"inherit\", \"pipe\", \"pipe\"],\n env: frontendEnv,\n shell: true,\n detached: process.platform !== \"win32\"\n }\n );\n frontendChild.catch(() => {}); // prevent unhandled promise rejection on exit\n\n frontendChild.stdout?.on(\"data\", (data: Buffer) => {\n const lines = data.toString().split(\"\\n\").filter(Boolean);\n lines.forEach((line: string) => {\n console.log(`${chalk.magenta.bold(\"[admin]\")} ${line}`);\n const cleanLine = stripAnsi(line);\n const urlMatch = cleanLine.match(/(http:\\/\\/(?:localhost|127\\.0\\.0\\.1):\\d+)/);\n if (cleanLine.includes(\"Local:\") && urlMatch) {\n frontendUrl = urlMatch[1];\n printSummary();\n }\n });\n });\n\n frontendChild.stderr?.on(\"data\", (data: Buffer) => {\n const lines = data.toString().split(\"\\n\").filter(Boolean);\n lines.forEach((line: string) => {\n console.log(`${chalk.magenta.bold(\"[admin]\")} ${line}`);\n });\n });\n\n children.push(frontendChild);\n }\n\n // Start backend\n if (!frontendOnly && backendDir) {\n const tsxBin = resolveTsx(projectRoot);\n if (!tsxBin) {\n console.error(chalk.red(\" ✗ Could not find tsx binary for backend.\"));\n console.error(chalk.gray(\" Install it with: pnpm add -D tsx\"));\n process.exit(1);\n }\n\n const envFile = findEnvFile(projectRoot);\n const env: Record<string, string> = { ...process.env as Record<string, string> };\n if (envFile) {\n env.DOTENV_CONFIG_PATH = envFile;\n }\n\n // Always inject PORT so the backend uses our resolved port instead of\n // its hardcoded default (3001). This prevents cross-project collisions\n // when multiple Rebase instances run simultaneously.\n env.PORT = String(startPort);\n\n console.log(` ${chalk.cyan(\"▶\")} Backend: ${chalk.gray(backendDir)}`);\n console.log(` ${chalk.gray(\"↳ PORT\")} = ${chalk.white(String(startPort))}`);\n\n /** Whether the frontend has been launched (we only launch it once). */\n let frontendLaunched = false;\n\n const backendChild = execa(\n tsxBin,\n [\"watch\", `--watch=\"${path.join(\"..\", \"config\", \"**\", \"*\")}\"`, \"--conditions\", \"development\", \"src/index.ts\"],\n {\n cwd: backendDir,\n stdio: [\"inherit\", \"pipe\", \"pipe\"],\n env,\n shell: true,\n detached: process.platform !== \"win32\"\n }\n );\n backendChild.catch(() => {}); // prevent unhandled promise rejection on exit\n\n backendChild.stdout?.on(\"data\", (data: Buffer) => {\n const lines = data.toString().split(\"\\n\").filter(Boolean);\n lines.forEach((line: string) => {\n console.log(`${chalk.cyan.bold(\"[backend]\")} ${line}`);\n const cleanLine = stripAnsi(line);\n const serverMatch = cleanLine.match(/Server running at http:\\/\\/(?:localhost|127\\.0\\.0\\.1):(\\d+)/);\n if (serverMatch) {\n resolvedBackendPort = parseInt(serverMatch[1], 10);\n backendUrl = \"started\";\n printSummary();\n\n // Save the url to a temp file for scripts to pick up\n const urlFile = path.join(projectRoot, \".rebase-dev-url\");\n fs.writeFileSync(urlFile, `http://localhost:${resolvedBackendPort}`, \"utf-8\");\n\n // Save the port to .rebase-dev-port for port affinity\n const portFile = path.join(projectRoot, DEV_PORT_FILENAME);\n fs.writeFileSync(portFile, String(resolvedBackendPort), \"utf-8\");\n\n // Start frontend now that we know the real port\n if (!backendOnly && frontendDir && !frontendLaunched) {\n frontendLaunched = true;\n startFrontend(resolvedBackendPort);\n }\n }\n });\n });\n\n backendChild.stderr?.on(\"data\", (data: Buffer) => {\n const lines = data.toString().split(\"\\n\").filter(Boolean);\n lines.forEach((line: string) => {\n console.log(`${chalk.cyan.bold(\"[backend]\")} ${line}`);\n });\n });\n\n children.push(backendChild);\n } else if (!frontendOnly && !backendDir) {\n console.warn(chalk.yellow(\" ⚠ No backend/ directory found, skipping backend.\"));\n }\n\n // Start frontend immediately if backend-only mode or no backend\n if (!backendOnly && frontendDir && (frontendOnly || !backendDir)) {\n startFrontend(null);\n } else if (!backendOnly && !frontendDir) {\n console.warn(chalk.yellow(\" ⚠ No frontend/ directory found, skipping frontend.\"));\n }\n\n if (children.length === 0) {\n console.error(chalk.red(\" ✗ Nothing to start. Check your project structure.\"));\n process.exit(1);\n }\n\n console.log(\"\");\n console.log(chalk.gray(\" Press Ctrl+C to stop all servers.\"));\n console.log(\"\");\n\n // Wait for all children to exit\n await Promise.all(\n children.map(\n (child) =>\n new Promise<void>((resolve) => {\n child.finally(() => resolve());\n })\n )\n );\n}\n\nfunction printDevHelp() {\n console.log(`\n${chalk.bold(\"rebase dev\")} — Start the development server\n\n${chalk.green.bold(\"Usage\")}\n rebase dev [options]\n\n${chalk.green.bold(\"Options\")}\n ${chalk.blue(\"--backend-only, -b\")} Only start the backend server\n ${chalk.blue(\"--frontend-only, -f\")} Only start the frontend server\n ${chalk.blue(\"--port, -p\")} Backend port (default: auto-detected per project)\n\n${chalk.green.bold(\"Description\")}\n Starts both the backend (tsx watch + Hono) and frontend (Vite)\n dev servers concurrently with color-coded output prefixes.\n\n Each project automatically receives a unique default port derived\n from its directory path, preventing collisions when running multiple\n Rebase instances simultaneously.\n\n If the assigned port is already in use, the server will automatically\n try the next available port. The frontend is started only after the\n backend is ready, and VITE_API_URL is injected automatically.\n`);\n}\n","/**\n * CLI command: rebase auth <action>\n *\n * Subcommands:\n * reset-password — Reset a user's password\n */\nimport arg from \"arg\";\nimport chalk from \"chalk\";\nimport path from \"path\";\nimport fs from \"fs\";\nimport { spawn } from \"child_process\";\nimport {\n requireProjectRoot,\n requireBackendDir,\n findEnvFile,\n resolveTsx\n} from \"../utils/project\";\n\nexport async function authCommand(subcommand: string | undefined, rawArgs: string[]): Promise<void> {\n if (!subcommand || subcommand === \"--help\") {\n printAuthHelp();\n return;\n }\n\n switch (subcommand) {\n case \"reset-password\":\n await resetPassword(rawArgs);\n break;\n default:\n console.error(chalk.red(`Unknown auth command: ${subcommand}`));\n console.log(\"\");\n printAuthHelp();\n process.exit(1);\n }\n}\n\nasync function resetPassword(rawArgs: string[]): Promise<void> {\n const args = arg(\n {\n \"--email\": String,\n \"--password\": String,\n \"-e\": \"--email\",\n \"-p\": \"--password\"\n },\n {\n argv: rawArgs.slice(4), // skip \"node rebase auth reset-password\"\n permissive: true\n }\n );\n\n // Support both --email flag and positional args\n const email = args[\"--email\"] || args._[0];\n const newPassword = args[\"--password\"] || args._[1];\n\n if (!email) {\n console.error(chalk.red(\"✗ Email is required.\"));\n console.log(\"\");\n console.log(chalk.gray(\" Usage: rebase auth reset-password <email> [new-password]\"));\n console.log(chalk.gray(\" rebase auth reset-password --email user@example.com --password NewPass123!\"));\n process.exit(1);\n }\n\n const projectRoot = requireProjectRoot();\n const backendDir = requireBackendDir(projectRoot);\n const tsxBin = resolveTsx(projectRoot);\n\n if (!tsxBin) {\n console.error(chalk.red(\"✗ Could not find tsx binary.\"));\n process.exit(1);\n }\n\n // Create a temporary script that performs the password reset\n const envFile = findEnvFile(projectRoot);\n const env: Record<string, string> = { ...process.env as Record<string, string> };\n if (envFile) {\n env.DOTENV_CONFIG_PATH = envFile;\n }\n\n const scriptContent = `\nimport { createPostgresDatabaseConnection } from \"@rebasepro/server-core\";\nimport { hashPassword } from \"@rebasepro/server-core/src/auth/password\";\nimport { eq } from \"drizzle-orm\";\nimport { users } from \"@rebasepro/server-core/src/db/auth-schema\";\nimport * as dotenv from \"dotenv\";\nimport path from \"path\";\n\ndotenv.config({ path: \"${envFile || path.join(projectRoot, \".env\")}\" });\n\nconst email = \"${email}\";\nconst newPassword = \"${newPassword || \"NewPassword123!\"}\";\n\nasync function resetPassword() {\n const { db } = createPostgresDatabaseConnection(process.env.DATABASE_URL!);\n const hash = await hashPassword(newPassword);\n\n const result = await db.update(users)\n .set({ passwordHash: hash })\n .where(eq(users.email, email))\n .returning({\n id: users.id,\n email: users.email\n });\n\n if (result.length > 0) {\n console.log(\"✅ Password reset for: \" + result[0].email);\n ${!newPassword ? 'console.log(\" New password: \" + newPassword);' : \"\"}\n } else {\n console.log(\"✗ User not found: \" + email);\n }\n process.exit(0);\n}\n\nresetPassword().catch(console.error);\n`;\n\n const tmpScriptPath = path.join(backendDir, \".tmp-reset-password.ts\");\n fs.writeFileSync(tmpScriptPath, scriptContent, \"utf-8\");\n\n console.log(\"\");\n console.log(chalk.bold(\" 🔑 Rebase Auth — Reset Password\"));\n console.log(\"\");\n console.log(` ${chalk.gray(\"Email:\")} ${email}`);\n if (newPassword) {\n console.log(` ${chalk.gray(\"Password:\")} ${\"*\".repeat(newPassword.length)}`);\n }\n console.log(\"\");\n\n const child = spawn(tsxBin, [tmpScriptPath], {\n cwd: backendDir,\n stdio: \"inherit\",\n env\n });\n\n return new Promise((resolve) => {\n child.on(\"close\", (code) => {\n // Clean up temp script\n try { fs.unlinkSync(tmpScriptPath); } catch { /* ignore */ }\n if (code !== 0) {\n process.exit(code ?? 1);\n }\n resolve();\n });\n });\n}\n\nfunction printAuthHelp() {\n console.log(`\n${chalk.bold(\"rebase auth\")} — Authentication management commands\n\n${chalk.green.bold(\"Usage\")}\n rebase auth ${chalk.blue(\"<command>\")} [options]\n\n${chalk.green.bold(\"Commands\")}\n ${chalk.blue.bold(\"reset-password\")} Reset a user's password\n\n${chalk.green.bold(\"reset-password Options\")}\n ${chalk.blue(\"--email, -e\")} User's email address\n ${chalk.blue(\"--password, -p\")} New password (default: NewPassword123!)\n\n${chalk.green.bold(\"Examples\")}\n rebase auth reset-password user@example.com\n rebase auth reset-password --email user@example.com --password MyNewPass!\n`);\n}\n","/**\n * CLI command: rebase doctor\n *\n * Detects three-way schema drift between collection definitions,\n * the generated Drizzle schema, and the live PostgreSQL database.\n */\nimport chalk from \"chalk\";\nimport execa from \"execa\";\nimport {\n requireProjectRoot,\n requireBackendDir,\n getActiveBackendPlugin,\n resolvePluginCliScript,\n resolveTsx,\n findEnvFile\n} from \"../utils/project\";\n\nexport async function doctorCommand(rawArgs: string[]): Promise<void> {\n const projectRoot = requireProjectRoot();\n const backendDir = requireBackendDir(projectRoot);\n\n const activePlugin = getActiveBackendPlugin(backendDir);\n if (!activePlugin) {\n console.error(chalk.red(\"✗ Could not detect an active database plugin.\"));\n console.error(chalk.gray(\" Make sure a package like @rebasepro/server-postgresql is installed in backend/package.json.\"));\n process.exit(1);\n }\n\n const pluginCli = resolvePluginCliScript(backendDir, activePlugin);\n if (!pluginCli) {\n console.error(chalk.red(`✗ Could not find CLI entry point for ${activePlugin}.`));\n process.exit(1);\n }\n\n // Set up environment with DOTENV_CONFIG_PATH\n const envFile = findEnvFile(projectRoot);\n const env: Record<string, string> = { ...process.env as Record<string, string> };\n if (envFile) {\n env.DOTENV_CONFIG_PATH = envFile;\n }\n\n try {\n const isTs = pluginCli.endsWith(\".ts\");\n if (isTs) {\n const tsxBin = resolveTsx(projectRoot);\n if (!tsxBin) {\n console.error(chalk.red(\"✗ Could not find tsx binary.\"));\n process.exit(1);\n }\n await execa(tsxBin, [pluginCli, ...rawArgs.slice(2)], {\n cwd: backendDir,\n stdio: \"inherit\",\n env\n });\n } else {\n await execa(\"node\", [pluginCli, ...rawArgs.slice(2)], {\n cwd: backendDir,\n stdio: \"inherit\",\n env\n });\n }\n } catch {\n // If the process exits with an error code, execa will throw,\n // but inherit stdio means the user already saw the output.\n process.exit(1);\n }\n}\n","import chalk from \"chalk\";\nimport arg from \"arg\";\nimport { createRebaseApp } from \"./commands/init\";\nimport { generateSdkCommand } from \"./commands/generate_sdk\";\nimport { schemaCommand } from \"./commands/schema\";\nimport { dbCommand } from \"./commands/db\";\nimport { devCommand } from \"./commands/dev\";\nimport { authCommand } from \"./commands/auth\";\nimport { doctorCommand } from \"./commands/doctor\";\nimport fs from \"fs\";\nimport path from \"path\";\nimport { fileURLToPath } from \"url\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\nfunction getVersion(): string {\n try {\n // Try to read version from package.json\n const pkgPath = path.resolve(__dirname, \"../package.json\");\n if (fs.existsSync(pkgPath)) {\n return JSON.parse(fs.readFileSync(pkgPath, \"utf-8\")).version;\n }\n } catch {\n // ignore\n }\n return \"unknown\";\n}\n\nexport async function entry(args: string[]) {\n const parsedArgs = arg(\n {\n \"--version\": Boolean,\n \"--help\": Boolean,\n \"-v\": \"--version\",\n \"-h\": \"--help\"\n },\n {\n argv: args.slice(2),\n permissive: true\n }\n );\n\n if (parsedArgs[\"--version\"]) {\n console.log(getVersion());\n return;\n }\n\n const command = parsedArgs._[0];\n const subcommand = parsedArgs._[1];\n\n // Show global help only when no command given, or --help with no recognized command\n const namespacedCommands = [\"schema\", \"db\", \"dev\", \"auth\", \"doctor\"];\n if (!command || (parsedArgs[\"--help\"] && !namespacedCommands.includes(command))) {\n printHelp();\n return;\n }\n\n // For namespaced commands with --help, pass it through as subcommand\n const effectiveSubcommand = parsedArgs[\"--help\"] ? \"--help\" : subcommand;\n\n switch (command) {\n case \"init\":\n await createRebaseApp(args);\n break;\n\n case \"generate-sdk\": {\n // Legacy command — kept for backward compatibility\n const sdkArgs = arg(\n {\n \"--collections-dir\": String,\n \"--output\": String,\n \"-c\": \"--collections-dir\",\n \"-o\": \"--output\"\n },\n {\n argv: args.slice(3),\n permissive: true\n }\n );\n await generateSdkCommand({\n collectionsDir: sdkArgs[\"--collections-dir\"] || \"./config/collections\",\n output: sdkArgs[\"--output\"] || \"./generated/sdk\",\n cwd: process.cwd()\n });\n break;\n }\n\n case \"schema\":\n await schemaCommand(effectiveSubcommand, args);\n break;\n\n case \"db\":\n await dbCommand(effectiveSubcommand, args);\n break;\n\n case \"dev\":\n await devCommand(args);\n break;\n\n case \"auth\":\n await authCommand(effectiveSubcommand, args);\n break;\n\n case \"doctor\":\n await doctorCommand(args);\n break;\n\n default:\n console.log(chalk.red(`Unknown command: ${command}`));\n console.log(\"\");\n printHelp();\n }\n}\n\nfunction printHelp() {\n console.log(`\n${chalk.bold(\"Rebase CLI\")} — Developer tools for Rebase projects\n\n${chalk.green.bold(\"Usage\")}\n rebase ${chalk.blue(\"<command>\")} [options]\n\n${chalk.green.bold(\"Commands\")}\n ${chalk.blue.bold(\"init\")} Create a new Rebase project\n ${chalk.blue.bold(\"dev\")} Start the development server\n\n${chalk.green.bold(\"Schema\")}\n ${chalk.blue.bold(\"schema generate\")} Generate Drizzle schema from collections\n ${chalk.blue.bold(\"schema\")} ${chalk.gray(\"--help\")} Show schema command help\n\n${chalk.green.bold(\"Database\")}\n ${chalk.blue.bold(\"db push\")} Apply schema directly to database ${chalk.gray(\"(dev)\")}\n ${chalk.blue.bold(\"db pull\")} Introspect database → Drizzle schema\n ${chalk.blue.bold(\"db generate\")} Generate SQL migration files\n ${chalk.blue.bold(\"db migrate\")} Run pending migrations\n ${chalk.blue.bold(\"db studio\")} Open Drizzle Studio\n ${chalk.blue.bold(\"db\")} ${chalk.gray(\"--help\")} Show database command help\n\n${chalk.green.bold(\"SDK\")}\n ${chalk.blue.bold(\"generate-sdk\")} Generate a typed JS SDK from collections\n\n${chalk.green.bold(\"Auth\")}\n ${chalk.blue.bold(\"auth reset-password\")} Reset a user's password\n ${chalk.blue.bold(\"auth\")} ${chalk.gray(\"--help\")} Show auth command help\n\n${chalk.green.bold(\"Diagnostics\")}\n ${chalk.blue.bold(\"doctor\")} Detect schema drift between collections, schema, and DB\n\n${chalk.green.bold(\"Options\")}\n ${chalk.blue(\"--version, -v\")} Show version number\n ${chalk.blue(\"--help, -h\")} Show this help message\n\n${chalk.gray(\"Documentation: https://rebase.pro/docs\")}\n`);\n}\n","/**\n * Authentication helpers for the Rebase CLI.\n *\n * Token storage lives at ~/.rebase/tokens.json (prod) or\n * ~/.rebase/staging.tokens.json (dev).\n */\nimport fs from \"fs\";\nimport path from \"path\";\nimport * as os from \"os\";\n\nconst TOKEN_DIR = path.join(os.homedir(), \".rebase\");\n\nfunction tokenPath(env: \"prod\" | \"dev\"): string {\n return path.join(TOKEN_DIR, (env === \"dev\" ? \"staging.\" : \"\") + \"tokens.json\");\n}\n\n// ─── Token persistence ────────────────────────────────────\n\nfunction saveTokens(tokens: object, env: \"prod\" | \"dev\") {\n if (!fs.existsSync(TOKEN_DIR)) {\n fs.mkdirSync(TOKEN_DIR, { recursive: true });\n }\n fs.writeFileSync(tokenPath(env), JSON.stringify(tokens));\n}\n\n// ─── Public API ───────────────────────────────────────────\n\nexport async function getTokens(env: \"prod\" | \"dev\", _debug?: boolean): Promise<object | null> {\n const fp = tokenPath(env);\n if (!fs.existsSync(fp)) return null;\n try {\n const data = fs.readFileSync(fp, \"utf-8\");\n return JSON.parse(data);\n } catch {\n return null;\n }\n}\n\nexport function parseJwt(token: string): object {\n if (!token) throw new Error(\"No JWT token\");\n const base64Url = token.split(\".\")[1];\n const base64 = base64Url.replace(/-/g, \"+\").replace(/_/g, \"/\");\n const buffer = Buffer.from(base64, \"base64\");\n return JSON.parse(buffer.toString());\n}\n\nexport async function refreshCredentials(\n env: \"dev\" | \"prod\",\n credentials?: object | null,\n _onErr?: (e: unknown) => void\n): Promise<object | null> {\n if (!credentials) return null;\n // If the token hasn't expired, just return it.\n const expiryDate = new Date((credentials as Record<string, unknown>)[\"expiry_date\"] as number);\n if (expiryDate.getTime() > Date.now()) {\n return credentials;\n }\n // Without a server endpoint we can't actually refresh –\n // the caller should handle the null return by re-authenticating.\n return null;\n}\n\nexport async function login(env: \"prod\" | \"dev\", _debug?: boolean): Promise<void> {\n console.log(\n \"Interactive login is not yet implemented in @rebasepro/cli.\\n\" +\n \"Please authenticate via the Rebase dashboard and copy your tokens to \" +\n tokenPath(env)\n );\n}\n\nexport async function logout(env: \"prod\" | \"dev\", _debug?: boolean): Promise<void> {\n const fp = tokenPath(env);\n if (fs.existsSync(fp)) {\n fs.unlinkSync(fp);\n console.log(\"You have been logged out.\");\n } else {\n console.log(\"You are not logged in.\");\n }\n}\n"],"names":["__filename","__dirname","mod","exported"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rebasepro/cli",
3
- "version": "0.0.1-canary.ca2cb6e",
3
+ "version": "0.0.1-canary.eae7889",
4
4
  "description": "Developer tools for Rebase projects",
5
5
  "main": "./dist/index.cjs",
6
6
  "module": "./dist/index.es.js",
@@ -33,9 +33,9 @@
33
33
  "jiti": "^2.4.2",
34
34
  "ncp": "^2.0.0",
35
35
  "pnpm": "^9.0.0",
36
- "@rebasepro/sdk-generator": "0.0.1-canary.ca2cb6e",
37
- "@rebasepro/types": "0.0.1-canary.ca2cb6e",
38
- "@rebasepro/server-core": "0.0.1-canary.ca2cb6e"
36
+ "@rebasepro/sdk-generator": "0.0.1-canary.eae7889",
37
+ "@rebasepro/server-core": "0.0.1-canary.eae7889",
38
+ "@rebasepro/types": "0.0.1-canary.eae7889"
39
39
  },
40
40
  "devDependencies": {
41
41
  "@types/node": "^20.19.17",
@@ -10,7 +10,7 @@
10
10
  "start": "tsx src/index.ts"
11
11
  },
12
12
  "dependencies": {
13
- "{{PROJECT_NAME}}-config": "workspace:*",
13
+ "{{PROJECT_NAME}}-config": "0.0.1",
14
14
  "@rebasepro/server-core": "workspace:*",
15
15
  "@rebasepro/server-postgresql": "workspace:*",
16
16
  "drizzle-orm": "^0.44.4",
@@ -13,7 +13,7 @@
13
13
  "@rebasepro/types": "workspace:*",
14
14
  "@rebasepro/ui": "workspace:*",
15
15
  "@fontsource/jetbrains-mono": "^5.2.5",
16
- "{{PROJECT_NAME}}-config": "workspace:*",
16
+ "{{PROJECT_NAME}}-config": "0.0.1",
17
17
  "react": "^19.0.0",
18
18
  "react-dom": "^19.0.0",
19
19
  "react-router": "^7.0.0",