@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,458 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/runtimes/edge.js
21
+ var edge_exports = {};
22
+ __export(edge_exports, {
23
+ EdgeRuntime: () => EdgeRuntime,
24
+ createBunHandler: () => createBunHandler,
25
+ createCloudflareWorker: () => createCloudflareWorker,
26
+ createDenoHandler: () => createDenoHandler
27
+ });
28
+ module.exports = __toCommonJS(edge_exports);
29
+ var import_core = require("@coherent.js/core");
30
+ var EdgeRuntime = class _EdgeRuntime {
31
+ constructor(options = {}) {
32
+ this.options = {
33
+ caching: true,
34
+ streaming: false,
35
+ headers: {
36
+ "Content-Type": "text/html; charset=utf-8",
37
+ "Cache-Control": "public, max-age=3600",
38
+ ...options.headers
39
+ },
40
+ ...options
41
+ };
42
+ this.componentRegistry = /* @__PURE__ */ new Map();
43
+ this.routeRegistry = /* @__PURE__ */ new Map();
44
+ this.cache = /* @__PURE__ */ new Map();
45
+ this.middleware = [];
46
+ this.renderCount = 0;
47
+ if (this.options.caching) {
48
+ this.initializeCacheCleanup();
49
+ }
50
+ }
51
+ initializeCacheCleanup() {
52
+ if (typeof setInterval !== "undefined") {
53
+ setInterval(() => {
54
+ if (this.cache.size > 1e3) {
55
+ const entries = Array.from(this.cache.entries());
56
+ const toDelete = entries.slice(0, entries.length - 500);
57
+ toDelete.forEach(([key]) => this.cache.delete(key));
58
+ }
59
+ }, 3e5);
60
+ }
61
+ }
62
+ // Component management
63
+ registerComponent(name, component) {
64
+ this.componentRegistry.set(name, component);
65
+ return component;
66
+ }
67
+ getComponent(name) {
68
+ return this.componentRegistry.get(name);
69
+ }
70
+ // Route management
71
+ addRoute(pattern, handler) {
72
+ this.routeRegistry.set(pattern, handler);
73
+ }
74
+ matchRoute(pathname) {
75
+ for (const [pattern, handler] of this.routeRegistry) {
76
+ const match = this.matchPattern(pattern, pathname);
77
+ if (match) {
78
+ return { handler, params: match.params };
79
+ }
80
+ }
81
+ return null;
82
+ }
83
+ matchPattern(pattern, pathname) {
84
+ if (pattern === "*" || pattern === pathname) {
85
+ return { params: {} };
86
+ }
87
+ const patternParts = pattern.split("/").filter(Boolean);
88
+ const pathParts = pathname.split("/").filter(Boolean);
89
+ if (patternParts.length !== pathParts.length) {
90
+ return null;
91
+ }
92
+ const params = {};
93
+ for (let i = 0; i < patternParts.length; i++) {
94
+ const patternPart = patternParts[i];
95
+ const pathPart = pathParts[i];
96
+ if (patternPart.startsWith(":")) {
97
+ params[patternPart.slice(1)] = pathPart;
98
+ } else if (patternPart !== pathPart) {
99
+ return null;
100
+ }
101
+ }
102
+ return { params };
103
+ }
104
+ // Rendering
105
+ async renderComponent(component, props = {}, options = {}) {
106
+ const _startTime = Date.now();
107
+ try {
108
+ const resolvedComponent = typeof component === "string" ? this.getComponent(component) : component;
109
+ if (!resolvedComponent) {
110
+ throw new Error(`Component not found: ${component}`);
111
+ }
112
+ const cacheKey = this.generateCacheKey(resolvedComponent, props);
113
+ if (this.options.caching && this.cache.has(cacheKey)) {
114
+ const cached = this.cache.get(cacheKey);
115
+ if (Date.now() - cached.timestamp < (options.cacheMaxAge || 3e5)) {
116
+ return cached.html;
117
+ }
118
+ this.cache.delete(cacheKey);
119
+ }
120
+ const vdom = resolvedComponent(props);
121
+ const html = (0, import_core.render)(vdom);
122
+ if (this.options.caching && options.cacheable !== false) {
123
+ this.cache.set(cacheKey, {
124
+ html,
125
+ timestamp: Date.now()
126
+ });
127
+ }
128
+ this.renderCount++;
129
+ return html;
130
+ } catch (error) {
131
+ console.error("Edge render error:", error);
132
+ throw error;
133
+ } finally {
134
+ if (typeof performance !== "undefined" && performance.mark) {
135
+ performance.mark(`coherent-edge-render-${Date.now()}`);
136
+ }
137
+ }
138
+ }
139
+ generateCacheKey(component, props) {
140
+ const componentName = component.name || "anonymous";
141
+ const propsHash = this.hashObject(props);
142
+ return `${componentName}-${propsHash}`;
143
+ }
144
+ hashObject(obj) {
145
+ const str = JSON.stringify(obj, Object.keys(obj).sort());
146
+ let hash = 0;
147
+ for (let i = 0; i < str.length; i++) {
148
+ const char = str.charCodeAt(i);
149
+ hash = (hash << 5) - hash + char;
150
+ hash = hash & hash;
151
+ }
152
+ return hash.toString(36);
153
+ }
154
+ // HTTP Request handling
155
+ async handleRequest(request) {
156
+ try {
157
+ const url = new URL(request.url);
158
+ const pathname = url.pathname;
159
+ const context = {
160
+ request,
161
+ url,
162
+ pathname,
163
+ params: {},
164
+ searchParams: Object.fromEntries(url.searchParams),
165
+ method: request.method,
166
+ headers: Object.fromEntries(request.headers),
167
+ runtime: this,
168
+ state: {}
169
+ // Shared state for middleware
170
+ };
171
+ let middlewareIndex = 0;
172
+ const next = async () => {
173
+ if (middlewareIndex < this.middleware.length) {
174
+ const middleware = this.middleware[middlewareIndex++];
175
+ return await middleware(context, next);
176
+ }
177
+ };
178
+ if (this.middleware.length > 0) {
179
+ await next();
180
+ }
181
+ if (context.response) {
182
+ return context.response;
183
+ }
184
+ const match = this.matchRoute(pathname);
185
+ if (!match) {
186
+ return this.createErrorResponse(404, "Not Found");
187
+ }
188
+ context.params = match.params;
189
+ const result = await match.handler(context);
190
+ if (result instanceof Response) {
191
+ return result;
192
+ }
193
+ if (typeof result === "string") {
194
+ return this.createHtmlResponse(result);
195
+ }
196
+ if (result && typeof result === "object") {
197
+ if (result.component) {
198
+ const html = await this.renderComponent(
199
+ result.component,
200
+ result.props || {},
201
+ result.options || {}
202
+ );
203
+ return this.createHtmlResponse(html, result.status, result.headers);
204
+ }
205
+ if (result.json) {
206
+ return this.createJsonResponse(result.json, result.status, result.headers);
207
+ }
208
+ if (result.redirect) {
209
+ return Response.redirect(result.redirect, result.status || 302);
210
+ }
211
+ }
212
+ return this.createJsonResponse(result);
213
+ } catch (error) {
214
+ console.error("Request handling error:", error);
215
+ return this.createErrorResponse(500, "Internal Server Error");
216
+ }
217
+ }
218
+ createHtmlResponse(html, status = 200, customHeaders = {}) {
219
+ return new Response(html, {
220
+ status,
221
+ headers: {
222
+ ...this.options.headers,
223
+ ...customHeaders
224
+ }
225
+ });
226
+ }
227
+ createJsonResponse(data, status = 200, customHeaders = {}) {
228
+ return new Response(JSON.stringify(data), {
229
+ status,
230
+ headers: {
231
+ "Content-Type": "application/json",
232
+ ...customHeaders
233
+ }
234
+ });
235
+ }
236
+ createErrorResponse(status, message) {
237
+ const errorHtml = `
238
+ <!DOCTYPE html>
239
+ <html>
240
+ <head>
241
+ <title>Error ${status}</title>
242
+ <style>
243
+ body { font-family: Arial, sans-serif; text-align: center; padding: 50px; }
244
+ h1 { color: #e74c3c; }
245
+ </style>
246
+ </head>
247
+ <body>
248
+ <h1>Error ${status}</h1>
249
+ <p>${message}</p>
250
+ </body>
251
+ </html>
252
+ `;
253
+ return new Response(errorHtml, {
254
+ status,
255
+ headers: { "Content-Type": "text/html; charset=utf-8" }
256
+ });
257
+ }
258
+ // API Routes
259
+ async handleApiRequest(request, handler) {
260
+ try {
261
+ const url = new URL(request.url);
262
+ const context = {
263
+ request,
264
+ url,
265
+ method: request.method,
266
+ headers: Object.fromEntries(request.headers),
267
+ searchParams: Object.fromEntries(url.searchParams),
268
+ runtime: this
269
+ };
270
+ if (request.method === "POST" || request.method === "PUT") {
271
+ const contentType = request.headers.get("content-type") || "";
272
+ if (contentType.includes("application/json")) {
273
+ context.body = await request.json();
274
+ } else if (contentType.includes("application/x-www-form-urlencoded")) {
275
+ const formData = await request.formData();
276
+ context.body = Object.fromEntries(formData);
277
+ } else {
278
+ context.body = await request.text();
279
+ }
280
+ }
281
+ const result = await handler(context);
282
+ if (result instanceof Response) {
283
+ return result;
284
+ }
285
+ return this.createJsonResponse(result);
286
+ } catch (error) {
287
+ console.error("API request error:", error);
288
+ return this.createJsonResponse({ error: error.message }, 500);
289
+ }
290
+ }
291
+ // Streaming support (for environments that support it)
292
+ async renderStream(component, props = {}) {
293
+ if (!this.options.streaming) {
294
+ return await this.renderComponent(component, props);
295
+ }
296
+ const encoder = new TextEncoder();
297
+ let buffer = "";
298
+ const chunkSize = this.options.streamChunkSize || 1024;
299
+ const stream = new ReadableStream({
300
+ async start(controller) {
301
+ try {
302
+ const flush = () => {
303
+ if (buffer.length > 0) {
304
+ controller.enqueue(encoder.encode(buffer));
305
+ buffer = "";
306
+ }
307
+ };
308
+ const renderNode = async (node) => {
309
+ if (!node || typeof node !== "object") {
310
+ if (node !== null && node !== void 0) {
311
+ buffer += String(node);
312
+ if (buffer.length >= chunkSize) {
313
+ flush();
314
+ }
315
+ }
316
+ return;
317
+ }
318
+ if (Array.isArray(node)) {
319
+ for (const child of node) {
320
+ await renderNode(child);
321
+ }
322
+ return;
323
+ }
324
+ for (const [tag, content] of Object.entries(node)) {
325
+ if (typeof content === "object" && content !== null) {
326
+ buffer += `<${tag}`;
327
+ for (const [key, value] of Object.entries(content)) {
328
+ if (key !== "children" && key !== "text" && value !== void 0) {
329
+ buffer += ` ${key}="${String(value)}"`;
330
+ }
331
+ }
332
+ buffer += ">";
333
+ if (buffer.length >= chunkSize) {
334
+ flush();
335
+ }
336
+ if (content.text) {
337
+ buffer += String(content.text);
338
+ if (buffer.length >= chunkSize) {
339
+ flush();
340
+ }
341
+ }
342
+ if (content.children) {
343
+ await renderNode(content.children);
344
+ }
345
+ buffer += `</${tag}>`;
346
+ if (buffer.length >= chunkSize) {
347
+ flush();
348
+ }
349
+ } else {
350
+ buffer += `<${tag}>${String(content)}</${tag}>`;
351
+ if (buffer.length >= chunkSize) {
352
+ flush();
353
+ }
354
+ }
355
+ }
356
+ };
357
+ await renderNode(component);
358
+ flush();
359
+ controller.close();
360
+ } catch (error) {
361
+ controller.error(error);
362
+ }
363
+ }
364
+ });
365
+ return new Response(stream, {
366
+ headers: {
367
+ "Content-Type": "text/html; charset=utf-8",
368
+ "Transfer-Encoding": "chunked"
369
+ }
370
+ });
371
+ }
372
+ // Create app factory
373
+ createApp() {
374
+ const app = {
375
+ // Component registration
376
+ component: (name, component, opts) => this.registerComponent(name, component, opts),
377
+ // Routing
378
+ get: (pattern, handler) => this.addRoute(pattern, handler),
379
+ post: (pattern, handler) => this.addRoute(pattern, handler),
380
+ put: (pattern, handler) => this.addRoute(pattern, handler),
381
+ delete: (pattern, handler) => this.addRoute(pattern, handler),
382
+ route: (pattern, handler) => this.addRoute(pattern, handler),
383
+ // API endpoints
384
+ api: (pattern, handler) => {
385
+ this.addRoute(pattern, (context) => this.handleApiRequest(context.request, handler));
386
+ },
387
+ // Static file serving (basic)
388
+ static: (pattern) => {
389
+ this.addRoute(pattern, async () => {
390
+ return this.createErrorResponse(404, "Static file serving not implemented");
391
+ });
392
+ },
393
+ // Middleware support
394
+ use: (middleware) => {
395
+ if (typeof middleware !== "function") {
396
+ throw new Error("Middleware must be a function");
397
+ }
398
+ this.middleware.push(middleware);
399
+ return app;
400
+ },
401
+ // Request handler
402
+ fetch: (request) => this.handleRequest(request),
403
+ // Utilities
404
+ render: (component, props, options) => this.renderComponent(component, props, options),
405
+ getRuntime: () => this,
406
+ getStats: () => ({
407
+ renderCount: this.renderCount,
408
+ cacheSize: this.cache.size,
409
+ componentCount: this.componentRegistry.size,
410
+ routeCount: this.routeRegistry.size
411
+ })
412
+ };
413
+ return app;
414
+ }
415
+ // Static factory methods
416
+ static createApp(options = {}) {
417
+ const runtime = new _EdgeRuntime(options);
418
+ return runtime.createApp(options);
419
+ }
420
+ static async handleRequest(request, components = {}, routes = {}) {
421
+ const runtime = new _EdgeRuntime();
422
+ Object.entries(components).forEach(([name, component]) => {
423
+ runtime.registerComponent(name, component);
424
+ });
425
+ Object.entries(routes).forEach(([pattern, handler]) => {
426
+ runtime.addRoute(pattern, handler);
427
+ });
428
+ return await runtime.handleRequest(request);
429
+ }
430
+ };
431
+ function createCloudflareWorker(app) {
432
+ return {
433
+ async fetch(request, _env, _ctx) {
434
+ return await app.fetch(request);
435
+ }
436
+ };
437
+ }
438
+ function createDenoHandler(app) {
439
+ return async (request) => {
440
+ return await app.fetch(request);
441
+ };
442
+ }
443
+ function createBunHandler(app) {
444
+ return {
445
+ async fetch(request) {
446
+ return await app.fetch(request);
447
+ },
448
+ port: 3e3
449
+ };
450
+ }
451
+ // Annotate the CommonJS export names for ESM import in node:
452
+ 0 && (module.exports = {
453
+ EdgeRuntime,
454
+ createBunHandler,
455
+ createCloudflareWorker,
456
+ createDenoHandler
457
+ });
458
+ //# sourceMappingURL=coherent-edge.cjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/runtimes/edge.js"],
4
+ "sourcesContent": ["/**\n * Edge Runtime - For Cloudflare Workers, Deno, Bun, and other edge environments\n * Provides server-side rendering without Node.js dependencies\n */\n\nimport { render } from '@coherent.js/core';\n\nexport class EdgeRuntime {\n constructor(options = {}) {\n this.options = {\n caching: true,\n streaming: false,\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.cache = new Map();\n this.middleware = [];\n this.renderCount = 0;\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 if (typeof setInterval !== 'undefined') {\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\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) {\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 // Simple pattern matching - supports :param and * wildcards\n if (pattern === '*' || pattern === pathname) {\n return { params: {} };\n }\n\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 // Parameter\n params[patternPart.slice(1)] = pathPart;\n } else if (patternPart !== pathPart) {\n // Literal mismatch\n return null;\n }\n }\n\n return { params };\n }\n\n // Rendering\n async renderComponent(component, props = {}, options = {}) {\n const _startTime = Date.now();\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)) { // 5 min default\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('Edge render error:', error);\n throw error;\n } finally {\n // Track render time\n if (typeof performance !== 'undefined' && performance.mark) {\n performance.mark(`coherent-edge-render-${Date.now()}`);\n }\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; // Convert to 32-bit integer\n }\n return hash.toString(36);\n }\n\n // HTTP Request handling\n async handleRequest(request) {\n try {\n const url = new URL(request.url);\n const pathname = url.pathname;\n \n // Create context\n const context = {\n request,\n url,\n pathname,\n params: {},\n searchParams: Object.fromEntries(url.searchParams),\n method: request.method,\n headers: Object.fromEntries(request.headers),\n runtime: this,\n state: {} // Shared state for middleware\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 (context.response) {\n return context.response;\n }\n \n // Find matching route\n const match = this.matchRoute(pathname);\n \n if (!match) {\n return this.createErrorResponse(404, 'Not Found');\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 (result instanceof Response) {\n return result;\n }\n\n if (typeof result === 'string') {\n return this.createHtmlResponse(result);\n }\n\n if (result && typeof result === 'object') {\n if (result.component) {\n // Render component\n const html = await this.renderComponent(\n result.component, \n result.props || {}, \n result.options || {}\n );\n return this.createHtmlResponse(html, result.status, result.headers);\n }\n\n if (result.json) {\n return this.createJsonResponse(result.json, result.status, result.headers);\n }\n\n if (result.redirect) {\n return Response.redirect(result.redirect, result.status || 302);\n }\n }\n\n // Default JSON response\n return this.createJsonResponse(result);\n\n } catch (error) {\n console.error('Request handling error:', error);\n return this.createErrorResponse(500, 'Internal Server Error');\n }\n }\n\n createHtmlResponse(html, status = 200, customHeaders = {}) {\n return new Response(html, {\n status,\n headers: {\n ...this.options.headers,\n ...customHeaders\n }\n });\n }\n\n createJsonResponse(data, status = 200, customHeaders = {}) {\n return new Response(JSON.stringify(data), {\n status,\n headers: {\n 'Content-Type': 'application/json',\n ...customHeaders\n }\n });\n }\n\n createErrorResponse(status, message) {\n const errorHtml = `\n <!DOCTYPE html>\n <html>\n <head>\n <title>Error ${status}</title>\n <style>\n body { font-family: Arial, sans-serif; text-align: center; padding: 50px; }\n h1 { color: #e74c3c; }\n </style>\n </head>\n <body>\n <h1>Error ${status}</h1>\n <p>${message}</p>\n </body>\n </html>\n `;\n \n return new Response(errorHtml, {\n status,\n headers: { 'Content-Type': 'text/html; charset=utf-8' }\n });\n }\n\n // API Routes\n async handleApiRequest(request, handler) {\n try {\n const url = new URL(request.url);\n const context = {\n request,\n url,\n method: request.method,\n headers: Object.fromEntries(request.headers),\n searchParams: Object.fromEntries(url.searchParams),\n runtime: this\n };\n\n // Parse body for POST/PUT requests\n if (request.method === 'POST' || request.method === 'PUT') {\n const contentType = request.headers.get('content-type') || '';\n \n if (contentType.includes('application/json')) {\n context.body = await request.json();\n } else if (contentType.includes('application/x-www-form-urlencoded')) {\n const formData = await request.formData();\n context.body = Object.fromEntries(formData);\n } else {\n context.body = await request.text();\n }\n }\n\n const result = await handler(context);\n \n if (result instanceof Response) {\n return result;\n }\n \n return this.createJsonResponse(result);\n \n } catch (error) {\n console.error('API request error:', error);\n return this.createJsonResponse({ error: error.message }, 500);\n }\n }\n\n // Streaming support (for environments that support it)\n async renderStream(component, props = {}) {\n if (!this.options.streaming) {\n return await this.renderComponent(component, props);\n }\n\n // Implement streaming rendering with chunked output\n const encoder = new TextEncoder();\n let buffer = '';\n const chunkSize = this.options.streamChunkSize || 1024;\n\n // Create a readable stream\n const stream = new ReadableStream({\n async start(controller) {\n try {\n // Helper to flush buffer\n const flush = () => {\n if (buffer.length > 0) {\n controller.enqueue(encoder.encode(buffer));\n buffer = '';\n }\n };\n\n // Render component tree recursively with streaming\n const renderNode = async (node) => {\n if (!node || typeof node !== 'object') {\n if (node !== null && node !== undefined) {\n buffer += String(node);\n if (buffer.length >= chunkSize) {\n flush();\n }\n }\n return;\n }\n\n // Handle arrays\n if (Array.isArray(node)) {\n for (const child of node) {\n await renderNode(child);\n }\n return;\n }\n\n // Handle component objects\n for (const [tag, content] of Object.entries(node)) {\n if (typeof content === 'object' && content !== null) {\n // Opening tag\n buffer += `<${tag}`;\n \n // Attributes\n for (const [key, value] of Object.entries(content)) {\n if (key !== 'children' && key !== 'text' && value !== undefined) {\n buffer += ` ${key}=\"${String(value)}\"`;\n }\n }\n buffer += '>';\n \n // Flush if buffer is large\n if (buffer.length >= chunkSize) {\n flush();\n }\n\n // Text content\n if (content.text) {\n buffer += String(content.text);\n if (buffer.length >= chunkSize) {\n flush();\n }\n }\n\n // Children\n if (content.children) {\n await renderNode(content.children);\n }\n\n // Closing tag\n buffer += `</${tag}>`;\n if (buffer.length >= chunkSize) {\n flush();\n }\n } else {\n // Simple text content\n buffer += `<${tag}>${String(content)}</${tag}>`;\n if (buffer.length >= chunkSize) {\n flush();\n }\n }\n }\n };\n\n // Start rendering\n await renderNode(component);\n \n // Flush remaining buffer\n flush();\n \n // Close stream\n controller.close();\n } catch (error) {\n controller.error(error);\n }\n }\n });\n\n return new Response(stream, {\n headers: {\n 'Content-Type': 'text/html; charset=utf-8',\n 'Transfer-Encoding': 'chunked'\n }\n });\n }\n\n // Create app factory\n createApp() {\n const app = {\n // Component registration\n component: (name, component, opts) => this.registerComponent(name, component, opts),\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 // API endpoints\n api: (pattern, handler) => {\n this.addRoute(pattern, (context) => this.handleApiRequest(context.request, handler));\n },\n \n // Static file serving (basic)\n static: (pattern) => {\n this.addRoute(pattern, async () => {\n // Basic static file handling\n // In a real implementation, this would serve actual files\n return this.createErrorResponse(404, 'Static file serving not implemented');\n });\n },\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 // Request handler\n fetch: (request) => this.handleRequest(request),\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 })\n };\n\n return app;\n }\n\n // Static factory methods\n static createApp(options = {}) {\n const runtime = new EdgeRuntime(options);\n return runtime.createApp(options);\n }\n\n static async handleRequest(request, components = {}, routes = {}) {\n const runtime = new EdgeRuntime();\n \n // Register components\n Object.entries(components).forEach(([name, component]) => {\n runtime.registerComponent(name, component);\n });\n \n // Register routes\n Object.entries(routes).forEach(([pattern, handler]) => {\n runtime.addRoute(pattern, handler);\n });\n \n return await runtime.handleRequest(request);\n }\n}\n\n// Helper functions for common edge runtime patterns\n\nexport function createCloudflareWorker(app) {\n return {\n async fetch(request, _env, _ctx) {\n return await app.fetch(request);\n }\n };\n}\n\nexport function createDenoHandler(app) {\n return async (request) => {\n return await app.fetch(request);\n };\n}\n\nexport function createBunHandler(app) {\n return {\n async fetch(request) {\n return await app.fetch(request);\n },\n port: 3000\n };\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }