@kattebak/openapi-generator-ts 1.0.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/LICENSE +21 -0
- package/README.md +189 -0
- package/dist/cli/commands/generate.d.ts +23 -0
- package/dist/cli/commands/generate.d.ts.map +1 -0
- package/dist/cli/commands/generate.js +116 -0
- package/dist/cli/commands/generate.js.map +1 -0
- package/dist/cli/commands/list.d.ts +2 -0
- package/dist/cli/commands/list.d.ts.map +1 -0
- package/dist/cli/commands/list.js +26 -0
- package/dist/cli/commands/list.js.map +1 -0
- package/dist/cli/commands/validate.d.ts +6 -0
- package/dist/cli/commands/validate.d.ts.map +1 -0
- package/dist/cli/commands/validate.js +80 -0
- package/dist/cli/commands/validate.js.map +1 -0
- package/dist/cli/convert-template.d.ts +31 -0
- package/dist/cli/convert-template.d.ts.map +1 -0
- package/dist/cli/convert-template.js +204 -0
- package/dist/cli/convert-template.js.map +1 -0
- package/dist/cli/convert-template.test.d.ts +2 -0
- package/dist/cli/convert-template.test.d.ts.map +1 -0
- package/dist/cli/convert-template.test.js +74 -0
- package/dist/cli/convert-template.test.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +246 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/core/config.d.ts +252 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +31 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/generator.d.ts +99 -0
- package/dist/core/generator.d.ts.map +1 -0
- package/dist/core/generator.js +492 -0
- package/dist/core/generator.js.map +1 -0
- package/dist/core/index.d.ts +4 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +4 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/types.d.ts +47 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +5 -0
- package/dist/core/types.js.map +1 -0
- package/dist/generators/generators.test.d.ts +6 -0
- package/dist/generators/generators.test.d.ts.map +1 -0
- package/dist/generators/generators.test.js +247 -0
- package/dist/generators/generators.test.js.map +1 -0
- package/dist/generators/go.d.ts +10 -0
- package/dist/generators/go.d.ts.map +1 -0
- package/dist/generators/go.js +327 -0
- package/dist/generators/go.js.map +1 -0
- package/dist/generators/index.d.ts +29 -0
- package/dist/generators/index.d.ts.map +1 -0
- package/dist/generators/index.js +58 -0
- package/dist/generators/index.js.map +1 -0
- package/dist/generators/php.d.ts +14 -0
- package/dist/generators/php.d.ts.map +1 -0
- package/dist/generators/php.js +241 -0
- package/dist/generators/php.js.map +1 -0
- package/dist/generators/python.d.ts +10 -0
- package/dist/generators/python.d.ts.map +1 -0
- package/dist/generators/python.js +273 -0
- package/dist/generators/python.js.map +1 -0
- package/dist/generators/typescript-fetch.d.ts +14 -0
- package/dist/generators/typescript-fetch.d.ts.map +1 -0
- package/dist/generators/typescript-fetch.js +217 -0
- package/dist/generators/typescript-fetch.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/models/codegen-model.d.ts +123 -0
- package/dist/models/codegen-model.d.ts.map +1 -0
- package/dist/models/codegen-model.js +64 -0
- package/dist/models/codegen-model.js.map +1 -0
- package/dist/models/codegen-model.test.d.ts +6 -0
- package/dist/models/codegen-model.test.d.ts.map +1 -0
- package/dist/models/codegen-model.test.js +143 -0
- package/dist/models/codegen-model.test.js.map +1 -0
- package/dist/models/codegen-operation.d.ts +95 -0
- package/dist/models/codegen-operation.d.ts.map +1 -0
- package/dist/models/codegen-operation.js +54 -0
- package/dist/models/codegen-operation.js.map +1 -0
- package/dist/models/codegen-parameter.d.ts +86 -0
- package/dist/models/codegen-parameter.d.ts.map +1 -0
- package/dist/models/codegen-parameter.js +47 -0
- package/dist/models/codegen-parameter.js.map +1 -0
- package/dist/models/codegen-property.d.ts +95 -0
- package/dist/models/codegen-property.d.ts.map +1 -0
- package/dist/models/codegen-property.js +47 -0
- package/dist/models/codegen-property.js.map +1 -0
- package/dist/models/codegen-response.d.ts +64 -0
- package/dist/models/codegen-response.d.ts.map +1 -0
- package/dist/models/codegen-response.js +42 -0
- package/dist/models/codegen-response.js.map +1 -0
- package/dist/models/codegen-security.d.ts +34 -0
- package/dist/models/codegen-security.d.ts.map +1 -0
- package/dist/models/codegen-security.js +18 -0
- package/dist/models/codegen-security.js.map +1 -0
- package/dist/models/index.d.ts +8 -0
- package/dist/models/index.d.ts.map +1 -0
- package/dist/models/index.js +7 -0
- package/dist/models/index.js.map +1 -0
- package/dist/parser/index.d.ts +4 -0
- package/dist/parser/index.d.ts.map +1 -0
- package/dist/parser/index.js +4 -0
- package/dist/parser/index.js.map +1 -0
- package/dist/parser/openapi-parser.d.ts +71 -0
- package/dist/parser/openapi-parser.d.ts.map +1 -0
- package/dist/parser/openapi-parser.js +195 -0
- package/dist/parser/openapi-parser.js.map +1 -0
- package/dist/parser/openapi-parser.test.d.ts +6 -0
- package/dist/parser/openapi-parser.test.d.ts.map +1 -0
- package/dist/parser/openapi-parser.test.js +238 -0
- package/dist/parser/openapi-parser.test.js.map +1 -0
- package/dist/parser/operation-transformer.d.ts +95 -0
- package/dist/parser/operation-transformer.d.ts.map +1 -0
- package/dist/parser/operation-transformer.js +634 -0
- package/dist/parser/operation-transformer.js.map +1 -0
- package/dist/parser/schema-transformer.d.ts +134 -0
- package/dist/parser/schema-transformer.d.ts.map +1 -0
- package/dist/parser/schema-transformer.js +557 -0
- package/dist/parser/schema-transformer.js.map +1 -0
- package/dist/template/engine-adapter.d.ts +55 -0
- package/dist/template/engine-adapter.d.ts.map +1 -0
- package/dist/template/engine-adapter.js +178 -0
- package/dist/template/engine-adapter.js.map +1 -0
- package/dist/template/engine-adapter.test.d.ts +6 -0
- package/dist/template/engine-adapter.test.d.ts.map +1 -0
- package/dist/template/engine-adapter.test.js +186 -0
- package/dist/template/engine-adapter.test.js.map +1 -0
- package/dist/template/index.d.ts +5 -0
- package/dist/template/index.d.ts.map +1 -0
- package/dist/template/index.js +5 -0
- package/dist/template/index.js.map +1 -0
- package/dist/template/lambdas/indent-lambdas.d.ts +40 -0
- package/dist/template/lambdas/indent-lambdas.d.ts.map +1 -0
- package/dist/template/lambdas/indent-lambdas.js +98 -0
- package/dist/template/lambdas/indent-lambdas.js.map +1 -0
- package/dist/template/lambdas/index.d.ts +44 -0
- package/dist/template/lambdas/index.d.ts.map +1 -0
- package/dist/template/lambdas/index.js +79 -0
- package/dist/template/lambdas/index.js.map +1 -0
- package/dist/template/lambdas/string-lambdas.d.ts +78 -0
- package/dist/template/lambdas/string-lambdas.d.ts.map +1 -0
- package/dist/template/lambdas/string-lambdas.js +148 -0
- package/dist/template/lambdas/string-lambdas.js.map +1 -0
- package/dist/template/lambdas/string-lambdas.test.d.ts +6 -0
- package/dist/template/lambdas/string-lambdas.test.d.ts.map +1 -0
- package/dist/template/lambdas/string-lambdas.test.js +158 -0
- package/dist/template/lambdas/string-lambdas.test.js.map +1 -0
- package/dist/template/template-locator.d.ts +72 -0
- package/dist/template/template-locator.d.ts.map +1 -0
- package/dist/template/template-locator.js +173 -0
- package/dist/template/template-locator.js.map +1 -0
- package/dist/template/template-manager.d.ts +65 -0
- package/dist/template/template-manager.d.ts.map +1 -0
- package/dist/template/template-manager.js +185 -0
- package/dist/template/template-manager.js.map +1 -0
- package/package.json +67 -0
- package/templates/go/.travis.yml +8 -0
- package/templates/go/README.mustache +236 -0
- package/templates/go/api.mustache +452 -0
- package/templates/go/api_doc.mustache +92 -0
- package/templates/go/api_test.mustache +59 -0
- package/templates/go/client.mustache +761 -0
- package/templates/go/configuration.mustache +332 -0
- package/templates/go/git_push.sh.mustache +57 -0
- package/templates/go/gitignore.mustache +24 -0
- package/templates/go/go.mod.mustache +16 -0
- package/templates/go/go.sum.mustache +19 -0
- package/templates/go/model.mustache +21 -0
- package/templates/go/model_anyof.mustache +93 -0
- package/templates/go/model_doc.mustache +97 -0
- package/templates/go/model_enum.mustache +101 -0
- package/templates/go/model_oneof.mustache +160 -0
- package/templates/go/model_simple.mustache +572 -0
- package/templates/go/nullable_model.mustache +35 -0
- package/templates/go/openapi.mustache +1 -0
- package/templates/go/partial_header.mustache +18 -0
- package/templates/go/response.mustache +38 -0
- package/templates/go/signing.mustache +453 -0
- package/templates/go/utils.mustache +352 -0
- package/templates/php/.php-cs-fixer.dist.php +29 -0
- package/templates/php/.travis.yml +8 -0
- package/templates/php/ApiException.mustache +111 -0
- package/templates/php/Configuration.mustache +606 -0
- package/templates/php/FormDataProcessor.mustache +238 -0
- package/templates/php/HeaderSelector.mustache +265 -0
- package/templates/php/ModelInterface.mustache +103 -0
- package/templates/php/ObjectSerializer.mustache +591 -0
- package/templates/php/README.mustache +151 -0
- package/templates/php/api.mustache +891 -0
- package/templates/php/api_doc.mustache +105 -0
- package/templates/php/api_test.mustache +80 -0
- package/templates/php/composer.mustache +44 -0
- package/templates/php/git_push.sh.mustache +57 -0
- package/templates/php/gitignore +15 -0
- package/templates/php/libraries/psr-18/ApiException.mustache +114 -0
- package/templates/php/libraries/psr-18/DebugPlugin.mustache +93 -0
- package/templates/php/libraries/psr-18/README.mustache +161 -0
- package/templates/php/libraries/psr-18/api.mustache +833 -0
- package/templates/php/libraries/psr-18/api_doc.mustache +79 -0
- package/templates/php/libraries/psr-18/composer.mustache +56 -0
- package/templates/php/model.mustache +47 -0
- package/templates/php/model_doc.mustache +10 -0
- package/templates/php/model_enum.mustache +33 -0
- package/templates/php/model_generic.mustache +565 -0
- package/templates/php/model_test.mustache +88 -0
- package/templates/php/partial_header.mustache +18 -0
- package/templates/php/php_doc_auth_partial.mustache +23 -0
- package/templates/php/phpunit.xml.mustache +18 -0
- package/templates/python/README.mustache +60 -0
- package/templates/python/README_onlypackage.mustache +50 -0
- package/templates/python/__init__.mustache +1 -0
- package/templates/python/__init__api.mustache +19 -0
- package/templates/python/__init__model.mustache +22 -0
- package/templates/python/__init__package.mustache +49 -0
- package/templates/python/api.mustache +244 -0
- package/templates/python/api_client.mustache +822 -0
- package/templates/python/api_doc.mustache +81 -0
- package/templates/python/api_doc_example.mustache +38 -0
- package/templates/python/api_response.mustache +21 -0
- package/templates/python/api_test.mustache +48 -0
- package/templates/python/asyncio/rest.mustache +209 -0
- package/templates/python/common_README.mustache +85 -0
- package/templates/python/configuration.mustache +806 -0
- package/templates/python/exceptions.mustache +210 -0
- package/templates/python/exports_api.mustache +3 -0
- package/templates/python/exports_model.mustache +3 -0
- package/templates/python/exports_package.mustache +20 -0
- package/templates/python/git_push.sh.mustache +57 -0
- package/templates/python/github-workflow.mustache +35 -0
- package/templates/python/gitignore.mustache +66 -0
- package/templates/python/gitlab-ci.mustache +31 -0
- package/templates/python/httpx/rest.mustache +190 -0
- package/templates/python/model.mustache +16 -0
- package/templates/python/model_anyof.mustache +182 -0
- package/templates/python/model_doc.mustache +40 -0
- package/templates/python/model_enum.mustache +36 -0
- package/templates/python/model_generic.mustache +403 -0
- package/templates/python/model_oneof.mustache +209 -0
- package/templates/python/model_test.mustache +60 -0
- package/templates/python/partial_api.mustache +52 -0
- package/templates/python/partial_api_args.mustache +18 -0
- package/templates/python/partial_header.mustache +19 -0
- package/templates/python/py.typed.mustache +1 -0
- package/templates/python/pyproject.mustache +172 -0
- package/templates/python/python_doc_auth_partial.mustache +108 -0
- package/templates/python/requirements.mustache +23 -0
- package/templates/python/rest.mustache +254 -0
- package/templates/python/setup.mustache +60 -0
- package/templates/python/setup_cfg.mustache +2 -0
- package/templates/python/signing.mustache +422 -0
- package/templates/python/test-requirements.mustache +6 -0
- package/templates/python/tornado/rest.mustache +148 -0
- package/templates/python/tox.mustache +9 -0
- package/templates/python/travis.mustache +17 -0
- package/templates/typescript-fetch/ApiEntitiesRecord.mustache +26 -0
- package/templates/typescript-fetch/ApiEntitiesReducer.mustache +21 -0
- package/templates/typescript-fetch/ApiEntitiesSelectors.mustache +5 -0
- package/templates/typescript-fetch/README.mustache +127 -0
- package/templates/typescript-fetch/allSagas.mustache +19 -0
- package/templates/typescript-fetch/api_doc.mustache +63 -0
- package/templates/typescript-fetch/api_example.mustache +44 -0
- package/templates/typescript-fetch/apis.index.mustache +16 -0
- package/templates/typescript-fetch/apis.mustache +483 -0
- package/templates/typescript-fetch/apisAssignQueryParam.mustache +12 -0
- package/templates/typescript-fetch/gitignore +4 -0
- package/templates/typescript-fetch/index.mustache +17 -0
- package/templates/typescript-fetch/licenseInfo.mustache +11 -0
- package/templates/typescript-fetch/modelEnum.mustache +28 -0
- package/templates/typescript-fetch/modelEnumInterfaces.mustache +37 -0
- package/templates/typescript-fetch/modelGeneric.mustache +261 -0
- package/templates/typescript-fetch/modelGenericInterfaces.mustache +50 -0
- package/templates/typescript-fetch/modelOneOf.mustache +255 -0
- package/templates/typescript-fetch/modelOneOfInterfaces.mustache +6 -0
- package/templates/typescript-fetch/model_doc.mustache +41 -0
- package/templates/typescript-fetch/models.index.mustache +32 -0
- package/templates/typescript-fetch/models.mustache +24 -0
- package/templates/typescript-fetch/npmignore.mustache +1 -0
- package/templates/typescript-fetch/package.mustache +43 -0
- package/templates/typescript-fetch/recordGeneric.mustache +295 -0
- package/templates/typescript-fetch/records.mustache +17 -0
- package/templates/typescript-fetch/runtime.mustache +424 -0
- package/templates/typescript-fetch/runtimeSagasAndRecords.mustache +120 -0
- package/templates/typescript-fetch/sagaApiManager.mustache +28 -0
- package/templates/typescript-fetch/sagas.mustache +245 -0
- package/templates/typescript-fetch/sourceLibraryIndex.mustache +1 -0
- package/templates/typescript-fetch/tsconfig.esm.mustache +7 -0
- package/templates/typescript-fetch/tsconfig.mustache +25 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/parser/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,yBAAyB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/parser/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import type { OpenAPI, OpenAPIV3, OpenAPIV3_1 } from "openapi-types";
|
|
2
|
+
export type OpenAPIDocument = OpenAPI.Document;
|
|
3
|
+
export type OpenAPIV3Document = OpenAPIV3.Document;
|
|
4
|
+
export type OpenAPIV31Document = OpenAPIV3_1.Document;
|
|
5
|
+
export interface ParseOptions {
|
|
6
|
+
/**
|
|
7
|
+
* Fully dereference all $refs (default: false)
|
|
8
|
+
* When false, uses bundle mode which preserves internal $refs
|
|
9
|
+
*/
|
|
10
|
+
dereference?: boolean;
|
|
11
|
+
/**
|
|
12
|
+
* Validate the spec against the OpenAPI schema
|
|
13
|
+
*/
|
|
14
|
+
validate?: boolean;
|
|
15
|
+
/**
|
|
16
|
+
* Allow circular references
|
|
17
|
+
*/
|
|
18
|
+
allowCircular?: boolean;
|
|
19
|
+
}
|
|
20
|
+
export interface ParsedSpec {
|
|
21
|
+
document: OpenAPIDocument;
|
|
22
|
+
isOpenAPI3: boolean;
|
|
23
|
+
isOpenAPI31: boolean;
|
|
24
|
+
isSwagger2: boolean;
|
|
25
|
+
version: string;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Parse an OpenAPI specification from a file path or URL
|
|
29
|
+
*/
|
|
30
|
+
export declare function parseSpec(input: string, options?: ParseOptions): Promise<ParsedSpec>;
|
|
31
|
+
/**
|
|
32
|
+
* Parse an OpenAPI specification from a string (JSON or YAML)
|
|
33
|
+
*/
|
|
34
|
+
export declare function parseSpecFromString(content: string, options?: ParseOptions): Promise<ParsedSpec>;
|
|
35
|
+
/**
|
|
36
|
+
* Type guard for OpenAPI 3.x documents
|
|
37
|
+
*/
|
|
38
|
+
export declare function isOpenAPI3(document: OpenAPIDocument): document is OpenAPIV3Document;
|
|
39
|
+
/**
|
|
40
|
+
* Type guard for OpenAPI 3.1 documents
|
|
41
|
+
*/
|
|
42
|
+
export declare function isOpenAPI31(document: OpenAPIDocument): document is OpenAPIV31Document;
|
|
43
|
+
/**
|
|
44
|
+
* Get all schemas from the document
|
|
45
|
+
*/
|
|
46
|
+
export declare function getSchemas(document: OpenAPIDocument): Record<string, OpenAPIV3.SchemaObject | OpenAPIV3.ReferenceObject>;
|
|
47
|
+
/**
|
|
48
|
+
* Get all paths/operations from the document
|
|
49
|
+
*/
|
|
50
|
+
export declare function getPaths(document: OpenAPIDocument): OpenAPIV3.PathsObject;
|
|
51
|
+
/**
|
|
52
|
+
* Get security schemes from the document
|
|
53
|
+
*/
|
|
54
|
+
export declare function getSecuritySchemes(document: OpenAPIDocument): Record<string, OpenAPIV3.SecuritySchemeObject>;
|
|
55
|
+
/**
|
|
56
|
+
* Get servers from the document
|
|
57
|
+
*/
|
|
58
|
+
export declare function getServers(document: OpenAPIDocument): OpenAPIV3.ServerObject[];
|
|
59
|
+
/**
|
|
60
|
+
* Get external documentation from the document
|
|
61
|
+
*/
|
|
62
|
+
export declare function getExternalDocs(document: OpenAPIDocument): OpenAPIV3.ExternalDocumentationObject | undefined;
|
|
63
|
+
/**
|
|
64
|
+
* Get tags from the document
|
|
65
|
+
*/
|
|
66
|
+
export declare function getTags(document: OpenAPIDocument): OpenAPIV3.TagObject[];
|
|
67
|
+
/**
|
|
68
|
+
* Get info from the document
|
|
69
|
+
*/
|
|
70
|
+
export declare function getInfo(document: OpenAPIDocument): OpenAPIV3.InfoObject;
|
|
71
|
+
//# sourceMappingURL=openapi-parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openapi-parser.d.ts","sourceRoot":"","sources":["../../src/parser/openapi-parser.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAErE,MAAM,MAAM,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC;AAC/C,MAAM,MAAM,iBAAiB,GAAG,SAAS,CAAC,QAAQ,CAAC;AACnD,MAAM,MAAM,kBAAkB,GAAG,WAAW,CAAC,QAAQ,CAAC;AAEtD,MAAM,WAAW,YAAY;IAC5B;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB;;OAEG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,UAAU;IAC1B,QAAQ,EAAE,eAAe,CAAC;IAC1B,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAsB,SAAS,CAC9B,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,YAAiB,GACxB,OAAO,CAAC,UAAU,CAAC,CAkCrB;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACxC,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,YAAiB,GACxB,OAAO,CAAC,UAAU,CAAC,CA4CrB;AAeD;;GAEG;AACH,wBAAgB,UAAU,CACzB,QAAQ,EAAE,eAAe,GACvB,QAAQ,IAAI,iBAAiB,CAE/B;AAED;;GAEG;AACH,wBAAgB,WAAW,CAC1B,QAAQ,EAAE,eAAe,GACvB,QAAQ,IAAI,kBAAkB,CAEhC;AAED;;GAEG;AACH,wBAAgB,UAAU,CACzB,QAAQ,EAAE,eAAe,GACvB,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,YAAY,GAAG,SAAS,CAAC,eAAe,CAAC,CASpE;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,eAAe,GAAG,SAAS,CAAC,WAAW,CASzE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CACjC,QAAQ,EAAE,eAAe,GACvB,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,oBAAoB,CAAC,CAehD;AAED;;GAEG;AACH,wBAAgB,UAAU,CACzB,QAAQ,EAAE,eAAe,GACvB,SAAS,CAAC,YAAY,EAAE,CAiB1B;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC9B,QAAQ,EAAE,eAAe,GACvB,SAAS,CAAC,2BAA2B,GAAG,SAAS,CAKnD;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,QAAQ,EAAE,eAAe,GAAG,SAAS,CAAC,SAAS,EAAE,CAKxE;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,QAAQ,EAAE,eAAe,GAAG,SAAS,CAAC,UAAU,CAEvE"}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAPI specification parser
|
|
3
|
+
* Uses @apidevtools/swagger-parser to parse and dereference OpenAPI specs
|
|
4
|
+
*/
|
|
5
|
+
import SwaggerParser from "@apidevtools/swagger-parser";
|
|
6
|
+
/**
|
|
7
|
+
* Parse an OpenAPI specification from a file path or URL
|
|
8
|
+
*/
|
|
9
|
+
export async function parseSpec(input, options = {}) {
|
|
10
|
+
const { dereference = false, validate = true } = options;
|
|
11
|
+
let document;
|
|
12
|
+
if (dereference) {
|
|
13
|
+
// Validate and dereference (validate() also dereferences)
|
|
14
|
+
if (validate) {
|
|
15
|
+
document = await SwaggerParser.validate(input);
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
document = await SwaggerParser.dereference(input, {
|
|
19
|
+
dereference: {
|
|
20
|
+
circular: options.allowCircular ?? "ignore",
|
|
21
|
+
},
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
// Bundle mode: resolves external refs but preserves internal $refs
|
|
27
|
+
// Note: We skip validation here as validate() would dereference
|
|
28
|
+
document = await SwaggerParser.bundle(input);
|
|
29
|
+
}
|
|
30
|
+
const version = getSpecVersion(document);
|
|
31
|
+
const isOpenAPI3 = version.startsWith("3.");
|
|
32
|
+
const isOpenAPI31 = version.startsWith("3.1");
|
|
33
|
+
const isSwagger2 = version.startsWith("2.");
|
|
34
|
+
return {
|
|
35
|
+
document,
|
|
36
|
+
isOpenAPI3,
|
|
37
|
+
isOpenAPI31,
|
|
38
|
+
isSwagger2,
|
|
39
|
+
version,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Parse an OpenAPI specification from a string (JSON or YAML)
|
|
44
|
+
*/
|
|
45
|
+
export async function parseSpecFromString(content, options = {}) {
|
|
46
|
+
const { dereference = false, validate = true } = options;
|
|
47
|
+
// Parse the string content
|
|
48
|
+
let document;
|
|
49
|
+
// Try to parse as JSON first, then YAML
|
|
50
|
+
try {
|
|
51
|
+
document = JSON.parse(content);
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
// If JSON parsing fails, it might be YAML
|
|
55
|
+
const yaml = await import("js-yaml");
|
|
56
|
+
document = yaml.load(content);
|
|
57
|
+
}
|
|
58
|
+
if (dereference) {
|
|
59
|
+
// Validate and dereference (validate() also dereferences)
|
|
60
|
+
if (validate) {
|
|
61
|
+
document = await SwaggerParser.validate(document);
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
document = await SwaggerParser.dereference(document, {
|
|
65
|
+
dereference: {
|
|
66
|
+
circular: options.allowCircular ?? "ignore",
|
|
67
|
+
},
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
// Bundle mode: resolves external refs but preserves internal $refs
|
|
73
|
+
// Note: We skip validation here as validate() would dereference
|
|
74
|
+
document = await SwaggerParser.bundle(document);
|
|
75
|
+
}
|
|
76
|
+
const version = getSpecVersion(document);
|
|
77
|
+
const isOpenAPI3 = version.startsWith("3.");
|
|
78
|
+
const isOpenAPI31 = version.startsWith("3.1");
|
|
79
|
+
const isSwagger2 = version.startsWith("2.");
|
|
80
|
+
return {
|
|
81
|
+
document,
|
|
82
|
+
isOpenAPI3,
|
|
83
|
+
isOpenAPI31,
|
|
84
|
+
isSwagger2,
|
|
85
|
+
version,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Get the OpenAPI/Swagger version from a document
|
|
90
|
+
*/
|
|
91
|
+
function getSpecVersion(document) {
|
|
92
|
+
if ("openapi" in document && document.openapi) {
|
|
93
|
+
return document.openapi;
|
|
94
|
+
}
|
|
95
|
+
if ("swagger" in document && document.swagger) {
|
|
96
|
+
return document.swagger;
|
|
97
|
+
}
|
|
98
|
+
return "unknown";
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Type guard for OpenAPI 3.x documents
|
|
102
|
+
*/
|
|
103
|
+
export function isOpenAPI3(document) {
|
|
104
|
+
return "openapi" in document && document.openapi?.startsWith("3.");
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Type guard for OpenAPI 3.1 documents
|
|
108
|
+
*/
|
|
109
|
+
export function isOpenAPI31(document) {
|
|
110
|
+
return "openapi" in document && document.openapi?.startsWith("3.1");
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Get all schemas from the document
|
|
114
|
+
*/
|
|
115
|
+
export function getSchemas(document) {
|
|
116
|
+
if (isOpenAPI3(document)) {
|
|
117
|
+
return document.components?.schemas ?? {};
|
|
118
|
+
}
|
|
119
|
+
// Swagger 2.0
|
|
120
|
+
if ("definitions" in document && document.definitions) {
|
|
121
|
+
return document.definitions;
|
|
122
|
+
}
|
|
123
|
+
return {};
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Get all paths/operations from the document
|
|
127
|
+
*/
|
|
128
|
+
export function getPaths(document) {
|
|
129
|
+
if (isOpenAPI3(document)) {
|
|
130
|
+
return document.paths ?? {};
|
|
131
|
+
}
|
|
132
|
+
// Swagger 2.0
|
|
133
|
+
if ("paths" in document && document.paths) {
|
|
134
|
+
return document.paths;
|
|
135
|
+
}
|
|
136
|
+
return {};
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Get security schemes from the document
|
|
140
|
+
*/
|
|
141
|
+
export function getSecuritySchemes(document) {
|
|
142
|
+
if (isOpenAPI3(document)) {
|
|
143
|
+
return (document.components?.securitySchemes ?? {});
|
|
144
|
+
}
|
|
145
|
+
// Swagger 2.0
|
|
146
|
+
if ("securityDefinitions" in document && document.securityDefinitions) {
|
|
147
|
+
return document.securityDefinitions;
|
|
148
|
+
}
|
|
149
|
+
return {};
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Get servers from the document
|
|
153
|
+
*/
|
|
154
|
+
export function getServers(document) {
|
|
155
|
+
if (isOpenAPI3(document)) {
|
|
156
|
+
return document.servers ?? [];
|
|
157
|
+
}
|
|
158
|
+
// Swagger 2.0 - construct from host, basePath, schemes
|
|
159
|
+
if ("host" in document) {
|
|
160
|
+
const host = document.host ?? "localhost";
|
|
161
|
+
const basePath = ("basePath" in document ? document.basePath : "") ?? "";
|
|
162
|
+
const schemes = ("schemes" in document ? document.schemes : ["https"]) ?? [
|
|
163
|
+
"https",
|
|
164
|
+
];
|
|
165
|
+
return schemes.map((scheme) => ({
|
|
166
|
+
url: `${scheme}://${host}${basePath}`,
|
|
167
|
+
}));
|
|
168
|
+
}
|
|
169
|
+
return [];
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Get external documentation from the document
|
|
173
|
+
*/
|
|
174
|
+
export function getExternalDocs(document) {
|
|
175
|
+
if ("externalDocs" in document) {
|
|
176
|
+
return document.externalDocs;
|
|
177
|
+
}
|
|
178
|
+
return undefined;
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Get tags from the document
|
|
182
|
+
*/
|
|
183
|
+
export function getTags(document) {
|
|
184
|
+
if ("tags" in document && document.tags) {
|
|
185
|
+
return document.tags;
|
|
186
|
+
}
|
|
187
|
+
return [];
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Get info from the document
|
|
191
|
+
*/
|
|
192
|
+
export function getInfo(document) {
|
|
193
|
+
return document.info;
|
|
194
|
+
}
|
|
195
|
+
//# sourceMappingURL=openapi-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openapi-parser.js","sourceRoot":"","sources":["../../src/parser/openapi-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openapi-parser.test.d.ts","sourceRoot":"","sources":["../../src/parser/openapi-parser.test.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAPI Parser tests
|
|
3
|
+
* Tests for parsing and validating OpenAPI specifications
|
|
4
|
+
*/
|
|
5
|
+
import assert from "node:assert";
|
|
6
|
+
import { describe, it } from "node:test";
|
|
7
|
+
import { getPaths, getSchemas, getSecuritySchemes, getServers, isOpenAPI3, isOpenAPI31, parseSpecFromString, } from "./openapi-parser.js";
|
|
8
|
+
// Sample petstore-like spec for testing
|
|
9
|
+
const petstoreSpec = {
|
|
10
|
+
openapi: "3.0.0",
|
|
11
|
+
info: {
|
|
12
|
+
title: "Petstore API",
|
|
13
|
+
version: "1.0.0",
|
|
14
|
+
},
|
|
15
|
+
paths: {
|
|
16
|
+
"/pets": {
|
|
17
|
+
get: {
|
|
18
|
+
operationId: "listPets",
|
|
19
|
+
responses: {
|
|
20
|
+
"200": {
|
|
21
|
+
description: "List of pets",
|
|
22
|
+
content: {
|
|
23
|
+
"application/json": {
|
|
24
|
+
schema: {
|
|
25
|
+
type: "array",
|
|
26
|
+
items: { $ref: "#/components/schemas/Pet" },
|
|
27
|
+
},
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
components: {
|
|
36
|
+
schemas: {
|
|
37
|
+
Pet: {
|
|
38
|
+
type: "object",
|
|
39
|
+
required: ["id", "name"],
|
|
40
|
+
properties: {
|
|
41
|
+
id: { type: "integer", format: "int64" },
|
|
42
|
+
name: { type: "string" },
|
|
43
|
+
tag: { type: "string" },
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
describe("OpenAPI Parser", () => {
|
|
50
|
+
describe("parseSpecFromString", () => {
|
|
51
|
+
it("should parse inline spec object", async () => {
|
|
52
|
+
const spec = {
|
|
53
|
+
openapi: "3.0.0",
|
|
54
|
+
info: {
|
|
55
|
+
title: "Test API",
|
|
56
|
+
version: "1.0.0",
|
|
57
|
+
},
|
|
58
|
+
paths: {},
|
|
59
|
+
};
|
|
60
|
+
const result = await parseSpecFromString(JSON.stringify(spec));
|
|
61
|
+
assert.ok(result);
|
|
62
|
+
assert.ok(result.document);
|
|
63
|
+
assert.strictEqual(result.document.info.title, "Test API");
|
|
64
|
+
assert.strictEqual(result.document.info.version, "1.0.0");
|
|
65
|
+
});
|
|
66
|
+
it("should parse petstore-like spec", async () => {
|
|
67
|
+
const result = await parseSpecFromString(JSON.stringify(petstoreSpec));
|
|
68
|
+
assert.ok(result);
|
|
69
|
+
assert.ok(result.isOpenAPI3);
|
|
70
|
+
assert.strictEqual(result.version, "3.0.0");
|
|
71
|
+
assert.strictEqual(result.document.info.title, "Petstore API");
|
|
72
|
+
});
|
|
73
|
+
it("should extract paths from spec", async () => {
|
|
74
|
+
const result = await parseSpecFromString(JSON.stringify(petstoreSpec));
|
|
75
|
+
const paths = getPaths(result.document);
|
|
76
|
+
assert.ok(paths);
|
|
77
|
+
assert.ok(Object.keys(paths).length > 0);
|
|
78
|
+
assert.ok(paths["/pets"]);
|
|
79
|
+
});
|
|
80
|
+
it("should extract components/schemas from spec", async () => {
|
|
81
|
+
const result = await parseSpecFromString(JSON.stringify(petstoreSpec));
|
|
82
|
+
const schemas = getSchemas(result.document);
|
|
83
|
+
assert.ok(schemas);
|
|
84
|
+
assert.ok(schemas.Pet);
|
|
85
|
+
});
|
|
86
|
+
it("should dereference $ref", async () => {
|
|
87
|
+
const result = await parseSpecFromString(JSON.stringify(petstoreSpec), {
|
|
88
|
+
dereference: true,
|
|
89
|
+
});
|
|
90
|
+
// After dereferencing, the Pet schema should be resolved
|
|
91
|
+
const schemas = getSchemas(result.document);
|
|
92
|
+
const petSchema = schemas.Pet;
|
|
93
|
+
assert.ok(petSchema);
|
|
94
|
+
assert.ok("properties" in petSchema);
|
|
95
|
+
assert.ok(petSchema.properties?.id);
|
|
96
|
+
assert.ok(petSchema.properties?.name);
|
|
97
|
+
});
|
|
98
|
+
it("should detect OpenAPI version", async () => {
|
|
99
|
+
const result = await parseSpecFromString(JSON.stringify(petstoreSpec));
|
|
100
|
+
assert.strictEqual(result.isOpenAPI3, true);
|
|
101
|
+
assert.strictEqual(result.isOpenAPI31, false);
|
|
102
|
+
assert.strictEqual(result.isSwagger2, false);
|
|
103
|
+
assert.strictEqual(result.version, "3.0.0");
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
describe("validation", () => {
|
|
107
|
+
it("should validate a valid OpenAPI spec", async () => {
|
|
108
|
+
// parseSpecFromString with validate: true (default) should not throw
|
|
109
|
+
const result = await parseSpecFromString(JSON.stringify(petstoreSpec), {
|
|
110
|
+
validate: true,
|
|
111
|
+
});
|
|
112
|
+
assert.ok(result);
|
|
113
|
+
assert.ok(result.document);
|
|
114
|
+
});
|
|
115
|
+
it("should throw for invalid spec when validation enabled", async () => {
|
|
116
|
+
const invalidSpec = {
|
|
117
|
+
openapi: "3.0.0",
|
|
118
|
+
// Missing required 'info' field
|
|
119
|
+
paths: {},
|
|
120
|
+
};
|
|
121
|
+
await assert.rejects(async () => parseSpecFromString(JSON.stringify(invalidSpec), { validate: true }),
|
|
122
|
+
// Swagger parser throws an error for invalid specs
|
|
123
|
+
(err) => err !== null);
|
|
124
|
+
});
|
|
125
|
+
it("should parse invalid spec when validation disabled", async () => {
|
|
126
|
+
const invalidSpec = {
|
|
127
|
+
openapi: "3.0.0",
|
|
128
|
+
info: { title: "Test", version: "1.0.0" },
|
|
129
|
+
paths: {},
|
|
130
|
+
};
|
|
131
|
+
const result = await parseSpecFromString(JSON.stringify(invalidSpec), {
|
|
132
|
+
validate: false,
|
|
133
|
+
});
|
|
134
|
+
assert.ok(result);
|
|
135
|
+
});
|
|
136
|
+
});
|
|
137
|
+
describe("type guards", () => {
|
|
138
|
+
it("should identify OpenAPI 3.x documents", async () => {
|
|
139
|
+
const result = await parseSpecFromString(JSON.stringify(petstoreSpec));
|
|
140
|
+
assert.strictEqual(isOpenAPI3(result.document), true);
|
|
141
|
+
assert.strictEqual(isOpenAPI31(result.document), false);
|
|
142
|
+
});
|
|
143
|
+
it("should identify OpenAPI 3.1 documents", async () => {
|
|
144
|
+
const spec31 = {
|
|
145
|
+
openapi: "3.1.0",
|
|
146
|
+
info: {
|
|
147
|
+
title: "OpenAPI 3.1 API",
|
|
148
|
+
version: "1.0.0",
|
|
149
|
+
},
|
|
150
|
+
paths: {},
|
|
151
|
+
};
|
|
152
|
+
const result = await parseSpecFromString(JSON.stringify(spec31), {
|
|
153
|
+
validate: false,
|
|
154
|
+
});
|
|
155
|
+
assert.strictEqual(isOpenAPI3(result.document), true);
|
|
156
|
+
assert.strictEqual(isOpenAPI31(result.document), true);
|
|
157
|
+
});
|
|
158
|
+
});
|
|
159
|
+
describe("Edge cases", () => {
|
|
160
|
+
it("should handle spec with no paths", async () => {
|
|
161
|
+
const spec = {
|
|
162
|
+
openapi: "3.0.0",
|
|
163
|
+
info: {
|
|
164
|
+
title: "Empty API",
|
|
165
|
+
version: "1.0.0",
|
|
166
|
+
},
|
|
167
|
+
paths: {},
|
|
168
|
+
};
|
|
169
|
+
const result = await parseSpecFromString(JSON.stringify(spec));
|
|
170
|
+
const paths = getPaths(result.document);
|
|
171
|
+
assert.ok(result);
|
|
172
|
+
assert.deepStrictEqual(paths, {});
|
|
173
|
+
});
|
|
174
|
+
it("should handle spec with components but no schemas", async () => {
|
|
175
|
+
const spec = {
|
|
176
|
+
openapi: "3.0.0",
|
|
177
|
+
info: {
|
|
178
|
+
title: "No Schema API",
|
|
179
|
+
version: "1.0.0",
|
|
180
|
+
},
|
|
181
|
+
paths: {},
|
|
182
|
+
components: {},
|
|
183
|
+
};
|
|
184
|
+
const result = await parseSpecFromString(JSON.stringify(spec));
|
|
185
|
+
const schemas = getSchemas(result.document);
|
|
186
|
+
assert.ok(result);
|
|
187
|
+
assert.deepStrictEqual(schemas, {});
|
|
188
|
+
});
|
|
189
|
+
it("should handle spec with servers", async () => {
|
|
190
|
+
const spec = {
|
|
191
|
+
openapi: "3.0.0",
|
|
192
|
+
info: {
|
|
193
|
+
title: "Server API",
|
|
194
|
+
version: "1.0.0",
|
|
195
|
+
},
|
|
196
|
+
servers: [
|
|
197
|
+
{ url: "https://api.example.com/v1" },
|
|
198
|
+
{ url: "https://staging.example.com/v1" },
|
|
199
|
+
],
|
|
200
|
+
paths: {},
|
|
201
|
+
};
|
|
202
|
+
const result = await parseSpecFromString(JSON.stringify(spec));
|
|
203
|
+
const servers = getServers(result.document);
|
|
204
|
+
assert.ok(servers);
|
|
205
|
+
assert.strictEqual(servers.length, 2);
|
|
206
|
+
assert.strictEqual(servers[0].url, "https://api.example.com/v1");
|
|
207
|
+
});
|
|
208
|
+
it("should handle spec with security schemes", async () => {
|
|
209
|
+
const spec = {
|
|
210
|
+
openapi: "3.0.0",
|
|
211
|
+
info: {
|
|
212
|
+
title: "Secure API",
|
|
213
|
+
version: "1.0.0",
|
|
214
|
+
},
|
|
215
|
+
paths: {},
|
|
216
|
+
components: {
|
|
217
|
+
securitySchemes: {
|
|
218
|
+
bearerAuth: {
|
|
219
|
+
type: "http",
|
|
220
|
+
scheme: "bearer",
|
|
221
|
+
},
|
|
222
|
+
apiKey: {
|
|
223
|
+
type: "apiKey",
|
|
224
|
+
in: "header",
|
|
225
|
+
name: "X-API-Key",
|
|
226
|
+
},
|
|
227
|
+
},
|
|
228
|
+
},
|
|
229
|
+
};
|
|
230
|
+
const result = await parseSpecFromString(JSON.stringify(spec));
|
|
231
|
+
const securitySchemes = getSecuritySchemes(result.document);
|
|
232
|
+
assert.ok(securitySchemes);
|
|
233
|
+
assert.ok(securitySchemes.bearerAuth);
|
|
234
|
+
assert.ok(securitySchemes.apiKey);
|
|
235
|
+
});
|
|
236
|
+
});
|
|
237
|
+
});
|
|
238
|
+
//# sourceMappingURL=openapi-parser.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openapi-parser.test.js","sourceRoot":"","sources":["../../src/parser/openapi-parser.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Operation transformer
|
|
3
|
+
* Converts OpenAPI operations to CodegenOperation objects
|
|
4
|
+
*/
|
|
5
|
+
import type { OpenAPIV3 } from "openapi-types";
|
|
6
|
+
import { type CodegenOperation } from "../models/index.js";
|
|
7
|
+
export interface OperationTransformerOptions {
|
|
8
|
+
/**
|
|
9
|
+
* Type mappings from OpenAPI types to target language types
|
|
10
|
+
*/
|
|
11
|
+
typeMappings?: Record<string, string>;
|
|
12
|
+
/**
|
|
13
|
+
* Reserved words for model renaming
|
|
14
|
+
*/
|
|
15
|
+
reservedWords?: Set<string>;
|
|
16
|
+
/**
|
|
17
|
+
* Custom function to convert operation IDs for the target language.
|
|
18
|
+
*/
|
|
19
|
+
toOperationId?: (name: string) => string;
|
|
20
|
+
}
|
|
21
|
+
declare const HTTP_METHODS: readonly ["get", "post", "put", "delete", "patch", "options", "head", "trace"];
|
|
22
|
+
type HttpMethod = (typeof HTTP_METHODS)[number];
|
|
23
|
+
export declare class OperationTransformer {
|
|
24
|
+
private schemaTransformer;
|
|
25
|
+
private options;
|
|
26
|
+
private schemas;
|
|
27
|
+
constructor(options?: OperationTransformerOptions);
|
|
28
|
+
/**
|
|
29
|
+
* Transform all operations in paths object
|
|
30
|
+
*/
|
|
31
|
+
transformPaths(paths: OpenAPIV3.PathsObject, securitySchemes?: Record<string, OpenAPIV3.SecuritySchemeObject>, schemas?: Record<string, OpenAPIV3.SchemaObject | OpenAPIV3.ReferenceObject>): Map<string, CodegenOperation[]>;
|
|
32
|
+
/**
|
|
33
|
+
* Transform a single operation
|
|
34
|
+
*/
|
|
35
|
+
transformOperation(path: string, method: HttpMethod, operation: OpenAPIV3.OperationObject, pathParameters: OpenAPIV3.ParameterObject[], securitySchemes?: Record<string, OpenAPIV3.SecuritySchemeObject>): CodegenOperation;
|
|
36
|
+
/**
|
|
37
|
+
* Transform a parameter
|
|
38
|
+
*/
|
|
39
|
+
private transformParameter;
|
|
40
|
+
/**
|
|
41
|
+
* Transform request body
|
|
42
|
+
*/
|
|
43
|
+
private transformRequestBody;
|
|
44
|
+
/**
|
|
45
|
+
* Transform a response
|
|
46
|
+
*/
|
|
47
|
+
private transformResponse;
|
|
48
|
+
/**
|
|
49
|
+
* Transform a security scheme
|
|
50
|
+
*/
|
|
51
|
+
private transformSecurityScheme;
|
|
52
|
+
/**
|
|
53
|
+
* Add parameter to operation and categorize it
|
|
54
|
+
*/
|
|
55
|
+
private addParameter;
|
|
56
|
+
/**
|
|
57
|
+
* Convert a CodegenProperty to CodegenParameter
|
|
58
|
+
*/
|
|
59
|
+
private propertyToParameter;
|
|
60
|
+
/**
|
|
61
|
+
* Parse content type string into ContentType object
|
|
62
|
+
*/
|
|
63
|
+
private parseContentType;
|
|
64
|
+
/**
|
|
65
|
+
* Generate operation ID from path and method
|
|
66
|
+
*/
|
|
67
|
+
private generateOperationId;
|
|
68
|
+
/**
|
|
69
|
+
* Type guard for reference objects
|
|
70
|
+
*/
|
|
71
|
+
private isReferenceObject;
|
|
72
|
+
/**
|
|
73
|
+
* Extract ref name from $ref string
|
|
74
|
+
*/
|
|
75
|
+
private getRefName;
|
|
76
|
+
/**
|
|
77
|
+
* Extract vendor extensions (x-*) from object
|
|
78
|
+
*/
|
|
79
|
+
private extractVendorExtensions;
|
|
80
|
+
/**
|
|
81
|
+
* Resolve array alias to its element type
|
|
82
|
+
* Returns null if not an array alias
|
|
83
|
+
*/
|
|
84
|
+
private resolveArrayAlias;
|
|
85
|
+
/**
|
|
86
|
+
* Convert a name to model naming convention (with reserved word handling)
|
|
87
|
+
*/
|
|
88
|
+
private toModelName;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Create an operation transformer with default options
|
|
92
|
+
*/
|
|
93
|
+
export declare function createOperationTransformer(options?: OperationTransformerOptions): OperationTransformer;
|
|
94
|
+
export {};
|
|
95
|
+
//# sourceMappingURL=operation-transformer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operation-transformer.d.ts","sourceRoot":"","sources":["../../src/parser/operation-transformer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EACN,KAAK,gBAAgB,EAUrB,MAAM,oBAAoB,CAAC;AAG5B,MAAM,WAAW,2BAA2B;IAC3C;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEtC;;OAEG;IACH,aAAa,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAE5B;;OAEG;IACH,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CACzC;AAED,QAAA,MAAM,YAAY,gFASR,CAAC;AAEX,KAAK,UAAU,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;AAEhD,qBAAa,oBAAoB;IAChC,OAAO,CAAC,iBAAiB,CAAoB;IAC7C,OAAO,CAAC,OAAO,CAA8B;IAC7C,OAAO,CAAC,OAAO,CAGR;gBAEK,OAAO,GAAE,2BAAgC;IAQrD;;OAEG;IACH,cAAc,CACb,KAAK,EAAE,SAAS,CAAC,WAAW,EAC5B,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,oBAAoB,CAAC,EAChE,OAAO,CAAC,EAAE,MAAM,CACf,MAAM,EACN,SAAS,CAAC,YAAY,GAAG,SAAS,CAAC,eAAe,CAClD,GACC,GAAG,CAAC,MAAM,EAAE,gBAAgB,EAAE,CAAC;IAsClC;;OAEG;IACH,kBAAkB,CACjB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,UAAU,EAClB,SAAS,EAAE,SAAS,CAAC,eAAe,EACpC,cAAc,EAAE,SAAS,CAAC,eAAe,EAAE,EAC3C,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,oBAAoB,CAAC,GAC9D,gBAAgB;IAkLnB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA2F1B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAyF5B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAoGzB;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAiE/B;;OAEG;IACH,OAAO,CAAC,YAAY;IA4BpB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAuC3B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAkBxB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAS3B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAIzB;;OAEG;IACH,OAAO,CAAC,UAAU;IAKlB;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAc/B;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAsBzB;;OAEG;IACH,OAAO,CAAC,WAAW;CAUnB;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CACzC,OAAO,CAAC,EAAE,2BAA2B,GACnC,oBAAoB,CAEtB"}
|