@noego/forge 0.0.4 → 0.0.5
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 +104 -3
- package/dist-ssr/server.cjs.map +1 -1
- package/dist-ssr/server.js +87 -3
- package/dist-ssr/server.js.map +1 -1
- package/package.json +1 -1
package/dist-ssr/server.cjs
CHANGED
|
@@ -35,7 +35,24 @@ require("clone-deep");
|
|
|
35
35
|
const join = require("url-join");
|
|
36
36
|
const server = require("svelte/server");
|
|
37
37
|
const pathToRegex = require("path-to-regex");
|
|
38
|
-
const
|
|
38
|
+
const $ = require("svelte/internal/server");
|
|
39
|
+
function _interopNamespaceDefault(e) {
|
|
40
|
+
const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
|
|
41
|
+
if (e) {
|
|
42
|
+
for (const k in e) {
|
|
43
|
+
if (k !== "default") {
|
|
44
|
+
const d = Object.getOwnPropertyDescriptor(e, k);
|
|
45
|
+
Object.defineProperty(n, k, d.get ? d : {
|
|
46
|
+
enumerable: true,
|
|
47
|
+
get: () => e[k]
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
n.default = e;
|
|
53
|
+
return Object.freeze(n);
|
|
54
|
+
}
|
|
55
|
+
const $__namespace = /* @__PURE__ */ _interopNamespaceDefault($);
|
|
39
56
|
class ViteComponentLoader {
|
|
40
57
|
constructor(basePath, vite) {
|
|
41
58
|
this.basePath = basePath;
|
|
@@ -537,6 +554,90 @@ function initialize_route_matchers(routes) {
|
|
|
537
554
|
}
|
|
538
555
|
class ServerAdapter {
|
|
539
556
|
}
|
|
557
|
+
function RecursiveRender($$payload, $$props) {
|
|
558
|
+
$__namespace.push();
|
|
559
|
+
let topLayout, childlayouts, top_data, other_data, view_data, recursive_child_data;
|
|
560
|
+
let layouts = $__namespace.fallback($$props["layouts"], () => [], true);
|
|
561
|
+
let view = $__namespace.fallback($$props["view"], null);
|
|
562
|
+
let data = $__namespace.fallback($$props["data"], () => ({}), true);
|
|
563
|
+
let params = $__namespace.fallback($$props["params"], () => ({}), true);
|
|
564
|
+
let urlParams = $__namespace.fallback($$props["urlParams"], () => ({}), true);
|
|
565
|
+
let query = $__namespace.fallback($$props["query"], () => ({}), true);
|
|
566
|
+
let page = $__namespace.fallback($$props["page"], null);
|
|
567
|
+
console.log("[page]", page);
|
|
568
|
+
[topLayout, ...childlayouts] = layouts;
|
|
569
|
+
[top_data, ...other_data] = data.layout || [];
|
|
570
|
+
view_data = data.view;
|
|
571
|
+
recursive_child_data = { layout: other_data, view: data.view };
|
|
572
|
+
if (childlayouts.length > 0) {
|
|
573
|
+
$$payload.out += "<!--[-->";
|
|
574
|
+
$$payload.out += `<!---->`;
|
|
575
|
+
topLayout == null ? void 0 : topLayout($$payload, $__namespace.spread_props([
|
|
576
|
+
top_data || {},
|
|
577
|
+
{
|
|
578
|
+
params,
|
|
579
|
+
urlParams,
|
|
580
|
+
query,
|
|
581
|
+
page,
|
|
582
|
+
children: ($$payload2) => {
|
|
583
|
+
RecursiveRender($$payload2, {
|
|
584
|
+
layouts: childlayouts,
|
|
585
|
+
view,
|
|
586
|
+
data: recursive_child_data,
|
|
587
|
+
params,
|
|
588
|
+
urlParams,
|
|
589
|
+
query,
|
|
590
|
+
page
|
|
591
|
+
});
|
|
592
|
+
$$payload2.out += `<!---->`;
|
|
593
|
+
},
|
|
594
|
+
$$slots: { default: true }
|
|
595
|
+
}
|
|
596
|
+
]));
|
|
597
|
+
$$payload.out += `<!---->`;
|
|
598
|
+
} else if (topLayout) {
|
|
599
|
+
$$payload.out += "<!--[1-->";
|
|
600
|
+
$$payload.out += `<!---->`;
|
|
601
|
+
topLayout == null ? void 0 : topLayout($$payload, $__namespace.spread_props([
|
|
602
|
+
top_data || {},
|
|
603
|
+
{
|
|
604
|
+
params,
|
|
605
|
+
urlParams,
|
|
606
|
+
query,
|
|
607
|
+
page,
|
|
608
|
+
children: ($$payload2) => {
|
|
609
|
+
$$payload2.out += `<!---->`;
|
|
610
|
+
view == null ? void 0 : view($$payload2, $__namespace.spread_props([
|
|
611
|
+
view_data || {},
|
|
612
|
+
{ params, urlParams, query, page }
|
|
613
|
+
]));
|
|
614
|
+
$$payload2.out += `<!---->`;
|
|
615
|
+
},
|
|
616
|
+
$$slots: { default: true }
|
|
617
|
+
}
|
|
618
|
+
]));
|
|
619
|
+
$$payload.out += `<!---->`;
|
|
620
|
+
} else {
|
|
621
|
+
$$payload.out += "<!--[!-->";
|
|
622
|
+
$$payload.out += `<!---->`;
|
|
623
|
+
view == null ? void 0 : view($$payload, $__namespace.spread_props([
|
|
624
|
+
view_data || {},
|
|
625
|
+
{ params, urlParams, query, page }
|
|
626
|
+
]));
|
|
627
|
+
$$payload.out += `<!---->`;
|
|
628
|
+
}
|
|
629
|
+
$$payload.out += `<!--]-->`;
|
|
630
|
+
$__namespace.bind_props($$props, {
|
|
631
|
+
layouts,
|
|
632
|
+
view,
|
|
633
|
+
data,
|
|
634
|
+
params,
|
|
635
|
+
urlParams,
|
|
636
|
+
query,
|
|
637
|
+
page
|
|
638
|
+
});
|
|
639
|
+
$__namespace.pop();
|
|
640
|
+
}
|
|
540
641
|
class ExpressServerAdapter extends ServerAdapter {
|
|
541
642
|
constructor(server2, manager, htmlRender, api_adapter, middleware_adapter) {
|
|
542
643
|
super();
|
|
@@ -649,7 +750,7 @@ class ExpressServerAdapter extends ServerAdapter {
|
|
|
649
750
|
params: request_data.params || {},
|
|
650
751
|
query: request_data.query
|
|
651
752
|
};
|
|
652
|
-
let { head: head_render, body: body_render, css } = server.render(
|
|
753
|
+
let { head: head_render, body: body_render, css } = server.render(RecursiveRender, {
|
|
653
754
|
props: {
|
|
654
755
|
layouts,
|
|
655
756
|
view,
|
|
@@ -726,7 +827,7 @@ view: ${route.view}</pre>`;
|
|
|
726
827
|
const view = await this.manager.getView(route);
|
|
727
828
|
console.log("Fallback view", view);
|
|
728
829
|
console.log("Fallback layouts", layouts);
|
|
729
|
-
let { head: head_render, body: body_render, css } = server.render(
|
|
830
|
+
let { head: head_render, body: body_render, css } = server.render(RecursiveRender, {
|
|
730
831
|
props: {
|
|
731
832
|
layouts,
|
|
732
833
|
view,
|
package/dist-ssr/server.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.cjs","sources":["../src/routing/component_loader/component_loader.ts","../src/routing/html_render/html_render.ts","../src/parser/path.ts","../src/parser/openapi.ts","../src/options/ServerOptions.ts","../src/routing/manifest/base.ts","../src/routing/server_adapter/api_adapter.ts","../src/routing/component_loader/component_manager.ts","../src/routing/server_adapter/middleware_adapter.ts","../src/routing/url_parser.ts","../src/routing/server_adapter/server_adapter.ts","../src/routing/server_adapter/express_server_adapter.ts","../src/server/server.ts"],"sourcesContent":["import type { SvelteComponent } from 'svelte';\nimport type { ViteDevServer } from 'vite';\nimport path from 'path';\nimport fs from 'fs';\n\nimport { SvelteImport, SvelteModuleComponent } from '../base';\n\n\n\n\n\n\n\n\ntype SvelteResource<K> = SvelteImport<K> & SvelteModuleComponent\n\nexport interface IComponentLoader{\n load(component: string,options?:any): Promise<SvelteResource<SvelteComponent>>\n \n}\n\n\n\n\nexport class BasicComponentLoader implements IComponentLoader {\n constructor(private basePath:string) {}\n \n async load(componentPath: string) {\n const component_full_path = path.join(this.basePath, componentPath);\n const module = await import(component_full_path);\n return module as SvelteResource<any>;\n }\n}\n\n\n\nexport class ViteComponentLoader implements IComponentLoader {\n constructor(private basePath:string, private vite: ViteDevServer) {}\n \n async load(componentPath: string, options = {use_base_path:true}): Promise<SvelteResource<any>> {\n let absoluteComponentPath: string;\n const use_base_path = options.use_base_path || false;\n\n if (use_base_path) {\n absoluteComponentPath = path.join(this.basePath, componentPath);\n } else {\n if (path.isAbsolute(componentPath)) {\n absoluteComponentPath = componentPath;\n } else {\n absoluteComponentPath = componentPath;\n }\n }\n\n let vitePath = path.relative(process.cwd(), absoluteComponentPath);\n\n vitePath = vitePath.replace(/\\\\/g, '/');\n\n if (!vitePath.startsWith('/')) {\n vitePath = '/' + vitePath;\n }\n try {\n const module = await this.vite.ssrLoadModule(vitePath);\n console.log(`[ViteComponentLoader] Module loaded successfully for: ${vitePath}`);\n if (!module || !module.default) {\n console.error(`[ViteComponentLoader] Loaded module for ${vitePath} is invalid or missing a default export. Module content:`, module);\n throw new Error(`Module ${vitePath} loaded successfully but is invalid or missing default export.`);\n }\n return module as SvelteResource<any>;\n } catch (error) {\n console.error(`[ViteComponentLoader] Error loading module for vitePath: ${vitePath} (derived from componentPath: ${componentPath})`, error);\n\n try {\n await fs.promises.access(absoluteComponentPath);\n } catch (fsError) {\n }\n throw error;\n }\n }\n}\n\n\nexport class ProdComponentLoader implements IComponentLoader {\n\n constructor(private base_path: string) {\n\n }\n async load(componentPath: string): Promise<SvelteResource<any>> {\n const component_path = path.join(this.base_path, componentPath);\n const module:any = await import(\n component_path.replace(/\\.svelte$/, '.js')\n );\n return module as SvelteResource<any>;\n }\n}\n\n","import Handlebars from 'handlebars'\nimport fs from \"fs/promises\"\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 return template(data)\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 return template(data)\n }\n async getTemplate(): Promise<string> {\n const file_content = await fs.readFile(this.html_path, 'utf8')\n return file_content\n }\n}","import type {IRoute} from \"./IRoute\"\n\n/**\n * Convert OpenAPI‐style `{name[:pattern][modifier]}` into\n * path-to-regexp’s `:name(pattern)?*+` syntax, while\n * allowing literal `{` or `}` inside the regex.\n */\nexport function convertBraces(path: string): string {\n let out = '';\n let i = 0;\n\n while (i < path.length) {\n if (path[i] === '{') {\n // start of a parameter spec\n let start = i;\n i++;\n // find the matching closing '}' that balances this one\n let depth = 1;\n while (i < path.length && depth > 0) {\n if (path[i] === '\\\\') {\n // skip escaped chars\n i += 2;\n } else {\n if (path[i] === '{') depth++;\n else if (path[i] === '}') depth--;\n i++;\n }\n }\n if (depth !== 0) {\n throw new Error(`Unmatched '{' in path: ${path}`);\n }\n const segment = path.slice(start + 1, i - 1);\n // A segment is one of the following forms:\n // 1. \"name\" – simple param, no pattern, no modifier\n // 2. \"name+\" / \"name*\" / \"name?\" – param with modifier only\n // 3. \"name:regex\" – explicit pattern (may itself contain +, *, ?)\n // In the third case we must **not** interpret a trailing +, * or ? as a\n // modifier because it belongs to the user-supplied regex. The original\n // implementation used a single regexp with an optional modifier group,\n // which incorrectly split patterns such as `.*` or `.+` into two parts\n // (`.` as the pattern and `*` or `+` as the modifier). Instead we now\n // split on the first ':'; if a pattern is present we treat the rest of\n // the segment verbatim.\n\n const colonIdx = segment.indexOf(':');\n let name: string;\n let pattern: string | undefined;\n let modifier: string | undefined;\n\n if (colonIdx === -1) {\n // Forms 1 & 2 – no explicit pattern, so a trailing modifier is allowed.\n const m = segment.match(/^([^?*+]+)([?*+])?$/);\n if (!m) {\n throw new Error(`Invalid parameter segment: {${segment}}`);\n }\n [, name, modifier] = m as RegExpMatchArray & [string, string, string?];\n } else {\n // Form 3 – everything after the first ':' is the pattern.\n name = segment.slice(0, colonIdx);\n pattern = segment.slice(colonIdx + 1);\n // No modifier allowed when an explicit pattern is used.\n }\n\n out += `:${name}`;\n if (pattern) out += `(${pattern})`;\n if (modifier) out += modifier;\n } else {\n // ordinary char, copy (also handles escaped chars)\n out += path[i++];\n }\n }\n\n return out;\n}\n\n\nexport function parsePathConfig(path:string,method:string,path_config:any):IRoute {\n const layout = path_config['x-layout']\n const view = path_config['x-view']\n const summary = path_config.summary\n const query = path_config.query\n const body = path_config.body\n const parameters = path_config.parameters\n const responses = path_config.responses\n\n return {\n summary,\n path: convertBraces(path),\n method,\n layout,\n view,\n responses,\n parameters,\n query,\n body\n }\n}\n","import yaml from 'js-yaml'\nimport clone from 'clone-deep'\nimport join from 'url-join'\nimport type {IRoute, IServerRoute} from \"./IRoute\"\nimport {parsePathConfig} from \"./path\"\nimport fs from 'fs'\n\nexport function parseConfigfile(file_content:string) {\n let config:any = null\n try {\n config = yaml.load(file_content)\n } catch (e) {\n console.log(e)\n }\n return config\n}\n\n\nexport function parse_modules(openapi:any){\n const modules_config = (openapi.modules || openapi.module)\n if (!modules_config) {\n return\n }\n\n const modules:any = Object.entries(modules_config).map(([_,module])=>{\n return module\n })\n\n\n const modules_path: IRoute[][] = modules.map((module:any) => {\n const basePath = module.basePath || ''\n const baseLayouts = module.baseLayouts || []\n\n const paths = module.paths\n\n if(!paths){\n return\n }\n\n const configurations = Object.entries(paths).map(([path, method_config]:[string,any]) => {\n return Object.entries(method_config).map(([method, config]) => {\n return parsePathConfig(path,method,config)\n })\n })\n\n const routes = configurations.reduce((flat_config,config)=>{\n return flat_config.concat(config)\n },[])\n\n routes.forEach((route:IRoute) => {\n route.path = join(basePath, route.path)\n route.layout = baseLayouts.concat(route.layout|| [])\n })\n return routes\n })\n\n return modules_path.reduce((flat_config,config)=>{\n return flat_config.concat(config)\n }\n ,[] as IRoute[])\n}\n\n\nexport function parse_paths(openapi:any){\n const paths = openapi.paths\n if (!paths) {\n return\n }\n\n const configurations = Object.entries(paths).map(([path, method_config]:[string,any]) => {\n return Object.entries(method_config).map(([method, config]) => {\n return parsePathConfig(path,method,config)\n })\n })\n\n const routes = configurations.reduce((flat_config,config)=>{\n return flat_config.concat(config)\n },[] as IRoute[])\n\n return routes\n}\n\n\n\n\nexport function transform_openapi_spec(openapi_spec:string) {\n\n const openapi = parseConfigfile(openapi_spec)\n const config = normalize_openapi_config(openapi)\n return yaml.dump(config)\n}\n\n\nexport function normalize_openapi_config(openapi_config:any){\n const config = clone(openapi_config)\n\n const modules = parse_modules(config) || []\n const paths = parse_paths(config) || []\n\n const routes = [...modules, ...paths]\n\n routes.forEach((route:IRoute) => {\n const path = route.path\n const method = route.method\n const config_path = config.paths[path] || {}\n const config_method = config_path[method] || {}\n\n config_method.summary = route.summary\n config_method.description = route.description\n config_method.parameters = route.parameters\n config_method.query = route.query\n config_method.body = route.body\n config_method.responses = route.responses\n config_method['x-view'] = route.view\n config_method['x-layout'] = route.layout\n\n config_path[method] = config_method\n config.paths[path] = config_path\n })\n\n delete config.modules\n return config\n}\n\n\n/**\n * Check if a YAML document is a stitch configuration file\n * @param document The parsed YAML document\n * @returns True if it's a stitch config, false otherwise\n */\nfunction isStitchConfig(document: any): boolean {\n return document && typeof document === 'object' && 'stitch' in document;\n}\n\n/**\n * Check if a YAML document is a regular OpenAPI file\n * @param document The parsed YAML document\n * @returns True if it's a regular OpenAPI file, false otherwise\n */\nfunction isOpenAPIConfig(document: any): boolean {\n return document && typeof document === 'object' && ('paths' in document || 'module' in document || 'modules' in document);\n}\n\nexport async function parse_openapi_config(openapi_config_path:string):Promise<IServerRoute>{\n const content = fs.readFileSync(openapi_config_path, 'utf8')\n const parsed_config = parseConfigfile(content)\n \n let openapi_config: any;\n \n if (isStitchConfig(parsed_config)) {\n // Handle stitch configuration - build using Node.js stitch engine\n console.log('Detected stitch configuration, building with Node.js stitch engine...');\n \n try {\n const { StitchEngine } = await import('@noego/stitch');\n \n const startTime = Date.now();\n const engine = new StitchEngine();\n const result = engine.buildSync(openapi_config_path, { format: 'json' });\n \n if (!result.success) {\n throw new Error(`Stitch build failed: ${result.error}`);\n }\n \n const buildTime = Date.now() - startTime;\n console.log(`INFO Stitch build completed in ${buildTime} ms – ${parsed_config.stitch ? parsed_config.stitch.length : 0} modules processed`);\n \n // Parse the JSON string result to get the JavaScript object\n openapi_config = typeof result.data === 'string' ? JSON.parse(result.data) : result.data;\n } catch (error) {\n throw new Error(`Failed to process stitch configuration: ${error instanceof Error ? error.message : String(error)}`);\n }\n } else if (isOpenAPIConfig(parsed_config)) {\n // Handle regular OpenAPI file (legacy path)\n console.log('Detected regular OpenAPI configuration');\n openapi_config = parsed_config;\n } else {\n throw new Error(`Invalid OpenAPI or stitch configuration file: ${openapi_config_path}. File must contain either 'stitch', 'paths', 'module', or 'modules' at the root level.`);\n }\n \n let modules = parse_modules(openapi_config) || []\n let paths = parse_paths(openapi_config) || []\n\n let fallback_layout = openapi_config['x-fallback-layout'] || null\n let fallback_view = openapi_config['x-fallback-view'] || null\n let fallback = {\n layout: fallback_layout ? [fallback_layout]:[],\n view: fallback_view\n }\n\n const routes = [...modules, ...paths]\n\n let config = {\n fallback,\n routes\n }\n return config\n}\n\n\nexport function transform_openapi_config(openapi_config:any):IRoute[] {\n let modules = parse_modules(openapi_config) || []\n let paths = parse_paths(openapi_config) || []\n\n let routes = [...modules, ...paths]\n return routes\n}\n","import path from 'path';\nimport type { IHTMLRender } from '../routing/html_render/html_render';\n\n\nexport type htmlRenderer = 'default' | string | IHTMLRender;\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?: Record<string,string[]>;\n}\n\n\nexport const defaultViteOptions:any = {\n appType: 'custom',\n root: process.cwd(), // Explicitly set root\n server: { middlewareMode: true },\n ssr: {\n noExternal: ['svelte', /^svelte\\/.*/] // Adjust if needed, maybe add your component specifically if still failing\n }\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};\n\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\";\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 return await layout_requires_server(route,loader) || await view_requires_server(route,loader)\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 layout=>{\n const component = await loader.load(layout)\n return !!component.load\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 const component = await loader.load(view)\n return !!component.load\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 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 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 server_data\n }\n\n}\n","import type { IRoute } from \"../../parser/IRoute\";\nimport type { IComponentLoader } from \"./component_loader\";\n\n\n\n\n\nexport class ComponentManager {\n\n constructor(\n private componentLoader: IComponentLoader\n ){\n\n }\n\n async getLayoutComponents(route:IRoute){\n const layout_paths = route.layout || [];\n const layouts_components = await Promise.all(layout_paths.map((layout)=>{\n console.log(\"layout path\",layout)\n return this.componentLoader.load(layout)}))\n return layouts_components\n }\n\n async getLayouts(route:IRoute){\n const layout_paths = route.layout || [];\n const layouts_components = await Promise.all(layout_paths.map(async (layout_path)=>{\n const layout = await this.componentLoader.load(layout_path)\n return layout.default\n \n }))\n return layouts_components\n }\n\n async getLayoutLoaders(route:IRoute){\n const layout_components = await this.getLayoutComponents(route)\n const layout_loaders = await Promise.all(layout_components.map(async (layout) => {\n return layout.load\n }))\n return layout_loaders\n }\n\n\n async getViewComponent(route: IRoute) {\n return await this.componentLoader.load(route.view)\n }\n async getView(route: IRoute) {\n const view = await this.componentLoader.load(route.view)\n return view.default\n }\n}\n","import type { IRoute } from \"../../parser/IRoute\";\nimport type { Callback } from \"../../types/Callback\";\nimport { ComponentManager } from \"../component_loader/component_manager\";\nimport type { RequestData } from \"./api_adapter\";\n\n\n\n\n\n\nexport class MiddlewareAdapter {\n constructor(\n private manager: ComponentManager,\n ) {\n \n\n }\n\n async handleMiddleware(req:any,reply:any,route:IRoute,request_data:RequestData,callback:Callback): Promise<any> {\n let components = await this.manager.getLayoutComponents(route)\n let middleware_stack = await Promise.all(components.map(async (component) => {\n const middleware = [ ...(component.middleware||[]), ...(component.middlewares||[]) ]\n return middleware \n }))\n const layout_middlewares = middleware_stack.flat() || []\n\n console.log(\"middleware stack loaded\",layout_middlewares)\n\n req.params = request_data.params\n\n await new Promise((resolve:any) => {\n this.runMiddleware(layout_middlewares, req, reply, resolve)\n })\n\n console.log(\"layout middleware executed\")\n console.log(\"view middleware loaded\")\n console.log(\"view middleware\",route.view)\n let view: any = {}\n if(route.view){\n view = await this.manager.getViewComponent(route)\n }\n let view_middlewares = [ ...(view.middleware||[]), ...(view.middlewares||[]) ]\n\n await new Promise((resolve:any) => {\n this.runMiddleware(view_middlewares, req, reply, resolve)\n })\n\n callback()\n\n }\n\n private runMiddleware<K>(middleware: K[], req: any, reply: any, callback:Callback):void {\n middleware = this.dedupe(middleware)\n let index = 0;\n if (middleware.length === 0) {\n callback()\n return\n }\n\n let next = () => {\n if (index >= middleware.length) {\n callback()\n return\n }\n const mw = middleware[index]\n index++\n if (typeof mw === 'function') {\n if(!reply.sent)\n mw(req, reply, next)\n } else {\n if (!reply.sent)\n next()\n }\n }\n next()\n\n }\n\n\n private dedupe(middlewares: any[]): any[] {\n return Array.from(new Set(middlewares));\n }\n}\n","import pathToRegex from 'path-to-regex';\nimport type { IRoute } from '../parser/IRoute';\n\n\n\nexport function makeUrlParser(pattern: string) {\n const parser = new pathToRegex(pattern);\n return (pathname: string) => {\n const result = parser.match(pathname);\n return result || null;\n };\n}\n\n\nexport type UrlMatcher = {\n pattern: string,\n parser: ReturnType<typeof makeUrlParser>\n}\n\nexport function findRoute(pathname:string, routes: UrlMatcher[]) {\n for (const { pattern, parser } of routes) {\n const params = parser(pathname);\n if (params) {\n return { pattern, params };\n }\n }\n return null;\n}\n\n\n\n\n\nexport function initialize_route_matchers(routes: IRoute[]): UrlMatcher[] {\n return routes.map((route: IRoute) => {\n const pattern = route.path;\n const parser = makeUrlParser(pattern);\n return { pattern, parser };\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 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 ApplicationRenderer from '#recursive-render'\nimport express from \"express\"\nimport type {Request,Response} from \"express\"\nimport type { IPage } from \"../page\"\n\n\n\nexport class ExpressServerAdapter extends ServerAdapter {\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 ) {\n super()\n }\n\n async handleRoutes(routes: IRoute[],manifest:any): Promise<void> {\n\n const matchers = initialize_route_matchers(routes)\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 = routes.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,routes,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 const context = {}\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 try{\n await new Promise((resolve: any,reject:any) => {\n this.middleware_adapter.handleMiddleware(req, res, route, request_data, resolve).catch(reject)\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 `)\n return\n }\n\n\n\n if (res.headersSent) {\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){\n console.log('Error getting view', e)\n res.status(500).send(`\n <h1>500 Internal Server Error</h1>\n <pre>${e}</pre>\n `)\n return\n }\n\n\n /**\n * Render HTML page\n */\n let html_render = ''\n let response_code = 200\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 let { head: head_render, body: body_render, 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 \n const head_routing = `\n <script type='text/javascript'>\n window.__ROUTING__ = ${JSON.stringify(routes)}\n </script>\n\n <script type='text/javascript'>\n window.__MANIFEST__ = ${JSON.stringify(manifest)}\n </script>\n\n <script type='text/javascript'>\n window.__INITIAL_DATA__ = ${JSON.stringify(server_data || {}).trim()}\n </script>\n `\n html_render = await this.htmlRender.renderHTML({\n HEAD: head_routing + (head_render || ''),\n CSS: css,\n APP: body_render\n })\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 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 await new Promise((resolve: any) => {\n this.middleware_adapter.handleMiddleware(req, res, route, request_data, resolve)\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 let { head: head_render, body: body_render, css }\n = render(ApplicationRenderer, {\n props: {\n layouts,\n view,\n data: server_data,\n params: request_data.params\n }\n }) as any\n\n\n /**\n * Render HTML page\n */\n const html_render = await this.htmlRender.renderHTML({\n HEAD: 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';\n\nimport deepmerge from 'deepmerge';\nimport fs from 'fs';\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 { 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\nexport async function createServer(app: express.Express, options?: ServerOptions): Promise<express.Express> {\n options = options || defaultOptions;\n const full_options = deepmerge(defaultOptions, options);\n\n full_options.open_api_path = ensureFullPath(full_options.viteOptions.root, full_options.open_api_path);\n\n \n const isProd = full_options.development === false;\n\n console.log(`Running in ${isProd ? 'production' : 'development'} mode`);\n const COMPONENT_DIR = path.join(full_options.viteOptions.root,full_options.component_dir);\n const root = full_options.viteOptions.root;\n let componentLoader;\n let vite;\n\n console.log(`Serving components from ${COMPONENT_DIR} at /components/`);\n\n if (full_options.assets) {\n for (const [asset_path, asset_dir] of Object.entries(full_options.assets)){\n\n for (const asset of asset_dir) {\n const asset_root = path.join(full_options.viteOptions.root, asset)\n\n app.use(asset_path,express.static(asset_root))\n console.log(`Serving assets from ${asset_root} at ${asset_path}`);\n }\n }\n }else{\n console.log(`No assets to serve`);\n }\n\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 componentLoader = new ViteComponentLoader(COMPONENT_DIR, vite);\n \n console.log('loaded')\n } else {\n console.log('Starting Vite in production mode...');\n app.use('/', express.static(path.join(options.viteOptions.root, full_options.build_dir)));\n console.log(`Serving static files from ${path.join(options.viteOptions.root, full_options.build_dir)} at /`);\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 const middleware_adapter = new MiddlewareAdapter(manager);\n const adapter = new ExpressServerAdapter(\n app, \n manager,\n htmlRenderer,\n api_adapter,\n middleware_adapter\n );\n\n await adapter.handleRoutes(routeDefs as IRoute[],manifest);\n console.log('Routes registered');\n\n if (!isProd) {\n // Add Vite middleware AFTER Forge routes are registered\n app.use(vite.middlewares);\n \n // //Add the manifest endpoint when working in dev mode\n // app.get(full_options.manifest_endpoint, async (_, res) => {\n // res.type('application/json')\n // const manifest = await new ManifestBuilder(\n // full_options.open_api_path,\n // componentLoader, \n // full_options\n // ).buildManifest()\n\n // res.send(manifest)\n // })\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":["module","fs","path","acc","layout","loader","server","render"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"server.cjs","sources":["../src/routing/component_loader/component_loader.ts","../src/routing/html_render/html_render.ts","../src/parser/path.ts","../src/parser/openapi.ts","../src/options/ServerOptions.ts","../src/routing/manifest/base.ts","../src/routing/server_adapter/api_adapter.ts","../src/routing/component_loader/component_manager.ts","../src/routing/server_adapter/middleware_adapter.ts","../src/routing/url_parser.ts","../src/routing/server_adapter/server_adapter.ts","../src/components/RecursiveRender.svelte","../src/routing/server_adapter/express_server_adapter.ts","../src/server/server.ts"],"sourcesContent":["import type { SvelteComponent } from 'svelte';\nimport type { ViteDevServer } from 'vite';\nimport path from 'path';\nimport fs from 'fs';\n\nimport { SvelteImport, SvelteModuleComponent } from '../base';\n\n\n\n\n\n\n\n\ntype SvelteResource<K> = SvelteImport<K> & SvelteModuleComponent\n\nexport interface IComponentLoader{\n load(component: string,options?:any): Promise<SvelteResource<SvelteComponent>>\n \n}\n\n\n\n\nexport class BasicComponentLoader implements IComponentLoader {\n constructor(private basePath:string) {}\n \n async load(componentPath: string) {\n const component_full_path = path.join(this.basePath, componentPath);\n const module = await import(component_full_path);\n return module as SvelteResource<any>;\n }\n}\n\n\n\nexport class ViteComponentLoader implements IComponentLoader {\n constructor(private basePath:string, private vite: ViteDevServer) {}\n \n async load(componentPath: string, options = {use_base_path:true}): Promise<SvelteResource<any>> {\n let absoluteComponentPath: string;\n const use_base_path = options.use_base_path || false;\n\n if (use_base_path) {\n absoluteComponentPath = path.join(this.basePath, componentPath);\n } else {\n if (path.isAbsolute(componentPath)) {\n absoluteComponentPath = componentPath;\n } else {\n absoluteComponentPath = componentPath;\n }\n }\n\n let vitePath = path.relative(process.cwd(), absoluteComponentPath);\n\n vitePath = vitePath.replace(/\\\\/g, '/');\n\n if (!vitePath.startsWith('/')) {\n vitePath = '/' + vitePath;\n }\n try {\n const module = await this.vite.ssrLoadModule(vitePath);\n console.log(`[ViteComponentLoader] Module loaded successfully for: ${vitePath}`);\n if (!module || !module.default) {\n console.error(`[ViteComponentLoader] Loaded module for ${vitePath} is invalid or missing a default export. Module content:`, module);\n throw new Error(`Module ${vitePath} loaded successfully but is invalid or missing default export.`);\n }\n return module as SvelteResource<any>;\n } catch (error) {\n console.error(`[ViteComponentLoader] Error loading module for vitePath: ${vitePath} (derived from componentPath: ${componentPath})`, error);\n\n try {\n await fs.promises.access(absoluteComponentPath);\n } catch (fsError) {\n }\n throw error;\n }\n }\n}\n\n\nexport class ProdComponentLoader implements IComponentLoader {\n\n constructor(private base_path: string) {\n\n }\n async load(componentPath: string): Promise<SvelteResource<any>> {\n const component_path = path.join(this.base_path, componentPath);\n const module:any = await import(\n component_path.replace(/\\.svelte$/, '.js')\n );\n return module as SvelteResource<any>;\n }\n}\n\n","import Handlebars from 'handlebars'\nimport fs from \"fs/promises\"\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 return template(data)\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 return template(data)\n }\n async getTemplate(): Promise<string> {\n const file_content = await fs.readFile(this.html_path, 'utf8')\n return file_content\n }\n}","import type {IRoute} from \"./IRoute\"\n\n/**\n * Convert OpenAPI‐style `{name[:pattern][modifier]}` into\n * path-to-regexp’s `:name(pattern)?*+` syntax, while\n * allowing literal `{` or `}` inside the regex.\n */\nexport function convertBraces(path: string): string {\n let out = '';\n let i = 0;\n\n while (i < path.length) {\n if (path[i] === '{') {\n // start of a parameter spec\n let start = i;\n i++;\n // find the matching closing '}' that balances this one\n let depth = 1;\n while (i < path.length && depth > 0) {\n if (path[i] === '\\\\') {\n // skip escaped chars\n i += 2;\n } else {\n if (path[i] === '{') depth++;\n else if (path[i] === '}') depth--;\n i++;\n }\n }\n if (depth !== 0) {\n throw new Error(`Unmatched '{' in path: ${path}`);\n }\n const segment = path.slice(start + 1, i - 1);\n // A segment is one of the following forms:\n // 1. \"name\" – simple param, no pattern, no modifier\n // 2. \"name+\" / \"name*\" / \"name?\" – param with modifier only\n // 3. \"name:regex\" – explicit pattern (may itself contain +, *, ?)\n // In the third case we must **not** interpret a trailing +, * or ? as a\n // modifier because it belongs to the user-supplied regex. The original\n // implementation used a single regexp with an optional modifier group,\n // which incorrectly split patterns such as `.*` or `.+` into two parts\n // (`.` as the pattern and `*` or `+` as the modifier). Instead we now\n // split on the first ':'; if a pattern is present we treat the rest of\n // the segment verbatim.\n\n const colonIdx = segment.indexOf(':');\n let name: string;\n let pattern: string | undefined;\n let modifier: string | undefined;\n\n if (colonIdx === -1) {\n // Forms 1 & 2 – no explicit pattern, so a trailing modifier is allowed.\n const m = segment.match(/^([^?*+]+)([?*+])?$/);\n if (!m) {\n throw new Error(`Invalid parameter segment: {${segment}}`);\n }\n [, name, modifier] = m as RegExpMatchArray & [string, string, string?];\n } else {\n // Form 3 – everything after the first ':' is the pattern.\n name = segment.slice(0, colonIdx);\n pattern = segment.slice(colonIdx + 1);\n // No modifier allowed when an explicit pattern is used.\n }\n\n out += `:${name}`;\n if (pattern) out += `(${pattern})`;\n if (modifier) out += modifier;\n } else {\n // ordinary char, copy (also handles escaped chars)\n out += path[i++];\n }\n }\n\n return out;\n}\n\n\nexport function parsePathConfig(path:string,method:string,path_config:any):IRoute {\n const layout = path_config['x-layout']\n const view = path_config['x-view']\n const summary = path_config.summary\n const query = path_config.query\n const body = path_config.body\n const parameters = path_config.parameters\n const responses = path_config.responses\n\n return {\n summary,\n path: convertBraces(path),\n method,\n layout,\n view,\n responses,\n parameters,\n query,\n body\n }\n}\n","import yaml from 'js-yaml'\nimport clone from 'clone-deep'\nimport join from 'url-join'\nimport type {IRoute, IServerRoute} from \"./IRoute\"\nimport {parsePathConfig} from \"./path\"\nimport fs from 'fs'\n\nexport function parseConfigfile(file_content:string) {\n let config:any = null\n try {\n config = yaml.load(file_content)\n } catch (e) {\n console.log(e)\n }\n return config\n}\n\n\nexport function parse_modules(openapi:any){\n const modules_config = (openapi.modules || openapi.module)\n if (!modules_config) {\n return\n }\n\n const modules:any = Object.entries(modules_config).map(([_,module])=>{\n return module\n })\n\n\n const modules_path: IRoute[][] = modules.map((module:any) => {\n const basePath = module.basePath || ''\n const baseLayouts = module.baseLayouts || []\n\n const paths = module.paths\n\n if(!paths){\n return\n }\n\n const configurations = Object.entries(paths).map(([path, method_config]:[string,any]) => {\n return Object.entries(method_config).map(([method, config]) => {\n return parsePathConfig(path,method,config)\n })\n })\n\n const routes = configurations.reduce((flat_config,config)=>{\n return flat_config.concat(config)\n },[])\n\n routes.forEach((route:IRoute) => {\n route.path = join(basePath, route.path)\n route.layout = baseLayouts.concat(route.layout|| [])\n })\n return routes\n })\n\n return modules_path.reduce((flat_config,config)=>{\n return flat_config.concat(config)\n }\n ,[] as IRoute[])\n}\n\n\nexport function parse_paths(openapi:any){\n const paths = openapi.paths\n if (!paths) {\n return\n }\n\n const configurations = Object.entries(paths).map(([path, method_config]:[string,any]) => {\n return Object.entries(method_config).map(([method, config]) => {\n return parsePathConfig(path,method,config)\n })\n })\n\n const routes = configurations.reduce((flat_config,config)=>{\n return flat_config.concat(config)\n },[] as IRoute[])\n\n return routes\n}\n\n\n\n\nexport function transform_openapi_spec(openapi_spec:string) {\n\n const openapi = parseConfigfile(openapi_spec)\n const config = normalize_openapi_config(openapi)\n return yaml.dump(config)\n}\n\n\nexport function normalize_openapi_config(openapi_config:any){\n const config = clone(openapi_config)\n\n const modules = parse_modules(config) || []\n const paths = parse_paths(config) || []\n\n const routes = [...modules, ...paths]\n\n routes.forEach((route:IRoute) => {\n const path = route.path\n const method = route.method\n const config_path = config.paths[path] || {}\n const config_method = config_path[method] || {}\n\n config_method.summary = route.summary\n config_method.description = route.description\n config_method.parameters = route.parameters\n config_method.query = route.query\n config_method.body = route.body\n config_method.responses = route.responses\n config_method['x-view'] = route.view\n config_method['x-layout'] = route.layout\n\n config_path[method] = config_method\n config.paths[path] = config_path\n })\n\n delete config.modules\n return config\n}\n\n\n/**\n * Check if a YAML document is a stitch configuration file\n * @param document The parsed YAML document\n * @returns True if it's a stitch config, false otherwise\n */\nfunction isStitchConfig(document: any): boolean {\n return document && typeof document === 'object' && 'stitch' in document;\n}\n\n/**\n * Check if a YAML document is a regular OpenAPI file\n * @param document The parsed YAML document\n * @returns True if it's a regular OpenAPI file, false otherwise\n */\nfunction isOpenAPIConfig(document: any): boolean {\n return document && typeof document === 'object' && ('paths' in document || 'module' in document || 'modules' in document);\n}\n\nexport async function parse_openapi_config(openapi_config_path:string):Promise<IServerRoute>{\n const content = fs.readFileSync(openapi_config_path, 'utf8')\n const parsed_config = parseConfigfile(content)\n \n let openapi_config: any;\n \n if (isStitchConfig(parsed_config)) {\n // Handle stitch configuration - build using Node.js stitch engine\n console.log('Detected stitch configuration, building with Node.js stitch engine...');\n \n try {\n const { StitchEngine } = await import('@noego/stitch');\n \n const startTime = Date.now();\n const engine = new StitchEngine();\n const result = engine.buildSync(openapi_config_path, { format: 'json' });\n \n if (!result.success) {\n throw new Error(`Stitch build failed: ${result.error}`);\n }\n \n const buildTime = Date.now() - startTime;\n console.log(`INFO Stitch build completed in ${buildTime} ms – ${parsed_config.stitch ? parsed_config.stitch.length : 0} modules processed`);\n \n // Parse the JSON string result to get the JavaScript object\n openapi_config = typeof result.data === 'string' ? JSON.parse(result.data) : result.data;\n } catch (error) {\n throw new Error(`Failed to process stitch configuration: ${error instanceof Error ? error.message : String(error)}`);\n }\n } else if (isOpenAPIConfig(parsed_config)) {\n // Handle regular OpenAPI file (legacy path)\n console.log('Detected regular OpenAPI configuration');\n openapi_config = parsed_config;\n } else {\n throw new Error(`Invalid OpenAPI or stitch configuration file: ${openapi_config_path}. File must contain either 'stitch', 'paths', 'module', or 'modules' at the root level.`);\n }\n \n let modules = parse_modules(openapi_config) || []\n let paths = parse_paths(openapi_config) || []\n\n let fallback_layout = openapi_config['x-fallback-layout'] || null\n let fallback_view = openapi_config['x-fallback-view'] || null\n let fallback = {\n layout: fallback_layout ? [fallback_layout]:[],\n view: fallback_view\n }\n\n const routes = [...modules, ...paths]\n\n let config = {\n fallback,\n routes\n }\n return config\n}\n\n\nexport function transform_openapi_config(openapi_config:any):IRoute[] {\n let modules = parse_modules(openapi_config) || []\n let paths = parse_paths(openapi_config) || []\n\n let routes = [...modules, ...paths]\n return routes\n}\n","import path from 'path';\nimport type { IHTMLRender } from '../routing/html_render/html_render';\n\n\nexport type htmlRenderer = 'default' | string | IHTMLRender;\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?: Record<string,string[]>;\n}\n\n\nexport const defaultViteOptions:any = {\n appType: 'custom',\n root: process.cwd(), // Explicitly set root\n server: { middlewareMode: true },\n ssr: {\n noExternal: ['svelte', /^svelte\\/.*/] // Adjust if needed, maybe add your component specifically if still failing\n }\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};\n\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\";\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 return await layout_requires_server(route,loader) || await view_requires_server(route,loader)\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 layout=>{\n const component = await loader.load(layout)\n return !!component.load\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 const component = await loader.load(view)\n return !!component.load\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 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 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 server_data\n }\n\n}\n","import type { IRoute } from \"../../parser/IRoute\";\nimport type { IComponentLoader } from \"./component_loader\";\n\n\n\n\n\nexport class ComponentManager {\n\n constructor(\n private componentLoader: IComponentLoader\n ){\n\n }\n\n async getLayoutComponents(route:IRoute){\n const layout_paths = route.layout || [];\n const layouts_components = await Promise.all(layout_paths.map((layout)=>{\n console.log(\"layout path\",layout)\n return this.componentLoader.load(layout)}))\n return layouts_components\n }\n\n async getLayouts(route:IRoute){\n const layout_paths = route.layout || [];\n const layouts_components = await Promise.all(layout_paths.map(async (layout_path)=>{\n const layout = await this.componentLoader.load(layout_path)\n return layout.default\n \n }))\n return layouts_components\n }\n\n async getLayoutLoaders(route:IRoute){\n const layout_components = await this.getLayoutComponents(route)\n const layout_loaders = await Promise.all(layout_components.map(async (layout) => {\n return layout.load\n }))\n return layout_loaders\n }\n\n\n async getViewComponent(route: IRoute) {\n return await this.componentLoader.load(route.view)\n }\n async getView(route: IRoute) {\n const view = await this.componentLoader.load(route.view)\n return view.default\n }\n}\n","import type { IRoute } from \"../../parser/IRoute\";\nimport type { Callback } from \"../../types/Callback\";\nimport { ComponentManager } from \"../component_loader/component_manager\";\nimport type { RequestData } from \"./api_adapter\";\n\n\n\n\n\n\nexport class MiddlewareAdapter {\n constructor(\n private manager: ComponentManager,\n ) {\n \n\n }\n\n async handleMiddleware(req:any,reply:any,route:IRoute,request_data:RequestData,callback:Callback): Promise<any> {\n let components = await this.manager.getLayoutComponents(route)\n let middleware_stack = await Promise.all(components.map(async (component) => {\n const middleware = [ ...(component.middleware||[]), ...(component.middlewares||[]) ]\n return middleware \n }))\n const layout_middlewares = middleware_stack.flat() || []\n\n console.log(\"middleware stack loaded\",layout_middlewares)\n\n req.params = request_data.params\n\n await new Promise((resolve:any) => {\n this.runMiddleware(layout_middlewares, req, reply, resolve)\n })\n\n console.log(\"layout middleware executed\")\n console.log(\"view middleware loaded\")\n console.log(\"view middleware\",route.view)\n let view: any = {}\n if(route.view){\n view = await this.manager.getViewComponent(route)\n }\n let view_middlewares = [ ...(view.middleware||[]), ...(view.middlewares||[]) ]\n\n await new Promise((resolve:any) => {\n this.runMiddleware(view_middlewares, req, reply, resolve)\n })\n\n callback()\n\n }\n\n private runMiddleware<K>(middleware: K[], req: any, reply: any, callback:Callback):void {\n middleware = this.dedupe(middleware)\n let index = 0;\n if (middleware.length === 0) {\n callback()\n return\n }\n\n let next = () => {\n if (index >= middleware.length) {\n callback()\n return\n }\n const mw = middleware[index]\n index++\n if (typeof mw === 'function') {\n if(!reply.sent)\n mw(req, reply, next)\n } else {\n if (!reply.sent)\n next()\n }\n }\n next()\n\n }\n\n\n private dedupe(middlewares: any[]): any[] {\n return Array.from(new Set(middlewares));\n }\n}\n","import pathToRegex from 'path-to-regex';\nimport type { IRoute } from '../parser/IRoute';\n\n\n\nexport function makeUrlParser(pattern: string) {\n const parser = new pathToRegex(pattern);\n return (pathname: string) => {\n const result = parser.match(pathname);\n return result || null;\n };\n}\n\n\nexport type UrlMatcher = {\n pattern: string,\n parser: ReturnType<typeof makeUrlParser>\n}\n\nexport function findRoute(pathname:string, routes: UrlMatcher[]) {\n for (const { pattern, parser } of routes) {\n const params = parser(pathname);\n if (params) {\n return { pattern, params };\n }\n }\n return null;\n}\n\n\n\n\n\nexport function initialize_route_matchers(routes: IRoute[]): UrlMatcher[] {\n return routes.map((route: IRoute) => {\n const pattern = route.path;\n const parser = makeUrlParser(pattern);\n return { pattern, parser };\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","\n\n<script lang=\"ts\">\n export let layouts = []\n export let view = null\n export let data = {} as any\n export let params = {}\n export let urlParams = {}\n export let query = {}\n export let page = null\n\n console.log('[page]',page);\n\n $: [topLayout,...childlayouts] = layouts\n $: [top_data,...other_data] = data.layout || []\n $: view_data = data.view\n $: recursive_child_data = {\n layout:other_data,\n view:data.view\n }\n</script>\n\n{#if childlayouts.length > 0}\n <svelte:component this={topLayout} {...(top_data||{})} params={params} urlParams={urlParams} query={query} page={page}>\n <svelte:self layouts={childlayouts} view={view} data={recursive_child_data} params={params} urlParams={urlParams} query={query} page={page}/>\n </svelte:component>\n{:else if topLayout}\n <svelte:component this={topLayout} {...(top_data||{})} params={params} urlParams={urlParams} query={query} page={page}>\n <svelte:component this={view} {...(view_data||{})} params={params} urlParams={urlParams} query={query} page={page}/>\n </svelte:component>\n{:else}\n <svelte:component this={view} {...(view_data||{})} params={params} urlParams={urlParams} query={query} page={page}/>\n{/if}\n\n\n","import { render } from \"svelte/server\"\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 ApplicationRenderer from '#recursive-render'\nimport express from \"express\"\nimport type {Request,Response} from \"express\"\nimport type { IPage } from \"../page\"\n\n\n\nexport class ExpressServerAdapter extends ServerAdapter {\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 ) {\n super()\n }\n\n async handleRoutes(routes: IRoute[],manifest:any): Promise<void> {\n\n const matchers = initialize_route_matchers(routes)\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 = routes.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,routes,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 const context = {}\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 try{\n await new Promise((resolve: any,reject:any) => {\n this.middleware_adapter.handleMiddleware(req, res, route, request_data, resolve).catch(reject)\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 `)\n return\n }\n\n\n\n if (res.headersSent) {\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){\n console.log('Error getting view', e)\n res.status(500).send(`\n <h1>500 Internal Server Error</h1>\n <pre>${e}</pre>\n `)\n return\n }\n\n\n /**\n * Render HTML page\n */\n let html_render = ''\n let response_code = 200\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 let { head: head_render, body: body_render, 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 \n const head_routing = `\n <script type='text/javascript'>\n window.__ROUTING__ = ${JSON.stringify(routes)}\n </script>\n\n <script type='text/javascript'>\n window.__MANIFEST__ = ${JSON.stringify(manifest)}\n </script>\n\n <script type='text/javascript'>\n window.__INITIAL_DATA__ = ${JSON.stringify(server_data || {}).trim()}\n </script>\n `\n html_render = await this.htmlRender.renderHTML({\n HEAD: head_routing + (head_render || ''),\n CSS: css,\n APP: body_render\n })\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 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 await new Promise((resolve: any) => {\n this.middleware_adapter.handleMiddleware(req, res, route, request_data, resolve)\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 let { head: head_render, body: body_render, css }\n = render(ApplicationRenderer, {\n props: {\n layouts,\n view,\n data: server_data,\n params: request_data.params\n }\n }) as any\n\n\n /**\n * Render HTML page\n */\n const html_render = await this.htmlRender.renderHTML({\n HEAD: 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';\n\nimport deepmerge from 'deepmerge';\nimport fs from 'fs';\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 { 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\nexport async function createServer(app: express.Express, options?: ServerOptions): Promise<express.Express> {\n options = options || defaultOptions;\n const full_options = deepmerge(defaultOptions, options);\n\n full_options.open_api_path = ensureFullPath(full_options.viteOptions.root, full_options.open_api_path);\n\n \n const isProd = full_options.development === false;\n\n console.log(`Running in ${isProd ? 'production' : 'development'} mode`);\n const COMPONENT_DIR = path.join(full_options.viteOptions.root,full_options.component_dir);\n const root = full_options.viteOptions.root;\n let componentLoader;\n let vite;\n\n console.log(`Serving components from ${COMPONENT_DIR} at /components/`);\n\n if (full_options.assets) {\n for (const [asset_path, asset_dir] of Object.entries(full_options.assets)){\n\n for (const asset of asset_dir) {\n const asset_root = path.join(full_options.viteOptions.root, asset)\n\n app.use(asset_path,express.static(asset_root))\n console.log(`Serving assets from ${asset_root} at ${asset_path}`);\n }\n }\n }else{\n console.log(`No assets to serve`);\n }\n\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 componentLoader = new ViteComponentLoader(COMPONENT_DIR, vite);\n \n console.log('loaded')\n } else {\n console.log('Starting Vite in production mode...');\n app.use('/', express.static(path.join(options.viteOptions.root, full_options.build_dir)));\n console.log(`Serving static files from ${path.join(options.viteOptions.root, full_options.build_dir)} at /`);\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 const middleware_adapter = new MiddlewareAdapter(manager);\n const adapter = new ExpressServerAdapter(\n app, \n manager,\n htmlRenderer,\n api_adapter,\n middleware_adapter\n );\n\n await adapter.handleRoutes(routeDefs as IRoute[],manifest);\n console.log('Routes registered');\n\n if (!isProd) {\n // Add Vite middleware AFTER Forge routes are registered\n app.use(vite.middlewares);\n \n // //Add the manifest endpoint when working in dev mode\n // app.get(full_options.manifest_endpoint, async (_, res) => {\n // res.type('application/json')\n // const manifest = await new ManifestBuilder(\n // full_options.open_api_path,\n // componentLoader, \n // full_options\n // ).buildManifest()\n\n // res.send(manifest)\n // })\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":["module","fs","path","acc","layout","loader","$","$$payload","server","render","ApplicationRenderer"],"mappings":"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"}
|
package/dist-ssr/server.js
CHANGED
|
@@ -12,7 +12,7 @@ import "clone-deep";
|
|
|
12
12
|
import join from "url-join";
|
|
13
13
|
import { render } from "svelte/server";
|
|
14
14
|
import pathToRegex from "path-to-regex";
|
|
15
|
-
import
|
|
15
|
+
import * as $ from "svelte/internal/server";
|
|
16
16
|
class ViteComponentLoader {
|
|
17
17
|
constructor(basePath, vite) {
|
|
18
18
|
this.basePath = basePath;
|
|
@@ -514,6 +514,90 @@ function initialize_route_matchers(routes) {
|
|
|
514
514
|
}
|
|
515
515
|
class ServerAdapter {
|
|
516
516
|
}
|
|
517
|
+
function RecursiveRender($$payload, $$props) {
|
|
518
|
+
$.push();
|
|
519
|
+
let topLayout, childlayouts, top_data, other_data, view_data, recursive_child_data;
|
|
520
|
+
let layouts = $.fallback($$props["layouts"], () => [], true);
|
|
521
|
+
let view = $.fallback($$props["view"], null);
|
|
522
|
+
let data = $.fallback($$props["data"], () => ({}), true);
|
|
523
|
+
let params = $.fallback($$props["params"], () => ({}), true);
|
|
524
|
+
let urlParams = $.fallback($$props["urlParams"], () => ({}), true);
|
|
525
|
+
let query = $.fallback($$props["query"], () => ({}), true);
|
|
526
|
+
let page = $.fallback($$props["page"], null);
|
|
527
|
+
console.log("[page]", page);
|
|
528
|
+
[topLayout, ...childlayouts] = layouts;
|
|
529
|
+
[top_data, ...other_data] = data.layout || [];
|
|
530
|
+
view_data = data.view;
|
|
531
|
+
recursive_child_data = { layout: other_data, view: data.view };
|
|
532
|
+
if (childlayouts.length > 0) {
|
|
533
|
+
$$payload.out += "<!--[-->";
|
|
534
|
+
$$payload.out += `<!---->`;
|
|
535
|
+
topLayout == null ? void 0 : topLayout($$payload, $.spread_props([
|
|
536
|
+
top_data || {},
|
|
537
|
+
{
|
|
538
|
+
params,
|
|
539
|
+
urlParams,
|
|
540
|
+
query,
|
|
541
|
+
page,
|
|
542
|
+
children: ($$payload2) => {
|
|
543
|
+
RecursiveRender($$payload2, {
|
|
544
|
+
layouts: childlayouts,
|
|
545
|
+
view,
|
|
546
|
+
data: recursive_child_data,
|
|
547
|
+
params,
|
|
548
|
+
urlParams,
|
|
549
|
+
query,
|
|
550
|
+
page
|
|
551
|
+
});
|
|
552
|
+
$$payload2.out += `<!---->`;
|
|
553
|
+
},
|
|
554
|
+
$$slots: { default: true }
|
|
555
|
+
}
|
|
556
|
+
]));
|
|
557
|
+
$$payload.out += `<!---->`;
|
|
558
|
+
} else if (topLayout) {
|
|
559
|
+
$$payload.out += "<!--[1-->";
|
|
560
|
+
$$payload.out += `<!---->`;
|
|
561
|
+
topLayout == null ? void 0 : topLayout($$payload, $.spread_props([
|
|
562
|
+
top_data || {},
|
|
563
|
+
{
|
|
564
|
+
params,
|
|
565
|
+
urlParams,
|
|
566
|
+
query,
|
|
567
|
+
page,
|
|
568
|
+
children: ($$payload2) => {
|
|
569
|
+
$$payload2.out += `<!---->`;
|
|
570
|
+
view == null ? void 0 : view($$payload2, $.spread_props([
|
|
571
|
+
view_data || {},
|
|
572
|
+
{ params, urlParams, query, page }
|
|
573
|
+
]));
|
|
574
|
+
$$payload2.out += `<!---->`;
|
|
575
|
+
},
|
|
576
|
+
$$slots: { default: true }
|
|
577
|
+
}
|
|
578
|
+
]));
|
|
579
|
+
$$payload.out += `<!---->`;
|
|
580
|
+
} else {
|
|
581
|
+
$$payload.out += "<!--[!-->";
|
|
582
|
+
$$payload.out += `<!---->`;
|
|
583
|
+
view == null ? void 0 : view($$payload, $.spread_props([
|
|
584
|
+
view_data || {},
|
|
585
|
+
{ params, urlParams, query, page }
|
|
586
|
+
]));
|
|
587
|
+
$$payload.out += `<!---->`;
|
|
588
|
+
}
|
|
589
|
+
$$payload.out += `<!--]-->`;
|
|
590
|
+
$.bind_props($$props, {
|
|
591
|
+
layouts,
|
|
592
|
+
view,
|
|
593
|
+
data,
|
|
594
|
+
params,
|
|
595
|
+
urlParams,
|
|
596
|
+
query,
|
|
597
|
+
page
|
|
598
|
+
});
|
|
599
|
+
$.pop();
|
|
600
|
+
}
|
|
517
601
|
class ExpressServerAdapter extends ServerAdapter {
|
|
518
602
|
constructor(server, manager, htmlRender, api_adapter, middleware_adapter) {
|
|
519
603
|
super();
|
|
@@ -626,7 +710,7 @@ class ExpressServerAdapter extends ServerAdapter {
|
|
|
626
710
|
params: request_data.params || {},
|
|
627
711
|
query: request_data.query
|
|
628
712
|
};
|
|
629
|
-
let { head: head_render, body: body_render, css } = render(
|
|
713
|
+
let { head: head_render, body: body_render, css } = render(RecursiveRender, {
|
|
630
714
|
props: {
|
|
631
715
|
layouts,
|
|
632
716
|
view,
|
|
@@ -703,7 +787,7 @@ view: ${route.view}</pre>`;
|
|
|
703
787
|
const view = await this.manager.getView(route);
|
|
704
788
|
console.log("Fallback view", view);
|
|
705
789
|
console.log("Fallback layouts", layouts);
|
|
706
|
-
let { head: head_render, body: body_render, css } = render(
|
|
790
|
+
let { head: head_render, body: body_render, css } = render(RecursiveRender, {
|
|
707
791
|
props: {
|
|
708
792
|
layouts,
|
|
709
793
|
view,
|
package/dist-ssr/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sources":["../src/routing/component_loader/component_loader.ts","../src/routing/html_render/html_render.ts","../src/parser/path.ts","../src/parser/openapi.ts","../src/options/ServerOptions.ts","../src/routing/manifest/base.ts","../src/routing/server_adapter/api_adapter.ts","../src/routing/component_loader/component_manager.ts","../src/routing/server_adapter/middleware_adapter.ts","../src/routing/url_parser.ts","../src/routing/server_adapter/server_adapter.ts","../src/routing/server_adapter/express_server_adapter.ts","../src/server/server.ts"],"sourcesContent":["import type { SvelteComponent } from 'svelte';\nimport type { ViteDevServer } from 'vite';\nimport path from 'path';\nimport fs from 'fs';\n\nimport { SvelteImport, SvelteModuleComponent } from '../base';\n\n\n\n\n\n\n\n\ntype SvelteResource<K> = SvelteImport<K> & SvelteModuleComponent\n\nexport interface IComponentLoader{\n load(component: string,options?:any): Promise<SvelteResource<SvelteComponent>>\n \n}\n\n\n\n\nexport class BasicComponentLoader implements IComponentLoader {\n constructor(private basePath:string) {}\n \n async load(componentPath: string) {\n const component_full_path = path.join(this.basePath, componentPath);\n const module = await import(component_full_path);\n return module as SvelteResource<any>;\n }\n}\n\n\n\nexport class ViteComponentLoader implements IComponentLoader {\n constructor(private basePath:string, private vite: ViteDevServer) {}\n \n async load(componentPath: string, options = {use_base_path:true}): Promise<SvelteResource<any>> {\n let absoluteComponentPath: string;\n const use_base_path = options.use_base_path || false;\n\n if (use_base_path) {\n absoluteComponentPath = path.join(this.basePath, componentPath);\n } else {\n if (path.isAbsolute(componentPath)) {\n absoluteComponentPath = componentPath;\n } else {\n absoluteComponentPath = componentPath;\n }\n }\n\n let vitePath = path.relative(process.cwd(), absoluteComponentPath);\n\n vitePath = vitePath.replace(/\\\\/g, '/');\n\n if (!vitePath.startsWith('/')) {\n vitePath = '/' + vitePath;\n }\n try {\n const module = await this.vite.ssrLoadModule(vitePath);\n console.log(`[ViteComponentLoader] Module loaded successfully for: ${vitePath}`);\n if (!module || !module.default) {\n console.error(`[ViteComponentLoader] Loaded module for ${vitePath} is invalid or missing a default export. Module content:`, module);\n throw new Error(`Module ${vitePath} loaded successfully but is invalid or missing default export.`);\n }\n return module as SvelteResource<any>;\n } catch (error) {\n console.error(`[ViteComponentLoader] Error loading module for vitePath: ${vitePath} (derived from componentPath: ${componentPath})`, error);\n\n try {\n await fs.promises.access(absoluteComponentPath);\n } catch (fsError) {\n }\n throw error;\n }\n }\n}\n\n\nexport class ProdComponentLoader implements IComponentLoader {\n\n constructor(private base_path: string) {\n\n }\n async load(componentPath: string): Promise<SvelteResource<any>> {\n const component_path = path.join(this.base_path, componentPath);\n const module:any = await import(\n component_path.replace(/\\.svelte$/, '.js')\n );\n return module as SvelteResource<any>;\n }\n}\n\n","import Handlebars from 'handlebars'\nimport fs from \"fs/promises\"\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 return template(data)\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 return template(data)\n }\n async getTemplate(): Promise<string> {\n const file_content = await fs.readFile(this.html_path, 'utf8')\n return file_content\n }\n}","import type {IRoute} from \"./IRoute\"\n\n/**\n * Convert OpenAPI‐style `{name[:pattern][modifier]}` into\n * path-to-regexp’s `:name(pattern)?*+` syntax, while\n * allowing literal `{` or `}` inside the regex.\n */\nexport function convertBraces(path: string): string {\n let out = '';\n let i = 0;\n\n while (i < path.length) {\n if (path[i] === '{') {\n // start of a parameter spec\n let start = i;\n i++;\n // find the matching closing '}' that balances this one\n let depth = 1;\n while (i < path.length && depth > 0) {\n if (path[i] === '\\\\') {\n // skip escaped chars\n i += 2;\n } else {\n if (path[i] === '{') depth++;\n else if (path[i] === '}') depth--;\n i++;\n }\n }\n if (depth !== 0) {\n throw new Error(`Unmatched '{' in path: ${path}`);\n }\n const segment = path.slice(start + 1, i - 1);\n // A segment is one of the following forms:\n // 1. \"name\" – simple param, no pattern, no modifier\n // 2. \"name+\" / \"name*\" / \"name?\" – param with modifier only\n // 3. \"name:regex\" – explicit pattern (may itself contain +, *, ?)\n // In the third case we must **not** interpret a trailing +, * or ? as a\n // modifier because it belongs to the user-supplied regex. The original\n // implementation used a single regexp with an optional modifier group,\n // which incorrectly split patterns such as `.*` or `.+` into two parts\n // (`.` as the pattern and `*` or `+` as the modifier). Instead we now\n // split on the first ':'; if a pattern is present we treat the rest of\n // the segment verbatim.\n\n const colonIdx = segment.indexOf(':');\n let name: string;\n let pattern: string | undefined;\n let modifier: string | undefined;\n\n if (colonIdx === -1) {\n // Forms 1 & 2 – no explicit pattern, so a trailing modifier is allowed.\n const m = segment.match(/^([^?*+]+)([?*+])?$/);\n if (!m) {\n throw new Error(`Invalid parameter segment: {${segment}}`);\n }\n [, name, modifier] = m as RegExpMatchArray & [string, string, string?];\n } else {\n // Form 3 – everything after the first ':' is the pattern.\n name = segment.slice(0, colonIdx);\n pattern = segment.slice(colonIdx + 1);\n // No modifier allowed when an explicit pattern is used.\n }\n\n out += `:${name}`;\n if (pattern) out += `(${pattern})`;\n if (modifier) out += modifier;\n } else {\n // ordinary char, copy (also handles escaped chars)\n out += path[i++];\n }\n }\n\n return out;\n}\n\n\nexport function parsePathConfig(path:string,method:string,path_config:any):IRoute {\n const layout = path_config['x-layout']\n const view = path_config['x-view']\n const summary = path_config.summary\n const query = path_config.query\n const body = path_config.body\n const parameters = path_config.parameters\n const responses = path_config.responses\n\n return {\n summary,\n path: convertBraces(path),\n method,\n layout,\n view,\n responses,\n parameters,\n query,\n body\n }\n}\n","import yaml from 'js-yaml'\nimport clone from 'clone-deep'\nimport join from 'url-join'\nimport type {IRoute, IServerRoute} from \"./IRoute\"\nimport {parsePathConfig} from \"./path\"\nimport fs from 'fs'\n\nexport function parseConfigfile(file_content:string) {\n let config:any = null\n try {\n config = yaml.load(file_content)\n } catch (e) {\n console.log(e)\n }\n return config\n}\n\n\nexport function parse_modules(openapi:any){\n const modules_config = (openapi.modules || openapi.module)\n if (!modules_config) {\n return\n }\n\n const modules:any = Object.entries(modules_config).map(([_,module])=>{\n return module\n })\n\n\n const modules_path: IRoute[][] = modules.map((module:any) => {\n const basePath = module.basePath || ''\n const baseLayouts = module.baseLayouts || []\n\n const paths = module.paths\n\n if(!paths){\n return\n }\n\n const configurations = Object.entries(paths).map(([path, method_config]:[string,any]) => {\n return Object.entries(method_config).map(([method, config]) => {\n return parsePathConfig(path,method,config)\n })\n })\n\n const routes = configurations.reduce((flat_config,config)=>{\n return flat_config.concat(config)\n },[])\n\n routes.forEach((route:IRoute) => {\n route.path = join(basePath, route.path)\n route.layout = baseLayouts.concat(route.layout|| [])\n })\n return routes\n })\n\n return modules_path.reduce((flat_config,config)=>{\n return flat_config.concat(config)\n }\n ,[] as IRoute[])\n}\n\n\nexport function parse_paths(openapi:any){\n const paths = openapi.paths\n if (!paths) {\n return\n }\n\n const configurations = Object.entries(paths).map(([path, method_config]:[string,any]) => {\n return Object.entries(method_config).map(([method, config]) => {\n return parsePathConfig(path,method,config)\n })\n })\n\n const routes = configurations.reduce((flat_config,config)=>{\n return flat_config.concat(config)\n },[] as IRoute[])\n\n return routes\n}\n\n\n\n\nexport function transform_openapi_spec(openapi_spec:string) {\n\n const openapi = parseConfigfile(openapi_spec)\n const config = normalize_openapi_config(openapi)\n return yaml.dump(config)\n}\n\n\nexport function normalize_openapi_config(openapi_config:any){\n const config = clone(openapi_config)\n\n const modules = parse_modules(config) || []\n const paths = parse_paths(config) || []\n\n const routes = [...modules, ...paths]\n\n routes.forEach((route:IRoute) => {\n const path = route.path\n const method = route.method\n const config_path = config.paths[path] || {}\n const config_method = config_path[method] || {}\n\n config_method.summary = route.summary\n config_method.description = route.description\n config_method.parameters = route.parameters\n config_method.query = route.query\n config_method.body = route.body\n config_method.responses = route.responses\n config_method['x-view'] = route.view\n config_method['x-layout'] = route.layout\n\n config_path[method] = config_method\n config.paths[path] = config_path\n })\n\n delete config.modules\n return config\n}\n\n\n/**\n * Check if a YAML document is a stitch configuration file\n * @param document The parsed YAML document\n * @returns True if it's a stitch config, false otherwise\n */\nfunction isStitchConfig(document: any): boolean {\n return document && typeof document === 'object' && 'stitch' in document;\n}\n\n/**\n * Check if a YAML document is a regular OpenAPI file\n * @param document The parsed YAML document\n * @returns True if it's a regular OpenAPI file, false otherwise\n */\nfunction isOpenAPIConfig(document: any): boolean {\n return document && typeof document === 'object' && ('paths' in document || 'module' in document || 'modules' in document);\n}\n\nexport async function parse_openapi_config(openapi_config_path:string):Promise<IServerRoute>{\n const content = fs.readFileSync(openapi_config_path, 'utf8')\n const parsed_config = parseConfigfile(content)\n \n let openapi_config: any;\n \n if (isStitchConfig(parsed_config)) {\n // Handle stitch configuration - build using Node.js stitch engine\n console.log('Detected stitch configuration, building with Node.js stitch engine...');\n \n try {\n const { StitchEngine } = await import('@noego/stitch');\n \n const startTime = Date.now();\n const engine = new StitchEngine();\n const result = engine.buildSync(openapi_config_path, { format: 'json' });\n \n if (!result.success) {\n throw new Error(`Stitch build failed: ${result.error}`);\n }\n \n const buildTime = Date.now() - startTime;\n console.log(`INFO Stitch build completed in ${buildTime} ms – ${parsed_config.stitch ? parsed_config.stitch.length : 0} modules processed`);\n \n // Parse the JSON string result to get the JavaScript object\n openapi_config = typeof result.data === 'string' ? JSON.parse(result.data) : result.data;\n } catch (error) {\n throw new Error(`Failed to process stitch configuration: ${error instanceof Error ? error.message : String(error)}`);\n }\n } else if (isOpenAPIConfig(parsed_config)) {\n // Handle regular OpenAPI file (legacy path)\n console.log('Detected regular OpenAPI configuration');\n openapi_config = parsed_config;\n } else {\n throw new Error(`Invalid OpenAPI or stitch configuration file: ${openapi_config_path}. File must contain either 'stitch', 'paths', 'module', or 'modules' at the root level.`);\n }\n \n let modules = parse_modules(openapi_config) || []\n let paths = parse_paths(openapi_config) || []\n\n let fallback_layout = openapi_config['x-fallback-layout'] || null\n let fallback_view = openapi_config['x-fallback-view'] || null\n let fallback = {\n layout: fallback_layout ? [fallback_layout]:[],\n view: fallback_view\n }\n\n const routes = [...modules, ...paths]\n\n let config = {\n fallback,\n routes\n }\n return config\n}\n\n\nexport function transform_openapi_config(openapi_config:any):IRoute[] {\n let modules = parse_modules(openapi_config) || []\n let paths = parse_paths(openapi_config) || []\n\n let routes = [...modules, ...paths]\n return routes\n}\n","import path from 'path';\nimport type { IHTMLRender } from '../routing/html_render/html_render';\n\n\nexport type htmlRenderer = 'default' | string | IHTMLRender;\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?: Record<string,string[]>;\n}\n\n\nexport const defaultViteOptions:any = {\n appType: 'custom',\n root: process.cwd(), // Explicitly set root\n server: { middlewareMode: true },\n ssr: {\n noExternal: ['svelte', /^svelte\\/.*/] // Adjust if needed, maybe add your component specifically if still failing\n }\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};\n\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\";\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 return await layout_requires_server(route,loader) || await view_requires_server(route,loader)\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 layout=>{\n const component = await loader.load(layout)\n return !!component.load\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 const component = await loader.load(view)\n return !!component.load\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 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 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 server_data\n }\n\n}\n","import type { IRoute } from \"../../parser/IRoute\";\nimport type { IComponentLoader } from \"./component_loader\";\n\n\n\n\n\nexport class ComponentManager {\n\n constructor(\n private componentLoader: IComponentLoader\n ){\n\n }\n\n async getLayoutComponents(route:IRoute){\n const layout_paths = route.layout || [];\n const layouts_components = await Promise.all(layout_paths.map((layout)=>{\n console.log(\"layout path\",layout)\n return this.componentLoader.load(layout)}))\n return layouts_components\n }\n\n async getLayouts(route:IRoute){\n const layout_paths = route.layout || [];\n const layouts_components = await Promise.all(layout_paths.map(async (layout_path)=>{\n const layout = await this.componentLoader.load(layout_path)\n return layout.default\n \n }))\n return layouts_components\n }\n\n async getLayoutLoaders(route:IRoute){\n const layout_components = await this.getLayoutComponents(route)\n const layout_loaders = await Promise.all(layout_components.map(async (layout) => {\n return layout.load\n }))\n return layout_loaders\n }\n\n\n async getViewComponent(route: IRoute) {\n return await this.componentLoader.load(route.view)\n }\n async getView(route: IRoute) {\n const view = await this.componentLoader.load(route.view)\n return view.default\n }\n}\n","import type { IRoute } from \"../../parser/IRoute\";\nimport type { Callback } from \"../../types/Callback\";\nimport { ComponentManager } from \"../component_loader/component_manager\";\nimport type { RequestData } from \"./api_adapter\";\n\n\n\n\n\n\nexport class MiddlewareAdapter {\n constructor(\n private manager: ComponentManager,\n ) {\n \n\n }\n\n async handleMiddleware(req:any,reply:any,route:IRoute,request_data:RequestData,callback:Callback): Promise<any> {\n let components = await this.manager.getLayoutComponents(route)\n let middleware_stack = await Promise.all(components.map(async (component) => {\n const middleware = [ ...(component.middleware||[]), ...(component.middlewares||[]) ]\n return middleware \n }))\n const layout_middlewares = middleware_stack.flat() || []\n\n console.log(\"middleware stack loaded\",layout_middlewares)\n\n req.params = request_data.params\n\n await new Promise((resolve:any) => {\n this.runMiddleware(layout_middlewares, req, reply, resolve)\n })\n\n console.log(\"layout middleware executed\")\n console.log(\"view middleware loaded\")\n console.log(\"view middleware\",route.view)\n let view: any = {}\n if(route.view){\n view = await this.manager.getViewComponent(route)\n }\n let view_middlewares = [ ...(view.middleware||[]), ...(view.middlewares||[]) ]\n\n await new Promise((resolve:any) => {\n this.runMiddleware(view_middlewares, req, reply, resolve)\n })\n\n callback()\n\n }\n\n private runMiddleware<K>(middleware: K[], req: any, reply: any, callback:Callback):void {\n middleware = this.dedupe(middleware)\n let index = 0;\n if (middleware.length === 0) {\n callback()\n return\n }\n\n let next = () => {\n if (index >= middleware.length) {\n callback()\n return\n }\n const mw = middleware[index]\n index++\n if (typeof mw === 'function') {\n if(!reply.sent)\n mw(req, reply, next)\n } else {\n if (!reply.sent)\n next()\n }\n }\n next()\n\n }\n\n\n private dedupe(middlewares: any[]): any[] {\n return Array.from(new Set(middlewares));\n }\n}\n","import pathToRegex from 'path-to-regex';\nimport type { IRoute } from '../parser/IRoute';\n\n\n\nexport function makeUrlParser(pattern: string) {\n const parser = new pathToRegex(pattern);\n return (pathname: string) => {\n const result = parser.match(pathname);\n return result || null;\n };\n}\n\n\nexport type UrlMatcher = {\n pattern: string,\n parser: ReturnType<typeof makeUrlParser>\n}\n\nexport function findRoute(pathname:string, routes: UrlMatcher[]) {\n for (const { pattern, parser } of routes) {\n const params = parser(pathname);\n if (params) {\n return { pattern, params };\n }\n }\n return null;\n}\n\n\n\n\n\nexport function initialize_route_matchers(routes: IRoute[]): UrlMatcher[] {\n return routes.map((route: IRoute) => {\n const pattern = route.path;\n const parser = makeUrlParser(pattern);\n return { pattern, parser };\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 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 ApplicationRenderer from '#recursive-render'\nimport express from \"express\"\nimport type {Request,Response} from \"express\"\nimport type { IPage } from \"../page\"\n\n\n\nexport class ExpressServerAdapter extends ServerAdapter {\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 ) {\n super()\n }\n\n async handleRoutes(routes: IRoute[],manifest:any): Promise<void> {\n\n const matchers = initialize_route_matchers(routes)\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 = routes.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,routes,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 const context = {}\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 try{\n await new Promise((resolve: any,reject:any) => {\n this.middleware_adapter.handleMiddleware(req, res, route, request_data, resolve).catch(reject)\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 `)\n return\n }\n\n\n\n if (res.headersSent) {\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){\n console.log('Error getting view', e)\n res.status(500).send(`\n <h1>500 Internal Server Error</h1>\n <pre>${e}</pre>\n `)\n return\n }\n\n\n /**\n * Render HTML page\n */\n let html_render = ''\n let response_code = 200\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 let { head: head_render, body: body_render, 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 \n const head_routing = `\n <script type='text/javascript'>\n window.__ROUTING__ = ${JSON.stringify(routes)}\n </script>\n\n <script type='text/javascript'>\n window.__MANIFEST__ = ${JSON.stringify(manifest)}\n </script>\n\n <script type='text/javascript'>\n window.__INITIAL_DATA__ = ${JSON.stringify(server_data || {}).trim()}\n </script>\n `\n html_render = await this.htmlRender.renderHTML({\n HEAD: head_routing + (head_render || ''),\n CSS: css,\n APP: body_render\n })\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 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 await new Promise((resolve: any) => {\n this.middleware_adapter.handleMiddleware(req, res, route, request_data, resolve)\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 let { head: head_render, body: body_render, css }\n = render(ApplicationRenderer, {\n props: {\n layouts,\n view,\n data: server_data,\n params: request_data.params\n }\n }) as any\n\n\n /**\n * Render HTML page\n */\n const html_render = await this.htmlRender.renderHTML({\n HEAD: 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';\n\nimport deepmerge from 'deepmerge';\nimport fs from 'fs';\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 { 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\nexport async function createServer(app: express.Express, options?: ServerOptions): Promise<express.Express> {\n options = options || defaultOptions;\n const full_options = deepmerge(defaultOptions, options);\n\n full_options.open_api_path = ensureFullPath(full_options.viteOptions.root, full_options.open_api_path);\n\n \n const isProd = full_options.development === false;\n\n console.log(`Running in ${isProd ? 'production' : 'development'} mode`);\n const COMPONENT_DIR = path.join(full_options.viteOptions.root,full_options.component_dir);\n const root = full_options.viteOptions.root;\n let componentLoader;\n let vite;\n\n console.log(`Serving components from ${COMPONENT_DIR} at /components/`);\n\n if (full_options.assets) {\n for (const [asset_path, asset_dir] of Object.entries(full_options.assets)){\n\n for (const asset of asset_dir) {\n const asset_root = path.join(full_options.viteOptions.root, asset)\n\n app.use(asset_path,express.static(asset_root))\n console.log(`Serving assets from ${asset_root} at ${asset_path}`);\n }\n }\n }else{\n console.log(`No assets to serve`);\n }\n\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 componentLoader = new ViteComponentLoader(COMPONENT_DIR, vite);\n \n console.log('loaded')\n } else {\n console.log('Starting Vite in production mode...');\n app.use('/', express.static(path.join(options.viteOptions.root, full_options.build_dir)));\n console.log(`Serving static files from ${path.join(options.viteOptions.root, full_options.build_dir)} at /`);\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 const middleware_adapter = new MiddlewareAdapter(manager);\n const adapter = new ExpressServerAdapter(\n app, \n manager,\n htmlRenderer,\n api_adapter,\n middleware_adapter\n );\n\n await adapter.handleRoutes(routeDefs as IRoute[],manifest);\n console.log('Routes registered');\n\n if (!isProd) {\n // Add Vite middleware AFTER Forge routes are registered\n app.use(vite.middlewares);\n \n // //Add the manifest endpoint when working in dev mode\n // app.get(full_options.manifest_endpoint, async (_, res) => {\n // res.type('application/json')\n // const manifest = await new ManifestBuilder(\n // full_options.open_api_path,\n // componentLoader, \n // full_options\n // ).buildManifest()\n\n // res.send(manifest)\n // })\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":["fs","path","acc","layout","loader"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"server.js","sources":["../src/routing/component_loader/component_loader.ts","../src/routing/html_render/html_render.ts","../src/parser/path.ts","../src/parser/openapi.ts","../src/options/ServerOptions.ts","../src/routing/manifest/base.ts","../src/routing/server_adapter/api_adapter.ts","../src/routing/component_loader/component_manager.ts","../src/routing/server_adapter/middleware_adapter.ts","../src/routing/url_parser.ts","../src/routing/server_adapter/server_adapter.ts","../src/components/RecursiveRender.svelte","../src/routing/server_adapter/express_server_adapter.ts","../src/server/server.ts"],"sourcesContent":["import type { SvelteComponent } from 'svelte';\nimport type { ViteDevServer } from 'vite';\nimport path from 'path';\nimport fs from 'fs';\n\nimport { SvelteImport, SvelteModuleComponent } from '../base';\n\n\n\n\n\n\n\n\ntype SvelteResource<K> = SvelteImport<K> & SvelteModuleComponent\n\nexport interface IComponentLoader{\n load(component: string,options?:any): Promise<SvelteResource<SvelteComponent>>\n \n}\n\n\n\n\nexport class BasicComponentLoader implements IComponentLoader {\n constructor(private basePath:string) {}\n \n async load(componentPath: string) {\n const component_full_path = path.join(this.basePath, componentPath);\n const module = await import(component_full_path);\n return module as SvelteResource<any>;\n }\n}\n\n\n\nexport class ViteComponentLoader implements IComponentLoader {\n constructor(private basePath:string, private vite: ViteDevServer) {}\n \n async load(componentPath: string, options = {use_base_path:true}): Promise<SvelteResource<any>> {\n let absoluteComponentPath: string;\n const use_base_path = options.use_base_path || false;\n\n if (use_base_path) {\n absoluteComponentPath = path.join(this.basePath, componentPath);\n } else {\n if (path.isAbsolute(componentPath)) {\n absoluteComponentPath = componentPath;\n } else {\n absoluteComponentPath = componentPath;\n }\n }\n\n let vitePath = path.relative(process.cwd(), absoluteComponentPath);\n\n vitePath = vitePath.replace(/\\\\/g, '/');\n\n if (!vitePath.startsWith('/')) {\n vitePath = '/' + vitePath;\n }\n try {\n const module = await this.vite.ssrLoadModule(vitePath);\n console.log(`[ViteComponentLoader] Module loaded successfully for: ${vitePath}`);\n if (!module || !module.default) {\n console.error(`[ViteComponentLoader] Loaded module for ${vitePath} is invalid or missing a default export. Module content:`, module);\n throw new Error(`Module ${vitePath} loaded successfully but is invalid or missing default export.`);\n }\n return module as SvelteResource<any>;\n } catch (error) {\n console.error(`[ViteComponentLoader] Error loading module for vitePath: ${vitePath} (derived from componentPath: ${componentPath})`, error);\n\n try {\n await fs.promises.access(absoluteComponentPath);\n } catch (fsError) {\n }\n throw error;\n }\n }\n}\n\n\nexport class ProdComponentLoader implements IComponentLoader {\n\n constructor(private base_path: string) {\n\n }\n async load(componentPath: string): Promise<SvelteResource<any>> {\n const component_path = path.join(this.base_path, componentPath);\n const module:any = await import(\n component_path.replace(/\\.svelte$/, '.js')\n );\n return module as SvelteResource<any>;\n }\n}\n\n","import Handlebars from 'handlebars'\nimport fs from \"fs/promises\"\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 return template(data)\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 return template(data)\n }\n async getTemplate(): Promise<string> {\n const file_content = await fs.readFile(this.html_path, 'utf8')\n return file_content\n }\n}","import type {IRoute} from \"./IRoute\"\n\n/**\n * Convert OpenAPI‐style `{name[:pattern][modifier]}` into\n * path-to-regexp’s `:name(pattern)?*+` syntax, while\n * allowing literal `{` or `}` inside the regex.\n */\nexport function convertBraces(path: string): string {\n let out = '';\n let i = 0;\n\n while (i < path.length) {\n if (path[i] === '{') {\n // start of a parameter spec\n let start = i;\n i++;\n // find the matching closing '}' that balances this one\n let depth = 1;\n while (i < path.length && depth > 0) {\n if (path[i] === '\\\\') {\n // skip escaped chars\n i += 2;\n } else {\n if (path[i] === '{') depth++;\n else if (path[i] === '}') depth--;\n i++;\n }\n }\n if (depth !== 0) {\n throw new Error(`Unmatched '{' in path: ${path}`);\n }\n const segment = path.slice(start + 1, i - 1);\n // A segment is one of the following forms:\n // 1. \"name\" – simple param, no pattern, no modifier\n // 2. \"name+\" / \"name*\" / \"name?\" – param with modifier only\n // 3. \"name:regex\" – explicit pattern (may itself contain +, *, ?)\n // In the third case we must **not** interpret a trailing +, * or ? as a\n // modifier because it belongs to the user-supplied regex. The original\n // implementation used a single regexp with an optional modifier group,\n // which incorrectly split patterns such as `.*` or `.+` into two parts\n // (`.` as the pattern and `*` or `+` as the modifier). Instead we now\n // split on the first ':'; if a pattern is present we treat the rest of\n // the segment verbatim.\n\n const colonIdx = segment.indexOf(':');\n let name: string;\n let pattern: string | undefined;\n let modifier: string | undefined;\n\n if (colonIdx === -1) {\n // Forms 1 & 2 – no explicit pattern, so a trailing modifier is allowed.\n const m = segment.match(/^([^?*+]+)([?*+])?$/);\n if (!m) {\n throw new Error(`Invalid parameter segment: {${segment}}`);\n }\n [, name, modifier] = m as RegExpMatchArray & [string, string, string?];\n } else {\n // Form 3 – everything after the first ':' is the pattern.\n name = segment.slice(0, colonIdx);\n pattern = segment.slice(colonIdx + 1);\n // No modifier allowed when an explicit pattern is used.\n }\n\n out += `:${name}`;\n if (pattern) out += `(${pattern})`;\n if (modifier) out += modifier;\n } else {\n // ordinary char, copy (also handles escaped chars)\n out += path[i++];\n }\n }\n\n return out;\n}\n\n\nexport function parsePathConfig(path:string,method:string,path_config:any):IRoute {\n const layout = path_config['x-layout']\n const view = path_config['x-view']\n const summary = path_config.summary\n const query = path_config.query\n const body = path_config.body\n const parameters = path_config.parameters\n const responses = path_config.responses\n\n return {\n summary,\n path: convertBraces(path),\n method,\n layout,\n view,\n responses,\n parameters,\n query,\n body\n }\n}\n","import yaml from 'js-yaml'\nimport clone from 'clone-deep'\nimport join from 'url-join'\nimport type {IRoute, IServerRoute} from \"./IRoute\"\nimport {parsePathConfig} from \"./path\"\nimport fs from 'fs'\n\nexport function parseConfigfile(file_content:string) {\n let config:any = null\n try {\n config = yaml.load(file_content)\n } catch (e) {\n console.log(e)\n }\n return config\n}\n\n\nexport function parse_modules(openapi:any){\n const modules_config = (openapi.modules || openapi.module)\n if (!modules_config) {\n return\n }\n\n const modules:any = Object.entries(modules_config).map(([_,module])=>{\n return module\n })\n\n\n const modules_path: IRoute[][] = modules.map((module:any) => {\n const basePath = module.basePath || ''\n const baseLayouts = module.baseLayouts || []\n\n const paths = module.paths\n\n if(!paths){\n return\n }\n\n const configurations = Object.entries(paths).map(([path, method_config]:[string,any]) => {\n return Object.entries(method_config).map(([method, config]) => {\n return parsePathConfig(path,method,config)\n })\n })\n\n const routes = configurations.reduce((flat_config,config)=>{\n return flat_config.concat(config)\n },[])\n\n routes.forEach((route:IRoute) => {\n route.path = join(basePath, route.path)\n route.layout = baseLayouts.concat(route.layout|| [])\n })\n return routes\n })\n\n return modules_path.reduce((flat_config,config)=>{\n return flat_config.concat(config)\n }\n ,[] as IRoute[])\n}\n\n\nexport function parse_paths(openapi:any){\n const paths = openapi.paths\n if (!paths) {\n return\n }\n\n const configurations = Object.entries(paths).map(([path, method_config]:[string,any]) => {\n return Object.entries(method_config).map(([method, config]) => {\n return parsePathConfig(path,method,config)\n })\n })\n\n const routes = configurations.reduce((flat_config,config)=>{\n return flat_config.concat(config)\n },[] as IRoute[])\n\n return routes\n}\n\n\n\n\nexport function transform_openapi_spec(openapi_spec:string) {\n\n const openapi = parseConfigfile(openapi_spec)\n const config = normalize_openapi_config(openapi)\n return yaml.dump(config)\n}\n\n\nexport function normalize_openapi_config(openapi_config:any){\n const config = clone(openapi_config)\n\n const modules = parse_modules(config) || []\n const paths = parse_paths(config) || []\n\n const routes = [...modules, ...paths]\n\n routes.forEach((route:IRoute) => {\n const path = route.path\n const method = route.method\n const config_path = config.paths[path] || {}\n const config_method = config_path[method] || {}\n\n config_method.summary = route.summary\n config_method.description = route.description\n config_method.parameters = route.parameters\n config_method.query = route.query\n config_method.body = route.body\n config_method.responses = route.responses\n config_method['x-view'] = route.view\n config_method['x-layout'] = route.layout\n\n config_path[method] = config_method\n config.paths[path] = config_path\n })\n\n delete config.modules\n return config\n}\n\n\n/**\n * Check if a YAML document is a stitch configuration file\n * @param document The parsed YAML document\n * @returns True if it's a stitch config, false otherwise\n */\nfunction isStitchConfig(document: any): boolean {\n return document && typeof document === 'object' && 'stitch' in document;\n}\n\n/**\n * Check if a YAML document is a regular OpenAPI file\n * @param document The parsed YAML document\n * @returns True if it's a regular OpenAPI file, false otherwise\n */\nfunction isOpenAPIConfig(document: any): boolean {\n return document && typeof document === 'object' && ('paths' in document || 'module' in document || 'modules' in document);\n}\n\nexport async function parse_openapi_config(openapi_config_path:string):Promise<IServerRoute>{\n const content = fs.readFileSync(openapi_config_path, 'utf8')\n const parsed_config = parseConfigfile(content)\n \n let openapi_config: any;\n \n if (isStitchConfig(parsed_config)) {\n // Handle stitch configuration - build using Node.js stitch engine\n console.log('Detected stitch configuration, building with Node.js stitch engine...');\n \n try {\n const { StitchEngine } = await import('@noego/stitch');\n \n const startTime = Date.now();\n const engine = new StitchEngine();\n const result = engine.buildSync(openapi_config_path, { format: 'json' });\n \n if (!result.success) {\n throw new Error(`Stitch build failed: ${result.error}`);\n }\n \n const buildTime = Date.now() - startTime;\n console.log(`INFO Stitch build completed in ${buildTime} ms – ${parsed_config.stitch ? parsed_config.stitch.length : 0} modules processed`);\n \n // Parse the JSON string result to get the JavaScript object\n openapi_config = typeof result.data === 'string' ? JSON.parse(result.data) : result.data;\n } catch (error) {\n throw new Error(`Failed to process stitch configuration: ${error instanceof Error ? error.message : String(error)}`);\n }\n } else if (isOpenAPIConfig(parsed_config)) {\n // Handle regular OpenAPI file (legacy path)\n console.log('Detected regular OpenAPI configuration');\n openapi_config = parsed_config;\n } else {\n throw new Error(`Invalid OpenAPI or stitch configuration file: ${openapi_config_path}. File must contain either 'stitch', 'paths', 'module', or 'modules' at the root level.`);\n }\n \n let modules = parse_modules(openapi_config) || []\n let paths = parse_paths(openapi_config) || []\n\n let fallback_layout = openapi_config['x-fallback-layout'] || null\n let fallback_view = openapi_config['x-fallback-view'] || null\n let fallback = {\n layout: fallback_layout ? [fallback_layout]:[],\n view: fallback_view\n }\n\n const routes = [...modules, ...paths]\n\n let config = {\n fallback,\n routes\n }\n return config\n}\n\n\nexport function transform_openapi_config(openapi_config:any):IRoute[] {\n let modules = parse_modules(openapi_config) || []\n let paths = parse_paths(openapi_config) || []\n\n let routes = [...modules, ...paths]\n return routes\n}\n","import path from 'path';\nimport type { IHTMLRender } from '../routing/html_render/html_render';\n\n\nexport type htmlRenderer = 'default' | string | IHTMLRender;\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?: Record<string,string[]>;\n}\n\n\nexport const defaultViteOptions:any = {\n appType: 'custom',\n root: process.cwd(), // Explicitly set root\n server: { middlewareMode: true },\n ssr: {\n noExternal: ['svelte', /^svelte\\/.*/] // Adjust if needed, maybe add your component specifically if still failing\n }\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};\n\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\";\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 return await layout_requires_server(route,loader) || await view_requires_server(route,loader)\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 layout=>{\n const component = await loader.load(layout)\n return !!component.load\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 const component = await loader.load(view)\n return !!component.load\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 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 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 server_data\n }\n\n}\n","import type { IRoute } from \"../../parser/IRoute\";\nimport type { IComponentLoader } from \"./component_loader\";\n\n\n\n\n\nexport class ComponentManager {\n\n constructor(\n private componentLoader: IComponentLoader\n ){\n\n }\n\n async getLayoutComponents(route:IRoute){\n const layout_paths = route.layout || [];\n const layouts_components = await Promise.all(layout_paths.map((layout)=>{\n console.log(\"layout path\",layout)\n return this.componentLoader.load(layout)}))\n return layouts_components\n }\n\n async getLayouts(route:IRoute){\n const layout_paths = route.layout || [];\n const layouts_components = await Promise.all(layout_paths.map(async (layout_path)=>{\n const layout = await this.componentLoader.load(layout_path)\n return layout.default\n \n }))\n return layouts_components\n }\n\n async getLayoutLoaders(route:IRoute){\n const layout_components = await this.getLayoutComponents(route)\n const layout_loaders = await Promise.all(layout_components.map(async (layout) => {\n return layout.load\n }))\n return layout_loaders\n }\n\n\n async getViewComponent(route: IRoute) {\n return await this.componentLoader.load(route.view)\n }\n async getView(route: IRoute) {\n const view = await this.componentLoader.load(route.view)\n return view.default\n }\n}\n","import type { IRoute } from \"../../parser/IRoute\";\nimport type { Callback } from \"../../types/Callback\";\nimport { ComponentManager } from \"../component_loader/component_manager\";\nimport type { RequestData } from \"./api_adapter\";\n\n\n\n\n\n\nexport class MiddlewareAdapter {\n constructor(\n private manager: ComponentManager,\n ) {\n \n\n }\n\n async handleMiddleware(req:any,reply:any,route:IRoute,request_data:RequestData,callback:Callback): Promise<any> {\n let components = await this.manager.getLayoutComponents(route)\n let middleware_stack = await Promise.all(components.map(async (component) => {\n const middleware = [ ...(component.middleware||[]), ...(component.middlewares||[]) ]\n return middleware \n }))\n const layout_middlewares = middleware_stack.flat() || []\n\n console.log(\"middleware stack loaded\",layout_middlewares)\n\n req.params = request_data.params\n\n await new Promise((resolve:any) => {\n this.runMiddleware(layout_middlewares, req, reply, resolve)\n })\n\n console.log(\"layout middleware executed\")\n console.log(\"view middleware loaded\")\n console.log(\"view middleware\",route.view)\n let view: any = {}\n if(route.view){\n view = await this.manager.getViewComponent(route)\n }\n let view_middlewares = [ ...(view.middleware||[]), ...(view.middlewares||[]) ]\n\n await new Promise((resolve:any) => {\n this.runMiddleware(view_middlewares, req, reply, resolve)\n })\n\n callback()\n\n }\n\n private runMiddleware<K>(middleware: K[], req: any, reply: any, callback:Callback):void {\n middleware = this.dedupe(middleware)\n let index = 0;\n if (middleware.length === 0) {\n callback()\n return\n }\n\n let next = () => {\n if (index >= middleware.length) {\n callback()\n return\n }\n const mw = middleware[index]\n index++\n if (typeof mw === 'function') {\n if(!reply.sent)\n mw(req, reply, next)\n } else {\n if (!reply.sent)\n next()\n }\n }\n next()\n\n }\n\n\n private dedupe(middlewares: any[]): any[] {\n return Array.from(new Set(middlewares));\n }\n}\n","import pathToRegex from 'path-to-regex';\nimport type { IRoute } from '../parser/IRoute';\n\n\n\nexport function makeUrlParser(pattern: string) {\n const parser = new pathToRegex(pattern);\n return (pathname: string) => {\n const result = parser.match(pathname);\n return result || null;\n };\n}\n\n\nexport type UrlMatcher = {\n pattern: string,\n parser: ReturnType<typeof makeUrlParser>\n}\n\nexport function findRoute(pathname:string, routes: UrlMatcher[]) {\n for (const { pattern, parser } of routes) {\n const params = parser(pathname);\n if (params) {\n return { pattern, params };\n }\n }\n return null;\n}\n\n\n\n\n\nexport function initialize_route_matchers(routes: IRoute[]): UrlMatcher[] {\n return routes.map((route: IRoute) => {\n const pattern = route.path;\n const parser = makeUrlParser(pattern);\n return { pattern, parser };\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","\n\n<script lang=\"ts\">\n export let layouts = []\n export let view = null\n export let data = {} as any\n export let params = {}\n export let urlParams = {}\n export let query = {}\n export let page = null\n\n console.log('[page]',page);\n\n $: [topLayout,...childlayouts] = layouts\n $: [top_data,...other_data] = data.layout || []\n $: view_data = data.view\n $: recursive_child_data = {\n layout:other_data,\n view:data.view\n }\n</script>\n\n{#if childlayouts.length > 0}\n <svelte:component this={topLayout} {...(top_data||{})} params={params} urlParams={urlParams} query={query} page={page}>\n <svelte:self layouts={childlayouts} view={view} data={recursive_child_data} params={params} urlParams={urlParams} query={query} page={page}/>\n </svelte:component>\n{:else if topLayout}\n <svelte:component this={topLayout} {...(top_data||{})} params={params} urlParams={urlParams} query={query} page={page}>\n <svelte:component this={view} {...(view_data||{})} params={params} urlParams={urlParams} query={query} page={page}/>\n </svelte:component>\n{:else}\n <svelte:component this={view} {...(view_data||{})} params={params} urlParams={urlParams} query={query} page={page}/>\n{/if}\n\n\n","import { render } from \"svelte/server\"\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 ApplicationRenderer from '#recursive-render'\nimport express from \"express\"\nimport type {Request,Response} from \"express\"\nimport type { IPage } from \"../page\"\n\n\n\nexport class ExpressServerAdapter extends ServerAdapter {\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 ) {\n super()\n }\n\n async handleRoutes(routes: IRoute[],manifest:any): Promise<void> {\n\n const matchers = initialize_route_matchers(routes)\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 = routes.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,routes,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 const context = {}\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 try{\n await new Promise((resolve: any,reject:any) => {\n this.middleware_adapter.handleMiddleware(req, res, route, request_data, resolve).catch(reject)\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 `)\n return\n }\n\n\n\n if (res.headersSent) {\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){\n console.log('Error getting view', e)\n res.status(500).send(`\n <h1>500 Internal Server Error</h1>\n <pre>${e}</pre>\n `)\n return\n }\n\n\n /**\n * Render HTML page\n */\n let html_render = ''\n let response_code = 200\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 let { head: head_render, body: body_render, 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 \n const head_routing = `\n <script type='text/javascript'>\n window.__ROUTING__ = ${JSON.stringify(routes)}\n </script>\n\n <script type='text/javascript'>\n window.__MANIFEST__ = ${JSON.stringify(manifest)}\n </script>\n\n <script type='text/javascript'>\n window.__INITIAL_DATA__ = ${JSON.stringify(server_data || {}).trim()}\n </script>\n `\n html_render = await this.htmlRender.renderHTML({\n HEAD: head_routing + (head_render || ''),\n CSS: css,\n APP: body_render\n })\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 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 await new Promise((resolve: any) => {\n this.middleware_adapter.handleMiddleware(req, res, route, request_data, resolve)\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 let { head: head_render, body: body_render, css }\n = render(ApplicationRenderer, {\n props: {\n layouts,\n view,\n data: server_data,\n params: request_data.params\n }\n }) as any\n\n\n /**\n * Render HTML page\n */\n const html_render = await this.htmlRender.renderHTML({\n HEAD: 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';\n\nimport deepmerge from 'deepmerge';\nimport fs from 'fs';\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 { 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\nexport async function createServer(app: express.Express, options?: ServerOptions): Promise<express.Express> {\n options = options || defaultOptions;\n const full_options = deepmerge(defaultOptions, options);\n\n full_options.open_api_path = ensureFullPath(full_options.viteOptions.root, full_options.open_api_path);\n\n \n const isProd = full_options.development === false;\n\n console.log(`Running in ${isProd ? 'production' : 'development'} mode`);\n const COMPONENT_DIR = path.join(full_options.viteOptions.root,full_options.component_dir);\n const root = full_options.viteOptions.root;\n let componentLoader;\n let vite;\n\n console.log(`Serving components from ${COMPONENT_DIR} at /components/`);\n\n if (full_options.assets) {\n for (const [asset_path, asset_dir] of Object.entries(full_options.assets)){\n\n for (const asset of asset_dir) {\n const asset_root = path.join(full_options.viteOptions.root, asset)\n\n app.use(asset_path,express.static(asset_root))\n console.log(`Serving assets from ${asset_root} at ${asset_path}`);\n }\n }\n }else{\n console.log(`No assets to serve`);\n }\n\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 componentLoader = new ViteComponentLoader(COMPONENT_DIR, vite);\n \n console.log('loaded')\n } else {\n console.log('Starting Vite in production mode...');\n app.use('/', express.static(path.join(options.viteOptions.root, full_options.build_dir)));\n console.log(`Serving static files from ${path.join(options.viteOptions.root, full_options.build_dir)} at /`);\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 const middleware_adapter = new MiddlewareAdapter(manager);\n const adapter = new ExpressServerAdapter(\n app, \n manager,\n htmlRenderer,\n api_adapter,\n middleware_adapter\n );\n\n await adapter.handleRoutes(routeDefs as IRoute[],manifest);\n console.log('Routes registered');\n\n if (!isProd) {\n // Add Vite middleware AFTER Forge routes are registered\n app.use(vite.middlewares);\n \n // //Add the manifest endpoint when working in dev mode\n // app.get(full_options.manifest_endpoint, async (_, res) => {\n // res.type('application/json')\n // const manifest = await new ManifestBuilder(\n // full_options.open_api_path,\n // componentLoader, \n // full_options\n // ).buildManifest()\n\n // res.send(manifest)\n // })\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":["fs","path","acc","layout","loader","$$payload","ApplicationRenderer"],"mappings":"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"}
|