@coherent.js/runtime 1.0.0-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/runtimes/node.js"],
4
+ "sourcesContent": ["/**\n * Node.js Runtime - For Node.js with framework integrations\n * Provides server-side rendering with Express, Fastify, Koa support\n */\n\nimport { render } from '@coherent.js/core';\nimport { createServer } from 'http';\n\nexport class NodeRuntime {\n constructor(options = {}) {\n this.options = {\n port: 3000,\n host: 'localhost',\n caching: true,\n framework: null, // 'express', 'fastify', 'koa', or null for standalone\n headers: {\n 'Content-Type': 'text/html; charset=utf-8',\n 'Cache-Control': 'public, max-age=3600',\n ...options.headers\n },\n ...options\n };\n \n this.componentRegistry = new Map();\n this.routeRegistry = new Map();\n this.middleware = [];\n this.cache = new Map();\n this.renderCount = 0;\n this.server = null;\n \n // Initialize cache cleanup if caching is enabled\n if (this.options.caching) {\n this.initializeCacheCleanup();\n }\n }\n\n initializeCacheCleanup() {\n // Simple LRU-style cleanup\n setInterval(() => {\n if (this.cache.size > 1000) {\n const entries = Array.from(this.cache.entries());\n const toDelete = entries.slice(0, entries.length - 500);\n toDelete.forEach(([key]) => this.cache.delete(key));\n }\n }, 300000); // Every 5 minutes\n }\n\n // Component management\n registerComponent(name, component) {\n this.componentRegistry.set(name, component);\n return component;\n }\n\n getComponent(name) {\n return this.componentRegistry.get(name);\n }\n\n // Route management\n addRoute(pattern, handler) {\n this.routeRegistry.set(pattern, handler);\n }\n\n matchRoute(pathname) {\n for (const [pattern, handler] of this.routeRegistry.entries()) {\n const match = this.matchPattern(pattern, pathname);\n if (match) {\n return { handler, params: match.params };\n }\n }\n return null;\n }\n\n matchPattern(pattern, pathname) {\n const patternParts = pattern.split('/').filter(Boolean);\n const pathParts = pathname.split('/').filter(Boolean);\n\n if (patternParts.length !== pathParts.length) {\n return null;\n }\n\n const params = {};\n \n for (let i = 0; i < patternParts.length; i++) {\n const patternPart = patternParts[i];\n const pathPart = pathParts[i];\n\n if (patternPart.startsWith(':')) {\n params[patternPart.slice(1)] = pathPart;\n } else if (patternPart !== pathPart) {\n return null;\n }\n }\n\n return { params };\n }\n\n // Rendering\n async renderComponent(component, props = {}, options = {}) {\n \n try {\n // Resolve component\n const resolvedComponent = typeof component === 'string' \n ? this.getComponent(component) \n : component;\n\n if (!resolvedComponent) {\n throw new Error(`Component not found: ${component}`);\n }\n\n // Check cache\n const cacheKey = this.generateCacheKey(resolvedComponent, props);\n if (this.options.caching && this.cache.has(cacheKey)) {\n const cached = this.cache.get(cacheKey);\n if (Date.now() - cached.timestamp < (options.cacheMaxAge || 300000)) {\n return cached.html;\n }\n this.cache.delete(cacheKey);\n }\n\n // Render component\n const vdom = resolvedComponent(props);\n const html = render(vdom);\n\n // Cache result\n if (this.options.caching && options.cacheable !== false) {\n this.cache.set(cacheKey, {\n html,\n timestamp: Date.now()\n });\n }\n\n this.renderCount++;\n \n return html;\n } catch (error) {\n console.error('Node render error:', error);\n throw error;\n }\n }\n\n generateCacheKey(component, props) {\n const componentName = component.name || 'anonymous';\n const propsHash = this.hashObject(props);\n return `${componentName}-${propsHash}`;\n }\n\n hashObject(obj) {\n const str = JSON.stringify(obj, Object.keys(obj).sort());\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash;\n }\n return hash.toString(36);\n }\n\n // HTTP Request handling (for standalone mode)\n async handleRequest(req, res) {\n try {\n const url = new URL(req.url, `http://${req.headers.host}`);\n const pathname = url.pathname;\n \n // Create context\n const context = {\n req,\n res,\n url,\n pathname,\n params: {},\n query: Object.fromEntries(url.searchParams),\n method: req.method,\n headers: req.headers,\n runtime: this,\n state: {}\n };\n\n // Execute middleware chain\n let middlewareIndex = 0;\n const next = async () => {\n if (middlewareIndex < this.middleware.length) {\n const middleware = this.middleware[middlewareIndex++];\n return await middleware(context, next);\n }\n };\n\n // Run middleware\n if (this.middleware.length > 0) {\n await next();\n }\n\n // Check if middleware already sent a response\n if (res.headersSent) {\n return;\n }\n \n // Find matching route\n const match = this.matchRoute(pathname);\n \n if (!match) {\n res.writeHead(404, { 'Content-Type': 'text/html' });\n res.end('<h1>404 Not Found</h1>');\n return;\n }\n\n // Add route params to context\n context.params = match.params;\n\n // Execute route handler\n const result = await match.handler(context);\n \n // Handle different response types\n if (res.headersSent) {\n return; // Handler already sent response\n }\n\n if (typeof result === 'string') {\n res.writeHead(200, this.options.headers);\n res.end(result);\n return;\n }\n\n if (result && typeof result === 'object') {\n if (result.component) {\n const html = await this.renderComponent(\n result.component, \n result.props || {}, \n result.options || {}\n );\n res.writeHead(result.status || 200, {\n ...this.options.headers,\n ...result.headers\n });\n res.end(html);\n return;\n }\n\n if (result.json !== undefined) {\n res.writeHead(result.status || 200, {\n 'Content-Type': 'application/json',\n ...result.headers\n });\n res.end(JSON.stringify(result.json));\n return;\n }\n\n if (result.redirect) {\n res.writeHead(result.status || 302, {\n 'Location': result.redirect\n });\n res.end();\n return;\n }\n\n // Default: send as JSON\n res.writeHead(200, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify(result));\n return;\n }\n\n // Fallback\n res.writeHead(200, this.options.headers);\n res.end(String(result));\n\n } catch (error) {\n console.error('Request handling error:', error);\n \n if (!res.headersSent) {\n res.writeHead(500, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: error.message }));\n }\n }\n }\n\n // Create app factory\n createApp() {\n const app = {\n // Component registration\n component: (name, component) => this.registerComponent(name, component),\n \n // Routing\n get: (pattern, handler) => this.addRoute(pattern, handler),\n post: (pattern, handler) => this.addRoute(pattern, handler),\n put: (pattern, handler) => this.addRoute(pattern, handler),\n delete: (pattern, handler) => this.addRoute(pattern, handler),\n route: (pattern, handler) => this.addRoute(pattern, handler),\n \n // Middleware support\n use: (middleware) => {\n if (typeof middleware !== 'function') {\n throw new Error('Middleware must be a function');\n }\n this.middleware.push(middleware);\n return app;\n },\n \n // Server control\n listen: (port, callback) => {\n const serverPort = port || this.options.port;\n this.server = createServer((req, res) => this.handleRequest(req, res));\n \n this.server.listen(serverPort, this.options.host, () => {\n console.log(`Coherent.js Node runtime listening on http://${this.options.host}:${serverPort}`);\n if (callback) callback();\n });\n \n return this.server;\n },\n \n close: (callback) => {\n if (this.server) {\n this.server.close(callback);\n }\n },\n \n // Utilities\n render: (component, props, options) => this.renderComponent(component, props, options),\n getRuntime: () => this,\n getStats: () => ({\n renderCount: this.renderCount,\n cacheSize: this.cache.size,\n componentCount: this.componentRegistry.size,\n routeCount: this.routeRegistry.size,\n middlewareCount: this.middleware.length\n })\n };\n\n return app;\n }\n\n // Framework integration helpers\n expressMiddleware() {\n return async (req, res, next) => {\n req.coherent = {\n render: async (component, props, options) => {\n const html = await this.renderComponent(component, props, options);\n res.send(html);\n },\n runtime: this\n };\n next();\n };\n }\n\n fastifyPlugin() {\n return async (fastify) => {\n fastify.decorate('coherent', {\n render: async (component, props, renderOptions) => {\n return await this.renderComponent(component, props, renderOptions);\n },\n runtime: this\n });\n };\n }\n\n koaMiddleware() {\n return async (ctx, next) => {\n ctx.coherent = {\n render: async (component, props, options) => {\n const html = await this.renderComponent(component, props, options);\n ctx.type = 'html';\n ctx.body = html;\n },\n runtime: this\n };\n await next();\n };\n }\n}\n\n/**\n * Create a Node.js runtime instance\n */\nexport function createNodeRuntime(options = {}) {\n return new NodeRuntime(options);\n}\n\nexport default NodeRuntime;\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,279 @@
1
+ // src/runtimes/browser.js
2
+ import { render, withState, memo } from "@coherent.js/core";
3
+ import { hydrate, autoHydrate, makeHydratable } from "@coherent.js/client";
4
+ import { integrateWithWebComponents, defineCoherentElement } from "@coherent.js/web-components";
5
+ var BrowserRuntime = class _BrowserRuntime {
6
+ constructor(options = {}) {
7
+ this.options = {
8
+ autoHydrate: true,
9
+ enableWebComponents: true,
10
+ enablePerformanceMonitoring: true,
11
+ routingMode: "hash",
12
+ // 'hash', 'history', or 'memory'
13
+ ...options
14
+ };
15
+ this.componentRegistry = /* @__PURE__ */ new Map();
16
+ this.routeRegistry = /* @__PURE__ */ new Map();
17
+ this.currentRoute = null;
18
+ this.isInitialized = false;
19
+ this.renderMetrics = [];
20
+ this.startTime = Date.now();
21
+ }
22
+ async initialize() {
23
+ if (this.isInitialized) return;
24
+ if (document.readyState === "loading") {
25
+ await new Promise((resolve) => {
26
+ document.addEventListener("DOMContentLoaded", resolve);
27
+ });
28
+ }
29
+ if (this.options.enableWebComponents) {
30
+ await this.initializeWebComponents();
31
+ }
32
+ if (this.options.routingMode !== "none") {
33
+ this.initializeRouting();
34
+ }
35
+ if (this.options.autoHydrate) {
36
+ await this.autoHydrate();
37
+ }
38
+ if (this.options.enablePerformanceMonitoring) {
39
+ this.initializePerformanceMonitoring();
40
+ }
41
+ this.isInitialized = true;
42
+ }
43
+ async initializeWebComponents() {
44
+ try {
45
+ await integrateWithWebComponents(
46
+ Object.fromEntries(this.componentRegistry),
47
+ this.options.webComponents || {}
48
+ );
49
+ } catch (error) {
50
+ console.warn("Failed to initialize Web Components:", error);
51
+ }
52
+ }
53
+ initializeRouting() {
54
+ const handleRouteChange = () => {
55
+ const newRoute = this.getCurrentRoute();
56
+ if (newRoute !== this.currentRoute) {
57
+ this.handleRouteChange(this.currentRoute, newRoute);
58
+ this.currentRoute = newRoute;
59
+ }
60
+ };
61
+ if (this.options.routingMode === "hash") {
62
+ window.addEventListener("hashchange", handleRouteChange);
63
+ } else if (this.options.routingMode === "history") {
64
+ window.addEventListener("popstate", handleRouteChange);
65
+ }
66
+ this.currentRoute = this.getCurrentRoute();
67
+ handleRouteChange();
68
+ }
69
+ getCurrentRoute() {
70
+ if (this.options.routingMode === "hash") {
71
+ return window.location.hash.slice(1) || "/";
72
+ } else if (this.options.routingMode === "history") {
73
+ return window.location.pathname;
74
+ }
75
+ return "/";
76
+ }
77
+ handleRouteChange(oldRoute, newRoute) {
78
+ const handler = this.routeRegistry.get(newRoute) || this.routeRegistry.get("*");
79
+ if (handler) {
80
+ try {
81
+ handler({ route: newRoute, oldRoute, params: this.parseRouteParams(newRoute) });
82
+ } catch (error) {
83
+ console.error("Route handler error:", error);
84
+ }
85
+ }
86
+ }
87
+ parseRouteParams(route) {
88
+ const params = {};
89
+ const parts = route.split("/").filter(Boolean);
90
+ parts.forEach((part, index) => {
91
+ if (part.startsWith(":")) {
92
+ const key = part.slice(1);
93
+ const value = parts[index];
94
+ if (value && !value.startsWith(":")) {
95
+ params[key] = value;
96
+ }
97
+ }
98
+ });
99
+ return params;
100
+ }
101
+ initializePerformanceMonitoring() {
102
+ if (typeof window === "undefined" || typeof window.PerformanceObserver === "undefined") return;
103
+ const observer = new window.PerformanceObserver((list) => {
104
+ for (const entry of list.getEntries()) {
105
+ if (entry.name.includes("coherent")) {
106
+ this.renderMetrics.push({
107
+ name: entry.name,
108
+ duration: entry.duration,
109
+ startTime: entry.startTime,
110
+ timestamp: Date.now()
111
+ });
112
+ }
113
+ }
114
+ });
115
+ try {
116
+ observer.observe({ entryTypes: ["measure", "mark"] });
117
+ } catch (error) {
118
+ console.warn("Performance monitoring not available:", error);
119
+ }
120
+ setInterval(() => {
121
+ const cutoff = Date.now() - 3e5;
122
+ this.renderMetrics = this.renderMetrics.filter((m) => m.timestamp > cutoff);
123
+ }, 6e4);
124
+ }
125
+ // Component management
126
+ registerComponent(name, component, options = {}) {
127
+ const hydratableComponent = makeHydratable(component, {
128
+ componentName: name,
129
+ ...options
130
+ });
131
+ this.componentRegistry.set(name, hydratableComponent);
132
+ if (this.options.enableWebComponents && this.isInitialized) {
133
+ try {
134
+ defineCoherentElement(name, hydratableComponent, options);
135
+ } catch (error) {
136
+ console.warn(`Failed to register Web Component ${name}:`, error);
137
+ }
138
+ }
139
+ return hydratableComponent;
140
+ }
141
+ getComponent(name) {
142
+ return this.componentRegistry.get(name);
143
+ }
144
+ // Routing
145
+ addRoute(path, handler) {
146
+ this.routeRegistry.set(path, handler);
147
+ }
148
+ navigate(path) {
149
+ if (this.options.routingMode === "hash") {
150
+ window.location.hash = path;
151
+ } else if (this.options.routingMode === "history") {
152
+ window.history.pushState({}, "", path);
153
+ this.handleRouteChange(this.currentRoute, path);
154
+ this.currentRoute = path;
155
+ }
156
+ }
157
+ // Rendering
158
+ async render(component, props = {}, target = null) {
159
+ const startMark = `coherent-render-start-${Date.now()}`;
160
+ const endMark = `coherent-render-end-${Date.now()}`;
161
+ try {
162
+ performance.mark(startMark);
163
+ const resolvedComponent = typeof component === "string" ? this.getComponent(component) : component;
164
+ if (!resolvedComponent) {
165
+ throw new Error(`Component not found: ${component}`);
166
+ }
167
+ const vdom = resolvedComponent(props);
168
+ const html = render(vdom);
169
+ let targetElement = target;
170
+ if (typeof target === "string") {
171
+ targetElement = document.querySelector(target);
172
+ }
173
+ if (!targetElement) {
174
+ targetElement = document.body;
175
+ }
176
+ targetElement.innerHTML = html;
177
+ const instance = await hydrate(targetElement.firstElementChild, resolvedComponent, props);
178
+ performance.mark(endMark);
179
+ performance.measure(`coherent-render-${resolvedComponent.name || "anonymous"}`, startMark, endMark);
180
+ return instance;
181
+ } catch (error) {
182
+ performance.mark(endMark);
183
+ console.error("Render error:", error);
184
+ throw error;
185
+ }
186
+ }
187
+ // Create a complete app
188
+ async createApp(_options = {}) {
189
+ await this.initialize();
190
+ return {
191
+ // Component management
192
+ component: (name, component, opts) => this.registerComponent(name, component, opts),
193
+ // Routing
194
+ route: (path, handler) => this.addRoute(path, handler),
195
+ navigate: (path) => this.navigate(path),
196
+ // Rendering
197
+ render: (component, props, target) => this.render(component, props, target),
198
+ // State management
199
+ state: withState,
200
+ memo,
201
+ // Hydration
202
+ hydrate: (element, component, props) => hydrate(element, component, props),
203
+ // Utilities
204
+ getRuntime: () => this,
205
+ getCurrentRoute: () => this.currentRoute,
206
+ getPerformanceMetrics: () => [...this.renderMetrics],
207
+ // Lifecycle
208
+ mount: async (component, target = "#app") => {
209
+ const app = await this.render(component, {}, target);
210
+ return app;
211
+ },
212
+ unmount: (target = "#app") => {
213
+ const element = typeof target === "string" ? document.querySelector(target) : target;
214
+ if (element) {
215
+ element.innerHTML = "";
216
+ }
217
+ }
218
+ };
219
+ }
220
+ // Auto-hydration
221
+ async autoHydrate() {
222
+ const componentMap = Object.fromEntries(this.componentRegistry);
223
+ await autoHydrate(componentMap);
224
+ }
225
+ // Static methods for quick setup
226
+ static async createQuickApp(components = {}, options = {}) {
227
+ const runtime = new _BrowserRuntime(options);
228
+ Object.entries(components).forEach(([name, component]) => {
229
+ runtime.registerComponent(name, component);
230
+ });
231
+ return await runtime.createApp(options);
232
+ }
233
+ static async renderToPage(component, props = {}, target = "#app") {
234
+ const runtime = new _BrowserRuntime({ autoHydrate: false });
235
+ await runtime.initialize();
236
+ return await runtime.render(component, props, target);
237
+ }
238
+ // Performance utilities
239
+ getPerformanceReport() {
240
+ const now = Date.now();
241
+ const uptime = now - this.startTime;
242
+ const recentMetrics = this.renderMetrics.filter((m) => m.timestamp >= now - 6e4);
243
+ const averageRenderTime = recentMetrics.length > 0 ? recentMetrics.reduce((sum, m) => sum + m.duration, 0) / recentMetrics.length : 0;
244
+ return {
245
+ uptime,
246
+ totalRenders: this.renderMetrics.length,
247
+ recentRenders: recentMetrics.length,
248
+ averageRenderTime: Math.round(averageRenderTime * 100) / 100,
249
+ registeredComponents: this.componentRegistry.size,
250
+ registeredRoutes: this.routeRegistry.size,
251
+ currentRoute: this.currentRoute,
252
+ memoryUsage: this.getMemoryUsage()
253
+ };
254
+ }
255
+ getMemoryUsage() {
256
+ if (typeof performance !== "undefined" && performance.memory) {
257
+ return {
258
+ used: Math.round(performance.memory.usedJSHeapSize / 1024 / 1024),
259
+ total: Math.round(performance.memory.totalJSHeapSize / 1024 / 1024),
260
+ limit: Math.round(performance.memory.jsHeapSizeLimit / 1024 / 1024)
261
+ };
262
+ }
263
+ return null;
264
+ }
265
+ // Development utilities
266
+ debug() {
267
+ return {
268
+ runtime: this,
269
+ components: Array.from(this.componentRegistry.keys()),
270
+ routes: Array.from(this.routeRegistry.keys()),
271
+ performance: this.getPerformanceReport(),
272
+ options: this.options
273
+ };
274
+ }
275
+ };
276
+ export {
277
+ BrowserRuntime
278
+ };
279
+ //# sourceMappingURL=coherent-standalone.esm.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/runtimes/browser.js"],
4
+ "sourcesContent": ["/**\n * Browser Runtime - Full client-side Coherent.js runtime\n * Works in browsers, Electron, and Tauri\n */\n\nimport { render, withState, memo } from '@coherent.js/core';\nimport { hydrate, autoHydrate, makeHydratable } from '@coherent.js/client';\nimport { integrateWithWebComponents, defineCoherentElement } from '@coherent.js/web-components';\n\nexport class BrowserRuntime {\n constructor(options = {}) {\n this.options = {\n autoHydrate: true,\n enableWebComponents: true,\n enablePerformanceMonitoring: true,\n routingMode: 'hash', // 'hash', 'history', or 'memory'\n ...options\n };\n \n this.componentRegistry = new Map();\n this.routeRegistry = new Map();\n this.currentRoute = null;\n this.isInitialized = false;\n \n // Performance tracking\n this.renderMetrics = [];\n this.startTime = Date.now();\n }\n\n async initialize() {\n if (this.isInitialized) return;\n\n // Wait for DOM to be ready\n if (document.readyState === 'loading') {\n await new Promise(resolve => {\n document.addEventListener('DOMContentLoaded', resolve);\n });\n }\n\n // Initialize Web Components integration\n if (this.options.enableWebComponents) {\n await this.initializeWebComponents();\n }\n\n // Initialize routing\n if (this.options.routingMode !== 'none') {\n this.initializeRouting();\n }\n\n // Auto-hydrate existing components\n if (this.options.autoHydrate) {\n await this.autoHydrate();\n }\n\n // Initialize performance monitoring\n if (this.options.enablePerformanceMonitoring) {\n this.initializePerformanceMonitoring();\n }\n\n this.isInitialized = true;\n }\n\n async initializeWebComponents() {\n try {\n await integrateWithWebComponents(\n Object.fromEntries(this.componentRegistry), \n this.options.webComponents || {}\n );\n } catch (error) {\n console.warn('Failed to initialize Web Components:', error);\n }\n }\n\n initializeRouting() {\n const handleRouteChange = () => {\n const newRoute = this.getCurrentRoute();\n if (newRoute !== this.currentRoute) {\n this.handleRouteChange(this.currentRoute, newRoute);\n this.currentRoute = newRoute;\n }\n };\n\n if (this.options.routingMode === 'hash') {\n window.addEventListener('hashchange', handleRouteChange);\n } else if (this.options.routingMode === 'history') {\n window.addEventListener('popstate', handleRouteChange);\n }\n\n // Handle initial route\n this.currentRoute = this.getCurrentRoute();\n handleRouteChange();\n }\n\n getCurrentRoute() {\n if (this.options.routingMode === 'hash') {\n return window.location.hash.slice(1) || '/';\n } else if (this.options.routingMode === 'history') {\n return window.location.pathname;\n }\n return '/';\n }\n\n handleRouteChange(oldRoute, newRoute) {\n const handler = this.routeRegistry.get(newRoute) || this.routeRegistry.get('*');\n \n if (handler) {\n try {\n handler({ route: newRoute, oldRoute, params: this.parseRouteParams(newRoute) });\n } catch (error) {\n console.error('Route handler error:', error);\n }\n }\n }\n\n parseRouteParams(route) {\n // Simple parameter parsing - can be enhanced\n const params = {};\n const parts = route.split('/').filter(Boolean);\n \n parts.forEach((part, index) => {\n if (part.startsWith(':')) {\n const key = part.slice(1);\n const value = parts[index];\n if (value && !value.startsWith(':')) {\n params[key] = value;\n }\n }\n });\n \n return params;\n }\n\n initializePerformanceMonitoring() {\n // Monitor render performance\n if (typeof window === 'undefined' || typeof window.PerformanceObserver === 'undefined') return;\n const observer = new window.PerformanceObserver((list) => {\n for (const entry of list.getEntries()) {\n if (entry.name.includes('coherent')) {\n this.renderMetrics.push({\n name: entry.name,\n duration: entry.duration,\n startTime: entry.startTime,\n timestamp: Date.now()\n });\n }\n }\n });\n\n try {\n observer.observe({ entryTypes: ['measure', 'mark'] });\n } catch (error) {\n console.warn('Performance monitoring not available:', error);\n }\n\n // Clean up old metrics periodically\n setInterval(() => {\n const cutoff = Date.now() - 300000; // 5 minutes\n this.renderMetrics = this.renderMetrics.filter(m => m.timestamp > cutoff);\n }, 60000); // Every minute\n }\n\n // Component management\n registerComponent(name, component, options = {}) {\n // Make component hydratable\n const hydratableComponent = makeHydratable(component, {\n componentName: name,\n ...options\n });\n\n this.componentRegistry.set(name, hydratableComponent);\n\n // Register as Web Component if enabled\n if (this.options.enableWebComponents && this.isInitialized) {\n try {\n defineCoherentElement(name, hydratableComponent, options);\n } catch (error) {\n console.warn(`Failed to register Web Component ${name}:`, error);\n }\n }\n\n return hydratableComponent;\n }\n\n getComponent(name) {\n return this.componentRegistry.get(name);\n }\n\n // Routing\n addRoute(path, handler) {\n this.routeRegistry.set(path, handler);\n }\n\n navigate(path) {\n if (this.options.routingMode === 'hash') {\n window.location.hash = path;\n } else if (this.options.routingMode === 'history') {\n window.history.pushState({}, '', path);\n this.handleRouteChange(this.currentRoute, path);\n this.currentRoute = path;\n }\n }\n\n // Rendering\n async render(component, props = {}, target = null) {\n const startMark = `coherent-render-start-${Date.now()}`;\n const endMark = `coherent-render-end-${Date.now()}`;\n \n try {\n performance.mark(startMark);\n\n // Resolve component\n const resolvedComponent = typeof component === 'string' \n ? this.getComponent(component) \n : component;\n\n if (!resolvedComponent) {\n throw new Error(`Component not found: ${component}`);\n }\n\n // Render component\n const vdom = resolvedComponent(props);\n const html = render(vdom);\n\n // Find or create target element\n let targetElement = target;\n if (typeof target === 'string') {\n targetElement = document.querySelector(target);\n }\n if (!targetElement) {\n targetElement = document.body;\n }\n\n // Update DOM\n targetElement.innerHTML = html;\n\n // Hydrate the rendered component\n const instance = await hydrate(targetElement.firstElementChild, resolvedComponent, props);\n\n performance.mark(endMark);\n performance.measure(`coherent-render-${resolvedComponent.name || 'anonymous'}`, startMark, endMark);\n\n return instance;\n } catch (error) {\n performance.mark(endMark);\n console.error('Render error:', error);\n throw error;\n }\n }\n\n // Create a complete app\n async createApp(_options = {}) {\n await this.initialize();\n \n return {\n // Component management\n component: (name, component, opts) => this.registerComponent(name, component, opts),\n \n // Routing\n route: (path, handler) => this.addRoute(path, handler),\n navigate: (path) => this.navigate(path),\n \n // Rendering\n render: (component, props, target) => this.render(component, props, target),\n \n // State management\n state: withState,\n memo: memo,\n \n // Hydration\n hydrate: (element, component, props) => hydrate(element, component, props),\n \n // Utilities\n getRuntime: () => this,\n getCurrentRoute: () => this.currentRoute,\n getPerformanceMetrics: () => [...this.renderMetrics],\n \n // Lifecycle\n mount: async (component, target = '#app') => {\n const app = await this.render(component, {}, target);\n return app;\n },\n \n unmount: (target = '#app') => {\n const element = typeof target === 'string' ? document.querySelector(target) : target;\n if (element) {\n element.innerHTML = '';\n }\n }\n };\n }\n\n // Auto-hydration\n async autoHydrate() {\n const componentMap = Object.fromEntries(this.componentRegistry);\n await autoHydrate(componentMap);\n }\n\n // Static methods for quick setup\n static async createQuickApp(components = {}, options = {}) {\n const runtime = new BrowserRuntime(options);\n \n // Register all components\n Object.entries(components).forEach(([name, component]) => {\n runtime.registerComponent(name, component);\n });\n \n return await runtime.createApp(options);\n }\n\n static async renderToPage(component, props = {}, target = '#app') {\n const runtime = new BrowserRuntime({ autoHydrate: false });\n await runtime.initialize();\n return await runtime.render(component, props, target);\n }\n\n // Performance utilities\n getPerformanceReport() {\n const now = Date.now();\n const uptime = now - this.startTime;\n const recentMetrics = this.renderMetrics.filter(m => m.timestamp >= now - 60000);\n \n const averageRenderTime = recentMetrics.length > 0\n ? recentMetrics.reduce((sum, m) => sum + m.duration, 0) / recentMetrics.length\n : 0;\n\n return {\n uptime,\n totalRenders: this.renderMetrics.length,\n recentRenders: recentMetrics.length,\n averageRenderTime: Math.round(averageRenderTime * 100) / 100,\n registeredComponents: this.componentRegistry.size,\n registeredRoutes: this.routeRegistry.size,\n currentRoute: this.currentRoute,\n memoryUsage: this.getMemoryUsage()\n };\n }\n\n getMemoryUsage() {\n if (typeof performance !== 'undefined' && performance.memory) {\n return {\n used: Math.round(performance.memory.usedJSHeapSize / 1024 / 1024),\n total: Math.round(performance.memory.totalJSHeapSize / 1024 / 1024),\n limit: Math.round(performance.memory.jsHeapSizeLimit / 1024 / 1024)\n };\n }\n return null;\n }\n\n // Development utilities\n debug() {\n return {\n runtime: this,\n components: Array.from(this.componentRegistry.keys()),\n routes: Array.from(this.routeRegistry.keys()),\n performance: this.getPerformanceReport(),\n options: this.options\n };\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";var Coherent=(()=>{var d=Object.defineProperty;var y=Object.getOwnPropertyDescriptor;var w=Object.getOwnPropertyNames;var R=Object.prototype.hasOwnProperty;var p=(o=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(o,{get:(e,t)=>(typeof require<"u"?require:e)[t]}):o)(function(o){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+o+'" is not supported')});var M=(o,e)=>{for(var t in e)d(o,t,{get:e[t],enumerable:!0})},C=(o,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of w(e))!R.call(o,n)&&n!==t&&d(o,n,{get:()=>e[n],enumerable:!(r=y(e,n))||r.enumerable});return o};var b=o=>C(d({},"__esModule",{value:!0}),o);var z={};M(z,{BrowserRuntime:()=>l});var c=p("@coherent.js/core"),a=p("@coherent.js/client"),m=p("@coherent.js/web-components"),l=class o{constructor(e={}){this.options={autoHydrate:!0,enableWebComponents:!0,enablePerformanceMonitoring:!0,routingMode:"hash",...e},this.componentRegistry=new Map,this.routeRegistry=new Map,this.currentRoute=null,this.isInitialized=!1,this.renderMetrics=[],this.startTime=Date.now()}async initialize(){this.isInitialized||(document.readyState==="loading"&&await new Promise(e=>{document.addEventListener("DOMContentLoaded",e)}),this.options.enableWebComponents&&await this.initializeWebComponents(),this.options.routingMode!=="none"&&this.initializeRouting(),this.options.autoHydrate&&await this.autoHydrate(),this.options.enablePerformanceMonitoring&&this.initializePerformanceMonitoring(),this.isInitialized=!0)}async initializeWebComponents(){try{await(0,m.integrateWithWebComponents)(Object.fromEntries(this.componentRegistry),this.options.webComponents||{})}catch(e){console.warn("Failed to initialize Web Components:",e)}}initializeRouting(){let e=()=>{let t=this.getCurrentRoute();t!==this.currentRoute&&(this.handleRouteChange(this.currentRoute,t),this.currentRoute=t)};this.options.routingMode==="hash"?window.addEventListener("hashchange",e):this.options.routingMode==="history"&&window.addEventListener("popstate",e),this.currentRoute=this.getCurrentRoute(),e()}getCurrentRoute(){return this.options.routingMode==="hash"?window.location.hash.slice(1)||"/":this.options.routingMode==="history"?window.location.pathname:"/"}handleRouteChange(e,t){let r=this.routeRegistry.get(t)||this.routeRegistry.get("*");if(r)try{r({route:t,oldRoute:e,params:this.parseRouteParams(t)})}catch(n){console.error("Route handler error:",n)}}parseRouteParams(e){let t={},r=e.split("/").filter(Boolean);return r.forEach((n,i)=>{if(n.startsWith(":")){let s=n.slice(1),h=r[i];h&&!h.startsWith(":")&&(t[s]=h)}}),t}initializePerformanceMonitoring(){if(typeof window>"u"||typeof window.PerformanceObserver>"u")return;let e=new window.PerformanceObserver(t=>{for(let r of t.getEntries())r.name.includes("coherent")&&this.renderMetrics.push({name:r.name,duration:r.duration,startTime:r.startTime,timestamp:Date.now()})});try{e.observe({entryTypes:["measure","mark"]})}catch(t){console.warn("Performance monitoring not available:",t)}setInterval(()=>{let t=Date.now()-3e5;this.renderMetrics=this.renderMetrics.filter(r=>r.timestamp>t)},6e4)}registerComponent(e,t,r={}){let n=(0,a.makeHydratable)(t,{componentName:e,...r});if(this.componentRegistry.set(e,n),this.options.enableWebComponents&&this.isInitialized)try{(0,m.defineCoherentElement)(e,n,r)}catch(i){console.warn(`Failed to register Web Component ${e}:`,i)}return n}getComponent(e){return this.componentRegistry.get(e)}addRoute(e,t){this.routeRegistry.set(e,t)}navigate(e){this.options.routingMode==="hash"?window.location.hash=e:this.options.routingMode==="history"&&(window.history.pushState({},"",e),this.handleRouteChange(this.currentRoute,e),this.currentRoute=e)}async render(e,t={},r=null){let n=`coherent-render-start-${Date.now()}`,i=`coherent-render-end-${Date.now()}`;try{performance.mark(n);let s=typeof e=="string"?this.getComponent(e):e;if(!s)throw new Error(`Component not found: ${e}`);let h=s(t),f=(0,c.render)(h),u=r;typeof r=="string"&&(u=document.querySelector(r)),u||(u=document.body),u.innerHTML=f;let g=await(0,a.hydrate)(u.firstElementChild,s,t);return performance.mark(i),performance.measure(`coherent-render-${s.name||"anonymous"}`,n,i),g}catch(s){throw performance.mark(i),console.error("Render error:",s),s}}async createApp(e={}){return await this.initialize(),{component:(t,r,n)=>this.registerComponent(t,r,n),route:(t,r)=>this.addRoute(t,r),navigate:t=>this.navigate(t),render:(t,r,n)=>this.render(t,r,n),state:c.withState,memo:c.memo,hydrate:(t,r,n)=>(0,a.hydrate)(t,r,n),getRuntime:()=>this,getCurrentRoute:()=>this.currentRoute,getPerformanceMetrics:()=>[...this.renderMetrics],mount:async(t,r="#app")=>await this.render(t,{},r),unmount:(t="#app")=>{let r=typeof t=="string"?document.querySelector(t):t;r&&(r.innerHTML="")}}}async autoHydrate(){let e=Object.fromEntries(this.componentRegistry);await(0,a.autoHydrate)(e)}static async createQuickApp(e={},t={}){let r=new o(t);return Object.entries(e).forEach(([n,i])=>{r.registerComponent(n,i)}),await r.createApp(t)}static async renderToPage(e,t={},r="#app"){let n=new o({autoHydrate:!1});return await n.initialize(),await n.render(e,t,r)}getPerformanceReport(){let e=Date.now(),t=e-this.startTime,r=this.renderMetrics.filter(i=>i.timestamp>=e-6e4),n=r.length>0?r.reduce((i,s)=>i+s.duration,0)/r.length:0;return{uptime:t,totalRenders:this.renderMetrics.length,recentRenders:r.length,averageRenderTime:Math.round(n*100)/100,registeredComponents:this.componentRegistry.size,registeredRoutes:this.routeRegistry.size,currentRoute:this.currentRoute,memoryUsage:this.getMemoryUsage()}}getMemoryUsage(){return typeof performance<"u"&&performance.memory?{used:Math.round(performance.memory.usedJSHeapSize/1024/1024),total:Math.round(performance.memory.totalJSHeapSize/1024/1024),limit:Math.round(performance.memory.jsHeapSizeLimit/1024/1024)}:null}debug(){return{runtime:this,components:Array.from(this.componentRegistry.keys()),routes:Array.from(this.routeRegistry.keys()),performance:this.getPerformanceReport(),options:this.options}}};return b(z);})();
2
+ //# sourceMappingURL=coherent-standalone.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/runtimes/browser.js"],
4
+ "sourcesContent": ["/**\n * Browser Runtime - Full client-side Coherent.js runtime\n * Works in browsers, Electron, and Tauri\n */\n\nimport { render, withState, memo } from '@coherent.js/core';\nimport { hydrate, autoHydrate, makeHydratable } from '@coherent.js/client';\nimport { integrateWithWebComponents, defineCoherentElement } from '@coherent.js/web-components';\n\nexport class BrowserRuntime {\n constructor(options = {}) {\n this.options = {\n autoHydrate: true,\n enableWebComponents: true,\n enablePerformanceMonitoring: true,\n routingMode: 'hash', // 'hash', 'history', or 'memory'\n ...options\n };\n \n this.componentRegistry = new Map();\n this.routeRegistry = new Map();\n this.currentRoute = null;\n this.isInitialized = false;\n \n // Performance tracking\n this.renderMetrics = [];\n this.startTime = Date.now();\n }\n\n async initialize() {\n if (this.isInitialized) return;\n\n // Wait for DOM to be ready\n if (document.readyState === 'loading') {\n await new Promise(resolve => {\n document.addEventListener('DOMContentLoaded', resolve);\n });\n }\n\n // Initialize Web Components integration\n if (this.options.enableWebComponents) {\n await this.initializeWebComponents();\n }\n\n // Initialize routing\n if (this.options.routingMode !== 'none') {\n this.initializeRouting();\n }\n\n // Auto-hydrate existing components\n if (this.options.autoHydrate) {\n await this.autoHydrate();\n }\n\n // Initialize performance monitoring\n if (this.options.enablePerformanceMonitoring) {\n this.initializePerformanceMonitoring();\n }\n\n this.isInitialized = true;\n }\n\n async initializeWebComponents() {\n try {\n await integrateWithWebComponents(\n Object.fromEntries(this.componentRegistry), \n this.options.webComponents || {}\n );\n } catch (error) {\n console.warn('Failed to initialize Web Components:', error);\n }\n }\n\n initializeRouting() {\n const handleRouteChange = () => {\n const newRoute = this.getCurrentRoute();\n if (newRoute !== this.currentRoute) {\n this.handleRouteChange(this.currentRoute, newRoute);\n this.currentRoute = newRoute;\n }\n };\n\n if (this.options.routingMode === 'hash') {\n window.addEventListener('hashchange', handleRouteChange);\n } else if (this.options.routingMode === 'history') {\n window.addEventListener('popstate', handleRouteChange);\n }\n\n // Handle initial route\n this.currentRoute = this.getCurrentRoute();\n handleRouteChange();\n }\n\n getCurrentRoute() {\n if (this.options.routingMode === 'hash') {\n return window.location.hash.slice(1) || '/';\n } else if (this.options.routingMode === 'history') {\n return window.location.pathname;\n }\n return '/';\n }\n\n handleRouteChange(oldRoute, newRoute) {\n const handler = this.routeRegistry.get(newRoute) || this.routeRegistry.get('*');\n \n if (handler) {\n try {\n handler({ route: newRoute, oldRoute, params: this.parseRouteParams(newRoute) });\n } catch (error) {\n console.error('Route handler error:', error);\n }\n }\n }\n\n parseRouteParams(route) {\n // Simple parameter parsing - can be enhanced\n const params = {};\n const parts = route.split('/').filter(Boolean);\n \n parts.forEach((part, index) => {\n if (part.startsWith(':')) {\n const key = part.slice(1);\n const value = parts[index];\n if (value && !value.startsWith(':')) {\n params[key] = value;\n }\n }\n });\n \n return params;\n }\n\n initializePerformanceMonitoring() {\n // Monitor render performance\n if (typeof window === 'undefined' || typeof window.PerformanceObserver === 'undefined') return;\n const observer = new window.PerformanceObserver((list) => {\n for (const entry of list.getEntries()) {\n if (entry.name.includes('coherent')) {\n this.renderMetrics.push({\n name: entry.name,\n duration: entry.duration,\n startTime: entry.startTime,\n timestamp: Date.now()\n });\n }\n }\n });\n\n try {\n observer.observe({ entryTypes: ['measure', 'mark'] });\n } catch (error) {\n console.warn('Performance monitoring not available:', error);\n }\n\n // Clean up old metrics periodically\n setInterval(() => {\n const cutoff = Date.now() - 300000; // 5 minutes\n this.renderMetrics = this.renderMetrics.filter(m => m.timestamp > cutoff);\n }, 60000); // Every minute\n }\n\n // Component management\n registerComponent(name, component, options = {}) {\n // Make component hydratable\n const hydratableComponent = makeHydratable(component, {\n componentName: name,\n ...options\n });\n\n this.componentRegistry.set(name, hydratableComponent);\n\n // Register as Web Component if enabled\n if (this.options.enableWebComponents && this.isInitialized) {\n try {\n defineCoherentElement(name, hydratableComponent, options);\n } catch (error) {\n console.warn(`Failed to register Web Component ${name}:`, error);\n }\n }\n\n return hydratableComponent;\n }\n\n getComponent(name) {\n return this.componentRegistry.get(name);\n }\n\n // Routing\n addRoute(path, handler) {\n this.routeRegistry.set(path, handler);\n }\n\n navigate(path) {\n if (this.options.routingMode === 'hash') {\n window.location.hash = path;\n } else if (this.options.routingMode === 'history') {\n window.history.pushState({}, '', path);\n this.handleRouteChange(this.currentRoute, path);\n this.currentRoute = path;\n }\n }\n\n // Rendering\n async render(component, props = {}, target = null) {\n const startMark = `coherent-render-start-${Date.now()}`;\n const endMark = `coherent-render-end-${Date.now()}`;\n \n try {\n performance.mark(startMark);\n\n // Resolve component\n const resolvedComponent = typeof component === 'string' \n ? this.getComponent(component) \n : component;\n\n if (!resolvedComponent) {\n throw new Error(`Component not found: ${component}`);\n }\n\n // Render component\n const vdom = resolvedComponent(props);\n const html = render(vdom);\n\n // Find or create target element\n let targetElement = target;\n if (typeof target === 'string') {\n targetElement = document.querySelector(target);\n }\n if (!targetElement) {\n targetElement = document.body;\n }\n\n // Update DOM\n targetElement.innerHTML = html;\n\n // Hydrate the rendered component\n const instance = await hydrate(targetElement.firstElementChild, resolvedComponent, props);\n\n performance.mark(endMark);\n performance.measure(`coherent-render-${resolvedComponent.name || 'anonymous'}`, startMark, endMark);\n\n return instance;\n } catch (error) {\n performance.mark(endMark);\n console.error('Render error:', error);\n throw error;\n }\n }\n\n // Create a complete app\n async createApp(_options = {}) {\n await this.initialize();\n \n return {\n // Component management\n component: (name, component, opts) => this.registerComponent(name, component, opts),\n \n // Routing\n route: (path, handler) => this.addRoute(path, handler),\n navigate: (path) => this.navigate(path),\n \n // Rendering\n render: (component, props, target) => this.render(component, props, target),\n \n // State management\n state: withState,\n memo: memo,\n \n // Hydration\n hydrate: (element, component, props) => hydrate(element, component, props),\n \n // Utilities\n getRuntime: () => this,\n getCurrentRoute: () => this.currentRoute,\n getPerformanceMetrics: () => [...this.renderMetrics],\n \n // Lifecycle\n mount: async (component, target = '#app') => {\n const app = await this.render(component, {}, target);\n return app;\n },\n \n unmount: (target = '#app') => {\n const element = typeof target === 'string' ? document.querySelector(target) : target;\n if (element) {\n element.innerHTML = '';\n }\n }\n };\n }\n\n // Auto-hydration\n async autoHydrate() {\n const componentMap = Object.fromEntries(this.componentRegistry);\n await autoHydrate(componentMap);\n }\n\n // Static methods for quick setup\n static async createQuickApp(components = {}, options = {}) {\n const runtime = new BrowserRuntime(options);\n \n // Register all components\n Object.entries(components).forEach(([name, component]) => {\n runtime.registerComponent(name, component);\n });\n \n return await runtime.createApp(options);\n }\n\n static async renderToPage(component, props = {}, target = '#app') {\n const runtime = new BrowserRuntime({ autoHydrate: false });\n await runtime.initialize();\n return await runtime.render(component, props, target);\n }\n\n // Performance utilities\n getPerformanceReport() {\n const now = Date.now();\n const uptime = now - this.startTime;\n const recentMetrics = this.renderMetrics.filter(m => m.timestamp >= now - 60000);\n \n const averageRenderTime = recentMetrics.length > 0\n ? recentMetrics.reduce((sum, m) => sum + m.duration, 0) / recentMetrics.length\n : 0;\n\n return {\n uptime,\n totalRenders: this.renderMetrics.length,\n recentRenders: recentMetrics.length,\n averageRenderTime: Math.round(averageRenderTime * 100) / 100,\n registeredComponents: this.componentRegistry.size,\n registeredRoutes: this.routeRegistry.size,\n currentRoute: this.currentRoute,\n memoryUsage: this.getMemoryUsage()\n };\n }\n\n getMemoryUsage() {\n if (typeof performance !== 'undefined' && performance.memory) {\n return {\n used: Math.round(performance.memory.usedJSHeapSize / 1024 / 1024),\n total: Math.round(performance.memory.totalJSHeapSize / 1024 / 1024),\n limit: Math.round(performance.memory.jsHeapSizeLimit / 1024 / 1024)\n };\n }\n return null;\n }\n\n // Development utilities\n debug() {\n return {\n runtime: this,\n components: Array.from(this.componentRegistry.keys()),\n routes: Array.from(this.routeRegistry.keys()),\n performance: this.getPerformanceReport(),\n options: this.options\n };\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["browser_exports", "__export", "BrowserRuntime", "import_core", "import_client", "import_web_components", "_BrowserRuntime", "options", "resolve", "error", "handleRouteChange", "newRoute", "oldRoute", "handler", "route", "params", "parts", "part", "index", "key", "value", "observer", "list", "entry", "cutoff", "m", "name", "component", "hydratableComponent", "path", "props", "target", "startMark", "endMark", "resolvedComponent", "vdom", "html", "targetElement", "instance", "_options", "opts", "element", "componentMap", "components", "runtime", "now", "uptime", "recentMetrics", "averageRenderTime", "sum"]
7
+ }