@noego/forge 0.1.19 → 0.1.21
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/client.cjs +3 -3
- package/dist/client.cjs.map +1 -1
- package/dist/client.mjs +932 -737
- package/dist/client.mjs.map +1 -1
- package/dist/plugins-cjs/routing/html_render/html_render.js +4 -2
- package/dist/plugins-cjs/routing/html_render/html_render.js.map +1 -1
- package/dist/plugins-es/routing/html_render/html_render.js +4 -2
- package/dist/plugins-es/routing/html_render/html_render.js.map +1 -1
- package/dist/routing/html_render/html_render.js +4 -2
- package/dist/routing/html_render/html_render.js.map +1 -1
- package/dist-ssr/server.cjs +51 -46
- package/dist-ssr/server.cjs.map +1 -1
- package/dist-ssr/server.js +51 -46
- package/dist-ssr/server.js.map +1 -1
- package/dist-ssr/static.cjs +1 -1
- package/dist-ssr/static.js +1 -1
- package/dist-ssr/{url_parser-CCrM2TRM.js → url_parser-BY7Z0l_n.js} +253 -19
- package/dist-ssr/url_parser-BY7Z0l_n.js.map +1 -0
- package/dist-ssr/{url_parser-BWBuKJkA.cjs → url_parser-C-aLYzi3.cjs} +253 -19
- package/dist-ssr/url_parser-C-aLYzi3.cjs.map +1 -0
- package/package.json +2 -1
- package/dist-ssr/url_parser-BWBuKJkA.cjs.map +0 -1
- package/dist-ssr/url_parser-CCrM2TRM.js.map +0 -1
package/dist-ssr/server.js
CHANGED
|
@@ -5,12 +5,13 @@ import express from "express";
|
|
|
5
5
|
import path__default from "path";
|
|
6
6
|
import fs__default from "fs";
|
|
7
7
|
import deepmerge from "deepmerge";
|
|
8
|
-
import { p as parse_openapi_config, i as initialize_route_matchers, C as ComponentManager, V as ViteComponentLoader, P as ProdComponentLoader } from "./url_parser-
|
|
8
|
+
import { g as getLogger, p as parse_openapi_config, i as initialize_route_matchers, C as ComponentManager, V as ViteComponentLoader, P as ProdComponentLoader } from "./url_parser-BY7Z0l_n.js";
|
|
9
9
|
import Handlebars from "handlebars";
|
|
10
10
|
import fs from "fs/promises";
|
|
11
11
|
import { uneval } from "devalue";
|
|
12
12
|
import { pathToFileURL } from "url";
|
|
13
13
|
import { render } from "svelte/server";
|
|
14
|
+
const log$5 = getLogger("forge:render");
|
|
14
15
|
const default_template = `
|
|
15
16
|
<!DOCTYPE html>
|
|
16
17
|
<html lang="en">
|
|
@@ -57,7 +58,7 @@ ${configScript}`);
|
|
|
57
58
|
html = configScript + "\n" + html;
|
|
58
59
|
}
|
|
59
60
|
} catch (e) {
|
|
60
|
-
|
|
61
|
+
log$5.error("Failed to parse NOEGO_CONFIGURATION:", e);
|
|
61
62
|
}
|
|
62
63
|
}
|
|
63
64
|
html = html.replace(
|
|
@@ -117,7 +118,7 @@ ${configScript}`);
|
|
|
117
118
|
html = configScript + "\n" + html;
|
|
118
119
|
}
|
|
119
120
|
} catch (e) {
|
|
120
|
-
|
|
121
|
+
log$5.error("Failed to parse NOEGO_CONFIGURATION:", e);
|
|
121
122
|
}
|
|
122
123
|
}
|
|
123
124
|
html = html.replace(
|
|
@@ -171,6 +172,7 @@ const defaultOptions = {
|
|
|
171
172
|
manifest_endpoint: "/manifest.json",
|
|
172
173
|
middleware_path: void 0
|
|
173
174
|
};
|
|
175
|
+
const log$4 = getLogger("forge:manifest");
|
|
174
176
|
class ManifestBuilder {
|
|
175
177
|
constructor(openapi_path, loader, options) {
|
|
176
178
|
__publicField(this, "full_options");
|
|
@@ -201,7 +203,7 @@ async function requires_server(route, loader) {
|
|
|
201
203
|
const has_middleware = route.middleware && route.middleware.length > 0;
|
|
202
204
|
const has_loaders = await layout_requires_server(route, loader) || await view_requires_server(route, loader);
|
|
203
205
|
const requires_server2 = has_middleware || has_loaders;
|
|
204
|
-
|
|
206
|
+
log$4.debug(route.path, {
|
|
205
207
|
has_middleware,
|
|
206
208
|
middleware: route.middleware,
|
|
207
209
|
has_loaders,
|
|
@@ -266,6 +268,7 @@ async function view_requires_server(route, loader) {
|
|
|
266
268
|
return false;
|
|
267
269
|
}
|
|
268
270
|
}
|
|
271
|
+
const log$3 = getLogger("forge:routing");
|
|
269
272
|
class ApiAdapter {
|
|
270
273
|
constructor(manager) {
|
|
271
274
|
this.manager = manager;
|
|
@@ -278,7 +281,7 @@ class ApiAdapter {
|
|
|
278
281
|
let view_data = {};
|
|
279
282
|
const validLayoutLoaders = layout_loaders.filter((loader2) => typeof loader2 === "function");
|
|
280
283
|
if (validLayoutLoaders.length > 0) {
|
|
281
|
-
|
|
284
|
+
log$3.debug("Layout API Calls");
|
|
282
285
|
layout_data = await Promise.all(validLayoutLoaders.map(async (layout_loader) => {
|
|
283
286
|
const data = await layout_loader(request_data);
|
|
284
287
|
return data;
|
|
@@ -301,7 +304,7 @@ class ApiAdapter {
|
|
|
301
304
|
let view_data = {};
|
|
302
305
|
const validLayoutLoaders = layout_loaders.filter((loader2) => typeof loader2 === "function");
|
|
303
306
|
if (validLayoutLoaders.length > 0) {
|
|
304
|
-
|
|
307
|
+
log$3.debug("Layout API Calls");
|
|
305
308
|
layout_data = await Promise.all(validLayoutLoaders.map(async (layout_loader) => {
|
|
306
309
|
const data = await layout_loader(request_data);
|
|
307
310
|
return data;
|
|
@@ -356,6 +359,7 @@ class ApiAdapter {
|
|
|
356
359
|
};
|
|
357
360
|
}
|
|
358
361
|
}
|
|
362
|
+
const log$2 = getLogger("forge:routing");
|
|
359
363
|
const EXTENSION_CANDIDATES = [".js", ".mjs", ".cjs", ".ts", ".tsx"];
|
|
360
364
|
class MiddlewareAdapter {
|
|
361
365
|
constructor(middlewarePath, fallbackPath) {
|
|
@@ -371,7 +375,7 @@ class MiddlewareAdapter {
|
|
|
371
375
|
return;
|
|
372
376
|
}
|
|
373
377
|
const resolution = await this.resolveMiddlewareFunctions(middlewareConfig);
|
|
374
|
-
|
|
378
|
+
log$2.debug("Middleware resolution:", resolution);
|
|
375
379
|
if (resolution.errors.length > 0) {
|
|
376
380
|
throw new Error(`Middleware resolution failed: ${resolution.errors.join(", ")}`);
|
|
377
381
|
}
|
|
@@ -540,6 +544,7 @@ class MiddlewareAdapter {
|
|
|
540
544
|
}
|
|
541
545
|
class ServerAdapter {
|
|
542
546
|
}
|
|
547
|
+
const log$1 = getLogger("forge:routing");
|
|
543
548
|
class ExpressServerAdapter extends ServerAdapter {
|
|
544
549
|
constructor(server, manager, htmlRender, api_adapter, middleware_adapter, context_builder, isProd = false, isBuiltEnvironment = false, componentDir) {
|
|
545
550
|
super();
|
|
@@ -584,7 +589,7 @@ class ExpressServerAdapter extends ServerAdapter {
|
|
|
584
589
|
transformRoutesForClient(routes) {
|
|
585
590
|
var _a, _b;
|
|
586
591
|
if (!this.isProd) return routes;
|
|
587
|
-
|
|
592
|
+
log$1.debug(`Transforming ${routes.length} routes for production`);
|
|
588
593
|
const transformed = routes.map((route) => {
|
|
589
594
|
var _a2, _b2;
|
|
590
595
|
return {
|
|
@@ -593,7 +598,7 @@ class ExpressServerAdapter extends ServerAdapter {
|
|
|
593
598
|
view: (_b2 = route.view) == null ? void 0 : _b2.replace(/\.svelte$/, ".js")
|
|
594
599
|
};
|
|
595
600
|
});
|
|
596
|
-
|
|
601
|
+
log$1.debug(`First route view transformed: ${(_a = routes[0]) == null ? void 0 : _a.view} → ${(_b = transformed[0]) == null ? void 0 : _b.view}`);
|
|
597
602
|
return transformed;
|
|
598
603
|
}
|
|
599
604
|
async handleRoutes(routes, manifest) {
|
|
@@ -666,7 +671,7 @@ class ExpressServerAdapter extends ServerAdapter {
|
|
|
666
671
|
body: req.body,
|
|
667
672
|
context
|
|
668
673
|
};
|
|
669
|
-
|
|
674
|
+
log$1.debug("Handling request", req.url, {
|
|
670
675
|
middleware: route.middleware,
|
|
671
676
|
accept: req.headers.accept,
|
|
672
677
|
route_path: route.path,
|
|
@@ -674,12 +679,12 @@ class ExpressServerAdapter extends ServerAdapter {
|
|
|
674
679
|
});
|
|
675
680
|
try {
|
|
676
681
|
await this.middleware_adapter.handleMiddleware(req, res, route.middleware || []);
|
|
677
|
-
|
|
682
|
+
log$1.debug("Middleware complete", {
|
|
678
683
|
headersSent: res.headersSent,
|
|
679
684
|
statusCode: res.statusCode
|
|
680
685
|
});
|
|
681
686
|
} catch (e) {
|
|
682
|
-
|
|
687
|
+
log$1.error("Error in middleware", e);
|
|
683
688
|
res.status(500).send(`
|
|
684
689
|
<h1>500 Internal Server Error</h1>
|
|
685
690
|
<pre>${e}</pre>
|
|
@@ -689,7 +694,7 @@ ${e.stack}</pre>
|
|
|
689
694
|
return;
|
|
690
695
|
}
|
|
691
696
|
if (res.headersSent) {
|
|
692
|
-
|
|
697
|
+
log$1.debug("Headers already sent by middleware, returning early");
|
|
693
698
|
return;
|
|
694
699
|
}
|
|
695
700
|
let server_data;
|
|
@@ -698,7 +703,7 @@ ${e.stack}</pre>
|
|
|
698
703
|
} catch (e) {
|
|
699
704
|
const errorMessage = (e == null ? void 0 : e.message) || String(e);
|
|
700
705
|
const errorStack = (e == null ? void 0 : e.stack) || "";
|
|
701
|
-
|
|
706
|
+
log$1.error(`Data loader error for route ${route.path} (${route.method}):`, {
|
|
702
707
|
error: errorMessage,
|
|
703
708
|
route: route.path,
|
|
704
709
|
method: route.method,
|
|
@@ -706,7 +711,7 @@ ${e.stack}</pre>
|
|
|
706
711
|
view: route.view,
|
|
707
712
|
layouts: route.layout
|
|
708
713
|
});
|
|
709
|
-
|
|
714
|
+
log$1.error("Data loader stack trace:", errorStack);
|
|
710
715
|
if (server_api_call) {
|
|
711
716
|
res.status(500).header("Cache-Control", "no-store, no-cache, must-revalidate, proxy-revalidate").header("Pragma", "no-cache").header("Expires", "0").type("application/json").send({
|
|
712
717
|
error: "Data loader failed",
|
|
@@ -737,7 +742,7 @@ ${errorStack}</pre>
|
|
|
737
742
|
layouts = await this.manager.getLayouts(route);
|
|
738
743
|
view = await this.manager.getView(route);
|
|
739
744
|
} catch (e) {
|
|
740
|
-
|
|
745
|
+
log$1.error("Error getting view", e);
|
|
741
746
|
res.status(500).send(`
|
|
742
747
|
<h1>500 Internal Server Error</h1>
|
|
743
748
|
<pre>${e}</pre>
|
|
@@ -756,11 +761,11 @@ ${e.stack}</pre>
|
|
|
756
761
|
params: request_data.params || {},
|
|
757
762
|
query: request_data.query
|
|
758
763
|
};
|
|
759
|
-
|
|
764
|
+
log$1.debug("layouts:", layouts.map((l) => typeof l), "view:", typeof view);
|
|
760
765
|
const loader = ((_b = this.manager) == null ? void 0 : _b["componentLoader"]) || {};
|
|
761
766
|
const componentRoot = loader["base_path"] || loader["basePath"] || "";
|
|
762
767
|
const applicationRenderer = await this.loadApplicationRenderer(componentRoot);
|
|
763
|
-
|
|
768
|
+
log$1.debug("applicationRenderer:", typeof applicationRenderer);
|
|
764
769
|
const { head: head_render, html: renderedHtml, css } = render(applicationRenderer, {
|
|
765
770
|
props: {
|
|
766
771
|
layouts,
|
|
@@ -773,7 +778,7 @@ ${e.stack}</pre>
|
|
|
773
778
|
}
|
|
774
779
|
});
|
|
775
780
|
const body_render = renderedHtml;
|
|
776
|
-
|
|
781
|
+
log$1.debug("render result - body length:", (body_render == null ? void 0 : body_render.length) || 0);
|
|
777
782
|
const deriveClientBase = (dir) => {
|
|
778
783
|
try {
|
|
779
784
|
const norm = String(dir || "").replace(/\\/g, "/");
|
|
@@ -802,7 +807,6 @@ ${e.stack}</pre>
|
|
|
802
807
|
|
|
803
808
|
<script type='text/javascript'>
|
|
804
809
|
window.__MANIFEST__ = ${uneval(manifest)}
|
|
805
|
-
console.log('[MANIFEST INJECTED]', window.__MANIFEST__);
|
|
806
810
|
<\/script>
|
|
807
811
|
|
|
808
812
|
<script type='text/javascript'>
|
|
@@ -813,13 +817,13 @@ ${e.stack}</pre>
|
|
|
813
817
|
window.__COMPONENT_DIR__ = ${uneval(clientComponentDir)}
|
|
814
818
|
<\/script>
|
|
815
819
|
`;
|
|
816
|
-
|
|
820
|
+
log$1.debug("About to render HTML with APP length:", (body_render == null ? void 0 : body_render.length) || 0);
|
|
817
821
|
html_render = await this.htmlRender.renderHTML({
|
|
818
822
|
HEAD: devClientScript + head_routing + (head_render || ""),
|
|
819
823
|
CSS: css,
|
|
820
824
|
APP: body_render
|
|
821
825
|
});
|
|
822
|
-
|
|
826
|
+
log$1.debug("Final HTML length:", (html_render == null ? void 0 : html_render.length) || 0, "contains APP div:", html_render == null ? void 0 : html_render.includes('<div id="app">'));
|
|
823
827
|
} catch (e) {
|
|
824
828
|
response_code = 500;
|
|
825
829
|
const new_body = `<pre>Error rendering HTML:
|
|
@@ -838,7 +842,7 @@ view: ${route.view}</pre>`;
|
|
|
838
842
|
async handleFallback(req, res, server_config) {
|
|
839
843
|
var _a, _b;
|
|
840
844
|
if (res.headersSent) {
|
|
841
|
-
|
|
845
|
+
log$1.debug("Reply already sent");
|
|
842
846
|
return;
|
|
843
847
|
}
|
|
844
848
|
let route = server_config.fallback;
|
|
@@ -858,27 +862,27 @@ view: ${route.view}</pre>`;
|
|
|
858
862
|
try {
|
|
859
863
|
await this.middleware_adapter.handleMiddleware(req, res, route.middleware || []);
|
|
860
864
|
} catch (e) {
|
|
861
|
-
|
|
865
|
+
log$1.error("Error in fallback middleware", e);
|
|
862
866
|
res.status(500).send(`
|
|
863
867
|
<h1>500 Internal Server Error</h1>
|
|
864
868
|
<pre>${e}</pre>
|
|
865
869
|
`);
|
|
866
870
|
return;
|
|
867
871
|
}
|
|
868
|
-
|
|
872
|
+
log$1.debug("Completed fallback middleware");
|
|
869
873
|
let server_data;
|
|
870
874
|
try {
|
|
871
875
|
server_data = await this.api_adapter.getApiData(route, request_data);
|
|
872
876
|
} catch (e) {
|
|
873
877
|
const errorMessage = (e == null ? void 0 : e.message) || String(e);
|
|
874
878
|
const errorStack = (e == null ? void 0 : e.stack) || "";
|
|
875
|
-
|
|
879
|
+
log$1.error(`Fallback data loader error:`, {
|
|
876
880
|
error: errorMessage,
|
|
877
881
|
url,
|
|
878
882
|
view: route.view,
|
|
879
883
|
layouts: route.layout
|
|
880
884
|
});
|
|
881
|
-
|
|
885
|
+
log$1.error("Fallback data loader stack trace:", errorStack);
|
|
882
886
|
if (server_api_call) {
|
|
883
887
|
res.status(500).header("Cache-Control", "no-store, no-cache, must-revalidate, proxy-revalidate").header("Pragma", "no-cache").header("Expires", "0").type("application/json").send({
|
|
884
888
|
error: "Fallback data loader failed",
|
|
@@ -897,16 +901,16 @@ ${errorStack}</pre>
|
|
|
897
901
|
`);
|
|
898
902
|
return;
|
|
899
903
|
}
|
|
900
|
-
|
|
904
|
+
log$1.debug("Completed fallback API call");
|
|
901
905
|
if (server_api_call) {
|
|
902
|
-
|
|
906
|
+
log$1.debug("Fallback API call");
|
|
903
907
|
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);
|
|
904
908
|
return;
|
|
905
909
|
}
|
|
906
910
|
const layouts = await this.manager.getLayouts(route);
|
|
907
911
|
const view = await this.manager.getView(route);
|
|
908
|
-
|
|
909
|
-
|
|
912
|
+
log$1.debug("Fallback view", view);
|
|
913
|
+
log$1.debug("Fallback layouts", layouts);
|
|
910
914
|
const loader = ((_b = this.manager) == null ? void 0 : _b["componentLoader"]) || {};
|
|
911
915
|
const componentRoot = loader["base_path"] || loader["basePath"] || "";
|
|
912
916
|
const applicationRenderer = await this.loadApplicationRenderer(componentRoot);
|
|
@@ -928,6 +932,7 @@ ${errorStack}</pre>
|
|
|
928
932
|
res.type("text/html").status(404).send(html_render);
|
|
929
933
|
}
|
|
930
934
|
}
|
|
935
|
+
const log = getLogger("forge");
|
|
931
936
|
function pathExistsSync(p) {
|
|
932
937
|
try {
|
|
933
938
|
return fs__default.existsSync(p);
|
|
@@ -961,10 +966,10 @@ async function createServer(app, options) {
|
|
|
961
966
|
const COMPONENT_DIR = !full_options.component_dir ? root : path__default.join(root, full_options.component_dir);
|
|
962
967
|
const isBuiltEnvironment = process.env.FORGE_BUILT === "true";
|
|
963
968
|
const isProd = isBuiltEnvironment || full_options.development === false;
|
|
964
|
-
|
|
969
|
+
log.info(`Running in ${isProd ? "production" : "development"} mode (built environment: ${isBuiltEnvironment}, development flag: ${full_options.development}, NODE_ENV: ${process.env.NODE_ENV})`);
|
|
965
970
|
let componentLoader;
|
|
966
971
|
let vite;
|
|
967
|
-
|
|
972
|
+
log.info(`Serving components from ${COMPONENT_DIR}`);
|
|
968
973
|
const resolveAssetRoot = (entry) => {
|
|
969
974
|
if (typeof entry === "function") {
|
|
970
975
|
return entry;
|
|
@@ -979,37 +984,37 @@ async function createServer(app, options) {
|
|
|
979
984
|
const asset_root = resolveAssetRoot(asset);
|
|
980
985
|
if (typeof asset_root === "string") {
|
|
981
986
|
app.use(asset_path, express.static(asset_root));
|
|
982
|
-
|
|
987
|
+
log.debug(`Serving assets from ${asset_root} at ${asset_path}`);
|
|
983
988
|
} else if (typeof asset_root === "function") {
|
|
984
989
|
app.use(asset_path, asset_root);
|
|
985
|
-
|
|
990
|
+
log.debug(`Serving assets from function at ${asset_path}`);
|
|
986
991
|
} else {
|
|
987
|
-
|
|
992
|
+
log.warn(`Invalid asset root type: ${typeof asset_root}`);
|
|
988
993
|
}
|
|
989
994
|
}
|
|
990
995
|
}
|
|
991
996
|
} else {
|
|
992
|
-
|
|
997
|
+
log.debug(`No assets to serve`);
|
|
993
998
|
}
|
|
994
999
|
if (!isProd) {
|
|
995
|
-
|
|
1000
|
+
log.info("Starting Vite in development mode...");
|
|
996
1001
|
const { createServer: createViteServer } = await import("vite");
|
|
997
1002
|
vite = await createViteServer(options.viteOptions || full_options.viteOptions);
|
|
998
|
-
|
|
1003
|
+
log.debug(`Vite server created options
|
|
999
1004
|
${JSON.stringify(options, null, 2)}`);
|
|
1000
1005
|
componentLoader = new ViteComponentLoader(COMPONENT_DIR, vite);
|
|
1001
1006
|
} else {
|
|
1002
|
-
|
|
1007
|
+
log.info("Starting Vite in production mode...");
|
|
1003
1008
|
const staticDir = path__default.join(full_options.viteOptions.root, full_options.build_dir);
|
|
1004
1009
|
if (pathExistsSync(staticDir)) {
|
|
1005
1010
|
app.use("/", express.static(staticDir));
|
|
1006
|
-
|
|
1011
|
+
log.info(`Serving static files from ${staticDir} at /`);
|
|
1007
1012
|
} else {
|
|
1008
|
-
|
|
1013
|
+
log.debug(`Skipping static file serving (build_dir ${staticDir} not found - using asset configuration)`);
|
|
1009
1014
|
}
|
|
1010
1015
|
const componentPath = `/${full_options.component_dir}`;
|
|
1011
1016
|
app.use(componentPath, express.static(COMPONENT_DIR));
|
|
1012
|
-
|
|
1017
|
+
log.info(`Serving components at ${componentPath} from ${COMPONENT_DIR}`);
|
|
1013
1018
|
componentLoader = new ProdComponentLoader(COMPONENT_DIR);
|
|
1014
1019
|
}
|
|
1015
1020
|
const manifest = await new ManifestBuilder(
|
|
@@ -1039,7 +1044,7 @@ ${JSON.stringify(options, null, 2)}`);
|
|
|
1039
1044
|
full_options.component_dir
|
|
1040
1045
|
);
|
|
1041
1046
|
await adapter.handleRoutes(routeDefs, manifest);
|
|
1042
|
-
|
|
1047
|
+
log.info("Routes registered");
|
|
1043
1048
|
if (!isProd) {
|
|
1044
1049
|
app.use(vite.middlewares);
|
|
1045
1050
|
}
|
|
@@ -1062,10 +1067,10 @@ function getRenderer(root, renderer, isProd) {
|
|
|
1062
1067
|
}
|
|
1063
1068
|
function ensureFullPath(root, renderer) {
|
|
1064
1069
|
if (path__default.isAbsolute(renderer)) {
|
|
1065
|
-
|
|
1070
|
+
log.debug(`Renderer path is absolute: ${renderer}`);
|
|
1066
1071
|
return urlJoin(root, renderer);
|
|
1067
1072
|
} else {
|
|
1068
|
-
|
|
1073
|
+
log.debug(`Renderer path is relative: ${renderer}`);
|
|
1069
1074
|
return path__default.resolve(root, renderer);
|
|
1070
1075
|
}
|
|
1071
1076
|
}
|