@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.
@@ -31,6 +31,237 @@ require("clone-deep");
31
31
  const join = require("url-join");
32
32
  const path$1 = require("./path-sxXxpB6R.cjs");
33
33
  const pathToRegex = require("path-to-regex");
34
+ var LogLevel = /* @__PURE__ */ ((LogLevel2) => {
35
+ LogLevel2[LogLevel2["TRACE"] = 0] = "TRACE";
36
+ LogLevel2[LogLevel2["DEBUG"] = 1] = "DEBUG";
37
+ LogLevel2[LogLevel2["INFO"] = 2] = "INFO";
38
+ LogLevel2[LogLevel2["WARN"] = 3] = "WARN";
39
+ LogLevel2[LogLevel2["ERROR"] = 4] = "ERROR";
40
+ LogLevel2[LogLevel2["FATAL"] = 5] = "FATAL";
41
+ return LogLevel2;
42
+ })(LogLevel || {});
43
+ const LEVEL_BY_NAME = {
44
+ trace: 0,
45
+ debug: 1,
46
+ info: 2,
47
+ warn: 3,
48
+ error: 4,
49
+ fatal: 5
50
+ /* FATAL */
51
+ };
52
+ function parseLogLevel(value) {
53
+ if (!value) return 2;
54
+ const normalized = value.trim().toLowerCase();
55
+ const byName = LEVEL_BY_NAME[normalized];
56
+ if (typeof byName === "number") return byName;
57
+ const asNumber = Number(normalized);
58
+ if (Number.isFinite(asNumber) && asNumber >= 0 && asNumber <= 5) {
59
+ return asNumber;
60
+ }
61
+ return 2;
62
+ }
63
+ function logLevelName(level) {
64
+ switch (level) {
65
+ case 0:
66
+ return "TRACE";
67
+ case 1:
68
+ return "DEBUG";
69
+ case 2:
70
+ return "INFO";
71
+ case 3:
72
+ return "WARN";
73
+ case 4:
74
+ return "ERROR";
75
+ case 5:
76
+ return "FATAL";
77
+ default:
78
+ return "INFO";
79
+ }
80
+ }
81
+ function formatArg(arg) {
82
+ if (arg === void 0) return "undefined";
83
+ if (arg === null) return null;
84
+ if (arg instanceof Error) {
85
+ return { name: arg.name, message: arg.message, stack: arg.stack };
86
+ }
87
+ switch (typeof arg) {
88
+ case "string":
89
+ case "number":
90
+ case "boolean":
91
+ return arg;
92
+ case "bigint":
93
+ return arg.toString();
94
+ case "symbol":
95
+ return String(arg);
96
+ case "function":
97
+ return `[Function${arg.name ? `: ${arg.name}` : ""}]`;
98
+ default:
99
+ return arg;
100
+ }
101
+ }
102
+ class AbstractLogger {
103
+ constructor(name, manager, contextData) {
104
+ this.name = name;
105
+ this.manager = manager;
106
+ this.contextData = contextData;
107
+ }
108
+ /**
109
+ * Creates a new logger with the specified name.
110
+ * Replaces the current logger's name (not hierarchical).
111
+ */
112
+ named(name) {
113
+ return new NamedLogger(name, this.manager, this.contextData);
114
+ }
115
+ /**
116
+ * Creates a new logger with additional context.
117
+ * Context is merged into every log entry's context field.
118
+ * If this logger already has context, both contexts are merged.
119
+ * Returns a new logger instance (immutable operation).
120
+ */
121
+ withContext(context) {
122
+ const mergedContext = this.contextData ? { ...this.contextData, ...context } : context;
123
+ return new NamedLogger(this.name, this.manager, mergedContext);
124
+ }
125
+ trace(message, ...args) {
126
+ this.log(LogLevel.TRACE, message, args);
127
+ }
128
+ debug(message, ...args) {
129
+ this.log(LogLevel.DEBUG, message, args);
130
+ }
131
+ info(message, ...args) {
132
+ this.log(LogLevel.INFO, message, args);
133
+ }
134
+ warn(message, ...args) {
135
+ this.log(LogLevel.WARN, message, args);
136
+ }
137
+ error(message, ...args) {
138
+ this.log(LogLevel.ERROR, message, args);
139
+ }
140
+ fatal(message, ...args) {
141
+ this.log(LogLevel.FATAL, message, args);
142
+ }
143
+ log(level, message, args) {
144
+ if (!this.manager.shouldLog(level, this.name)) return;
145
+ const timestamp = (/* @__PURE__ */ new Date()).toISOString();
146
+ let argsContext = args.length > 0 ? args.length === 1 ? formatArg(args[0]) : args.map(formatArg) : void 0;
147
+ let context;
148
+ if (this.contextData && argsContext !== void 0) {
149
+ context = { ...this.contextData, args: argsContext };
150
+ } else if (this.contextData) {
151
+ context = this.contextData;
152
+ } else {
153
+ context = argsContext;
154
+ }
155
+ this.manager.log({
156
+ timestamp,
157
+ level: logLevelName(level),
158
+ logger: this.name,
159
+ message,
160
+ context
161
+ });
162
+ }
163
+ }
164
+ class NamedLogger extends AbstractLogger {
165
+ constructor(name, manager, contextData) {
166
+ super(name, manager, contextData);
167
+ }
168
+ }
169
+ class ConsoleTransport {
170
+ log(entry) {
171
+ const contextStr = entry.context !== void 0 ? ` ${JSON.stringify(entry.context)}` : "";
172
+ const formatted = `[${entry.timestamp}] [${entry.logger}] [${entry.level}] ${entry.message}${contextStr}`;
173
+ switch (entry.level) {
174
+ case "ERROR":
175
+ case "FATAL":
176
+ console.error(formatted);
177
+ break;
178
+ case "WARN":
179
+ console.warn(formatted);
180
+ break;
181
+ default:
182
+ console.log(formatted);
183
+ break;
184
+ }
185
+ }
186
+ }
187
+ const MANAGER_SYMBOL = /* @__PURE__ */ Symbol.for("@noego/logger");
188
+ class LoggingManager {
189
+ constructor() {
190
+ var _a, _b, _c;
191
+ this.transports = [];
192
+ this.loggerLevels = /* @__PURE__ */ new Map();
193
+ const logLevelEnv = typeof process !== "undefined" ? (_a = process.env) == null ? void 0 : _a.LOG_LEVEL : void 0;
194
+ const serviceNameEnv = typeof process !== "undefined" ? (_b = process.env) == null ? void 0 : _b.SERVICE_NAME : void 0;
195
+ const nodeEnv = typeof process !== "undefined" ? (_c = process.env) == null ? void 0 : _c.NODE_ENV : void 0;
196
+ this.level = parseLogLevel(logLevelEnv);
197
+ this.service = serviceNameEnv ?? "noego";
198
+ this.environment = nodeEnv ?? "development";
199
+ }
200
+ getLevel() {
201
+ return this.level;
202
+ }
203
+ setLevel(level) {
204
+ this.level = level;
205
+ }
206
+ setLoggerLevel(name, level) {
207
+ this.loggerLevels.set(name, level);
208
+ }
209
+ shouldLog(level, loggerName) {
210
+ if (loggerName) {
211
+ const loggerLevel = this.loggerLevels.get(loggerName);
212
+ if (loggerLevel !== void 0) {
213
+ return level >= loggerLevel;
214
+ }
215
+ }
216
+ return level >= this.level;
217
+ }
218
+ addTransport(transport) {
219
+ this.transports.push(transport);
220
+ }
221
+ setTransports(transports) {
222
+ this.transports = [...transports];
223
+ }
224
+ clearTransports() {
225
+ this.transports = [];
226
+ }
227
+ setServiceName(name) {
228
+ this.service = name;
229
+ }
230
+ log(entry) {
231
+ const fullEntry = {
232
+ ...entry,
233
+ environment: this.environment,
234
+ service: this.service
235
+ };
236
+ for (const transport of this.transports) {
237
+ transport.log(fullEntry);
238
+ }
239
+ }
240
+ async closeAll() {
241
+ for (const transport of this.transports) {
242
+ if (transport.close) {
243
+ await transport.close();
244
+ }
245
+ }
246
+ }
247
+ formatMessage(level, name, message) {
248
+ const timestamp = (/* @__PURE__ */ new Date()).toISOString();
249
+ return `[${timestamp}] [${name}] [${logLevelName(level)}] ${message}`;
250
+ }
251
+ }
252
+ function getManager() {
253
+ const global = globalThis;
254
+ if (!global[MANAGER_SYMBOL]) {
255
+ const manager = new LoggingManager();
256
+ manager.addTransport(new ConsoleTransport());
257
+ global[MANAGER_SYMBOL] = manager;
258
+ }
259
+ return global[MANAGER_SYMBOL];
260
+ }
261
+ function getLogger(name) {
262
+ return new NamedLogger(name, getManager());
263
+ }
264
+ const log$2 = getLogger("forge:components");
34
265
  class BasicComponentLoader {
35
266
  constructor(basePath) {
36
267
  __publicField(this, "resolvedBasePath");
@@ -53,7 +284,7 @@ class ViteComponentLoader {
53
284
  }
54
285
  async load(componentPath, options = { use_base_path: true }) {
55
286
  const absoluteComponentPath = this.getComponentFullPath(componentPath, options);
56
- console.log(`[ViteComponentLoader] Loading component from path: ${absoluteComponentPath}`);
287
+ log$2.debug(`Loading component from path: ${absoluteComponentPath}`);
57
288
  const jsPath = absoluteComponentPath.replace(/\.svelte$/, ".js");
58
289
  fs.existsSync(jsPath);
59
290
  let vitePath = path.relative(process.cwd(), absoluteComponentPath);
@@ -61,18 +292,18 @@ class ViteComponentLoader {
61
292
  if (!vitePath.startsWith("/")) {
62
293
  vitePath = "/" + vitePath;
63
294
  }
64
- console.log(`[ViteComponentLoader] Resolved Vite path: ${vitePath} from componentPath: ${componentPath}`);
295
+ log$2.debug(`Resolved Vite path: ${vitePath} from componentPath: ${componentPath}`);
65
296
  try {
66
- console.log(`[ViteComponentLoader] Loading module for vitePath: ${vitePath}`);
297
+ log$2.debug(`Loading module for vitePath: ${vitePath}`);
67
298
  const module2 = await this.vite.ssrLoadModule(vitePath);
68
- console.log(`[ViteComponentLoader] Module loaded successfully for: ${vitePath}`);
299
+ log$2.debug(`Module loaded successfully for: ${vitePath}`);
69
300
  if (!module2 || !module2.default) {
70
- console.error(`[ViteComponentLoader] Loaded module for ${vitePath} is invalid or missing a default export. Module content:`, module2);
301
+ log$2.error(`Loaded module for ${vitePath} is invalid or missing a default export. Module content:`, module2);
71
302
  throw new Error(`Module ${vitePath} loaded successfully but is invalid or missing default export.`);
72
303
  }
73
304
  return module2;
74
305
  } catch (error) {
75
- console.error(`[ViteComponentLoader] Error loading module for vitePath: ${vitePath} (derived from componentPath: ${componentPath})`, error);
306
+ log$2.error(`Error loading module for vitePath: ${vitePath} (derived from componentPath: ${componentPath})`, error);
76
307
  try {
77
308
  await fs.promises.access(absoluteComponentPath);
78
309
  } catch (fsError) {
@@ -105,7 +336,7 @@ class ProdComponentLoader {
105
336
  return module22;
106
337
  }
107
338
  } catch (error) {
108
- console.warn(`[Forge] Failed to load component "${componentPath}" from entry manifest:`, error);
339
+ log$2.warn(`Failed to load component "${componentPath}" from entry manifest:`, error);
109
340
  }
110
341
  const component_path = this.getComponentFullPath(componentPath);
111
342
  const fallbackPath = component_path.endsWith(".js") ? component_path : component_path.replace(/\.svelte$/, ".js");
@@ -149,6 +380,7 @@ class ProdComponentLoader {
149
380
  return this.componentMapPromise;
150
381
  }
151
382
  }
383
+ const log$1 = getLogger("forge:parser");
152
384
  const HTTP_METHODS = /* @__PURE__ */ new Set([
153
385
  "get",
154
386
  "post",
@@ -171,7 +403,7 @@ function parseConfigfile(file_content) {
171
403
  try {
172
404
  config = yaml.load(file_content);
173
405
  } catch (e) {
174
- console.log(e);
406
+ log$1.error("Failed to parse config file:", e);
175
407
  }
176
408
  return config;
177
409
  }
@@ -183,7 +415,7 @@ function parse_modules(openapi, inheritedMiddleware = []) {
183
415
  const isArrayFormat = Array.isArray(modules_config);
184
416
  let moduleEntries;
185
417
  if (isArrayFormat) {
186
- console.warn("[Forge] Deprecation warning: Array format for modules is deprecated. Please migrate to named object format: modules: { moduleName: { basePath, paths, x-layout } }");
418
+ log$1.warn("Deprecation warning: Array format for modules is deprecated. Please migrate to named object format: modules: { moduleName: { basePath, paths, x-layout } }");
187
419
  moduleEntries = modules_config.map((m, idx) => ({
188
420
  module: m,
189
421
  name: `module[${idx}]`,
@@ -263,7 +495,7 @@ async function parse_openapi_config(openapi_config_path) {
263
495
  const parsed_config = parseConfigfile(content);
264
496
  let openapi_config;
265
497
  if (isStitchConfig(parsed_config)) {
266
- console.log("Detected stitch configuration, building with Node.js stitch engine...");
498
+ log$1.info("Detected stitch configuration, building with Node.js stitch engine...");
267
499
  try {
268
500
  const { StitchEngine } = await import("@noego/stitch");
269
501
  const startTime = Date.now();
@@ -273,13 +505,13 @@ async function parse_openapi_config(openapi_config_path) {
273
505
  throw new Error(`Stitch build failed: ${result.error}`);
274
506
  }
275
507
  const buildTime = Date.now() - startTime;
276
- console.log(`INFO Stitch build completed in ${buildTime} ms – ${parsed_config.stitch ? parsed_config.stitch.length : 0} modules processed`);
508
+ log$1.info(`Stitch build completed in ${buildTime} ms – ${parsed_config.stitch ? parsed_config.stitch.length : 0} modules processed`);
277
509
  openapi_config = typeof result.data === "string" ? JSON.parse(result.data) : result.data;
278
510
  } catch (error) {
279
511
  throw new Error(`Failed to process stitch configuration: ${error instanceof Error ? error.message : String(error)}`);
280
512
  }
281
513
  } else if (isOpenAPIConfig(parsed_config)) {
282
- console.log("Detected regular OpenAPI configuration");
514
+ log$1.info("Detected regular OpenAPI configuration");
283
515
  openapi_config = parsed_config;
284
516
  } else {
285
517
  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.`);
@@ -302,6 +534,7 @@ async function parse_openapi_config(openapi_config_path) {
302
534
  };
303
535
  return config;
304
536
  }
537
+ const log = getLogger("forge:components");
305
538
  class ComponentManager {
306
539
  constructor(componentLoader) {
307
540
  this.componentLoader = componentLoader;
@@ -309,7 +542,7 @@ class ComponentManager {
309
542
  async getLayoutComponents(route) {
310
543
  const layout_paths = route.layout || [];
311
544
  const layouts_components = await Promise.all(layout_paths.map((layout) => {
312
- console.log("layout path", layout);
545
+ log.debug("layout path", layout);
313
546
  return this.componentLoader.load(layout);
314
547
  }));
315
548
  return layouts_components;
@@ -379,21 +612,21 @@ class ComponentManager {
379
612
  continue;
380
613
  }
381
614
  try {
382
- console.log(`[ComponentManager] Trying loader path: ${loaderFilePath}`);
615
+ log.debug(`Trying loader path: ${loaderFilePath}`);
383
616
  const module2 = await import(url.pathToFileURL(loaderFilePath).href);
384
617
  const loader = module2 == null ? void 0 : module2.default;
385
- console.log(`[ComponentManager] Imported loader module: default=${typeof loader}`);
618
+ log.debug(`Imported loader module: default=${typeof loader}`);
386
619
  if (typeof loader === "function") {
387
- console.log(`[ComponentManager] Loaded loader function from: ${loaderFilePath}`);
620
+ log.debug(`Loaded loader function from: ${loaderFilePath}`);
388
621
  return loader;
389
622
  }
390
623
  } catch (error) {
391
624
  const code = (error == null ? void 0 : error.code) || (error == null ? void 0 : error.name) || "UNKNOWN_ERROR";
392
625
  if (code === "MODULE_NOT_FOUND" || code === "ERR_MODULE_NOT_FOUND") {
393
- console.warn(`[ComponentManager] Loader not found at ${loaderFilePath} (${ext}): ${(error == null ? void 0 : error.message) || code}`);
626
+ log.warn(`Loader not found at ${loaderFilePath} (${ext}): ${(error == null ? void 0 : error.message) || code}`);
394
627
  continue;
395
628
  }
396
- console.error(`[ComponentManager] Failed to load loader for ${componentPath} (${ext}) at ${loaderFilePath}:`, error);
629
+ log.error(`Failed to load loader for ${componentPath} (${ext}) at ${loaderFilePath}:`, error);
397
630
  }
398
631
  }
399
632
  return null;
@@ -436,6 +669,7 @@ exports.ComponentManager = ComponentManager;
436
669
  exports.ProdComponentLoader = ProdComponentLoader;
437
670
  exports.ViteComponentLoader = ViteComponentLoader;
438
671
  exports.findRoute = findRoute;
672
+ exports.getLogger = getLogger;
439
673
  exports.initialize_route_matchers = initialize_route_matchers;
440
674
  exports.parse_openapi_config = parse_openapi_config;
441
- //# sourceMappingURL=url_parser-BWBuKJkA.cjs.map
675
+ //# sourceMappingURL=url_parser-C-aLYzi3.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url_parser-C-aLYzi3.cjs","sources":["../../logger/dist/core/log_level.js","../../logger/dist/core/abstract_logger.js","../../logger/dist/transports/console_transport.js","../../logger/dist/core/logging_manager.js","../../logger/dist/get_logger.js","../src/routing/component_loader/component_loader.ts","../src/parser/openapi.ts","../src/routing/component_loader/component_manager.ts","../src/routing/url_parser.ts"],"sourcesContent":["var LogLevel = /* @__PURE__ */ ((LogLevel2) => {\n LogLevel2[LogLevel2[\"TRACE\"] = 0] = \"TRACE\";\n LogLevel2[LogLevel2[\"DEBUG\"] = 1] = \"DEBUG\";\n LogLevel2[LogLevel2[\"INFO\"] = 2] = \"INFO\";\n LogLevel2[LogLevel2[\"WARN\"] = 3] = \"WARN\";\n LogLevel2[LogLevel2[\"ERROR\"] = 4] = \"ERROR\";\n LogLevel2[LogLevel2[\"FATAL\"] = 5] = \"FATAL\";\n return LogLevel2;\n})(LogLevel || {});\nconst LEVEL_BY_NAME = {\n trace: 0 /* TRACE */,\n debug: 1 /* DEBUG */,\n info: 2 /* INFO */,\n warn: 3 /* WARN */,\n error: 4 /* ERROR */,\n fatal: 5 /* FATAL */\n};\nfunction parseLogLevel(value) {\n if (!value) return 2 /* INFO */;\n const normalized = value.trim().toLowerCase();\n const byName = LEVEL_BY_NAME[normalized];\n if (typeof byName === \"number\") return byName;\n const asNumber = Number(normalized);\n if (Number.isFinite(asNumber) && asNumber >= 0 && asNumber <= 5) {\n return asNumber;\n }\n return 2 /* INFO */;\n}\nfunction logLevelName(level) {\n switch (level) {\n case 0 /* TRACE */:\n return \"TRACE\";\n case 1 /* DEBUG */:\n return \"DEBUG\";\n case 2 /* INFO */:\n return \"INFO\";\n case 3 /* WARN */:\n return \"WARN\";\n case 4 /* ERROR */:\n return \"ERROR\";\n case 5 /* FATAL */:\n return \"FATAL\";\n default:\n return \"INFO\";\n }\n}\nexport {\n LogLevel,\n logLevelName,\n parseLogLevel\n};\n//# sourceMappingURL=log_level.js.map","import { LogLevel, logLevelName } from \"./log_level.js\";\nfunction safeJsonStringify(value) {\n const seen = /* @__PURE__ */ new WeakSet();\n try {\n return JSON.stringify(value, (_key, val) => {\n if (typeof val === \"bigint\") return val.toString();\n if (typeof val === \"object\" && val !== null) {\n if (seen.has(val)) return \"[Circular]\";\n seen.add(val);\n }\n if (val instanceof Error) {\n return { name: val.name, message: val.message, stack: val.stack };\n }\n return val;\n });\n } catch {\n return '\"[Unserializable]\"';\n }\n}\nfunction formatArg(arg) {\n if (arg === void 0) return \"undefined\";\n if (arg === null) return null;\n if (arg instanceof Error) {\n return { name: arg.name, message: arg.message, stack: arg.stack };\n }\n switch (typeof arg) {\n case \"string\":\n case \"number\":\n case \"boolean\":\n return arg;\n case \"bigint\":\n return arg.toString();\n case \"symbol\":\n return String(arg);\n case \"function\":\n return `[Function${arg.name ? `: ${arg.name}` : \"\"}]`;\n default:\n return arg;\n }\n}\nfunction formatArgAsString(arg) {\n const formatted = formatArg(arg);\n if (typeof formatted === \"string\") return formatted;\n return safeJsonStringify(formatted);\n}\nclass AbstractLogger {\n constructor(name, manager, contextData) {\n this.name = name;\n this.manager = manager;\n this.contextData = contextData;\n }\n /**\n * Creates a new logger with the specified name.\n * Replaces the current logger's name (not hierarchical).\n */\n named(name) {\n return new NamedLogger(name, this.manager, this.contextData);\n }\n /**\n * Creates a new logger with additional context.\n * Context is merged into every log entry's context field.\n * If this logger already has context, both contexts are merged.\n * Returns a new logger instance (immutable operation).\n */\n withContext(context) {\n const mergedContext = this.contextData ? { ...this.contextData, ...context } : context;\n return new NamedLogger(this.name, this.manager, mergedContext);\n }\n trace(message, ...args) {\n this.log(LogLevel.TRACE, message, args);\n }\n debug(message, ...args) {\n this.log(LogLevel.DEBUG, message, args);\n }\n info(message, ...args) {\n this.log(LogLevel.INFO, message, args);\n }\n warn(message, ...args) {\n this.log(LogLevel.WARN, message, args);\n }\n error(message, ...args) {\n this.log(LogLevel.ERROR, message, args);\n }\n fatal(message, ...args) {\n this.log(LogLevel.FATAL, message, args);\n }\n log(level, message, args) {\n if (!this.manager.shouldLog(level, this.name)) return;\n const timestamp = (/* @__PURE__ */ new Date()).toISOString();\n let argsContext = args.length > 0 ? args.length === 1 ? formatArg(args[0]) : args.map(formatArg) : void 0;\n let context;\n if (this.contextData && argsContext !== void 0) {\n context = { ...this.contextData, args: argsContext };\n } else if (this.contextData) {\n context = this.contextData;\n } else {\n context = argsContext;\n }\n this.manager.log({\n timestamp,\n level: logLevelName(level),\n logger: this.name,\n message,\n context\n });\n }\n}\nclass NamedLogger extends AbstractLogger {\n constructor(name, manager, contextData) {\n super(name, manager, contextData);\n }\n}\nexport {\n NamedLogger\n};\n//# sourceMappingURL=abstract_logger.js.map","class ConsoleTransport {\n log(entry) {\n const contextStr = entry.context !== void 0 ? ` ${JSON.stringify(entry.context)}` : \"\";\n const formatted = `[${entry.timestamp}] [${entry.logger}] [${entry.level}] ${entry.message}${contextStr}`;\n switch (entry.level) {\n case \"ERROR\":\n case \"FATAL\":\n console.error(formatted);\n break;\n case \"WARN\":\n console.warn(formatted);\n break;\n default:\n console.log(formatted);\n break;\n }\n }\n}\nvar console_transport_default = ConsoleTransport;\nexport {\n ConsoleTransport,\n console_transport_default as default\n};\n//# sourceMappingURL=console_transport.js.map","import { logLevelName, parseLogLevel } from \"./log_level.js\";\nimport { ConsoleTransport } from \"../transports/console_transport.js\";\nconst MANAGER_SYMBOL = /* @__PURE__ */ Symbol.for(\"@noego/logger\");\nclass LoggingManager {\n constructor() {\n this.transports = [];\n this.loggerLevels = /* @__PURE__ */ new Map();\n const logLevelEnv = typeof process !== \"undefined\" ? process.env?.LOG_LEVEL : void 0;\n const serviceNameEnv = typeof process !== \"undefined\" ? process.env?.SERVICE_NAME : void 0;\n const nodeEnv = typeof process !== \"undefined\" ? process.env?.NODE_ENV : void 0;\n this.level = parseLogLevel(logLevelEnv);\n this.service = serviceNameEnv ?? \"noego\";\n this.environment = nodeEnv ?? \"development\";\n }\n getLevel() {\n return this.level;\n }\n setLevel(level) {\n this.level = level;\n }\n setLoggerLevel(name, level) {\n this.loggerLevels.set(name, level);\n }\n shouldLog(level, loggerName) {\n if (loggerName) {\n const loggerLevel = this.loggerLevels.get(loggerName);\n if (loggerLevel !== void 0) {\n return level >= loggerLevel;\n }\n }\n return level >= this.level;\n }\n addTransport(transport) {\n this.transports.push(transport);\n }\n setTransports(transports) {\n this.transports = [...transports];\n }\n clearTransports() {\n this.transports = [];\n }\n setServiceName(name) {\n this.service = name;\n }\n log(entry) {\n const fullEntry = {\n ...entry,\n environment: this.environment,\n service: this.service\n };\n for (const transport of this.transports) {\n transport.log(fullEntry);\n }\n }\n async closeAll() {\n for (const transport of this.transports) {\n if (transport.close) {\n await transport.close();\n }\n }\n }\n formatMessage(level, name, message) {\n const timestamp = (/* @__PURE__ */ new Date()).toISOString();\n return `[${timestamp}] [${name}] [${logLevelName(level)}] ${message}`;\n }\n}\nfunction getManager() {\n const global = globalThis;\n if (!global[MANAGER_SYMBOL]) {\n const manager = new LoggingManager();\n manager.addTransport(new ConsoleTransport());\n global[MANAGER_SYMBOL] = manager;\n }\n return global[MANAGER_SYMBOL];\n}\nfunction configureLogging(options) {\n const manager = getManager();\n if (options.level !== void 0) {\n manager.setLevel(options.level);\n }\n if (options.loggers) {\n for (const [name, level] of Object.entries(options.loggers)) {\n manager.setLoggerLevel(name, level);\n }\n }\n if (options.transports) {\n manager.setTransports(options.transports);\n }\n if (options.serviceName) {\n manager.setServiceName(options.serviceName);\n }\n}\nasync function shutdown() {\n const manager = getManager();\n await manager.closeAll();\n}\nexport {\n LoggingManager,\n configureLogging,\n getManager,\n shutdown\n};\n//# sourceMappingURL=logging_manager.js.map","import { NamedLogger } from \"./core/abstract_logger.js\";\nimport { getManager } from \"./core/logging_manager.js\";\nfunction getLogger(name) {\n return new NamedLogger(name, getManager());\n}\nexport {\n getLogger\n};\n//# sourceMappingURL=get_logger.js.map","import type { SvelteComponent } from 'svelte';\nimport type { ViteDevServer } from 'vite';\nimport path from 'path';\nimport fs from 'fs';\nimport { pathToFileURL } from 'url';\nimport { SvelteImport, SvelteModuleComponent } from '../base';\nimport { getLogger } from '@noego/logger';\n\nconst log = getLogger('forge:components');\n\n\ntype SvelteResource<K> = SvelteImport<K> & SvelteModuleComponent\n\nexport interface IComponentLoader{\n load(component: string,options?:any): Promise<SvelteResource<SvelteComponent>>\n getComponentFullPath(component: string, options?: any): string\n}\n\n\nexport class BasicComponentLoader implements IComponentLoader {\n private resolvedBasePath: string;\n\n constructor(private basePath: string) {\n // Resolve basePath relative to current working directory\n this.resolvedBasePath = path.isAbsolute(basePath)\n ? basePath\n : path.resolve(process.cwd(), basePath);\n }\n\n async load(componentPath: string) {\n const component_full_path = this.getComponentFullPath(componentPath);\n // Use pathToFileURL for proper ESM import of absolute paths\n const module = await import(pathToFileURL(component_full_path).href);\n return module as SvelteResource<any>;\n }\n\n getComponentFullPath(componentPath: string): string {\n return path.join(this.resolvedBasePath, componentPath);\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 const absoluteComponentPath = this.getComponentFullPath(componentPath, options);\n\n log.debug(`Loading component from path: ${absoluteComponentPath}`);\n\n // Smart detection: check for precompiled .js file first\n const jsPath = absoluteComponentPath.replace(/\\.svelte$/, '.js');\n const jsExists = fs.existsSync(jsPath);\n\n // TODO: Remove this if we only need svelte files\n if (false && jsExists) {\n // Precompiled .js exists - use it directly (production mode)\n log.debug(`Found precompiled component at: ${jsPath}`);\n try {\n const module: any = await import(jsPath);\n log.debug(`Loaded precompiled module successfully`);\n return module as SvelteResource<any>;\n } catch (error) {\n log.error(`Error loading precompiled module from ${jsPath}`, error);\n throw error;\n }\n }\n\n // No .js file - fall back to Vite dev mode (.svelte)\n let vitePath = path.relative(process.cwd(), absoluteComponentPath);\n\n vitePath = vitePath.replace(/\\\\/g, '/');\n\n if (!vitePath.startsWith('/')) {\n vitePath = '/' + vitePath;\n }\n\n log.debug(`Resolved Vite path: ${vitePath} from componentPath: ${componentPath}`);\n\n\n try {\n log.debug(`Loading module for vitePath: ${vitePath}`);\n const module = await this.vite.ssrLoadModule(vitePath);\n log.debug(`Module loaded successfully for: ${vitePath}`);\n if (!module || !module.default) {\n log.error(`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 log.error(`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 getComponentFullPath(componentPath: string, options = {use_base_path:true}): string {\n const use_base_path = options.use_base_path || false;\n\n if (use_base_path) {\n return path.join(this.basePath, componentPath);\n }\n\n if (path.isAbsolute(componentPath)) {\n return componentPath;\n }\n\n return componentPath;\n }\n}\n\n\nexport class ProdComponentLoader implements IComponentLoader {\n\n private componentMapPromise: Promise<Record<string, SvelteResource<any>>> | null = null;\n\n constructor(private base_path: string) {}\n\n async load(componentPath: string): Promise<SvelteResource<any>> {\n const normalized = this.normalizeKey(componentPath);\n\n try {\n const map = await this.loadComponentMap();\n const module = map[normalized];\n if (module) {\n return module;\n }\n } catch (error) {\n log.warn(`Failed to load component \"${componentPath}\" from entry manifest:`, error);\n }\n\n const component_path = this.getComponentFullPath(componentPath);\n const fallbackPath = component_path.endsWith('.js')\n ? component_path\n : component_path.replace(/\\.svelte$/, '.js');\n const module: any = await import(pathToFileURL(fallbackPath).href);\n return module as SvelteResource<any>;\n }\n\n getComponentFullPath(componentPath: string): string {\n return path.join(this.base_path, componentPath);\n }\n\n private normalizeKey(componentPath: string): string {\n const trimmed = componentPath.replace(/^\\.\\//, '');\n if (trimmed.endsWith('.svelte')) {\n return trimmed.replace(/\\.svelte$/, '.js');\n }\n return trimmed;\n }\n\n private async loadComponentMap(): Promise<Record<string, SvelteResource<any>>> {\n if (!this.componentMapPromise) {\n const entryPath = path.join(this.base_path, 'entry-ssr.js');\n const entryUrl = pathToFileURL(entryPath).href;\n this.componentMapPromise = import(entryUrl)\n .then((mod: any) => {\n const source = mod.components ?? mod.default ?? {};\n const normalized: Record<string, SvelteResource<any>> = {};\n for (const [key, value] of Object.entries<SvelteResource<any>>(source)) {\n const cleanKey = key.replace(/^\\.\\//, '');\n normalized[cleanKey] = value;\n if (cleanKey.startsWith('ui/')) {\n normalized[cleanKey.slice(3)] = value;\n }\n if (cleanKey.endsWith('.svelte')) {\n const jsKey = cleanKey.replace(/\\.svelte$/, '.js');\n normalized[jsKey] = value;\n }\n }\n return normalized;\n })\n .catch((error) => {\n this.componentMapPromise = null;\n throw error;\n });\n }\n return this.componentMapPromise;\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'\nimport { getLogger } from '@noego/logger'\n\nconst log = getLogger('forge:parser')\n\nconst HTTP_METHODS = new Set([\n 'get',\n 'post',\n 'put',\n 'delete',\n 'patch',\n 'head',\n 'options',\n 'trace'\n])\n\nfunction getGlobalPathsMiddleware(openapi:any): string[] {\n if (!openapi || !openapi.paths) {\n return []\n }\n const value = openapi.paths['x-middleware']\n return Array.isArray(value) ? [...value] : []\n}\n\nexport function parseConfigfile(file_content:string) {\n let config:any = null\n try {\n config = yaml.load(file_content)\n } catch (e) {\n log.error('Failed to parse config file:', e)\n }\n return config\n}\n\n\nexport function parse_modules(openapi:any, inheritedMiddleware: string[] = []){\n const modules_config = (openapi.modules || openapi.module)\n if (!modules_config) {\n return\n }\n\n // Detect format: array (deprecated) vs named object (new)\n const isArrayFormat = Array.isArray(modules_config)\n\n let moduleEntries: Array<{module: any, name: string, isObjectFormat: boolean}>\n\n if (isArrayFormat) {\n // Old array format - backwards compatible, log deprecation warning\n log.warn('Deprecation warning: Array format for modules is deprecated. ' +\n 'Please migrate to named object format: modules: { moduleName: { basePath, paths, x-layout } }')\n moduleEntries = modules_config.map((m: any, idx: number) => ({\n module: m,\n name: `module[${idx}]`,\n isObjectFormat: false\n }))\n } else {\n // New named object format - validate like Dinner\n moduleEntries = Object.entries(modules_config).map(([name, module]: [string, any]) => {\n if (!module.basePath) {\n throw new Error(`Module '${name}' is missing required 'basePath' property`)\n }\n if (!module.paths) {\n throw new Error(`Module '${name}' is missing required 'paths' property`)\n }\n return { module, name, isObjectFormat: true }\n })\n }\n\n const globalMiddleware = [...inheritedMiddleware, ...getGlobalPathsMiddleware(openapi)]\n\n const modules_path: (IRoute[] | undefined)[] = moduleEntries.map(({ module, isObjectFormat }) => {\n const basePath = module.basePath || ''\n // Use x-layout for object format, baseLayouts for array format (backwards compat)\n const baseLayouts = isObjectFormat\n ? (module['x-layout'] || [])\n : (module.baseLayouts || [])\n const moduleMiddleware = Array.isArray(module['x-middleware']) ? module['x-middleware'] : []\n const inherited = [...globalMiddleware, ...moduleMiddleware]\n\n const paths = module.paths\n\n if(!paths){\n return\n }\n\n const configurations = Object.entries(paths)\n .filter(([path]) => typeof path === 'string' && path.startsWith('/'))\n .map(([path, method_config]:[string,any]) => {\n return Object.entries(method_config)\n .filter(([method]) => HTTP_METHODS.has(String(method).toLowerCase()))\n .map(([method, config]) => {\n const methodName = String(method)\n return parsePathConfig(path,methodName,config,inherited)\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 if (!config) {\n return flat_config\n }\n return flat_config.concat(config)\n }\n ,[] as IRoute[])\n}\n\n\nexport function parse_paths(openapi:any, inheritedMiddleware: string[] = []){\n const paths = openapi.paths\n if (!paths) {\n return\n }\n\n const globalMiddleware = [...inheritedMiddleware, ...getGlobalPathsMiddleware(openapi)]\n\n const configurations = Object.entries(paths)\n .filter(([path]) => typeof path === 'string' && path.startsWith('/'))\n .map(([path, method_config]:[string,any]) => {\n return Object.entries(method_config)\n .filter(([method]) => HTTP_METHODS.has(String(method).toLowerCase()))\n .map(([method, config]) => {\n const methodName = String(method)\n return parsePathConfig(path,methodName,config,globalMiddleware)\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 if (route.middleware && route.middleware.length > 0) {\n config_method['x-middleware'] = route.middleware\n } else {\n delete config_method['x-middleware']\n }\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 log.info('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 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 log.info('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 const globalPathsMiddleware = getGlobalPathsMiddleware(openapi_config)\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 const fallback_middleware = Array.isArray(openapi_config['x-fallback-middleware'])\n ? [...openapi_config['x-fallback-middleware']]\n : [...globalPathsMiddleware]\n let fallback = {\n layout: fallback_layout ? [fallback_layout]:[],\n view: fallback_view,\n middleware: fallback_middleware\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 { pathToFileURL } from \"url\";\nimport type { IRoute } from \"../../parser/IRoute\";\nimport type { IComponentLoader } from \"./component_loader\";\nimport { getLogger } from '@noego/logger';\n\nconst log = getLogger('forge:components');\n\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 log.debug(\"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_paths = route.layout || [];\n \n // First, check for .load.js/.load.ts files using resolveLoader (maintains order)\n // Each loader at index N corresponds to the layout at index N\n const loaders_from_files = await Promise.all(\n layout_paths.map((layoutPath) => this.resolveLoader(layoutPath))\n );\n \n // Check if any need fallback to old-style component.load\n const needs_fallback = loaders_from_files.some(loader => !loader);\n \n if (needs_fallback) {\n // Fall back to old-style component.load for backward compatibility\n const layout_components = await this.getLayoutComponents(route);\n const old_style_loaders = layout_components.map(layout => layout.load);\n \n // Merge: prefer .load.js/.load.ts file loaders, fall back to old-style component.load\n // This maintains order: loader[index] corresponds to layout_paths[index]\n // Only include loaders that are actually functions\n return loaders_from_files.map((loader, index) => {\n const resolved = loader || old_style_loaders[index];\n return typeof resolved === 'function' ? resolved : null;\n });\n }\n \n return loaders_from_files;\n }\n\n\n async getViewComponent(route: IRoute) {\n return await this.componentLoader.load(route.view)\n }\n\n\n async hasLoaders(route:IRoute):Promise<boolean>{\n const componentPaths = [...(route.layout || []), route.view];\n\n for (const componentPath of componentPaths) {\n const loader = await this.resolveLoader(componentPath);\n if (loader) {\n return true;\n }\n }\n\n return false;\n }\n\n\n async getLoaders(route: IRoute) {\n const layoutPaths = route.layout || [];\n const layouts = await Promise.all(layoutPaths.map((layoutPath) => this.resolveLoader(layoutPath)));\n const view = await this.resolveLoader(route.view);\n\n return {\n layouts,\n view\n };\n }\n\n\n private getLoaderFilePath(componentPath?: string | null, extension: '.js' | '.ts' = '.js'): string | null {\n if (!componentPath) {\n return null;\n }\n\n const fullPath = this.componentLoader.getComponentFullPath(componentPath);\n const { dir, name } = path.parse(fullPath);\n return path.join(dir, `${name}.load${extension}`);\n }\n\n\n private async resolveLoader(componentPath?: string | null): Promise<((...args: any[]) => any) | null> {\n if (!componentPath) {\n return null;\n }\n\n // Try .load.js first (production), then .load.ts (development)\n const extensions: Array<'.js' | '.ts'> = ['.js', '.ts'];\n \n for (const ext of extensions) {\n const loaderFilePath = this.getLoaderFilePath(componentPath, ext);\n if (!loaderFilePath) {\n continue;\n }\n\n try {\n log.debug(`Trying loader path: ${loaderFilePath}`);\n const module = await import(pathToFileURL(loaderFilePath).href);\n const loader = module?.default;\n log.debug(`Imported loader module: default=${typeof loader}`);\n if (typeof loader === \"function\") {\n log.debug(`Loaded loader function from: ${loaderFilePath}`);\n return loader;\n }\n } catch (error: any) {\n const code = error?.code || error?.name || 'UNKNOWN_ERROR';\n if (code === \"MODULE_NOT_FOUND\" || code === \"ERR_MODULE_NOT_FOUND\") {\n log.warn(`Loader not found at ${loaderFilePath} (${ext}): ${error?.message || code}`);\n // File doesn't exist with this extension, try next one\n continue;\n }\n // Other errors (syntax errors, etc.) should be logged\n log.error(`Failed to load loader for ${componentPath} (${ext}) at ${loaderFilePath}:`, error);\n // Continue to try next extension\n }\n }\n\n // Neither .load.js nor .load.ts found\n return null;\n }\n\n\n async getView(route: IRoute) {\n const view = await this.componentLoader.load(route.view)\n return view.default\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 if (!result) return null;\n\n // Decode URL-encoded param values\n const decoded: Record<string, string> = {};\n for (const [key, value] of Object.entries(result)) {\n decoded[key] = decodeURIComponent(value as string);\n }\n return decoded;\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"],"names":["log","module","pathToFileURL","path","parsePathConfig"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@noego/forge",
3
- "version": "0.1.19",
3
+ "version": "0.1.21",
4
4
  "description": "",
5
5
  "main": "index.js",
6
6
  "imports": {
@@ -135,6 +135,7 @@
135
135
  }
136
136
  },
137
137
  "dependencies": {
138
+ "@noego/logger": "file:../logger",
138
139
  "@noego/stitch": "^1.0.2",
139
140
  "clone-deep": "^4.0.1",
140
141
  "deepmerge": "^4.3.1",
@@ -1 +0,0 @@
1
- {"version":3,"file":"url_parser-BWBuKJkA.cjs","sources":["../src/routing/component_loader/component_loader.ts","../src/parser/openapi.ts","../src/routing/component_loader/component_manager.ts","../src/routing/url_parser.ts"],"sourcesContent":["import type { SvelteComponent } from 'svelte';\nimport type { ViteDevServer } from 'vite';\nimport path from 'path';\nimport fs from 'fs';\nimport { pathToFileURL } from 'url';\nimport { SvelteImport, SvelteModuleComponent } from '../base';\n\n\ntype SvelteResource<K> = SvelteImport<K> & SvelteModuleComponent\n\nexport interface IComponentLoader{\n load(component: string,options?:any): Promise<SvelteResource<SvelteComponent>>\n getComponentFullPath(component: string, options?: any): string\n}\n\n\nexport class BasicComponentLoader implements IComponentLoader {\n private resolvedBasePath: string;\n\n constructor(private basePath: string) {\n // Resolve basePath relative to current working directory\n this.resolvedBasePath = path.isAbsolute(basePath)\n ? basePath\n : path.resolve(process.cwd(), basePath);\n }\n\n async load(componentPath: string) {\n const component_full_path = this.getComponentFullPath(componentPath);\n // Use pathToFileURL for proper ESM import of absolute paths\n const module = await import(pathToFileURL(component_full_path).href);\n return module as SvelteResource<any>;\n }\n\n getComponentFullPath(componentPath: string): string {\n return path.join(this.resolvedBasePath, componentPath);\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 const absoluteComponentPath = this.getComponentFullPath(componentPath, options);\n\n console.log(`[ViteComponentLoader] Loading component from path: ${absoluteComponentPath}`);\n\n // Smart detection: check for precompiled .js file first\n const jsPath = absoluteComponentPath.replace(/\\.svelte$/, '.js');\n const jsExists = fs.existsSync(jsPath);\n\n // TODO: Remove this if we only need svelte files\n if (false && jsExists) {\n // Precompiled .js exists - use it directly (production mode)\n console.log(`[ViteComponentLoader] Found precompiled component at: ${jsPath}`);\n try {\n const module: any = await import(jsPath);\n console.log(`[ViteComponentLoader] Loaded precompiled module successfully`);\n return module as SvelteResource<any>;\n } catch (error) {\n console.error(`[ViteComponentLoader] Error loading precompiled module from ${jsPath}`, error);\n throw error;\n }\n }\n\n // No .js file - fall back to Vite dev mode (.svelte)\n let vitePath = path.relative(process.cwd(), absoluteComponentPath);\n\n vitePath = vitePath.replace(/\\\\/g, '/');\n\n if (!vitePath.startsWith('/')) {\n vitePath = '/' + vitePath;\n }\n\n console.log(`[ViteComponentLoader] Resolved Vite path: ${vitePath} from componentPath: ${componentPath}`);\n\n\n try {\n console.log(`[ViteComponentLoader] Loading module for vitePath: ${vitePath}`);\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 getComponentFullPath(componentPath: string, options = {use_base_path:true}): string {\n const use_base_path = options.use_base_path || false;\n\n if (use_base_path) {\n return path.join(this.basePath, componentPath);\n }\n\n if (path.isAbsolute(componentPath)) {\n return componentPath;\n }\n\n return componentPath;\n }\n}\n\n\nexport class ProdComponentLoader implements IComponentLoader {\n\n private componentMapPromise: Promise<Record<string, SvelteResource<any>>> | null = null;\n\n constructor(private base_path: string) {}\n\n async load(componentPath: string): Promise<SvelteResource<any>> {\n const normalized = this.normalizeKey(componentPath);\n\n try {\n const map = await this.loadComponentMap();\n const module = map[normalized];\n if (module) {\n return module;\n }\n } catch (error) {\n console.warn(`[Forge] Failed to load component \"${componentPath}\" from entry manifest:`, error);\n }\n\n const component_path = this.getComponentFullPath(componentPath);\n const fallbackPath = component_path.endsWith('.js')\n ? component_path\n : component_path.replace(/\\.svelte$/, '.js');\n const module: any = await import(pathToFileURL(fallbackPath).href);\n return module as SvelteResource<any>;\n }\n\n getComponentFullPath(componentPath: string): string {\n return path.join(this.base_path, componentPath);\n }\n\n private normalizeKey(componentPath: string): string {\n const trimmed = componentPath.replace(/^\\.\\//, '');\n if (trimmed.endsWith('.svelte')) {\n return trimmed.replace(/\\.svelte$/, '.js');\n }\n return trimmed;\n }\n\n private async loadComponentMap(): Promise<Record<string, SvelteResource<any>>> {\n if (!this.componentMapPromise) {\n const entryPath = path.join(this.base_path, 'entry-ssr.js');\n const entryUrl = pathToFileURL(entryPath).href;\n this.componentMapPromise = import(entryUrl)\n .then((mod: any) => {\n const source = mod.components ?? mod.default ?? {};\n const normalized: Record<string, SvelteResource<any>> = {};\n for (const [key, value] of Object.entries<SvelteResource<any>>(source)) {\n const cleanKey = key.replace(/^\\.\\//, '');\n normalized[cleanKey] = value;\n if (cleanKey.startsWith('ui/')) {\n normalized[cleanKey.slice(3)] = value;\n }\n if (cleanKey.endsWith('.svelte')) {\n const jsKey = cleanKey.replace(/\\.svelte$/, '.js');\n normalized[jsKey] = value;\n }\n }\n return normalized;\n })\n .catch((error) => {\n this.componentMapPromise = null;\n throw error;\n });\n }\n return this.componentMapPromise;\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\nconst HTTP_METHODS = new Set([\n 'get',\n 'post',\n 'put',\n 'delete',\n 'patch',\n 'head',\n 'options',\n 'trace'\n])\n\nfunction getGlobalPathsMiddleware(openapi:any): string[] {\n if (!openapi || !openapi.paths) {\n return []\n }\n const value = openapi.paths['x-middleware']\n return Array.isArray(value) ? [...value] : []\n}\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, inheritedMiddleware: string[] = []){\n const modules_config = (openapi.modules || openapi.module)\n if (!modules_config) {\n return\n }\n\n // Detect format: array (deprecated) vs named object (new)\n const isArrayFormat = Array.isArray(modules_config)\n\n let moduleEntries: Array<{module: any, name: string, isObjectFormat: boolean}>\n\n if (isArrayFormat) {\n // Old array format - backwards compatible, log deprecation warning\n console.warn('[Forge] Deprecation warning: Array format for modules is deprecated. ' +\n 'Please migrate to named object format: modules: { moduleName: { basePath, paths, x-layout } }')\n moduleEntries = modules_config.map((m: any, idx: number) => ({\n module: m,\n name: `module[${idx}]`,\n isObjectFormat: false\n }))\n } else {\n // New named object format - validate like Dinner\n moduleEntries = Object.entries(modules_config).map(([name, module]: [string, any]) => {\n if (!module.basePath) {\n throw new Error(`Module '${name}' is missing required 'basePath' property`)\n }\n if (!module.paths) {\n throw new Error(`Module '${name}' is missing required 'paths' property`)\n }\n return { module, name, isObjectFormat: true }\n })\n }\n\n const globalMiddleware = [...inheritedMiddleware, ...getGlobalPathsMiddleware(openapi)]\n\n const modules_path: (IRoute[] | undefined)[] = moduleEntries.map(({ module, isObjectFormat }) => {\n const basePath = module.basePath || ''\n // Use x-layout for object format, baseLayouts for array format (backwards compat)\n const baseLayouts = isObjectFormat\n ? (module['x-layout'] || [])\n : (module.baseLayouts || [])\n const moduleMiddleware = Array.isArray(module['x-middleware']) ? module['x-middleware'] : []\n const inherited = [...globalMiddleware, ...moduleMiddleware]\n\n const paths = module.paths\n\n if(!paths){\n return\n }\n\n const configurations = Object.entries(paths)\n .filter(([path]) => typeof path === 'string' && path.startsWith('/'))\n .map(([path, method_config]:[string,any]) => {\n return Object.entries(method_config)\n .filter(([method]) => HTTP_METHODS.has(String(method).toLowerCase()))\n .map(([method, config]) => {\n const methodName = String(method)\n return parsePathConfig(path,methodName,config,inherited)\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 if (!config) {\n return flat_config\n }\n return flat_config.concat(config)\n }\n ,[] as IRoute[])\n}\n\n\nexport function parse_paths(openapi:any, inheritedMiddleware: string[] = []){\n const paths = openapi.paths\n if (!paths) {\n return\n }\n\n const globalMiddleware = [...inheritedMiddleware, ...getGlobalPathsMiddleware(openapi)]\n\n const configurations = Object.entries(paths)\n .filter(([path]) => typeof path === 'string' && path.startsWith('/'))\n .map(([path, method_config]:[string,any]) => {\n return Object.entries(method_config)\n .filter(([method]) => HTTP_METHODS.has(String(method).toLowerCase()))\n .map(([method, config]) => {\n const methodName = String(method)\n return parsePathConfig(path,methodName,config,globalMiddleware)\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 if (route.middleware && route.middleware.length > 0) {\n config_method['x-middleware'] = route.middleware\n } else {\n delete config_method['x-middleware']\n }\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 const globalPathsMiddleware = getGlobalPathsMiddleware(openapi_config)\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 const fallback_middleware = Array.isArray(openapi_config['x-fallback-middleware'])\n ? [...openapi_config['x-fallback-middleware']]\n : [...globalPathsMiddleware]\n let fallback = {\n layout: fallback_layout ? [fallback_layout]:[],\n view: fallback_view,\n middleware: fallback_middleware\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 { pathToFileURL } from \"url\";\nimport type { IRoute } from \"../../parser/IRoute\";\nimport type { IComponentLoader } from \"./component_loader\";\n\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_paths = route.layout || [];\n \n // First, check for .load.js/.load.ts files using resolveLoader (maintains order)\n // Each loader at index N corresponds to the layout at index N\n const loaders_from_files = await Promise.all(\n layout_paths.map((layoutPath) => this.resolveLoader(layoutPath))\n );\n \n // Check if any need fallback to old-style component.load\n const needs_fallback = loaders_from_files.some(loader => !loader);\n \n if (needs_fallback) {\n // Fall back to old-style component.load for backward compatibility\n const layout_components = await this.getLayoutComponents(route);\n const old_style_loaders = layout_components.map(layout => layout.load);\n \n // Merge: prefer .load.js/.load.ts file loaders, fall back to old-style component.load\n // This maintains order: loader[index] corresponds to layout_paths[index]\n // Only include loaders that are actually functions\n return loaders_from_files.map((loader, index) => {\n const resolved = loader || old_style_loaders[index];\n return typeof resolved === 'function' ? resolved : null;\n });\n }\n \n return loaders_from_files;\n }\n\n\n async getViewComponent(route: IRoute) {\n return await this.componentLoader.load(route.view)\n }\n\n\n async hasLoaders(route:IRoute):Promise<boolean>{\n const componentPaths = [...(route.layout || []), route.view];\n\n for (const componentPath of componentPaths) {\n const loader = await this.resolveLoader(componentPath);\n if (loader) {\n return true;\n }\n }\n\n return false;\n }\n\n\n async getLoaders(route: IRoute) {\n const layoutPaths = route.layout || [];\n const layouts = await Promise.all(layoutPaths.map((layoutPath) => this.resolveLoader(layoutPath)));\n const view = await this.resolveLoader(route.view);\n\n return {\n layouts,\n view\n };\n }\n\n\n private getLoaderFilePath(componentPath?: string | null, extension: '.js' | '.ts' = '.js'): string | null {\n if (!componentPath) {\n return null;\n }\n\n const fullPath = this.componentLoader.getComponentFullPath(componentPath);\n const { dir, name } = path.parse(fullPath);\n return path.join(dir, `${name}.load${extension}`);\n }\n\n\n private async resolveLoader(componentPath?: string | null): Promise<((...args: any[]) => any) | null> {\n if (!componentPath) {\n return null;\n }\n\n // Try .load.js first (production), then .load.ts (development)\n const extensions: Array<'.js' | '.ts'> = ['.js', '.ts'];\n \n for (const ext of extensions) {\n const loaderFilePath = this.getLoaderFilePath(componentPath, ext);\n if (!loaderFilePath) {\n continue;\n }\n\n try {\n console.log(`[ComponentManager] Trying loader path: ${loaderFilePath}`);\n const module = await import(pathToFileURL(loaderFilePath).href);\n const loader = module?.default;\n console.log(`[ComponentManager] Imported loader module: default=${typeof loader}`);\n if (typeof loader === \"function\") {\n console.log(`[ComponentManager] Loaded loader function from: ${loaderFilePath}`);\n return loader;\n }\n } catch (error: any) {\n const code = error?.code || error?.name || 'UNKNOWN_ERROR';\n if (code === \"MODULE_NOT_FOUND\" || code === \"ERR_MODULE_NOT_FOUND\") {\n console.warn(`[ComponentManager] Loader not found at ${loaderFilePath} (${ext}): ${error?.message || code}`);\n // File doesn't exist with this extension, try next one\n continue;\n }\n // Other errors (syntax errors, etc.) should be logged\n console.error(`[ComponentManager] Failed to load loader for ${componentPath} (${ext}) at ${loaderFilePath}:`, error);\n // Continue to try next extension\n }\n }\n\n // Neither .load.js nor .load.ts found\n return null;\n }\n\n\n async getView(route: IRoute) {\n const view = await this.componentLoader.load(route.view)\n return view.default\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 if (!result) return null;\n\n // Decode URL-encoded param values\n const decoded: Record<string, string> = {};\n for (const [key, value] of Object.entries(result)) {\n decoded[key] = decodeURIComponent(value as string);\n }\n return decoded;\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"],"names":["module","pathToFileURL","path","parsePathConfig"],"mappings":"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"}