@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.
- package/CHANGELOG.md +44 -0
- package/dist/legacy-compat/__type-tests__/legacy-decorators.spec-d.d.mts +2 -0
- package/dist/legacy-compat/__type-tests__/legacy-decorators.spec-d.d.mts.map +1 -0
- package/dist/legacy-compat/__type-tests__/tsconfig.tsbuildinfo +1 -0
- package/dist/src/legacy-compat/decorators/api-deprecated.decorator.d.mts +35 -0
- package/dist/src/legacy-compat/decorators/api-deprecated.decorator.d.mts.map +1 -0
- package/dist/src/legacy-compat/decorators/api-exclude.decorator.d.mts +28 -0
- package/dist/src/legacy-compat/decorators/api-exclude.decorator.d.mts.map +1 -0
- package/dist/src/legacy-compat/decorators/api-operation.decorator.d.mts +60 -0
- package/dist/src/legacy-compat/decorators/api-operation.decorator.d.mts.map +1 -0
- package/dist/src/legacy-compat/decorators/api-security.decorator.d.mts +38 -0
- package/dist/src/legacy-compat/decorators/api-security.decorator.d.mts.map +1 -0
- package/dist/src/legacy-compat/decorators/api-stream.decorator.d.mts +52 -0
- package/dist/src/legacy-compat/decorators/api-stream.decorator.d.mts.map +1 -0
- package/dist/src/legacy-compat/decorators/api-summary.decorator.d.mts +26 -0
- package/dist/src/legacy-compat/decorators/api-summary.decorator.d.mts.map +1 -0
- package/dist/src/legacy-compat/decorators/api-tag.decorator.d.mts +44 -0
- package/dist/src/legacy-compat/decorators/api-tag.decorator.d.mts.map +1 -0
- package/dist/src/legacy-compat/decorators/index.d.mts +8 -0
- package/dist/src/legacy-compat/decorators/index.d.mts.map +1 -0
- package/dist/src/legacy-compat/index.d.mts +24 -0
- package/dist/src/legacy-compat/index.d.mts.map +1 -0
- package/dist/src/services/endpoint-scanner.service.d.mts +2 -2
- package/dist/src/services/endpoint-scanner.service.d.mts.map +1 -1
- package/dist/src/services/path-builder.service.d.mts +13 -1
- package/dist/src/services/path-builder.service.d.mts.map +1 -1
- package/dist/tsconfig.lib.tsbuildinfo +1 -1
- package/dist/tsconfig.spec.tsbuildinfo +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/vitest.config.d.mts.map +1 -1
- package/lib/index-COmVnnSM.d.mts +606 -0
- package/lib/index-COmVnnSM.d.mts.map +1 -0
- package/lib/index-Dz-4huer.d.cts +606 -0
- package/lib/index-Dz-4huer.d.cts.map +1 -0
- package/lib/index.cjs +20 -1840
- package/lib/index.cjs.map +1 -1
- package/lib/index.d.cts +2 -594
- package/lib/index.d.mts +2 -594
- package/lib/index.mjs +2 -1822
- package/lib/index.mjs.map +1 -1
- package/lib/legacy-compat/index.cjs +314 -0
- package/lib/legacy-compat/index.cjs.map +1 -0
- package/lib/legacy-compat/index.d.cts +285 -0
- package/lib/legacy-compat/index.d.cts.map +1 -0
- package/lib/legacy-compat/index.d.mts +285 -0
- package/lib/legacy-compat/index.d.mts.map +1 -0
- package/lib/legacy-compat/index.mjs +271 -0
- package/lib/legacy-compat/index.mjs.map +1 -0
- package/lib/services-B16xN1Kh.cjs +1928 -0
- package/lib/services-B16xN1Kh.cjs.map +1 -0
- package/lib/services-B7UR1D1X.mjs +1857 -0
- package/lib/services-B7UR1D1X.mjs.map +1 -0
- package/package.json +15 -5
- package/src/legacy-compat/__type-tests__/legacy-decorators.spec-d.mts +347 -0
- package/src/legacy-compat/__type-tests__/tsconfig.json +15 -0
- package/src/legacy-compat/decorators/api-deprecated.decorator.mts +46 -0
- package/src/legacy-compat/decorators/api-exclude.decorator.mts +31 -0
- package/src/legacy-compat/decorators/api-operation.decorator.mts +60 -0
- package/src/legacy-compat/decorators/api-security.decorator.mts +45 -0
- package/src/legacy-compat/decorators/api-stream.decorator.mts +56 -0
- package/src/legacy-compat/decorators/api-summary.decorator.mts +34 -0
- package/src/legacy-compat/decorators/api-tag.decorator.mts +52 -0
- package/src/legacy-compat/decorators/index.mts +7 -0
- package/src/legacy-compat/index.mts +58 -0
- package/src/services/endpoint-scanner.service.mts +14 -8
- package/src/services/path-builder.service.mts +85 -27
- package/tsconfig.spec.json +4 -1
- package/tsdown.config.mts +2 -2
- package/vitest.config.mts +5 -1
- package/lib/index.d.cts.map +0 -1
- 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 {
|
|
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:
|
|
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 (
|
|
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
|
|
117
|
+
config: handler.config as EndpointOptions | BaseEndpointOptions,
|
|
112
118
|
openApiMetadata,
|
|
113
119
|
})
|
|
114
120
|
}
|
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
import type {
|
|
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 '
|
|
115
|
+
return 'unknown'
|
|
109
116
|
}
|
|
110
117
|
|
|
111
118
|
/**
|
|
112
119
|
* Builds OpenAPI parameters from endpoint config
|
|
113
120
|
*/
|
|
114
|
-
private buildParameters(config:
|
|
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:
|
|
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:
|
|
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:
|
|
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)
|
|
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.
|
|
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:
|
|
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
|
-
|
|
258
|
-
|
|
259
|
-
description: 'Successful response',
|
|
260
|
-
},
|
|
300
|
+
responses[successCode] = {
|
|
301
|
+
description: 'Successful response',
|
|
261
302
|
}
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
|
|
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
|
-
|
|
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
|
/**
|
package/tsconfig.spec.json
CHANGED
|
@@ -3,10 +3,13 @@
|
|
|
3
3
|
"compilerOptions": {
|
|
4
4
|
"outDir": "./dist"
|
|
5
5
|
},
|
|
6
|
-
"include": ["src/**/*.spec.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: [
|
|
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
|
})
|
package/lib/index.d.cts.map
DELETED
|
@@ -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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"}
|
package/lib/index.d.mts.map
DELETED
|
@@ -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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"}
|