@hypen-space/core 0.4.46 → 0.4.81

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -4,23 +4,23 @@
4
4
  "sourcesContent": [
5
5
  "function assertPath(path){if(typeof path!==\"string\")throw TypeError(\"Path must be a string. Received \"+JSON.stringify(path))}function normalizeStringPosix(path,allowAboveRoot){var res=\"\",lastSegmentLength=0,lastSlash=-1,dots=0,code;for(var i=0;i<=path.length;++i){if(i<path.length)code=path.charCodeAt(i);else if(code===47)break;else code=47;if(code===47){if(lastSlash===i-1||dots===1);else if(lastSlash!==i-1&&dots===2){if(res.length<2||lastSegmentLength!==2||res.charCodeAt(res.length-1)!==46||res.charCodeAt(res.length-2)!==46){if(res.length>2){var lastSlashIndex=res.lastIndexOf(\"/\");if(lastSlashIndex!==res.length-1){if(lastSlashIndex===-1)res=\"\",lastSegmentLength=0;else res=res.slice(0,lastSlashIndex),lastSegmentLength=res.length-1-res.lastIndexOf(\"/\");lastSlash=i,dots=0;continue}}else if(res.length===2||res.length===1){res=\"\",lastSegmentLength=0,lastSlash=i,dots=0;continue}}if(allowAboveRoot){if(res.length>0)res+=\"/..\";else res=\"..\";lastSegmentLength=2}}else{if(res.length>0)res+=\"/\"+path.slice(lastSlash+1,i);else res=path.slice(lastSlash+1,i);lastSegmentLength=i-lastSlash-1}lastSlash=i,dots=0}else if(code===46&&dots!==-1)++dots;else dots=-1}return res}function _format(sep,pathObject){var dir=pathObject.dir||pathObject.root,base=pathObject.base||(pathObject.name||\"\")+(pathObject.ext||\"\");if(!dir)return base;if(dir===pathObject.root)return dir+base;return dir+sep+base}function resolve(){var resolvedPath=\"\",resolvedAbsolute=!1,cwd;for(var i=arguments.length-1;i>=-1&&!resolvedAbsolute;i--){var path;if(i>=0)path=arguments[i];else{if(cwd===void 0)cwd=process.cwd();path=cwd}if(assertPath(path),path.length===0)continue;resolvedPath=path+\"/\"+resolvedPath,resolvedAbsolute=path.charCodeAt(0)===47}if(resolvedPath=normalizeStringPosix(resolvedPath,!resolvedAbsolute),resolvedAbsolute)if(resolvedPath.length>0)return\"/\"+resolvedPath;else return\"/\";else if(resolvedPath.length>0)return resolvedPath;else return\".\"}function normalize(path){if(assertPath(path),path.length===0)return\".\";var isAbsolute=path.charCodeAt(0)===47,trailingSeparator=path.charCodeAt(path.length-1)===47;if(path=normalizeStringPosix(path,!isAbsolute),path.length===0&&!isAbsolute)path=\".\";if(path.length>0&&trailingSeparator)path+=\"/\";if(isAbsolute)return\"/\"+path;return path}function isAbsolute(path){return assertPath(path),path.length>0&&path.charCodeAt(0)===47}function join(){if(arguments.length===0)return\".\";var joined;for(var i=0;i<arguments.length;++i){var arg=arguments[i];if(assertPath(arg),arg.length>0)if(joined===void 0)joined=arg;else joined+=\"/\"+arg}if(joined===void 0)return\".\";return normalize(joined)}function relative(from,to){if(assertPath(from),assertPath(to),from===to)return\"\";if(from=resolve(from),to=resolve(to),from===to)return\"\";var fromStart=1;for(;fromStart<from.length;++fromStart)if(from.charCodeAt(fromStart)!==47)break;var fromEnd=from.length,fromLen=fromEnd-fromStart,toStart=1;for(;toStart<to.length;++toStart)if(to.charCodeAt(toStart)!==47)break;var toEnd=to.length,toLen=toEnd-toStart,length=fromLen<toLen?fromLen:toLen,lastCommonSep=-1,i=0;for(;i<=length;++i){if(i===length){if(toLen>length){if(to.charCodeAt(toStart+i)===47)return to.slice(toStart+i+1);else if(i===0)return to.slice(toStart+i)}else if(fromLen>length){if(from.charCodeAt(fromStart+i)===47)lastCommonSep=i;else if(i===0)lastCommonSep=0}break}var fromCode=from.charCodeAt(fromStart+i),toCode=to.charCodeAt(toStart+i);if(fromCode!==toCode)break;else if(fromCode===47)lastCommonSep=i}var out=\"\";for(i=fromStart+lastCommonSep+1;i<=fromEnd;++i)if(i===fromEnd||from.charCodeAt(i)===47)if(out.length===0)out+=\"..\";else out+=\"/..\";if(out.length>0)return out+to.slice(toStart+lastCommonSep);else{if(toStart+=lastCommonSep,to.charCodeAt(toStart)===47)++toStart;return to.slice(toStart)}}function _makeLong(path){return path}function dirname(path){if(assertPath(path),path.length===0)return\".\";var code=path.charCodeAt(0),hasRoot=code===47,end=-1,matchedSlash=!0;for(var i=path.length-1;i>=1;--i)if(code=path.charCodeAt(i),code===47){if(!matchedSlash){end=i;break}}else matchedSlash=!1;if(end===-1)return hasRoot?\"/\":\".\";if(hasRoot&&end===1)return\"//\";return path.slice(0,end)}function basename(path,ext){if(ext!==void 0&&typeof ext!==\"string\")throw TypeError('\"ext\" argument must be a string');assertPath(path);var start=0,end=-1,matchedSlash=!0,i;if(ext!==void 0&&ext.length>0&&ext.length<=path.length){if(ext.length===path.length&&ext===path)return\"\";var extIdx=ext.length-1,firstNonSlashEnd=-1;for(i=path.length-1;i>=0;--i){var code=path.charCodeAt(i);if(code===47){if(!matchedSlash){start=i+1;break}}else{if(firstNonSlashEnd===-1)matchedSlash=!1,firstNonSlashEnd=i+1;if(extIdx>=0)if(code===ext.charCodeAt(extIdx)){if(--extIdx===-1)end=i}else extIdx=-1,end=firstNonSlashEnd}}if(start===end)end=firstNonSlashEnd;else if(end===-1)end=path.length;return path.slice(start,end)}else{for(i=path.length-1;i>=0;--i)if(path.charCodeAt(i)===47){if(!matchedSlash){start=i+1;break}}else if(end===-1)matchedSlash=!1,end=i+1;if(end===-1)return\"\";return path.slice(start,end)}}function extname(path){assertPath(path);var startDot=-1,startPart=0,end=-1,matchedSlash=!0,preDotState=0;for(var i=path.length-1;i>=0;--i){var code=path.charCodeAt(i);if(code===47){if(!matchedSlash){startPart=i+1;break}continue}if(end===-1)matchedSlash=!1,end=i+1;if(code===46){if(startDot===-1)startDot=i;else if(preDotState!==1)preDotState=1}else if(startDot!==-1)preDotState=-1}if(startDot===-1||end===-1||preDotState===0||preDotState===1&&startDot===end-1&&startDot===startPart+1)return\"\";return path.slice(startDot,end)}function format(pathObject){if(pathObject===null||typeof pathObject!==\"object\")throw TypeError('The \"pathObject\" argument must be of type Object. Received type '+typeof pathObject);return _format(\"/\",pathObject)}function parse(path){assertPath(path);var ret={root:\"\",dir:\"\",base:\"\",ext:\"\",name:\"\"};if(path.length===0)return ret;var code=path.charCodeAt(0),isAbsolute2=code===47,start;if(isAbsolute2)ret.root=\"/\",start=1;else start=0;var startDot=-1,startPart=0,end=-1,matchedSlash=!0,i=path.length-1,preDotState=0;for(;i>=start;--i){if(code=path.charCodeAt(i),code===47){if(!matchedSlash){startPart=i+1;break}continue}if(end===-1)matchedSlash=!1,end=i+1;if(code===46){if(startDot===-1)startDot=i;else if(preDotState!==1)preDotState=1}else if(startDot!==-1)preDotState=-1}if(startDot===-1||end===-1||preDotState===0||preDotState===1&&startDot===end-1&&startDot===startPart+1){if(end!==-1)if(startPart===0&&isAbsolute2)ret.base=ret.name=path.slice(1,end);else ret.base=ret.name=path.slice(startPart,end)}else{if(startPart===0&&isAbsolute2)ret.name=path.slice(1,startDot),ret.base=path.slice(1,end);else ret.name=path.slice(startPart,startDot),ret.base=path.slice(startPart,end);ret.ext=path.slice(startDot,end)}if(startPart>0)ret.dir=path.slice(0,startPart-1);else if(isAbsolute2)ret.dir=\"/\";return ret}var sep=\"/\",delimiter=\":\",posix=((p)=>(p.posix=p,p))({resolve,normalize,isAbsolute,join,relative,_makeLong,dirname,basename,extname,format,parse,sep,delimiter,win32:null,posix:null});var path_default=posix;export{sep,resolve,relative,posix,parse,normalize,join,isAbsolute,format,extname,dirname,delimiter,path_default as default,basename,_makeLong};",
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\n/**\n * Error thrown when parsing Hypen DSL source fails\n */\nexport class ParseError extends HypenError {\n readonly source?: string;\n\n constructor(message: string, source?: string, cause?: unknown) {\n super('PARSE_ERROR', message, {\n context: { source },\n cause: cause instanceof Error ? cause : undefined,\n });\n this.name = 'ParseError';\n this.source = source;\n }\n}\n\n/**\n * Error thrown when rendering fails\n */\nexport class RenderError extends HypenError {\n constructor(message: string, cause?: unknown) {\n super('RENDER_ERROR', message, {\n cause: cause instanceof Error ? cause : undefined,\n });\n this.name = 'RenderError';\n }\n}\n\n/**\n * Classify a WASM engine error string into the appropriate HypenError subclass.\n * The engine returns JsValue error strings with known prefixes.\n */\nexport function classifyEngineError(err: unknown): HypenError {\n // Handle structured WASM errors: { type: string, message: string }\n if (err && typeof err === 'object' && 'message' in err && 'type' in err) {\n const structured = err as { type: string; message: string };\n switch (structured.type) {\n case 'parseError': return new ParseError(structured.message);\n case 'stateError': return new StateError(structured.message);\n case 'renderError': return new RenderError(structured.message);\n case 'actionError': return new HypenError('ACTION_ERROR', structured.message);\n default: return new HypenError('UNKNOWN_ERROR', structured.message);\n }\n }\n const message = err instanceof Error ? err.message : String(err);\n\n if (message.startsWith('Parse error:')) {\n return new ParseError(message);\n }\n if (message.startsWith('Invalid state:') || message.startsWith('Invalid state patch:')) {\n return new StateError(message);\n }\n if (message.startsWith('Parent node not found:')) {\n return new RenderError(message);\n }\n\n return new RenderError(message);\n}\n",
7
- "/**\n * Data Source Plugin System for Hypen\n *\n * Enables live subscription databases (SpacetimeDB, Firebase, Convex, Electric SQL)\n * to push data into the Hypen reactive engine via a unified plugin interface.\n *\n * UI bindings use the `$provider.path` syntax:\n * - `$spacetime.messages` → SpacetimeDB messages table\n * - `$firebase.user.profile` → Firebase user profile\n * - `$convex.tasks` → Convex tasks table\n *\n * @module\n */\n\n// ---------------------------------------------------------------------------\n// Core Types\n// ---------------------------------------------------------------------------\n\n/** Connection status for a data source provider */\nexport type DataSourceStatus =\n | \"disconnected\"\n | \"connecting\"\n | \"connected\"\n | \"reconnecting\"\n | \"error\";\n\n/** Describes a subscription to a table or query */\nexport interface DataSourceQuery {\n /** Table or collection name (e.g., \"messages\", \"users\") */\n table: string;\n /** Optional filter criteria */\n filter?: Record<string, unknown>;\n /** Optional raw query string (e.g., SQL for SpacetimeDB) */\n sql?: string;\n}\n\n/** Handle returned by subscribe() — call unsubscribe() to stop receiving updates */\nexport interface DataSourceSubscription {\n /** Stop receiving updates for this subscription */\n unsubscribe(): void;\n /** Current subscription status */\n status: \"pending\" | \"applied\" | \"error\";\n /** Error details if status is \"error\" */\n error?: Error;\n}\n\n/** Describes a batch of changes pushed by a plugin */\nexport interface DataSourceChange {\n /** Changed paths relative to the provider root (e.g., [\"messages\", \"users\"]) */\n paths: string[];\n /** New values at those paths */\n values: Record<string, unknown>;\n}\n\n// ---------------------------------------------------------------------------\n// Plugin Interface\n// ---------------------------------------------------------------------------\n\n/**\n * Interface that all data source plugins must implement.\n *\n * A plugin manages the connection lifecycle and translates database-specific\n * events (row inserts, updates, deletes) into `DataSourceChange` objects that\n * the Hypen engine can consume.\n *\n * @typeParam TConfig - Plugin-specific configuration type\n *\n * @example\n * ```typescript\n * class SpacetimeDBPlugin implements DataSourcePlugin<SpacetimeDBConfig> {\n * readonly name = \"spacetime\";\n * status: DataSourceStatus = \"disconnected\";\n *\n * async connect(config: SpacetimeDBConfig, onChange: (change: DataSourceChange) => void) {\n * // Connect to SpacetimeDB, subscribe to tables, push changes via onChange\n * }\n * // ...\n * }\n * ```\n */\nexport interface DataSourcePlugin<TConfig = unknown> {\n /** Unique provider name (e.g., \"spacetime\", \"firebase\", \"convex\") */\n readonly name: string;\n\n /** Current connection status */\n status: DataSourceStatus;\n\n /**\n * Connect to the data source and begin pushing changes.\n *\n * @param config - Plugin-specific configuration\n * @param onChange - Callback to push data changes into the engine.\n * The plugin MUST call this whenever subscribed data changes.\n */\n connect(config: TConfig, onChange: (change: DataSourceChange) => void): Promise<void>;\n\n /**\n * Subscribe to a specific table or query.\n * Returns a handle to unsubscribe later.\n */\n subscribe(query: DataSourceQuery): DataSourceSubscription;\n\n /**\n * Call a remote procedure / reducer / mutation.\n *\n * @param method - Method name (e.g., \"sendMessage\" for SpacetimeDB reducer)\n * @param args - Arguments to pass\n * @returns The result from the remote call\n */\n call(method: string, ...args: unknown[]): Promise<unknown>;\n\n /**\n * Disconnect from the data source and clean up all subscriptions.\n */\n disconnect(): Promise<void>;\n}\n\n// ---------------------------------------------------------------------------\n// Data Source Manager\n// ---------------------------------------------------------------------------\n\n/** Interface for the engine's data source operations (maps to WASM setContext/removeContext) */\nexport interface IDataSourceEngine {\n /**\n * Set (or replace) a named data source context.\n * Registers the provider, stores the data, and re-renders bound nodes.\n * Sparse merging should happen at the SDK layer before calling this.\n */\n setContext(name: string, data: Record<string, unknown>): void;\n /**\n * Remove a data source context entirely.\n * Drops the provider's state and re-renders bound nodes (they resolve to null).\n */\n removeContext(name: string): void;\n}\n\n/**\n * Manages data source plugin lifecycles and bridges them to the Hypen engine.\n *\n * The manager:\n * 1. Registers plugins with the engine (creates state slots)\n * 2. Connects plugins and wires their onChange callbacks to engine updates\n * 3. Manages subscription lifecycles\n * 4. Handles cleanup on disconnect\n *\n * @example\n * ```typescript\n * const manager = new DataSourceManager(engine);\n *\n * // Register and connect a SpacetimeDB plugin\n * await manager.use(new SpacetimeDBPlugin(), {\n * uri: \"ws://localhost:3000\",\n * moduleName: \"chat\",\n * tables: [\"user\", \"message\"],\n * });\n *\n * // Access plugin for mutations\n * await manager.get(\"spacetime\").call(\"sendMessage\", \"Hello!\");\n *\n * // Clean up\n * await manager.disconnectAll();\n * ```\n */\nexport class DataSourceManager {\n private plugins = new Map<string, DataSourcePlugin>();\n private configs = new Map<string, unknown>();\n /** Accumulated state per provider — sparse merging happens here before setContext */\n private state = new Map<string, Record<string, unknown>>();\n private engine: IDataSourceEngine;\n\n constructor(engine: IDataSourceEngine) {\n this.engine = engine;\n }\n\n /**\n * Register, connect, and start a data source plugin.\n *\n * @param plugin - The plugin instance\n * @param config - Plugin-specific configuration\n */\n async use<C>(plugin: DataSourcePlugin<C>, config: C): Promise<void> {\n const { name } = plugin;\n\n // Initialize state slot\n this.state.set(name, {});\n\n // Store references\n this.plugins.set(name, plugin as DataSourcePlugin);\n this.configs.set(name, config);\n\n // Connect the plugin with an onChange callback that merges sparse data\n // and pushes the full state via setContext\n await plugin.connect(config, (change: DataSourceChange) => {\n // Merge changed paths into the accumulated state\n const current = this.state.get(name) ?? {};\n for (const path of change.paths) {\n if (path in change.values) {\n current[path] = change.values[path];\n }\n }\n this.state.set(name, current);\n\n // Push the full merged state to the engine\n this.engine.setContext(name, current);\n });\n }\n\n /**\n * Get a registered plugin by name.\n * Useful for calling mutations: `manager.get(\"spacetime\").call(\"sendMessage\", text)`\n */\n get<T extends DataSourcePlugin = DataSourcePlugin>(name: string): T | undefined {\n return this.plugins.get(name) as T | undefined;\n }\n\n /** Check if a plugin is registered */\n has(name: string): boolean {\n return this.plugins.has(name);\n }\n\n /** Get all registered provider names */\n getNames(): string[] {\n return Array.from(this.plugins.keys());\n }\n\n /** Get the status of a specific plugin */\n getStatus(name: string): DataSourceStatus | undefined {\n return this.plugins.get(name)?.status;\n }\n\n /**\n * Disconnect and remove a specific plugin.\n */\n async remove(name: string): Promise<void> {\n const plugin = this.plugins.get(name);\n if (plugin) {\n await plugin.disconnect();\n this.plugins.delete(name);\n this.configs.delete(name);\n this.state.delete(name);\n this.engine.removeContext(name);\n }\n }\n\n /**\n * Disconnect all plugins and clean up.\n */\n async disconnectAll(): Promise<void> {\n const names = Array.from(this.plugins.keys());\n await Promise.all(names.map((name) => this.remove(name)));\n }\n}\n",
7
+ "/**\n * Data Source Plugin System for Hypen\n *\n * Enables live subscription databases (SpacetimeDB, Firebase, Convex, Electric SQL)\n * to push data into the Hypen reactive engine via a unified plugin interface.\n *\n * UI bindings use the `@provider.path` syntax:\n * - `@spacetime.messages` → SpacetimeDB messages table\n * - `@firebase.user.profile` → Firebase user profile\n * - `@convex.tasks` → Convex tasks table\n *\n * @module\n */\n\n// ---------------------------------------------------------------------------\n// Core Types\n// ---------------------------------------------------------------------------\n\n/** Connection status for a data source provider */\nexport type DataSourceStatus =\n | \"disconnected\"\n | \"connecting\"\n | \"connected\"\n | \"reconnecting\"\n | \"error\";\n\n/** Describes a subscription to a table or query */\nexport interface DataSourceQuery {\n /** Table or collection name (e.g., \"messages\", \"users\") */\n table: string;\n /** Optional filter criteria */\n filter?: Record<string, unknown>;\n /** Optional raw query string (e.g., SQL for SpacetimeDB) */\n sql?: string;\n}\n\n/** Handle returned by subscribe() — call unsubscribe() to stop receiving updates */\nexport interface DataSourceSubscription {\n /** Stop receiving updates for this subscription */\n unsubscribe(): void;\n /** Current subscription status */\n status: \"pending\" | \"applied\" | \"error\";\n /** Error details if status is \"error\" */\n error?: Error;\n}\n\n/** Describes a batch of changes pushed by a plugin */\nexport interface DataSourceChange {\n /** Changed paths relative to the provider root (e.g., [\"messages\", \"users\"]) */\n paths: string[];\n /** New values at those paths */\n values: Record<string, unknown>;\n}\n\n// ---------------------------------------------------------------------------\n// Plugin Interface\n// ---------------------------------------------------------------------------\n\n/**\n * Interface that all data source plugins must implement.\n *\n * A plugin manages the connection lifecycle and translates database-specific\n * events (row inserts, updates, deletes) into `DataSourceChange` objects that\n * the Hypen engine can consume.\n *\n * @typeParam TConfig - Plugin-specific configuration type\n *\n * @example\n * ```typescript\n * class SpacetimeDBPlugin implements DataSourcePlugin<SpacetimeDBConfig> {\n * readonly name = \"spacetime\";\n * status: DataSourceStatus = \"disconnected\";\n *\n * async connect(config: SpacetimeDBConfig, onChange: (change: DataSourceChange) => void) {\n * // Connect to SpacetimeDB, subscribe to tables, push changes via onChange\n * }\n * // ...\n * }\n * ```\n */\nexport interface DataSourcePlugin<TConfig = unknown> {\n /** Unique provider name (e.g., \"spacetime\", \"firebase\", \"convex\") */\n readonly name: string;\n\n /** Current connection status */\n status: DataSourceStatus;\n\n /**\n * Connect to the data source and begin pushing changes.\n *\n * @param config - Plugin-specific configuration\n * @param onChange - Callback to push data changes into the engine.\n * The plugin MUST call this whenever subscribed data changes.\n */\n connect(config: TConfig, onChange: (change: DataSourceChange) => void): Promise<void>;\n\n /**\n * Subscribe to a specific table or query.\n * Returns a handle to unsubscribe later.\n */\n subscribe(query: DataSourceQuery): DataSourceSubscription;\n\n /**\n * Call a remote procedure / reducer / mutation.\n *\n * @param method - Method name (e.g., \"sendMessage\" for SpacetimeDB reducer)\n * @param args - Arguments to pass\n * @returns The result from the remote call\n */\n call(method: string, ...args: unknown[]): Promise<unknown>;\n\n /**\n * Disconnect from the data source and clean up all subscriptions.\n */\n disconnect(): Promise<void>;\n}\n\n// ---------------------------------------------------------------------------\n// Data Source Manager\n// ---------------------------------------------------------------------------\n\n/** Interface for the engine's data source operations (maps to WASM setContext/removeContext) */\nexport interface IDataSourceEngine {\n /**\n * Set (or replace) a named data source context.\n * Registers the provider, stores the data, and re-renders bound nodes.\n * Sparse merging should happen at the SDK layer before calling this.\n */\n setContext(name: string, data: Record<string, unknown>): void;\n /**\n * Remove a data source context entirely.\n * Drops the provider's state and re-renders bound nodes (they resolve to null).\n */\n removeContext(name: string): void;\n}\n\n/**\n * Manages data source plugin lifecycles and bridges them to the Hypen engine.\n *\n * The manager:\n * 1. Registers plugins with the engine (creates state slots)\n * 2. Connects plugins and wires their onChange callbacks to engine updates\n * 3. Manages subscription lifecycles\n * 4. Handles cleanup on disconnect\n *\n * @example\n * ```typescript\n * const manager = new DataSourceManager(engine);\n *\n * // Register and connect a SpacetimeDB plugin\n * await manager.use(new SpacetimeDBPlugin(), {\n * uri: \"ws://localhost:3000\",\n * moduleName: \"chat\",\n * tables: [\"user\", \"message\"],\n * });\n *\n * // Access plugin for mutations\n * await manager.get(\"spacetime\").call(\"sendMessage\", \"Hello!\");\n *\n * // Clean up\n * await manager.disconnectAll();\n * ```\n */\nexport class DataSourceManager {\n private plugins = new Map<string, DataSourcePlugin>();\n private configs = new Map<string, unknown>();\n /** Accumulated state per provider — sparse merging happens here before setContext */\n private state = new Map<string, Record<string, unknown>>();\n private engine: IDataSourceEngine;\n\n constructor(engine: IDataSourceEngine) {\n this.engine = engine;\n }\n\n /**\n * Register, connect, and start a data source plugin.\n *\n * @param plugin - The plugin instance\n * @param config - Plugin-specific configuration\n */\n async use<C>(plugin: DataSourcePlugin<C>, config: C): Promise<void> {\n const { name } = plugin;\n\n // Initialize state slot\n this.state.set(name, {});\n\n // Store references\n this.plugins.set(name, plugin as DataSourcePlugin);\n this.configs.set(name, config);\n\n // Connect the plugin with an onChange callback that merges sparse data\n // and pushes the full state via setContext\n await plugin.connect(config, (change: DataSourceChange) => {\n // Merge changed paths into the accumulated state\n const current = this.state.get(name) ?? {};\n for (const path of change.paths) {\n if (path in change.values) {\n current[path] = change.values[path];\n }\n }\n this.state.set(name, current);\n\n // Push the full merged state to the engine\n this.engine.setContext(name, current);\n });\n }\n\n /**\n * Get a registered plugin by name.\n * Useful for calling mutations: `manager.get(\"spacetime\").call(\"sendMessage\", text)`\n */\n get<T extends DataSourcePlugin = DataSourcePlugin>(name: string): T | undefined {\n return this.plugins.get(name) as T | undefined;\n }\n\n /** Check if a plugin is registered */\n has(name: string): boolean {\n return this.plugins.has(name);\n }\n\n /** Get all registered provider names */\n getNames(): string[] {\n return Array.from(this.plugins.keys());\n }\n\n /** Get the status of a specific plugin */\n getStatus(name: string): DataSourceStatus | undefined {\n return this.plugins.get(name)?.status;\n }\n\n /**\n * Disconnect and remove a specific plugin.\n */\n async remove(name: string): Promise<void> {\n const plugin = this.plugins.get(name);\n if (plugin) {\n await plugin.disconnect();\n this.plugins.delete(name);\n this.configs.delete(name);\n this.state.delete(name);\n this.engine.removeContext(name);\n }\n }\n\n /**\n * Disconnect all plugins and clean up.\n */\n async disconnectAll(): Promise<void> {\n const names = Array.from(this.plugins.keys());\n await Promise.all(names.map((name) => this.remove(name)));\n }\n}\n",
8
8
  "/**\n * State management with observer pattern and diffing\n *\n * Uses a proxy-based approach with self-detection to avoid\n * creating nested proxies repeatedly.\n */\n\n// Symbol for proxy detection (more robust than string property)\nconst IS_PROXY = Symbol.for('hypen.isProxy');\nconst RAW_TARGET = Symbol.for('hypen.rawTarget');\n\nexport type StatePath = string; // e.g., \"user.name\", \"items.0.title\"\n\n/**\n * Represents a change in state with full path information\n */\nexport interface StateChange {\n paths: StatePath[];\n newValues: Record<StatePath, any>;\n}\n\n/**\n * Options for state observer\n */\nexport interface StateObserverOptions {\n onChange: (change: StateChange) => void;\n pathPrefix?: string; // For nested observers\n}\n\n/**\n * Deep clone an object, using structuredClone when available.\n * Handles proxy objects, circular references, and special types.\n */\nfunction deepClone<T>(obj: T): T {\n // Handle primitives and null\n if (obj === null || typeof obj !== 'object') {\n return obj;\n }\n\n // Handle functions (pass through, can't be cloned)\n if (typeof obj === 'function') {\n return obj;\n }\n\n // Handle proxy objects with snapshot method\n if (typeof (obj as any).__getSnapshot === 'function') {\n return (obj as any).__getSnapshot() as T;\n }\n\n // Handle types that can't be cloned (return as-is)\n if (obj instanceof WeakMap || obj instanceof WeakSet) {\n return obj;\n }\n\n // Use a WeakMap to track visited objects and handle circular references\n const visited = new WeakMap();\n\n function cloneInternal(value: any): any {\n if (value === null || typeof value !== 'object') {\n return value;\n }\n\n // Functions can't be cloned, pass through\n if (typeof value === 'function') {\n return value;\n }\n\n // Check for circular reference\n if (visited.has(value)) {\n return visited.get(value);\n }\n\n // Handle types that can't be cloned\n if (value instanceof WeakMap || value instanceof WeakSet) {\n return value;\n }\n\n // Try structuredClone for supported types (Date, Map, Set, etc.)\n // This is faster than manual cloning for these types\n if (\n value instanceof Date ||\n value instanceof RegExp ||\n value instanceof Map ||\n value instanceof Set ||\n ArrayBuffer.isView(value) ||\n value instanceof ArrayBuffer\n ) {\n try {\n return structuredClone(value);\n } catch {\n // If structuredClone fails, fall through to manual handling\n }\n }\n\n // Handle arrays\n if (Array.isArray(value)) {\n const arrClone: any[] = [];\n visited.set(value, arrClone);\n for (let i = 0; i < value.length; i++) {\n arrClone[i] = cloneInternal(value[i]);\n }\n return arrClone;\n }\n\n // Handle plain objects\n const objClone: any = {};\n visited.set(value, objClone);\n\n // Clone string keys\n for (const key in value) {\n if (Object.prototype.hasOwnProperty.call(value, key)) {\n objClone[key] = cloneInternal(value[key]);\n }\n }\n\n // Clone Symbol keys\n const symbolKeys = Object.getOwnPropertySymbols(value);\n for (const sym of symbolKeys) {\n objClone[sym] = cloneInternal(value[sym]);\n }\n\n return objClone;\n }\n\n return cloneInternal(obj);\n}\n\n/**\n * Compare two values and detect changes with full paths\n */\nfunction diffState(\n oldState: any,\n newState: any,\n basePath: string = \"\"\n): StateChange {\n const paths: StatePath[] = [];\n const newValues: Record<StatePath, any> = {};\n\n function diff(oldVal: any, newVal: any, path: string) {\n // Handle null/undefined\n if (oldVal === newVal) return;\n\n // Different types or primitives\n if (\n typeof oldVal !== \"object\" ||\n typeof newVal !== \"object\" ||\n oldVal === null ||\n newVal === null\n ) {\n if (oldVal !== newVal) {\n paths.push(path);\n newValues[path] = newVal;\n }\n return;\n }\n\n // Arrays\n if (Array.isArray(oldVal) || Array.isArray(newVal)) {\n if (\n !Array.isArray(oldVal) ||\n !Array.isArray(newVal) ||\n oldVal.length !== newVal.length\n ) {\n paths.push(path);\n newValues[path] = newVal;\n return;\n }\n\n for (let i = 0; i < newVal.length; i++) {\n const itemPath = path ? `${path}.${i}` : `${i}`;\n diff(oldVal[i], newVal[i], itemPath);\n }\n return;\n }\n\n // Objects\n const oldKeys = new Set(Object.keys(oldVal));\n const newKeys = new Set(Object.keys(newVal));\n\n // Check for added or changed keys\n for (const key of newKeys) {\n const propPath = path ? `${path}.${key}` : key;\n if (!oldKeys.has(key)) {\n // New property\n paths.push(propPath);\n newValues[propPath] = newVal[key];\n } else {\n // Existing property, recurse\n diff(oldVal[key], newVal[key], propPath);\n }\n }\n\n // Check for removed keys\n for (const key of oldKeys) {\n if (!newKeys.has(key)) {\n const propPath = path ? `${path}.${key}` : key;\n paths.push(propPath);\n newValues[propPath] = undefined;\n }\n }\n }\n\n diff(oldState, newState, basePath);\n return { paths, newValues };\n}\n\n/**\n * Create an observable state object that tracks changes\n */\nexport function createObservableState<T extends object>(\n initialState: T,\n options?: StateObserverOptions\n): T {\n // Use default options if not provided\n const opts: StateObserverOptions = options || { onChange: () => {} };\n\n // Handle null/undefined by using an empty object\n // This allows modules to start with null state\n if (initialState === null || initialState === undefined) {\n initialState = {} as T;\n }\n\n // Detect and reject primitive wrapper objects (Number, String, Boolean)\n // These cannot be properly proxied due to internal slots\n if (\n initialState instanceof Number ||\n initialState instanceof String ||\n initialState instanceof Boolean\n ) {\n throw new TypeError(\n \"Cannot create observable state from primitive wrapper objects (Number, String, Boolean). \" +\n \"Use plain primitives or regular objects instead.\"\n );\n }\n\n // Clone the initial state to ensure each observable has its own copy\n // This prevents multiple modules from sharing the same underlying state object\n initialState = deepClone(initialState);\n\n // Keep a snapshot of the last known state\n let lastSnapshot = deepClone(initialState);\n const pathPrefix = opts.pathPrefix || \"\";\n\n // Track if we're in a batch update\n let batchDepth = 0;\n let pendingChange: StateChange | null = null;\n\n function notifyChange() {\n if (batchDepth > 0) return;\n\n // Compare current state with last snapshot\n const change = diffState(lastSnapshot, state, pathPrefix);\n\n if (change.paths.length > 0) {\n // Update snapshot\n lastSnapshot = deepClone(state);\n\n // Merge with pending changes if any\n if (pendingChange) {\n change.paths.push(...pendingChange.paths);\n Object.assign(change.newValues, pendingChange.newValues);\n pendingChange = null;\n }\n\n // Notify\n opts.onChange(change);\n }\n }\n\n // Track if we have a pending microtask notification\n let notificationPending = false;\n\n function scheduleBatch() {\n if (batchDepth === 0) {\n // If not in a batch, schedule notification in next microtask to coalesce rapid changes\n if (!notificationPending) {\n notificationPending = true;\n queueMicrotask(() => {\n notificationPending = false;\n if (batchDepth === 0) {\n notifyChange();\n } else {\n // A batch started after we scheduled; the batch's __endBatch will\n // call notifyChange() when it completes, so nothing to do here.\n }\n });\n }\n } else {\n // Inside a batch — mark that changes occurred so __endBatch knows to notify\n pendingChange = pendingChange || { paths: [], newValues: {} };\n }\n }\n\n // WeakMap to cache proxies by their raw target\n // This is essential for circular reference handling\n const proxyCache = new WeakMap<object, any>();\n\n function createProxy(target: any, basePath: string): any {\n // Check cache first (handles circular references)\n const cached = proxyCache.get(target);\n if (cached) return cached;\n\n const proxy = new Proxy(target, {\n get(obj, prop) {\n // Self-detection: if checking IS_PROXY, return true\n // This allows us to detect if a value is already proxied\n if (prop === IS_PROXY) return true;\n\n // Allow access to raw target (useful for debugging/serialization)\n if (prop === RAW_TARGET) return obj;\n\n // Expose batch control methods\n if (prop === \"__beginBatch\") {\n return () => {\n batchDepth++;\n };\n }\n if (prop === \"__endBatch\") {\n return () => {\n batchDepth--;\n if (batchDepth === 0) {\n notifyChange();\n }\n };\n }\n if (prop === \"__getSnapshot\") {\n return () => deepClone(obj);\n }\n\n const value = obj[prop];\n\n // Return proxied nested objects/arrays, but NOT special types\n if (value && typeof value === \"object\") {\n // Fast path: if already a proxy, return as-is\n // This check is O(1) and avoids WeakMap lookup\n if ((value as any)[IS_PROXY]) {\n return value;\n }\n\n // Check for special object types that should not be proxied\n if (\n value instanceof Date ||\n value instanceof RegExp ||\n value instanceof Map ||\n value instanceof Set ||\n value instanceof WeakMap ||\n value instanceof WeakSet\n ) {\n return value;\n }\n\n // Check cache for this value (handles circular refs and repeated access)\n const cachedNested = proxyCache.get(value);\n if (cachedNested) {\n return cachedNested;\n }\n\n // Create proxy for nested object/array\n const nestedProxy = createProxy(value, basePath ? `${basePath}.${String(prop)}` : String(prop));\n return nestedProxy;\n }\n\n return value;\n },\n\n set(obj, prop, value) {\n const oldValue = obj[prop];\n\n // If setting an object that's already a proxy, unwrap it first\n // to store the raw value (prevents proxy-wrapping-proxy)\n if (value && typeof value === \"object\" && (value as any)[IS_PROXY]) {\n value = (value as any)[RAW_TARGET];\n }\n\n // Set the new value\n obj[prop] = value;\n\n if (oldValue !== value) {\n scheduleBatch();\n }\n\n return true;\n },\n\n deleteProperty(obj, prop) {\n const existed = Object.prototype.hasOwnProperty.call(obj, prop);\n const result = delete obj[prop];\n if (existed) {\n scheduleBatch();\n }\n return result;\n },\n });\n\n // Cache the proxy before returning\n proxyCache.set(target, proxy);\n return proxy;\n }\n\n const state = createProxy(initialState, pathPrefix);\n return state as T;\n}\n\n/**\n * Helper to batch multiple state updates\n */\nexport function batchStateUpdates<T>(state: T, fn: () => void): void {\n const s = state as any;\n if (s.__beginBatch && s.__endBatch) {\n s.__beginBatch();\n try {\n fn();\n } finally {\n s.__endBatch();\n }\n } else {\n fn();\n }\n}\n\n/**\n * Get a snapshot of the current state\n */\nexport function getStateSnapshot<T>(state: T): T {\n const s = state as any;\n if (s.__getSnapshot) {\n return s.__getSnapshot();\n }\n return deepClone(state);\n}\n\n/**\n * Check if a value is a Hypen state proxy\n */\nexport function isStateProxy(value: unknown): boolean {\n return value !== null && typeof value === 'object' && (value as any)[IS_PROXY] === true;\n}\n\n/**\n * Get the raw (unwrapped) target from a proxy\n * Returns the value as-is if not a proxy\n */\nexport function unwrapProxy<T>(value: T): T {\n if (value !== null && typeof value === 'object' && (value as any)[IS_PROXY]) {\n return (value as any)[RAW_TARGET];\n }\n return value;\n}\n",
9
9
  "/**\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\" : \"info\",\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",
10
- "/**\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\";\nimport { DataSourceManager, type DataSourcePlugin, type IDataSourceEngine } from \"./datasource.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 ActionContext<P = unknown> = {\n name: string;\n payload?: P;\n sender?: string;\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: HypenRouter | null;\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, P = unknown> {\n action: ActionContext<P>;\n state: T;\n context: GlobalContext;\n /** Access to registered data source plugins for mutations */\n dataSources: DataSourceAccessor;\n}\n\n/**\n * Provides typed access to registered data source plugins.\n * Unknown method calls are forwarded to `plugin.call()`:\n * `dataSources.spacetime.sendMessage(text)` → `plugin.call(\"sendMessage\", text)`\n *\n * You can also call `.call()` directly if you prefer:\n * `dataSources.spacetime.call(\"sendMessage\", text)`\n */\nexport interface DataSourceAccessor {\n [providerName: string]: DataSourcePlugin & Record<string, (...args: unknown[]) => Promise<unknown>>;\n}\n\n/**\n * Action handler - receives all context in a single object\n */\nexport type ActionHandler<T, P = unknown> = (ctx: ActionHandlerContext<T, P>) => 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 /**\n * Data source plugins registered via `.useDataSource()`.\n * Each entry contains the plugin and its configuration.\n */\n dataSources?: Array<{ plugin: DataSourcePlugin; config: unknown }>;\n handlers: {\n onCreated?: LifecycleHandler<T>;\n onAction: Map<string, ActionHandler<T, any>>;\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, any>> = 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 private _registry?: Map<string, HypenModuleDefinition>;\n private dataSourceEntries: Array<{ plugin: DataSourcePlugin; config: unknown }> = [];\n\n constructor(\n initialState: T,\n options?: { persist?: boolean; version?: number; name?: string },\n registry?: Map<string, HypenModuleDefinition>\n ) {\n this.initialState = initialState;\n this.options = options || {};\n this._registry = registry;\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 * Optionally provide a payload type parameter for typed action payloads.\n *\n * @example\n * ```typescript\n * // Typed payload:\n * .onAction<{ amount: number }>(\"add\", ({ action, state }) => {\n * action.payload.amount; // fully typed\n * })\n *\n * // Untyped (payload is unknown):\n * .onAction(\"add\", ({ action, state }) => {\n * action.payload; // unknown\n * })\n * ```\n */\n onAction<P = unknown>(name: string, fn: ActionHandler<T, P>): this {\n this.actionHandlers.set(name, fn as ActionHandler<T, any>);\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 * Register a data source plugin for live database subscriptions.\n *\n * @example\n * ```typescript\n * import { SpacetimeDBPlugin } from \"@hypen-space/plugin-spacetimedb\";\n *\n * export default app\n * .defineState({ messageText: \"\" })\n * .useDataSource(new SpacetimeDBPlugin(), {\n * uri: \"ws://localhost:3000\",\n * moduleName: \"chat\",\n * tables: [\"user\", \"message\"],\n * })\n * .onAction(\"sendMessage\", async ({ state, dataSources }) => {\n * await dataSources.spacetime.sendMessage(state.messageText);\n * state.messageText = \"\";\n * })\n * .build();\n * ```\n *\n * In Hypen DSL, bind to data source tables with `$provider.table`:\n * ```hypen\n * ForEach(items: $spacetime.message, key: \"id\") {\n * Text(\"${item.text}\")\n * }\n * ```\n */\n useDataSource<C>(plugin: DataSourcePlugin<C>, config: C): this {\n this.dataSourceEntries.push({ plugin: plugin as DataSourcePlugin, config });\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 * Load a UI template from a .hypen file on disk.\n *\n * @example\n * ```typescript\n * import { app } from \"@hypen-space/core\";\n *\n * export default app\n * .defineState({ count: 0 })\n * .onAction(\"increment\", ({ state }) => { state.count += 1; })\n * .uiFile(\"./counter.hypen\");\n * ```\n *\n * @param path - Path to a .hypen template file\n * @returns The built module definition (calls build() internally)\n */\n uiFile(path: string): HypenModuleDefinition<T> {\n const fs = require(\"fs\");\n this.template = fs.readFileSync(path, \"utf-8\").trim();\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 const definition: HypenModuleDefinition<T> = {\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 dataSources: this.dataSourceEntries.length > 0 ? this.dataSourceEntries : undefined,\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 // Auto-register in the app registry when the module has a name\n if (this.options.name && this._registry) {\n this._registry.set(this.options.name, definition as HypenModuleDefinition);\n }\n\n return definition;\n }\n}\n\n/**\n * Hypen App API — singleton factory and component registry.\n *\n * Modules built with a `name` are automatically registered here.\n * Consumers (ManagedRouter, RemoteServer, ComponentResolver) read from this\n * registry instead of requiring a separate ModuleRegistry instance.\n */\nexport class HypenApp {\n /** @internal */\n readonly _registry = new Map<string, HypenModuleDefinition>();\n\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, this._registry);\n }\n\n /**\n * Convenience: start a module builder with a name pre-set.\n *\n * @example\n * ```typescript\n * export default app\n * .module(\"Settings\")\n * .defineState({ theme: \"dark\" })\n * .ui(hypen`...`);\n * ```\n */\n module(name: string) {\n const registry = this._registry;\n return {\n defineState: <T>(\n initial: T,\n options?: { persist?: boolean; version?: number }\n ): HypenAppBuilder<T> => {\n return new HypenAppBuilder(initial, { ...options, name }, registry);\n },\n };\n }\n\n // ---------------------------------------------------------------------------\n // Registry API\n // ---------------------------------------------------------------------------\n\n /**\n * Get a registered module definition by component name.\n */\n get(name: string): HypenModuleDefinition | undefined {\n return this._registry.get(name);\n }\n\n /**\n * Check if a module definition is registered.\n */\n has(name: string): boolean {\n return this._registry.has(name);\n }\n\n /**\n * Read-only view of all registered component definitions.\n */\n get components(): ReadonlyMap<string, HypenModuleDefinition> {\n return this._registry;\n }\n\n /**\n * Get all registered component names.\n */\n getNames(): string[] {\n return Array.from(this._registry.keys());\n }\n\n /**\n * Number of registered definitions.\n */\n get size(): number {\n return this._registry.size;\n }\n\n /**\n * Unregister a module definition.\n */\n unregister(name: string): void {\n this._registry.delete(name);\n }\n\n /**\n * Clear all registered definitions.\n */\n clear(): void {\n this._registry.clear();\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 router: HypenRouter | null;\n private globalContext?: HypenGlobalContext;\n private stateChangeCallbacks: Array<() => void> = [];\n private dataSourceManager?: DataSourceManager;\n private dataSourceAccessor: DataSourceAccessor = {};\n\n constructor(\n engine: IEngine,\n definition: HypenModuleDefinition<T>,\n router?: HypenRouter | null,\n globalContext?: HypenGlobalContext\n ) {\n this.engine = engine;\n this.definition = definition;\n this.router = router ?? null;\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 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 context: context!,\n dataSources: this.dataSourceAccessor,\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 // Auto-register __hypen_bind for .bind() two-way binding support\n this.engine.onAction(\"__hypen_bind\", (action: Action) => {\n const payload = action.payload as { path?: string; value?: unknown } | null;\n if (!payload?.path) return;\n\n const segments = payload.path.split(\".\");\n let target: any = this.state;\n for (let i = 0; i < segments.length - 1; i++) {\n const seg = segments[i]!;\n target = target?.[seg];\n if (target == null) return;\n }\n const lastSeg = segments[segments.length - 1]!;\n target[lastSeg] = payload.value;\n });\n\n // Call onCreated — store the promise so callers can await initialization\n this._readyPromise = this.callCreatedHandler();\n }\n\n /** Promise that resolves when onCreated handler has completed */\n private _readyPromise: Promise<void> = Promise.resolve();\n\n /**\n * Wait for the module's onCreated handler to complete.\n * Call this before renderSource to ensure state is fully initialized.\n */\n async waitForReady(): Promise<void> {\n await this._readyPromise;\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 router: this.router,\n };\n\n // Expose hypen engine for built-in components (if available)\n const ctxRecord = ctx as unknown as Record<string, unknown>;\n if (ctxRecord.__hypenEngine) {\n (api as Record<string, unknown>).__hypenEngine = ctxRecord.__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, any>,\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 and connect data source plugins\n */\n private async callCreatedHandler(): Promise<void> {\n // Initialize data source plugins if any are registered\n if (this.definition.dataSources?.length) {\n // The engine must implement IDataSourceEngine methods\n const dsEngine = this.engine as unknown as IDataSourceEngine;\n this.dataSourceManager = new DataSourceManager(dsEngine);\n\n for (const { plugin, config } of this.definition.dataSources) {\n try {\n await this.dataSourceManager.use(plugin, config);\n // Wrap plugin in a Proxy so unknown method calls forward to plugin.call():\n // dataSources.spacetime.sendMessage(text) → plugin.call(\"sendMessage\", text)\n this.dataSourceAccessor[plugin.name] = new Proxy(plugin, {\n get(target, prop) {\n if (typeof prop === 'string' && !(prop in target)) {\n return (...args: unknown[]) => target.call(prop, ...args);\n }\n return (target as unknown as Record<string | symbol, unknown>)[prop];\n },\n }) as typeof plugin & Record<string, (...args: unknown[]) => Promise<unknown>>;\n } catch (e) {\n log.error(`Failed to connect data source \"${plugin.name}\":`, e);\n }\n }\n }\n\n if (this.definition.handlers.onCreated) {\n const context = this.globalContext ? this.createGlobalContextAPI() : undefined;\n try {\n await this.definition.handlers.onCreated(this.state, context);\n } catch (e) {\n const error = e instanceof HypenError ? e : new ActionError(\"onCreated\", e);\n const shouldRethrow = await this.handleError(error, { lifecycle: \"created\" });\n if (shouldRethrow) {\n throw error;\n }\n }\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 and disconnect all data source plugins\n */\n async destroy(): Promise<void> {\n if (this.isDestroyed) return;\n\n // Disconnect all data source plugins\n if (this.dataSourceManager) {\n try {\n await this.dataSourceManager.disconnectAll();\n } catch (e) {\n log.error(\"Error disconnecting data sources:\", e);\n }\n this.dataSourceManager = undefined;\n this.dataSourceAccessor = {};\n }\n\n if (this.definition.handlers.onDestroyed) {\n try {\n await this.definition.handlers.onDestroyed(this.state);\n } catch (e) {\n const error = e instanceof HypenError ? e : new ActionError(\"onDestroyed\", e);\n const shouldRethrow = await this.handleError(error, { lifecycle: \"destroyed\" });\n if (shouldRethrow) {\n throw error;\n }\n }\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",
11
- "/**\n * Hypen Tagged Template Literal\n *\n * Enables single-file components with inline UI templates.\n *\n * The `hypen` tagged template preserves ${state.x} and ${item.x} bindings\n * instead of interpolating them, allowing you to write:\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\n/**\n * Creates a proxy that captures property access as a binding path string.\n *\n * When used in a template literal, the proxy's toString() returns the\n * full binding expression (e.g., \"${state.user.name}\").\n *\n * @example\n * ```typescript\n * const state = createBindingProxy('state');\n * `${state.user.name}` // Returns: \"${state.user.name}\"\n * ```\n */\nfunction createBindingProxy(root: string): any {\n const handler: ProxyHandler<object> = {\n get(_, prop: string | symbol): any {\n // Handle Symbol.toPrimitive, toString, and valueOf for string conversion\n if (\n prop === Symbol.toPrimitive ||\n prop === \"toString\" ||\n prop === \"valueOf\"\n ) {\n return () => `\\${${root}}`;\n }\n\n // Handle other Symbol properties (e.g., Symbol.toStringTag)\n if (typeof prop === \"symbol\") {\n return undefined;\n }\n\n // Handle JSON.stringify\n if (prop === \"toJSON\") {\n return () => `\\${${root}}`;\n }\n\n // Chain to nested property: state.user -> state.user.name\n return createBindingProxy(`${root}.${prop}`);\n },\n\n // Support for `in` operator\n has() {\n return true;\n },\n\n // Support for Object.keys() - return empty to avoid enumeration issues\n ownKeys() {\n return [];\n },\n\n getOwnPropertyDescriptor() {\n return {\n configurable: true,\n enumerable: true,\n };\n },\n };\n\n return new Proxy({} as any, handler);\n}\n\n/**\n * Proxy for state bindings.\n *\n * Use in hypen templates to create reactive state bindings:\n *\n * @example\n * ```typescript\n * hypen`Text(\"Hello, ${state.user.name}\")`\n * // Produces: Text(\"Hello, ${state.user.name}\")\n * ```\n */\nexport const state: any = createBindingProxy(\"state\");\n\n/**\n * Proxy for item bindings in list iteration.\n *\n * Use inside List components to reference the current item:\n *\n * @example\n * ```typescript\n * hypen`\n * List(@state.items) {\n * Text(\"${item.name}: ${item.price}\")\n * }\n * `\n * ```\n */\nexport const item: any = createBindingProxy(\"item\");\n\n/**\n * Proxy for index in list iteration.\n *\n * Use inside List components to reference the current index:\n *\n * @example\n * ```typescript\n * hypen`\n * List(@state.items) {\n * Text(\"Item #${index}: ${item.name}\")\n * }\n * `\n * ```\n */\nexport const index: any = {\n [Symbol.toPrimitive]: () => \"${index}\",\n toString: () => \"${index}\",\n valueOf: () => \"${index}\",\n toJSON: () => \"${index}\",\n};\n\n/**\n * Tagged template literal for Hypen DSL templates.\n *\n * Works with the `state`, `item`, and `index` binding proxies to preserve\n * binding syntax in the output string.\n *\n * @example\n * ```typescript\n * import { hypen, state, item } from \"@hypen-space/core\";\n *\n * // Simple state binding\n * const t1 = hypen`Text(\"Count: ${state.count}\")`;\n * // Result: 'Text(\"Count: ${state.count}\")'\n *\n * // Nested state binding\n * const t2 = hypen`Text(\"Hello, ${state.user.profile.name}\")`;\n * // Result: 'Text(\"Hello, ${state.user.profile.name}\")'\n *\n * // List with item binding\n * const t3 = hypen`\n * List(@state.products) {\n * Text(\"${item.name} - $${item.price}\")\n * }\n * `;\n *\n * // Complex expressions (use regular JS interpolation for static values)\n * const title = \"My App\";\n * const t4 = hypen`Text(\"${title}: ${state.count}\")`;\n * // Result: 'Text(\"My App: ${state.count}\")'\n * ```\n *\n * @param strings - Template literal string parts\n * @param expressions - Interpolated expressions (proxies return binding strings)\n * @returns The template string with bindings preserved\n */\nexport function hypen(\n strings: TemplateStringsArray,\n ...expressions: unknown[]\n): string {\n let result = strings[0];\n\n for (let i = 0; i < expressions.length; i++) {\n const expr = expressions[i];\n\n // Convert expression to string\n // Binding proxies will return \"${state.x}\" via their toString()\n result += String(expr);\n result += strings[i + 1]!;\n }\n\n return result!.trim();\n}\n\n/**\n * Type helper for defining state shape.\n * Use with state proxy for better IDE support in complex scenarios.\n *\n * @example\n * ```typescript\n * type MyState = { user: { name: string; age: number } };\n * const typedState = state as StateProxy<MyState>;\n * ```\n */\nexport type StateProxy<T> = {\n [K in keyof T]: T[K] extends object\n ? StateProxy<T[K]> & { toString(): string }\n : { toString(): string };\n} & { toString(): string };\n\n/**\n * Type helper for item proxy in lists.\n */\nexport type ItemProxy<T> = StateProxy<T>;\n",
10
+ "/**\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\";\nimport { DataSourceManager, type DataSourcePlugin, type IDataSourceEngine } from \"./datasource.js\";\nimport type { StateStore } from \"./persistence.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 registerModule(name: string, actions: string[], stateKeys: string[], initialState: unknown): void;\n onAction(actionName: string, handler: (action: Action) => void | Promise<void>): void;\n /**\n * Apply a sparse state update.\n *\n * @param scope Lowercase module name to target a named module registered\n * via `registerModule`. Pass `null` (or empty string) to\n * target the primary module set via `setModule`.\n * @param paths Changed state paths (relative to the targeted module).\n * @param values Map of `path -> new value`.\n */\n updateStateSparse(\n scope: string | null,\n paths: string[],\n values: Record<string, unknown>\n ): 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 ActionContext<P = unknown> = {\n name: string;\n payload?: P;\n sender?: string;\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: HypenRouter | null;\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, P = unknown> {\n action: ActionContext<P>;\n state: T;\n context: GlobalContext;\n /** Access to registered data source plugins for mutations */\n dataSources: DataSourceAccessor;\n}\n\n/**\n * Provides typed access to registered data source plugins.\n * Unknown method calls are forwarded to `plugin.call()`:\n * `dataSources.spacetime.sendMessage(text)` → `plugin.call(\"sendMessage\", text)`\n *\n * You can also call `.call()` directly if you prefer:\n * `dataSources.spacetime.call(\"sendMessage\", text)`\n */\nexport interface DataSourceAccessor {\n [providerName: string]: DataSourcePlugin & Record<string, (...args: unknown[]) => Promise<unknown>>;\n}\n\n/**\n * Action handler - receives all context in a single object\n */\nexport type ActionHandler<T, P = unknown> = (ctx: ActionHandlerContext<T, P>) => 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 /**\n * Data source plugins registered via `.useDataSource()`.\n * Each entry contains the plugin and its configuration.\n */\n dataSources?: Array<{ plugin: DataSourcePlugin; config: unknown }>;\n /**\n * Pluggable state store for persistence across sessions.\n * Set via the `.persist(store)` builder method.\n */\n stateStore?: StateStore<T>;\n handlers: {\n onCreated?: LifecycleHandler<T>;\n onAction: Map<string, ActionHandler<T, any>>;\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, any>> = 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 private _registry?: Map<string, HypenModuleDefinition>;\n private dataSourceEntries: Array<{ plugin: DataSourcePlugin; config: unknown }> = [];\n private _stateStore?: StateStore<T>;\n\n constructor(\n initialState: T,\n options?: { persist?: boolean; version?: number; name?: string },\n registry?: Map<string, HypenModuleDefinition>\n ) {\n this.initialState = initialState;\n this.options = options || {};\n this._registry = registry;\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 * Optionally provide a payload type parameter for typed action payloads.\n *\n * @example\n * ```typescript\n * // Typed payload:\n * .onAction<{ amount: number }>(\"add\", ({ action, state }) => {\n * action.payload.amount; // fully typed\n * })\n *\n * // Untyped (payload is unknown):\n * .onAction(\"add\", ({ action, state }) => {\n * action.payload; // unknown\n * })\n * ```\n */\n onAction<P = unknown>(name: string, fn: ActionHandler<T, P>): this {\n this.actionHandlers.set(name, fn as ActionHandler<T, any>);\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 * Attach a persistent state store.\n * The store handles save/restore lifecycle automatically.\n *\n * @example\n * ```typescript\n * import { durableObjectStore, withKey } from \"@hypen-space/cf\";\n *\n * app\n * .defineState({ user: null, todos: [] }, { name: \"TodoList\" })\n * .persist(durableObjectStore(withKey(state => state.user?.id)))\n * .build();\n * ```\n */\n persist(store: StateStore<T>): this {\n this._stateStore = store;\n return this;\n }\n\n /**\n * Register a data source plugin for live database subscriptions.\n *\n * @example\n * ```typescript\n * import { SpacetimeDBPlugin } from \"@hypen-space/plugin-spacetimedb\";\n *\n * export default app\n * .defineState({ messageText: \"\" })\n * .useDataSource(new SpacetimeDBPlugin(), {\n * uri: \"ws://localhost:3000\",\n * moduleName: \"chat\",\n * tables: [\"user\", \"message\"],\n * })\n * .onAction(\"sendMessage\", async ({ state, dataSources }) => {\n * await dataSources.spacetime.sendMessage(state.messageText);\n * state.messageText = \"\";\n * })\n * .build();\n * ```\n *\n * In Hypen DSL, bind to data source tables with `@provider.table`:\n * ```hypen\n * ForEach(items: @spacetime.message, key: \"id\") {\n * Text(\"@{item.text}\")\n * }\n * ```\n */\n useDataSource<C>(plugin: DataSourcePlugin<C>, config: C): this {\n this.dataSourceEntries.push({ plugin: plugin as DataSourcePlugin, config });\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 * Load a UI template from a .hypen file on disk.\n *\n * @example\n * ```typescript\n * import { app } from \"@hypen-space/core\";\n *\n * export default app\n * .defineState({ count: 0 })\n * .onAction(\"increment\", ({ state }) => { state.count += 1; })\n * .uiFile(\"./counter.hypen\");\n * ```\n *\n * @param path - Path to a .hypen template file\n * @returns The built module definition (calls build() internally)\n */\n uiFile(path: string): HypenModuleDefinition<T> {\n const fs = require(\"fs\");\n this.template = fs.readFileSync(path, \"utf-8\").trim();\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 const definition: HypenModuleDefinition<T> = {\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 dataSources: this.dataSourceEntries.length > 0 ? this.dataSourceEntries : undefined,\n stateStore: this._stateStore,\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 // Auto-register in the app registry when the module has a name\n if (this.options.name && this._registry) {\n this._registry.set(this.options.name, definition as HypenModuleDefinition);\n }\n\n return definition;\n }\n}\n\n/**\n * Hypen App API — singleton factory and component registry.\n *\n * Modules built with a `name` are automatically registered here.\n * Consumers (ManagedRouter, RemoteServer, ComponentResolver) read from this\n * registry instead of requiring a separate ModuleRegistry instance.\n */\nexport class HypenApp {\n /** @internal */\n readonly _registry = new Map<string, HypenModuleDefinition>();\n\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, this._registry);\n }\n\n /**\n * Convenience: start a module builder with a name pre-set.\n *\n * @example\n * ```typescript\n * export default app\n * .module(\"Settings\")\n * .defineState({ theme: \"dark\" })\n * .ui(hypen`...`);\n * ```\n */\n module(name: string) {\n const registry = this._registry;\n return {\n defineState: <T>(\n initial: T,\n options?: { persist?: boolean; version?: number }\n ): HypenAppBuilder<T> => {\n return new HypenAppBuilder(initial, { ...options, name }, registry);\n },\n };\n }\n\n // ---------------------------------------------------------------------------\n // Registry API\n // ---------------------------------------------------------------------------\n\n /**\n * Get a registered module definition by component name.\n */\n get(name: string): HypenModuleDefinition | undefined {\n return this._registry.get(name);\n }\n\n /**\n * Check if a module definition is registered.\n */\n has(name: string): boolean {\n return this._registry.has(name);\n }\n\n /**\n * Read-only view of all registered component definitions.\n */\n get components(): ReadonlyMap<string, HypenModuleDefinition> {\n return this._registry;\n }\n\n /**\n * Get all registered component names.\n */\n getNames(): string[] {\n return Array.from(this._registry.keys());\n }\n\n /**\n * Number of registered definitions.\n */\n get size(): number {\n return this._registry.size;\n }\n\n /**\n * Unregister a module definition.\n */\n unregister(name: string): void {\n this._registry.delete(name);\n }\n\n /**\n * Clear all registered definitions.\n */\n clear(): void {\n this._registry.clear();\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 router: HypenRouter | null;\n private globalContext?: HypenGlobalContext;\n private stateChangeCallbacks: Array<() => void> = [];\n private dataSourceManager?: DataSourceManager;\n private dataSourceAccessor: DataSourceAccessor = {};\n private stateStore?: StateStore<T>;\n private currentPersistKey: string | null = null;\n private persistDebounceTimer: any;\n private sessionId: string;\n /**\n * Lowercase name used to address this module in the engine. Empty string\n * for anonymous modules (which back the engine's primary module slot).\n */\n private moduleKey: string = \"\";\n\n constructor(\n engine: IEngine,\n definition: HypenModuleDefinition<T>,\n router?: HypenRouter | null,\n globalContext?: HypenGlobalContext,\n sessionId?: string\n ) {\n this.engine = engine;\n this.definition = definition;\n this.router = router ?? null;\n this.globalContext = globalContext;\n this.sessionId = sessionId ?? crypto.randomUUID();\n this.stateStore = definition.stateStore;\n\n // Lowercase module name — used as the engine-side scope key. Empty for\n // anonymous modules (which become the engine's primary module).\n const moduleKey = (definition.name || \"\").toLowerCase();\n this.moduleKey = moduleKey;\n\n // Create observable state that forwards changed paths to the engine.\n // Paths are passed through raw — the engine handles module scoping via\n // the IR's `module_scope` field derived from `module <Name> { ... }` in\n // the DSL.\n this.state = createObservableState<T>(definition.initialState as T & object, {\n onChange: (change: StateChange) => {\n this.engine.updateStateSparse(\n moduleKey || null,\n change.paths,\n change.newValues\n );\n this.stateChangeCallbacks.forEach(cb => cb());\n this.persistIfNeeded();\n },\n });\n\n // Register the module with the engine. Named modules go into the\n // secondary `engine.modules` slot under their lowercase name; anonymous\n // modules become the engine's primary module.\n const snapshot = getStateSnapshot(this.state);\n if (moduleKey) {\n this.engine.registerModule(\n moduleKey,\n definition.actions,\n definition.stateKeys,\n snapshot\n );\n } else {\n this.engine.setModule(\n \"AnonymousModule\",\n definition.actions,\n definition.stateKeys,\n snapshot\n );\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 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 context: context!,\n dataSources: this.dataSourceAccessor,\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 // Auto-register __hypen_bind for .bind() two-way binding support\n this.engine.onAction(\"__hypen_bind\", (action: Action) => {\n const payload = action.payload as { path?: string; value?: unknown } | null;\n if (!payload?.path) return;\n\n const segments = payload.path.split(\".\");\n let target: any = this.state;\n for (let i = 0; i < segments.length - 1; i++) {\n const seg = segments[i]!;\n target = target?.[seg];\n if (target == null) return;\n }\n const lastSeg = segments[segments.length - 1]!;\n target[lastSeg] = payload.value;\n });\n\n // Call onCreated — store the promise so callers can await initialization\n this._readyPromise = this.callCreatedHandler();\n }\n\n /** Promise that resolves when onCreated handler has completed */\n private _readyPromise: Promise<void> = Promise.resolve();\n\n /**\n * Wait for the module's onCreated handler to complete.\n * Call this before renderSource to ensure state is fully initialized.\n */\n async waitForReady(): Promise<void> {\n await this._readyPromise;\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 router: this.router,\n };\n\n // Expose hypen engine for built-in components (if available)\n const ctxRecord = ctx as unknown as Record<string, unknown>;\n if (ctxRecord.__hypenEngine) {\n (api as Record<string, unknown>).__hypenEngine = ctxRecord.__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, any>,\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 * Re-evaluate the persistence key and debounce saves on state mutation.\n * Handles key transitions (null->value, value->null, value->different value).\n */\n private persistIfNeeded(): void {\n if (!this.stateStore) return;\n\n const store = this.stateStore;\n const newKey = store.resolveKey(\n this.state,\n this.definition.name || \"AnonymousModule\",\n this.sessionId\n );\n\n // Key transition: null -> value (e.g. login)\n if (newKey && !this.currentPersistKey) {\n this.activatePersistence(newKey);\n return;\n }\n\n // Key transition: value -> null (e.g. logout)\n if (!newKey && this.currentPersistKey) {\n this.currentPersistKey = null;\n return; // stop persisting, but don't delete stored data\n }\n\n // Key transition: value -> different value (e.g. account switch)\n if (newKey && newKey !== this.currentPersistKey) {\n this.activatePersistence(newKey);\n return;\n }\n\n // No key = no persistence\n if (!this.currentPersistKey) return;\n\n // Same key — debounced save\n clearTimeout(this.persistDebounceTimer);\n this.persistDebounceTimer = setTimeout(() => {\n const snapshot = getStateSnapshot(this.state);\n store.save(this.currentPersistKey!, snapshot);\n }, 50);\n }\n\n /**\n * Activate persistence for the given key: load stored state and merge.\n */\n private async activatePersistence(key: string): Promise<void> {\n this.currentPersistKey = key;\n const stored = await this.stateStore!.load(key);\n if (stored) {\n // Merge stored over initialState, then apply to live state\n const merged = { ...this.definition.initialState, ...stored };\n Object.assign(this.state, merged); // triggers re-render via proxy\n } else {\n // First time with this key — save current state\n const snapshot = getStateSnapshot(this.state);\n await this.stateStore!.save(key, snapshot);\n }\n }\n\n /**\n * Call the onCreated handler and connect data source plugins\n */\n private async callCreatedHandler(): Promise<void> {\n // Load persisted state before anything else\n if (this.stateStore) {\n const key = this.stateStore.resolveKey(\n this.state,\n this.definition.name || \"AnonymousModule\",\n this.sessionId\n );\n if (key) {\n this.currentPersistKey = key;\n const stored = await this.stateStore.load(key);\n if (stored) {\n const merged = { ...this.definition.initialState, ...stored };\n Object.assign(this.state, merged);\n }\n }\n }\n\n // Initialize data source plugins if any are registered\n if (this.definition.dataSources?.length) {\n // The engine must implement IDataSourceEngine methods\n const dsEngine = this.engine as unknown as IDataSourceEngine;\n this.dataSourceManager = new DataSourceManager(dsEngine);\n\n for (const { plugin, config } of this.definition.dataSources) {\n try {\n await this.dataSourceManager.use(plugin, config);\n // Wrap plugin in a Proxy so unknown method calls forward to plugin.call():\n // dataSources.spacetime.sendMessage(text) → plugin.call(\"sendMessage\", text)\n this.dataSourceAccessor[plugin.name] = new Proxy(plugin, {\n get(target, prop) {\n if (typeof prop === 'string' && !(prop in target)) {\n return (...args: unknown[]) => target.call(prop, ...args);\n }\n return (target as unknown as Record<string | symbol, unknown>)[prop];\n },\n }) as typeof plugin & Record<string, (...args: unknown[]) => Promise<unknown>>;\n } catch (e) {\n log.error(`Failed to connect data source \"${plugin.name}\":`, e);\n }\n }\n }\n\n if (this.definition.handlers.onCreated) {\n const context = this.globalContext ? this.createGlobalContextAPI() : undefined;\n try {\n await this.definition.handlers.onCreated(this.state, context);\n } catch (e) {\n const error = e instanceof HypenError ? e : new ActionError(\"onCreated\", e);\n const shouldRethrow = await this.handleError(error, { lifecycle: \"created\" });\n if (shouldRethrow) {\n throw error;\n }\n }\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 and disconnect all data source plugins\n */\n async destroy(): Promise<void> {\n if (this.isDestroyed) return;\n\n // Flush any pending persistence writes before shutdown\n if (this.currentPersistKey && this.stateStore) {\n clearTimeout(this.persistDebounceTimer);\n const snapshot = getStateSnapshot(this.state);\n await this.stateStore.save(this.currentPersistKey, snapshot);\n }\n\n // Disconnect all data source plugins\n if (this.dataSourceManager) {\n try {\n await this.dataSourceManager.disconnectAll();\n } catch (e) {\n log.error(\"Error disconnecting data sources:\", e);\n }\n this.dataSourceManager = undefined;\n this.dataSourceAccessor = {};\n }\n\n if (this.definition.handlers.onDestroyed) {\n try {\n await this.definition.handlers.onDestroyed(this.state);\n } catch (e) {\n const error = e instanceof HypenError ? e : new ActionError(\"onDestroyed\", e);\n const shouldRethrow = await this.handleError(error, { lifecycle: \"destroyed\" });\n if (shouldRethrow) {\n throw error;\n }\n }\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",
11
+ "/**\n * Hypen Tagged Template Literal\n *\n * Enables single-file components with inline UI templates.\n *\n * The `hypen` tagged template preserves @{state.x} and @{item.x} bindings\n * instead of interpolating them, allowing you to write:\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\n/**\n * Creates a proxy that captures property access as a binding path string.\n *\n * When used in a template literal, the proxy's toString() returns the\n * full binding expression (e.g., \"@{state.user.name}\"). This lets you\n * interpolate JS variables into hypen templates without losing type safety.\n *\n * @example\n * ```typescript\n * const state = createBindingProxy('state');\n * String(state.user.name) // Returns: \"@{state.user.name}\"\n * ```\n */\nfunction createBindingProxy(root: string): any {\n const handler: ProxyHandler<object> = {\n get(_, prop: string | symbol): any {\n // Handle Symbol.toPrimitive, toString, and valueOf for string conversion\n if (\n prop === Symbol.toPrimitive ||\n prop === \"toString\" ||\n prop === \"valueOf\"\n ) {\n return () => `@{${root}}`;\n }\n\n // Handle other Symbol properties (e.g., Symbol.toStringTag)\n if (typeof prop === \"symbol\") {\n return undefined;\n }\n\n // Handle JSON.stringify\n if (prop === \"toJSON\") {\n return () => `@{${root}}`;\n }\n\n // Chain to nested property: state.user -> state.user.name\n return createBindingProxy(`${root}.${prop}`);\n },\n\n // Support for `in` operator\n has() {\n return true;\n },\n\n // Support for Object.keys() - return empty to avoid enumeration issues\n ownKeys() {\n return [];\n },\n\n getOwnPropertyDescriptor() {\n return {\n configurable: true,\n enumerable: true,\n };\n },\n };\n\n return new Proxy({} as any, handler);\n}\n\n/**\n * Proxy for state bindings.\n *\n * In hypen templates, prefer the direct `@{state.x}` syntax. This proxy\n * exists for cases where you want to interpolate JS values into templates\n * — e.g., `hypen\\`Text(\"${state.user.name}\")\\`` produces the same string\n * as `hypen\\`Text(\"@{state.user.name}\")\\``.\n *\n * @example\n * ```typescript\n * // Preferred: direct syntax\n * hypen`Text(\"Hello, @{state.user.name}\")`\n *\n * // Also works: proxy interpolation\n * hypen`Text(\"Hello, ${state.user.name}\")`\n * ```\n */\nexport const state: any = createBindingProxy(\"state\");\n\n/**\n * Proxy for item bindings in list iteration.\n *\n * Use inside List components to reference the current item:\n *\n * @example\n * ```typescript\n * hypen`\n * List(@state.items) {\n * Text(\"@{item.name}: @{item.price}\")\n * }\n * `\n * ```\n */\nexport const item: any = createBindingProxy(\"item\");\n\n/**\n * Proxy for index in list iteration.\n *\n * Use inside List components to reference the current index:\n *\n * @example\n * ```typescript\n * hypen`\n * List(@state.items) {\n * Text(\"Item #@{index}: @{item.name}\")\n * }\n * `\n * ```\n */\nexport const index: any = {\n [Symbol.toPrimitive]: () => \"@{index}\",\n toString: () => \"@{index}\",\n valueOf: () => \"@{index}\",\n toJSON: () => \"@{index}\",\n};\n\n/**\n * Tagged template literal for Hypen DSL templates.\n *\n * Prefer the direct `@{state.x}` / `@{item.x}` syntax. The `state`, `item`,\n * and `index` proxies are available for interpolating JS variables or\n * mixing dynamic content with bindings.\n *\n * @example\n * ```typescript\n * import { hypen, state, item } from \"@hypen-space/core\";\n *\n * // Preferred: direct binding syntax\n * const t1 = hypen`Text(\"Count: @{state.count}\")`;\n *\n * // Nested paths work the same way\n * const t2 = hypen`Text(\"Hello, @{state.user.profile.name}\")`;\n *\n * // List with item binding\n * const t3 = hypen`\n * List(@state.products) {\n * Text(\"@{item.name} - $@{item.price}\")\n * }\n * `;\n *\n * // Interpolate JS variables alongside bindings\n * const title = \"My App\";\n * const t4 = hypen`Text(\"${title}: @{state.count}\")`;\n * // Result: 'Text(\"My App: @{state.count}\")'\n * ```\n *\n * @param strings - Template literal string parts\n * @param expressions - Interpolated JS values or binding proxies\n * @returns The template string with bindings preserved\n */\nexport function hypen(\n strings: TemplateStringsArray,\n ...expressions: unknown[]\n): string {\n let result = strings[0];\n\n for (let i = 0; i < expressions.length; i++) {\n const expr = expressions[i];\n\n // Convert expression to string\n // Binding proxies will return \"@{state.x}\" via their toString()\n result += String(expr);\n result += strings[i + 1]!;\n }\n\n return result!.trim();\n}\n\n/**\n * Type helper for defining state shape.\n * Use with state proxy for better IDE support in complex scenarios.\n *\n * @example\n * ```typescript\n * type MyState = { user: { name: string; age: number } };\n * const typedState = state as StateProxy<MyState>;\n * ```\n */\nexport type StateProxy<T> = {\n [K in keyof T]: T[K] extends object\n ? StateProxy<T[K]> & { toString(): string }\n : { toString(): string };\n} & { toString(): string };\n\n/**\n * Type helper for item proxy in lists.\n */\nexport type ItemProxy<T> = StateProxy<T>;\n",
12
12
  "/**\n * Renderer abstraction interface\n *\n * Renderers are pluggable and can be implemented for different platforms\n * (DOM, Canvas, Native, etc.)\n */\n\nimport type { Patch } from \"./types.js\";\nimport { frameworkLoggers } from \"./logger.js\";\n\nconst log = frameworkLoggers.renderer;\n\n/**\n * Renderer interface that all platform renderers must implement\n */\nexport interface Renderer {\n /**\n * Apply a batch of patches to the render tree\n */\n applyPatches(patches: Patch[]): void;\n\n /**\n * Get a node by its ID (optional, for debugging)\n */\n getNode?(id: string): any;\n\n /**\n * Clear the entire render tree\n */\n clear?(): void;\n}\n\n/**\n * Base renderer class with common utilities\n */\nexport abstract class BaseRenderer implements Renderer {\n protected nodes: Map<string, any> = new Map();\n\n abstract applyPatches(patches: Patch[]): void;\n\n getNode(id: string): any {\n return this.nodes.get(id);\n }\n\n clear(): void {\n this.nodes.clear();\n }\n\n /**\n * Apply a single patch\n */\n protected applyPatch(patch: Patch): void {\n switch (patch.type) {\n case \"create\":\n this.onCreate(patch.id!, patch.elementType!, patch.props || {});\n break;\n case \"setProp\":\n this.onSetProp(patch.id!, patch.name!, patch.value);\n break;\n case \"setText\":\n this.onSetText(patch.id!, patch.text!);\n break;\n case \"insert\":\n this.onInsert(patch.parentId!, patch.id!, patch.beforeId);\n break;\n case \"move\":\n this.onMove(patch.parentId!, patch.id!, patch.beforeId);\n break;\n case \"remove\":\n this.onRemove(patch.id!);\n break;\n case \"attachEvent\":\n this.onAttachEvent(patch.id!, patch.eventName!);\n break;\n case \"detachEvent\":\n this.onDetachEvent(patch.id!, patch.eventName!);\n break;\n }\n }\n\n /**\n * Platform-specific patch handlers\n */\n protected abstract onCreate(id: string, elementType: string, props: Record<string, any>): void;\n protected abstract onSetProp(id: string, name: string, value: any): void;\n protected abstract onSetText(id: string, text: string): void;\n protected abstract onInsert(parentId: string, id: string, beforeId?: string): void;\n protected abstract onMove(parentId: string, id: string, beforeId?: string): void;\n protected abstract onRemove(id: string): void;\n protected abstract onAttachEvent(id: string, eventName: string): void;\n protected abstract onDetachEvent(id: string, eventName: string): void;\n}\n\n/**\n * Console/Debug renderer that logs patches\n */\nexport class ConsoleRenderer implements Renderer {\n applyPatches(patches: Patch[]): void {\n console.group(\"Hypen Patches\");\n for (const patch of patches) {\n console.log(patch);\n }\n console.groupEnd();\n }\n}\n",
13
13
  "/**\n * Disposable Pattern for Resource Management\n *\n * Provides a consistent way to manage and clean up resources like\n * event listeners, timers, WebSocket connections, etc.\n */\n\nimport { frameworkLoggers } from \"./logger.js\";\n\nconst log = frameworkLoggers.lifecycle;\n\n/**\n * Interface for objects that can be disposed\n */\nexport interface Disposable {\n dispose(): void;\n}\n\n/**\n * Check if an object is Disposable\n */\nexport function isDisposable(obj: unknown): obj is Disposable {\n return (\n obj !== null &&\n typeof obj === 'object' &&\n 'dispose' in obj &&\n typeof (obj as Disposable).dispose === 'function'\n );\n}\n\n/**\n * A stack of disposables that are disposed in LIFO order\n */\nexport class DisposableStack implements Disposable {\n private stack: Disposable[] = [];\n private disposed = false;\n\n /**\n * Add a disposable to the stack and return it\n */\n add<T extends Disposable>(disposable: T): T {\n if (this.disposed) {\n // If already disposed, immediately dispose the new item\n disposable.dispose();\n return disposable;\n }\n this.stack.push(disposable);\n return disposable;\n }\n\n /**\n * Add a cleanup callback to the stack\n */\n addCallback(callback: () => void): void {\n this.add({ dispose: callback });\n }\n\n /**\n * Add a value with a custom dispose function\n */\n addValue<T>(value: T, dispose: (value: T) => void): T {\n this.add({ dispose: () => dispose(value) });\n return value;\n }\n\n /**\n * Dispose all items in reverse order (LIFO)\n */\n dispose(): void {\n if (this.disposed) return;\n this.disposed = true;\n\n while (this.stack.length > 0) {\n const item = this.stack.pop()!;\n try {\n item.dispose();\n } catch (error) {\n // Log but continue disposing other items\n log.error('Error during dispose:', error);\n }\n }\n }\n\n /**\n * Check if this stack has been disposed\n */\n get isDisposed(): boolean {\n return this.disposed;\n }\n\n /**\n * Get the number of items in the stack\n */\n get size(): number {\n return this.stack.length;\n }\n}\n\n/**\n * Create a disposable from an event listener\n */\nexport function disposableListener(\n target: EventTarget,\n event: string,\n handler: EventListenerOrEventListenerObject,\n options?: AddEventListenerOptions\n): Disposable {\n target.addEventListener(event, handler, options);\n return {\n dispose: () => target.removeEventListener(event, handler, options),\n };\n}\n\n/**\n * Create a disposable from a timeout\n */\nexport function disposableTimeout(\n callback: () => void,\n ms: number\n): Disposable & { id: ReturnType<typeof setTimeout> } {\n const id = setTimeout(callback, ms);\n return {\n id,\n dispose: () => clearTimeout(id),\n };\n}\n\n/**\n * Create a disposable from an interval\n */\nexport function disposableInterval(\n callback: () => void,\n ms: number\n): Disposable & { id: ReturnType<typeof setInterval> } {\n const id = setInterval(callback, ms);\n return {\n id,\n dispose: () => clearInterval(id),\n };\n}\n\n/**\n * Create a disposable from a WebSocket\n */\nexport function disposableWebSocket(ws: WebSocket): Disposable {\n return {\n dispose: () => {\n if (ws.readyState === WebSocket.OPEN || ws.readyState === WebSocket.CONNECTING) {\n ws.close();\n }\n },\n };\n}\n\n/**\n * Create a disposable from an AbortController\n */\nexport function disposableAbortController(): Disposable & { controller: AbortController; signal: AbortSignal } {\n const controller = new AbortController();\n return {\n controller,\n signal: controller.signal,\n dispose: () => controller.abort(),\n };\n}\n\n/**\n * Create a disposable subscription (for event emitters, observables, etc.)\n */\nexport function disposableSubscription(unsubscribe: () => void): Disposable {\n return { dispose: unsubscribe };\n}\n\n/**\n * Symbol used to store disposables on DOM elements\n */\nconst ELEMENT_DISPOSABLES = Symbol('hypen.disposables');\n\n/**\n * Get or create a DisposableStack for an HTML element\n */\nexport function getElementDisposables(element: HTMLElement): DisposableStack {\n const existing = (element as any)[ELEMENT_DISPOSABLES];\n if (existing instanceof DisposableStack) {\n return existing;\n }\n const stack = new DisposableStack();\n (element as any)[ELEMENT_DISPOSABLES] = stack;\n return stack;\n}\n\n/**\n * Dispose all disposables attached to an element\n */\nexport function disposeElement(element: HTMLElement): void {\n const stack = (element as any)[ELEMENT_DISPOSABLES];\n if (stack instanceof DisposableStack) {\n stack.dispose();\n delete (element as any)[ELEMENT_DISPOSABLES];\n }\n}\n\n/**\n * Check if an element has disposables\n */\nexport function hasElementDisposables(element: HTMLElement): boolean {\n return (element as any)[ELEMENT_DISPOSABLES] instanceof DisposableStack;\n}\n\n/**\n * Decorator/helper to make a class disposable\n * Tracks all resources and disposes them when dispose() is called\n */\nexport class DisposableMixin {\n protected disposables = new DisposableStack();\n\n /**\n * Register a disposable to be cleaned up\n */\n protected track<T extends Disposable>(disposable: T): T {\n return this.disposables.add(disposable);\n }\n\n /**\n * Register a cleanup callback\n */\n protected onDispose(callback: () => void): void {\n this.disposables.addCallback(callback);\n }\n\n /**\n * Dispose all tracked resources\n */\n dispose(): void {\n this.disposables.dispose();\n }\n}\n\n/**\n * Create a composite disposable that disposes multiple items together\n */\nexport function compositeDisposable(...disposables: Disposable[]): Disposable {\n return {\n dispose: () => {\n for (const d of disposables) {\n try {\n d.dispose();\n } catch (error) {\n log.error('Error during dispose:', error);\n }\n }\n },\n };\n}\n\n/**\n * Run a function with automatic cleanup on exit\n * Similar to Python's context managers or C#'s using statement\n */\nexport async function using<T extends Disposable, R>(\n resource: T | (() => T),\n fn: (resource: T) => R | Promise<R>\n): Promise<R> {\n const r = typeof resource === 'function' ? resource() : resource;\n try {\n return await fn(r);\n } finally {\n r.dispose();\n }\n}\n\n/**\n * Synchronous version of using()\n */\nexport function usingSync<T extends Disposable, R>(\n resource: T | (() => T),\n fn: (resource: T) => R\n): R {\n const r = typeof resource === 'function' ? resource() : resource;\n try {\n return fn(r);\n } finally {\n r.dispose();\n }\n}\n",
14
- "/**\n * Hypen Router - Declarative routing system\n * Integrated with Hypen's reactive state management\n */\n\nimport { createObservableState, getStateSnapshot } from \"./state.js\";\nimport { disposableListener, type Disposable } from \"./disposable.js\";\nimport { frameworkLoggers } from \"./logger.js\";\n\nconst log = frameworkLoggers.router;\n\nexport type RouteMatch = {\n params: Record<string, string>;\n query: Record<string, string>;\n path: string;\n};\n\nexport type RouteState = {\n currentPath: string;\n params: Record<string, string>;\n query: Record<string, string>;\n previousPath: string | null;\n};\n\nexport type RouteChangeCallback = (route: RouteState) => void;\n\n/**\n * Hypen Router - Manages application routing with pattern matching\n */\nexport class HypenRouter {\n private state: RouteState;\n private subscribers = new Set<RouteChangeCallback>();\n private isInitialized = false;\n private isUpdating = false;\n private browserListeners: Disposable[] = [];\n\n constructor() {\n // Create observable state for reactivity\n this.state = createObservableState<RouteState>(\n {\n currentPath: \"/\",\n params: {},\n query: {},\n previousPath: null,\n },\n {\n onChange: () => {\n this.notifySubscribers();\n },\n }\n );\n\n // Initialize from browser if available\n if (typeof window !== \"undefined\") {\n this.initializeBrowserSync();\n }\n }\n\n /**\n * Initialize browser history sync\n */\n private initializeBrowserSync() {\n // Get initial path from hash or pathname\n const initialPath = this.getPathFromBrowser();\n this.state.currentPath = initialPath;\n this.state.params = {};\n this.state.query = this.parseQuery();\n\n // Listen for browser back/forward\n this.browserListeners.push(\n disposableListener(window, \"popstate\", () => {\n const newPath = this.getPathFromBrowser();\n this.updatePath(newPath, false); // Don't push to history again\n })\n );\n\n // Listen for hash changes\n this.browserListeners.push(\n disposableListener(window, \"hashchange\", () => {\n // Don't respond to hashchange events we triggered ourselves\n if (this.isUpdating) return;\n const newPath = this.getPathFromBrowser();\n this.updatePath(newPath, false);\n })\n );\n\n this.isInitialized = true;\n log.debug(\"Router initialized at:\", initialPath);\n }\n\n /**\n * Get path from browser URL (supports both hash and pathname)\n */\n private getPathFromBrowser(): string {\n if (typeof window === \"undefined\") return \"/\";\n\n // Prefer hash-based routing for simplicity\n const hash = window.location.hash.slice(1);\n if (hash) return hash;\n\n // Fallback to pathname\n return window.location.pathname;\n }\n\n /**\n * Parse query string from URL\n */\n private parseQuery(): Record<string, string> {\n if (typeof window === \"undefined\") return {};\n\n const query: Record<string, string> = {};\n const searchParams = new URLSearchParams(window.location.search);\n\n searchParams.forEach((value, key) => {\n query[key] = value;\n });\n\n return query;\n }\n\n /**\n * Navigate to a new path\n */\n push(path: string) {\n log.debug(\"push:\", path);\n this.updatePath(path, true);\n }\n\n /**\n * Replace current path without adding to history\n */\n replace(path: string) {\n log.debug(\"replace:\", path);\n this.updatePath(path, true, true);\n }\n\n /**\n * Go back in history\n */\n back() {\n log.debug(\"back\");\n if (typeof window !== \"undefined\") {\n window.history.back();\n }\n }\n\n /**\n * Go forward in history\n */\n forward() {\n log.debug(\"forward\");\n if (typeof window !== \"undefined\") {\n window.history.forward();\n }\n }\n\n /**\n * Update the current path\n */\n private updatePath(\n path: string,\n updateBrowser: boolean,\n replace: boolean = false\n ) {\n // Prevent re-entrant updates\n if (this.isUpdating) return;\n\n this.isUpdating = true;\n try {\n const oldPath = this.state.currentPath;\n this.state.previousPath = oldPath;\n this.state.currentPath = path;\n this.state.query = this.parseQuery();\n\n // Notify subscribers synchronously before any browser events\n this.notifySubscribers();\n\n // Update browser URL if needed\n if (updateBrowser && typeof window !== \"undefined\") {\n const url = \"#\" + path;\n if (replace) {\n window.history.replaceState(null, \"\", url);\n } else {\n window.history.pushState(null, \"\", url);\n }\n\n // Manually trigger hashchange event\n const hashChangeEvent = new HashChangeEvent(\"hashchange\", {\n oldURL: window.location.href.replace(window.location.hash, \"#\" + oldPath),\n newURL: window.location.href,\n });\n window.dispatchEvent(hashChangeEvent);\n }\n } finally {\n this.isUpdating = false;\n }\n }\n\n /**\n * Get current path\n */\n getCurrentPath(): string {\n return this.state.currentPath;\n }\n\n /**\n * Get current route params\n */\n getParams(): Record<string, string> {\n return { ...this.state.params };\n }\n\n /**\n * Get current query params\n */\n getQuery(): Record<string, string> {\n return { ...this.state.query };\n }\n\n /**\n * Get full route state snapshot\n */\n getState(): RouteState {\n return getStateSnapshot(this.state);\n }\n\n /**\n * Match a pattern against a path\n */\n matchPath(pattern: string, path: string): RouteMatch | null {\n // Handle invalid inputs gracefully\n if (!pattern || typeof pattern !== 'string') {\n return null;\n }\n if (!path || typeof path !== 'string') {\n return null;\n }\n\n // Exact match\n if (pattern === path) {\n return {\n params: {},\n query: this.state.query,\n path,\n };\n }\n\n // Wildcard match: /dashboard/* matches /dashboard/anything\n if (pattern.endsWith(\"/*\")) {\n const prefix = pattern.slice(0, -2);\n if (path === prefix || path.startsWith(prefix + \"/\")) {\n return {\n params: {},\n query: this.state.query,\n path,\n };\n }\n return null;\n }\n\n // Parameter match: /users/:id matches /users/123\n const paramNames: string[] = [];\n const regexPattern = pattern\n .replace(/:([a-zA-Z_][a-zA-Z0-9_]*)/g, (_, name) => {\n paramNames.push(name);\n return \"([^/]+)\";\n })\n .replace(/\\*/g, \".*\");\n\n const regex = new RegExp(`^${regexPattern}$`);\n const match = path.match(regex);\n\n if (!match) return null;\n\n // Extract params\n const params: Record<string, string> = {};\n paramNames.forEach((name, i) => {\n const value = match[i + 1];\n if (value !== undefined) {\n params[name] = decodeURIComponent(value);\n }\n });\n\n return {\n params,\n query: this.state.query,\n path,\n };\n }\n\n /**\n * Subscribe to route changes\n */\n onNavigate(callback: RouteChangeCallback): () => void {\n this.subscribers.add(callback);\n\n // Call immediately with current state\n try {\n callback(this.getState());\n } catch (error) {\n log.error(\"Error in route subscriber:\", error);\n }\n\n // Return unsubscribe function\n return () => {\n this.subscribers.delete(callback);\n };\n }\n\n /**\n * Notify all subscribers of route change\n */\n private notifySubscribers() {\n const routeState = this.getState();\n this.subscribers.forEach((callback) => {\n try {\n callback(routeState);\n } catch (error) {\n log.error(\"Error in route subscriber:\", error);\n }\n });\n }\n\n /**\n * Check if a path matches the current route\n */\n isActive(pattern: string): boolean {\n return this.matchPath(pattern, this.state.currentPath) !== null;\n }\n\n /**\n * Get a URL with query params\n */\n buildUrl(path: string, query?: Record<string, string>): string {\n if (!query || Object.keys(query).length === 0) {\n return path;\n }\n\n const queryString = new URLSearchParams(query).toString();\n return `${path}?${queryString}`;\n }\n\n /**\n * Clean up browser event listeners and subscriptions\n */\n dispose(): void {\n for (const listener of this.browserListeners) {\n listener.dispose();\n }\n this.browserListeners = [];\n this.subscribers.clear();\n this.isInitialized = false;\n log.debug(\"Router disposed\");\n }\n\n /**\n * Support `using` syntax for automatic cleanup\n */\n [Symbol.dispose](): void {\n this.dispose();\n }\n}\n",
14
+ "/**\n * Hypen Router - Declarative routing system\n * Integrated with Hypen's reactive state management\n */\n\nimport { createObservableState, getStateSnapshot } from \"./state.js\";\nimport { disposableListener, type Disposable } from \"./disposable.js\";\nimport { frameworkLoggers } from \"./logger.js\";\n\nconst log = frameworkLoggers.router;\n\nexport type RouteMatch = {\n params: Record<string, string>;\n query: Record<string, string>;\n path: string;\n};\n\nexport type RouteState = {\n currentPath: string;\n params: Record<string, string>;\n query: Record<string, string>;\n previousPath: string | null;\n};\n\nexport type RouteChangeCallback = (route: RouteState) => void;\n\n/**\n * Hypen Router - Manages application routing with pattern matching\n */\nexport class HypenRouter {\n private state: RouteState;\n private subscribers = new Set<RouteChangeCallback>();\n private isInitialized = false;\n private isUpdating = false;\n private browserListeners: Disposable[] = [];\n\n constructor() {\n // Create observable state for reactivity\n this.state = createObservableState<RouteState>(\n {\n currentPath: \"/\",\n params: {},\n query: {},\n previousPath: null,\n },\n {\n onChange: () => {\n this.notifySubscribers();\n },\n }\n );\n\n // Initialize from browser if available\n if (typeof window !== \"undefined\") {\n this.initializeBrowserSync();\n }\n }\n\n /**\n * Initialize browser history sync\n */\n private initializeBrowserSync() {\n // Get initial path from hash or pathname\n const initialPath = this.getPathFromBrowser();\n this.state.currentPath = initialPath;\n this.state.params = {};\n this.state.query = this.parseQuery();\n\n // Listen for browser back/forward\n this.browserListeners.push(\n disposableListener(window, \"popstate\", () => {\n const newPath = this.getPathFromBrowser();\n this.updatePath(newPath, false); // Don't push to history again\n })\n );\n\n // Listen for hash changes\n this.browserListeners.push(\n disposableListener(window, \"hashchange\", () => {\n // Don't respond to hashchange events we triggered ourselves\n if (this.isUpdating) return;\n const newPath = this.getPathFromBrowser();\n this.updatePath(newPath, false);\n })\n );\n\n this.isInitialized = true;\n log.debug(\"Router initialized at:\", initialPath);\n }\n\n /**\n * Get path from browser URL (supports both hash and pathname)\n */\n private getPathFromBrowser(): string {\n if (typeof window === \"undefined\") return \"/\";\n\n // Prefer hash-based routing for simplicity\n const hash = window.location.hash.slice(1);\n if (hash) return hash;\n\n // Fallback to pathname\n return window.location.pathname;\n }\n\n /**\n * Parse query string from URL\n */\n private parseQuery(): Record<string, string> {\n if (typeof window === \"undefined\") return {};\n\n const query: Record<string, string> = {};\n const searchParams = new URLSearchParams(window.location.search);\n\n searchParams.forEach((value, key) => {\n query[key] = value;\n });\n\n return query;\n }\n\n /**\n * Navigate to a new path\n */\n push(path: string) {\n log.debug(\"push:\", path);\n this.updatePath(path, true);\n }\n\n /**\n * Replace current path without adding to history\n */\n replace(path: string) {\n log.debug(\"replace:\", path);\n this.updatePath(path, true, true);\n }\n\n /**\n * Go back in history\n */\n back() {\n log.debug(\"back\");\n if (typeof window !== \"undefined\") {\n window.history.back();\n }\n }\n\n /**\n * Go forward in history\n */\n forward() {\n log.debug(\"forward\");\n if (typeof window !== \"undefined\") {\n window.history.forward();\n }\n }\n\n /**\n * Update the current path\n */\n private updatePath(\n path: string,\n updateBrowser: boolean,\n replace: boolean = false\n ) {\n // Prevent re-entrant updates\n if (this.isUpdating) return;\n\n this.isUpdating = true;\n try {\n const oldPath = this.state.currentPath;\n this.state.previousPath = oldPath;\n this.state.currentPath = path;\n this.state.query = this.parseQuery();\n\n // Notify subscribers synchronously before any browser events\n this.notifySubscribers();\n\n // Update browser URL if needed\n if (updateBrowser && typeof window !== \"undefined\") {\n const url = \"#\" + path;\n if (replace) {\n window.history.replaceState(null, \"\", url);\n } else {\n window.history.pushState(null, \"\", url);\n }\n\n // Manually trigger hashchange event. Wrap in try-catch because\n // in test environments the global HashChangeEvent class may come\n // from a different realm than the window, causing dispatchEvent to\n // reject it with \"parameter 1 is not of type 'Event'\".\n try {\n const hashChangeEvent = new HashChangeEvent(\"hashchange\", {\n oldURL: window.location.href.replace(window.location.hash, \"#\" + oldPath),\n newURL: window.location.href,\n });\n window.dispatchEvent(hashChangeEvent);\n } catch {\n // Ignore cross-realm Event dispatch errors\n }\n }\n } finally {\n this.isUpdating = false;\n }\n }\n\n /**\n * Get current path\n */\n getCurrentPath(): string {\n return this.state.currentPath;\n }\n\n /**\n * Get current route params\n */\n getParams(): Record<string, string> {\n return { ...this.state.params };\n }\n\n /**\n * Get current query params\n */\n getQuery(): Record<string, string> {\n return { ...this.state.query };\n }\n\n /**\n * Get full route state snapshot\n */\n getState(): RouteState {\n return getStateSnapshot(this.state);\n }\n\n /**\n * Match a pattern against a path\n */\n matchPath(pattern: string, path: string): RouteMatch | null {\n // Handle invalid inputs gracefully\n if (!pattern || typeof pattern !== 'string') {\n return null;\n }\n if (!path || typeof path !== 'string') {\n return null;\n }\n\n // Exact match\n if (pattern === path) {\n return {\n params: {},\n query: this.state.query,\n path,\n };\n }\n\n // Wildcard match: /dashboard/* matches /dashboard/anything\n if (pattern.endsWith(\"/*\")) {\n const prefix = pattern.slice(0, -2);\n if (path === prefix || path.startsWith(prefix + \"/\")) {\n return {\n params: {},\n query: this.state.query,\n path,\n };\n }\n return null;\n }\n\n // Parameter match: /users/:id matches /users/123\n const paramNames: string[] = [];\n const regexPattern = pattern\n .replace(/:([a-zA-Z_][a-zA-Z0-9_]*)/g, (_, name) => {\n paramNames.push(name);\n return \"([^/]+)\";\n })\n .replace(/\\*/g, \".*\");\n\n const regex = new RegExp(`^${regexPattern}$`);\n const match = path.match(regex);\n\n if (!match) return null;\n\n // Extract params\n const params: Record<string, string> = {};\n paramNames.forEach((name, i) => {\n const value = match[i + 1];\n if (value !== undefined) {\n params[name] = decodeURIComponent(value);\n }\n });\n\n return {\n params,\n query: this.state.query,\n path,\n };\n }\n\n /**\n * Subscribe to route changes\n */\n onNavigate(callback: RouteChangeCallback): () => void {\n this.subscribers.add(callback);\n\n // Call immediately with current state\n try {\n callback(this.getState());\n } catch (error) {\n log.error(\"Error in route subscriber:\", error);\n }\n\n // Return unsubscribe function\n return () => {\n this.subscribers.delete(callback);\n };\n }\n\n /**\n * Notify all subscribers of route change\n */\n private notifySubscribers() {\n const routeState = this.getState();\n this.subscribers.forEach((callback) => {\n try {\n callback(routeState);\n } catch (error) {\n log.error(\"Error in route subscriber:\", error);\n }\n });\n }\n\n /**\n * Check if a path matches the current route\n */\n isActive(pattern: string): boolean {\n return this.matchPath(pattern, this.state.currentPath) !== null;\n }\n\n /**\n * Get a URL with query params\n */\n buildUrl(path: string, query?: Record<string, string>): string {\n if (!query || Object.keys(query).length === 0) {\n return path;\n }\n\n const queryString = new URLSearchParams(query).toString();\n return `${path}?${queryString}`;\n }\n\n /**\n * Clean up browser event listeners and subscriptions\n */\n dispose(): void {\n for (const listener of this.browserListeners) {\n listener.dispose();\n }\n this.browserListeners = [];\n this.subscribers.clear();\n this.isInitialized = false;\n log.debug(\"Router disposed\");\n }\n\n /**\n * Support `using` syntax for automatic cleanup\n */\n [Symbol.dispose](): void {\n this.dispose();\n }\n}\n",
15
15
  "/**\n * Type-safe Event System\n *\n * Provides strongly-typed event emission and subscription with autocomplete support.\n */\n\nimport { frameworkLoggers } from \"./logger.js\";\n\nconst log = frameworkLoggers.events;\n\nexport type EventHandler<T = unknown> = (payload: T) => void;\n\n/**\n * Type-safe event emitter with generics\n */\nexport class TypedEventEmitter<TEvents extends Record<string, unknown> = Record<string, unknown>> {\n private eventBus = new Map<keyof TEvents, Set<EventHandler<any>>>();\n\n /**\n * Emit an event with type-safe payload\n */\n emit<K extends keyof TEvents>(event: K, payload: TEvents[K]): void {\n const handlers = this.eventBus.get(event);\n if (!handlers || handlers.size === 0) {\n return;\n }\n\n handlers.forEach((handler) => {\n try {\n handler(payload);\n } catch (error) {\n log.error(`Error in event handler for \"${String(event)}\":`, error);\n }\n });\n }\n\n /**\n * Subscribe to an event with type-safe payload\n * Returns an unsubscribe function\n */\n on<K extends keyof TEvents>(event: K, handler: EventHandler<TEvents[K]>): () => void {\n if (!this.eventBus.has(event)) {\n this.eventBus.set(event, new Set());\n }\n\n const handlers = this.eventBus.get(event)!;\n handlers.add(handler);\n\n // Return unsubscribe function\n return () => {\n handlers.delete(handler);\n if (handlers.size === 0) {\n this.eventBus.delete(event);\n }\n };\n }\n\n /**\n * Subscribe to an event once (auto-unsubscribe after first emit)\n */\n once<K extends keyof TEvents>(event: K, handler: EventHandler<TEvents[K]>): () => void {\n const wrappedHandler = (payload: TEvents[K]) => {\n handler(payload);\n unsubscribe();\n };\n\n const unsubscribe = this.on(event, wrappedHandler);\n return unsubscribe;\n }\n\n /**\n * Unsubscribe a specific handler from an event\n */\n off<K extends keyof TEvents>(event: K, handler: EventHandler<TEvents[K]>): void {\n const handlers = this.eventBus.get(event);\n if (handlers) {\n handlers.delete(handler);\n if (handlers.size === 0) {\n this.eventBus.delete(event);\n }\n }\n }\n\n /**\n * Remove all listeners for a specific event\n */\n removeAllListeners<K extends keyof TEvents>(event: K): void {\n this.eventBus.delete(event);\n }\n\n /**\n * Remove all listeners for all events\n */\n clearAll(): void {\n this.eventBus.clear();\n }\n\n /**\n * Get the number of listeners for an event\n */\n listenerCount<K extends keyof TEvents>(event: K): number {\n return this.eventBus.get(event)?.size ?? 0;\n }\n\n /**\n * Get all registered event names\n */\n eventNames(): Array<keyof TEvents> {\n return Array.from(this.eventBus.keys());\n }\n}\n\n/**\n * Default events for Hypen framework (can be extended by users)\n */\nexport type HypenFrameworkEvents = {\n 'module:created': { moduleId: string };\n 'module:destroyed': { moduleId: string };\n 'route:changed': { from: string | null; to: string };\n 'state:updated': { moduleId: string; paths: string[] };\n 'action:dispatched': { moduleId: string; actionName: string; payload?: unknown };\n 'error': { message: string; error?: Error; context?: string };\n};\n\n/**\n * Create a typed event emitter with custom event map\n */\nexport function createEventEmitter<TEvents extends Record<string, unknown> = HypenFrameworkEvents>(): TypedEventEmitter<TEvents> {\n return new TypedEventEmitter<TEvents>();\n}\n",
16
16
  "/**\n * Global Context - Cross-module communication and state access\n */\n\nimport type { HypenModuleInstance } from \"./app.js\";\nimport { getStateSnapshot } from \"./state.js\";\nimport { TypedEventEmitter, type HypenFrameworkEvents } from \"./events.js\";\nimport { frameworkLoggers } from \"./logger.js\";\n\nconst log = frameworkLoggers.context;\n\nexport type ModuleReference<T = unknown> = {\n /**\n * Live proxy state - mutations are tracked and trigger re-renders.\n * Use `getState()` for a snapshot if you only need to read values.\n */\n state: T;\n setState: (patch: Partial<T>) => void;\n /**\n * Returns a deep-cloned snapshot of the current state.\n * Unlike `state`, mutations to the returned object are NOT tracked.\n */\n getState: () => T;\n};\n\nexport type EventHandler = (payload?: unknown) => void;\n\n/**\n * Global Context - Provides access to all modules and cross-module communication\n *\n * @template TEvents - Custom event map (extends HypenFrameworkEvents)\n */\nexport class HypenGlobalContext<TEvents extends Record<string, unknown> = HypenFrameworkEvents> {\n private modules = new Map<string, HypenModuleInstance>();\n private typedEvents: TypedEventEmitter<TEvents & Record<string, unknown>>;\n\n constructor() {\n this.typedEvents = new TypedEventEmitter<TEvents & Record<string, unknown>>();\n }\n\n /**\n * Get the typed event emitter for type-safe event handling\n */\n get events(): TypedEventEmitter<TEvents & Record<string, unknown>> {\n return this.typedEvents;\n }\n\n /**\n * Register a module instance with an ID\n */\n registerModule(id: string, instance: HypenModuleInstance) {\n if (this.modules.has(id)) {\n log.warn(`Module \"${id}\" is already registered. Overwriting.`);\n }\n this.modules.set(id, instance);\n log.debug(`Registered module: ${id}`);\n }\n\n /**\n * Unregister a module\n */\n unregisterModule(id: string) {\n this.modules.delete(id);\n log.debug(`Unregistered module: ${id}`);\n }\n\n /**\n * Get a module by ID with type safety\n */\n getModule<T = unknown>(id: string): ModuleReference<T> {\n const module = this.modules.get(id);\n if (!module) {\n throw new Error(\n `Module \"${id}\" not found. Available modules: ${Array.from(this.modules.keys()).join(\", \")}`\n );\n }\n\n return {\n state: module.getLiveState() as T,\n setState: (patch: Partial<T>) => module.updateState(patch),\n getState: () => module.getState() as T,\n };\n }\n\n /**\n * Check if a module exists\n */\n hasModule(id: string): boolean {\n return this.modules.has(id);\n }\n\n /**\n * Get all registered module IDs\n */\n getModuleIds(): string[] {\n return Array.from(this.modules.keys());\n }\n\n /**\n * Get the entire app state tree (snapshot)\n */\n getGlobalState(): Record<string, unknown> {\n const state: Record<string, unknown> = {};\n this.modules.forEach((module, id) => {\n state[id] = module.getState();\n });\n return state;\n }\n\n /**\n * Emit an event. Delegates to the TypedEventEmitter.\n */\n emit(event: string, payload?: unknown): void {\n if (this.typedEvents.listenerCount(event) === 0) {\n log.debug(`Event \"${event}\" emitted but no listeners`);\n return;\n }\n log.debug(`Emitting event: ${event}`, payload);\n this.typedEvents.emit(event, payload as TEvents[string]);\n }\n\n /**\n * Subscribe to an event. Delegates to the TypedEventEmitter.\n * Returns an unsubscribe function.\n */\n on(event: string, handler: EventHandler): () => void {\n log.debug(`Listening to event: ${event}`);\n return this.typedEvents.on(event, handler);\n }\n\n /**\n * Unsubscribe a specific handler from an event.\n * Delegates to the TypedEventEmitter.\n */\n off(event: string, handler: EventHandler): void {\n this.typedEvents.off(event, handler);\n }\n\n /**\n * Remove all listeners for a specific event.\n * Delegates to the TypedEventEmitter.\n */\n clearEvent(event: string): void {\n this.typedEvents.removeAllListeners(event);\n }\n\n /**\n * Remove all listeners for all events.\n * Delegates to the TypedEventEmitter.\n */\n clearAllEvents(): void {\n this.typedEvents.clearAll();\n }\n\n /**\n * Get debug info about the context\n */\n debug(): {\n modules: string[];\n events: Array<keyof TEvents | string>;\n state: Record<string, unknown>;\n } {\n return {\n modules: this.getModuleIds(),\n events: this.typedEvents.eventNames() as Array<keyof TEvents | string>,\n state: this.getGlobalState(),\n };\n }\n}\n",
17
17
  "/**\n * Retry Utility for Network Operations\n *\n * Provides configurable retry logic with exponential/linear backoff\n * for handling transient failures in network operations.\n */\n\nimport { type Result, Ok, Err } from \"./result.js\";\n\n/**\n * Options for retry behavior\n */\nexport interface RetryOptions {\n /** Maximum number of attempts (default: 3) */\n maxAttempts?: number;\n /** Initial delay in milliseconds (default: 1000) */\n delayMs?: number;\n /** Backoff strategy (default: 'exponential') */\n backoff?: \"linear\" | \"exponential\" | \"none\";\n /** Maximum delay cap in milliseconds (default: 30000) */\n maxDelayMs?: number;\n /** Jitter factor 0-1 to randomize delays (default: 0.1) */\n jitter?: number;\n /** Callback on each retry attempt */\n onRetry?: (attempt: number, error: Error, nextDelayMs: number) => void;\n /** Optional predicate to determine if error is retryable */\n shouldRetry?: (error: Error) => boolean;\n /** AbortSignal for cancellation */\n signal?: AbortSignal;\n}\n\n/**\n * Default retry options\n */\nconst DEFAULT_OPTIONS: Required<Omit<RetryOptions, \"onRetry\" | \"shouldRetry\" | \"signal\">> = {\n maxAttempts: 3,\n delayMs: 1000,\n backoff: \"exponential\",\n maxDelayMs: 30000,\n jitter: 0.1,\n};\n\n/**\n * Calculate delay for a given attempt\n */\nfunction calculateDelay(\n attempt: number,\n options: Required<Omit<RetryOptions, \"onRetry\" | \"shouldRetry\" | \"signal\">>\n): number {\n let delay: number;\n\n switch (options.backoff) {\n case \"exponential\":\n // 2^(attempt-1) * delayMs: 1x, 2x, 4x, 8x...\n delay = options.delayMs * Math.pow(2, attempt - 1);\n break;\n case \"linear\":\n // attempt * delayMs: 1x, 2x, 3x, 4x...\n delay = options.delayMs * attempt;\n break;\n case \"none\":\n delay = options.delayMs;\n break;\n }\n\n // Apply jitter (randomize ±jitter%)\n if (options.jitter > 0) {\n const jitterRange = delay * options.jitter;\n delay += (Math.random() * 2 - 1) * jitterRange;\n }\n\n // Cap at maxDelayMs\n return Math.min(delay, options.maxDelayMs);\n}\n\n/**\n * Sleep for a given duration, respecting abort signal\n */\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) {\n reject(new Error(\"Retry aborted\"));\n return;\n }\n\n const timeoutId = setTimeout(resolve, ms);\n\n signal?.addEventListener(\"abort\", () => {\n clearTimeout(timeoutId);\n reject(new Error(\"Retry aborted\"));\n });\n });\n}\n\n/**\n * Retry a function with configurable backoff\n *\n * @example\n * ```typescript\n * // Basic usage\n * const result = await retry(() => fetch('/api/data'));\n *\n * // With options\n * const result = await retry(\n * () => fetch('/api/data'),\n * {\n * maxAttempts: 5,\n * delayMs: 2000,\n * backoff: 'exponential',\n * onRetry: (n, err) => console.log(`Attempt ${n} failed: ${err.message}`)\n * }\n * );\n * ```\n */\nexport async function retry<T>(\n fn: () => T | Promise<T>,\n options: RetryOptions = {}\n): Promise<T> {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n let lastError: Error = new Error(\"No attempts made\");\n\n for (let attempt = 1; attempt <= opts.maxAttempts; attempt++) {\n try {\n // Check for abort before each attempt\n if (opts.signal?.aborted) {\n throw new Error(\"Retry aborted\");\n }\n\n return await fn();\n } catch (e) {\n lastError = e instanceof Error ? e : new Error(String(e));\n\n // Check if we should retry this error\n if (opts.shouldRetry && !opts.shouldRetry(lastError)) {\n throw lastError;\n }\n\n // If this was the last attempt, don't wait\n if (attempt === opts.maxAttempts) {\n break;\n }\n\n // Calculate delay and notify\n const delayMs = calculateDelay(attempt, opts);\n opts.onRetry?.(attempt, lastError, delayMs);\n\n // Wait before next attempt\n await sleep(delayMs, opts.signal);\n }\n }\n\n throw lastError;\n}\n\n/**\n * Retry a function, returning a Result instead of throwing\n *\n * @example\n * ```typescript\n * const result = await retryResult(() => fetch('/api/data'));\n * if (result.ok) {\n * console.log('Success:', result.value);\n * } else {\n * console.error('All retries failed:', result.error);\n * }\n * ```\n */\nexport async function retryResult<T>(\n fn: () => T | Promise<T>,\n options: RetryOptions = {}\n): Promise<Result<T, Error>> {\n try {\n const value = await retry(fn, options);\n return Ok(value);\n } catch (e) {\n return Err(e instanceof Error ? e : new Error(String(e)));\n }\n}\n\n/**\n * Create a retryable version of a function\n *\n * @example\n * ```typescript\n * const fetchWithRetry = withRetry(\n * (url: string) => fetch(url),\n * { maxAttempts: 3 }\n * );\n *\n * const response = await fetchWithRetry('/api/data');\n * ```\n */\nexport function withRetry<TArgs extends unknown[], TReturn>(\n fn: (...args: TArgs) => TReturn | Promise<TReturn>,\n options: RetryOptions = {}\n): (...args: TArgs) => Promise<TReturn> {\n return (...args: TArgs) => retry(() => fn(...args), options);\n}\n\n/**\n * Predefined retry conditions\n */\nexport const RetryConditions = {\n /**\n * Retry on network errors (fetch failures, timeouts)\n */\n networkErrors: (error: Error): boolean => {\n const message = error.message.toLowerCase();\n return (\n message.includes(\"network\") ||\n message.includes(\"fetch\") ||\n message.includes(\"timeout\") ||\n message.includes(\"econnrefused\") ||\n message.includes(\"econnreset\") ||\n message.includes(\"socket\")\n );\n },\n\n /**\n * Retry on specific HTTP status codes (from fetch Response)\n */\n httpRetryable: (error: Error & { status?: number }): boolean => {\n const status = error.status;\n if (!status) return false;\n // Retry on 408, 429, 500, 502, 503, 504\n return [408, 429, 500, 502, 503, 504].includes(status);\n },\n\n /**\n * Retry on transient WebSocket errors\n */\n websocketErrors: (error: Error): boolean => {\n const message = error.message.toLowerCase();\n return (\n message.includes(\"websocket\") ||\n message.includes(\"connection\") ||\n message.includes(\"close\")\n );\n },\n\n /**\n * Combine multiple conditions (retry if any match)\n */\n any:\n (...conditions: Array<(error: Error) => boolean>) =>\n (error: Error): boolean =>\n conditions.some((c) => c(error)),\n\n /**\n * Combine multiple conditions (retry if all match)\n */\n all:\n (...conditions: Array<(error: Error) => boolean>) =>\n (error: Error): boolean =>\n conditions.every((c) => c(error)),\n};\n\n/**\n * Preset configurations for common use cases\n */\nexport const RetryPresets = {\n /**\n * Aggressive retry for critical operations\n */\n aggressive: {\n maxAttempts: 10,\n delayMs: 500,\n backoff: \"exponential\" as const,\n maxDelayMs: 60000,\n jitter: 0.2,\n },\n\n /**\n * Conservative retry for non-critical operations\n */\n conservative: {\n maxAttempts: 3,\n delayMs: 2000,\n backoff: \"linear\" as const,\n maxDelayMs: 10000,\n jitter: 0.1,\n },\n\n /**\n * Fast retry for local operations (short delays)\n */\n fast: {\n maxAttempts: 5,\n delayMs: 100,\n backoff: \"exponential\" as const,\n maxDelayMs: 2000,\n jitter: 0,\n },\n\n /**\n * WebSocket reconnection preset\n */\n websocket: {\n maxAttempts: 10,\n delayMs: 1000,\n backoff: \"exponential\" as const,\n maxDelayMs: 30000,\n jitter: 0.1,\n shouldRetry: RetryConditions.websocketErrors,\n },\n};\n",
18
- "/**\n * RemoteEngine - Connect to a remote Hypen app over WebSocket\n * Platform-agnostic client (uses standard WebSocket API)\n *\n * Usage:\n * ```typescript\n * const engine = new RemoteEngine(\"ws://localhost:3000\", {\n * session: {\n * id: localStorage.getItem(\"sessionId\") ?? undefined,\n * props: { platform: \"web\", version: \"1.0\" }\n * }\n * });\n *\n * engine.onSessionEstablished(({ sessionId, isNew, isRestored }) => {\n * localStorage.setItem(\"sessionId\", sessionId);\n * console.log(isRestored ? \"Welcome back!\" : \"New session\");\n * });\n *\n * engine.onSessionExpired((reason) => {\n * localStorage.removeItem(\"sessionId\");\n * });\n *\n * const result = await engine.connect();\n * if (!result.ok) {\n * console.error(\"Connection failed:\", result.error);\n * }\n * ```\n */\n\nimport type {\n RemoteMessage,\n InitialTreeMessage,\n PatchMessage,\n DispatchActionMessage,\n UpdateStateMessage,\n SubscribeStateMessage,\n HelloMessage,\n SessionAckMessage,\n SessionExpiredMessage,\n} from \"./types.js\";\nimport type { Patch } from \"../types.js\";\nimport {\n type Result,\n Ok,\n Err,\n ConnectionError,\n} from \"../result.js\";\nimport {\n type Disposable,\n DisposableStack,\n disposableTimeout,\n disposableWebSocket,\n disposableListener,\n} from \"../disposable.js\";\nimport { retry, type RetryOptions } from \"../retry.js\";\nimport { frameworkLoggers } from \"../logger.js\";\n\nconst log = frameworkLoggers.remote;\n\nexport type RemoteConnectionState =\n | \"disconnected\"\n | \"connecting\"\n | \"connected\"\n | \"error\";\n\n/**\n * Session configuration for the client\n */\nexport interface SessionOptions {\n /** Session ID to resume (omit for new session) */\n id?: string;\n /** Client metadata (platform, version, userId, etc.) */\n props?: Record<string, unknown>;\n}\n\n/**\n * Session information received from server\n */\nexport interface SessionInfo {\n sessionId: string;\n isNew: boolean;\n isRestored: boolean;\n}\n\n/**\n * Navigation options for platform back-button integration.\n *\n * When enabled, the client listens for platform back events (browser popstate,\n * Android back button) and dispatches a configurable action to the server.\n * The server module handles navigation via its own route stack.\n */\nexport interface NavigationOptions {\n /** Action name dispatched on back navigation (default: \"navigateBack\") */\n backAction?: string;\n /**\n * State key that represents the current view/route on the server.\n * When this key changes in a stateUpdate, the client pushes a browser\n * history entry so the back button works. (default: \"currentView\")\n */\n viewStateKey?: string;\n}\n\nexport interface RemoteEngineOptions {\n autoReconnect?: boolean;\n reconnectInterval?: number;\n maxReconnectAttempts?: number;\n /** Session configuration */\n session?: SessionOptions;\n /**\n * Enable platform back-button integration.\n * Pass `true` for defaults, or an object to customize action/key names.\n */\n navigation?: boolean | NavigationOptions;\n}\n\ninterface ResolvedNavigationOptions {\n backAction: string;\n viewStateKey: string;\n}\n\ninterface RequiredOptions {\n autoReconnect: boolean;\n reconnectInterval: number;\n maxReconnectAttempts: number;\n session?: SessionOptions;\n navigation?: ResolvedNavigationOptions;\n}\n\n/**\n * Client-side engine that connects to a remote Hypen app\n */\nexport class RemoteEngine implements Disposable {\n private ws: WebSocket | null = null;\n private readonly url: string;\n private state: RemoteConnectionState = \"disconnected\";\n private readonly options: RequiredOptions;\n private reconnectAttempts = 0;\n\n // Resource management\n private readonly disposables = new DisposableStack();\n private reconnectDisposable: Disposable | null = null;\n\n // Session state\n private currentSessionId: string | null = null;\n private readonly sessionOptions?: SessionOptions;\n\n // Callbacks\n private readonly patchCallbacks: Array<(patches: Patch[]) => void> = [];\n private readonly stateCallbacks: Array<(state: unknown) => void> = [];\n private readonly connectionCallbacks: Array<() => void> = [];\n private readonly disconnectionCallbacks: Array<() => void> = [];\n private readonly errorCallbacks: Array<(error: Error) => void> = [];\n private readonly sessionEstablishedCallbacks: Array<(info: SessionInfo) => void> = [];\n private readonly sessionExpiredCallbacks: Array<(reason: string) => void> = [];\n\n // State\n private currentState: unknown = null;\n private currentRevision = 0;\n private moduleName: string = \"\";\n\n // Navigation\n private navigationDisposable: Disposable | null = null;\n private lastViewValue: string | null = null;\n private handlingPopState = false;\n\n constructor(url: string, options: RemoteEngineOptions = {}) {\n this.url = url;\n const navOpt = options.navigation;\n const navigation = navOpt\n ? {\n backAction: (typeof navOpt === \"object\" ? navOpt.backAction : undefined) ?? \"navigateBack\",\n viewStateKey: (typeof navOpt === \"object\" ? navOpt.viewStateKey : undefined) ?? \"currentView\",\n }\n : undefined;\n\n this.options = {\n autoReconnect: options.autoReconnect ?? true,\n reconnectInterval: options.reconnectInterval ?? 3000,\n maxReconnectAttempts: options.maxReconnectAttempts ?? 10,\n session: options.session,\n navigation,\n };\n this.sessionOptions = options.session;\n\n // If session ID was provided, use it as current\n if (options.session?.id) {\n this.currentSessionId = options.session.id;\n }\n }\n\n /**\n * Connect to the remote server\n * Returns a Result indicating success or failure\n */\n async connect(): Promise<Result<void, ConnectionError>> {\n if (this.state === \"connected\" || this.state === \"connecting\") {\n return Ok(undefined);\n }\n\n this.state = \"connecting\";\n\n return new Promise((resolve) => {\n try {\n this.ws = new WebSocket(this.url);\n\n // Track the WebSocket for cleanup\n this.disposables.add(disposableWebSocket(this.ws));\n\n // Set up message handler\n const messageHandler = (event: MessageEvent) => {\n this.handleMessage(event.data);\n };\n this.disposables.add(\n disposableListener(this.ws, \"message\", messageHandler as EventListener)\n );\n\n // Set up error handler\n const errorHandler = () => {\n this.state = \"error\";\n const error = new ConnectionError(this.url, new Error(\"WebSocket error\"));\n this.errorCallbacks.forEach((cb) => cb(error));\n resolve(Err(error));\n };\n this.disposables.add(\n disposableListener(this.ws, \"error\", errorHandler)\n );\n\n // Set up close handler\n const closeHandler = () => {\n this.state = \"disconnected\";\n this.disconnectionCallbacks.forEach((cb) => cb());\n this.attemptReconnect();\n };\n this.disposables.add(\n disposableListener(this.ws, \"close\", closeHandler)\n );\n\n // Set up open handler\n this.ws.onopen = () => {\n this.state = \"connected\";\n this.reconnectAttempts = 0;\n\n // Cancel any pending reconnect\n if (this.reconnectDisposable) {\n this.reconnectDisposable.dispose();\n this.reconnectDisposable = null;\n }\n\n // Send hello message with session info\n this.sendHello();\n\n this.connectionCallbacks.forEach((cb) => cb());\n resolve(Ok(undefined));\n };\n } catch (e) {\n this.state = \"error\";\n const error = new ConnectionError(this.url, e);\n resolve(Err(error));\n }\n });\n }\n\n /**\n * Send hello message to establish session\n */\n private sendHello(): void {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) return;\n\n const hello: HelloMessage = {\n type: \"hello\",\n sessionId: this.currentSessionId ?? this.sessionOptions?.id,\n props: this.sessionOptions?.props,\n };\n\n this.ws.send(JSON.stringify(hello));\n }\n\n /**\n * Disconnect from the remote server and clean up resources\n */\n disconnect(): void {\n // Cancel any pending reconnect\n if (this.reconnectDisposable) {\n this.reconnectDisposable.dispose();\n this.reconnectDisposable = null;\n }\n\n // Close WebSocket if open\n if (this.ws) {\n if (this.ws.readyState === WebSocket.OPEN || this.ws.readyState === WebSocket.CONNECTING) {\n this.ws.close();\n }\n this.ws = null;\n }\n\n this.state = \"disconnected\";\n }\n\n /**\n * Dispose all resources (alias for disconnect)\n */\n dispose(): void {\n this.disconnect();\n if (this.navigationDisposable) {\n this.navigationDisposable.dispose();\n this.navigationDisposable = null;\n }\n this.disposables.dispose();\n }\n\n // ── Navigation ────────────────────────────────────────────────\n\n /**\n * Set up the browser popstate listener for back-button integration.\n * Called automatically after the initial tree is received.\n */\n private setupNavigation(): void {\n const nav = this.options.navigation;\n if (!nav || typeof window === \"undefined\") return;\n if (this.navigationDisposable) return; // already set up\n\n this.navigationDisposable = disposableListener(window, \"popstate\", () => {\n if (this.handlingPopState) return;\n\n // Browser went back — dispatch the back action to the server\n log.debug(\"Back navigation detected, dispatching:\", nav.backAction);\n this.handlingPopState = true;\n this.dispatchAction(nav.backAction);\n // Flag cleared when we receive the next state update\n });\n }\n\n /**\n * Track view changes from the server and push browser history entries.\n * This keeps the browser history stack in sync with server-side navigation\n * so that the back button has entries to pop.\n */\n private trackViewChange(state: unknown): void {\n const nav = this.options.navigation;\n if (!nav || typeof window === \"undefined\") return;\n\n const viewValue = this.resolveStateKey(state, nav.viewStateKey);\n if (viewValue === undefined || viewValue === this.lastViewValue) return;\n\n if (this.handlingPopState) {\n // This state update was caused by our own back action — don't push\n this.handlingPopState = false;\n this.lastViewValue = viewValue;\n return;\n }\n\n // Only push if we had a previous view (skip the initial load)\n if (this.lastViewValue !== null) {\n window.history.pushState({ view: viewValue }, \"\", \"\");\n }\n this.lastViewValue = viewValue;\n }\n\n /**\n * Resolve a dot-path key from state (e.g., \"currentView\" or \"ui.page\").\n */\n private resolveStateKey(state: unknown, key: string): string | undefined {\n if (!state || typeof state !== \"object\") return undefined;\n const parts = key.split(\".\");\n let current: any = state;\n for (const part of parts) {\n if (current == null || typeof current !== \"object\") return undefined;\n current = current[part];\n }\n return typeof current === \"string\" ? current : undefined;\n }\n\n /**\n * Dispatch an action to the remote server\n */\n dispatchAction(action: string, payload?: unknown): void {\n if (this.state !== \"connected\" || !this.ws) {\n log.warn(\"Cannot dispatch action: not connected\");\n return;\n }\n\n const message: DispatchActionMessage = {\n type: \"dispatchAction\",\n module: this.moduleName,\n action,\n payload,\n };\n\n this.ws.send(JSON.stringify(message));\n }\n\n /**\n * Subscribe to state updates after each render.\n * Only subscribed clients receive stateUpdate messages (avoids overhead for native clients).\n */\n subscribeState(): void {\n if (this.state !== \"connected\" || !this.ws) {\n log.warn(\"Cannot subscribe to state: not connected\");\n return;\n }\n\n const message: SubscribeStateMessage = { type: \"subscribeState\" };\n this.ws.send(JSON.stringify(message));\n }\n\n /**\n * Override the remote module's state (e.g. for time-travel).\n * The server will update state, re-render, and send back patches.\n */\n updateState(state: unknown): void {\n if (this.state !== \"connected\" || !this.ws) {\n log.warn(\"Cannot update state: not connected\");\n return;\n }\n\n const message: UpdateStateMessage = {\n type: \"updateState\",\n module: this.moduleName,\n state,\n };\n\n this.ws.send(JSON.stringify(message));\n }\n\n /**\n * Register callback for patches\n */\n onPatches(callback: (patches: Patch[]) => void): this {\n this.patchCallbacks.push(callback);\n return this;\n }\n\n /**\n * Register callback for state updates\n */\n onStateUpdate(callback: (state: unknown) => void): this {\n this.stateCallbacks.push(callback);\n return this;\n }\n\n /**\n * Register callback for connection\n */\n onConnect(callback: () => void): this {\n this.connectionCallbacks.push(callback);\n return this;\n }\n\n /**\n * Register callback for disconnection\n */\n onDisconnect(callback: () => void): this {\n this.disconnectionCallbacks.push(callback);\n return this;\n }\n\n /**\n * Register callback for errors\n */\n onError(callback: (error: Error) => void): this {\n this.errorCallbacks.push(callback);\n return this;\n }\n\n /**\n * Register callback for session establishment\n * Called when server confirms session (new or resumed)\n */\n onSessionEstablished(callback: (info: SessionInfo) => void): this {\n this.sessionEstablishedCallbacks.push(callback);\n return this;\n }\n\n /**\n * Register callback for session expiration\n * Called when session is kicked or expires\n */\n onSessionExpired(callback: (reason: string) => void): this {\n this.sessionExpiredCallbacks.push(callback);\n return this;\n }\n\n /**\n * Get current connection state\n */\n getConnectionState(): RemoteConnectionState {\n return this.state;\n }\n\n /**\n * Get current app state\n */\n getCurrentState(): unknown {\n return this.currentState;\n }\n\n /**\n * Get current revision\n */\n getRevision(): number {\n return this.currentRevision;\n }\n\n /**\n * Get current session ID\n */\n getSessionId(): string | null {\n return this.currentSessionId;\n }\n\n private handleMessage(data: string): void {\n try {\n const message = JSON.parse(data) as RemoteMessage;\n\n switch (message.type) {\n case \"sessionAck\":\n this.handleSessionAck(message as SessionAckMessage);\n break;\n\n case \"sessionExpired\":\n this.handleSessionExpired(message as SessionExpiredMessage);\n break;\n\n case \"initialTree\":\n this.handleInitialTree(message as InitialTreeMessage);\n break;\n\n case \"patch\":\n this.handlePatch(message as PatchMessage);\n break;\n\n case \"stateUpdate\":\n this.currentState = (message as { state: unknown }).state;\n this.trackViewChange(this.currentState);\n this.stateCallbacks.forEach((cb) => cb(this.currentState));\n break;\n }\n } catch (e) {\n log.error(\"Error handling remote message:\", e);\n const error = e instanceof Error ? e : new Error(String(e));\n this.errorCallbacks.forEach((cb) => cb(error));\n }\n }\n\n private handleSessionAck(message: SessionAckMessage): void {\n this.currentSessionId = message.sessionId;\n\n const info: SessionInfo = {\n sessionId: message.sessionId,\n isNew: message.isNew,\n isRestored: message.isRestored,\n };\n\n this.sessionEstablishedCallbacks.forEach((cb) => cb(info));\n }\n\n private handleSessionExpired(message: SessionExpiredMessage): void {\n this.currentSessionId = null;\n this.sessionExpiredCallbacks.forEach((cb) => cb(message.reason));\n }\n\n private handleInitialTree(message: InitialTreeMessage): void {\n this.moduleName = message.module;\n this.currentState = message.state;\n this.currentRevision = message.revision;\n\n // Apply initial patches\n if (message.patches.length > 0) {\n this.patchCallbacks.forEach((cb) => cb(message.patches));\n }\n\n // Initialize navigation tracking from initial state\n this.trackViewChange(message.state);\n this.setupNavigation();\n\n // Auto-subscribe to state when navigation is enabled so we can\n // track view changes and push browser history entries.\n if (this.options.navigation) {\n this.subscribeState();\n }\n\n // Notify state callbacks\n this.stateCallbacks.forEach((cb) => cb(message.state));\n }\n\n private handlePatch(message: PatchMessage): void {\n // Check revision ordering\n if (message.revision <= this.currentRevision) {\n log.warn(`Out of order patch: expected > ${this.currentRevision}, got ${message.revision}`);\n return;\n }\n\n this.currentRevision = message.revision;\n\n // Apply patches\n if (message.patches.length > 0) {\n this.patchCallbacks.forEach((cb) => cb(message.patches));\n }\n }\n\n private attemptReconnect(): void {\n if (!this.options.autoReconnect) {\n return;\n }\n\n // Use disposable timeout to start reconnection after initial delay\n this.reconnectDisposable = disposableTimeout(() => {\n this.reconnectDisposable = null;\n\n retry(\n async () => {\n const result = await this.connect();\n if (!result.ok) {\n throw result.error;\n }\n },\n {\n maxAttempts: this.options.maxReconnectAttempts,\n delayMs: this.options.reconnectInterval,\n backoff: \"exponential\",\n maxDelayMs: 30000,\n jitter: 0.1,\n onRetry: (attempt, error) => {\n log.debug(`Reconnection attempt ${attempt}/${this.options.maxReconnectAttempts} failed: ${error.message}`);\n },\n }\n ).catch((error) => {\n log.error(\"Max reconnection attempts reached:\", error.message);\n this.errorCallbacks.forEach((cb) =>\n cb(new ConnectionError(this.url, error, this.options.maxReconnectAttempts))\n );\n });\n }, this.options.reconnectInterval);\n }\n}\n",
18
+ "/**\n * RemoteEngine - Connect to a remote Hypen app over WebSocket\n * Platform-agnostic client (uses standard WebSocket API)\n *\n * Usage:\n * ```typescript\n * const engine = new RemoteEngine(\"ws://localhost:3000\", {\n * session: {\n * id: localStorage.getItem(\"sessionId\") ?? undefined,\n * props: { platform: \"web\", version: \"1.0\" }\n * }\n * });\n *\n * engine.onSessionEstablished(({ sessionId, isNew, isRestored }) => {\n * localStorage.setItem(\"sessionId\", sessionId);\n * console.log(isRestored ? \"Welcome back!\" : \"New session\");\n * });\n *\n * engine.onSessionExpired((reason) => {\n * localStorage.removeItem(\"sessionId\");\n * });\n *\n * const result = await engine.connect();\n * if (!result.ok) {\n * console.error(\"Connection failed:\", result.error);\n * }\n * ```\n */\n\nimport type {\n RemoteMessage,\n InitialTreeMessage,\n PatchMessage,\n DispatchActionMessage,\n UpdateStateMessage,\n SubscribeStateMessage,\n HelloMessage,\n SessionAckMessage,\n SessionExpiredMessage,\n} from \"./types.js\";\nimport type { Patch } from \"../types.js\";\nimport {\n type Result,\n Ok,\n Err,\n ConnectionError,\n} from \"../result.js\";\nimport {\n type Disposable,\n DisposableStack,\n disposableTimeout,\n disposableWebSocket,\n disposableListener,\n} from \"../disposable.js\";\nimport { retry, type RetryOptions } from \"../retry.js\";\nimport { frameworkLoggers } from \"../logger.js\";\n\nconst log = frameworkLoggers.remote;\n\nexport type RemoteConnectionState =\n | \"disconnected\"\n | \"connecting\"\n | \"connected\"\n | \"error\";\n\n/**\n * Session configuration for the client\n */\nexport interface SessionOptions {\n /** Session ID to resume (omit for new session) */\n id?: string;\n /** Client metadata (platform, version, userId, etc.) */\n props?: Record<string, unknown>;\n /** Optional persist/routing key for Durable Object routing (withKey) */\n persistKey?: string;\n}\n\n/**\n * Session information received from server\n */\nexport interface SessionInfo {\n sessionId: string;\n isNew: boolean;\n isRestored: boolean;\n}\n\n/**\n * Navigation options for platform back-button integration.\n *\n * When enabled, the client listens for platform back events (browser popstate,\n * Android back button) and dispatches a configurable action to the server.\n * The server module handles navigation via its own route stack.\n */\nexport interface NavigationOptions {\n /** Action name dispatched on back navigation (default: \"navigateBack\") */\n backAction?: string;\n /**\n * State key that represents the current view/route on the server.\n * When this key changes in a stateUpdate, the client pushes a browser\n * history entry so the back button works. (default: \"currentView\")\n */\n viewStateKey?: string;\n}\n\nexport interface RemoteEngineOptions {\n autoReconnect?: boolean;\n reconnectInterval?: number;\n maxReconnectAttempts?: number;\n /** Session configuration */\n session?: SessionOptions;\n /**\n * Enable platform back-button integration.\n * Pass `true` for defaults, or an object to customize action/key names.\n */\n navigation?: boolean | NavigationOptions;\n}\n\ninterface ResolvedNavigationOptions {\n backAction: string;\n viewStateKey: string;\n}\n\ninterface RequiredOptions {\n autoReconnect: boolean;\n reconnectInterval: number;\n maxReconnectAttempts: number;\n session?: SessionOptions;\n navigation?: ResolvedNavigationOptions;\n}\n\n/**\n * Client-side engine that connects to a remote Hypen app\n */\nexport class RemoteEngine implements Disposable {\n private ws: WebSocket | null = null;\n private readonly url: string;\n private state: RemoteConnectionState = \"disconnected\";\n private readonly options: RequiredOptions;\n private reconnectAttempts = 0;\n\n // Resource management\n private readonly disposables = new DisposableStack();\n private reconnectDisposable: Disposable | null = null;\n\n // Session state\n private currentSessionId: string | null = null;\n private readonly sessionOptions?: SessionOptions;\n\n // Callbacks\n private readonly patchCallbacks: Array<(patches: Patch[]) => void> = [];\n private readonly stateCallbacks: Array<(state: unknown) => void> = [];\n private readonly connectionCallbacks: Array<() => void> = [];\n private readonly disconnectionCallbacks: Array<() => void> = [];\n private readonly errorCallbacks: Array<(error: Error) => void> = [];\n private readonly sessionEstablishedCallbacks: Array<(info: SessionInfo) => void> = [];\n private readonly sessionExpiredCallbacks: Array<(reason: string) => void> = [];\n\n // State\n private currentState: unknown = null;\n private currentRevision = 0;\n private moduleName: string = \"\";\n\n // Navigation\n private navigationDisposable: Disposable | null = null;\n private lastViewValue: string | null = null;\n private handlingPopState = false;\n\n constructor(url: string, options: RemoteEngineOptions = {}) {\n this.url = url;\n const navOpt = options.navigation;\n const navigation = navOpt\n ? {\n backAction: (typeof navOpt === \"object\" ? navOpt.backAction : undefined) ?? \"navigateBack\",\n viewStateKey: (typeof navOpt === \"object\" ? navOpt.viewStateKey : undefined) ?? \"currentView\",\n }\n : undefined;\n\n this.options = {\n autoReconnect: options.autoReconnect ?? true,\n reconnectInterval: options.reconnectInterval ?? 3000,\n maxReconnectAttempts: options.maxReconnectAttempts ?? 10,\n session: options.session,\n navigation,\n };\n this.sessionOptions = options.session;\n\n // If session ID was provided, use it as current\n if (options.session?.id) {\n this.currentSessionId = options.session.id;\n }\n }\n\n /**\n * Connect to the remote server\n * Returns a Result indicating success or failure\n */\n async connect(): Promise<Result<void, ConnectionError>> {\n if (this.state === \"connected\" || this.state === \"connecting\") {\n return Ok(undefined);\n }\n\n this.state = \"connecting\";\n\n return new Promise((resolve) => {\n try {\n this.ws = new WebSocket(this.url);\n\n // Track the WebSocket for cleanup\n this.disposables.add(disposableWebSocket(this.ws));\n\n // Set up message handler\n const messageHandler = (event: MessageEvent) => {\n this.handleMessage(event.data);\n };\n this.disposables.add(\n disposableListener(this.ws, \"message\", messageHandler as EventListener)\n );\n\n // Set up error handler\n const errorHandler = () => {\n this.state = \"error\";\n const error = new ConnectionError(this.url, new Error(\"WebSocket error\"));\n this.errorCallbacks.forEach((cb) => cb(error));\n resolve(Err(error));\n };\n this.disposables.add(\n disposableListener(this.ws, \"error\", errorHandler)\n );\n\n // Set up close handler\n const closeHandler = () => {\n this.state = \"disconnected\";\n this.disconnectionCallbacks.forEach((cb) => cb());\n this.attemptReconnect();\n };\n this.disposables.add(\n disposableListener(this.ws, \"close\", closeHandler)\n );\n\n // Set up open handler\n this.ws.onopen = () => {\n this.state = \"connected\";\n this.reconnectAttempts = 0;\n\n // Cancel any pending reconnect\n if (this.reconnectDisposable) {\n this.reconnectDisposable.dispose();\n this.reconnectDisposable = null;\n }\n\n // Send hello message with session info\n this.sendHello();\n\n this.connectionCallbacks.forEach((cb) => cb());\n resolve(Ok(undefined));\n };\n } catch (e) {\n this.state = \"error\";\n const error = new ConnectionError(this.url, e);\n resolve(Err(error));\n }\n });\n }\n\n /**\n * Send hello message to establish session\n */\n private sendHello(): void {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) return;\n\n const hello: HelloMessage = {\n type: \"hello\",\n sessionId: this.currentSessionId ?? this.sessionOptions?.id,\n props: this.sessionOptions?.props,\n persistKey: this.sessionOptions?.persistKey,\n };\n\n this.ws.send(JSON.stringify(hello));\n }\n\n /**\n * Disconnect from the remote server and clean up resources\n */\n disconnect(): void {\n // Cancel any pending reconnect\n if (this.reconnectDisposable) {\n this.reconnectDisposable.dispose();\n this.reconnectDisposable = null;\n }\n\n // Close WebSocket if open\n if (this.ws) {\n if (this.ws.readyState === WebSocket.OPEN || this.ws.readyState === WebSocket.CONNECTING) {\n this.ws.close();\n }\n this.ws = null;\n }\n\n this.state = \"disconnected\";\n }\n\n /**\n * Dispose all resources (alias for disconnect)\n */\n dispose(): void {\n this.disconnect();\n if (this.navigationDisposable) {\n this.navigationDisposable.dispose();\n this.navigationDisposable = null;\n }\n this.disposables.dispose();\n }\n\n // ── Navigation ────────────────────────────────────────────────\n\n /**\n * Set up the browser popstate listener for back-button integration.\n * Called automatically after the initial tree is received.\n */\n private setupNavigation(): void {\n const nav = this.options.navigation;\n if (!nav || typeof window === \"undefined\") return;\n if (this.navigationDisposable) return; // already set up\n\n this.navigationDisposable = disposableListener(window, \"popstate\", () => {\n if (this.handlingPopState) return;\n\n // Browser went back — dispatch the back action to the server\n log.debug(\"Back navigation detected, dispatching:\", nav.backAction);\n this.handlingPopState = true;\n this.dispatchAction(nav.backAction);\n // Flag cleared when we receive the next state update\n });\n }\n\n /**\n * Track view changes from the server and push browser history entries.\n * This keeps the browser history stack in sync with server-side navigation\n * so that the back button has entries to pop.\n */\n private trackViewChange(state: unknown): void {\n const nav = this.options.navigation;\n if (!nav || typeof window === \"undefined\") return;\n\n const viewValue = this.resolveStateKey(state, nav.viewStateKey);\n if (viewValue === undefined || viewValue === this.lastViewValue) return;\n\n if (this.handlingPopState) {\n // This state update was caused by our own back action — don't push\n this.handlingPopState = false;\n this.lastViewValue = viewValue;\n return;\n }\n\n // Only push if we had a previous view (skip the initial load)\n if (this.lastViewValue !== null) {\n window.history.pushState({ view: viewValue }, \"\", \"\");\n }\n this.lastViewValue = viewValue;\n }\n\n /**\n * Resolve a dot-path key from state (e.g., \"currentView\" or \"ui.page\").\n */\n private resolveStateKey(state: unknown, key: string): string | undefined {\n if (!state || typeof state !== \"object\") return undefined;\n const parts = key.split(\".\");\n let current: any = state;\n for (const part of parts) {\n if (current == null || typeof current !== \"object\") return undefined;\n current = current[part];\n }\n return typeof current === \"string\" ? current : undefined;\n }\n\n /**\n * Dispatch an action to the remote server\n */\n dispatchAction(action: string, payload?: unknown): void {\n if (this.state !== \"connected\" || !this.ws) {\n log.warn(\"Cannot dispatch action: not connected\");\n return;\n }\n\n const message: DispatchActionMessage = {\n type: \"dispatchAction\",\n module: this.moduleName,\n action,\n payload,\n };\n\n this.ws.send(JSON.stringify(message));\n }\n\n /**\n * Subscribe to state updates after each render.\n * Only subscribed clients receive stateUpdate messages (avoids overhead for native clients).\n */\n subscribeState(): void {\n if (this.state !== \"connected\" || !this.ws) {\n log.warn(\"Cannot subscribe to state: not connected\");\n return;\n }\n\n const message: SubscribeStateMessage = { type: \"subscribeState\" };\n this.ws.send(JSON.stringify(message));\n }\n\n /**\n * Override the remote module's state (e.g. for time-travel).\n * The server will update state, re-render, and send back patches.\n */\n updateState(state: unknown): void {\n if (this.state !== \"connected\" || !this.ws) {\n log.warn(\"Cannot update state: not connected\");\n return;\n }\n\n const message: UpdateStateMessage = {\n type: \"updateState\",\n module: this.moduleName,\n state,\n };\n\n this.ws.send(JSON.stringify(message));\n }\n\n /**\n * Register callback for patches\n */\n onPatches(callback: (patches: Patch[]) => void): this {\n this.patchCallbacks.push(callback);\n return this;\n }\n\n /**\n * Register callback for state updates\n */\n onStateUpdate(callback: (state: unknown) => void): this {\n this.stateCallbacks.push(callback);\n return this;\n }\n\n /**\n * Register callback for connection\n */\n onConnect(callback: () => void): this {\n this.connectionCallbacks.push(callback);\n return this;\n }\n\n /**\n * Register callback for disconnection\n */\n onDisconnect(callback: () => void): this {\n this.disconnectionCallbacks.push(callback);\n return this;\n }\n\n /**\n * Register callback for errors\n */\n onError(callback: (error: Error) => void): this {\n this.errorCallbacks.push(callback);\n return this;\n }\n\n /**\n * Register callback for session establishment\n * Called when server confirms session (new or resumed)\n */\n onSessionEstablished(callback: (info: SessionInfo) => void): this {\n this.sessionEstablishedCallbacks.push(callback);\n return this;\n }\n\n /**\n * Register callback for session expiration\n * Called when session is kicked or expires\n */\n onSessionExpired(callback: (reason: string) => void): this {\n this.sessionExpiredCallbacks.push(callback);\n return this;\n }\n\n /**\n * Get current connection state\n */\n getConnectionState(): RemoteConnectionState {\n return this.state;\n }\n\n /**\n * Get current app state\n */\n getCurrentState(): unknown {\n return this.currentState;\n }\n\n /**\n * Get current revision\n */\n getRevision(): number {\n return this.currentRevision;\n }\n\n /**\n * Get current session ID\n */\n getSessionId(): string | null {\n return this.currentSessionId;\n }\n\n private handleMessage(data: string): void {\n try {\n const message = JSON.parse(data) as RemoteMessage;\n\n switch (message.type) {\n case \"sessionAck\":\n this.handleSessionAck(message as SessionAckMessage);\n break;\n\n case \"sessionExpired\":\n this.handleSessionExpired(message as SessionExpiredMessage);\n break;\n\n case \"initialTree\":\n this.handleInitialTree(message as InitialTreeMessage);\n break;\n\n case \"patch\":\n this.handlePatch(message as PatchMessage);\n break;\n\n case \"stateUpdate\":\n this.currentState = (message as { state: unknown }).state;\n this.trackViewChange(this.currentState);\n this.stateCallbacks.forEach((cb) => cb(this.currentState));\n break;\n }\n } catch (e) {\n log.error(\"Error handling remote message:\", e);\n const error = e instanceof Error ? e : new Error(String(e));\n this.errorCallbacks.forEach((cb) => cb(error));\n }\n }\n\n private handleSessionAck(message: SessionAckMessage): void {\n this.currentSessionId = message.sessionId;\n\n const info: SessionInfo = {\n sessionId: message.sessionId,\n isNew: message.isNew,\n isRestored: message.isRestored,\n };\n\n this.sessionEstablishedCallbacks.forEach((cb) => cb(info));\n }\n\n private handleSessionExpired(message: SessionExpiredMessage): void {\n this.currentSessionId = null;\n this.sessionExpiredCallbacks.forEach((cb) => cb(message.reason));\n }\n\n private handleInitialTree(message: InitialTreeMessage): void {\n this.moduleName = message.module;\n this.currentState = message.state;\n this.currentRevision = message.revision;\n\n // Apply initial patches\n if (message.patches.length > 0) {\n this.patchCallbacks.forEach((cb) => cb(message.patches));\n }\n\n // Initialize navigation tracking from initial state\n this.trackViewChange(message.state);\n this.setupNavigation();\n\n // Auto-subscribe to state when navigation is enabled so we can\n // track view changes and push browser history entries.\n if (this.options.navigation) {\n this.subscribeState();\n }\n\n // Notify state callbacks\n this.stateCallbacks.forEach((cb) => cb(message.state));\n }\n\n private handlePatch(message: PatchMessage): void {\n // Check revision ordering\n if (message.revision <= this.currentRevision) {\n log.warn(`Out of order patch: expected > ${this.currentRevision}, got ${message.revision}`);\n return;\n }\n\n this.currentRevision = message.revision;\n\n // Apply patches\n if (message.patches.length > 0) {\n this.patchCallbacks.forEach((cb) => cb(message.patches));\n }\n }\n\n private attemptReconnect(): void {\n if (!this.options.autoReconnect) {\n return;\n }\n\n // Use disposable timeout to start reconnection after initial delay\n this.reconnectDisposable = disposableTimeout(() => {\n this.reconnectDisposable = null;\n\n retry(\n async () => {\n const result = await this.connect();\n if (!result.ok) {\n throw result.error;\n }\n },\n {\n maxAttempts: this.options.maxReconnectAttempts,\n delayMs: this.options.reconnectInterval,\n backoff: \"exponential\",\n maxDelayMs: 30000,\n jitter: 0.1,\n onRetry: (attempt, error) => {\n log.debug(`Reconnection attempt ${attempt}/${this.options.maxReconnectAttempts} failed: ${error.message}`);\n },\n }\n ).catch((error) => {\n log.error(\"Max reconnection attempts reached:\", error.message);\n this.errorCallbacks.forEach((cb) =>\n cb(new ConnectionError(this.url, error, this.options.maxReconnectAttempts))\n );\n });\n }, this.options.reconnectInterval);\n }\n}\n",
19
19
  "/**\n * Session Management for Remote UI\n *\n * Manages session lifecycle including:\n * - Creating new sessions\n * - Suspending sessions on disconnect (pending reconnection)\n * - Resuming sessions on reconnect\n * - Expiring sessions after TTL\n * - Handling concurrent connections\n */\n\nimport type { Session, SessionConfig } from \"./types.js\";\n\n/**\n * Internal representation of a pending (disconnected) session\n */\ninterface PendingSession {\n session: Session;\n savedState: unknown;\n expiryTimer: ReturnType<typeof setTimeout>;\n}\n\n/**\n * Callback invoked when a session expires\n */\nexport type SessionExpireCallback = (session: Session) => void | Promise<void>;\n\n/**\n * Manages session lifecycle for remote UI connections\n */\nexport class SessionManager {\n /** Active sessions (currently connected) */\n private activeSessions = new Map<string, Session>();\n\n /** Pending sessions (disconnected, waiting for reconnect within TTL) */\n private pendingSessions = new Map<string, PendingSession>();\n\n /** Maps session ID to connected WebSocket(s) for concurrent handling */\n private sessionConnections = new Map<string, Set<unknown>>();\n\n /** Resolved configuration with defaults */\n private config: Required<SessionConfig>;\n\n constructor(config: SessionConfig = {}) {\n this.config = {\n ttl: config.ttl ?? 3600, // 1 hour default\n concurrent: config.concurrent ?? \"kick-old\",\n generateId: config.generateId ?? (() => crypto.randomUUID()),\n };\n }\n\n /**\n * Get the configured TTL in seconds\n */\n getTtl(): number {\n return this.config.ttl;\n }\n\n /**\n * Get the concurrent connection policy\n */\n getConcurrentPolicy(): \"kick-old\" | \"reject-new\" | \"allow-multiple\" {\n return this.config.concurrent;\n }\n\n /**\n * Create a new session\n */\n createSession(props?: Record<string, any>): Session {\n const now = new Date();\n const session: Session = {\n id: this.config.generateId(),\n ttl: this.config.ttl,\n createdAt: now,\n lastConnectedAt: now,\n props,\n };\n this.activeSessions.set(session.id, session);\n return session;\n }\n\n /**\n * Get an active (connected) session by ID\n */\n getActiveSession(id: string): Session | null {\n return this.activeSessions.get(id) ?? null;\n }\n\n /**\n * Get a pending (disconnected) session by ID\n */\n getPendingSession(id: string): PendingSession | null {\n return this.pendingSessions.get(id) ?? null;\n }\n\n /**\n * Check if a session exists (either active or pending)\n */\n hasSession(id: string): boolean {\n return this.activeSessions.has(id) || this.pendingSessions.has(id);\n }\n\n /**\n * Suspend a session when client disconnects\n * Moves from active to pending with a TTL timer\n *\n * @param sessionId - The session to suspend\n * @param savedState - State snapshot to restore on reconnect\n * @param onExpire - Callback when TTL expires\n */\n suspendSession(\n sessionId: string,\n savedState: unknown,\n onExpire: SessionExpireCallback\n ): void {\n const session = this.activeSessions.get(sessionId);\n if (!session) return;\n\n // Remove from active\n this.activeSessions.delete(sessionId);\n\n // Set up expiry timer\n const expiryTimer = setTimeout(async () => {\n const pending = this.pendingSessions.get(sessionId);\n if (pending) {\n this.pendingSessions.delete(sessionId);\n await onExpire(pending.session);\n }\n }, session.ttl * 1000);\n\n // Add to pending\n this.pendingSessions.set(sessionId, {\n session,\n savedState,\n expiryTimer,\n });\n }\n\n /**\n * Resume a pending session when client reconnects\n *\n * @param sessionId - The session to resume\n * @returns Session and saved state, or null if not found/expired\n */\n resumeSession(\n sessionId: string\n ): { session: Session; savedState: unknown } | null {\n const pending = this.pendingSessions.get(sessionId);\n if (!pending) return null;\n\n // Clear expiry timer\n clearTimeout(pending.expiryTimer);\n this.pendingSessions.delete(sessionId);\n\n // Update last connected time\n pending.session.lastConnectedAt = new Date();\n\n // Move back to active\n this.activeSessions.set(sessionId, pending.session);\n\n return {\n session: pending.session,\n savedState: pending.savedState,\n };\n }\n\n /**\n * Destroy a session completely (both active and pending)\n */\n destroySession(sessionId: string): void {\n this.activeSessions.delete(sessionId);\n\n const pending = this.pendingSessions.get(sessionId);\n if (pending) {\n clearTimeout(pending.expiryTimer);\n this.pendingSessions.delete(sessionId);\n }\n\n this.sessionConnections.delete(sessionId);\n }\n\n /**\n * Track a WebSocket connection for a session\n * Used for concurrent connection handling\n */\n trackConnection(sessionId: string, ws: unknown): void {\n let connections = this.sessionConnections.get(sessionId);\n if (!connections) {\n connections = new Set();\n this.sessionConnections.set(sessionId, connections);\n }\n connections.add(ws);\n }\n\n /**\n * Untrack a WebSocket connection\n */\n untrackConnection(sessionId: string, ws: unknown): void {\n const connections = this.sessionConnections.get(sessionId);\n if (connections) {\n connections.delete(ws);\n if (connections.size === 0) {\n this.sessionConnections.delete(sessionId);\n }\n }\n }\n\n /**\n * Get all connections for a session\n */\n getConnections(sessionId: string): Set<unknown> | undefined {\n return this.sessionConnections.get(sessionId);\n }\n\n /**\n * Get connection count for a session\n */\n getConnectionCount(sessionId: string): number {\n return this.sessionConnections.get(sessionId)?.size ?? 0;\n }\n\n /**\n * Get stats about current sessions\n */\n getStats(): {\n activeSessions: number;\n pendingSessions: number;\n totalConnections: number;\n } {\n let totalConnections = 0;\n for (const connections of this.sessionConnections.values()) {\n totalConnections += connections.size;\n }\n\n return {\n activeSessions: this.activeSessions.size,\n pendingSessions: this.pendingSessions.size,\n totalConnections,\n };\n }\n\n /**\n * Clean up all sessions and timers\n * Call this when shutting down the server\n */\n destroy(): void {\n // Clear all pending session timers\n for (const pending of this.pendingSessions.values()) {\n clearTimeout(pending.expiryTimer);\n }\n\n this.activeSessions.clear();\n this.pendingSessions.clear();\n this.sessionConnections.clear();\n }\n}\n",
20
20
  "/**\n * Component Resolver\n * Resolves component imports from local paths or web URLs\n */\n\nexport interface ImportStatement {\n clause: ImportClause;\n source: ImportSource;\n}\n\nexport type ImportClause =\n | { type: \"named\"; names: string[] }\n | { type: \"default\"; name: string };\n\nexport type ImportSource =\n | { type: \"local\"; path: string }\n | { type: \"url\"; url: string };\n\nexport interface ComponentDefinition {\n module: any;\n template: string;\n}\n\nexport interface ResolverOptions {\n /**\n * Base directory for resolving relative local paths\n * Defaults to current working directory\n */\n baseDir?: string;\n\n /**\n * Cache resolved components to avoid re-fetching\n * Defaults to true\n */\n cache?: boolean;\n\n /**\n * Custom fetch function for URL imports\n * Useful for adding authentication, custom headers, etc.\n */\n customFetch?: (url: string) => Promise<string>;\n\n /**\n * Module registry for looking up pre-registered module definitions.\n * When set, the resolver will check the registry before doing file I/O.\n */\n moduleRegistry?: { has: (name: string) => boolean; get: (name: string) => any };\n}\n\n/**\n * Component Resolver\n * Resolves and loads components from local files or remote URLs\n */\nexport class ComponentResolver {\n private cache = new Map<string, ComponentDefinition>();\n private options: Required<Pick<ResolverOptions, 'baseDir' | 'cache' | 'customFetch'>> & Pick<ResolverOptions, 'moduleRegistry'>;\n\n private moduleRegistry?: { has: (name: string) => boolean; get: (name: string) => any };\n\n constructor(options: ResolverOptions = {}) {\n this.options = {\n baseDir: options.baseDir || process.cwd(),\n cache: options.cache ?? true,\n customFetch: options.customFetch || this.defaultFetch.bind(this),\n moduleRegistry: options.moduleRegistry,\n };\n this.moduleRegistry = options.moduleRegistry;\n }\n\n /**\n * Resolve a component from an import statement.\n * Checks the module registry first (if available), then falls back to file I/O.\n */\n async resolve(\n importStmt: ImportStatement\n ): Promise<Record<string, ComponentDefinition>> {\n // Check module registry first — if a component is pre-registered,\n // use its template directly (it will be mounted as a full module)\n if (this.moduleRegistry) {\n const names = importStmt.clause.type === \"named\"\n ? importStmt.clause.names\n : [importStmt.clause.name];\n\n const allFound = names.every(name => this.moduleRegistry!.has(name));\n if (allFound) {\n const result: Record<string, ComponentDefinition> = {};\n for (const name of names) {\n const def = this.moduleRegistry!.get(name);\n result[name] = {\n module: def,\n template: def?.template || \"\",\n };\n }\n return result;\n }\n }\n\n const sourcePath = this.getSourcePath(importStmt.source);\n\n // Check cache first\n if (this.options.cache && this.cache.has(sourcePath)) {\n const cached = this.cache.get(sourcePath)!;\n return this.extractComponents(importStmt.clause, cached);\n }\n\n // Load the component\n let component: ComponentDefinition;\n if (importStmt.source.type === \"local\") {\n component = await this.resolveLocal(importStmt.source.path);\n } else {\n component = await this.resolveUrl(importStmt.source.url);\n }\n\n // Cache it\n if (this.options.cache) {\n this.cache.set(sourcePath, component);\n }\n\n return this.extractComponents(importStmt.clause, component);\n }\n\n /**\n * Resolve a component from a local file path\n */\n private async resolveLocal(path: string): Promise<ComponentDefinition> {\n const { resolve, join } = await import(\"path\");\n const { readFile } = await import(\"fs/promises\");\n\n const basePath = resolve(this.options.baseDir, path);\n\n // Try .hypen extension\n const hypenPath = basePath.endsWith(\".hypen\")\n ? basePath\n : `${basePath}.hypen`;\n\n const template = await readFile(hypenPath, \"utf-8\");\n\n // Try loading sibling .ts module (stateless components have no module)\n const modulePath = hypenPath.replace(/\\.hypen$/, \".ts\");\n let module = {};\n try {\n module = await import(modulePath);\n } catch {\n // Stateless component — no module file\n }\n\n return { module, template };\n }\n\n /**\n * Resolve a component from a URL\n */\n private async resolveUrl(url: string): Promise<ComponentDefinition> {\n try {\n const response = await this.options.customFetch(url);\n const data = JSON.parse(response);\n\n // Expected format: { module: {...}, template: \"...\" }\n if (!data.module || !data.template) {\n throw new Error(\n `Invalid component format from ${url}. Expected { module, template }`\n );\n }\n\n return data;\n } catch (error) {\n throw new Error(\n `Failed to resolve component from ${url}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n /**\n * Default fetch implementation\n */\n private async defaultFetch(url: string): Promise<string> {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n return response.text();\n }\n\n /**\n * Extract the requested components based on the import clause\n */\n private extractComponents(\n clause: ImportClause,\n component: ComponentDefinition\n ): Record<string, ComponentDefinition> {\n if (clause.type === \"default\") {\n return {\n [clause.name]: component,\n };\n } else {\n // Named imports - for now, we only support single exports\n // In the future, we could support exporting multiple components\n // from a single file\n const result: Record<string, ComponentDefinition> = {};\n for (const name of clause.names) {\n result[name] = component;\n }\n return result;\n }\n }\n\n /**\n * Get the source path as a string (for caching)\n */\n private getSourcePath(source: ImportSource): string {\n return source.type === \"local\" ? source.path : source.url;\n }\n\n /**\n * Clear the component cache\n */\n clearCache(): void {\n this.cache.clear();\n }\n\n /**\n * Parse import statements from Hypen DSL text\n * This is a simple parser that extracts import statements\n */\n static parseImports(text: string): ImportStatement[] {\n const imports: ImportStatement[] = [];\n const importRegex =\n /import\\s+(?:(\\{[^}]*\\})|(\\w+))\\s+from\\s+[\"']([^\"']+)[\"']/g;\n\n let match;\n while ((match = importRegex.exec(text)) !== null) {\n const [, namedImports, defaultImport, source] = match;\n\n if (!source) continue;\n\n let clause: ImportClause;\n if (namedImports) {\n // Named imports: { Button, Card }\n const names = namedImports\n .slice(1, -1) // Remove { and }\n .split(\",\")\n .map((n) => n.trim())\n .filter((n) => n.length > 0);\n clause = { type: \"named\", names };\n } else if (defaultImport) {\n // Default import: HomePage\n clause = { type: \"default\", name: defaultImport };\n } else {\n continue;\n }\n\n // Determine if source is URL or local path\n const sourceObj: ImportSource = source.startsWith(\"http://\") ||\n source.startsWith(\"https://\")\n ? { type: \"url\", url: source }\n : { type: \"local\", path: source };\n\n imports.push({ clause, source: sourceObj });\n }\n\n return imports;\n }\n}\n",
21
21
  "/**\n * Built-in Hypen Components\n * Framework-provided components like Router and Route\n */\n\nimport { app } from \"../app.js\";\nimport { frameworkLoggers } from \"../logger.js\";\n\nconst log = frameworkLoggers.router;\n\n/**\n * Interface for the engine methods needed by route visibility updates\n */\nexport interface RouteEngine {\n renderLazyRoute(path: string, component: string, element: HTMLElement): Promise<void>;\n getState(): Record<string, unknown>;\n}\n\n/**\n * Update route visibility based on the current path.\n * Shows the matching route element and hides all others.\n * For lazy routes (or routes without content), triggers rendering via the engine.\n *\n * @param currentPath - The path to match against route elements\n * @param engine - Optional engine for lazy route rendering\n * @param doc - Document to query for route elements (defaults to global document)\n */\nexport async function updateRouteVisibility(\n currentPath: string,\n engine?: RouteEngine,\n doc?: Document\n): Promise<void> {\n const targetDoc = doc ?? document;\n const routeElements = targetDoc.querySelectorAll(\n '[data-hypen-type=\"route\"]'\n );\n\n let matchFound = false;\n\n for (let index = 0; index < routeElements.length; index++) {\n const routeEl = routeElements[index];\n const htmlEl = routeEl as HTMLElement;\n const routePath = htmlEl.dataset.routePath || \"/\";\n\n // Simple path matching (exact match for now)\n const isMatch = routePath === currentPath;\n\n // Only show the matching route, hide all others\n htmlEl.style.display = isMatch ? \"flex\" : \"none\";\n\n if (isMatch) {\n matchFound = true;\n\n // Check if this route needs to be rendered\n const componentName = htmlEl.dataset.routeComponent;\n const isLazy = htmlEl.dataset.routeLazy === \"true\";\n const hasContent = htmlEl.children.length > 0;\n\n // Always re-render lazy routes; render non-lazy only if they have no content\n const shouldRender = componentName && engine && (isLazy || !hasContent);\n\n if (shouldRender) {\n try {\n await engine.renderLazyRoute(\n routePath,\n componentName,\n htmlEl\n );\n } catch (err) {\n log.error(`Failed to render route ${routePath}:`, err);\n }\n }\n }\n }\n\n if (!matchFound) {\n log.warn(\n `No route matched path: ${currentPath}. Available routes:`,\n Array.from(routeElements).map(\n (el: Element) => (el as HTMLElement).dataset.routePath\n )\n );\n }\n}\n\n/**\n * Router Component\n * Automatically matches routes and renders the appropriate child Route\n *\n * Usage in Hypen DSL:\n * Router {\n * Route(path: \"/\") { HomePage }\n * Route(path: \"/products\") { ProductList }\n * Route(path: \"/users/:id\") { UserProfile }\n * }\n */\nexport const Router = app\n .defineState(\n {\n currentPath: \"/\",\n matchedRoute: null as any,\n routeParams: {} as Record<string, string>,\n },\n { name: \"__Router\" }\n )\n .onCreated((state, context) => {\n if (!context) {\n log.error(\"Requires global context\");\n return;\n }\n\n // Subscribe to router changes\n const router = context.router;\n if (!router) {\n log.error(\"Router not found in context\");\n return;\n }\n\n // Get access to the Hypen engine for lazy rendering\n const hypenEngine = (context as any).__hypenEngine as RouteEngine | undefined;\n\n // Initial route visibility (after DOM is ready)\n setTimeout(() => {\n updateRouteVisibility(state.currentPath, hypenEngine);\n }, 100);\n\n router.onNavigate((routeState) => {\n state.currentPath = routeState.currentPath;\n state.routeParams = routeState.params;\n\n // Update route visibility when path changes\n updateRouteVisibility(routeState.currentPath, hypenEngine);\n });\n })\n .build();\n\n/**\n * Route Component\n * Defines a route pattern and its content\n * This is just a marker component - Router processes it\n *\n * Props:\n * - path: string - Route pattern (e.g., \"/\", \"/users/:id\", \"/dashboard/*\")\n *\n * Usage:\n * Route(path: \"/products\") {\n * ProductList\n * }\n */\nexport const Route = app.defineState({}, { name: \"__Route\" }).build();\n\n/**\n * Navigation Link Component\n * Navigates to a route when clicked\n *\n * Props:\n * - to: string - Target path\n *\n * Usage:\n * Link(to: \"/products\") {\n * Text(\"View Products\")\n * }\n */\nexport const Link = app\n .defineState(\n {\n to: \"/\",\n isActive: false,\n },\n { name: \"__Link\" }\n )\n .onAction(\"navigate\", ({ state, context }) => {\n const router = context?.router;\n if (!router) {\n log.error(\"Link requires router context\");\n return;\n }\n\n const targetPath = state.to;\n router.push(targetPath);\n })\n .onCreated((state, context) => {\n if (!context) return;\n\n // Check if current path matches this link's target\n const router = context.router;\n if (router) {\n router.onNavigate((routeState) => {\n state.isActive = routeState.currentPath === state.to;\n });\n }\n })\n .build();\n"
22
22
  ],
23
- "mappings": "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",
24
- "debugId": "F652589D18AB457B64756E2164756E21",
23
+ "mappings": "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",
24
+ "debugId": "ABC8BA06546F591964756E2164756E21",
25
25
  "names": []
26
26
  }