@hypen-space/core 0.4.1 → 0.4.3

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.
@@ -6,9 +6,9 @@
6
6
  "/**\n * Result Type for Error Handling\n *\n * A lightweight Result type for explicit error handling without exceptions.\n * Provides type-safe error propagation and composition.\n */\n\n/**\n * Represents either a successful value or an error\n */\nexport type Result<T, E = Error> =\n | { readonly ok: true; readonly value: T }\n | { readonly ok: false; readonly error: E };\n\n/**\n * Create a successful Result\n */\nexport function Ok<T>(value: T): Result<T, never> {\n return { ok: true, value };\n}\n\n/**\n * Create a failed Result\n */\nexport function Err<E>(error: E): Result<never, E> {\n return { ok: false, error };\n}\n\n/**\n * Check if a Result is Ok\n */\nexport function isOk<T, E>(result: Result<T, E>): result is { ok: true; value: T } {\n return result.ok;\n}\n\n/**\n * Check if a Result is Err\n */\nexport function isErr<T, E>(result: Result<T, E>): result is { ok: false; error: E } {\n return !result.ok;\n}\n\n/**\n * Wrap a Promise in a Result, catching any thrown errors\n */\nexport async function fromPromise<T, E = Error>(\n promise: Promise<T>,\n mapError?: (e: unknown) => E\n): Promise<Result<T, E>> {\n try {\n const value = await promise;\n return Ok(value);\n } catch (e) {\n if (mapError) {\n return Err(mapError(e));\n }\n return Err(e as E);\n }\n}\n\n/**\n * Wrap a synchronous function in a Result, catching any thrown errors\n */\nexport function fromTry<T, E = Error>(\n fn: () => T,\n mapError?: (e: unknown) => E\n): Result<T, E> {\n try {\n return Ok(fn());\n } catch (e) {\n if (mapError) {\n return Err(mapError(e));\n }\n return Err(e as E);\n }\n}\n\n/**\n * Map over a successful Result value\n */\nexport function map<T, U, E>(\n result: Result<T, E>,\n fn: (value: T) => U\n): Result<U, E> {\n if (result.ok) {\n return Ok(fn(result.value));\n }\n return result;\n}\n\n/**\n * Map over a failed Result error\n */\nexport function mapErr<T, E, F>(\n result: Result<T, E>,\n fn: (error: E) => F\n): Result<T, F> {\n if (!result.ok) {\n return Err(fn(result.error));\n }\n return result;\n}\n\n/**\n * Chain Results together (flatMap)\n */\nexport function flatMap<T, U, E>(\n result: Result<T, E>,\n fn: (value: T) => Result<U, E>\n): Result<U, E> {\n if (result.ok) {\n return fn(result.value);\n }\n return result;\n}\n\n/**\n * Unwrap a Result, throwing if it's an error\n */\nexport function unwrap<T, E>(result: Result<T, E>): T {\n if (result.ok) {\n return result.value;\n }\n throw result.error;\n}\n\n/**\n * Unwrap a Result with a default value\n */\nexport function unwrapOr<T, E>(result: Result<T, E>, defaultValue: T): T {\n if (result.ok) {\n return result.value;\n }\n return defaultValue;\n}\n\n/**\n * Unwrap a Result with a lazy default value\n */\nexport function unwrapOrElse<T, E>(result: Result<T, E>, fn: (error: E) => T): T {\n if (result.ok) {\n return result.value;\n }\n return fn(result.error);\n}\n\n/**\n * Match on a Result, providing handlers for both cases\n */\nexport function match<T, E, U>(\n result: Result<T, E>,\n handlers: {\n ok: (value: T) => U;\n err: (error: E) => U;\n }\n): U {\n if (result.ok) {\n return handlers.ok(result.value);\n }\n return handlers.err(result.error);\n}\n\n/**\n * Combine multiple Results into a single Result containing an array\n * Returns the first error encountered, or Ok with all values\n */\nexport function all<T, E>(results: Result<T, E>[]): Result<T[], E> {\n const values: T[] = [];\n for (const result of results) {\n if (!result.ok) {\n return result;\n }\n values.push(result.value);\n }\n return Ok(values);\n}\n\n/**\n * Base class for typed errors with context\n */\nexport class HypenError extends Error {\n readonly code: string;\n readonly context?: Record<string, unknown>;\n override readonly cause?: Error;\n\n constructor(\n code: string,\n message: string,\n options?: { context?: Record<string, unknown>; cause?: Error }\n ) {\n super(message);\n this.name = 'HypenError';\n this.code = code;\n this.context = options?.context;\n this.cause = options?.cause;\n\n // Maintain proper prototype chain\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/**\n * Error thrown when an action handler fails\n */\nexport class ActionError extends HypenError {\n readonly actionName: string;\n\n constructor(actionName: string, cause?: unknown) {\n super(\n 'ACTION_ERROR',\n `Action handler \"${actionName}\" failed: ${cause instanceof Error ? cause.message : String(cause)}`,\n {\n context: { actionName },\n cause: cause instanceof Error ? cause : undefined,\n }\n );\n this.name = 'ActionError';\n this.actionName = actionName;\n }\n}\n\n/**\n * Error thrown when a connection fails\n */\nexport class ConnectionError extends HypenError {\n readonly url: string;\n readonly attempt?: number;\n\n constructor(url: string, cause?: unknown, attempt?: number) {\n super(\n 'CONNECTION_ERROR',\n `Connection to \"${url}\" failed${attempt ? ` (attempt ${attempt})` : ''}: ${\n cause instanceof Error ? cause.message : String(cause)\n }`,\n {\n context: { url, attempt },\n cause: cause instanceof Error ? cause : undefined,\n }\n );\n this.name = 'ConnectionError';\n this.url = url;\n this.attempt = attempt;\n }\n}\n\n/**\n * Error thrown when state operations fail\n */\nexport class StateError extends HypenError {\n readonly path?: string;\n\n constructor(message: string, path?: string, cause?: unknown) {\n super('STATE_ERROR', message, {\n context: { path },\n cause: cause instanceof Error ? cause : undefined,\n });\n this.name = 'StateError';\n this.path = path;\n }\n}\n",
7
7
  "/**\n * Configurable Debug Logger\n *\n * Provides environment-aware logging that can be disabled in production.\n * Supports log levels, tagged output, and performance timing.\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\" | \"none\";\n\nexport interface LoggerConfig {\n /** Minimum log level (default: \"debug\" in dev, \"error\" in prod) */\n level: LogLevel;\n /** Enable colored output (default: true) */\n colors: boolean;\n /** Include timestamps (default: false) */\n timestamps: boolean;\n /** Custom log handler (default: console) */\n handler?: LogHandler;\n}\n\nexport interface LogHandler {\n debug(tag: string, ...args: unknown[]): void;\n info(tag: string, ...args: unknown[]): void;\n warn(tag: string, ...args: unknown[]): void;\n error(tag: string, ...args: unknown[]): void;\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nconst LOG_LEVEL_ORDER: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n none: 4,\n};\n\nconst LOG_LEVEL_COLORS: Record<Exclude<LogLevel, \"none\">, string> = {\n debug: \"\\x1b[36m\", // Cyan\n info: \"\\x1b[32m\", // Green\n warn: \"\\x1b[33m\", // Yellow\n error: \"\\x1b[31m\", // Red\n};\n\nconst RESET_COLOR = \"\\x1b[0m\";\n\n// ============================================================================\n// Global Configuration\n// ============================================================================\n\n/**\n * Detect if running in production environment\n */\nfunction isProduction(): boolean {\n if (typeof process !== \"undefined\" && process.env) {\n return process.env.NODE_ENV === \"production\";\n }\n return false;\n}\n\n/**\n * Default configuration\n */\nlet config: LoggerConfig = {\n level: isProduction() ? \"error\" : \"debug\",\n colors: true,\n timestamps: false,\n};\n\n// ============================================================================\n// Configuration API\n// ============================================================================\n\n/**\n * Set the global log level\n */\nexport function setLogLevel(level: LogLevel): void {\n config.level = level;\n}\n\n/**\n * Get the current log level\n */\nexport function getLogLevel(): LogLevel {\n return config.level;\n}\n\n/**\n * Configure the logger\n */\nexport function configureLogger(options: Partial<LoggerConfig>): void {\n config = { ...config, ...options };\n}\n\n/**\n * Enable all logging (sets level to \"debug\")\n */\nexport function enableLogging(): void {\n config.level = \"debug\";\n}\n\n/**\n * Disable all logging (sets level to \"none\")\n */\nexport function disableLogging(): void {\n config.level = \"none\";\n}\n\n/**\n * Enable debug mode - alias for enableLogging()\n * Call this at app startup to see all debug logs\n *\n * @example\n * ```typescript\n * import { setDebugMode } from \"@hypen-space/core\";\n * setDebugMode(true);\n * ```\n */\nexport function setDebugMode(enabled: boolean): void {\n config.level = enabled ? \"debug\" : \"error\";\n}\n\n/**\n * Check if debug mode is enabled\n */\nexport function isDebugMode(): boolean {\n return config.level === \"debug\";\n}\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\nfunction shouldLog(level: LogLevel): boolean {\n return LOG_LEVEL_ORDER[level] >= LOG_LEVEL_ORDER[config.level];\n}\n\nfunction formatTag(tag: string, level: LogLevel): string {\n const timestamp = config.timestamps ? `${new Date().toISOString()} ` : \"\";\n\n if (config.colors && level !== \"none\") {\n const color = LOG_LEVEL_COLORS[level as Exclude<LogLevel, \"none\">];\n return `${timestamp}${color}[${tag}]${RESET_COLOR}`;\n }\n\n return `${timestamp}[${tag}]`;\n}\n\n// ============================================================================\n// Logger Class\n// ============================================================================\n\n/**\n * Tagged logger instance\n *\n * @example\n * ```typescript\n * const log = createLogger(\"MyComponent\");\n * log.debug(\"initialized with\", { props });\n * log.error(\"failed to load\", error);\n * ```\n */\nexport class Logger {\n private readonly tag: string;\n\n constructor(tag: string) {\n this.tag = tag;\n }\n\n debug(...args: unknown[]): void {\n if (!shouldLog(\"debug\")) return;\n\n if (config.handler) {\n config.handler.debug(this.tag, ...args);\n } else {\n console.log(formatTag(this.tag, \"debug\"), ...args);\n }\n }\n\n info(...args: unknown[]): void {\n if (!shouldLog(\"info\")) return;\n\n if (config.handler) {\n config.handler.info(this.tag, ...args);\n } else {\n console.info(formatTag(this.tag, \"info\"), ...args);\n }\n }\n\n warn(...args: unknown[]): void {\n if (!shouldLog(\"warn\")) return;\n\n if (config.handler) {\n config.handler.warn(this.tag, ...args);\n } else {\n console.warn(formatTag(this.tag, \"warn\"), ...args);\n }\n }\n\n error(...args: unknown[]): void {\n if (!shouldLog(\"error\")) return;\n\n if (config.handler) {\n config.handler.error(this.tag, ...args);\n } else {\n console.error(formatTag(this.tag, \"error\"), ...args);\n }\n }\n\n /**\n * Time a function execution\n */\n time<T>(label: string, fn: () => T): T {\n if (!shouldLog(\"debug\")) {\n return fn();\n }\n\n const start = performance.now();\n try {\n return fn();\n } finally {\n const duration = performance.now() - start;\n this.debug(`${label}: ${duration.toFixed(2)}ms`);\n }\n }\n\n /**\n * Time an async function execution\n */\n async timeAsync<T>(label: string, fn: () => Promise<T>): Promise<T> {\n if (!shouldLog(\"debug\")) {\n return fn();\n }\n\n const start = performance.now();\n try {\n return await fn();\n } finally {\n const duration = performance.now() - start;\n this.debug(`${label}: ${duration.toFixed(2)}ms`);\n }\n }\n\n /**\n * Create a child logger with additional context\n */\n child(subTag: string): Logger {\n return new Logger(`${this.tag}:${subTag}`);\n }\n\n /**\n * Conditionally log based on a condition\n */\n debugIf(condition: boolean, ...args: unknown[]): void {\n if (condition) this.debug(...args);\n }\n\n warnIf(condition: boolean, ...args: unknown[]): void {\n if (condition) this.warn(...args);\n }\n\n errorIf(condition: boolean, ...args: unknown[]): void {\n if (condition) this.error(...args);\n }\n\n /**\n * Log once (useful for deprecation warnings)\n */\n private loggedOnce = new Set<string>();\n\n warnOnce(key: string, ...args: unknown[]): void {\n if (this.loggedOnce.has(key)) return;\n this.loggedOnce.add(key);\n this.warn(...args);\n }\n\n debugOnce(key: string, ...args: unknown[]): void {\n if (this.loggedOnce.has(key)) return;\n this.loggedOnce.add(key);\n this.debug(...args);\n }\n}\n\n// ============================================================================\n// Factory Functions\n// ============================================================================\n\n/**\n * Create a tagged logger\n *\n * @example\n * ```typescript\n * const log = createLogger(\"Router\");\n * log.info(\"navigating to\", path);\n * ```\n */\nexport function createLogger(tag: string): Logger {\n return new Logger(tag);\n}\n\n// ============================================================================\n// Default Logger Instance\n// ============================================================================\n\n/**\n * Default logger for general use\n */\nexport const logger = createLogger(\"Hypen\");\n\n// ============================================================================\n// Shorthand Functions (untagged)\n// ============================================================================\n\n/**\n * Shorthand logging functions for quick use\n * Prefer createLogger() for component-specific logging\n */\nexport const log = {\n debug: (tag: string, ...args: unknown[]): void => {\n if (!shouldLog(\"debug\")) return;\n console.log(formatTag(tag, \"debug\"), ...args);\n },\n\n info: (tag: string, ...args: unknown[]): void => {\n if (!shouldLog(\"info\")) return;\n console.info(formatTag(tag, \"info\"), ...args);\n },\n\n warn: (tag: string, ...args: unknown[]): void => {\n if (!shouldLog(\"warn\")) return;\n console.warn(formatTag(tag, \"warn\"), ...args);\n },\n\n error: (tag: string, ...args: unknown[]): void => {\n if (!shouldLog(\"error\")) return;\n console.error(formatTag(tag, \"error\"), ...args);\n },\n};\n\n// ============================================================================\n// Predefined Loggers for Framework Components\n// ============================================================================\n\nexport const frameworkLoggers = {\n hypen: createLogger(\"Hypen\"),\n engine: createLogger(\"Engine\"),\n router: createLogger(\"Router\"),\n state: createLogger(\"State\"),\n events: createLogger(\"Events\"),\n remote: createLogger(\"Remote\"),\n renderer: createLogger(\"Renderer\"),\n module: createLogger(\"Module\"),\n lifecycle: createLogger(\"Lifecycle\"),\n loader: createLogger(\"Loader\"),\n context: createLogger(\"Context\"),\n discovery: createLogger(\"Discovery\"),\n plugin: createLogger(\"Plugin\"),\n canvas: createLogger(\"Canvas\"),\n debug: createLogger(\"Debug\"),\n};\n",
8
8
  "/**\n * Hypen App Builder API\n * Implements the stateful module system from RFC-0001\n */\n\nimport type { Action } from \"./types.js\";\nimport type { Session } from \"./remote/types.js\";\nimport { type Result, Ok, Err, fromPromise, ActionError, HypenError } from \"./result.js\";\n\n// Interface for engine compatibility (works with both engine.js and engine.browser.js)\nexport interface IEngine {\n setModule(name: string, actions: string[], stateKeys: string[], initialState: unknown): void;\n onAction(actionName: string, handler: (action: Action) => void | Promise<void>): void;\n notifyStateChange(paths: string[], changedValues: Record<string, unknown>): void;\n}\n\nimport { createObservableState, type StateChange, getStateSnapshot } from \"./state.js\";\nimport type { HypenRouter } from \"./router.js\";\nimport type { HypenGlobalContext, ModuleReference } from \"./context.js\";\nimport { createLogger } from \"./logger.js\";\n\nconst log = createLogger(\"ModuleInstance\");\n\nexport type RouterContext = {\n root: HypenRouter;\n current?: HypenRouter;\n parent?: HypenRouter;\n};\n\nexport type ActionContext = {\n name: string;\n payload?: unknown;\n sender?: string;\n};\n\nexport type ActionNext = {\n router: HypenRouter; // Direct access to router instance (from nearest parent)\n};\n\nexport type GlobalContext = {\n getModule: <T = unknown>(id: string) => ModuleReference<T>;\n hasModule: (id: string) => boolean;\n getModuleIds: () => string[];\n getGlobalState: () => Record<string, unknown>;\n emit: (event: string, payload?: unknown) => void;\n on: (event: string, handler: (payload?: unknown) => void) => () => void;\n __router?: unknown; // Internal: router instance for built-in Router component\n};\n\nexport type LifecycleHandler<T> = (\n state: T,\n context?: GlobalContext\n) => void | Promise<void>;\n\n/**\n * Action handler context - all parameters available explicitly\n */\nexport interface ActionHandlerContext<T> {\n action: ActionContext;\n state: T;\n next: ActionNext;\n context: GlobalContext;\n}\n\n/**\n * Action handler - receives all context in a single object\n */\nexport type ActionHandler<T> = (ctx: ActionHandlerContext<T>) => void | Promise<void>;\n\n/**\n * Context passed to onDisconnect handler\n */\nexport interface DisconnectContext<T> {\n /** Current state snapshot (ready to serialize and save) */\n state: T;\n /** Session information */\n session: Session;\n}\n\n/**\n * Context passed to onReconnect handler\n */\nexport interface ReconnectContext<T> {\n /** Session information */\n session: Session;\n /** Call this with saved state to restore it */\n restore: (savedState: T) => void;\n}\n\n/**\n * Context passed to onExpire handler\n */\nexport interface ExpireContext {\n /** Session information */\n session: Session;\n}\n\n/**\n * Handler called when client disconnects (session still alive for TTL)\n */\nexport type DisconnectHandler<T> = (ctx: DisconnectContext<T>) => void | Promise<void>;\n\n/**\n * Handler called when client reconnects with existing session\n */\nexport type ReconnectHandler<T> = (ctx: ReconnectContext<T>) => void | Promise<void>;\n\n/**\n * Handler called when session TTL expires (client never reconnected)\n */\nexport type ExpireHandler = (ctx: ExpireContext) => void | Promise<void>;\n\n/**\n * Context passed to onError handler\n */\nexport interface ErrorContext<T> {\n /** The error that occurred */\n error: HypenError;\n /** Current state (for inspection, not mutation during error handling) */\n state: T;\n /** The action name if error occurred in an action handler */\n actionName?: string;\n /** The lifecycle phase if error occurred in a lifecycle handler */\n lifecycle?: \"created\" | \"destroyed\" | \"disconnect\" | \"reconnect\" | \"expire\";\n}\n\n/**\n * Error handler return type - controls error propagation\n */\nexport type ErrorHandlerResult =\n | void // Continue with default behavior (log + emit)\n | { handled: true } // Error was handled, skip default behavior\n | { retry: true } // Retry the operation (only for actions)\n | { rethrow: true }; // Re-throw the error\n\n/**\n * Handler called when an error occurs in the module\n */\nexport type ErrorHandler<T> = (ctx: ErrorContext<T>) => ErrorHandlerResult | Promise<ErrorHandlerResult>;\n\nexport interface HypenModuleDefinition<T = unknown> {\n name?: string;\n actions: string[];\n stateKeys: string[];\n persist?: boolean;\n version?: number;\n initialState: T;\n /**\n * Inline UI template for single-file components.\n * Set via the `.ui(hypen`...`)` method.\n */\n template?: string;\n handlers: {\n onCreated?: LifecycleHandler<T>;\n onAction: Map<string, ActionHandler<T>>;\n onDestroyed?: LifecycleHandler<T>;\n /** Called when client disconnects (session persists for TTL) */\n onDisconnect?: DisconnectHandler<T>;\n /** Called when client reconnects with existing session */\n onReconnect?: ReconnectHandler<T>;\n /** Called when session TTL expires */\n onExpire?: ExpireHandler;\n /** Called when any error occurs in the module */\n onError?: ErrorHandler<T>;\n };\n}\n\n/**\n * Alias for HypenModuleDefinition for backward compatibility\n */\nexport type HypenModule<T = unknown> = HypenModuleDefinition<T>;\n\n/**\n * Builder for creating Hypen app modules\n */\nexport class HypenAppBuilder<T> {\n private initialState: T;\n private options: { persist?: boolean; version?: number; name?: string };\n private createdHandler?: LifecycleHandler<T>;\n private actionHandlers: Map<string, ActionHandler<T>> = new Map();\n private destroyedHandler?: LifecycleHandler<T>;\n private disconnectHandler?: DisconnectHandler<T>;\n private reconnectHandler?: ReconnectHandler<T>;\n private expireHandler?: ExpireHandler;\n private errorHandler?: ErrorHandler<T>;\n private template?: string;\n\n constructor(\n initialState: T,\n options?: { persist?: boolean; version?: number; name?: string }\n ) {\n this.initialState = initialState;\n this.options = options || {};\n }\n\n /**\n * Register a handler for module creation\n */\n onCreated(fn: LifecycleHandler<T>): this {\n this.createdHandler = fn;\n return this;\n }\n\n /**\n * Register a handler for a specific action\n */\n onAction(name: string, fn: ActionHandler<T>): this {\n this.actionHandlers.set(name, fn);\n return this;\n }\n\n /**\n * Register a handler for module destruction\n */\n onDestroyed(fn: LifecycleHandler<T>): this {\n this.destroyedHandler = fn;\n return this;\n }\n\n /**\n * Register a handler for client disconnection\n * Called when client disconnects; session persists for TTL\n * Use this to save state for later restoration\n */\n onDisconnect(fn: DisconnectHandler<T>): this {\n this.disconnectHandler = fn;\n return this;\n }\n\n /**\n * Register a handler for session reconnection\n * Called when client reconnects with an existing session ID\n * Use restore() to hydrate state from saved data\n */\n onReconnect(fn: ReconnectHandler<T>): this {\n this.reconnectHandler = fn;\n return this;\n }\n\n /**\n * Register a handler for session expiration\n * Called when TTL expires and client never reconnected\n * Use this to clean up stored state\n */\n onExpire(fn: ExpireHandler): this {\n this.expireHandler = fn;\n return this;\n }\n\n /**\n * Register an error handler for the module\n * Called when any error occurs in action handlers or lifecycle hooks\n *\n * @example\n * ```typescript\n * app\n * .defineState({ count: 0 })\n * .onAction(\"increment\", ({ state }) => {\n * if (state.count > 100) throw new Error(\"Count too high\");\n * state.count += 1;\n * })\n * .onError(({ error, actionName, state }) => {\n * console.error(`Error in ${actionName}:`, error.message);\n * // Optionally recover\n * if (error.message.includes(\"too high\")) {\n * return { handled: true }; // Don't propagate\n * }\n * // Or retry\n * // return { retry: true };\n * })\n * .build();\n * ```\n *\n * @param fn - Error handler function\n * @returns Builder for chaining\n */\n onError(fn: ErrorHandler<T>): this {\n this.errorHandler = fn;\n return this;\n }\n\n /**\n * Define the component's UI template inline (single-file component).\n *\n * Use with the `hypen` tagged template literal and binding proxies:\n *\n * @example\n * ```typescript\n * import { app, hypen, state } from \"@hypen-space/core\";\n *\n * export default app\n * .defineState({ count: 0 })\n * .onAction(\"increment\", ({ state }) => {\n * state.count += 1;\n * })\n * .ui(hypen`\n * Column {\n * Text(\"Count: ${state.count}\")\n * Button { Text(\"+\") }\n * .onClick(\"@actions.increment\")\n * }\n * `);\n * ```\n *\n * @param template - The Hypen DSL template string\n * @returns The built module definition (calls build() internally)\n */\n ui(template: string): HypenModuleDefinition<T> {\n this.template = template;\n return this.build();\n }\n\n /**\n * Build the module definition\n */\n build(): HypenModuleDefinition<T> {\n // Safe way to get keys from initialState\n const stateKeys = this.initialState !== null && typeof this.initialState === 'object'\n ? Object.keys(this.initialState)\n : [];\n\n return {\n name: this.options.name,\n actions: Array.from(this.actionHandlers.keys()),\n stateKeys,\n persist: this.options.persist,\n version: this.options.version,\n initialState: this.initialState,\n template: this.template,\n handlers: {\n onCreated: this.createdHandler,\n onAction: this.actionHandlers,\n onDestroyed: this.destroyedHandler,\n onDisconnect: this.disconnectHandler,\n onReconnect: this.reconnectHandler,\n onExpire: this.expireHandler,\n onError: this.errorHandler,\n },\n };\n }\n}\n\n/**\n * Hypen App API\n */\nexport class HypenApp {\n /**\n * Define the initial state for a module\n */\n defineState<T>(\n initial: T,\n options?: { persist?: boolean; version?: number; name?: string }\n ): HypenAppBuilder<T> {\n return new HypenAppBuilder(initial, options);\n }\n}\n\n/**\n * The main app instance for creating modules\n */\nexport const app = new HypenApp();\n\n/**\n * Module Instance - manages a running module with typed state\n */\nexport class HypenModuleInstance<T extends object = any> {\n private engine: IEngine;\n private definition: HypenModuleDefinition<T>;\n private state: T;\n private isDestroyed = false;\n private routerContext?: RouterContext;\n private globalContext?: HypenGlobalContext;\n private stateChangeCallbacks: Array<() => void> = [];\n\n constructor(\n engine: IEngine,\n definition: HypenModuleDefinition<T>,\n routerContext?: RouterContext,\n globalContext?: HypenGlobalContext\n ) {\n this.engine = engine;\n this.definition = definition;\n this.routerContext = routerContext;\n this.globalContext = globalContext;\n\n // Named state prefix — all lowercase per convention\n const statePrefix = (definition.name || \"\").toLowerCase();\n\n // Create observable state that sends only changed paths and values to engine\n // When a prefix is set, all paths are namespaced (e.g., \"homepage.count\")\n this.state = createObservableState<T>(definition.initialState as T & object, {\n onChange: (change: StateChange) => {\n // Send only the changed paths and their new values (not the whole state)\n this.engine.notifyStateChange(change.paths, change.newValues);\n // Notify all registered callbacks\n this.stateChangeCallbacks.forEach(cb => cb());\n },\n pathPrefix: statePrefix || undefined,\n });\n\n // Register with engine (initial state registration)\n // When prefixed, nest the state under the module name so the engine sees\n // e.g., { homepage: { count: 0 } } instead of { count: 0 }\n const snapshot = getStateSnapshot(this.state);\n const prefixedState = statePrefix\n ? { [statePrefix]: snapshot }\n : snapshot;\n\n this.engine.setModule(\n definition.name || \"AnonymousModule\",\n definition.actions,\n definition.stateKeys,\n prefixedState\n );\n\n // Register action handlers with flexible parameter support\n for (const [actionName, handler] of definition.handlers.onAction) {\n log.debug(`Registering action handler: ${actionName} for module ${definition.name}`);\n this.engine.onAction(actionName, async (action: Action) => {\n log.debug(`Action handler fired: ${actionName}`, action);\n\n const actionCtx: ActionContext = {\n name: action.name,\n payload: action.payload,\n sender: action.sender,\n };\n\n const next: ActionNext = {\n router: this.routerContext?.root || (null as any),\n };\n\n const context: GlobalContext | undefined = this.globalContext\n ? this.createGlobalContextAPI()\n : undefined;\n\n // Use Result type for error handling\n const result = await this.executeAction(actionName, handler, {\n action: actionCtx,\n state: this.state,\n next,\n context: context!,\n });\n\n if (!result.ok) {\n const shouldRethrow = await this.handleError(result.error, { actionName });\n if (shouldRethrow) {\n throw result.error;\n }\n } else {\n log.debug(`Action handler completed: ${actionName}`);\n }\n });\n }\n\n // Call onCreated\n this.callCreatedHandler();\n }\n\n /**\n * Create the global context API for this module\n */\n private createGlobalContextAPI(): GlobalContext {\n if (!this.globalContext) {\n throw new Error(\"Global context not available\");\n }\n\n const ctx = this.globalContext;\n const api: GlobalContext = {\n getModule: (id: string) => ctx.getModule(id),\n hasModule: (id: string) => ctx.hasModule(id),\n getModuleIds: () => ctx.getModuleIds(),\n getGlobalState: () => ctx.getGlobalState(),\n emit: (event: string, payload?: any) => ctx.emit(event, payload),\n on: (event: string, handler: (payload?: any) => void) =>\n ctx.on(event, handler),\n };\n\n // Expose router and hypen engine for built-in components (if available)\n if ((ctx as any).__router) {\n api.__router = (ctx as any).__router;\n }\n if ((ctx as any).__hypenEngine) {\n (api as any).__hypenEngine = (ctx as any).__hypenEngine;\n }\n\n return api;\n }\n\n /**\n * Execute an action handler with Result-based error handling\n * Handles both synchronous throws and async rejections\n */\n private async executeAction(\n actionName: string,\n handler: ActionHandler<T>,\n ctx: ActionHandlerContext<T>\n ): Promise<Result<void, ActionError>> {\n try {\n // Wrap in try-catch to handle synchronous throws\n const result = handler(ctx);\n // Await in case handler returns a promise\n await result;\n return Ok(undefined);\n } catch (e) {\n return Err(new ActionError(actionName, e));\n }\n }\n\n /**\n * Handle an error with module-level error handler support\n * Falls back to default behavior (emit + log) if no handler or handler doesn't suppress\n * @returns true if the error should be rethrown\n */\n private async handleError(\n error: HypenError,\n context: { actionName?: string; lifecycle?: ErrorContext<T>[\"lifecycle\"] }\n ): Promise<boolean> {\n const errorCtx: ErrorContext<T> = {\n error,\n state: this.state,\n actionName: context.actionName,\n lifecycle: context.lifecycle,\n };\n\n // Call module-level error handler if defined\n if (this.definition.handlers.onError) {\n try {\n const result = await this.definition.handlers.onError(errorCtx);\n\n // Check if error was handled\n if (result && typeof result === \"object\") {\n if (\"handled\" in result && result.handled) {\n // Error was handled, skip default behavior\n return false;\n }\n if (\"rethrow\" in result && result.rethrow) {\n // Signal caller to rethrow\n return true;\n }\n // Note: 'retry' would need to be handled at the action execution level\n // For now, we just continue with default behavior\n }\n } catch (handlerError) {\n // Error in error handler - log and continue with default behavior\n log.error(\"Error in onError handler:\", handlerError);\n }\n }\n\n // Default behavior: emit to global context and log\n if (this.globalContext) {\n const eventContext = context.actionName\n ? `action:${context.actionName}`\n : context.lifecycle\n ? `lifecycle:${context.lifecycle}`\n : \"unknown\";\n\n this.globalContext.emit(\"error\", {\n message: error.message,\n error,\n context: eventContext,\n });\n }\n\n log.error(\n `${context.actionName ? `Action \"${context.actionName}\"` : `Lifecycle \"${context.lifecycle}\"`} error:`,\n error\n );\n\n return false;\n }\n\n /**\n * Call the onCreated handler\n */\n private async callCreatedHandler(): Promise<void> {\n if (this.definition.handlers.onCreated) {\n const context = this.globalContext ? this.createGlobalContextAPI() : undefined;\n await this.definition.handlers.onCreated(this.state, context);\n }\n }\n\n /**\n * Register a callback to be notified when state changes\n */\n onStateChange(callback: () => void): void {\n this.stateChangeCallbacks.push(callback);\n }\n\n /**\n * Destroy the module instance\n */\n async destroy(): Promise<void> {\n if (this.isDestroyed) return;\n\n if (this.definition.handlers.onDestroyed) {\n await this.definition.handlers.onDestroyed(this.state);\n }\n\n this.isDestroyed = true;\n }\n\n /**\n * Get the current state (returns a snapshot)\n */\n getState(): T {\n return getStateSnapshot(this.state);\n }\n\n /**\n * Get the live observable state\n */\n getLiveState(): T {\n return this.state;\n }\n\n /**\n * Update state directly (merges with existing state)\n */\n updateState(patch: Partial<T>): void {\n Object.assign(this.state, patch);\n }\n}\n",
9
- "/**\n * Component Discovery\n *\n * Automatically discovers Hypen components from the filesystem.\n *\n * Supports multiple conventions:\n * 1. Single-file: ComponentName.ts with .ui(hypen`...`) inline template\n * 2. Folder-based: ComponentName/component.ts + ComponentName/component.hypen\n * 3. Sibling files: ComponentName.ts + ComponentName.hypen\n * 4. Index-based: ComponentName/index.ts + ComponentName/index.hypen\n */\n\nimport { existsSync, readdirSync, readFileSync, watch } from \"fs\";\nimport { join, basename, resolve } from \"path\";\nimport type { HypenModuleDefinition } from \"./app.js\";\nimport { frameworkLoggers } from \"./logger.js\";\n\nexport interface DiscoveredComponent {\n name: string;\n /** Path to .hypen file (null for single-file components with inline templates) */\n hypenPath: string | null;\n /** Path to .ts module file */\n modulePath: string | null;\n /** The UI template (from .hypen file or inline) */\n template: string;\n /** Whether this component has a module (state/actions) */\n hasModule: boolean;\n /** Whether this is a single-file component with inline template */\n isSingleFile: boolean;\n}\n\nexport interface DiscoveryOptions {\n /**\n * Which naming patterns to look for\n * Default: [\"single-file\", \"folder\", \"sibling\", \"index\"]\n *\n * - single-file: ComponentName.ts with .ui(hypen`...`) inline template\n * - folder: ComponentName/component.ts + ComponentName/component.hypen\n * - sibling: ComponentName.ts + ComponentName.hypen\n * - index: ComponentName/index.ts + ComponentName/index.hypen\n */\n patterns?: (\"single-file\" | \"folder\" | \"sibling\" | \"index\")[];\n\n /**\n * Recursively scan subdirectories\n * Default: false\n */\n recursive?: boolean;\n\n /**\n * Enable debug logging\n * Default: false\n */\n debug?: boolean;\n}\n\nexport interface WatchOptions extends DiscoveryOptions {\n /**\n * Callback when components change\n */\n onChange?: (components: DiscoveredComponent[]) => void;\n\n /**\n * Callback when a component is added\n */\n onAdd?: (component: DiscoveredComponent) => void;\n\n /**\n * Callback when a component is removed\n */\n onRemove?: (name: string) => void;\n\n /**\n * Callback when a component is updated\n */\n onUpdate?: (component: DiscoveredComponent) => void;\n}\n\n/**\n * Remove import statements from Hypen template\n */\nfunction removeImports(text: string): string {\n return text.replace(\n /import\\s+(?:\\{[^}]+\\}|\\w+)\\s+from\\s+[\"'][^\"']+[\"']\\s*/g,\n \"\"\n );\n}\n\n/**\n * Discover all Hypen components in a directory\n */\nexport async function discoverComponents(\n baseDir: string,\n options: DiscoveryOptions = {}\n): Promise<DiscoveredComponent[]> {\n const {\n patterns = [\"single-file\", \"folder\", \"sibling\", \"index\"],\n recursive = false,\n debug = false,\n } = options;\n\n const log = debug\n ? (...args: unknown[]) => frameworkLoggers.discovery.debug(...args)\n : () => {};\n\n const resolvedDir = resolve(baseDir);\n const components: DiscoveredComponent[] = [];\n const seen = new Set<string>();\n\n log(\"Scanning directory:\", resolvedDir);\n log(\"Patterns:\", patterns);\n\n // Helper to add a two-file component (.hypen + .ts)\n const addTwoFileComponent = (\n name: string,\n hypenPath: string,\n modulePath: string | null\n ) => {\n if (seen.has(name)) {\n log(`Skipping duplicate: ${name}`);\n return;\n }\n\n seen.add(name);\n const templateRaw = readFileSync(hypenPath, \"utf-8\");\n // Preserve import statements in templates — the engine now processes them\n // via parse_document() and resolves imports through the component resolver\n const template = templateRaw.trim();\n\n components.push({\n name,\n hypenPath,\n modulePath,\n template,\n hasModule: modulePath !== null,\n isSingleFile: false,\n });\n\n log(`Found: ${name} (two-file, ${modulePath ? \"with module\" : \"stateless\"})`);\n };\n\n // Helper to add a single-file component (.ts with inline template)\n const addSingleFileComponent = (\n name: string,\n modulePath: string,\n template: string\n ) => {\n if (seen.has(name)) {\n log(`Skipping duplicate: ${name}`);\n return;\n }\n\n seen.add(name);\n components.push({\n name,\n hypenPath: null,\n modulePath,\n template,\n hasModule: true,\n isSingleFile: true,\n });\n\n log(`Found: ${name} (single-file with inline template)`);\n };\n\n // Scan directory for folder-based components\n const scanForFolderComponents = (dir: string) => {\n if (!existsSync(dir)) return;\n\n const entries = readdirSync(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n\n const folderPath = join(dir, entry.name);\n const componentName = entry.name;\n\n // Check folder-based pattern: Name/component.hypen\n if (patterns.includes(\"folder\")) {\n const hypenPath = join(folderPath, \"component.hypen\");\n if (existsSync(hypenPath)) {\n const modulePath = join(folderPath, \"component.ts\");\n addTwoFileComponent(\n componentName,\n hypenPath,\n existsSync(modulePath) ? modulePath : null\n );\n continue;\n }\n }\n\n // Check index-based pattern: Name/index.hypen\n if (patterns.includes(\"index\")) {\n const hypenPath = join(folderPath, \"index.hypen\");\n if (existsSync(hypenPath)) {\n const modulePath = join(folderPath, \"index.ts\");\n addTwoFileComponent(\n componentName,\n hypenPath,\n existsSync(modulePath) ? modulePath : null\n );\n continue;\n }\n }\n\n // Recursive scan\n if (recursive) {\n scanForFolderComponents(folderPath);\n }\n }\n };\n\n // Scan for sibling file components (.ts + .hypen pairs)\n const scanForSiblingComponents = (dir: string) => {\n if (!existsSync(dir)) return;\n\n const entries = readdirSync(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (entry.isDirectory()) {\n if (recursive) {\n scanForSiblingComponents(join(dir, entry.name));\n }\n continue;\n }\n\n if (!entry.name.endsWith(\".hypen\")) continue;\n\n const hypenPath = join(dir, entry.name);\n const baseName = basename(entry.name, \".hypen\");\n\n // Skip component.hypen and index.hypen (handled by folder patterns)\n if (baseName === \"component\" || baseName === \"index\") continue;\n\n const modulePath = join(dir, `${baseName}.ts`);\n addTwoFileComponent(\n baseName,\n hypenPath,\n existsSync(modulePath) ? modulePath : null\n );\n }\n };\n\n // Scan for single-file components (.ts files with inline templates)\n const scanForSingleFileComponents = async (dir: string) => {\n if (!existsSync(dir)) return;\n\n const entries = readdirSync(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (entry.isDirectory()) {\n if (recursive) {\n await scanForSingleFileComponents(join(dir, entry.name));\n }\n continue;\n }\n\n // Only look at .ts files\n if (!entry.name.endsWith(\".ts\")) continue;\n\n // Skip files that are clearly not components\n if (entry.name.startsWith('.') || entry.name.includes('.test.') || entry.name.includes('.spec.')) continue;\n\n // Skip component.ts and index.ts (handled by folder patterns)\n const baseName = basename(entry.name, \".ts\");\n if (baseName === \"component\" || baseName === \"index\") continue;\n\n // Skip if there's a matching .hypen file (handled by sibling pattern)\n const hypenPath = join(dir, `${baseName}.hypen`);\n if (existsSync(hypenPath)) continue;\n\n // Check if this looks like a single-file component by looking for .ui( pattern\n const modulePath = join(dir, entry.name);\n const content = readFileSync(modulePath, \"utf-8\");\n\n // Quick heuristic: look for .ui( or .ui(hypen pattern\n if (content.includes(\".ui(\") || content.includes(\".ui(hypen\")) {\n // Try to import and check for template\n try {\n const moduleExport = await import(modulePath);\n const module = moduleExport.default as HypenModuleDefinition<any>;\n\n if (module && typeof module === \"object\" && module.template) {\n addSingleFileComponent(baseName, modulePath, module.template);\n }\n } catch (e) {\n // Failed to import, skip this file\n log(`Failed to import potential single-file component: ${entry.name}`, e);\n }\n }\n }\n };\n\n // Run scans based on patterns\n if (patterns.includes(\"folder\") || patterns.includes(\"index\")) {\n scanForFolderComponents(resolvedDir);\n }\n\n if (patterns.includes(\"sibling\")) {\n scanForSiblingComponents(resolvedDir);\n }\n\n if (patterns.includes(\"single-file\")) {\n await scanForSingleFileComponents(resolvedDir);\n }\n\n log(`Discovered ${components.length} components`);\n\n return components;\n}\n\n/**\n * Load discovered components into a map for use with Hypen\n */\nexport async function loadDiscoveredComponents(\n components: DiscoveredComponent[]\n): Promise<\n Map<\n string,\n {\n name: string;\n module: HypenModuleDefinition<any>;\n template: string;\n }\n >\n> {\n // Dynamically import app to avoid circular dependencies\n const { app } = await import(\"./app.js\");\n\n const loaded = new Map<\n string,\n {\n name: string;\n module: HypenModuleDefinition;\n template: string;\n }\n >();\n\n for (const component of components) {\n let module: HypenModuleDefinition<any>;\n let template = component.template;\n\n if (component.modulePath) {\n // Import the TypeScript module\n const moduleExport = await import(component.modulePath);\n module = moduleExport.default as HypenModuleDefinition<any>;\n\n // For single-file components, template is already in the module\n if (component.isSingleFile && module.template) {\n template = module.template;\n }\n } else {\n // Create a stateless module\n module = app.defineState({}).build();\n }\n\n loaded.set(component.name, {\n name: component.name,\n module,\n template,\n });\n }\n\n return loaded;\n}\n\n/**\n * Watch a directory for component changes\n */\nexport function watchComponents(\n baseDir: string,\n options: WatchOptions = {}\n): { stop: () => void } {\n const resolvedDir = resolve(baseDir);\n const {\n onChange,\n onAdd,\n onRemove,\n onUpdate,\n debug = false,\n ...discoveryOptions\n } = options;\n\n const log = debug\n ? (...args: unknown[]) => frameworkLoggers.discovery.debug(\"[watch]\", ...args)\n : () => {};\n\n let currentComponents = new Map<string, DiscoveredComponent>();\n let debounceTimer: ReturnType<typeof setTimeout> | null = null;\n\n // Initial scan\n const initialScan = async () => {\n const components = await discoverComponents(resolvedDir, discoveryOptions);\n currentComponents = new Map(components.map((c) => [c.name, c]));\n onChange?.(components);\n };\n\n // Debounced rescan\n const rescan = async () => {\n if (debounceTimer) {\n clearTimeout(debounceTimer);\n }\n\n debounceTimer = setTimeout(async () => {\n log(\"Rescanning...\");\n const newComponents = await discoverComponents(\n resolvedDir,\n discoveryOptions\n );\n const newMap = new Map(newComponents.map((c) => [c.name, c]));\n\n // Find added/removed/updated\n for (const [name, component] of newMap) {\n const existing = currentComponents.get(name);\n if (!existing) {\n log(\"Added:\", name);\n onAdd?.(component);\n } else if (\n existing.template !== component.template ||\n existing.modulePath !== component.modulePath\n ) {\n log(\"Updated:\", name);\n onUpdate?.(component);\n }\n }\n\n for (const name of currentComponents.keys()) {\n if (!newMap.has(name)) {\n log(\"Removed:\", name);\n onRemove?.(name);\n }\n }\n\n currentComponents = newMap;\n onChange?.(newComponents);\n }, 100);\n };\n\n // Start watching\n const watcher = watch(\n resolvedDir,\n { recursive: true },\n (event, filename) => {\n if (!filename) return;\n if (filename.endsWith(\".hypen\") || filename.endsWith(\".ts\")) {\n log(\"File changed:\", filename);\n rescan();\n }\n }\n );\n\n // Initial scan\n initialScan();\n\n return {\n stop: () => {\n watcher.close();\n if (debounceTimer) {\n clearTimeout(debounceTimer);\n }\n },\n };\n}\n\n/**\n * Generate a components object from discovered components\n * Useful for static imports / code generation\n */\nexport async function generateComponentsCode(\n baseDir: string,\n options: DiscoveryOptions = {}\n): Promise<string> {\n const components = await discoverComponents(baseDir, options);\n const resolvedDir = resolve(baseDir);\n\n let code = `/**\n * Auto-generated component imports\n * Generated by @hypen-space/core discovery\n */\n\n`;\n\n for (const component of components) {\n const relativePath = component.modulePath\n ? \"./\" +\n component.modulePath\n .replace(resolvedDir + \"/\", \"\")\n .replace(/\\.ts$/, \".js\")\n : null;\n\n if (relativePath) {\n code += `import ${component.name}Module from \"${relativePath}\";\\n`;\n }\n }\n\n code += `\\nimport { app } from \"@hypen-space/core\";\\n\\n`;\n\n for (const component of components) {\n if (component.isSingleFile) {\n // Single-file component: template is in the module itself\n code += `export const ${component.name} = {\n module: ${component.name}Module,\n template: ${component.name}Module.template,\n};\\n\\n`;\n } else if (component.hasModule) {\n // Two-file component with module\n const templateJson = JSON.stringify(component.template);\n code += `export const ${component.name} = {\n module: ${component.name}Module,\n template: ${templateJson},\n};\\n\\n`;\n } else {\n // Stateless two-file component\n const templateJson = JSON.stringify(component.template);\n code += `const ${component.name}Module = app.defineState({}).build();\nexport const ${component.name} = {\n module: ${component.name}Module,\n template: ${templateJson},\n};\\n\\n`;\n }\n }\n\n return code;\n}\n"
9
+ "/**\n * Component Discovery\n *\n * Automatically discovers Hypen components from the filesystem.\n *\n * Supports multiple conventions:\n * 1. Single-file: ComponentName.ts with .ui(hypen`...`) inline template\n * 2. Folder-based: ComponentName/component.ts + ComponentName/component.hypen\n * 3. Sibling files: ComponentName.ts + ComponentName.hypen\n * 4. Index-based: ComponentName/index.ts + ComponentName/index.hypen\n */\n\nimport { existsSync, readdirSync, readFileSync, watch } from \"fs\";\nimport { join, basename, resolve, relative } from \"path\";\nimport type { HypenModuleDefinition } from \"./app.js\";\nimport { frameworkLoggers } from \"./logger.js\";\n\nexport interface DiscoveredComponent {\n name: string;\n /** Path to .hypen file (null for single-file components with inline templates) */\n hypenPath: string | null;\n /** Path to .ts module file */\n modulePath: string | null;\n /** The UI template (from .hypen file or inline) */\n template: string;\n /** Whether this component has a module (state/actions) */\n hasModule: boolean;\n /** Whether this is a single-file component with inline template */\n isSingleFile: boolean;\n}\n\nexport interface DiscoveryOptions {\n /**\n * Which naming patterns to look for\n * Default: [\"single-file\", \"folder\", \"sibling\", \"index\"]\n *\n * - single-file: ComponentName.ts with .ui(hypen`...`) inline template\n * - folder: ComponentName/component.ts + ComponentName/component.hypen\n * - sibling: ComponentName.ts + ComponentName.hypen\n * - index: ComponentName/index.ts + ComponentName/index.hypen\n */\n patterns?: (\"single-file\" | \"folder\" | \"sibling\" | \"index\")[];\n\n /**\n * Recursively scan subdirectories\n * Default: false\n */\n recursive?: boolean;\n\n /**\n * Enable debug logging\n * Default: false\n */\n debug?: boolean;\n}\n\nexport interface WatchOptions extends DiscoveryOptions {\n /**\n * Callback when components change\n */\n onChange?: (components: DiscoveredComponent[]) => void;\n\n /**\n * Callback when a component is added\n */\n onAdd?: (component: DiscoveredComponent) => void;\n\n /**\n * Callback when a component is removed\n */\n onRemove?: (name: string) => void;\n\n /**\n * Callback when a component is updated\n */\n onUpdate?: (component: DiscoveredComponent) => void;\n}\n\n/**\n * Remove import statements from Hypen template\n */\nfunction removeImports(text: string): string {\n return text.replace(\n /import\\s+(?:\\{[^}]+\\}|\\w+)\\s+from\\s+[\"'][^\"']+[\"']\\s*/g,\n \"\"\n );\n}\n\n/**\n * Discover all Hypen components in a directory\n */\nexport async function discoverComponents(\n baseDir: string,\n options: DiscoveryOptions = {}\n): Promise<DiscoveredComponent[]> {\n const {\n patterns = [\"single-file\", \"folder\", \"sibling\", \"index\"],\n recursive = false,\n debug = false,\n } = options;\n\n const log = debug\n ? (...args: unknown[]) => frameworkLoggers.discovery.debug(...args)\n : () => {};\n\n const resolvedDir = resolve(baseDir);\n const components: DiscoveredComponent[] = [];\n const seen = new Set<string>();\n\n log(\"Scanning directory:\", resolvedDir);\n log(\"Patterns:\", patterns);\n\n // Helper to add a two-file component (.hypen + .ts)\n const addTwoFileComponent = (\n name: string,\n hypenPath: string,\n modulePath: string | null\n ) => {\n if (seen.has(name)) {\n log(`Skipping duplicate: ${name}`);\n return;\n }\n\n seen.add(name);\n const templateRaw = readFileSync(hypenPath, \"utf-8\");\n // Preserve import statements in templates — the engine now processes them\n // via parse_document() and resolves imports through the component resolver\n const template = templateRaw.trim();\n\n components.push({\n name,\n hypenPath,\n modulePath,\n template,\n hasModule: modulePath !== null,\n isSingleFile: false,\n });\n\n log(`Found: ${name} (two-file, ${modulePath ? \"with module\" : \"stateless\"})`);\n };\n\n // Helper to add a single-file component (.ts with inline template)\n const addSingleFileComponent = (\n name: string,\n modulePath: string,\n template: string\n ) => {\n if (seen.has(name)) {\n log(`Skipping duplicate: ${name}`);\n return;\n }\n\n seen.add(name);\n components.push({\n name,\n hypenPath: null,\n modulePath,\n template,\n hasModule: true,\n isSingleFile: true,\n });\n\n log(`Found: ${name} (single-file with inline template)`);\n };\n\n // Scan directory for folder-based components\n const scanForFolderComponents = (dir: string) => {\n if (!existsSync(dir)) return;\n\n const entries = readdirSync(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n\n const folderPath = join(dir, entry.name);\n const componentName = entry.name;\n\n // Check folder-based pattern: Name/component.hypen\n if (patterns.includes(\"folder\")) {\n const hypenPath = join(folderPath, \"component.hypen\");\n if (existsSync(hypenPath)) {\n const modulePath = join(folderPath, \"component.ts\");\n addTwoFileComponent(\n componentName,\n hypenPath,\n existsSync(modulePath) ? modulePath : null\n );\n continue;\n }\n }\n\n // Check index-based pattern: Name/index.hypen\n if (patterns.includes(\"index\")) {\n const hypenPath = join(folderPath, \"index.hypen\");\n if (existsSync(hypenPath)) {\n const modulePath = join(folderPath, \"index.ts\");\n addTwoFileComponent(\n componentName,\n hypenPath,\n existsSync(modulePath) ? modulePath : null\n );\n continue;\n }\n }\n\n // Recursive scan\n if (recursive) {\n scanForFolderComponents(folderPath);\n }\n }\n };\n\n // Scan for sibling file components (.ts + .hypen pairs)\n const scanForSiblingComponents = (dir: string) => {\n if (!existsSync(dir)) return;\n\n const entries = readdirSync(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (entry.isDirectory()) {\n if (recursive) {\n scanForSiblingComponents(join(dir, entry.name));\n }\n continue;\n }\n\n if (!entry.name.endsWith(\".hypen\")) continue;\n\n const hypenPath = join(dir, entry.name);\n const baseName = basename(entry.name, \".hypen\");\n\n // Skip component.hypen and index.hypen (handled by folder patterns)\n if (baseName === \"component\" || baseName === \"index\") continue;\n\n const modulePath = join(dir, `${baseName}.ts`);\n addTwoFileComponent(\n baseName,\n hypenPath,\n existsSync(modulePath) ? modulePath : null\n );\n }\n };\n\n // Scan for single-file components (.ts files with inline templates)\n const scanForSingleFileComponents = async (dir: string) => {\n if (!existsSync(dir)) return;\n\n const entries = readdirSync(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (entry.isDirectory()) {\n if (recursive) {\n await scanForSingleFileComponents(join(dir, entry.name));\n }\n continue;\n }\n\n // Only look at .ts files\n if (!entry.name.endsWith(\".ts\")) continue;\n\n // Skip files that are clearly not components\n if (entry.name.startsWith('.') || entry.name.includes('.test.') || entry.name.includes('.spec.')) continue;\n\n // Skip component.ts and index.ts (handled by folder patterns)\n const baseName = basename(entry.name, \".ts\");\n if (baseName === \"component\" || baseName === \"index\") continue;\n\n // Skip if there's a matching .hypen file (handled by sibling pattern)\n const hypenPath = join(dir, `${baseName}.hypen`);\n if (existsSync(hypenPath)) continue;\n\n // Check if this looks like a single-file component by looking for .ui( pattern\n const modulePath = join(dir, entry.name);\n const content = readFileSync(modulePath, \"utf-8\");\n\n // Quick heuristic: look for .ui( or .ui(hypen pattern\n if (content.includes(\".ui(\") || content.includes(\".ui(hypen\")) {\n // Try to import and check for template\n try {\n const moduleExport = await import(modulePath);\n const module = moduleExport.default as HypenModuleDefinition<any>;\n\n if (module && typeof module === \"object\" && module.template) {\n addSingleFileComponent(baseName, modulePath, module.template);\n }\n } catch (e) {\n // Failed to import, skip this file\n log(`Failed to import potential single-file component: ${entry.name}`, e);\n }\n }\n }\n };\n\n // Run scans based on patterns\n if (patterns.includes(\"folder\") || patterns.includes(\"index\")) {\n scanForFolderComponents(resolvedDir);\n }\n\n if (patterns.includes(\"sibling\")) {\n scanForSiblingComponents(resolvedDir);\n }\n\n if (patterns.includes(\"single-file\")) {\n await scanForSingleFileComponents(resolvedDir);\n }\n\n log(`Discovered ${components.length} components`);\n\n return components;\n}\n\n/**\n * Load discovered components into a map for use with Hypen\n */\nexport async function loadDiscoveredComponents(\n components: DiscoveredComponent[]\n): Promise<\n Map<\n string,\n {\n name: string;\n module: HypenModuleDefinition<any>;\n template: string;\n }\n >\n> {\n // Dynamically import app to avoid circular dependencies\n const { app } = await import(\"./app.js\");\n\n const loaded = new Map<\n string,\n {\n name: string;\n module: HypenModuleDefinition;\n template: string;\n }\n >();\n\n for (const component of components) {\n let module: HypenModuleDefinition<any>;\n let template = component.template;\n\n if (component.modulePath) {\n // Import the TypeScript module\n const moduleExport = await import(component.modulePath);\n module = moduleExport.default as HypenModuleDefinition<any>;\n\n // For single-file components, template is already in the module\n if (component.isSingleFile && module.template) {\n template = module.template;\n }\n } else {\n // Create a stateless module\n module = app.defineState({}).build();\n }\n\n loaded.set(component.name, {\n name: component.name,\n module,\n template,\n });\n }\n\n return loaded;\n}\n\n/**\n * Watch a directory for component changes\n */\nexport function watchComponents(\n baseDir: string,\n options: WatchOptions = {}\n): { stop: () => void } {\n const resolvedDir = resolve(baseDir);\n const {\n onChange,\n onAdd,\n onRemove,\n onUpdate,\n debug = false,\n ...discoveryOptions\n } = options;\n\n const log = debug\n ? (...args: unknown[]) => frameworkLoggers.discovery.debug(\"[watch]\", ...args)\n : () => {};\n\n let currentComponents = new Map<string, DiscoveredComponent>();\n let debounceTimer: ReturnType<typeof setTimeout> | null = null;\n\n // Initial scan\n const initialScan = async () => {\n const components = await discoverComponents(resolvedDir, discoveryOptions);\n currentComponents = new Map(components.map((c) => [c.name, c]));\n onChange?.(components);\n };\n\n // Debounced rescan\n const rescan = async () => {\n if (debounceTimer) {\n clearTimeout(debounceTimer);\n }\n\n debounceTimer = setTimeout(async () => {\n log(\"Rescanning...\");\n const newComponents = await discoverComponents(\n resolvedDir,\n discoveryOptions\n );\n const newMap = new Map(newComponents.map((c) => [c.name, c]));\n\n // Find added/removed/updated\n for (const [name, component] of newMap) {\n const existing = currentComponents.get(name);\n if (!existing) {\n log(\"Added:\", name);\n onAdd?.(component);\n } else if (\n existing.template !== component.template ||\n existing.modulePath !== component.modulePath\n ) {\n log(\"Updated:\", name);\n onUpdate?.(component);\n }\n }\n\n for (const name of currentComponents.keys()) {\n if (!newMap.has(name)) {\n log(\"Removed:\", name);\n onRemove?.(name);\n }\n }\n\n currentComponents = newMap;\n onChange?.(newComponents);\n }, 100);\n };\n\n // Start watching\n const watcher = watch(\n resolvedDir,\n { recursive: true },\n (event, filename) => {\n if (!filename) return;\n if (filename.endsWith(\".hypen\") || filename.endsWith(\".ts\")) {\n log(\"File changed:\", filename);\n rescan();\n }\n }\n );\n\n // Initial scan\n initialScan();\n\n return {\n stop: () => {\n watcher.close();\n if (debounceTimer) {\n clearTimeout(debounceTimer);\n }\n },\n };\n}\n\n/**\n * Generate a components object from discovered components\n * Useful for static imports / code generation\n */\nexport async function generateComponentsCode(\n baseDir: string,\n options: DiscoveryOptions & { outputDir?: string } = {}\n): Promise<string> {\n const components = await discoverComponents(baseDir, options);\n const resolvedDir = resolve(baseDir);\n const outputBase = options.outputDir ? resolve(options.outputDir) : resolvedDir;\n\n let code = `/**\n * Auto-generated component imports\n * Generated by @hypen-space/core discovery\n */\n\n`;\n\n for (const component of components) {\n let importPath: string | null = null;\n if (component.modulePath) {\n const rel = relative(outputBase, component.modulePath)\n .replace(/\\.ts$/, \".js\");\n importPath = rel.startsWith(\".\") ? rel : \"./\" + rel;\n }\n\n if (importPath) {\n code += `import ${component.name}Module from \"${importPath}\";\\n`;\n }\n }\n\n code += `\\nimport { app } from \"@hypen-space/core\";\\n\\n`;\n\n for (const component of components) {\n if (component.isSingleFile) {\n // Single-file component: template is in the module itself\n code += `export const ${component.name} = {\n module: ${component.name}Module,\n template: ${component.name}Module.template,\n};\\n\\n`;\n } else if (component.hasModule) {\n // Two-file component with module\n const templateJson = JSON.stringify(component.template);\n code += `export const ${component.name} = {\n module: ${component.name}Module,\n template: ${templateJson},\n};\\n\\n`;\n } else {\n // Stateless two-file component\n const templateJson = JSON.stringify(component.template);\n code += `const ${component.name}Module = app.defineState({}).build();\nexport const ${component.name} = {\n module: ${component.name}Module,\n template: ${templateJson},\n};\\n\\n`;\n }\n }\n\n return code;\n}\n"
10
10
  ],
11
- "mappings": "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",
12
- "debugId": "DEF834620FC1CE5864756E2164756E21",
11
+ "mappings": "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",
12
+ "debugId": "85977D1E65CCBA9B64756E2164756E21",
13
13
  "names": []
14
14
  }
@@ -0,0 +1,122 @@
1
+ /**
2
+ * Disposable Pattern for Resource Management
3
+ *
4
+ * Provides a consistent way to manage and clean up resources like
5
+ * event listeners, timers, WebSocket connections, etc.
6
+ */
7
+ /**
8
+ * Interface for objects that can be disposed
9
+ */
10
+ export interface Disposable {
11
+ dispose(): void;
12
+ }
13
+ /**
14
+ * Check if an object is Disposable
15
+ */
16
+ export declare function isDisposable(obj: unknown): obj is Disposable;
17
+ /**
18
+ * A stack of disposables that are disposed in LIFO order
19
+ */
20
+ export declare class DisposableStack implements Disposable {
21
+ private stack;
22
+ private disposed;
23
+ /**
24
+ * Add a disposable to the stack and return it
25
+ */
26
+ add<T extends Disposable>(disposable: T): T;
27
+ /**
28
+ * Add a cleanup callback to the stack
29
+ */
30
+ addCallback(callback: () => void): void;
31
+ /**
32
+ * Add a value with a custom dispose function
33
+ */
34
+ addValue<T>(value: T, dispose: (value: T) => void): T;
35
+ /**
36
+ * Dispose all items in reverse order (LIFO)
37
+ */
38
+ dispose(): void;
39
+ /**
40
+ * Check if this stack has been disposed
41
+ */
42
+ get isDisposed(): boolean;
43
+ /**
44
+ * Get the number of items in the stack
45
+ */
46
+ get size(): number;
47
+ }
48
+ /**
49
+ * Create a disposable from an event listener
50
+ */
51
+ export declare function disposableListener(target: EventTarget, event: string, handler: EventListenerOrEventListenerObject, options?: AddEventListenerOptions): Disposable;
52
+ /**
53
+ * Create a disposable from a timeout
54
+ */
55
+ export declare function disposableTimeout(callback: () => void, ms: number): Disposable & {
56
+ id: ReturnType<typeof setTimeout>;
57
+ };
58
+ /**
59
+ * Create a disposable from an interval
60
+ */
61
+ export declare function disposableInterval(callback: () => void, ms: number): Disposable & {
62
+ id: ReturnType<typeof setInterval>;
63
+ };
64
+ /**
65
+ * Create a disposable from a WebSocket
66
+ */
67
+ export declare function disposableWebSocket(ws: WebSocket): Disposable;
68
+ /**
69
+ * Create a disposable from an AbortController
70
+ */
71
+ export declare function disposableAbortController(): Disposable & {
72
+ controller: AbortController;
73
+ signal: AbortSignal;
74
+ };
75
+ /**
76
+ * Create a disposable subscription (for event emitters, observables, etc.)
77
+ */
78
+ export declare function disposableSubscription(unsubscribe: () => void): Disposable;
79
+ /**
80
+ * Get or create a DisposableStack for an HTML element
81
+ */
82
+ export declare function getElementDisposables(element: HTMLElement): DisposableStack;
83
+ /**
84
+ * Dispose all disposables attached to an element
85
+ */
86
+ export declare function disposeElement(element: HTMLElement): void;
87
+ /**
88
+ * Check if an element has disposables
89
+ */
90
+ export declare function hasElementDisposables(element: HTMLElement): boolean;
91
+ /**
92
+ * Decorator/helper to make a class disposable
93
+ * Tracks all resources and disposes them when dispose() is called
94
+ */
95
+ export declare class DisposableMixin {
96
+ protected disposables: DisposableStack;
97
+ /**
98
+ * Register a disposable to be cleaned up
99
+ */
100
+ protected track<T extends Disposable>(disposable: T): T;
101
+ /**
102
+ * Register a cleanup callback
103
+ */
104
+ protected onDispose(callback: () => void): void;
105
+ /**
106
+ * Dispose all tracked resources
107
+ */
108
+ dispose(): void;
109
+ }
110
+ /**
111
+ * Create a composite disposable that disposes multiple items together
112
+ */
113
+ export declare function compositeDisposable(...disposables: Disposable[]): Disposable;
114
+ /**
115
+ * Run a function with automatic cleanup on exit
116
+ * Similar to Python's context managers or C#'s using statement
117
+ */
118
+ export declare function using<T extends Disposable, R>(resource: T | (() => T), fn: (resource: T) => R | Promise<R>): Promise<R>;
119
+ /**
120
+ * Synchronous version of using()
121
+ */
122
+ export declare function usingSync<T extends Disposable, R>(resource: T | (() => T), fn: (resource: T) => R): R;
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Browser-compatible wrapper around the WASM engine
3
+ * Uses web target for browser environments
4
+ */
5
+ import type { RenderCallback, ActionHandler, ComponentResolver } from "./types.js";
6
+ export type { Patch, Action, RenderCallback, ActionHandler, ResolvedComponent, ComponentResolver } from "./types.js";
7
+ export interface EngineInitOptions {
8
+ /**
9
+ * URL to the WASM binary file.
10
+ * Default: loads from unpkg CDN
11
+ * For production, consider serving from your own domain for better performance.
12
+ */
13
+ wasmUrl?: string;
14
+ /**
15
+ * URL to the WASM JS glue code.
16
+ * Default: loads from unpkg CDN
17
+ * For self-hosting, point to your own copy of hypen_engine.js
18
+ */
19
+ jsUrl?: string;
20
+ }
21
+ /**
22
+ * Engine wraps the WASM engine and provides a TypeScript-friendly API
23
+ * Browser version with explicit WASM initialization
24
+ */
25
+ export declare class Engine {
26
+ private wasmEngine;
27
+ private initialized;
28
+ /**
29
+ * Initialize the WASM module
30
+ * @param options - Initialization options including wasmUrl and jsUrl
31
+ */
32
+ init(options?: EngineInitOptions): Promise<void>;
33
+ /**
34
+ * Ensure the engine is initialized before operations
35
+ */
36
+ private ensureInitialized;
37
+ /**
38
+ * Set the render callback that receives patches
39
+ */
40
+ setRenderCallback(callback: RenderCallback): void;
41
+ /**
42
+ * Set the component resolver for dynamic component composition
43
+ */
44
+ setComponentResolver(resolver: ComponentResolver): void;
45
+ /**
46
+ * Parse and render Hypen DSL source code
47
+ */
48
+ renderSource(source: string): void;
49
+ /**
50
+ * Render a lazy component (for lazy route loading)
51
+ */
52
+ renderLazyComponent(source: string): void;
53
+ /**
54
+ * Render a component into a specific parent node (subtree rendering)
55
+ */
56
+ renderInto(source: string, parentNodeId: string, state: Record<string, any>): void;
57
+ /**
58
+ * Notify the engine of state changes using sparse updates
59
+ */
60
+ notifyStateChange(paths: string[], values: Record<string, any>): void;
61
+ /**
62
+ * Notify the engine of state changes using full state replacement
63
+ * @deprecated Use notifyStateChange with sparse values instead
64
+ */
65
+ notifyStateChangeFull(paths: string[], currentState: Record<string, any>): void;
66
+ /**
67
+ * Update state (triggers re-render of affected nodes)
68
+ * @deprecated Use notifyStateChange instead
69
+ */
70
+ updateState(statePatch: Record<string, any>): void;
71
+ /**
72
+ * Dispatch an action
73
+ */
74
+ dispatchAction(name: string, payload?: any): void;
75
+ /**
76
+ * Register an action handler
77
+ */
78
+ onAction(actionName: string, handler: ActionHandler): void;
79
+ /**
80
+ * Initialize a module
81
+ */
82
+ setModule(name: string, actions: string[], stateKeys: string[], initialState: Record<string, any>): void;
83
+ /**
84
+ * Get the current revision number
85
+ */
86
+ getRevision(): bigint;
87
+ /**
88
+ * Clear the engine tree
89
+ */
90
+ clearTree(): void;
91
+ /**
92
+ * Debug method to inspect parsed components
93
+ */
94
+ debugParseComponent(source: string): string;
95
+ }
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Low-level wrapper around the WASM engine
3
+ * Node.js / Bundler target
4
+ */
5
+ import type { RenderCallback, ActionHandler, ComponentResolver } from "./types.js";
6
+ export type { Patch, Action, RenderCallback, ActionHandler, ResolvedComponent, ComponentResolver } from "./types.js";
7
+ /**
8
+ * Engine wraps the WASM engine and provides a TypeScript-friendly API
9
+ */
10
+ export declare class Engine {
11
+ private wasmEngine;
12
+ private initialized;
13
+ /**
14
+ * Initialize the WASM module
15
+ */
16
+ init(): Promise<void>;
17
+ /**
18
+ * Ensure the engine is initialized before operations
19
+ */
20
+ private ensureInitialized;
21
+ /**
22
+ * Set the render callback that receives patches
23
+ */
24
+ setRenderCallback(callback: RenderCallback): void;
25
+ /**
26
+ * Set the component resolver for dynamic component composition
27
+ */
28
+ setComponentResolver(resolver: ComponentResolver): void;
29
+ /**
30
+ * Parse and render Hypen DSL source code
31
+ */
32
+ renderSource(source: string): void;
33
+ /**
34
+ * Render a lazy component (for lazy route loading)
35
+ */
36
+ renderLazyComponent(source: string): void;
37
+ /**
38
+ * Render a component into a specific parent node (subtree rendering)
39
+ */
40
+ renderInto(source: string, parentNodeId: string, state: Record<string, any>): void;
41
+ /**
42
+ * Notify the engine of state changes using sparse updates
43
+ */
44
+ notifyStateChange(paths: string[], values: Record<string, any>): void;
45
+ /**
46
+ * Notify the engine of state changes using full state replacement
47
+ * @deprecated Use notifyStateChange with sparse values instead
48
+ */
49
+ notifyStateChangeFull(paths: string[], currentState: Record<string, any>): void;
50
+ /**
51
+ * Update state (triggers re-render of affected nodes)
52
+ * @deprecated Use notifyStateChange instead
53
+ */
54
+ updateState(statePatch: Record<string, any>): void;
55
+ /**
56
+ * Dispatch an action
57
+ */
58
+ dispatchAction(name: string, payload?: any): void;
59
+ /**
60
+ * Register an action handler
61
+ */
62
+ onAction(actionName: string, handler: ActionHandler): void;
63
+ /**
64
+ * Initialize a module
65
+ */
66
+ setModule(name: string, actions: string[], stateKeys: string[], initialState: Record<string, any>): void;
67
+ /**
68
+ * Get the current revision number
69
+ */
70
+ getRevision(): number;
71
+ /**
72
+ * Clear the engine tree
73
+ */
74
+ clearTree(): void;
75
+ /**
76
+ * Debug method to inspect parsed components
77
+ */
78
+ debugParseComponent(source: string): string;
79
+ }