@furystack/rest-service 12.2.0 → 12.3.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.
- package/CHANGELOG.md +44 -0
- package/esm/api-manager.d.ts +1 -1
- package/esm/api-manager.d.ts.map +1 -1
- package/esm/api-manager.js +3 -2
- package/esm/api-manager.js.map +1 -1
- package/esm/endpoint-generators/create-get-openapi-document-action.d.ts +29 -0
- package/esm/endpoint-generators/create-get-openapi-document-action.d.ts.map +1 -0
- package/esm/endpoint-generators/create-get-openapi-document-action.js +61 -0
- package/esm/endpoint-generators/create-get-openapi-document-action.js.map +1 -0
- package/esm/endpoint-generators/index.d.ts +2 -0
- package/esm/endpoint-generators/index.d.ts.map +1 -1
- package/esm/endpoint-generators/index.js +2 -0
- package/esm/endpoint-generators/index.js.map +1 -1
- package/esm/endpoint-generators/with-schema-and-openapi-action.d.ts +23 -0
- package/esm/endpoint-generators/with-schema-and-openapi-action.d.ts.map +1 -0
- package/esm/endpoint-generators/with-schema-and-openapi-action.js +2 -0
- package/esm/endpoint-generators/with-schema-and-openapi-action.js.map +1 -0
- package/esm/openapi/auth-provider-to-security-scheme.d.ts +14 -0
- package/esm/openapi/auth-provider-to-security-scheme.d.ts.map +1 -0
- package/esm/openapi/auth-provider-to-security-scheme.js +35 -0
- package/esm/openapi/auth-provider-to-security-scheme.js.map +1 -0
- package/esm/openapi/auth-provider-to-security-scheme.spec.d.ts +2 -0
- package/esm/openapi/auth-provider-to-security-scheme.spec.d.ts.map +1 -0
- package/esm/openapi/auth-provider-to-security-scheme.spec.js +42 -0
- package/esm/openapi/auth-provider-to-security-scheme.spec.js.map +1 -0
- package/esm/openapi/generate-openapi-document.d.ts +21 -0
- package/esm/openapi/generate-openapi-document.d.ts.map +1 -0
- package/esm/openapi/generate-openapi-document.js +144 -0
- package/esm/openapi/generate-openapi-document.js.map +1 -0
- package/esm/openapi/generate-openapi-document.spec.d.ts +2 -0
- package/esm/openapi/generate-openapi-document.spec.d.ts.map +1 -0
- package/esm/openapi/generate-openapi-document.spec.js +643 -0
- package/esm/openapi/generate-openapi-document.spec.js.map +1 -0
- package/esm/openapi/openapi-round-trip.advanced-api.json +363 -0
- package/esm/openapi/openapi-round-trip.crud-api.json +115 -0
- package/esm/openapi/openapi-round-trip.example-api.json +71 -0
- package/esm/openapi/openapi-round-trip.spec.d.ts +2 -0
- package/esm/openapi/openapi-round-trip.spec.d.ts.map +1 -0
- package/esm/openapi/openapi-round-trip.spec.js +525 -0
- package/esm/openapi/openapi-round-trip.spec.js.map +1 -0
- package/esm/swagger/generate-swagger-json.spec.js +1 -1
- package/esm/swagger/generate-swagger-json.spec.js.map +1 -1
- package/esm/validate.integration.spec.js +153 -32
- package/esm/validate.integration.spec.js.map +1 -1
- package/package.json +9 -9
- package/src/api-manager.ts +7 -3
- package/src/endpoint-generators/create-get-openapi-document-action.ts +96 -0
- package/src/endpoint-generators/index.ts +2 -0
- package/src/endpoint-generators/with-schema-and-openapi-action.ts +14 -0
- package/src/openapi/auth-provider-to-security-scheme.spec.ts +50 -0
- package/src/openapi/auth-provider-to-security-scheme.ts +41 -0
- package/src/openapi/generate-openapi-document.spec.ts +733 -0
- package/src/openapi/generate-openapi-document.ts +198 -0
- package/src/openapi/openapi-round-trip.advanced-api.json +363 -0
- package/src/openapi/openapi-round-trip.crud-api.json +115 -0
- package/src/openapi/openapi-round-trip.example-api.json +71 -0
- package/src/openapi/openapi-round-trip.spec.ts +621 -0
- package/src/swagger/generate-swagger-json.spec.ts +1 -1
- package/src/validate.integration.spec.ts +184 -33
- package/esm/endpoint-generators/create-get-swagger-json-action.d.ts +0 -14
- package/esm/endpoint-generators/create-get-swagger-json-action.d.ts.map +0 -1
- package/esm/endpoint-generators/create-get-swagger-json-action.js +0 -18
- package/esm/endpoint-generators/create-get-swagger-json-action.js.map +0 -1
- package/esm/endpoint-generators/with-schema-and-swagger-action.d.ts +0 -21
- package/esm/endpoint-generators/with-schema-and-swagger-action.d.ts.map +0 -1
- package/esm/endpoint-generators/with-schema-and-swagger-action.js +0 -2
- package/esm/endpoint-generators/with-schema-and-swagger-action.js.map +0 -1
- package/esm/swagger/generate-swagger-json.d.ts +0 -14
- package/esm/swagger/generate-swagger-json.d.ts.map +0 -1
- package/esm/swagger/generate-swagger-json.js +0 -108
- package/esm/swagger/generate-swagger-json.js.map +0 -1
- package/src/endpoint-generators/create-get-swagger-json-action.ts +0 -26
- package/src/endpoint-generators/with-schema-and-swagger-action.ts +0 -11
- package/src/swagger/generate-swagger-json.ts +0 -132
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,49 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [12.3.0] - 2026-03-07
|
|
4
|
+
|
|
5
|
+
### ⬆️ Dependencies
|
|
6
|
+
|
|
7
|
+
- Updated `@types/node` from `^25.3.1` to `^25.3.5`
|
|
8
|
+
|
|
9
|
+
### 🗑️ Deprecated
|
|
10
|
+
|
|
11
|
+
- `generateSwaggerJsonFromApiSchema` - Use `generateOpenApiDocument` instead
|
|
12
|
+
- `CreateGetSwaggerJsonAction` - Use `CreateGetOpenApiDocumentAction` instead
|
|
13
|
+
- `WithSchemaAndSwaggerAction` - Use `WithSchemaAndOpenApiAction` instead
|
|
14
|
+
|
|
15
|
+
### ✨ Features
|
|
16
|
+
|
|
17
|
+
### OpenAPI Document Generation with Metadata
|
|
18
|
+
|
|
19
|
+
- Added `generateOpenApiDocument()` - Replaces `generateSwaggerJsonFromApiSchema` with enhanced output. Now extracts request body, query parameter, and header parameter schemas from `Validate()` wrappers. Accepts a `metadata` parameter to emit document-level metadata (servers, tags, contact, license, externalDocs, securitySchemes) and operation-level metadata (tags, deprecated, summary, description).
|
|
20
|
+
|
|
21
|
+
- Added `CreateGetOpenApiDocumentAction` - Replaces `CreateGetSwaggerJsonAction`, serves the generated OpenAPI document at `/openapi.json`
|
|
22
|
+
|
|
23
|
+
- Added `WithSchemaAndOpenApiAction<T>` - Replaces `WithSchemaAndSwaggerAction<T>`, extending a `RestApi` with `/schema` and `/openapi.json` endpoints
|
|
24
|
+
|
|
25
|
+
### Metadata Round-Trip
|
|
26
|
+
|
|
27
|
+
Operation-level `tags`, `deprecated`, `summary`, and `description` from the `ApiEndpointDefinition` are now emitted into the generated OpenAPI document. When combined with `openApiToSchema()` from `@furystack/rest`, these fields survive the full round-trip.
|
|
28
|
+
|
|
29
|
+
### ♻️ Refactoring
|
|
30
|
+
|
|
31
|
+
- Renamed `swagger/generate-swagger-json.ts` to `openapi/generate-openapi-document.ts` with backward-compatible re-exports
|
|
32
|
+
- Changed the auto-registered schema endpoint from `/swagger.json` to `/openapi.json` in `ApiManager`
|
|
33
|
+
|
|
34
|
+
### 🧪 Tests
|
|
35
|
+
|
|
36
|
+
- Unit tests for `generateOpenApiDocument()` covering all HTTP methods (including HEAD, OPTIONS, TRACE, CONNECT), path/query/header parameter extraction, request body extraction, security, and operation metadata emission
|
|
37
|
+
- Round-trip integration tests importing OpenAPI JSON fixtures (basic example API, CRUD API, and advanced Pet Store API) and verifying structural fidelity through the `openApiToSchema() -> generateOpenApiDocument()` pipeline
|
|
38
|
+
- Type-level tests for `OpenApiToRestApi` with the advanced fixture covering `$ref` resolution, `allOf` composition, path parameters, request body extraction, and metadata
|
|
39
|
+
- Updated `validate.integration.spec.ts` to use the new `/openapi.json` endpoint
|
|
40
|
+
|
|
41
|
+
## [12.2.1] - 2026-03-06
|
|
42
|
+
|
|
43
|
+
### ⬆️ Dependencies
|
|
44
|
+
|
|
45
|
+
- Updated internal FuryStack dependencies
|
|
46
|
+
|
|
3
47
|
## [12.2.0] - 2026-03-03
|
|
4
48
|
|
|
5
49
|
### ✨ Features
|
package/esm/api-manager.d.ts
CHANGED
|
@@ -45,7 +45,7 @@ export interface ImplementApiOptions<T extends RestApi> {
|
|
|
45
45
|
deserializeQueryParams?: (param: string) => any;
|
|
46
46
|
/**
|
|
47
47
|
* Adds an additional 'GET /schema' endpoint that returns the schema definitions of the API.
|
|
48
|
-
* Also adds a 'GET /
|
|
48
|
+
* Also adds a 'GET /openapi.json' endpoint that returns the API schema in OpenAPI 3.1 format.
|
|
49
49
|
*/
|
|
50
50
|
enableGetSchema?: boolean;
|
|
51
51
|
/**
|
package/esm/api-manager.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-manager.d.ts","sourceRoot":"","sources":["../src/api-manager.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAEjD,OAAO,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AAGtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"api-manager.d.ts","sourceRoot":"","sources":["../src/api-manager.ts"],"names":[],"mappings":"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"}
|
package/esm/api-manager.js
CHANGED
|
@@ -16,7 +16,7 @@ import { ErrorAction } from './actions/error-action.js';
|
|
|
16
16
|
import { NotFoundAction } from './actions/not-found-action.js';
|
|
17
17
|
import { addCorsHeaders } from './add-cors-header.js';
|
|
18
18
|
import { CreateGetSchemaAction } from './endpoint-generators/create-get-schema-action.js';
|
|
19
|
-
import {
|
|
19
|
+
import { CreateGetOpenApiDocumentAction, CreateDeprecatedSwaggerRedirect, } from './endpoint-generators/create-get-openapi-document-action.js';
|
|
20
20
|
import { HttpUserContext } from './http-user-context.js';
|
|
21
21
|
import { readPostBody } from './read-post-body.js';
|
|
22
22
|
import { ServerManager } from './server-manager.js';
|
|
@@ -46,7 +46,8 @@ let ApiManager = class ApiManager {
|
|
|
46
46
|
GET: {
|
|
47
47
|
...api.GET,
|
|
48
48
|
'/schema': CreateGetSchemaAction(api, name, description, version),
|
|
49
|
-
'/
|
|
49
|
+
'/openapi.json': CreateGetOpenApiDocumentAction(api, name, description, version),
|
|
50
|
+
'/swagger.json': CreateDeprecatedSwaggerRedirect(api, name, description, version),
|
|
50
51
|
},
|
|
51
52
|
}
|
|
52
53
|
: api;
|
package/esm/api-manager.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-manager.js","sourceRoot":"","sources":["../src/api-manager.ts"],"names":[],"mappings":";;;;;;;;;AACA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAEjD,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAExD,OAAO,EAAE,YAAY,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAA;AACtE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAEzD,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAA;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAA;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,mDAAmD,CAAA;AACzF,OAAO,
|
|
1
|
+
{"version":3,"file":"api-manager.js","sourceRoot":"","sources":["../src/api-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { OpenApiDocument, RestApi } from '@furystack/rest';
|
|
2
|
+
import type { RestApiImplementation } from '../api-manager.js';
|
|
3
|
+
import { type RequestAction } from '../request-action-implementation.js';
|
|
4
|
+
/**
|
|
5
|
+
* Generates a RequestAction that retrieves the OpenAPI document from a FuryStack API implementation.
|
|
6
|
+
* When authentication providers are configured (via `useHttpAuthentication` / `useJwtAuthentication`),
|
|
7
|
+
* the generated document will include matching OpenAPI security schemes automatically.
|
|
8
|
+
*
|
|
9
|
+
* @param api - The API implementation from which to extract the schema.
|
|
10
|
+
* @returns A RequestAction that handles the GET request for the OpenAPI document.
|
|
11
|
+
*/
|
|
12
|
+
export declare const CreateGetOpenApiDocumentAction: <T extends RestApiImplementation<RestApi>>(api: T, name?: string, description?: string, version?: string) => RequestAction<{
|
|
13
|
+
result: OpenApiDocument;
|
|
14
|
+
}>;
|
|
15
|
+
/**
|
|
16
|
+
* Generates a backward-compatible `/swagger.json` endpoint that serves the same OpenAPI document
|
|
17
|
+
* as `CreateGetOpenApiDocumentAction` but includes `Deprecation` and `Link` headers
|
|
18
|
+
* directing clients to use `/openapi.json` instead.
|
|
19
|
+
*
|
|
20
|
+
* @deprecated Use CreateGetOpenApiDocumentAction and `/openapi.json` instead.
|
|
21
|
+
*/
|
|
22
|
+
export declare const CreateDeprecatedSwaggerRedirect: <T extends RestApiImplementation<RestApi>>(api: T, name?: string, description?: string, version?: string) => RequestAction<{
|
|
23
|
+
result: OpenApiDocument;
|
|
24
|
+
}>;
|
|
25
|
+
/** @deprecated Use CreateGetOpenApiDocumentAction instead */
|
|
26
|
+
export declare const CreateGetSwaggerJsonAction: <T extends RestApiImplementation<RestApi>>(api: T, name?: string, description?: string, version?: string) => RequestAction<{
|
|
27
|
+
result: OpenApiDocument;
|
|
28
|
+
}>;
|
|
29
|
+
//# sourceMappingURL=create-get-openapi-document-action.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-get-openapi-document-action.d.ts","sourceRoot":"","sources":["../../src/endpoint-generators/create-get-openapi-document-action.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAuB,eAAe,EAAE,OAAO,EAAwB,MAAM,iBAAiB,CAAA;AAE1G,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAA;AAK9D,OAAO,EAAc,KAAK,aAAa,EAAE,MAAM,qCAAqC,CAAA;AAsBpF;;;;;;;GAOG;AACH,eAAO,MAAM,8BAA8B,GAAI,CAAC,SAAS,qBAAqB,CAAC,OAAO,CAAC,EACrF,KAAK,CAAC,EACN,aAAsB,EACtB,oBAAqE,EACrE,gBAAiB,KAChB,aAAa,CAAC;IAAE,MAAM,EAAE,eAAe,CAAA;CAAE,CAgB3C,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,+BAA+B,GAAI,CAAC,SAAS,qBAAqB,CAAC,OAAO,CAAC,EACtF,KAAK,CAAC,EACN,aAAsB,EACtB,oBAAqE,EACrE,gBAAiB,KAChB,aAAa,CAAC;IAAE,MAAM,EAAE,eAAe,CAAA;CAAE,CAmB3C,CAAA;AAED,6DAA6D;AAC7D,eAAO,MAAM,0BAA0B,GAzDQ,CAAC,SAAS,qBAAqB,CAAC,OAAO,CAAC,OAChF,CAAC,4DAIL,aAAa,CAAC;IAAE,MAAM,EAAE,eAAe,CAAA;CAAE,CAoD4B,CAAA"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { getSchemaFromApi } from '../get-schema-from-api.js';
|
|
2
|
+
import { HttpAuthenticationSettings } from '../http-authentication-settings.js';
|
|
3
|
+
import { mapProvidersToSecuritySchemes } from '../openapi/auth-provider-to-security-scheme.js';
|
|
4
|
+
import { generateOpenApiDocument } from '../openapi/generate-openapi-document.js';
|
|
5
|
+
import { JsonResult } from '../request-action-implementation.js';
|
|
6
|
+
const getSecuritySchemesFromInjector = (injector) => {
|
|
7
|
+
try {
|
|
8
|
+
const settings = injector.getInstance(HttpAuthenticationSettings);
|
|
9
|
+
if (settings.authenticationProviders.length > 0) {
|
|
10
|
+
return mapProvidersToSecuritySchemes(settings.authenticationProviders);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
/* auth not configured */
|
|
15
|
+
}
|
|
16
|
+
return undefined;
|
|
17
|
+
};
|
|
18
|
+
const buildOpenApiDoc = (endpoints, name, description, version, metadata) => generateOpenApiDocument({ api: endpoints, title: name, description, version, metadata });
|
|
19
|
+
/**
|
|
20
|
+
* Generates a RequestAction that retrieves the OpenAPI document from a FuryStack API implementation.
|
|
21
|
+
* When authentication providers are configured (via `useHttpAuthentication` / `useJwtAuthentication`),
|
|
22
|
+
* the generated document will include matching OpenAPI security schemes automatically.
|
|
23
|
+
*
|
|
24
|
+
* @param api - The API implementation from which to extract the schema.
|
|
25
|
+
* @returns A RequestAction that handles the GET request for the OpenAPI document.
|
|
26
|
+
*/
|
|
27
|
+
export const CreateGetOpenApiDocumentAction = (api, name = 'FuryStack API', description = 'API documentation generated from FuryStack API schema', version = '1.0.0') => {
|
|
28
|
+
const { endpoints } = getSchemaFromApi({ api, name, description, version });
|
|
29
|
+
let cachedDoc;
|
|
30
|
+
return async ({ injector }) => {
|
|
31
|
+
if (!cachedDoc) {
|
|
32
|
+
const securitySchemes = getSecuritySchemesFromInjector(injector);
|
|
33
|
+
cachedDoc = buildOpenApiDoc(endpoints, name, description, version, securitySchemes ? { securitySchemes } : undefined);
|
|
34
|
+
}
|
|
35
|
+
return JsonResult(cachedDoc, 200);
|
|
36
|
+
};
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* Generates a backward-compatible `/swagger.json` endpoint that serves the same OpenAPI document
|
|
40
|
+
* as `CreateGetOpenApiDocumentAction` but includes `Deprecation` and `Link` headers
|
|
41
|
+
* directing clients to use `/openapi.json` instead.
|
|
42
|
+
*
|
|
43
|
+
* @deprecated Use CreateGetOpenApiDocumentAction and `/openapi.json` instead.
|
|
44
|
+
*/
|
|
45
|
+
export const CreateDeprecatedSwaggerRedirect = (api, name = 'FuryStack API', description = 'API documentation generated from FuryStack API schema', version = '1.0.0') => {
|
|
46
|
+
const { endpoints } = getSchemaFromApi({ api, name, description, version });
|
|
47
|
+
let cachedDoc;
|
|
48
|
+
return async ({ injector }) => {
|
|
49
|
+
if (!cachedDoc) {
|
|
50
|
+
const securitySchemes = getSecuritySchemesFromInjector(injector);
|
|
51
|
+
cachedDoc = buildOpenApiDoc(endpoints, name, description, version, securitySchemes ? { securitySchemes } : undefined);
|
|
52
|
+
}
|
|
53
|
+
return JsonResult(cachedDoc, 200, {
|
|
54
|
+
Deprecation: 'true',
|
|
55
|
+
Link: '</openapi.json>; rel="successor-version"',
|
|
56
|
+
});
|
|
57
|
+
};
|
|
58
|
+
};
|
|
59
|
+
/** @deprecated Use CreateGetOpenApiDocumentAction instead */
|
|
60
|
+
export const CreateGetSwaggerJsonAction = CreateGetOpenApiDocumentAction;
|
|
61
|
+
//# sourceMappingURL=create-get-openapi-document-action.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-get-openapi-document-action.js","sourceRoot":"","sources":["../../src/endpoint-generators/create-get-openapi-document-action.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
export * from './create-delete-endpoint.js';
|
|
2
2
|
export * from './create-get-collection-endpoint.js';
|
|
3
3
|
export * from './create-get-entity-endpoint.js';
|
|
4
|
+
export * from './create-get-openapi-document-action.js';
|
|
4
5
|
export * from './create-get-schema-action.js';
|
|
5
6
|
export * from './create-patch-endpoint.js';
|
|
6
7
|
export * from './create-post-endpoint.js';
|
|
8
|
+
export * from './with-schema-and-openapi-action.js';
|
|
7
9
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/endpoint-generators/index.ts"],"names":[],"mappings":"AAAA,cAAc,6BAA6B,CAAA;AAC3C,cAAc,qCAAqC,CAAA;AACnD,cAAc,iCAAiC,CAAA;AAC/C,cAAc,+BAA+B,CAAA;AAC7C,cAAc,4BAA4B,CAAA;AAC1C,cAAc,2BAA2B,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/endpoint-generators/index.ts"],"names":[],"mappings":"AAAA,cAAc,6BAA6B,CAAA;AAC3C,cAAc,qCAAqC,CAAA;AACnD,cAAc,iCAAiC,CAAA;AAC/C,cAAc,yCAAyC,CAAA;AACvD,cAAc,+BAA+B,CAAA;AAC7C,cAAc,4BAA4B,CAAA;AAC1C,cAAc,2BAA2B,CAAA;AACzC,cAAc,qCAAqC,CAAA"}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
export * from './create-delete-endpoint.js';
|
|
2
2
|
export * from './create-get-collection-endpoint.js';
|
|
3
3
|
export * from './create-get-entity-endpoint.js';
|
|
4
|
+
export * from './create-get-openapi-document-action.js';
|
|
4
5
|
export * from './create-get-schema-action.js';
|
|
5
6
|
export * from './create-patch-endpoint.js';
|
|
6
7
|
export * from './create-post-endpoint.js';
|
|
8
|
+
export * from './with-schema-and-openapi-action.js';
|
|
7
9
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/endpoint-generators/index.ts"],"names":[],"mappings":"AAAA,cAAc,6BAA6B,CAAA;AAC3C,cAAc,qCAAqC,CAAA;AACnD,cAAc,iCAAiC,CAAA;AAC/C,cAAc,+BAA+B,CAAA;AAC7C,cAAc,4BAA4B,CAAA;AAC1C,cAAc,2BAA2B,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/endpoint-generators/index.ts"],"names":[],"mappings":"AAAA,cAAc,6BAA6B,CAAA;AAC3C,cAAc,qCAAqC,CAAA;AACnD,cAAc,iCAAiC,CAAA;AAC/C,cAAc,yCAAyC,CAAA;AACvD,cAAc,+BAA+B,CAAA;AAC7C,cAAc,4BAA4B,CAAA;AAC1C,cAAc,2BAA2B,CAAA;AACzC,cAAc,qCAAqC,CAAA"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { ApiEndpointSchema, OpenApiDocument, RestApi } from '@furystack/rest';
|
|
2
|
+
/**
|
|
3
|
+
* Extends a RestApi with endpoints for both schema.json and openapi.json
|
|
4
|
+
*/
|
|
5
|
+
export type WithSchemaAndOpenApiAction<T extends RestApi> = T & {
|
|
6
|
+
GET: {
|
|
7
|
+
'/schema': {
|
|
8
|
+
result: ApiEndpointSchema<T>;
|
|
9
|
+
headers: {
|
|
10
|
+
accept: 'application/schema+json';
|
|
11
|
+
};
|
|
12
|
+
};
|
|
13
|
+
'/openapi.json': {
|
|
14
|
+
result: OpenApiDocument;
|
|
15
|
+
headers: {
|
|
16
|
+
accept: 'application/json';
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
};
|
|
21
|
+
/** @deprecated Use WithSchemaAndOpenApiAction instead */
|
|
22
|
+
export type WithSchemaAndSwaggerAction<T extends RestApi> = WithSchemaAndOpenApiAction<T>;
|
|
23
|
+
//# sourceMappingURL=with-schema-and-openapi-action.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"with-schema-and-openapi-action.d.ts","sourceRoot":"","sources":["../../src/endpoint-generators/with-schema-and-openapi-action.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AAElF;;GAEG;AACH,MAAM,MAAM,0BAA0B,CAAC,CAAC,SAAS,OAAO,IAAI,CAAC,GAAG;IAC9D,GAAG,EAAE;QACH,SAAS,EAAE;YAAE,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAAC,CAAC;YAAC,OAAO,EAAE;gBAAE,MAAM,EAAE,yBAAyB,CAAA;aAAE,CAAA;SAAE,CAAA;QAC3F,eAAe,EAAE;YAAE,MAAM,EAAE,eAAe,CAAC;YAAC,OAAO,EAAE;gBAAE,MAAM,EAAE,kBAAkB,CAAA;aAAE,CAAA;SAAE,CAAA;KACtF,CAAA;CACF,CAAA;AAED,yDAAyD;AACzD,MAAM,MAAM,0BAA0B,CAAC,CAAC,SAAS,OAAO,IAAI,0BAA0B,CAAC,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"with-schema-and-openapi-action.js","sourceRoot":"","sources":["../../src/endpoint-generators/with-schema-and-openapi-action.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { SecuritySchemeObject } from '@furystack/rest';
|
|
2
|
+
import type { AuthenticationProvider } from '../authentication-providers/authentication-provider.js';
|
|
3
|
+
/**
|
|
4
|
+
* Maps FuryStack authentication providers to their corresponding OpenAPI security scheme objects.
|
|
5
|
+
* Known provider names (`basic-auth`, `cookie-auth`, `jwt-bearer`) are mapped to standard OpenAPI
|
|
6
|
+
* security schemes. Unknown provider names are silently ignored.
|
|
7
|
+
*
|
|
8
|
+
* Falls back to a default `cookieAuth` scheme if no known providers are found.
|
|
9
|
+
*
|
|
10
|
+
* @param providers - The list of active authentication providers
|
|
11
|
+
* @returns A record of OpenAPI security scheme name to SecuritySchemeObject
|
|
12
|
+
*/
|
|
13
|
+
export declare const mapProvidersToSecuritySchemes: (providers: AuthenticationProvider[]) => Record<string, SecuritySchemeObject>;
|
|
14
|
+
//# sourceMappingURL=auth-provider-to-security-scheme.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-provider-to-security-scheme.d.ts","sourceRoot":"","sources":["../../src/openapi/auth-provider-to-security-scheme.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAA;AAE3D,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,wDAAwD,CAAA;AAiBpG;;;;;;;;;GASG;AACH,eAAO,MAAM,6BAA6B,GACxC,WAAW,sBAAsB,EAAE,KAClC,MAAM,CAAC,MAAM,EAAE,oBAAoB,CASrC,CAAA"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
const PROVIDER_SCHEME_MAP = {
|
|
2
|
+
'basic-auth': {
|
|
3
|
+
schemeName: 'basicAuth',
|
|
4
|
+
scheme: { type: 'http', scheme: 'basic' },
|
|
5
|
+
},
|
|
6
|
+
'cookie-auth': {
|
|
7
|
+
schemeName: 'cookieAuth',
|
|
8
|
+
scheme: { type: 'apiKey', in: 'cookie', name: 'session' },
|
|
9
|
+
},
|
|
10
|
+
'jwt-bearer': {
|
|
11
|
+
schemeName: 'bearerAuth',
|
|
12
|
+
scheme: { type: 'http', scheme: 'bearer', bearerFormat: 'JWT' },
|
|
13
|
+
},
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Maps FuryStack authentication providers to their corresponding OpenAPI security scheme objects.
|
|
17
|
+
* Known provider names (`basic-auth`, `cookie-auth`, `jwt-bearer`) are mapped to standard OpenAPI
|
|
18
|
+
* security schemes. Unknown provider names are silently ignored.
|
|
19
|
+
*
|
|
20
|
+
* Falls back to a default `cookieAuth` scheme if no known providers are found.
|
|
21
|
+
*
|
|
22
|
+
* @param providers - The list of active authentication providers
|
|
23
|
+
* @returns A record of OpenAPI security scheme name to SecuritySchemeObject
|
|
24
|
+
*/
|
|
25
|
+
export const mapProvidersToSecuritySchemes = (providers) => {
|
|
26
|
+
const schemes = {};
|
|
27
|
+
for (const provider of providers) {
|
|
28
|
+
const mapping = PROVIDER_SCHEME_MAP[provider.name];
|
|
29
|
+
if (mapping) {
|
|
30
|
+
schemes[mapping.schemeName] = mapping.scheme;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return Object.keys(schemes).length > 0 ? schemes : { cookieAuth: PROVIDER_SCHEME_MAP['cookie-auth'].scheme };
|
|
34
|
+
};
|
|
35
|
+
//# sourceMappingURL=auth-provider-to-security-scheme.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-provider-to-security-scheme.js","sourceRoot":"","sources":["../../src/openapi/auth-provider-to-security-scheme.ts"],"names":[],"mappings":"AAIA,MAAM,mBAAmB,GAAyE;IAChG,YAAY,EAAE;QACZ,UAAU,EAAE,WAAW;QACvB,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE;KAC1C;IACD,aAAa,EAAE;QACb,UAAU,EAAE,YAAY;QACxB,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE;KAC1D;IACD,YAAY,EAAE;QACZ,UAAU,EAAE,YAAY;QACxB,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK,EAAE;KAChE;CACF,CAAA;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAC3C,SAAmC,EACG,EAAE;IACxC,MAAM,OAAO,GAAyC,EAAE,CAAA;IACxD,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,MAAM,OAAO,GAAG,mBAAmB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;QAClD,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,MAAM,CAAA;QAC9C,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,mBAAmB,CAAC,aAAa,CAAC,CAAC,MAAM,EAAE,CAAA;AAC9G,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-provider-to-security-scheme.spec.d.ts","sourceRoot":"","sources":["../../src/openapi/auth-provider-to-security-scheme.spec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { mapProvidersToSecuritySchemes } from './auth-provider-to-security-scheme.js';
|
|
3
|
+
const createProvider = (name) => ({
|
|
4
|
+
name,
|
|
5
|
+
authenticate: async () => null,
|
|
6
|
+
});
|
|
7
|
+
describe('mapProvidersToSecuritySchemes', () => {
|
|
8
|
+
it('Should map basic-auth to HTTP Basic scheme', () => {
|
|
9
|
+
const result = mapProvidersToSecuritySchemes([createProvider('basic-auth')]);
|
|
10
|
+
expect(result.basicAuth).toEqual({ type: 'http', scheme: 'basic' });
|
|
11
|
+
});
|
|
12
|
+
it('Should map cookie-auth to apiKey cookie scheme', () => {
|
|
13
|
+
const result = mapProvidersToSecuritySchemes([createProvider('cookie-auth')]);
|
|
14
|
+
expect(result.cookieAuth).toEqual({ type: 'apiKey', in: 'cookie', name: 'session' });
|
|
15
|
+
});
|
|
16
|
+
it('Should map jwt-bearer to HTTP Bearer scheme', () => {
|
|
17
|
+
const result = mapProvidersToSecuritySchemes([createProvider('jwt-bearer')]);
|
|
18
|
+
expect(result.bearerAuth).toEqual({ type: 'http', scheme: 'bearer', bearerFormat: 'JWT' });
|
|
19
|
+
});
|
|
20
|
+
it('Should map multiple providers', () => {
|
|
21
|
+
const result = mapProvidersToSecuritySchemes([
|
|
22
|
+
createProvider('basic-auth'),
|
|
23
|
+
createProvider('cookie-auth'),
|
|
24
|
+
createProvider('jwt-bearer'),
|
|
25
|
+
]);
|
|
26
|
+
expect(Object.keys(result).sort()).toEqual(['basicAuth', 'bearerAuth', 'cookieAuth']);
|
|
27
|
+
});
|
|
28
|
+
it('Should ignore unknown provider names', () => {
|
|
29
|
+
const result = mapProvidersToSecuritySchemes([createProvider('jwt-bearer'), createProvider('custom-unknown-auth')]);
|
|
30
|
+
expect(result.bearerAuth).toBeDefined();
|
|
31
|
+
expect(Object.keys(result)).toEqual(['bearerAuth']);
|
|
32
|
+
});
|
|
33
|
+
it('Should fall back to cookieAuth when no known providers are found', () => {
|
|
34
|
+
const result = mapProvidersToSecuritySchemes([createProvider('unknown-provider')]);
|
|
35
|
+
expect(result).toEqual({ cookieAuth: { type: 'apiKey', in: 'cookie', name: 'session' } });
|
|
36
|
+
});
|
|
37
|
+
it('Should fall back to cookieAuth for empty provider list', () => {
|
|
38
|
+
const result = mapProvidersToSecuritySchemes([]);
|
|
39
|
+
expect(result).toEqual({ cookieAuth: { type: 'apiKey', in: 'cookie', name: 'session' } });
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
//# sourceMappingURL=auth-provider-to-security-scheme.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-provider-to-security-scheme.spec.js","sourceRoot":"","sources":["../../src/openapi/auth-provider-to-security-scheme.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { ApiDocumentMetadata, ApiEndpointSchema, OpenApiDocument } from '@furystack/rest';
|
|
2
|
+
/**
|
|
3
|
+
* Converts a FuryStack API schema to an OpenAPI 3.1 compatible document.
|
|
4
|
+
* Preserves metadata from ApiEndpointDefinition and ApiDocumentMetadata when available.
|
|
5
|
+
*/
|
|
6
|
+
export declare const generateOpenApiDocument: ({ api, title, description, version, metadata, }: {
|
|
7
|
+
api: ApiEndpointSchema["endpoints"];
|
|
8
|
+
title?: string;
|
|
9
|
+
description?: string;
|
|
10
|
+
version?: string;
|
|
11
|
+
metadata?: ApiDocumentMetadata;
|
|
12
|
+
}) => OpenApiDocument;
|
|
13
|
+
/** @deprecated Use generateOpenApiDocument instead */
|
|
14
|
+
export declare const generateSwaggerJsonFromApiSchema: ({ api, title, description, version, metadata, }: {
|
|
15
|
+
api: ApiEndpointSchema["endpoints"];
|
|
16
|
+
title?: string;
|
|
17
|
+
description?: string;
|
|
18
|
+
version?: string;
|
|
19
|
+
metadata?: ApiDocumentMetadata;
|
|
20
|
+
}) => OpenApiDocument;
|
|
21
|
+
//# sourceMappingURL=generate-openapi-document.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-openapi-document.d.ts","sourceRoot":"","sources":["../../src/openapi/generate-openapi-document.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,mBAAmB,EAEnB,iBAAiB,EAEjB,eAAe,EAIhB,MAAM,iBAAiB,CAAA;AAoCxB;;;GAGG;AACH,eAAO,MAAM,uBAAuB,GAAI,iDAMrC;IACD,GAAG,EAAE,iBAAiB,CAAC,WAAW,CAAC,CAAA;IACnC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,mBAAmB,CAAA;CAC/B,KAAG,eAqIH,CAAA;AAED,sDAAsD;AACtD,eAAO,MAAM,gCAAgC,oDA9I1C;IACD,GAAG,EAAE,iBAAiB,CAAC,WAAW,CAAC,CAAA;IACnC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,mBAAmB,CAAA;CAC/B,KAAG,eAwImE,CAAA"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
const PATH_ITEM_METHODS = ['get', 'put', 'post', 'delete', 'options', 'head', 'patch', 'trace'];
|
|
2
|
+
const isPathItemMethod = (method) => PATH_ITEM_METHODS.includes(method);
|
|
3
|
+
const getSubSchema = (schema, schemaName, property) => {
|
|
4
|
+
const typedSchema = schema;
|
|
5
|
+
if (!typedSchema?.definitions)
|
|
6
|
+
return undefined;
|
|
7
|
+
const definition = typedSchema.definitions[schemaName];
|
|
8
|
+
if (!definition?.properties?.[property])
|
|
9
|
+
return undefined;
|
|
10
|
+
return {
|
|
11
|
+
subSchema: definition.properties[property],
|
|
12
|
+
isRequired: definition.required?.includes(property) ?? false,
|
|
13
|
+
};
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Converts a FuryStack API schema to an OpenAPI 3.1 compatible document.
|
|
17
|
+
* Preserves metadata from ApiEndpointDefinition and ApiDocumentMetadata when available.
|
|
18
|
+
*/
|
|
19
|
+
export const generateOpenApiDocument = ({ api, title = 'FuryStack API', description = 'API documentation generated from FuryStack API schema', version = '1.0.0', metadata, }) => {
|
|
20
|
+
const doc = {
|
|
21
|
+
openapi: '3.1.0',
|
|
22
|
+
info: {
|
|
23
|
+
title,
|
|
24
|
+
version,
|
|
25
|
+
description,
|
|
26
|
+
...(metadata?.summary ? { summary: metadata.summary } : {}),
|
|
27
|
+
...(metadata?.termsOfService ? { termsOfService: metadata.termsOfService } : {}),
|
|
28
|
+
...(metadata?.contact ? { contact: metadata.contact } : {}),
|
|
29
|
+
...(metadata?.license ? { license: metadata.license } : {}),
|
|
30
|
+
},
|
|
31
|
+
jsonSchemaDialect: 'https://spec.openapis.org/oas/3.1/dialect/base',
|
|
32
|
+
servers: metadata?.servers ?? [{ url: '/' }],
|
|
33
|
+
tags: metadata?.tags ?? [],
|
|
34
|
+
...(metadata?.externalDocs ? { externalDocs: metadata.externalDocs } : {}),
|
|
35
|
+
paths: {},
|
|
36
|
+
components: {
|
|
37
|
+
schemas: {},
|
|
38
|
+
securitySchemes: metadata?.securitySchemes ?? {
|
|
39
|
+
cookieAuth: {
|
|
40
|
+
type: 'apiKey',
|
|
41
|
+
in: 'cookie',
|
|
42
|
+
name: 'session',
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
const defaultSchemeNames = metadata?.securitySchemes ? Object.keys(metadata.securitySchemes) : ['cookieAuth'];
|
|
48
|
+
for (const [methodKey, paths] of Object.entries(api)) {
|
|
49
|
+
for (const [path, definition] of Object.entries(paths)) {
|
|
50
|
+
const normalizedPath = path.replace(/:([^/]+)/g, '{$1}');
|
|
51
|
+
if (!doc.paths[normalizedPath]) {
|
|
52
|
+
doc.paths[normalizedPath] = {};
|
|
53
|
+
}
|
|
54
|
+
const pathParams = Array.from(path.matchAll(/:([^/]+)/g), (m) => m[1]);
|
|
55
|
+
const parameters = pathParams.map((param) => ({
|
|
56
|
+
name: param,
|
|
57
|
+
in: 'path',
|
|
58
|
+
required: true,
|
|
59
|
+
description: `Path parameter: ${param}`,
|
|
60
|
+
schema: { type: 'string' },
|
|
61
|
+
}));
|
|
62
|
+
const queryInfo = getSubSchema(definition.schema, definition.schemaName, 'query');
|
|
63
|
+
if (queryInfo) {
|
|
64
|
+
const querySchema = queryInfo.subSchema;
|
|
65
|
+
if (querySchema?.properties) {
|
|
66
|
+
for (const [paramName, paramSchema] of Object.entries(querySchema.properties)) {
|
|
67
|
+
parameters.push({
|
|
68
|
+
name: paramName,
|
|
69
|
+
in: 'query',
|
|
70
|
+
required: querySchema.required?.includes(paramName) ?? false,
|
|
71
|
+
schema: paramSchema,
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
const headerInfo = getSubSchema(definition.schema, definition.schemaName, 'headers');
|
|
77
|
+
if (headerInfo) {
|
|
78
|
+
const headerSchema = headerInfo.subSchema;
|
|
79
|
+
if (headerSchema?.properties) {
|
|
80
|
+
for (const [headerName, headerParamSchema] of Object.entries(headerSchema.properties)) {
|
|
81
|
+
parameters.push({
|
|
82
|
+
name: headerName,
|
|
83
|
+
in: 'header',
|
|
84
|
+
required: headerSchema.required?.includes(headerName) ?? false,
|
|
85
|
+
schema: headerParamSchema,
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
const operationSecurity = definition.securitySchemes
|
|
91
|
+
? definition.securitySchemes.map((name) => ({ [name]: [] }))
|
|
92
|
+
: definition.isAuthenticated
|
|
93
|
+
? defaultSchemeNames.map((name) => ({ [name]: [] }))
|
|
94
|
+
: [];
|
|
95
|
+
const method = methodKey.toLowerCase();
|
|
96
|
+
const operation = {
|
|
97
|
+
summary: definition.summary ?? `${methodKey} ${path}`,
|
|
98
|
+
description: definition.description ?? `Endpoint for ${path}`,
|
|
99
|
+
operationId: `${method}${path.replace(/\//g, '_').replace(/:/g, '').replace(/-/g, '_')}`,
|
|
100
|
+
security: operationSecurity,
|
|
101
|
+
parameters,
|
|
102
|
+
...(definition.tags?.length ? { tags: definition.tags } : {}),
|
|
103
|
+
...(definition.deprecated ? { deprecated: true } : {}),
|
|
104
|
+
responses: {
|
|
105
|
+
'200': {
|
|
106
|
+
description: 'Successful operation',
|
|
107
|
+
content: {
|
|
108
|
+
'application/json': {
|
|
109
|
+
schema: definition.schemaName
|
|
110
|
+
? { $ref: `#/components/schemas/${definition.schemaName}` }
|
|
111
|
+
: { type: 'object' },
|
|
112
|
+
},
|
|
113
|
+
},
|
|
114
|
+
},
|
|
115
|
+
'401': { description: 'Unauthorized' },
|
|
116
|
+
'500': { description: 'Internal server error' },
|
|
117
|
+
},
|
|
118
|
+
};
|
|
119
|
+
const bodyInfo = getSubSchema(definition.schema, definition.schemaName, 'body');
|
|
120
|
+
if (bodyInfo) {
|
|
121
|
+
const requestBody = {
|
|
122
|
+
required: bodyInfo.isRequired,
|
|
123
|
+
content: {
|
|
124
|
+
'application/json': {
|
|
125
|
+
schema: bodyInfo.subSchema,
|
|
126
|
+
},
|
|
127
|
+
},
|
|
128
|
+
};
|
|
129
|
+
operation.requestBody = requestBody;
|
|
130
|
+
}
|
|
131
|
+
if (definition.schema && definition.schemaName) {
|
|
132
|
+
doc.components.schemas[definition.schemaName] = definition.schema;
|
|
133
|
+
}
|
|
134
|
+
const pathItem = doc.paths[normalizedPath];
|
|
135
|
+
if (isPathItemMethod(method)) {
|
|
136
|
+
pathItem[method] = operation;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return doc;
|
|
141
|
+
};
|
|
142
|
+
/** @deprecated Use generateOpenApiDocument instead */
|
|
143
|
+
export const generateSwaggerJsonFromApiSchema = generateOpenApiDocument;
|
|
144
|
+
//# sourceMappingURL=generate-openapi-document.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-openapi-document.js","sourceRoot":"","sources":["../../src/openapi/generate-openapi-document.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-openapi-document.spec.d.ts","sourceRoot":"","sources":["../../src/openapi/generate-openapi-document.spec.ts"],"names":[],"mappings":""}
|