Skip to content

Commit

Permalink
Merge pull request #845 from samchon/features/migrate
Browse files Browse the repository at this point in the history
`@nestia/migrate` support to every swagger versions.
  • Loading branch information
samchon authored Mar 25, 2024
2 parents 39deb82 + ca980a3 commit a4d0823
Show file tree
Hide file tree
Showing 12 changed files with 294 additions and 26 deletions.
1 change: 1 addition & 0 deletions packages/migrate/assets/input/openapiv3.1.json

Large diffs are not rendered by default.

222 changes: 222 additions & 0 deletions packages/migrate/assets/input/swaggerv2.0.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,222 @@
{
"swagger": "2.0",
"info": {
"version": "1.0.0",
"title": "Swagger Petstore",
"description": "A sample API that uses a petstore as an example to demonstrate features in the swagger-2.0 specification",
"termsOfService": "http://swagger.io/terms/",
"contact": {
"name": "Swagger API Team"
},
"license": {
"name": "MIT"
}
},
"host": "petstore.swagger.io",
"basePath": "/api",
"schemes": [
"http"
],
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"paths": {
"/pets": {
"get": {
"description": "Returns all pets from the system that the user has access to",
"operationId": "findPets",
"produces": [
"application/json",
"application/xml",
"text/xml",
"text/html"
],
"parameters": [
{
"name": "tags",
"in": "query",
"description": "tags to filter by",
"required": false,
"type": "array",
"items": {
"type": "string"
},
"collectionFormat": "csv"
},
{
"name": "limit",
"in": "query",
"description": "maximum number of results to return",
"required": false,
"type": "integer",
"format": "int32"
}
],
"responses": {
"200": {
"description": "pet response",
"schema": {
"type": "array",
"items": {
"$ref": "#/definitions/Pet"
}
}
},
"default": {
"description": "unexpected error",
"schema": {
"$ref": "#/definitions/ErrorModel"
}
}
}
},
"post": {
"description": "Creates a new pet in the store. Duplicates are allowed",
"operationId": "addPet",
"produces": [
"application/json"
],
"parameters": [
{
"name": "pet",
"in": "body",
"description": "Pet to add to the store",
"required": true,
"schema": {
"$ref": "#/definitions/NewPet"
}
}
],
"responses": {
"200": {
"description": "pet response",
"schema": {
"$ref": "#/definitions/Pet"
}
},
"default": {
"description": "unexpected error",
"schema": {
"$ref": "#/definitions/ErrorModel"
}
}
}
}
},
"/pets/{id}": {
"get": {
"description": "Returns a user based on a single ID, if the user does not have access to the pet",
"operationId": "findPetById",
"produces": [
"application/json",
"application/xml",
"text/xml",
"text/html"
],
"parameters": [
{
"name": "id",
"in": "path",
"description": "ID of pet to fetch",
"required": true,
"type": "integer",
"format": "int64"
}
],
"responses": {
"200": {
"description": "pet response",
"schema": {
"$ref": "#/definitions/Pet"
}
},
"default": {
"description": "unexpected error",
"schema": {
"$ref": "#/definitions/ErrorModel"
}
}
}
},
"delete": {
"description": "deletes a single pet based on the ID supplied",
"operationId": "deletePet",
"parameters": [
{
"name": "id",
"in": "path",
"description": "ID of pet to delete",
"required": true,
"type": "integer",
"format": "int64"
}
],
"responses": {
"204": {
"description": "pet deleted"
},
"default": {
"description": "unexpected error",
"schema": {
"$ref": "#/definitions/ErrorModel"
}
}
}
}
}
},
"definitions": {
"Pet": {
"type": "object",
"allOf": [
{
"$ref": "#/definitions/NewPet"
},
{
"required": [
"id"
],
"properties": {
"id": {
"type": "integer",
"format": "int64"
}
}
}
]
},
"NewPet": {
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string"
},
"tag": {
"type": "string"
}
}
},
"ErrorModel": {
"type": "object",
"required": [
"code",
"message"
],
"properties": {
"code": {
"type": "integer",
"format": "int32"
},
"message": {
"type": "string"
}
}
}
}
}
18 changes: 11 additions & 7 deletions packages/migrate/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@nestia/migrate",
"version": "0.10.0",
"version": "0.11.0",
"description": "Migration program from swagger to NestJS",
"main": "lib/index.js",
"typings": "lib/index.d.ts",
Expand Down Expand Up @@ -34,17 +34,18 @@
},
"homepage": "https://nestia.io",
"devDependencies": {
"@nestia/core": "^2.5.15",
"@nestia/core": "^2.6.0",
"@nestia/e2e": "^0.4.1",
"@nestia/fetcher": "^2.5.15",
"@nestjs/common": "^10.3.3",
"@nestjs/core": "^10.3.3",
"@nestjs/platform-express": "^10.3.3",
"@nestjs/platform-fastify": "^10.3.3",
"@nestia/fetcher": "^2.6.0",
"@nestjs/common": "^10.3.5",
"@nestjs/core": "^10.3.5",
"@nestjs/platform-express": "^10.3.5",
"@nestjs/platform-fastify": "^10.3.5",
"@trivago/prettier-plugin-sort-imports": "^4.3.0",
"@types/express": "^4.17.21",
"@types/inquirer": "^9.0.7",
"@types/node": "^20.3.3",
"@types/swagger2openapi": "^7.0.4",
"dotenv": "^16.3.1",
"dotenv-expand": "^10.0.0",
"rimraf": "^5.0.1",
Expand All @@ -55,9 +56,12 @@
"typescript-transform-paths": "^3.4.6"
},
"dependencies": {
"@apiture/openapi-down-convert": "^0.13.0",
"commander": "10.0.0",
"inquirer": "8.2.5",
"openapi-types": "^12.1.3",
"prettier": "^3.2.5",
"swagger2openapi": "^7.0.8",
"tstl": "^2.5.13",
"typescript": "^5.4.2",
"typia": "^5.5.7"
Expand Down
25 changes: 17 additions & 8 deletions packages/migrate/src/MigrateApplication.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,19 +10,28 @@ import { MigrateNestProgrammer } from "./programmers/MigrateNestProgrammer";
import { IMigrateFile } from "./structures/IMigrateFile";
import { IMigrateProgram } from "./structures/IMigrateProgram";
import { ISwagger } from "./structures/ISwagger";
import { ISwaggerV20 } from "./structures/ISwaggerV20";
import { ISwaggerV31 } from "./structures/ISwaggerV31";
import { OpenApiConverter } from "./utils/OpenApiConverter";

export class MigrateApplication {
private constructor(public readonly swagger: ISwagger) {}

public static create(swagger: ISwagger): IValidation<MigrateApplication> {
public static async create(
swagger: ISwagger | ISwaggerV20 | ISwaggerV31,
): Promise<IValidation<MigrateApplication>> {
swagger = typia.is<ISwaggerV20.IVersion>(swagger)
? await OpenApiConverter.v2_0(swagger)
: typia.is<ISwaggerV31.IVersion>(swagger)
? OpenApiConverter.v3_1(swagger)
: swagger;
const result = typia.validate<ISwagger>(swagger);
if (result.success)
return {
success: true,
data: new MigrateApplication(swagger),
errors: [],
};
return result;
if (result.success === false) return result;
return {
success: true,
data: new MigrateApplication(swagger),
errors: [],
};
}

public nest(config: MigrateApplication.IConfig): MigrateApplication.IOutput {
Expand Down
2 changes: 1 addition & 1 deletion packages/migrate/src/internal/MigrateCommander.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ export namespace MigrateCommander {
})();

const result: IValidation<MigrateApplication> =
MigrateApplication.create(swagger);
await MigrateApplication.create(swagger);
if (result.success === false) {
console.log(result.errors);
throw new Error(
Expand Down
10 changes: 10 additions & 0 deletions packages/migrate/src/structures/ISwaggerV20.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import { OpenAPIV2 } from "openapi-types";

export interface ISwaggerV20
extends Omit<OpenAPIV2.Document, "swagger">,
ISwaggerV20.IVersion {}
export namespace ISwaggerV20 {
export interface IVersion {
swagger: "2.0";
}
}
10 changes: 10 additions & 0 deletions packages/migrate/src/structures/ISwaggerV31.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import { OpenAPIV3_1 } from "openapi-types";

export interface ISwaggerV31 extends Omit<OpenAPIV3_1.Document, "openapi"> {
openapi: `3.1.${number}`;
}
export namespace ISwaggerV31 {
export interface IVersion {
openapi: `3.1.${number}`;
}
}
2 changes: 1 addition & 1 deletion packages/migrate/src/test/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ const execute =
async () => {
const directory = `${OUTPUT}/${project}-${config.mode}-${config.simulate}-${config.e2e}`;
const result: IValidation<MigrateApplication> =
MigrateApplication.create(swagger);
await MigrateApplication.create(swagger);
if (result.success === false)
throw new Error(
`Invalid swagger file (must follow the OpenAPI 3.0 spec).`,
Expand Down
20 changes: 20 additions & 0 deletions packages/migrate/src/utils/OpenApiConverter.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import V2_0Converter from "swagger2openapi";
import typia from "typia";

import { Converter as V3_1Converter } from "@apiture/openapi-down-convert";

import { ISwagger } from "../structures/ISwagger";
import { ISwaggerV20 } from "../structures/ISwaggerV20";
import { ISwaggerV31 } from "../structures/ISwaggerV31";

export namespace OpenApiConverter {
export const v2_0 = async (swagger: ISwaggerV20): Promise<ISwagger> => {
const output = await V2_0Converter.convertObj(swagger, {});
return typia.assert<ISwagger>(output.openapi);
};

export const v3_1 = (swagger: ISwaggerV31): ISwagger => {
const converter = new V3_1Converter(swagger);
return typia.assert<ISwagger>(converter.convert() as ISwagger);
};
}
2 changes: 1 addition & 1 deletion website/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
"@mui/icons-material": "5.15.6",
"@mui/material": "5.15.6",
"@mui/system": "5.15.6",
"@nestia/migrate": "^0.10.0",
"@nestia/migrate": "^0.11.0",
"@stackblitz/sdk": "^1.9.0",
"js-yaml": "^4.1.0",
"next": "14.1.0",
Expand Down
4 changes: 0 additions & 4 deletions website/pages/docs/editor.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,6 @@ import { Callout } from 'nextra-theme-docs'
import EditorMovie from "../../src/movies/editor/EditorMovie";

## TypeScript Swagger Editor
<Callout type="warning">
Supports OpenAPI v3.0 only.
</Callout>

<EditorMovie mode="sdk" />

> Put your `swagger.json` file, then "TypeScript Swagger Editor" be opened.
Expand Down
4 changes: 0 additions & 4 deletions website/pages/docs/migrate.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,6 @@ import EditorMovie from "../../src/movies/editor/EditorMovie";

# Migration from Swagger
## Outline
<Callout type="warning">
Supports OpenAPI v3.0 only.
</Callout>

```bash filename="Terminal" copy showLineNumbers {}
npx @nestia/migrate
```
Expand Down

0 comments on commit a4d0823

Please sign in to comment.