z-openapi
TypeScript icon, indicating that this package has built-in type declarations

1.4.7 • Public • Published

z-openapi

z-openapi can help you create swagger definition.

From a Zopenapi instance, each component and subcomponent are fluents. You can describe them either with a plain javascript object, either with a factory function who takes and returns a fluent builder instance. Some components have helpers functions to help saving time.

eg: <Schema instance>.string(true) for <Schema instance>.type('string').required(true)

Typescript hint enabled ! Yeay ! Let's dive into it !

In a Node project install z-openapi

$ npm install --save z-openapi

At some point in your code, import Zopenapi class, and export an instance for other modules to enhance it.

import { Zopenapi } from 'z-openapi';
export const zoa = new Zopenapi();

Describe top level informations

zoa
	.info(info => info // this is the builder instance
		.title('Swagger title')
		.version('1.0.0')
		.description('Swagger description')
		
		// Same for each compnt / subcompnt:
		
		// Equivalent
		// .license({ name: 'ISC' }) // plain openapi object
		.license(license => license.name('ISC')) // factory function
		
		.contact(contact => contact
			.name('Swagger contact name')
			.email('Swagger contact email')
			.url('Swagger contact url')
		)
	)
	.servers(
		{ url: 'http://localhost:3000' },
		{ url: 'https://another-hostname.com' },
	)
	.components(components => components
		.schemas({
			BaseError: baseError => baseError.object({
				name: name => name.string(true).description('Swagger schema description'),
				message: message => message.string(true),
			}).description('Swagger schema description'),
		})
		  
		.securitySchemes({
			bearer: bearer => bearer.name('Authorization').in('header'),
			apikey: apikey => apikey.name('api-key').in('query'),
		})
		.
	);
	
/*
.
.
.
*/

Add more schemas in your model's modules

	zoa.componentsSchemas({
		  
		User: user => user.object({
			id: id => id.string(),
			email: email => email.string(true),
			password: password => password.string(),
		}),

		Users: users => users.array(items => items.ref('User')),
			
		CreateUser: user => user.object({
			email: email => email.string(true),
			password: password => password.string(true),
		}),

		UpdateUser: user => user.object({
			email: email => email.string(),
			password: password => password.string(),
		})
	});

Add paths in your router's modules

zoa.paths({

	'/users': path => path
		.get(get => get
			.response200(resp => resp.jsonSchema(json => json.ref('Users')))
			.security({ bearer: [] })
		)
		.post(post => post
			.requestBody(body => body.jsonSchema(json => json.ref('CreateUser')))
			.response200(resp => resp.jsonSchema(json => json.ref('User')))
			.security({ apikey: [] })
		),

	'/users/{id}': path => path
		.get(get => get
			.parameters(param => param.name('id'))
			.response200(resp => resp.jsonSchema(json => json.ref('User')))
			.security({ bearer: [] })
		)
		.put(put => put
			.parameters(param => param.name('id'))
			.requestBody(body => body.jsonSchema(json => json.ref('UpdateUser')))
			.response200(resp => resp.jsonSchema(json => json.ref('User')))
			.security({ bearer: [] })
		)
		.delete(del => del
			.parameters(param => param.name('id'))
			.response200(resp => resp.jsonSchema(json => json.ref('User')))
			.security({ bearer: [] })
		)
});

Finnaly, to get it serve by swagger-ui

import swaggerUi from 'swagger-ui-express';
	
/*
.
.
.
*/

app.use('/docs',  swaggerUi.serve,  swaggerUi.setup(zoa.js()));

Versions

Current Tags

VersionDownloads (Last 7 Days)Tag
1.4.70latest

Version History

VersionDownloads (Last 7 Days)Published
1.4.70
1.4.60
1.4.50
1.4.40
1.4.30
1.4.20
1.4.10
1.4.00
1.3.90
1.3.80
1.3.70
1.3.60
1.3.50
1.3.40
1.3.30
1.3.20
1.3.10
1.2.20
1.2.10
1.1.60
1.1.50
1.1.40
1.1.30
1.1.20
1.1.10
1.0.40
1.0.30
1.0.20
1.0.10
1.0.00

Package Sidebar

Install

npm i z-openapi

Weekly Downloads

0

Version

1.4.7

License

ISC

Unpacked Size

178 kB

Total Files

20

Last publish

Collaborators

  • sbenning