@navios/openapi 0.7.0

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 (87) hide show
  1. package/LICENSE +8 -0
  2. package/README.md +260 -0
  3. package/dist/src/__tests__/decorators.spec.d.mts +2 -0
  4. package/dist/src/__tests__/decorators.spec.d.mts.map +1 -0
  5. package/dist/src/__tests__/metadata.spec.d.mts +2 -0
  6. package/dist/src/__tests__/metadata.spec.d.mts.map +1 -0
  7. package/dist/src/__tests__/services.spec.d.mts +2 -0
  8. package/dist/src/__tests__/services.spec.d.mts.map +1 -0
  9. package/dist/src/decorators/api-deprecated.decorator.d.mts +33 -0
  10. package/dist/src/decorators/api-deprecated.decorator.d.mts.map +1 -0
  11. package/dist/src/decorators/api-exclude.decorator.d.mts +26 -0
  12. package/dist/src/decorators/api-exclude.decorator.d.mts.map +1 -0
  13. package/dist/src/decorators/api-operation.decorator.d.mts +58 -0
  14. package/dist/src/decorators/api-operation.decorator.d.mts.map +1 -0
  15. package/dist/src/decorators/api-security.decorator.d.mts +36 -0
  16. package/dist/src/decorators/api-security.decorator.d.mts.map +1 -0
  17. package/dist/src/decorators/api-stream.decorator.d.mts +50 -0
  18. package/dist/src/decorators/api-stream.decorator.d.mts.map +1 -0
  19. package/dist/src/decorators/api-summary.decorator.d.mts +24 -0
  20. package/dist/src/decorators/api-summary.decorator.d.mts.map +1 -0
  21. package/dist/src/decorators/api-tag.decorator.d.mts +42 -0
  22. package/dist/src/decorators/api-tag.decorator.d.mts.map +1 -0
  23. package/dist/src/decorators/index.d.mts +8 -0
  24. package/dist/src/decorators/index.d.mts.map +1 -0
  25. package/dist/src/index.d.mts +5 -0
  26. package/dist/src/index.d.mts.map +1 -0
  27. package/dist/src/metadata/index.d.mts +2 -0
  28. package/dist/src/metadata/index.d.mts.map +1 -0
  29. package/dist/src/metadata/openapi.metadata.d.mts +30 -0
  30. package/dist/src/metadata/openapi.metadata.d.mts.map +1 -0
  31. package/dist/src/services/endpoint-scanner.service.d.mts +42 -0
  32. package/dist/src/services/endpoint-scanner.service.d.mts.map +1 -0
  33. package/dist/src/services/index.d.mts +6 -0
  34. package/dist/src/services/index.d.mts.map +1 -0
  35. package/dist/src/services/metadata-extractor.service.d.mts +19 -0
  36. package/dist/src/services/metadata-extractor.service.d.mts.map +1 -0
  37. package/dist/src/services/openapi-generator.service.d.mts +91 -0
  38. package/dist/src/services/openapi-generator.service.d.mts.map +1 -0
  39. package/dist/src/services/path-builder.service.d.mts +73 -0
  40. package/dist/src/services/path-builder.service.d.mts.map +1 -0
  41. package/dist/src/services/schema-converter.service.d.mts +57 -0
  42. package/dist/src/services/schema-converter.service.d.mts.map +1 -0
  43. package/dist/src/tokens/index.d.mts +18 -0
  44. package/dist/src/tokens/index.d.mts.map +1 -0
  45. package/dist/tsconfig.lib.tsbuildinfo +1 -0
  46. package/dist/tsconfig.spec.tsbuildinfo +1 -0
  47. package/dist/tsconfig.tsbuildinfo +1 -0
  48. package/dist/tsdown.config.d.mts +3 -0
  49. package/dist/tsdown.config.d.mts.map +1 -0
  50. package/dist/vitest.config.d.mts +3 -0
  51. package/dist/vitest.config.d.mts.map +1 -0
  52. package/lib/index.cjs +2120 -0
  53. package/lib/index.cjs.map +1 -0
  54. package/lib/index.d.cts +594 -0
  55. package/lib/index.d.cts.map +1 -0
  56. package/lib/index.d.mts +594 -0
  57. package/lib/index.d.mts.map +1 -0
  58. package/lib/index.mjs +2077 -0
  59. package/lib/index.mjs.map +1 -0
  60. package/package.json +44 -0
  61. package/project.json +66 -0
  62. package/src/__tests__/decorators.spec.mts +185 -0
  63. package/src/__tests__/metadata.spec.mts +207 -0
  64. package/src/__tests__/services.spec.mts +216 -0
  65. package/src/decorators/api-deprecated.decorator.mts +45 -0
  66. package/src/decorators/api-exclude.decorator.mts +29 -0
  67. package/src/decorators/api-operation.decorator.mts +59 -0
  68. package/src/decorators/api-security.decorator.mts +44 -0
  69. package/src/decorators/api-stream.decorator.mts +55 -0
  70. package/src/decorators/api-summary.decorator.mts +33 -0
  71. package/src/decorators/api-tag.decorator.mts +51 -0
  72. package/src/decorators/index.mts +7 -0
  73. package/src/index.mts +42 -0
  74. package/src/metadata/index.mts +2 -0
  75. package/src/metadata/openapi.metadata.mts +30 -0
  76. package/src/services/endpoint-scanner.service.mts +118 -0
  77. package/src/services/index.mts +21 -0
  78. package/src/services/metadata-extractor.service.mts +91 -0
  79. package/src/services/openapi-generator.service.mts +219 -0
  80. package/src/services/path-builder.service.mts +344 -0
  81. package/src/services/schema-converter.service.mts +96 -0
  82. package/src/tokens/index.mts +24 -0
  83. package/tsconfig.json +24 -0
  84. package/tsconfig.lib.json +8 -0
  85. package/tsconfig.spec.json +12 -0
  86. package/tsdown.config.mts +35 -0
  87. package/vitest.config.mts +11 -0
package/lib/index.mjs ADDED
@@ -0,0 +1,2077 @@
1
+ import { AttributeFactory, Injectable, Logger, MultipartAdapterToken, StreamAdapterToken, extractControllerMetadata, inject } from "@navios/core";
2
+ import { z } from "zod/v4";
3
+ import { createSchema } from "zod-openapi";
4
+
5
+ //#region src/tokens/index.mts
6
+ /**
7
+ * Tokens for OpenAPI metadata attributes
8
+ */
9
+ /** Token for @ApiTag decorator */ const ApiTagToken = Symbol.for("navios:openapi:tag");
10
+ /** Token for @ApiOperation decorator */ const ApiOperationToken = Symbol.for("navios:openapi:operation");
11
+ /** Token for @ApiSummary decorator */ const ApiSummaryToken = Symbol.for("navios:openapi:summary");
12
+ /** Token for @ApiDeprecated decorator */ const ApiDeprecatedToken = Symbol.for("navios:openapi:deprecated");
13
+ /** Token for @ApiSecurity decorator */ const ApiSecurityToken = Symbol.for("navios:openapi:security");
14
+ /** Token for @ApiExclude decorator */ const ApiExcludeToken = Symbol.for("navios:openapi:exclude");
15
+ /** Token for @ApiStream decorator */ const ApiStreamToken = Symbol.for("navios:openapi:stream");
16
+
17
+ //#endregion
18
+ //#region src/decorators/api-tag.decorator.mts
19
+ const ApiTagSchema = z.object({
20
+ name: z.string(),
21
+ description: z.string().optional()
22
+ });
23
+ const BaseApiTag = AttributeFactory.createAttribute(ApiTagToken, ApiTagSchema);
24
+ /**
25
+ * Groups endpoints under a specific tag/folder in the documentation.
26
+ *
27
+ * Can be applied to controllers (affects all endpoints) or individual methods.
28
+ * When applied to both, the method-level tag takes precedence.
29
+ *
30
+ * @param name - The tag name
31
+ * @param description - Optional tag description
32
+ *
33
+ * @example
34
+ * ```typescript
35
+ * // Apply to entire controller
36
+ * @Controller()
37
+ * @ApiTag('Users', 'User management operations')
38
+ * export class UserController {
39
+ * @Endpoint(getUser)
40
+ * async getUser() {}
41
+ * }
42
+ *
43
+ * // Apply to individual endpoint
44
+ * @Controller()
45
+ * export class MixedController {
46
+ * @Endpoint(getUser)
47
+ * @ApiTag('Users')
48
+ * async getUser() {}
49
+ *
50
+ * @Endpoint(getOrder)
51
+ * @ApiTag('Orders')
52
+ * async getOrder() {}
53
+ * }
54
+ * ```
55
+ */ function ApiTag(name, description) {
56
+ return BaseApiTag({
57
+ name,
58
+ description
59
+ });
60
+ }
61
+
62
+ //#endregion
63
+ //#region src/decorators/api-operation.decorator.mts
64
+ const ApiOperationSchema = z.object({
65
+ summary: z.string().optional(),
66
+ description: z.string().optional(),
67
+ operationId: z.string().optional(),
68
+ deprecated: z.boolean().optional(),
69
+ externalDocs: z.object({
70
+ url: z.string(),
71
+ description: z.string().optional()
72
+ }).optional()
73
+ });
74
+ /**
75
+ * Provides detailed operation metadata for an endpoint.
76
+ *
77
+ * Use this decorator when you need to specify multiple operation properties.
78
+ * For simple cases, consider using @ApiSummary instead.
79
+ *
80
+ * @param options - Operation configuration options
81
+ *
82
+ * @example
83
+ * ```typescript
84
+ * @Controller()
85
+ * export class UserController {
86
+ * @Endpoint(getUser)
87
+ * @ApiOperation({
88
+ * summary: 'Get user by ID',
89
+ * description: 'Retrieves a user by their unique identifier. Returns 404 if not found.',
90
+ * operationId: 'getUserById',
91
+ * })
92
+ * async getUser(params: EndpointParams<typeof getUser>) {}
93
+ *
94
+ * @Endpoint(legacyGetUser)
95
+ * @ApiOperation({
96
+ * summary: 'Get user (legacy)',
97
+ * deprecated: true,
98
+ * externalDocs: {
99
+ * url: 'https://docs.example.com/migration',
100
+ * description: 'Migration guide'
101
+ * }
102
+ * })
103
+ * async getLegacyUser() {}
104
+ * }
105
+ * ```
106
+ */ const ApiOperation = AttributeFactory.createAttribute(ApiOperationToken, ApiOperationSchema);
107
+
108
+ //#endregion
109
+ //#region src/decorators/api-summary.decorator.mts
110
+ const ApiSummarySchema = z.string();
111
+ /**
112
+ * Shorthand decorator for adding just a summary to an endpoint.
113
+ *
114
+ * This is equivalent to `@ApiOperation({ summary: '...' })` but more concise.
115
+ *
116
+ * @param summary - Short summary text for the endpoint
117
+ *
118
+ * @example
119
+ * ```typescript
120
+ * @Controller()
121
+ * export class UserController {
122
+ * @Endpoint(getUser)
123
+ * @ApiSummary('Get user by ID')
124
+ * async getUser() {}
125
+ *
126
+ * @Endpoint(createUser)
127
+ * @ApiSummary('Create a new user')
128
+ * async createUser() {}
129
+ * }
130
+ * ```
131
+ */ const ApiSummary = AttributeFactory.createAttribute(ApiSummaryToken, ApiSummarySchema);
132
+
133
+ //#endregion
134
+ //#region src/decorators/api-deprecated.decorator.mts
135
+ const ApiDeprecatedSchema = z.object({ message: z.string().optional() });
136
+ const BaseApiDeprecated = AttributeFactory.createAttribute(ApiDeprecatedToken, ApiDeprecatedSchema);
137
+ /**
138
+ * Marks an endpoint as deprecated.
139
+ *
140
+ * Deprecated endpoints are shown with a visual indicator in documentation
141
+ * and may include a migration message.
142
+ *
143
+ * @param message - Optional deprecation message
144
+ *
145
+ * @example
146
+ * ```typescript
147
+ * @Controller()
148
+ * export class UserController {
149
+ * // Simple deprecation
150
+ * @Endpoint(legacyGetUser)
151
+ * @ApiDeprecated()
152
+ * async getLegacyUser() {}
153
+ *
154
+ * // With migration message
155
+ * @Endpoint(oldCreateUser)
156
+ * @ApiDeprecated('Use POST /v2/users instead')
157
+ * async oldCreateUser() {}
158
+ * }
159
+ * ```
160
+ */ function ApiDeprecated(message) {
161
+ return BaseApiDeprecated({ message });
162
+ }
163
+
164
+ //#endregion
165
+ //#region src/decorators/api-security.decorator.mts
166
+ const ApiSecuritySchema = z.record(z.string(), z.array(z.string()));
167
+ /**
168
+ * Specifies security requirements for an endpoint.
169
+ *
170
+ * The security requirement object maps security scheme names to their scopes.
171
+ * For schemes that don't use scopes (like API keys), use an empty array.
172
+ *
173
+ * @param requirements - Security requirements object
174
+ *
175
+ * @example
176
+ * ```typescript
177
+ * @Controller()
178
+ * export class UserController {
179
+ * // Require bearer token authentication
180
+ * @Endpoint(getUser)
181
+ * @ApiSecurity({ bearerAuth: [] })
182
+ * async getUser() {}
183
+ *
184
+ * // Require multiple authentication methods
185
+ * @Endpoint(adminEndpoint)
186
+ * @ApiSecurity({ bearerAuth: [], apiKey: [] })
187
+ * async adminAction() {}
188
+ *
189
+ * // OAuth2 with specific scopes
190
+ * @Endpoint(writeUser)
191
+ * @ApiSecurity({ oauth2: ['users:write', 'users:read'] })
192
+ * async writeUser() {}
193
+ * }
194
+ * ```
195
+ */ const ApiSecurity = AttributeFactory.createAttribute(ApiSecurityToken, ApiSecuritySchema);
196
+
197
+ //#endregion
198
+ //#region src/decorators/api-exclude.decorator.mts
199
+ /**
200
+ * Excludes an endpoint from OpenAPI documentation.
201
+ *
202
+ * Use this decorator for internal endpoints that should not be visible
203
+ * in the public API documentation.
204
+ *
205
+ * @example
206
+ * ```typescript
207
+ * @Controller()
208
+ * export class HealthController {
209
+ * @Endpoint(healthCheck)
210
+ * @ApiExclude()
211
+ * async healthCheck() {
212
+ * return { status: 'ok' }
213
+ * }
214
+ *
215
+ * @Endpoint(internalMetrics)
216
+ * @ApiExclude()
217
+ * async internalMetrics() {
218
+ * return { ... }
219
+ * }
220
+ * }
221
+ * ```
222
+ */ const ApiExclude = AttributeFactory.createAttribute(ApiExcludeToken);
223
+
224
+ //#endregion
225
+ //#region src/decorators/api-stream.decorator.mts
226
+ const ApiStreamSchema = z.object({
227
+ contentType: z.string(),
228
+ description: z.string().optional()
229
+ });
230
+ /**
231
+ * Specifies content type and description for stream endpoints.
232
+ *
233
+ * Stream endpoints don't have a responseSchema, so this decorator provides
234
+ * the necessary metadata for OpenAPI documentation.
235
+ *
236
+ * @param options - Stream response options
237
+ *
238
+ * @example
239
+ * ```typescript
240
+ * @Controller()
241
+ * export class FileController {
242
+ * // Binary file download
243
+ * @Stream(downloadFile)
244
+ * @ApiStream({
245
+ * contentType: 'application/octet-stream',
246
+ * description: 'Download file as binary stream'
247
+ * })
248
+ * async download(params: StreamParams<typeof downloadFile>, reply: Reply) {
249
+ * // Stream implementation
250
+ * }
251
+ * }
252
+ *
253
+ * @Controller()
254
+ * export class EventController {
255
+ * // Server-Sent Events
256
+ * @Stream(streamEvents)
257
+ * @ApiStream({
258
+ * contentType: 'text/event-stream',
259
+ * description: 'Real-time event stream'
260
+ * })
261
+ * async stream(params: StreamParams<typeof streamEvents>, reply: Reply) {
262
+ * // SSE implementation
263
+ * }
264
+ * }
265
+ * ```
266
+ */ const ApiStream = AttributeFactory.createAttribute(ApiStreamToken, ApiStreamSchema);
267
+
268
+ //#endregion
269
+ //#region src/services/metadata-extractor.service.mts
270
+ function applyDecs2203RFactory$4() {
271
+ function createAddInitializerMethod(initializers, decoratorFinishedRef) {
272
+ return function addInitializer(initializer) {
273
+ assertNotFinished(decoratorFinishedRef, "addInitializer");
274
+ assertCallable(initializer, "An initializer");
275
+ initializers.push(initializer);
276
+ };
277
+ }
278
+ function memberDec(dec, name, desc, initializers, kind, isStatic, isPrivate, metadata, value) {
279
+ var kindStr;
280
+ switch (kind) {
281
+ case 1:
282
+ kindStr = "accessor";
283
+ break;
284
+ case 2:
285
+ kindStr = "method";
286
+ break;
287
+ case 3:
288
+ kindStr = "getter";
289
+ break;
290
+ case 4:
291
+ kindStr = "setter";
292
+ break;
293
+ default: kindStr = "field";
294
+ }
295
+ var ctx = {
296
+ kind: kindStr,
297
+ name: isPrivate ? "#" + name : name,
298
+ static: isStatic,
299
+ private: isPrivate,
300
+ metadata
301
+ };
302
+ var decoratorFinishedRef = { v: false };
303
+ ctx.addInitializer = createAddInitializerMethod(initializers, decoratorFinishedRef);
304
+ var get, set;
305
+ if (kind === 0) if (isPrivate) {
306
+ get = desc.get;
307
+ set = desc.set;
308
+ } else {
309
+ get = function() {
310
+ return this[name];
311
+ };
312
+ set = function(v) {
313
+ this[name] = v;
314
+ };
315
+ }
316
+ else if (kind === 2) get = function() {
317
+ return desc.value;
318
+ };
319
+ else {
320
+ if (kind === 1 || kind === 3) get = function() {
321
+ return desc.get.call(this);
322
+ };
323
+ if (kind === 1 || kind === 4) set = function(v) {
324
+ desc.set.call(this, v);
325
+ };
326
+ }
327
+ ctx.access = get && set ? {
328
+ get,
329
+ set
330
+ } : get ? { get } : { set };
331
+ try {
332
+ return dec(value, ctx);
333
+ } finally {
334
+ decoratorFinishedRef.v = true;
335
+ }
336
+ }
337
+ function assertNotFinished(decoratorFinishedRef, fnName) {
338
+ if (decoratorFinishedRef.v) throw new Error("attempted to call " + fnName + " after decoration was finished");
339
+ }
340
+ function assertCallable(fn, hint) {
341
+ if (typeof fn !== "function") throw new TypeError(hint + " must be a function");
342
+ }
343
+ function assertValidReturnValue(kind, value) {
344
+ var type = typeof value;
345
+ if (kind === 1) {
346
+ if (type !== "object" || value === null) throw new TypeError("accessor decorators must return an object with get, set, or init properties or void 0");
347
+ if (value.get !== void 0) assertCallable(value.get, "accessor.get");
348
+ if (value.set !== void 0) assertCallable(value.set, "accessor.set");
349
+ if (value.init !== void 0) assertCallable(value.init, "accessor.init");
350
+ } else if (type !== "function") {
351
+ var hint;
352
+ if (kind === 0) hint = "field";
353
+ else if (kind === 10) hint = "class";
354
+ else hint = "method";
355
+ throw new TypeError(hint + " decorators must return a function or void 0");
356
+ }
357
+ }
358
+ function applyMemberDec(ret, base, decInfo, name, kind, isStatic, isPrivate, initializers, metadata) {
359
+ var decs = decInfo[0];
360
+ var desc, init, value;
361
+ if (isPrivate) if (kind === 0 || kind === 1) desc = {
362
+ get: decInfo[3],
363
+ set: decInfo[4]
364
+ };
365
+ else if (kind === 3) desc = { get: decInfo[3] };
366
+ else if (kind === 4) desc = { set: decInfo[3] };
367
+ else desc = { value: decInfo[3] };
368
+ else if (kind !== 0) desc = Object.getOwnPropertyDescriptor(base, name);
369
+ if (kind === 1) value = {
370
+ get: desc.get,
371
+ set: desc.set
372
+ };
373
+ else if (kind === 2) value = desc.value;
374
+ else if (kind === 3) value = desc.get;
375
+ else if (kind === 4) value = desc.set;
376
+ var newValue, get, set;
377
+ if (typeof decs === "function") {
378
+ newValue = memberDec(decs, name, desc, initializers, kind, isStatic, isPrivate, metadata, value);
379
+ if (newValue !== void 0) {
380
+ assertValidReturnValue(kind, newValue);
381
+ if (kind === 0) init = newValue;
382
+ else if (kind === 1) {
383
+ init = newValue.init;
384
+ get = newValue.get || value.get;
385
+ set = newValue.set || value.set;
386
+ value = {
387
+ get,
388
+ set
389
+ };
390
+ } else value = newValue;
391
+ }
392
+ } else for (var i = decs.length - 1; i >= 0; i--) {
393
+ var dec = decs[i];
394
+ newValue = memberDec(dec, name, desc, initializers, kind, isStatic, isPrivate, metadata, value);
395
+ if (newValue !== void 0) {
396
+ assertValidReturnValue(kind, newValue);
397
+ var newInit;
398
+ if (kind === 0) newInit = newValue;
399
+ else if (kind === 1) {
400
+ newInit = newValue.init;
401
+ get = newValue.get || value.get;
402
+ set = newValue.set || value.set;
403
+ value = {
404
+ get,
405
+ set
406
+ };
407
+ } else value = newValue;
408
+ if (newInit !== void 0) if (init === void 0) init = newInit;
409
+ else if (typeof init === "function") init = [init, newInit];
410
+ else init.push(newInit);
411
+ }
412
+ }
413
+ if (kind === 0 || kind === 1) {
414
+ if (init === void 0) init = function(instance, init$1) {
415
+ return init$1;
416
+ };
417
+ else if (typeof init !== "function") {
418
+ var ownInitializers = init;
419
+ init = function(instance, init$1) {
420
+ var value$1 = init$1;
421
+ for (var i$1 = 0; i$1 < ownInitializers.length; i$1++) value$1 = ownInitializers[i$1].call(instance, value$1);
422
+ return value$1;
423
+ };
424
+ } else {
425
+ var originalInitializer = init;
426
+ init = function(instance, init$1) {
427
+ return originalInitializer.call(instance, init$1);
428
+ };
429
+ }
430
+ ret.push(init);
431
+ }
432
+ if (kind !== 0) {
433
+ if (kind === 1) {
434
+ desc.get = value.get;
435
+ desc.set = value.set;
436
+ } else if (kind === 2) desc.value = value;
437
+ else if (kind === 3) desc.get = value;
438
+ else if (kind === 4) desc.set = value;
439
+ if (isPrivate) if (kind === 1) {
440
+ ret.push(function(instance, args) {
441
+ return value.get.call(instance, args);
442
+ });
443
+ ret.push(function(instance, args) {
444
+ return value.set.call(instance, args);
445
+ });
446
+ } else if (kind === 2) ret.push(value);
447
+ else ret.push(function(instance, args) {
448
+ return value.call(instance, args);
449
+ });
450
+ else Object.defineProperty(base, name, desc);
451
+ }
452
+ }
453
+ function applyMemberDecs(Class, decInfos, metadata) {
454
+ var ret = [];
455
+ var protoInitializers;
456
+ var staticInitializers;
457
+ var existingProtoNonFields = /* @__PURE__ */ new Map();
458
+ var existingStaticNonFields = /* @__PURE__ */ new Map();
459
+ for (var i = 0; i < decInfos.length; i++) {
460
+ var decInfo = decInfos[i];
461
+ if (!Array.isArray(decInfo)) continue;
462
+ var kind = decInfo[1];
463
+ var name = decInfo[2];
464
+ var isPrivate = decInfo.length > 3;
465
+ var isStatic = kind >= 5;
466
+ var base;
467
+ var initializers;
468
+ if (isStatic) {
469
+ base = Class;
470
+ kind = kind - 5;
471
+ staticInitializers = staticInitializers || [];
472
+ initializers = staticInitializers;
473
+ } else {
474
+ base = Class.prototype;
475
+ protoInitializers = protoInitializers || [];
476
+ initializers = protoInitializers;
477
+ }
478
+ if (kind !== 0 && !isPrivate) {
479
+ var existingNonFields = isStatic ? existingStaticNonFields : existingProtoNonFields;
480
+ var existingKind = existingNonFields.get(name) || 0;
481
+ if (existingKind === true || existingKind === 3 && kind !== 4 || existingKind === 4 && kind !== 3) throw new Error("Attempted to decorate a public method/accessor that has the same name as a previously decorated public method/accessor. This is not currently supported by the decorators plugin. Property name was: " + name);
482
+ else if (!existingKind && kind > 2) existingNonFields.set(name, kind);
483
+ else existingNonFields.set(name, true);
484
+ }
485
+ applyMemberDec(ret, base, decInfo, name, kind, isStatic, isPrivate, initializers, metadata);
486
+ }
487
+ pushInitializers(ret, protoInitializers);
488
+ pushInitializers(ret, staticInitializers);
489
+ return ret;
490
+ }
491
+ function pushInitializers(ret, initializers) {
492
+ if (initializers) ret.push(function(instance) {
493
+ for (var i = 0; i < initializers.length; i++) initializers[i].call(instance);
494
+ return instance;
495
+ });
496
+ }
497
+ function applyClassDecs(targetClass, classDecs, metadata) {
498
+ if (classDecs.length > 0) {
499
+ var initializers = [];
500
+ var newClass = targetClass;
501
+ var name = targetClass.name;
502
+ for (var i = classDecs.length - 1; i >= 0; i--) {
503
+ var decoratorFinishedRef = { v: false };
504
+ try {
505
+ var nextNewClass = classDecs[i](newClass, {
506
+ kind: "class",
507
+ name,
508
+ addInitializer: createAddInitializerMethod(initializers, decoratorFinishedRef),
509
+ metadata
510
+ });
511
+ } finally {
512
+ decoratorFinishedRef.v = true;
513
+ }
514
+ if (nextNewClass !== void 0) {
515
+ assertValidReturnValue(10, nextNewClass);
516
+ newClass = nextNewClass;
517
+ }
518
+ }
519
+ return [defineMetadata(newClass, metadata), function() {
520
+ for (var i$1 = 0; i$1 < initializers.length; i$1++) initializers[i$1].call(newClass);
521
+ }];
522
+ }
523
+ }
524
+ function defineMetadata(Class, metadata) {
525
+ return Object.defineProperty(Class, Symbol.metadata || Symbol.for("Symbol.metadata"), {
526
+ configurable: true,
527
+ enumerable: true,
528
+ value: metadata
529
+ });
530
+ }
531
+ return function applyDecs2203R(targetClass, memberDecs, classDecs, parentClass) {
532
+ if (parentClass !== void 0) var parentMetadata = parentClass[Symbol.metadata || Symbol.for("Symbol.metadata")];
533
+ var metadata = Object.create(parentMetadata === void 0 ? null : parentMetadata);
534
+ var e = applyMemberDecs(targetClass, memberDecs, metadata);
535
+ if (!classDecs.length) defineMetadata(targetClass, metadata);
536
+ return {
537
+ e,
538
+ get c() {
539
+ return applyClassDecs(targetClass, classDecs, metadata);
540
+ }
541
+ };
542
+ };
543
+ }
544
+ function _apply_decs_2203_r$4(targetClass, memberDecs, classDecs, parentClass) {
545
+ return (_apply_decs_2203_r$4 = applyDecs2203RFactory$4())(targetClass, memberDecs, classDecs, parentClass);
546
+ }
547
+ var _dec$4, _initClass$4;
548
+ let _MetadataExtractorService;
549
+ _dec$4 = Injectable();
550
+ var MetadataExtractorService = class {
551
+ static {
552
+ ({c: [_MetadataExtractorService, _initClass$4]} = _apply_decs_2203_r$4(this, [], [_dec$4]));
553
+ }
554
+ /**
555
+ * Extracts and merges OpenAPI metadata from controller and handler.
556
+ *
557
+ * @param controller - Controller metadata
558
+ * @param handler - Handler metadata
559
+ * @returns Merged OpenAPI metadata
560
+ */ extract(controller, handler) {
561
+ const controllerTag = controller.customAttributes.get(ApiTagToken);
562
+ const handlerTag = handler.customAttributes.get(ApiTagToken);
563
+ const operation = handler.customAttributes.get(ApiOperationToken);
564
+ const summary = handler.customAttributes.get(ApiSummaryToken);
565
+ const deprecated = handler.customAttributes.get(ApiDeprecatedToken);
566
+ const security = handler.customAttributes.get(ApiSecurityToken);
567
+ const excluded = handler.customAttributes.get(ApiExcludeToken);
568
+ const stream = handler.customAttributes.get(ApiStreamToken);
569
+ const tags = [];
570
+ if (controllerTag?.name) tags.push(controllerTag.name);
571
+ if (handlerTag?.name && handlerTag.name !== controllerTag?.name) tags.push(handlerTag.name);
572
+ return {
573
+ tags,
574
+ summary: operation?.summary ?? summary,
575
+ description: operation?.description,
576
+ operationId: operation?.operationId,
577
+ deprecated: deprecated !== void 0 || operation?.deprecated === true,
578
+ externalDocs: operation?.externalDocs,
579
+ security: security ? [security] : void 0,
580
+ excluded: excluded === true,
581
+ stream
582
+ };
583
+ }
584
+ static {
585
+ _initClass$4();
586
+ }
587
+ };
588
+
589
+ //#endregion
590
+ //#region src/services/endpoint-scanner.service.mts
591
+ function applyDecs2203RFactory$3() {
592
+ function createAddInitializerMethod(initializers, decoratorFinishedRef) {
593
+ return function addInitializer(initializer) {
594
+ assertNotFinished(decoratorFinishedRef, "addInitializer");
595
+ assertCallable(initializer, "An initializer");
596
+ initializers.push(initializer);
597
+ };
598
+ }
599
+ function memberDec(dec, name, desc, initializers, kind, isStatic, isPrivate, metadata, value) {
600
+ var kindStr;
601
+ switch (kind) {
602
+ case 1:
603
+ kindStr = "accessor";
604
+ break;
605
+ case 2:
606
+ kindStr = "method";
607
+ break;
608
+ case 3:
609
+ kindStr = "getter";
610
+ break;
611
+ case 4:
612
+ kindStr = "setter";
613
+ break;
614
+ default: kindStr = "field";
615
+ }
616
+ var ctx = {
617
+ kind: kindStr,
618
+ name: isPrivate ? "#" + name : name,
619
+ static: isStatic,
620
+ private: isPrivate,
621
+ metadata
622
+ };
623
+ var decoratorFinishedRef = { v: false };
624
+ ctx.addInitializer = createAddInitializerMethod(initializers, decoratorFinishedRef);
625
+ var get, set;
626
+ if (kind === 0) if (isPrivate) {
627
+ get = desc.get;
628
+ set = desc.set;
629
+ } else {
630
+ get = function() {
631
+ return this[name];
632
+ };
633
+ set = function(v) {
634
+ this[name] = v;
635
+ };
636
+ }
637
+ else if (kind === 2) get = function() {
638
+ return desc.value;
639
+ };
640
+ else {
641
+ if (kind === 1 || kind === 3) get = function() {
642
+ return desc.get.call(this);
643
+ };
644
+ if (kind === 1 || kind === 4) set = function(v) {
645
+ desc.set.call(this, v);
646
+ };
647
+ }
648
+ ctx.access = get && set ? {
649
+ get,
650
+ set
651
+ } : get ? { get } : { set };
652
+ try {
653
+ return dec(value, ctx);
654
+ } finally {
655
+ decoratorFinishedRef.v = true;
656
+ }
657
+ }
658
+ function assertNotFinished(decoratorFinishedRef, fnName) {
659
+ if (decoratorFinishedRef.v) throw new Error("attempted to call " + fnName + " after decoration was finished");
660
+ }
661
+ function assertCallable(fn, hint) {
662
+ if (typeof fn !== "function") throw new TypeError(hint + " must be a function");
663
+ }
664
+ function assertValidReturnValue(kind, value) {
665
+ var type = typeof value;
666
+ if (kind === 1) {
667
+ if (type !== "object" || value === null) throw new TypeError("accessor decorators must return an object with get, set, or init properties or void 0");
668
+ if (value.get !== void 0) assertCallable(value.get, "accessor.get");
669
+ if (value.set !== void 0) assertCallable(value.set, "accessor.set");
670
+ if (value.init !== void 0) assertCallable(value.init, "accessor.init");
671
+ } else if (type !== "function") {
672
+ var hint;
673
+ if (kind === 0) hint = "field";
674
+ else if (kind === 10) hint = "class";
675
+ else hint = "method";
676
+ throw new TypeError(hint + " decorators must return a function or void 0");
677
+ }
678
+ }
679
+ function applyMemberDec(ret, base, decInfo, name, kind, isStatic, isPrivate, initializers, metadata) {
680
+ var decs = decInfo[0];
681
+ var desc, init, value;
682
+ if (isPrivate) if (kind === 0 || kind === 1) desc = {
683
+ get: decInfo[3],
684
+ set: decInfo[4]
685
+ };
686
+ else if (kind === 3) desc = { get: decInfo[3] };
687
+ else if (kind === 4) desc = { set: decInfo[3] };
688
+ else desc = { value: decInfo[3] };
689
+ else if (kind !== 0) desc = Object.getOwnPropertyDescriptor(base, name);
690
+ if (kind === 1) value = {
691
+ get: desc.get,
692
+ set: desc.set
693
+ };
694
+ else if (kind === 2) value = desc.value;
695
+ else if (kind === 3) value = desc.get;
696
+ else if (kind === 4) value = desc.set;
697
+ var newValue, get, set;
698
+ if (typeof decs === "function") {
699
+ newValue = memberDec(decs, name, desc, initializers, kind, isStatic, isPrivate, metadata, value);
700
+ if (newValue !== void 0) {
701
+ assertValidReturnValue(kind, newValue);
702
+ if (kind === 0) init = newValue;
703
+ else if (kind === 1) {
704
+ init = newValue.init;
705
+ get = newValue.get || value.get;
706
+ set = newValue.set || value.set;
707
+ value = {
708
+ get,
709
+ set
710
+ };
711
+ } else value = newValue;
712
+ }
713
+ } else for (var i = decs.length - 1; i >= 0; i--) {
714
+ var dec = decs[i];
715
+ newValue = memberDec(dec, name, desc, initializers, kind, isStatic, isPrivate, metadata, value);
716
+ if (newValue !== void 0) {
717
+ assertValidReturnValue(kind, newValue);
718
+ var newInit;
719
+ if (kind === 0) newInit = newValue;
720
+ else if (kind === 1) {
721
+ newInit = newValue.init;
722
+ get = newValue.get || value.get;
723
+ set = newValue.set || value.set;
724
+ value = {
725
+ get,
726
+ set
727
+ };
728
+ } else value = newValue;
729
+ if (newInit !== void 0) if (init === void 0) init = newInit;
730
+ else if (typeof init === "function") init = [init, newInit];
731
+ else init.push(newInit);
732
+ }
733
+ }
734
+ if (kind === 0 || kind === 1) {
735
+ if (init === void 0) init = function(instance, init$1) {
736
+ return init$1;
737
+ };
738
+ else if (typeof init !== "function") {
739
+ var ownInitializers = init;
740
+ init = function(instance, init$1) {
741
+ var value$1 = init$1;
742
+ for (var i$1 = 0; i$1 < ownInitializers.length; i$1++) value$1 = ownInitializers[i$1].call(instance, value$1);
743
+ return value$1;
744
+ };
745
+ } else {
746
+ var originalInitializer = init;
747
+ init = function(instance, init$1) {
748
+ return originalInitializer.call(instance, init$1);
749
+ };
750
+ }
751
+ ret.push(init);
752
+ }
753
+ if (kind !== 0) {
754
+ if (kind === 1) {
755
+ desc.get = value.get;
756
+ desc.set = value.set;
757
+ } else if (kind === 2) desc.value = value;
758
+ else if (kind === 3) desc.get = value;
759
+ else if (kind === 4) desc.set = value;
760
+ if (isPrivate) if (kind === 1) {
761
+ ret.push(function(instance, args) {
762
+ return value.get.call(instance, args);
763
+ });
764
+ ret.push(function(instance, args) {
765
+ return value.set.call(instance, args);
766
+ });
767
+ } else if (kind === 2) ret.push(value);
768
+ else ret.push(function(instance, args) {
769
+ return value.call(instance, args);
770
+ });
771
+ else Object.defineProperty(base, name, desc);
772
+ }
773
+ }
774
+ function applyMemberDecs(Class, decInfos, metadata) {
775
+ var ret = [];
776
+ var protoInitializers;
777
+ var staticInitializers;
778
+ var existingProtoNonFields = /* @__PURE__ */ new Map();
779
+ var existingStaticNonFields = /* @__PURE__ */ new Map();
780
+ for (var i = 0; i < decInfos.length; i++) {
781
+ var decInfo = decInfos[i];
782
+ if (!Array.isArray(decInfo)) continue;
783
+ var kind = decInfo[1];
784
+ var name = decInfo[2];
785
+ var isPrivate = decInfo.length > 3;
786
+ var isStatic = kind >= 5;
787
+ var base;
788
+ var initializers;
789
+ if (isStatic) {
790
+ base = Class;
791
+ kind = kind - 5;
792
+ staticInitializers = staticInitializers || [];
793
+ initializers = staticInitializers;
794
+ } else {
795
+ base = Class.prototype;
796
+ protoInitializers = protoInitializers || [];
797
+ initializers = protoInitializers;
798
+ }
799
+ if (kind !== 0 && !isPrivate) {
800
+ var existingNonFields = isStatic ? existingStaticNonFields : existingProtoNonFields;
801
+ var existingKind = existingNonFields.get(name) || 0;
802
+ if (existingKind === true || existingKind === 3 && kind !== 4 || existingKind === 4 && kind !== 3) throw new Error("Attempted to decorate a public method/accessor that has the same name as a previously decorated public method/accessor. This is not currently supported by the decorators plugin. Property name was: " + name);
803
+ else if (!existingKind && kind > 2) existingNonFields.set(name, kind);
804
+ else existingNonFields.set(name, true);
805
+ }
806
+ applyMemberDec(ret, base, decInfo, name, kind, isStatic, isPrivate, initializers, metadata);
807
+ }
808
+ pushInitializers(ret, protoInitializers);
809
+ pushInitializers(ret, staticInitializers);
810
+ return ret;
811
+ }
812
+ function pushInitializers(ret, initializers) {
813
+ if (initializers) ret.push(function(instance) {
814
+ for (var i = 0; i < initializers.length; i++) initializers[i].call(instance);
815
+ return instance;
816
+ });
817
+ }
818
+ function applyClassDecs(targetClass, classDecs, metadata) {
819
+ if (classDecs.length > 0) {
820
+ var initializers = [];
821
+ var newClass = targetClass;
822
+ var name = targetClass.name;
823
+ for (var i = classDecs.length - 1; i >= 0; i--) {
824
+ var decoratorFinishedRef = { v: false };
825
+ try {
826
+ var nextNewClass = classDecs[i](newClass, {
827
+ kind: "class",
828
+ name,
829
+ addInitializer: createAddInitializerMethod(initializers, decoratorFinishedRef),
830
+ metadata
831
+ });
832
+ } finally {
833
+ decoratorFinishedRef.v = true;
834
+ }
835
+ if (nextNewClass !== void 0) {
836
+ assertValidReturnValue(10, nextNewClass);
837
+ newClass = nextNewClass;
838
+ }
839
+ }
840
+ return [defineMetadata(newClass, metadata), function() {
841
+ for (var i$1 = 0; i$1 < initializers.length; i$1++) initializers[i$1].call(newClass);
842
+ }];
843
+ }
844
+ }
845
+ function defineMetadata(Class, metadata) {
846
+ return Object.defineProperty(Class, Symbol.metadata || Symbol.for("Symbol.metadata"), {
847
+ configurable: true,
848
+ enumerable: true,
849
+ value: metadata
850
+ });
851
+ }
852
+ return function applyDecs2203R(targetClass, memberDecs, classDecs, parentClass) {
853
+ if (parentClass !== void 0) var parentMetadata = parentClass[Symbol.metadata || Symbol.for("Symbol.metadata")];
854
+ var metadata = Object.create(parentMetadata === void 0 ? null : parentMetadata);
855
+ var e = applyMemberDecs(targetClass, memberDecs, metadata);
856
+ if (!classDecs.length) defineMetadata(targetClass, metadata);
857
+ return {
858
+ e,
859
+ get c() {
860
+ return applyClassDecs(targetClass, classDecs, metadata);
861
+ }
862
+ };
863
+ };
864
+ }
865
+ function _apply_decs_2203_r$3(targetClass, memberDecs, classDecs, parentClass) {
866
+ return (_apply_decs_2203_r$3 = applyDecs2203RFactory$3())(targetClass, memberDecs, classDecs, parentClass);
867
+ }
868
+ var _dec$3, _initClass$3;
869
+ let _EndpointScannerService;
870
+ _dec$3 = Injectable();
871
+ var EndpointScannerService = class {
872
+ static {
873
+ ({c: [_EndpointScannerService, _initClass$3]} = _apply_decs_2203_r$3(this, [], [_dec$3]));
874
+ }
875
+ logger = inject(Logger, { context: _EndpointScannerService.name });
876
+ metadataExtractor = inject(_MetadataExtractorService);
877
+ /**
878
+ * Scans all loaded modules and discovers endpoints.
879
+ *
880
+ * @param modules - Map of loaded modules from NaviosApplication
881
+ * @returns Array of discovered endpoints
882
+ */ scan(modules) {
883
+ const endpoints = [];
884
+ for (const [moduleName, moduleMetadata] of modules) {
885
+ if (!moduleMetadata.controllers || moduleMetadata.controllers.size === 0) continue;
886
+ this.logger.debug(`Scanning module: ${moduleName}`);
887
+ for (const controllerClass of moduleMetadata.controllers) {
888
+ const controllerMeta = extractControllerMetadata(controllerClass);
889
+ const controllerEndpoints = this.scanController(moduleMetadata, controllerClass, controllerMeta);
890
+ endpoints.push(...controllerEndpoints);
891
+ }
892
+ }
893
+ this.logger.debug(`Discovered ${endpoints.length} endpoints`);
894
+ return endpoints;
895
+ }
896
+ /**
897
+ * Scans a controller and returns its endpoints
898
+ */ scanController(module, controllerClass, controllerMeta) {
899
+ const endpoints = [];
900
+ for (const handler of controllerMeta.endpoints) {
901
+ if (!handler.config) continue;
902
+ const openApiMetadata = this.metadataExtractor.extract(controllerMeta, handler);
903
+ if (openApiMetadata.excluded) {
904
+ this.logger.debug(`Skipping excluded endpoint: ${handler.classMethod}`);
905
+ continue;
906
+ }
907
+ endpoints.push({
908
+ module,
909
+ controllerClass,
910
+ controller: controllerMeta,
911
+ handler,
912
+ config: handler.config,
913
+ openApiMetadata
914
+ });
915
+ }
916
+ return endpoints;
917
+ }
918
+ static {
919
+ _initClass$3();
920
+ }
921
+ };
922
+
923
+ //#endregion
924
+ //#region src/services/schema-converter.service.mts
925
+ function applyDecs2203RFactory$2() {
926
+ function createAddInitializerMethod(initializers, decoratorFinishedRef) {
927
+ return function addInitializer(initializer) {
928
+ assertNotFinished(decoratorFinishedRef, "addInitializer");
929
+ assertCallable(initializer, "An initializer");
930
+ initializers.push(initializer);
931
+ };
932
+ }
933
+ function memberDec(dec, name, desc, initializers, kind, isStatic, isPrivate, metadata, value) {
934
+ var kindStr;
935
+ switch (kind) {
936
+ case 1:
937
+ kindStr = "accessor";
938
+ break;
939
+ case 2:
940
+ kindStr = "method";
941
+ break;
942
+ case 3:
943
+ kindStr = "getter";
944
+ break;
945
+ case 4:
946
+ kindStr = "setter";
947
+ break;
948
+ default: kindStr = "field";
949
+ }
950
+ var ctx = {
951
+ kind: kindStr,
952
+ name: isPrivate ? "#" + name : name,
953
+ static: isStatic,
954
+ private: isPrivate,
955
+ metadata
956
+ };
957
+ var decoratorFinishedRef = { v: false };
958
+ ctx.addInitializer = createAddInitializerMethod(initializers, decoratorFinishedRef);
959
+ var get, set;
960
+ if (kind === 0) if (isPrivate) {
961
+ get = desc.get;
962
+ set = desc.set;
963
+ } else {
964
+ get = function() {
965
+ return this[name];
966
+ };
967
+ set = function(v) {
968
+ this[name] = v;
969
+ };
970
+ }
971
+ else if (kind === 2) get = function() {
972
+ return desc.value;
973
+ };
974
+ else {
975
+ if (kind === 1 || kind === 3) get = function() {
976
+ return desc.get.call(this);
977
+ };
978
+ if (kind === 1 || kind === 4) set = function(v) {
979
+ desc.set.call(this, v);
980
+ };
981
+ }
982
+ ctx.access = get && set ? {
983
+ get,
984
+ set
985
+ } : get ? { get } : { set };
986
+ try {
987
+ return dec(value, ctx);
988
+ } finally {
989
+ decoratorFinishedRef.v = true;
990
+ }
991
+ }
992
+ function assertNotFinished(decoratorFinishedRef, fnName) {
993
+ if (decoratorFinishedRef.v) throw new Error("attempted to call " + fnName + " after decoration was finished");
994
+ }
995
+ function assertCallable(fn, hint) {
996
+ if (typeof fn !== "function") throw new TypeError(hint + " must be a function");
997
+ }
998
+ function assertValidReturnValue(kind, value) {
999
+ var type = typeof value;
1000
+ if (kind === 1) {
1001
+ if (type !== "object" || value === null) throw new TypeError("accessor decorators must return an object with get, set, or init properties or void 0");
1002
+ if (value.get !== void 0) assertCallable(value.get, "accessor.get");
1003
+ if (value.set !== void 0) assertCallable(value.set, "accessor.set");
1004
+ if (value.init !== void 0) assertCallable(value.init, "accessor.init");
1005
+ } else if (type !== "function") {
1006
+ var hint;
1007
+ if (kind === 0) hint = "field";
1008
+ else if (kind === 10) hint = "class";
1009
+ else hint = "method";
1010
+ throw new TypeError(hint + " decorators must return a function or void 0");
1011
+ }
1012
+ }
1013
+ function applyMemberDec(ret, base, decInfo, name, kind, isStatic, isPrivate, initializers, metadata) {
1014
+ var decs = decInfo[0];
1015
+ var desc, init, value;
1016
+ if (isPrivate) if (kind === 0 || kind === 1) desc = {
1017
+ get: decInfo[3],
1018
+ set: decInfo[4]
1019
+ };
1020
+ else if (kind === 3) desc = { get: decInfo[3] };
1021
+ else if (kind === 4) desc = { set: decInfo[3] };
1022
+ else desc = { value: decInfo[3] };
1023
+ else if (kind !== 0) desc = Object.getOwnPropertyDescriptor(base, name);
1024
+ if (kind === 1) value = {
1025
+ get: desc.get,
1026
+ set: desc.set
1027
+ };
1028
+ else if (kind === 2) value = desc.value;
1029
+ else if (kind === 3) value = desc.get;
1030
+ else if (kind === 4) value = desc.set;
1031
+ var newValue, get, set;
1032
+ if (typeof decs === "function") {
1033
+ newValue = memberDec(decs, name, desc, initializers, kind, isStatic, isPrivate, metadata, value);
1034
+ if (newValue !== void 0) {
1035
+ assertValidReturnValue(kind, newValue);
1036
+ if (kind === 0) init = newValue;
1037
+ else if (kind === 1) {
1038
+ init = newValue.init;
1039
+ get = newValue.get || value.get;
1040
+ set = newValue.set || value.set;
1041
+ value = {
1042
+ get,
1043
+ set
1044
+ };
1045
+ } else value = newValue;
1046
+ }
1047
+ } else for (var i = decs.length - 1; i >= 0; i--) {
1048
+ var dec = decs[i];
1049
+ newValue = memberDec(dec, name, desc, initializers, kind, isStatic, isPrivate, metadata, value);
1050
+ if (newValue !== void 0) {
1051
+ assertValidReturnValue(kind, newValue);
1052
+ var newInit;
1053
+ if (kind === 0) newInit = newValue;
1054
+ else if (kind === 1) {
1055
+ newInit = newValue.init;
1056
+ get = newValue.get || value.get;
1057
+ set = newValue.set || value.set;
1058
+ value = {
1059
+ get,
1060
+ set
1061
+ };
1062
+ } else value = newValue;
1063
+ if (newInit !== void 0) if (init === void 0) init = newInit;
1064
+ else if (typeof init === "function") init = [init, newInit];
1065
+ else init.push(newInit);
1066
+ }
1067
+ }
1068
+ if (kind === 0 || kind === 1) {
1069
+ if (init === void 0) init = function(instance, init$1) {
1070
+ return init$1;
1071
+ };
1072
+ else if (typeof init !== "function") {
1073
+ var ownInitializers = init;
1074
+ init = function(instance, init$1) {
1075
+ var value$1 = init$1;
1076
+ for (var i$1 = 0; i$1 < ownInitializers.length; i$1++) value$1 = ownInitializers[i$1].call(instance, value$1);
1077
+ return value$1;
1078
+ };
1079
+ } else {
1080
+ var originalInitializer = init;
1081
+ init = function(instance, init$1) {
1082
+ return originalInitializer.call(instance, init$1);
1083
+ };
1084
+ }
1085
+ ret.push(init);
1086
+ }
1087
+ if (kind !== 0) {
1088
+ if (kind === 1) {
1089
+ desc.get = value.get;
1090
+ desc.set = value.set;
1091
+ } else if (kind === 2) desc.value = value;
1092
+ else if (kind === 3) desc.get = value;
1093
+ else if (kind === 4) desc.set = value;
1094
+ if (isPrivate) if (kind === 1) {
1095
+ ret.push(function(instance, args) {
1096
+ return value.get.call(instance, args);
1097
+ });
1098
+ ret.push(function(instance, args) {
1099
+ return value.set.call(instance, args);
1100
+ });
1101
+ } else if (kind === 2) ret.push(value);
1102
+ else ret.push(function(instance, args) {
1103
+ return value.call(instance, args);
1104
+ });
1105
+ else Object.defineProperty(base, name, desc);
1106
+ }
1107
+ }
1108
+ function applyMemberDecs(Class, decInfos, metadata) {
1109
+ var ret = [];
1110
+ var protoInitializers;
1111
+ var staticInitializers;
1112
+ var existingProtoNonFields = /* @__PURE__ */ new Map();
1113
+ var existingStaticNonFields = /* @__PURE__ */ new Map();
1114
+ for (var i = 0; i < decInfos.length; i++) {
1115
+ var decInfo = decInfos[i];
1116
+ if (!Array.isArray(decInfo)) continue;
1117
+ var kind = decInfo[1];
1118
+ var name = decInfo[2];
1119
+ var isPrivate = decInfo.length > 3;
1120
+ var isStatic = kind >= 5;
1121
+ var base;
1122
+ var initializers;
1123
+ if (isStatic) {
1124
+ base = Class;
1125
+ kind = kind - 5;
1126
+ staticInitializers = staticInitializers || [];
1127
+ initializers = staticInitializers;
1128
+ } else {
1129
+ base = Class.prototype;
1130
+ protoInitializers = protoInitializers || [];
1131
+ initializers = protoInitializers;
1132
+ }
1133
+ if (kind !== 0 && !isPrivate) {
1134
+ var existingNonFields = isStatic ? existingStaticNonFields : existingProtoNonFields;
1135
+ var existingKind = existingNonFields.get(name) || 0;
1136
+ if (existingKind === true || existingKind === 3 && kind !== 4 || existingKind === 4 && kind !== 3) throw new Error("Attempted to decorate a public method/accessor that has the same name as a previously decorated public method/accessor. This is not currently supported by the decorators plugin. Property name was: " + name);
1137
+ else if (!existingKind && kind > 2) existingNonFields.set(name, kind);
1138
+ else existingNonFields.set(name, true);
1139
+ }
1140
+ applyMemberDec(ret, base, decInfo, name, kind, isStatic, isPrivate, initializers, metadata);
1141
+ }
1142
+ pushInitializers(ret, protoInitializers);
1143
+ pushInitializers(ret, staticInitializers);
1144
+ return ret;
1145
+ }
1146
+ function pushInitializers(ret, initializers) {
1147
+ if (initializers) ret.push(function(instance) {
1148
+ for (var i = 0; i < initializers.length; i++) initializers[i].call(instance);
1149
+ return instance;
1150
+ });
1151
+ }
1152
+ function applyClassDecs(targetClass, classDecs, metadata) {
1153
+ if (classDecs.length > 0) {
1154
+ var initializers = [];
1155
+ var newClass = targetClass;
1156
+ var name = targetClass.name;
1157
+ for (var i = classDecs.length - 1; i >= 0; i--) {
1158
+ var decoratorFinishedRef = { v: false };
1159
+ try {
1160
+ var nextNewClass = classDecs[i](newClass, {
1161
+ kind: "class",
1162
+ name,
1163
+ addInitializer: createAddInitializerMethod(initializers, decoratorFinishedRef),
1164
+ metadata
1165
+ });
1166
+ } finally {
1167
+ decoratorFinishedRef.v = true;
1168
+ }
1169
+ if (nextNewClass !== void 0) {
1170
+ assertValidReturnValue(10, nextNewClass);
1171
+ newClass = nextNewClass;
1172
+ }
1173
+ }
1174
+ return [defineMetadata(newClass, metadata), function() {
1175
+ for (var i$1 = 0; i$1 < initializers.length; i$1++) initializers[i$1].call(newClass);
1176
+ }];
1177
+ }
1178
+ }
1179
+ function defineMetadata(Class, metadata) {
1180
+ return Object.defineProperty(Class, Symbol.metadata || Symbol.for("Symbol.metadata"), {
1181
+ configurable: true,
1182
+ enumerable: true,
1183
+ value: metadata
1184
+ });
1185
+ }
1186
+ return function applyDecs2203R(targetClass, memberDecs, classDecs, parentClass) {
1187
+ if (parentClass !== void 0) var parentMetadata = parentClass[Symbol.metadata || Symbol.for("Symbol.metadata")];
1188
+ var metadata = Object.create(parentMetadata === void 0 ? null : parentMetadata);
1189
+ var e = applyMemberDecs(targetClass, memberDecs, metadata);
1190
+ if (!classDecs.length) defineMetadata(targetClass, metadata);
1191
+ return {
1192
+ e,
1193
+ get c() {
1194
+ return applyClassDecs(targetClass, classDecs, metadata);
1195
+ }
1196
+ };
1197
+ };
1198
+ }
1199
+ function _apply_decs_2203_r$2(targetClass, memberDecs, classDecs, parentClass) {
1200
+ return (_apply_decs_2203_r$2 = applyDecs2203RFactory$2())(targetClass, memberDecs, classDecs, parentClass);
1201
+ }
1202
+ var _dec$2, _initClass$2;
1203
+ let _SchemaConverterService;
1204
+ _dec$2 = Injectable();
1205
+ var SchemaConverterService = class {
1206
+ static {
1207
+ ({c: [_SchemaConverterService, _initClass$2]} = _apply_decs_2203_r$2(this, [], [_dec$2]));
1208
+ }
1209
+ /**
1210
+ * Converts a Zod schema to an OpenAPI schema object.
1211
+ *
1212
+ * @param schema - Zod schema to convert
1213
+ * @returns OpenAPI schema object with any component schemas
1214
+ *
1215
+ * @example
1216
+ * ```typescript
1217
+ * const userSchema = z.object({
1218
+ * id: z.string().meta({ openapi: { example: 'usr_123' } }),
1219
+ * name: z.string(),
1220
+ * })
1221
+ *
1222
+ * const result = schemaConverter.convert(userSchema)
1223
+ * // { schema: { type: 'object', properties: { ... } }, components: {} }
1224
+ * ```
1225
+ */ convert(schema) {
1226
+ return createSchema(schema);
1227
+ }
1228
+ /**
1229
+ * Checks if a schema property represents a File type.
1230
+ *
1231
+ * Used for multipart form handling to convert File types to binary format.
1232
+ *
1233
+ * @param schema - Schema object to check
1234
+ * @returns true if the schema represents a file
1235
+ */ isFileSchema(schema) {
1236
+ return schema.type === "string" && schema.format === "binary";
1237
+ }
1238
+ /**
1239
+ * Transforms schema properties to handle File/Blob types for multipart.
1240
+ *
1241
+ * Converts File types to OpenAPI binary format and handles arrays of files.
1242
+ *
1243
+ * @param properties - Schema properties object
1244
+ * @returns Transformed properties with file types as binary
1245
+ */ transformFileProperties(properties) {
1246
+ const result = {};
1247
+ for (const [key, prop] of Object.entries(properties)) if (this.isFileSchema(prop)) result[key] = {
1248
+ type: "string",
1249
+ format: "binary",
1250
+ description: prop.description
1251
+ };
1252
+ else if (prop.type === "array" && prop.items && this.isFileSchema(prop.items)) result[key] = {
1253
+ type: "array",
1254
+ items: {
1255
+ type: "string",
1256
+ format: "binary"
1257
+ },
1258
+ description: prop.description
1259
+ };
1260
+ else result[key] = prop;
1261
+ return result;
1262
+ }
1263
+ static {
1264
+ _initClass$2();
1265
+ }
1266
+ };
1267
+
1268
+ //#endregion
1269
+ //#region src/services/path-builder.service.mts
1270
+ function applyDecs2203RFactory$1() {
1271
+ function createAddInitializerMethod(initializers, decoratorFinishedRef) {
1272
+ return function addInitializer(initializer) {
1273
+ assertNotFinished(decoratorFinishedRef, "addInitializer");
1274
+ assertCallable(initializer, "An initializer");
1275
+ initializers.push(initializer);
1276
+ };
1277
+ }
1278
+ function memberDec(dec, name, desc, initializers, kind, isStatic, isPrivate, metadata, value) {
1279
+ var kindStr;
1280
+ switch (kind) {
1281
+ case 1:
1282
+ kindStr = "accessor";
1283
+ break;
1284
+ case 2:
1285
+ kindStr = "method";
1286
+ break;
1287
+ case 3:
1288
+ kindStr = "getter";
1289
+ break;
1290
+ case 4:
1291
+ kindStr = "setter";
1292
+ break;
1293
+ default: kindStr = "field";
1294
+ }
1295
+ var ctx = {
1296
+ kind: kindStr,
1297
+ name: isPrivate ? "#" + name : name,
1298
+ static: isStatic,
1299
+ private: isPrivate,
1300
+ metadata
1301
+ };
1302
+ var decoratorFinishedRef = { v: false };
1303
+ ctx.addInitializer = createAddInitializerMethod(initializers, decoratorFinishedRef);
1304
+ var get, set;
1305
+ if (kind === 0) if (isPrivate) {
1306
+ get = desc.get;
1307
+ set = desc.set;
1308
+ } else {
1309
+ get = function() {
1310
+ return this[name];
1311
+ };
1312
+ set = function(v) {
1313
+ this[name] = v;
1314
+ };
1315
+ }
1316
+ else if (kind === 2) get = function() {
1317
+ return desc.value;
1318
+ };
1319
+ else {
1320
+ if (kind === 1 || kind === 3) get = function() {
1321
+ return desc.get.call(this);
1322
+ };
1323
+ if (kind === 1 || kind === 4) set = function(v) {
1324
+ desc.set.call(this, v);
1325
+ };
1326
+ }
1327
+ ctx.access = get && set ? {
1328
+ get,
1329
+ set
1330
+ } : get ? { get } : { set };
1331
+ try {
1332
+ return dec(value, ctx);
1333
+ } finally {
1334
+ decoratorFinishedRef.v = true;
1335
+ }
1336
+ }
1337
+ function assertNotFinished(decoratorFinishedRef, fnName) {
1338
+ if (decoratorFinishedRef.v) throw new Error("attempted to call " + fnName + " after decoration was finished");
1339
+ }
1340
+ function assertCallable(fn, hint) {
1341
+ if (typeof fn !== "function") throw new TypeError(hint + " must be a function");
1342
+ }
1343
+ function assertValidReturnValue(kind, value) {
1344
+ var type = typeof value;
1345
+ if (kind === 1) {
1346
+ if (type !== "object" || value === null) throw new TypeError("accessor decorators must return an object with get, set, or init properties or void 0");
1347
+ if (value.get !== void 0) assertCallable(value.get, "accessor.get");
1348
+ if (value.set !== void 0) assertCallable(value.set, "accessor.set");
1349
+ if (value.init !== void 0) assertCallable(value.init, "accessor.init");
1350
+ } else if (type !== "function") {
1351
+ var hint;
1352
+ if (kind === 0) hint = "field";
1353
+ else if (kind === 10) hint = "class";
1354
+ else hint = "method";
1355
+ throw new TypeError(hint + " decorators must return a function or void 0");
1356
+ }
1357
+ }
1358
+ function applyMemberDec(ret, base, decInfo, name, kind, isStatic, isPrivate, initializers, metadata) {
1359
+ var decs = decInfo[0];
1360
+ var desc, init, value;
1361
+ if (isPrivate) if (kind === 0 || kind === 1) desc = {
1362
+ get: decInfo[3],
1363
+ set: decInfo[4]
1364
+ };
1365
+ else if (kind === 3) desc = { get: decInfo[3] };
1366
+ else if (kind === 4) desc = { set: decInfo[3] };
1367
+ else desc = { value: decInfo[3] };
1368
+ else if (kind !== 0) desc = Object.getOwnPropertyDescriptor(base, name);
1369
+ if (kind === 1) value = {
1370
+ get: desc.get,
1371
+ set: desc.set
1372
+ };
1373
+ else if (kind === 2) value = desc.value;
1374
+ else if (kind === 3) value = desc.get;
1375
+ else if (kind === 4) value = desc.set;
1376
+ var newValue, get, set;
1377
+ if (typeof decs === "function") {
1378
+ newValue = memberDec(decs, name, desc, initializers, kind, isStatic, isPrivate, metadata, value);
1379
+ if (newValue !== void 0) {
1380
+ assertValidReturnValue(kind, newValue);
1381
+ if (kind === 0) init = newValue;
1382
+ else if (kind === 1) {
1383
+ init = newValue.init;
1384
+ get = newValue.get || value.get;
1385
+ set = newValue.set || value.set;
1386
+ value = {
1387
+ get,
1388
+ set
1389
+ };
1390
+ } else value = newValue;
1391
+ }
1392
+ } else for (var i = decs.length - 1; i >= 0; i--) {
1393
+ var dec = decs[i];
1394
+ newValue = memberDec(dec, name, desc, initializers, kind, isStatic, isPrivate, metadata, value);
1395
+ if (newValue !== void 0) {
1396
+ assertValidReturnValue(kind, newValue);
1397
+ var newInit;
1398
+ if (kind === 0) newInit = newValue;
1399
+ else if (kind === 1) {
1400
+ newInit = newValue.init;
1401
+ get = newValue.get || value.get;
1402
+ set = newValue.set || value.set;
1403
+ value = {
1404
+ get,
1405
+ set
1406
+ };
1407
+ } else value = newValue;
1408
+ if (newInit !== void 0) if (init === void 0) init = newInit;
1409
+ else if (typeof init === "function") init = [init, newInit];
1410
+ else init.push(newInit);
1411
+ }
1412
+ }
1413
+ if (kind === 0 || kind === 1) {
1414
+ if (init === void 0) init = function(instance, init$1) {
1415
+ return init$1;
1416
+ };
1417
+ else if (typeof init !== "function") {
1418
+ var ownInitializers = init;
1419
+ init = function(instance, init$1) {
1420
+ var value$1 = init$1;
1421
+ for (var i$1 = 0; i$1 < ownInitializers.length; i$1++) value$1 = ownInitializers[i$1].call(instance, value$1);
1422
+ return value$1;
1423
+ };
1424
+ } else {
1425
+ var originalInitializer = init;
1426
+ init = function(instance, init$1) {
1427
+ return originalInitializer.call(instance, init$1);
1428
+ };
1429
+ }
1430
+ ret.push(init);
1431
+ }
1432
+ if (kind !== 0) {
1433
+ if (kind === 1) {
1434
+ desc.get = value.get;
1435
+ desc.set = value.set;
1436
+ } else if (kind === 2) desc.value = value;
1437
+ else if (kind === 3) desc.get = value;
1438
+ else if (kind === 4) desc.set = value;
1439
+ if (isPrivate) if (kind === 1) {
1440
+ ret.push(function(instance, args) {
1441
+ return value.get.call(instance, args);
1442
+ });
1443
+ ret.push(function(instance, args) {
1444
+ return value.set.call(instance, args);
1445
+ });
1446
+ } else if (kind === 2) ret.push(value);
1447
+ else ret.push(function(instance, args) {
1448
+ return value.call(instance, args);
1449
+ });
1450
+ else Object.defineProperty(base, name, desc);
1451
+ }
1452
+ }
1453
+ function applyMemberDecs(Class, decInfos, metadata) {
1454
+ var ret = [];
1455
+ var protoInitializers;
1456
+ var staticInitializers;
1457
+ var existingProtoNonFields = /* @__PURE__ */ new Map();
1458
+ var existingStaticNonFields = /* @__PURE__ */ new Map();
1459
+ for (var i = 0; i < decInfos.length; i++) {
1460
+ var decInfo = decInfos[i];
1461
+ if (!Array.isArray(decInfo)) continue;
1462
+ var kind = decInfo[1];
1463
+ var name = decInfo[2];
1464
+ var isPrivate = decInfo.length > 3;
1465
+ var isStatic = kind >= 5;
1466
+ var base;
1467
+ var initializers;
1468
+ if (isStatic) {
1469
+ base = Class;
1470
+ kind = kind - 5;
1471
+ staticInitializers = staticInitializers || [];
1472
+ initializers = staticInitializers;
1473
+ } else {
1474
+ base = Class.prototype;
1475
+ protoInitializers = protoInitializers || [];
1476
+ initializers = protoInitializers;
1477
+ }
1478
+ if (kind !== 0 && !isPrivate) {
1479
+ var existingNonFields = isStatic ? existingStaticNonFields : existingProtoNonFields;
1480
+ var existingKind = existingNonFields.get(name) || 0;
1481
+ if (existingKind === true || existingKind === 3 && kind !== 4 || existingKind === 4 && kind !== 3) throw new Error("Attempted to decorate a public method/accessor that has the same name as a previously decorated public method/accessor. This is not currently supported by the decorators plugin. Property name was: " + name);
1482
+ else if (!existingKind && kind > 2) existingNonFields.set(name, kind);
1483
+ else existingNonFields.set(name, true);
1484
+ }
1485
+ applyMemberDec(ret, base, decInfo, name, kind, isStatic, isPrivate, initializers, metadata);
1486
+ }
1487
+ pushInitializers(ret, protoInitializers);
1488
+ pushInitializers(ret, staticInitializers);
1489
+ return ret;
1490
+ }
1491
+ function pushInitializers(ret, initializers) {
1492
+ if (initializers) ret.push(function(instance) {
1493
+ for (var i = 0; i < initializers.length; i++) initializers[i].call(instance);
1494
+ return instance;
1495
+ });
1496
+ }
1497
+ function applyClassDecs(targetClass, classDecs, metadata) {
1498
+ if (classDecs.length > 0) {
1499
+ var initializers = [];
1500
+ var newClass = targetClass;
1501
+ var name = targetClass.name;
1502
+ for (var i = classDecs.length - 1; i >= 0; i--) {
1503
+ var decoratorFinishedRef = { v: false };
1504
+ try {
1505
+ var nextNewClass = classDecs[i](newClass, {
1506
+ kind: "class",
1507
+ name,
1508
+ addInitializer: createAddInitializerMethod(initializers, decoratorFinishedRef),
1509
+ metadata
1510
+ });
1511
+ } finally {
1512
+ decoratorFinishedRef.v = true;
1513
+ }
1514
+ if (nextNewClass !== void 0) {
1515
+ assertValidReturnValue(10, nextNewClass);
1516
+ newClass = nextNewClass;
1517
+ }
1518
+ }
1519
+ return [defineMetadata(newClass, metadata), function() {
1520
+ for (var i$1 = 0; i$1 < initializers.length; i$1++) initializers[i$1].call(newClass);
1521
+ }];
1522
+ }
1523
+ }
1524
+ function defineMetadata(Class, metadata) {
1525
+ return Object.defineProperty(Class, Symbol.metadata || Symbol.for("Symbol.metadata"), {
1526
+ configurable: true,
1527
+ enumerable: true,
1528
+ value: metadata
1529
+ });
1530
+ }
1531
+ return function applyDecs2203R(targetClass, memberDecs, classDecs, parentClass) {
1532
+ if (parentClass !== void 0) var parentMetadata = parentClass[Symbol.metadata || Symbol.for("Symbol.metadata")];
1533
+ var metadata = Object.create(parentMetadata === void 0 ? null : parentMetadata);
1534
+ var e = applyMemberDecs(targetClass, memberDecs, metadata);
1535
+ if (!classDecs.length) defineMetadata(targetClass, metadata);
1536
+ return {
1537
+ e,
1538
+ get c() {
1539
+ return applyClassDecs(targetClass, classDecs, metadata);
1540
+ }
1541
+ };
1542
+ };
1543
+ }
1544
+ function _apply_decs_2203_r$1(targetClass, memberDecs, classDecs, parentClass) {
1545
+ return (_apply_decs_2203_r$1 = applyDecs2203RFactory$1())(targetClass, memberDecs, classDecs, parentClass);
1546
+ }
1547
+ var _dec$1, _initClass$1;
1548
+ let _PathBuilderService;
1549
+ _dec$1 = Injectable();
1550
+ var PathBuilderService = class {
1551
+ static {
1552
+ ({c: [_PathBuilderService, _initClass$1]} = _apply_decs_2203_r$1(this, [], [_dec$1]));
1553
+ }
1554
+ schemaConverter = inject(_SchemaConverterService);
1555
+ /**
1556
+ * Generates an OpenAPI path item for a discovered endpoint.
1557
+ *
1558
+ * @param endpoint - Discovered endpoint with metadata
1559
+ * @returns Path string and path item object
1560
+ */ build(endpoint) {
1561
+ const { config, handler, openApiMetadata } = endpoint;
1562
+ const path = this.convertUrlParams(config.url);
1563
+ const operation = {
1564
+ tags: openApiMetadata.tags.length > 0 ? openApiMetadata.tags : void 0,
1565
+ summary: openApiMetadata.summary,
1566
+ description: openApiMetadata.description,
1567
+ operationId: openApiMetadata.operationId,
1568
+ deprecated: openApiMetadata.deprecated || void 0,
1569
+ externalDocs: openApiMetadata.externalDocs,
1570
+ security: openApiMetadata.security,
1571
+ parameters: this.buildParameters(config),
1572
+ requestBody: this.buildRequestBody(config, handler),
1573
+ responses: this.buildResponses(endpoint)
1574
+ };
1575
+ const cleanOperation = Object.fromEntries(Object.entries(operation).filter(([, v]) => v !== void 0));
1576
+ return {
1577
+ path,
1578
+ pathItem: { [config.method.toLowerCase()]: cleanOperation }
1579
+ };
1580
+ }
1581
+ /**
1582
+ * Converts Navios URL param format ($param) to OpenAPI format ({param})
1583
+ */ convertUrlParams(url) {
1584
+ return url.replace(/\$(\w+)/g, "{$1}");
1585
+ }
1586
+ /**
1587
+ * Extracts URL parameter names from a URL pattern
1588
+ */ extractUrlParamNames(url) {
1589
+ const matches = url.matchAll(/\$(\w+)/g);
1590
+ return Array.from(matches, (m) => m[1]);
1591
+ }
1592
+ /**
1593
+ * Gets the endpoint type based on the adapter token
1594
+ */ getEndpointType(handler) {
1595
+ if (handler.adapterToken === MultipartAdapterToken) return "multipart";
1596
+ if (handler.adapterToken === StreamAdapterToken) return "stream";
1597
+ return "endpoint";
1598
+ }
1599
+ /**
1600
+ * Builds OpenAPI parameters from endpoint config
1601
+ */ buildParameters(config) {
1602
+ const params = [];
1603
+ const urlParams = this.extractUrlParamNames(config.url);
1604
+ for (const param of urlParams) params.push({
1605
+ name: param,
1606
+ in: "path",
1607
+ required: true,
1608
+ schema: { type: "string" }
1609
+ });
1610
+ if (config.querySchema) {
1611
+ const { schema: querySchema } = this.schemaConverter.convert(config.querySchema);
1612
+ const schemaObj = querySchema;
1613
+ if (schemaObj.properties) for (const [name, schema] of Object.entries(schemaObj.properties)) params.push({
1614
+ name,
1615
+ in: "query",
1616
+ required: schemaObj.required?.includes(name) ?? false,
1617
+ schema,
1618
+ description: schema.description
1619
+ });
1620
+ }
1621
+ return params;
1622
+ }
1623
+ /**
1624
+ * Builds request body based on endpoint type
1625
+ */ buildRequestBody(config, handler) {
1626
+ switch (this.getEndpointType(handler)) {
1627
+ case "multipart": return this.buildMultipartRequestBody(config);
1628
+ case "stream": return;
1629
+ case "endpoint":
1630
+ default: return this.buildJsonRequestBody(config);
1631
+ }
1632
+ }
1633
+ /**
1634
+ * Builds request body for JSON endpoints
1635
+ */ buildJsonRequestBody(config) {
1636
+ if (!config.requestSchema) return;
1637
+ const { schema } = this.schemaConverter.convert(config.requestSchema);
1638
+ return {
1639
+ required: true,
1640
+ content: { "application/json": { schema } }
1641
+ };
1642
+ }
1643
+ /**
1644
+ * Builds request body for multipart endpoints
1645
+ */ buildMultipartRequestBody(config) {
1646
+ if (!config.requestSchema) return {
1647
+ required: true,
1648
+ content: { "multipart/form-data": { schema: { type: "object" } } }
1649
+ };
1650
+ const schema = this.schemaConverter.convert(config.requestSchema).schema;
1651
+ const properties = this.schemaConverter.transformFileProperties(schema.properties || {});
1652
+ return {
1653
+ required: true,
1654
+ content: { "multipart/form-data": { schema: {
1655
+ type: "object",
1656
+ properties,
1657
+ required: schema.required
1658
+ } } }
1659
+ };
1660
+ }
1661
+ /**
1662
+ * Builds responses based on endpoint type
1663
+ */ buildResponses(endpoint) {
1664
+ const { config, handler } = endpoint;
1665
+ switch (this.getEndpointType(handler)) {
1666
+ case "stream": return this.buildStreamResponses(endpoint);
1667
+ case "multipart":
1668
+ case "endpoint":
1669
+ default: return this.buildJsonResponses(config, handler);
1670
+ }
1671
+ }
1672
+ /**
1673
+ * Builds responses for JSON endpoints
1674
+ */ buildJsonResponses(config, handler) {
1675
+ const successCode = handler.successStatusCode?.toString() ?? "200";
1676
+ if (!config.responseSchema) return { [successCode]: { description: "Successful response" } };
1677
+ const { schema } = this.schemaConverter.convert(config.responseSchema);
1678
+ return { [successCode]: {
1679
+ description: "Successful response",
1680
+ content: { "application/json": { schema } }
1681
+ } };
1682
+ }
1683
+ /**
1684
+ * Builds responses for stream endpoints
1685
+ */ buildStreamResponses(endpoint) {
1686
+ const { openApiMetadata, handler } = endpoint;
1687
+ const successCode = handler.successStatusCode?.toString() ?? "200";
1688
+ const contentType = openApiMetadata.stream?.contentType ?? "application/octet-stream";
1689
+ const description = openApiMetadata.stream?.description ?? "Stream response";
1690
+ const content = this.getStreamContent(contentType);
1691
+ return { [successCode]: {
1692
+ description,
1693
+ content
1694
+ } };
1695
+ }
1696
+ /**
1697
+ * Gets content object for different stream types
1698
+ */ getStreamContent(contentType) {
1699
+ switch (contentType) {
1700
+ case "text/event-stream": return { "text/event-stream": { schema: {
1701
+ type: "string",
1702
+ description: "Server-Sent Events stream"
1703
+ } } };
1704
+ case "application/octet-stream": return { "application/octet-stream": { schema: {
1705
+ type: "string",
1706
+ format: "binary",
1707
+ description: "Binary file download"
1708
+ } } };
1709
+ case "application/json": return { "application/json": { schema: {
1710
+ type: "string",
1711
+ description: "Newline-delimited JSON stream"
1712
+ } } };
1713
+ default: return { [contentType]: { schema: {
1714
+ type: "string",
1715
+ format: "binary"
1716
+ } } };
1717
+ }
1718
+ }
1719
+ static {
1720
+ _initClass$1();
1721
+ }
1722
+ };
1723
+
1724
+ //#endregion
1725
+ //#region src/services/openapi-generator.service.mts
1726
+ function applyDecs2203RFactory() {
1727
+ function createAddInitializerMethod(initializers, decoratorFinishedRef) {
1728
+ return function addInitializer(initializer) {
1729
+ assertNotFinished(decoratorFinishedRef, "addInitializer");
1730
+ assertCallable(initializer, "An initializer");
1731
+ initializers.push(initializer);
1732
+ };
1733
+ }
1734
+ function memberDec(dec, name, desc, initializers, kind, isStatic, isPrivate, metadata, value) {
1735
+ var kindStr;
1736
+ switch (kind) {
1737
+ case 1:
1738
+ kindStr = "accessor";
1739
+ break;
1740
+ case 2:
1741
+ kindStr = "method";
1742
+ break;
1743
+ case 3:
1744
+ kindStr = "getter";
1745
+ break;
1746
+ case 4:
1747
+ kindStr = "setter";
1748
+ break;
1749
+ default: kindStr = "field";
1750
+ }
1751
+ var ctx = {
1752
+ kind: kindStr,
1753
+ name: isPrivate ? "#" + name : name,
1754
+ static: isStatic,
1755
+ private: isPrivate,
1756
+ metadata
1757
+ };
1758
+ var decoratorFinishedRef = { v: false };
1759
+ ctx.addInitializer = createAddInitializerMethod(initializers, decoratorFinishedRef);
1760
+ var get, set;
1761
+ if (kind === 0) if (isPrivate) {
1762
+ get = desc.get;
1763
+ set = desc.set;
1764
+ } else {
1765
+ get = function() {
1766
+ return this[name];
1767
+ };
1768
+ set = function(v) {
1769
+ this[name] = v;
1770
+ };
1771
+ }
1772
+ else if (kind === 2) get = function() {
1773
+ return desc.value;
1774
+ };
1775
+ else {
1776
+ if (kind === 1 || kind === 3) get = function() {
1777
+ return desc.get.call(this);
1778
+ };
1779
+ if (kind === 1 || kind === 4) set = function(v) {
1780
+ desc.set.call(this, v);
1781
+ };
1782
+ }
1783
+ ctx.access = get && set ? {
1784
+ get,
1785
+ set
1786
+ } : get ? { get } : { set };
1787
+ try {
1788
+ return dec(value, ctx);
1789
+ } finally {
1790
+ decoratorFinishedRef.v = true;
1791
+ }
1792
+ }
1793
+ function assertNotFinished(decoratorFinishedRef, fnName) {
1794
+ if (decoratorFinishedRef.v) throw new Error("attempted to call " + fnName + " after decoration was finished");
1795
+ }
1796
+ function assertCallable(fn, hint) {
1797
+ if (typeof fn !== "function") throw new TypeError(hint + " must be a function");
1798
+ }
1799
+ function assertValidReturnValue(kind, value) {
1800
+ var type = typeof value;
1801
+ if (kind === 1) {
1802
+ if (type !== "object" || value === null) throw new TypeError("accessor decorators must return an object with get, set, or init properties or void 0");
1803
+ if (value.get !== void 0) assertCallable(value.get, "accessor.get");
1804
+ if (value.set !== void 0) assertCallable(value.set, "accessor.set");
1805
+ if (value.init !== void 0) assertCallable(value.init, "accessor.init");
1806
+ } else if (type !== "function") {
1807
+ var hint;
1808
+ if (kind === 0) hint = "field";
1809
+ else if (kind === 10) hint = "class";
1810
+ else hint = "method";
1811
+ throw new TypeError(hint + " decorators must return a function or void 0");
1812
+ }
1813
+ }
1814
+ function applyMemberDec(ret, base, decInfo, name, kind, isStatic, isPrivate, initializers, metadata) {
1815
+ var decs = decInfo[0];
1816
+ var desc, init, value;
1817
+ if (isPrivate) if (kind === 0 || kind === 1) desc = {
1818
+ get: decInfo[3],
1819
+ set: decInfo[4]
1820
+ };
1821
+ else if (kind === 3) desc = { get: decInfo[3] };
1822
+ else if (kind === 4) desc = { set: decInfo[3] };
1823
+ else desc = { value: decInfo[3] };
1824
+ else if (kind !== 0) desc = Object.getOwnPropertyDescriptor(base, name);
1825
+ if (kind === 1) value = {
1826
+ get: desc.get,
1827
+ set: desc.set
1828
+ };
1829
+ else if (kind === 2) value = desc.value;
1830
+ else if (kind === 3) value = desc.get;
1831
+ else if (kind === 4) value = desc.set;
1832
+ var newValue, get, set;
1833
+ if (typeof decs === "function") {
1834
+ newValue = memberDec(decs, name, desc, initializers, kind, isStatic, isPrivate, metadata, value);
1835
+ if (newValue !== void 0) {
1836
+ assertValidReturnValue(kind, newValue);
1837
+ if (kind === 0) init = newValue;
1838
+ else if (kind === 1) {
1839
+ init = newValue.init;
1840
+ get = newValue.get || value.get;
1841
+ set = newValue.set || value.set;
1842
+ value = {
1843
+ get,
1844
+ set
1845
+ };
1846
+ } else value = newValue;
1847
+ }
1848
+ } else for (var i = decs.length - 1; i >= 0; i--) {
1849
+ var dec = decs[i];
1850
+ newValue = memberDec(dec, name, desc, initializers, kind, isStatic, isPrivate, metadata, value);
1851
+ if (newValue !== void 0) {
1852
+ assertValidReturnValue(kind, newValue);
1853
+ var newInit;
1854
+ if (kind === 0) newInit = newValue;
1855
+ else if (kind === 1) {
1856
+ newInit = newValue.init;
1857
+ get = newValue.get || value.get;
1858
+ set = newValue.set || value.set;
1859
+ value = {
1860
+ get,
1861
+ set
1862
+ };
1863
+ } else value = newValue;
1864
+ if (newInit !== void 0) if (init === void 0) init = newInit;
1865
+ else if (typeof init === "function") init = [init, newInit];
1866
+ else init.push(newInit);
1867
+ }
1868
+ }
1869
+ if (kind === 0 || kind === 1) {
1870
+ if (init === void 0) init = function(instance, init$1) {
1871
+ return init$1;
1872
+ };
1873
+ else if (typeof init !== "function") {
1874
+ var ownInitializers = init;
1875
+ init = function(instance, init$1) {
1876
+ var value$1 = init$1;
1877
+ for (var i$1 = 0; i$1 < ownInitializers.length; i$1++) value$1 = ownInitializers[i$1].call(instance, value$1);
1878
+ return value$1;
1879
+ };
1880
+ } else {
1881
+ var originalInitializer = init;
1882
+ init = function(instance, init$1) {
1883
+ return originalInitializer.call(instance, init$1);
1884
+ };
1885
+ }
1886
+ ret.push(init);
1887
+ }
1888
+ if (kind !== 0) {
1889
+ if (kind === 1) {
1890
+ desc.get = value.get;
1891
+ desc.set = value.set;
1892
+ } else if (kind === 2) desc.value = value;
1893
+ else if (kind === 3) desc.get = value;
1894
+ else if (kind === 4) desc.set = value;
1895
+ if (isPrivate) if (kind === 1) {
1896
+ ret.push(function(instance, args) {
1897
+ return value.get.call(instance, args);
1898
+ });
1899
+ ret.push(function(instance, args) {
1900
+ return value.set.call(instance, args);
1901
+ });
1902
+ } else if (kind === 2) ret.push(value);
1903
+ else ret.push(function(instance, args) {
1904
+ return value.call(instance, args);
1905
+ });
1906
+ else Object.defineProperty(base, name, desc);
1907
+ }
1908
+ }
1909
+ function applyMemberDecs(Class, decInfos, metadata) {
1910
+ var ret = [];
1911
+ var protoInitializers;
1912
+ var staticInitializers;
1913
+ var existingProtoNonFields = /* @__PURE__ */ new Map();
1914
+ var existingStaticNonFields = /* @__PURE__ */ new Map();
1915
+ for (var i = 0; i < decInfos.length; i++) {
1916
+ var decInfo = decInfos[i];
1917
+ if (!Array.isArray(decInfo)) continue;
1918
+ var kind = decInfo[1];
1919
+ var name = decInfo[2];
1920
+ var isPrivate = decInfo.length > 3;
1921
+ var isStatic = kind >= 5;
1922
+ var base;
1923
+ var initializers;
1924
+ if (isStatic) {
1925
+ base = Class;
1926
+ kind = kind - 5;
1927
+ staticInitializers = staticInitializers || [];
1928
+ initializers = staticInitializers;
1929
+ } else {
1930
+ base = Class.prototype;
1931
+ protoInitializers = protoInitializers || [];
1932
+ initializers = protoInitializers;
1933
+ }
1934
+ if (kind !== 0 && !isPrivate) {
1935
+ var existingNonFields = isStatic ? existingStaticNonFields : existingProtoNonFields;
1936
+ var existingKind = existingNonFields.get(name) || 0;
1937
+ if (existingKind === true || existingKind === 3 && kind !== 4 || existingKind === 4 && kind !== 3) throw new Error("Attempted to decorate a public method/accessor that has the same name as a previously decorated public method/accessor. This is not currently supported by the decorators plugin. Property name was: " + name);
1938
+ else if (!existingKind && kind > 2) existingNonFields.set(name, kind);
1939
+ else existingNonFields.set(name, true);
1940
+ }
1941
+ applyMemberDec(ret, base, decInfo, name, kind, isStatic, isPrivate, initializers, metadata);
1942
+ }
1943
+ pushInitializers(ret, protoInitializers);
1944
+ pushInitializers(ret, staticInitializers);
1945
+ return ret;
1946
+ }
1947
+ function pushInitializers(ret, initializers) {
1948
+ if (initializers) ret.push(function(instance) {
1949
+ for (var i = 0; i < initializers.length; i++) initializers[i].call(instance);
1950
+ return instance;
1951
+ });
1952
+ }
1953
+ function applyClassDecs(targetClass, classDecs, metadata) {
1954
+ if (classDecs.length > 0) {
1955
+ var initializers = [];
1956
+ var newClass = targetClass;
1957
+ var name = targetClass.name;
1958
+ for (var i = classDecs.length - 1; i >= 0; i--) {
1959
+ var decoratorFinishedRef = { v: false };
1960
+ try {
1961
+ var nextNewClass = classDecs[i](newClass, {
1962
+ kind: "class",
1963
+ name,
1964
+ addInitializer: createAddInitializerMethod(initializers, decoratorFinishedRef),
1965
+ metadata
1966
+ });
1967
+ } finally {
1968
+ decoratorFinishedRef.v = true;
1969
+ }
1970
+ if (nextNewClass !== void 0) {
1971
+ assertValidReturnValue(10, nextNewClass);
1972
+ newClass = nextNewClass;
1973
+ }
1974
+ }
1975
+ return [defineMetadata(newClass, metadata), function() {
1976
+ for (var i$1 = 0; i$1 < initializers.length; i$1++) initializers[i$1].call(newClass);
1977
+ }];
1978
+ }
1979
+ }
1980
+ function defineMetadata(Class, metadata) {
1981
+ return Object.defineProperty(Class, Symbol.metadata || Symbol.for("Symbol.metadata"), {
1982
+ configurable: true,
1983
+ enumerable: true,
1984
+ value: metadata
1985
+ });
1986
+ }
1987
+ return function applyDecs2203R(targetClass, memberDecs, classDecs, parentClass) {
1988
+ if (parentClass !== void 0) var parentMetadata = parentClass[Symbol.metadata || Symbol.for("Symbol.metadata")];
1989
+ var metadata = Object.create(parentMetadata === void 0 ? null : parentMetadata);
1990
+ var e = applyMemberDecs(targetClass, memberDecs, metadata);
1991
+ if (!classDecs.length) defineMetadata(targetClass, metadata);
1992
+ return {
1993
+ e,
1994
+ get c() {
1995
+ return applyClassDecs(targetClass, classDecs, metadata);
1996
+ }
1997
+ };
1998
+ };
1999
+ }
2000
+ function _apply_decs_2203_r(targetClass, memberDecs, classDecs, parentClass) {
2001
+ return (_apply_decs_2203_r = applyDecs2203RFactory())(targetClass, memberDecs, classDecs, parentClass);
2002
+ }
2003
+ var _dec, _initClass;
2004
+ let _OpenApiGeneratorService;
2005
+ _dec = Injectable();
2006
+ var OpenApiGeneratorService = class {
2007
+ static {
2008
+ ({c: [_OpenApiGeneratorService, _initClass]} = _apply_decs_2203_r(this, [], [_dec]));
2009
+ }
2010
+ logger = inject(Logger, { context: _OpenApiGeneratorService.name });
2011
+ scanner = inject(_EndpointScannerService);
2012
+ pathBuilder = inject(_PathBuilderService);
2013
+ /**
2014
+ * Generates an OpenAPI document from loaded modules.
2015
+ *
2016
+ * @param modules - Map of loaded modules
2017
+ * @param options - OpenAPI generation options
2018
+ * @returns Complete OpenAPI document
2019
+ */ generate(modules, options) {
2020
+ this.logger.debug("Generating OpenAPI document");
2021
+ const endpoints = this.scanner.scan(modules);
2022
+ const paths = this.buildPaths(endpoints);
2023
+ const discoveredTags = this.collectTags(endpoints);
2024
+ const tags = this.mergeTags(discoveredTags, options.tags);
2025
+ const document = {
2026
+ openapi: "3.1.0",
2027
+ info: options.info,
2028
+ paths
2029
+ };
2030
+ if (options.servers && options.servers.length > 0) document.servers = options.servers;
2031
+ if (options.externalDocs) document.externalDocs = options.externalDocs;
2032
+ if (tags.length > 0) document.tags = tags;
2033
+ if (options.security) document.security = options.security;
2034
+ if (options.securitySchemes) document.components = {
2035
+ ...document.components,
2036
+ securitySchemes: options.securitySchemes
2037
+ };
2038
+ this.logger.debug(`Generated OpenAPI document with ${Object.keys(paths).length} paths`);
2039
+ return document;
2040
+ }
2041
+ /**
2042
+ * Builds paths object from discovered endpoints
2043
+ */ buildPaths(endpoints) {
2044
+ const paths = {};
2045
+ for (const endpoint of endpoints) {
2046
+ const { path, pathItem } = this.pathBuilder.build(endpoint);
2047
+ if (paths[path]) paths[path] = {
2048
+ ...paths[path],
2049
+ ...pathItem
2050
+ };
2051
+ else paths[path] = pathItem;
2052
+ }
2053
+ return paths;
2054
+ }
2055
+ /**
2056
+ * Collects unique tags from endpoints
2057
+ */ collectTags(endpoints) {
2058
+ const tags = /* @__PURE__ */ new Set();
2059
+ for (const endpoint of endpoints) for (const tag of endpoint.openApiMetadata.tags) tags.add(tag);
2060
+ return tags;
2061
+ }
2062
+ /**
2063
+ * Merges discovered tags with configured tags
2064
+ */ mergeTags(discoveredTags, configuredTags) {
2065
+ const tagMap = /* @__PURE__ */ new Map();
2066
+ if (configuredTags) for (const tag of configuredTags) tagMap.set(tag.name, tag);
2067
+ for (const tagName of discoveredTags) if (!tagMap.has(tagName)) tagMap.set(tagName, { name: tagName });
2068
+ return Array.from(tagMap.values());
2069
+ }
2070
+ static {
2071
+ _initClass();
2072
+ }
2073
+ };
2074
+
2075
+ //#endregion
2076
+ export { ApiDeprecated, ApiDeprecatedToken, ApiExclude, ApiExcludeToken, ApiOperation, ApiOperationToken, ApiSecurity, ApiSecurityToken, ApiStream, ApiStreamToken, ApiSummary, ApiSummaryToken, ApiTag, ApiTagToken, _EndpointScannerService as EndpointScannerService, _MetadataExtractorService as MetadataExtractorService, _OpenApiGeneratorService as OpenApiGeneratorService, _PathBuilderService as PathBuilderService, _SchemaConverterService as SchemaConverterService };
2077
+ //# sourceMappingURL=index.mjs.map