Security News
Weekly Downloads Now Available in npm Package Search Results
Socket's package search now displays weekly downloads for npm packages, helping developers quickly assess popularity and make more informed decisions.
nut-swagger
Advanced tools
It generates Controller JavaScript file from you swagger file.
nut-swagger npm package generates nut-ioc specific JavaScript files.
To learn more information about nut-ioc, click nut-ioc link.
You can find nut-swagger and nut-ioc usage in the following repository in nut-swagger-usage branch.
Check package.json Script block in the following repository.
https://github.com/nodejs-projects-kenanhancer/nut-ioc-basic-demo.git
npm i nut-swagger
Assume that you have the following swagger definition file.
NOT: Notice that operationID is controllers.greetingService.sayHello and there are three parts on it. nut-swagger assumes that sayHello is a function name, greetingService is a JavaScript file name and rest of it namespace name.
Example com.kenanhancer.controllers.greetingService.sayHello
Namespace: "com.kenanhancer.controllers"
ServiceName: "greetingService"
FunctionName: "sayHello"
./swagger-definitions/greeting-definition.yaml
swagger: '2.0'
info:
description: Greeting API
version: 1.0.0
title: Greeting API
host: localhost:8080
basePath: /greeting-api/v1
schemes:
- http
paths:
/sayHello/{firstName}:
get:
summary: Say Hello Message
operationId: controllers.greetingService.sayHello
produces:
- application/json
parameters:
- name: language
in: header
type: string
enum:
- EN
- TR
required: true
description: Greeting Language.
- name: firstName
in: path
type: string
maxLength: 100
required: true
description: Person First Name.
- name: lastName
in: query
type: string
maxLength: 100
required: true
description: Person Last Name.
responses:
'200':
description: success
/sayGoodbye:
get:
summary: Say Goodbye Message
operationId: controllers.greetingService.sayGoodbye
produces:
- application/json
parameters:
- name: language
in: header
type: string
enum:
- EN
- TR
required: true
description: Greeting Language.
- name: firstName
in: query
type: string
maxLength: 100
required: true
description: Person First Name.
- name: lastName
in: query
type: string
maxLength: 100
required: true
description: Person Last Name.
responses:
'200':
description: success
Run the following code to create file. If --isEmptyFunctionBody value is true, then probably you need to write your business logic. If --isEmptyFunctionBody value is false, then probably you will call a downstream service. So, nut-swagger will write method body for you.
nut-swagger generate-default-controller ./swagger-definitions/greeting-definition.yaml ./services/controllers --overwrite true --isEmptyFunctionBody false
Output
module.exports.ServiceName = ""; //fileName if empty,null or undefined
module.exports.Service = ({ requestHandler }) => {
return {
sayHello: async ({ language, firstName, lastName }) => {
const requestArgs = {
method: "GET",
schemes: "http",
host: "localhost:8080",
basePath: "/greeting-api/v1",
path: "/sayHello",
url: "http://localhost:8080/greeting-api/v1/sayHello",
payload: undefined,
headers: {
"language": language || '',
"firstName": firstName || '',
"lastName": lastName || ''
}
};
const response = await requestHandler.executeAsync(requestArgs);
return response;
},
sayGoodbye: async ({ language, firstName, lastName }) => {
const requestArgs = {
method: "GET",
schemes: "http",
host: "localhost:8080",
basePath: "/greeting-api/v1",
path: "/sayGoodbye",
url: "http://localhost:8080/greeting-api/v1/sayGoodbye",
payload: undefined,
headers: {
"language": language || '',
"firstName": firstName || '',
"lastName": lastName || ''
}
};
const response = await requestHandler.executeAsync(requestArgs);
return response;
}
};
};
Run the following code to create file.
nut-swagger generate-default-controller ./swagger-definitions/greeting-definition.yaml ./services/controllers --overwrite true --isEmptyFunctionBody true
Output
module.exports.ServiceName = ""; //fileName if empty,null or undefined
module.exports.Service = ({ requestHandler }) => {
return {
sayHello: async ({ firstName,lastName }) => {
return {};
},
sayGoodbye: async ({ firstName,lastName }) => {
return {};
}
};
};
Run the following code to create files from directory. We need this options for repositories(Downstream service calls). Assume that you have swagger-downstream-definitions folder and there are three downstream service swagger definition files. In this case, you just run the following command then three JavaScript controller files will be created.
nut-swagger generate-default-controllers-from-dir ./swagger-downstream-definitions ./services/repositories --overwrite true --isEmptyFunctionBody false
Swagger Definition Files
All Swagger definition files are listed below;
./swagger-downstream-definitions/greeting-english-definition.yaml
swagger: '2.0'
info:
description: English Greeting API
version: 1.0.0
title: English Greeting API
host: localhost:8080
basePath: /greeting-english-api/v1
schemes:
- http
paths:
/sayHello:
get:
summary: Say English Hello Message
operationId: controllers.greetingEnglishService.sayHello
produces:
- application/json
parameters:
- name: firstName
in: header
type: string
maxLength: 100
required: true
description: Person First Name.
- name: lastName
in: header
type: string
maxLength: 100
required: true
description: Person Last Name.
responses:
'200':
description: success
/sayGoodbye:
get:
summary: Say English Goodbye Message
operationId: controllers.greetingEnglishService.sayGoodbye
produces:
- application/json
parameters:
- name: firstName
in: header
type: string
maxLength: 100
required: true
description: Person First Name.
- name: lastName
in: header
type: string
maxLength: 100
required: true
description: Person Last Name.
responses:
'200':
description: success
./swagger-downstream-definitions/greeting-turkish-definition.yaml
swagger: '2.0'
info:
description: Turkish Greeting API
version: 1.0.0
title: Turkish Greeting API
host: localhost:8080
basePath: /greeting-turkish-api/v1
schemes:
- http
paths:
/sayHello:
get:
summary: Say Turkish Hello Message
operationId: controllers.greetingTurkishService.sayHello
produces:
- application/json
parameters:
- name: firstName
in: header
type: string
maxLength: 100
required: true
description: Person First Name.
- name: lastName
in: header
type: string
maxLength: 100
required: true
description: Person Last Name.
responses:
'200':
description: success
/sayGoodbye:
get:
summary: Say Turkish Goodbye Message
operationId: controllers.greetingTurkishService.sayGoodbye
produces:
- application/json
parameters:
- name: firstName
in: header
type: string
maxLength: 100
required: true
description: Person First Name.
- name: lastName
in: header
type: string
maxLength: 100
required: true
description: Person Last Name.
responses:
'200':
description: success
./swagger-downstream-definitions/greeting-helper-definition.yaml
swagger: '2.0'
info:
description: Greeting Helper API
version: 1.0.0
title: Greeting Helper API
host: localhost
basePath: /greeting-helper-api/v1
schemes:
- http
paths:
/getFullName:
get:
summary: Get Full Name
operationId: controllers.greetingHelperService.getFullName
produces:
- application/json
parameters:
- name: firstName
in: header
type: string
maxLength: 100
required: true
description: Person First Name.
- name: lastName
in: header
type: string
maxLength: 100
required: true
description: Person Last Name.
responses:
'200':
description: success
Outputs
greetingEnglishService.js
module.exports.ServiceName = ""; //fileName if empty,null or undefined
module.exports.Service = ({ requestHandler }) => {
return {
sayHello: async ({ firstName,lastName }) => {
const requestArgs = {
method: "GET",
schemes: "http",
host: "localhost:8080",
basePath: "/greeting-english-api/v1",
path: "/sayHello",
url: "http://localhost:8080/greeting-english-api/v1/sayHello",
payload: undefined,
headers: {
"firstName": firstName || '',
"lastName": lastName || ''
}
};
const response = await requestHandler.executeAsync(requestArgs);
return response;
},
sayGoodbye: async ({ firstName,lastName }) => {
const requestArgs = {
method: "GET",
schemes: "http",
host: "localhost:8080",
basePath: "/greeting-english-api/v1",
path: "/sayGoodbye",
url: "http://localhost:8080/greeting-english-api/v1/sayGoodbye",
payload: undefined,
headers: {
"firstName": firstName || '',
"lastName": lastName || ''
}
};
const response = await requestHandler.executeAsync(requestArgs);
return response;
}
};
};
greetingTurkishService.js
module.exports.ServiceName = ""; //fileName if empty,null or undefined
module.exports.Service = ({ requestHandler }) => {
return {
sayHello: async ({ firstName,lastName }) => {
const requestArgs = {
method: "GET",
schemes: "http",
host: "localhost:8080",
basePath: "/greeting-turkish-api/v1",
path: "/sayHello",
url: "http://localhost:8080/greeting-turkish-api/v1/sayHello",
payload: undefined,
headers: {
"firstName": firstName || '',
"lastName": lastName || ''
}
};
const response = await requestHandler.executeAsync(requestArgs);
return response;
},
sayGoodbye: async ({ firstName,lastName }) => {
const requestArgs = {
method: "GET",
schemes: "http",
host: "localhost:8080",
basePath: "/greeting-turkish-api/v1",
path: "/sayGoodbye",
url: "http://localhost:8080/greeting-turkish-api/v1/sayGoodbye",
payload: undefined,
headers: {
"firstName": firstName || '',
"lastName": lastName || ''
}
};
const response = await requestHandler.executeAsync(requestArgs);
return response;
}
};
};
greetingHelperService.js
module.exports.ServiceName = ""; //fileName if empty,null or undefined
module.exports.Service = ({ requestHandler }) => {
return {
getFullName: async ({ firstName,lastName }) => {
const requestArgs = {
method: "GET",
schemes: "http",
host: "localhost",
basePath: "/greeting-helper-api/v1",
path: "/getFullName",
url: "http://localhost/greeting-helper-api/v1/getFullName",
payload: undefined,
headers: {
"firstName": firstName || '',
"lastName": lastName || ''
}
};
const response = await requestHandler.executeAsync(requestArgs);
return response;
}
};
};
Assume that there is a downstream swagger documents, and you need to update host field for every environment like dev, test, prod, etc.
To do that you need to define a .env file in project root directory.
nut-swagger generate-default-controllers-from-dir ./swagger-definitions ./services/controllers --overwrite true --isEmptyFunctionBody true --isShortFunctionBodySyntax true
nut-swagger generate-default-repositories-from-dir ./swagger-downstream-definitions ./services/repositories --overwrite true --isEmptyFunctionBody false --isShortFunctionBodySyntax true
Swagger Definition Files
All Swagger definition files are listed below;
.env
In order to specify swagger document variables, put ds. or cs. prefix as below.
# Downstream-service(ds) urls
ds.greetingEnglishDefinition.host="localhost:1080"
ds.greetingTurkishDefinition.host="localhost:1080"
ds.greetingHelperDefinition.host="localhost:1080"
# Current-service(cs) urls
cs.greetingDefinition.host="localhost:8080"
cs.greetingDefinitionV2.host="localhost:8080"
swagger-downstream-definitions/__metadata__.js
module.exports = {
Namespace: "",
ServiceName: "", //fileName if empty,null or undefine
Service: ({ }) => {
}
};
./swagger-definitions/greeting-definition.yaml
swagger: '2.0'
info:
description: Greeting API
version: 1.0.0
title: Greeting API
host: localhost:9080
basePath: /greeting-api/v1
schemes:
- http
paths:
/sayHello/{firstName}:
get:
summary: Say Hello Message
operationId: controllers.greetingService.sayHello
produces:
- application/json
parameters:
- name: language
in: header
type: string
enum:
- EN
- TR
required: true
description: Greeting Language.
- name: firstName
in: path
type: string
maxLength: 100
required: true
description: Person First Name.
- name: lastName
in: query
type: string
maxLength: 100
required: true
description: Person Last Name.
responses:
'200':
description: success
/sayGoodbye:
get:
summary: Say Goodbye Message
operationId: controllers.greetingService.sayGoodbye
produces:
- application/json
parameters:
- name: language
in: header
type: string
enum:
- EN
- TR
required: true
description: Greeting Language.
- name: firstName
in: query
type: string
maxLength: 100
required: true
description: Person First Name.
- name: lastName
in: query
type: string
maxLength: 100
required: true
description: Person Last Name.
responses:
'200':
description: success
./swagger-definitions/greeting-definition-v2.yaml
swagger: '2.0'
info:
description: Greeting API v2
version: 1.0.0
title: Greeting API v2
host: localhost:9080
basePath: /greeting-api/v2
schemes:
- http
paths:
/sayHello/{firstName}:
get:
summary: Say Hello Message
operationId: controllers.greetingServiceV2.sayHello
produces:
- application/json
parameters:
- name: language
in: header
type: string
enum:
- EN
- TR
required: true
description: Greeting Language.
- name: firstName
in: path
type: string
maxLength: 100
required: true
description: Person First Name.
- name: lastName
in: query
type: string
maxLength: 100
required: true
description: Person Last Name.
responses:
'200':
description: success
/sayGoodbye:
get:
summary: Say Goodbye Message
operationId: controllers.greetingServiceV2.sayGoodbye
produces:
- application/json
parameters:
- name: language
in: header
type: string
enum:
- EN
- TR
required: true
description: Greeting Language.
- name: firstName
in: query
type: string
maxLength: 100
required: true
description: Person First Name.
- name: lastName
in: query
type: string
maxLength: 100
required: true
description: Person Last Name.
responses:
'200':
description: success
./swagger-downstream-definitions/greeting-english-definition.yaml
swagger: '2.0'
info:
description: English Greeting API
version: 1.0.0
title: English Greeting API
host: localhost:9090
basePath: /greeting-english-api/v1
schemes:
- http
paths:
/sayHello:
get:
summary: Say English Hello Message
operationId: controllers.greetingEnglishService.sayHello
produces:
- application/json
parameters:
- name: firstName
in: header
type: string
maxLength: 100
required: true
description: Person First Name.
- name: lastName
in: header
type: string
maxLength: 100
required: true
description: Person Last Name.
responses:
'200':
description: success
/sayGoodbye:
get:
summary: Say English Goodbye Message
operationId: controllers.greetingEnglishService.sayGoodbye
produces:
- application/json
parameters:
- name: firstName
in: header
type: string
maxLength: 100
required: true
description: Person First Name.
- name: lastName
in: header
type: string
maxLength: 100
required: true
description: Person Last Name.
responses:
'200':
description: success
./swagger-downstream-definitions/greeting-turkish-definition.yaml
swagger: '2.0'
info:
description: Turkish Greeting API
version: 1.0.0
title: Turkish Greeting API
host: localhost:9090
basePath: /greeting-turkish-api/v1
schemes:
- http
paths:
/sayHello:
get:
summary: Say Turkish Hello Message
operationId: controllers.greetingTurkishService.sayHello
produces:
- application/json
parameters:
- name: firstName
in: header
type: string
maxLength: 100
required: true
description: Person First Name.
- name: lastName
in: header
type: string
maxLength: 100
required: true
description: Person Last Name.
responses:
'200':
description: success
/sayGoodbye:
get:
summary: Say Turkish Goodbye Message
operationId: controllers.greetingTurkishService.sayGoodbye
produces:
- application/json
parameters:
- name: firstName
in: header
type: string
maxLength: 100
required: true
description: Person First Name.
- name: lastName
in: header
type: string
maxLength: 100
required: true
description: Person Last Name.
responses:
'200':
description: success
./swagger-downstream-definitions/greeting-helper-definition.yaml
swagger: '2.0'
info:
description: Greeting Helper API
version: 1.0.0
title: Greeting Helper API
host: localhost:9090
basePath: /greeting-helper-api/v1
schemes:
- http
paths:
/getFullName:
get:
summary: Get Full Name
operationId: controllers.greetingHelperService.getFullName
produces:
- application/json
parameters:
- name: firstName
in: header
type: string
maxLength: 100
required: true
description: Person First Name.
- name: lastName
in: header
type: string
maxLength: 100
required: true
description: Person Last Name.
responses:
'200':
description: success
Outputs
Below two JavaScript files are controllers of your microservice. So, bodies of methods are empty so that you can write your business logic.
./services/controllers/greetingService.js
module.exports.ServiceName = ""; //fileName if empty,null or undefined
module.exports.Service = ({ requestHandler }) => {
return {
sayHello: async ({ language, firstName, lastName }) => {
return {};
},
sayGoodbye: async ({ language, firstName, lastName }) => {
return {};
}
};
};
./services/controllers/greetingServiceV2.js
module.exports.ServiceName = ""; //fileName if empty,null or undefined
module.exports.Service = ({ requestHandler }) => {
return {
sayHello: async ({ language, firstName, lastName }) => {
return {};
},
sayGoodbye: async ({ language, firstName, lastName }) => {
return {};
}
};
};
./services/repositories/greetingEnglishService.js
module.exports.ServiceName = ""; //fileName if empty,null or undefined
module.exports.Service = ({ requestHandler }) =>
({
sayHello: async ({ firstName, lastName }) => {
const requestArgs = {
method: "GET",
schemes: "http",
host: "localhost:1080",
basePath: "/greeting-english-api/v1",
path: "/sayHello",
url: "http://localhost:1080/greeting-english-api/v1/sayHello",
payload: undefined,
headers: {
"firstName": firstName || '',
"lastName": lastName || ''
}
};
const response = await requestHandler.executeAsync(requestArgs);
return response;
},
sayGoodbye: async ({ firstName, lastName }) => {
const requestArgs = {
method: "GET",
schemes: "http",
host: "localhost:1080",
basePath: "/greeting-english-api/v1",
path: "/sayGoodbye",
url: "http://localhost:1080/greeting-english-api/v1/sayGoodbye",
payload: undefined,
headers: {
"firstName": firstName || '',
"lastName": lastName || ''
}
};
const response = await requestHandler.executeAsync(requestArgs);
return response;
}
});
./services/repositories/greetingTurkishService.js
module.exports.ServiceName = ""; //fileName if empty,null or undefined
module.exports.Service = ({ requestHandler }) =>
({
sayHello: async ({ firstName, lastName }) => {
const requestArgs = {
method: "GET",
schemes: "http",
host: "localhost:1080",
basePath: "/greeting-turkish-api/v1",
path: "/sayHello",
url: "http://localhost:1080/greeting-turkish-api/v1/sayHello",
payload: undefined,
headers: {
"firstName": firstName || '',
"lastName": lastName || ''
}
};
const response = await requestHandler.executeAsync(requestArgs);
return response;
},
sayGoodbye: async ({ firstName, lastName }) => {
const requestArgs = {
method: "GET",
schemes: "http",
host: "localhost:1080",
basePath: "/greeting-turkish-api/v1",
path: "/sayGoodbye",
url: "http://localhost:1080/greeting-turkish-api/v1/sayGoodbye",
payload: undefined,
headers: {
"firstName": firstName || '',
"lastName": lastName || ''
}
};
const response = await requestHandler.executeAsync(requestArgs);
return response;
}
});
./services/repositories/greetingHelperService.js
module.exports.ServiceName = ""; //fileName if empty,null or undefined
module.exports.Service = ({ requestHandler }) =>
({
getFullName: async ({ firstName, lastName }) => {
const requestArgs = {
method: "GET",
schemes: "http",
host: "localhost:1080",
basePath: "/greeting-helper-api/v1",
path: "/getFullName",
url: "http://localhost:1080/greeting-helper-api/v1/getFullName",
payload: undefined,
headers: {
"firstName": firstName || '',
"lastName": lastName || ''
}
};
const response = await requestHandler.executeAsync(requestArgs);
return response;
}
});
FAQs
It generates Controller JavaScript files from you swagger files
We found that nut-swagger demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
Socket's package search now displays weekly downloads for npm packages, helping developers quickly assess popularity and make more informed decisions.
Security News
A Stanford study reveals 9.5% of engineers contribute almost nothing, costing tech $90B annually, with remote work fueling the rise of "ghost engineers."
Research
Security News
Socket’s threat research team has detected six malicious npm packages typosquatting popular libraries to insert SSH backdoors.