From 61a1bbdabec52d783fa75a4eabc1756b5a033acd Mon Sep 17 00:00:00 2001 From: Tino Fuhrmann Date: Wed, 17 Oct 2018 16:51:56 +0200 Subject: [PATCH] Added middleware to fetch --- .../generators/fetch/fetch.mustache | 19 +- .../typescript/http/isomorphic-fetch.mustache | 1 - .../resources/typescript/middleware.mustache | 4 +- .../petstore/typescript/builds/default/api.ts | 380 ++++++++++++++---- .../builds/default/http/isomorphic-fetch.ts | 1 - .../typescript/builds/default/middleware.ts | 4 +- .../typescript/builds/default/test.ts | 24 +- 7 files changed, 340 insertions(+), 93 deletions(-) diff --git a/modules/openapi-generator/src/main/resources/typescript/generators/fetch/fetch.mustache b/modules/openapi-generator/src/main/resources/typescript/generators/fetch/fetch.mustache index 9fe4b31ba5e..5198b5d89c6 100644 --- a/modules/openapi-generator/src/main/resources/typescript/generators/fetch/fetch.mustache +++ b/modules/openapi-generator/src/main/resources/typescript/generators/fetch/fetch.mustache @@ -24,10 +24,21 @@ export class {{classname}} { {{#operation}} public {{nickname}}({{#allParams}}{{paramName}}{{^required}}?{{/required}}: {{{dataType}}}, {{/allParams}}options?: any): Promise<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}}> { const requestContext = this.requestFactory.{{nickname}}({{#allParams}}{{paramName}}, {{/allParams}}options); - - return this.configuration.httpApi.send(requestContext).then((response: ResponseContext) => { - return this.responseProcessor.{{nickname}}(response); - }); + + // build promise chain + let middlewarePrePromise =Promise.resolve(requestContext); + for (let middleware of this.configuration.middleware) { + middlewarePrePromise = middlewarePrePromise.then((ctx) => middleware.pre(ctx)); + } + + return middlewarePrePromise.then((ctx) => this.configuration.httpApi.send(ctx)). + then((response: ResponseContext) => { + let middlewarePostPromise = Promise.resolve(response); + for (let middleware of this.configuration.middleware) { + middlewarePostPromise = middlewarePostPromise.then((rsp) => middleware.post(rsp)); + } + return middlewarePostPromise.then((rsp) => this.responseProcessor.{{nickname}}(rsp)); + }); } {{/operation}} diff --git a/modules/openapi-generator/src/main/resources/typescript/http/isomorphic-fetch.mustache b/modules/openapi-generator/src/main/resources/typescript/http/isomorphic-fetch.mustache index d0c749992b4..42573484bea 100644 --- a/modules/openapi-generator/src/main/resources/typescript/http/isomorphic-fetch.mustache +++ b/modules/openapi-generator/src/main/resources/typescript/http/isomorphic-fetch.mustache @@ -6,7 +6,6 @@ import 'isomorphic-fetch'; export class IsomorphicFetchHttpLibrary implements HttpLibrary { public send(request: RequestContext): Promise { - console.log("Request: ", request); let method = request.getHttpMethod().toString(); let body = request.getBody(); diff --git a/modules/openapi-generator/src/main/resources/typescript/middleware.mustache b/modules/openapi-generator/src/main/resources/typescript/middleware.mustache index 782cddb321c..3ac072bab22 100644 --- a/modules/openapi-generator/src/main/resources/typescript/middleware.mustache +++ b/modules/openapi-generator/src/main/resources/typescript/middleware.mustache @@ -1,8 +1,8 @@ import {RequestContext, ResponseContext} from './http/http'; export interface Middleware { - pre?(context: RequestContext): Promise; - post?(context: ResponseContext): Promise; + pre(context: RequestContext): Promise; + post(context: ResponseContext): Promise; } // TODO: package.json set npmName \ No newline at end of file diff --git a/samples/client/petstore/typescript/builds/default/api.ts b/samples/client/petstore/typescript/builds/default/api.ts index f3006877b92..ffce3d9bf4e 100644 --- a/samples/client/petstore/typescript/builds/default/api.ts +++ b/samples/client/petstore/typescript/builds/default/api.ts @@ -21,66 +21,154 @@ export class PetApi { public addPet(pet: Pet, options?: any): Promise { const requestContext = this.requestFactory.addPet(pet, options); - - return this.configuration.httpApi.send(requestContext).then((response: ResponseContext) => { - return this.responseProcessor.addPet(response); - }); + + // build promise chain + let middlewarePrePromise =Promise.resolve(requestContext); + for (let middleware of this.configuration.middleware) { + middlewarePrePromise = middlewarePrePromise.then((ctx) => middleware.pre(ctx)); + } + + return middlewarePrePromise.then((ctx) => this.configuration.httpApi.send(ctx)). + then((response: ResponseContext) => { + let middlewarePostPromise = Promise.resolve(response); + for (let middleware of this.configuration.middleware) { + middlewarePostPromise = middlewarePostPromise.then((rsp) => middleware.post(rsp)); + } + return middlewarePostPromise.then((rsp) => this.responseProcessor.addPet(rsp)); + }); } public deletePet(petId: number, apiKey?: string, options?: any): Promise { const requestContext = this.requestFactory.deletePet(petId, apiKey, options); - - return this.configuration.httpApi.send(requestContext).then((response: ResponseContext) => { - return this.responseProcessor.deletePet(response); - }); + + // build promise chain + let middlewarePrePromise =Promise.resolve(requestContext); + for (let middleware of this.configuration.middleware) { + middlewarePrePromise = middlewarePrePromise.then((ctx) => middleware.pre(ctx)); + } + + return middlewarePrePromise.then((ctx) => this.configuration.httpApi.send(ctx)). + then((response: ResponseContext) => { + let middlewarePostPromise = Promise.resolve(response); + for (let middleware of this.configuration.middleware) { + middlewarePostPromise = middlewarePostPromise.then((rsp) => middleware.post(rsp)); + } + return middlewarePostPromise.then((rsp) => this.responseProcessor.deletePet(rsp)); + }); } public findPetsByStatus(status: Array<'available' | 'pending' | 'sold'>, options?: any): Promise> { const requestContext = this.requestFactory.findPetsByStatus(status, options); - - return this.configuration.httpApi.send(requestContext).then((response: ResponseContext) => { - return this.responseProcessor.findPetsByStatus(response); - }); + + // build promise chain + let middlewarePrePromise =Promise.resolve(requestContext); + for (let middleware of this.configuration.middleware) { + middlewarePrePromise = middlewarePrePromise.then((ctx) => middleware.pre(ctx)); + } + + return middlewarePrePromise.then((ctx) => this.configuration.httpApi.send(ctx)). + then((response: ResponseContext) => { + let middlewarePostPromise = Promise.resolve(response); + for (let middleware of this.configuration.middleware) { + middlewarePostPromise = middlewarePostPromise.then((rsp) => middleware.post(rsp)); + } + return middlewarePostPromise.then((rsp) => this.responseProcessor.findPetsByStatus(rsp)); + }); } public findPetsByTags(tags: Array, options?: any): Promise> { const requestContext = this.requestFactory.findPetsByTags(tags, options); - - return this.configuration.httpApi.send(requestContext).then((response: ResponseContext) => { - return this.responseProcessor.findPetsByTags(response); - }); + + // build promise chain + let middlewarePrePromise =Promise.resolve(requestContext); + for (let middleware of this.configuration.middleware) { + middlewarePrePromise = middlewarePrePromise.then((ctx) => middleware.pre(ctx)); + } + + return middlewarePrePromise.then((ctx) => this.configuration.httpApi.send(ctx)). + then((response: ResponseContext) => { + let middlewarePostPromise = Promise.resolve(response); + for (let middleware of this.configuration.middleware) { + middlewarePostPromise = middlewarePostPromise.then((rsp) => middleware.post(rsp)); + } + return middlewarePostPromise.then((rsp) => this.responseProcessor.findPetsByTags(rsp)); + }); } public getPetById(petId: number, options?: any): Promise { const requestContext = this.requestFactory.getPetById(petId, options); - - return this.configuration.httpApi.send(requestContext).then((response: ResponseContext) => { - return this.responseProcessor.getPetById(response); - }); + + // build promise chain + let middlewarePrePromise =Promise.resolve(requestContext); + for (let middleware of this.configuration.middleware) { + middlewarePrePromise = middlewarePrePromise.then((ctx) => middleware.pre(ctx)); + } + + return middlewarePrePromise.then((ctx) => this.configuration.httpApi.send(ctx)). + then((response: ResponseContext) => { + let middlewarePostPromise = Promise.resolve(response); + for (let middleware of this.configuration.middleware) { + middlewarePostPromise = middlewarePostPromise.then((rsp) => middleware.post(rsp)); + } + return middlewarePostPromise.then((rsp) => this.responseProcessor.getPetById(rsp)); + }); } public updatePet(pet: Pet, options?: any): Promise { const requestContext = this.requestFactory.updatePet(pet, options); - - return this.configuration.httpApi.send(requestContext).then((response: ResponseContext) => { - return this.responseProcessor.updatePet(response); - }); + + // build promise chain + let middlewarePrePromise =Promise.resolve(requestContext); + for (let middleware of this.configuration.middleware) { + middlewarePrePromise = middlewarePrePromise.then((ctx) => middleware.pre(ctx)); + } + + return middlewarePrePromise.then((ctx) => this.configuration.httpApi.send(ctx)). + then((response: ResponseContext) => { + let middlewarePostPromise = Promise.resolve(response); + for (let middleware of this.configuration.middleware) { + middlewarePostPromise = middlewarePostPromise.then((rsp) => middleware.post(rsp)); + } + return middlewarePostPromise.then((rsp) => this.responseProcessor.updatePet(rsp)); + }); } public updatePetWithForm(petId: number, name?: string, status?: string, options?: any): Promise { const requestContext = this.requestFactory.updatePetWithForm(petId, name, status, options); - - return this.configuration.httpApi.send(requestContext).then((response: ResponseContext) => { - return this.responseProcessor.updatePetWithForm(response); - }); + + // build promise chain + let middlewarePrePromise =Promise.resolve(requestContext); + for (let middleware of this.configuration.middleware) { + middlewarePrePromise = middlewarePrePromise.then((ctx) => middleware.pre(ctx)); + } + + return middlewarePrePromise.then((ctx) => this.configuration.httpApi.send(ctx)). + then((response: ResponseContext) => { + let middlewarePostPromise = Promise.resolve(response); + for (let middleware of this.configuration.middleware) { + middlewarePostPromise = middlewarePostPromise.then((rsp) => middleware.post(rsp)); + } + return middlewarePostPromise.then((rsp) => this.responseProcessor.updatePetWithForm(rsp)); + }); } public uploadFile(petId: number, additionalMetadata?: string, file?: any, options?: any): Promise { const requestContext = this.requestFactory.uploadFile(petId, additionalMetadata, file, options); - - return this.configuration.httpApi.send(requestContext).then((response: ResponseContext) => { - return this.responseProcessor.uploadFile(response); - }); + + // build promise chain + let middlewarePrePromise =Promise.resolve(requestContext); + for (let middleware of this.configuration.middleware) { + middlewarePrePromise = middlewarePrePromise.then((ctx) => middleware.pre(ctx)); + } + + return middlewarePrePromise.then((ctx) => this.configuration.httpApi.send(ctx)). + then((response: ResponseContext) => { + let middlewarePostPromise = Promise.resolve(response); + for (let middleware of this.configuration.middleware) { + middlewarePostPromise = middlewarePostPromise.then((rsp) => middleware.post(rsp)); + } + return middlewarePostPromise.then((rsp) => this.responseProcessor.uploadFile(rsp)); + }); } @@ -101,34 +189,78 @@ export class StoreApi { public deleteOrder(orderId: string, options?: any): Promise { const requestContext = this.requestFactory.deleteOrder(orderId, options); - - return this.configuration.httpApi.send(requestContext).then((response: ResponseContext) => { - return this.responseProcessor.deleteOrder(response); - }); + + // build promise chain + let middlewarePrePromise =Promise.resolve(requestContext); + for (let middleware of this.configuration.middleware) { + middlewarePrePromise = middlewarePrePromise.then((ctx) => middleware.pre(ctx)); + } + + return middlewarePrePromise.then((ctx) => this.configuration.httpApi.send(ctx)). + then((response: ResponseContext) => { + let middlewarePostPromise = Promise.resolve(response); + for (let middleware of this.configuration.middleware) { + middlewarePostPromise = middlewarePostPromise.then((rsp) => middleware.post(rsp)); + } + return middlewarePostPromise.then((rsp) => this.responseProcessor.deleteOrder(rsp)); + }); } public getInventory(options?: any): Promise<{ [key: string]: number; }> { const requestContext = this.requestFactory.getInventory(options); - - return this.configuration.httpApi.send(requestContext).then((response: ResponseContext) => { - return this.responseProcessor.getInventory(response); - }); + + // build promise chain + let middlewarePrePromise =Promise.resolve(requestContext); + for (let middleware of this.configuration.middleware) { + middlewarePrePromise = middlewarePrePromise.then((ctx) => middleware.pre(ctx)); + } + + return middlewarePrePromise.then((ctx) => this.configuration.httpApi.send(ctx)). + then((response: ResponseContext) => { + let middlewarePostPromise = Promise.resolve(response); + for (let middleware of this.configuration.middleware) { + middlewarePostPromise = middlewarePostPromise.then((rsp) => middleware.post(rsp)); + } + return middlewarePostPromise.then((rsp) => this.responseProcessor.getInventory(rsp)); + }); } public getOrderById(orderId: number, options?: any): Promise { const requestContext = this.requestFactory.getOrderById(orderId, options); - - return this.configuration.httpApi.send(requestContext).then((response: ResponseContext) => { - return this.responseProcessor.getOrderById(response); - }); + + // build promise chain + let middlewarePrePromise =Promise.resolve(requestContext); + for (let middleware of this.configuration.middleware) { + middlewarePrePromise = middlewarePrePromise.then((ctx) => middleware.pre(ctx)); + } + + return middlewarePrePromise.then((ctx) => this.configuration.httpApi.send(ctx)). + then((response: ResponseContext) => { + let middlewarePostPromise = Promise.resolve(response); + for (let middleware of this.configuration.middleware) { + middlewarePostPromise = middlewarePostPromise.then((rsp) => middleware.post(rsp)); + } + return middlewarePostPromise.then((rsp) => this.responseProcessor.getOrderById(rsp)); + }); } public placeOrder(order: Order, options?: any): Promise { const requestContext = this.requestFactory.placeOrder(order, options); - - return this.configuration.httpApi.send(requestContext).then((response: ResponseContext) => { - return this.responseProcessor.placeOrder(response); - }); + + // build promise chain + let middlewarePrePromise =Promise.resolve(requestContext); + for (let middleware of this.configuration.middleware) { + middlewarePrePromise = middlewarePrePromise.then((ctx) => middleware.pre(ctx)); + } + + return middlewarePrePromise.then((ctx) => this.configuration.httpApi.send(ctx)). + then((response: ResponseContext) => { + let middlewarePostPromise = Promise.resolve(response); + for (let middleware of this.configuration.middleware) { + middlewarePostPromise = middlewarePostPromise.then((rsp) => middleware.post(rsp)); + } + return middlewarePostPromise.then((rsp) => this.responseProcessor.placeOrder(rsp)); + }); } @@ -149,66 +281,154 @@ export class UserApi { public createUser(user: User, options?: any): Promise { const requestContext = this.requestFactory.createUser(user, options); - - return this.configuration.httpApi.send(requestContext).then((response: ResponseContext) => { - return this.responseProcessor.createUser(response); - }); + + // build promise chain + let middlewarePrePromise =Promise.resolve(requestContext); + for (let middleware of this.configuration.middleware) { + middlewarePrePromise = middlewarePrePromise.then((ctx) => middleware.pre(ctx)); + } + + return middlewarePrePromise.then((ctx) => this.configuration.httpApi.send(ctx)). + then((response: ResponseContext) => { + let middlewarePostPromise = Promise.resolve(response); + for (let middleware of this.configuration.middleware) { + middlewarePostPromise = middlewarePostPromise.then((rsp) => middleware.post(rsp)); + } + return middlewarePostPromise.then((rsp) => this.responseProcessor.createUser(rsp)); + }); } public createUsersWithArrayInput(user: Array, options?: any): Promise { const requestContext = this.requestFactory.createUsersWithArrayInput(user, options); - - return this.configuration.httpApi.send(requestContext).then((response: ResponseContext) => { - return this.responseProcessor.createUsersWithArrayInput(response); - }); + + // build promise chain + let middlewarePrePromise =Promise.resolve(requestContext); + for (let middleware of this.configuration.middleware) { + middlewarePrePromise = middlewarePrePromise.then((ctx) => middleware.pre(ctx)); + } + + return middlewarePrePromise.then((ctx) => this.configuration.httpApi.send(ctx)). + then((response: ResponseContext) => { + let middlewarePostPromise = Promise.resolve(response); + for (let middleware of this.configuration.middleware) { + middlewarePostPromise = middlewarePostPromise.then((rsp) => middleware.post(rsp)); + } + return middlewarePostPromise.then((rsp) => this.responseProcessor.createUsersWithArrayInput(rsp)); + }); } public createUsersWithListInput(user: Array, options?: any): Promise { const requestContext = this.requestFactory.createUsersWithListInput(user, options); - - return this.configuration.httpApi.send(requestContext).then((response: ResponseContext) => { - return this.responseProcessor.createUsersWithListInput(response); - }); + + // build promise chain + let middlewarePrePromise =Promise.resolve(requestContext); + for (let middleware of this.configuration.middleware) { + middlewarePrePromise = middlewarePrePromise.then((ctx) => middleware.pre(ctx)); + } + + return middlewarePrePromise.then((ctx) => this.configuration.httpApi.send(ctx)). + then((response: ResponseContext) => { + let middlewarePostPromise = Promise.resolve(response); + for (let middleware of this.configuration.middleware) { + middlewarePostPromise = middlewarePostPromise.then((rsp) => middleware.post(rsp)); + } + return middlewarePostPromise.then((rsp) => this.responseProcessor.createUsersWithListInput(rsp)); + }); } public deleteUser(username: string, options?: any): Promise { const requestContext = this.requestFactory.deleteUser(username, options); - - return this.configuration.httpApi.send(requestContext).then((response: ResponseContext) => { - return this.responseProcessor.deleteUser(response); - }); + + // build promise chain + let middlewarePrePromise =Promise.resolve(requestContext); + for (let middleware of this.configuration.middleware) { + middlewarePrePromise = middlewarePrePromise.then((ctx) => middleware.pre(ctx)); + } + + return middlewarePrePromise.then((ctx) => this.configuration.httpApi.send(ctx)). + then((response: ResponseContext) => { + let middlewarePostPromise = Promise.resolve(response); + for (let middleware of this.configuration.middleware) { + middlewarePostPromise = middlewarePostPromise.then((rsp) => middleware.post(rsp)); + } + return middlewarePostPromise.then((rsp) => this.responseProcessor.deleteUser(rsp)); + }); } public getUserByName(username: string, options?: any): Promise { const requestContext = this.requestFactory.getUserByName(username, options); - - return this.configuration.httpApi.send(requestContext).then((response: ResponseContext) => { - return this.responseProcessor.getUserByName(response); - }); + + // build promise chain + let middlewarePrePromise =Promise.resolve(requestContext); + for (let middleware of this.configuration.middleware) { + middlewarePrePromise = middlewarePrePromise.then((ctx) => middleware.pre(ctx)); + } + + return middlewarePrePromise.then((ctx) => this.configuration.httpApi.send(ctx)). + then((response: ResponseContext) => { + let middlewarePostPromise = Promise.resolve(response); + for (let middleware of this.configuration.middleware) { + middlewarePostPromise = middlewarePostPromise.then((rsp) => middleware.post(rsp)); + } + return middlewarePostPromise.then((rsp) => this.responseProcessor.getUserByName(rsp)); + }); } public loginUser(username: string, password: string, options?: any): Promise { const requestContext = this.requestFactory.loginUser(username, password, options); - - return this.configuration.httpApi.send(requestContext).then((response: ResponseContext) => { - return this.responseProcessor.loginUser(response); - }); + + // build promise chain + let middlewarePrePromise =Promise.resolve(requestContext); + for (let middleware of this.configuration.middleware) { + middlewarePrePromise = middlewarePrePromise.then((ctx) => middleware.pre(ctx)); + } + + return middlewarePrePromise.then((ctx) => this.configuration.httpApi.send(ctx)). + then((response: ResponseContext) => { + let middlewarePostPromise = Promise.resolve(response); + for (let middleware of this.configuration.middleware) { + middlewarePostPromise = middlewarePostPromise.then((rsp) => middleware.post(rsp)); + } + return middlewarePostPromise.then((rsp) => this.responseProcessor.loginUser(rsp)); + }); } public logoutUser(options?: any): Promise { const requestContext = this.requestFactory.logoutUser(options); - - return this.configuration.httpApi.send(requestContext).then((response: ResponseContext) => { - return this.responseProcessor.logoutUser(response); - }); + + // build promise chain + let middlewarePrePromise =Promise.resolve(requestContext); + for (let middleware of this.configuration.middleware) { + middlewarePrePromise = middlewarePrePromise.then((ctx) => middleware.pre(ctx)); + } + + return middlewarePrePromise.then((ctx) => this.configuration.httpApi.send(ctx)). + then((response: ResponseContext) => { + let middlewarePostPromise = Promise.resolve(response); + for (let middleware of this.configuration.middleware) { + middlewarePostPromise = middlewarePostPromise.then((rsp) => middleware.post(rsp)); + } + return middlewarePostPromise.then((rsp) => this.responseProcessor.logoutUser(rsp)); + }); } public updateUser(username: string, user: User, options?: any): Promise { const requestContext = this.requestFactory.updateUser(username, user, options); - - return this.configuration.httpApi.send(requestContext).then((response: ResponseContext) => { - return this.responseProcessor.updateUser(response); - }); + + // build promise chain + let middlewarePrePromise =Promise.resolve(requestContext); + for (let middleware of this.configuration.middleware) { + middlewarePrePromise = middlewarePrePromise.then((ctx) => middleware.pre(ctx)); + } + + return middlewarePrePromise.then((ctx) => this.configuration.httpApi.send(ctx)). + then((response: ResponseContext) => { + let middlewarePostPromise = Promise.resolve(response); + for (let middleware of this.configuration.middleware) { + middlewarePostPromise = middlewarePostPromise.then((rsp) => middleware.post(rsp)); + } + return middlewarePostPromise.then((rsp) => this.responseProcessor.updateUser(rsp)); + }); } diff --git a/samples/client/petstore/typescript/builds/default/http/isomorphic-fetch.ts b/samples/client/petstore/typescript/builds/default/http/isomorphic-fetch.ts index d0c749992b4..42573484bea 100644 --- a/samples/client/petstore/typescript/builds/default/http/isomorphic-fetch.ts +++ b/samples/client/petstore/typescript/builds/default/http/isomorphic-fetch.ts @@ -6,7 +6,6 @@ import 'isomorphic-fetch'; export class IsomorphicFetchHttpLibrary implements HttpLibrary { public send(request: RequestContext): Promise { - console.log("Request: ", request); let method = request.getHttpMethod().toString(); let body = request.getBody(); diff --git a/samples/client/petstore/typescript/builds/default/middleware.ts b/samples/client/petstore/typescript/builds/default/middleware.ts index 782cddb321c..3ac072bab22 100644 --- a/samples/client/petstore/typescript/builds/default/middleware.ts +++ b/samples/client/petstore/typescript/builds/default/middleware.ts @@ -1,8 +1,8 @@ import {RequestContext, ResponseContext} from './http/http'; export interface Middleware { - pre?(context: RequestContext): Promise; - post?(context: ResponseContext): Promise; + pre(context: RequestContext): Promise; + post(context: ResponseContext): Promise; } // TODO: package.json set npmName \ No newline at end of file diff --git a/samples/client/petstore/typescript/builds/default/test.ts b/samples/client/petstore/typescript/builds/default/test.ts index 8ed9bc4498a..fa5ff91a954 100644 --- a/samples/client/petstore/typescript/builds/default/test.ts +++ b/samples/client/petstore/typescript/builds/default/test.ts @@ -1,12 +1,30 @@ import {PetApi} from './api'; import {Configuration } from './configuration'; +import { Middleware } from './middleware'; +import { RequestContext, ResponseContext } from './http/http'; -const config = new Configuration(); +class MiddlewareA implements Middleware { + + public pre(request: RequestContext) { + console.log(request); + return Promise.resolve(request); + } + + public post(response: ResponseContext) { + console.log(response) + return Promise.resolve(response); + } +} + +const config = new Configuration({ + middleware: [ + new MiddlewareA() + ] +}); const api = new PetApi(config); api.getPetById(3).then((pet) => { console.log(pet) }).catch((err) => { - -console.log(err); + console.log(err); });