@fluojs/openapi 1.0.0-beta.1

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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 fluo contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.ko.md ADDED
@@ -0,0 +1,106 @@
1
+ # @fluojs/openapi
2
+
3
+ <p><a href="./README.md"><kbd>English</kbd></a> <strong><kbd>한국어</kbd></strong></p>
4
+
5
+ fluo를 위한 데코레이터 기반 OpenAPI 3.1.0 문서 생성 패키지입니다. 별도의 수동 동기화 없이 API 문서를 자동으로 생성하고 제공하며, 선택적으로 Swagger UI를 지원합니다.
6
+
7
+ ## 목차
8
+
9
+ - [설치](#설치)
10
+ - [사용 시점](#사용-시점)
11
+ - [빠른 시작](#빠른-시작)
12
+ - [핵심 기능](#핵심-기능)
13
+ - [공개 API](#공개-api)
14
+ - [관련 패키지](#관련-패키지)
15
+ - [예제 소스](#예제-소스)
16
+
17
+ ## 설치
18
+
19
+ ```bash
20
+ pnpm add @fluojs/openapi
21
+ ```
22
+
23
+ ## 사용 시점
24
+
25
+ - **Swagger UI**를 사용하여 REST API에 대한 대화형 문서를 제공하고 싶을 때.
26
+ - 클라이언트 생성 또는 테스트를 위해 기계 읽기 가능한 **OpenAPI 3.1.0** 명세가 필요할 때.
27
+ - 표준 데코레이터를 사용하여 API 문서와 코드를 동기화된 상태로 유지하고 싶을 때.
28
+ - DTO 및 검증 메타데이터를 사용하여 복잡한 요청/응답 모델을 문서화해야 할 때.
29
+
30
+ ## 빠른 시작
31
+
32
+ `OpenApiModule`을 등록하고 `sources`(또는 미리 만든 `descriptors`)를 전달해 문서에 포함할 HTTP 핸들러를 명시합니다.
33
+
34
+ ```typescript
35
+ import { Controller, Get } from '@fluojs/http';
36
+ import { Module } from '@fluojs/core';
37
+ import { bootstrapNodeApplication } from '@fluojs/runtime/node';
38
+ import { OpenApiModule, ApiOperation, ApiResponse, ApiTag } from '@fluojs/openapi';
39
+
40
+ @ApiTag('Users')
41
+ @Controller('/users')
42
+ class UsersController {
43
+ @ApiOperation({ summary: '전체 사용자 목록 조회' })
44
+ @ApiResponse(200, { description: '성공' })
45
+ @Get('/')
46
+ list() {
47
+ return [];
48
+ }
49
+ }
50
+
51
+ @Module({
52
+ imports: [
53
+ OpenApiModule.forRoot({
54
+ sources: [{ controllerToken: UsersController }],
55
+ title: 'My API',
56
+ version: '1.0.0',
57
+ ui: true, // /docs에서 Swagger UI 활성화
58
+ })
59
+ ],
60
+ controllers: [UsersController]
61
+ })
62
+ class AppModule {}
63
+
64
+ const app = await bootstrapNodeApplication(AppModule);
65
+ await app.listen(3000);
66
+ // OpenAPI JSON: http://localhost:3000/openapi.json
67
+ // Swagger UI: http://localhost:3000/docs
68
+ ```
69
+
70
+ 컨트롤러 탐색을 직접 건너뛰고 싶다면 `descriptors: createHandlerMapping([...]).descriptors`를 대신 전달할 수 있습니다. `OpenApiModule`은 `@Module({ controllers: [...] })`만으로 핸들러를 자동 추론하지 않습니다.
71
+
72
+ ## 핵심 기능
73
+
74
+ ### 자동 명세 생성
75
+ fluo는 컨트롤러와 메서드를 조사하여 전체 OpenAPI 3.1.0 문서를 작성합니다. 여기에는 경로, 메서드, 파라미터 및 요청 바디가 포함됩니다.
76
+
77
+ ### 통합 DTO 스키마
78
+ `@fluojs/validation`과 원활하게 작동합니다. DTO 클래스는 자동으로 OpenAPI 컴포넌트로 변환되어 적절한 오퍼레이션에서 참조됩니다.
79
+
80
+ ### 버전 관리 지원
81
+ `@fluojs/http`의 URI 기반 버전 관리를 자동으로 처리합니다. OpenAPI 경로에 해결된 버전 경로가 올바르게 반영됩니다.
82
+
83
+ ### 보안 문서화
84
+ `@ApiBearerAuth()` 및 `@ApiSecurity()`를 사용하여 Bearer 토큰이나 API 키와 같은 보안 요구사항을 쉽게 문서화할 수 있습니다.
85
+
86
+ ### 결정적인 Swagger UI 자산
87
+ `ui: true`를 활성화하면 생성되는 `/docs` 페이지는 정확한 `swagger-ui-dist` 버전의 자산을 참조하여 패키지 릴리스마다 동일한 동작을 유지합니다.
88
+
89
+ ## 공개 API
90
+
91
+ - `OpenApiModule`: OpenAPI 통합을 위한 메인 엔트리 포인트.
92
+ - `ApiTag`, `ApiOperation`, `ApiResponse`: 문서화 데코레이터.
93
+ - `ApiBearerAuth`, `ApiSecurity`: 보안 요구사항 데코레이터.
94
+ - `ApiExcludeEndpoint`: 특정 핸들러를 문서화에서 제외.
95
+ - `buildOpenApiDocument`: 프로그래밍 방식의 문서 빌더 (저수준).
96
+
97
+ ## 관련 패키지
98
+
99
+ - `@fluojs/core`: 공유 메타데이터 유틸리티.
100
+ - `@fluojs/http`: 컨트롤러 및 라우팅 통합.
101
+ - `@fluojs/validation`: DTO를 통한 스키마 및 모델 생성.
102
+
103
+ ## 예제 소스
104
+
105
+ - `packages/openapi/src/openapi-module.test.ts`: 통합 테스트 및 사용 예제.
106
+ - `examples/openapi-swagger`: 전체 OpenAPI 애플리케이션 예제.
package/README.md ADDED
@@ -0,0 +1,106 @@
1
+ # @fluojs/openapi
2
+
3
+ <p><strong><kbd>English</kbd></strong> <a href="./README.ko.md"><kbd>한국어</kbd></a></p>
4
+
5
+ Decorator-based OpenAPI 3.1.0 document generation for fluo. Automatically generate and serve your API documentation with zero manual synchronization and optional Swagger UI support.
6
+
7
+ ## Table of Contents
8
+
9
+ - [Installation](#installation)
10
+ - [When to Use](#when-to-use)
11
+ - [Quick Start](#quick-start)
12
+ - [Core Capabilities](#core-capabilities)
13
+ - [Public API](#public-api)
14
+ - [Related Packages](#related-packages)
15
+ - [Example Sources](#example-sources)
16
+
17
+ ## Installation
18
+
19
+ ```bash
20
+ pnpm add @fluojs/openapi
21
+ ```
22
+
23
+ ## When to Use
24
+
25
+ - When you want to provide interactive documentation for your REST API using **Swagger UI**.
26
+ - When you need a machine-readable **OpenAPI 3.1.0** specification for client generation or testing.
27
+ - When you want to keep your API documentation in sync with your code using standard decorators.
28
+ - When you need to document complex request/response models using DTOs and validation metadata.
29
+
30
+ ## Quick Start
31
+
32
+ Register the `OpenApiModule` and pass `sources` (or prebuilt `descriptors`) so the document builder knows which HTTP handlers to include.
33
+
34
+ ```typescript
35
+ import { Controller, Get } from '@fluojs/http';
36
+ import { Module } from '@fluojs/core';
37
+ import { bootstrapNodeApplication } from '@fluojs/runtime/node';
38
+ import { OpenApiModule, ApiOperation, ApiResponse, ApiTag } from '@fluojs/openapi';
39
+
40
+ @ApiTag('Users')
41
+ @Controller('/users')
42
+ class UsersController {
43
+ @ApiOperation({ summary: 'List all users' })
44
+ @ApiResponse(200, { description: 'Success' })
45
+ @Get('/')
46
+ list() {
47
+ return [];
48
+ }
49
+ }
50
+
51
+ @Module({
52
+ imports: [
53
+ OpenApiModule.forRoot({
54
+ sources: [{ controllerToken: UsersController }],
55
+ title: 'My API',
56
+ version: '1.0.0',
57
+ ui: true, // Enable Swagger UI at /docs
58
+ })
59
+ ],
60
+ controllers: [UsersController]
61
+ })
62
+ class AppModule {}
63
+
64
+ const app = await bootstrapNodeApplication(AppModule);
65
+ await app.listen(3000);
66
+ // OpenAPI JSON: http://localhost:3000/openapi.json
67
+ // Swagger UI: http://localhost:3000/docs
68
+ ```
69
+
70
+ If you need to bypass controller discovery, pass `descriptors: createHandlerMapping([...]).descriptors` instead. `OpenApiModule` does not infer handlers from `@Module({ controllers: [...] })` on its own.
71
+
72
+ ## Core Capabilities
73
+
74
+ ### Automated Specification Generation
75
+ fluo inspects your controllers and methods to build a complete OpenAPI 3.1.0 document. This includes paths, methods, parameters, and request bodies.
76
+
77
+ ### Integrated DTO Schemas
78
+ Works seamlessly with `@fluojs/validation`. Your DTO classes are automatically converted to OpenAPI components and referenced in the appropriate operations.
79
+
80
+ ### Versioning Support
81
+ Handles URI-based versioning from `@fluojs/http` automatically. Your OpenAPI paths will correctly reflect the resolved versioned routes.
82
+
83
+ ### Security Documentation
84
+ Easily document authentication requirements like Bearer tokens or API keys using `@ApiBearerAuth()` and `@ApiSecurity()`.
85
+
86
+ ### Deterministic Swagger UI Assets
87
+ When `ui: true` is enabled, the generated `/docs` page references an exact `swagger-ui-dist` asset version so release behavior stays deterministic across package updates.
88
+
89
+ ## Public API
90
+
91
+ - `OpenApiModule`: Main entry point for OpenAPI integration.
92
+ - `ApiTag`, `ApiOperation`, `ApiResponse`: Documentation decorators.
93
+ - `ApiBearerAuth`, `ApiSecurity`: Security requirement decorators.
94
+ - `ApiExcludeEndpoint`: Omit specific handlers from documentation.
95
+ - `buildOpenApiDocument`: Programmatic document builder (low-level).
96
+
97
+ ## Related Packages
98
+
99
+ - `@fluojs/core`: Shared metadata utilities.
100
+ - `@fluojs/http`: Controller and routing integration.
101
+ - `@fluojs/validation`: Schema and model generation from DTOs.
102
+
103
+ ## Example Sources
104
+
105
+ - `packages/openapi/src/openapi-module.test.ts`: Integration tests and usage examples.
106
+ - `examples/openapi-swagger`: Complete OpenAPI application example.
@@ -0,0 +1,192 @@
1
+ import { type Constructor, type MetadataPropertyKey } from '@fluojs/core';
2
+ import type { OpenApiSchemaObject } from './schema-builder.js';
3
+ /**
4
+ * User-facing operation metadata accepted by `@ApiOperation(...)`.
5
+ */
6
+ export interface ApiOperationOptions {
7
+ summary?: string;
8
+ description?: string;
9
+ deprecated?: boolean;
10
+ }
11
+ /**
12
+ * User-facing response metadata accepted by `@ApiResponse(...)`.
13
+ */
14
+ export interface ApiResponseOptions {
15
+ status: number;
16
+ description?: string;
17
+ schema?: OpenApiSchemaObject;
18
+ type?: Constructor;
19
+ }
20
+ /**
21
+ * User-facing parameter metadata accepted by `@ApiParam(...)`, `@ApiQuery(...)`, `@ApiHeader(...)`, and `@ApiCookie(...)`.
22
+ */
23
+ export interface ApiParameterOptions {
24
+ description?: string;
25
+ required?: boolean;
26
+ schema?: OpenApiSchemaObject;
27
+ }
28
+ /**
29
+ * User-facing request-body metadata accepted by `@ApiBody(...)`.
30
+ */
31
+ export interface ApiBodyOptions {
32
+ description?: string;
33
+ required?: boolean;
34
+ schema?: OpenApiSchemaObject;
35
+ content?: Record<string, {
36
+ schema: OpenApiSchemaObject;
37
+ }>;
38
+ }
39
+ /**
40
+ * Normalized operation metadata stored on controller methods.
41
+ */
42
+ export interface ApiOperationMetadata {
43
+ summary?: string;
44
+ description?: string;
45
+ deprecated?: boolean;
46
+ }
47
+ /**
48
+ * Stored OpenAPI security requirement metadata for a single operation.
49
+ */
50
+ export interface ApiSecurityRequirementMetadata {
51
+ [scheme: string]: string[];
52
+ }
53
+ /**
54
+ * Normalized response metadata stored on controller methods.
55
+ */
56
+ export interface ApiResponseMetadata {
57
+ status: number;
58
+ description?: string;
59
+ schema?: OpenApiSchemaObject;
60
+ type?: Constructor;
61
+ }
62
+ /**
63
+ * Normalized parameter metadata stored on controller methods.
64
+ */
65
+ export interface ApiParameterMetadata {
66
+ name: string;
67
+ in: 'cookie' | 'header' | 'path' | 'query';
68
+ description?: string;
69
+ required?: boolean;
70
+ schema?: OpenApiSchemaObject;
71
+ }
72
+ /**
73
+ * Normalized request-body metadata stored on controller methods.
74
+ */
75
+ export interface ApiBodyMetadata {
76
+ description?: string;
77
+ required?: boolean;
78
+ schema?: OpenApiSchemaObject;
79
+ content?: Record<string, {
80
+ schema: OpenApiSchemaObject;
81
+ }>;
82
+ }
83
+ /**
84
+ * Aggregated OpenAPI metadata snapshot for a controller method.
85
+ */
86
+ export interface MethodApiMetadata {
87
+ operation?: ApiOperationMetadata;
88
+ responses: ApiResponseMetadata[];
89
+ parameters?: ApiParameterMetadata[];
90
+ requestBody?: ApiBodyMetadata;
91
+ security?: string[];
92
+ securityRequirements?: ApiSecurityRequirementMetadata[];
93
+ excludeEndpoint?: boolean;
94
+ }
95
+ /**
96
+ * Read tags registered via `@ApiTag` on a controller class.
97
+ *
98
+ * @param target Controller class token.
99
+ * @returns A defensive copy of registered tags, or `undefined` when no tags are present.
100
+ */
101
+ export declare function getControllerTags(target: Function): string[] | undefined;
102
+ /**
103
+ * Read OpenAPI metadata registered for a controller method.
104
+ *
105
+ * @param target Controller class token.
106
+ * @param propertyKey Controller method key to inspect.
107
+ * @returns A defensive metadata snapshot, or `undefined` when the method has no OpenAPI metadata.
108
+ */
109
+ export declare function getMethodApiMetadata(target: Function, propertyKey: MetadataPropertyKey): MethodApiMetadata | undefined;
110
+ type ClassDecoratorFn = (value: Function, context: ClassDecoratorContext) => void;
111
+ type MethodDecoratorFn = (value: Function, context: ClassMethodDecoratorContext) => void;
112
+ /**
113
+ * Attach an OpenAPI tag to a controller class.
114
+ *
115
+ * Multiple tags can be declared by stacking `@ApiTag(...)` decorators.
116
+ *
117
+ * @param tag Tag label appended to the controller-level tag list.
118
+ * @returns A class decorator that stores controller tag metadata.
119
+ */
120
+ export declare function ApiTag(tag: string): ClassDecoratorFn;
121
+ /**
122
+ * Describe a controller method's OpenAPI operation metadata.
123
+ *
124
+ * @param options Operation metadata such as summary, description, and deprecation flag.
125
+ * @returns A method decorator that stores operation metadata.
126
+ */
127
+ export declare function ApiOperation(options: ApiOperationOptions): MethodDecoratorFn;
128
+ /**
129
+ * Exclude a controller method from generated OpenAPI `paths`.
130
+ *
131
+ * @returns A method decorator that marks the endpoint as excluded.
132
+ */
133
+ export declare function ApiExcludeEndpoint(): MethodDecoratorFn;
134
+ /**
135
+ * Add a security requirement to a controller method in the generated OpenAPI document.
136
+ *
137
+ * @param name Security scheme name (for example `bearerAuth`, `oauth2`, `apiKey`).
138
+ * @param scopes Optional OAuth scopes associated with this security requirement.
139
+ * @returns A method decorator that appends security metadata.
140
+ */
141
+ export declare function ApiSecurity(name: string, scopes?: string[]): MethodDecoratorFn;
142
+ /**
143
+ * Declare a path parameter for a controller method.
144
+ *
145
+ * @param name Parameter name.
146
+ * @param options Optional parameter metadata such as description, required, and schema.
147
+ * @returns A method decorator that appends path-parameter metadata.
148
+ */
149
+ export declare function ApiParam(name: string, options?: ApiParameterOptions): MethodDecoratorFn;
150
+ /**
151
+ * Declare a query parameter for a controller method.
152
+ *
153
+ * @param name Parameter name.
154
+ * @param options Optional parameter metadata such as description, required, and schema.
155
+ * @returns A method decorator that appends query-parameter metadata.
156
+ */
157
+ export declare function ApiQuery(name: string, options?: ApiParameterOptions): MethodDecoratorFn;
158
+ /**
159
+ * Declare a header parameter for a controller method.
160
+ *
161
+ * @param name Parameter name.
162
+ * @param options Optional parameter metadata such as description, required, and schema.
163
+ * @returns A method decorator that appends header-parameter metadata.
164
+ */
165
+ export declare function ApiHeader(name: string, options?: ApiParameterOptions): MethodDecoratorFn;
166
+ /**
167
+ * Declare a cookie parameter for a controller method.
168
+ *
169
+ * @param name Parameter name.
170
+ * @param options Optional parameter metadata such as description, required, and schema.
171
+ * @returns A method decorator that appends cookie-parameter metadata.
172
+ */
173
+ export declare function ApiCookie(name: string, options?: ApiParameterOptions): MethodDecoratorFn;
174
+ /**
175
+ * Declare an explicit request body for a controller method.
176
+ *
177
+ * @param options Request-body metadata and schema/content declarations.
178
+ * @returns A method decorator that stores request-body metadata.
179
+ */
180
+ export declare function ApiBody(options: ApiBodyOptions): MethodDecoratorFn;
181
+ /** Declare an expected HTTP response for a controller method. */
182
+ export declare function ApiResponse(status: number, options?: Omit<ApiResponseOptions, 'status'>): MethodDecoratorFn;
183
+ /** Declare an expected HTTP response for a controller method. */
184
+ export declare function ApiResponse(options: ApiResponseOptions): MethodDecoratorFn;
185
+ /**
186
+ * Mark a controller method as requiring Bearer token authentication in the OpenAPI spec.
187
+ *
188
+ * @returns A method decorator equivalent to `ApiSecurity('bearerAuth')`.
189
+ */
190
+ export declare function ApiBearerAuth(): MethodDecoratorFn;
191
+ export {};
192
+ //# sourceMappingURL=decorators.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decorators.d.ts","sourceRoot":"","sources":["../src/decorators.ts"],"names":[],"mappings":"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"}