diff --git a/.changeset/default-request-params.md b/.changeset/default-request-params.md new file mode 100644 index 000000000..d45dafdd7 --- /dev/null +++ b/.changeset/default-request-params.md @@ -0,0 +1,9 @@ +--- +"swagger-typescript-api": patch +--- + +Add possibility to change default request params + +Useful when overriding the http client, and you want to make sure the request params are set. + +Can be set to `""` in order to not make it optional. diff --git a/index.ts b/index.ts index f3356e94e..6c6d71865 100644 --- a/index.ts +++ b/index.ts @@ -283,6 +283,11 @@ const generateCommand = defineCommand({ description: "unwrap the data item from the response", default: codeGenBaseConfig.unwrapResponseData, }, + "default-request-params": { + type: "string", + description: "request parameters for each API request", + default: codeGenBaseConfig.defaultRequestParams, + }, }, run: async ({ args }) => { const customConfig = await loadConfig({ @@ -298,6 +303,7 @@ const generateCommand = defineCommand({ debug: args.debug, defaultResponseAsSuccess: args["default-as-success"], defaultResponseType: args["default-response"], + defaultRequestParams: args["default-request-params"], disableThrowOnError: args["disable-throw-on-error"], enumNamesAsValues: args["enum-names-as-values"], extractEnums: args["extract-enums"], diff --git a/src/configuration.ts b/src/configuration.ts index ea3f48b38..bea9bfa8b 100644 --- a/src/configuration.ts +++ b/src/configuration.ts @@ -111,6 +111,7 @@ export class CodeGenConfig { onFormatRouteName: (_routeInfo: unknown, _templateRouteName: unknown) => {}, }; defaultResponseType; + defaultRequestParams = "{}"; singleHttpClient = false; httpClientType = CONSTANTS.HTTP_CLIENT.FETCH; unwrapResponseData = false; diff --git a/templates/default/procedure-call.ejs b/templates/default/procedure-call.ejs index 90af47bdd..d64515c90 100644 --- a/templates/default/procedure-call.ejs +++ b/templates/default/procedure-call.ejs @@ -14,9 +14,9 @@ const isFetchTemplate = config.httpClientType === HTTP_CLIENT.FETCH; const requestConfigParam = { name: specificArgNameResolver.resolve(RESERVED_REQ_PARAMS_ARG_NAMES), - optional: true, + optional: !!config.defaultRequestParams, type: "RequestParams", - defaultValue: "{}", + defaultValue: config.defaultRequestParams ?? "{}", } const argToTmpl = ({ name, optional, type, defaultValue }) => `${name}${!defaultValue && optional ? '?' : ''}: ${type}${defaultValue ? ` = ${defaultValue}` : ''}`; diff --git a/templates/modular/procedure-call.ejs b/templates/modular/procedure-call.ejs index 8a95a5c0d..d45c53be7 100644 --- a/templates/modular/procedure-call.ejs +++ b/templates/modular/procedure-call.ejs @@ -14,9 +14,9 @@ const isFetchTemplate = config.httpClientType === HTTP_CLIENT.FETCH; const requestConfigParam = { name: specificArgNameResolver.resolve(RESERVED_REQ_PARAMS_ARG_NAMES), - optional: true, + optional: !!config.defaultRequestParams, type: "RequestParams", - defaultValue: "{}", + defaultValue: config.defaultRequestParams ?? "{}", } const argToTmpl = ({ name, optional, type, defaultValue }) => `${name}${!defaultValue && optional ? '?' : ''}: ${type}${defaultValue ? ` = ${defaultValue}` : ''}`; diff --git a/tests/spec/defaultRequestParams/__snapshots__/basic.test.ts.snap b/tests/spec/defaultRequestParams/__snapshots__/basic.test.ts.snap new file mode 100644 index 000000000..73aea724c --- /dev/null +++ b/tests/spec/defaultRequestParams/__snapshots__/basic.test.ts.snap @@ -0,0 +1,3442 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`basic > defaultRequestParams > schema.ts 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; + +export type QueryParamsType = Record; +export type ResponseFormat = keyof Omit; + +export interface FullRequestParams extends Omit { + /** set parameter to \`true\` for call \`securityWorker\` for this request */ + secure?: boolean; + /** request path */ + path: string; + /** content type of request body */ + type?: ContentType; + /** query params */ + query?: QueryParamsType; + /** format of response (i.e. response.json() -> format: "json") */ + format?: ResponseFormat; + /** request body */ + body?: unknown; + /** base url */ + baseUrl?: string; + /** request cancellation token */ + cancelToken?: CancelToken; +} + +export type RequestParams = Omit< + FullRequestParams, + "body" | "method" | "query" | "path" +>; + +export interface ApiConfig { + baseUrl?: string; + baseApiParams?: Omit; + securityWorker?: ( + securityData: SecurityDataType | null, + ) => Promise | RequestParams | void; + customFetch?: typeof fetch; +} + +export interface HttpResponse + extends Response { + data: D; + error: E; +} + +type CancelToken = Symbol | string | number; + +export enum ContentType { + Json = "application/json", + JsonApi = "application/vnd.api+json", + FormData = "multipart/form-data", + UrlEncoded = "application/x-www-form-urlencoded", + Text = "text/plain", +} + +export class HttpClient { + public baseUrl: string = "http://petstore.swagger.io/v2"; + private securityData: SecurityDataType | null = null; + private securityWorker?: ApiConfig["securityWorker"]; + private abortControllers = new Map(); + private customFetch = (...fetchParams: Parameters) => + fetch(...fetchParams); + + private baseApiParams: RequestParams = { + credentials: "same-origin", + headers: {}, + redirect: "follow", + referrerPolicy: "no-referrer", + }; + + constructor(apiConfig: ApiConfig = {}) { + Object.assign(this, apiConfig); + } + + public setSecurityData = (data: SecurityDataType | null) => { + this.securityData = data; + }; + + protected encodeQueryParam(key: string, value: any) { + const encodedKey = encodeURIComponent(key); + return \`\${encodedKey}=\${encodeURIComponent(typeof value === "number" ? value : \`\${value}\`)}\`; + } + + protected addQueryParam(query: QueryParamsType, key: string) { + return this.encodeQueryParam(key, query[key]); + } + + protected addArrayQueryParam(query: QueryParamsType, key: string) { + const value = query[key]; + return value.map((v: any) => this.encodeQueryParam(key, v)).join("&"); + } + + protected toQueryString(rawQuery?: QueryParamsType): string { + const query = rawQuery || {}; + const keys = Object.keys(query).filter( + (key) => "undefined" !== typeof query[key], + ); + return keys + .map((key) => + Array.isArray(query[key]) + ? this.addArrayQueryParam(query, key) + : this.addQueryParam(query, key), + ) + .join("&"); + } + + protected addQueryParams(rawQuery?: QueryParamsType): string { + const queryString = this.toQueryString(rawQuery); + return queryString ? \`?\${queryString}\` : ""; + } + + private contentFormatters: Record any> = { + [ContentType.Json]: (input: any) => + input !== null && (typeof input === "object" || typeof input === "string") + ? JSON.stringify(input) + : input, + [ContentType.JsonApi]: (input: any) => + input !== null && (typeof input === "object" || typeof input === "string") + ? JSON.stringify(input) + : input, + [ContentType.Text]: (input: any) => + input !== null && typeof input !== "string" + ? JSON.stringify(input) + : input, + [ContentType.FormData]: (input: any) => { + if (input instanceof FormData) { + return input; + } + + return Object.keys(input || {}).reduce((formData, key) => { + const property = input[key]; + formData.append( + key, + property instanceof Blob + ? property + : typeof property === "object" && property !== null + ? JSON.stringify(property) + : \`\${property}\`, + ); + return formData; + }, new FormData()); + }, + [ContentType.UrlEncoded]: (input: any) => this.toQueryString(input), + }; + + protected mergeRequestParams( + params1: RequestParams, + params2?: RequestParams, + ): RequestParams { + return { + ...this.baseApiParams, + ...params1, + ...(params2 || {}), + headers: { + ...(this.baseApiParams.headers || {}), + ...(params1.headers || {}), + ...((params2 && params2.headers) || {}), + }, + }; + } + + protected createAbortSignal = ( + cancelToken: CancelToken, + ): AbortSignal | undefined => { + if (this.abortControllers.has(cancelToken)) { + const abortController = this.abortControllers.get(cancelToken); + if (abortController) { + return abortController.signal; + } + return void 0; + } + + const abortController = new AbortController(); + this.abortControllers.set(cancelToken, abortController); + return abortController.signal; + }; + + public abortRequest = (cancelToken: CancelToken) => { + const abortController = this.abortControllers.get(cancelToken); + + if (abortController) { + abortController.abort(); + this.abortControllers.delete(cancelToken); + } + }; + + public request = async ({ + body, + secure, + path, + type, + query, + format, + baseUrl, + cancelToken, + ...params + }: FullRequestParams): Promise> => { + const secureParams = + ((typeof secure === "boolean" ? secure : this.baseApiParams.secure) && + this.securityWorker && + (await this.securityWorker(this.securityData))) || + {}; + const requestParams = this.mergeRequestParams(params, secureParams); + const queryString = query && this.toQueryString(query); + const payloadFormatter = this.contentFormatters[type || ContentType.Json]; + const responseFormat = format || requestParams.format; + + return this.customFetch( + \`\${baseUrl || this.baseUrl || ""}\${path}\${queryString ? \`?\${queryString}\` : ""}\`, + { + ...requestParams, + headers: { + ...(requestParams.headers || {}), + ...(type && type !== ContentType.FormData + ? { "Content-Type": type } + : {}), + }, + signal: + (cancelToken + ? this.createAbortSignal(cancelToken) + : requestParams.signal) || null, + body: + typeof body === "undefined" || body === null + ? null + : payloadFormatter(body), + }, + ).then(async (response) => { + const r = response as HttpResponse; + r.data = null as unknown as T; + r.error = null as unknown as E; + + const responseToParse = responseFormat ? response.clone() : response; + const data = !responseFormat + ? r + : await responseToParse[responseFormat]() + .then((data) => { + if (r.ok) { + r.data = data; + } else { + r.error = data; + } + return r; + }) + .catch((e) => { + r.error = e; + return r; + }); + + if (cancelToken) { + this.abortControllers.delete(cancelToken); + } + + if (!response.ok) throw data; + return data; + }); + }; +} + +/** + * @title Swagger Petstore + * @version 1.0.0 + * @license Apache-2.0 (http://www.apache.org/licenses/LICENSE-2.0.html) + * @termsOfService http://swagger.io/terms/ + * @baseUrl http://petstore.swagger.io/v2 + * @externalDocs http://swagger.io + * @contact + * + * 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. + */ +export class Api< + SecurityDataType extends unknown, +> extends HttpClient { + api = { + /** + * 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 = { mod: false }) => + 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 = { mod: false }) => + 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 = { mod: false }, + ) => + 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 = { mod: false }, + ) => + 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 = { mod: false }) => + 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 = { mod: false }, + ) => + 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 = { mod: false }) => + 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 = { mod: false }, + ) => + 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 = { mod: false }) => + 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 = { mod: false }) => + 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 = { mod: false }) => + 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 = { mod: false }) => + 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 = { mod: false }) => + 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 = { mod: false }, + ) => + 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 = { mod: false }, + ) => + 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 = { mod: false }, + ) => + 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 = { mod: false }) => + 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 = { mod: false }) => + 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 = { mod: false }, + ) => + 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 = { mod: false }) => + 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 = { mod: false }, + ) => + 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 = { mod: false }, + ) => + 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 = { mod: false }) => + this.request({ + path: \`api/v1/\${username}\`, + method: "DELETE", + ...params, + }), + }; +} +" +`; + +exports[`basic > defaultRequestParams modular > Api.ts 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 = { mod: true }) => + 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 = { mod: true }) => + 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 = { mod: true }, + ) => + 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 = { mod: true }, + ) => + 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 = { mod: true }) => + 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 = { mod: true }, + ) => + 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 = { mod: true }) => + 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 = { mod: true }, + ) => + 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 = { mod: true }) => + 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 = { mod: true }) => + 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 = { mod: true }) => + 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 = { mod: true }) => + 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 = { mod: true }) => + 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 = { mod: true }, + ) => + 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 = { mod: true }, + ) => + 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 = { mod: true }, + ) => + 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 = { mod: true }) => + 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 = { mod: true }) => + 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 = { mod: true }, + ) => + 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 = { mod: true }) => + 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 = { mod: true }) => + 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 = { mod: true }, + ) => + 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 = { mod: true }) => + this.request({ + path: \`api/v1/\${username}\`, + method: "DELETE", + ...params, + }); +} +" +`; + +exports[`basic > defaultRequestParams modular > data-contracts.ts 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; +" +`; + +exports[`basic > defaultRequestParams modular > http-client.ts 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 type QueryParamsType = Record; +export type ResponseFormat = keyof Omit; + +export interface FullRequestParams extends Omit { + /** set parameter to \`true\` for call \`securityWorker\` for this request */ + secure?: boolean; + /** request path */ + path: string; + /** content type of request body */ + type?: ContentType; + /** query params */ + query?: QueryParamsType; + /** format of response (i.e. response.json() -> format: "json") */ + format?: ResponseFormat; + /** request body */ + body?: unknown; + /** base url */ + baseUrl?: string; + /** request cancellation token */ + cancelToken?: CancelToken; +} + +export type RequestParams = Omit< + FullRequestParams, + "body" | "method" | "query" | "path" +>; + +export interface ApiConfig { + baseUrl?: string; + baseApiParams?: Omit; + securityWorker?: ( + securityData: SecurityDataType | null, + ) => Promise | RequestParams | void; + customFetch?: typeof fetch; +} + +export interface HttpResponse + extends Response { + data: D; + error: E; +} + +type CancelToken = Symbol | string | number; + +export enum ContentType { + Json = "application/json", + JsonApi = "application/vnd.api+json", + FormData = "multipart/form-data", + UrlEncoded = "application/x-www-form-urlencoded", + Text = "text/plain", +} + +export class HttpClient { + public baseUrl: string = "http://petstore.swagger.io/v2"; + private securityData: SecurityDataType | null = null; + private securityWorker?: ApiConfig["securityWorker"]; + private abortControllers = new Map(); + private customFetch = (...fetchParams: Parameters) => + fetch(...fetchParams); + + private baseApiParams: RequestParams = { + credentials: "same-origin", + headers: {}, + redirect: "follow", + referrerPolicy: "no-referrer", + }; + + constructor(apiConfig: ApiConfig = {}) { + Object.assign(this, apiConfig); + } + + public setSecurityData = (data: SecurityDataType | null) => { + this.securityData = data; + }; + + protected encodeQueryParam(key: string, value: any) { + const encodedKey = encodeURIComponent(key); + return \`\${encodedKey}=\${encodeURIComponent(typeof value === "number" ? value : \`\${value}\`)}\`; + } + + protected addQueryParam(query: QueryParamsType, key: string) { + return this.encodeQueryParam(key, query[key]); + } + + protected addArrayQueryParam(query: QueryParamsType, key: string) { + const value = query[key]; + return value.map((v: any) => this.encodeQueryParam(key, v)).join("&"); + } + + protected toQueryString(rawQuery?: QueryParamsType): string { + const query = rawQuery || {}; + const keys = Object.keys(query).filter( + (key) => "undefined" !== typeof query[key], + ); + return keys + .map((key) => + Array.isArray(query[key]) + ? this.addArrayQueryParam(query, key) + : this.addQueryParam(query, key), + ) + .join("&"); + } + + protected addQueryParams(rawQuery?: QueryParamsType): string { + const queryString = this.toQueryString(rawQuery); + return queryString ? \`?\${queryString}\` : ""; + } + + private contentFormatters: Record any> = { + [ContentType.Json]: (input: any) => + input !== null && (typeof input === "object" || typeof input === "string") + ? JSON.stringify(input) + : input, + [ContentType.JsonApi]: (input: any) => + input !== null && (typeof input === "object" || typeof input === "string") + ? JSON.stringify(input) + : input, + [ContentType.Text]: (input: any) => + input !== null && typeof input !== "string" + ? JSON.stringify(input) + : input, + [ContentType.FormData]: (input: any) => { + if (input instanceof FormData) { + return input; + } + + return Object.keys(input || {}).reduce((formData, key) => { + const property = input[key]; + formData.append( + key, + property instanceof Blob + ? property + : typeof property === "object" && property !== null + ? JSON.stringify(property) + : \`\${property}\`, + ); + return formData; + }, new FormData()); + }, + [ContentType.UrlEncoded]: (input: any) => this.toQueryString(input), + }; + + protected mergeRequestParams( + params1: RequestParams, + params2?: RequestParams, + ): RequestParams { + return { + ...this.baseApiParams, + ...params1, + ...(params2 || {}), + headers: { + ...(this.baseApiParams.headers || {}), + ...(params1.headers || {}), + ...((params2 && params2.headers) || {}), + }, + }; + } + + protected createAbortSignal = ( + cancelToken: CancelToken, + ): AbortSignal | undefined => { + if (this.abortControllers.has(cancelToken)) { + const abortController = this.abortControllers.get(cancelToken); + if (abortController) { + return abortController.signal; + } + return void 0; + } + + const abortController = new AbortController(); + this.abortControllers.set(cancelToken, abortController); + return abortController.signal; + }; + + public abortRequest = (cancelToken: CancelToken) => { + const abortController = this.abortControllers.get(cancelToken); + + if (abortController) { + abortController.abort(); + this.abortControllers.delete(cancelToken); + } + }; + + public request = async ({ + body, + secure, + path, + type, + query, + format, + baseUrl, + cancelToken, + ...params + }: FullRequestParams): Promise> => { + const secureParams = + ((typeof secure === "boolean" ? secure : this.baseApiParams.secure) && + this.securityWorker && + (await this.securityWorker(this.securityData))) || + {}; + const requestParams = this.mergeRequestParams(params, secureParams); + const queryString = query && this.toQueryString(query); + const payloadFormatter = this.contentFormatters[type || ContentType.Json]; + const responseFormat = format || requestParams.format; + + return this.customFetch( + \`\${baseUrl || this.baseUrl || ""}\${path}\${queryString ? \`?\${queryString}\` : ""}\`, + { + ...requestParams, + headers: { + ...(requestParams.headers || {}), + ...(type && type !== ContentType.FormData + ? { "Content-Type": type } + : {}), + }, + signal: + (cancelToken + ? this.createAbortSignal(cancelToken) + : requestParams.signal) || null, + body: + typeof body === "undefined" || body === null + ? null + : payloadFormatter(body), + }, + ).then(async (response) => { + const r = response as HttpResponse; + r.data = null as unknown as T; + r.error = null as unknown as E; + + const responseToParse = responseFormat ? response.clone() : response; + const data = !responseFormat + ? r + : await responseToParse[responseFormat]() + .then((data) => { + if (r.ok) { + r.data = data; + } else { + r.error = data; + } + return r; + }) + .catch((e) => { + r.error = e; + return r; + }); + + if (cancelToken) { + this.abortControllers.delete(cancelToken); + } + + if (!response.ok) throw data; + return data; + }); + }; +} +" +`; + +exports[`basic > defaultRequestParams modular > schema.ts 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; + +export type QueryParamsType = Record; +export type ResponseFormat = keyof Omit; + +export interface FullRequestParams extends Omit { + /** set parameter to \`true\` for call \`securityWorker\` for this request */ + secure?: boolean; + /** request path */ + path: string; + /** content type of request body */ + type?: ContentType; + /** query params */ + query?: QueryParamsType; + /** format of response (i.e. response.json() -> format: "json") */ + format?: ResponseFormat; + /** request body */ + body?: unknown; + /** base url */ + baseUrl?: string; + /** request cancellation token */ + cancelToken?: CancelToken; +} + +export type RequestParams = Omit< + FullRequestParams, + "body" | "method" | "query" | "path" +>; + +export interface ApiConfig { + baseUrl?: string; + baseApiParams?: Omit; + securityWorker?: ( + securityData: SecurityDataType | null, + ) => Promise | RequestParams | void; + customFetch?: typeof fetch; +} + +export interface HttpResponse + extends Response { + data: D; + error: E; +} + +type CancelToken = Symbol | string | number; + +export enum ContentType { + Json = "application/json", + JsonApi = "application/vnd.api+json", + FormData = "multipart/form-data", + UrlEncoded = "application/x-www-form-urlencoded", + Text = "text/plain", +} + +export class HttpClient { + public baseUrl: string = "http://petstore.swagger.io/v2"; + private securityData: SecurityDataType | null = null; + private securityWorker?: ApiConfig["securityWorker"]; + private abortControllers = new Map(); + private customFetch = (...fetchParams: Parameters) => + fetch(...fetchParams); + + private baseApiParams: RequestParams = { + credentials: "same-origin", + headers: {}, + redirect: "follow", + referrerPolicy: "no-referrer", + }; + + constructor(apiConfig: ApiConfig = {}) { + Object.assign(this, apiConfig); + } + + public setSecurityData = (data: SecurityDataType | null) => { + this.securityData = data; + }; + + protected encodeQueryParam(key: string, value: any) { + const encodedKey = encodeURIComponent(key); + return \`\${encodedKey}=\${encodeURIComponent(typeof value === "number" ? value : \`\${value}\`)}\`; + } + + protected addQueryParam(query: QueryParamsType, key: string) { + return this.encodeQueryParam(key, query[key]); + } + + protected addArrayQueryParam(query: QueryParamsType, key: string) { + const value = query[key]; + return value.map((v: any) => this.encodeQueryParam(key, v)).join("&"); + } + + protected toQueryString(rawQuery?: QueryParamsType): string { + const query = rawQuery || {}; + const keys = Object.keys(query).filter( + (key) => "undefined" !== typeof query[key], + ); + return keys + .map((key) => + Array.isArray(query[key]) + ? this.addArrayQueryParam(query, key) + : this.addQueryParam(query, key), + ) + .join("&"); + } + + protected addQueryParams(rawQuery?: QueryParamsType): string { + const queryString = this.toQueryString(rawQuery); + return queryString ? \`?\${queryString}\` : ""; + } + + private contentFormatters: Record any> = { + [ContentType.Json]: (input: any) => + input !== null && (typeof input === "object" || typeof input === "string") + ? JSON.stringify(input) + : input, + [ContentType.JsonApi]: (input: any) => + input !== null && (typeof input === "object" || typeof input === "string") + ? JSON.stringify(input) + : input, + [ContentType.Text]: (input: any) => + input !== null && typeof input !== "string" + ? JSON.stringify(input) + : input, + [ContentType.FormData]: (input: any) => { + if (input instanceof FormData) { + return input; + } + + return Object.keys(input || {}).reduce((formData, key) => { + const property = input[key]; + formData.append( + key, + property instanceof Blob + ? property + : typeof property === "object" && property !== null + ? JSON.stringify(property) + : \`\${property}\`, + ); + return formData; + }, new FormData()); + }, + [ContentType.UrlEncoded]: (input: any) => this.toQueryString(input), + }; + + protected mergeRequestParams( + params1: RequestParams, + params2?: RequestParams, + ): RequestParams { + return { + ...this.baseApiParams, + ...params1, + ...(params2 || {}), + headers: { + ...(this.baseApiParams.headers || {}), + ...(params1.headers || {}), + ...((params2 && params2.headers) || {}), + }, + }; + } + + protected createAbortSignal = ( + cancelToken: CancelToken, + ): AbortSignal | undefined => { + if (this.abortControllers.has(cancelToken)) { + const abortController = this.abortControllers.get(cancelToken); + if (abortController) { + return abortController.signal; + } + return void 0; + } + + const abortController = new AbortController(); + this.abortControllers.set(cancelToken, abortController); + return abortController.signal; + }; + + public abortRequest = (cancelToken: CancelToken) => { + const abortController = this.abortControllers.get(cancelToken); + + if (abortController) { + abortController.abort(); + this.abortControllers.delete(cancelToken); + } + }; + + public request = async ({ + body, + secure, + path, + type, + query, + format, + baseUrl, + cancelToken, + ...params + }: FullRequestParams): Promise> => { + const secureParams = + ((typeof secure === "boolean" ? secure : this.baseApiParams.secure) && + this.securityWorker && + (await this.securityWorker(this.securityData))) || + {}; + const requestParams = this.mergeRequestParams(params, secureParams); + const queryString = query && this.toQueryString(query); + const payloadFormatter = this.contentFormatters[type || ContentType.Json]; + const responseFormat = format || requestParams.format; + + return this.customFetch( + \`\${baseUrl || this.baseUrl || ""}\${path}\${queryString ? \`?\${queryString}\` : ""}\`, + { + ...requestParams, + headers: { + ...(requestParams.headers || {}), + ...(type && type !== ContentType.FormData + ? { "Content-Type": type } + : {}), + }, + signal: + (cancelToken + ? this.createAbortSignal(cancelToken) + : requestParams.signal) || null, + body: + typeof body === "undefined" || body === null + ? null + : payloadFormatter(body), + }, + ).then(async (response) => { + const r = response as HttpResponse; + r.data = null as unknown as T; + r.error = null as unknown as E; + + const responseToParse = responseFormat ? response.clone() : response; + const data = !responseFormat + ? r + : await responseToParse[responseFormat]() + .then((data) => { + if (r.ok) { + r.data = data; + } else { + r.error = data; + } + return r; + }) + .catch((e) => { + r.error = e; + return r; + }); + + if (cancelToken) { + this.abortControllers.delete(cancelToken); + } + + if (!response.ok) throw data; + return data; + }); + }; +} + +/** + * @title Swagger Petstore + * @version 1.0.0 + * @license Apache-2.0 (http://www.apache.org/licenses/LICENSE-2.0.html) + * @termsOfService http://swagger.io/terms/ + * @baseUrl http://petstore.swagger.io/v2 + * @externalDocs http://swagger.io + * @contact + * + * 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. + */ +export class Api< + SecurityDataType extends unknown, +> extends HttpClient { + api = { + /** + * 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 > defaultRequestParams with empty default > schema.ts 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; + +export type QueryParamsType = Record; +export type ResponseFormat = keyof Omit; + +export interface FullRequestParams extends Omit { + /** set parameter to \`true\` for call \`securityWorker\` for this request */ + secure?: boolean; + /** request path */ + path: string; + /** content type of request body */ + type?: ContentType; + /** query params */ + query?: QueryParamsType; + /** format of response (i.e. response.json() -> format: "json") */ + format?: ResponseFormat; + /** request body */ + body?: unknown; + /** base url */ + baseUrl?: string; + /** request cancellation token */ + cancelToken?: CancelToken; +} + +export type RequestParams = Omit< + FullRequestParams, + "body" | "method" | "query" | "path" +>; + +export interface ApiConfig { + baseUrl?: string; + baseApiParams?: Omit; + securityWorker?: ( + securityData: SecurityDataType | null, + ) => Promise | RequestParams | void; + customFetch?: typeof fetch; +} + +export interface HttpResponse + extends Response { + data: D; + error: E; +} + +type CancelToken = Symbol | string | number; + +export enum ContentType { + Json = "application/json", + JsonApi = "application/vnd.api+json", + FormData = "multipart/form-data", + UrlEncoded = "application/x-www-form-urlencoded", + Text = "text/plain", +} + +export class HttpClient { + public baseUrl: string = "http://petstore.swagger.io/v2"; + private securityData: SecurityDataType | null = null; + private securityWorker?: ApiConfig["securityWorker"]; + private abortControllers = new Map(); + private customFetch = (...fetchParams: Parameters) => + fetch(...fetchParams); + + private baseApiParams: RequestParams = { + credentials: "same-origin", + headers: {}, + redirect: "follow", + referrerPolicy: "no-referrer", + }; + + constructor(apiConfig: ApiConfig = {}) { + Object.assign(this, apiConfig); + } + + public setSecurityData = (data: SecurityDataType | null) => { + this.securityData = data; + }; + + protected encodeQueryParam(key: string, value: any) { + const encodedKey = encodeURIComponent(key); + return \`\${encodedKey}=\${encodeURIComponent(typeof value === "number" ? value : \`\${value}\`)}\`; + } + + protected addQueryParam(query: QueryParamsType, key: string) { + return this.encodeQueryParam(key, query[key]); + } + + protected addArrayQueryParam(query: QueryParamsType, key: string) { + const value = query[key]; + return value.map((v: any) => this.encodeQueryParam(key, v)).join("&"); + } + + protected toQueryString(rawQuery?: QueryParamsType): string { + const query = rawQuery || {}; + const keys = Object.keys(query).filter( + (key) => "undefined" !== typeof query[key], + ); + return keys + .map((key) => + Array.isArray(query[key]) + ? this.addArrayQueryParam(query, key) + : this.addQueryParam(query, key), + ) + .join("&"); + } + + protected addQueryParams(rawQuery?: QueryParamsType): string { + const queryString = this.toQueryString(rawQuery); + return queryString ? \`?\${queryString}\` : ""; + } + + private contentFormatters: Record any> = { + [ContentType.Json]: (input: any) => + input !== null && (typeof input === "object" || typeof input === "string") + ? JSON.stringify(input) + : input, + [ContentType.JsonApi]: (input: any) => + input !== null && (typeof input === "object" || typeof input === "string") + ? JSON.stringify(input) + : input, + [ContentType.Text]: (input: any) => + input !== null && typeof input !== "string" + ? JSON.stringify(input) + : input, + [ContentType.FormData]: (input: any) => { + if (input instanceof FormData) { + return input; + } + + return Object.keys(input || {}).reduce((formData, key) => { + const property = input[key]; + formData.append( + key, + property instanceof Blob + ? property + : typeof property === "object" && property !== null + ? JSON.stringify(property) + : \`\${property}\`, + ); + return formData; + }, new FormData()); + }, + [ContentType.UrlEncoded]: (input: any) => this.toQueryString(input), + }; + + protected mergeRequestParams( + params1: RequestParams, + params2?: RequestParams, + ): RequestParams { + return { + ...this.baseApiParams, + ...params1, + ...(params2 || {}), + headers: { + ...(this.baseApiParams.headers || {}), + ...(params1.headers || {}), + ...((params2 && params2.headers) || {}), + }, + }; + } + + protected createAbortSignal = ( + cancelToken: CancelToken, + ): AbortSignal | undefined => { + if (this.abortControllers.has(cancelToken)) { + const abortController = this.abortControllers.get(cancelToken); + if (abortController) { + return abortController.signal; + } + return void 0; + } + + const abortController = new AbortController(); + this.abortControllers.set(cancelToken, abortController); + return abortController.signal; + }; + + public abortRequest = (cancelToken: CancelToken) => { + const abortController = this.abortControllers.get(cancelToken); + + if (abortController) { + abortController.abort(); + this.abortControllers.delete(cancelToken); + } + }; + + public request = async ({ + body, + secure, + path, + type, + query, + format, + baseUrl, + cancelToken, + ...params + }: FullRequestParams): Promise> => { + const secureParams = + ((typeof secure === "boolean" ? secure : this.baseApiParams.secure) && + this.securityWorker && + (await this.securityWorker(this.securityData))) || + {}; + const requestParams = this.mergeRequestParams(params, secureParams); + const queryString = query && this.toQueryString(query); + const payloadFormatter = this.contentFormatters[type || ContentType.Json]; + const responseFormat = format || requestParams.format; + + return this.customFetch( + \`\${baseUrl || this.baseUrl || ""}\${path}\${queryString ? \`?\${queryString}\` : ""}\`, + { + ...requestParams, + headers: { + ...(requestParams.headers || {}), + ...(type && type !== ContentType.FormData + ? { "Content-Type": type } + : {}), + }, + signal: + (cancelToken + ? this.createAbortSignal(cancelToken) + : requestParams.signal) || null, + body: + typeof body === "undefined" || body === null + ? null + : payloadFormatter(body), + }, + ).then(async (response) => { + const r = response as HttpResponse; + r.data = null as unknown as T; + r.error = null as unknown as E; + + const responseToParse = responseFormat ? response.clone() : response; + const data = !responseFormat + ? r + : await responseToParse[responseFormat]() + .then((data) => { + if (r.ok) { + r.data = data; + } else { + r.error = data; + } + return r; + }) + .catch((e) => { + r.error = e; + return r; + }); + + if (cancelToken) { + this.abortControllers.delete(cancelToken); + } + + if (!response.ok) throw data; + return data; + }); + }; +} + +/** + * @title Swagger Petstore + * @version 1.0.0 + * @license Apache-2.0 (http://www.apache.org/licenses/LICENSE-2.0.html) + * @termsOfService http://swagger.io/terms/ + * @baseUrl http://petstore.swagger.io/v2 + * @externalDocs http://swagger.io + * @contact + * + * 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. + */ +export class Api< + SecurityDataType extends unknown, +> extends HttpClient { + api = { + /** + * 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, + }), + }; +} +" +`; diff --git a/tests/spec/defaultRequestParams/basic.test.ts b/tests/spec/defaultRequestParams/basic.test.ts new file mode 100644 index 000000000..d5b5beca0 --- /dev/null +++ b/tests/spec/defaultRequestParams/basic.test.ts @@ -0,0 +1,81 @@ +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("defaultRequestParams", async () => { + await generateApi({ + fileName: "schema", + input: path.resolve(import.meta.dirname, "schema.json"), + output: tmpdir, + silent: true, + defaultRequestParams: "{ mod: false }", + }); + + const files = await fs.readdir(tmpdir); + + await Promise.all( + files.map(async (file) => { + const content = await fs.readFile(path.join(tmpdir, file), { + encoding: "utf8", + }); + + expect(content).toMatchSnapshot(file); + }), + ); + }); + test("defaultRequestParams with empty default", async () => { + await generateApi({ + fileName: "schema", + input: path.resolve(import.meta.dirname, "schema.json"), + output: tmpdir, + silent: true, + defaultRequestParams: "", + }); + + const files = await fs.readdir(tmpdir); + + await Promise.all( + files.map(async (file) => { + const content = await fs.readFile(path.join(tmpdir, file), { + encoding: "utf8", + }); + + expect(content).toMatchSnapshot(file); + }), + ); + }); + test("defaultRequestParams modular", async () => { + await generateApi({ + fileName: "schema", + input: path.resolve(import.meta.dirname, "schema.json"), + output: tmpdir, + silent: true, + modular: true, + defaultRequestParams: "{ mod: true }", + }); + + const files = await fs.readdir(tmpdir); + await Promise.all( + files.map(async (file) => { + const content = await fs.readFile(path.join(tmpdir, file), { + encoding: "utf8", + }); + + expect(content).toMatchSnapshot(file); + }), + ); + }); +}); diff --git a/tests/spec/defaultRequestParams/schema.json b/tests/spec/defaultRequestParams/schema.json new file mode 100644 index 000000000..6841c8218 --- /dev/null +++ b/tests/spec/defaultRequestParams/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" + } +} diff --git a/types/index.ts b/types/index.ts index 48f5632f0..0e9af4ef7 100644 --- a/types/index.ts +++ b/types/index.ts @@ -495,6 +495,8 @@ export interface GenerateApiConfiguration { * some swagger schemas treat "default" as a successful response. */ defaultResponseAsSuccess: boolean; + /** request parameters for each API request */ + defaultRequestParams: string; /** generate type definitions for API routes */ generateRouteTypes: boolean; /** generate an API client */