@buildpad/cli 0.1.4 → 0.1.5

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.
@@ -5,7 +5,7 @@ import { fileURLToPath } from "url";
5
5
  var __filename = fileURLToPath(import.meta.url);
6
6
  var __dirname = path.dirname(__filename);
7
7
  var DEFAULT_REGISTRY_URL = "https://raw.githubusercontent.com/microbuild-ui/ui/main/packages";
8
- var REGISTRY_BASE_URL = process.env.MICROBUILD_REGISTRY_URL ?? DEFAULT_REGISTRY_URL;
8
+ var REGISTRY_BASE_URL = process.env.BUILDPAD_REGISTRY_URL ?? DEFAULT_REGISTRY_URL;
9
9
  var LOCAL_PACKAGES_ROOT = path.resolve(__dirname, "../..");
10
10
  function isLocalMode() {
11
11
  return fs.existsSync(path.join(LOCAL_PACKAGES_ROOT, "registry.json"));
@@ -362,4 +362,4 @@ export {
362
362
  loadConfig,
363
363
  saveConfig
364
364
  };
365
- //# sourceMappingURL=chunk-J4KKVECI.js.map
365
+ //# sourceMappingURL=chunk-MT5WCME7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/resolver.ts","../src/commands/init.ts"],"sourcesContent":["/**\n * Remote/Local Source Resolver\n *\n * Abstracts file fetching so the CLI works in two modes:\n *\n * 1. **Remote mode** (default when installed via npm / npx)\n * Fetches registry.json and component source files from the GitHub raw CDN.\n *\n * 2. **Local mode** (when running from the monorepo checkout)\n * Reads files directly from the `packages/` directory on disk.\n *\n * The mode is determined automatically:\n * - If `PACKAGES_ROOT/registry.json` exists on disk → local mode\n * - Otherwise → remote mode (uses REGISTRY_BASE_URL)\n */\n\nimport fs from 'fs-extra';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\n// ─── Configuration ───────────────────────────────────────────────\n\n/**\n * Base URL for fetching files remotely.\n * Points to the raw GitHub content of the `main` branch.\n *\n * Override at runtime with the `BUILDPAD_REGISTRY_URL` env var.\n *\n * ⚠️ REPLACE the placeholder below with your actual GitHub org/repo.\n */\nconst DEFAULT_REGISTRY_URL =\n 'https://raw.githubusercontent.com/microbuild-ui/ui/main/packages';\n\n/**\n * Runtime-configurable registry URL.\n */\nexport const REGISTRY_BASE_URL =\n process.env.BUILDPAD_REGISTRY_URL ?? DEFAULT_REGISTRY_URL;\n\n// Local packages root (only valid when running from monorepo)\n// From dist/index.js → packages/cli/dist → needs ../../ to reach packages/\nconst LOCAL_PACKAGES_ROOT = path.resolve(__dirname, '../..');\n\n/**\n * Detect whether we are running locally inside the monorepo.\n */\nfunction isLocalMode(): boolean {\n return fs.existsSync(path.join(LOCAL_PACKAGES_ROOT, 'registry.json'));\n}\n\n// ─── Public API ──────────────────────────────────────────────────\n\nexport interface Registry {\n version: string;\n name: string;\n lib: Record<string, LibModule>;\n components: ComponentEntry[];\n categories: Array<{ name: string; title: string; description: string }>;\n dependencies?: Record<string, string[]>;\n aliases?: Record<string, string>;\n meta?: Record<string, unknown>;\n}\n\nexport interface FileMapping {\n source: string;\n target: string;\n}\n\nexport interface LibModule {\n name: string;\n description: string;\n files?: FileMapping[];\n path?: string;\n target?: string;\n dependencies?: string[];\n internalDependencies?: string[];\n}\n\nexport interface ComponentEntry {\n name: string;\n title: string;\n description: string;\n category: string;\n files: FileMapping[];\n dependencies: string[];\n internalDependencies: string[];\n registryDependencies?: string[];\n}\n\n// In-memory cache so we fetch registry.json at most once per CLI invocation\nlet _registryCache: Registry | null = null;\n\n/**\n * Load registry.json (local or remote).\n */\nexport async function getRegistry(): Promise<Registry> {\n if (_registryCache) return _registryCache;\n\n if (isLocalMode()) {\n const registryPath = path.join(LOCAL_PACKAGES_ROOT, 'registry.json');\n _registryCache = await fs.readJSON(registryPath) as Registry;\n } else {\n const url = `${REGISTRY_BASE_URL}/registry.json`;\n _registryCache = await fetchJSON<Registry>(url);\n }\n\n return _registryCache;\n}\n\n/**\n * Read a source file referenced in registry.json.\n *\n * @param source – the `source` field from a FileMapping, e.g. `\"types/src/core.ts\"`\n * @returns the file content as a UTF-8 string\n */\nexport async function resolveSourceFile(source: string): Promise<string> {\n if (isLocalMode()) {\n const fullPath = path.join(LOCAL_PACKAGES_ROOT, source);\n if (!fs.existsSync(fullPath)) {\n throw new Error(`Source file not found on disk: ${fullPath}`);\n }\n return fs.readFile(fullPath, 'utf-8');\n }\n\n // Remote mode\n const url = `${REGISTRY_BASE_URL}/${source}`;\n return fetchText(url);\n}\n\n/**\n * Check whether a source file exists.\n * In remote mode we optimistically return `true` (the registry is the manifest).\n */\nexport async function sourceFileExists(source: string): Promise<boolean> {\n if (isLocalMode()) {\n return fs.existsSync(path.join(LOCAL_PACKAGES_ROOT, source));\n }\n // In remote mode, trust the registry – the file should exist.\n return true;\n}\n\n/**\n * Resolve a template file (used by `init` command).\n * Templates are bundled inside the CLI package under `dist/templates/`.\n * When running locally they live in `packages/cli/templates/`.\n */\nexport function getTemplatesRoot(): string {\n // When built, templates are copied into dist/templates by tsup copy plugin\n const builtTemplates = path.resolve(__dirname, 'templates');\n if (fs.existsSync(builtTemplates)) return builtTemplates;\n\n // Fallback: running locally from source\n const localTemplates = path.resolve(__dirname, '../templates');\n if (fs.existsSync(localTemplates)) return localTemplates;\n\n throw new Error(\n 'Templates directory not found. Ensure the CLI is built correctly.'\n );\n}\n\n/**\n * Return the local PACKAGES_ROOT (only meaningful in local mode).\n * Falls back gracefully so remote-mode callers don't break.\n */\nexport function getLocalPackagesRoot(): string {\n return LOCAL_PACKAGES_ROOT;\n}\n\n// ─── HTTP helpers ────────────────────────────────────────────────\n\nasync function fetchText(url: string): Promise<string> {\n const res = await fetch(url);\n if (!res.ok) {\n throw new Error(\n `Failed to fetch ${url}: ${res.status} ${res.statusText}`\n );\n }\n return res.text();\n}\n\nasync function fetchJSON<T>(url: string): Promise<T> {\n const text = await fetchText(url);\n return JSON.parse(text) as T;\n}\n","import fs from 'fs-extra';\nimport path from 'path';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport prompts from 'prompts';\nimport { getTemplatesRoot } from '../resolver.js';\n\n/**\n * Component version info for tracking updates\n */\nexport interface ComponentVersion {\n /** Registry version when installed */\n version: string;\n /** Installation timestamp */\n installedAt: string;\n /** Source package (e.g., @buildpad/ui-interfaces) */\n source: string;\n}\n\n/**\n * Buildpad Configuration File\n * \n * Copy & Own Model:\n * - Components are copied to your project as source files\n * - No runtime dependency on @buildpad/* packages\n * - Full customization - you own the code\n * - Works offline after installation\n */\nexport interface Config {\n $schema?: string;\n /** Distribution model - always 'copy-own' */\n model: 'copy-own';\n /** Use TypeScript (.tsx) or JavaScript (.jsx) */\n tsx: boolean;\n /** Use 'src' directory structure */\n srcDir: boolean;\n /** Path aliases for generated files */\n aliases: {\n /** Where UI components are copied (e.g., @/components/ui) */\n components: string;\n /** Where lib files are copied (e.g., @/lib/buildpad) */\n lib: string;\n };\n /** Installed lib modules */\n installedLib: string[];\n /** Installed components */\n installedComponents: string[];\n /** Component version tracking for update detection */\n componentVersions?: Record<string, ComponentVersion>;\n /** Registry version at last install */\n registryVersion?: string;\n}\n\nconst DEFAULT_CONFIG: Config = {\n $schema: 'https://buildpad.dev/schema.json',\n model: 'copy-own',\n tsx: true,\n srcDir: true,\n aliases: {\n components: '@/components/ui',\n lib: '@/lib/buildpad',\n },\n installedLib: [],\n installedComponents: [],\n componentVersions: {},\n registryVersion: '1.0.0',\n};\n\nconst TEMPLATES_ROOT = getTemplatesRoot();\n\nasync function copyTemplateFile(sourceRelativePath: string, targetPath: string, cwd: string) {\n const sourcePath = path.join(TEMPLATES_ROOT, sourceRelativePath);\n\n if (!fs.existsSync(sourcePath) || fs.existsSync(targetPath)) {\n return;\n }\n\n await fs.ensureDir(path.dirname(targetPath));\n await fs.copy(sourcePath, targetPath);\n console.log(chalk.green(`✓ Created ${path.relative(cwd, targetPath)}`));\n}\n\nexport async function init(options: { yes?: boolean; cwd: string }) {\n const { cwd, yes } = options;\n\n console.log(chalk.bold('\\n🚀 Welcome to Buildpad!\\n'));\n console.log(chalk.dim('Copy & Own Model - Components become part of your codebase.\\n'));\n\n // Check if already initialized\n const configPath = path.join(cwd, 'buildpad.json');\n if (fs.existsSync(configPath) && !yes) {\n const { overwrite } = await prompts({\n type: 'confirm',\n name: 'overwrite',\n message: 'buildpad.json already exists. Overwrite?',\n initial: false,\n });\n\n if (!overwrite) {\n console.log(chalk.yellow('\\n✓ Keeping existing configuration\\n'));\n return;\n }\n }\n\n // Detect project type\n const packageJsonPath = path.join(cwd, 'package.json');\n let projectType = 'unknown';\n let hasSrcDir = fs.existsSync(path.join(cwd, 'src'));\n\n if (fs.existsSync(packageJsonPath)) {\n const packageJson = await fs.readJSON(packageJsonPath);\n if (packageJson.dependencies?.['next']) {\n projectType = 'next';\n // Next.js App Router often uses 'app' instead of 'src'\n if (fs.existsSync(path.join(cwd, 'app')) && !hasSrcDir) {\n hasSrcDir = false;\n }\n } else if (packageJson.dependencies?.['vite']) {\n projectType = 'vite';\n } else if (packageJson.dependencies?.['react']) {\n projectType = 'react';\n }\n } else {\n // Create a minimal package.json for empty projects\n console.log(chalk.yellow('⚠ No package.json found. Creating minimal Next.js project...\\n'));\n \n const projectName = path.basename(cwd);\n const minimalPackageJson = {\n name: projectName,\n version: '0.1.0',\n private: true,\n scripts: {\n dev: 'next dev --turbopack',\n build: 'next build',\n start: 'next start',\n lint: 'next lint'\n },\n dependencies: {\n 'next': '^16.1.6',\n 'react': '^19.0.0',\n 'react-dom': '^19.0.0',\n '@mantine/core': '^8.0.0',\n '@mantine/hooks': '^8.0.0',\n '@mantine/modals': '^8.0.0',\n '@mantine/notifications': '^8.0.0',\n '@mantine/form': '^8.0.0',\n '@tabler/icons-react': '^3.0.0',\n 'clsx': '^2.0.0',\n 'tailwind-merge': '^2.0.0'\n },\n devDependencies: {\n '@types/node': '^22',\n '@types/react': '^19',\n '@types/react-dom': '^19',\n 'typescript': '^5'\n }\n };\n \n await fs.writeJSON(packageJsonPath, minimalPackageJson, { spaces: 2 });\n projectType = 'next';\n hasSrcDir = false; // New projects use App Router without src/\n console.log(chalk.green('✓ Created package.json\\n'));\n }\n\n console.log(chalk.dim(`Detected: ${projectType} project${hasSrcDir ? ' with src directory' : ''}\\n`));\n\n let config = { ...DEFAULT_CONFIG };\n config.srcDir = hasSrcDir;\n\n if (!yes) {\n // Prompt for configuration\n const answers = await prompts([\n {\n type: 'confirm',\n name: 'srcDir',\n message: 'Use src directory?',\n initial: hasSrcDir,\n },\n {\n type: 'text',\n name: 'componentsPath',\n message: 'Where should components be installed?',\n initial: '@/components/ui',\n },\n {\n type: 'text',\n name: 'libPath',\n message: 'Where should lib files (types, services, hooks) be installed?',\n initial: '@/lib/buildpad',\n },\n {\n type: 'confirm',\n name: 'tsx',\n message: 'Use TypeScript?',\n initial: true,\n },\n ]);\n\n config.srcDir = answers.srcDir ?? hasSrcDir;\n config.aliases.components = answers.componentsPath || '@/components/ui';\n config.aliases.lib = answers.libPath || '@/lib/buildpad';\n config.tsx = answers.tsx ?? true;\n }\n\n const spinner = ora('Setting up Copy & Own structure...').start();\n\n try {\n // Write config\n await fs.writeJSON(configPath, config, { spaces: 2 });\n spinner.succeed('Created buildpad.json');\n\n // Create directory structure\n // Components directory\n const componentsDir = resolveAlias(config.aliases.components, cwd, config.srcDir);\n await fs.ensureDir(componentsDir);\n console.log(chalk.green(`✓ Created ${path.relative(cwd, componentsDir)}`));\n\n // Lib directory structure\n const libDir = resolveAlias(config.aliases.lib, cwd, config.srcDir);\n await fs.ensureDir(libDir);\n await fs.ensureDir(path.join(libDir, 'types'));\n await fs.ensureDir(path.join(libDir, 'services'));\n await fs.ensureDir(path.join(libDir, 'hooks'));\n console.log(chalk.green(`✓ Created ${path.relative(cwd, libDir)}`));\n console.log(chalk.dim(' └── types/'));\n console.log(chalk.dim(' └── services/'));\n console.log(chalk.dim(' └── hooks/'));\n\n // Create tsconfig.json if missing (required for path aliases)\n const tsconfigPath = path.join(cwd, 'tsconfig.json');\n if (!fs.existsSync(tsconfigPath) && config.tsx) {\n const tsconfig = {\n compilerOptions: {\n target: 'ES2017',\n lib: ['dom', 'dom.iterable', 'esnext'],\n allowJs: true,\n skipLibCheck: true,\n strict: true,\n noEmit: true,\n esModuleInterop: true,\n module: 'esnext',\n moduleResolution: 'bundler',\n resolveJsonModule: true,\n isolatedModules: true,\n jsx: 'preserve',\n incremental: true,\n plugins: [{ name: 'next' }],\n paths: {\n '@/*': [config.srcDir ? './src/*' : './*']\n },\n baseUrl: '.'\n },\n include: ['next-env.d.ts', '**/*.ts', '**/*.tsx', '.next/types/**/*.ts'],\n exclude: ['node_modules']\n };\n await fs.writeJSON(tsconfigPath, tsconfig, { spaces: 2 });\n console.log(chalk.green(`✓ Created tsconfig.json with @/ path alias`));\n }\n\n // Create next-env.d.ts if missing (for Next.js TypeScript support)\n const nextEnvPath = path.join(cwd, 'next-env.d.ts');\n if (!fs.existsSync(nextEnvPath) && projectType === 'next') {\n const nextEnvContent = `/// <reference types=\"next\" />\n/// <reference types=\"next/image-types/global\" />\n\n// NOTE: This file should not be edited\n// see https://nextjs.org/docs/app/api-reference/config/typescript for more information.\n`;\n await fs.writeFile(nextEnvPath, nextEnvContent);\n console.log(chalk.green(`✓ Created next-env.d.ts`));\n }\n\n // Create a basic Next.js app skeleton with design system files\n if (projectType === 'next') {\n const srcRoot = config.srcDir ? path.join(cwd, 'src') : cwd;\n const appDir = path.join(srcRoot, 'app');\n const libRoot = path.join(srcRoot, 'lib');\n const componentsRoot = path.join(srcRoot, 'components');\n\n await fs.ensureDir(appDir);\n await fs.ensureDir(libRoot);\n await fs.ensureDir(componentsRoot);\n\n await copyTemplateFile('app/design-tokens.css', path.join(appDir, 'design-tokens.css'), cwd);\n await copyTemplateFile('app/globals.css', path.join(appDir, 'globals.css'), cwd);\n await copyTemplateFile('app/layout.tsx', path.join(appDir, 'layout.tsx'), cwd);\n await copyTemplateFile('app/page.tsx', path.join(appDir, 'page.tsx'), cwd);\n await copyTemplateFile('lib/theme.ts', path.join(libRoot, 'theme.ts'), cwd);\n await copyTemplateFile(\n 'components/ColorSchemeToggle.tsx',\n path.join(componentsRoot, 'ColorSchemeToggle.tsx'),\n cwd\n );\n }\n\n // Check for required dependencies\n console.log(chalk.bold('\\n📦 Checking dependencies...\\n'));\n\n // Core dependencies always needed\n const coreDeps = [\n '@mantine/core',\n '@mantine/hooks',\n 'react',\n 'react-dom',\n ];\n\n // Optional dependencies for specific features (installed on-demand when components need them)\n // @mantine/dates - DateTime component\n // @mantine/notifications - CollectionForm notifications\n // @mantine/dropzone - Upload component\n // @tabler/icons-react - Icon components\n // dayjs - DateTime component\n\n // Utility dependencies (for utils.ts)\n const utilityDeps = ['clsx', 'tailwind-merge'];\n\n const missingDeps: string[] = [];\n const missingUtilDeps: string[] = [];\n\n if (fs.existsSync(packageJsonPath)) {\n const packageJson = await fs.readJSON(packageJsonPath);\n const allDeps = {\n ...packageJson.dependencies,\n ...packageJson.devDependencies,\n };\n\n for (const dep of coreDeps) {\n if (!allDeps[dep]) {\n missingDeps.push(dep);\n }\n }\n\n for (const dep of utilityDeps) {\n if (!allDeps[dep]) {\n missingUtilDeps.push(dep);\n }\n }\n }\n\n if (missingDeps.length > 0) {\n console.log(chalk.yellow('⚠ Missing core dependencies:'));\n missingDeps.forEach(dep => console.log(chalk.dim(` - ${dep}`)));\n console.log(chalk.dim('\\nInstall with:'));\n console.log(chalk.cyan(` pnpm add ${missingDeps.join(' ')}\\n`));\n } else {\n console.log(chalk.green('✓ Core dependencies installed\\n'));\n }\n\n if (missingUtilDeps.length > 0) {\n console.log(chalk.dim('Optional utility dependencies for cn() helper:'));\n console.log(chalk.cyan(` pnpm add ${missingUtilDeps.join(' ')}\\n`));\n }\n\n // Print benefits\n console.log(chalk.bold.blue('📋 Copy & Own Benefits:\\n'));\n console.log(' ✅ No external package dependencies for component code');\n console.log(' ✅ Full customization - components are your application code');\n console.log(' ✅ No breaking changes from upstream updates');\n console.log(' ✅ Bundle only what you use - tree-shaking friendly');\n console.log(' ✅ Works offline after installation');\n\n // Success message\n console.log(chalk.bold.green('\\n✨ Setup complete!\\n'));\n console.log('Next steps:');\n console.log(chalk.cyan(' 1. Add components: ') + chalk.dim('npx buildpad add input select-dropdown'));\n console.log(chalk.cyan(' 2. List components: ') + chalk.dim('npx buildpad list'));\n console.log(chalk.cyan(' 3. Add all basics: ') + chalk.dim('npx buildpad add --category input'));\n console.log(chalk.dim('\\nComponents will be copied with all dependencies inlined.\\n'));\n\n } catch (error) {\n spinner.fail('Failed to initialize');\n console.error(chalk.red(error));\n process.exit(1);\n }\n}\n\n/**\n * Resolve path alias to absolute path\n * Handles @/ aliases and accounts for srcDir configuration\n */\nexport function resolveAlias(alias: string, cwd: string, srcDir: boolean = true): string {\n if (alias.startsWith('@/')) {\n const relativePath = alias.slice(2);\n if (srcDir) {\n return path.join(cwd, 'src', relativePath);\n }\n return path.join(cwd, relativePath);\n }\n return path.join(cwd, alias);\n}\n\n/**\n * Load and validate the buildpad.json config\n */\nexport async function loadConfig(cwd: string): Promise<Config | null> {\n const configPath = path.join(cwd, 'buildpad.json');\n if (!fs.existsSync(configPath)) {\n return null;\n }\n return await fs.readJSON(configPath) as Config;\n}\n\n/**\n * Save the buildpad.json config\n */\nexport async function saveConfig(cwd: string, config: Config): Promise<void> {\n const configPath = path.join(cwd, 'buildpad.json');\n await fs.writeJSON(configPath, config, { spaces: 2 });\n}\n"],"mappings":"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","names":["fs","path","path","fs"]}
package/dist/index.js CHANGED
@@ -6,7 +6,7 @@ import {
6
6
  resolveSourceFile,
7
7
  saveConfig,
8
8
  sourceFileExists
9
- } from "./chunk-J4KKVECI.js";
9
+ } from "./chunk-MT5WCME7.js";
10
10
 
11
11
  // src/index.ts
12
12
  import { Command } from "commander";
@@ -2575,7 +2575,7 @@ program.command("bootstrap").description("Full project setup: init + add --all +
2575
2575
  });
2576
2576
  program.command("fix").description("Automatically fix common issues (untransformed imports, broken paths, SSR exports)").option("-n, --dry-run", "Preview fixes without modifying files").option("-y, --yes", "Skip confirmation prompts").option("--cwd <path>", "Project directory", process.cwd()).action(fix);
2577
2577
  program.command("outdated").description("Check for component updates (compares installed versions to registry)").option("--json", "Output as JSON").option("--cwd <path>", "Project directory", process.cwd()).action(async (options) => {
2578
- const { outdated } = await import("./outdated-JMAYAZ7W.js");
2578
+ const { outdated } = await import("./outdated-YKXNVN7V.js");
2579
2579
  await outdated(options);
2580
2580
  });
2581
2581
  program.parse();
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  getRegistry,
3
3
  loadConfig
4
- } from "./chunk-J4KKVECI.js";
4
+ } from "./chunk-MT5WCME7.js";
5
5
 
6
6
  // src/commands/outdated.ts
7
7
  import chalk from "chalk";
@@ -107,4 +107,4 @@ Total: ${config.installedComponents.length} components, ${config.installedLib.le
107
107
  export {
108
108
  outdated
109
109
  };
110
- //# sourceMappingURL=outdated-JMAYAZ7W.js.map
110
+ //# sourceMappingURL=outdated-YKXNVN7V.js.map
@@ -33,9 +33,9 @@ export async function getAuthHeaders(): Promise<HeadersInit> {
33
33
  * Get the DaaS backend URL from environment
34
34
  */
35
35
  export function getDaasUrl(): string {
36
- const url = process.env.NEXT_PUBLIC_MICROBUILD_DAAS_URL;
36
+ const url = process.env.NEXT_PUBLIC_BUILDPAD_DAAS_URL;
37
37
  if (!url) {
38
- throw new Error('NEXT_PUBLIC_MICROBUILD_DAAS_URL is not configured in .env.local');
38
+ throw new Error('NEXT_PUBLIC_BUILDPAD_DAAS_URL is not configured in .env.local');
39
39
  }
40
40
  return url;
41
41
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@buildpad/cli",
3
- "version": "0.1.4",
3
+ "version": "0.1.5",
4
4
  "description": "CLI tool for adding Buildpad components to your project - like shadcn/ui",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/resolver.ts","../src/commands/init.ts"],"sourcesContent":["/**\n * Remote/Local Source Resolver\n *\n * Abstracts file fetching so the CLI works in two modes:\n *\n * 1. **Remote mode** (default when installed via npm / npx)\n * Fetches registry.json and component source files from the GitHub raw CDN.\n *\n * 2. **Local mode** (when running from the monorepo checkout)\n * Reads files directly from the `packages/` directory on disk.\n *\n * The mode is determined automatically:\n * - If `PACKAGES_ROOT/registry.json` exists on disk → local mode\n * - Otherwise → remote mode (uses REGISTRY_BASE_URL)\n */\n\nimport fs from 'fs-extra';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\n// ─── Configuration ───────────────────────────────────────────────\n\n/**\n * Base URL for fetching files remotely.\n * Points to the raw GitHub content of the `main` branch.\n *\n * Override at runtime with the `MICROBUILD_REGISTRY_URL` env var.\n *\n * ⚠️ REPLACE the placeholder below with your actual GitHub org/repo.\n */\nconst DEFAULT_REGISTRY_URL =\n 'https://raw.githubusercontent.com/microbuild-ui/ui/main/packages';\n\n/**\n * Runtime-configurable registry URL.\n */\nexport const REGISTRY_BASE_URL =\n process.env.MICROBUILD_REGISTRY_URL ?? DEFAULT_REGISTRY_URL;\n\n// Local packages root (only valid when running from monorepo)\n// From dist/index.js → packages/cli/dist → needs ../../ to reach packages/\nconst LOCAL_PACKAGES_ROOT = path.resolve(__dirname, '../..');\n\n/**\n * Detect whether we are running locally inside the monorepo.\n */\nfunction isLocalMode(): boolean {\n return fs.existsSync(path.join(LOCAL_PACKAGES_ROOT, 'registry.json'));\n}\n\n// ─── Public API ──────────────────────────────────────────────────\n\nexport interface Registry {\n version: string;\n name: string;\n lib: Record<string, LibModule>;\n components: ComponentEntry[];\n categories: Array<{ name: string; title: string; description: string }>;\n dependencies?: Record<string, string[]>;\n aliases?: Record<string, string>;\n meta?: Record<string, unknown>;\n}\n\nexport interface FileMapping {\n source: string;\n target: string;\n}\n\nexport interface LibModule {\n name: string;\n description: string;\n files?: FileMapping[];\n path?: string;\n target?: string;\n dependencies?: string[];\n internalDependencies?: string[];\n}\n\nexport interface ComponentEntry {\n name: string;\n title: string;\n description: string;\n category: string;\n files: FileMapping[];\n dependencies: string[];\n internalDependencies: string[];\n registryDependencies?: string[];\n}\n\n// In-memory cache so we fetch registry.json at most once per CLI invocation\nlet _registryCache: Registry | null = null;\n\n/**\n * Load registry.json (local or remote).\n */\nexport async function getRegistry(): Promise<Registry> {\n if (_registryCache) return _registryCache;\n\n if (isLocalMode()) {\n const registryPath = path.join(LOCAL_PACKAGES_ROOT, 'registry.json');\n _registryCache = await fs.readJSON(registryPath) as Registry;\n } else {\n const url = `${REGISTRY_BASE_URL}/registry.json`;\n _registryCache = await fetchJSON<Registry>(url);\n }\n\n return _registryCache;\n}\n\n/**\n * Read a source file referenced in registry.json.\n *\n * @param source – the `source` field from a FileMapping, e.g. `\"types/src/core.ts\"`\n * @returns the file content as a UTF-8 string\n */\nexport async function resolveSourceFile(source: string): Promise<string> {\n if (isLocalMode()) {\n const fullPath = path.join(LOCAL_PACKAGES_ROOT, source);\n if (!fs.existsSync(fullPath)) {\n throw new Error(`Source file not found on disk: ${fullPath}`);\n }\n return fs.readFile(fullPath, 'utf-8');\n }\n\n // Remote mode\n const url = `${REGISTRY_BASE_URL}/${source}`;\n return fetchText(url);\n}\n\n/**\n * Check whether a source file exists.\n * In remote mode we optimistically return `true` (the registry is the manifest).\n */\nexport async function sourceFileExists(source: string): Promise<boolean> {\n if (isLocalMode()) {\n return fs.existsSync(path.join(LOCAL_PACKAGES_ROOT, source));\n }\n // In remote mode, trust the registry – the file should exist.\n return true;\n}\n\n/**\n * Resolve a template file (used by `init` command).\n * Templates are bundled inside the CLI package under `dist/templates/`.\n * When running locally they live in `packages/cli/templates/`.\n */\nexport function getTemplatesRoot(): string {\n // When built, templates are copied into dist/templates by tsup copy plugin\n const builtTemplates = path.resolve(__dirname, 'templates');\n if (fs.existsSync(builtTemplates)) return builtTemplates;\n\n // Fallback: running locally from source\n const localTemplates = path.resolve(__dirname, '../templates');\n if (fs.existsSync(localTemplates)) return localTemplates;\n\n throw new Error(\n 'Templates directory not found. Ensure the CLI is built correctly.'\n );\n}\n\n/**\n * Return the local PACKAGES_ROOT (only meaningful in local mode).\n * Falls back gracefully so remote-mode callers don't break.\n */\nexport function getLocalPackagesRoot(): string {\n return LOCAL_PACKAGES_ROOT;\n}\n\n// ─── HTTP helpers ────────────────────────────────────────────────\n\nasync function fetchText(url: string): Promise<string> {\n const res = await fetch(url);\n if (!res.ok) {\n throw new Error(\n `Failed to fetch ${url}: ${res.status} ${res.statusText}`\n );\n }\n return res.text();\n}\n\nasync function fetchJSON<T>(url: string): Promise<T> {\n const text = await fetchText(url);\n return JSON.parse(text) as T;\n}\n","import fs from 'fs-extra';\nimport path from 'path';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport prompts from 'prompts';\nimport { getTemplatesRoot } from '../resolver.js';\n\n/**\n * Component version info for tracking updates\n */\nexport interface ComponentVersion {\n /** Registry version when installed */\n version: string;\n /** Installation timestamp */\n installedAt: string;\n /** Source package (e.g., @buildpad/ui-interfaces) */\n source: string;\n}\n\n/**\n * Buildpad Configuration File\n * \n * Copy & Own Model:\n * - Components are copied to your project as source files\n * - No runtime dependency on @buildpad/* packages\n * - Full customization - you own the code\n * - Works offline after installation\n */\nexport interface Config {\n $schema?: string;\n /** Distribution model - always 'copy-own' */\n model: 'copy-own';\n /** Use TypeScript (.tsx) or JavaScript (.jsx) */\n tsx: boolean;\n /** Use 'src' directory structure */\n srcDir: boolean;\n /** Path aliases for generated files */\n aliases: {\n /** Where UI components are copied (e.g., @/components/ui) */\n components: string;\n /** Where lib files are copied (e.g., @/lib/buildpad) */\n lib: string;\n };\n /** Installed lib modules */\n installedLib: string[];\n /** Installed components */\n installedComponents: string[];\n /** Component version tracking for update detection */\n componentVersions?: Record<string, ComponentVersion>;\n /** Registry version at last install */\n registryVersion?: string;\n}\n\nconst DEFAULT_CONFIG: Config = {\n $schema: 'https://buildpad.dev/schema.json',\n model: 'copy-own',\n tsx: true,\n srcDir: true,\n aliases: {\n components: '@/components/ui',\n lib: '@/lib/buildpad',\n },\n installedLib: [],\n installedComponents: [],\n componentVersions: {},\n registryVersion: '1.0.0',\n};\n\nconst TEMPLATES_ROOT = getTemplatesRoot();\n\nasync function copyTemplateFile(sourceRelativePath: string, targetPath: string, cwd: string) {\n const sourcePath = path.join(TEMPLATES_ROOT, sourceRelativePath);\n\n if (!fs.existsSync(sourcePath) || fs.existsSync(targetPath)) {\n return;\n }\n\n await fs.ensureDir(path.dirname(targetPath));\n await fs.copy(sourcePath, targetPath);\n console.log(chalk.green(`✓ Created ${path.relative(cwd, targetPath)}`));\n}\n\nexport async function init(options: { yes?: boolean; cwd: string }) {\n const { cwd, yes } = options;\n\n console.log(chalk.bold('\\n🚀 Welcome to Buildpad!\\n'));\n console.log(chalk.dim('Copy & Own Model - Components become part of your codebase.\\n'));\n\n // Check if already initialized\n const configPath = path.join(cwd, 'buildpad.json');\n if (fs.existsSync(configPath) && !yes) {\n const { overwrite } = await prompts({\n type: 'confirm',\n name: 'overwrite',\n message: 'buildpad.json already exists. Overwrite?',\n initial: false,\n });\n\n if (!overwrite) {\n console.log(chalk.yellow('\\n✓ Keeping existing configuration\\n'));\n return;\n }\n }\n\n // Detect project type\n const packageJsonPath = path.join(cwd, 'package.json');\n let projectType = 'unknown';\n let hasSrcDir = fs.existsSync(path.join(cwd, 'src'));\n\n if (fs.existsSync(packageJsonPath)) {\n const packageJson = await fs.readJSON(packageJsonPath);\n if (packageJson.dependencies?.['next']) {\n projectType = 'next';\n // Next.js App Router often uses 'app' instead of 'src'\n if (fs.existsSync(path.join(cwd, 'app')) && !hasSrcDir) {\n hasSrcDir = false;\n }\n } else if (packageJson.dependencies?.['vite']) {\n projectType = 'vite';\n } else if (packageJson.dependencies?.['react']) {\n projectType = 'react';\n }\n } else {\n // Create a minimal package.json for empty projects\n console.log(chalk.yellow('⚠ No package.json found. Creating minimal Next.js project...\\n'));\n \n const projectName = path.basename(cwd);\n const minimalPackageJson = {\n name: projectName,\n version: '0.1.0',\n private: true,\n scripts: {\n dev: 'next dev --turbopack',\n build: 'next build',\n start: 'next start',\n lint: 'next lint'\n },\n dependencies: {\n 'next': '^16.1.6',\n 'react': '^19.0.0',\n 'react-dom': '^19.0.0',\n '@mantine/core': '^8.0.0',\n '@mantine/hooks': '^8.0.0',\n '@mantine/modals': '^8.0.0',\n '@mantine/notifications': '^8.0.0',\n '@mantine/form': '^8.0.0',\n '@tabler/icons-react': '^3.0.0',\n 'clsx': '^2.0.0',\n 'tailwind-merge': '^2.0.0'\n },\n devDependencies: {\n '@types/node': '^22',\n '@types/react': '^19',\n '@types/react-dom': '^19',\n 'typescript': '^5'\n }\n };\n \n await fs.writeJSON(packageJsonPath, minimalPackageJson, { spaces: 2 });\n projectType = 'next';\n hasSrcDir = false; // New projects use App Router without src/\n console.log(chalk.green('✓ Created package.json\\n'));\n }\n\n console.log(chalk.dim(`Detected: ${projectType} project${hasSrcDir ? ' with src directory' : ''}\\n`));\n\n let config = { ...DEFAULT_CONFIG };\n config.srcDir = hasSrcDir;\n\n if (!yes) {\n // Prompt for configuration\n const answers = await prompts([\n {\n type: 'confirm',\n name: 'srcDir',\n message: 'Use src directory?',\n initial: hasSrcDir,\n },\n {\n type: 'text',\n name: 'componentsPath',\n message: 'Where should components be installed?',\n initial: '@/components/ui',\n },\n {\n type: 'text',\n name: 'libPath',\n message: 'Where should lib files (types, services, hooks) be installed?',\n initial: '@/lib/buildpad',\n },\n {\n type: 'confirm',\n name: 'tsx',\n message: 'Use TypeScript?',\n initial: true,\n },\n ]);\n\n config.srcDir = answers.srcDir ?? hasSrcDir;\n config.aliases.components = answers.componentsPath || '@/components/ui';\n config.aliases.lib = answers.libPath || '@/lib/buildpad';\n config.tsx = answers.tsx ?? true;\n }\n\n const spinner = ora('Setting up Copy & Own structure...').start();\n\n try {\n // Write config\n await fs.writeJSON(configPath, config, { spaces: 2 });\n spinner.succeed('Created buildpad.json');\n\n // Create directory structure\n // Components directory\n const componentsDir = resolveAlias(config.aliases.components, cwd, config.srcDir);\n await fs.ensureDir(componentsDir);\n console.log(chalk.green(`✓ Created ${path.relative(cwd, componentsDir)}`));\n\n // Lib directory structure\n const libDir = resolveAlias(config.aliases.lib, cwd, config.srcDir);\n await fs.ensureDir(libDir);\n await fs.ensureDir(path.join(libDir, 'types'));\n await fs.ensureDir(path.join(libDir, 'services'));\n await fs.ensureDir(path.join(libDir, 'hooks'));\n console.log(chalk.green(`✓ Created ${path.relative(cwd, libDir)}`));\n console.log(chalk.dim(' └── types/'));\n console.log(chalk.dim(' └── services/'));\n console.log(chalk.dim(' └── hooks/'));\n\n // Create tsconfig.json if missing (required for path aliases)\n const tsconfigPath = path.join(cwd, 'tsconfig.json');\n if (!fs.existsSync(tsconfigPath) && config.tsx) {\n const tsconfig = {\n compilerOptions: {\n target: 'ES2017',\n lib: ['dom', 'dom.iterable', 'esnext'],\n allowJs: true,\n skipLibCheck: true,\n strict: true,\n noEmit: true,\n esModuleInterop: true,\n module: 'esnext',\n moduleResolution: 'bundler',\n resolveJsonModule: true,\n isolatedModules: true,\n jsx: 'preserve',\n incremental: true,\n plugins: [{ name: 'next' }],\n paths: {\n '@/*': [config.srcDir ? './src/*' : './*']\n },\n baseUrl: '.'\n },\n include: ['next-env.d.ts', '**/*.ts', '**/*.tsx', '.next/types/**/*.ts'],\n exclude: ['node_modules']\n };\n await fs.writeJSON(tsconfigPath, tsconfig, { spaces: 2 });\n console.log(chalk.green(`✓ Created tsconfig.json with @/ path alias`));\n }\n\n // Create next-env.d.ts if missing (for Next.js TypeScript support)\n const nextEnvPath = path.join(cwd, 'next-env.d.ts');\n if (!fs.existsSync(nextEnvPath) && projectType === 'next') {\n const nextEnvContent = `/// <reference types=\"next\" />\n/// <reference types=\"next/image-types/global\" />\n\n// NOTE: This file should not be edited\n// see https://nextjs.org/docs/app/api-reference/config/typescript for more information.\n`;\n await fs.writeFile(nextEnvPath, nextEnvContent);\n console.log(chalk.green(`✓ Created next-env.d.ts`));\n }\n\n // Create a basic Next.js app skeleton with design system files\n if (projectType === 'next') {\n const srcRoot = config.srcDir ? path.join(cwd, 'src') : cwd;\n const appDir = path.join(srcRoot, 'app');\n const libRoot = path.join(srcRoot, 'lib');\n const componentsRoot = path.join(srcRoot, 'components');\n\n await fs.ensureDir(appDir);\n await fs.ensureDir(libRoot);\n await fs.ensureDir(componentsRoot);\n\n await copyTemplateFile('app/design-tokens.css', path.join(appDir, 'design-tokens.css'), cwd);\n await copyTemplateFile('app/globals.css', path.join(appDir, 'globals.css'), cwd);\n await copyTemplateFile('app/layout.tsx', path.join(appDir, 'layout.tsx'), cwd);\n await copyTemplateFile('app/page.tsx', path.join(appDir, 'page.tsx'), cwd);\n await copyTemplateFile('lib/theme.ts', path.join(libRoot, 'theme.ts'), cwd);\n await copyTemplateFile(\n 'components/ColorSchemeToggle.tsx',\n path.join(componentsRoot, 'ColorSchemeToggle.tsx'),\n cwd\n );\n }\n\n // Check for required dependencies\n console.log(chalk.bold('\\n📦 Checking dependencies...\\n'));\n\n // Core dependencies always needed\n const coreDeps = [\n '@mantine/core',\n '@mantine/hooks',\n 'react',\n 'react-dom',\n ];\n\n // Optional dependencies for specific features (installed on-demand when components need them)\n // @mantine/dates - DateTime component\n // @mantine/notifications - CollectionForm notifications\n // @mantine/dropzone - Upload component\n // @tabler/icons-react - Icon components\n // dayjs - DateTime component\n\n // Utility dependencies (for utils.ts)\n const utilityDeps = ['clsx', 'tailwind-merge'];\n\n const missingDeps: string[] = [];\n const missingUtilDeps: string[] = [];\n\n if (fs.existsSync(packageJsonPath)) {\n const packageJson = await fs.readJSON(packageJsonPath);\n const allDeps = {\n ...packageJson.dependencies,\n ...packageJson.devDependencies,\n };\n\n for (const dep of coreDeps) {\n if (!allDeps[dep]) {\n missingDeps.push(dep);\n }\n }\n\n for (const dep of utilityDeps) {\n if (!allDeps[dep]) {\n missingUtilDeps.push(dep);\n }\n }\n }\n\n if (missingDeps.length > 0) {\n console.log(chalk.yellow('⚠ Missing core dependencies:'));\n missingDeps.forEach(dep => console.log(chalk.dim(` - ${dep}`)));\n console.log(chalk.dim('\\nInstall with:'));\n console.log(chalk.cyan(` pnpm add ${missingDeps.join(' ')}\\n`));\n } else {\n console.log(chalk.green('✓ Core dependencies installed\\n'));\n }\n\n if (missingUtilDeps.length > 0) {\n console.log(chalk.dim('Optional utility dependencies for cn() helper:'));\n console.log(chalk.cyan(` pnpm add ${missingUtilDeps.join(' ')}\\n`));\n }\n\n // Print benefits\n console.log(chalk.bold.blue('📋 Copy & Own Benefits:\\n'));\n console.log(' ✅ No external package dependencies for component code');\n console.log(' ✅ Full customization - components are your application code');\n console.log(' ✅ No breaking changes from upstream updates');\n console.log(' ✅ Bundle only what you use - tree-shaking friendly');\n console.log(' ✅ Works offline after installation');\n\n // Success message\n console.log(chalk.bold.green('\\n✨ Setup complete!\\n'));\n console.log('Next steps:');\n console.log(chalk.cyan(' 1. Add components: ') + chalk.dim('npx buildpad add input select-dropdown'));\n console.log(chalk.cyan(' 2. List components: ') + chalk.dim('npx buildpad list'));\n console.log(chalk.cyan(' 3. Add all basics: ') + chalk.dim('npx buildpad add --category input'));\n console.log(chalk.dim('\\nComponents will be copied with all dependencies inlined.\\n'));\n\n } catch (error) {\n spinner.fail('Failed to initialize');\n console.error(chalk.red(error));\n process.exit(1);\n }\n}\n\n/**\n * Resolve path alias to absolute path\n * Handles @/ aliases and accounts for srcDir configuration\n */\nexport function resolveAlias(alias: string, cwd: string, srcDir: boolean = true): string {\n if (alias.startsWith('@/')) {\n const relativePath = alias.slice(2);\n if (srcDir) {\n return path.join(cwd, 'src', relativePath);\n }\n return path.join(cwd, relativePath);\n }\n return path.join(cwd, alias);\n}\n\n/**\n * Load and validate the buildpad.json config\n */\nexport async function loadConfig(cwd: string): Promise<Config | null> {\n const configPath = path.join(cwd, 'buildpad.json');\n if (!fs.existsSync(configPath)) {\n return null;\n }\n return await fs.readJSON(configPath) as Config;\n}\n\n/**\n * Save the buildpad.json config\n */\nexport async function saveConfig(cwd: string, config: Config): Promise<void> {\n const configPath = path.join(cwd, 'buildpad.json');\n await fs.writeJSON(configPath, config, { spaces: 2 });\n}\n"],"mappings":"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","names":["fs","path","path","fs"]}