@navios/openapi 0.9.0 → 1.0.0-alpha.2

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 (71) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/dist/legacy-compat/__type-tests__/legacy-decorators.spec-d.d.mts +2 -0
  3. package/dist/legacy-compat/__type-tests__/legacy-decorators.spec-d.d.mts.map +1 -0
  4. package/dist/legacy-compat/__type-tests__/tsconfig.tsbuildinfo +1 -0
  5. package/dist/src/legacy-compat/decorators/api-deprecated.decorator.d.mts +35 -0
  6. package/dist/src/legacy-compat/decorators/api-deprecated.decorator.d.mts.map +1 -0
  7. package/dist/src/legacy-compat/decorators/api-exclude.decorator.d.mts +28 -0
  8. package/dist/src/legacy-compat/decorators/api-exclude.decorator.d.mts.map +1 -0
  9. package/dist/src/legacy-compat/decorators/api-operation.decorator.d.mts +60 -0
  10. package/dist/src/legacy-compat/decorators/api-operation.decorator.d.mts.map +1 -0
  11. package/dist/src/legacy-compat/decorators/api-security.decorator.d.mts +38 -0
  12. package/dist/src/legacy-compat/decorators/api-security.decorator.d.mts.map +1 -0
  13. package/dist/src/legacy-compat/decorators/api-stream.decorator.d.mts +52 -0
  14. package/dist/src/legacy-compat/decorators/api-stream.decorator.d.mts.map +1 -0
  15. package/dist/src/legacy-compat/decorators/api-summary.decorator.d.mts +26 -0
  16. package/dist/src/legacy-compat/decorators/api-summary.decorator.d.mts.map +1 -0
  17. package/dist/src/legacy-compat/decorators/api-tag.decorator.d.mts +44 -0
  18. package/dist/src/legacy-compat/decorators/api-tag.decorator.d.mts.map +1 -0
  19. package/dist/src/legacy-compat/decorators/index.d.mts +8 -0
  20. package/dist/src/legacy-compat/decorators/index.d.mts.map +1 -0
  21. package/dist/src/legacy-compat/index.d.mts +24 -0
  22. package/dist/src/legacy-compat/index.d.mts.map +1 -0
  23. package/dist/src/services/endpoint-scanner.service.d.mts +2 -2
  24. package/dist/src/services/endpoint-scanner.service.d.mts.map +1 -1
  25. package/dist/src/services/path-builder.service.d.mts +13 -1
  26. package/dist/src/services/path-builder.service.d.mts.map +1 -1
  27. package/dist/tsconfig.lib.tsbuildinfo +1 -1
  28. package/dist/tsconfig.spec.tsbuildinfo +1 -1
  29. package/dist/tsconfig.tsbuildinfo +1 -1
  30. package/dist/vitest.config.d.mts.map +1 -1
  31. package/lib/index-COmVnnSM.d.mts +606 -0
  32. package/lib/index-COmVnnSM.d.mts.map +1 -0
  33. package/lib/index-Dz-4huer.d.cts +606 -0
  34. package/lib/index-Dz-4huer.d.cts.map +1 -0
  35. package/lib/index.cjs +20 -1840
  36. package/lib/index.cjs.map +1 -1
  37. package/lib/index.d.cts +2 -594
  38. package/lib/index.d.mts +2 -594
  39. package/lib/index.mjs +2 -1822
  40. package/lib/index.mjs.map +1 -1
  41. package/lib/legacy-compat/index.cjs +314 -0
  42. package/lib/legacy-compat/index.cjs.map +1 -0
  43. package/lib/legacy-compat/index.d.cts +285 -0
  44. package/lib/legacy-compat/index.d.cts.map +1 -0
  45. package/lib/legacy-compat/index.d.mts +285 -0
  46. package/lib/legacy-compat/index.d.mts.map +1 -0
  47. package/lib/legacy-compat/index.mjs +271 -0
  48. package/lib/legacy-compat/index.mjs.map +1 -0
  49. package/lib/services-B16xN1Kh.cjs +1928 -0
  50. package/lib/services-B16xN1Kh.cjs.map +1 -0
  51. package/lib/services-B7UR1D1X.mjs +1857 -0
  52. package/lib/services-B7UR1D1X.mjs.map +1 -0
  53. package/package.json +15 -5
  54. package/src/legacy-compat/__type-tests__/legacy-decorators.spec-d.mts +347 -0
  55. package/src/legacy-compat/__type-tests__/tsconfig.json +15 -0
  56. package/src/legacy-compat/decorators/api-deprecated.decorator.mts +46 -0
  57. package/src/legacy-compat/decorators/api-exclude.decorator.mts +31 -0
  58. package/src/legacy-compat/decorators/api-operation.decorator.mts +60 -0
  59. package/src/legacy-compat/decorators/api-security.decorator.mts +45 -0
  60. package/src/legacy-compat/decorators/api-stream.decorator.mts +56 -0
  61. package/src/legacy-compat/decorators/api-summary.decorator.mts +34 -0
  62. package/src/legacy-compat/decorators/api-tag.decorator.mts +52 -0
  63. package/src/legacy-compat/decorators/index.mts +7 -0
  64. package/src/legacy-compat/index.mts +58 -0
  65. package/src/services/endpoint-scanner.service.mts +14 -8
  66. package/src/services/path-builder.service.mts +85 -27
  67. package/tsconfig.spec.json +4 -1
  68. package/tsdown.config.mts +2 -2
  69. package/vitest.config.mts +5 -1
  70. package/lib/index.d.cts.map +0 -1
  71. package/lib/index.d.mts.map +0 -1
@@ -0,0 +1,45 @@
1
+ import { LegacyAttributeFactory } from '@navios/core/legacy-compat'
2
+ import { z } from 'zod/v4'
3
+
4
+ import { ApiSecurityToken } from '../../tokens/index.mjs'
5
+
6
+ const ApiSecuritySchema = z.record(z.string(), z.array(z.string()))
7
+
8
+ /** Security requirement for an endpoint, inferred from the schema */
9
+ export type ApiSecurityRequirement = z.infer<typeof ApiSecuritySchema>
10
+
11
+ /**
12
+ * Specifies security requirements for an endpoint.
13
+ *
14
+ * The security requirement object maps security scheme names to their scopes.
15
+ * For schemes that don't use scopes (like API keys), use an empty array.
16
+ *
17
+ * Legacy-compatible version for TypeScript experimental decorators.
18
+ *
19
+ * @param requirements - Security requirements object
20
+ *
21
+ * @example
22
+ * ```typescript
23
+ * @Controller()
24
+ * export class UserController {
25
+ * // Require bearer token authentication
26
+ * @Endpoint(getUser)
27
+ * @ApiSecurity({ bearerAuth: [] })
28
+ * async getUser() {}
29
+ *
30
+ * // Require multiple authentication methods
31
+ * @Endpoint(adminEndpoint)
32
+ * @ApiSecurity({ bearerAuth: [], apiKey: [] })
33
+ * async adminAction() {}
34
+ *
35
+ * // OAuth2 with specific scopes
36
+ * @Endpoint(writeUser)
37
+ * @ApiSecurity({ oauth2: ['users:write', 'users:read'] })
38
+ * async writeUser() {}
39
+ * }
40
+ * ```
41
+ */
42
+ export const ApiSecurity = LegacyAttributeFactory.createAttribute(
43
+ ApiSecurityToken,
44
+ ApiSecuritySchema,
45
+ )
@@ -0,0 +1,56 @@
1
+ import { LegacyAttributeFactory } from '@navios/core/legacy-compat'
2
+ import { z } from 'zod/v4'
3
+
4
+ import { ApiStreamToken } from '../../tokens/index.mjs'
5
+
6
+ const ApiStreamSchema = z.object({
7
+ contentType: z.string(),
8
+ description: z.string().optional(),
9
+ })
10
+
11
+ /** Options for the @ApiStream decorator, inferred from the schema */
12
+ export type ApiStreamOptions = z.infer<typeof ApiStreamSchema>
13
+
14
+ /**
15
+ * Specifies content type and description for stream endpoints.
16
+ *
17
+ * Stream endpoints don't have a responseSchema, so this decorator provides
18
+ * the necessary metadata for OpenAPI documentation.
19
+ *
20
+ * Legacy-compatible version for TypeScript experimental decorators.
21
+ *
22
+ * @param options - Stream response options
23
+ *
24
+ * @example
25
+ * ```typescript
26
+ * @Controller()
27
+ * export class FileController {
28
+ * // Binary file download
29
+ * @Stream(downloadFile)
30
+ * @ApiStream({
31
+ * contentType: 'application/octet-stream',
32
+ * description: 'Download file as binary stream'
33
+ * })
34
+ * async download(params: StreamParams<typeof downloadFile>, reply: Reply) {
35
+ * // Stream implementation
36
+ * }
37
+ * }
38
+ *
39
+ * @Controller()
40
+ * export class EventController {
41
+ * // Server-Sent Events
42
+ * @Stream(streamEvents)
43
+ * @ApiStream({
44
+ * contentType: 'text/event-stream',
45
+ * description: 'Real-time event stream'
46
+ * })
47
+ * async stream(params: StreamParams<typeof streamEvents>, reply: Reply) {
48
+ * // SSE implementation
49
+ * }
50
+ * }
51
+ * ```
52
+ */
53
+ export const ApiStream = LegacyAttributeFactory.createAttribute(
54
+ ApiStreamToken,
55
+ ApiStreamSchema,
56
+ )
@@ -0,0 +1,34 @@
1
+ import { LegacyAttributeFactory } from '@navios/core/legacy-compat'
2
+ import { z } from 'zod/v4'
3
+
4
+ import { ApiSummaryToken } from '../../tokens/index.mjs'
5
+
6
+ const ApiSummarySchema = z.string()
7
+
8
+ /**
9
+ * Shorthand decorator for adding just a summary to an endpoint.
10
+ *
11
+ * This is equivalent to `@ApiOperation({ summary: '...' })` but more concise.
12
+ *
13
+ * Legacy-compatible version for TypeScript experimental decorators.
14
+ *
15
+ * @param summary - Short summary text for the endpoint
16
+ *
17
+ * @example
18
+ * ```typescript
19
+ * @Controller()
20
+ * export class UserController {
21
+ * @Endpoint(getUser)
22
+ * @ApiSummary('Get user by ID')
23
+ * async getUser() {}
24
+ *
25
+ * @Endpoint(createUser)
26
+ * @ApiSummary('Create a new user')
27
+ * async createUser() {}
28
+ * }
29
+ * ```
30
+ */
31
+ export const ApiSummary = LegacyAttributeFactory.createAttribute(
32
+ ApiSummaryToken,
33
+ ApiSummarySchema,
34
+ )
@@ -0,0 +1,52 @@
1
+ import { LegacyAttributeFactory } from '@navios/core/legacy-compat'
2
+ import { z } from 'zod/v4'
3
+
4
+ import { ApiTagToken } from '../../tokens/index.mjs'
5
+
6
+ const ApiTagSchema = z.object({
7
+ name: z.string(),
8
+ description: z.string().optional(),
9
+ })
10
+
11
+ /** Options for the @ApiTag decorator, inferred from the schema */
12
+ export type ApiTagOptions = z.infer<typeof ApiTagSchema>
13
+
14
+ const BaseApiTag = LegacyAttributeFactory.createAttribute(ApiTagToken, ApiTagSchema)
15
+
16
+ /**
17
+ * Groups endpoints under a specific tag/folder in the documentation.
18
+ *
19
+ * Can be applied to controllers (affects all endpoints) or individual methods.
20
+ * When applied to both, the method-level tag takes precedence.
21
+ *
22
+ * Legacy-compatible version for TypeScript experimental decorators.
23
+ *
24
+ * @param name - The tag name
25
+ * @param description - Optional tag description
26
+ *
27
+ * @example
28
+ * ```typescript
29
+ * // Apply to entire controller
30
+ * @Controller()
31
+ * @ApiTag('Users', 'User management operations')
32
+ * export class UserController {
33
+ * @Endpoint(getUser)
34
+ * async getUser() {}
35
+ * }
36
+ *
37
+ * // Apply to individual endpoint
38
+ * @Controller()
39
+ * export class MixedController {
40
+ * @Endpoint(getUser)
41
+ * @ApiTag('Users')
42
+ * async getUser() {}
43
+ *
44
+ * @Endpoint(getOrder)
45
+ * @ApiTag('Orders')
46
+ * async getOrder() {}
47
+ * }
48
+ * ```
49
+ */
50
+ export function ApiTag(name: string, description?: string) {
51
+ return BaseApiTag({ name, description })
52
+ }
@@ -0,0 +1,7 @@
1
+ export { ApiTag, type ApiTagOptions } from './api-tag.decorator.mjs'
2
+ export { ApiOperation, type ApiOperationOptions } from './api-operation.decorator.mjs'
3
+ export { ApiSummary } from './api-summary.decorator.mjs'
4
+ export { ApiDeprecated, type ApiDeprecatedOptions } from './api-deprecated.decorator.mjs'
5
+ export { ApiSecurity, type ApiSecurityRequirement } from './api-security.decorator.mjs'
6
+ export { ApiExclude } from './api-exclude.decorator.mjs'
7
+ export { ApiStream, type ApiStreamOptions } from './api-stream.decorator.mjs'
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Legacy-compatible decorators for projects that cannot use Stage 3 decorators.
3
+ *
4
+ * These decorators use the TypeScript experimental decorator API and convert
5
+ * the arguments to Stage 3 format internally.
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * import { ApiTag, ApiOperation, ApiSummary } from '@navios/openapi/legacy-compat'
10
+ *
11
+ * @Controller()
12
+ * @ApiTag('Users', 'User management operations')
13
+ * export class UserController {
14
+ * @Endpoint(getUser)
15
+ * @ApiSummary('Get user by ID')
16
+ * async getUser() {}
17
+ * }
18
+ * ```
19
+ */
20
+
21
+ // Export legacy-compatible decorators
22
+ export {
23
+ ApiTag,
24
+ ApiOperation,
25
+ ApiSummary,
26
+ ApiDeprecated,
27
+ ApiSecurity,
28
+ ApiExclude,
29
+ ApiStream,
30
+ type ApiTagOptions,
31
+ type ApiOperationOptions,
32
+ type ApiDeprecatedOptions,
33
+ type ApiSecurityRequirement,
34
+ type ApiStreamOptions,
35
+ } from './decorators/index.mjs'
36
+
37
+ // Re-export tokens for attribute access
38
+ export {
39
+ ApiTagToken,
40
+ ApiOperationToken,
41
+ ApiSummaryToken,
42
+ ApiDeprecatedToken,
43
+ ApiSecurityToken,
44
+ ApiExcludeToken,
45
+ ApiStreamToken,
46
+ } from '../tokens/index.mjs'
47
+
48
+ // Re-export services (they don't need legacy compatibility)
49
+ export {
50
+ OpenApiGeneratorService,
51
+ EndpointScannerService,
52
+ MetadataExtractorService,
53
+ SchemaConverterService,
54
+ PathBuilderService,
55
+ } from '../services/index.mjs'
56
+
57
+ // Re-export metadata types
58
+ export type { OpenApiEndpointMetadata } from '../metadata/index.mjs'
@@ -1,11 +1,16 @@
1
+ import type { BaseEndpointOptions, EndpointOptions } from '@navios/builder'
1
2
  import type {
2
3
  ControllerMetadata,
3
4
  HandlerMetadata,
4
5
  ModuleMetadata,
5
6
  } from '@navios/core'
6
- import type { BaseEndpointConfig } from '@navios/builder'
7
7
 
8
- import { extractControllerMetadata, inject, Injectable, Logger } from '@navios/core'
8
+ import {
9
+ extractControllerMetadata,
10
+ inject,
11
+ Injectable,
12
+ Logger,
13
+ } from '@navios/core'
9
14
 
10
15
  import type { OpenApiEndpointMetadata } from '../metadata/openapi.metadata.mjs'
11
16
 
@@ -24,7 +29,7 @@ export interface DiscoveredEndpoint {
24
29
  /** Handler (endpoint) metadata */
25
30
  handler: HandlerMetadata<any>
26
31
  /** Endpoint configuration from @navios/builder */
27
- config: BaseEndpointConfig
32
+ config: EndpointOptions | BaseEndpointOptions
28
33
  /** Extracted OpenAPI metadata */
29
34
  openApiMetadata: OpenApiEndpointMetadata
30
35
  }
@@ -53,7 +58,10 @@ export class EndpointScannerService {
53
58
  const endpoints: DiscoveredEndpoint[] = []
54
59
 
55
60
  for (const [moduleName, moduleMetadata] of modules) {
56
- if (!moduleMetadata.controllers || moduleMetadata.controllers.size === 0) {
61
+ if (
62
+ !moduleMetadata.controllers ||
63
+ moduleMetadata.controllers.size === 0
64
+ ) {
57
65
  continue
58
66
  }
59
67
 
@@ -97,9 +105,7 @@ export class EndpointScannerService {
97
105
 
98
106
  // Skip excluded endpoints
99
107
  if (openApiMetadata.excluded) {
100
- this.logger.debug(
101
- `Skipping excluded endpoint: ${handler.classMethod}`,
102
- )
108
+ this.logger.debug(`Skipping excluded endpoint: ${handler.classMethod}`)
103
109
  continue
104
110
  }
105
111
 
@@ -108,7 +114,7 @@ export class EndpointScannerService {
108
114
  controllerClass,
109
115
  controller: controllerMeta,
110
116
  handler,
111
- config: handler.config as BaseEndpointConfig,
117
+ config: handler.config as EndpointOptions | BaseEndpointOptions,
112
118
  openApiMetadata,
113
119
  })
114
120
  }
@@ -1,4 +1,8 @@
1
- import type { BaseEndpointConfig } from '@navios/builder'
1
+ import type {
2
+ BaseEndpointOptions,
3
+ EndpointOptions,
4
+ ErrorSchemaRecord,
5
+ } from '@navios/builder'
2
6
  import type { HandlerMetadata } from '@navios/core'
3
7
  import type { oas31 } from 'zod-openapi'
4
8
 
@@ -60,8 +64,8 @@ export class PathBuilderService {
60
64
  deprecated: openApiMetadata.deprecated || undefined,
61
65
  externalDocs: openApiMetadata.externalDocs,
62
66
  security: openApiMetadata.security,
63
- parameters: this.buildParameters(config),
64
- requestBody: this.buildRequestBody(config, handler),
67
+ parameters: this.buildParameters(config as EndpointOptions),
68
+ requestBody: this.buildRequestBody(config as EndpointOptions, handler),
65
69
  responses: this.buildResponses(endpoint),
66
70
  }
67
71
 
@@ -98,20 +102,23 @@ export class PathBuilderService {
98
102
  */
99
103
  getEndpointType(
100
104
  handler: HandlerMetadata<any>,
101
- ): 'endpoint' | 'multipart' | 'stream' {
105
+ ): 'endpoint' | 'multipart' | 'stream' | 'unknown' {
106
+ if (handler.adapterToken === EndpointAdapterToken) {
107
+ return 'endpoint'
108
+ }
102
109
  if (handler.adapterToken === MultipartAdapterToken) {
103
110
  return 'multipart'
104
111
  }
105
112
  if (handler.adapterToken === StreamAdapterToken) {
106
113
  return 'stream'
107
114
  }
108
- return 'endpoint'
115
+ return 'unknown'
109
116
  }
110
117
 
111
118
  /**
112
119
  * Builds OpenAPI parameters from endpoint config
113
120
  */
114
- private buildParameters(config: BaseEndpointConfig): ParameterObject[] {
121
+ private buildParameters(config: EndpointOptions): ParameterObject[] {
115
122
  const params: ParameterObject[] = []
116
123
 
117
124
  // URL parameters (from $paramName in URL)
@@ -151,7 +158,7 @@ export class PathBuilderService {
151
158
  * Builds request body based on endpoint type
152
159
  */
153
160
  private buildRequestBody(
154
- config: BaseEndpointConfig,
161
+ config: EndpointOptions,
155
162
  handler: HandlerMetadata<any>,
156
163
  ): RequestBodyObject | undefined {
157
164
  const type = this.getEndpointType(handler)
@@ -171,7 +178,7 @@ export class PathBuilderService {
171
178
  * Builds request body for JSON endpoints
172
179
  */
173
180
  private buildJsonRequestBody(
174
- config: BaseEndpointConfig,
181
+ config: EndpointOptions,
175
182
  ): RequestBodyObject | undefined {
176
183
  if (!config.requestSchema) {
177
184
  return undefined
@@ -193,7 +200,7 @@ export class PathBuilderService {
193
200
  * Builds request body for multipart endpoints
194
201
  */
195
202
  private buildMultipartRequestBody(
196
- config: BaseEndpointConfig,
203
+ config: EndpointOptions,
197
204
  ): RequestBodyObject {
198
205
  if (!config.requestSchema) {
199
206
  return {
@@ -206,7 +213,8 @@ export class PathBuilderService {
206
213
  }
207
214
  }
208
215
 
209
- const schema = this.schemaConverter.convert(config.requestSchema).schema as SchemaObject
216
+ const schema = this.schemaConverter.convert(config.requestSchema)
217
+ .schema as SchemaObject
210
218
 
211
219
  // Transform schema properties to handle File types
212
220
  const properties = this.schemaConverter.transformFileProperties(
@@ -239,62 +247,112 @@ export class PathBuilderService {
239
247
  return this.buildStreamResponses(endpoint)
240
248
  case 'multipart':
241
249
  case 'endpoint':
250
+ return this.buildJsonResponses(config as EndpointOptions, handler)
251
+ case 'unknown':
252
+ return this.buildUnknownResponses(config)
242
253
  default:
243
- return this.buildJsonResponses(config, handler)
254
+ return this.buildUnknownResponses(config)
244
255
  }
245
256
  }
246
257
 
258
+ /**
259
+ * Builds error responses from errorSchema
260
+ *
261
+ * @param errorSchema - Optional record mapping status codes to Zod schemas
262
+ * @returns ResponsesObject with error responses, or empty object if no errorSchema
263
+ */
264
+ private buildErrorResponses(
265
+ errorSchema?: ErrorSchemaRecord,
266
+ ): ResponsesObject {
267
+ if (!errorSchema) {
268
+ return {}
269
+ }
270
+
271
+ const errorResponses: ResponsesObject = {}
272
+
273
+ for (const [statusCode, schema] of Object.entries(errorSchema)) {
274
+ const { schema: convertedSchema } = this.schemaConverter.convert(schema)
275
+ errorResponses[statusCode] = {
276
+ description: `Error response (${statusCode})`,
277
+ content: {
278
+ 'application/json': {
279
+ schema: convertedSchema,
280
+ },
281
+ },
282
+ }
283
+ }
284
+
285
+ return errorResponses
286
+ }
287
+
247
288
  /**
248
289
  * Builds responses for JSON endpoints
249
290
  */
250
291
  private buildJsonResponses(
251
- config: BaseEndpointConfig,
292
+ config: EndpointOptions,
252
293
  handler: HandlerMetadata<any>,
253
294
  ): ResponsesObject {
254
295
  const successCode = handler.successStatusCode?.toString() ?? '200'
296
+ const responses: ResponsesObject = {}
255
297
 
298
+ // Build success response
256
299
  if (!config.responseSchema) {
257
- return {
258
- [successCode]: {
259
- description: 'Successful response',
260
- },
300
+ responses[successCode] = {
301
+ description: 'Successful response',
261
302
  }
262
- }
263
-
264
- const { schema } = this.schemaConverter.convert(config.responseSchema)
265
-
266
- return {
267
- [successCode]: {
303
+ } else {
304
+ const { schema } = this.schemaConverter.convert(config.responseSchema)
305
+ responses[successCode] = {
268
306
  description: 'Successful response',
269
307
  content: {
270
308
  'application/json': {
271
309
  schema,
272
310
  },
273
311
  },
274
- },
312
+ }
275
313
  }
314
+
315
+ // Add error responses from errorSchema
316
+ Object.assign(responses, this.buildErrorResponses(config.errorSchema))
317
+
318
+ return responses
276
319
  }
277
320
 
278
321
  /**
279
322
  * Builds responses for stream endpoints
280
323
  */
281
324
  private buildStreamResponses(endpoint: DiscoveredEndpoint): ResponsesObject {
282
- const { openApiMetadata, handler } = endpoint
325
+ const { config, openApiMetadata, handler } = endpoint
283
326
  const successCode = handler.successStatusCode?.toString() ?? '200'
284
327
 
285
328
  const contentType =
286
329
  openApiMetadata.stream?.contentType ?? 'application/octet-stream'
287
- const description =
288
- openApiMetadata.stream?.description ?? 'Stream response'
330
+ const description = openApiMetadata.stream?.description ?? 'Stream response'
289
331
 
290
332
  const content: ContentObject = this.getStreamContent(contentType)
291
333
 
292
- return {
334
+ const responses: ResponsesObject = {
293
335
  [successCode]: {
294
336
  description,
295
337
  content,
296
338
  },
297
339
  }
340
+
341
+ // Add error responses from errorSchema
342
+ Object.assign(responses, this.buildErrorResponses(config.errorSchema))
343
+
344
+ return responses
345
+ }
346
+
347
+ /**
348
+ * Builds responses for unknown endpoint types.
349
+ * Unknown types have no success response but can have error responses.
350
+ */
351
+ private buildUnknownResponses(
352
+ config: EndpointOptions | BaseEndpointOptions,
353
+ ): ResponsesObject {
354
+ // Only include error responses, no success response
355
+ return this.buildErrorResponses(config.errorSchema)
298
356
  }
299
357
 
300
358
  /**
@@ -3,10 +3,13 @@
3
3
  "compilerOptions": {
4
4
  "outDir": "./dist"
5
5
  },
6
- "include": ["src/**/*.spec.mts", "src/**/*.spec-d.mts"],
6
+ "include": ["src/**/*.spec.mts", "vitest.config.mts"],
7
7
  "references": [
8
8
  {
9
9
  "path": "./tsconfig.lib.json"
10
+ },
11
+ {
12
+ "path": "./src/legacy-compat/__type-tests__/tsconfig.json"
10
13
  }
11
14
  ]
12
15
  }
package/tsdown.config.mts CHANGED
@@ -3,7 +3,7 @@ import { defineConfig } from 'tsdown'
3
3
  import swc from 'unplugin-swc'
4
4
 
5
5
  export default defineConfig({
6
- entry: ['src/index.mts'],
6
+ entry: ['src/index.mts', 'src/legacy-compat/index.mts'],
7
7
  outDir: 'lib',
8
8
  format: ['esm', 'cjs'],
9
9
  clean: true,
@@ -11,7 +11,7 @@ export default defineConfig({
11
11
  treeshake: true,
12
12
  sourcemap: true,
13
13
  platform: 'node',
14
- external: ['@navios/core', '@navios/di'],
14
+ external: ['@navios/core', '@navios/core/legacy-compat', '@navios/di'],
15
15
  dts: true,
16
16
  target: 'es2022',
17
17
  plugins: [
package/vitest.config.mts CHANGED
@@ -6,6 +6,10 @@ export default defineProject({
6
6
  enabled: true,
7
7
  tsconfig: './tsconfig.lib.json',
8
8
  },
9
- include: ['src/**/*.spec.mts', 'src/**/*.spec-d.mts'],
9
+ include: [
10
+ 'src/**/*.spec.mts',
11
+ 'src/**/*.spec-d.mts',
12
+ 'src/legacy-compat/__type-tests__/**/*.spec-d.mts',
13
+ ],
10
14
  },
11
15
  })
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.cts","names":[],"sources":["../src/decorators/api-tag.decorator.mts","../src/decorators/api-operation.decorator.mts","../src/decorators/api-summary.decorator.mts","../src/decorators/api-deprecated.decorator.mts","../src/decorators/api-security.decorator.mts","../src/decorators/api-exclude.decorator.mts","../src/decorators/api-stream.decorator.mts","../src/metadata/openapi.metadata.mts","../src/services/endpoint-scanner.service.mts","../src/services/metadata-extractor.service.mts","../src/services/schema-converter.service.mts","../src/services/path-builder.service.mts","../src/services/openapi-generator.service.mts","../src/tokens/index.mts"],"sourcesContent":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../src/decorators/api-tag.decorator.mts","../src/decorators/api-operation.decorator.mts","../src/decorators/api-summary.decorator.mts","../src/decorators/api-deprecated.decorator.mts","../src/decorators/api-security.decorator.mts","../src/decorators/api-exclude.decorator.mts","../src/decorators/api-stream.decorator.mts","../src/metadata/openapi.metadata.mts","../src/services/endpoint-scanner.service.mts","../src/services/metadata-extractor.service.mts","../src/services/schema-converter.service.mts","../src/services/path-builder.service.mts","../src/services/openapi-generator.service.mts","../src/tokens/index.mts"],"sourcesContent":[],"mappings":"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"}