@noego/forge 0.1.13 → 0.1.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist-ssr/server.cjs +71 -7
- package/dist-ssr/server.cjs.map +1 -1
- package/dist-ssr/server.js +71 -7
- package/dist-ssr/server.js.map +1 -1
- package/package.json +1 -2
package/dist-ssr/server.cjs
CHANGED
|
@@ -662,7 +662,7 @@ class ExpressServerAdapter extends ServerAdapter {
|
|
|
662
662
|
});
|
|
663
663
|
}
|
|
664
664
|
async handleResponse(url2, matcher, route, routes, manifest, req, res) {
|
|
665
|
-
var _a, _b, _c;
|
|
665
|
+
var _a, _b, _c, _d;
|
|
666
666
|
let accepts = req.headers.accept || "";
|
|
667
667
|
let server_api_call = accepts.toLowerCase().includes("application/json");
|
|
668
668
|
if (res.headersSent) {
|
|
@@ -721,7 +721,41 @@ ${e.stack}</pre>
|
|
|
721
721
|
console.log("[SERVER] Headers already sent by middleware, returning early");
|
|
722
722
|
return;
|
|
723
723
|
}
|
|
724
|
-
let server_data
|
|
724
|
+
let server_data;
|
|
725
|
+
try {
|
|
726
|
+
server_data = await this.api_adapter.getApiData(route, request_data);
|
|
727
|
+
} catch (e) {
|
|
728
|
+
const errorMessage = (e == null ? void 0 : e.message) || String(e);
|
|
729
|
+
const errorStack = (e == null ? void 0 : e.stack) || "";
|
|
730
|
+
console.error(`[SERVER] Data loader error for route ${route.path} (${route.method}):`, {
|
|
731
|
+
error: errorMessage,
|
|
732
|
+
route: route.path,
|
|
733
|
+
method: route.method,
|
|
734
|
+
url: url2,
|
|
735
|
+
view: route.view,
|
|
736
|
+
layouts: route.layout
|
|
737
|
+
});
|
|
738
|
+
console.error("[SERVER] Data loader stack trace:", errorStack);
|
|
739
|
+
if (server_api_call) {
|
|
740
|
+
res.status(500).header("Cache-Control", "no-store, no-cache, must-revalidate, proxy-revalidate").header("Pragma", "no-cache").header("Expires", "0").type("application/json").send({
|
|
741
|
+
error: "Data loader failed",
|
|
742
|
+
message: errorMessage,
|
|
743
|
+
route: route.path
|
|
744
|
+
});
|
|
745
|
+
return;
|
|
746
|
+
}
|
|
747
|
+
res.status(500).send(`
|
|
748
|
+
<h1>500 Internal Server Error</h1>
|
|
749
|
+
<h2>Data Loader Failed</h2>
|
|
750
|
+
<p><strong>Route:</strong> ${route.path} (${route.method})</p>
|
|
751
|
+
<p><strong>View:</strong> ${route.view || "N/A"}</p>
|
|
752
|
+
<p><strong>Layouts:</strong> ${((_a = route.layout) == null ? void 0 : _a.join(", ")) || "None"}</p>
|
|
753
|
+
<pre>${errorMessage}</pre>
|
|
754
|
+
<pre>Stack Trace:
|
|
755
|
+
${errorStack}</pre>
|
|
756
|
+
`);
|
|
757
|
+
return;
|
|
758
|
+
}
|
|
725
759
|
if (server_api_call) {
|
|
726
760
|
res.header("Cache-Control", "no-store, no-cache, must-revalidate, proxy-revalidate").header("Pragma", "no-cache").header("Expires", "0").type("application/json").send(server_data);
|
|
727
761
|
return;
|
|
@@ -752,7 +786,7 @@ ${e.stack}</pre>
|
|
|
752
786
|
query: request_data.query
|
|
753
787
|
};
|
|
754
788
|
console.log("[SSR DEBUG] layouts:", layouts.map((l) => typeof l), "view:", typeof view);
|
|
755
|
-
const loader = ((
|
|
789
|
+
const loader = ((_b = this.manager) == null ? void 0 : _b["componentLoader"]) || {};
|
|
756
790
|
const componentRoot = loader["base_path"] || loader["basePath"] || "";
|
|
757
791
|
const applicationRenderer = await this.loadApplicationRenderer(componentRoot);
|
|
758
792
|
console.log("[SSR DEBUG] applicationRenderer:", typeof applicationRenderer);
|
|
@@ -818,7 +852,7 @@ ${e.stack}</pre>
|
|
|
818
852
|
} catch (e) {
|
|
819
853
|
response_code = 500;
|
|
820
854
|
const new_body = `<pre>Error rendering HTML:
|
|
821
|
-
${e}` + (((
|
|
855
|
+
${e}` + (((_c = route.layout) == null ? void 0 : _c.length) ? `layouts: ${(_d = route.layout) == null ? void 0 : _d.join(",\n")}` : "") + `
|
|
822
856
|
view: ${route.view}</pre>`;
|
|
823
857
|
html_render = await this.htmlRender.renderHTML({
|
|
824
858
|
HEAD: devClientScript,
|
|
@@ -831,7 +865,7 @@ view: ${route.view}</pre>`;
|
|
|
831
865
|
res.end(html_render);
|
|
832
866
|
}
|
|
833
867
|
async handleFallback(req, res, server_config) {
|
|
834
|
-
var _a;
|
|
868
|
+
var _a, _b;
|
|
835
869
|
if (res.headersSent) {
|
|
836
870
|
console.log("Reply already sent");
|
|
837
871
|
return;
|
|
@@ -861,7 +895,37 @@ view: ${route.view}</pre>`;
|
|
|
861
895
|
return;
|
|
862
896
|
}
|
|
863
897
|
console.log("Completed fallback middleware");
|
|
864
|
-
let server_data
|
|
898
|
+
let server_data;
|
|
899
|
+
try {
|
|
900
|
+
server_data = await this.api_adapter.getApiData(route, request_data);
|
|
901
|
+
} catch (e) {
|
|
902
|
+
const errorMessage = (e == null ? void 0 : e.message) || String(e);
|
|
903
|
+
const errorStack = (e == null ? void 0 : e.stack) || "";
|
|
904
|
+
console.error(`[SERVER] Fallback data loader error:`, {
|
|
905
|
+
error: errorMessage,
|
|
906
|
+
url: url2,
|
|
907
|
+
view: route.view,
|
|
908
|
+
layouts: route.layout
|
|
909
|
+
});
|
|
910
|
+
console.error("[SERVER] Fallback data loader stack trace:", errorStack);
|
|
911
|
+
if (server_api_call) {
|
|
912
|
+
res.status(500).header("Cache-Control", "no-store, no-cache, must-revalidate, proxy-revalidate").header("Pragma", "no-cache").header("Expires", "0").type("application/json").send({
|
|
913
|
+
error: "Fallback data loader failed",
|
|
914
|
+
message: errorMessage
|
|
915
|
+
});
|
|
916
|
+
return;
|
|
917
|
+
}
|
|
918
|
+
res.status(500).send(`
|
|
919
|
+
<h1>500 Internal Server Error</h1>
|
|
920
|
+
<h2>Fallback Data Loader Failed</h2>
|
|
921
|
+
<p><strong>View:</strong> ${route.view || "N/A"}</p>
|
|
922
|
+
<p><strong>Layouts:</strong> ${((_a = route.layout) == null ? void 0 : _a.join(", ")) || "None"}</p>
|
|
923
|
+
<pre>${errorMessage}</pre>
|
|
924
|
+
<pre>Stack Trace:
|
|
925
|
+
${errorStack}</pre>
|
|
926
|
+
`);
|
|
927
|
+
return;
|
|
928
|
+
}
|
|
865
929
|
console.log("Completed fallback API call");
|
|
866
930
|
if (server_api_call) {
|
|
867
931
|
console.log("Fallback API call");
|
|
@@ -872,7 +936,7 @@ view: ${route.view}</pre>`;
|
|
|
872
936
|
const view = await this.manager.getView(route);
|
|
873
937
|
console.log("Fallback view", view);
|
|
874
938
|
console.log("Fallback layouts", layouts);
|
|
875
|
-
const loader = ((
|
|
939
|
+
const loader = ((_b = this.manager) == null ? void 0 : _b["componentLoader"]) || {};
|
|
876
940
|
const componentRoot = loader["base_path"] || loader["basePath"] || "";
|
|
877
941
|
const applicationRenderer = await this.loadApplicationRenderer(componentRoot);
|
|
878
942
|
let { head: head_render, html, css } = server.render(applicationRenderer, {
|
package/dist-ssr/server.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.cjs","sources":["../src/routing/html_render/html_render.ts","../src/options/ServerOptions.ts","../src/routing/manifest/base.ts","../src/routing/server_adapter/api_adapter.ts","../src/routing/server_adapter/middleware_adapter.ts","../src/routing/server_adapter/server_adapter.ts","../src/routing/server_adapter/express_server_adapter.ts","../src/server/server.ts"],"sourcesContent":["import Handlebars from 'handlebars'\nimport fs from \"fs/promises\"\nimport { uneval } from 'devalue'\n\nconst default_template = `\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n {{{HEAD}}}\n <style>{{{CSS}}}</style>\n</head>\n<body>\n <div id=\"app\">{{{APP}}}</div>\n <script>window.__INITIAL_DATA__ = {{{DATA}}}</script>\n\n <script type=\"module\">\n import { createApp } from '/src/client/client.ts';\n document.addEventListener('DOMContentLoaded', () => {\n createApp('/components/');\n });\n </script>\n</body>\n</html>\n`\n\n\n\n\nexport interface IHTMLRender{\n renderHTML(data:any): Promise<string>\n getTemplate(): Promise<string>\n}\n\nexport class BaseHTMLRender implements IHTMLRender{\n constructor(private template:string = default_template) {\n\n }\n async getTemplate(): Promise<string> {\n return this.template\n }\n\n async renderHTML(data:any){\n const template = Handlebars.compile(await this.getTemplate())\n let html = template(data)\n \n // Inject window.__CONFIGURATION__ from environment variable\n const configJson = process.env.NOEGO_CONFIGURATION\n if (configJson) {\n try {\n // Parse and re-serialize with devalue to prevent XSS\n const configData = JSON.parse(configJson)\n const safeConfigJson = uneval(configData)\n const configScript = `<script>window.__CONFIGURATION__ = ${safeConfigJson};</script>`\n // Inject before closing </head> tag, or at the beginning of <body> if no </head>\n if (html.includes('</head>')) {\n html = html.replace('</head>', `${configScript}\\n</head>`)\n } else if (html.includes('<body')) {\n // Find the opening body tag and inject after it\n html = html.replace(/(<body[^>]*>)/, `$1\\n${configScript}`)\n } else {\n // Fallback: inject at the beginning\n html = configScript + '\\n' + html\n }\n } catch (e) {\n console.error('Failed to parse NOEGO_CONFIGURATION:', e)\n }\n }\n\n // Transform module script tags to automatically call default exports\n // Match: <script type=\"module\" src=\"/path/to/module.ts\"></script>\n html = html.replace(\n /<script\\s+type=[\"']module[\"']\\s+src=[\"']([^\"']+)[\"'][^>]*><\\/script>/gi,\n (_match, src) => {\n // Escape single quotes in src to prevent string breakout\n const safeSrc = src.replace(/'/g, \"\\\\'\")\n // Convert to inline script that imports and calls default export\n // Wait for DOMContentLoaded and configuration to be available\n return `<script type=\"module\">\nimport initApp from '${safeSrc}';\nfunction initializeApp() {\n if (typeof initApp === 'function' && typeof window !== 'undefined' && window.__CONFIGURATION__) {\n const result = initApp();\n if (result instanceof Promise) {\n result.catch(err => console.error('Failed to initialize app:', err));\n }\n } else {\n console.warn('App initialization skipped: initApp or window.__CONFIGURATION__ not available');\n }\n}\n// Wait for DOM to be ready\nif (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', initializeApp);\n} else {\n // DOM already loaded\n initializeApp();\n}\n</script>`\n }\n )\n \n return html\n }\n}\n\nexport class DefaultHTMLRender extends BaseHTMLRender{\n constructor() {\n super()\n }\n}\n\n\n\nexport class LiveHTMLRender implements IHTMLRender{\n constructor(private html_path:string) {\n }\n async renderHTML(data: any): Promise<string> {\n const template = Handlebars.compile(await this.getTemplate())\n let html = template(data)\n \n // Inject window.__CONFIGURATION__ from environment variable\n const configJson = process.env.NOEGO_CONFIGURATION\n if (configJson) {\n try {\n // Parse and re-serialize with devalue to prevent XSS\n const configData = JSON.parse(configJson)\n const safeConfigJson = uneval(configData)\n const configScript = `<script>window.__CONFIGURATION__ = ${safeConfigJson};</script>`\n // Inject before closing </head> tag, or at the beginning of <body> if no </head>\n if (html.includes('</head>')) {\n html = html.replace('</head>', `${configScript}\\n</head>`)\n } else if (html.includes('<body')) {\n // Find the opening body tag and inject after it\n html = html.replace(/(<body[^>]*>)/, `$1\\n${configScript}`)\n } else {\n // Fallback: inject at the beginning\n html = configScript + '\\n' + html\n }\n } catch (e) {\n console.error('Failed to parse NOEGO_CONFIGURATION:', e)\n }\n }\n\n // Transform module script tags to automatically call default exports\n // Match: <script type=\"module\" src=\"/path/to/module.ts\"></script>\n html = html.replace(\n /<script\\s+type=[\"']module[\"']\\s+src=[\"']([^\"']+)[\"'][^>]*><\\/script>/gi,\n (_match, src) => {\n // Escape single quotes in src to prevent string breakout\n const safeSrc = src.replace(/'/g, \"\\\\'\")\n // Convert to inline script that imports and calls default export\n // Wait for DOMContentLoaded and configuration to be available\n return `<script type=\"module\">\nimport initApp from '${safeSrc}';\nfunction initializeApp() {\n if (typeof initApp === 'function' && typeof window !== 'undefined' && window.__CONFIGURATION__) {\n const result = initApp();\n if (result instanceof Promise) {\n result.catch(err => console.error('Failed to initialize app:', err));\n }\n } else {\n console.warn('App initialization skipped: initApp or window.__CONFIGURATION__ not available');\n }\n}\n// Wait for DOM to be ready\nif (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', initializeApp);\n} else {\n // DOM already loaded\n initializeApp();\n}\n</script>`\n }\n )\n\n return html\n }\n async getTemplate(): Promise<string> {\n const file_content = await fs.readFile(this.html_path, 'utf8')\n return file_content\n }\n}","import path from 'path';\nimport type { IHTMLRender } from '../routing/html_render/html_render';\nimport type { ForgeAssets } from './assets';\nexport { assets } from './assets';\n\nexport type htmlRenderer = 'default' | string | IHTMLRender;\nexport type ContextBuilder = (req, res) => Record<string, any>;\n\nexport interface ServerOptions {\n development?: boolean;\n viteOptions?: any;\n component_dir?: string;\n build_dir?: string;\n renderer?: htmlRenderer;\n open_api_path?: string;\n manifest_path?: string;\n manifest_endpoint?: string;\n assets?: ForgeAssets;\n context_builder?: ContextBuilder;\n middleware_path?: string;\n}\n\nexport const defaultViteOptions: any = {\n appType: 'custom',\n root: process.cwd(),\n server: { middlewareMode: true },\n ssr: {\n noExternal: ['svelte', /^svelte\\/.*/]\n }\n};\n\nexport const defaultOptions: ServerOptions = {\n development: process.env.NODE_ENV !== 'production',\n viteOptions: defaultViteOptions,\n component_dir: '/',\n build_dir: 'dist_ssr',\n renderer: 'default',\n open_api_path: path.join(process.cwd(), 'openapi.yaml'),\n manifest_endpoint: '/manifest.json',\n middleware_path: undefined\n};\n","import { defaultOptions } from \"../../options/ServerOptions\";\nimport type { ServerOptions } from \"../../options/ServerOptions\";\nimport type { IRoute } from \"../../parser/IRoute\";\nimport { parse_openapi_config } from \"../../parser/openapi\";\nimport deepmerge from \"deepmerge\";\nimport type { IComponentLoader } from \"../component_loader/component_loader\";\nimport path from \"path\";\nimport fs from \"fs\";\nimport { pathToFileURL } from \"url\";\n\nexport class ManifestBuilder{\n private full_options: ServerOptions\n\n constructor(private openapi_path:string, private loader: IComponentLoader, private options:ServerOptions){\n this.full_options = deepmerge(defaultOptions,this.options)\n }\n\n\n async buildManifest(){\n\n const configuration = await parse_openapi_config(this.openapi_path)\n const component_path = this.full_options.component_dir\n if (!component_path) {\n throw new Error('Component path is not defined')\n }\n const routes = configuration.routes\n\n const manifest = await routes.reduce(async(acc,route)=>{\n return acc.then(async(acc)=>{\n const pattern = route.path\n const results = await requires_server(route,this.loader)\n acc[pattern] = results\n return acc\n })\n },Promise.resolve({}) as Promise<Record<string,boolean>>)\n\n return manifest\n\n }\n}\n\n\n\n\nasync function requires_server(route:IRoute,loader:IComponentLoader){\n // Check if route has middleware - middleware always requires server processing\n const has_middleware = route.middleware && route.middleware.length > 0;\n\n // Check if route or layouts have loaders\n const has_loaders = await layout_requires_server(route,loader) || await view_requires_server(route,loader);\n\n const requires_server = has_middleware || has_loaders;\n\n console.log('[MANIFEST]', route.path, {\n has_middleware,\n middleware: route.middleware,\n has_loaders,\n requires_server\n });\n\n return requires_server;\n}\n\n\nasync function layout_requires_server(route:IRoute,loader:IComponentLoader){\n const layout = route.layout\n if (!layout) {\n return false\n }\n const load_required = await Promise.all(layout.map(async (layoutPath) => {\n // Check for .load.js first (production), then .load.ts (development)\n const fullPath = loader.getComponentFullPath(layoutPath);\n const { dir, name } = path.parse(fullPath);\n const extensions: Array<'.js' | '.ts'> = ['.js', '.ts'];\n \n for (const ext of extensions) {\n const loaderFilePath = path.join(dir, `${name}.load${ext}`);\n \n try {\n if (fs.existsSync(loaderFilePath)) {\n const module = await import(pathToFileURL(loaderFilePath).href);\n if (typeof module?.default === \"function\") {\n return true;\n }\n }\n } catch (error) {\n // Continue to next extension or fallback\n }\n }\n \n // Fall back to old-style component.load (backward compatibility)\n try {\n const component = await loader.load(layoutPath);\n return !!component.load;\n } catch {\n return false;\n }\n }))\n\n return load_required.some((required:boolean)=>required)\n}\n\nasync function view_requires_server(route:IRoute,loader:IComponentLoader){\n const view = route.view\n if (!view) {\n return false\n }\n // Check for .load.js first (production), then .load.ts (development)\n const fullPath = loader.getComponentFullPath(view);\n const { dir, name } = path.parse(fullPath);\n const extensions: Array<'.js' | '.ts'> = ['.js', '.ts'];\n \n for (const ext of extensions) {\n const loaderFilePath = path.join(dir, `${name}.load${ext}`);\n \n try {\n if (fs.existsSync(loaderFilePath)) {\n const module = await import(pathToFileURL(loaderFilePath).href);\n if (typeof module?.default === \"function\") {\n return true;\n }\n }\n } catch (error) {\n // Continue to next extension or fallback\n }\n }\n \n // Fall back to old-style component.load (backward compatibility)\n try {\n const component = await loader.load(view);\n return !!component.load;\n } catch {\n return false;\n }\n}\n\n\n","import type { IRoute } from \"../../parser/IRoute\";\nimport { ComponentManager } from \"../component_loader/component_manager\";\n\n\nexport interface RequestData{\n url:string\n query: Record<string, any>;\n params?: Partial<Record<string, string | string[]>> | null;\n headers: Record<string, any>;\n body: Record<string, any>;\n context: Record<string, any>;\n}\n\n\nexport class ApiAdapter{\n\n constructor(\n private manager: ComponentManager,\n\n ){\n\n }\n\n\n async getApiData(route:IRoute,request_data:RequestData){\n \n const view = await this.manager.getViewComponent(route)\n\n //All Data Loaders\n const layout_loaders = await this.manager.getLayoutLoaders(route)\n const loader = view.load\n\n\n\n //All Loaders Read from view.\n\n let layout_data = [] as any[]\n let view_data:any = {}\n\n\n if(layout_loaders.some(loader => !!loader)){\n console.log('Layout API Calls')\n layout_data = await Promise.all(layout_loaders.map(async (layout_loader) => {\n if (!layout_loader) {\n return {}\n }\n const data = await layout_loader(request_data)\n return data\n }))\n }\n\n if(loader){\n view_data = await loader(request_data)\n }\n\n let server_data = {\n layout:layout_data,\n view:view_data,\n }\n\n return this.mergeLoaderData(route, request_data, server_data)\n }\n\n\n async getFallbackData(route:IRoute,request_data:RequestData){\n \n const view = await this.manager.getViewComponent(route)\n const layout_loaders = await this.manager.getLayoutLoaders(route)\n\n const loader = view.load\n\n let layout_data = [] as any[]\n let view_data:any = {}\n\n\n if(layout_loaders.some(loader => !!loader)){\n console.log('Layout API Calls')\n layout_data = await Promise.all(layout_loaders.map(async (layout_loader) => {\n if (!layout_loader) {\n return {}\n }\n const data = await layout_loader(request_data)\n return data\n }))\n }\n\n if(loader){\n view_data = await loader(request_data)\n }\n\n let server_data = {\n layout:layout_data,\n view:view_data,\n }\n\n return this.mergeLoaderData(route, request_data, server_data)\n }\n\n\n private async mergeLoaderData(route: IRoute, request_data: RequestData, server_data: ServerData): Promise<ServerData> {\n if (!await this.manager.hasLoaders(route)) {\n return server_data;\n }\n\n const loaders = await this.manager.getLoaders(route);\n\n const layoutLoaderResults = await Promise.all(\n loaders.layouts.map(async (loader): Promise<Record<string, any> | null> => {\n if (!loader) {\n return null;\n }\n const data = await loader(request_data);\n return data ?? null;\n })\n );\n\n const baseLayoutData = server_data.layout || [];\n const maxLayouts = Math.max(baseLayoutData.length, layoutLoaderResults.length);\n const mergedLayouts = Array.from({ length: maxLayouts }, (_, index) => {\n const baseLayoutEntry = baseLayoutData[index];\n const loaderResult = layoutLoaderResults[index];\n\n if (!loaderResult) {\n return baseLayoutEntry;\n }\n\n if (baseLayoutEntry && typeof baseLayoutEntry === 'object') {\n return { ...baseLayoutEntry, ...loaderResult };\n }\n\n return loaderResult;\n });\n\n const viewLoaderResult = loaders.view ? await loaders.view(request_data) : null;\n let mergedView = server_data.view;\n if (viewLoaderResult) {\n if (mergedView && typeof mergedView === 'object') {\n mergedView = { ...mergedView, ...viewLoaderResult };\n } else {\n mergedView = viewLoaderResult;\n }\n }\n\n return {\n layout: mergedLayouts,\n view: mergedView\n };\n }\n}\n\n\ntype ServerData = {\n layout: any[];\n view: any;\n}\n","import type { Request, Response, NextFunction } from 'express';\nimport fs from 'fs';\nimport path from 'path';\nimport { pathToFileURL } from 'url';\n\nexport type MiddlewareFunction = (req: Request, res: Response, next: NextFunction) => void;\n\ninterface MiddlewareResolutionResult {\n functions: MiddlewareFunction[];\n errors: string[];\n}\n\nconst EXTENSION_CANDIDATES = ['.js', '.mjs', '.cjs', '.ts', '.tsx'];\n\nexport class MiddlewareAdapter {\n private cache: Map<string, MiddlewareFunction[]> = new Map();\n\n constructor(\n private middlewarePath?: string,\n private fallbackPath?: string\n ) {}\n\n static build(middlewarePath?: string, fallbackPath?: string) {\n return new MiddlewareAdapter(middlewarePath, fallbackPath);\n }\n\n async handleMiddleware(req: Request, res: Response, middlewareConfig: string[] = []): Promise<void> {\n if (!Array.isArray(middlewareConfig) || middlewareConfig.length === 0) {\n return;\n }\n\n const resolution = await this.resolveMiddlewareFunctions(middlewareConfig);\n\n console.log(resolution)\n if (resolution.errors.length > 0) {\n throw new Error(`Middleware resolution failed: ${resolution.errors.join(', ')}`);\n }\n\n for (const middleware of resolution.functions) {\n await this.executeMiddleware(middleware, req, res);\n if (res.headersSent) {\n break;\n }\n }\n }\n\n private async resolveMiddlewareFunctions(middlewareConfig: string[]): Promise<MiddlewareResolutionResult> {\n const functions: MiddlewareFunction[] = [];\n const errors: string[] = [];\n\n for (const spec of middlewareConfig) {\n if (!spec) {\n continue;\n }\n try {\n let resolved = this.cache.get(spec);\n if (!resolved) {\n resolved = await this.resolveMiddlewareSpec(spec);\n this.cache.set(spec, [...resolved]);\n }\n functions.push(...resolved);\n } catch (error) {\n errors.push(`${spec}: ${(error as Error).message}`);\n }\n }\n\n return {\n functions: this.dedupe(functions),\n errors\n };\n }\n\n private async resolveMiddlewareSpec(spec: string): Promise<MiddlewareFunction[]> {\n const [filePath, selector] = this.parseMiddlewareSpec(spec);\n const fullPath = this.resolveMiddlewareFilePath(filePath);\n const module = await this.importMiddlewareModule(fullPath, spec);\n return this.extractMiddlewareFunctions(module, selector, spec);\n }\n\n private parseMiddlewareSpec(spec: string): [string, string | undefined] {\n const colonIndex = spec.indexOf(':');\n if (colonIndex === -1) {\n return [spec, undefined];\n }\n return [spec.substring(0, colonIndex), spec.substring(colonIndex + 1)];\n }\n\n private resolveMiddlewareFilePath(filePath: string): string {\n const basePath = this.middlewarePath || this.fallbackPath || process.cwd();\n const transformed = this.middlewareFileTransform(filePath);\n const baseCandidate = path.resolve(process.cwd(), path.join(basePath, transformed));\n\n const resolvedWithExt = this.findExistingFile(baseCandidate);\n if (resolvedWithExt) {\n return resolvedWithExt;\n }\n\n throw new Error(`Middleware file not found: ${transformed}`);\n }\n\n private middlewareFileTransform(filePath: string): string {\n return filePath.split('.').join(path.sep);\n }\n\n private findExistingFile(basePathWithoutExt: string): string | null {\n const ext = path.extname(basePathWithoutExt);\n if (ext) {\n return fs.existsSync(basePathWithoutExt) ? basePathWithoutExt : null;\n }\n\n const directCandidates = EXTENSION_CANDIDATES.map(extCandidate => `${basePathWithoutExt}${extCandidate}`);\n for (const candidate of directCandidates) {\n if (fs.existsSync(candidate)) {\n return candidate;\n }\n }\n\n const indexCandidates = EXTENSION_CANDIDATES.map(extCandidate => path.join(basePathWithoutExt, `index${extCandidate}`));\n for (const candidate of indexCandidates) {\n if (fs.existsSync(candidate)) {\n return candidate;\n }\n }\n\n return null;\n }\n\n private async importMiddlewareModule(fullPath: string, spec: string): Promise<any> {\n try {\n const url = pathToFileURL(fullPath).href;\n return await import(url);\n } catch (error) {\n throw new Error(`Unable to import middleware '${spec}' from ${fullPath}`);\n }\n }\n\n private extractMiddlewareFunctions(module: any, selector: string | undefined, spec: string): MiddlewareFunction[] {\n if (!selector) {\n return this.extractDefaultFunction(module, spec);\n }\n\n if (selector === '*') {\n return this.extractAllFunctions(module, spec);\n }\n\n return this.extractSpecificFunctions(module, selector, spec);\n }\n\n private extractDefaultFunction(module: any, spec: string): MiddlewareFunction[] {\n if (!module?.default) {\n throw new Error(`Middleware '${spec}' is missing a default export`);\n }\n if (typeof module.default !== 'function') {\n throw new Error(`Default export for middleware '${spec}' is not a function`);\n }\n return [module.default];\n }\n\n private extractAllFunctions(module: any, spec: string): MiddlewareFunction[] {\n const functions = Object.values(module).filter((value): value is MiddlewareFunction => typeof value === 'function');\n if (functions.length === 0) {\n throw new Error(`No functions exported by middleware '${spec}'`);\n }\n return functions;\n }\n\n private extractSpecificFunctions(module: any, selector: string, spec: string): MiddlewareFunction[] {\n const names = selector.split(',').map(name => name.trim()).filter(Boolean);\n const functions: MiddlewareFunction[] = [];\n const missing: string[] = [];\n const invalid: string[] = [];\n\n for (const name of names) {\n const value = name === 'default' ? module?.default : module?.[name];\n if (value === undefined) {\n missing.push(name);\n continue;\n }\n // Middleware must be a function with 2-4 params (req, res, next) or (err, req, res, next)\n if (typeof value !== 'function' || value.length < 2) {\n invalid.push(name);\n continue;\n }\n functions.push(value);\n }\n\n if (missing.length) {\n throw new Error(`Middleware '${spec}' is missing export(s): ${missing.join(', ')}`);\n }\n if (invalid.length) {\n throw new Error(`Middleware '${spec}' export(s) not functions: ${invalid.join(', ')}`);\n }\n\n if (functions.length === 0) {\n throw new Error(`Middleware '${spec}' did not resolve any functions for selector '${selector}'`);\n }\n\n return functions;\n }\n\n private executeMiddleware(fn: MiddlewareFunction, req: Request, res: Response): Promise<void> {\n return new Promise((resolve, reject) => {\n try {\n fn(req, res, (error?: unknown) => {\n if (error) {\n reject(error);\n return;\n }\n resolve();\n });\n } catch (error) {\n reject(error);\n }\n });\n }\n\n private dedupe(functions: MiddlewareFunction[]): MiddlewareFunction[] {\n const seen = new Set<MiddlewareFunction>();\n const ordered: MiddlewareFunction[] = [];\n for (const fn of functions) {\n if (!seen.has(fn)) {\n seen.add(fn);\n ordered.push(fn);\n }\n }\n return ordered;\n }\n}\n","import type { IRoute, IServerRoute } from '../../parser/IRoute'\n\n\n\n\n\n\nexport abstract class ServerAdapter {\n abstract handleRoutes(routes: IRoute[], server_routes: IServerRoute): Promise<void>\n}\n\n","import { render } from \"svelte/server\"\nimport path from \"path\"\nimport { uneval } from \"devalue\"\nimport type { IRoute, IServerRoute } from \"../../parser/IRoute\"\nimport { ComponentManager } from \"../component_loader/component_manager\"\nimport type { IHTMLRender } from \"../html_render/html_render\"\nimport { initialize_route_matchers } from \"../url_parser\"\nimport type { UrlMatcher } from \"../url_parser\"\nimport { ApiAdapter } from \"./api_adapter\"\nimport type { RequestData } from \"./api_adapter\"\nimport { MiddlewareAdapter } from \"./middleware_adapter\"\nimport { ServerAdapter } from \"./server_adapter\"\nimport express from \"express\"\nimport type { Request, Response } from \"express\"\nimport type { IPage } from \"../page\"\nimport { ContextBuilder } from \"../../options/ServerOptions\"\n\n\n\nexport class ExpressServerAdapter extends ServerAdapter {\n private clientRoutes: IRoute[] = [];\n\n constructor(\n private server: ReturnType<typeof express>,\n private manager: ComponentManager,\n private htmlRender: IHTMLRender,\n private api_adapter: ApiAdapter,\n private middleware_adapter: MiddlewareAdapter,\n private context_builder?: ContextBuilder,\n private isProd: boolean = false,\n private isBuiltEnvironment: boolean = false,\n private componentDir?: string\n ) {\n super()\n }\n\n private getDevViteClientScriptTag(): string {\n if (this.isProd || this.isBuiltEnvironment) {\n return '';\n }\n return `<script type=\"module\">if (import.meta?.env?.DEV) { import('/@vite/client').catch(() => {}) }</script>\\n`;\n }\n\n private async loadApplicationRenderer(componentRoot: string) {\n if (!this.isProd) {\n const mod = await import('#recursive-render');\n return mod.default ?? mod;\n }\n // In production, use the precompiled renderer shipped alongside compiled components\n const candidates = [\n path.join(componentRoot, 'RecursiveRender.js'),\n path.join(componentRoot, 'ssr', 'RecursiveRender.js'),\n ];\n let lastError: any;\n for (const fp of candidates) {\n try {\n const mod = await import(fp);\n return (mod as any).default ?? mod;\n } catch (e) {\n lastError = e;\n }\n }\n throw lastError ?? new Error('Unable to locate precompiled RecursiveRender.js');\n }\n\n private transformRoutesForClient(routes: IRoute[]): IRoute[] {\n if (!this.isProd) return routes;\n console.log(`[transformRoutesForClient] Transforming ${routes.length} routes for production`);\n const transformed = routes.map(route => ({\n ...route,\n layout: route.layout?.map(path => path.replace(/\\.svelte$/, '.js')),\n view: route.view?.replace(/\\.svelte$/, '.js')\n }));\n console.log(`[transformRoutesForClient] First route view transformed: ${routes[0]?.view} → ${transformed[0]?.view}`);\n return transformed;\n }\n\n async handleRoutes(routes: IRoute[], manifest: any): Promise<void> {\n // Transform routes for SSR in production mode and cache for client\n const transformedRoutes = this.transformRoutesForClient(routes);\n this.clientRoutes = transformedRoutes; // Cache for HTML rendering\n const matchers = initialize_route_matchers(transformedRoutes)\n\n this.server.use((req: Request, res: Response, next: any) => {\n\n (async () => {\n if (res.headersSent) {\n return\n }\n const method = req.method.toLowerCase()\n const fullUrl = req.url || '/'\n const path = fullUrl.split('?')[0] // Strip query parameters for route matching\n\n\n const not_found = async () => {\n next()\n }\n\n const matcher = matchers.find(m => m.parser(path))\n if (!matcher) {\n await not_found()\n return\n }\n const route_options = transformedRoutes.filter(r => r.path === matcher.pattern)\n const route = route_options.find(r => r.method.toLowerCase() === method)\n if (!route) {\n await not_found()\n return\n }\n\n await this.handleResponse(fullUrl, matcher, route, transformedRoutes, manifest, req, res).catch(e => {\n res.status(500).send(`\n <h1>500 Internal Server Error</h1>\n <pre>${e}</pre>\n `)\n })\n })()\n\n return;\n\n })\n }\n protected async handleResponse(url: string, matcher: UrlMatcher, route: IRoute, routes: IRoute[], manifest, req: Request, res: Response) {\n let accepts: string = req.headers.accept || ''\n let server_api_call = accepts.toLowerCase().includes('application/json')\n\n if (res.headersSent) {\n return\n }\n\n const context = {}\n if (this.context_builder) {\n const built_context = await this.context_builder(req, res)\n Object.assign(context, built_context)\n }\n req['context'] = context\n\n // Extract path parameters from the clean path (without query params)\n const cleanPath = url.split('?')[0];\n const pathParams = matcher.parser(cleanPath);\n\n // Combine path parameters with query parameters (convert query types)\n const queryParams: Record<string, string | string[]> = {};\n for (const [key, value] of Object.entries(req.query)) {\n if (typeof value === 'string') {\n queryParams[key] = value;\n } else if (Array.isArray(value)) {\n // Convert array elements to strings\n queryParams[key] = value.map(v => typeof v === 'string' ? v : String(v));\n } else if (value !== undefined) {\n queryParams[key] = String(value);\n }\n }\n const combinedParams = { ...pathParams, ...queryParams };\n\n let request_data: RequestData = {\n url,\n query: req.query,\n params: combinedParams,\n headers: req.headers,\n body: req.body,\n context\n };\n\n /**\n * Middleware\n */\n console.log('[SERVER] Handling request', req.url, {\n middleware: route.middleware,\n accept: req.headers.accept,\n route_path: route.path,\n server_api_call\n });\n try {\n await this.middleware_adapter.handleMiddleware(req, res, route.middleware || [])\n console.log('[SERVER] Middleware complete', {\n headersSent: res.headersSent,\n statusCode: res.statusCode\n });\n } catch (e) {\n console.log('Error in middleware', e)\n res.status(500).send(`\n <h1>500 Internal Server Error</h1>\n <pre>${e}</pre>\n <pre>Stack Trace:\\n${e.stack}</pre>\n `)\n return\n }\n\n // Check if middleware already sent a response (e.g., redirect, auth failure)\n if (res.headersSent) {\n console.log('[SERVER] Headers already sent by middleware, returning early');\n return;\n }\n\n let server_data = await this.api_adapter.getApiData(route, request_data)\n if (server_api_call) {\n /**\n * Early return if the request is an API call\n */\n res\n .header('Cache-Control', 'no-store, no-cache, must-revalidate, proxy-revalidate')\n .header('Pragma', 'no-cache')\n .header('Expires', '0')\n .type('application/json')\n .send(server_data);\n return;\n }\n let layouts: any[];\n let view: any;\n\n try {\n layouts = await this.manager.getLayouts(route)\n view = await this.manager.getView(route)\n } catch (e: any) {\n console.log('Error getting view', e)\n res.status(500).send(`\n <h1>500 Internal Server Error</h1>\n <pre>${e}</pre>\n <pre>Stack Trace:\\n${e.stack}</pre>\n `)\n return\n }\n\n\n /**\n * Render HTML page\n */\n let html_render = ''\n let response_code = 200\n const devClientScript = this.getDevViteClientScriptTag();\n try {\n let page: IPage = {\n url: request_data.url,\n pathname: request_data.url.split('?')[0],\n params: request_data.params || {} as any,\n query: request_data.query,\n }\n /**\n * Render application components\n */\n console.log('[SSR DEBUG] layouts:', layouts.map(l => typeof l), 'view:', typeof view);\n const loader: any = (this as any).manager?.[\"componentLoader\"] || {};\n const componentRoot = loader[\"base_path\"] || loader[\"basePath\"] || \"\";\n const applicationRenderer: any = await this.loadApplicationRenderer(componentRoot);\n console.log('[SSR DEBUG] applicationRenderer:', typeof applicationRenderer);\n const { head: head_render, html: renderedHtml, css }\n = render(applicationRenderer, {\n props: {\n layouts,\n view,\n data: server_data,\n params: request_data.params,\n urlParams: pathParams,\n query: request_data.query,\n page\n } as any\n }) as any\n // In Svelte 5, render() returns 'html' instead of 'body'\n const body_render = renderedHtml;\n console.log('[SSR DEBUG] render result - body length:', body_render?.length || 0);\n\n // Client loads from '/assets' (Vite-bundled) while SSR loads from component_dir.\n // In production, derive a client component base from SSR path by extracting the suffix after '/ssr/'.\n // Examples:\n // - componentDir='.app/ssr/components' => '/assets/components'\n // - componentDir='.app/ssr/my/framework/component' => '/assets/my/framework/component'\n // - componentDir='ui' (no ssr segment) => '/assets'\n const deriveClientBase = (dir: string): string => {\n try {\n const norm = String(dir || '').replace(/\\\\/g, '/');\n const marker = '/ssr/';\n const idx = norm.indexOf(marker);\n if (idx >= 0) {\n const suffix = norm.slice(idx + marker.length).replace(/^\\/+/, '');\n return suffix ? `/assets/${suffix}` : '/assets';\n }\n // Heuristics: if path contains a common components/pages segment, use it as suffix\n for (const hint of ['/components', '/pages']) {\n const hIdx = norm.indexOf(hint);\n if (hIdx >= 0) {\n const suffix = norm.slice(hIdx + 1).replace(/^\\/+/, '');\n return suffix ? `/assets/${suffix}` : '/assets';\n }\n }\n } catch {}\n return '/assets';\n };\n const clientComponentDir = this.isProd\n ? deriveClientBase(this.componentDir || '')\n : (this.componentDir || '/assets');\n\n const head_routing = `\n <script type='text/javascript'>\n window.__ROUTING__ = ${uneval(this.clientRoutes)}\n </script>\n\n <script type='text/javascript'>\n window.__MANIFEST__ = ${uneval(manifest)}\n console.log('[MANIFEST INJECTED]', window.__MANIFEST__);\n </script>\n\n <script type='text/javascript'>\n window.__INITIAL_DATA__ = ${uneval(server_data || {})}\n </script>\n\n <script type='text/javascript'>\n window.__COMPONENT_DIR__ = ${uneval(clientComponentDir)}\n </script>\n `\n console.log('[SSR DEBUG] About to render HTML with APP length:', body_render?.length || 0);\n html_render = await this.htmlRender.renderHTML({\n HEAD: devClientScript + head_routing + (head_render || ''),\n CSS: css,\n APP: body_render\n })\n console.log('[SSR DEBUG] Final HTML length:', html_render?.length || 0, 'contains APP div:', html_render?.includes('<div id=\"app\">'));\n\n } catch (e) {\n response_code = 500\n const new_body = (\n `<pre>Error rendering HTML:\\n${e}` +\n (route.layout?.length ? `layouts: ${route.layout?.join(',\\n')}` : '') +\n `\\nview: ${route.view}` +\n `</pre>`\n )\n\n html_render = await this.htmlRender.renderHTML({\n HEAD: devClientScript,\n APP: new_body,\n // DATA: JSON.stringify({})\n })\n }\n\n\n\n /**\n * Send HTML response\n */\n\n res.setHeader('Content-Type', 'text/html; charset=utf-8')\n res.status(response_code)\n res.end(html_render)\n\n }\n\n\n protected async handleFallback(req: Request, res: Response, server_config: IServerRoute) {\n if (res.headersSent) {\n console.log('Reply already sent')\n return\n }\n let route: any = server_config.fallback\n let accepts: string = req.headers.accept || ''\n let server_api_call = accepts.toLowerCase().includes('application/json')\n\n const url = req.url || '/'\n const context = {}\n\n let fallback_data = {\n url,\n query: req.query,\n params: {},\n headers: req.headers,\n body: req.body,\n context\n }\n\n let request_data = fallback_data as RequestData\n\n\n /**\n * Middleware\n */\n try {\n await this.middleware_adapter.handleMiddleware(req, res, route.middleware || [])\n } catch (e) {\n console.log('Error in fallback middleware', e)\n res.status(500).send(`\n <h1>500 Internal Server Error</h1>\n <pre>${e}</pre>\n `)\n return\n }\n\n console.log('Completed fallback middleware')\n\n\n\n\n\n\n\n let server_data = await this.api_adapter.getApiData(route, request_data)\n\n console.log('Completed fallback API call')\n if (server_api_call) {\n /**\n * Early return if the request is an API call\n */\n\n console.log('Fallback API call')\n res\n .header('Cache-Control', 'no-store, no-cache, must-revalidate, proxy-revalidate')\n .header('Pragma', 'no-cache')\n .header('Expires', '0')\n .type('application/json')\n .status(404)\n .send(server_data);\n return;\n }\n\n const layouts = await this.manager.getLayouts(route)\n const view = await this.manager.getView(route)\n\n console.log('Fallback view', view)\n console.log('Fallback layouts', layouts)\n\n\n\n /**\n * Render application components\n */\n const loader: any = (this as any).manager?.[\"componentLoader\"] || {};\n const componentRoot = loader[\"base_path\"] || loader[\"basePath\"] || \"\";\n const applicationRenderer: any = await this.loadApplicationRenderer(componentRoot);\n let { head: head_render, html, css }\n = render(applicationRenderer, {\n props: {\n layouts,\n view,\n data: server_data,\n params: request_data.params\n }\n }) as any\n // In Svelte 5, render() returns 'html' instead of 'body'\n const body_render = html;\n\n\n /**\n * Render HTML page\n */\n const devClientScript = this.getDevViteClientScriptTag();\n\n const html_render = await this.htmlRender.renderHTML({\n HEAD: devClientScript + (head_render || ''),\n CSS: css,\n APP: body_render\n })\n\n /**\n * Send HTML response\n */\n res\n .type('text/html')\n .status(404)\n .send(html_render)\n\n }\n}\n","\n\nimport express from 'express';\nimport path from 'path';\nimport fs from 'fs';\n\nimport deepmerge from 'deepmerge';\n\nimport { ViteComponentLoader, ProdComponentLoader } from '../routing/component_loader/component_loader'; \nimport { DefaultHTMLRender,LiveHTMLRender, BaseHTMLRender } from '../routing/html_render/html_render'; \nimport type { IHTMLRender } from '../routing/html_render/html_render';\nimport { parse_openapi_config } from '../parser/openapi';\nimport type { IRoute } from '../parser/IRoute';\nimport { defaultOptions } from '../options/ServerOptions';\nimport type { htmlRenderer, ServerOptions } from '../options/ServerOptions';\nimport type { AssetEntry } from '../options/assets';\nimport { ManifestBuilder } from '../routing/manifest/base';\nimport { ApiAdapter } from '../routing/server_adapter/api_adapter';\nimport { ComponentManager } from '../routing/component_loader/component_manager';\nimport { MiddlewareAdapter } from '../routing/server_adapter/middleware_adapter';\nimport { ExpressServerAdapter } from '../routing/server_adapter/express_server_adapter';\nexport type { ServerOptions } from '../options/ServerOptions';\n\n\nfunction pathExistsSync(p: string): boolean {\n try { return fs.existsSync(p); } catch { return false; }\n}\n\nfunction isDistRoot(dir: string): boolean {\n // Heuristics that indicate app dist root\n return (\n pathExistsSync(path.join(dir, 'index.js')) ||\n pathExistsSync(path.join(dir, '.app')) ||\n pathExistsSync(path.join(dir, 'server')) ||\n pathExistsSync(path.join(dir, 'ui'))\n );\n}\n\nfunction resolveRuntimeRoot(candidate?: string): string {\n // 1) Explicit env override\n const envRoot = process.env.FORGE_ROOT;\n if (envRoot && path.isAbsolute(envRoot) && pathExistsSync(envRoot)) {\n return path.normalize(envRoot);\n }\n // 2) Explicit viteOptions.root when absolute\n if (candidate && path.isAbsolute(candidate) && pathExistsSync(candidate)) {\n return path.normalize(candidate);\n }\n // 3) Use the directory of the entry script if available (e.g., dist/index.js)\n const entry = process.argv?.[1];\n if (entry) {\n const entryDir = path.dirname(path.resolve(entry));\n if (pathExistsSync(entryDir)) return entryDir;\n }\n // 4) Dev/serve fallback: use current working directory (App serve sets cwd to --root)\n return process.cwd();\n}\n\nexport async function createServer(app: import('express').Express, options?: ServerOptions): Promise<express.Express> {\n options = options || defaultOptions;\n const full_options = deepmerge(defaultOptions, options);\n const root = resolveRuntimeRoot(full_options.viteOptions?.root);\n full_options.viteOptions.root = root;\n\n full_options.open_api_path = ensureFullPath(full_options.viteOptions.root, full_options.open_api_path);\n\n const COMPONENT_DIR = !full_options.component_dir ? root : path.join(root, full_options.component_dir);\n\n // Auto-detect production mode: use FORGE_BUILT env var set by no_ego.js bootstrap\n // This allows staging, qa, etc. to use precompiled components regardless of NODE_ENV\n const isBuiltEnvironment = process.env.FORGE_BUILT === 'true';\n const isProd = isBuiltEnvironment || full_options.development === false;\n\n console.log(`Running in ${isProd ? 'production' : 'development'} mode (built environment: ${isBuiltEnvironment}, development flag: ${full_options.development}, NODE_ENV: ${process.env.NODE_ENV})`);\n let componentLoader;\n let vite;\n\n console.log(`Serving components from ${COMPONENT_DIR}`);\n\n // Resolve assets relative to the renderer directory for consistency\n // const rendererFullPath = (typeof full_options.renderer === 'string' && full_options.renderer !== 'default')\n // ? ensureFullPath(root, full_options.renderer)\n // : ensureFullPath(root, 'index.html');\n // const rendererDir = path.dirname(rendererFullPath);\n const resolveAssetRoot = (entry: AssetEntry): AssetEntry => {\n if (typeof entry === 'function') {\n return entry;\n }\n if (!entry || typeof entry !== 'string') return root;\n // Normalize both '/images' and 'images' to the same\n const cleaned = entry.replace(/^\\/+/, '');\n // Always resolve relative to project root (dist in prod)\n return path.resolve(root, cleaned);\n };\n\n if (full_options.assets) {\n for (const [asset_path, asset_dir] of Object.entries(full_options.assets)){\n for (const asset of asset_dir) {\n const asset_root = resolveAssetRoot(asset);\n if(typeof asset_root === 'string'){\n app.use(asset_path,express.static(asset_root))\n console.log(`Serving assets from ${asset_root} at ${asset_path}`);\n }else if (typeof asset_root === 'function'){\n app.use(asset_path,asset_root)\n console.log(`Serving assets from function at ${asset_path}`);\n } else {\n console.warn(`Invalid asset root type: ${typeof asset_root}`);\n }\n }\n }\n } else {\n console.log(`No assets to serve`);\n }\n\n if (!isProd) {\n console.log('Starting Vite in development mode...');\n const { createServer: createViteServer } = await import('vite');\n vite = await createViteServer(options.viteOptions || full_options.viteOptions);\n console.log(`Vite server created options \\n${JSON.stringify(options,null,2)}`);\n componentLoader = new ViteComponentLoader(COMPONENT_DIR, vite);\n } else {\n console.log('Starting Vite in production mode...');\n // Only serve static files if build_dir exists (traditional builds)\n // NoEgo-based builds use asset configuration instead\n const staticDir = path.join(full_options.viteOptions.root, full_options.build_dir);\n if (pathExistsSync(staticDir)) {\n app.use('/', express.static(staticDir));\n console.log(`Serving static files from ${staticDir} at /`);\n } else {\n console.log(`Skipping static file serving (build_dir ${staticDir} not found - using asset configuration)`);\n }\n\n // Serve component directory for client-side component loading\n // Use configured component_dir (e.g., 'ui') as both the directory and URL path\n const componentPath = `/${full_options.component_dir}`;\n app.use(componentPath, express.static(COMPONENT_DIR));\n console.log(`Serving components at ${componentPath} from ${COMPONENT_DIR}`);\n\n componentLoader = new ProdComponentLoader(COMPONENT_DIR);\n }\n\n const manifest = await new ManifestBuilder(\n full_options.open_api_path,\n componentLoader, \n full_options\n ).buildManifest()\n \n const htmlRenderer = getRenderer(root,full_options.renderer,isProd)\n const server_config = await parse_openapi_config(full_options.open_api_path);\n const routeDefs = server_config.routes\n /**\n * Helps manages the components of a route\n */\n const manager = new ComponentManager(componentLoader);\n const api_adapter = new ApiAdapter(manager)\n\n let middlewareRoot: string | undefined;\n if (full_options.middleware_path) {\n middlewareRoot = path.isAbsolute(full_options.middleware_path)\n ? full_options.middleware_path\n : path.resolve(full_options.viteOptions.root, full_options.middleware_path);\n }\n\n const middleware_adapter = MiddlewareAdapter.build(middlewareRoot, COMPONENT_DIR);\n\n const adapter = new ExpressServerAdapter(\n app,\n manager,\n htmlRenderer,\n api_adapter,\n middleware_adapter,\n full_options.context_builder,\n isProd,\n isBuiltEnvironment,\n full_options.component_dir,\n );\n\n\n await adapter.handleRoutes(routeDefs as IRoute[],manifest);\n console.log('Routes registered');\n\n if (!isProd) {\n app.use(vite.middlewares);\n }\n\n return app;\n}\n\n\n\nfunction getRenderer(root:string,renderer: htmlRenderer, isProd:boolean): IHTMLRender {\n if (renderer === 'default') {\n return new DefaultHTMLRender();\n } else if (typeof renderer === 'string' && !isProd) {\n return new LiveHTMLRender(ensureFullPath(root,renderer));\n } else if (typeof renderer === 'string' && isProd) {\n const html = ensureFullPath(root,renderer);\n const template = fs.readFileSync(html, 'utf8')\n return new BaseHTMLRender(template);\n } else if (renderer instanceof BaseHTMLRender) {\n return renderer;\n }else{\n throw new Error('Invalid renderer type');\n }\n}\n\n\n\nfunction ensureFullPath(root:string,renderer: string): string {\n if (path.isAbsolute(renderer)) {\n console.log(`Renderer path is absolute: ${renderer}`);\n return urlJoin(root, renderer);\n } else {\n console.log(`Renderer path is relative: ${renderer}`);\n return path.resolve(root, renderer);\n\n }\n}\n\n\nfunction urlJoin(base: string, path: string): string {\n if (base.endsWith('/')) {\n base = base.slice(0, -1);\n }\n if (path.startsWith('/')) {\n path = path.slice(1);\n }\n return `${base}/${path}`;\n}\n\n \n"],"names":["uneval","parse_openapi_config","acc","requires_server","fs","module","pathToFileURL","loader","url","server","_a","path","_b","initialize_route_matchers","render","ViteComponentLoader","ProdComponentLoader","ComponentManager"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"server.cjs","sources":["../src/routing/html_render/html_render.ts","../src/options/ServerOptions.ts","../src/routing/manifest/base.ts","../src/routing/server_adapter/api_adapter.ts","../src/routing/server_adapter/middleware_adapter.ts","../src/routing/server_adapter/server_adapter.ts","../src/routing/server_adapter/express_server_adapter.ts","../src/server/server.ts"],"sourcesContent":["import Handlebars from 'handlebars'\nimport fs from \"fs/promises\"\nimport { uneval } from 'devalue'\n\nconst default_template = `\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n {{{HEAD}}}\n <style>{{{CSS}}}</style>\n</head>\n<body>\n <div id=\"app\">{{{APP}}}</div>\n <script>window.__INITIAL_DATA__ = {{{DATA}}}</script>\n\n <script type=\"module\">\n import { createApp } from '/src/client/client.ts';\n document.addEventListener('DOMContentLoaded', () => {\n createApp('/components/');\n });\n </script>\n</body>\n</html>\n`\n\n\n\n\nexport interface IHTMLRender{\n renderHTML(data:any): Promise<string>\n getTemplate(): Promise<string>\n}\n\nexport class BaseHTMLRender implements IHTMLRender{\n constructor(private template:string = default_template) {\n\n }\n async getTemplate(): Promise<string> {\n return this.template\n }\n\n async renderHTML(data:any){\n const template = Handlebars.compile(await this.getTemplate())\n let html = template(data)\n \n // Inject window.__CONFIGURATION__ from environment variable\n const configJson = process.env.NOEGO_CONFIGURATION\n if (configJson) {\n try {\n // Parse and re-serialize with devalue to prevent XSS\n const configData = JSON.parse(configJson)\n const safeConfigJson = uneval(configData)\n const configScript = `<script>window.__CONFIGURATION__ = ${safeConfigJson};</script>`\n // Inject before closing </head> tag, or at the beginning of <body> if no </head>\n if (html.includes('</head>')) {\n html = html.replace('</head>', `${configScript}\\n</head>`)\n } else if (html.includes('<body')) {\n // Find the opening body tag and inject after it\n html = html.replace(/(<body[^>]*>)/, `$1\\n${configScript}`)\n } else {\n // Fallback: inject at the beginning\n html = configScript + '\\n' + html\n }\n } catch (e) {\n console.error('Failed to parse NOEGO_CONFIGURATION:', e)\n }\n }\n\n // Transform module script tags to automatically call default exports\n // Match: <script type=\"module\" src=\"/path/to/module.ts\"></script>\n html = html.replace(\n /<script\\s+type=[\"']module[\"']\\s+src=[\"']([^\"']+)[\"'][^>]*><\\/script>/gi,\n (_match, src) => {\n // Escape single quotes in src to prevent string breakout\n const safeSrc = src.replace(/'/g, \"\\\\'\")\n // Convert to inline script that imports and calls default export\n // Wait for DOMContentLoaded and configuration to be available\n return `<script type=\"module\">\nimport initApp from '${safeSrc}';\nfunction initializeApp() {\n if (typeof initApp === 'function' && typeof window !== 'undefined' && window.__CONFIGURATION__) {\n const result = initApp();\n if (result instanceof Promise) {\n result.catch(err => console.error('Failed to initialize app:', err));\n }\n } else {\n console.warn('App initialization skipped: initApp or window.__CONFIGURATION__ not available');\n }\n}\n// Wait for DOM to be ready\nif (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', initializeApp);\n} else {\n // DOM already loaded\n initializeApp();\n}\n</script>`\n }\n )\n \n return html\n }\n}\n\nexport class DefaultHTMLRender extends BaseHTMLRender{\n constructor() {\n super()\n }\n}\n\n\n\nexport class LiveHTMLRender implements IHTMLRender{\n constructor(private html_path:string) {\n }\n async renderHTML(data: any): Promise<string> {\n const template = Handlebars.compile(await this.getTemplate())\n let html = template(data)\n \n // Inject window.__CONFIGURATION__ from environment variable\n const configJson = process.env.NOEGO_CONFIGURATION\n if (configJson) {\n try {\n // Parse and re-serialize with devalue to prevent XSS\n const configData = JSON.parse(configJson)\n const safeConfigJson = uneval(configData)\n const configScript = `<script>window.__CONFIGURATION__ = ${safeConfigJson};</script>`\n // Inject before closing </head> tag, or at the beginning of <body> if no </head>\n if (html.includes('</head>')) {\n html = html.replace('</head>', `${configScript}\\n</head>`)\n } else if (html.includes('<body')) {\n // Find the opening body tag and inject after it\n html = html.replace(/(<body[^>]*>)/, `$1\\n${configScript}`)\n } else {\n // Fallback: inject at the beginning\n html = configScript + '\\n' + html\n }\n } catch (e) {\n console.error('Failed to parse NOEGO_CONFIGURATION:', e)\n }\n }\n\n // Transform module script tags to automatically call default exports\n // Match: <script type=\"module\" src=\"/path/to/module.ts\"></script>\n html = html.replace(\n /<script\\s+type=[\"']module[\"']\\s+src=[\"']([^\"']+)[\"'][^>]*><\\/script>/gi,\n (_match, src) => {\n // Escape single quotes in src to prevent string breakout\n const safeSrc = src.replace(/'/g, \"\\\\'\")\n // Convert to inline script that imports and calls default export\n // Wait for DOMContentLoaded and configuration to be available\n return `<script type=\"module\">\nimport initApp from '${safeSrc}';\nfunction initializeApp() {\n if (typeof initApp === 'function' && typeof window !== 'undefined' && window.__CONFIGURATION__) {\n const result = initApp();\n if (result instanceof Promise) {\n result.catch(err => console.error('Failed to initialize app:', err));\n }\n } else {\n console.warn('App initialization skipped: initApp or window.__CONFIGURATION__ not available');\n }\n}\n// Wait for DOM to be ready\nif (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', initializeApp);\n} else {\n // DOM already loaded\n initializeApp();\n}\n</script>`\n }\n )\n\n return html\n }\n async getTemplate(): Promise<string> {\n const file_content = await fs.readFile(this.html_path, 'utf8')\n return file_content\n }\n}","import path from 'path';\nimport type { IHTMLRender } from '../routing/html_render/html_render';\nimport type { ForgeAssets } from './assets';\nexport { assets } from './assets';\n\nexport type htmlRenderer = 'default' | string | IHTMLRender;\nexport type ContextBuilder = (req, res) => Record<string, any>;\n\nexport interface ServerOptions {\n development?: boolean;\n viteOptions?: any;\n component_dir?: string;\n build_dir?: string;\n renderer?: htmlRenderer;\n open_api_path?: string;\n manifest_path?: string;\n manifest_endpoint?: string;\n assets?: ForgeAssets;\n context_builder?: ContextBuilder;\n middleware_path?: string;\n}\n\nexport const defaultViteOptions: any = {\n appType: 'custom',\n root: process.cwd(),\n server: { middlewareMode: true },\n ssr: {\n noExternal: ['svelte', /^svelte\\/.*/]\n }\n};\n\nexport const defaultOptions: ServerOptions = {\n development: process.env.NODE_ENV !== 'production',\n viteOptions: defaultViteOptions,\n component_dir: '/',\n build_dir: 'dist_ssr',\n renderer: 'default',\n open_api_path: path.join(process.cwd(), 'openapi.yaml'),\n manifest_endpoint: '/manifest.json',\n middleware_path: undefined\n};\n","import { defaultOptions } from \"../../options/ServerOptions\";\nimport type { ServerOptions } from \"../../options/ServerOptions\";\nimport type { IRoute } from \"../../parser/IRoute\";\nimport { parse_openapi_config } from \"../../parser/openapi\";\nimport deepmerge from \"deepmerge\";\nimport type { IComponentLoader } from \"../component_loader/component_loader\";\nimport path from \"path\";\nimport fs from \"fs\";\nimport { pathToFileURL } from \"url\";\n\nexport class ManifestBuilder{\n private full_options: ServerOptions\n\n constructor(private openapi_path:string, private loader: IComponentLoader, private options:ServerOptions){\n this.full_options = deepmerge(defaultOptions,this.options)\n }\n\n\n async buildManifest(){\n\n const configuration = await parse_openapi_config(this.openapi_path)\n const component_path = this.full_options.component_dir\n if (!component_path) {\n throw new Error('Component path is not defined')\n }\n const routes = configuration.routes\n\n const manifest = await routes.reduce(async(acc,route)=>{\n return acc.then(async(acc)=>{\n const pattern = route.path\n const results = await requires_server(route,this.loader)\n acc[pattern] = results\n return acc\n })\n },Promise.resolve({}) as Promise<Record<string,boolean>>)\n\n return manifest\n\n }\n}\n\n\n\n\nasync function requires_server(route:IRoute,loader:IComponentLoader){\n // Check if route has middleware - middleware always requires server processing\n const has_middleware = route.middleware && route.middleware.length > 0;\n\n // Check if route or layouts have loaders\n const has_loaders = await layout_requires_server(route,loader) || await view_requires_server(route,loader);\n\n const requires_server = has_middleware || has_loaders;\n\n console.log('[MANIFEST]', route.path, {\n has_middleware,\n middleware: route.middleware,\n has_loaders,\n requires_server\n });\n\n return requires_server;\n}\n\n\nasync function layout_requires_server(route:IRoute,loader:IComponentLoader){\n const layout = route.layout\n if (!layout) {\n return false\n }\n const load_required = await Promise.all(layout.map(async (layoutPath) => {\n // Check for .load.js first (production), then .load.ts (development)\n const fullPath = loader.getComponentFullPath(layoutPath);\n const { dir, name } = path.parse(fullPath);\n const extensions: Array<'.js' | '.ts'> = ['.js', '.ts'];\n \n for (const ext of extensions) {\n const loaderFilePath = path.join(dir, `${name}.load${ext}`);\n \n try {\n if (fs.existsSync(loaderFilePath)) {\n const module = await import(pathToFileURL(loaderFilePath).href);\n if (typeof module?.default === \"function\") {\n return true;\n }\n }\n } catch (error) {\n // Continue to next extension or fallback\n }\n }\n \n // Fall back to old-style component.load (backward compatibility)\n try {\n const component = await loader.load(layoutPath);\n return !!component.load;\n } catch {\n return false;\n }\n }))\n\n return load_required.some((required:boolean)=>required)\n}\n\nasync function view_requires_server(route:IRoute,loader:IComponentLoader){\n const view = route.view\n if (!view) {\n return false\n }\n // Check for .load.js first (production), then .load.ts (development)\n const fullPath = loader.getComponentFullPath(view);\n const { dir, name } = path.parse(fullPath);\n const extensions: Array<'.js' | '.ts'> = ['.js', '.ts'];\n \n for (const ext of extensions) {\n const loaderFilePath = path.join(dir, `${name}.load${ext}`);\n \n try {\n if (fs.existsSync(loaderFilePath)) {\n const module = await import(pathToFileURL(loaderFilePath).href);\n if (typeof module?.default === \"function\") {\n return true;\n }\n }\n } catch (error) {\n // Continue to next extension or fallback\n }\n }\n \n // Fall back to old-style component.load (backward compatibility)\n try {\n const component = await loader.load(view);\n return !!component.load;\n } catch {\n return false;\n }\n}\n\n\n","import type { IRoute } from \"../../parser/IRoute\";\nimport { ComponentManager } from \"../component_loader/component_manager\";\n\n\nexport interface RequestData{\n url:string\n query: Record<string, any>;\n params?: Partial<Record<string, string | string[]>> | null;\n headers: Record<string, any>;\n body: Record<string, any>;\n context: Record<string, any>;\n}\n\n\nexport class ApiAdapter{\n\n constructor(\n private manager: ComponentManager,\n\n ){\n\n }\n\n\n async getApiData(route:IRoute,request_data:RequestData){\n \n const view = await this.manager.getViewComponent(route)\n\n //All Data Loaders\n const layout_loaders = await this.manager.getLayoutLoaders(route)\n const loader = view.load\n\n\n\n //All Loaders Read from view.\n\n let layout_data = [] as any[]\n let view_data:any = {}\n\n\n if(layout_loaders.some(loader => !!loader)){\n console.log('Layout API Calls')\n layout_data = await Promise.all(layout_loaders.map(async (layout_loader) => {\n if (!layout_loader) {\n return {}\n }\n const data = await layout_loader(request_data)\n return data\n }))\n }\n\n if(loader){\n view_data = await loader(request_data)\n }\n\n let server_data = {\n layout:layout_data,\n view:view_data,\n }\n\n return this.mergeLoaderData(route, request_data, server_data)\n }\n\n\n async getFallbackData(route:IRoute,request_data:RequestData){\n \n const view = await this.manager.getViewComponent(route)\n const layout_loaders = await this.manager.getLayoutLoaders(route)\n\n const loader = view.load\n\n let layout_data = [] as any[]\n let view_data:any = {}\n\n\n if(layout_loaders.some(loader => !!loader)){\n console.log('Layout API Calls')\n layout_data = await Promise.all(layout_loaders.map(async (layout_loader) => {\n if (!layout_loader) {\n return {}\n }\n const data = await layout_loader(request_data)\n return data\n }))\n }\n\n if(loader){\n view_data = await loader(request_data)\n }\n\n let server_data = {\n layout:layout_data,\n view:view_data,\n }\n\n return this.mergeLoaderData(route, request_data, server_data)\n }\n\n\n private async mergeLoaderData(route: IRoute, request_data: RequestData, server_data: ServerData): Promise<ServerData> {\n if (!await this.manager.hasLoaders(route)) {\n return server_data;\n }\n\n const loaders = await this.manager.getLoaders(route);\n\n const layoutLoaderResults = await Promise.all(\n loaders.layouts.map(async (loader): Promise<Record<string, any> | null> => {\n if (!loader) {\n return null;\n }\n const data = await loader(request_data);\n return data ?? null;\n })\n );\n\n const baseLayoutData = server_data.layout || [];\n const maxLayouts = Math.max(baseLayoutData.length, layoutLoaderResults.length);\n const mergedLayouts = Array.from({ length: maxLayouts }, (_, index) => {\n const baseLayoutEntry = baseLayoutData[index];\n const loaderResult = layoutLoaderResults[index];\n\n if (!loaderResult) {\n return baseLayoutEntry;\n }\n\n if (baseLayoutEntry && typeof baseLayoutEntry === 'object') {\n return { ...baseLayoutEntry, ...loaderResult };\n }\n\n return loaderResult;\n });\n\n const viewLoaderResult = loaders.view ? await loaders.view(request_data) : null;\n let mergedView = server_data.view;\n if (viewLoaderResult) {\n if (mergedView && typeof mergedView === 'object') {\n mergedView = { ...mergedView, ...viewLoaderResult };\n } else {\n mergedView = viewLoaderResult;\n }\n }\n\n return {\n layout: mergedLayouts,\n view: mergedView\n };\n }\n}\n\n\ntype ServerData = {\n layout: any[];\n view: any;\n}\n","import type { Request, Response, NextFunction } from 'express';\nimport fs from 'fs';\nimport path from 'path';\nimport { pathToFileURL } from 'url';\n\nexport type MiddlewareFunction = (req: Request, res: Response, next: NextFunction) => void;\n\ninterface MiddlewareResolutionResult {\n functions: MiddlewareFunction[];\n errors: string[];\n}\n\nconst EXTENSION_CANDIDATES = ['.js', '.mjs', '.cjs', '.ts', '.tsx'];\n\nexport class MiddlewareAdapter {\n private cache: Map<string, MiddlewareFunction[]> = new Map();\n\n constructor(\n private middlewarePath?: string,\n private fallbackPath?: string\n ) {}\n\n static build(middlewarePath?: string, fallbackPath?: string) {\n return new MiddlewareAdapter(middlewarePath, fallbackPath);\n }\n\n async handleMiddleware(req: Request, res: Response, middlewareConfig: string[] = []): Promise<void> {\n if (!Array.isArray(middlewareConfig) || middlewareConfig.length === 0) {\n return;\n }\n\n const resolution = await this.resolveMiddlewareFunctions(middlewareConfig);\n\n console.log(resolution)\n if (resolution.errors.length > 0) {\n throw new Error(`Middleware resolution failed: ${resolution.errors.join(', ')}`);\n }\n\n for (const middleware of resolution.functions) {\n await this.executeMiddleware(middleware, req, res);\n if (res.headersSent) {\n break;\n }\n }\n }\n\n private async resolveMiddlewareFunctions(middlewareConfig: string[]): Promise<MiddlewareResolutionResult> {\n const functions: MiddlewareFunction[] = [];\n const errors: string[] = [];\n\n for (const spec of middlewareConfig) {\n if (!spec) {\n continue;\n }\n try {\n let resolved = this.cache.get(spec);\n if (!resolved) {\n resolved = await this.resolveMiddlewareSpec(spec);\n this.cache.set(spec, [...resolved]);\n }\n functions.push(...resolved);\n } catch (error) {\n errors.push(`${spec}: ${(error as Error).message}`);\n }\n }\n\n return {\n functions: this.dedupe(functions),\n errors\n };\n }\n\n private async resolveMiddlewareSpec(spec: string): Promise<MiddlewareFunction[]> {\n const [filePath, selector] = this.parseMiddlewareSpec(spec);\n const fullPath = this.resolveMiddlewareFilePath(filePath);\n const module = await this.importMiddlewareModule(fullPath, spec);\n return this.extractMiddlewareFunctions(module, selector, spec);\n }\n\n private parseMiddlewareSpec(spec: string): [string, string | undefined] {\n const colonIndex = spec.indexOf(':');\n if (colonIndex === -1) {\n return [spec, undefined];\n }\n return [spec.substring(0, colonIndex), spec.substring(colonIndex + 1)];\n }\n\n private resolveMiddlewareFilePath(filePath: string): string {\n const basePath = this.middlewarePath || this.fallbackPath || process.cwd();\n const transformed = this.middlewareFileTransform(filePath);\n const baseCandidate = path.resolve(process.cwd(), path.join(basePath, transformed));\n\n const resolvedWithExt = this.findExistingFile(baseCandidate);\n if (resolvedWithExt) {\n return resolvedWithExt;\n }\n\n throw new Error(`Middleware file not found: ${transformed}`);\n }\n\n private middlewareFileTransform(filePath: string): string {\n return filePath.split('.').join(path.sep);\n }\n\n private findExistingFile(basePathWithoutExt: string): string | null {\n const ext = path.extname(basePathWithoutExt);\n if (ext) {\n return fs.existsSync(basePathWithoutExt) ? basePathWithoutExt : null;\n }\n\n const directCandidates = EXTENSION_CANDIDATES.map(extCandidate => `${basePathWithoutExt}${extCandidate}`);\n for (const candidate of directCandidates) {\n if (fs.existsSync(candidate)) {\n return candidate;\n }\n }\n\n const indexCandidates = EXTENSION_CANDIDATES.map(extCandidate => path.join(basePathWithoutExt, `index${extCandidate}`));\n for (const candidate of indexCandidates) {\n if (fs.existsSync(candidate)) {\n return candidate;\n }\n }\n\n return null;\n }\n\n private async importMiddlewareModule(fullPath: string, spec: string): Promise<any> {\n try {\n const url = pathToFileURL(fullPath).href;\n return await import(url);\n } catch (error) {\n throw new Error(`Unable to import middleware '${spec}' from ${fullPath}`);\n }\n }\n\n private extractMiddlewareFunctions(module: any, selector: string | undefined, spec: string): MiddlewareFunction[] {\n if (!selector) {\n return this.extractDefaultFunction(module, spec);\n }\n\n if (selector === '*') {\n return this.extractAllFunctions(module, spec);\n }\n\n return this.extractSpecificFunctions(module, selector, spec);\n }\n\n private extractDefaultFunction(module: any, spec: string): MiddlewareFunction[] {\n if (!module?.default) {\n throw new Error(`Middleware '${spec}' is missing a default export`);\n }\n if (typeof module.default !== 'function') {\n throw new Error(`Default export for middleware '${spec}' is not a function`);\n }\n return [module.default];\n }\n\n private extractAllFunctions(module: any, spec: string): MiddlewareFunction[] {\n const functions = Object.values(module).filter((value): value is MiddlewareFunction => typeof value === 'function');\n if (functions.length === 0) {\n throw new Error(`No functions exported by middleware '${spec}'`);\n }\n return functions;\n }\n\n private extractSpecificFunctions(module: any, selector: string, spec: string): MiddlewareFunction[] {\n const names = selector.split(',').map(name => name.trim()).filter(Boolean);\n const functions: MiddlewareFunction[] = [];\n const missing: string[] = [];\n const invalid: string[] = [];\n\n for (const name of names) {\n const value = name === 'default' ? module?.default : module?.[name];\n if (value === undefined) {\n missing.push(name);\n continue;\n }\n // Middleware must be a function with 2-4 params (req, res, next) or (err, req, res, next)\n if (typeof value !== 'function' || value.length < 2) {\n invalid.push(name);\n continue;\n }\n functions.push(value);\n }\n\n if (missing.length) {\n throw new Error(`Middleware '${spec}' is missing export(s): ${missing.join(', ')}`);\n }\n if (invalid.length) {\n throw new Error(`Middleware '${spec}' export(s) not functions: ${invalid.join(', ')}`);\n }\n\n if (functions.length === 0) {\n throw new Error(`Middleware '${spec}' did not resolve any functions for selector '${selector}'`);\n }\n\n return functions;\n }\n\n private executeMiddleware(fn: MiddlewareFunction, req: Request, res: Response): Promise<void> {\n return new Promise((resolve, reject) => {\n try {\n fn(req, res, (error?: unknown) => {\n if (error) {\n reject(error);\n return;\n }\n resolve();\n });\n } catch (error) {\n reject(error);\n }\n });\n }\n\n private dedupe(functions: MiddlewareFunction[]): MiddlewareFunction[] {\n const seen = new Set<MiddlewareFunction>();\n const ordered: MiddlewareFunction[] = [];\n for (const fn of functions) {\n if (!seen.has(fn)) {\n seen.add(fn);\n ordered.push(fn);\n }\n }\n return ordered;\n }\n}\n","import type { IRoute, IServerRoute } from '../../parser/IRoute'\n\n\n\n\n\n\nexport abstract class ServerAdapter {\n abstract handleRoutes(routes: IRoute[], server_routes: IServerRoute): Promise<void>\n}\n\n","import { render } from \"svelte/server\"\nimport path from \"path\"\nimport { uneval } from \"devalue\"\nimport type { IRoute, IServerRoute } from \"../../parser/IRoute\"\nimport { ComponentManager } from \"../component_loader/component_manager\"\nimport type { IHTMLRender } from \"../html_render/html_render\"\nimport { initialize_route_matchers } from \"../url_parser\"\nimport type { UrlMatcher } from \"../url_parser\"\nimport { ApiAdapter } from \"./api_adapter\"\nimport type { RequestData } from \"./api_adapter\"\nimport { MiddlewareAdapter } from \"./middleware_adapter\"\nimport { ServerAdapter } from \"./server_adapter\"\nimport express from \"express\"\nimport type { Request, Response } from \"express\"\nimport type { IPage } from \"../page\"\nimport { ContextBuilder } from \"../../options/ServerOptions\"\n\n\n\nexport class ExpressServerAdapter extends ServerAdapter {\n private clientRoutes: IRoute[] = [];\n\n constructor(\n private server: ReturnType<typeof express>,\n private manager: ComponentManager,\n private htmlRender: IHTMLRender,\n private api_adapter: ApiAdapter,\n private middleware_adapter: MiddlewareAdapter,\n private context_builder?: ContextBuilder,\n private isProd: boolean = false,\n private isBuiltEnvironment: boolean = false,\n private componentDir?: string\n ) {\n super()\n }\n\n private getDevViteClientScriptTag(): string {\n if (this.isProd || this.isBuiltEnvironment) {\n return '';\n }\n return `<script type=\"module\">if (import.meta?.env?.DEV) { import('/@vite/client').catch(() => {}) }</script>\\n`;\n }\n\n private async loadApplicationRenderer(componentRoot: string) {\n if (!this.isProd) {\n const mod = await import('#recursive-render');\n return mod.default ?? mod;\n }\n // In production, use the precompiled renderer shipped alongside compiled components\n const candidates = [\n path.join(componentRoot, 'RecursiveRender.js'),\n path.join(componentRoot, 'ssr', 'RecursiveRender.js'),\n ];\n let lastError: any;\n for (const fp of candidates) {\n try {\n const mod = await import(fp);\n return (mod as any).default ?? mod;\n } catch (e) {\n lastError = e;\n }\n }\n throw lastError ?? new Error('Unable to locate precompiled RecursiveRender.js');\n }\n\n private transformRoutesForClient(routes: IRoute[]): IRoute[] {\n if (!this.isProd) return routes;\n console.log(`[transformRoutesForClient] Transforming ${routes.length} routes for production`);\n const transformed = routes.map(route => ({\n ...route,\n layout: route.layout?.map(path => path.replace(/\\.svelte$/, '.js')),\n view: route.view?.replace(/\\.svelte$/, '.js')\n }));\n console.log(`[transformRoutesForClient] First route view transformed: ${routes[0]?.view} → ${transformed[0]?.view}`);\n return transformed;\n }\n\n async handleRoutes(routes: IRoute[], manifest: any): Promise<void> {\n // Transform routes for SSR in production mode and cache for client\n const transformedRoutes = this.transformRoutesForClient(routes);\n this.clientRoutes = transformedRoutes; // Cache for HTML rendering\n const matchers = initialize_route_matchers(transformedRoutes)\n\n this.server.use((req: Request, res: Response, next: any) => {\n\n (async () => {\n if (res.headersSent) {\n return\n }\n const method = req.method.toLowerCase()\n const fullUrl = req.url || '/'\n const path = fullUrl.split('?')[0] // Strip query parameters for route matching\n\n\n const not_found = async () => {\n next()\n }\n\n const matcher = matchers.find(m => m.parser(path))\n if (!matcher) {\n await not_found()\n return\n }\n const route_options = transformedRoutes.filter(r => r.path === matcher.pattern)\n const route = route_options.find(r => r.method.toLowerCase() === method)\n if (!route) {\n await not_found()\n return\n }\n\n await this.handleResponse(fullUrl, matcher, route, transformedRoutes, manifest, req, res).catch(e => {\n res.status(500).send(`\n <h1>500 Internal Server Error</h1>\n <pre>${e}</pre>\n `)\n })\n })()\n\n return;\n\n })\n }\n protected async handleResponse(url: string, matcher: UrlMatcher, route: IRoute, routes: IRoute[], manifest, req: Request, res: Response) {\n let accepts: string = req.headers.accept || ''\n let server_api_call = accepts.toLowerCase().includes('application/json')\n\n if (res.headersSent) {\n return\n }\n\n const context = {}\n if (this.context_builder) {\n const built_context = await this.context_builder(req, res)\n Object.assign(context, built_context)\n }\n req['context'] = context\n\n // Extract path parameters from the clean path (without query params)\n const cleanPath = url.split('?')[0];\n const pathParams = matcher.parser(cleanPath);\n\n // Combine path parameters with query parameters (convert query types)\n const queryParams: Record<string, string | string[]> = {};\n for (const [key, value] of Object.entries(req.query)) {\n if (typeof value === 'string') {\n queryParams[key] = value;\n } else if (Array.isArray(value)) {\n // Convert array elements to strings\n queryParams[key] = value.map(v => typeof v === 'string' ? v : String(v));\n } else if (value !== undefined) {\n queryParams[key] = String(value);\n }\n }\n const combinedParams = { ...pathParams, ...queryParams };\n\n let request_data: RequestData = {\n url,\n query: req.query,\n params: combinedParams,\n headers: req.headers,\n body: req.body,\n context\n };\n\n /**\n * Middleware\n */\n console.log('[SERVER] Handling request', req.url, {\n middleware: route.middleware,\n accept: req.headers.accept,\n route_path: route.path,\n server_api_call\n });\n try {\n await this.middleware_adapter.handleMiddleware(req, res, route.middleware || [])\n console.log('[SERVER] Middleware complete', {\n headersSent: res.headersSent,\n statusCode: res.statusCode\n });\n } catch (e) {\n console.log('Error in middleware', e)\n res.status(500).send(`\n <h1>500 Internal Server Error</h1>\n <pre>${e}</pre>\n <pre>Stack Trace:\\n${e.stack}</pre>\n `)\n return\n }\n\n // Check if middleware already sent a response (e.g., redirect, auth failure)\n if (res.headersSent) {\n console.log('[SERVER] Headers already sent by middleware, returning early');\n return;\n }\n\n let server_data: any;\n try {\n server_data = await this.api_adapter.getApiData(route, request_data)\n } catch (e: any) {\n const errorMessage = e?.message || String(e);\n const errorStack = e?.stack || '';\n console.error(`[SERVER] Data loader error for route ${route.path} (${route.method}):`, {\n error: errorMessage,\n route: route.path,\n method: route.method,\n url: url,\n view: route.view,\n layouts: route.layout,\n });\n console.error('[SERVER] Data loader stack trace:', errorStack);\n\n if (server_api_call) {\n res\n .status(500)\n .header('Cache-Control', 'no-store, no-cache, must-revalidate, proxy-revalidate')\n .header('Pragma', 'no-cache')\n .header('Expires', '0')\n .type('application/json')\n .send({\n error: 'Data loader failed',\n message: errorMessage,\n route: route.path,\n });\n return;\n }\n\n res.status(500).send(`\n <h1>500 Internal Server Error</h1>\n <h2>Data Loader Failed</h2>\n <p><strong>Route:</strong> ${route.path} (${route.method})</p>\n <p><strong>View:</strong> ${route.view || 'N/A'}</p>\n <p><strong>Layouts:</strong> ${route.layout?.join(', ') || 'None'}</p>\n <pre>${errorMessage}</pre>\n <pre>Stack Trace:\\n${errorStack}</pre>\n `);\n return;\n }\n\n if (server_api_call) {\n /**\n * Early return if the request is an API call\n */\n res\n .header('Cache-Control', 'no-store, no-cache, must-revalidate, proxy-revalidate')\n .header('Pragma', 'no-cache')\n .header('Expires', '0')\n .type('application/json')\n .send(server_data);\n return;\n }\n let layouts: any[];\n let view: any;\n\n try {\n layouts = await this.manager.getLayouts(route)\n view = await this.manager.getView(route)\n } catch (e: any) {\n console.log('Error getting view', e)\n res.status(500).send(`\n <h1>500 Internal Server Error</h1>\n <pre>${e}</pre>\n <pre>Stack Trace:\\n${e.stack}</pre>\n `)\n return\n }\n\n\n /**\n * Render HTML page\n */\n let html_render = ''\n let response_code = 200\n const devClientScript = this.getDevViteClientScriptTag();\n try {\n let page: IPage = {\n url: request_data.url,\n pathname: request_data.url.split('?')[0],\n params: request_data.params || {} as any,\n query: request_data.query,\n }\n /**\n * Render application components\n */\n console.log('[SSR DEBUG] layouts:', layouts.map(l => typeof l), 'view:', typeof view);\n const loader: any = (this as any).manager?.[\"componentLoader\"] || {};\n const componentRoot = loader[\"base_path\"] || loader[\"basePath\"] || \"\";\n const applicationRenderer: any = await this.loadApplicationRenderer(componentRoot);\n console.log('[SSR DEBUG] applicationRenderer:', typeof applicationRenderer);\n const { head: head_render, html: renderedHtml, css }\n = render(applicationRenderer, {\n props: {\n layouts,\n view,\n data: server_data,\n params: request_data.params,\n urlParams: pathParams,\n query: request_data.query,\n page\n } as any\n }) as any\n // In Svelte 5, render() returns 'html' instead of 'body'\n const body_render = renderedHtml;\n console.log('[SSR DEBUG] render result - body length:', body_render?.length || 0);\n\n // Client loads from '/assets' (Vite-bundled) while SSR loads from component_dir.\n // In production, derive a client component base from SSR path by extracting the suffix after '/ssr/'.\n // Examples:\n // - componentDir='.app/ssr/components' => '/assets/components'\n // - componentDir='.app/ssr/my/framework/component' => '/assets/my/framework/component'\n // - componentDir='ui' (no ssr segment) => '/assets'\n const deriveClientBase = (dir: string): string => {\n try {\n const norm = String(dir || '').replace(/\\\\/g, '/');\n const marker = '/ssr/';\n const idx = norm.indexOf(marker);\n if (idx >= 0) {\n const suffix = norm.slice(idx + marker.length).replace(/^\\/+/, '');\n return suffix ? `/assets/${suffix}` : '/assets';\n }\n // Heuristics: if path contains a common components/pages segment, use it as suffix\n for (const hint of ['/components', '/pages']) {\n const hIdx = norm.indexOf(hint);\n if (hIdx >= 0) {\n const suffix = norm.slice(hIdx + 1).replace(/^\\/+/, '');\n return suffix ? `/assets/${suffix}` : '/assets';\n }\n }\n } catch {}\n return '/assets';\n };\n const clientComponentDir = this.isProd\n ? deriveClientBase(this.componentDir || '')\n : (this.componentDir || '/assets');\n\n const head_routing = `\n <script type='text/javascript'>\n window.__ROUTING__ = ${uneval(this.clientRoutes)}\n </script>\n\n <script type='text/javascript'>\n window.__MANIFEST__ = ${uneval(manifest)}\n console.log('[MANIFEST INJECTED]', window.__MANIFEST__);\n </script>\n\n <script type='text/javascript'>\n window.__INITIAL_DATA__ = ${uneval(server_data || {})}\n </script>\n\n <script type='text/javascript'>\n window.__COMPONENT_DIR__ = ${uneval(clientComponentDir)}\n </script>\n `\n console.log('[SSR DEBUG] About to render HTML with APP length:', body_render?.length || 0);\n html_render = await this.htmlRender.renderHTML({\n HEAD: devClientScript + head_routing + (head_render || ''),\n CSS: css,\n APP: body_render\n })\n console.log('[SSR DEBUG] Final HTML length:', html_render?.length || 0, 'contains APP div:', html_render?.includes('<div id=\"app\">'));\n\n } catch (e) {\n response_code = 500\n const new_body = (\n `<pre>Error rendering HTML:\\n${e}` +\n (route.layout?.length ? `layouts: ${route.layout?.join(',\\n')}` : '') +\n `\\nview: ${route.view}` +\n `</pre>`\n )\n\n html_render = await this.htmlRender.renderHTML({\n HEAD: devClientScript,\n APP: new_body,\n // DATA: JSON.stringify({})\n })\n }\n\n\n\n /**\n * Send HTML response\n */\n\n res.setHeader('Content-Type', 'text/html; charset=utf-8')\n res.status(response_code)\n res.end(html_render)\n\n }\n\n\n protected async handleFallback(req: Request, res: Response, server_config: IServerRoute) {\n if (res.headersSent) {\n console.log('Reply already sent')\n return\n }\n let route: any = server_config.fallback\n let accepts: string = req.headers.accept || ''\n let server_api_call = accepts.toLowerCase().includes('application/json')\n\n const url = req.url || '/'\n const context = {}\n\n let fallback_data = {\n url,\n query: req.query,\n params: {},\n headers: req.headers,\n body: req.body,\n context\n }\n\n let request_data = fallback_data as RequestData\n\n\n /**\n * Middleware\n */\n try {\n await this.middleware_adapter.handleMiddleware(req, res, route.middleware || [])\n } catch (e) {\n console.log('Error in fallback middleware', e)\n res.status(500).send(`\n <h1>500 Internal Server Error</h1>\n <pre>${e}</pre>\n `)\n return\n }\n\n console.log('Completed fallback middleware')\n\n\n\n\n\n\n\n let server_data: any;\n try {\n server_data = await this.api_adapter.getApiData(route, request_data)\n } catch (e: any) {\n const errorMessage = e?.message || String(e);\n const errorStack = e?.stack || '';\n console.error(`[SERVER] Fallback data loader error:`, {\n error: errorMessage,\n url: url,\n view: route.view,\n layouts: route.layout,\n });\n console.error('[SERVER] Fallback data loader stack trace:', errorStack);\n\n if (server_api_call) {\n res\n .status(500)\n .header('Cache-Control', 'no-store, no-cache, must-revalidate, proxy-revalidate')\n .header('Pragma', 'no-cache')\n .header('Expires', '0')\n .type('application/json')\n .send({\n error: 'Fallback data loader failed',\n message: errorMessage,\n });\n return;\n }\n\n res.status(500).send(`\n <h1>500 Internal Server Error</h1>\n <h2>Fallback Data Loader Failed</h2>\n <p><strong>View:</strong> ${route.view || 'N/A'}</p>\n <p><strong>Layouts:</strong> ${route.layout?.join(', ') || 'None'}</p>\n <pre>${errorMessage}</pre>\n <pre>Stack Trace:\\n${errorStack}</pre>\n `);\n return;\n }\n\n console.log('Completed fallback API call')\n if (server_api_call) {\n /**\n * Early return if the request is an API call\n */\n\n console.log('Fallback API call')\n res\n .header('Cache-Control', 'no-store, no-cache, must-revalidate, proxy-revalidate')\n .header('Pragma', 'no-cache')\n .header('Expires', '0')\n .type('application/json')\n .status(404)\n .send(server_data);\n return;\n }\n\n const layouts = await this.manager.getLayouts(route)\n const view = await this.manager.getView(route)\n\n console.log('Fallback view', view)\n console.log('Fallback layouts', layouts)\n\n\n\n /**\n * Render application components\n */\n const loader: any = (this as any).manager?.[\"componentLoader\"] || {};\n const componentRoot = loader[\"base_path\"] || loader[\"basePath\"] || \"\";\n const applicationRenderer: any = await this.loadApplicationRenderer(componentRoot);\n let { head: head_render, html, css }\n = render(applicationRenderer, {\n props: {\n layouts,\n view,\n data: server_data,\n params: request_data.params\n }\n }) as any\n // In Svelte 5, render() returns 'html' instead of 'body'\n const body_render = html;\n\n\n /**\n * Render HTML page\n */\n const devClientScript = this.getDevViteClientScriptTag();\n\n const html_render = await this.htmlRender.renderHTML({\n HEAD: devClientScript + (head_render || ''),\n CSS: css,\n APP: body_render\n })\n\n /**\n * Send HTML response\n */\n res\n .type('text/html')\n .status(404)\n .send(html_render)\n\n }\n}\n","\n\nimport express from 'express';\nimport path from 'path';\nimport fs from 'fs';\n\nimport deepmerge from 'deepmerge';\n\nimport { ViteComponentLoader, ProdComponentLoader } from '../routing/component_loader/component_loader'; \nimport { DefaultHTMLRender,LiveHTMLRender, BaseHTMLRender } from '../routing/html_render/html_render'; \nimport type { IHTMLRender } from '../routing/html_render/html_render';\nimport { parse_openapi_config } from '../parser/openapi';\nimport type { IRoute } from '../parser/IRoute';\nimport { defaultOptions } from '../options/ServerOptions';\nimport type { htmlRenderer, ServerOptions } from '../options/ServerOptions';\nimport type { AssetEntry } from '../options/assets';\nimport { ManifestBuilder } from '../routing/manifest/base';\nimport { ApiAdapter } from '../routing/server_adapter/api_adapter';\nimport { ComponentManager } from '../routing/component_loader/component_manager';\nimport { MiddlewareAdapter } from '../routing/server_adapter/middleware_adapter';\nimport { ExpressServerAdapter } from '../routing/server_adapter/express_server_adapter';\nexport type { ServerOptions } from '../options/ServerOptions';\n\n\nfunction pathExistsSync(p: string): boolean {\n try { return fs.existsSync(p); } catch { return false; }\n}\n\nfunction isDistRoot(dir: string): boolean {\n // Heuristics that indicate app dist root\n return (\n pathExistsSync(path.join(dir, 'index.js')) ||\n pathExistsSync(path.join(dir, '.app')) ||\n pathExistsSync(path.join(dir, 'server')) ||\n pathExistsSync(path.join(dir, 'ui'))\n );\n}\n\nfunction resolveRuntimeRoot(candidate?: string): string {\n // 1) Explicit env override\n const envRoot = process.env.FORGE_ROOT;\n if (envRoot && path.isAbsolute(envRoot) && pathExistsSync(envRoot)) {\n return path.normalize(envRoot);\n }\n // 2) Explicit viteOptions.root when absolute\n if (candidate && path.isAbsolute(candidate) && pathExistsSync(candidate)) {\n return path.normalize(candidate);\n }\n // 3) Use the directory of the entry script if available (e.g., dist/index.js)\n const entry = process.argv?.[1];\n if (entry) {\n const entryDir = path.dirname(path.resolve(entry));\n if (pathExistsSync(entryDir)) return entryDir;\n }\n // 4) Dev/serve fallback: use current working directory (App serve sets cwd to --root)\n return process.cwd();\n}\n\nexport async function createServer(app: import('express').Express, options?: ServerOptions): Promise<express.Express> {\n options = options || defaultOptions;\n const full_options = deepmerge(defaultOptions, options);\n const root = resolveRuntimeRoot(full_options.viteOptions?.root);\n full_options.viteOptions.root = root;\n\n full_options.open_api_path = ensureFullPath(full_options.viteOptions.root, full_options.open_api_path);\n\n const COMPONENT_DIR = !full_options.component_dir ? root : path.join(root, full_options.component_dir);\n\n // Auto-detect production mode: use FORGE_BUILT env var set by no_ego.js bootstrap\n // This allows staging, qa, etc. to use precompiled components regardless of NODE_ENV\n const isBuiltEnvironment = process.env.FORGE_BUILT === 'true';\n const isProd = isBuiltEnvironment || full_options.development === false;\n\n console.log(`Running in ${isProd ? 'production' : 'development'} mode (built environment: ${isBuiltEnvironment}, development flag: ${full_options.development}, NODE_ENV: ${process.env.NODE_ENV})`);\n let componentLoader;\n let vite;\n\n console.log(`Serving components from ${COMPONENT_DIR}`);\n\n // Resolve assets relative to the renderer directory for consistency\n // const rendererFullPath = (typeof full_options.renderer === 'string' && full_options.renderer !== 'default')\n // ? ensureFullPath(root, full_options.renderer)\n // : ensureFullPath(root, 'index.html');\n // const rendererDir = path.dirname(rendererFullPath);\n const resolveAssetRoot = (entry: AssetEntry): AssetEntry => {\n if (typeof entry === 'function') {\n return entry;\n }\n if (!entry || typeof entry !== 'string') return root;\n // Normalize both '/images' and 'images' to the same\n const cleaned = entry.replace(/^\\/+/, '');\n // Always resolve relative to project root (dist in prod)\n return path.resolve(root, cleaned);\n };\n\n if (full_options.assets) {\n for (const [asset_path, asset_dir] of Object.entries(full_options.assets)){\n for (const asset of asset_dir) {\n const asset_root = resolveAssetRoot(asset);\n if(typeof asset_root === 'string'){\n app.use(asset_path,express.static(asset_root))\n console.log(`Serving assets from ${asset_root} at ${asset_path}`);\n }else if (typeof asset_root === 'function'){\n app.use(asset_path,asset_root)\n console.log(`Serving assets from function at ${asset_path}`);\n } else {\n console.warn(`Invalid asset root type: ${typeof asset_root}`);\n }\n }\n }\n } else {\n console.log(`No assets to serve`);\n }\n\n if (!isProd) {\n console.log('Starting Vite in development mode...');\n const { createServer: createViteServer } = await import('vite');\n vite = await createViteServer(options.viteOptions || full_options.viteOptions);\n console.log(`Vite server created options \\n${JSON.stringify(options,null,2)}`);\n componentLoader = new ViteComponentLoader(COMPONENT_DIR, vite);\n } else {\n console.log('Starting Vite in production mode...');\n // Only serve static files if build_dir exists (traditional builds)\n // NoEgo-based builds use asset configuration instead\n const staticDir = path.join(full_options.viteOptions.root, full_options.build_dir);\n if (pathExistsSync(staticDir)) {\n app.use('/', express.static(staticDir));\n console.log(`Serving static files from ${staticDir} at /`);\n } else {\n console.log(`Skipping static file serving (build_dir ${staticDir} not found - using asset configuration)`);\n }\n\n // Serve component directory for client-side component loading\n // Use configured component_dir (e.g., 'ui') as both the directory and URL path\n const componentPath = `/${full_options.component_dir}`;\n app.use(componentPath, express.static(COMPONENT_DIR));\n console.log(`Serving components at ${componentPath} from ${COMPONENT_DIR}`);\n\n componentLoader = new ProdComponentLoader(COMPONENT_DIR);\n }\n\n const manifest = await new ManifestBuilder(\n full_options.open_api_path,\n componentLoader, \n full_options\n ).buildManifest()\n \n const htmlRenderer = getRenderer(root,full_options.renderer,isProd)\n const server_config = await parse_openapi_config(full_options.open_api_path);\n const routeDefs = server_config.routes\n /**\n * Helps manages the components of a route\n */\n const manager = new ComponentManager(componentLoader);\n const api_adapter = new ApiAdapter(manager)\n\n let middlewareRoot: string | undefined;\n if (full_options.middleware_path) {\n middlewareRoot = path.isAbsolute(full_options.middleware_path)\n ? full_options.middleware_path\n : path.resolve(full_options.viteOptions.root, full_options.middleware_path);\n }\n\n const middleware_adapter = MiddlewareAdapter.build(middlewareRoot, COMPONENT_DIR);\n\n const adapter = new ExpressServerAdapter(\n app,\n manager,\n htmlRenderer,\n api_adapter,\n middleware_adapter,\n full_options.context_builder,\n isProd,\n isBuiltEnvironment,\n full_options.component_dir,\n );\n\n\n await adapter.handleRoutes(routeDefs as IRoute[],manifest);\n console.log('Routes registered');\n\n if (!isProd) {\n app.use(vite.middlewares);\n }\n\n return app;\n}\n\n\n\nfunction getRenderer(root:string,renderer: htmlRenderer, isProd:boolean): IHTMLRender {\n if (renderer === 'default') {\n return new DefaultHTMLRender();\n } else if (typeof renderer === 'string' && !isProd) {\n return new LiveHTMLRender(ensureFullPath(root,renderer));\n } else if (typeof renderer === 'string' && isProd) {\n const html = ensureFullPath(root,renderer);\n const template = fs.readFileSync(html, 'utf8')\n return new BaseHTMLRender(template);\n } else if (renderer instanceof BaseHTMLRender) {\n return renderer;\n }else{\n throw new Error('Invalid renderer type');\n }\n}\n\n\n\nfunction ensureFullPath(root:string,renderer: string): string {\n if (path.isAbsolute(renderer)) {\n console.log(`Renderer path is absolute: ${renderer}`);\n return urlJoin(root, renderer);\n } else {\n console.log(`Renderer path is relative: ${renderer}`);\n return path.resolve(root, renderer);\n\n }\n}\n\n\nfunction urlJoin(base: string, path: string): string {\n if (base.endsWith('/')) {\n base = base.slice(0, -1);\n }\n if (path.startsWith('/')) {\n path = path.slice(1);\n }\n return `${base}/${path}`;\n}\n\n \n"],"names":["uneval","parse_openapi_config","acc","requires_server","fs","module","pathToFileURL","loader","url","server","_a","path","_b","initialize_route_matchers","render","ViteComponentLoader","ProdComponentLoader","ComponentManager"],"mappings":"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"}
|
package/dist-ssr/server.js
CHANGED
|
@@ -639,7 +639,7 @@ class ExpressServerAdapter extends ServerAdapter {
|
|
|
639
639
|
});
|
|
640
640
|
}
|
|
641
641
|
async handleResponse(url, matcher, route, routes, manifest, req, res) {
|
|
642
|
-
var _a, _b, _c;
|
|
642
|
+
var _a, _b, _c, _d;
|
|
643
643
|
let accepts = req.headers.accept || "";
|
|
644
644
|
let server_api_call = accepts.toLowerCase().includes("application/json");
|
|
645
645
|
if (res.headersSent) {
|
|
@@ -698,7 +698,41 @@ ${e.stack}</pre>
|
|
|
698
698
|
console.log("[SERVER] Headers already sent by middleware, returning early");
|
|
699
699
|
return;
|
|
700
700
|
}
|
|
701
|
-
let server_data
|
|
701
|
+
let server_data;
|
|
702
|
+
try {
|
|
703
|
+
server_data = await this.api_adapter.getApiData(route, request_data);
|
|
704
|
+
} catch (e) {
|
|
705
|
+
const errorMessage = (e == null ? void 0 : e.message) || String(e);
|
|
706
|
+
const errorStack = (e == null ? void 0 : e.stack) || "";
|
|
707
|
+
console.error(`[SERVER] Data loader error for route ${route.path} (${route.method}):`, {
|
|
708
|
+
error: errorMessage,
|
|
709
|
+
route: route.path,
|
|
710
|
+
method: route.method,
|
|
711
|
+
url,
|
|
712
|
+
view: route.view,
|
|
713
|
+
layouts: route.layout
|
|
714
|
+
});
|
|
715
|
+
console.error("[SERVER] Data loader stack trace:", errorStack);
|
|
716
|
+
if (server_api_call) {
|
|
717
|
+
res.status(500).header("Cache-Control", "no-store, no-cache, must-revalidate, proxy-revalidate").header("Pragma", "no-cache").header("Expires", "0").type("application/json").send({
|
|
718
|
+
error: "Data loader failed",
|
|
719
|
+
message: errorMessage,
|
|
720
|
+
route: route.path
|
|
721
|
+
});
|
|
722
|
+
return;
|
|
723
|
+
}
|
|
724
|
+
res.status(500).send(`
|
|
725
|
+
<h1>500 Internal Server Error</h1>
|
|
726
|
+
<h2>Data Loader Failed</h2>
|
|
727
|
+
<p><strong>Route:</strong> ${route.path} (${route.method})</p>
|
|
728
|
+
<p><strong>View:</strong> ${route.view || "N/A"}</p>
|
|
729
|
+
<p><strong>Layouts:</strong> ${((_a = route.layout) == null ? void 0 : _a.join(", ")) || "None"}</p>
|
|
730
|
+
<pre>${errorMessage}</pre>
|
|
731
|
+
<pre>Stack Trace:
|
|
732
|
+
${errorStack}</pre>
|
|
733
|
+
`);
|
|
734
|
+
return;
|
|
735
|
+
}
|
|
702
736
|
if (server_api_call) {
|
|
703
737
|
res.header("Cache-Control", "no-store, no-cache, must-revalidate, proxy-revalidate").header("Pragma", "no-cache").header("Expires", "0").type("application/json").send(server_data);
|
|
704
738
|
return;
|
|
@@ -729,7 +763,7 @@ ${e.stack}</pre>
|
|
|
729
763
|
query: request_data.query
|
|
730
764
|
};
|
|
731
765
|
console.log("[SSR DEBUG] layouts:", layouts.map((l) => typeof l), "view:", typeof view);
|
|
732
|
-
const loader = ((
|
|
766
|
+
const loader = ((_b = this.manager) == null ? void 0 : _b["componentLoader"]) || {};
|
|
733
767
|
const componentRoot = loader["base_path"] || loader["basePath"] || "";
|
|
734
768
|
const applicationRenderer = await this.loadApplicationRenderer(componentRoot);
|
|
735
769
|
console.log("[SSR DEBUG] applicationRenderer:", typeof applicationRenderer);
|
|
@@ -795,7 +829,7 @@ ${e.stack}</pre>
|
|
|
795
829
|
} catch (e) {
|
|
796
830
|
response_code = 500;
|
|
797
831
|
const new_body = `<pre>Error rendering HTML:
|
|
798
|
-
${e}` + (((
|
|
832
|
+
${e}` + (((_c = route.layout) == null ? void 0 : _c.length) ? `layouts: ${(_d = route.layout) == null ? void 0 : _d.join(",\n")}` : "") + `
|
|
799
833
|
view: ${route.view}</pre>`;
|
|
800
834
|
html_render = await this.htmlRender.renderHTML({
|
|
801
835
|
HEAD: devClientScript,
|
|
@@ -808,7 +842,7 @@ view: ${route.view}</pre>`;
|
|
|
808
842
|
res.end(html_render);
|
|
809
843
|
}
|
|
810
844
|
async handleFallback(req, res, server_config) {
|
|
811
|
-
var _a;
|
|
845
|
+
var _a, _b;
|
|
812
846
|
if (res.headersSent) {
|
|
813
847
|
console.log("Reply already sent");
|
|
814
848
|
return;
|
|
@@ -838,7 +872,37 @@ view: ${route.view}</pre>`;
|
|
|
838
872
|
return;
|
|
839
873
|
}
|
|
840
874
|
console.log("Completed fallback middleware");
|
|
841
|
-
let server_data
|
|
875
|
+
let server_data;
|
|
876
|
+
try {
|
|
877
|
+
server_data = await this.api_adapter.getApiData(route, request_data);
|
|
878
|
+
} catch (e) {
|
|
879
|
+
const errorMessage = (e == null ? void 0 : e.message) || String(e);
|
|
880
|
+
const errorStack = (e == null ? void 0 : e.stack) || "";
|
|
881
|
+
console.error(`[SERVER] Fallback data loader error:`, {
|
|
882
|
+
error: errorMessage,
|
|
883
|
+
url,
|
|
884
|
+
view: route.view,
|
|
885
|
+
layouts: route.layout
|
|
886
|
+
});
|
|
887
|
+
console.error("[SERVER] Fallback data loader stack trace:", errorStack);
|
|
888
|
+
if (server_api_call) {
|
|
889
|
+
res.status(500).header("Cache-Control", "no-store, no-cache, must-revalidate, proxy-revalidate").header("Pragma", "no-cache").header("Expires", "0").type("application/json").send({
|
|
890
|
+
error: "Fallback data loader failed",
|
|
891
|
+
message: errorMessage
|
|
892
|
+
});
|
|
893
|
+
return;
|
|
894
|
+
}
|
|
895
|
+
res.status(500).send(`
|
|
896
|
+
<h1>500 Internal Server Error</h1>
|
|
897
|
+
<h2>Fallback Data Loader Failed</h2>
|
|
898
|
+
<p><strong>View:</strong> ${route.view || "N/A"}</p>
|
|
899
|
+
<p><strong>Layouts:</strong> ${((_a = route.layout) == null ? void 0 : _a.join(", ")) || "None"}</p>
|
|
900
|
+
<pre>${errorMessage}</pre>
|
|
901
|
+
<pre>Stack Trace:
|
|
902
|
+
${errorStack}</pre>
|
|
903
|
+
`);
|
|
904
|
+
return;
|
|
905
|
+
}
|
|
842
906
|
console.log("Completed fallback API call");
|
|
843
907
|
if (server_api_call) {
|
|
844
908
|
console.log("Fallback API call");
|
|
@@ -849,7 +913,7 @@ view: ${route.view}</pre>`;
|
|
|
849
913
|
const view = await this.manager.getView(route);
|
|
850
914
|
console.log("Fallback view", view);
|
|
851
915
|
console.log("Fallback layouts", layouts);
|
|
852
|
-
const loader = ((
|
|
916
|
+
const loader = ((_b = this.manager) == null ? void 0 : _b["componentLoader"]) || {};
|
|
853
917
|
const componentRoot = loader["base_path"] || loader["basePath"] || "";
|
|
854
918
|
const applicationRenderer = await this.loadApplicationRenderer(componentRoot);
|
|
855
919
|
let { head: head_render, html, css } = render(applicationRenderer, {
|
package/dist-ssr/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sources":["../src/routing/html_render/html_render.ts","../src/options/ServerOptions.ts","../src/routing/manifest/base.ts","../src/routing/server_adapter/api_adapter.ts","../src/routing/server_adapter/middleware_adapter.ts","../src/routing/server_adapter/server_adapter.ts","../src/routing/server_adapter/express_server_adapter.ts","../src/server/server.ts"],"sourcesContent":["import Handlebars from 'handlebars'\nimport fs from \"fs/promises\"\nimport { uneval } from 'devalue'\n\nconst default_template = `\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n {{{HEAD}}}\n <style>{{{CSS}}}</style>\n</head>\n<body>\n <div id=\"app\">{{{APP}}}</div>\n <script>window.__INITIAL_DATA__ = {{{DATA}}}</script>\n\n <script type=\"module\">\n import { createApp } from '/src/client/client.ts';\n document.addEventListener('DOMContentLoaded', () => {\n createApp('/components/');\n });\n </script>\n</body>\n</html>\n`\n\n\n\n\nexport interface IHTMLRender{\n renderHTML(data:any): Promise<string>\n getTemplate(): Promise<string>\n}\n\nexport class BaseHTMLRender implements IHTMLRender{\n constructor(private template:string = default_template) {\n\n }\n async getTemplate(): Promise<string> {\n return this.template\n }\n\n async renderHTML(data:any){\n const template = Handlebars.compile(await this.getTemplate())\n let html = template(data)\n \n // Inject window.__CONFIGURATION__ from environment variable\n const configJson = process.env.NOEGO_CONFIGURATION\n if (configJson) {\n try {\n // Parse and re-serialize with devalue to prevent XSS\n const configData = JSON.parse(configJson)\n const safeConfigJson = uneval(configData)\n const configScript = `<script>window.__CONFIGURATION__ = ${safeConfigJson};</script>`\n // Inject before closing </head> tag, or at the beginning of <body> if no </head>\n if (html.includes('</head>')) {\n html = html.replace('</head>', `${configScript}\\n</head>`)\n } else if (html.includes('<body')) {\n // Find the opening body tag and inject after it\n html = html.replace(/(<body[^>]*>)/, `$1\\n${configScript}`)\n } else {\n // Fallback: inject at the beginning\n html = configScript + '\\n' + html\n }\n } catch (e) {\n console.error('Failed to parse NOEGO_CONFIGURATION:', e)\n }\n }\n\n // Transform module script tags to automatically call default exports\n // Match: <script type=\"module\" src=\"/path/to/module.ts\"></script>\n html = html.replace(\n /<script\\s+type=[\"']module[\"']\\s+src=[\"']([^\"']+)[\"'][^>]*><\\/script>/gi,\n (_match, src) => {\n // Escape single quotes in src to prevent string breakout\n const safeSrc = src.replace(/'/g, \"\\\\'\")\n // Convert to inline script that imports and calls default export\n // Wait for DOMContentLoaded and configuration to be available\n return `<script type=\"module\">\nimport initApp from '${safeSrc}';\nfunction initializeApp() {\n if (typeof initApp === 'function' && typeof window !== 'undefined' && window.__CONFIGURATION__) {\n const result = initApp();\n if (result instanceof Promise) {\n result.catch(err => console.error('Failed to initialize app:', err));\n }\n } else {\n console.warn('App initialization skipped: initApp or window.__CONFIGURATION__ not available');\n }\n}\n// Wait for DOM to be ready\nif (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', initializeApp);\n} else {\n // DOM already loaded\n initializeApp();\n}\n</script>`\n }\n )\n \n return html\n }\n}\n\nexport class DefaultHTMLRender extends BaseHTMLRender{\n constructor() {\n super()\n }\n}\n\n\n\nexport class LiveHTMLRender implements IHTMLRender{\n constructor(private html_path:string) {\n }\n async renderHTML(data: any): Promise<string> {\n const template = Handlebars.compile(await this.getTemplate())\n let html = template(data)\n \n // Inject window.__CONFIGURATION__ from environment variable\n const configJson = process.env.NOEGO_CONFIGURATION\n if (configJson) {\n try {\n // Parse and re-serialize with devalue to prevent XSS\n const configData = JSON.parse(configJson)\n const safeConfigJson = uneval(configData)\n const configScript = `<script>window.__CONFIGURATION__ = ${safeConfigJson};</script>`\n // Inject before closing </head> tag, or at the beginning of <body> if no </head>\n if (html.includes('</head>')) {\n html = html.replace('</head>', `${configScript}\\n</head>`)\n } else if (html.includes('<body')) {\n // Find the opening body tag and inject after it\n html = html.replace(/(<body[^>]*>)/, `$1\\n${configScript}`)\n } else {\n // Fallback: inject at the beginning\n html = configScript + '\\n' + html\n }\n } catch (e) {\n console.error('Failed to parse NOEGO_CONFIGURATION:', e)\n }\n }\n\n // Transform module script tags to automatically call default exports\n // Match: <script type=\"module\" src=\"/path/to/module.ts\"></script>\n html = html.replace(\n /<script\\s+type=[\"']module[\"']\\s+src=[\"']([^\"']+)[\"'][^>]*><\\/script>/gi,\n (_match, src) => {\n // Escape single quotes in src to prevent string breakout\n const safeSrc = src.replace(/'/g, \"\\\\'\")\n // Convert to inline script that imports and calls default export\n // Wait for DOMContentLoaded and configuration to be available\n return `<script type=\"module\">\nimport initApp from '${safeSrc}';\nfunction initializeApp() {\n if (typeof initApp === 'function' && typeof window !== 'undefined' && window.__CONFIGURATION__) {\n const result = initApp();\n if (result instanceof Promise) {\n result.catch(err => console.error('Failed to initialize app:', err));\n }\n } else {\n console.warn('App initialization skipped: initApp or window.__CONFIGURATION__ not available');\n }\n}\n// Wait for DOM to be ready\nif (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', initializeApp);\n} else {\n // DOM already loaded\n initializeApp();\n}\n</script>`\n }\n )\n\n return html\n }\n async getTemplate(): Promise<string> {\n const file_content = await fs.readFile(this.html_path, 'utf8')\n return file_content\n }\n}","import path from 'path';\nimport type { IHTMLRender } from '../routing/html_render/html_render';\nimport type { ForgeAssets } from './assets';\nexport { assets } from './assets';\n\nexport type htmlRenderer = 'default' | string | IHTMLRender;\nexport type ContextBuilder = (req, res) => Record<string, any>;\n\nexport interface ServerOptions {\n development?: boolean;\n viteOptions?: any;\n component_dir?: string;\n build_dir?: string;\n renderer?: htmlRenderer;\n open_api_path?: string;\n manifest_path?: string;\n manifest_endpoint?: string;\n assets?: ForgeAssets;\n context_builder?: ContextBuilder;\n middleware_path?: string;\n}\n\nexport const defaultViteOptions: any = {\n appType: 'custom',\n root: process.cwd(),\n server: { middlewareMode: true },\n ssr: {\n noExternal: ['svelte', /^svelte\\/.*/]\n }\n};\n\nexport const defaultOptions: ServerOptions = {\n development: process.env.NODE_ENV !== 'production',\n viteOptions: defaultViteOptions,\n component_dir: '/',\n build_dir: 'dist_ssr',\n renderer: 'default',\n open_api_path: path.join(process.cwd(), 'openapi.yaml'),\n manifest_endpoint: '/manifest.json',\n middleware_path: undefined\n};\n","import { defaultOptions } from \"../../options/ServerOptions\";\nimport type { ServerOptions } from \"../../options/ServerOptions\";\nimport type { IRoute } from \"../../parser/IRoute\";\nimport { parse_openapi_config } from \"../../parser/openapi\";\nimport deepmerge from \"deepmerge\";\nimport type { IComponentLoader } from \"../component_loader/component_loader\";\nimport path from \"path\";\nimport fs from \"fs\";\nimport { pathToFileURL } from \"url\";\n\nexport class ManifestBuilder{\n private full_options: ServerOptions\n\n constructor(private openapi_path:string, private loader: IComponentLoader, private options:ServerOptions){\n this.full_options = deepmerge(defaultOptions,this.options)\n }\n\n\n async buildManifest(){\n\n const configuration = await parse_openapi_config(this.openapi_path)\n const component_path = this.full_options.component_dir\n if (!component_path) {\n throw new Error('Component path is not defined')\n }\n const routes = configuration.routes\n\n const manifest = await routes.reduce(async(acc,route)=>{\n return acc.then(async(acc)=>{\n const pattern = route.path\n const results = await requires_server(route,this.loader)\n acc[pattern] = results\n return acc\n })\n },Promise.resolve({}) as Promise<Record<string,boolean>>)\n\n return manifest\n\n }\n}\n\n\n\n\nasync function requires_server(route:IRoute,loader:IComponentLoader){\n // Check if route has middleware - middleware always requires server processing\n const has_middleware = route.middleware && route.middleware.length > 0;\n\n // Check if route or layouts have loaders\n const has_loaders = await layout_requires_server(route,loader) || await view_requires_server(route,loader);\n\n const requires_server = has_middleware || has_loaders;\n\n console.log('[MANIFEST]', route.path, {\n has_middleware,\n middleware: route.middleware,\n has_loaders,\n requires_server\n });\n\n return requires_server;\n}\n\n\nasync function layout_requires_server(route:IRoute,loader:IComponentLoader){\n const layout = route.layout\n if (!layout) {\n return false\n }\n const load_required = await Promise.all(layout.map(async (layoutPath) => {\n // Check for .load.js first (production), then .load.ts (development)\n const fullPath = loader.getComponentFullPath(layoutPath);\n const { dir, name } = path.parse(fullPath);\n const extensions: Array<'.js' | '.ts'> = ['.js', '.ts'];\n \n for (const ext of extensions) {\n const loaderFilePath = path.join(dir, `${name}.load${ext}`);\n \n try {\n if (fs.existsSync(loaderFilePath)) {\n const module = await import(pathToFileURL(loaderFilePath).href);\n if (typeof module?.default === \"function\") {\n return true;\n }\n }\n } catch (error) {\n // Continue to next extension or fallback\n }\n }\n \n // Fall back to old-style component.load (backward compatibility)\n try {\n const component = await loader.load(layoutPath);\n return !!component.load;\n } catch {\n return false;\n }\n }))\n\n return load_required.some((required:boolean)=>required)\n}\n\nasync function view_requires_server(route:IRoute,loader:IComponentLoader){\n const view = route.view\n if (!view) {\n return false\n }\n // Check for .load.js first (production), then .load.ts (development)\n const fullPath = loader.getComponentFullPath(view);\n const { dir, name } = path.parse(fullPath);\n const extensions: Array<'.js' | '.ts'> = ['.js', '.ts'];\n \n for (const ext of extensions) {\n const loaderFilePath = path.join(dir, `${name}.load${ext}`);\n \n try {\n if (fs.existsSync(loaderFilePath)) {\n const module = await import(pathToFileURL(loaderFilePath).href);\n if (typeof module?.default === \"function\") {\n return true;\n }\n }\n } catch (error) {\n // Continue to next extension or fallback\n }\n }\n \n // Fall back to old-style component.load (backward compatibility)\n try {\n const component = await loader.load(view);\n return !!component.load;\n } catch {\n return false;\n }\n}\n\n\n","import type { IRoute } from \"../../parser/IRoute\";\nimport { ComponentManager } from \"../component_loader/component_manager\";\n\n\nexport interface RequestData{\n url:string\n query: Record<string, any>;\n params?: Partial<Record<string, string | string[]>> | null;\n headers: Record<string, any>;\n body: Record<string, any>;\n context: Record<string, any>;\n}\n\n\nexport class ApiAdapter{\n\n constructor(\n private manager: ComponentManager,\n\n ){\n\n }\n\n\n async getApiData(route:IRoute,request_data:RequestData){\n \n const view = await this.manager.getViewComponent(route)\n\n //All Data Loaders\n const layout_loaders = await this.manager.getLayoutLoaders(route)\n const loader = view.load\n\n\n\n //All Loaders Read from view.\n\n let layout_data = [] as any[]\n let view_data:any = {}\n\n\n if(layout_loaders.some(loader => !!loader)){\n console.log('Layout API Calls')\n layout_data = await Promise.all(layout_loaders.map(async (layout_loader) => {\n if (!layout_loader) {\n return {}\n }\n const data = await layout_loader(request_data)\n return data\n }))\n }\n\n if(loader){\n view_data = await loader(request_data)\n }\n\n let server_data = {\n layout:layout_data,\n view:view_data,\n }\n\n return this.mergeLoaderData(route, request_data, server_data)\n }\n\n\n async getFallbackData(route:IRoute,request_data:RequestData){\n \n const view = await this.manager.getViewComponent(route)\n const layout_loaders = await this.manager.getLayoutLoaders(route)\n\n const loader = view.load\n\n let layout_data = [] as any[]\n let view_data:any = {}\n\n\n if(layout_loaders.some(loader => !!loader)){\n console.log('Layout API Calls')\n layout_data = await Promise.all(layout_loaders.map(async (layout_loader) => {\n if (!layout_loader) {\n return {}\n }\n const data = await layout_loader(request_data)\n return data\n }))\n }\n\n if(loader){\n view_data = await loader(request_data)\n }\n\n let server_data = {\n layout:layout_data,\n view:view_data,\n }\n\n return this.mergeLoaderData(route, request_data, server_data)\n }\n\n\n private async mergeLoaderData(route: IRoute, request_data: RequestData, server_data: ServerData): Promise<ServerData> {\n if (!await this.manager.hasLoaders(route)) {\n return server_data;\n }\n\n const loaders = await this.manager.getLoaders(route);\n\n const layoutLoaderResults = await Promise.all(\n loaders.layouts.map(async (loader): Promise<Record<string, any> | null> => {\n if (!loader) {\n return null;\n }\n const data = await loader(request_data);\n return data ?? null;\n })\n );\n\n const baseLayoutData = server_data.layout || [];\n const maxLayouts = Math.max(baseLayoutData.length, layoutLoaderResults.length);\n const mergedLayouts = Array.from({ length: maxLayouts }, (_, index) => {\n const baseLayoutEntry = baseLayoutData[index];\n const loaderResult = layoutLoaderResults[index];\n\n if (!loaderResult) {\n return baseLayoutEntry;\n }\n\n if (baseLayoutEntry && typeof baseLayoutEntry === 'object') {\n return { ...baseLayoutEntry, ...loaderResult };\n }\n\n return loaderResult;\n });\n\n const viewLoaderResult = loaders.view ? await loaders.view(request_data) : null;\n let mergedView = server_data.view;\n if (viewLoaderResult) {\n if (mergedView && typeof mergedView === 'object') {\n mergedView = { ...mergedView, ...viewLoaderResult };\n } else {\n mergedView = viewLoaderResult;\n }\n }\n\n return {\n layout: mergedLayouts,\n view: mergedView\n };\n }\n}\n\n\ntype ServerData = {\n layout: any[];\n view: any;\n}\n","import type { Request, Response, NextFunction } from 'express';\nimport fs from 'fs';\nimport path from 'path';\nimport { pathToFileURL } from 'url';\n\nexport type MiddlewareFunction = (req: Request, res: Response, next: NextFunction) => void;\n\ninterface MiddlewareResolutionResult {\n functions: MiddlewareFunction[];\n errors: string[];\n}\n\nconst EXTENSION_CANDIDATES = ['.js', '.mjs', '.cjs', '.ts', '.tsx'];\n\nexport class MiddlewareAdapter {\n private cache: Map<string, MiddlewareFunction[]> = new Map();\n\n constructor(\n private middlewarePath?: string,\n private fallbackPath?: string\n ) {}\n\n static build(middlewarePath?: string, fallbackPath?: string) {\n return new MiddlewareAdapter(middlewarePath, fallbackPath);\n }\n\n async handleMiddleware(req: Request, res: Response, middlewareConfig: string[] = []): Promise<void> {\n if (!Array.isArray(middlewareConfig) || middlewareConfig.length === 0) {\n return;\n }\n\n const resolution = await this.resolveMiddlewareFunctions(middlewareConfig);\n\n console.log(resolution)\n if (resolution.errors.length > 0) {\n throw new Error(`Middleware resolution failed: ${resolution.errors.join(', ')}`);\n }\n\n for (const middleware of resolution.functions) {\n await this.executeMiddleware(middleware, req, res);\n if (res.headersSent) {\n break;\n }\n }\n }\n\n private async resolveMiddlewareFunctions(middlewareConfig: string[]): Promise<MiddlewareResolutionResult> {\n const functions: MiddlewareFunction[] = [];\n const errors: string[] = [];\n\n for (const spec of middlewareConfig) {\n if (!spec) {\n continue;\n }\n try {\n let resolved = this.cache.get(spec);\n if (!resolved) {\n resolved = await this.resolveMiddlewareSpec(spec);\n this.cache.set(spec, [...resolved]);\n }\n functions.push(...resolved);\n } catch (error) {\n errors.push(`${spec}: ${(error as Error).message}`);\n }\n }\n\n return {\n functions: this.dedupe(functions),\n errors\n };\n }\n\n private async resolveMiddlewareSpec(spec: string): Promise<MiddlewareFunction[]> {\n const [filePath, selector] = this.parseMiddlewareSpec(spec);\n const fullPath = this.resolveMiddlewareFilePath(filePath);\n const module = await this.importMiddlewareModule(fullPath, spec);\n return this.extractMiddlewareFunctions(module, selector, spec);\n }\n\n private parseMiddlewareSpec(spec: string): [string, string | undefined] {\n const colonIndex = spec.indexOf(':');\n if (colonIndex === -1) {\n return [spec, undefined];\n }\n return [spec.substring(0, colonIndex), spec.substring(colonIndex + 1)];\n }\n\n private resolveMiddlewareFilePath(filePath: string): string {\n const basePath = this.middlewarePath || this.fallbackPath || process.cwd();\n const transformed = this.middlewareFileTransform(filePath);\n const baseCandidate = path.resolve(process.cwd(), path.join(basePath, transformed));\n\n const resolvedWithExt = this.findExistingFile(baseCandidate);\n if (resolvedWithExt) {\n return resolvedWithExt;\n }\n\n throw new Error(`Middleware file not found: ${transformed}`);\n }\n\n private middlewareFileTransform(filePath: string): string {\n return filePath.split('.').join(path.sep);\n }\n\n private findExistingFile(basePathWithoutExt: string): string | null {\n const ext = path.extname(basePathWithoutExt);\n if (ext) {\n return fs.existsSync(basePathWithoutExt) ? basePathWithoutExt : null;\n }\n\n const directCandidates = EXTENSION_CANDIDATES.map(extCandidate => `${basePathWithoutExt}${extCandidate}`);\n for (const candidate of directCandidates) {\n if (fs.existsSync(candidate)) {\n return candidate;\n }\n }\n\n const indexCandidates = EXTENSION_CANDIDATES.map(extCandidate => path.join(basePathWithoutExt, `index${extCandidate}`));\n for (const candidate of indexCandidates) {\n if (fs.existsSync(candidate)) {\n return candidate;\n }\n }\n\n return null;\n }\n\n private async importMiddlewareModule(fullPath: string, spec: string): Promise<any> {\n try {\n const url = pathToFileURL(fullPath).href;\n return await import(url);\n } catch (error) {\n throw new Error(`Unable to import middleware '${spec}' from ${fullPath}`);\n }\n }\n\n private extractMiddlewareFunctions(module: any, selector: string | undefined, spec: string): MiddlewareFunction[] {\n if (!selector) {\n return this.extractDefaultFunction(module, spec);\n }\n\n if (selector === '*') {\n return this.extractAllFunctions(module, spec);\n }\n\n return this.extractSpecificFunctions(module, selector, spec);\n }\n\n private extractDefaultFunction(module: any, spec: string): MiddlewareFunction[] {\n if (!module?.default) {\n throw new Error(`Middleware '${spec}' is missing a default export`);\n }\n if (typeof module.default !== 'function') {\n throw new Error(`Default export for middleware '${spec}' is not a function`);\n }\n return [module.default];\n }\n\n private extractAllFunctions(module: any, spec: string): MiddlewareFunction[] {\n const functions = Object.values(module).filter((value): value is MiddlewareFunction => typeof value === 'function');\n if (functions.length === 0) {\n throw new Error(`No functions exported by middleware '${spec}'`);\n }\n return functions;\n }\n\n private extractSpecificFunctions(module: any, selector: string, spec: string): MiddlewareFunction[] {\n const names = selector.split(',').map(name => name.trim()).filter(Boolean);\n const functions: MiddlewareFunction[] = [];\n const missing: string[] = [];\n const invalid: string[] = [];\n\n for (const name of names) {\n const value = name === 'default' ? module?.default : module?.[name];\n if (value === undefined) {\n missing.push(name);\n continue;\n }\n // Middleware must be a function with 2-4 params (req, res, next) or (err, req, res, next)\n if (typeof value !== 'function' || value.length < 2) {\n invalid.push(name);\n continue;\n }\n functions.push(value);\n }\n\n if (missing.length) {\n throw new Error(`Middleware '${spec}' is missing export(s): ${missing.join(', ')}`);\n }\n if (invalid.length) {\n throw new Error(`Middleware '${spec}' export(s) not functions: ${invalid.join(', ')}`);\n }\n\n if (functions.length === 0) {\n throw new Error(`Middleware '${spec}' did not resolve any functions for selector '${selector}'`);\n }\n\n return functions;\n }\n\n private executeMiddleware(fn: MiddlewareFunction, req: Request, res: Response): Promise<void> {\n return new Promise((resolve, reject) => {\n try {\n fn(req, res, (error?: unknown) => {\n if (error) {\n reject(error);\n return;\n }\n resolve();\n });\n } catch (error) {\n reject(error);\n }\n });\n }\n\n private dedupe(functions: MiddlewareFunction[]): MiddlewareFunction[] {\n const seen = new Set<MiddlewareFunction>();\n const ordered: MiddlewareFunction[] = [];\n for (const fn of functions) {\n if (!seen.has(fn)) {\n seen.add(fn);\n ordered.push(fn);\n }\n }\n return ordered;\n }\n}\n","import type { IRoute, IServerRoute } from '../../parser/IRoute'\n\n\n\n\n\n\nexport abstract class ServerAdapter {\n abstract handleRoutes(routes: IRoute[], server_routes: IServerRoute): Promise<void>\n}\n\n","import { render } from \"svelte/server\"\nimport path from \"path\"\nimport { uneval } from \"devalue\"\nimport type { IRoute, IServerRoute } from \"../../parser/IRoute\"\nimport { ComponentManager } from \"../component_loader/component_manager\"\nimport type { IHTMLRender } from \"../html_render/html_render\"\nimport { initialize_route_matchers } from \"../url_parser\"\nimport type { UrlMatcher } from \"../url_parser\"\nimport { ApiAdapter } from \"./api_adapter\"\nimport type { RequestData } from \"./api_adapter\"\nimport { MiddlewareAdapter } from \"./middleware_adapter\"\nimport { ServerAdapter } from \"./server_adapter\"\nimport express from \"express\"\nimport type { Request, Response } from \"express\"\nimport type { IPage } from \"../page\"\nimport { ContextBuilder } from \"../../options/ServerOptions\"\n\n\n\nexport class ExpressServerAdapter extends ServerAdapter {\n private clientRoutes: IRoute[] = [];\n\n constructor(\n private server: ReturnType<typeof express>,\n private manager: ComponentManager,\n private htmlRender: IHTMLRender,\n private api_adapter: ApiAdapter,\n private middleware_adapter: MiddlewareAdapter,\n private context_builder?: ContextBuilder,\n private isProd: boolean = false,\n private isBuiltEnvironment: boolean = false,\n private componentDir?: string\n ) {\n super()\n }\n\n private getDevViteClientScriptTag(): string {\n if (this.isProd || this.isBuiltEnvironment) {\n return '';\n }\n return `<script type=\"module\">if (import.meta?.env?.DEV) { import('/@vite/client').catch(() => {}) }</script>\\n`;\n }\n\n private async loadApplicationRenderer(componentRoot: string) {\n if (!this.isProd) {\n const mod = await import('#recursive-render');\n return mod.default ?? mod;\n }\n // In production, use the precompiled renderer shipped alongside compiled components\n const candidates = [\n path.join(componentRoot, 'RecursiveRender.js'),\n path.join(componentRoot, 'ssr', 'RecursiveRender.js'),\n ];\n let lastError: any;\n for (const fp of candidates) {\n try {\n const mod = await import(fp);\n return (mod as any).default ?? mod;\n } catch (e) {\n lastError = e;\n }\n }\n throw lastError ?? new Error('Unable to locate precompiled RecursiveRender.js');\n }\n\n private transformRoutesForClient(routes: IRoute[]): IRoute[] {\n if (!this.isProd) return routes;\n console.log(`[transformRoutesForClient] Transforming ${routes.length} routes for production`);\n const transformed = routes.map(route => ({\n ...route,\n layout: route.layout?.map(path => path.replace(/\\.svelte$/, '.js')),\n view: route.view?.replace(/\\.svelte$/, '.js')\n }));\n console.log(`[transformRoutesForClient] First route view transformed: ${routes[0]?.view} → ${transformed[0]?.view}`);\n return transformed;\n }\n\n async handleRoutes(routes: IRoute[], manifest: any): Promise<void> {\n // Transform routes for SSR in production mode and cache for client\n const transformedRoutes = this.transformRoutesForClient(routes);\n this.clientRoutes = transformedRoutes; // Cache for HTML rendering\n const matchers = initialize_route_matchers(transformedRoutes)\n\n this.server.use((req: Request, res: Response, next: any) => {\n\n (async () => {\n if (res.headersSent) {\n return\n }\n const method = req.method.toLowerCase()\n const fullUrl = req.url || '/'\n const path = fullUrl.split('?')[0] // Strip query parameters for route matching\n\n\n const not_found = async () => {\n next()\n }\n\n const matcher = matchers.find(m => m.parser(path))\n if (!matcher) {\n await not_found()\n return\n }\n const route_options = transformedRoutes.filter(r => r.path === matcher.pattern)\n const route = route_options.find(r => r.method.toLowerCase() === method)\n if (!route) {\n await not_found()\n return\n }\n\n await this.handleResponse(fullUrl, matcher, route, transformedRoutes, manifest, req, res).catch(e => {\n res.status(500).send(`\n <h1>500 Internal Server Error</h1>\n <pre>${e}</pre>\n `)\n })\n })()\n\n return;\n\n })\n }\n protected async handleResponse(url: string, matcher: UrlMatcher, route: IRoute, routes: IRoute[], manifest, req: Request, res: Response) {\n let accepts: string = req.headers.accept || ''\n let server_api_call = accepts.toLowerCase().includes('application/json')\n\n if (res.headersSent) {\n return\n }\n\n const context = {}\n if (this.context_builder) {\n const built_context = await this.context_builder(req, res)\n Object.assign(context, built_context)\n }\n req['context'] = context\n\n // Extract path parameters from the clean path (without query params)\n const cleanPath = url.split('?')[0];\n const pathParams = matcher.parser(cleanPath);\n\n // Combine path parameters with query parameters (convert query types)\n const queryParams: Record<string, string | string[]> = {};\n for (const [key, value] of Object.entries(req.query)) {\n if (typeof value === 'string') {\n queryParams[key] = value;\n } else if (Array.isArray(value)) {\n // Convert array elements to strings\n queryParams[key] = value.map(v => typeof v === 'string' ? v : String(v));\n } else if (value !== undefined) {\n queryParams[key] = String(value);\n }\n }\n const combinedParams = { ...pathParams, ...queryParams };\n\n let request_data: RequestData = {\n url,\n query: req.query,\n params: combinedParams,\n headers: req.headers,\n body: req.body,\n context\n };\n\n /**\n * Middleware\n */\n console.log('[SERVER] Handling request', req.url, {\n middleware: route.middleware,\n accept: req.headers.accept,\n route_path: route.path,\n server_api_call\n });\n try {\n await this.middleware_adapter.handleMiddleware(req, res, route.middleware || [])\n console.log('[SERVER] Middleware complete', {\n headersSent: res.headersSent,\n statusCode: res.statusCode\n });\n } catch (e) {\n console.log('Error in middleware', e)\n res.status(500).send(`\n <h1>500 Internal Server Error</h1>\n <pre>${e}</pre>\n <pre>Stack Trace:\\n${e.stack}</pre>\n `)\n return\n }\n\n // Check if middleware already sent a response (e.g., redirect, auth failure)\n if (res.headersSent) {\n console.log('[SERVER] Headers already sent by middleware, returning early');\n return;\n }\n\n let server_data = await this.api_adapter.getApiData(route, request_data)\n if (server_api_call) {\n /**\n * Early return if the request is an API call\n */\n res\n .header('Cache-Control', 'no-store, no-cache, must-revalidate, proxy-revalidate')\n .header('Pragma', 'no-cache')\n .header('Expires', '0')\n .type('application/json')\n .send(server_data);\n return;\n }\n let layouts: any[];\n let view: any;\n\n try {\n layouts = await this.manager.getLayouts(route)\n view = await this.manager.getView(route)\n } catch (e: any) {\n console.log('Error getting view', e)\n res.status(500).send(`\n <h1>500 Internal Server Error</h1>\n <pre>${e}</pre>\n <pre>Stack Trace:\\n${e.stack}</pre>\n `)\n return\n }\n\n\n /**\n * Render HTML page\n */\n let html_render = ''\n let response_code = 200\n const devClientScript = this.getDevViteClientScriptTag();\n try {\n let page: IPage = {\n url: request_data.url,\n pathname: request_data.url.split('?')[0],\n params: request_data.params || {} as any,\n query: request_data.query,\n }\n /**\n * Render application components\n */\n console.log('[SSR DEBUG] layouts:', layouts.map(l => typeof l), 'view:', typeof view);\n const loader: any = (this as any).manager?.[\"componentLoader\"] || {};\n const componentRoot = loader[\"base_path\"] || loader[\"basePath\"] || \"\";\n const applicationRenderer: any = await this.loadApplicationRenderer(componentRoot);\n console.log('[SSR DEBUG] applicationRenderer:', typeof applicationRenderer);\n const { head: head_render, html: renderedHtml, css }\n = render(applicationRenderer, {\n props: {\n layouts,\n view,\n data: server_data,\n params: request_data.params,\n urlParams: pathParams,\n query: request_data.query,\n page\n } as any\n }) as any\n // In Svelte 5, render() returns 'html' instead of 'body'\n const body_render = renderedHtml;\n console.log('[SSR DEBUG] render result - body length:', body_render?.length || 0);\n\n // Client loads from '/assets' (Vite-bundled) while SSR loads from component_dir.\n // In production, derive a client component base from SSR path by extracting the suffix after '/ssr/'.\n // Examples:\n // - componentDir='.app/ssr/components' => '/assets/components'\n // - componentDir='.app/ssr/my/framework/component' => '/assets/my/framework/component'\n // - componentDir='ui' (no ssr segment) => '/assets'\n const deriveClientBase = (dir: string): string => {\n try {\n const norm = String(dir || '').replace(/\\\\/g, '/');\n const marker = '/ssr/';\n const idx = norm.indexOf(marker);\n if (idx >= 0) {\n const suffix = norm.slice(idx + marker.length).replace(/^\\/+/, '');\n return suffix ? `/assets/${suffix}` : '/assets';\n }\n // Heuristics: if path contains a common components/pages segment, use it as suffix\n for (const hint of ['/components', '/pages']) {\n const hIdx = norm.indexOf(hint);\n if (hIdx >= 0) {\n const suffix = norm.slice(hIdx + 1).replace(/^\\/+/, '');\n return suffix ? `/assets/${suffix}` : '/assets';\n }\n }\n } catch {}\n return '/assets';\n };\n const clientComponentDir = this.isProd\n ? deriveClientBase(this.componentDir || '')\n : (this.componentDir || '/assets');\n\n const head_routing = `\n <script type='text/javascript'>\n window.__ROUTING__ = ${uneval(this.clientRoutes)}\n </script>\n\n <script type='text/javascript'>\n window.__MANIFEST__ = ${uneval(manifest)}\n console.log('[MANIFEST INJECTED]', window.__MANIFEST__);\n </script>\n\n <script type='text/javascript'>\n window.__INITIAL_DATA__ = ${uneval(server_data || {})}\n </script>\n\n <script type='text/javascript'>\n window.__COMPONENT_DIR__ = ${uneval(clientComponentDir)}\n </script>\n `\n console.log('[SSR DEBUG] About to render HTML with APP length:', body_render?.length || 0);\n html_render = await this.htmlRender.renderHTML({\n HEAD: devClientScript + head_routing + (head_render || ''),\n CSS: css,\n APP: body_render\n })\n console.log('[SSR DEBUG] Final HTML length:', html_render?.length || 0, 'contains APP div:', html_render?.includes('<div id=\"app\">'));\n\n } catch (e) {\n response_code = 500\n const new_body = (\n `<pre>Error rendering HTML:\\n${e}` +\n (route.layout?.length ? `layouts: ${route.layout?.join(',\\n')}` : '') +\n `\\nview: ${route.view}` +\n `</pre>`\n )\n\n html_render = await this.htmlRender.renderHTML({\n HEAD: devClientScript,\n APP: new_body,\n // DATA: JSON.stringify({})\n })\n }\n\n\n\n /**\n * Send HTML response\n */\n\n res.setHeader('Content-Type', 'text/html; charset=utf-8')\n res.status(response_code)\n res.end(html_render)\n\n }\n\n\n protected async handleFallback(req: Request, res: Response, server_config: IServerRoute) {\n if (res.headersSent) {\n console.log('Reply already sent')\n return\n }\n let route: any = server_config.fallback\n let accepts: string = req.headers.accept || ''\n let server_api_call = accepts.toLowerCase().includes('application/json')\n\n const url = req.url || '/'\n const context = {}\n\n let fallback_data = {\n url,\n query: req.query,\n params: {},\n headers: req.headers,\n body: req.body,\n context\n }\n\n let request_data = fallback_data as RequestData\n\n\n /**\n * Middleware\n */\n try {\n await this.middleware_adapter.handleMiddleware(req, res, route.middleware || [])\n } catch (e) {\n console.log('Error in fallback middleware', e)\n res.status(500).send(`\n <h1>500 Internal Server Error</h1>\n <pre>${e}</pre>\n `)\n return\n }\n\n console.log('Completed fallback middleware')\n\n\n\n\n\n\n\n let server_data = await this.api_adapter.getApiData(route, request_data)\n\n console.log('Completed fallback API call')\n if (server_api_call) {\n /**\n * Early return if the request is an API call\n */\n\n console.log('Fallback API call')\n res\n .header('Cache-Control', 'no-store, no-cache, must-revalidate, proxy-revalidate')\n .header('Pragma', 'no-cache')\n .header('Expires', '0')\n .type('application/json')\n .status(404)\n .send(server_data);\n return;\n }\n\n const layouts = await this.manager.getLayouts(route)\n const view = await this.manager.getView(route)\n\n console.log('Fallback view', view)\n console.log('Fallback layouts', layouts)\n\n\n\n /**\n * Render application components\n */\n const loader: any = (this as any).manager?.[\"componentLoader\"] || {};\n const componentRoot = loader[\"base_path\"] || loader[\"basePath\"] || \"\";\n const applicationRenderer: any = await this.loadApplicationRenderer(componentRoot);\n let { head: head_render, html, css }\n = render(applicationRenderer, {\n props: {\n layouts,\n view,\n data: server_data,\n params: request_data.params\n }\n }) as any\n // In Svelte 5, render() returns 'html' instead of 'body'\n const body_render = html;\n\n\n /**\n * Render HTML page\n */\n const devClientScript = this.getDevViteClientScriptTag();\n\n const html_render = await this.htmlRender.renderHTML({\n HEAD: devClientScript + (head_render || ''),\n CSS: css,\n APP: body_render\n })\n\n /**\n * Send HTML response\n */\n res\n .type('text/html')\n .status(404)\n .send(html_render)\n\n }\n}\n","\n\nimport express from 'express';\nimport path from 'path';\nimport fs from 'fs';\n\nimport deepmerge from 'deepmerge';\n\nimport { ViteComponentLoader, ProdComponentLoader } from '../routing/component_loader/component_loader'; \nimport { DefaultHTMLRender,LiveHTMLRender, BaseHTMLRender } from '../routing/html_render/html_render'; \nimport type { IHTMLRender } from '../routing/html_render/html_render';\nimport { parse_openapi_config } from '../parser/openapi';\nimport type { IRoute } from '../parser/IRoute';\nimport { defaultOptions } from '../options/ServerOptions';\nimport type { htmlRenderer, ServerOptions } from '../options/ServerOptions';\nimport type { AssetEntry } from '../options/assets';\nimport { ManifestBuilder } from '../routing/manifest/base';\nimport { ApiAdapter } from '../routing/server_adapter/api_adapter';\nimport { ComponentManager } from '../routing/component_loader/component_manager';\nimport { MiddlewareAdapter } from '../routing/server_adapter/middleware_adapter';\nimport { ExpressServerAdapter } from '../routing/server_adapter/express_server_adapter';\nexport type { ServerOptions } from '../options/ServerOptions';\n\n\nfunction pathExistsSync(p: string): boolean {\n try { return fs.existsSync(p); } catch { return false; }\n}\n\nfunction isDistRoot(dir: string): boolean {\n // Heuristics that indicate app dist root\n return (\n pathExistsSync(path.join(dir, 'index.js')) ||\n pathExistsSync(path.join(dir, '.app')) ||\n pathExistsSync(path.join(dir, 'server')) ||\n pathExistsSync(path.join(dir, 'ui'))\n );\n}\n\nfunction resolveRuntimeRoot(candidate?: string): string {\n // 1) Explicit env override\n const envRoot = process.env.FORGE_ROOT;\n if (envRoot && path.isAbsolute(envRoot) && pathExistsSync(envRoot)) {\n return path.normalize(envRoot);\n }\n // 2) Explicit viteOptions.root when absolute\n if (candidate && path.isAbsolute(candidate) && pathExistsSync(candidate)) {\n return path.normalize(candidate);\n }\n // 3) Use the directory of the entry script if available (e.g., dist/index.js)\n const entry = process.argv?.[1];\n if (entry) {\n const entryDir = path.dirname(path.resolve(entry));\n if (pathExistsSync(entryDir)) return entryDir;\n }\n // 4) Dev/serve fallback: use current working directory (App serve sets cwd to --root)\n return process.cwd();\n}\n\nexport async function createServer(app: import('express').Express, options?: ServerOptions): Promise<express.Express> {\n options = options || defaultOptions;\n const full_options = deepmerge(defaultOptions, options);\n const root = resolveRuntimeRoot(full_options.viteOptions?.root);\n full_options.viteOptions.root = root;\n\n full_options.open_api_path = ensureFullPath(full_options.viteOptions.root, full_options.open_api_path);\n\n const COMPONENT_DIR = !full_options.component_dir ? root : path.join(root, full_options.component_dir);\n\n // Auto-detect production mode: use FORGE_BUILT env var set by no_ego.js bootstrap\n // This allows staging, qa, etc. to use precompiled components regardless of NODE_ENV\n const isBuiltEnvironment = process.env.FORGE_BUILT === 'true';\n const isProd = isBuiltEnvironment || full_options.development === false;\n\n console.log(`Running in ${isProd ? 'production' : 'development'} mode (built environment: ${isBuiltEnvironment}, development flag: ${full_options.development}, NODE_ENV: ${process.env.NODE_ENV})`);\n let componentLoader;\n let vite;\n\n console.log(`Serving components from ${COMPONENT_DIR}`);\n\n // Resolve assets relative to the renderer directory for consistency\n // const rendererFullPath = (typeof full_options.renderer === 'string' && full_options.renderer !== 'default')\n // ? ensureFullPath(root, full_options.renderer)\n // : ensureFullPath(root, 'index.html');\n // const rendererDir = path.dirname(rendererFullPath);\n const resolveAssetRoot = (entry: AssetEntry): AssetEntry => {\n if (typeof entry === 'function') {\n return entry;\n }\n if (!entry || typeof entry !== 'string') return root;\n // Normalize both '/images' and 'images' to the same\n const cleaned = entry.replace(/^\\/+/, '');\n // Always resolve relative to project root (dist in prod)\n return path.resolve(root, cleaned);\n };\n\n if (full_options.assets) {\n for (const [asset_path, asset_dir] of Object.entries(full_options.assets)){\n for (const asset of asset_dir) {\n const asset_root = resolveAssetRoot(asset);\n if(typeof asset_root === 'string'){\n app.use(asset_path,express.static(asset_root))\n console.log(`Serving assets from ${asset_root} at ${asset_path}`);\n }else if (typeof asset_root === 'function'){\n app.use(asset_path,asset_root)\n console.log(`Serving assets from function at ${asset_path}`);\n } else {\n console.warn(`Invalid asset root type: ${typeof asset_root}`);\n }\n }\n }\n } else {\n console.log(`No assets to serve`);\n }\n\n if (!isProd) {\n console.log('Starting Vite in development mode...');\n const { createServer: createViteServer } = await import('vite');\n vite = await createViteServer(options.viteOptions || full_options.viteOptions);\n console.log(`Vite server created options \\n${JSON.stringify(options,null,2)}`);\n componentLoader = new ViteComponentLoader(COMPONENT_DIR, vite);\n } else {\n console.log('Starting Vite in production mode...');\n // Only serve static files if build_dir exists (traditional builds)\n // NoEgo-based builds use asset configuration instead\n const staticDir = path.join(full_options.viteOptions.root, full_options.build_dir);\n if (pathExistsSync(staticDir)) {\n app.use('/', express.static(staticDir));\n console.log(`Serving static files from ${staticDir} at /`);\n } else {\n console.log(`Skipping static file serving (build_dir ${staticDir} not found - using asset configuration)`);\n }\n\n // Serve component directory for client-side component loading\n // Use configured component_dir (e.g., 'ui') as both the directory and URL path\n const componentPath = `/${full_options.component_dir}`;\n app.use(componentPath, express.static(COMPONENT_DIR));\n console.log(`Serving components at ${componentPath} from ${COMPONENT_DIR}`);\n\n componentLoader = new ProdComponentLoader(COMPONENT_DIR);\n }\n\n const manifest = await new ManifestBuilder(\n full_options.open_api_path,\n componentLoader, \n full_options\n ).buildManifest()\n \n const htmlRenderer = getRenderer(root,full_options.renderer,isProd)\n const server_config = await parse_openapi_config(full_options.open_api_path);\n const routeDefs = server_config.routes\n /**\n * Helps manages the components of a route\n */\n const manager = new ComponentManager(componentLoader);\n const api_adapter = new ApiAdapter(manager)\n\n let middlewareRoot: string | undefined;\n if (full_options.middleware_path) {\n middlewareRoot = path.isAbsolute(full_options.middleware_path)\n ? full_options.middleware_path\n : path.resolve(full_options.viteOptions.root, full_options.middleware_path);\n }\n\n const middleware_adapter = MiddlewareAdapter.build(middlewareRoot, COMPONENT_DIR);\n\n const adapter = new ExpressServerAdapter(\n app,\n manager,\n htmlRenderer,\n api_adapter,\n middleware_adapter,\n full_options.context_builder,\n isProd,\n isBuiltEnvironment,\n full_options.component_dir,\n );\n\n\n await adapter.handleRoutes(routeDefs as IRoute[],manifest);\n console.log('Routes registered');\n\n if (!isProd) {\n app.use(vite.middlewares);\n }\n\n return app;\n}\n\n\n\nfunction getRenderer(root:string,renderer: htmlRenderer, isProd:boolean): IHTMLRender {\n if (renderer === 'default') {\n return new DefaultHTMLRender();\n } else if (typeof renderer === 'string' && !isProd) {\n return new LiveHTMLRender(ensureFullPath(root,renderer));\n } else if (typeof renderer === 'string' && isProd) {\n const html = ensureFullPath(root,renderer);\n const template = fs.readFileSync(html, 'utf8')\n return new BaseHTMLRender(template);\n } else if (renderer instanceof BaseHTMLRender) {\n return renderer;\n }else{\n throw new Error('Invalid renderer type');\n }\n}\n\n\n\nfunction ensureFullPath(root:string,renderer: string): string {\n if (path.isAbsolute(renderer)) {\n console.log(`Renderer path is absolute: ${renderer}`);\n return urlJoin(root, renderer);\n } else {\n console.log(`Renderer path is relative: ${renderer}`);\n return path.resolve(root, renderer);\n\n }\n}\n\n\nfunction urlJoin(base: string, path: string): string {\n if (base.endsWith('/')) {\n base = base.slice(0, -1);\n }\n if (path.startsWith('/')) {\n path = path.slice(1);\n }\n return `${base}/${path}`;\n}\n\n \n"],"names":["path","acc","requires_server","fs","loader","_a","_b"],"mappings":";;;;;;;;;;;;;AAIA,MAAM,mBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA6BlB,MAAM,eAAqC;AAAA,EAC9C,YAAoB,WAAkB,kBAAkB;AAApC,SAAA,WAAA;AAAA,EAEpB;AAAA,EACF,MAAM,cAA+B;AACnC,WAAO,KAAK;AAAA,EACd;AAAA,EAEE,MAAM,WAAW,MAAS;AACtB,UAAM,WAAW,WAAW,QAAQ,MAAM,KAAK,aAAa;AAC5D,QAAI,OAAO,SAAS,IAAI;AAGxB,UAAM,aAAa,QAAQ,IAAI;AAC/B,QAAI,YAAY;AACZ,UAAI;AAEA,cAAM,aAAa,KAAK,MAAM,UAAU;AACxC,cAAM,iBAAiB,OAAO,UAAU;AACxC,cAAM,eAAe,sCAAsC,cAAc;AAEzE,YAAI,KAAK,SAAS,SAAS,GAAG;AAC1B,iBAAO,KAAK,QAAQ,WAAW,GAAG,YAAY;AAAA,QAAW;AAAA,QAC7D,WAAW,KAAK,SAAS,OAAO,GAAG;AAE/B,iBAAO,KAAK,QAAQ,iBAAiB;AAAA,EAAO,YAAY,EAAE;AAAA,QAC9D,OAAO;AAEH,iBAAO,eAAe,OAAO;AAAA,QACjC;AAAA,MACJ,SAAS,GAAG;AACR,gBAAQ,MAAM,wCAAwC,CAAC;AAAA,MAC3D;AAAA,IACJ;AAIA,WAAO,KAAK;AAAA,MACR;AAAA,MACA,CAAC,QAAQ,QAAQ;AAEb,cAAM,UAAU,IAAI,QAAQ,MAAM,KAAK;AAGvC,eAAO;AAAA,uBACA,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAmBlB;AAAA,IAAA;AAGJ,WAAO;AAAA,EACX;AACJ;AAEO,MAAM,0BAA0B,eAAc;AAAA,EACjD,cAAc;AACV,UAAA;AAAA,EACJ;AACJ;AAIO,MAAM,eAAqC;AAAA,EAChD,YAAoB,WAAkB;AAAlB,SAAA,YAAA;AAAA,EACpB;AAAA,EACA,MAAM,WAAW,MAA4B;AAC3C,UAAM,WAAW,WAAW,QAAQ,MAAM,KAAK,aAAa;AAC5D,QAAI,OAAO,SAAS,IAAI;AAGxB,UAAM,aAAa,QAAQ,IAAI;AAC/B,QAAI,YAAY;AACZ,UAAI;AAEA,cAAM,aAAa,KAAK,MAAM,UAAU;AACxC,cAAM,iBAAiB,OAAO,UAAU;AACxC,cAAM,eAAe,sCAAsC,cAAc;AAEzE,YAAI,KAAK,SAAS,SAAS,GAAG;AAC1B,iBAAO,KAAK,QAAQ,WAAW,GAAG,YAAY;AAAA,QAAW;AAAA,QAC7D,WAAW,KAAK,SAAS,OAAO,GAAG;AAE/B,iBAAO,KAAK,QAAQ,iBAAiB;AAAA,EAAO,YAAY,EAAE;AAAA,QAC9D,OAAO;AAEH,iBAAO,eAAe,OAAO;AAAA,QACjC;AAAA,MACJ,SAAS,GAAG;AACR,gBAAQ,MAAM,wCAAwC,CAAC;AAAA,MAC3D;AAAA,IACJ;AAIA,WAAO,KAAK;AAAA,MACR;AAAA,MACA,CAAC,QAAQ,QAAQ;AAEb,cAAM,UAAU,IAAI,QAAQ,MAAM,KAAK;AAGvC,eAAO;AAAA,uBACI,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAmBtB;AAAA,IAAA;AAGJ,WAAO;AAAA,EACT;AAAA,EACA,MAAM,cAA+B;AACnC,UAAM,eAAe,MAAM,GAAG,SAAS,KAAK,WAAW,MAAM;AAC7D,WAAO;AAAA,EACT;AACF;AC9JO,MAAM,qBAA0B;AAAA,EACnC,SAAS;AAAA,EACT,MAAM,QAAQ,IAAA;AAAA,EACd,QAAQ,EAAE,gBAAgB,KAAA;AAAA,EAC1B,KAAK;AAAA,IACD,YAAY,CAAC,UAAU,aAAa;AAAA,EAAA;AAE5C;AAEO,MAAM,iBAAgC;AAAA,EACzC,aAAa,QAAQ,IAAI,aAAa;AAAA,EACtC,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,UAAU;AAAA,EACV,eAAeA,cAAK,KAAK,QAAQ,IAAA,GAAO,cAAc;AAAA,EACtD,mBAAmB;AAAA,EACnB,iBAAiB;AACrB;AC9BO,MAAM,gBAAe;AAAA,EAGxB,YAAoB,cAA6B,QAAkC,SAAsB;AAFjG;AAEY,SAAA,eAAA;AAA6B,SAAA,SAAA;AAAkC,SAAA,UAAA;AAC/E,SAAK,eAAe,UAAU,gBAAe,KAAK,OAAO;AAAA,EAC7D;AAAA,EAGA,MAAM,gBAAe;AAEjB,UAAM,gBAAgB,MAAM,qBAAqB,KAAK,YAAY;AAClE,UAAM,iBAAiB,KAAK,aAAa;AACzC,QAAI,CAAC,gBAAgB;AACjB,YAAM,IAAI,MAAM,+BAA+B;AAAA,IACnD;AACA,UAAM,SAAS,cAAc;AAE7B,UAAM,WAAW,MAAM,OAAO,OAAO,OAAM,KAAI,UAAQ;AACnD,aAAO,IAAI,KAAK,OAAMC,SAAM;AACxB,cAAM,UAAU,MAAM;AACtB,cAAM,UAAU,MAAM,gBAAgB,OAAM,KAAK,MAAM;AACvDA,aAAI,OAAO,IAAI;AACf,eAAOA;AAAAA,MACX,CAAC;AAAA,IACL,GAAE,QAAQ,QAAQ,CAAA,CAAE,CAAoC;AAExD,WAAO;AAAA,EAEX;AACJ;AAKA,eAAe,gBAAgB,OAAa,QAAwB;AAEhE,QAAM,iBAAiB,MAAM,cAAc,MAAM,WAAW,SAAS;AAGrE,QAAM,cAAc,MAAM,uBAAuB,OAAM,MAAM,KAAK,MAAM,qBAAqB,OAAM,MAAM;AAEzG,QAAMC,mBAAkB,kBAAkB;AAE1C,UAAQ,IAAI,cAAc,MAAM,MAAM;AAAA,IAClC;AAAA,IACA,YAAY,MAAM;AAAA,IAClB;AAAA,IACA,iBAAAA;AAAAA,EAAA,CACH;AAED,SAAOA;AACX;AAGA,eAAe,uBAAuB,OAAa,QAAwB;AACvE,QAAM,SAAS,MAAM;AACrB,MAAI,CAAC,QAAQ;AACT,WAAO;AAAA,EACX;AACA,QAAM,gBAAgB,MAAM,QAAQ,IAAI,OAAO,IAAI,OAAO,eAAe;AAErE,UAAM,WAAW,OAAO,qBAAqB,UAAU;AACvD,UAAM,EAAE,KAAK,KAAA,IAASF,cAAK,MAAM,QAAQ;AACzC,UAAM,aAAmC,CAAC,OAAO,KAAK;AAEtD,eAAW,OAAO,YAAY;AAC1B,YAAM,iBAAiBA,cAAK,KAAK,KAAK,GAAG,IAAI,QAAQ,GAAG,EAAE;AAE1D,UAAI;AACA,YAAIG,YAAG,WAAW,cAAc,GAAG;AAC/B,gBAAM,SAAS,MAAM,OAAO,cAAc,cAAc,EAAE;AAC1D,cAAI,QAAO,iCAAQ,aAAY,YAAY;AACvC,mBAAO;AAAA,UACX;AAAA,QACJ;AAAA,MACJ,SAAS,OAAO;AAAA,MAEhB;AAAA,IACJ;AAGA,QAAI;AACA,YAAM,YAAY,MAAM,OAAO,KAAK,UAAU;AAC9C,aAAO,CAAC,CAAC,UAAU;AAAA,IACvB,QAAQ;AACJ,aAAO;AAAA,IACX;AAAA,EACJ,CAAC,CAAC;AAEF,SAAO,cAAc,KAAK,CAAC,aAAmB,QAAQ;AAC1D;AAEA,eAAe,qBAAqB,OAAa,QAAwB;AACrE,QAAM,OAAO,MAAM;AACnB,MAAI,CAAC,MAAM;AACP,WAAO;AAAA,EACX;AAEA,QAAM,WAAW,OAAO,qBAAqB,IAAI;AACjD,QAAM,EAAE,KAAK,KAAA,IAASH,cAAK,MAAM,QAAQ;AACzC,QAAM,aAAmC,CAAC,OAAO,KAAK;AAEtD,aAAW,OAAO,YAAY;AAC1B,UAAM,iBAAiBA,cAAK,KAAK,KAAK,GAAG,IAAI,QAAQ,GAAG,EAAE;AAE1D,QAAI;AACA,UAAIG,YAAG,WAAW,cAAc,GAAG;AAC/B,cAAM,SAAS,MAAM,OAAO,cAAc,cAAc,EAAE;AAC1D,YAAI,QAAO,iCAAQ,aAAY,YAAY;AACvC,iBAAO;AAAA,QACX;AAAA,MACJ;AAAA,IACJ,SAAS,OAAO;AAAA,IAEhB;AAAA,EACJ;AAGA,MAAI;AACA,UAAM,YAAY,MAAM,OAAO,KAAK,IAAI;AACxC,WAAO,CAAC,CAAC,UAAU;AAAA,EACvB,QAAQ;AACJ,WAAO;AAAA,EACX;AACJ;ACxHO,MAAM,WAAU;AAAA,EAEnB,YACY,SAEX;AAFW,SAAA,UAAA;AAAA,EAIZ;AAAA,EAGA,MAAM,WAAW,OAAa,cAAyB;AAEnD,UAAM,OAAO,MAAM,KAAK,QAAQ,iBAAiB,KAAK;AAGtD,UAAM,iBAAiB,MAAM,KAAK,QAAQ,iBAAiB,KAAK;AAChE,UAAM,SAAS,KAAK;AAMpB,QAAI,cAAc,CAAA;AAClB,QAAI,YAAgB,CAAA;AAGpB,QAAG,eAAe,KAAK,CAAAC,YAAU,CAAC,CAACA,OAAM,GAAE;AACvC,cAAQ,IAAI,kBAAkB;AAC9B,oBAAc,MAAM,QAAQ,IAAI,eAAe,IAAI,OAAO,kBAAkB;AACxE,YAAI,CAAC,eAAe;AAChB,iBAAO,CAAA;AAAA,QACX;AACA,cAAM,OAAO,MAAM,cAAc,YAAY;AAC7C,eAAO;AAAA,MACX,CAAC,CAAC;AAAA,IACN;AAEA,QAAG,QAAO;AACN,kBAAY,MAAM,OAAO,YAAY;AAAA,IACzC;AAEA,QAAI,cAAc;AAAA,MACd,QAAO;AAAA,MACP,MAAK;AAAA,IAAA;AAGT,WAAO,KAAK,gBAAgB,OAAO,cAAc,WAAW;AAAA,EAChE;AAAA,EAGA,MAAM,gBAAgB,OAAa,cAAyB;AAExD,UAAM,OAAO,MAAM,KAAK,QAAQ,iBAAiB,KAAK;AACtD,UAAM,iBAAiB,MAAM,KAAK,QAAQ,iBAAiB,KAAK;AAEhE,UAAM,SAAS,KAAK;AAEpB,QAAI,cAAc,CAAA;AAClB,QAAI,YAAgB,CAAA;AAGpB,QAAG,eAAe,KAAK,CAAAA,YAAU,CAAC,CAACA,OAAM,GAAE;AACvC,cAAQ,IAAI,kBAAkB;AAC9B,oBAAc,MAAM,QAAQ,IAAI,eAAe,IAAI,OAAO,kBAAkB;AACxE,YAAI,CAAC,eAAe;AAChB,iBAAO,CAAA;AAAA,QACX;AACA,cAAM,OAAO,MAAM,cAAc,YAAY;AAC7C,eAAO;AAAA,MACX,CAAC,CAAC;AAAA,IACN;AAEA,QAAG,QAAO;AACN,kBAAY,MAAM,OAAO,YAAY;AAAA,IACzC;AAEA,QAAI,cAAc;AAAA,MACd,QAAO;AAAA,MACP,MAAK;AAAA,IAAA;AAGT,WAAO,KAAK,gBAAgB,OAAO,cAAc,WAAW;AAAA,EAChE;AAAA,EAGA,MAAc,gBAAgB,OAAe,cAA2B,aAA8C;AAClH,QAAI,CAAC,MAAM,KAAK,QAAQ,WAAW,KAAK,GAAG;AACvC,aAAO;AAAA,IACX;AAEA,UAAM,UAAU,MAAM,KAAK,QAAQ,WAAW,KAAK;AAEnD,UAAM,sBAAsB,MAAM,QAAQ;AAAA,MACtC,QAAQ,QAAQ,IAAI,OAAO,WAAgD;AACvE,YAAI,CAAC,QAAQ;AACT,iBAAO;AAAA,QACX;AACA,cAAM,OAAO,MAAM,OAAO,YAAY;AACtC,eAAO,QAAQ;AAAA,MACnB,CAAC;AAAA,IAAA;AAGL,UAAM,iBAAiB,YAAY,UAAU,CAAA;AAC7C,UAAM,aAAa,KAAK,IAAI,eAAe,QAAQ,oBAAoB,MAAM;AAC7E,UAAM,gBAAgB,MAAM,KAAK,EAAE,QAAQ,WAAA,GAAc,CAAC,GAAG,UAAU;AACnE,YAAM,kBAAkB,eAAe,KAAK;AAC5C,YAAM,eAAe,oBAAoB,KAAK;AAE9C,UAAI,CAAC,cAAc;AACf,eAAO;AAAA,MACX;AAEA,UAAI,mBAAmB,OAAO,oBAAoB,UAAU;AACxD,eAAO,EAAE,GAAG,iBAAiB,GAAG,aAAA;AAAA,MACpC;AAEA,aAAO;AAAA,IACX,CAAC;AAED,UAAM,mBAAmB,QAAQ,OAAO,MAAM,QAAQ,KAAK,YAAY,IAAI;AAC3E,QAAI,aAAa,YAAY;AAC7B,QAAI,kBAAkB;AAClB,UAAI,cAAc,OAAO,eAAe,UAAU;AAC9C,qBAAa,EAAE,GAAG,YAAY,GAAG,iBAAA;AAAA,MACrC,OAAO;AACH,qBAAa;AAAA,MACjB;AAAA,IACJ;AAEA,WAAO;AAAA,MACH,QAAQ;AAAA,MACR,MAAM;AAAA,IAAA;AAAA,EAEd;AACJ;ACxIA,MAAM,uBAAuB,CAAC,OAAO,QAAQ,QAAQ,OAAO,MAAM;AAE3D,MAAM,kBAAkB;AAAA,EAG3B,YACY,gBACA,cACV;AALM,qDAA+C,IAAA;AAG3C,SAAA,iBAAA;AACA,SAAA,eAAA;AAAA,EACT;AAAA,EAEH,OAAO,MAAM,gBAAyB,cAAuB;AACzD,WAAO,IAAI,kBAAkB,gBAAgB,YAAY;AAAA,EAC7D;AAAA,EAEA,MAAM,iBAAiB,KAAc,KAAe,mBAA6B,CAAA,GAAmB;AAChG,QAAI,CAAC,MAAM,QAAQ,gBAAgB,KAAK,iBAAiB,WAAW,GAAG;AACnE;AAAA,IACJ;AAEA,UAAM,aAAa,MAAM,KAAK,2BAA2B,gBAAgB;AAEzE,YAAQ,IAAI,UAAU;AACtB,QAAI,WAAW,OAAO,SAAS,GAAG;AAC9B,YAAM,IAAI,MAAM,iCAAiC,WAAW,OAAO,KAAK,IAAI,CAAC,EAAE;AAAA,IACnF;AAEA,eAAW,cAAc,WAAW,WAAW;AAC3C,YAAM,KAAK,kBAAkB,YAAY,KAAK,GAAG;AACjD,UAAI,IAAI,aAAa;AACjB;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,MAAc,2BAA2B,kBAAiE;AACtG,UAAM,YAAkC,CAAA;AACxC,UAAM,SAAmB,CAAA;AAEzB,eAAW,QAAQ,kBAAkB;AACjC,UAAI,CAAC,MAAM;AACP;AAAA,MACJ;AACA,UAAI;AACA,YAAI,WAAW,KAAK,MAAM,IAAI,IAAI;AAClC,YAAI,CAAC,UAAU;AACX,qBAAW,MAAM,KAAK,sBAAsB,IAAI;AAChD,eAAK,MAAM,IAAI,MAAM,CAAC,GAAG,QAAQ,CAAC;AAAA,QACtC;AACA,kBAAU,KAAK,GAAG,QAAQ;AAAA,MAC9B,SAAS,OAAO;AACZ,eAAO,KAAK,GAAG,IAAI,KAAM,MAAgB,OAAO,EAAE;AAAA,MACtD;AAAA,IACJ;AAEA,WAAO;AAAA,MACH,WAAW,KAAK,OAAO,SAAS;AAAA,MAChC;AAAA,IAAA;AAAA,EAER;AAAA,EAEA,MAAc,sBAAsB,MAA6C;AAC7E,UAAM,CAAC,UAAU,QAAQ,IAAI,KAAK,oBAAoB,IAAI;AAC1D,UAAM,WAAW,KAAK,0BAA0B,QAAQ;AACxD,UAAM,SAAS,MAAM,KAAK,uBAAuB,UAAU,IAAI;AAC/D,WAAO,KAAK,2BAA2B,QAAQ,UAAU,IAAI;AAAA,EACjE;AAAA,EAEQ,oBAAoB,MAA4C;AACpE,UAAM,aAAa,KAAK,QAAQ,GAAG;AACnC,QAAI,eAAe,IAAI;AACnB,aAAO,CAAC,MAAM,MAAS;AAAA,IAC3B;AACA,WAAO,CAAC,KAAK,UAAU,GAAG,UAAU,GAAG,KAAK,UAAU,aAAa,CAAC,CAAC;AAAA,EACzE;AAAA,EAEQ,0BAA0B,UAA0B;AACxD,UAAM,WAAW,KAAK,kBAAkB,KAAK,gBAAgB,QAAQ,IAAA;AACrE,UAAM,cAAc,KAAK,wBAAwB,QAAQ;AACzD,UAAM,gBAAgBJ,cAAK,QAAQ,QAAQ,OAAOA,cAAK,KAAK,UAAU,WAAW,CAAC;AAElF,UAAM,kBAAkB,KAAK,iBAAiB,aAAa;AAC3D,QAAI,iBAAiB;AACjB,aAAO;AAAA,IACX;AAEA,UAAM,IAAI,MAAM,8BAA8B,WAAW,EAAE;AAAA,EAC/D;AAAA,EAEQ,wBAAwB,UAA0B;AACtD,WAAO,SAAS,MAAM,GAAG,EAAE,KAAKA,cAAK,GAAG;AAAA,EAC5C;AAAA,EAEQ,iBAAiB,oBAA2C;AAChE,UAAM,MAAMA,cAAK,QAAQ,kBAAkB;AAC3C,QAAI,KAAK;AACL,aAAOG,YAAG,WAAW,kBAAkB,IAAI,qBAAqB;AAAA,IACpE;AAEA,UAAM,mBAAmB,qBAAqB,IAAI,CAAA,iBAAgB,GAAG,kBAAkB,GAAG,YAAY,EAAE;AACxG,eAAW,aAAa,kBAAkB;AACtC,UAAIA,YAAG,WAAW,SAAS,GAAG;AAC1B,eAAO;AAAA,MACX;AAAA,IACJ;AAEA,UAAM,kBAAkB,qBAAqB,IAAI,CAAA,iBAAgBH,cAAK,KAAK,oBAAoB,QAAQ,YAAY,EAAE,CAAC;AACtH,eAAW,aAAa,iBAAiB;AACrC,UAAIG,YAAG,WAAW,SAAS,GAAG;AAC1B,eAAO;AAAA,MACX;AAAA,IACJ;AAEA,WAAO;AAAA,EACX;AAAA,EAEA,MAAc,uBAAuB,UAAkB,MAA4B;AAC/E,QAAI;AACA,YAAM,MAAM,cAAc,QAAQ,EAAE;AACpC,aAAO,MAAM,OAAO;AAAA,IACxB,SAAS,OAAO;AACZ,YAAM,IAAI,MAAM,gCAAgC,IAAI,UAAU,QAAQ,EAAE;AAAA,IAC5E;AAAA,EACJ;AAAA,EAEQ,2BAA2B,QAAa,UAA8B,MAAoC;AAC9G,QAAI,CAAC,UAAU;AACX,aAAO,KAAK,uBAAuB,QAAQ,IAAI;AAAA,IACnD;AAEA,QAAI,aAAa,KAAK;AAClB,aAAO,KAAK,oBAAoB,QAAQ,IAAI;AAAA,IAChD;AAEA,WAAO,KAAK,yBAAyB,QAAQ,UAAU,IAAI;AAAA,EAC/D;AAAA,EAEQ,uBAAuB,QAAa,MAAoC;AAC5E,QAAI,EAAC,iCAAQ,UAAS;AAClB,YAAM,IAAI,MAAM,eAAe,IAAI,+BAA+B;AAAA,IACtE;AACA,QAAI,OAAO,OAAO,YAAY,YAAY;AACtC,YAAM,IAAI,MAAM,kCAAkC,IAAI,qBAAqB;AAAA,IAC/E;AACA,WAAO,CAAC,OAAO,OAAO;AAAA,EAC1B;AAAA,EAEQ,oBAAoB,QAAa,MAAoC;AACzE,UAAM,YAAY,OAAO,OAAO,MAAM,EAAE,OAAO,CAAC,UAAuC,OAAO,UAAU,UAAU;AAClH,QAAI,UAAU,WAAW,GAAG;AACxB,YAAM,IAAI,MAAM,wCAAwC,IAAI,GAAG;AAAA,IACnE;AACA,WAAO;AAAA,EACX;AAAA,EAEQ,yBAAyB,QAAa,UAAkB,MAAoC;AAChG,UAAM,QAAQ,SAAS,MAAM,GAAG,EAAE,IAAI,CAAA,SAAQ,KAAK,KAAA,CAAM,EAAE,OAAO,OAAO;AACzE,UAAM,YAAkC,CAAA;AACxC,UAAM,UAAoB,CAAA;AAC1B,UAAM,UAAoB,CAAA;AAE1B,eAAW,QAAQ,OAAO;AACtB,YAAM,QAAQ,SAAS,YAAY,iCAAQ,UAAU,iCAAS;AAC9D,UAAI,UAAU,QAAW;AACrB,gBAAQ,KAAK,IAAI;AACjB;AAAA,MACJ;AAEA,UAAI,OAAO,UAAU,cAAc,MAAM,SAAS,GAAG;AACjD,gBAAQ,KAAK,IAAI;AACjB;AAAA,MACJ;AACA,gBAAU,KAAK,KAAK;AAAA,IACxB;AAEA,QAAI,QAAQ,QAAQ;AAChB,YAAM,IAAI,MAAM,eAAe,IAAI,2BAA2B,QAAQ,KAAK,IAAI,CAAC,EAAE;AAAA,IACtF;AACA,QAAI,QAAQ,QAAQ;AAChB,YAAM,IAAI,MAAM,eAAe,IAAI,8BAA8B,QAAQ,KAAK,IAAI,CAAC,EAAE;AAAA,IACzF;AAEA,QAAI,UAAU,WAAW,GAAG;AACxB,YAAM,IAAI,MAAM,eAAe,IAAI,iDAAiD,QAAQ,GAAG;AAAA,IACnG;AAEA,WAAO;AAAA,EACX;AAAA,EAEQ,kBAAkB,IAAwB,KAAc,KAA8B;AAC1F,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACpC,UAAI;AACA,WAAG,KAAK,KAAK,CAAC,UAAoB;AAC9B,cAAI,OAAO;AACP,mBAAO,KAAK;AACZ;AAAA,UACJ;AACA,kBAAA;AAAA,QACJ,CAAC;AAAA,MACL,SAAS,OAAO;AACZ,eAAO,KAAK;AAAA,MAChB;AAAA,IACJ,CAAC;AAAA,EACL;AAAA,EAEQ,OAAO,WAAuD;AAClE,UAAM,2BAAW,IAAA;AACjB,UAAM,UAAgC,CAAA;AACtC,eAAW,MAAM,WAAW;AACxB,UAAI,CAAC,KAAK,IAAI,EAAE,GAAG;AACf,aAAK,IAAI,EAAE;AACX,gBAAQ,KAAK,EAAE;AAAA,MACnB;AAAA,IACJ;AACA,WAAO;AAAA,EACX;AACJ;AC5NO,MAAe,cAAc;AAEpC;ACUO,MAAM,6BAA6B,cAAc;AAAA,EAGpD,YACY,QACA,SACA,YACA,aACA,oBACA,iBACA,SAAkB,OAClB,qBAA8B,OAC9B,cACV;AACE,UAAA;AAbI,wCAAyB,CAAA;AAGrB,SAAA,SAAA;AACA,SAAA,UAAA;AACA,SAAA,aAAA;AACA,SAAA,cAAA;AACA,SAAA,qBAAA;AACA,SAAA,kBAAA;AACA,SAAA,SAAA;AACA,SAAA,qBAAA;AACA,SAAA,eAAA;AAAA,EAGZ;AAAA,EAEQ,4BAAoC;AACxC,QAAI,KAAK,UAAU,KAAK,oBAAoB;AACxC,aAAO;AAAA,IACX;AACA,WAAO;AAAA;AAAA,EACX;AAAA,EAEA,MAAc,wBAAwB,eAAuB;AACzD,QAAI,CAAC,KAAK,QAAQ;AACd,YAAM,MAAM,MAAM,OAAO,0CAAmB;AAC5C,aAAO,IAAI,WAAW;AAAA,IAC1B;AAEA,UAAM,aAAa;AAAA,MACfH,cAAK,KAAK,eAAe,oBAAoB;AAAA,MAC7CA,cAAK,KAAK,eAAe,OAAO,oBAAoB;AAAA,IAAA;AAExD,QAAI;AACJ,eAAW,MAAM,YAAY;AACzB,UAAI;AACA,cAAM,MAAM,MAAM,OAAO;AACzB,eAAQ,IAAY,WAAW;AAAA,MACnC,SAAS,GAAG;AACR,oBAAY;AAAA,MAChB;AAAA,IACJ;AACA,UAAM,aAAa,IAAI,MAAM,iDAAiD;AAAA,EAClF;AAAA,EAEQ,yBAAyB,QAA4B;;AACzD,QAAI,CAAC,KAAK,OAAQ,QAAO;AACzB,YAAQ,IAAI,2CAA2C,OAAO,MAAM,wBAAwB;AAC5F,UAAM,cAAc,OAAO,IAAI,CAAA,UAAA;;AAAU;AAAA,QACrC,GAAG;AAAA,QACH,SAAQK,MAAA,MAAM,WAAN,gBAAAA,IAAc,IAAI,CAAAL,UAAQA,MAAK,QAAQ,aAAa,KAAK;AAAA,QACjE,OAAMM,MAAA,MAAM,SAAN,gBAAAA,IAAY,QAAQ,aAAa;AAAA,MAAK;AAAA,KAC9C;AACF,YAAQ,IAAI,6DAA4D,YAAO,CAAC,MAAR,mBAAW,IAAI,OAAM,iBAAY,CAAC,MAAb,mBAAgB,IAAI,EAAE;AACnH,WAAO;AAAA,EACX;AAAA,EAEA,MAAM,aAAa,QAAkB,UAA8B;AAE/D,UAAM,oBAAoB,KAAK,yBAAyB,MAAM;AAC9D,SAAK,eAAe;AACpB,UAAM,WAAW,0BAA0B,iBAAiB;AAE5D,SAAK,OAAO,IAAI,CAAC,KAAc,KAAe,SAAc;AAExD,OAAC,YAAY;AACT,YAAI,IAAI,aAAa;AACjB;AAAA,QACJ;AACA,cAAM,SAAS,IAAI,OAAO,YAAA;AAC1B,cAAM,UAAU,IAAI,OAAO;AAC3B,cAAMN,QAAO,QAAQ,MAAM,GAAG,EAAE,CAAC;AAGjC,cAAM,YAAY,YAAY;AAC1B,eAAA;AAAA,QACJ;AAEA,cAAM,UAAU,SAAS,KAAK,OAAK,EAAE,OAAOA,KAAI,CAAC;AACjD,YAAI,CAAC,SAAS;AACV,gBAAM,UAAA;AACN;AAAA,QACJ;AACA,cAAM,gBAAgB,kBAAkB,OAAO,OAAK,EAAE,SAAS,QAAQ,OAAO;AAC9E,cAAM,QAAQ,cAAc,KAAK,CAAA,MAAK,EAAE,OAAO,YAAA,MAAkB,MAAM;AACvE,YAAI,CAAC,OAAO;AACR,gBAAM,UAAA;AACN;AAAA,QACJ;AAEA,cAAM,KAAK,eAAe,SAAS,SAAS,OAAO,mBAAmB,UAAU,KAAK,GAAG,EAAE,MAAM,CAAA,MAAK;AACjG,cAAI,OAAO,GAAG,EAAE,KAAK;AAAA;AAAA,+BAEV,CAAC;AAAA,qBACX;AAAA,QACL,CAAC;AAAA,MACL,GAAA;AAEA;AAAA,IAEJ,CAAC;AAAA,EACL;AAAA,EACA,MAAgB,eAAe,KAAa,SAAqB,OAAe,QAAkB,UAAU,KAAc,KAAe;;AACrI,QAAI,UAAkB,IAAI,QAAQ,UAAU;AAC5C,QAAI,kBAAkB,QAAQ,YAAA,EAAc,SAAS,kBAAkB;AAEvE,QAAI,IAAI,aAAa;AACjB;AAAA,IACJ;AAEA,UAAM,UAAU,CAAA;AAChB,QAAI,KAAK,iBAAiB;AACtB,YAAM,gBAAgB,MAAM,KAAK,gBAAgB,KAAK,GAAG;AACzD,aAAO,OAAO,SAAS,aAAa;AAAA,IACxC;AACA,QAAI,SAAS,IAAI;AAGjB,UAAM,YAAY,IAAI,MAAM,GAAG,EAAE,CAAC;AAClC,UAAM,aAAa,QAAQ,OAAO,SAAS;AAG3C,UAAM,cAAiD,CAAA;AACvD,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,IAAI,KAAK,GAAG;AAClD,UAAI,OAAO,UAAU,UAAU;AAC3B,oBAAY,GAAG,IAAI;AAAA,MACvB,WAAW,MAAM,QAAQ,KAAK,GAAG;AAE7B,oBAAY,GAAG,IAAI,MAAM,IAAI,CAAA,MAAK,OAAO,MAAM,WAAW,IAAI,OAAO,CAAC,CAAC;AAAA,MAC3E,WAAW,UAAU,QAAW;AAC5B,oBAAY,GAAG,IAAI,OAAO,KAAK;AAAA,MACnC;AAAA,IACJ;AACA,UAAM,iBAAiB,EAAE,GAAG,YAAY,GAAG,YAAA;AAE3C,QAAI,eAA4B;AAAA,MAC5B;AAAA,MACA,OAAO,IAAI;AAAA,MACX,QAAQ;AAAA,MACR,SAAS,IAAI;AAAA,MACb,MAAM,IAAI;AAAA,MACV;AAAA,IAAA;AAMJ,YAAQ,IAAI,6BAA6B,IAAI,KAAK;AAAA,MAC9C,YAAY,MAAM;AAAA,MAClB,QAAQ,IAAI,QAAQ;AAAA,MACpB,YAAY,MAAM;AAAA,MAClB;AAAA,IAAA,CACH;AACD,QAAI;AACA,YAAM,KAAK,mBAAmB,iBAAiB,KAAK,KAAK,MAAM,cAAc,EAAE;AAC/E,cAAQ,IAAI,gCAAgC;AAAA,QACxC,aAAa,IAAI;AAAA,QACjB,YAAY,IAAI;AAAA,MAAA,CACnB;AAAA,IACL,SAAS,GAAG;AACR,cAAQ,IAAI,uBAAuB,CAAC;AACpC,UAAI,OAAO,GAAG,EAAE,KAAK;AAAA;AAAA,uBAEV,CAAC;AAAA;AAAA,EACa,EAAE,KAAK;AAAA,aAC/B;AACD;AAAA,IACJ;AAGA,QAAI,IAAI,aAAa;AACjB,cAAQ,IAAI,8DAA8D;AAC1E;AAAA,IACJ;AAEA,QAAI,cAAc,MAAM,KAAK,YAAY,WAAW,OAAO,YAAY;AACvE,QAAI,iBAAiB;AAIjB,UACK,OAAO,iBAAiB,uDAAuD,EAC/E,OAAO,UAAU,UAAU,EAC3B,OAAO,WAAW,GAAG,EACrB,KAAK,kBAAkB,EACvB,KAAK,WAAW;AACrB;AAAA,IACJ;AACA,QAAI;AACJ,QAAI;AAEJ,QAAI;AACA,gBAAU,MAAM,KAAK,QAAQ,WAAW,KAAK;AAC7C,aAAO,MAAM,KAAK,QAAQ,QAAQ,KAAK;AAAA,IAC3C,SAAS,GAAQ;AACb,cAAQ,IAAI,sBAAsB,CAAC;AACnC,UAAI,OAAO,GAAG,EAAE,KAAK;AAAA;AAAA,uBAEV,CAAC;AAAA;AAAA,EACa,EAAE,KAAK;AAAA,aAC/B;AACD;AAAA,IACJ;AAMA,QAAI,cAAc;AAClB,QAAI,gBAAgB;AACpB,UAAM,kBAAkB,KAAK,0BAAA;AAC7B,QAAI;AACA,UAAI,OAAc;AAAA,QACd,KAAK,aAAa;AAAA,QAClB,UAAU,aAAa,IAAI,MAAM,GAAG,EAAE,CAAC;AAAA,QACvC,QAAQ,aAAa,UAAU,CAAA;AAAA,QAC/B,OAAO,aAAa;AAAA,MAAA;AAKxB,cAAQ,IAAI,wBAAwB,QAAQ,IAAI,CAAA,MAAK,OAAO,CAAC,GAAG,SAAS,OAAO,IAAI;AACpF,YAAM,WAAe,UAAa,YAAb,mBAAuB,uBAAsB,CAAA;AAClE,YAAM,gBAAgB,OAAO,WAAW,KAAK,OAAO,UAAU,KAAK;AACnE,YAAM,sBAA2B,MAAM,KAAK,wBAAwB,aAAa;AACjF,cAAQ,IAAI,oCAAoC,OAAO,mBAAmB;AAC1E,YAAM,EAAE,MAAM,aAAa,MAAM,cAAc,IAAA,IACzC,OAAO,qBAAqB;AAAA,QAC1B,OAAO;AAAA,UACH;AAAA,UACA;AAAA,UACA,MAAM;AAAA,UACN,QAAQ,aAAa;AAAA,UACrB,WAAW;AAAA,UACX,OAAO,aAAa;AAAA,UACpB;AAAA,QAAA;AAAA,MACJ,CACH;AAEL,YAAM,cAAc;AACpB,cAAQ,IAAI,6CAA4C,2CAAa,WAAU,CAAC;AAQhF,YAAM,mBAAmB,CAAC,QAAwB;AAC9C,YAAI;AACA,gBAAM,OAAO,OAAO,OAAO,EAAE,EAAE,QAAQ,OAAO,GAAG;AACjD,gBAAM,SAAS;AACf,gBAAM,MAAM,KAAK,QAAQ,MAAM;AAC/B,cAAI,OAAO,GAAG;AACV,kBAAM,SAAS,KAAK,MAAM,MAAM,OAAO,MAAM,EAAE,QAAQ,QAAQ,EAAE;AACjE,mBAAO,SAAS,WAAW,MAAM,KAAK;AAAA,UAC1C;AAEA,qBAAW,QAAQ,CAAC,eAAe,QAAQ,GAAG;AAC1C,kBAAM,OAAO,KAAK,QAAQ,IAAI;AAC9B,gBAAI,QAAQ,GAAG;AACX,oBAAM,SAAS,KAAK,MAAM,OAAO,CAAC,EAAE,QAAQ,QAAQ,EAAE;AACtD,qBAAO,SAAS,WAAW,MAAM,KAAK;AAAA,YAC1C;AAAA,UACJ;AAAA,QACJ,QAAQ;AAAA,QAAC;AACT,eAAO;AAAA,MACX;AACA,YAAM,qBAAqB,KAAK,SAC1B,iBAAiB,KAAK,gBAAgB,EAAE,IACvC,KAAK,gBAAgB;AAE5B,YAAM,eAAe;AAAA;AAAA,mCAEE,OAAO,KAAK,YAAY,CAAC;AAAA;AAAA;AAAA;AAAA,oCAIxB,OAAO,QAAQ,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,wCAKZ,OAAO,eAAe,EAAE,CAAC;AAAA;AAAA;AAAA;AAAA,yCAIxB,OAAO,kBAAkB,CAAC;AAAA;AAAA;AAGvD,cAAQ,IAAI,sDAAqD,2CAAa,WAAU,CAAC;AACzF,oBAAc,MAAM,KAAK,WAAW,WAAW;AAAA,QAC3C,MAAM,kBAAkB,gBAAgB,eAAe;AAAA,QACvD,KAAK;AAAA,QACL,KAAK;AAAA,MAAA,CACR;AACD,cAAQ,IAAI,mCAAkC,2CAAa,WAAU,GAAG,qBAAqB,2CAAa,SAAS,iBAAiB;AAAA,IAExI,SAAS,GAAG;AACR,sBAAgB;AAChB,YAAM,WACF;AAAA,EAA+B,CAAC,QAC/B,WAAM,WAAN,mBAAc,UAAS,aAAY,WAAM,WAAN,mBAAc,KAAK,MAAM,KAAK,MAClE;AAAA,QAAW,MAAM,IAAI;AAIzB,oBAAc,MAAM,KAAK,WAAW,WAAW;AAAA,QAC3C,MAAM;AAAA,QACN,KAAK;AAAA;AAAA,MAAA,CAER;AAAA,IACL;AAQA,QAAI,UAAU,gBAAgB,0BAA0B;AACxD,QAAI,OAAO,aAAa;AACxB,QAAI,IAAI,WAAW;AAAA,EAEvB;AAAA,EAGA,MAAgB,eAAe,KAAc,KAAe,eAA6B;;AACrF,QAAI,IAAI,aAAa;AACjB,cAAQ,IAAI,oBAAoB;AAChC;AAAA,IACJ;AACA,QAAI,QAAa,cAAc;AAC/B,QAAI,UAAkB,IAAI,QAAQ,UAAU;AAC5C,QAAI,kBAAkB,QAAQ,YAAA,EAAc,SAAS,kBAAkB;AAEvE,UAAM,MAAM,IAAI,OAAO;AACvB,UAAM,UAAU,CAAA;AAEhB,QAAI,gBAAgB;AAAA,MAChB;AAAA,MACA,OAAO,IAAI;AAAA,MACX,QAAQ,CAAA;AAAA,MACR,SAAS,IAAI;AAAA,MACb,MAAM,IAAI;AAAA,MACV;AAAA,IAAA;AAGJ,QAAI,eAAe;AAMnB,QAAI;AACA,YAAM,KAAK,mBAAmB,iBAAiB,KAAK,KAAK,MAAM,cAAc,EAAE;AAAA,IACnF,SAAS,GAAG;AACR,cAAQ,IAAI,gCAAgC,CAAC;AAC7C,UAAI,OAAO,GAAG,EAAE,KAAK;AAAA;AAAA,uBAEV,CAAC;AAAA,aACX;AACD;AAAA,IACJ;AAEA,YAAQ,IAAI,+BAA+B;AAQ3C,QAAI,cAAc,MAAM,KAAK,YAAY,WAAW,OAAO,YAAY;AAEvE,YAAQ,IAAI,6BAA6B;AACzC,QAAI,iBAAiB;AAKjB,cAAQ,IAAI,mBAAmB;AAC/B,UACK,OAAO,iBAAiB,uDAAuD,EAC/E,OAAO,UAAU,UAAU,EAC3B,OAAO,WAAW,GAAG,EACrB,KAAK,kBAAkB,EACvB,OAAO,GAAG,EACV,KAAK,WAAW;AACrB;AAAA,IACJ;AAEA,UAAM,UAAU,MAAM,KAAK,QAAQ,WAAW,KAAK;AACnD,UAAM,OAAO,MAAM,KAAK,QAAQ,QAAQ,KAAK;AAE7C,YAAQ,IAAI,iBAAiB,IAAI;AACjC,YAAQ,IAAI,oBAAoB,OAAO;AAOvC,UAAM,WAAe,UAAa,YAAb,mBAAuB,uBAAsB,CAAA;AAClE,UAAM,gBAAgB,OAAO,WAAW,KAAK,OAAO,UAAU,KAAK;AACnE,UAAM,sBAA2B,MAAM,KAAK,wBAAwB,aAAa;AACjF,QAAI,EAAE,MAAM,aAAa,MAAM,IAAA,IACzB,OAAO,qBAAqB;AAAA,MAC1B,OAAO;AAAA,QACH;AAAA,QACA;AAAA,QACA,MAAM;AAAA,QACN,QAAQ,aAAa;AAAA,MAAA;AAAA,IACzB,CACH;AAEL,UAAM,cAAc;AAMpB,UAAM,kBAAkB,KAAK,0BAAA;AAE7B,UAAM,cAAc,MAAM,KAAK,WAAW,WAAW;AAAA,MACjD,MAAM,mBAAmB,eAAe;AAAA,MACxC,KAAK;AAAA,MACL,KAAK;AAAA,IAAA,CACR;AAKD,QACK,KAAK,WAAW,EAChB,OAAO,GAAG,EACV,KAAK,WAAW;AAAA,EAEzB;AACJ;ACnbA,SAAS,eAAe,GAAoB;AACxC,MAAI;AAAE,WAAOG,YAAG,WAAW,CAAC;AAAA,EAAG,QAAQ;AAAE,WAAO;AAAA,EAAO;AAC3D;AAYA,SAAS,mBAAmB,WAA4B;;AAEpD,QAAM,UAAU,QAAQ,IAAI;AAC5B,MAAI,WAAWH,cAAK,WAAW,OAAO,KAAK,eAAe,OAAO,GAAG;AAChE,WAAOA,cAAK,UAAU,OAAO;AAAA,EACjC;AAEA,MAAI,aAAaA,cAAK,WAAW,SAAS,KAAK,eAAe,SAAS,GAAG;AACtE,WAAOA,cAAK,UAAU,SAAS;AAAA,EACnC;AAEA,QAAM,SAAQ,aAAQ,SAAR,mBAAe;AAC7B,MAAI,OAAO;AACP,UAAM,WAAWA,cAAK,QAAQA,cAAK,QAAQ,KAAK,CAAC;AACjD,QAAI,eAAe,QAAQ,EAAG,QAAO;AAAA,EACzC;AAEA,SAAO,QAAQ,IAAA;AACnB;AAEA,eAAsB,aAAa,KAAgC,SAAmD;;AAClH,YAAU,WAAW;AACrB,QAAM,eAAe,UAAU,gBAAgB,OAAO;AACtD,QAAM,OAAO,oBAAmB,kBAAa,gBAAb,mBAA0B,IAAI;AAC9D,eAAa,YAAY,OAAO;AAEhC,eAAa,gBAAgB,eAAe,aAAa,YAAY,MAAM,aAAa,aAAa;AAErG,QAAM,gBAAgB,CAAC,aAAa,gBAAgB,OAAOA,cAAK,KAAK,MAAM,aAAa,aAAa;AAIrG,QAAM,qBAAqB,QAAQ,IAAI,gBAAgB;AACvD,QAAM,SAAS,sBAAsB,aAAa,gBAAgB;AAElE,UAAQ,IAAI,cAAc,SAAS,eAAe,aAAa,6BAA6B,kBAAkB,uBAAuB,aAAa,WAAW,eAAe,QAAQ,IAAI,QAAQ,GAAG;AACnM,MAAI;AACJ,MAAI;AAEJ,UAAQ,IAAI,2BAA2B,aAAa,EAAE;AAOtD,QAAM,mBAAmB,CAAC,UAAkC;AACxD,QAAI,OAAO,UAAU,YAAY;AAC7B,aAAO;AAAA,IACX;AACA,QAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO;AAEhD,UAAM,UAAU,MAAM,QAAQ,QAAQ,EAAE;AAExC,WAAOA,cAAK,QAAQ,MAAM,OAAO;AAAA,EACrC;AAEA,MAAI,aAAa,QAAQ;AACrB,eAAW,CAAC,YAAY,SAAS,KAAK,OAAO,QAAQ,aAAa,MAAM,GAAE;AACtE,iBAAW,SAAS,WAAW;AAC3B,cAAM,aAAa,iBAAiB,KAAK;AACzC,YAAG,OAAO,eAAe,UAAS;AAC9B,cAAI,IAAI,YAAW,QAAQ,OAAO,UAAU,CAAC;AAC7C,kBAAQ,IAAI,uBAAuB,UAAU,OAAO,UAAU,EAAE;AAAA,QACpE,WAAU,OAAO,eAAe,YAAW;AACvC,cAAI,IAAI,YAAW,UAAU;AAC7B,kBAAQ,IAAI,mCAAmC,UAAU,EAAE;AAAA,QAC/D,OAAO;AACH,kBAAQ,KAAK,4BAA4B,OAAO,UAAU,EAAE;AAAA,QAChE;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ,OAAO;AACH,YAAQ,IAAI,oBAAoB;AAAA,EACpC;AAEA,MAAI,CAAC,QAAQ;AACT,YAAQ,IAAI,sCAAsC;AAClD,UAAM,EAAE,cAAc,qBAAqB,MAAM,OAAO,MAAM;AAC9D,WAAO,MAAM,iBAAiB,QAAQ,eAAe,aAAa,WAAW;AAC7E,YAAQ,IAAI;AAAA,EAAiC,KAAK,UAAU,SAAQ,MAAK,CAAC,CAAC,EAAE;AAC7E,sBAAkB,IAAI,oBAAoB,eAAe,IAAI;AAAA,EACjE,OAAO;AACH,YAAQ,IAAI,qCAAqC;AAGjD,UAAM,YAAYA,cAAK,KAAK,aAAa,YAAY,MAAM,aAAa,SAAS;AACjF,QAAI,eAAe,SAAS,GAAG;AAC3B,UAAI,IAAI,KAAK,QAAQ,OAAO,SAAS,CAAC;AACtC,cAAQ,IAAI,6BAA6B,SAAS,OAAO;AAAA,IAC7D,OAAO;AACH,cAAQ,IAAI,2CAA2C,SAAS,yCAAyC;AAAA,IAC7G;AAIA,UAAM,gBAAgB,IAAI,aAAa,aAAa;AACpD,QAAI,IAAI,eAAe,QAAQ,OAAO,aAAa,CAAC;AACpD,YAAQ,IAAI,yBAAyB,aAAa,SAAS,aAAa,EAAE;AAE1E,sBAAkB,IAAI,oBAAoB,aAAa;AAAA,EAC3D;AAEA,QAAM,WAAW,MAAM,IAAI;AAAA,IACvB,aAAa;AAAA,IACb;AAAA,IACA;AAAA,EAAA,EACF,cAAA;AAEF,QAAM,eAAe,YAAY,MAAK,aAAa,UAAS,MAAM;AAClE,QAAM,gBAAgB,MAAM,qBAAqB,aAAa,aAAa;AAC3E,QAAM,YAAa,cAAc;AAIjC,QAAM,UAAU,IAAI,iBAAiB,eAAe;AACpD,QAAM,cAAc,IAAI,WAAW,OAAO;AAE1C,MAAI;AACJ,MAAI,aAAa,iBAAiB;AAC9B,qBAAiBA,cAAK,WAAW,aAAa,eAAe,IACvD,aAAa,kBACbA,cAAK,QAAQ,aAAa,YAAY,MAAM,aAAa,eAAe;AAAA,EAClF;AAEA,QAAM,qBAAqB,kBAAkB,MAAM,gBAAgB,aAAa;AAEhF,QAAM,UAAU,IAAI;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAa;AAAA,IACb;AAAA,IACA;AAAA,IACA,aAAa;AAAA,EAAA;AAIjB,QAAM,QAAQ,aAAa,WAAsB,QAAQ;AACzD,UAAQ,IAAI,mBAAmB;AAE/B,MAAI,CAAC,QAAQ;AACT,QAAI,IAAI,KAAK,WAAW;AAAA,EAC5B;AAEA,SAAO;AACX;AAIA,SAAS,YAAY,MAAY,UAAwB,QAA6B;AAClF,MAAI,aAAa,WAAW;AACxB,WAAO,IAAI,kBAAA;AAAA,EACf,WAAW,OAAO,aAAa,YAAY,CAAC,QAAQ;AAChD,WAAO,IAAI,eAAe,eAAe,MAAK,QAAQ,CAAC;AAAA,EAC3D,WAAW,OAAO,aAAa,YAAY,QAAQ;AAC/C,UAAM,OAAO,eAAe,MAAK,QAAQ;AACzC,UAAM,WAAWG,YAAG,aAAa,MAAM,MAAM;AAC7C,WAAO,IAAI,eAAe,QAAQ;AAAA,EACtC,WAAW,oBAAoB,gBAAgB;AAC3C,WAAO;AAAA,EACX,OAAK;AACD,UAAM,IAAI,MAAM,uBAAuB;AAAA,EAC3C;AACJ;AAIA,SAAS,eAAe,MAAY,UAA0B;AAC1D,MAAIH,cAAK,WAAW,QAAQ,GAAG;AAC3B,YAAQ,IAAI,8BAA8B,QAAQ,EAAE;AACpD,WAAO,QAAQ,MAAM,QAAQ;AAAA,EACjC,OAAO;AACH,YAAQ,IAAI,8BAA8B,QAAQ,EAAE;AACpD,WAAOA,cAAK,QAAQ,MAAM,QAAQ;AAAA,EAEtC;AACJ;AAGA,SAAS,QAAQ,MAAcA,OAAsB;AACjD,MAAI,KAAK,SAAS,GAAG,GAAG;AACpB,WAAO,KAAK,MAAM,GAAG,EAAE;AAAA,EAC3B;AACA,MAAIA,MAAK,WAAW,GAAG,GAAG;AACtBA,YAAOA,MAAK,MAAM,CAAC;AAAA,EACvB;AACA,SAAO,GAAG,IAAI,IAAIA,KAAI;AAC1B;"}
|
|
1
|
+
{"version":3,"file":"server.js","sources":["../src/routing/html_render/html_render.ts","../src/options/ServerOptions.ts","../src/routing/manifest/base.ts","../src/routing/server_adapter/api_adapter.ts","../src/routing/server_adapter/middleware_adapter.ts","../src/routing/server_adapter/server_adapter.ts","../src/routing/server_adapter/express_server_adapter.ts","../src/server/server.ts"],"sourcesContent":["import Handlebars from 'handlebars'\nimport fs from \"fs/promises\"\nimport { uneval } from 'devalue'\n\nconst default_template = `\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n {{{HEAD}}}\n <style>{{{CSS}}}</style>\n</head>\n<body>\n <div id=\"app\">{{{APP}}}</div>\n <script>window.__INITIAL_DATA__ = {{{DATA}}}</script>\n\n <script type=\"module\">\n import { createApp } from '/src/client/client.ts';\n document.addEventListener('DOMContentLoaded', () => {\n createApp('/components/');\n });\n </script>\n</body>\n</html>\n`\n\n\n\n\nexport interface IHTMLRender{\n renderHTML(data:any): Promise<string>\n getTemplate(): Promise<string>\n}\n\nexport class BaseHTMLRender implements IHTMLRender{\n constructor(private template:string = default_template) {\n\n }\n async getTemplate(): Promise<string> {\n return this.template\n }\n\n async renderHTML(data:any){\n const template = Handlebars.compile(await this.getTemplate())\n let html = template(data)\n \n // Inject window.__CONFIGURATION__ from environment variable\n const configJson = process.env.NOEGO_CONFIGURATION\n if (configJson) {\n try {\n // Parse and re-serialize with devalue to prevent XSS\n const configData = JSON.parse(configJson)\n const safeConfigJson = uneval(configData)\n const configScript = `<script>window.__CONFIGURATION__ = ${safeConfigJson};</script>`\n // Inject before closing </head> tag, or at the beginning of <body> if no </head>\n if (html.includes('</head>')) {\n html = html.replace('</head>', `${configScript}\\n</head>`)\n } else if (html.includes('<body')) {\n // Find the opening body tag and inject after it\n html = html.replace(/(<body[^>]*>)/, `$1\\n${configScript}`)\n } else {\n // Fallback: inject at the beginning\n html = configScript + '\\n' + html\n }\n } catch (e) {\n console.error('Failed to parse NOEGO_CONFIGURATION:', e)\n }\n }\n\n // Transform module script tags to automatically call default exports\n // Match: <script type=\"module\" src=\"/path/to/module.ts\"></script>\n html = html.replace(\n /<script\\s+type=[\"']module[\"']\\s+src=[\"']([^\"']+)[\"'][^>]*><\\/script>/gi,\n (_match, src) => {\n // Escape single quotes in src to prevent string breakout\n const safeSrc = src.replace(/'/g, \"\\\\'\")\n // Convert to inline script that imports and calls default export\n // Wait for DOMContentLoaded and configuration to be available\n return `<script type=\"module\">\nimport initApp from '${safeSrc}';\nfunction initializeApp() {\n if (typeof initApp === 'function' && typeof window !== 'undefined' && window.__CONFIGURATION__) {\n const result = initApp();\n if (result instanceof Promise) {\n result.catch(err => console.error('Failed to initialize app:', err));\n }\n } else {\n console.warn('App initialization skipped: initApp or window.__CONFIGURATION__ not available');\n }\n}\n// Wait for DOM to be ready\nif (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', initializeApp);\n} else {\n // DOM already loaded\n initializeApp();\n}\n</script>`\n }\n )\n \n return html\n }\n}\n\nexport class DefaultHTMLRender extends BaseHTMLRender{\n constructor() {\n super()\n }\n}\n\n\n\nexport class LiveHTMLRender implements IHTMLRender{\n constructor(private html_path:string) {\n }\n async renderHTML(data: any): Promise<string> {\n const template = Handlebars.compile(await this.getTemplate())\n let html = template(data)\n \n // Inject window.__CONFIGURATION__ from environment variable\n const configJson = process.env.NOEGO_CONFIGURATION\n if (configJson) {\n try {\n // Parse and re-serialize with devalue to prevent XSS\n const configData = JSON.parse(configJson)\n const safeConfigJson = uneval(configData)\n const configScript = `<script>window.__CONFIGURATION__ = ${safeConfigJson};</script>`\n // Inject before closing </head> tag, or at the beginning of <body> if no </head>\n if (html.includes('</head>')) {\n html = html.replace('</head>', `${configScript}\\n</head>`)\n } else if (html.includes('<body')) {\n // Find the opening body tag and inject after it\n html = html.replace(/(<body[^>]*>)/, `$1\\n${configScript}`)\n } else {\n // Fallback: inject at the beginning\n html = configScript + '\\n' + html\n }\n } catch (e) {\n console.error('Failed to parse NOEGO_CONFIGURATION:', e)\n }\n }\n\n // Transform module script tags to automatically call default exports\n // Match: <script type=\"module\" src=\"/path/to/module.ts\"></script>\n html = html.replace(\n /<script\\s+type=[\"']module[\"']\\s+src=[\"']([^\"']+)[\"'][^>]*><\\/script>/gi,\n (_match, src) => {\n // Escape single quotes in src to prevent string breakout\n const safeSrc = src.replace(/'/g, \"\\\\'\")\n // Convert to inline script that imports and calls default export\n // Wait for DOMContentLoaded and configuration to be available\n return `<script type=\"module\">\nimport initApp from '${safeSrc}';\nfunction initializeApp() {\n if (typeof initApp === 'function' && typeof window !== 'undefined' && window.__CONFIGURATION__) {\n const result = initApp();\n if (result instanceof Promise) {\n result.catch(err => console.error('Failed to initialize app:', err));\n }\n } else {\n console.warn('App initialization skipped: initApp or window.__CONFIGURATION__ not available');\n }\n}\n// Wait for DOM to be ready\nif (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', initializeApp);\n} else {\n // DOM already loaded\n initializeApp();\n}\n</script>`\n }\n )\n\n return html\n }\n async getTemplate(): Promise<string> {\n const file_content = await fs.readFile(this.html_path, 'utf8')\n return file_content\n }\n}","import path from 'path';\nimport type { IHTMLRender } from '../routing/html_render/html_render';\nimport type { ForgeAssets } from './assets';\nexport { assets } from './assets';\n\nexport type htmlRenderer = 'default' | string | IHTMLRender;\nexport type ContextBuilder = (req, res) => Record<string, any>;\n\nexport interface ServerOptions {\n development?: boolean;\n viteOptions?: any;\n component_dir?: string;\n build_dir?: string;\n renderer?: htmlRenderer;\n open_api_path?: string;\n manifest_path?: string;\n manifest_endpoint?: string;\n assets?: ForgeAssets;\n context_builder?: ContextBuilder;\n middleware_path?: string;\n}\n\nexport const defaultViteOptions: any = {\n appType: 'custom',\n root: process.cwd(),\n server: { middlewareMode: true },\n ssr: {\n noExternal: ['svelte', /^svelte\\/.*/]\n }\n};\n\nexport const defaultOptions: ServerOptions = {\n development: process.env.NODE_ENV !== 'production',\n viteOptions: defaultViteOptions,\n component_dir: '/',\n build_dir: 'dist_ssr',\n renderer: 'default',\n open_api_path: path.join(process.cwd(), 'openapi.yaml'),\n manifest_endpoint: '/manifest.json',\n middleware_path: undefined\n};\n","import { defaultOptions } from \"../../options/ServerOptions\";\nimport type { ServerOptions } from \"../../options/ServerOptions\";\nimport type { IRoute } from \"../../parser/IRoute\";\nimport { parse_openapi_config } from \"../../parser/openapi\";\nimport deepmerge from \"deepmerge\";\nimport type { IComponentLoader } from \"../component_loader/component_loader\";\nimport path from \"path\";\nimport fs from \"fs\";\nimport { pathToFileURL } from \"url\";\n\nexport class ManifestBuilder{\n private full_options: ServerOptions\n\n constructor(private openapi_path:string, private loader: IComponentLoader, private options:ServerOptions){\n this.full_options = deepmerge(defaultOptions,this.options)\n }\n\n\n async buildManifest(){\n\n const configuration = await parse_openapi_config(this.openapi_path)\n const component_path = this.full_options.component_dir\n if (!component_path) {\n throw new Error('Component path is not defined')\n }\n const routes = configuration.routes\n\n const manifest = await routes.reduce(async(acc,route)=>{\n return acc.then(async(acc)=>{\n const pattern = route.path\n const results = await requires_server(route,this.loader)\n acc[pattern] = results\n return acc\n })\n },Promise.resolve({}) as Promise<Record<string,boolean>>)\n\n return manifest\n\n }\n}\n\n\n\n\nasync function requires_server(route:IRoute,loader:IComponentLoader){\n // Check if route has middleware - middleware always requires server processing\n const has_middleware = route.middleware && route.middleware.length > 0;\n\n // Check if route or layouts have loaders\n const has_loaders = await layout_requires_server(route,loader) || await view_requires_server(route,loader);\n\n const requires_server = has_middleware || has_loaders;\n\n console.log('[MANIFEST]', route.path, {\n has_middleware,\n middleware: route.middleware,\n has_loaders,\n requires_server\n });\n\n return requires_server;\n}\n\n\nasync function layout_requires_server(route:IRoute,loader:IComponentLoader){\n const layout = route.layout\n if (!layout) {\n return false\n }\n const load_required = await Promise.all(layout.map(async (layoutPath) => {\n // Check for .load.js first (production), then .load.ts (development)\n const fullPath = loader.getComponentFullPath(layoutPath);\n const { dir, name } = path.parse(fullPath);\n const extensions: Array<'.js' | '.ts'> = ['.js', '.ts'];\n \n for (const ext of extensions) {\n const loaderFilePath = path.join(dir, `${name}.load${ext}`);\n \n try {\n if (fs.existsSync(loaderFilePath)) {\n const module = await import(pathToFileURL(loaderFilePath).href);\n if (typeof module?.default === \"function\") {\n return true;\n }\n }\n } catch (error) {\n // Continue to next extension or fallback\n }\n }\n \n // Fall back to old-style component.load (backward compatibility)\n try {\n const component = await loader.load(layoutPath);\n return !!component.load;\n } catch {\n return false;\n }\n }))\n\n return load_required.some((required:boolean)=>required)\n}\n\nasync function view_requires_server(route:IRoute,loader:IComponentLoader){\n const view = route.view\n if (!view) {\n return false\n }\n // Check for .load.js first (production), then .load.ts (development)\n const fullPath = loader.getComponentFullPath(view);\n const { dir, name } = path.parse(fullPath);\n const extensions: Array<'.js' | '.ts'> = ['.js', '.ts'];\n \n for (const ext of extensions) {\n const loaderFilePath = path.join(dir, `${name}.load${ext}`);\n \n try {\n if (fs.existsSync(loaderFilePath)) {\n const module = await import(pathToFileURL(loaderFilePath).href);\n if (typeof module?.default === \"function\") {\n return true;\n }\n }\n } catch (error) {\n // Continue to next extension or fallback\n }\n }\n \n // Fall back to old-style component.load (backward compatibility)\n try {\n const component = await loader.load(view);\n return !!component.load;\n } catch {\n return false;\n }\n}\n\n\n","import type { IRoute } from \"../../parser/IRoute\";\nimport { ComponentManager } from \"../component_loader/component_manager\";\n\n\nexport interface RequestData{\n url:string\n query: Record<string, any>;\n params?: Partial<Record<string, string | string[]>> | null;\n headers: Record<string, any>;\n body: Record<string, any>;\n context: Record<string, any>;\n}\n\n\nexport class ApiAdapter{\n\n constructor(\n private manager: ComponentManager,\n\n ){\n\n }\n\n\n async getApiData(route:IRoute,request_data:RequestData){\n \n const view = await this.manager.getViewComponent(route)\n\n //All Data Loaders\n const layout_loaders = await this.manager.getLayoutLoaders(route)\n const loader = view.load\n\n\n\n //All Loaders Read from view.\n\n let layout_data = [] as any[]\n let view_data:any = {}\n\n\n if(layout_loaders.some(loader => !!loader)){\n console.log('Layout API Calls')\n layout_data = await Promise.all(layout_loaders.map(async (layout_loader) => {\n if (!layout_loader) {\n return {}\n }\n const data = await layout_loader(request_data)\n return data\n }))\n }\n\n if(loader){\n view_data = await loader(request_data)\n }\n\n let server_data = {\n layout:layout_data,\n view:view_data,\n }\n\n return this.mergeLoaderData(route, request_data, server_data)\n }\n\n\n async getFallbackData(route:IRoute,request_data:RequestData){\n \n const view = await this.manager.getViewComponent(route)\n const layout_loaders = await this.manager.getLayoutLoaders(route)\n\n const loader = view.load\n\n let layout_data = [] as any[]\n let view_data:any = {}\n\n\n if(layout_loaders.some(loader => !!loader)){\n console.log('Layout API Calls')\n layout_data = await Promise.all(layout_loaders.map(async (layout_loader) => {\n if (!layout_loader) {\n return {}\n }\n const data = await layout_loader(request_data)\n return data\n }))\n }\n\n if(loader){\n view_data = await loader(request_data)\n }\n\n let server_data = {\n layout:layout_data,\n view:view_data,\n }\n\n return this.mergeLoaderData(route, request_data, server_data)\n }\n\n\n private async mergeLoaderData(route: IRoute, request_data: RequestData, server_data: ServerData): Promise<ServerData> {\n if (!await this.manager.hasLoaders(route)) {\n return server_data;\n }\n\n const loaders = await this.manager.getLoaders(route);\n\n const layoutLoaderResults = await Promise.all(\n loaders.layouts.map(async (loader): Promise<Record<string, any> | null> => {\n if (!loader) {\n return null;\n }\n const data = await loader(request_data);\n return data ?? null;\n })\n );\n\n const baseLayoutData = server_data.layout || [];\n const maxLayouts = Math.max(baseLayoutData.length, layoutLoaderResults.length);\n const mergedLayouts = Array.from({ length: maxLayouts }, (_, index) => {\n const baseLayoutEntry = baseLayoutData[index];\n const loaderResult = layoutLoaderResults[index];\n\n if (!loaderResult) {\n return baseLayoutEntry;\n }\n\n if (baseLayoutEntry && typeof baseLayoutEntry === 'object') {\n return { ...baseLayoutEntry, ...loaderResult };\n }\n\n return loaderResult;\n });\n\n const viewLoaderResult = loaders.view ? await loaders.view(request_data) : null;\n let mergedView = server_data.view;\n if (viewLoaderResult) {\n if (mergedView && typeof mergedView === 'object') {\n mergedView = { ...mergedView, ...viewLoaderResult };\n } else {\n mergedView = viewLoaderResult;\n }\n }\n\n return {\n layout: mergedLayouts,\n view: mergedView\n };\n }\n}\n\n\ntype ServerData = {\n layout: any[];\n view: any;\n}\n","import type { Request, Response, NextFunction } from 'express';\nimport fs from 'fs';\nimport path from 'path';\nimport { pathToFileURL } from 'url';\n\nexport type MiddlewareFunction = (req: Request, res: Response, next: NextFunction) => void;\n\ninterface MiddlewareResolutionResult {\n functions: MiddlewareFunction[];\n errors: string[];\n}\n\nconst EXTENSION_CANDIDATES = ['.js', '.mjs', '.cjs', '.ts', '.tsx'];\n\nexport class MiddlewareAdapter {\n private cache: Map<string, MiddlewareFunction[]> = new Map();\n\n constructor(\n private middlewarePath?: string,\n private fallbackPath?: string\n ) {}\n\n static build(middlewarePath?: string, fallbackPath?: string) {\n return new MiddlewareAdapter(middlewarePath, fallbackPath);\n }\n\n async handleMiddleware(req: Request, res: Response, middlewareConfig: string[] = []): Promise<void> {\n if (!Array.isArray(middlewareConfig) || middlewareConfig.length === 0) {\n return;\n }\n\n const resolution = await this.resolveMiddlewareFunctions(middlewareConfig);\n\n console.log(resolution)\n if (resolution.errors.length > 0) {\n throw new Error(`Middleware resolution failed: ${resolution.errors.join(', ')}`);\n }\n\n for (const middleware of resolution.functions) {\n await this.executeMiddleware(middleware, req, res);\n if (res.headersSent) {\n break;\n }\n }\n }\n\n private async resolveMiddlewareFunctions(middlewareConfig: string[]): Promise<MiddlewareResolutionResult> {\n const functions: MiddlewareFunction[] = [];\n const errors: string[] = [];\n\n for (const spec of middlewareConfig) {\n if (!spec) {\n continue;\n }\n try {\n let resolved = this.cache.get(spec);\n if (!resolved) {\n resolved = await this.resolveMiddlewareSpec(spec);\n this.cache.set(spec, [...resolved]);\n }\n functions.push(...resolved);\n } catch (error) {\n errors.push(`${spec}: ${(error as Error).message}`);\n }\n }\n\n return {\n functions: this.dedupe(functions),\n errors\n };\n }\n\n private async resolveMiddlewareSpec(spec: string): Promise<MiddlewareFunction[]> {\n const [filePath, selector] = this.parseMiddlewareSpec(spec);\n const fullPath = this.resolveMiddlewareFilePath(filePath);\n const module = await this.importMiddlewareModule(fullPath, spec);\n return this.extractMiddlewareFunctions(module, selector, spec);\n }\n\n private parseMiddlewareSpec(spec: string): [string, string | undefined] {\n const colonIndex = spec.indexOf(':');\n if (colonIndex === -1) {\n return [spec, undefined];\n }\n return [spec.substring(0, colonIndex), spec.substring(colonIndex + 1)];\n }\n\n private resolveMiddlewareFilePath(filePath: string): string {\n const basePath = this.middlewarePath || this.fallbackPath || process.cwd();\n const transformed = this.middlewareFileTransform(filePath);\n const baseCandidate = path.resolve(process.cwd(), path.join(basePath, transformed));\n\n const resolvedWithExt = this.findExistingFile(baseCandidate);\n if (resolvedWithExt) {\n return resolvedWithExt;\n }\n\n throw new Error(`Middleware file not found: ${transformed}`);\n }\n\n private middlewareFileTransform(filePath: string): string {\n return filePath.split('.').join(path.sep);\n }\n\n private findExistingFile(basePathWithoutExt: string): string | null {\n const ext = path.extname(basePathWithoutExt);\n if (ext) {\n return fs.existsSync(basePathWithoutExt) ? basePathWithoutExt : null;\n }\n\n const directCandidates = EXTENSION_CANDIDATES.map(extCandidate => `${basePathWithoutExt}${extCandidate}`);\n for (const candidate of directCandidates) {\n if (fs.existsSync(candidate)) {\n return candidate;\n }\n }\n\n const indexCandidates = EXTENSION_CANDIDATES.map(extCandidate => path.join(basePathWithoutExt, `index${extCandidate}`));\n for (const candidate of indexCandidates) {\n if (fs.existsSync(candidate)) {\n return candidate;\n }\n }\n\n return null;\n }\n\n private async importMiddlewareModule(fullPath: string, spec: string): Promise<any> {\n try {\n const url = pathToFileURL(fullPath).href;\n return await import(url);\n } catch (error) {\n throw new Error(`Unable to import middleware '${spec}' from ${fullPath}`);\n }\n }\n\n private extractMiddlewareFunctions(module: any, selector: string | undefined, spec: string): MiddlewareFunction[] {\n if (!selector) {\n return this.extractDefaultFunction(module, spec);\n }\n\n if (selector === '*') {\n return this.extractAllFunctions(module, spec);\n }\n\n return this.extractSpecificFunctions(module, selector, spec);\n }\n\n private extractDefaultFunction(module: any, spec: string): MiddlewareFunction[] {\n if (!module?.default) {\n throw new Error(`Middleware '${spec}' is missing a default export`);\n }\n if (typeof module.default !== 'function') {\n throw new Error(`Default export for middleware '${spec}' is not a function`);\n }\n return [module.default];\n }\n\n private extractAllFunctions(module: any, spec: string): MiddlewareFunction[] {\n const functions = Object.values(module).filter((value): value is MiddlewareFunction => typeof value === 'function');\n if (functions.length === 0) {\n throw new Error(`No functions exported by middleware '${spec}'`);\n }\n return functions;\n }\n\n private extractSpecificFunctions(module: any, selector: string, spec: string): MiddlewareFunction[] {\n const names = selector.split(',').map(name => name.trim()).filter(Boolean);\n const functions: MiddlewareFunction[] = [];\n const missing: string[] = [];\n const invalid: string[] = [];\n\n for (const name of names) {\n const value = name === 'default' ? module?.default : module?.[name];\n if (value === undefined) {\n missing.push(name);\n continue;\n }\n // Middleware must be a function with 2-4 params (req, res, next) or (err, req, res, next)\n if (typeof value !== 'function' || value.length < 2) {\n invalid.push(name);\n continue;\n }\n functions.push(value);\n }\n\n if (missing.length) {\n throw new Error(`Middleware '${spec}' is missing export(s): ${missing.join(', ')}`);\n }\n if (invalid.length) {\n throw new Error(`Middleware '${spec}' export(s) not functions: ${invalid.join(', ')}`);\n }\n\n if (functions.length === 0) {\n throw new Error(`Middleware '${spec}' did not resolve any functions for selector '${selector}'`);\n }\n\n return functions;\n }\n\n private executeMiddleware(fn: MiddlewareFunction, req: Request, res: Response): Promise<void> {\n return new Promise((resolve, reject) => {\n try {\n fn(req, res, (error?: unknown) => {\n if (error) {\n reject(error);\n return;\n }\n resolve();\n });\n } catch (error) {\n reject(error);\n }\n });\n }\n\n private dedupe(functions: MiddlewareFunction[]): MiddlewareFunction[] {\n const seen = new Set<MiddlewareFunction>();\n const ordered: MiddlewareFunction[] = [];\n for (const fn of functions) {\n if (!seen.has(fn)) {\n seen.add(fn);\n ordered.push(fn);\n }\n }\n return ordered;\n }\n}\n","import type { IRoute, IServerRoute } from '../../parser/IRoute'\n\n\n\n\n\n\nexport abstract class ServerAdapter {\n abstract handleRoutes(routes: IRoute[], server_routes: IServerRoute): Promise<void>\n}\n\n","import { render } from \"svelte/server\"\nimport path from \"path\"\nimport { uneval } from \"devalue\"\nimport type { IRoute, IServerRoute } from \"../../parser/IRoute\"\nimport { ComponentManager } from \"../component_loader/component_manager\"\nimport type { IHTMLRender } from \"../html_render/html_render\"\nimport { initialize_route_matchers } from \"../url_parser\"\nimport type { UrlMatcher } from \"../url_parser\"\nimport { ApiAdapter } from \"./api_adapter\"\nimport type { RequestData } from \"./api_adapter\"\nimport { MiddlewareAdapter } from \"./middleware_adapter\"\nimport { ServerAdapter } from \"./server_adapter\"\nimport express from \"express\"\nimport type { Request, Response } from \"express\"\nimport type { IPage } from \"../page\"\nimport { ContextBuilder } from \"../../options/ServerOptions\"\n\n\n\nexport class ExpressServerAdapter extends ServerAdapter {\n private clientRoutes: IRoute[] = [];\n\n constructor(\n private server: ReturnType<typeof express>,\n private manager: ComponentManager,\n private htmlRender: IHTMLRender,\n private api_adapter: ApiAdapter,\n private middleware_adapter: MiddlewareAdapter,\n private context_builder?: ContextBuilder,\n private isProd: boolean = false,\n private isBuiltEnvironment: boolean = false,\n private componentDir?: string\n ) {\n super()\n }\n\n private getDevViteClientScriptTag(): string {\n if (this.isProd || this.isBuiltEnvironment) {\n return '';\n }\n return `<script type=\"module\">if (import.meta?.env?.DEV) { import('/@vite/client').catch(() => {}) }</script>\\n`;\n }\n\n private async loadApplicationRenderer(componentRoot: string) {\n if (!this.isProd) {\n const mod = await import('#recursive-render');\n return mod.default ?? mod;\n }\n // In production, use the precompiled renderer shipped alongside compiled components\n const candidates = [\n path.join(componentRoot, 'RecursiveRender.js'),\n path.join(componentRoot, 'ssr', 'RecursiveRender.js'),\n ];\n let lastError: any;\n for (const fp of candidates) {\n try {\n const mod = await import(fp);\n return (mod as any).default ?? mod;\n } catch (e) {\n lastError = e;\n }\n }\n throw lastError ?? new Error('Unable to locate precompiled RecursiveRender.js');\n }\n\n private transformRoutesForClient(routes: IRoute[]): IRoute[] {\n if (!this.isProd) return routes;\n console.log(`[transformRoutesForClient] Transforming ${routes.length} routes for production`);\n const transformed = routes.map(route => ({\n ...route,\n layout: route.layout?.map(path => path.replace(/\\.svelte$/, '.js')),\n view: route.view?.replace(/\\.svelte$/, '.js')\n }));\n console.log(`[transformRoutesForClient] First route view transformed: ${routes[0]?.view} → ${transformed[0]?.view}`);\n return transformed;\n }\n\n async handleRoutes(routes: IRoute[], manifest: any): Promise<void> {\n // Transform routes for SSR in production mode and cache for client\n const transformedRoutes = this.transformRoutesForClient(routes);\n this.clientRoutes = transformedRoutes; // Cache for HTML rendering\n const matchers = initialize_route_matchers(transformedRoutes)\n\n this.server.use((req: Request, res: Response, next: any) => {\n\n (async () => {\n if (res.headersSent) {\n return\n }\n const method = req.method.toLowerCase()\n const fullUrl = req.url || '/'\n const path = fullUrl.split('?')[0] // Strip query parameters for route matching\n\n\n const not_found = async () => {\n next()\n }\n\n const matcher = matchers.find(m => m.parser(path))\n if (!matcher) {\n await not_found()\n return\n }\n const route_options = transformedRoutes.filter(r => r.path === matcher.pattern)\n const route = route_options.find(r => r.method.toLowerCase() === method)\n if (!route) {\n await not_found()\n return\n }\n\n await this.handleResponse(fullUrl, matcher, route, transformedRoutes, manifest, req, res).catch(e => {\n res.status(500).send(`\n <h1>500 Internal Server Error</h1>\n <pre>${e}</pre>\n `)\n })\n })()\n\n return;\n\n })\n }\n protected async handleResponse(url: string, matcher: UrlMatcher, route: IRoute, routes: IRoute[], manifest, req: Request, res: Response) {\n let accepts: string = req.headers.accept || ''\n let server_api_call = accepts.toLowerCase().includes('application/json')\n\n if (res.headersSent) {\n return\n }\n\n const context = {}\n if (this.context_builder) {\n const built_context = await this.context_builder(req, res)\n Object.assign(context, built_context)\n }\n req['context'] = context\n\n // Extract path parameters from the clean path (without query params)\n const cleanPath = url.split('?')[0];\n const pathParams = matcher.parser(cleanPath);\n\n // Combine path parameters with query parameters (convert query types)\n const queryParams: Record<string, string | string[]> = {};\n for (const [key, value] of Object.entries(req.query)) {\n if (typeof value === 'string') {\n queryParams[key] = value;\n } else if (Array.isArray(value)) {\n // Convert array elements to strings\n queryParams[key] = value.map(v => typeof v === 'string' ? v : String(v));\n } else if (value !== undefined) {\n queryParams[key] = String(value);\n }\n }\n const combinedParams = { ...pathParams, ...queryParams };\n\n let request_data: RequestData = {\n url,\n query: req.query,\n params: combinedParams,\n headers: req.headers,\n body: req.body,\n context\n };\n\n /**\n * Middleware\n */\n console.log('[SERVER] Handling request', req.url, {\n middleware: route.middleware,\n accept: req.headers.accept,\n route_path: route.path,\n server_api_call\n });\n try {\n await this.middleware_adapter.handleMiddleware(req, res, route.middleware || [])\n console.log('[SERVER] Middleware complete', {\n headersSent: res.headersSent,\n statusCode: res.statusCode\n });\n } catch (e) {\n console.log('Error in middleware', e)\n res.status(500).send(`\n <h1>500 Internal Server Error</h1>\n <pre>${e}</pre>\n <pre>Stack Trace:\\n${e.stack}</pre>\n `)\n return\n }\n\n // Check if middleware already sent a response (e.g., redirect, auth failure)\n if (res.headersSent) {\n console.log('[SERVER] Headers already sent by middleware, returning early');\n return;\n }\n\n let server_data: any;\n try {\n server_data = await this.api_adapter.getApiData(route, request_data)\n } catch (e: any) {\n const errorMessage = e?.message || String(e);\n const errorStack = e?.stack || '';\n console.error(`[SERVER] Data loader error for route ${route.path} (${route.method}):`, {\n error: errorMessage,\n route: route.path,\n method: route.method,\n url: url,\n view: route.view,\n layouts: route.layout,\n });\n console.error('[SERVER] Data loader stack trace:', errorStack);\n\n if (server_api_call) {\n res\n .status(500)\n .header('Cache-Control', 'no-store, no-cache, must-revalidate, proxy-revalidate')\n .header('Pragma', 'no-cache')\n .header('Expires', '0')\n .type('application/json')\n .send({\n error: 'Data loader failed',\n message: errorMessage,\n route: route.path,\n });\n return;\n }\n\n res.status(500).send(`\n <h1>500 Internal Server Error</h1>\n <h2>Data Loader Failed</h2>\n <p><strong>Route:</strong> ${route.path} (${route.method})</p>\n <p><strong>View:</strong> ${route.view || 'N/A'}</p>\n <p><strong>Layouts:</strong> ${route.layout?.join(', ') || 'None'}</p>\n <pre>${errorMessage}</pre>\n <pre>Stack Trace:\\n${errorStack}</pre>\n `);\n return;\n }\n\n if (server_api_call) {\n /**\n * Early return if the request is an API call\n */\n res\n .header('Cache-Control', 'no-store, no-cache, must-revalidate, proxy-revalidate')\n .header('Pragma', 'no-cache')\n .header('Expires', '0')\n .type('application/json')\n .send(server_data);\n return;\n }\n let layouts: any[];\n let view: any;\n\n try {\n layouts = await this.manager.getLayouts(route)\n view = await this.manager.getView(route)\n } catch (e: any) {\n console.log('Error getting view', e)\n res.status(500).send(`\n <h1>500 Internal Server Error</h1>\n <pre>${e}</pre>\n <pre>Stack Trace:\\n${e.stack}</pre>\n `)\n return\n }\n\n\n /**\n * Render HTML page\n */\n let html_render = ''\n let response_code = 200\n const devClientScript = this.getDevViteClientScriptTag();\n try {\n let page: IPage = {\n url: request_data.url,\n pathname: request_data.url.split('?')[0],\n params: request_data.params || {} as any,\n query: request_data.query,\n }\n /**\n * Render application components\n */\n console.log('[SSR DEBUG] layouts:', layouts.map(l => typeof l), 'view:', typeof view);\n const loader: any = (this as any).manager?.[\"componentLoader\"] || {};\n const componentRoot = loader[\"base_path\"] || loader[\"basePath\"] || \"\";\n const applicationRenderer: any = await this.loadApplicationRenderer(componentRoot);\n console.log('[SSR DEBUG] applicationRenderer:', typeof applicationRenderer);\n const { head: head_render, html: renderedHtml, css }\n = render(applicationRenderer, {\n props: {\n layouts,\n view,\n data: server_data,\n params: request_data.params,\n urlParams: pathParams,\n query: request_data.query,\n page\n } as any\n }) as any\n // In Svelte 5, render() returns 'html' instead of 'body'\n const body_render = renderedHtml;\n console.log('[SSR DEBUG] render result - body length:', body_render?.length || 0);\n\n // Client loads from '/assets' (Vite-bundled) while SSR loads from component_dir.\n // In production, derive a client component base from SSR path by extracting the suffix after '/ssr/'.\n // Examples:\n // - componentDir='.app/ssr/components' => '/assets/components'\n // - componentDir='.app/ssr/my/framework/component' => '/assets/my/framework/component'\n // - componentDir='ui' (no ssr segment) => '/assets'\n const deriveClientBase = (dir: string): string => {\n try {\n const norm = String(dir || '').replace(/\\\\/g, '/');\n const marker = '/ssr/';\n const idx = norm.indexOf(marker);\n if (idx >= 0) {\n const suffix = norm.slice(idx + marker.length).replace(/^\\/+/, '');\n return suffix ? `/assets/${suffix}` : '/assets';\n }\n // Heuristics: if path contains a common components/pages segment, use it as suffix\n for (const hint of ['/components', '/pages']) {\n const hIdx = norm.indexOf(hint);\n if (hIdx >= 0) {\n const suffix = norm.slice(hIdx + 1).replace(/^\\/+/, '');\n return suffix ? `/assets/${suffix}` : '/assets';\n }\n }\n } catch {}\n return '/assets';\n };\n const clientComponentDir = this.isProd\n ? deriveClientBase(this.componentDir || '')\n : (this.componentDir || '/assets');\n\n const head_routing = `\n <script type='text/javascript'>\n window.__ROUTING__ = ${uneval(this.clientRoutes)}\n </script>\n\n <script type='text/javascript'>\n window.__MANIFEST__ = ${uneval(manifest)}\n console.log('[MANIFEST INJECTED]', window.__MANIFEST__);\n </script>\n\n <script type='text/javascript'>\n window.__INITIAL_DATA__ = ${uneval(server_data || {})}\n </script>\n\n <script type='text/javascript'>\n window.__COMPONENT_DIR__ = ${uneval(clientComponentDir)}\n </script>\n `\n console.log('[SSR DEBUG] About to render HTML with APP length:', body_render?.length || 0);\n html_render = await this.htmlRender.renderHTML({\n HEAD: devClientScript + head_routing + (head_render || ''),\n CSS: css,\n APP: body_render\n })\n console.log('[SSR DEBUG] Final HTML length:', html_render?.length || 0, 'contains APP div:', html_render?.includes('<div id=\"app\">'));\n\n } catch (e) {\n response_code = 500\n const new_body = (\n `<pre>Error rendering HTML:\\n${e}` +\n (route.layout?.length ? `layouts: ${route.layout?.join(',\\n')}` : '') +\n `\\nview: ${route.view}` +\n `</pre>`\n )\n\n html_render = await this.htmlRender.renderHTML({\n HEAD: devClientScript,\n APP: new_body,\n // DATA: JSON.stringify({})\n })\n }\n\n\n\n /**\n * Send HTML response\n */\n\n res.setHeader('Content-Type', 'text/html; charset=utf-8')\n res.status(response_code)\n res.end(html_render)\n\n }\n\n\n protected async handleFallback(req: Request, res: Response, server_config: IServerRoute) {\n if (res.headersSent) {\n console.log('Reply already sent')\n return\n }\n let route: any = server_config.fallback\n let accepts: string = req.headers.accept || ''\n let server_api_call = accepts.toLowerCase().includes('application/json')\n\n const url = req.url || '/'\n const context = {}\n\n let fallback_data = {\n url,\n query: req.query,\n params: {},\n headers: req.headers,\n body: req.body,\n context\n }\n\n let request_data = fallback_data as RequestData\n\n\n /**\n * Middleware\n */\n try {\n await this.middleware_adapter.handleMiddleware(req, res, route.middleware || [])\n } catch (e) {\n console.log('Error in fallback middleware', e)\n res.status(500).send(`\n <h1>500 Internal Server Error</h1>\n <pre>${e}</pre>\n `)\n return\n }\n\n console.log('Completed fallback middleware')\n\n\n\n\n\n\n\n let server_data: any;\n try {\n server_data = await this.api_adapter.getApiData(route, request_data)\n } catch (e: any) {\n const errorMessage = e?.message || String(e);\n const errorStack = e?.stack || '';\n console.error(`[SERVER] Fallback data loader error:`, {\n error: errorMessage,\n url: url,\n view: route.view,\n layouts: route.layout,\n });\n console.error('[SERVER] Fallback data loader stack trace:', errorStack);\n\n if (server_api_call) {\n res\n .status(500)\n .header('Cache-Control', 'no-store, no-cache, must-revalidate, proxy-revalidate')\n .header('Pragma', 'no-cache')\n .header('Expires', '0')\n .type('application/json')\n .send({\n error: 'Fallback data loader failed',\n message: errorMessage,\n });\n return;\n }\n\n res.status(500).send(`\n <h1>500 Internal Server Error</h1>\n <h2>Fallback Data Loader Failed</h2>\n <p><strong>View:</strong> ${route.view || 'N/A'}</p>\n <p><strong>Layouts:</strong> ${route.layout?.join(', ') || 'None'}</p>\n <pre>${errorMessage}</pre>\n <pre>Stack Trace:\\n${errorStack}</pre>\n `);\n return;\n }\n\n console.log('Completed fallback API call')\n if (server_api_call) {\n /**\n * Early return if the request is an API call\n */\n\n console.log('Fallback API call')\n res\n .header('Cache-Control', 'no-store, no-cache, must-revalidate, proxy-revalidate')\n .header('Pragma', 'no-cache')\n .header('Expires', '0')\n .type('application/json')\n .status(404)\n .send(server_data);\n return;\n }\n\n const layouts = await this.manager.getLayouts(route)\n const view = await this.manager.getView(route)\n\n console.log('Fallback view', view)\n console.log('Fallback layouts', layouts)\n\n\n\n /**\n * Render application components\n */\n const loader: any = (this as any).manager?.[\"componentLoader\"] || {};\n const componentRoot = loader[\"base_path\"] || loader[\"basePath\"] || \"\";\n const applicationRenderer: any = await this.loadApplicationRenderer(componentRoot);\n let { head: head_render, html, css }\n = render(applicationRenderer, {\n props: {\n layouts,\n view,\n data: server_data,\n params: request_data.params\n }\n }) as any\n // In Svelte 5, render() returns 'html' instead of 'body'\n const body_render = html;\n\n\n /**\n * Render HTML page\n */\n const devClientScript = this.getDevViteClientScriptTag();\n\n const html_render = await this.htmlRender.renderHTML({\n HEAD: devClientScript + (head_render || ''),\n CSS: css,\n APP: body_render\n })\n\n /**\n * Send HTML response\n */\n res\n .type('text/html')\n .status(404)\n .send(html_render)\n\n }\n}\n","\n\nimport express from 'express';\nimport path from 'path';\nimport fs from 'fs';\n\nimport deepmerge from 'deepmerge';\n\nimport { ViteComponentLoader, ProdComponentLoader } from '../routing/component_loader/component_loader'; \nimport { DefaultHTMLRender,LiveHTMLRender, BaseHTMLRender } from '../routing/html_render/html_render'; \nimport type { IHTMLRender } from '../routing/html_render/html_render';\nimport { parse_openapi_config } from '../parser/openapi';\nimport type { IRoute } from '../parser/IRoute';\nimport { defaultOptions } from '../options/ServerOptions';\nimport type { htmlRenderer, ServerOptions } from '../options/ServerOptions';\nimport type { AssetEntry } from '../options/assets';\nimport { ManifestBuilder } from '../routing/manifest/base';\nimport { ApiAdapter } from '../routing/server_adapter/api_adapter';\nimport { ComponentManager } from '../routing/component_loader/component_manager';\nimport { MiddlewareAdapter } from '../routing/server_adapter/middleware_adapter';\nimport { ExpressServerAdapter } from '../routing/server_adapter/express_server_adapter';\nexport type { ServerOptions } from '../options/ServerOptions';\n\n\nfunction pathExistsSync(p: string): boolean {\n try { return fs.existsSync(p); } catch { return false; }\n}\n\nfunction isDistRoot(dir: string): boolean {\n // Heuristics that indicate app dist root\n return (\n pathExistsSync(path.join(dir, 'index.js')) ||\n pathExistsSync(path.join(dir, '.app')) ||\n pathExistsSync(path.join(dir, 'server')) ||\n pathExistsSync(path.join(dir, 'ui'))\n );\n}\n\nfunction resolveRuntimeRoot(candidate?: string): string {\n // 1) Explicit env override\n const envRoot = process.env.FORGE_ROOT;\n if (envRoot && path.isAbsolute(envRoot) && pathExistsSync(envRoot)) {\n return path.normalize(envRoot);\n }\n // 2) Explicit viteOptions.root when absolute\n if (candidate && path.isAbsolute(candidate) && pathExistsSync(candidate)) {\n return path.normalize(candidate);\n }\n // 3) Use the directory of the entry script if available (e.g., dist/index.js)\n const entry = process.argv?.[1];\n if (entry) {\n const entryDir = path.dirname(path.resolve(entry));\n if (pathExistsSync(entryDir)) return entryDir;\n }\n // 4) Dev/serve fallback: use current working directory (App serve sets cwd to --root)\n return process.cwd();\n}\n\nexport async function createServer(app: import('express').Express, options?: ServerOptions): Promise<express.Express> {\n options = options || defaultOptions;\n const full_options = deepmerge(defaultOptions, options);\n const root = resolveRuntimeRoot(full_options.viteOptions?.root);\n full_options.viteOptions.root = root;\n\n full_options.open_api_path = ensureFullPath(full_options.viteOptions.root, full_options.open_api_path);\n\n const COMPONENT_DIR = !full_options.component_dir ? root : path.join(root, full_options.component_dir);\n\n // Auto-detect production mode: use FORGE_BUILT env var set by no_ego.js bootstrap\n // This allows staging, qa, etc. to use precompiled components regardless of NODE_ENV\n const isBuiltEnvironment = process.env.FORGE_BUILT === 'true';\n const isProd = isBuiltEnvironment || full_options.development === false;\n\n console.log(`Running in ${isProd ? 'production' : 'development'} mode (built environment: ${isBuiltEnvironment}, development flag: ${full_options.development}, NODE_ENV: ${process.env.NODE_ENV})`);\n let componentLoader;\n let vite;\n\n console.log(`Serving components from ${COMPONENT_DIR}`);\n\n // Resolve assets relative to the renderer directory for consistency\n // const rendererFullPath = (typeof full_options.renderer === 'string' && full_options.renderer !== 'default')\n // ? ensureFullPath(root, full_options.renderer)\n // : ensureFullPath(root, 'index.html');\n // const rendererDir = path.dirname(rendererFullPath);\n const resolveAssetRoot = (entry: AssetEntry): AssetEntry => {\n if (typeof entry === 'function') {\n return entry;\n }\n if (!entry || typeof entry !== 'string') return root;\n // Normalize both '/images' and 'images' to the same\n const cleaned = entry.replace(/^\\/+/, '');\n // Always resolve relative to project root (dist in prod)\n return path.resolve(root, cleaned);\n };\n\n if (full_options.assets) {\n for (const [asset_path, asset_dir] of Object.entries(full_options.assets)){\n for (const asset of asset_dir) {\n const asset_root = resolveAssetRoot(asset);\n if(typeof asset_root === 'string'){\n app.use(asset_path,express.static(asset_root))\n console.log(`Serving assets from ${asset_root} at ${asset_path}`);\n }else if (typeof asset_root === 'function'){\n app.use(asset_path,asset_root)\n console.log(`Serving assets from function at ${asset_path}`);\n } else {\n console.warn(`Invalid asset root type: ${typeof asset_root}`);\n }\n }\n }\n } else {\n console.log(`No assets to serve`);\n }\n\n if (!isProd) {\n console.log('Starting Vite in development mode...');\n const { createServer: createViteServer } = await import('vite');\n vite = await createViteServer(options.viteOptions || full_options.viteOptions);\n console.log(`Vite server created options \\n${JSON.stringify(options,null,2)}`);\n componentLoader = new ViteComponentLoader(COMPONENT_DIR, vite);\n } else {\n console.log('Starting Vite in production mode...');\n // Only serve static files if build_dir exists (traditional builds)\n // NoEgo-based builds use asset configuration instead\n const staticDir = path.join(full_options.viteOptions.root, full_options.build_dir);\n if (pathExistsSync(staticDir)) {\n app.use('/', express.static(staticDir));\n console.log(`Serving static files from ${staticDir} at /`);\n } else {\n console.log(`Skipping static file serving (build_dir ${staticDir} not found - using asset configuration)`);\n }\n\n // Serve component directory for client-side component loading\n // Use configured component_dir (e.g., 'ui') as both the directory and URL path\n const componentPath = `/${full_options.component_dir}`;\n app.use(componentPath, express.static(COMPONENT_DIR));\n console.log(`Serving components at ${componentPath} from ${COMPONENT_DIR}`);\n\n componentLoader = new ProdComponentLoader(COMPONENT_DIR);\n }\n\n const manifest = await new ManifestBuilder(\n full_options.open_api_path,\n componentLoader, \n full_options\n ).buildManifest()\n \n const htmlRenderer = getRenderer(root,full_options.renderer,isProd)\n const server_config = await parse_openapi_config(full_options.open_api_path);\n const routeDefs = server_config.routes\n /**\n * Helps manages the components of a route\n */\n const manager = new ComponentManager(componentLoader);\n const api_adapter = new ApiAdapter(manager)\n\n let middlewareRoot: string | undefined;\n if (full_options.middleware_path) {\n middlewareRoot = path.isAbsolute(full_options.middleware_path)\n ? full_options.middleware_path\n : path.resolve(full_options.viteOptions.root, full_options.middleware_path);\n }\n\n const middleware_adapter = MiddlewareAdapter.build(middlewareRoot, COMPONENT_DIR);\n\n const adapter = new ExpressServerAdapter(\n app,\n manager,\n htmlRenderer,\n api_adapter,\n middleware_adapter,\n full_options.context_builder,\n isProd,\n isBuiltEnvironment,\n full_options.component_dir,\n );\n\n\n await adapter.handleRoutes(routeDefs as IRoute[],manifest);\n console.log('Routes registered');\n\n if (!isProd) {\n app.use(vite.middlewares);\n }\n\n return app;\n}\n\n\n\nfunction getRenderer(root:string,renderer: htmlRenderer, isProd:boolean): IHTMLRender {\n if (renderer === 'default') {\n return new DefaultHTMLRender();\n } else if (typeof renderer === 'string' && !isProd) {\n return new LiveHTMLRender(ensureFullPath(root,renderer));\n } else if (typeof renderer === 'string' && isProd) {\n const html = ensureFullPath(root,renderer);\n const template = fs.readFileSync(html, 'utf8')\n return new BaseHTMLRender(template);\n } else if (renderer instanceof BaseHTMLRender) {\n return renderer;\n }else{\n throw new Error('Invalid renderer type');\n }\n}\n\n\n\nfunction ensureFullPath(root:string,renderer: string): string {\n if (path.isAbsolute(renderer)) {\n console.log(`Renderer path is absolute: ${renderer}`);\n return urlJoin(root, renderer);\n } else {\n console.log(`Renderer path is relative: ${renderer}`);\n return path.resolve(root, renderer);\n\n }\n}\n\n\nfunction urlJoin(base: string, path: string): string {\n if (base.endsWith('/')) {\n base = base.slice(0, -1);\n }\n if (path.startsWith('/')) {\n path = path.slice(1);\n }\n return `${base}/${path}`;\n}\n\n \n"],"names":["path","acc","requires_server","fs","loader","_a","_b"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@noego/forge",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.14",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"imports": {
|
|
@@ -135,7 +135,6 @@
|
|
|
135
135
|
}
|
|
136
136
|
},
|
|
137
137
|
"dependencies": {
|
|
138
|
-
"@noego/app": "^0.0.10",
|
|
139
138
|
"@noego/stitch": "^1.0.2",
|
|
140
139
|
"clone-deep": "^4.0.1",
|
|
141
140
|
"deepmerge": "^4.3.1",
|