diff --git a/tests/spec/modular/__snapshots__/basic.test.ts.snap b/tests/spec/modular/__snapshots__/basic.test.ts.snap new file mode 100644 index 00000000..ec347ad1 --- /dev/null +++ b/tests/spec/modular/__snapshots__/basic.test.ts.snap @@ -0,0 +1,582 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`basic > modular > api 1`] = ` +"/* eslint-disable */ +/* tslint:disable */ +// @ts-nocheck +/* + * --------------------------------------------------------------- + * ## THIS FILE WAS GENERATED VIA SWAGGER-TYPESCRIPT-API ## + * ## ## + * ## AUTHOR: acacode ## + * ## SOURCE: https://github.com/acacode/swagger-typescript-api ## + * --------------------------------------------------------------- + */ + +import { ApiResponse, Currency, Order, Pet, User } from "./data-contracts"; +import { ContentType, HttpClient, RequestParams } from "./http-client"; + +export class Api< + SecurityDataType = unknown, +> extends HttpClient { + /** + * No description + * + * @tags pet + * @name AddPet + * @summary Add a new pet to the store + * @request POST:api/v1/pet + * @secure + */ + addPet = (body: Pet, params: RequestParams = {}) => + this.request({ + path: \`api/v1/pet\`, + method: "POST", + body: body, + secure: true, + type: ContentType.Json, + ...params, + }); + /** + * No description + * + * @tags pet + * @name UpdatePet + * @summary Update an existing pet + * @request PUT:api/v1/pet + * @secure + */ + updatePet = (body: Pet, params: RequestParams = {}) => + this.request({ + path: \`api/v1/pet\`, + method: "PUT", + body: body, + secure: true, + type: ContentType.Json, + ...params, + }); + /** + * @description Multiple status values can be provided with comma separated strings + * + * @tags pet + * @name FindPetsByStatus + * @summary Finds Pets by status + * @request GET:api/v1/pet/findByStatus + * @secure + */ + findPetsByStatus = ( + query: { + /** Status values that need to be considered for filter */ + status: ("available" | "pending" | "sold")[]; + }, + params: RequestParams = {}, + ) => + this.request({ + path: \`api/v1/pet/findByStatus\`, + method: "GET", + query: query, + secure: true, + format: "json", + ...params, + }); + /** + * @description Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing. + * + * @tags pet + * @name FindPetsByTags + * @summary Finds Pets by tags + * @request GET:api/v1/pet/findByTags + * @deprecated + * @secure + */ + findPetsByTags = ( + query: { + /** Tags to filter by */ + tags: string[]; + }, + params: RequestParams = {}, + ) => + this.request({ + path: \`api/v1/pet/findByTags\`, + method: "GET", + query: query, + secure: true, + format: "json", + ...params, + }); + /** + * @description Returns a single pet + * + * @tags pet + * @name GetPetById + * @summary Find pet by ID + * @request GET:api/v1/pet/{petId} + * @secure + */ + getPetById = (petId: number, params: RequestParams = {}) => + this.request({ + path: \`api/v1/pet/\${petId}\`, + method: "GET", + secure: true, + format: "json", + ...params, + }); + /** + * No description + * + * @tags pet + * @name UpdatePetWithForm + * @summary Updates a pet in the store with form data + * @request POST:api/v1/pet/{petId} + * @secure + */ + updatePetWithForm = ( + petId: number, + data: { + /** Updated name of the pet */ + name?: string; + /** Updated status of the pet */ + status?: string; + }, + params: RequestParams = {}, + ) => + this.request({ + path: \`api/v1/pet/\${petId}\`, + method: "POST", + body: data, + secure: true, + type: ContentType.FormData, + ...params, + }); + /** + * No description + * + * @tags pet + * @name DeletePet + * @summary Deletes a pet + * @request DELETE:api/v1/pet/{petId} + * @secure + */ + deletePet = (petId: number, params: RequestParams = {}) => + this.request({ + path: \`api/v1/pet/\${petId}\`, + method: "DELETE", + secure: true, + ...params, + }); + /** + * No description + * + * @tags pet + * @name UploadFile + * @summary uploads an image + * @request POST:api/v1/pet/{petId}/uploadImage + * @secure + */ + uploadFile = ( + petId: number, + data: { + /** Additional data to pass to server */ + additionalMetadata?: string; + /** file to upload */ + file?: File; + }, + params: RequestParams = {}, + ) => + this.request({ + path: \`api/v1/pet/\${petId}/uploadImage\`, + method: "POST", + body: data, + secure: true, + type: ContentType.FormData, + format: "json", + ...params, + }); + /** + * @description Returns a map of status codes to quantities + * + * @tags store + * @name GetInventory + * @summary Returns pet inventories by status + * @request GET:api/v1/store/inventory + * @secure + */ + getInventory = (params: RequestParams = {}) => + this.request, any>({ + path: \`api/v1/store/inventory\`, + method: "GET", + secure: true, + format: "json", + ...params, + }); + /** + * No description + * + * @tags store + * @name PlaceOrder + * @summary Place an order for a pet + * @request POST:api/v1/store/order + */ + placeOrder = (body: Order, params: RequestParams = {}) => + this.request({ + path: \`api/v1/store/order\`, + method: "POST", + body: body, + type: ContentType.Json, + format: "json", + ...params, + }); + /** + * @description For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions + * + * @tags store + * @name GetOrderById + * @summary Find purchase order by ID + * @request GET:api/v1/store/order/{orderId} + */ + getOrderById = (orderId: number, params: RequestParams = {}) => + this.request({ + path: \`api/v1/store/order/\${orderId}\`, + method: "GET", + format: "json", + ...params, + }); + /** + * @description For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors + * + * @tags store + * @name DeleteOrder + * @summary Delete purchase order by ID + * @request DELETE:api/v1/store/order/{orderId} + */ + deleteOrder = (orderId: string, params: RequestParams = {}) => + this.request({ + path: \`api/v1/store/order/\${orderId}\`, + method: "DELETE", + ...params, + }); + /** + * @description This can only be done by the logged in user. + * + * @tags user + * @name CreateUser + * @summary Create user + * @request POST:api/v1/user + */ + createUser = (body: User, params: RequestParams = {}) => + this.request({ + path: \`api/v1/user\`, + method: "POST", + body: body, + type: ContentType.Json, + ...params, + }); + /** + * No description + * + * @tags user + * @name CreateUsersWithArrayInput + * @summary Creates list of users with given input array + * @request POST:api/v1/user/createWithArray + */ + createUsersWithArrayInput = (body: User[], params: RequestParams = {}) => + this.request({ + path: \`api/v1/user/createWithArray\`, + method: "POST", + body: body, + type: ContentType.Json, + ...params, + }); + /** + * No description + * + * @tags user + * @name CreateUsersWithListInput + * @summary Creates list of users with given input array + * @request POST:api/v1/user/createWithList + */ + createUsersWithListInput = (body: User[], params: RequestParams = {}) => + this.request({ + path: \`api/v1/user/createWithList\`, + method: "POST", + body: body, + type: ContentType.Json, + ...params, + }); + /** + * No description + * + * @tags user + * @name LoginUser + * @summary Logs user into the system + * @request GET:api/v1/user/login + */ + loginUser = ( + query: { + /** The user name for login */ + username: string; + /** The password for login in clear text */ + password: string; + }, + params: RequestParams = {}, + ) => + this.request({ + path: \`api/v1/user/login\`, + method: "GET", + query: query, + format: "json", + ...params, + }); + /** + * No description + * + * @tags user + * @name LogoutUser + * @summary Logs out current logged in user session + * @request GET:api/v1/user/logout + */ + logoutUser = (params: RequestParams = {}) => + this.request({ + path: \`api/v1/user/logout\`, + method: "GET", + ...params, + }); + /** + * No description + * + * @tags user + * @name GetUserByName + * @summary Get user by user name + * @request GET:api/v1/user/{username} + */ + getUserByName = (username: string, params: RequestParams = {}) => + this.request({ + path: \`api/v1/user/\${username}\`, + method: "GET", + format: "json", + ...params, + }); + /** + * @description This can only be done by the logged in user. + * + * @tags user + * @name UpdateUser + * @summary Updated user + * @request PUT:api/v1/user/{username} + */ + updateUser = (username: string, body: User, params: RequestParams = {}) => + this.request({ + path: \`api/v1/user/\${username}\`, + method: "PUT", + body: body, + type: ContentType.Json, + ...params, + }); + /** + * @description This can only be done by the logged in user. + * + * @tags user + * @name DeleteUser + * @summary Delete user + * @request DELETE:api/v1/user/{username} + */ + deleteUser = (username: string, params: RequestParams = {}) => + this.request({ + path: \`api/v1/user/\${username}\`, + method: "DELETE", + ...params, + }); + /** + * No description + * + * @tags user + * @name GetUserByName2 + * @summary Get user by user name + * @request GET:api/v1/{username} + * @originalName getUserByName + * @duplicate + */ + getUserByName2 = (username: string, params: RequestParams = {}) => + this.request({ + path: \`api/v1/\${username}\`, + method: "GET", + format: "json", + ...params, + }); + /** + * @description This can only be done by the logged in user. + * + * @tags user + * @name UpdateUser2 + * @summary Updated user + * @request PUT:api/v1/{username} + * @originalName updateUser + * @duplicate + */ + updateUser2 = (username: string, body: User, params: RequestParams = {}) => + this.request({ + path: \`api/v1/\${username}\`, + method: "PUT", + body: body, + type: ContentType.Json, + ...params, + }); + /** + * @description This can only be done by the logged in user. + * + * @tags user + * @name DeleteUser2 + * @summary Delete user + * @request DELETE:api/v1/{username} + * @originalName deleteUser + * @duplicate + */ + deleteUser2 = (username: string, params: RequestParams = {}) => + this.request({ + path: \`api/v1/\${username}\`, + method: "DELETE", + ...params, + }); +} +" +`; + +exports[`basic > modular > dataContracts 1`] = ` +"/* eslint-disable */ +/* tslint:disable */ +// @ts-nocheck +/* + * --------------------------------------------------------------- + * ## THIS FILE WAS GENERATED VIA SWAGGER-TYPESCRIPT-API ## + * ## ## + * ## AUTHOR: acacode ## + * ## SOURCE: https://github.com/acacode/swagger-typescript-api ## + * --------------------------------------------------------------- + */ + +export enum PetIds { + Value10 = 10, + Value20 = 20, + Value30 = 30, + Value40 = 40, +} + +export enum PetNames { + FluffyHero = "Fluffy Hero", + PiggyPo = "Piggy Po", + SwaggerTypescriptApi = "Swagger Typescript Api", +} + +/** + * Pet Order + * An order for a pets from the pet store + * @example {"petId":6,"quantity":1,"id":0,"shipDate":"2000-01-23T04:56:07.000+00:00","complete":false,"status":"placed"} + */ +export interface Order { + /** @format int64 */ + id?: number; + /** @format int64 */ + petId?: number; + /** @format int32 */ + quantity?: number; + /** @format date-time */ + shipDate?: string; + /** Order Status */ + status?: "placed" | "approved" | "delivered"; + /** @default false */ + complete?: boolean; +} + +/** + * Pet category + * A category for a pet + * @example {"name":"name","id":6} + */ +export interface Category { + /** @format int64 */ + id?: number; + name?: string; +} + +/** + * a User + * A User who is purchasing from the pet store + * @example {"firstName":"firstName","lastName":"lastName","password":"password","userStatus":6,"phone":"phone","id":0,"email":"email","username":"username"} + */ +export interface User { + /** @format int64 */ + id?: number; + username?: string; + firstName?: string; + lastName?: string; + email?: string; + password?: string; + phone?: string; + /** + * User Status + * @format int32 + */ + userStatus?: number; +} + +/** + * Pet Tag + * A tag for a pet + * @example {"name":"name","id":1} + */ +export interface Tag { + /** @format int64 */ + id?: number; + name?: string; +} + +/** + * a Pet + * A pet for sale in the pet store + * @example {"photoUrls":["photoUrls","photoUrls"],"name":"doggie","id":0,"category":{"name":"name","id":6},"tags":[{"name":"name","id":1},{"name":"name","id":1}],"status":"available"} + */ +export interface Pet { + /** @format int64 */ + id?: number; + /** A category for a pet */ + category?: Category; + /** @example "doggie" */ + name: string; + photoUrls: string[]; + tags?: Tag[]; + /** pet status in the store */ + status?: "available" | "pending" | "sold"; +} + +/** + * An uploaded response + * Describes the result of uploading an image resource + * @example {"code":0,"type":"type","message":"message"} + */ +export interface ApiResponse { + /** @format int32 */ + code?: number; + type?: string; + message?: string; +} + +/** some description */ +export interface Amount { + /** + * some description + * @format double + * @min 0.01 + * @max 1000000000000000 + */ + value: number; + /** some description */ + currency: Currency; +} + +/** + * some description + * @pattern ^[A-Z]{3,3}$ + */ +export type Currency = string; +" +`; diff --git a/tests/spec/modular/basic.test.ts b/tests/spec/modular/basic.test.ts new file mode 100644 index 00000000..91523556 --- /dev/null +++ b/tests/spec/modular/basic.test.ts @@ -0,0 +1,42 @@ +import * as fs from "node:fs/promises"; +import * as os from "node:os"; +import * as path from "node:path"; +import { afterAll, beforeAll, describe, expect, test } from "vitest"; +import { generateApi } from "../../../src/index.js"; + +describe("basic", async () => { + let tmpdir = ""; + + beforeAll(async () => { + tmpdir = await fs.mkdtemp(path.join(os.tmpdir(), "swagger-typescript-api")); + }); + + afterAll(async () => { + await fs.rm(tmpdir, { recursive: true }); + }); + + test("modular", async () => { + await generateApi({ + fileName: "schema", + input: path.resolve(import.meta.dirname, "schema.json"), + output: tmpdir, + silent: true, + // @ts-expect-error: fixed in 13.2.8 + modular: true, + }); + + const api = await fs.readFile(path.join(tmpdir, "Api.ts"), { + encoding: "utf8", + }); + + const dataContracts = await fs.readFile( + path.join(tmpdir, "data-contracts.ts"), + { + encoding: "utf8", + }, + ); + + expect(api).toMatchSnapshot("api"); + expect(dataContracts).toMatchSnapshot("dataContracts"); + }); +}); diff --git a/tests/spec/modular/schema.json b/tests/spec/modular/schema.json new file mode 100644 index 00000000..6841c821 --- /dev/null +++ b/tests/spec/modular/schema.json @@ -0,0 +1,1099 @@ +{ + "swagger": "2.0", + "info": { + "description": "This is a sample server Petstore server. You can find out more about Swagger at [http://swagger.io](http://swagger.io) or on [irc.freenode.net, #swagger](http://swagger.io/irc/). For this sample, you can use the api key `special-key` to test the authorization filters.", + "version": "1.0.0", + "title": "Swagger Petstore", + "termsOfService": "http://swagger.io/terms/", + "contact": { + "email": "apiteam@swagger.io" + }, + "license": { + "name": "Apache-2.0", + "url": "http://www.apache.org/licenses/LICENSE-2.0.html" + } + }, + "host": "petstore.swagger.io", + "basePath": "/v2", + "tags": [ + { + "name": "pet", + "description": "Everything about your Pets", + "externalDocs": { + "description": "Find out more", + "url": "http://swagger.io" + } + }, + { + "name": "store", + "description": "Access to Petstore orders" + }, + { + "name": "user", + "description": "Operations about user", + "externalDocs": { + "description": "Find out more about our store", + "url": "http://swagger.io" + } + } + ], + "schemes": ["http"], + "paths": { + "api/v1/pet": { + "post": { + "tags": ["pet"], + "summary": "Add a new pet to the store", + "description": "", + "operationId": "addPet", + "consumes": ["application/json", "application/xml"], + "produces": ["application/xml", "application/json"], + "parameters": [ + { + "in": "body", + "name": "body", + "description": "Pet object that needs to be added to the store", + "required": true, + "schema": { + "$ref": "#/definitions/Pet" + } + } + ], + "responses": { + "405": { + "description": "Invalid input" + } + }, + "security": [ + { + "petstore_auth": ["write:pets", "read:pets"] + } + ], + "x-contentType": "application/json", + "x-accepts": "application/json" + }, + "put": { + "tags": ["pet"], + "summary": "Update an existing pet", + "description": "", + "operationId": "updatePet", + "consumes": ["application/json", "application/xml"], + "produces": ["application/xml", "application/json"], + "parameters": [ + { + "in": "body", + "name": "body", + "description": "Pet object that needs to be added to the store", + "required": true, + "schema": { + "$ref": "#/definitions/Pet" + } + } + ], + "responses": { + "400": { + "description": "Invalid ID supplied" + }, + "404": { + "description": "Pet not found" + }, + "405": { + "description": "Validation exception" + } + }, + "security": [ + { + "petstore_auth": ["write:pets", "read:pets"] + } + ], + "x-contentType": "application/json", + "x-accepts": "application/json" + } + }, + "api/v1/pet/findByStatus": { + "get": { + "tags": ["pet"], + "summary": "Finds Pets by status", + "description": "Multiple status values can be provided with comma separated strings", + "operationId": "findPetsByStatus", + "produces": ["application/xml", "application/json"], + "parameters": [ + { + "name": "status", + "in": "query", + "description": "Status values that need to be considered for filter", + "required": true, + "type": "array", + "items": { + "type": "string", + "default": "available", + "enum": ["available", "pending", "sold"] + }, + "collectionFormat": "csv" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/Pet" + } + } + }, + "400": { + "description": "Invalid status value" + } + }, + "security": [ + { + "petstore_auth": ["write:pets", "read:pets"] + } + ], + "x-accepts": "application/json" + } + }, + "api/v1/pet/findByTags": { + "get": { + "tags": ["pet"], + "summary": "Finds Pets by tags", + "description": "Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing.", + "operationId": "findPetsByTags", + "produces": ["application/xml", "application/json"], + "parameters": [ + { + "name": "tags", + "in": "query", + "description": "Tags to filter by", + "required": true, + "type": "array", + "items": { + "type": "string" + }, + "collectionFormat": "csv" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/Pet" + } + } + }, + "400": { + "description": "Invalid tag value" + } + }, + "security": [ + { + "petstore_auth": ["write:pets", "read:pets"] + } + ], + "deprecated": true, + "x-accepts": "application/json" + } + }, + "api/v1/pet/{petId}": { + "get": { + "tags": ["pet"], + "summary": "Find pet by ID", + "description": "Returns a single pet", + "operationId": "getPetById", + "produces": ["application/xml", "application/json"], + "parameters": [ + { + "name": "petId", + "in": "path", + "description": "ID of pet to return", + "required": true, + "type": "integer", + "format": "int64" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/Pet" + } + }, + "400": { + "description": "Invalid ID supplied" + }, + "404": { + "description": "Pet not found" + } + }, + "security": [ + { + "api_key": [] + } + ], + "x-accepts": "application/json" + }, + "post": { + "tags": ["pet"], + "summary": "Updates a pet in the store with form data", + "description": "", + "operationId": "updatePetWithForm", + "consumes": ["application/x-www-form-urlencoded"], + "produces": ["application/xml", "application/json"], + "parameters": [ + { + "name": "petId", + "in": "path", + "description": "ID of pet that needs to be updated", + "required": true, + "type": "integer", + "format": "int64" + }, + { + "name": "name", + "in": "formData", + "description": "Updated name of the pet", + "required": false, + "type": "string" + }, + { + "name": "status", + "in": "formData", + "description": "Updated status of the pet", + "required": false, + "type": "string" + } + ], + "responses": { + "405": { + "description": "Invalid input" + } + }, + "security": [ + { + "petstore_auth": ["write:pets", "read:pets"] + } + ], + "x-contentType": "application/x-www-form-urlencoded", + "x-accepts": "application/json" + }, + "delete": { + "tags": ["pet"], + "summary": "Deletes a pet", + "description": "", + "operationId": "deletePet", + "produces": ["application/xml", "application/json"], + "parameters": [ + { + "name": "api_key", + "in": "header", + "required": false, + "type": "string" + }, + { + "name": "petId", + "in": "path", + "description": "Pet id to delete", + "required": true, + "type": "integer", + "format": "int64" + } + ], + "responses": { + "400": { + "description": "Invalid pet value" + } + }, + "security": [ + { + "petstore_auth": ["write:pets", "read:pets"] + } + ], + "x-accepts": "application/json" + } + }, + "api/v1/pet/{petId}/uploadImage": { + "post": { + "tags": ["pet"], + "summary": "uploads an image", + "description": "", + "operationId": "uploadFile", + "consumes": ["multipart/form-data"], + "produces": ["application/json"], + "parameters": [ + { + "name": "petId", + "in": "path", + "description": "ID of pet to update", + "required": true, + "type": "integer", + "format": "int64" + }, + { + "name": "additionalMetadata", + "in": "formData", + "description": "Additional data to pass to server", + "required": false, + "type": "string" + }, + { + "name": "file", + "in": "formData", + "description": "file to upload", + "required": false, + "type": "file" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/ApiResponse" + } + } + }, + "security": [ + { + "petstore_auth": ["write:pets", "read:pets"] + } + ], + "x-contentType": "multipart/form-data", + "x-accepts": "application/json" + } + }, + "api/v1/store/inventory": { + "get": { + "tags": ["store"], + "summary": "Returns pet inventories by status", + "description": "Returns a map of status codes to quantities", + "operationId": "getInventory", + "produces": ["application/json"], + "parameters": [], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "type": "object", + "additionalProperties": { + "type": "integer", + "format": "int32" + } + } + } + }, + "security": [ + { + "api_key": [] + } + ], + "x-accepts": "application/json" + } + }, + "api/v1/store/order": { + "post": { + "tags": ["store"], + "summary": "Place an order for a pet", + "description": "", + "operationId": "placeOrder", + "produces": ["application/xml", "application/json"], + "parameters": [ + { + "in": "body", + "name": "body", + "description": "order placed for purchasing the pet", + "required": true, + "schema": { + "$ref": "#/definitions/Order" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/Order" + } + }, + "400": { + "description": "Invalid Order" + } + }, + "x-contentType": "application/json", + "x-accepts": "application/json" + } + }, + "api/v1/store/order/{orderId}": { + "get": { + "tags": ["store"], + "summary": "Find purchase order by ID", + "description": "For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions", + "operationId": "getOrderById", + "produces": ["application/xml", "application/json"], + "parameters": [ + { + "name": "orderId", + "in": "path", + "description": "ID of pet that needs to be fetched", + "required": true, + "type": "integer", + "maximum": 5, + "minimum": 1, + "format": "int64" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/Order" + } + }, + "400": { + "description": "Invalid ID supplied" + }, + "404": { + "description": "Order not found" + } + }, + "x-accepts": "application/json" + }, + "delete": { + "tags": ["store"], + "summary": "Delete purchase order by ID", + "description": "For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors", + "operationId": "deleteOrder", + "produces": ["application/xml", "application/json"], + "parameters": [ + { + "name": "orderId", + "in": "path", + "description": "ID of the order that needs to be deleted", + "required": true, + "type": "string" + } + ], + "responses": { + "400": { + "description": "Invalid ID supplied" + }, + "404": { + "description": "Order not found" + } + }, + "x-accepts": "application/json" + } + }, + "api/v1/user": { + "post": { + "tags": ["user"], + "summary": "Create user", + "description": "This can only be done by the logged in user.", + "operationId": "createUser", + "produces": ["application/xml", "application/json"], + "parameters": [ + { + "in": "body", + "name": "body", + "description": "Created user object", + "required": true, + "schema": { + "$ref": "#/definitions/User" + } + } + ], + "responses": { + "default": { + "description": "successful operation" + } + }, + "x-contentType": "application/json", + "x-accepts": "application/json" + } + }, + "api/v1/user/createWithArray": { + "post": { + "tags": ["user"], + "summary": "Creates list of users with given input array", + "description": "", + "operationId": "createUsersWithArrayInput", + "produces": ["application/xml", "application/json"], + "parameters": [ + { + "in": "body", + "name": "body", + "description": "List of user object", + "required": true, + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/User" + } + } + } + ], + "responses": { + "default": { + "description": "successful operation" + } + }, + "x-contentType": "application/json", + "x-accepts": "application/json" + } + }, + "api/v1/user/createWithList": { + "post": { + "tags": ["user"], + "summary": "Creates list of users with given input array", + "description": "", + "operationId": "createUsersWithListInput", + "produces": ["application/xml", "application/json"], + "parameters": [ + { + "in": "body", + "name": "body", + "description": "List of user object", + "required": true, + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/User" + } + } + } + ], + "responses": { + "default": { + "description": "successful operation" + } + }, + "x-contentType": "application/json", + "x-accepts": "application/json" + } + }, + "api/v1/user/login": { + "get": { + "tags": ["user"], + "summary": "Logs user into the system", + "description": "", + "operationId": "loginUser", + "produces": ["application/xml", "application/json"], + "parameters": [ + { + "name": "username", + "in": "query", + "description": "The user name for login", + "required": true, + "type": "string" + }, + { + "name": "password", + "in": "query", + "description": "The password for login in clear text", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "successful operation", + "headers": { + "X-Rate-Limit": { + "type": "integer", + "format": "int32", + "description": "calls per hour allowed by the user" + }, + "X-Expires-After": { + "type": "string", + "format": "date-time", + "description": "date in UTC when toekn expires" + } + }, + "schema": { + "type": "string" + } + }, + "400": { + "description": "Invalid username/password supplied" + } + }, + "x-accepts": "application/json" + } + }, + "api/v1/user/logout": { + "get": { + "tags": ["user"], + "summary": "Logs out current logged in user session", + "description": "", + "operationId": "logoutUser", + "produces": ["application/xml", "application/json"], + "parameters": [], + "responses": { + "default": { + "description": "successful operation" + } + }, + "x-accepts": "application/json" + } + }, + "api/v1/user/{username}": { + "get": { + "tags": ["user"], + "summary": "Get user by user name", + "description": "", + "operationId": "getUserByName", + "produces": ["application/xml", "application/json"], + "parameters": [ + { + "name": "username", + "in": "path", + "description": "The name that needs to be fetched. Use user1 for testing.", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/User" + } + }, + "400": { + "description": "Invalid username supplied" + }, + "404": { + "description": "User not found" + } + }, + "x-accepts": "application/json" + }, + "put": { + "tags": ["user"], + "summary": "Updated user", + "description": "This can only be done by the logged in user.", + "operationId": "updateUser", + "produces": ["application/xml", "application/json"], + "parameters": [ + { + "name": "username", + "in": "path", + "description": "name that need to be deleted", + "required": true, + "type": "string" + }, + { + "in": "body", + "name": "body", + "description": "Updated user object", + "required": true, + "schema": { + "$ref": "#/definitions/User" + } + } + ], + "responses": { + "400": { + "description": "Invalid user supplied" + }, + "404": { + "description": "User not found" + } + }, + "x-contentType": "application/json", + "x-accepts": "application/json" + }, + "delete": { + "tags": ["user"], + "summary": "Delete user", + "description": "This can only be done by the logged in user.", + "operationId": "deleteUser", + "produces": ["application/xml", "application/json"], + "parameters": [ + { + "name": "username", + "in": "path", + "description": "The name that needs to be deleted", + "required": true, + "type": "string" + } + ], + "responses": { + "400": { + "description": "Invalid username supplied" + }, + "404": { + "description": "User not found" + } + }, + "x-accepts": "application/json" + } + }, + "api/v1/{username}": { + "get": { + "tags": ["user"], + "summary": "Get user by user name", + "description": "", + "operationId": "getUserByName", + "produces": ["application/xml", "application/json"], + "parameters": [ + { + "name": "username", + "in": "path", + "description": "The name that needs to be fetched. Use user1 for testing.", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/User" + } + }, + "400": { + "description": "Invalid username supplied" + }, + "404": { + "description": "User not found" + } + }, + "x-accepts": "application/json" + }, + "put": { + "tags": ["user"], + "summary": "Updated user", + "description": "This can only be done by the logged in user.", + "operationId": "updateUser", + "produces": ["application/xml", "application/json"], + "parameters": [ + { + "name": "username", + "in": "path", + "description": "name that need to be deleted", + "required": true, + "type": "string" + }, + { + "in": "body", + "name": "body", + "description": "Updated user object", + "required": true, + "schema": { + "$ref": "#/definitions/User" + } + } + ], + "responses": { + "400": { + "description": "Invalid user supplied" + }, + "404": { + "description": "User not found" + } + }, + "x-contentType": "application/json", + "x-accepts": "application/json" + }, + "delete": { + "tags": ["user"], + "summary": "Delete user", + "description": "This can only be done by the logged in user.", + "operationId": "deleteUser", + "produces": ["application/xml", "application/json"], + "parameters": [ + { + "name": "username", + "in": "path", + "description": "The name that needs to be deleted", + "required": true, + "type": "string" + } + ], + "responses": { + "400": { + "description": "Invalid username supplied" + }, + "404": { + "description": "User not found" + } + }, + "x-accepts": "application/json" + } + } + }, + "securityDefinitions": { + "petstore_auth": { + "type": "oauth2", + "authorizationUrl": "http://petstore.swagger.io/api/v1/oauth/dialog", + "flow": "implicit", + "scopes": { + "write:pets": "modify pets in your account", + "read:pets": "read your pets" + } + }, + "api_key": { + "type": "apiKey", + "name": "api_key", + "in": "header" + } + }, + "definitions": { + "Order": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int64" + }, + "petId": { + "type": "integer", + "format": "int64" + }, + "quantity": { + "type": "integer", + "format": "int32" + }, + "shipDate": { + "type": "string", + "format": "date-time" + }, + "status": { + "type": "string", + "description": "Order Status", + "enum": ["placed", "approved", "delivered"] + }, + "complete": { + "type": "boolean", + "default": false + } + }, + "title": "Pet Order", + "xml": { + "name": "Order" + }, + "description": "An order for a pets from the pet store", + "example": { + "petId": 6, + "quantity": 1, + "id": 0, + "shipDate": "2000-01-23T04:56:07.000+00:00", + "complete": false, + "status": "placed" + } + }, + "Category": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int64" + }, + "name": { + "type": "string" + } + }, + "title": "Pet category", + "xml": { + "name": "Category" + }, + "description": "A category for a pet", + "example": { + "name": "name", + "id": 6 + } + }, + "User": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int64" + }, + "username": { + "type": "string" + }, + "firstName": { + "type": "string" + }, + "lastName": { + "type": "string" + }, + "email": { + "type": "string" + }, + "password": { + "type": "string" + }, + "phone": { + "type": "string" + }, + "userStatus": { + "type": "integer", + "format": "int32", + "description": "User Status" + } + }, + "title": "a User", + "xml": { + "name": "User" + }, + "description": "A User who is purchasing from the pet store", + "example": { + "firstName": "firstName", + "lastName": "lastName", + "password": "password", + "userStatus": 6, + "phone": "phone", + "id": 0, + "email": "email", + "username": "username" + } + }, + "Tag": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int64" + }, + "name": { + "type": "string" + } + }, + "title": "Pet Tag", + "xml": { + "name": "Tag" + }, + "description": "A tag for a pet", + "example": { + "name": "name", + "id": 1 + } + }, + "PetNames": { + "type": "string", + "enum": ["Fluffy Hero", "Piggy Po", "Swagger Typescript Api"] + }, + "PetIds": { + "type": "integer", + "enum": [10, 20, 30, 40] + }, + "Pet": { + "type": "object", + "required": ["name", "photoUrls"], + "properties": { + "id": { + "type": "integer", + "format": "int64" + }, + "category": { + "$ref": "#/definitions/Category" + }, + "name": { + "type": "string", + "example": "doggie" + }, + "photoUrls": { + "type": "array", + "xml": { + "name": "photoUrl", + "wrapped": true + }, + "items": { + "type": "string" + } + }, + "tags": { + "type": "array", + "xml": { + "name": "tag", + "wrapped": true + }, + "items": { + "$ref": "#/definitions/Tag" + } + }, + "status": { + "type": "string", + "description": "pet status in the store", + "enum": ["available", "pending", "sold"] + } + }, + "title": "a Pet", + "xml": { + "name": "Pet" + }, + "description": "A pet for sale in the pet store", + "example": { + "photoUrls": ["photoUrls", "photoUrls"], + "name": "doggie", + "id": 0, + "category": { + "name": "name", + "id": 6 + }, + "tags": [ + { + "name": "name", + "id": 1 + }, + { + "name": "name", + "id": 1 + } + ], + "status": "available" + } + }, + "ApiResponse": { + "type": "object", + "properties": { + "code": { + "type": "integer", + "format": "int32" + }, + "type": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "title": "An uploaded response", + "description": "Describes the result of uploading an image resource", + "example": { + "code": 0, + "type": "type", + "message": "message" + } + }, + "Amount": { + "type": "object", + "required": ["currency", "value"], + "properties": { + "value": { + "type": "number", + "format": "double", + "description": "some description\n", + "minimum": 0.01, + "maximum": 1000000000000000 + }, + "currency": { + "$ref": "#/definitions/Currency" + } + }, + "description": "some description\n" + }, + "Currency": { + "type": "string", + "pattern": "^[A-Z]{3,3}$", + "description": "some description\n" + } + }, + "externalDocs": { + "description": "Find out more about Swagger", + "url": "http://swagger.io" + } +}