@hypen-space/cli 0.3.8

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.
@@ -0,0 +1,13 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/dev-bun.ts", "../src/dev-node.ts", "../src/dev.ts", "../bin/hypen.ts"],
4
+ "sourcesContent": [
5
+ "/**\n * Zero-Config Development Server\n *\n * Simple API for starting a Hypen development server.\n *\n * Usage:\n * import { dev } from \"@hypen-space/cli/dev\";\n *\n * await dev({\n * components: \"./src/components\",\n * entry: \"App\",\n * });\n */\n\nimport { join, resolve } from \"path\";\nimport { existsSync, readFileSync, writeFileSync, mkdirSync } from \"fs\";\nimport {\n discoverComponents,\n watchComponents,\n generateComponentsCode,\n type DiscoveredComponent,\n} from \"@hypen-space/core/discovery\";\n\nexport interface DevOptions {\n /**\n * Path to components directory\n */\n components: string;\n\n /**\n * Entry component name (e.g., \"App\")\n */\n entry: string;\n\n /**\n * Development server port\n * Default: 3000\n */\n port?: number;\n\n /**\n * Enable hot module reloading\n * Default: true\n */\n hot?: boolean;\n\n /**\n * Enable debug logging\n * Default: false\n */\n debug?: boolean;\n\n /**\n * Custom HTML template path\n */\n htmlTemplate?: string;\n\n /**\n * Output directory for generated files\n * Default: \".hypen\"\n */\n outDir?: string;\n\n /**\n * Callback when server starts\n */\n onStart?: (url: string) => void;\n\n /**\n * Callback when components change\n */\n onComponentsChange?: (components: DiscoveredComponent[]) => void;\n}\n\nexport interface BuildOptions {\n /**\n * Path to components directory\n */\n components: string;\n\n /**\n * Entry component name\n */\n entry: string;\n\n /**\n * Output directory\n * Default: \"dist\"\n */\n outDir?: string;\n\n /**\n * Enable minification\n * Default: true\n */\n minify?: boolean;\n\n /**\n * Enable source maps\n * Default: false\n */\n sourcemap?: boolean;\n}\n\n/**\n * Default HTML template for development\n */\nfunction getDefaultHtmlTemplate(entry: string): string {\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Hypen App</title>\n <style>\n * { margin: 0; padding: 0; box-sizing: border-box; }\n body { font-family: system-ui, -apple-system, sans-serif; }\n </style>\n</head>\n<body>\n <div id=\"app\"></div>\n <script type=\"module\" src=\"/__hypen__/main.js\"></script>\n</body>\n</html>\n`;\n}\n\n/**\n * Generate the main entry file\n */\nfunction generateMainEntry(\n entry: string,\n componentsPath: string,\n debug: boolean\n): string {\n return `/**\n * Auto-generated Hypen entry point\n */\nimport { renderWithComponents } from \"@hypen-space/core\";\nimport * as components from \"${componentsPath}\";\n\nconst app = await renderWithComponents(\n components,\n \"${entry}\",\n \"#app\",\n { debug: ${debug} }\n);\n\n// Hot reload support\nif (import.meta.hot) {\n import.meta.hot.accept();\n}\n\nexport default app;\n`;\n}\n\n/**\n * Start a development server\n */\nexport async function dev(options: DevOptions): Promise<{\n url: string;\n stop: () => void;\n}> {\n const {\n components: componentsDir,\n entry,\n port = 3000,\n hot = true,\n debug = false,\n htmlTemplate,\n outDir = \".hypen\",\n onStart,\n onComponentsChange,\n } = options;\n\n const log = debug\n ? (...args: unknown[]) => console.log(\"[hypen:dev]\", ...args)\n : () => {};\n\n const resolvedComponentsDir = resolve(componentsDir);\n const resolvedOutDir = resolve(outDir);\n\n // Ensure output directory exists\n if (!existsSync(resolvedOutDir)) {\n mkdirSync(resolvedOutDir, { recursive: true });\n }\n\n log(\"Components directory:\", resolvedComponentsDir);\n log(\"Output directory:\", resolvedOutDir);\n\n // Generate initial components\n const generateComponents = async () => {\n log(\"Generating components...\");\n const code = await generateComponentsCode(resolvedComponentsDir, { debug });\n const componentsPath = join(resolvedOutDir, \"components.generated.ts\");\n writeFileSync(componentsPath, code);\n log(\"Generated:\", componentsPath);\n return componentsPath;\n };\n\n // Generate main entry\n const generateMain = (componentsPath: string) => {\n log(\"Generating main entry...\");\n const code = generateMainEntry(entry, componentsPath, debug);\n const mainPath = join(resolvedOutDir, \"main.ts\");\n writeFileSync(mainPath, code);\n log(\"Generated:\", mainPath);\n return mainPath;\n };\n\n // Initial generation\n const componentsPath = await generateComponents();\n const mainPath = generateMain(componentsPath);\n\n // Watch for changes\n let watcher: { stop: () => void } | null = null;\n\n if (hot) {\n watcher = watchComponents(resolvedComponentsDir, {\n debug,\n onChange: async (components) => {\n log(\"Components changed, regenerating...\");\n await generateComponents();\n onComponentsChange?.(components);\n },\n });\n }\n\n // Get HTML template\n const html = htmlTemplate\n ? readFileSync(htmlTemplate, \"utf-8\")\n : getDefaultHtmlTemplate(entry);\n\n // Create Bun server\n const server = Bun.serve({\n port,\n async fetch(req) {\n const url = new URL(req.url);\n const pathname = url.pathname;\n\n log(\"Request:\", pathname);\n\n // Serve HTML for root\n if (pathname === \"/\" || pathname === \"/index.html\") {\n return new Response(html, {\n headers: { \"Content-Type\": \"text/html\" },\n });\n }\n\n // Serve generated files\n if (pathname.startsWith(\"/__hypen__/\")) {\n const fileName = pathname.replace(\"/__hypen__/\", \"\");\n const filePath = join(resolvedOutDir, fileName.replace(/\\.js$/, \".ts\"));\n\n if (existsSync(filePath)) {\n // Transpile TypeScript on-the-fly\n const transpiler = new Bun.Transpiler({ loader: \"ts\" });\n const code = readFileSync(filePath, \"utf-8\");\n const js = transpiler.transformSync(code);\n\n return new Response(js, {\n headers: { \"Content-Type\": \"application/javascript\" },\n });\n }\n }\n\n // Serve static files from components directory\n if (pathname.endsWith(\".ts\") || pathname.endsWith(\".js\")) {\n // Try to resolve from components directory\n const possiblePaths = [\n join(resolvedComponentsDir, pathname),\n join(process.cwd(), pathname.slice(1)),\n ];\n\n for (const filePath of possiblePaths) {\n if (existsSync(filePath)) {\n const transpiler = new Bun.Transpiler({ loader: \"ts\" });\n const code = readFileSync(filePath, \"utf-8\");\n const js = transpiler.transformSync(code);\n\n return new Response(js, {\n headers: { \"Content-Type\": \"application/javascript\" },\n });\n }\n }\n }\n\n // 404\n return new Response(\"Not Found\", { status: 404 });\n },\n });\n\n const serverUrl = `http://localhost:${port}`;\n\n console.log(`\\n Hypen Dev Server\\n`);\n console.log(` Local: ${serverUrl}`);\n console.log(` Entry: ${entry}`);\n console.log(` Components: ${resolvedComponentsDir}\\n`);\n\n onStart?.(serverUrl);\n\n return {\n url: serverUrl,\n stop: () => {\n watcher?.stop();\n server.stop();\n },\n };\n}\n\n/**\n * Build for production\n */\nexport async function build(options: BuildOptions): Promise<void> {\n const {\n components: componentsDir,\n entry,\n outDir = \"dist\",\n minify = true,\n sourcemap = false,\n } = options;\n\n const resolvedComponentsDir = resolve(componentsDir);\n const resolvedOutDir = resolve(outDir);\n\n console.log(`\\n Hypen Build\\n`);\n console.log(` Entry: ${entry}`);\n console.log(` Components: ${resolvedComponentsDir}`);\n console.log(` Output: ${resolvedOutDir}\\n`);\n\n // Ensure output directory exists\n if (!existsSync(resolvedOutDir)) {\n mkdirSync(resolvedOutDir, { recursive: true });\n }\n\n // Generate components\n const code = await generateComponentsCode(resolvedComponentsDir);\n const tempDir = join(resolvedOutDir, \".temp\");\n\n if (!existsSync(tempDir)) {\n mkdirSync(tempDir, { recursive: true });\n }\n\n const componentsPath = join(tempDir, \"components.generated.ts\");\n writeFileSync(componentsPath, code);\n\n // Generate main entry\n const mainCode = generateMainEntry(entry, componentsPath, false);\n const mainPath = join(tempDir, \"main.ts\");\n writeFileSync(mainPath, mainCode);\n\n // Bundle with Bun\n const result = await Bun.build({\n entrypoints: [mainPath],\n outdir: resolvedOutDir,\n minify,\n sourcemap: sourcemap ? \"external\" : \"none\",\n target: \"browser\",\n format: \"esm\",\n });\n\n if (!result.success) {\n console.error(\"Build failed:\");\n for (const log of result.logs) {\n console.error(log);\n }\n process.exit(1);\n }\n\n // Generate HTML\n const html = getDefaultHtmlTemplate(entry).replace(\n \"/__hypen__/main.js\",\n \"./main.js\"\n );\n writeFileSync(join(resolvedOutDir, \"index.html\"), html);\n\n console.log(` Build complete!\\n`);\n console.log(` Files:`);\n for (const output of result.outputs) {\n console.log(` ${output.path}`);\n }\n console.log();\n}\n\n/**\n * Main hypen object for easy imports\n */\nexport const hypen = {\n dev,\n build,\n};\n\nexport default hypen;\n",
6
+ "/**\n * Node.js-compatible Development Server\n *\n * Uses http.createServer() and esbuild for Node.js environments.\n */\n\nimport { createServer, type IncomingMessage, type ServerResponse } from \"http\";\nimport { join, resolve, extname } from \"path\";\nimport { existsSync, readFileSync, writeFileSync, mkdirSync, watch } from \"fs\";\nimport {\n discoverComponents,\n generateComponentsCode,\n type DiscoveredComponent,\n} from \"@hypen-space/core/discovery\";\n\n// Lazy load esbuild to avoid issues if not installed\nlet esbuild: typeof import(\"esbuild\") | null = null;\n\nasync function getEsbuild() {\n if (!esbuild) {\n try {\n esbuild = await import(\"esbuild\");\n } catch {\n throw new Error(\n \"esbuild is required for Node.js support. Install it with: npm install esbuild\"\n );\n }\n }\n return esbuild;\n}\n\nexport interface DevOptions {\n components: string;\n entry: string;\n port?: number;\n hot?: boolean;\n debug?: boolean;\n htmlTemplate?: string;\n outDir?: string;\n onStart?: (url: string) => void;\n onComponentsChange?: (components: DiscoveredComponent[]) => void;\n}\n\nexport interface BuildOptions {\n components: string;\n entry: string;\n outDir?: string;\n minify?: boolean;\n sourcemap?: boolean;\n}\n\n/**\n * Default HTML template for development\n */\nfunction getDefaultHtmlTemplate(entry: string): string {\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Hypen App</title>\n <style>\n * { margin: 0; padding: 0; box-sizing: border-box; }\n body { font-family: system-ui, -apple-system, sans-serif; }\n </style>\n</head>\n<body>\n <div id=\"app\"></div>\n <script type=\"module\" src=\"/__hypen__/main.js\"></script>\n</body>\n</html>\n`;\n}\n\n/**\n * Generate the main entry file\n */\nfunction generateMainEntry(\n entry: string,\n componentsPath: string,\n debug: boolean\n): string {\n return `/**\n * Auto-generated Hypen entry point\n */\nimport { renderWithComponents } from \"@hypen-space/core\";\nimport * as components from \"${componentsPath}\";\n\nconst app = await renderWithComponents(\n components,\n \"${entry}\",\n \"#app\",\n { debug: ${debug} }\n);\n\n// Hot reload support\nif (import.meta.hot) {\n import.meta.hot.accept();\n}\n\nexport default app;\n`;\n}\n\n/**\n * MIME types for common file extensions\n */\nconst MIME_TYPES: Record<string, string> = {\n \".html\": \"text/html\",\n \".js\": \"application/javascript\",\n \".mjs\": \"application/javascript\",\n \".ts\": \"application/javascript\",\n \".css\": \"text/css\",\n \".json\": \"application/json\",\n \".wasm\": \"application/wasm\",\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".svg\": \"image/svg+xml\",\n};\n\n/**\n * Transpile TypeScript to JavaScript using esbuild\n */\nasync function transpileTS(code: string, filename: string): Promise<string> {\n const es = await getEsbuild();\n const result = await es.transform(code, {\n loader: \"ts\",\n sourcefile: filename,\n format: \"esm\",\n target: \"es2020\",\n });\n return result.code;\n}\n\n/**\n * Start a development server (Node.js version)\n */\nexport async function dev(options: DevOptions): Promise<{\n url: string;\n stop: () => void;\n}> {\n const {\n components: componentsDir,\n entry,\n port = 3000,\n hot = true,\n debug = false,\n htmlTemplate,\n outDir = \".hypen\",\n onStart,\n onComponentsChange,\n } = options;\n\n // Verify esbuild is available\n await getEsbuild();\n\n const log = debug\n ? (...args: unknown[]) => console.log(\"[hypen:dev]\", ...args)\n : () => {};\n\n const resolvedComponentsDir = resolve(componentsDir);\n const resolvedOutDir = resolve(outDir);\n\n // Ensure output directory exists\n if (!existsSync(resolvedOutDir)) {\n mkdirSync(resolvedOutDir, { recursive: true });\n }\n\n log(\"Components directory:\", resolvedComponentsDir);\n log(\"Output directory:\", resolvedOutDir);\n\n // Generate initial components\n const generateComponents = async () => {\n log(\"Generating components...\");\n const code = await generateComponentsCode(resolvedComponentsDir, { debug });\n const componentsPath = join(resolvedOutDir, \"components.generated.ts\");\n writeFileSync(componentsPath, code);\n log(\"Generated:\", componentsPath);\n return componentsPath;\n };\n\n // Generate main entry\n const generateMain = (componentsPath: string) => {\n log(\"Generating main entry...\");\n const code = generateMainEntry(entry, componentsPath, debug);\n const mainPath = join(resolvedOutDir, \"main.ts\");\n writeFileSync(mainPath, code);\n log(\"Generated:\", mainPath);\n return mainPath;\n };\n\n // Initial generation\n const componentsPath = await generateComponents();\n generateMain(componentsPath);\n\n // Watch for changes\n let watcher: ReturnType<typeof watch> | null = null;\n\n if (hot && existsSync(resolvedComponentsDir)) {\n watcher = watch(\n resolvedComponentsDir,\n { recursive: true },\n async (eventType, filename) => {\n if (\n filename &&\n (filename.endsWith(\".hypen\") || filename.endsWith(\".ts\"))\n ) {\n log(\"File changed:\", filename);\n await generateComponents();\n const components = await discoverComponents(resolvedComponentsDir);\n onComponentsChange?.(components);\n }\n }\n );\n }\n\n // Get HTML template\n const html = htmlTemplate\n ? readFileSync(htmlTemplate, \"utf-8\")\n : getDefaultHtmlTemplate(entry);\n\n // Create Node.js HTTP server\n const server = createServer(async (req: IncomingMessage, res: ServerResponse) => {\n const url = new URL(req.url || \"/\", `http://localhost:${port}`);\n const pathname = url.pathname;\n\n log(\"Request:\", pathname);\n\n try {\n // Serve HTML for root\n if (pathname === \"/\" || pathname === \"/index.html\") {\n res.writeHead(200, { \"Content-Type\": \"text/html\" });\n res.end(html);\n return;\n }\n\n // Serve generated files\n if (pathname.startsWith(\"/__hypen__/\")) {\n const fileName = pathname.replace(\"/__hypen__/\", \"\");\n const filePath = join(resolvedOutDir, fileName.replace(/\\.js$/, \".ts\"));\n\n if (existsSync(filePath)) {\n const code = readFileSync(filePath, \"utf-8\");\n const js = await transpileTS(code, filePath);\n\n res.writeHead(200, { \"Content-Type\": \"application/javascript\" });\n res.end(js);\n return;\n }\n }\n\n // Serve static files from components directory\n if (pathname.endsWith(\".ts\") || pathname.endsWith(\".js\")) {\n const possiblePaths = [\n join(resolvedComponentsDir, pathname),\n join(process.cwd(), pathname.slice(1)),\n ];\n\n for (const filePath of possiblePaths) {\n if (existsSync(filePath)) {\n const code = readFileSync(filePath, \"utf-8\");\n const js = await transpileTS(code, filePath);\n\n res.writeHead(200, { \"Content-Type\": \"application/javascript\" });\n res.end(js);\n return;\n }\n }\n }\n\n // Serve other static files\n const ext = extname(pathname);\n if (ext && MIME_TYPES[ext]) {\n const filePath = join(process.cwd(), pathname.slice(1));\n if (existsSync(filePath)) {\n const content = readFileSync(filePath);\n res.writeHead(200, { \"Content-Type\": MIME_TYPES[ext] });\n res.end(content);\n return;\n }\n }\n\n // 404\n res.writeHead(404, { \"Content-Type\": \"text/plain\" });\n res.end(\"Not Found\");\n } catch (error) {\n log(\"Error:\", error);\n res.writeHead(500, { \"Content-Type\": \"text/plain\" });\n res.end(`Server Error: ${error}`);\n }\n });\n\n server.listen(port);\n\n const serverUrl = `http://localhost:${port}`;\n\n console.log(`\\n Hypen Dev Server (Node.js)\\n`);\n console.log(` Local: ${serverUrl}`);\n console.log(` Entry: ${entry}`);\n console.log(` Components: ${resolvedComponentsDir}\\n`);\n\n onStart?.(serverUrl);\n\n return {\n url: serverUrl,\n stop: () => {\n watcher?.close();\n server.close();\n },\n };\n}\n\n/**\n * Build for production (Node.js version)\n */\nexport async function build(options: BuildOptions): Promise<void> {\n const {\n components: componentsDir,\n entry,\n outDir = \"dist\",\n minify = true,\n sourcemap = false,\n } = options;\n\n const es = await getEsbuild();\n const resolvedComponentsDir = resolve(componentsDir);\n const resolvedOutDir = resolve(outDir);\n\n console.log(`\\n Hypen Build (Node.js)\\n`);\n console.log(` Entry: ${entry}`);\n console.log(` Components: ${resolvedComponentsDir}`);\n console.log(` Output: ${resolvedOutDir}\\n`);\n\n // Ensure output directory exists\n if (!existsSync(resolvedOutDir)) {\n mkdirSync(resolvedOutDir, { recursive: true });\n }\n\n // Generate components\n const code = await generateComponentsCode(resolvedComponentsDir);\n const tempDir = join(resolvedOutDir, \".temp\");\n\n if (!existsSync(tempDir)) {\n mkdirSync(tempDir, { recursive: true });\n }\n\n const componentsPath = join(tempDir, \"components.generated.ts\");\n writeFileSync(componentsPath, code);\n\n // Generate main entry\n const mainCode = generateMainEntry(entry, componentsPath, false);\n const mainPath = join(tempDir, \"main.ts\");\n writeFileSync(mainPath, mainCode);\n\n // Bundle with esbuild\n try {\n await es.build({\n entryPoints: [mainPath],\n bundle: true,\n outdir: resolvedOutDir,\n minify,\n sourcemap,\n format: \"esm\",\n target: \"es2020\",\n platform: \"browser\",\n });\n } catch (error) {\n console.error(\"Build failed:\", error);\n process.exit(1);\n }\n\n // Generate HTML\n const html = getDefaultHtmlTemplate(entry).replace(\n \"/__hypen__/main.js\",\n \"./main.js\"\n );\n writeFileSync(join(resolvedOutDir, \"index.html\"), html);\n\n console.log(` Build complete!\\n`);\n console.log(` Files:`);\n console.log(` ${join(resolvedOutDir, \"main.js\")}`);\n console.log(` ${join(resolvedOutDir, \"index.html\")}`);\n console.log();\n}\n\n/**\n * Main hypen object for easy imports\n */\nexport const hypen = {\n dev,\n build,\n};\n\nexport default hypen;\n",
7
+ "/**\n * Unified Development Server\n *\n * Automatically detects runtime (Bun vs Node.js) and uses the appropriate implementation.\n *\n * Usage:\n * import { dev, build } from \"@hypen-space/cli/dev\";\n *\n * await dev({\n * components: \"./src/components\",\n * entry: \"App\",\n * });\n */\n\nimport type { DiscoveredComponent } from \"@hypen-space/core/discovery\";\n\nexport interface DevOptions {\n /**\n * Path to components directory\n */\n components: string;\n\n /**\n * Entry component name (e.g., \"App\")\n */\n entry: string;\n\n /**\n * Development server port\n * Default: 3000\n */\n port?: number;\n\n /**\n * Enable hot module reloading\n * Default: true\n */\n hot?: boolean;\n\n /**\n * Enable debug logging\n * Default: false\n */\n debug?: boolean;\n\n /**\n * Custom HTML template path\n */\n htmlTemplate?: string;\n\n /**\n * Output directory for generated files\n * Default: \".hypen\"\n */\n outDir?: string;\n\n /**\n * Callback when server starts\n */\n onStart?: (url: string) => void;\n\n /**\n * Callback when components change\n */\n onComponentsChange?: (components: DiscoveredComponent[]) => void;\n}\n\nexport interface BuildOptions {\n /**\n * Path to components directory\n */\n components: string;\n\n /**\n * Entry component name\n */\n entry: string;\n\n /**\n * Output directory\n * Default: \"dist\"\n */\n outDir?: string;\n\n /**\n * Enable minification\n * Default: true\n */\n minify?: boolean;\n\n /**\n * Enable source maps\n * Default: false\n */\n sourcemap?: boolean;\n}\n\n/**\n * Detect if running in Bun\n */\nfunction isBun(): boolean {\n return typeof globalThis.Bun !== \"undefined\";\n}\n\n/**\n * Get the appropriate implementation based on runtime\n */\nasync function getImplementation() {\n if (isBun()) {\n return import(\"./dev-bun.js\");\n } else {\n return import(\"./dev-node.js\");\n }\n}\n\n/**\n * Start a development server\n *\n * Automatically uses Bun.serve() in Bun or http.createServer() in Node.js\n */\nexport async function dev(options: DevOptions): Promise<{\n url: string;\n stop: () => void;\n}> {\n const impl = await getImplementation();\n return impl.dev(options);\n}\n\n/**\n * Build for production\n *\n * Automatically uses Bun.build() in Bun or esbuild in Node.js\n */\nexport async function build(options: BuildOptions): Promise<void> {\n const impl = await getImplementation();\n return impl.build(options);\n}\n\n/**\n * Main hypen object for easy imports\n */\nexport const hypen = {\n dev,\n build,\n};\n\nexport default hypen;\n",
8
+ "#!/usr/bin/env node\n/**\n * Hypen CLI\n *\n * Works with both Bun and Node.js runtimes.\n *\n * Commands:\n * hypen init [name] Initialize a new Hypen project\n * hypen dev Start development server\n * hypen build Build for production\n * hypen generate Generate component imports\n */\n\nimport { parseArgs } from \"util\";\nimport { existsSync, mkdirSync, writeFileSync } from \"fs\";\nimport { join, resolve } from \"path\";\n\n/**\n * Detect runtime\n */\nconst isBun = typeof globalThis.Bun !== \"undefined\";\n\nconst VERSION = \"0.2.12\";\n\nconst HELP = `\n hypen - Declarative UI framework CLI\n\n Usage:\n hypen <command> [options]\n\n Commands:\n init [name] Create a new Hypen project\n dev Start development server\n build Build for production\n generate Generate component imports\n\n Options:\n -h, --help Show this help message\n -v, --version Show version number\n\n Examples:\n hypen init my-app\n hypen dev --port 3000\n hypen build --minify\n`;\n\ninterface Config {\n components: string;\n entry: string;\n port?: number;\n outDir?: string;\n}\n\n/**\n * Load hypen.config.ts or use defaults\n */\nasync function loadConfig(): Promise<Config> {\n const configPath = resolve(\"hypen.config.ts\");\n\n if (existsSync(configPath)) {\n const config = await import(configPath);\n return config.default || config;\n }\n\n // Default config\n return {\n components: \"./src/components\",\n entry: \"App\",\n port: 3000,\n outDir: \"dist\",\n };\n}\n\n/**\n * Initialize a new project\n */\nasync function initProject(name?: string) {\n const projectDir = name ? resolve(name) : process.cwd();\n const projectName = name || \"hypen-app\";\n\n console.log(`\\n Creating Hypen project: ${projectName}\\n`);\n\n // Create directories\n const dirs = [\n projectDir,\n join(projectDir, \"src\"),\n join(projectDir, \"src/components\"),\n join(projectDir, \"src/components/App\"),\n ];\n\n for (const dir of dirs) {\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n console.log(` Created: ${dir}`);\n }\n }\n\n // Create package.json (works with both npm and bun)\n const packageJson = {\n name: projectName,\n version: \"0.1.0\",\n type: \"module\",\n scripts: {\n dev: \"hypen dev\",\n build: \"hypen build\",\n start: \"node dist/main.js\",\n },\n dependencies: {\n \"@hypen-space/core\": \"^0.2.12\",\n \"@hypen-space/web\": \"^0.2.12\",\n },\n devDependencies: {\n \"@hypen-space/cli\": \"^0.2.12\",\n esbuild: \"^0.20.0\",\n typescript: \"^5.0.0\",\n },\n };\n\n writeFileSync(\n join(projectDir, \"package.json\"),\n JSON.stringify(packageJson, null, 2)\n );\n console.log(` Created: package.json`);\n\n // Create hypen.config.ts\n const configTs = `/**\n * Hypen configuration\n */\nexport default {\n components: \"./src/components\",\n entry: \"App\",\n port: 3000,\n outDir: \"dist\",\n};\n`;\n\n writeFileSync(join(projectDir, \"hypen.config.ts\"), configTs);\n console.log(` Created: hypen.config.ts`);\n\n // Create tsconfig.json\n const tsConfig = {\n compilerOptions: {\n target: \"ESNext\",\n module: \"ESNext\",\n moduleResolution: \"bundler\",\n strict: true,\n esModuleInterop: true,\n skipLibCheck: true,\n noEmit: true,\n },\n include: [\"src/**/*\", \"hypen.config.ts\"],\n };\n\n writeFileSync(\n join(projectDir, \"tsconfig.json\"),\n JSON.stringify(tsConfig, null, 2)\n );\n console.log(` Created: tsconfig.json`);\n\n // Create App component\n const appModule = `import { app } from \"@hypen-space/core\";\n\ntype AppState = {\n count: number;\n};\n\nexport default app\n .defineState<AppState>({ count: 0 })\n .onAction(\"increment\", ({ state }) => {\n state.count++;\n })\n .onAction(\"decrement\", ({ state }) => {\n state.count--;\n })\n .build();\n`;\n\n writeFileSync(join(projectDir, \"src/components/App/component.ts\"), appModule);\n console.log(` Created: src/components/App/component.ts`);\n\n const appTemplate = `module App {\n Column {\n Text(\"Hypen Counter\")\n .fontSize(24)\n .fontWeight(\"bold\")\n .color(\"#333\")\n\n Text(\"Count: \\${state.count}\")\n .fontSize(48)\n .fontWeight(\"bold\")\n .color(\"#007bff\")\n\n Row {\n Button {\n Text(\"-\")\n }\n .onClick(\"@actions.decrement\")\n .padding(16)\n .fontSize(24)\n\n Button {\n Text(\"+\")\n }\n .onClick(\"@actions.increment\")\n .padding(16)\n .fontSize(24)\n }\n .gap(16)\n }\n .padding(32)\n .gap(24)\n .alignItems(\"center\")\n}\n`;\n\n writeFileSync(\n join(projectDir, \"src/components/App/component.hypen\"),\n appTemplate\n );\n console.log(` Created: src/components/App/component.hypen`);\n\n const pm = isBun ? \"bun\" : \"npm\";\n console.log(`\n Done! To get started:\n\n ${name ? `cd ${name}` : \"\"}\n ${pm} install\n ${pm} run dev\n\n`);\n}\n\n/**\n * Start development server\n */\nasync function devServer(options: { port?: number; debug?: boolean }) {\n const config = await loadConfig();\n const { dev } = await import(\"../src/dev.js\");\n\n await dev({\n components: config.components,\n entry: config.entry,\n port: options.port || config.port || 3000,\n debug: options.debug || false,\n hot: true,\n });\n}\n\n/**\n * Build for production\n */\nasync function buildProject(options: {\n outDir?: string;\n minify?: boolean;\n sourcemap?: boolean;\n}) {\n const config = await loadConfig();\n const { build } = await import(\"../src/dev.js\");\n\n await build({\n components: config.components,\n entry: config.entry,\n outDir: options.outDir || config.outDir || \"dist\",\n minify: options.minify ?? true,\n sourcemap: options.sourcemap ?? false,\n });\n}\n\n/**\n * Generate component imports\n */\nasync function generateComponents() {\n const config = await loadConfig();\n const { generateComponentsCode } = await import(\n \"@hypen-space/core/discovery\"\n );\n\n const code = await generateComponentsCode(config.components);\n const outputPath = resolve(\".hypen/components.generated.ts\");\n\n const outputDir = resolve(\".hypen\");\n if (!existsSync(outputDir)) {\n mkdirSync(outputDir, { recursive: true });\n }\n\n writeFileSync(outputPath, code);\n console.log(`\\n Generated: ${outputPath}\\n`);\n}\n\n// Parse command line arguments\nconst { values, positionals } = parseArgs({\n args: process.argv.slice(2),\n options: {\n help: { type: \"boolean\", short: \"h\" },\n version: { type: \"boolean\", short: \"v\" },\n port: { type: \"string\", short: \"p\" },\n debug: { type: \"boolean\", short: \"d\" },\n outDir: { type: \"string\", short: \"o\" },\n minify: { type: \"boolean\", short: \"m\" },\n sourcemap: { type: \"boolean\", short: \"s\" },\n },\n allowPositionals: true,\n});\n\n// Handle global flags\nif (values.help) {\n console.log(HELP);\n process.exit(0);\n}\n\nif (values.version) {\n console.log(`hypen v${VERSION}`);\n process.exit(0);\n}\n\n// Execute command\nconst command = positionals[0];\n\nswitch (command) {\n case \"init\":\n await initProject(positionals[1]);\n break;\n\n case \"dev\":\n await devServer({\n port: values.port ? parseInt(values.port) : undefined,\n debug: values.debug,\n });\n break;\n\n case \"build\":\n await buildProject({\n outDir: values.outDir,\n minify: values.minify,\n sourcemap: values.sourcemap,\n });\n break;\n\n case \"generate\":\n await generateComponents();\n break;\n\n default:\n if (command) {\n console.error(`\\n Unknown command: ${command}\\n`);\n }\n console.log(HELP);\n process.exit(command ? 1 : 0);\n}\n"
9
+ ],
10
+ "mappings": "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",
11
+ "debugId": "262C8CA5981C00C264756E2164756E21",
12
+ "names": []
13
+ }
@@ -0,0 +1,266 @@
1
+ import { createRequire } from "node:module";
2
+ var __create = Object.create;
3
+ var __getProtoOf = Object.getPrototypeOf;
4
+ var __defProp = Object.defineProperty;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __toESM = (mod, isNodeMode, target) => {
8
+ target = mod != null ? __create(__getProtoOf(mod)) : {};
9
+ const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
10
+ for (let key of __getOwnPropNames(mod))
11
+ if (!__hasOwnProp.call(to, key))
12
+ __defProp(to, key, {
13
+ get: () => mod[key],
14
+ enumerable: true
15
+ });
16
+ return to;
17
+ };
18
+ var __export = (target, all) => {
19
+ for (var name in all)
20
+ __defProp(target, name, {
21
+ get: all[name],
22
+ enumerable: true,
23
+ configurable: true,
24
+ set: (newValue) => all[name] = () => newValue
25
+ });
26
+ };
27
+ var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
28
+ var __require = /* @__PURE__ */ createRequire(import.meta.url);
29
+
30
+ // src/dev-bun.ts
31
+ var exports_dev_bun = {};
32
+ __export(exports_dev_bun, {
33
+ hypen: () => hypen,
34
+ dev: () => dev,
35
+ default: () => dev_bun_default,
36
+ build: () => build
37
+ });
38
+ import { join, resolve } from "path";
39
+ import { existsSync, readFileSync, writeFileSync, mkdirSync } from "fs";
40
+ import {
41
+ watchComponents,
42
+ generateComponentsCode
43
+ } from "@hypen-space/core/discovery";
44
+ function getDefaultHtmlTemplate(entry) {
45
+ return `<!DOCTYPE html>
46
+ <html lang="en">
47
+ <head>
48
+ <meta charset="UTF-8">
49
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
50
+ <title>Hypen App</title>
51
+ <style>
52
+ * { margin: 0; padding: 0; box-sizing: border-box; }
53
+ body { font-family: system-ui, -apple-system, sans-serif; }
54
+ </style>
55
+ </head>
56
+ <body>
57
+ <div id="app"></div>
58
+ <script type="module" src="/__hypen__/main.js"></script>
59
+ </body>
60
+ </html>
61
+ `;
62
+ }
63
+ function generateMainEntry(entry, componentsPath, debug) {
64
+ return `/**
65
+ * Auto-generated Hypen entry point
66
+ */
67
+ import { renderWithComponents } from "@hypen-space/core";
68
+ import * as components from "${componentsPath}";
69
+
70
+ const app = await renderWithComponents(
71
+ components,
72
+ "${entry}",
73
+ "#app",
74
+ { debug: ${debug} }
75
+ );
76
+
77
+ // Hot reload support
78
+ if (import.meta.hot) {
79
+ import.meta.hot.accept();
80
+ }
81
+
82
+ export default app;
83
+ `;
84
+ }
85
+ async function dev(options) {
86
+ const {
87
+ components: componentsDir,
88
+ entry,
89
+ port = 3000,
90
+ hot = true,
91
+ debug = false,
92
+ htmlTemplate,
93
+ outDir = ".hypen",
94
+ onStart,
95
+ onComponentsChange
96
+ } = options;
97
+ const log = debug ? (...args) => console.log("[hypen:dev]", ...args) : () => {};
98
+ const resolvedComponentsDir = resolve(componentsDir);
99
+ const resolvedOutDir = resolve(outDir);
100
+ if (!existsSync(resolvedOutDir)) {
101
+ mkdirSync(resolvedOutDir, { recursive: true });
102
+ }
103
+ log("Components directory:", resolvedComponentsDir);
104
+ log("Output directory:", resolvedOutDir);
105
+ const generateComponents = async () => {
106
+ log("Generating components...");
107
+ const code = await generateComponentsCode(resolvedComponentsDir, { debug });
108
+ const componentsPath2 = join(resolvedOutDir, "components.generated.ts");
109
+ writeFileSync(componentsPath2, code);
110
+ log("Generated:", componentsPath2);
111
+ return componentsPath2;
112
+ };
113
+ const generateMain = (componentsPath2) => {
114
+ log("Generating main entry...");
115
+ const code = generateMainEntry(entry, componentsPath2, debug);
116
+ const mainPath2 = join(resolvedOutDir, "main.ts");
117
+ writeFileSync(mainPath2, code);
118
+ log("Generated:", mainPath2);
119
+ return mainPath2;
120
+ };
121
+ const componentsPath = await generateComponents();
122
+ const mainPath = generateMain(componentsPath);
123
+ let watcher = null;
124
+ if (hot) {
125
+ watcher = watchComponents(resolvedComponentsDir, {
126
+ debug,
127
+ onChange: async (components) => {
128
+ log("Components changed, regenerating...");
129
+ await generateComponents();
130
+ onComponentsChange?.(components);
131
+ }
132
+ });
133
+ }
134
+ const html = htmlTemplate ? readFileSync(htmlTemplate, "utf-8") : getDefaultHtmlTemplate(entry);
135
+ const server = Bun.serve({
136
+ port,
137
+ async fetch(req) {
138
+ const url = new URL(req.url);
139
+ const pathname = url.pathname;
140
+ log("Request:", pathname);
141
+ if (pathname === "/" || pathname === "/index.html") {
142
+ return new Response(html, {
143
+ headers: { "Content-Type": "text/html" }
144
+ });
145
+ }
146
+ if (pathname.startsWith("/__hypen__/")) {
147
+ const fileName = pathname.replace("/__hypen__/", "");
148
+ const filePath = join(resolvedOutDir, fileName.replace(/\.js$/, ".ts"));
149
+ if (existsSync(filePath)) {
150
+ const transpiler = new Bun.Transpiler({ loader: "ts" });
151
+ const code = readFileSync(filePath, "utf-8");
152
+ const js = transpiler.transformSync(code);
153
+ return new Response(js, {
154
+ headers: { "Content-Type": "application/javascript" }
155
+ });
156
+ }
157
+ }
158
+ if (pathname.endsWith(".ts") || pathname.endsWith(".js")) {
159
+ const possiblePaths = [
160
+ join(resolvedComponentsDir, pathname),
161
+ join(process.cwd(), pathname.slice(1))
162
+ ];
163
+ for (const filePath of possiblePaths) {
164
+ if (existsSync(filePath)) {
165
+ const transpiler = new Bun.Transpiler({ loader: "ts" });
166
+ const code = readFileSync(filePath, "utf-8");
167
+ const js = transpiler.transformSync(code);
168
+ return new Response(js, {
169
+ headers: { "Content-Type": "application/javascript" }
170
+ });
171
+ }
172
+ }
173
+ }
174
+ return new Response("Not Found", { status: 404 });
175
+ }
176
+ });
177
+ const serverUrl = `http://localhost:${port}`;
178
+ console.log(`
179
+ Hypen Dev Server
180
+ `);
181
+ console.log(` Local: ${serverUrl}`);
182
+ console.log(` Entry: ${entry}`);
183
+ console.log(` Components: ${resolvedComponentsDir}
184
+ `);
185
+ onStart?.(serverUrl);
186
+ return {
187
+ url: serverUrl,
188
+ stop: () => {
189
+ watcher?.stop();
190
+ server.stop();
191
+ }
192
+ };
193
+ }
194
+ async function build(options) {
195
+ const {
196
+ components: componentsDir,
197
+ entry,
198
+ outDir = "dist",
199
+ minify = true,
200
+ sourcemap = false
201
+ } = options;
202
+ const resolvedComponentsDir = resolve(componentsDir);
203
+ const resolvedOutDir = resolve(outDir);
204
+ console.log(`
205
+ Hypen Build
206
+ `);
207
+ console.log(` Entry: ${entry}`);
208
+ console.log(` Components: ${resolvedComponentsDir}`);
209
+ console.log(` Output: ${resolvedOutDir}
210
+ `);
211
+ if (!existsSync(resolvedOutDir)) {
212
+ mkdirSync(resolvedOutDir, { recursive: true });
213
+ }
214
+ const code = await generateComponentsCode(resolvedComponentsDir);
215
+ const tempDir = join(resolvedOutDir, ".temp");
216
+ if (!existsSync(tempDir)) {
217
+ mkdirSync(tempDir, { recursive: true });
218
+ }
219
+ const componentsPath = join(tempDir, "components.generated.ts");
220
+ writeFileSync(componentsPath, code);
221
+ const mainCode = generateMainEntry(entry, componentsPath, false);
222
+ const mainPath = join(tempDir, "main.ts");
223
+ writeFileSync(mainPath, mainCode);
224
+ const result = await Bun.build({
225
+ entrypoints: [mainPath],
226
+ outdir: resolvedOutDir,
227
+ minify,
228
+ sourcemap: sourcemap ? "external" : "none",
229
+ target: "browser",
230
+ format: "esm"
231
+ });
232
+ if (!result.success) {
233
+ console.error("Build failed:");
234
+ for (const log of result.logs) {
235
+ console.error(log);
236
+ }
237
+ process.exit(1);
238
+ }
239
+ const html = getDefaultHtmlTemplate(entry).replace("/__hypen__/main.js", "./main.js");
240
+ writeFileSync(join(resolvedOutDir, "index.html"), html);
241
+ console.log(` Build complete!
242
+ `);
243
+ console.log(` Files:`);
244
+ for (const output of result.outputs) {
245
+ console.log(` ${output.path}`);
246
+ }
247
+ console.log();
248
+ }
249
+ var hypen, dev_bun_default;
250
+ var init_dev_bun = __esm(() => {
251
+ hypen = {
252
+ dev,
253
+ build
254
+ };
255
+ dev_bun_default = hypen;
256
+ });
257
+ init_dev_bun();
258
+
259
+ export {
260
+ hypen,
261
+ dev,
262
+ dev_bun_default as default,
263
+ build
264
+ };
265
+
266
+ //# debugId=FC5FB7CE08C2B09464756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/dev-bun.ts"],
4
+ "sourcesContent": [
5
+ "/**\n * Zero-Config Development Server\n *\n * Simple API for starting a Hypen development server.\n *\n * Usage:\n * import { dev } from \"@hypen-space/cli/dev\";\n *\n * await dev({\n * components: \"./src/components\",\n * entry: \"App\",\n * });\n */\n\nimport { join, resolve } from \"path\";\nimport { existsSync, readFileSync, writeFileSync, mkdirSync } from \"fs\";\nimport {\n discoverComponents,\n watchComponents,\n generateComponentsCode,\n type DiscoveredComponent,\n} from \"@hypen-space/core/discovery\";\n\nexport interface DevOptions {\n /**\n * Path to components directory\n */\n components: string;\n\n /**\n * Entry component name (e.g., \"App\")\n */\n entry: string;\n\n /**\n * Development server port\n * Default: 3000\n */\n port?: number;\n\n /**\n * Enable hot module reloading\n * Default: true\n */\n hot?: boolean;\n\n /**\n * Enable debug logging\n * Default: false\n */\n debug?: boolean;\n\n /**\n * Custom HTML template path\n */\n htmlTemplate?: string;\n\n /**\n * Output directory for generated files\n * Default: \".hypen\"\n */\n outDir?: string;\n\n /**\n * Callback when server starts\n */\n onStart?: (url: string) => void;\n\n /**\n * Callback when components change\n */\n onComponentsChange?: (components: DiscoveredComponent[]) => void;\n}\n\nexport interface BuildOptions {\n /**\n * Path to components directory\n */\n components: string;\n\n /**\n * Entry component name\n */\n entry: string;\n\n /**\n * Output directory\n * Default: \"dist\"\n */\n outDir?: string;\n\n /**\n * Enable minification\n * Default: true\n */\n minify?: boolean;\n\n /**\n * Enable source maps\n * Default: false\n */\n sourcemap?: boolean;\n}\n\n/**\n * Default HTML template for development\n */\nfunction getDefaultHtmlTemplate(entry: string): string {\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Hypen App</title>\n <style>\n * { margin: 0; padding: 0; box-sizing: border-box; }\n body { font-family: system-ui, -apple-system, sans-serif; }\n </style>\n</head>\n<body>\n <div id=\"app\"></div>\n <script type=\"module\" src=\"/__hypen__/main.js\"></script>\n</body>\n</html>\n`;\n}\n\n/**\n * Generate the main entry file\n */\nfunction generateMainEntry(\n entry: string,\n componentsPath: string,\n debug: boolean\n): string {\n return `/**\n * Auto-generated Hypen entry point\n */\nimport { renderWithComponents } from \"@hypen-space/core\";\nimport * as components from \"${componentsPath}\";\n\nconst app = await renderWithComponents(\n components,\n \"${entry}\",\n \"#app\",\n { debug: ${debug} }\n);\n\n// Hot reload support\nif (import.meta.hot) {\n import.meta.hot.accept();\n}\n\nexport default app;\n`;\n}\n\n/**\n * Start a development server\n */\nexport async function dev(options: DevOptions): Promise<{\n url: string;\n stop: () => void;\n}> {\n const {\n components: componentsDir,\n entry,\n port = 3000,\n hot = true,\n debug = false,\n htmlTemplate,\n outDir = \".hypen\",\n onStart,\n onComponentsChange,\n } = options;\n\n const log = debug\n ? (...args: unknown[]) => console.log(\"[hypen:dev]\", ...args)\n : () => {};\n\n const resolvedComponentsDir = resolve(componentsDir);\n const resolvedOutDir = resolve(outDir);\n\n // Ensure output directory exists\n if (!existsSync(resolvedOutDir)) {\n mkdirSync(resolvedOutDir, { recursive: true });\n }\n\n log(\"Components directory:\", resolvedComponentsDir);\n log(\"Output directory:\", resolvedOutDir);\n\n // Generate initial components\n const generateComponents = async () => {\n log(\"Generating components...\");\n const code = await generateComponentsCode(resolvedComponentsDir, { debug });\n const componentsPath = join(resolvedOutDir, \"components.generated.ts\");\n writeFileSync(componentsPath, code);\n log(\"Generated:\", componentsPath);\n return componentsPath;\n };\n\n // Generate main entry\n const generateMain = (componentsPath: string) => {\n log(\"Generating main entry...\");\n const code = generateMainEntry(entry, componentsPath, debug);\n const mainPath = join(resolvedOutDir, \"main.ts\");\n writeFileSync(mainPath, code);\n log(\"Generated:\", mainPath);\n return mainPath;\n };\n\n // Initial generation\n const componentsPath = await generateComponents();\n const mainPath = generateMain(componentsPath);\n\n // Watch for changes\n let watcher: { stop: () => void } | null = null;\n\n if (hot) {\n watcher = watchComponents(resolvedComponentsDir, {\n debug,\n onChange: async (components) => {\n log(\"Components changed, regenerating...\");\n await generateComponents();\n onComponentsChange?.(components);\n },\n });\n }\n\n // Get HTML template\n const html = htmlTemplate\n ? readFileSync(htmlTemplate, \"utf-8\")\n : getDefaultHtmlTemplate(entry);\n\n // Create Bun server\n const server = Bun.serve({\n port,\n async fetch(req) {\n const url = new URL(req.url);\n const pathname = url.pathname;\n\n log(\"Request:\", pathname);\n\n // Serve HTML for root\n if (pathname === \"/\" || pathname === \"/index.html\") {\n return new Response(html, {\n headers: { \"Content-Type\": \"text/html\" },\n });\n }\n\n // Serve generated files\n if (pathname.startsWith(\"/__hypen__/\")) {\n const fileName = pathname.replace(\"/__hypen__/\", \"\");\n const filePath = join(resolvedOutDir, fileName.replace(/\\.js$/, \".ts\"));\n\n if (existsSync(filePath)) {\n // Transpile TypeScript on-the-fly\n const transpiler = new Bun.Transpiler({ loader: \"ts\" });\n const code = readFileSync(filePath, \"utf-8\");\n const js = transpiler.transformSync(code);\n\n return new Response(js, {\n headers: { \"Content-Type\": \"application/javascript\" },\n });\n }\n }\n\n // Serve static files from components directory\n if (pathname.endsWith(\".ts\") || pathname.endsWith(\".js\")) {\n // Try to resolve from components directory\n const possiblePaths = [\n join(resolvedComponentsDir, pathname),\n join(process.cwd(), pathname.slice(1)),\n ];\n\n for (const filePath of possiblePaths) {\n if (existsSync(filePath)) {\n const transpiler = new Bun.Transpiler({ loader: \"ts\" });\n const code = readFileSync(filePath, \"utf-8\");\n const js = transpiler.transformSync(code);\n\n return new Response(js, {\n headers: { \"Content-Type\": \"application/javascript\" },\n });\n }\n }\n }\n\n // 404\n return new Response(\"Not Found\", { status: 404 });\n },\n });\n\n const serverUrl = `http://localhost:${port}`;\n\n console.log(`\\n Hypen Dev Server\\n`);\n console.log(` Local: ${serverUrl}`);\n console.log(` Entry: ${entry}`);\n console.log(` Components: ${resolvedComponentsDir}\\n`);\n\n onStart?.(serverUrl);\n\n return {\n url: serverUrl,\n stop: () => {\n watcher?.stop();\n server.stop();\n },\n };\n}\n\n/**\n * Build for production\n */\nexport async function build(options: BuildOptions): Promise<void> {\n const {\n components: componentsDir,\n entry,\n outDir = \"dist\",\n minify = true,\n sourcemap = false,\n } = options;\n\n const resolvedComponentsDir = resolve(componentsDir);\n const resolvedOutDir = resolve(outDir);\n\n console.log(`\\n Hypen Build\\n`);\n console.log(` Entry: ${entry}`);\n console.log(` Components: ${resolvedComponentsDir}`);\n console.log(` Output: ${resolvedOutDir}\\n`);\n\n // Ensure output directory exists\n if (!existsSync(resolvedOutDir)) {\n mkdirSync(resolvedOutDir, { recursive: true });\n }\n\n // Generate components\n const code = await generateComponentsCode(resolvedComponentsDir);\n const tempDir = join(resolvedOutDir, \".temp\");\n\n if (!existsSync(tempDir)) {\n mkdirSync(tempDir, { recursive: true });\n }\n\n const componentsPath = join(tempDir, \"components.generated.ts\");\n writeFileSync(componentsPath, code);\n\n // Generate main entry\n const mainCode = generateMainEntry(entry, componentsPath, false);\n const mainPath = join(tempDir, \"main.ts\");\n writeFileSync(mainPath, mainCode);\n\n // Bundle with Bun\n const result = await Bun.build({\n entrypoints: [mainPath],\n outdir: resolvedOutDir,\n minify,\n sourcemap: sourcemap ? \"external\" : \"none\",\n target: \"browser\",\n format: \"esm\",\n });\n\n if (!result.success) {\n console.error(\"Build failed:\");\n for (const log of result.logs) {\n console.error(log);\n }\n process.exit(1);\n }\n\n // Generate HTML\n const html = getDefaultHtmlTemplate(entry).replace(\n \"/__hypen__/main.js\",\n \"./main.js\"\n );\n writeFileSync(join(resolvedOutDir, \"index.html\"), html);\n\n console.log(` Build complete!\\n`);\n console.log(` Files:`);\n for (const output of result.outputs) {\n console.log(` ${output.path}`);\n }\n console.log();\n}\n\n/**\n * Main hypen object for easy imports\n */\nexport const hypen = {\n dev,\n build,\n};\n\nexport default hypen;\n"
6
+ ],
7
+ "mappings": "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",
8
+ "debugId": "FC5FB7CE08C2B09464756E2164756E21",
9
+ "names": []
10
+ }