@noego/forge 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (145) hide show
  1. package/README.md +620 -0
  2. package/dist/client/client.d.ts +8 -0
  3. package/dist/client/client.d.ts.map +1 -0
  4. package/dist/client/events.d.ts +4 -0
  5. package/dist/client/events.d.ts.map +1 -0
  6. package/dist/client/index.d.ts +6 -0
  7. package/dist/client/index.d.ts.map +1 -0
  8. package/dist/client/navigation.svelte.d.ts +4 -0
  9. package/dist/client/navigation.svelte.d.ts.map +1 -0
  10. package/dist/client/page.svelte.d.ts +4 -0
  11. package/dist/client/page.svelte.d.ts.map +1 -0
  12. package/dist/client.cjs +2 -0
  13. package/dist/client.cjs.map +1 -0
  14. package/dist/client.d.ts +2 -0
  15. package/dist/client.mjs +605 -0
  16. package/dist/client.mjs.map +1 -0
  17. package/dist/index.d.ts +3 -0
  18. package/dist/index.d.ts.map +1 -0
  19. package/dist/options/ServerOptions.d.ts +16 -0
  20. package/dist/options/ServerOptions.d.ts.map +1 -0
  21. package/dist/page.cjs +2 -0
  22. package/dist/page.cjs.map +1 -0
  23. package/dist/page.d.ts +2 -0
  24. package/dist/page.mjs +7 -0
  25. package/dist/page.mjs.map +1 -0
  26. package/dist/page.svelte-C4chAYK2.js +137 -0
  27. package/dist/page.svelte-C4chAYK2.js.map +1 -0
  28. package/dist/page.svelte-Dvj7306U.cjs +2 -0
  29. package/dist/page.svelte-Dvj7306U.cjs.map +1 -0
  30. package/dist/parser/IRoute.d.ts +31 -0
  31. package/dist/parser/IRoute.d.ts.map +1 -0
  32. package/dist/parser/openapi.d.ts +9 -0
  33. package/dist/parser/openapi.d.ts.map +1 -0
  34. package/dist/parser/path.d.ts +9 -0
  35. package/dist/parser/path.d.ts.map +1 -0
  36. package/dist/routing/base.d.ts +10 -0
  37. package/dist/routing/base.d.ts.map +1 -0
  38. package/dist/routing/component_loader/component_loader.d.ts +27 -0
  39. package/dist/routing/component_loader/component_loader.d.ts.map +1 -0
  40. package/dist/routing/component_loader/component_manager.d.ts +12 -0
  41. package/dist/routing/component_loader/component_manager.d.ts.map +1 -0
  42. package/dist/routing/html_render/html_render.d.ts +20 -0
  43. package/dist/routing/html_render/html_render.d.ts.map +1 -0
  44. package/dist/routing/manifest/base.d.ts +11 -0
  45. package/dist/routing/manifest/base.d.ts.map +1 -0
  46. package/dist/routing/manifest/store.svelte.d.ts +3 -0
  47. package/dist/routing/manifest/store.svelte.d.ts.map +1 -0
  48. package/dist/routing/page.d.ts +7 -0
  49. package/dist/routing/page.d.ts.map +1 -0
  50. package/dist/routing/server_adapter/api_adapter.d.ts +23 -0
  51. package/dist/routing/server_adapter/api_adapter.d.ts.map +1 -0
  52. package/dist/routing/server_adapter/express_server_adapter.d.ts +20 -0
  53. package/dist/routing/server_adapter/express_server_adapter.d.ts.map +1 -0
  54. package/dist/routing/server_adapter/middleware_adapter.d.ts +12 -0
  55. package/dist/routing/server_adapter/middleware_adapter.d.ts.map +1 -0
  56. package/dist/routing/server_adapter/server_adapter.d.ts +5 -0
  57. package/dist/routing/server_adapter/server_adapter.d.ts.map +1 -0
  58. package/dist/routing/shadow/shadow_route.d.ts +2 -0
  59. package/dist/routing/shadow/shadow_route.d.ts.map +1 -0
  60. package/dist/routing/url_parser.d.ts +12 -0
  61. package/dist/routing/url_parser.d.ts.map +1 -0
  62. package/dist/server/server.d.ts +5 -0
  63. package/dist/server/server.d.ts.map +1 -0
  64. package/dist/shared.cjs +2 -0
  65. package/dist/shared.cjs.map +1 -0
  66. package/dist/shared.d.ts +2 -0
  67. package/dist/shared.d.ts.map +1 -0
  68. package/dist/shared.mjs +5 -0
  69. package/dist/shared.mjs.map +1 -0
  70. package/dist/types/Callback.d.ts +2 -0
  71. package/dist/types/Callback.d.ts.map +1 -0
  72. package/dist/types/FetchMiddleware.d.ts +21 -0
  73. package/dist/types/FetchMiddleware.d.ts.map +1 -0
  74. package/dist/vite-env.d.ts +19 -0
  75. package/dist-ssr/client/client.d.ts +8 -0
  76. package/dist-ssr/client/client.d.ts.map +1 -0
  77. package/dist-ssr/client/events.d.ts +4 -0
  78. package/dist-ssr/client/events.d.ts.map +1 -0
  79. package/dist-ssr/client/index.d.ts +6 -0
  80. package/dist-ssr/client/index.d.ts.map +1 -0
  81. package/dist-ssr/client/navigation.svelte.d.ts +4 -0
  82. package/dist-ssr/client/navigation.svelte.d.ts.map +1 -0
  83. package/dist-ssr/client/page.svelte.d.ts +4 -0
  84. package/dist-ssr/client/page.svelte.d.ts.map +1 -0
  85. package/dist-ssr/index.d.ts +3 -0
  86. package/dist-ssr/index.d.ts.map +1 -0
  87. package/dist-ssr/options/ServerOptions.d.ts +16 -0
  88. package/dist-ssr/options/ServerOptions.d.ts.map +1 -0
  89. package/dist-ssr/parser/IRoute.d.ts +31 -0
  90. package/dist-ssr/parser/IRoute.d.ts.map +1 -0
  91. package/dist-ssr/parser/openapi.d.ts +9 -0
  92. package/dist-ssr/parser/openapi.d.ts.map +1 -0
  93. package/dist-ssr/parser/path.d.ts +9 -0
  94. package/dist-ssr/parser/path.d.ts.map +1 -0
  95. package/dist-ssr/path-CyGuWUeq.cjs +68 -0
  96. package/dist-ssr/path-CyGuWUeq.cjs.map +1 -0
  97. package/dist-ssr/path-ODk1FhWY.js +69 -0
  98. package/dist-ssr/path-ODk1FhWY.js.map +1 -0
  99. package/dist-ssr/routing/base.d.ts +10 -0
  100. package/dist-ssr/routing/base.d.ts.map +1 -0
  101. package/dist-ssr/routing/component_loader/component_loader.d.ts +27 -0
  102. package/dist-ssr/routing/component_loader/component_loader.d.ts.map +1 -0
  103. package/dist-ssr/routing/component_loader/component_manager.d.ts +12 -0
  104. package/dist-ssr/routing/component_loader/component_manager.d.ts.map +1 -0
  105. package/dist-ssr/routing/html_render/html_render.d.ts +20 -0
  106. package/dist-ssr/routing/html_render/html_render.d.ts.map +1 -0
  107. package/dist-ssr/routing/manifest/base.d.ts +11 -0
  108. package/dist-ssr/routing/manifest/base.d.ts.map +1 -0
  109. package/dist-ssr/routing/manifest/store.svelte.d.ts +3 -0
  110. package/dist-ssr/routing/manifest/store.svelte.d.ts.map +1 -0
  111. package/dist-ssr/routing/page.d.ts +7 -0
  112. package/dist-ssr/routing/page.d.ts.map +1 -0
  113. package/dist-ssr/routing/server_adapter/api_adapter.d.ts +23 -0
  114. package/dist-ssr/routing/server_adapter/api_adapter.d.ts.map +1 -0
  115. package/dist-ssr/routing/server_adapter/express_server_adapter.d.ts +20 -0
  116. package/dist-ssr/routing/server_adapter/express_server_adapter.d.ts.map +1 -0
  117. package/dist-ssr/routing/server_adapter/middleware_adapter.d.ts +12 -0
  118. package/dist-ssr/routing/server_adapter/middleware_adapter.d.ts.map +1 -0
  119. package/dist-ssr/routing/server_adapter/server_adapter.d.ts +5 -0
  120. package/dist-ssr/routing/server_adapter/server_adapter.d.ts.map +1 -0
  121. package/dist-ssr/routing/shadow/shadow_route.d.ts +2 -0
  122. package/dist-ssr/routing/shadow/shadow_route.d.ts.map +1 -0
  123. package/dist-ssr/routing/url_parser.d.ts +12 -0
  124. package/dist-ssr/routing/url_parser.d.ts.map +1 -0
  125. package/dist-ssr/server/server.d.ts +5 -0
  126. package/dist-ssr/server/server.d.ts.map +1 -0
  127. package/dist-ssr/server.cjs +876 -0
  128. package/dist-ssr/server.cjs.map +1 -0
  129. package/dist-ssr/server.d.ts +2 -0
  130. package/dist-ssr/server.js +838 -0
  131. package/dist-ssr/server.js.map +1 -0
  132. package/dist-ssr/shared.cjs +31 -0
  133. package/dist-ssr/shared.cjs.map +1 -0
  134. package/dist-ssr/shared.d.ts +2 -0
  135. package/dist-ssr/shared.d.ts.map +1 -0
  136. package/dist-ssr/shared.js +31 -0
  137. package/dist-ssr/shared.js.map +1 -0
  138. package/dist-ssr/types/Callback.d.ts +2 -0
  139. package/dist-ssr/types/Callback.d.ts.map +1 -0
  140. package/dist-ssr/types/FetchMiddleware.d.ts +21 -0
  141. package/dist-ssr/types/FetchMiddleware.d.ts.map +1 -0
  142. package/dist-ssr/vite-env.d.ts +19 -0
  143. package/loaders/loader.mjs +20 -0
  144. package/package.json +121 -0
  145. package/schema.json +333 -0
@@ -0,0 +1,876 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") {
11
+ for (let key of __getOwnPropNames(from))
12
+ if (!__hasOwnProp.call(to, key) && key !== except)
13
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
+ }
15
+ return to;
16
+ };
17
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
18
+ // If the importer is in node compatibility mode or this is not an ESM
19
+ // file that has been converted to a CommonJS file using a Babel-
20
+ // compatible transform (i.e. "__esModule" has not been set), then set
21
+ // "default" to the CommonJS "module.exports" for node compatibility.
22
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
23
+ mod
24
+ ));
25
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
26
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
27
+ const express = require("express");
28
+ const path = require("path");
29
+ const deepmerge = require("deepmerge");
30
+ const fs = require("fs");
31
+ const Handlebars = require("handlebars");
32
+ const fs$1 = require("fs/promises");
33
+ const yaml = require("js-yaml");
34
+ require("clone-deep");
35
+ const join = require("url-join");
36
+ const path$1 = require("./path-CyGuWUeq.cjs");
37
+ const server = require("svelte/server");
38
+ const pathToRegex = require("path-to-regex");
39
+ const $ = require("svelte/internal/server");
40
+ function _interopNamespaceDefault(e) {
41
+ const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
42
+ if (e) {
43
+ for (const k in e) {
44
+ if (k !== "default") {
45
+ const d = Object.getOwnPropertyDescriptor(e, k);
46
+ Object.defineProperty(n, k, d.get ? d : {
47
+ enumerable: true,
48
+ get: () => e[k]
49
+ });
50
+ }
51
+ }
52
+ }
53
+ n.default = e;
54
+ return Object.freeze(n);
55
+ }
56
+ const $__namespace = /* @__PURE__ */ _interopNamespaceDefault($);
57
+ class ViteComponentLoader {
58
+ constructor(basePath, vite) {
59
+ this.basePath = basePath;
60
+ this.vite = vite;
61
+ }
62
+ async load(componentPath, options = { use_base_path: true }) {
63
+ let absoluteComponentPath;
64
+ const use_base_path = options.use_base_path || false;
65
+ if (use_base_path) {
66
+ absoluteComponentPath = path.join(this.basePath, componentPath);
67
+ } else {
68
+ if (path.isAbsolute(componentPath)) {
69
+ absoluteComponentPath = componentPath;
70
+ } else {
71
+ absoluteComponentPath = componentPath;
72
+ }
73
+ }
74
+ let vitePath = path.relative(process.cwd(), absoluteComponentPath);
75
+ vitePath = vitePath.replace(/\\/g, "/");
76
+ if (!vitePath.startsWith("/")) {
77
+ vitePath = "/" + vitePath;
78
+ }
79
+ try {
80
+ const module2 = await this.vite.ssrLoadModule(vitePath);
81
+ console.log(`[ViteComponentLoader] Module loaded successfully for: ${vitePath}`);
82
+ if (!module2 || !module2.default) {
83
+ console.error(`[ViteComponentLoader] Loaded module for ${vitePath} is invalid or missing a default export. Module content:`, module2);
84
+ throw new Error(`Module ${vitePath} loaded successfully but is invalid or missing default export.`);
85
+ }
86
+ return module2;
87
+ } catch (error) {
88
+ console.error(`[ViteComponentLoader] Error loading module for vitePath: ${vitePath} (derived from componentPath: ${componentPath})`, error);
89
+ try {
90
+ await fs.promises.access(absoluteComponentPath);
91
+ } catch (fsError) {
92
+ }
93
+ throw error;
94
+ }
95
+ }
96
+ }
97
+ class ProdComponentLoader {
98
+ constructor(base_path) {
99
+ this.base_path = base_path;
100
+ }
101
+ async load(componentPath) {
102
+ const component_path = path.join(this.base_path, componentPath);
103
+ const module2 = await import(component_path.replace(/\.svelte$/, ".js"));
104
+ return module2;
105
+ }
106
+ }
107
+ const default_template = `
108
+ <!DOCTYPE html>
109
+ <html lang="en">
110
+ <head>
111
+ {{{HEAD}}}
112
+ <style>{{{CSS}}}</style>
113
+ </head>
114
+ <body>
115
+ <div id="app">{{{APP}}}</div>
116
+ <script>window.__INITIAL_DATA__ = {{{DATA}}}<\/script>
117
+
118
+ <script type="module">
119
+ import { createApp } from '/src/client/client.ts';
120
+ document.addEventListener('DOMContentLoaded', () => {
121
+ createApp('/components/');
122
+ });
123
+ <\/script>
124
+ </body>
125
+ </html>
126
+ `;
127
+ class BaseHTMLRender {
128
+ constructor(template = default_template) {
129
+ this.template = template;
130
+ }
131
+ async getTemplate() {
132
+ return this.template;
133
+ }
134
+ async renderHTML(data) {
135
+ const template = Handlebars.compile(await this.getTemplate());
136
+ return template(data);
137
+ }
138
+ }
139
+ class DefaultHTMLRender extends BaseHTMLRender {
140
+ constructor() {
141
+ super();
142
+ }
143
+ }
144
+ class LiveHTMLRender {
145
+ constructor(html_path) {
146
+ this.html_path = html_path;
147
+ }
148
+ async renderHTML(data) {
149
+ const template = Handlebars.compile(await this.getTemplate());
150
+ return template(data);
151
+ }
152
+ async getTemplate() {
153
+ const file_content = await fs$1.readFile(this.html_path, "utf8");
154
+ return file_content;
155
+ }
156
+ }
157
+ function parseConfigfile(file_content) {
158
+ let config = null;
159
+ try {
160
+ config = yaml.load(file_content);
161
+ } catch (e) {
162
+ console.log(e);
163
+ }
164
+ return config;
165
+ }
166
+ function parse_modules(openapi) {
167
+ const modules_config = openapi.modules || openapi.module;
168
+ if (!modules_config) {
169
+ return;
170
+ }
171
+ const modules = Object.entries(modules_config).map(([_, module2]) => {
172
+ return module2;
173
+ });
174
+ const modules_path = modules.map((module2) => {
175
+ const basePath = module2.basePath || "";
176
+ const baseLayouts = module2.baseLayouts || [];
177
+ const paths = module2.paths;
178
+ if (!paths) {
179
+ return;
180
+ }
181
+ const configurations = Object.entries(paths).map(([path2, method_config]) => {
182
+ return Object.entries(method_config).map(([method, config]) => {
183
+ return path$1.parsePathConfig(path2, method, config);
184
+ });
185
+ });
186
+ const routes = configurations.reduce((flat_config, config) => {
187
+ return flat_config.concat(config);
188
+ }, []);
189
+ routes.forEach((route) => {
190
+ route.path = join(basePath, route.path);
191
+ route.layout = baseLayouts.concat(route.layout || []);
192
+ });
193
+ return routes;
194
+ });
195
+ return modules_path.reduce(
196
+ (flat_config, config) => {
197
+ return flat_config.concat(config);
198
+ },
199
+ []
200
+ );
201
+ }
202
+ function parse_paths(openapi) {
203
+ const paths = openapi.paths;
204
+ if (!paths) {
205
+ return;
206
+ }
207
+ const configurations = Object.entries(paths).map(([path2, method_config]) => {
208
+ return Object.entries(method_config).map(([method, config]) => {
209
+ return path$1.parsePathConfig(path2, method, config);
210
+ });
211
+ });
212
+ const routes = configurations.reduce((flat_config, config) => {
213
+ return flat_config.concat(config);
214
+ }, []);
215
+ return routes;
216
+ }
217
+ function isStitchConfig(document) {
218
+ return document && typeof document === "object" && "stitch" in document;
219
+ }
220
+ function isOpenAPIConfig(document) {
221
+ return document && typeof document === "object" && ("paths" in document || "module" in document || "modules" in document);
222
+ }
223
+ async function parse_openapi_config(openapi_config_path) {
224
+ const content = fs.readFileSync(openapi_config_path, "utf8");
225
+ const parsed_config = parseConfigfile(content);
226
+ let openapi_config;
227
+ if (isStitchConfig(parsed_config)) {
228
+ console.log("Detected stitch configuration, building with Node.js stitch engine...");
229
+ try {
230
+ const { StitchEngine } = await import("@noego/stitch");
231
+ const startTime = Date.now();
232
+ const engine = new StitchEngine();
233
+ const result = engine.buildSync(openapi_config_path, { format: "json" });
234
+ if (!result.success) {
235
+ throw new Error(`Stitch build failed: ${result.error}`);
236
+ }
237
+ const buildTime = Date.now() - startTime;
238
+ console.log(`INFO Stitch build completed in ${buildTime} ms – ${parsed_config.stitch ? parsed_config.stitch.length : 0} modules processed`);
239
+ openapi_config = typeof result.data === "string" ? JSON.parse(result.data) : result.data;
240
+ } catch (error) {
241
+ throw new Error(`Failed to process stitch configuration: ${error instanceof Error ? error.message : String(error)}`);
242
+ }
243
+ } else if (isOpenAPIConfig(parsed_config)) {
244
+ console.log("Detected regular OpenAPI configuration");
245
+ openapi_config = parsed_config;
246
+ } else {
247
+ 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.`);
248
+ }
249
+ let modules = parse_modules(openapi_config) || [];
250
+ let paths = parse_paths(openapi_config) || [];
251
+ let fallback_layout = openapi_config["x-fallback-layout"] || null;
252
+ let fallback_view = openapi_config["x-fallback-view"] || null;
253
+ let fallback = {
254
+ layout: fallback_layout ? [fallback_layout] : [],
255
+ view: fallback_view
256
+ };
257
+ const routes = [...modules, ...paths];
258
+ let config = {
259
+ fallback,
260
+ routes
261
+ };
262
+ return config;
263
+ }
264
+ const defaultViteOptions = {
265
+ appType: "custom",
266
+ root: process.cwd(),
267
+ // Explicitly set root
268
+ server: { middlewareMode: true },
269
+ ssr: {
270
+ noExternal: ["svelte", /^svelte\/.*/]
271
+ // Adjust if needed, maybe add your component specifically if still failing
272
+ }
273
+ };
274
+ const defaultOptions = {
275
+ development: process.env.NODE_ENV !== "production",
276
+ viteOptions: defaultViteOptions,
277
+ component_dir: "/",
278
+ build_dir: "dist_ssr",
279
+ renderer: "default",
280
+ open_api_path: path.join(process.cwd(), "openapi.yaml"),
281
+ manifest_endpoint: "/manifest.json"
282
+ };
283
+ class ManifestBuilder {
284
+ constructor(openapi_path, loader, options) {
285
+ __publicField(this, "full_options");
286
+ this.openapi_path = openapi_path;
287
+ this.loader = loader;
288
+ this.options = options;
289
+ this.full_options = deepmerge(defaultOptions, this.options);
290
+ }
291
+ async buildManifest() {
292
+ const configuration = await parse_openapi_config(this.openapi_path);
293
+ const component_path = this.full_options.component_dir;
294
+ if (!component_path) {
295
+ throw new Error("Component path is not defined");
296
+ }
297
+ const routes = configuration.routes;
298
+ const manifest = await routes.reduce(async (acc, route) => {
299
+ return acc.then(async (acc2) => {
300
+ const pattern = route.path;
301
+ const results = await requires_server(route, this.loader);
302
+ acc2[pattern] = results;
303
+ return acc2;
304
+ });
305
+ }, Promise.resolve({}));
306
+ return manifest;
307
+ }
308
+ }
309
+ async function requires_server(route, loader) {
310
+ return await layout_requires_server(route, loader) || await view_requires_server(route, loader);
311
+ }
312
+ async function layout_requires_server(route, loader) {
313
+ const layout = route.layout;
314
+ if (!layout) {
315
+ return false;
316
+ }
317
+ const load_required = await Promise.all(layout.map(async (layout2) => {
318
+ const component = await loader.load(layout2);
319
+ return !!component.load;
320
+ }));
321
+ return load_required.some((required) => required);
322
+ }
323
+ async function view_requires_server(route, loader) {
324
+ const view = route.view;
325
+ if (!view) {
326
+ return false;
327
+ }
328
+ const component = await loader.load(view);
329
+ return !!component.load;
330
+ }
331
+ class ApiAdapter {
332
+ constructor(manager) {
333
+ this.manager = manager;
334
+ }
335
+ async getApiData(route, request_data) {
336
+ const view = await this.manager.getViewComponent(route);
337
+ const layout_loaders = await this.manager.getLayoutLoaders(route);
338
+ const loader = view.load;
339
+ let layout_data = [];
340
+ let view_data = {};
341
+ if (layout_loaders.some((loader2) => !!loader2)) {
342
+ console.log("Layout API Calls");
343
+ layout_data = await Promise.all(layout_loaders.map(async (layout_loader) => {
344
+ if (!layout_loader) {
345
+ return {};
346
+ }
347
+ const data = await layout_loader(request_data);
348
+ return data;
349
+ }));
350
+ }
351
+ if (loader) {
352
+ view_data = await loader(request_data);
353
+ }
354
+ let server_data = {
355
+ layout: layout_data,
356
+ view: view_data
357
+ };
358
+ return server_data;
359
+ }
360
+ async getFallbackData(route, request_data) {
361
+ const view = await this.manager.getViewComponent(route);
362
+ const layout_loaders = await this.manager.getLayoutLoaders(route);
363
+ const loader = view.load;
364
+ let layout_data = [];
365
+ let view_data = {};
366
+ if (layout_loaders.some((loader2) => !!loader2)) {
367
+ console.log("Layout API Calls");
368
+ layout_data = await Promise.all(layout_loaders.map(async (layout_loader) => {
369
+ if (!layout_loader) {
370
+ return {};
371
+ }
372
+ const data = await layout_loader(request_data);
373
+ return data;
374
+ }));
375
+ }
376
+ if (loader) {
377
+ view_data = await loader(request_data);
378
+ }
379
+ let server_data = {
380
+ layout: layout_data,
381
+ view: view_data
382
+ };
383
+ return server_data;
384
+ }
385
+ }
386
+ class ComponentManager {
387
+ constructor(componentLoader) {
388
+ this.componentLoader = componentLoader;
389
+ }
390
+ async getLayoutComponents(route) {
391
+ const layout_paths = route.layout || [];
392
+ const layouts_components = await Promise.all(layout_paths.map((layout) => {
393
+ console.log("layout path", layout);
394
+ return this.componentLoader.load(layout);
395
+ }));
396
+ return layouts_components;
397
+ }
398
+ async getLayouts(route) {
399
+ const layout_paths = route.layout || [];
400
+ const layouts_components = await Promise.all(layout_paths.map(async (layout_path) => {
401
+ const layout = await this.componentLoader.load(layout_path);
402
+ return layout.default;
403
+ }));
404
+ return layouts_components;
405
+ }
406
+ async getLayoutLoaders(route) {
407
+ const layout_components = await this.getLayoutComponents(route);
408
+ const layout_loaders = await Promise.all(layout_components.map(async (layout) => {
409
+ return layout.load;
410
+ }));
411
+ return layout_loaders;
412
+ }
413
+ async getViewComponent(route) {
414
+ return await this.componentLoader.load(route.view);
415
+ }
416
+ async getView(route) {
417
+ const view = await this.componentLoader.load(route.view);
418
+ return view.default;
419
+ }
420
+ }
421
+ class MiddlewareAdapter {
422
+ constructor(manager) {
423
+ this.manager = manager;
424
+ }
425
+ async handleMiddleware(req, reply, route, request_data, callback) {
426
+ let components = await this.manager.getLayoutComponents(route);
427
+ let middleware_stack = await Promise.all(components.map(async (component) => {
428
+ const middleware = [...component.middleware || [], ...component.middlewares || []];
429
+ return middleware;
430
+ }));
431
+ const layout_middlewares = middleware_stack.flat() || [];
432
+ console.log("middleware stack loaded", layout_middlewares);
433
+ req.params = request_data.params;
434
+ await new Promise((resolve) => {
435
+ this.runMiddleware(layout_middlewares, req, reply, resolve);
436
+ });
437
+ console.log("layout middleware executed");
438
+ console.log("view middleware loaded");
439
+ console.log("view middleware", route.view);
440
+ let view = {};
441
+ if (route.view) {
442
+ view = await this.manager.getViewComponent(route);
443
+ }
444
+ let view_middlewares = [...view.middleware || [], ...view.middlewares || []];
445
+ await new Promise((resolve) => {
446
+ this.runMiddleware(view_middlewares, req, reply, resolve);
447
+ });
448
+ callback();
449
+ }
450
+ runMiddleware(middleware, req, reply, callback) {
451
+ middleware = this.dedupe(middleware);
452
+ let index = 0;
453
+ if (middleware.length === 0) {
454
+ callback();
455
+ return;
456
+ }
457
+ let next = () => {
458
+ if (index >= middleware.length) {
459
+ callback();
460
+ return;
461
+ }
462
+ const mw = middleware[index];
463
+ index++;
464
+ if (typeof mw === "function") {
465
+ if (!reply.sent)
466
+ mw(req, reply, next);
467
+ } else {
468
+ if (!reply.sent)
469
+ next();
470
+ }
471
+ };
472
+ next();
473
+ }
474
+ dedupe(middlewares) {
475
+ return Array.from(new Set(middlewares));
476
+ }
477
+ }
478
+ function makeUrlParser(pattern) {
479
+ const parser = new pathToRegex(pattern);
480
+ return (pathname) => {
481
+ const result = parser.match(pathname);
482
+ return result || null;
483
+ };
484
+ }
485
+ function initialize_route_matchers(routes) {
486
+ return routes.map((route) => {
487
+ const pattern = route.path;
488
+ const parser = makeUrlParser(pattern);
489
+ return { pattern, parser };
490
+ });
491
+ }
492
+ class ServerAdapter {
493
+ }
494
+ function RecursiveRender($$payload, $$props) {
495
+ $__namespace.push();
496
+ let topLayout, childlayouts, top_data, other_data, view_data, recursive_child_data;
497
+ let layouts = $__namespace.fallback($$props["layouts"], () => [], true);
498
+ let view = $__namespace.fallback($$props["view"], null);
499
+ let data = $__namespace.fallback($$props["data"], () => ({}), true);
500
+ let params = $__namespace.fallback($$props["params"], () => ({}), true);
501
+ let urlParams = $__namespace.fallback($$props["urlParams"], () => ({}), true);
502
+ let query = $__namespace.fallback($$props["query"], () => ({}), true);
503
+ let page = $__namespace.fallback($$props["page"], null);
504
+ console.log("[page]", page);
505
+ [topLayout, ...childlayouts] = layouts;
506
+ [top_data, ...other_data] = data.layout || [];
507
+ view_data = data.view;
508
+ recursive_child_data = { layout: other_data, view: data.view };
509
+ if (childlayouts.length > 0) {
510
+ $$payload.out += "<!--[-->";
511
+ $$payload.out += `<!---->`;
512
+ topLayout == null ? void 0 : topLayout($$payload, $__namespace.spread_props([
513
+ top_data || {},
514
+ {
515
+ params,
516
+ urlParams,
517
+ query,
518
+ page,
519
+ children: ($$payload2) => {
520
+ RecursiveRender($$payload2, {
521
+ layouts: childlayouts,
522
+ view,
523
+ data: recursive_child_data,
524
+ params,
525
+ urlParams,
526
+ query,
527
+ page
528
+ });
529
+ $$payload2.out += `<!---->`;
530
+ },
531
+ $$slots: { default: true }
532
+ }
533
+ ]));
534
+ $$payload.out += `<!---->`;
535
+ } else if (topLayout) {
536
+ $$payload.out += "<!--[1-->";
537
+ $$payload.out += `<!---->`;
538
+ topLayout == null ? void 0 : topLayout($$payload, $__namespace.spread_props([
539
+ top_data || {},
540
+ {
541
+ params,
542
+ urlParams,
543
+ query,
544
+ page,
545
+ children: ($$payload2) => {
546
+ $$payload2.out += `<!---->`;
547
+ view == null ? void 0 : view($$payload2, $__namespace.spread_props([
548
+ view_data || {},
549
+ { params, urlParams, query, page }
550
+ ]));
551
+ $$payload2.out += `<!---->`;
552
+ },
553
+ $$slots: { default: true }
554
+ }
555
+ ]));
556
+ $$payload.out += `<!---->`;
557
+ } else {
558
+ $$payload.out += "<!--[!-->";
559
+ $$payload.out += `<!---->`;
560
+ view == null ? void 0 : view($$payload, $__namespace.spread_props([
561
+ view_data || {},
562
+ { params, urlParams, query, page }
563
+ ]));
564
+ $$payload.out += `<!---->`;
565
+ }
566
+ $$payload.out += `<!--]-->`;
567
+ $__namespace.bind_props($$props, {
568
+ layouts,
569
+ view,
570
+ data,
571
+ params,
572
+ urlParams,
573
+ query,
574
+ page
575
+ });
576
+ $__namespace.pop();
577
+ }
578
+ class ExpressServerAdapter extends ServerAdapter {
579
+ constructor(server2, manager, htmlRender, api_adapter, middleware_adapter) {
580
+ super();
581
+ this.server = server2;
582
+ this.manager = manager;
583
+ this.htmlRender = htmlRender;
584
+ this.api_adapter = api_adapter;
585
+ this.middleware_adapter = middleware_adapter;
586
+ }
587
+ async handleRoutes(routes, manifest) {
588
+ const matchers = initialize_route_matchers(routes);
589
+ this.server.use((req, res, next) => {
590
+ (async () => {
591
+ if (res.headersSent) {
592
+ return;
593
+ }
594
+ const method = req.method.toLowerCase();
595
+ const fullUrl = req.url || "/";
596
+ const path2 = fullUrl.split("?")[0];
597
+ const not_found = async () => {
598
+ next();
599
+ };
600
+ const matcher = matchers.find((m) => m.parser(path2));
601
+ if (!matcher) {
602
+ await not_found();
603
+ return;
604
+ }
605
+ const route_options = routes.filter((r) => r.path === matcher.pattern);
606
+ const route = route_options.find((r) => r.method.toLowerCase() === method);
607
+ if (!route) {
608
+ await not_found();
609
+ return;
610
+ }
611
+ await this.handleResponse(fullUrl, matcher, route, routes, manifest, req, res).catch((e) => {
612
+ res.status(500).send(`
613
+ <h1>500 Internal Server Error</h1>
614
+ <pre>${e}</pre>
615
+ `);
616
+ });
617
+ })();
618
+ return;
619
+ });
620
+ }
621
+ async handleResponse(url, matcher, route, routes, manifest, req, res) {
622
+ var _a, _b;
623
+ let accepts = req.headers.accept || "";
624
+ let server_api_call = accepts.toLowerCase().includes("application/json");
625
+ const context = {};
626
+ req["context"] = context;
627
+ const cleanPath = url.split("?")[0];
628
+ const pathParams = matcher.parser(cleanPath);
629
+ const queryParams = {};
630
+ for (const [key, value] of Object.entries(req.query)) {
631
+ if (typeof value === "string") {
632
+ queryParams[key] = value;
633
+ } else if (Array.isArray(value)) {
634
+ queryParams[key] = value.map((v) => typeof v === "string" ? v : String(v));
635
+ } else if (value !== void 0) {
636
+ queryParams[key] = String(value);
637
+ }
638
+ }
639
+ const combinedParams = { ...pathParams, ...queryParams };
640
+ let request_data = {
641
+ url,
642
+ query: req.query,
643
+ params: combinedParams,
644
+ headers: req.headers,
645
+ body: req.body,
646
+ context
647
+ };
648
+ try {
649
+ await new Promise((resolve, reject) => {
650
+ this.middleware_adapter.handleMiddleware(req, res, route, request_data, resolve).catch(reject);
651
+ });
652
+ } catch (e) {
653
+ console.log("Error in middleware", e);
654
+ res.status(500).send(`
655
+ <h1>500 Internal Server Error</h1>
656
+ <pre>${e}</pre>
657
+ `);
658
+ return;
659
+ }
660
+ if (res.headersSent) {
661
+ return;
662
+ }
663
+ let server_data = await this.api_adapter.getApiData(route, request_data);
664
+ if (server_api_call) {
665
+ res.header("Cache-Control", "no-store, no-cache, must-revalidate, proxy-revalidate").header("Pragma", "no-cache").header("Expires", "0").type("application/json").send(server_data);
666
+ return;
667
+ }
668
+ let layouts;
669
+ let view;
670
+ try {
671
+ layouts = await this.manager.getLayouts(route);
672
+ view = await this.manager.getView(route);
673
+ } catch (e) {
674
+ console.log("Error getting view", e);
675
+ res.status(500).send(`
676
+ <h1>500 Internal Server Error</h1>
677
+ <pre>${e}</pre>
678
+ `);
679
+ return;
680
+ }
681
+ let html_render = "";
682
+ let response_code = 200;
683
+ try {
684
+ let page = {
685
+ url: request_data.url,
686
+ pathname: request_data.url.split("?")[0],
687
+ params: request_data.params || {},
688
+ query: request_data.query
689
+ };
690
+ let { head: head_render, body: body_render, css } = server.render(RecursiveRender, {
691
+ props: {
692
+ layouts,
693
+ view,
694
+ data: server_data,
695
+ params: request_data.params,
696
+ urlParams: pathParams,
697
+ query: request_data.query,
698
+ page
699
+ }
700
+ });
701
+ const head_routing = `
702
+ <script type='text/javascript'>
703
+ window.__ROUTING__ = ${JSON.stringify(routes)}
704
+ <\/script>
705
+
706
+ <script type='text/javascript'>
707
+ window.__MANIFEST__ = ${JSON.stringify(manifest)}
708
+ <\/script>
709
+
710
+ <script type='text/javascript'>
711
+ window.__INITIAL_DATA__ = ${JSON.stringify(server_data || {}).trim()}
712
+ <\/script>
713
+ `;
714
+ html_render = await this.htmlRender.renderHTML({
715
+ HEAD: head_routing + (head_render || ""),
716
+ CSS: css,
717
+ APP: body_render
718
+ });
719
+ } catch (e) {
720
+ response_code = 500;
721
+ const new_body = `<pre>Error rendering HTML:
722
+ ${e}` + (((_a = route.layout) == null ? void 0 : _a.length) ? `layouts: ${(_b = route.layout) == null ? void 0 : _b.join(",\n")}` : "") + `
723
+ view: ${route.view}</pre>`;
724
+ html_render = await this.htmlRender.renderHTML({
725
+ APP: new_body
726
+ // DATA: JSON.stringify({})
727
+ });
728
+ }
729
+ res.setHeader("Content-Type", "text/html; charset=utf-8");
730
+ res.status(response_code);
731
+ res.end(html_render);
732
+ }
733
+ async handleFallback(req, res, server_config) {
734
+ if (res.headersSent) {
735
+ console.log("Reply already sent");
736
+ return;
737
+ }
738
+ let route = server_config.fallback;
739
+ let accepts = req.headers.accept || "";
740
+ let server_api_call = accepts.toLowerCase().includes("application/json");
741
+ const url = req.url || "/";
742
+ const context = {};
743
+ let fallback_data = {
744
+ url,
745
+ query: req.query,
746
+ params: {},
747
+ headers: req.headers,
748
+ body: req.body,
749
+ context
750
+ };
751
+ let request_data = fallback_data;
752
+ await new Promise((resolve) => {
753
+ this.middleware_adapter.handleMiddleware(req, res, route, request_data, resolve);
754
+ });
755
+ console.log("Completed fallback middleware");
756
+ let server_data = await this.api_adapter.getApiData(route, request_data);
757
+ console.log("Completed fallback API call");
758
+ if (server_api_call) {
759
+ console.log("Fallback API call");
760
+ res.header("Cache-Control", "no-store, no-cache, must-revalidate, proxy-revalidate").header("Pragma", "no-cache").header("Expires", "0").type("application/json").status(404).send(server_data);
761
+ return;
762
+ }
763
+ const layouts = await this.manager.getLayouts(route);
764
+ const view = await this.manager.getView(route);
765
+ console.log("Fallback view", view);
766
+ console.log("Fallback layouts", layouts);
767
+ let { head: head_render, body: body_render, css } = server.render(RecursiveRender, {
768
+ props: {
769
+ layouts,
770
+ view,
771
+ data: server_data,
772
+ params: request_data.params
773
+ }
774
+ });
775
+ const html_render = await this.htmlRender.renderHTML({
776
+ HEAD: head_render,
777
+ CSS: css,
778
+ APP: body_render
779
+ });
780
+ res.type("text/html").status(404).send(html_render);
781
+ }
782
+ }
783
+ async function createServer(app, options) {
784
+ options = options || defaultOptions;
785
+ const full_options = deepmerge(defaultOptions, options);
786
+ full_options.open_api_path = ensureFullPath(full_options.viteOptions.root, full_options.open_api_path);
787
+ const isProd = full_options.development === false;
788
+ console.log(`Running in ${isProd ? "production" : "development"} mode`);
789
+ const COMPONENT_DIR = path.join(full_options.viteOptions.root, full_options.component_dir);
790
+ const root = full_options.viteOptions.root;
791
+ let componentLoader;
792
+ let vite;
793
+ console.log(`Serving components from ${COMPONENT_DIR} at /components/`);
794
+ if (full_options.assets) {
795
+ for (const [asset_path, asset_dir] of Object.entries(full_options.assets)) {
796
+ for (const asset of asset_dir) {
797
+ const asset_root = path.join(full_options.viteOptions.root, asset);
798
+ app.use(asset_path, express.static(asset_root));
799
+ console.log(`Serving assets from ${asset_root} at ${asset_path}`);
800
+ }
801
+ }
802
+ } else {
803
+ console.log(`No assets to serve`);
804
+ }
805
+ if (!isProd) {
806
+ console.log("Starting Vite in development mode...");
807
+ const { createServer: createViteServer } = await import("vite");
808
+ vite = await createViteServer(options.viteOptions || full_options.viteOptions);
809
+ componentLoader = new ViteComponentLoader(COMPONENT_DIR, vite);
810
+ console.log("loaded");
811
+ } else {
812
+ console.log("Starting Vite in production mode...");
813
+ app.use("/", express.static(path.join(options.viteOptions.root, full_options.build_dir)));
814
+ console.log(`Serving static files from ${path.join(options.viteOptions.root, full_options.build_dir)} at /`);
815
+ componentLoader = new ProdComponentLoader(COMPONENT_DIR);
816
+ }
817
+ const manifest = await new ManifestBuilder(
818
+ full_options.open_api_path,
819
+ componentLoader,
820
+ full_options
821
+ ).buildManifest();
822
+ const htmlRenderer = getRenderer(root, full_options.renderer, isProd);
823
+ const server_config = await parse_openapi_config(full_options.open_api_path);
824
+ const routeDefs = server_config.routes;
825
+ const manager = new ComponentManager(componentLoader);
826
+ const api_adapter = new ApiAdapter(manager);
827
+ const middleware_adapter = new MiddlewareAdapter(manager);
828
+ const adapter = new ExpressServerAdapter(
829
+ app,
830
+ manager,
831
+ htmlRenderer,
832
+ api_adapter,
833
+ middleware_adapter
834
+ );
835
+ await adapter.handleRoutes(routeDefs, manifest);
836
+ console.log("Routes registered");
837
+ if (!isProd) {
838
+ app.use(vite.middlewares);
839
+ }
840
+ return app;
841
+ }
842
+ function getRenderer(root, renderer, isProd) {
843
+ if (renderer === "default") {
844
+ return new DefaultHTMLRender();
845
+ } else if (typeof renderer === "string" && !isProd) {
846
+ return new LiveHTMLRender(ensureFullPath(root, renderer));
847
+ } else if (typeof renderer === "string" && isProd) {
848
+ const html = ensureFullPath(root, renderer);
849
+ const template = fs.readFileSync(html, "utf8");
850
+ return new BaseHTMLRender(template);
851
+ } else if (renderer instanceof BaseHTMLRender) {
852
+ return renderer;
853
+ } else {
854
+ throw new Error("Invalid renderer type");
855
+ }
856
+ }
857
+ function ensureFullPath(root, renderer) {
858
+ if (path.isAbsolute(renderer)) {
859
+ console.log(`Renderer path is absolute: ${renderer}`);
860
+ return urlJoin(root, renderer);
861
+ } else {
862
+ console.log(`Renderer path is relative: ${renderer}`);
863
+ return path.resolve(root, renderer);
864
+ }
865
+ }
866
+ function urlJoin(base, path2) {
867
+ if (base.endsWith("/")) {
868
+ base = base.slice(0, -1);
869
+ }
870
+ if (path2.startsWith("/")) {
871
+ path2 = path2.slice(1);
872
+ }
873
+ return `${base}/${path2}`;
874
+ }
875
+ exports.createServer = createServer;
876
+ //# sourceMappingURL=server.cjs.map