Gathering detailed insights and metrics for @stilwuc/koa-joi-swagger-ts
Gathering detailed insights and metrics for @stilwuc/koa-joi-swagger-ts
npm install @stilwuc/koa-joi-swagger-ts
Typescript
Module System
Node Version
NPM Version
65.3
Supply Chain
94
Quality
71.7
Maintenance
100
Vulnerability
98.2
License
TypeScript (99.18%)
JavaScript (0.82%)
Total Downloads
3,986
Last Day
2
Last Week
19
Last Month
52
Last Year
433
1 Stars
4 Commits
1 Forks
1 Branches
7 Contributors
Minified
Minified + Gzipped
Latest Version
3.4.5
Package Id
@stilwuc/koa-joi-swagger-ts@3.4.5
Unpacked Size
96.28 kB
Size
18.87 kB
File Count
77
NPM Version
8.4.1
Node Version
16.14.0
Cumulative downloads
Total Downloads
Last day
0%
2
Compared to previous day
Last week
-20.8%
19
Compared to previous week
Last month
2,500%
52
Compared to previous month
Last year
-54.5%
433
Compared to previous year
npm install @stilwuc/koa-joi-swagger-ts --save
Each controller can use 5 predefined rest methods GET, PUT, POST, PATCH, DELETE
@controller("/user")
class UserController extends BaseController {
@put("/{userId}")
@parameter("userId", joi.string().min(2).description("userId"), ENUM_PARAM_IN.path)
addSomeUser(ctx) {
ctx.body = "cant add user";
}
@del("/{userId}")
@parameter("userId", joi.string().min(2).description("userId"), ENUM_PARAM_IN.path)
deleteSomeUser(ctx) {
ctx.body = "user not found";
}
}
We have 3 type of resolvers (aka middlewares, but without next() functions) - functions which can be called before (or after) your controller method:
This decorator can wrap on your method into try-catch, and if something wrong - call function which specifiyed into parameter fn with Error argument
Parameters:
import {safe, parameter, del, controller, ENUM_PARAM_IN} from "koa-joi-swagger-ts";
// ...somecodehere...
@controller("/user")
class UserController extends BaseController {
@del("/{userId}")
@parameter("userId", joi.string().min(2).description("userId"), ENUM_PARAM_IN.path)
@safe( (err) => { console.log(err) } )
deleteSomeUser() {
throw Error("Some bad error");
}
}
This decorator can add additional functions which will called before your controller method.
Parameters:
import {before, parameter, del, controller, ENUM_PARAM_IN} from "koa-joi-swagger-ts";
// ...somecodehere...
@controller("/user")
class UserController extends BaseController {
@del("/{userId}")
@parameter("userId", joi.string().min(2).description("userId"), ENUM_PARAM_IN.path)
@before( (ctx) => { console.log("first resolver") } )
@before( (ctx) => { console.log("second resolver") }, (ctx) => { console.log("third resolver") } )
deleteSomeUser(ctx) {
ctx.body = "user not found";
}
}
This decorator can add additional functions which will called after your controller method.
ATTENTION! Specific of decorators calling - is reversed order of calls, thats why, if you use few @after decorators - last after will be called as first, and first as last, thats why I recommend to use list of functions as multiple arguments if order matters something for your logic
Parameters:
import {after, parameter, del, controller, ENUM_PARAM_IN} from "koa-joi-swagger-ts";
// ...somecodehere...
@controller("/user")
class UserController extends BaseController {
@del("/{userId}")
@parameter("userId", joi.string().min(2).description("userId"), ENUM_PARAM_IN.path)
@after( (ctx) => { console.log("called THIRD afetr method") } )
@after( (ctx) => { console.log("called FIRST after method") }, (ctx) => { console.log("called SECOND after method") } )
deleteSomeUser(ctx) {
ctx.body = "user not found";
}
}
import {parameter, get, post, del, controller, definition, KJSRouter, summary, response, tag, ENUM_PARAM_IN} from "koa-joi-swagger-ts";
import * as joi from "joi";
import * as fs from "fs";
import {array, string} from "joi";
import * as koa from "koa";
@definition("User", "User Entity")
class UserSchema {
userName = joi.string().min(6).description("username").required();
userPass = joi.string().min(6).description("password").required();
}
@controller("/v3/api")
class BaseController {
@get("/")
index() {
}
}
/**
* This method will be called by middleware instead of controller
*/
const baseControllerFunction = async (controller, ctx, next, summary): Promise<void> => {
console.log(`${ctx.request.method} ${ctx.request.url}`);
try {
await controller(ctx);
} catch (e) {
console.log(e, `Error while executing "${summary}"`);
}
};
@controller("/user")
class UserController extends BaseController {
@del("/{userId}")
@parameter("userId", joi.string().min(2).description("userId"), ENUM_PARAM_IN.path)
index() {
}
@get("/")
@parameter("userId", joi.string().required(), ENUM_PARAM_IN.query)
doGet(ctx) {
ctx.body = Date.now();
}
@get("/{userId}")
@parameter("userId", joi.number().min(2).description("userId"), ENUM_PARAM_IN.path)
@response(200, {$ref: UserSchema})
getUser(ctx) {
ctx.body = {userName: ctx.params.userId.toString(), userPass: Date.now().toString()};
}
@post("/upload")
@parameter("file1", {type: "file"}, ENUM_PARAM_IN.formData)
doUpload(ctx) {
ctx.body = { fileObj: ctx.body.file1};
}
@post("/")
doPost() {
}
@get("s")
@response(200, {type: "array", items: {$ref: UserSchema}})
getUsers() {
}
}
@definition("Admin", "Admin Entity")
class AdminSchema {
userName = joi.string().required().min(6).uppercase();
userPass = joi.string();
}
@controller("/admin")
class AdminController extends UserController {
@post("/login")
@parameter("name", joi.string().description("name"))
@parameter("list", array().items(string()).required(), ENUM_PARAM_IN.query)
@summary("AdminController.index")
@response(200, {$ref: AdminSchema})
@response(202, joi.string().description("aaa"))
@tag("Admin")
@tag("User")
index() {
}
}
const router = new KJSRouter();
router.loadDefinition(UserSchema);
router.loadDefinition(AdminSchema);
// Or you can:
// router.loadDefinition([UserSchema, AdminSchema]);
router.loadController(BaseController);
// Process controller through pattern Decorator
router.loadController(UserController, baseControllerFunction);
router.loadController(AdminController);
router.setSwaggerFile("swagger.json");
router.loadSwaggerUI("/");
fs.writeFileSync("./swagger.json", JSON.stringify(router.swagger));
// console.log(router.getRouter());
const app = new koa();
app.use(router.getRouter().routes());
app.use(router.getRouter().allowedMethods());
app.listen(3002);
No vulnerabilities found.
No security vulnerabilities found.