@hypen-space/core 0.4.3 → 0.4.11

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.
Files changed (72) hide show
  1. package/README.md +1 -1
  2. package/dist/app.d.ts +79 -22
  3. package/dist/app.js +248 -155
  4. package/dist/app.js.map +5 -5
  5. package/dist/components/builtin.js +251 -158
  6. package/dist/components/builtin.js.map +6 -6
  7. package/dist/context.js +1 -1
  8. package/dist/context.js.map +1 -1
  9. package/dist/discovery.d.ts +1 -1
  10. package/dist/discovery.js +249 -156
  11. package/dist/discovery.js.map +6 -6
  12. package/dist/disposable.js +1 -1
  13. package/dist/disposable.js.map +1 -1
  14. package/dist/engine.browser.d.ts +6 -0
  15. package/dist/engine.browser.js +192 -5
  16. package/dist/engine.browser.js.map +5 -4
  17. package/dist/engine.d.ts +6 -0
  18. package/dist/engine.js +192 -5
  19. package/dist/engine.js.map +5 -4
  20. package/dist/events.js +1 -1
  21. package/dist/events.js.map +1 -1
  22. package/dist/index.browser.d.ts +1 -1
  23. package/dist/index.browser.js +248 -155
  24. package/dist/index.browser.js.map +6 -6
  25. package/dist/index.d.ts +2 -2
  26. package/dist/index.js +254 -158
  27. package/dist/index.js.map +7 -7
  28. package/dist/loader.js +1 -1
  29. package/dist/loader.js.map +1 -1
  30. package/dist/logger.js +245 -0
  31. package/dist/logger.js.map +10 -0
  32. package/dist/managed-router.d.ts +3 -4
  33. package/dist/plugin.js +1 -1
  34. package/dist/plugin.js.map +1 -1
  35. package/dist/remote/client.js +34 -2
  36. package/dist/remote/client.js.map +3 -3
  37. package/dist/remote/index.js +609 -163
  38. package/dist/remote/index.js.map +8 -7
  39. package/dist/remote/server.d.ts +46 -15
  40. package/dist/remote/server.js +609 -163
  41. package/dist/remote/server.js.map +8 -7
  42. package/dist/renderer.js +1 -1
  43. package/dist/renderer.js.map +1 -1
  44. package/dist/result.d.ts +18 -0
  45. package/dist/router.js +1 -1
  46. package/dist/router.js.map +1 -1
  47. package/dist/types.d.ts +1 -1
  48. package/dist/types.js +2 -0
  49. package/dist/types.js.map +9 -0
  50. package/package.json +1 -1
  51. package/src/app.ts +162 -41
  52. package/src/components/builtin.ts +3 -4
  53. package/src/discovery.ts +2 -2
  54. package/src/engine.browser.ts +27 -4
  55. package/src/engine.ts +27 -4
  56. package/src/index.browser.ts +0 -2
  57. package/src/index.ts +3 -2
  58. package/src/managed-router.ts +5 -6
  59. package/src/remote/server.ts +116 -21
  60. package/src/result.ts +48 -0
  61. package/src/types.ts +1 -1
  62. package/wasm-browser/hypen_engine.d.ts +3 -3
  63. package/wasm-browser/hypen_engine.js +73 -66
  64. package/wasm-browser/hypen_engine_bg.wasm +0 -0
  65. package/wasm-browser/hypen_engine_bg.wasm.d.ts +3 -3
  66. package/wasm-browser/package.json +1 -1
  67. package/wasm-node/hypen_engine.js +74 -66
  68. package/wasm-node/hypen_engine_bg.wasm +0 -0
  69. package/wasm-node/hypen_engine_bg.wasm.d.ts +3 -3
  70. package/wasm-node/package.json +1 -1
  71. package/dist/module-registry.d.ts +0 -42
  72. package/src/module-registry.ts +0 -76
package/dist/loader.js CHANGED
@@ -300,4 +300,4 @@ export {
300
300
  ComponentLoader
301
301
  };
302
302
 
303
- //# debugId=844582E5ED1B62F564756E2164756E21
303
+ //# debugId=21881E75F303E12A64756E2164756E21
@@ -6,6 +6,6 @@
6
6
  "/**\n * Component Loader\n *\n * Loads and registers Hypen components from file system.\n * Works in both Node.js and Bun environments.\n */\n\nimport { existsSync, readdirSync, readFileSync } from \"fs\";\nimport { join } from \"path\";\nimport type { HypenModuleDefinition } from \"./app.js\";\nimport { frameworkLoggers } from \"./logger.js\";\n\nconst log = frameworkLoggers.loader;\n\nexport interface ComponentDefinition {\n name: string;\n module: HypenModuleDefinition<any>;\n template: string; // The .hypen file content\n path: string;\n}\n\nexport class ComponentLoader {\n private components = new Map<string, ComponentDefinition>();\n\n /**\n * Register a component with its module and template\n */\n register(\n name: string,\n module: HypenModuleDefinition<any>,\n template: string,\n path?: string\n ): void {\n this.components.set(name, {\n name,\n module,\n template,\n path: path || name,\n });\n }\n\n /**\n * Get a registered component by name\n */\n get(name: string): ComponentDefinition | undefined {\n return this.components.get(name);\n }\n\n /**\n * Check if a component is registered\n */\n has(name: string): boolean {\n return this.components.has(name);\n }\n\n /**\n * Get all registered component names\n */\n getNames(): string[] {\n return Array.from(this.components.keys());\n }\n\n /**\n * Get all registered components\n */\n getAll(): ComponentDefinition[] {\n return Array.from(this.components.values());\n }\n\n /**\n * Clear all registered components\n */\n clear(): void {\n this.components.clear();\n }\n\n /**\n * Load a component from a directory\n * Expects: component.ts and component.hypen in the same directory\n */\n async loadFromDirectory(name: string, dirPath: string): Promise<void> {\n try {\n // Dynamic import of the module\n const modulePath = join(dirPath, \"component.ts\");\n const moduleExport = await import(modulePath);\n const module = moduleExport.default as HypenModuleDefinition<any>;\n\n // Read the .hypen template file\n const templatePath = join(dirPath, \"component.hypen\");\n const template = readFileSync(templatePath, \"utf-8\");\n\n // Register the component\n this.register(name, module, template, dirPath);\n\n log.debug(`Loaded component: ${name} from ${dirPath}`);\n } catch (error) {\n log.error(`Failed to load component ${name} from ${dirPath}:`, error);\n throw error;\n }\n }\n\n /**\n * Auto-load all components from a directory\n * Scans for subdirectories containing component.ts and component.hypen\n */\n async loadFromComponentsDir(baseDir: string): Promise<void> {\n try {\n if (!existsSync(baseDir)) {\n log.warn(`Components directory not found: ${baseDir}`);\n return;\n }\n\n const entries = readdirSync(baseDir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n\n const componentDir = join(baseDir, entry.name);\n const hypenPath = join(componentDir, \"component.hypen\");\n\n // Only load if component.hypen exists\n if (existsSync(hypenPath)) {\n await this.loadFromDirectory(entry.name, componentDir);\n }\n }\n\n log.debug(`Loaded ${this.components.size} components from ${baseDir}`);\n } catch (error) {\n log.error(`Failed to load components from ${baseDir}:`, error);\n throw error;\n }\n }\n}\n\n// Global component loader instance\nexport const componentLoader = new ComponentLoader();\n"
7
7
  ],
8
8
  "mappings": "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",
9
- "debugId": "844582E5ED1B62F564756E2164756E21",
9
+ "debugId": "21881E75F303E12A64756E2164756E21",
10
10
  "names": []
11
11
  }
package/dist/logger.js ADDED
@@ -0,0 +1,245 @@
1
+ import { createRequire } from "node:module";
2
+ var __create = Object.create;
3
+ var __getProtoOf = Object.getPrototypeOf;
4
+ var __defProp = Object.defineProperty;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __toESM = (mod, isNodeMode, target) => {
8
+ target = mod != null ? __create(__getProtoOf(mod)) : {};
9
+ const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
10
+ for (let key of __getOwnPropNames(mod))
11
+ if (!__hasOwnProp.call(to, key))
12
+ __defProp(to, key, {
13
+ get: () => mod[key],
14
+ enumerable: true
15
+ });
16
+ return to;
17
+ };
18
+ var __export = (target, all) => {
19
+ for (var name in all)
20
+ __defProp(target, name, {
21
+ get: all[name],
22
+ enumerable: true,
23
+ configurable: true,
24
+ set: (newValue) => all[name] = () => newValue
25
+ });
26
+ };
27
+ var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
28
+ var __require = /* @__PURE__ */ createRequire(import.meta.url);
29
+
30
+ // src/logger.ts
31
+ function isProduction() {
32
+ if (typeof process !== "undefined" && process.env) {
33
+ return false;
34
+ }
35
+ return false;
36
+ }
37
+ function setLogLevel(level) {
38
+ config.level = level;
39
+ }
40
+ function getLogLevel() {
41
+ return config.level;
42
+ }
43
+ function configureLogger(options) {
44
+ config = { ...config, ...options };
45
+ }
46
+ function enableLogging() {
47
+ config.level = "debug";
48
+ }
49
+ function disableLogging() {
50
+ config.level = "none";
51
+ }
52
+ function setDebugMode(enabled) {
53
+ config.level = enabled ? "debug" : "error";
54
+ }
55
+ function isDebugMode() {
56
+ return config.level === "debug";
57
+ }
58
+ function shouldLog(level) {
59
+ return LOG_LEVEL_ORDER[level] >= LOG_LEVEL_ORDER[config.level];
60
+ }
61
+ function formatTag(tag, level) {
62
+ const timestamp = config.timestamps ? `${new Date().toISOString()} ` : "";
63
+ if (config.colors && level !== "none") {
64
+ const color = LOG_LEVEL_COLORS[level];
65
+ return `${timestamp}${color}[${tag}]${RESET_COLOR}`;
66
+ }
67
+ return `${timestamp}[${tag}]`;
68
+ }
69
+
70
+ class Logger {
71
+ tag;
72
+ constructor(tag) {
73
+ this.tag = tag;
74
+ }
75
+ debug(...args) {
76
+ if (!shouldLog("debug"))
77
+ return;
78
+ if (config.handler) {
79
+ config.handler.debug(this.tag, ...args);
80
+ } else {
81
+ console.log(formatTag(this.tag, "debug"), ...args);
82
+ }
83
+ }
84
+ info(...args) {
85
+ if (!shouldLog("info"))
86
+ return;
87
+ if (config.handler) {
88
+ config.handler.info(this.tag, ...args);
89
+ } else {
90
+ console.info(formatTag(this.tag, "info"), ...args);
91
+ }
92
+ }
93
+ warn(...args) {
94
+ if (!shouldLog("warn"))
95
+ return;
96
+ if (config.handler) {
97
+ config.handler.warn(this.tag, ...args);
98
+ } else {
99
+ console.warn(formatTag(this.tag, "warn"), ...args);
100
+ }
101
+ }
102
+ error(...args) {
103
+ if (!shouldLog("error"))
104
+ return;
105
+ if (config.handler) {
106
+ config.handler.error(this.tag, ...args);
107
+ } else {
108
+ console.error(formatTag(this.tag, "error"), ...args);
109
+ }
110
+ }
111
+ time(label, fn) {
112
+ if (!shouldLog("debug")) {
113
+ return fn();
114
+ }
115
+ const start = performance.now();
116
+ try {
117
+ return fn();
118
+ } finally {
119
+ const duration = performance.now() - start;
120
+ this.debug(`${label}: ${duration.toFixed(2)}ms`);
121
+ }
122
+ }
123
+ async timeAsync(label, fn) {
124
+ if (!shouldLog("debug")) {
125
+ return fn();
126
+ }
127
+ const start = performance.now();
128
+ try {
129
+ return await fn();
130
+ } finally {
131
+ const duration = performance.now() - start;
132
+ this.debug(`${label}: ${duration.toFixed(2)}ms`);
133
+ }
134
+ }
135
+ child(subTag) {
136
+ return new Logger(`${this.tag}:${subTag}`);
137
+ }
138
+ debugIf(condition, ...args) {
139
+ if (condition)
140
+ this.debug(...args);
141
+ }
142
+ warnIf(condition, ...args) {
143
+ if (condition)
144
+ this.warn(...args);
145
+ }
146
+ errorIf(condition, ...args) {
147
+ if (condition)
148
+ this.error(...args);
149
+ }
150
+ loggedOnce = new Set;
151
+ warnOnce(key, ...args) {
152
+ if (this.loggedOnce.has(key))
153
+ return;
154
+ this.loggedOnce.add(key);
155
+ this.warn(...args);
156
+ }
157
+ debugOnce(key, ...args) {
158
+ if (this.loggedOnce.has(key))
159
+ return;
160
+ this.loggedOnce.add(key);
161
+ this.debug(...args);
162
+ }
163
+ }
164
+ function createLogger(tag) {
165
+ return new Logger(tag);
166
+ }
167
+ var LOG_LEVEL_ORDER, LOG_LEVEL_COLORS, RESET_COLOR = "\x1B[0m", config, logger, log, frameworkLoggers;
168
+ var init_logger = __esm(() => {
169
+ LOG_LEVEL_ORDER = {
170
+ debug: 0,
171
+ info: 1,
172
+ warn: 2,
173
+ error: 3,
174
+ none: 4
175
+ };
176
+ LOG_LEVEL_COLORS = {
177
+ debug: "\x1B[36m",
178
+ info: "\x1B[32m",
179
+ warn: "\x1B[33m",
180
+ error: "\x1B[31m"
181
+ };
182
+ config = {
183
+ level: isProduction() ? "error" : "debug",
184
+ colors: true,
185
+ timestamps: false
186
+ };
187
+ logger = createLogger("Hypen");
188
+ log = {
189
+ debug: (tag, ...args) => {
190
+ if (!shouldLog("debug"))
191
+ return;
192
+ console.log(formatTag(tag, "debug"), ...args);
193
+ },
194
+ info: (tag, ...args) => {
195
+ if (!shouldLog("info"))
196
+ return;
197
+ console.info(formatTag(tag, "info"), ...args);
198
+ },
199
+ warn: (tag, ...args) => {
200
+ if (!shouldLog("warn"))
201
+ return;
202
+ console.warn(formatTag(tag, "warn"), ...args);
203
+ },
204
+ error: (tag, ...args) => {
205
+ if (!shouldLog("error"))
206
+ return;
207
+ console.error(formatTag(tag, "error"), ...args);
208
+ }
209
+ };
210
+ frameworkLoggers = {
211
+ hypen: createLogger("Hypen"),
212
+ engine: createLogger("Engine"),
213
+ router: createLogger("Router"),
214
+ state: createLogger("State"),
215
+ events: createLogger("Events"),
216
+ remote: createLogger("Remote"),
217
+ renderer: createLogger("Renderer"),
218
+ module: createLogger("Module"),
219
+ lifecycle: createLogger("Lifecycle"),
220
+ loader: createLogger("Loader"),
221
+ context: createLogger("Context"),
222
+ discovery: createLogger("Discovery"),
223
+ plugin: createLogger("Plugin"),
224
+ canvas: createLogger("Canvas"),
225
+ debug: createLogger("Debug")
226
+ };
227
+ });
228
+ init_logger();
229
+
230
+ export {
231
+ setLogLevel,
232
+ setDebugMode,
233
+ logger,
234
+ log,
235
+ isDebugMode,
236
+ getLogLevel,
237
+ frameworkLoggers,
238
+ enableLogging,
239
+ disableLogging,
240
+ createLogger,
241
+ configureLogger,
242
+ Logger
243
+ };
244
+
245
+ //# debugId=F757AAA80D715CFF64756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/logger.ts"],
4
+ "sourcesContent": [
5
+ "/**\n * Configurable Debug Logger\n *\n * Provides environment-aware logging that can be disabled in production.\n * Supports log levels, tagged output, and performance timing.\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\" | \"none\";\n\nexport interface LoggerConfig {\n /** Minimum log level (default: \"debug\" in dev, \"error\" in prod) */\n level: LogLevel;\n /** Enable colored output (default: true) */\n colors: boolean;\n /** Include timestamps (default: false) */\n timestamps: boolean;\n /** Custom log handler (default: console) */\n handler?: LogHandler;\n}\n\nexport interface LogHandler {\n debug(tag: string, ...args: unknown[]): void;\n info(tag: string, ...args: unknown[]): void;\n warn(tag: string, ...args: unknown[]): void;\n error(tag: string, ...args: unknown[]): void;\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nconst LOG_LEVEL_ORDER: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n none: 4,\n};\n\nconst LOG_LEVEL_COLORS: Record<Exclude<LogLevel, \"none\">, string> = {\n debug: \"\\x1b[36m\", // Cyan\n info: \"\\x1b[32m\", // Green\n warn: \"\\x1b[33m\", // Yellow\n error: \"\\x1b[31m\", // Red\n};\n\nconst RESET_COLOR = \"\\x1b[0m\";\n\n// ============================================================================\n// Global Configuration\n// ============================================================================\n\n/**\n * Detect if running in production environment\n */\nfunction isProduction(): boolean {\n if (typeof process !== \"undefined\" && process.env) {\n return process.env.NODE_ENV === \"production\";\n }\n return false;\n}\n\n/**\n * Default configuration\n */\nlet config: LoggerConfig = {\n level: isProduction() ? \"error\" : \"debug\",\n colors: true,\n timestamps: false,\n};\n\n// ============================================================================\n// Configuration API\n// ============================================================================\n\n/**\n * Set the global log level\n */\nexport function setLogLevel(level: LogLevel): void {\n config.level = level;\n}\n\n/**\n * Get the current log level\n */\nexport function getLogLevel(): LogLevel {\n return config.level;\n}\n\n/**\n * Configure the logger\n */\nexport function configureLogger(options: Partial<LoggerConfig>): void {\n config = { ...config, ...options };\n}\n\n/**\n * Enable all logging (sets level to \"debug\")\n */\nexport function enableLogging(): void {\n config.level = \"debug\";\n}\n\n/**\n * Disable all logging (sets level to \"none\")\n */\nexport function disableLogging(): void {\n config.level = \"none\";\n}\n\n/**\n * Enable debug mode - alias for enableLogging()\n * Call this at app startup to see all debug logs\n *\n * @example\n * ```typescript\n * import { setDebugMode } from \"@hypen-space/core\";\n * setDebugMode(true);\n * ```\n */\nexport function setDebugMode(enabled: boolean): void {\n config.level = enabled ? \"debug\" : \"error\";\n}\n\n/**\n * Check if debug mode is enabled\n */\nexport function isDebugMode(): boolean {\n return config.level === \"debug\";\n}\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\nfunction shouldLog(level: LogLevel): boolean {\n return LOG_LEVEL_ORDER[level] >= LOG_LEVEL_ORDER[config.level];\n}\n\nfunction formatTag(tag: string, level: LogLevel): string {\n const timestamp = config.timestamps ? `${new Date().toISOString()} ` : \"\";\n\n if (config.colors && level !== \"none\") {\n const color = LOG_LEVEL_COLORS[level as Exclude<LogLevel, \"none\">];\n return `${timestamp}${color}[${tag}]${RESET_COLOR}`;\n }\n\n return `${timestamp}[${tag}]`;\n}\n\n// ============================================================================\n// Logger Class\n// ============================================================================\n\n/**\n * Tagged logger instance\n *\n * @example\n * ```typescript\n * const log = createLogger(\"MyComponent\");\n * log.debug(\"initialized with\", { props });\n * log.error(\"failed to load\", error);\n * ```\n */\nexport class Logger {\n private readonly tag: string;\n\n constructor(tag: string) {\n this.tag = tag;\n }\n\n debug(...args: unknown[]): void {\n if (!shouldLog(\"debug\")) return;\n\n if (config.handler) {\n config.handler.debug(this.tag, ...args);\n } else {\n console.log(formatTag(this.tag, \"debug\"), ...args);\n }\n }\n\n info(...args: unknown[]): void {\n if (!shouldLog(\"info\")) return;\n\n if (config.handler) {\n config.handler.info(this.tag, ...args);\n } else {\n console.info(formatTag(this.tag, \"info\"), ...args);\n }\n }\n\n warn(...args: unknown[]): void {\n if (!shouldLog(\"warn\")) return;\n\n if (config.handler) {\n config.handler.warn(this.tag, ...args);\n } else {\n console.warn(formatTag(this.tag, \"warn\"), ...args);\n }\n }\n\n error(...args: unknown[]): void {\n if (!shouldLog(\"error\")) return;\n\n if (config.handler) {\n config.handler.error(this.tag, ...args);\n } else {\n console.error(formatTag(this.tag, \"error\"), ...args);\n }\n }\n\n /**\n * Time a function execution\n */\n time<T>(label: string, fn: () => T): T {\n if (!shouldLog(\"debug\")) {\n return fn();\n }\n\n const start = performance.now();\n try {\n return fn();\n } finally {\n const duration = performance.now() - start;\n this.debug(`${label}: ${duration.toFixed(2)}ms`);\n }\n }\n\n /**\n * Time an async function execution\n */\n async timeAsync<T>(label: string, fn: () => Promise<T>): Promise<T> {\n if (!shouldLog(\"debug\")) {\n return fn();\n }\n\n const start = performance.now();\n try {\n return await fn();\n } finally {\n const duration = performance.now() - start;\n this.debug(`${label}: ${duration.toFixed(2)}ms`);\n }\n }\n\n /**\n * Create a child logger with additional context\n */\n child(subTag: string): Logger {\n return new Logger(`${this.tag}:${subTag}`);\n }\n\n /**\n * Conditionally log based on a condition\n */\n debugIf(condition: boolean, ...args: unknown[]): void {\n if (condition) this.debug(...args);\n }\n\n warnIf(condition: boolean, ...args: unknown[]): void {\n if (condition) this.warn(...args);\n }\n\n errorIf(condition: boolean, ...args: unknown[]): void {\n if (condition) this.error(...args);\n }\n\n /**\n * Log once (useful for deprecation warnings)\n */\n private loggedOnce = new Set<string>();\n\n warnOnce(key: string, ...args: unknown[]): void {\n if (this.loggedOnce.has(key)) return;\n this.loggedOnce.add(key);\n this.warn(...args);\n }\n\n debugOnce(key: string, ...args: unknown[]): void {\n if (this.loggedOnce.has(key)) return;\n this.loggedOnce.add(key);\n this.debug(...args);\n }\n}\n\n// ============================================================================\n// Factory Functions\n// ============================================================================\n\n/**\n * Create a tagged logger\n *\n * @example\n * ```typescript\n * const log = createLogger(\"Router\");\n * log.info(\"navigating to\", path);\n * ```\n */\nexport function createLogger(tag: string): Logger {\n return new Logger(tag);\n}\n\n// ============================================================================\n// Default Logger Instance\n// ============================================================================\n\n/**\n * Default logger for general use\n */\nexport const logger = createLogger(\"Hypen\");\n\n// ============================================================================\n// Shorthand Functions (untagged)\n// ============================================================================\n\n/**\n * Shorthand logging functions for quick use\n * Prefer createLogger() for component-specific logging\n */\nexport const log = {\n debug: (tag: string, ...args: unknown[]): void => {\n if (!shouldLog(\"debug\")) return;\n console.log(formatTag(tag, \"debug\"), ...args);\n },\n\n info: (tag: string, ...args: unknown[]): void => {\n if (!shouldLog(\"info\")) return;\n console.info(formatTag(tag, \"info\"), ...args);\n },\n\n warn: (tag: string, ...args: unknown[]): void => {\n if (!shouldLog(\"warn\")) return;\n console.warn(formatTag(tag, \"warn\"), ...args);\n },\n\n error: (tag: string, ...args: unknown[]): void => {\n if (!shouldLog(\"error\")) return;\n console.error(formatTag(tag, \"error\"), ...args);\n },\n};\n\n// ============================================================================\n// Predefined Loggers for Framework Components\n// ============================================================================\n\nexport const frameworkLoggers = {\n hypen: createLogger(\"Hypen\"),\n engine: createLogger(\"Engine\"),\n router: createLogger(\"Router\"),\n state: createLogger(\"State\"),\n events: createLogger(\"Events\"),\n remote: createLogger(\"Remote\"),\n renderer: createLogger(\"Renderer\"),\n module: createLogger(\"Module\"),\n lifecycle: createLogger(\"Lifecycle\"),\n loader: createLogger(\"Loader\"),\n context: createLogger(\"Context\"),\n discovery: createLogger(\"Discovery\"),\n plugin: createLogger(\"Plugin\"),\n canvas: createLogger(\"Canvas\"),\n debug: createLogger(\"Debug\"),\n};\n"
6
+ ],
7
+ "mappings": "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",
8
+ "debugId": "F757AAA80D715CFF64756E2164756E21",
9
+ "names": []
10
+ }
@@ -8,14 +8,13 @@
8
8
  * Module names are used as state prefixes (lowercased) for isolation.
9
9
  */
10
10
  import type { IEngine, HypenModuleDefinition } from "./app.js";
11
- import { HypenModuleInstance } from "./app.js";
11
+ import { HypenModuleInstance, HypenApp } from "./app.js";
12
12
  import type { HypenRouter } from "./router.js";
13
13
  import type { HypenGlobalContext } from "./context.js";
14
- import { ModuleRegistry } from "./module-registry.js";
15
14
  export interface RouteDefinition {
16
15
  /** Route path pattern (e.g., "/", "/profile/:id") */
17
16
  path: string;
18
- /** Component name — used to look up in ModuleRegistry */
17
+ /** Component name — used to look up in app registry */
19
18
  component: string;
20
19
  /** Inline module definition (alternative to registry lookup) */
21
20
  module?: HypenModuleDefinition;
@@ -31,7 +30,7 @@ export declare class ManagedRouter {
31
30
  private unsubscribe;
32
31
  /** Cached instances for modules with persist=true */
33
32
  private persistedModules;
34
- constructor(router: HypenRouter, engine: IEngine, registry: ModuleRegistry, globalContext: HypenGlobalContext);
33
+ constructor(router: HypenRouter, engine: IEngine, registry: HypenApp, globalContext: HypenGlobalContext);
35
34
  /**
36
35
  * Add a route definition.
37
36
  */
package/dist/plugin.js CHANGED
@@ -348,4 +348,4 @@ export {
348
348
  plugin_default as default
349
349
  };
350
350
 
351
- //# debugId=6569E8055226098C64756E2164756E21
351
+ //# debugId=9A0E4FD082625F3D64756E2164756E21
@@ -6,6 +6,6 @@
6
6
  "/**\n * Enhanced Bun Plugin for Hypen\n *\n * Automatically pairs .hypen templates with their TypeScript modules.\n *\n * Usage:\n * import Counter from \"./Counter.hypen\";\n * // Returns: { module, template, name: \"Counter\" }\n *\n * Supported conventions:\n * 1. Sibling: Name.ts + Name.hypen\n * 2. Folder: Name/component.ts + Name/component.hypen\n * 3. Index: Name/index.ts + Name/index.hypen\n */\n\nimport type { BunPlugin } from \"bun\";\nimport { readFileSync, existsSync } from \"fs\";\nimport { dirname, basename, join, resolve } from \"path\";\nimport { frameworkLoggers } from \"./logger.js\";\n\nexport interface HypenPluginOptions {\n /**\n * Enable debug logging\n */\n debug?: boolean;\n\n /**\n * Custom patterns for finding module files\n * Default: [\"sibling\", \"component\", \"index\"]\n */\n patterns?: (\"sibling\" | \"component\" | \"index\")[];\n}\n\n/**\n * Find the matching TypeScript module for a .hypen file\n */\nfunction findModulePath(\n hypenPath: string,\n patterns: (\"sibling\" | \"component\" | \"index\")[]\n): string | null {\n const dir = dirname(hypenPath);\n const baseName = basename(hypenPath, \".hypen\");\n const parentDir = dirname(dir);\n const folderName = basename(dir);\n\n for (const pattern of patterns) {\n let candidatePath: string | null = null;\n\n switch (pattern) {\n case \"sibling\":\n // Name.hypen -> Name.ts (same directory)\n candidatePath = join(dir, `${baseName}.ts`);\n break;\n\n case \"component\":\n // Name/component.hypen -> Name/component.ts\n if (baseName === \"component\") {\n candidatePath = join(dir, \"component.ts\");\n }\n break;\n\n case \"index\":\n // Name/index.hypen -> Name/index.ts\n if (baseName === \"index\") {\n candidatePath = join(dir, \"index.ts\");\n }\n break;\n }\n\n if (candidatePath && existsSync(candidatePath)) {\n return candidatePath;\n }\n }\n\n return null;\n}\n\n/**\n * Determine the component name from the file path\n */\nfunction getComponentName(hypenPath: string): string {\n const baseName = basename(hypenPath, \".hypen\");\n\n // If file is component.hypen or index.hypen, use parent folder name\n if (baseName === \"component\" || baseName === \"index\") {\n return basename(dirname(hypenPath));\n }\n\n // Otherwise use the file name\n return baseName;\n}\n\n/**\n * Parse import statements from Hypen DSL (for future use)\n */\nfunction parseImports(\n text: string\n): Array<{ names: string[]; source: string }> {\n const imports: Array<{ names: string[]; source: string }> = [];\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 names: string[];\n if (namedImports) {\n names = namedImports\n .split(\",\")\n .map((n) => n.trim())\n .filter((n) => n.length > 0);\n } else if (defaultImport) {\n names = [defaultImport];\n } else {\n continue;\n }\n\n imports.push({ names, source });\n }\n\n return imports;\n}\n\n/**\n * Remove import statements from Hypen template\n */\nfunction removeImports(text: string): string {\n return text.replace(\n /import\\s+(?:\\{[^}]+\\}|\\w+)\\s+from\\s+[\"'][^\"']+[\"']\\s*/g,\n \"\"\n );\n}\n\n/**\n * Create the enhanced Hypen plugin for Bun\n */\nexport function hypenPlugin(options: HypenPluginOptions = {}): BunPlugin {\n const { debug = false, patterns = [\"sibling\", \"component\", \"index\"] } =\n options;\n\n const log = debug\n ? (...args: unknown[]) => frameworkLoggers.plugin.debug(...args)\n : () => {};\n\n return {\n name: \"hypen-loader\",\n async setup(build) {\n build.onLoad({ filter: /\\.hypen$/ }, async (args) => {\n const hypenPath = resolve(args.path);\n log(\"Loading:\", hypenPath);\n\n // Read the template\n const templateRaw = readFileSync(hypenPath, \"utf-8\");\n\n // Parse and remove imports\n const imports = parseImports(templateRaw);\n const template = removeImports(templateRaw).trim();\n\n if (imports.length > 0) {\n log(\"Found imports:\", imports);\n }\n\n // Get component name\n const componentName = getComponentName(hypenPath);\n log(\"Component name:\", componentName);\n\n // Find matching module\n const modulePath = findModulePath(hypenPath, patterns);\n log(\"Module path:\", modulePath);\n\n let contents: string;\n\n if (modulePath) {\n // Has a TypeScript module - import it\n const relativeModulePath = modulePath.replace(/\\.ts$/, \".js\");\n contents = `\nimport _module from \"${relativeModulePath}\";\nexport const module = _module;\nexport const template = ${JSON.stringify(template)};\nexport const name = ${JSON.stringify(componentName)};\nexport default { module: _module, template: ${JSON.stringify(template)}, name: ${JSON.stringify(componentName)} };\n`;\n } else {\n // No TypeScript module - create stateless component\n log(\"No module found, creating stateless component\");\n contents = `\nimport { app } from \"@hypen-space/core\";\nconst _module = app.defineState({}).build();\nexport const module = _module;\nexport const template = ${JSON.stringify(template)};\nexport const name = ${JSON.stringify(componentName)};\nexport default { module: _module, template: ${JSON.stringify(template)}, name: ${JSON.stringify(componentName)} };\n`;\n }\n\n return {\n contents,\n loader: \"js\",\n };\n });\n },\n };\n}\n\n/**\n * Default plugin instance with standard options\n */\nexport const defaultHypenPlugin = hypenPlugin();\n\n/**\n * Register the plugin globally (call this in your preload file)\n */\nexport function registerHypenPlugin(options?: HypenPluginOptions): void {\n Bun.plugin(hypenPlugin(options));\n}\n\nexport default hypenPlugin;\n"
7
7
  ],
8
8
  "mappings": "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",
9
- "debugId": "6569E8055226098C64756E2164756E21",
9
+ "debugId": "9A0E4FD082625F3D64756E2164756E21",
10
10
  "names": []
11
11
  }
@@ -312,7 +312,20 @@ function all(results) {
312
312
  }
313
313
  return Ok(values);
314
314
  }
315
- var HypenError, ActionError, ConnectionError, StateError;
315
+ function classifyEngineError(err) {
316
+ const message = err instanceof Error ? err.message : String(err);
317
+ if (message.startsWith("Parse error:")) {
318
+ return new ParseError(message);
319
+ }
320
+ if (message.startsWith("Invalid state:") || message.startsWith("Invalid state patch:")) {
321
+ return new StateError(message);
322
+ }
323
+ if (message.startsWith("Parent node not found:")) {
324
+ return new RenderError(message);
325
+ }
326
+ return new RenderError(message);
327
+ }
328
+ var HypenError, ActionError, ConnectionError, StateError, ParseError, RenderError;
316
329
  var init_result = __esm(() => {
317
330
  HypenError = class HypenError extends Error {
318
331
  code;
@@ -362,6 +375,25 @@ var init_result = __esm(() => {
362
375
  this.path = path;
363
376
  }
364
377
  };
378
+ ParseError = class ParseError extends HypenError {
379
+ source;
380
+ constructor(message, source, cause) {
381
+ super("PARSE_ERROR", message, {
382
+ context: { source },
383
+ cause: cause instanceof Error ? cause : undefined
384
+ });
385
+ this.name = "ParseError";
386
+ this.source = source;
387
+ }
388
+ };
389
+ RenderError = class RenderError extends HypenError {
390
+ constructor(message, cause) {
391
+ super("RENDER_ERROR", message, {
392
+ cause: cause instanceof Error ? cause : undefined
393
+ });
394
+ this.name = "RenderError";
395
+ }
396
+ };
365
397
  });
366
398
 
367
399
  // src/disposable.ts
@@ -892,4 +924,4 @@ export {
892
924
  RemoteEngine
893
925
  };
894
926
 
895
- //# debugId=9BAD9D906A24336464756E2164756E21
927
+ //# debugId=DC012067675358EB64756E2164756E21