diff --git a/.npmignore b/.npmignore deleted file mode 100644 index 0f300e3..0000000 --- a/.npmignore +++ /dev/null @@ -1,5 +0,0 @@ -*.sw* -node_modules/ -.DS_Store -coverage -test/ diff --git a/.travis.yml b/.travis.yml index 6965f06..23ded5d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,9 +1,10 @@ language: node_js node_js: - - 10 - - 12 - 14 -script: + - 15 + - 16 + - 17 +script: - npm run ci after_script: - npm i codecov diff --git a/LICENSE b/LICENSE index a2ce946..df4fe33 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,7 @@ (The MIT License) Copyright (c) 2014 Pebble Technology +Copyright (c) 2021 Koa.js contributions Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the diff --git a/README.md b/README.md index 893d289..00865cf 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ Easy, rich and fully validated [koa][] routing. [await-busboy]: https://github.com/aheckmann/await-busboy [joi]: https://github.com/hapijs/joi [@koa/router]: https://github.com/koajs/router -[generate API documentation]: https://github.com/a-s-o/koa-docs +[generate api documentation]: https://github.com/a-s-o/koa-docs [path-to-regexp]: https://github.com/pillarjs/path-to-regexp #### Features: @@ -46,46 +46,46 @@ Easy, rich and fully validated [koa][] routing. #### Node compatibility -NodeJS `>= 12` is required. +Node.js `>= 14` is required. #### Example ```js -const koa = require('koa'); -const router = require('koa-joi-router'); -const Joi = router.Joi; +const Koa = require("koa"); +const KoaJoiRouter = require("koa-joi-router"); +const Joi = KoaJoiRouter.Joi; -const public = router(); +const public = new KoaJoiRouter(); -public.get('/', async (ctx) => { - ctx.body = 'hello joi-router!'; +public.get("/", async (ctx) => { + ctx.body = "hello joi-router!"; }); public.route({ - method: 'post', - path: '/signup', + method: "post", + path: "/signup", validate: { body: { name: Joi.string().max(100), email: Joi.string().lowercase().email(), password: Joi.string().max(100), - _csrf: Joi.string().token() + _csrf: Joi.string().token(), }, - type: 'form', + type: "form", output: { 200: { body: { userId: Joi.string(), - name: Joi.string() - } - } - } + name: Joi.string(), + }, + }, + }, }, handler: async (ctx) => { const user = await createUser(ctx.request.body); ctx.status = 201; ctx.body = user; - } + }, }); const app = new koa(); @@ -94,22 +94,23 @@ app.listen(3000); ``` ## Usage -`koa-joi-router` returns a constructor which you use to define your routes. + +`koa-joi-router` returns a class which you use to define your routes. The design is such that you construct multiple router instances, one for each section of your application which you then add as koa middleware. ```js -const Koa = require("koa") -const router = require('koa-joi-router'); +const Koa = require("koa"); +const KoaJoiRouter = require("koa-joi-router"); -const pub = router(); -const admin = router(); -const auth = router(); +const pub = new KoaJoiRouter(); +const admin = new KoaJoiRouter(); +const auth = new KoaJoiRouter(); // add some routes .. -pub.get('/some/path', async () => {}); -admin.get('/admin', async () => {}); -auth.post('/auth', async () => {}); +pub.get("/some/path", async () => {}); +admin.get("/admin", async () => {}); +auth.post("/auth", async () => {}); const app = new Koa(); app.use(pub.middleware()); @@ -127,9 +128,9 @@ to avoid bugs related to passing an object created with a different release of Joi into the router. ```js -const koa = require('koa'); -const router = require('koa-joi-router'); -const Joi = router.Joi; +const Koa = require("koa"); +const KoaJoiRouter = require("koa-joi-router"); +const Joi = KoaJoiRouter.Joi; ``` ## Router instance methods @@ -140,22 +141,22 @@ Adds a new route to the router. `route()` accepts an object or array of objects describing route behavior. ```js -const router = require('koa-joi-router'); -const public = router(); +const KoaJoiRouter = require("koa-joi-router"); +const public = new KoaJoiRouter(); public.route({ - method: 'post', - path: '/signup', + method: "post", + path: "/signup", validate: { header: joiObject, query: joiObject, params: joiObject, body: joiObject, - maxBody: '64kb', - output: { '400-600': { body: joiObject } }, - type: 'form', + maxBody: "64kb", + output: { "400-600": { body: joiObject } }, + type: "form", failure: 400, - continueOnError: false + continueOnError: false, }, pre: async (ctx, next) => { await checkAuth(ctx); @@ -165,27 +166,27 @@ public.route({ await createUser(ctx.request.body); ctx.status = 201; }, - meta: { 'this': { is: 'stored internally with the route definition' }} + meta: { this: { is: "stored internally with the route definition" } }, }); ``` or ```js -const router = require('koa-joi-router'); -const public = router(); +const KoaJoiRouter = require("koa-joi-router"); +const public = new KoaJoiRouter(); const routes = [ { - method: 'post', - path: '/users', - handler: async (ctx) => {} + method: "post", + path: "/users", + handler: async (ctx) => {}, }, { - method: 'get', - path: '/users', - handler: async (ctx) => {} - } + method: "get", + path: "/users", + handler: async (ctx) => {}, + }, ]; public.route(routes); @@ -206,8 +207,8 @@ public.route(routes); - `formOptions`: options for co-body form parsing when `type: 'form'` - `jsonOptions`: options for co-body json parsing when `type: 'json'` - `multipartOptions`: options for [busboy][] parsing when `type: 'multipart'` - - [any busboy constructor option][busboy]. eg `{ limits: { files: 1 }}` - - `autoFields`: Determines whether form fields should be auto-parsed (default: `true`). See the [await-busboy docs](https://github.com/aheckmann/await-busboy#parts--parsestream-options). + - [any busboy constructor option][busboy]. eg `{ limits: { files: 1 }}` + - `autoFields`: Determines whether form fields should be auto-parsed (default: `true`). See the [await-busboy docs](https://github.com/aheckmann/await-busboy#parts--parsestream-options). - `output`: see [output validation](#validating-output) - `continueOnError`: if validation fails, this flags determines if `koa-joi-router` should [continue processing](#handling-errors) the middleware stack or stop and respond with an error immediately. useful when you want your route to handle the error response. default `false` - `validateOptions`: options for Joi validate. default `{}` @@ -215,32 +216,33 @@ public.route(routes); - `pre`: async function or function, will be called before parser and validators - `meta`: meta data about this route. `koa-joi-router` ignores this but stores it along with all other route data -### .get(),post(),put(),delete() etc - HTTP methods +### .get(), post(), put(), delete() ...etc - HTTP methods `koa-joi-router` supports the traditional `router.get()`, `router.post()` type APIs as well. ```js -const router = require('koa-joi-router'); -const admin = router(); +const KoaJoiRouter = require("koa-joi-router"); +const admin = new KoaJoiRouter(); // signature: router.method(path [, config], handler [, handler]) -admin.put('/thing', handler); -admin.get('/thing', middleware, handler); -admin.post('/thing', config, handler); -admin.delete('/thing', config, middleware, handler); +admin.put("/thing", handler); +admin.get("/thing", middleware, handler); +admin.post("/thing", config, handler); +admin.delete("/thing", config, middleware, handler); ``` ### .use() + Middleware run in the order they are defined by .use()(or .get(), etc.) They are invoked sequentially, requests start at the first middleware and work their way "down" the middleware stack which matches Express 4 API. ```js -const router = require('koa-joi-router'); -const users = router(); +const KoaJoiRouter = require("koa-joi-router"); +const users = new KoaJoiRouter(); -users.get('/:id', handler); -users.use('/:id', runThisAfterHandler); +users.get("/:id", handler); +users.use("/:id", runThisAfterHandler); ``` ### .prefix() @@ -248,14 +250,14 @@ users.use('/:id', runThisAfterHandler); Defines a route prefix for all defined routes. This is handy in "mounting" scenarios. ```js -const router = require('koa-joi-router'); -const users = router(); +const KoaJoiRouter = require("koa-joi-router"); +const users = new KoaJoiRouter(); -users.get('/:id', handler); +users.get("/:id", handler); // GET /users/3 -> 404 // GET /3 -> 200 -users.prefix('/users'); +users.prefix("/users"); // GET /users/3 -> 200 // GET /3 -> 404 ``` @@ -267,22 +269,22 @@ Defines middleware for named route parameters. Useful for auto-loading or valida _See [@koa/router](https://github.com/koajs/router/blob/master/API.md#module_koa-router--Router+param)_ ```js -const router = require('koa-joi-router'); -const users = router(); +const KoaJoiRouter = require("koa-joi-router"); +const users = new KoaJoiRouter(); const findUser = (id) => { // stub - return Promise.resolve('Cheddar'); + return Promise.resolve("Cheddar"); }; -users.param('user', async (id, ctx, next) => { +users.param("user", async (id, ctx, next) => { const user = await findUser(id); - if (!user) return ctx.status = 404; + if (!user) return (ctx.status = 404); ctx.user = user; await next(); }); -users.get('/users/:user', (ctx) => { +users.get("/users/:user", (ctx) => { ctx.body = `Hello ${ctx.user}`; }); @@ -295,10 +297,10 @@ Generates routing middleware to be used with `koa`. If this middleware is never added to your `koa` application, your routes will not work. ```js -const router = require('koa-joi-router'); -const public = router(); +const KoaJoiRouter = require("koa-joi-router"); +const public = new KoaJoiRouter(); -public.get('/home', homepage); +public.get("/home", homepage); const app = koa(); app.use(public.middleware()); // wired up @@ -315,9 +317,10 @@ not have an affect on your running application but is available to meet your introspection needs. ```js -const router = require('koa-joi-router'); -const public = router(); -public.get('/hello', async (ctx) => { +const KoaJoiRouter = require("koa-joi-router"); +const public = new KoaJoiRouter(); + +public.get("/hello", async (ctx) => { console.log(ctx.state.route); }); ``` @@ -344,12 +347,12 @@ parsed request input. ```js admin.route({ - method: 'post', - path: '/blog', - validate: { type: 'json' }, + method: "post", + path: "/blog", + validate: { type: "json" }, handler: async (ctx) => { console.log(ctx.request.body); // the incoming json as an object - } + }, }); ``` @@ -362,12 +365,12 @@ If successful, `ctx.request.body` will be set to the parsed request input. ```js admin.route({ - method: 'post', - path: '/blog', - validate: { type: 'form' }, + method: "post", + path: "/blog", + validate: { type: "form" }, handler: async (ctx) => { - console.log(ctx.request.body) // the incoming form as an object - } + console.log(ctx.request.body); // the incoming form as an object + }, }); ``` @@ -388,9 +391,9 @@ If successful, `ctx.request.parts` will be set to an ```js admin.route({ - method: 'post', - path: '/blog', - validate: { type: 'multipart' }, + method: "post", + path: "/blog", + validate: { type: "multipart" }, handler: async (ctx) => { const parts = ctx.request.parts; let part; @@ -405,7 +408,7 @@ admin.route({ } console.log(parts.field.name); // form data - } + }, }); ``` @@ -417,13 +420,13 @@ parse the incoming data however you see fit. ```js admin.route({ - method: 'post', - path: '/blog', - validate: { }, + method: "post", + path: "/blog", + validate: {}, handler: async (ctx) => { console.log(ctx.request.body, ctx.request.parts); // undefined undefined - } -}) + }, +}); ``` ## Validating output @@ -441,19 +444,20 @@ Let's look at some examples: ```js router.route({ - method: 'post', - path: '/user', + method: "post", + path: "/user", validate: { output: { - 200: { // individual status code + 200: { + // individual status code body: { userId: Joi.string(), - name: Joi.string() - } - } - } + name: Joi.string(), + }, + }, + }, }, - handler: handler + handler: handler, }); ``` @@ -461,19 +465,20 @@ router.route({ ```js router.route({ - method: 'post', - path: '/user', + method: "post", + path: "/user", validate: { output: { - '200,201': { // multiple individual status codes + "200,201": { + // multiple individual status codes body: { userId: Joi.string(), - name: Joi.string() - } - } - } + name: Joi.string(), + }, + }, + }, }, - handler: handler + handler: handler, }); ``` @@ -481,19 +486,20 @@ router.route({ ```js router.route({ - method: 'post', - path: '/user', + method: "post", + path: "/user", validate: { output: { - '200-299': { // status code range + "200-299": { + // status code range body: { userId: Joi.string(), - name: Joi.string() - } - } - } + name: Joi.string(), + }, + }, + }, }, - handler: handler + handler: handler, }); ``` @@ -503,19 +509,20 @@ You are free to mix and match ranges and individual status codes. ```js router.route({ - method: 'post', - path: '/user', + method: "post", + path: "/user", validate: { output: { - '200,201,300-600': { // mix it up + "200,201,300-600": { + // mix it up body: { userId: Joi.string(), - name: Joi.string() - } - } - } + name: Joi.string(), + }, + }, + }, }, - handler: handler + handler: handler, }); ``` @@ -525,30 +532,32 @@ Validating your output headers is also supported via the `headers` property: ```js router.route({ - method: 'post', - path: '/user', + method: "post", + path: "/user", validate: { output: { - '200,201': { + "200,201": { body: { userId: Joi.string(), - name: Joi.string() + name: Joi.string(), }, - headers: Joi.object({ // validate headers too - authorization: Joi.string().required() + headers: Joi.object({ + // validate headers too + authorization: Joi.string().required(), }).options({ - allowUnknown: true - }) + allowUnknown: true, + }), }, - '500-600': { - body: { // this rule only runs when a status 500 - 600 is used + "500-600": { + body: { + // this rule only runs when a status 500 - 600 is used error_code: Joi.number(), - error_msg: Joi.string() - } - } - } + error_msg: Joi.string(), + }, + }, + }, }, - handler: handler + handler: handler, }); ``` @@ -561,9 +570,10 @@ This is helpful when you'd like to introspect the previous definitions and take action e.g. to [generate API documentation][] etc. ```js -const router = require('koa-joi-router'); -const admin = router(); -admin.post('/thing', { validate: { type: 'multipart' }}, handler); +const KoaJoiRouter = require("koa-joi-router"); +const admin = new KoaJoiRouter(); + +admin.post("/thing", { validate: { type: "multipart" } }, handler); console.log(admin.routes); // [ { path: '/thing', @@ -579,11 +589,15 @@ Because [path-to-regexp][] supports it, so do we! ```js -const router = require('koa-joi-router'); -const admin = router(); -admin.get('/blog/:year(\\d{4})-:day(\\d{2})-:article(\\d{3})', async (ctx, next) => { - console.log(ctx.request.params) // { year: '2017', day: '01', article: '011' } -}); +const KoaJoiRouter = require("koa-joi-router"); +const admin = new KoaJoiRouter(); + +admin.get( + "/blog/:year(\\d{4})-:day(\\d{2})-:article(\\d{3})", + async (ctx, next) => { + console.log(ctx.request.params); // { year: '2017', day: '01', article: '011' } + } +); ``` ## Multiple methods support @@ -591,12 +605,13 @@ admin.get('/blog/:year(\\d{4})-:day(\\d{2})-:article(\\d{3})', async (ctx, next) Defining a route for multiple HTTP methods in a single shot is supported. ```js -const router = require('koa-joi-router'); -const admin = router(); +const KoaJoiRouter = require("koa-joi-router"); +const admin = new KoaJoiRouter(); + admin.route({ - path: '/', - method: ['POST', 'PUT'], - handler: fn + path: "/", + method: ["POST", "PUT"], + handler: fn, }); ``` @@ -606,12 +621,13 @@ Often times you may need to add additional, route specific middleware to a single route. ```js -const router = require('koa-joi-router'); -const admin = router(); +const KoaJoiRouter = require("koa-joi-router"); +const admin = new KoaJoiRouter(); + admin.route({ - path: '/', - method: ['POST', 'PUT'], - handler: [ yourMiddleware, yourHandler ] + path: "/", + method: ["POST", "PUT"], + handler: [yourMiddleware, yourHandler], }); ``` @@ -621,23 +637,25 @@ You may want to bundle and nest middleware in different ways for reuse and organization purposes. ```js -const router = require('koa-joi-router'); -const admin = router(); -const commonMiddleware = [ yourMiddleware, someOtherMiddleware ]; +const KoaJoiRouter = require("koa-joi-router"); +const admin = new KoaJoiRouter(); + +const commonMiddleware = [yourMiddleware, someOtherMiddleware]; admin.route({ - path: '/', - method: ['POST', 'PUT'], - handler: [ commonMiddleware, yourHandler ] + path: "/", + method: ["POST", "PUT"], + handler: [commonMiddleware, yourHandler], }); ``` This also works with the .get(),post(),put(),delete(), etc HTTP method helpers. ```js -const router = require('koa-joi-router'); -const admin = router(); -const commonMiddleware = [ yourMiddleware, someOtherMiddleware ]; -admin.get('/', commonMiddleware, yourHandler); +const KoaJoiRouter = require("koa-joi-router"); +const admin = new KoaJoiRouter(); + +const commonMiddleware = [yourMiddleware, someOtherMiddleware]; +admin.get("/", commonMiddleware, yourHandler); ``` ## Handling errors @@ -650,14 +668,14 @@ flag to true. You can find out if validation failed by checking `ctx.invalid`. ```js admin.route({ - method: 'post', - path: '/add', + method: "post", + path: "/add", validate: { - type: 'form', + type: "form", body: { - id: Joi.string().length(10) + id: Joi.string().length(10), }, - continueOnError: true + continueOnError: true, }, handler: async (ctx) => { if (ctx.invalid) { @@ -668,8 +686,8 @@ admin.route({ console.log(ctx.invalid.type); } - ctx.body = await render('add', { errors: ctx.invalid }); - } + ctx.body = await render("add", { errors: ctx.invalid }); + }, }); ``` diff --git a/joi-router.js b/joi-router.js index b4fc101..64e824d 100644 --- a/joi-router.js +++ b/joi-router.js @@ -1,159 +1,244 @@ +/*! + * koa-better-boom + * + * + * Copyright(c) 2021 Koa.js contributions + * MIT Licensed + */ + 'use strict'; +/** + * Module dependencies. + */ const assert = require('assert'); const debug = require('debug')('koa-joi-router'); -const isGenFn = require('is-gen-fn'); -const flatten = require('flatten'); -const methods = require('methods'); +const isGenFn = require('is-generator-function'); +const methods = require('http').METHODS.map(method => method.toLowerCase()); const KoaRouter = require('@koa/router'); const busboy = require('await-busboy'); const parse = require('co-body'); const Joi = require('joi'); const slice = require('sliced'); -const delegate = require('delegates'); const clone = require('clone'); + const OutputValidator = require('./output-validator'); -module.exports = Router; +/** + * Configurable, input validated routing for koa. + * + * @api public + */ +class KoaJoiRouter { + // expose Joi for use in applications + static Joi = Joi; + + constructor() { + this.routes = []; + this.router = new KoaRouter(); + } -// expose Joi for use in applications -Router.Joi = Joi; + /** + * Return koa middleware + * @return {Function} + * @api public + */ -function Router() { - if (!(this instanceof Router)) { - return new Router(); + middleware() { + return this.router.routes(); } - this.routes = []; - this.router = new KoaRouter(); -} + /** + * Adds a route or array of routes to this router, storing the route + * in `this.routes`. + * + * Example: + * + * var admin = router(); + * + * admin.route({ + * method: 'get', + * path: '/do/stuff/:id', + * handler: () => {}, + * validate: { + * header: Joi object + * params: Joi object (:id) + * query: Joi object (validate key/val pairs in the querystring) + * body: Joi object (the request payload body) (json or form) + * maxBody: '64kb' // (json, x-www-form-urlencoded only - not stream size) + * // optional + * type: 'json|form|multipart' (required when body is specified) + * failure: 400 // http error code to use + * }, + * meta: { // this is ignored but useful for doc generators etc + * desc: 'We can use this for docs generation.' + * produces: ['application/json'] + * model: {} // response object definition + * } + * }) + * + * @param {Object} spec + * @return {Router} self + * @api public + */ + + route(spec) { + if (Array.isArray(spec)) { + for (let i = 0; i < spec.length; i++) { + this._addRoute(spec[i]); + } + } else { + this._addRoute(spec); + } -/** - * Array of routes - * - * Router.prototype.routes; - * @api public - */ + return this; + } -/** - * Delegate methods to internal router object - */ + // delegate behavoir handler. + // prefix method + prefix(prefix) { + return this.router.prefix(prefix) + } + + // use method + use(...args) { + return this.router.use(...args) + } -delegate(Router.prototype, 'router') - .method('prefix') - .method('use') - .method('param'); + // param method + param(param, middleware) { + return this.router.param(param, middleware) + } -/** - * Return koa middleware - * @return {Function} - * @api public - */ + /** + * Adds a route to this router, storing the route + * in `this.routes`. + * + * @param {Object} spec + * @api private + */ + + _addRoute(spec) { + this._validateRouteSpec(spec); + this.routes.push(spec); + + debug('add %s "%s"', spec.method, spec.path); + + const bodyParser = makeBodyParser(spec); + const specExposer = makeSpecExposer(spec); + const validator = makeValidator(spec); + const preHandlers = spec.pre ? flatten(spec.pre) : []; + const handlers = flatten(spec.handler); + + const args = [ + spec.path + ].concat(preHandlers, [ + prepareRequest, + specExposer, + bodyParser, + validator + ], handlers); + + const router = this.router; + + spec.method.forEach((method) => { + router[method].apply(router, args); + }); + } + + /** + * Validate the spec passed to route() + * + * @param {Object} spec + * @api private + */ + + _validateRouteSpec(spec) { + assert(spec, 'missing spec'); -Router.prototype.middleware = function middleware() { - return this.router.routes(); -}; + const ok = typeof spec.path === 'string' || spec.path instanceof RegExp; + assert(ok, 'invalid route path'); + + checkHandler(spec); + checkPreHandler(spec); + checkMethods(spec); + checkValidators(spec); + } +} /** - * Adds a route or array of routes to this router, storing the route - * in `this.routes`. + * Routing shortcuts for all HTTP methods * * Example: * - * var admin = router(); + * var admin = router(); + * + * admin.get('/user', async function(ctx) { + * ctx.body = ctx.session.user; + * }) + * + * var validator = Joi().object().keys({ name: Joi.string() }); + * var config = { validate: { body: validator }}; * - * admin.route({ - * method: 'get', - * path: '/do/stuff/:id', - * handler: function *(next){}, - * validate: { - * header: Joi object - * params: Joi object (:id) - * query: Joi object (validate key/val pairs in the querystring) - * body: Joi object (the request payload body) (json or form) - * maxBody: '64kb' // (json, x-www-form-urlencoded only - not stream size) - * // optional - * type: 'json|form|multipart' (required when body is specified) - * failure: 400 // http error code to use - * }, - * meta: { // this is ignored but useful for doc generators etc - * desc: 'We can use this for docs generation.' - * produces: ['application/json'] - * model: {} // response object definition - * } - * }) + * admin.post('/user', config, async function(ctx){ + * console.log(ctx.body); + * }) * - * @param {Object} spec - * @return {Router} self - * @api public + * async function commonHandler(ctx){ + * // ... + * } + * admin.post('/account', [commonHandler, async function(ctx){ + * // ... + * }]); + * + * @param {String} path + * @param {Object} [config] optional + * @param {async function|async function[]} handler(s) + * @return {App} self */ -Router.prototype.route = function route(spec) { - if (Array.isArray(spec)) { - for (let i = 0; i < spec.length; i++) { - this._addRoute(spec[i]); - } - } else { - this._addRoute(spec); - } - - return this; -}; +methods.forEach((method) => { + method = method.toLowerCase(); -/** - * Adds a route to this router, storing the route - * in `this.routes`. - * - * @param {Object} spec - * @api private - */ + KoaJoiRouter.prototype[method] = function (path) { + // path, handler1, handler2, ... + // path, config, handler1 + // path, config, handler1, handler2, ... + // path, config, [handler1, handler2], handler3, ... -Router.prototype._addRoute = function addRoute(spec) { - this._validateRouteSpec(spec); - this.routes.push(spec); + let fns; + let config; - debug('add %s "%s"', spec.method, spec.path); + if (typeof arguments[1] === 'function' || Array.isArray(arguments[1])) { + config = {}; + fns = slice(arguments, 1); + } else if (typeof arguments[1] === 'object') { + config = arguments[1]; + fns = slice(arguments, 2); + } - const bodyParser = makeBodyParser(spec); - const specExposer = makeSpecExposer(spec); - const validator = makeValidator(spec); - const preHandlers = spec.pre ? flatten(spec.pre) : []; - const handlers = flatten(spec.handler); + const spec = { + path: path, + method: method, + handler: fns + }; - const args = [ - spec.path - ].concat(preHandlers, [ - prepareRequest, - specExposer, - bodyParser, - validator - ], handlers); + Object.assign(spec, config); - const router = this.router; + this.route(spec); + return this; + }; +}); - spec.method.forEach((method) => { - router[method].apply(router, args); - }); -}; +// utils /** - * Validate the spec passed to route() - * - * @param {Object} spec * @api private */ -Router.prototype._validateRouteSpec = function validateRouteSpec(spec) { - assert(spec, 'missing spec'); - - const ok = typeof spec.path === 'string' || spec.path instanceof RegExp; - assert(ok, 'invalid route path'); - - checkHandler(spec); - checkPreHandler(spec); - checkMethods(spec); - checkValidators(spec); -}; +function flatten(array) { + return array.reduce((prev, next) => prev.concat(Array.isArray(next) ? flatten(next) : next), []) +} /** * @api private @@ -188,7 +273,7 @@ function checkPreHandler(spec) { */ function isSupportedFunction(handler) { - assert.equal('function', typeof handler, 'route handler must be a function'); + assert.strictEqual('function', typeof handler, 'route handler must be a function'); if (isGenFn(handler)) { throw new Error(`route handlers must not be GeneratorFunctions @@ -237,7 +322,7 @@ function checkValidators(spec) { let text; if (spec.validate.body) { text = 'validate.type must be declared when using validate.body'; - assert(/json|form/.test(spec.validate.type), text); + assert(/json|form|multipart/.test(spec.validate.type), text); } if (spec.validate.type) { @@ -498,65 +583,6 @@ function validateInput(prop, ctx, validate) { } /** - * Routing shortcuts for all HTTP methods - * - * Example: - * - * var admin = router(); - * - * admin.get('/user', async function(ctx) { - * ctx.body = ctx.session.user; - * }) - * - * var validator = Joi().object().keys({ name: Joi.string() }); - * var config = { validate: { body: validator }}; - * - * admin.post('/user', config, async function(ctx){ - * console.log(ctx.body); - * }) - * - * async function commonHandler(ctx){ - * // ... - * } - * admin.post('/account', [commonHandler, async function(ctx){ - * // ... - * }]); - * - * @param {String} path - * @param {Object} [config] optional - * @param {async function|async function[]} handler(s) - * @return {App} self + * Expose `KoaJoiRouter`. */ - -methods.forEach((method) => { - method = method.toLowerCase(); - - Router.prototype[method] = function(path) { - // path, handler1, handler2, ... - // path, config, handler1 - // path, config, handler1, handler2, ... - // path, config, [handler1, handler2], handler3, ... - - let fns; - let config; - - if (typeof arguments[1] === 'function' || Array.isArray(arguments[1])) { - config = {}; - fns = slice(arguments, 1); - } else if (typeof arguments[1] === 'object') { - config = arguments[1]; - fns = slice(arguments, 2); - } - - const spec = { - path: path, - method: method, - handler: fns - }; - - Object.assign(spec, config); - - this.route(spec); - return this; - }; -}); +module.exports = KoaJoiRouter diff --git a/output-validation-rule.js b/output-validation-rule.js index 9b1007c..be36b15 100644 --- a/output-validation-rule.js +++ b/output-validation-rule.js @@ -4,107 +4,98 @@ const assert = require('assert'); const Joi = require('joi'); const helpMsg = ' -> see: https://github.com/koajs/joi-router/#validating-output'; -module.exports = OutputValidationRule; +class OutputValidationRule { + constructor(status, spec) { + assert(status, 'OutputValidationRule: missing status param'); + assert(spec, 'OutputValidationRule: missing spec param'); -function OutputValidationRule(status, spec) { - assert(status, 'OutputValidationRule: missing status param'); - assert(spec, 'OutputValidationRule: missing spec param'); + this.ranges = status.split(',').map(trim).filter(Boolean).map(rangify); + assert(this.ranges.length > 0, 'invalid status code: ' + status + helpMsg); - this.ranges = status.split(',').map(trim).filter(Boolean).map(rangify); - assert(this.ranges.length > 0, 'invalid status code: ' + status + helpMsg); + this.status = status; + this.spec = spec; + this.validateSpec(); + } - this.status = status; - this.spec = spec; - this.validateSpec(); -} + /** + * Validates it's input values + * + * @throws Error + */ -/** - * Validates it's input values - * - * @throws Error - */ - -OutputValidationRule.prototype.validateSpec = function validateSpec() { - assert(this.spec.body || this.spec.headers, 'output validation key: ' + - this.status + ' must have either a body or headers validator specified'); -}; - -OutputValidationRule.prototype.toString = function toString() { - return this.status; -}; - -/** - * Determines if this rule has overlapping logic - * with `ruleB`. - * - * @returns Boolean - */ - -OutputValidationRule.prototype.overlaps = function overlaps(ruleB) { - return OutputValidationRule.overlaps(this, ruleB); -}; - -/** - * Checks if this rule should be run against the - * given `ctx` response data. - * - * @returns Boolean - */ - -OutputValidationRule.prototype.matches = function matches(ctx) { - for (let i = 0; i < this.ranges.length; ++i) { - const range = this.ranges[i]; - if (ctx.status >= range.lower && ctx.status <= range.upper) { - return true; - } + validateSpec() { + assert(this.spec.body || this.spec.headers, 'output validation key: ' + + this.status + ' must have either a body or headers validator specified'); } - return false; -}; - -/** - * Validates this rule against the given `ctx`. - */ + toString() { + return this.status; + } -OutputValidationRule.prototype.validateOutput = function validateOutput(ctx) { - let result; + /** + * Determines if this rule has overlapping logic + * with `ruleB`. + * + * @returns Boolean + */ - if (this.spec.headers) { - result = Joi.compile(this.spec.headers).validate(ctx.response.headers); - if (result.error) return result.error; - // use casted values - ctx.set(result.value); + overlaps(ruleB) { + return OutputValidationRule.overlaps(this, ruleB); } - if (this.spec.body) { - result = Joi.compile(this.spec.body).validate(ctx.body); - if (result.error) return result.error; - // use casted values - ctx.body = result.value; - } -}; - -// static - -/** - * Determines if ruleA has overlapping logic - * with `ruleB`. - * - * @returns Boolean - */ - -OutputValidationRule.overlaps = function overlaps(a, b) { - /* eslint-disable prefer-arrow-callback */ - return a.ranges.some(function checkRangeA(rangeA) { - return b.ranges.some(function checkRangeB(rangeB) { - if (rangeA.upper >= rangeB.lower && rangeA.lower <= rangeB.upper) { + /** + * Checks if this rule should be run against the + * given `ctx` response data. + * + * @returns Boolean + */ + + matches(ctx) { + for (let i = 0; i < this.ranges.length; ++i) { + const range = this.ranges[i]; + if (ctx.status >= range.lower && ctx.status <= range.upper) { return true; } - return false; + } + + return false; + } + + /** + * Validates this rule against the given `ctx`. + */ + + validateOutput(ctx) { + let result; + + if (this.spec.headers) { + result = Joi.compile(this.spec.headers).validate(ctx.response.headers); + if (result.error) return result.error; + // use casted values + ctx.set(result.value); + } + + if (this.spec.body) { + result = Joi.compile(this.spec.body).validate(ctx.body); + if (result.error) return result.error; + // use casted values + ctx.body = result.value; + } + } + + static overlaps(a, b) { + /* eslint-disable prefer-arrow-callback */ + return a.ranges.some(function checkRangeA(rangeA) { + return b.ranges.some(function checkRangeB(rangeB) { + if (rangeA.upper >= rangeB.lower && rangeA.lower <= rangeB.upper) { + return true; + } + return false; + }); }); - }); - /* eslint-enable prefer-arrow-callback */ -}; + /* eslint-enable prefer-arrow-callback */ + } +} // helpers @@ -133,3 +124,5 @@ function validateCode(code) { assert(/^[1-5][0-9]{2}$/.test(code), 'invalid status code: ' + code + ' must be between 100-599'); } + +module.exports = OutputValidationRule; diff --git a/output-validator.js b/output-validator.js index 6e65620..5169428 100644 --- a/output-validator.js +++ b/output-validator.js @@ -1,51 +1,52 @@ 'use strict'; -const OutputValidationRule = require('./output-validation-rule'); const assert = require('assert'); +const OutputValidationRule = require('./output-validation-rule'); -module.exports = OutputValidator; - -function OutputValidator(output) { - assert.equal('object', typeof output, 'spec.validate.output must be an object'); +class OutputValidator { + constructor(output) { + assert.strictEqual('object', typeof output, 'spec.validate.output must be an object'); - this.rules = OutputValidator.tokenizeRules(output); - OutputValidator.assertNoOverlappingStatusRules(this.rules); + this.rules = OutputValidator.tokenizeRules(output); + OutputValidator.assertNoOverlappingStatusRules(this.rules); - this.output = output; -} + this.output = output; + } -OutputValidator.tokenizeRules = function tokenizeRules(output) { - function createRule(status) { - return new OutputValidationRule(status, output[status]); + static tokenizeRules(output) { + function createRule(status) { + return new OutputValidationRule(status, output[status]); + } + return Object.keys(output).map(createRule); } - return Object.keys(output).map(createRule); -}; - -OutputValidator.assertNoOverlappingStatusRules = -function assertNoOverlappingStatusRules(rules) { - for (let i = 0; i < rules.length; ++i) { - const ruleA = rules[i]; - - for (let j = 0; j < rules.length; ++j) { - if (i === j) continue; - - const ruleB = rules[j]; - if (ruleA.overlaps(ruleB)) { - throw new Error( - 'Output validation rules may not overlap: ' + ruleA + ' <=> ' + ruleB - ); + + static assertNoOverlappingStatusRules(rules) { + for (let i = 0; i < rules.length; ++i) { + const ruleA = rules[i]; + + for (let j = 0; j < rules.length; ++j) { + if (i === j) continue; + + const ruleB = rules[j]; + if (ruleA.overlaps(ruleB)) { + throw new Error( + 'Output validation rules may not overlap: ' + ruleA + ' <=> ' + ruleB + ); + } } } } -}; -OutputValidator.prototype.validate = function(ctx) { - assert(ctx, 'missing request context!'); + validate(ctx) { + assert(ctx, 'missing request context!'); - for (let i = 0; i < this.rules.length; ++i) { - const rule = this.rules[i]; - if (rule.matches(ctx)) { - return rule.validateOutput(ctx); + for (let i = 0; i < this.rules.length; ++i) { + const rule = this.rules[i]; + if (rule.matches(ctx)) { + return rule.validateOutput(ctx); + } } } -}; +} + +module.exports = OutputValidator; diff --git a/package-lock.json b/package-lock.json index cfb42f5..f231e8b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,219 +4,211 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@ampproject/remapping": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.2.tgz", + "integrity": "sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.0" + } + }, "@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", "dev": true, "requires": { - "@babel/highlight": "^7.10.4" + "@babel/highlight": "^7.16.7" } }, "@babel/compat-data": { - "version": "7.13.15", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.13.15.tgz", - "integrity": "sha512-ltnibHKR1VnrU4ymHyQ/CXtNXI6yZC0oJThyW78Hft8XndANwi+9H+UIklBDraIjFEJzw8wmcM427oDd9KS5wA==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.7.tgz", + "integrity": "sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ==", "dev": true }, "@babel/core": { - "version": "7.13.16", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.13.16.tgz", - "integrity": "sha512-sXHpixBiWWFti0AV2Zq7avpTasr6sIAu7Y396c608541qAU2ui4a193m0KSQmfPSKFZLnQ3cvlKDOm3XkuXm3Q==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.13.16", - "@babel/helper-compilation-targets": "^7.13.16", - "@babel/helper-module-transforms": "^7.13.14", - "@babel/helpers": "^7.13.16", - "@babel/parser": "^7.13.16", - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.13.15", - "@babel/types": "^7.13.16", + "version": "7.17.8", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.8.tgz", + "integrity": "sha512-OdQDV/7cRBtJHLSOBqqbYNkOcydOgnX59TZx4puf41fzcVtN3e/4yqY8lMQsK+5X2lJtAdmA+6OHqsj1hBJ4IQ==", + "dev": true, + "requires": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.17.7", + "@babel/helper-compilation-targets": "^7.17.7", + "@babel/helper-module-transforms": "^7.17.7", + "@babel/helpers": "^7.17.8", + "@babel/parser": "^7.17.8", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.17.3", + "@babel/types": "^7.17.0", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.1.2", - "semver": "^6.3.0", - "source-map": "^0.5.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.12.13" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } + "semver": "^6.3.0" + } + }, + "@babel/eslint-parser": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.17.0.tgz", + "integrity": "sha512-PUEJ7ZBXbRkbq3qqM/jZ2nIuakUBqCYc7Qf52Lj7dlZ6zERnqisdHioL0l4wwQZnmskMeasqUNzLBFKs3nylXA==", + "dev": true, + "requires": { + "eslint-scope": "^5.1.1", + "eslint-visitor-keys": "^2.1.0", + "semver": "^6.3.0" } }, "@babel/generator": { - "version": "7.13.16", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.13.16.tgz", - "integrity": "sha512-grBBR75UnKOcUWMp8WoDxNsWCFl//XCK6HWTrBQKTr5SV9f5g0pNOjdyzi/DTBv12S9GnYPInIXQBTky7OXEMg==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.7.tgz", + "integrity": "sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w==", "dev": true, "requires": { - "@babel/types": "^7.13.16", + "@babel/types": "^7.17.0", "jsesc": "^2.5.1", "source-map": "^0.5.0" } }, "@babel/helper-compilation-targets": { - "version": "7.13.16", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.16.tgz", - "integrity": "sha512-3gmkYIrpqsLlieFwjkGgLaSHmhnvlAYzZLlYVjlW+QwI+1zE17kGxuJGmIqDQdYp56XdmGeD+Bswx0UTyG18xA==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.7.tgz", + "integrity": "sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==", "dev": true, "requires": { - "@babel/compat-data": "^7.13.15", - "@babel/helper-validator-option": "^7.12.17", - "browserslist": "^4.14.5", + "@babel/compat-data": "^7.17.7", + "@babel/helper-validator-option": "^7.16.7", + "browserslist": "^4.17.5", "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } } }, - "@babel/helper-function-name": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", - "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", + "@babel/helper-environment-visitor": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz", + "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.12.13", - "@babel/template": "^7.12.13", - "@babel/types": "^7.12.13" + "@babel/types": "^7.16.7" } }, - "@babel/helper-get-function-arity": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", - "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz", - "integrity": "sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==", + "@babel/helper-function-name": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz", + "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==", "dev": true, "requires": { - "@babel/types": "^7.13.12" + "@babel/helper-get-function-arity": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/types": "^7.16.7" } }, - "@babel/helper-module-imports": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz", - "integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==", + "@babel/helper-get-function-arity": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz", + "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==", "dev": true, "requires": { - "@babel/types": "^7.13.12" + "@babel/types": "^7.16.7" } }, - "@babel/helper-module-transforms": { - "version": "7.13.14", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.13.14.tgz", - "integrity": "sha512-QuU/OJ0iAOSIatyVZmfqB0lbkVP0kDRiKj34xy+QNsnVZi/PA6BoSoreeqnxxa9EHFAIL0R9XOaAR/G9WlIy5g==", + "@babel/helper-hoist-variables": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", + "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.13.12", - "@babel/helper-replace-supers": "^7.13.12", - "@babel/helper-simple-access": "^7.13.12", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/helper-validator-identifier": "^7.12.11", - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.13.13", - "@babel/types": "^7.13.14" + "@babel/types": "^7.16.7" } }, - "@babel/helper-optimise-call-expression": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", - "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", + "@babel/helper-module-imports": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", + "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", "dev": true, "requires": { - "@babel/types": "^7.12.13" + "@babel/types": "^7.16.7" } }, - "@babel/helper-replace-supers": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz", - "integrity": "sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw==", + "@babel/helper-module-transforms": { + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz", + "integrity": "sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw==", "dev": true, "requires": { - "@babel/helper-member-expression-to-functions": "^7.13.12", - "@babel/helper-optimise-call-expression": "^7.12.13", - "@babel/traverse": "^7.13.0", - "@babel/types": "^7.13.12" + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-simple-access": "^7.17.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.17.3", + "@babel/types": "^7.17.0" } }, "@babel/helper-simple-access": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz", - "integrity": "sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz", + "integrity": "sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==", "dev": true, "requires": { - "@babel/types": "^7.13.12" + "@babel/types": "^7.17.0" } }, "@babel/helper-split-export-declaration": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", - "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", + "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", "dev": true, "requires": { - "@babel/types": "^7.12.13" + "@babel/types": "^7.16.7" } }, "@babel/helper-validator-identifier": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", - "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", "dev": true }, "@babel/helper-validator-option": { - "version": "7.12.17", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz", - "integrity": "sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", + "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", "dev": true }, "@babel/helpers": { - "version": "7.13.17", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.13.17.tgz", - "integrity": "sha512-Eal4Gce4kGijo1/TGJdqp3WuhllaMLSrW6XcL0ulyUAQOuxHcCafZE8KHg9857gcTehsm/v7RcOx2+jp0Ryjsg==", + "version": "7.17.8", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.8.tgz", + "integrity": "sha512-QcL86FGxpfSJwGtAvv4iG93UL6bmqBdmoVY0CMCU2g+oD2ezQse3PT5Pa+jiD6LJndBQi0EDlpzOWNlLuhz5gw==", "dev": true, "requires": { - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.13.17", - "@babel/types": "^7.13.17" + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.17.3", + "@babel/types": "^7.17.0" } }, "@babel/highlight": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", - "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", + "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.12.11", + "@babel/helper-validator-identifier": "^7.16.7", "chalk": "^2.0.0", "js-tokens": "^4.0.0" }, "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -227,62 +219,80 @@ "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, "@babel/parser": { - "version": "7.13.16", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.16.tgz", - "integrity": "sha512-6bAg36mCwuqLO0hbR+z7PHuqWiCeP7Dzg73OpQwsAB1Eb8HnGEz5xYBzCfbu+YjoaJsJs+qheDxVAuqbt3ILEw==", + "version": "7.17.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.8.tgz", + "integrity": "sha512-BoHhDJrJXqcg+ZL16Xv39H9n+AqJ4pcDrQBGZN+wHxIysrLZ3/ECwCBUch/1zUNhnsXULcONU3Ei5Hmkfk6kiQ==", "dev": true }, "@babel/template": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", - "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", + "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", "dev": true, "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/parser": "^7.12.13", - "@babel/types": "^7.12.13" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.12.13" - } - } + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" } }, "@babel/traverse": { - "version": "7.13.17", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.17.tgz", - "integrity": "sha512-BMnZn0R+X6ayqm3C3To7o1j7Q020gWdqdyP50KEoVqaCO2c/Im7sYZSmVgvefp8TTMQ+9CtwuBp0Z1CZ8V3Pvg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.13.16", - "@babel/helper-function-name": "^7.12.13", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/parser": "^7.13.16", - "@babel/types": "^7.13.17", + "version": "7.17.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.3.tgz", + "integrity": "sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.17.3", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.17.3", + "@babel/types": "^7.17.0", "debug": "^4.1.0", "globals": "^11.1.0" }, "dependencies": { - "@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.12.13" - } - }, "globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -292,56 +302,62 @@ } }, "@babel/types": { - "version": "7.13.17", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.17.tgz", - "integrity": "sha512-RawydLgxbOPDlTLJNtoIypwdmAy//uQIzlKt2+iBiJaRlVuI6QLUxVAyWGNfOzp8Yu4L4lLIacoCyTNtpb4wiA==", + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", + "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.12.11", + "@babel/helper-validator-identifier": "^7.16.7", "to-fast-properties": "^2.0.0" } }, "@eslint/eslintrc": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.0.tgz", - "integrity": "sha512-2ZPCc+uNbjV5ERJr+aKSPRwZgKd2z11x0EgLvb1PURmUrn9QNRXFqje0Ldq454PfAVyaJYyrDvvIKSFP4NnBog==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.1.tgz", + "integrity": "sha512-bxvbYnBPN1Gibwyp6NrpnFzA3YtRL3BBAyEAFVIpNTm2Rn4Vy87GA5M4aSn3InRrlsbX5N0GW7XIx+U4SAEKdQ==", "dev": true, "requires": { "ajv": "^6.12.4", - "debug": "^4.1.1", - "espree": "^7.3.0", - "globals": "^12.1.0", - "ignore": "^4.0.6", + "debug": "^4.3.2", + "espree": "^9.3.1", + "globals": "^13.9.0", + "ignore": "^5.2.0", "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", + "js-yaml": "^4.1.0", "minimatch": "^3.0.4", "strip-json-comments": "^3.1.1" - }, - "dependencies": { - "globals": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", - "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", - "dev": true, - "requires": { - "type-fest": "^0.8.1" - } - } } }, "@hapi/hoek": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.2.0.tgz", - "integrity": "sha512-sqKVVVOe5ivCaXDWivIJYVSaEgdQK9ul7a4Kity5Iw7u9+wBAPbX1RMSnLLmp7O4Vzj0WOWwMAJsTL00xwaNug==" + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.2.1.tgz", + "integrity": "sha512-gfta+H8aziZsm8pZa0vj04KO6biEiisppNgA1kbJvFrrWu9Vm7eaUEy76DIxsuTaWvti5fkJVhllWc6ZTE+Mdw==" }, "@hapi/topo": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.0.0.tgz", - "integrity": "sha512-tFJlT47db0kMqVm3H4nQYgn6Pwg10GTZHb1pwmSiv1K4ks6drQOtfEF5ZnPjkvC+y4/bUPHK+bc87QvLcL+WMw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", "requires": { "@hapi/hoek": "^9.0.0" } }, + "@humanwhocodes/config-array": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz", + "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + } + }, + "@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, "@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -355,6 +371,15 @@ "resolve-from": "^5.0.0" }, "dependencies": { + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, "camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", @@ -371,6 +396,16 @@ "path-exists": "^4.0.0" } }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, "locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -412,10 +447,32 @@ "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true }, + "@jridgewell/resolve-uri": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz", + "integrity": "sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.11", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz", + "integrity": "sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.4.tgz", + "integrity": "sha512-vFv9ttIedivx0ux3QSjhgtCVjPZd5l46ZOMDSCwnH1yUO2e964gO8LZGyv2QkqcgR6TnBU1v+1IFqmeoG+0UJQ==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, "@koa/router": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@koa/router/-/router-10.0.0.tgz", - "integrity": "sha512-z9ytrKWn/j/qUApMSJzZbUwkbLcN2ZXGq6UsqWkZb50Us+/Qpu0RwgZ6ytawVOhfFBZ1ai5iVWeD2Dcu0qcnJw==", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/@koa/router/-/router-10.1.1.tgz", + "integrity": "sha512-ORNjq5z4EmQPriKbR0ER3k4Gh7YGNhWDL7JBW+8wXDrHLbWYKYSJaOJ9aN06npF5tbTxe2JBOsurpJDAvjiXKw==", "requires": { "debug": "^4.1.1", "http-errors": "^1.7.3", @@ -425,9 +482,9 @@ } }, "@sideway/address": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.1.tgz", - "integrity": "sha512-+I5aaQr3m0OAmMr7RQ3fR9zx55sejEYR2BFJaxL+zT3VM2611X0SHvPWIbAUBZVTn/YzYKbV8gJ2oT/QELknfQ==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", + "integrity": "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==", "requires": { "@hapi/hoek": "^9.0.0" } @@ -449,25 +506,25 @@ "dev": true }, "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "dev": true, "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" + "mime-types": "~2.1.34", + "negotiator": "0.6.3" } }, "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", + "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", "dev": true }, "acorn-jsx": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", - "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true }, "aggregate-error": { @@ -499,26 +556,20 @@ "dev": true }, "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "color-convert": "^1.9.0" + "color-convert": "^2.0.1" } }, - "any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=", - "dev": true - }, "anymatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", @@ -545,18 +596,15 @@ "dev": true }, "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true }, - "astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", "dev": true }, "asynckit": { @@ -617,16 +665,16 @@ "dev": true }, "browserslist": { - "version": "4.16.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.5.tgz", - "integrity": "sha512-C2HAjrM1AI/djrpAUU/tr4pml1DqLIzJKSLDBXBrNErl9ZCCTXdhwxdJjYc16953+mBWf7Lw+uUJgpgb8cN71A==", + "version": "4.20.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz", + "integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001214", - "colorette": "^1.2.2", - "electron-to-chromium": "^1.3.719", + "caniuse-lite": "^1.0.30001317", + "electron-to-chromium": "^1.4.84", "escalade": "^3.1.1", - "node-releases": "^1.1.71" + "node-releases": "^2.0.2", + "picocolors": "^1.0.0" } }, "busboy": { @@ -638,9 +686,9 @@ } }, "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" }, "cache-content-type": { "version": "1.0.1", @@ -680,82 +728,52 @@ "dev": true }, "camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true }, "caniuse-lite": { - "version": "1.0.30001214", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001214.tgz", - "integrity": "sha512-O2/SCpuaU3eASWVaesQirZv1MSjUNOvmugaD8zNSJqw6Vv5SGwoOpA9LJs3pNPfM745nxqPvfZY3MQKY4AKHYg==", + "version": "1.0.30001320", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001320.tgz", + "integrity": "sha512-MWPzG54AGdo3nWx7zHZTefseM5Y1ccM7hlQKHRqJkPozUaw3hNbBTMmLn16GG2FUzjR13Cr3NPfhIieX5PzXDA==", "dev": true }, "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } } }, "chokidar": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", - "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", "dev": true, "requires": { - "anymatch": "~3.1.1", + "anymatch": "~3.1.2", "braces": "~3.0.2", - "fsevents": "~2.3.1", - "glob-parent": "~5.1.0", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", - "readdirp": "~3.5.0" + "readdirp": "~3.6.0" + }, + "dependencies": { + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + } } }, "clean-stack": { @@ -787,9 +805,9 @@ "dev": true }, "co-body": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/co-body/-/co-body-6.0.0.tgz", - "integrity": "sha512-9ZIcixguuuKIptnY8yemEOuhb71L/lLf+Rl5JfJEUiDNJk0e02MBt7BPxR2GEh5mw8dPthQYR4jPI/BnS1MQgw==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/co-body/-/co-body-6.1.0.tgz", + "integrity": "sha512-m7pOT6CdLN7FuXUcpuz/8lfQ/L77x8SchHCF4G0RBTJO20Wzmhn5Sp4/5WsKy8OSpifBSUrmg83qEqaDHdyFuQ==", "requires": { "inflation": "^2.0.0", "qs": "^6.5.2", @@ -798,24 +816,18 @@ } }, "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { - "color-name": "1.1.3" + "color-name": "~1.1.4" } }, "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "colorette": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", - "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "combined-stream": { @@ -846,12 +858,12 @@ "dev": true }, "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "dev": true, "requires": { - "safe-buffer": "5.1.2" + "safe-buffer": "5.2.1" } }, "content-type": { @@ -861,18 +873,26 @@ "dev": true }, "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", "dev": true, "requires": { "safe-buffer": "~5.1.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } } }, "cookiejar": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", - "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.3.tgz", + "integrity": "sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ==", "dev": true }, "cookies": { @@ -893,12 +913,6 @@ } } }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, "cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -911,11 +925,11 @@ } }, "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } }, "decamelize": { @@ -931,9 +945,9 @@ "dev": true }, "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, "default-require-extensions": { @@ -954,7 +968,8 @@ "delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "dev": true }, "depd": { "version": "1.1.2", @@ -962,11 +977,21 @@ "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" }, "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "dev": true }, + "dezalgo": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz", + "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=", + "dev": true, + "requires": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, "dicer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.3.0.tgz", @@ -997,9 +1022,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.3.720", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.720.tgz", - "integrity": "sha512-B6zLTxxaOFP4WZm6DrvgRk8kLFYWNhQ5TrHMC0l5WtkMXhU5UbnvWoTfeEwqOruUSlNMhVLfYak7REX6oC5Yfw==", + "version": "1.4.94", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.94.tgz", + "integrity": "sha512-CoOKsuACoa0PAG3hQXxbh/XDiFcjGuSyGKUi09cjMHOt6RCi7/EXgXhaFF3I+aC89Omudqmkzd0YOQKxwtf/Bg==", "dev": true }, "emoji-regex": { @@ -1014,15 +1039,6 @@ "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", "dev": true }, - "enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, - "requires": { - "ansi-colors": "^4.1.1" - } - }, "es6-error": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", @@ -1042,54 +1058,76 @@ "dev": true }, "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true }, "eslint": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.24.0.tgz", - "integrity": "sha512-k9gaHeHiFmGCDQ2rEfvULlSLruz6tgfA8DEn+rY9/oYPFFTlz55mM/Q/Rij1b2Y42jwZiK3lXvNTw6w6TXzcKQ==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.11.0.tgz", + "integrity": "sha512-/KRpd9mIRg2raGxHRGwW9ZywYNAClZrHjdueHcrVDuO3a6bj83eoTirCCk0M0yPwOjWYKHwRVRid+xK4F/GHgA==", "dev": true, "requires": { - "@babel/code-frame": "7.12.11", - "@eslint/eslintrc": "^0.4.0", + "@eslint/eslintrc": "^1.2.1", + "@humanwhocodes/config-array": "^0.9.2", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", - "debug": "^4.0.1", + "debug": "^4.3.2", "doctrine": "^3.0.0", - "enquirer": "^2.3.5", - "eslint-scope": "^5.1.1", - "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^2.0.0", - "espree": "^7.3.1", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.1", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.1", "esquery": "^1.4.0", "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", + "glob-parent": "^6.0.1", "globals": "^13.6.0", - "ignore": "^4.0.6", + "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", + "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", - "lodash": "^4.17.21", + "lodash.merge": "^4.6.2", "minimatch": "^3.0.4", "natural-compare": "^1.4.0", "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.1.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", - "table": "^6.0.4", "text-table": "^0.2.0", "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "eslint-scope": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } } }, "eslint-scope": { @@ -1103,43 +1141,35 @@ } }, "eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", "dev": true, "requires": { - "eslint-visitor-keys": "^1.1.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - } + "eslint-visitor-keys": "^2.0.0" } }, "eslint-visitor-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz", - "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", "dev": true }, "espree": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", - "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.1.tgz", + "integrity": "sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ==", "dev": true, "requires": { - "acorn": "^7.4.0", + "acorn": "^8.7.0", "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" + "eslint-visitor-keys": "^3.3.0" }, "dependencies": { "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", "dev": true } } @@ -1160,9 +1190,9 @@ }, "dependencies": { "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true } } @@ -1177,9 +1207,9 @@ }, "dependencies": { "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true } } @@ -1196,12 +1226,6 @@ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -1220,6 +1244,12 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, + "fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", + "dev": true + }, "file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -1239,9 +1269,9 @@ } }, "find-cache-dir": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", - "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", "dev": true, "requires": { "commondir": "^1.0.1", @@ -1276,16 +1306,11 @@ } }, "flatted": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", - "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", + "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", "dev": true }, - "flatten": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.3.tgz", - "integrity": "sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==" - }, "foreground-child": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", @@ -1297,21 +1322,35 @@ } }, "form-data": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", - "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", "dev": true, "requires": { "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", + "combined-stream": "^1.0.8", "mime-types": "^2.1.12" } }, "formidable": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.2.tgz", - "integrity": "sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q==", - "dev": true + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.0.1.tgz", + "integrity": "sha512-rjTMNbp2BpfQShhFbR3Ruk3qk2y9jKpvMW78nJgx8QKtxjDVrwbZG+wvDOmVbifHyOUOQJXxqEy6r0faRrPzTQ==", + "dev": true, + "requires": { + "dezalgo": "1.0.3", + "hexoid": "1.0.0", + "once": "1.4.0", + "qs": "6.9.3" + }, + "dependencies": { + "qs": { + "version": "6.9.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.3.tgz", + "integrity": "sha512-EbZYNarm6138UKKq46tdx08Yo/q9ZhFoAXAI1meAFd2GtbRDhbZY2WQSICskT0c5q99aFzLG1D4nvTk9tqfXIw==", + "dev": true + } + } }, "fresh": { "version": "0.5.2", @@ -1378,9 +1417,9 @@ "dev": true }, "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -1392,35 +1431,27 @@ } }, "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, "requires": { - "is-glob": "^4.0.1" + "is-glob": "^4.0.3" } }, "globals": { - "version": "13.8.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.8.0.tgz", - "integrity": "sha512-rHtdA6+PDBIjeEvA91rpqzEvk/k3/i7EeNQiryiWuJH0Hw9cpyJMAt2jtbAwUaRdhD+573X4vWw6IcjKPasi9Q==", + "version": "13.13.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz", + "integrity": "sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==", "dev": true, "requires": { "type-fest": "^0.20.2" - }, - "dependencies": { - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - } } }, "graceful-fs": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", - "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "version": "4.2.9", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", + "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==", "dev": true }, "growl": { @@ -1438,15 +1469,23 @@ } }, "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "requires": { + "has-symbols": "^1.0.2" + } }, "hasha": { "version": "5.2.2", @@ -1456,6 +1495,14 @@ "requires": { "is-stream": "^2.0.0", "type-fest": "^0.8.0" + }, + "dependencies": { + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + } } }, "he": { @@ -1464,6 +1511,12 @@ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true }, + "hexoid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", + "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==", + "dev": true + }, "html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", @@ -1471,46 +1524,25 @@ "dev": true }, "http-assert": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/http-assert/-/http-assert-1.4.1.tgz", - "integrity": "sha512-rdw7q6GTlibqVVbXr0CKelfV5iY8G2HqEUkhSk297BMbSpSL8crXC+9rjKoMcZZEsksX30le6f/4ul4E28gegw==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/http-assert/-/http-assert-1.5.0.tgz", + "integrity": "sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==", "dev": true, "requires": { "deep-equal": "~1.0.1", - "http-errors": "~1.7.2" - }, - "dependencies": { - "http-errors": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", - "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - } - }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", - "dev": true - } + "http-errors": "~1.8.0" } }, "http-errors": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.0.tgz", - "integrity": "sha512-4I8r0C5JDhT5VkvI47QktDW75rNlGVsUf/8hzjCC/wkWI/jdTRmBb9aI7erSG82r1bjKY3F6k28WnsVxB1C73A==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", "requires": { "depd": "~1.1.2", "inherits": "2.0.4", "setprototypeof": "1.2.0", "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" + "toidentifier": "1.0.1" } }, "iconv-lite": { @@ -1522,9 +1554,9 @@ } }, "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", "dev": true }, "import-fresh": { @@ -1590,21 +1622,18 @@ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, - "is-gen-fn": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/is-gen-fn/-/is-gen-fn-0.0.1.tgz", - "integrity": "sha1-8na/KgCDVxq9Aa3UfNTaEFpkzhM=" - }, "is-generator-function": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.8.tgz", - "integrity": "sha512-2Omr/twNtufVZFr1GhxjOMFPAj2sjc/dKaIqBhvo4qciXfJmITGH6ZGd8eZYNHza8t1y0e01AuqRhJwfWp26WQ==", - "dev": true + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "requires": { + "has-tostringtag": "^1.0.0" + } }, "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "requires": { "is-extglob": "^2.1.1" @@ -1623,9 +1652,9 @@ "dev": true }, "is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true }, "is-typedarray": { @@ -1634,18 +1663,18 @@ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", "dev": true }, + "is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true + }, "is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", "dev": true }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -1653,9 +1682,9 @@ "dev": true }, "istanbul-lib-coverage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", "dev": true }, "istanbul-lib-hook": { @@ -1677,14 +1706,6 @@ "@istanbuljs/schema": "^0.1.2", "istanbul-lib-coverage": "^3.0.0", "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } } }, "istanbul-lib-processinfo": { @@ -1711,29 +1732,12 @@ "istanbul-lib-coverage": "^3.0.0", "make-dir": "^3.0.0", "supports-color": "^7.1.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } } }, "istanbul-lib-source-maps": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", - "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", "dev": true, "requires": { "debug": "^4.1.1", @@ -1750,9 +1754,9 @@ } }, "istanbul-reports": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", - "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.4.tgz", + "integrity": "sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw==", "dev": true, "requires": { "html-escaper": "^2.0.0", @@ -1760,13 +1764,13 @@ } }, "joi": { - "version": "17.4.0", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.4.0.tgz", - "integrity": "sha512-F4WiW2xaV6wc1jxete70Rw4V/VuMd6IN+a5ilZsxG4uYtUXWu2kq9W5P2dz30e7Gmw8RCbY/u/uk+dMPma9tAg==", + "version": "17.6.0", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.6.0.tgz", + "integrity": "sha512-OX5dG6DTbcr/kbMFj0KGYxuew69HPcAE3K/sZpEV2nP6e/j/C0HV+HNiBPCASxdx5T7DMoa0s8UeHWMnb6n2zw==", "requires": { "@hapi/hoek": "^9.0.0", "@hapi/topo": "^5.0.0", - "@sideway/address": "^4.1.0", + "@sideway/address": "^4.1.3", "@sideway/formula": "^3.0.0", "@sideway/pinpoint": "^2.0.0" } @@ -1778,13 +1782,12 @@ "dev": true }, "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "argparse": "^2.0.1" } }, "jsesc": { @@ -1806,13 +1809,10 @@ "dev": true }, "json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "dev": true }, "keygrip": { "version": "1.1.0", @@ -1824,9 +1824,9 @@ } }, "koa": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/koa/-/koa-2.13.1.tgz", - "integrity": "sha512-Lb2Dloc72auj5vK4X4qqL7B5jyDPQaZucc9sR/71byg7ryoD1NCaCm63CShk9ID9quQvDEi1bGR/iGjCG7As3w==", + "version": "2.13.4", + "resolved": "https://registry.npmjs.org/koa/-/koa-2.13.4.tgz", + "integrity": "sha512-43zkIKubNbnrULWlHdN5h1g3SEKXOEzoAlRsHOTFpnlDu8JlAOZSMJBLULusuXRequboiwJcj5vtYXKB3k7+2g==", "dev": true, "requires": { "accepts": "^1.3.5", @@ -1834,7 +1834,7 @@ "content-disposition": "~0.5.2", "content-type": "^1.0.4", "cookies": "~0.8.0", - "debug": "~3.1.0", + "debug": "^4.3.2", "delegates": "^1.0.0", "depd": "^2.0.0", "destroy": "^1.0.4", @@ -1845,7 +1845,7 @@ "http-errors": "^1.6.3", "is-generator-function": "^1.0.7", "koa-compose": "^4.1.0", - "koa-convert": "^1.2.0", + "koa-convert": "^2.0.0", "on-finished": "^2.3.0", "only": "~0.0.2", "parseurl": "^1.3.2", @@ -1854,26 +1854,11 @@ "vary": "^1.1.2" }, "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, "depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "dev": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true } } }, @@ -1883,24 +1868,13 @@ "integrity": "sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==" }, "koa-convert": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/koa-convert/-/koa-convert-1.2.0.tgz", - "integrity": "sha1-2kCHXfSd4FOQmNFwC1CCDOvNIdA=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/koa-convert/-/koa-convert-2.0.0.tgz", + "integrity": "sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA==", "dev": true, "requires": { "co": "^4.6.0", - "koa-compose": "^3.0.0" - }, - "dependencies": { - "koa-compose": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-3.2.1.tgz", - "integrity": "sha1-qFzLQLfZhtjlo0Wzoazo6rz1Tec=", - "dev": true, - "requires": { - "any-promise": "^1.1.0" - } - } + "koa-compose": "^4.1.0" } }, "levn": { @@ -1922,43 +1896,26 @@ "p-locate": "^5.0.0" } }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", - "dev": true - }, - "lodash.flatten": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=", - "dev": true - }, "lodash.flattendeep": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", "dev": true }, - "lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, "log-symbols": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", - "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", "dev": true, "requires": { - "chalk": "^4.0.0" + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" } }, "lru-cache": { @@ -1977,14 +1934,6 @@ "dev": true, "requires": { "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } } }, "media-typer": { @@ -1998,82 +1947,69 @@ "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" }, "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", "dev": true }, "mime-db": { - "version": "1.47.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.47.0.tgz", - "integrity": "sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw==" + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" }, "mime-types": { - "version": "2.1.30", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.30.tgz", - "integrity": "sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg==", + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "requires": { - "mime-db": "1.47.0" + "mime-db": "1.52.0" } }, "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "requires": { "brace-expansion": "^1.1.7" } }, - "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true - }, "mocha": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.3.2.tgz", - "integrity": "sha512-UdmISwr/5w+uXLPKspgoV7/RXZwKRTiTjJ2/AC5ZiEztIoOYdfKb19+9jNmEInzx5pBsCyJQzarAxqIGBNYJhg==", + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.2.2.tgz", + "integrity": "sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==", "dev": true, "requires": { "@ungap/promise-all-settled": "1.1.2", "ansi-colors": "4.1.1", "browser-stdout": "1.3.1", - "chokidar": "3.5.1", - "debug": "4.3.1", + "chokidar": "3.5.3", + "debug": "4.3.3", "diff": "5.0.0", "escape-string-regexp": "4.0.0", "find-up": "5.0.0", - "glob": "7.1.6", + "glob": "7.2.0", "growl": "1.10.5", "he": "1.2.0", - "js-yaml": "4.0.0", - "log-symbols": "4.0.0", - "minimatch": "3.0.4", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "4.2.1", "ms": "2.1.3", - "nanoid": "3.1.20", - "serialize-javascript": "5.0.1", + "nanoid": "3.3.1", + "serialize-javascript": "6.0.0", "strip-json-comments": "3.1.1", "supports-color": "8.1.1", "which": "2.0.2", - "wide-align": "1.1.3", - "workerpool": "6.1.0", + "workerpool": "6.2.0", "yargs": "16.2.0", "yargs-parser": "20.2.4", "yargs-unparser": "2.0.0" }, "dependencies": { - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "dev": true, "requires": { "ms": "2.1.2" @@ -2087,27 +2023,21 @@ } } }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "js-yaml": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.0.0.tgz", - "integrity": "sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q==", + "minimatch": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-4.2.1.tgz", + "integrity": "sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==", "dev": true, "requires": { - "argparse": "^2.0.1" + "brace-expansion": "^1.1.7" } }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, "supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -2120,14 +2050,14 @@ } }, "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "nanoid": { - "version": "3.1.20", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz", - "integrity": "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", + "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==", "dev": true }, "natural-compare": { @@ -2137,9 +2067,9 @@ "dev": true }, "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "dev": true }, "node-preload": { @@ -2152,9 +2082,9 @@ } }, "node-releases": { - "version": "1.1.71", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz", - "integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz", + "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==", "dev": true }, "normalize-path": { @@ -2198,15 +2128,6 @@ "yargs": "^15.0.2" }, "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, "camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", @@ -2224,21 +2145,6 @@ "wrap-ansi": "^6.2.0" } }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", @@ -2337,14 +2243,14 @@ } }, "object-inspect": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.2.tgz", - "integrity": "sha512-gz58rdPpadwztRrPjZE9DZLOABUpTGdcANUgOwBFO1C+HZZhePoP83M65WGDmbpwFYJSWqavbl4SgDn4k8RYTA==" + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", + "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==" }, "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "dev": true, "requires": { "ee-first": "1.1.1" @@ -2462,10 +2368,16 @@ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.0.tgz", "integrity": "sha512-f66KywYG6+43afgE/8j/GoiNyygk/bnoCbps++3ErRKsIYkGGupyv07R2Ok5m9i67Iqc+T2g1eAUGUPzWhYTyg==" }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, "picomatch": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.3.tgz", - "integrity": "sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true }, "pkg-dir": { @@ -2522,12 +2434,6 @@ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, "process-on-spawn": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", @@ -2537,12 +2443,6 @@ "fromentries": "^1.2.0" } }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", @@ -2550,9 +2450,9 @@ "dev": true }, "qs": { - "version": "6.10.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.1.tgz", - "integrity": "sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==", + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", "requires": { "side-channel": "^1.0.4" } @@ -2567,63 +2467,64 @@ } }, "raw-body": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.1.tgz", - "integrity": "sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.3", + "bytes": "3.1.2", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", "unpipe": "1.0.0" }, "dependencies": { + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + }, "http-errors": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", - "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "requires": { - "depd": "~1.1.2", + "depd": "2.0.0", "inherits": "2.0.4", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" } }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" } } }, "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "dev": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" } }, "readdirp": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", - "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, "requires": { "picomatch": "^2.2.1" } }, "regexpp": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", - "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "dev": true }, "release-zalgo": { @@ -2641,12 +2542,6 @@ "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", "dev": true }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true - }, "require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", @@ -2669,9 +2564,9 @@ } }, "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true }, "safer-buffer": { @@ -2680,18 +2575,15 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true }, "serialize-javascript": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", - "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", "dev": true, "requires": { "randombytes": "^2.1.0" @@ -2734,48 +2626,11 @@ } }, "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, - "slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - } - } - }, "sliced": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", @@ -2818,32 +2673,32 @@ "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=" }, "string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" + "strip-ansi": "^6.0.1" } }, "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dev": true, "requires": { - "safe-buffer": "~5.1.0" + "safe-buffer": "~5.2.0" } }, "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "requires": { - "ansi-regex": "^5.0.0" + "ansi-regex": "^5.0.1" } }, "strip-bom": { @@ -2859,85 +2714,52 @@ "dev": true }, "superagent": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.3.tgz", - "integrity": "sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA==", - "dev": true, - "requires": { - "component-emitter": "^1.2.0", - "cookiejar": "^2.1.0", - "debug": "^3.1.0", - "extend": "^3.0.0", - "form-data": "^2.3.1", - "formidable": "^1.2.0", - "methods": "^1.1.1", - "mime": "^1.4.1", - "qs": "^6.5.1", - "readable-stream": "^2.3.5" + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-7.1.1.tgz", + "integrity": "sha512-CQ2weSS6M+doIwwYFoMatklhRbx6sVNdB99OEJ5czcP3cng76Ljqus694knFWgOj3RkrtxZqIgpe6vhe0J7QWQ==", + "dev": true, + "requires": { + "component-emitter": "^1.3.0", + "cookiejar": "^2.1.3", + "debug": "^4.3.3", + "fast-safe-stringify": "^2.1.1", + "form-data": "^4.0.0", + "formidable": "^2.0.1", + "methods": "^1.1.2", + "mime": "^2.5.0", + "qs": "^6.10.1", + "readable-stream": "^3.6.0", + "semver": "^7.3.5" }, "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", "dev": true, "requires": { - "ms": "^2.1.1" + "lru-cache": "^6.0.0" } } } }, "supertest": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/supertest/-/supertest-4.0.2.tgz", - "integrity": "sha512-1BAbvrOZsGA3YTCWqbmh14L0YEq0EGICX/nBnfkfVJn7SrxQV1I3pMYjSzG9y/7ZU2V9dWqyqk2POwxlb09duQ==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/supertest/-/supertest-6.2.2.tgz", + "integrity": "sha512-wCw9WhAtKJsBvh07RaS+/By91NNE0Wh0DN19/hWPlBOU8tAfOtbZoVSV4xXeoKoxgPx0rx2y+y+8660XtE7jzg==", "dev": true, "requires": { "methods": "^1.1.2", - "superagent": "^3.8.3" + "superagent": "^7.1.0" } }, "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { - "has-flag": "^3.0.0" - } - }, - "table": { - "version": "6.3.3", - "resolved": "https://registry.npmjs.org/table/-/table-6.3.3.tgz", - "integrity": "sha512-zAplNl1IDQIzlGbqfVg3/pS9bb7RaUgaNd0Qzwt/0oPlzEZZGYQIb+A1Gh8TBU3mzs2E5HfWWqT3Oj0oIup+pw==", - "dev": true, - "requires": { - "ajv": "^8.0.1", - "lodash.clonedeep": "^4.5.0", - "lodash.flatten": "^4.4.0", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.0" - }, - "dependencies": { - "ajv": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.1.0.tgz", - "integrity": "sha512-B/Sk2Ix7A36fs/ZkuGLIR86EdjbgR6fsAcbx9lOP/QBSXujDNbVmIS/U4Itz5k8fPFDeVZl/zQ/gJW4Jrq6XjQ==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - } + "has-flag": "^4.0.0" } }, "test-exclude": { @@ -2973,9 +2795,9 @@ } }, "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" }, "tsscmp": { "version": "1.0.6", @@ -2993,9 +2815,9 @@ } }, "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true }, "type-is": { @@ -3069,48 +2891,6 @@ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, - "requires": { - "string-width": "^1.0.2 || 2" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", @@ -3118,9 +2898,9 @@ "dev": true }, "workerpool": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.0.tgz", - "integrity": "sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.0.tgz", + "integrity": "sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==", "dev": true }, "wrap-ansi": { @@ -3132,32 +2912,6 @@ "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - } } }, "wrappy": { @@ -3224,9 +2978,9 @@ } }, "ylru": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ylru/-/ylru-1.2.1.tgz", - "integrity": "sha512-faQrqNMzcPCHGVC2aaOINk13K+aaBDUPjGWl0teOXywElLjyVAB6Oe2jj62jHYtwsU49jXhScYbvPENK+6zAvQ==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/ylru/-/ylru-1.3.2.tgz", + "integrity": "sha512-RXRJzMiK6U2ye0BlGGZnmpwJDPgakn6aNQ0A7gHRbD4I0uvK4TW6UqkK1V0pp9jskjJBAXd3dRrbzWkqJ+6cxA==", "dev": true }, "yocto-queue": { diff --git a/package.json b/package.json index fa8b598..1c0f0f5 100644 --- a/package.json +++ b/package.json @@ -18,9 +18,19 @@ "ci": "rimraf .nyc_output && npm run lint && npm run test-cov" }, "engines": { - "node": ">= 12" + "node": ">= 14" }, - "author": "Aaron Heckmann ", + "author": { + "name": "Aaron Heckmann", + "email": "aaron.heckmann+github@gmail.com" + }, + "contributors": [ + { + "name": "Imed Jaberi", + "email": "imed_jebari@hotmail.fr", + "url": "https://www.3imed-jaberi.com/" + } + ], "license": "MIT", "repository": { "type": "git", @@ -31,32 +41,31 @@ }, "homepage": "https://github.com/koajs/joi-router", "dependencies": { - "@koa/router": "^10.0.0", - "await-busboy": "1.0.3", - "clone": "2.1.2", - "co-body": "6.0.0", - "debug": "4.1.1", - "delegates": "1.0.0", - "flatten": "1.0.3", - "is-gen-fn": "0.0.1", - "joi": "^17.2.1", - "methods": "1.1.2", - "sliced": "1.0.1" + "@koa/router": "^10.1.1", + "await-busboy": "^1.0.3", + "clone": "^2.1.2", + "co-body": "^6.1.0", + "debug": "^4.3.4", + "is-generator-function": "^1.0.10", + "joi": "^17.6.0", + "sliced": "^1.0.1" }, "devDependencies": { - "eslint": "^7.9.0", - "koa": "^2.13.0", - "mocha": "^8.1.3", + "@babel/eslint-parser": "^7.17.0", + "eslint": "^8.11.0", + "koa": "^2.13.4", + "mocha": "^9.2.2", "nyc": "^15.1.0", "rimraf": "^3.0.2", - "supertest": "^4.0.2" + "supertest": "^6.2.2" }, "eslintConfig": { "extends": [ "eslint:recommended" ], + "parser": "@babel/eslint-parser", "parserOptions": { - "ecmaVersion": 2017 + "ecmaVersion": 2020 }, "env": { "node": true diff --git a/test/index.js b/test/index.js index 286ec23..80b768d 100644 --- a/test/index.js +++ b/test/index.js @@ -1,7 +1,7 @@ 'use strict'; -const router = require('../'); const Koa = require('koa'); +const KoaJoiRouter = require('..'); const assert = require('assert'); const request = require('supertest'); const http = require('http'); @@ -45,24 +45,24 @@ async function errorHandler(ctx, next) { describe('koa-joi-router', () => { it('exposes a function', (done) => { - assert.equal('function', typeof router); + assert.equal('function', typeof KoaJoiRouter); done(); }); it('is a constructor', (done) => { - const r = router(); - assert(r instanceof router); + const r = new KoaJoiRouter(); + assert(r instanceof KoaJoiRouter); done(); }); it('exposes the Joi module', (done) => { - assert.equal(router.Joi, Joi); + assert.equal(KoaJoiRouter.Joi, Joi); done(); }); describe('routes', () => { it('is an array', (done) => { - const r = router(); + const r = new KoaJoiRouter(); assert(Array.isArray(r.routes), 'expected .routes to be an Array'); done(); }); @@ -71,7 +71,7 @@ describe('koa-joi-router', () => { describe('route()', () => { describe('spec argument', () => { it('is required', (done) => { - const r = router(); + const r = new KoaJoiRouter(); assert.throws(() => { r.route(); @@ -83,9 +83,9 @@ describe('koa-joi-router', () => { describe('must contain', () => { it('path', (done) => { assert.throws(() => { - router().route({ + new KoaJoiRouter().route({ method: [], - handler: () => {} + handler: () => { } }); }, /invalid route path/); done(); @@ -93,17 +93,17 @@ describe('koa-joi-router', () => { it('at least one method', (done) => { assert.throws(() => { - router().route({ + new KoaJoiRouter().route({ path: '/', - handler: () => {} + handler: () => { } }); }, /missing route method/); assert.throws(() => { - router().route({ + new KoaJoiRouter().route({ path: '/', method: [], - handler: () => {} + handler: () => { } }); }, /missing route method/); @@ -112,22 +112,33 @@ describe('koa-joi-router', () => { it('handler', (done) => { assert.throws(() => { - router().route({ + new KoaJoiRouter().route({ method: ['get'], path: '/' }); }, /route handler/); done(); }); + + it('handler as generator function', (done) => { + assert.throws(() => { + new KoaJoiRouter().route({ + method: ['get'], + path: '/', + handler: function* () { } + }); + }, /must not be GeneratorFunctions/); + done(); + }); }); describe('when defining validate', () => { it('honors the failure code specified', (done) => { - const r = router(); + const r = new KoaJoiRouter(); r.route({ path: '/', method: 'get', - handler: () => {}, + handler: () => { }, validate: { failure: 404 } @@ -151,8 +162,8 @@ describe('koa-joi-router', () => { [['del', {}], 0] ]; - const r = router(); - const fn = () => {}; + const r = new KoaJoiRouter(); + const fn = () => { }; tests.forEach((test) => { const method = test[1] === 0 ? @@ -174,8 +185,8 @@ describe('koa-joi-router', () => { describe('path', () => { it('can be a string', (done) => { - const r = router(); - const fn = () => {}; + const r = new KoaJoiRouter(); + const fn = () => { }; assert.doesNotThrow(() => { r.get('/', fn); @@ -187,7 +198,7 @@ describe('koa-joi-router', () => { describe('pre', () => { it('should run before validators and handler', async () => { - const r = router(); + const r = new KoaJoiRouter(); r.route({ method: 'post', @@ -212,14 +223,14 @@ describe('koa-joi-router', () => { return test(makeRouterApp(r)) .post('/') - .send({v: '42'}) + .send({ v: '42' }) .expect({ v: 42 }); }); }); describe('handler', () => { function testHandler(handler, expectedBody, done) { - const r = router(); + const r = new KoaJoiRouter(); r.route({ method: 'get', @@ -262,13 +273,13 @@ describe('koa-joi-router', () => { }); it('adds route to the routes array', (done) => { - const r = router(); + const r = new KoaJoiRouter(); assert.equal(0, r.routes.length); r.route({ method: 'put', path: '/asdf/:id', - handler: () => {} + handler: () => { } }); assert.equal(1, r.routes.length); @@ -276,19 +287,19 @@ describe('koa-joi-router', () => { }); it('adds routes to the routes array', (done) => { - const r = router(); + const r = new KoaJoiRouter(); assert.equal(0, r.routes.length); r.route([ { method: 'put', path: '/asdf/:id', - handler: () => {} + handler: () => { } }, { method: 'get', path: '/asdf/:id', - handler: () => {} + handler: () => { } } ]); @@ -297,7 +308,7 @@ describe('koa-joi-router', () => { }); it('exposes the route definition to the handler context', (done) => { - const r = router(); + const r = new KoaJoiRouter(); r.route({ method: 'GET', @@ -342,7 +353,7 @@ describe('koa-joi-router', () => { describe('request.params', () => { it('are defined based off of the route definition', (done) => { - const r = router(); + const r = new KoaJoiRouter(); r.route({ method: 'get', @@ -368,7 +379,7 @@ describe('koa-joi-router', () => { describe('json', () => { describe('and valid json is sent', () => { it('is parsed as json', (done) => { - const r = router(); + const r = new KoaJoiRouter(); r.route({ method: 'post', @@ -386,23 +397,23 @@ describe('koa-joi-router', () => { const app = new Koa(); app.use(r.middleware()); test(app).post('/') - .send({ - last: 'Heckmann', - first: 'Aaron' - }) - .expect(200) - .expect('Heckmann Aaron', done); + .send({ + last: 'Heckmann', + first: 'Aaron' + }) + .expect(200) + .expect('Heckmann Aaron', done); }); }); describe('and non-json is sent', () => { it('fails', (done) => { - const r = router(); + const r = new KoaJoiRouter(); r.route({ method: 'post', path: '/', - handler: function(ctx) { + handler: function (ctx) { ctx.status = 204; }, validate: { @@ -414,17 +425,17 @@ describe('koa-joi-router', () => { app.use(r.middleware()); test(app) - .post('/') - .type('form') - .send({ - name: 'Pebble' - }) - .expect(400, done); + .post('/') + .type('form') + .send({ + name: 'Pebble' + }) + .expect(400, done); }); describe('and validate.continueOnError is true', () => { it('runs the route and sets ctx.invalid', (done) => { - const r = router(); + const r = new KoaJoiRouter(); r.route({ method: 'post', @@ -443,19 +454,19 @@ describe('koa-joi-router', () => { app.use(r.middleware()); test(app) - .post('/') - .type('form') - .send({ - name: 'Pebble' - }) - .expect(200) - .expect('expected json', done); + .post('/') + .type('form') + .send({ + name: 'Pebble' + }) + .expect(200) + .expect('expected json', done); }); describe('and an error is thrown in route', () => { it('does not catch it', (done) => { - const r = router(); - + const r = new KoaJoiRouter(); + r.route({ method: 'post', path: '/', @@ -469,19 +480,19 @@ describe('koa-joi-router', () => { } } }); - + const app = new Koa(); app.use(errorHandler); app.use(r.middleware()); - + test(app) - .post('/') - .type('form') - .send({ - name: 'Pebble' - }) - .expect(200) - .expect('expected json', done); + .post('/') + .type('form') + .send({ + name: 'Pebble' + }) + .expect(200) + .expect('expected json', done); }); }); }); @@ -493,7 +504,7 @@ describe('koa-joi-router', () => { }); it('fails', (done) => { - const r = router(); + const r = new KoaJoiRouter(); r.route({ method: 'post', @@ -510,15 +521,15 @@ describe('koa-joi-router', () => { app.use(r.middleware()); test(app) - .post('/') - .type('json') - .send(invalid) - .expect(400, done); + .post('/') + .type('json') + .send(invalid) + .expect(400, done); }); describe('and validate.continueOnError is true', () => { it('runs the route and sets ctx.invalid', (done) => { - const r = router(); + const r = new KoaJoiRouter(); r.route({ method: 'post', @@ -539,11 +550,11 @@ describe('koa-joi-router', () => { app.use(r.middleware()); test(app) - .post('/') - .type('json') - .send(invalid) - .expect(200) - .expect(/^Unexpected token \{/, done); + .post('/') + .type('json') + .send(invalid) + .expect(200) + .expect(/^Unexpected token \{/, done); }); }); }); @@ -552,7 +563,7 @@ describe('koa-joi-router', () => { describe('form', () => { describe('and valid form data is sent', () => { it('is parsed as form data', (done) => { - const r = router(); + const r = new KoaJoiRouter(); r.route({ method: 'post', @@ -571,21 +582,21 @@ describe('koa-joi-router', () => { app.use(r.middleware()); test(app) - .post('/') - .send({ - last: 'Heckmann', - first: 'Aaron' - }) - .type('form') - .expect(200) - .expect('Heckmann Aaron') - .end(done); + .post('/') + .send({ + last: 'Heckmann', + first: 'Aaron' + }) + .type('form') + .expect(200) + .expect('Heckmann Aaron') + .end(done); }); }); describe('and non-form data is sent', () => { it('fails', (done) => { - const r = router(); + const r = new KoaJoiRouter(); r.route({ method: 'post', @@ -602,18 +613,18 @@ describe('koa-joi-router', () => { app.use(r.middleware()); test(app) - .post('/') - .send({ - last: 'heckmann', - first: 'aaron' - }) - .type('json') - .expect(400, done); + .post('/') + .send({ + last: 'heckmann', + first: 'aaron' + }) + .type('json') + .expect(400, done); }); describe('and validate.continueOnError is true', () => { it('runs the route and sets ctx.invalid', (done) => { - const r = router(); + const r = new KoaJoiRouter(); r.route({ method: 'post', @@ -632,21 +643,21 @@ describe('koa-joi-router', () => { app.use(r.middleware()); test(app) - .post('/') - .send({ - last: 'Heckmann', - first: 'Aaron' - }) - .type('json') - .expect(200) - .expect('expected x-www-form-urlencoded', done); + .post('/') + .send({ + last: 'Heckmann', + first: 'Aaron' + }) + .type('json') + .expect(200) + .expect('expected x-www-form-urlencoded', done); }); }); }); describe('and invalid form data is sent', () => { it('fails', (done) => { - const r = router(); + const r = new KoaJoiRouter(); r.route({ method: 'post', @@ -663,13 +674,13 @@ describe('koa-joi-router', () => { app.use(r.middleware()); test(app) - .post('/') - .expect(400, done); + .post('/') + .expect(400, done); }); describe('and validate.continueOnError is true', () => { it('runs the route and sets ctx.invalid', (done) => { - const r = router(); + const r = new KoaJoiRouter(); r.route({ method: 'post', @@ -688,9 +699,9 @@ describe('koa-joi-router', () => { app.use(r.middleware()); test(app) - .post('/') - .expect(200) - .expect('expected x-www-form-urlencoded', done); + .post('/') + .expect(200) + .expect('expected x-www-form-urlencoded', done); }); }); }); @@ -698,7 +709,7 @@ describe('koa-joi-router', () => { describe('multipart', () => { it('is undefined', (done) => { - const r = router(); + const r = new KoaJoiRouter(); r.route({ method: 'put', @@ -721,9 +732,9 @@ describe('koa-joi-router', () => { b.fill('a'); test(app) - .put('/') - .attach('file1', b) - .expect(200, done); + .put('/') + .attach('file1', b) + .expect(200, done); }); }); }); @@ -734,7 +745,7 @@ describe('koa-joi-router', () => { 'stream multipart'.split(' ').forEach((type) => { describe(`"${type}"`, () => { it('is a co-busboy object', (done) => { - const r = router(); + const r = new KoaJoiRouter(); r.route({ method: 'put', @@ -762,17 +773,17 @@ describe('koa-joi-router', () => { app.use(r.middleware()); test(app) - .put('/') - .attach('file1', `${__dirname}/fixtures/koa.png`) - .field('color', 'green') - .expect('{"color":"green","file":"koa.png"}', done); + .put('/') + .attach('file1', `${__dirname}/fixtures/koa.png`) + .field('color', 'green') + .expect('{"color":"green","file":"koa.png"}', done); }); }); }); describe('not specified', () => { it('is undefined', (done) => { - const r = router(); + const r = new KoaJoiRouter(); r.route({ method: 'put', @@ -792,9 +803,9 @@ describe('koa-joi-router', () => { b.fill('a'); test(app) - .put('/') - .attach('file1', b) - .expect(200, done); + .put('/') + .attach('file1', b) + .expect(200, done); }); }); }); @@ -803,7 +814,7 @@ describe('koa-joi-router', () => { describe('validation', () => { describe('of querystring', () => { describe('with', () => { - const r = router(); + const r = new KoaJoiRouter(); r.route({ method: 'get', @@ -826,47 +837,47 @@ describe('koa-joi-router', () => { it('missing querystring', (done) => { test(app).get('/a') - .expect(400, done); + .expect(400, done); }); it('invalid q and invalid s', (done) => { test(app).get('/a?q=100&s=asdfhjkl') - .expect(400, done); + .expect(400, done); }); it('invalid q and valid s', (done) => { test(app).get('/a?q=4&s=asdfgh') - .expect(400, done); + .expect(400, done); }); it('valid q and invalid s', (done) => { test(app).get('/a?q=5&s=dfgh') - .expect(400, done); + .expect(400, done); }); it('valid q and valid s', (done) => { test(app).get('/a?q=5&s=as9fgh') - .end((err, res) => { - if (err) return done(err); - assert.equal(5, res.body.q); - assert.equal('as9fgh', res.body.s); - done(err); - }); + .end((err, res) => { + if (err) return done(err); + assert.equal(5, res.body.q); + assert.equal('as9fgh', res.body.s); + done(err); + }); }); it('valid q and valid s + unspecified values', (done) => { test(app).get('/a?q=5&s=as9fgh&sort=10') - .end((err, res) => { - assert.equal(5, res.body.q); - assert.equal('as9fgh', res.body.s); - assert.equal(10, res.body.sort); - done(err); - }); + .end((err, res) => { + assert.equal(5, res.body.q); + assert.equal('as9fgh', res.body.s); + assert.equal(10, res.body.sort); + done(err); + }); }); }); it('retains the casted values in the route (gh-6, gh-21)', (done) => { - const r = router(); + const r = new KoaJoiRouter(); r.route({ method: 'get', @@ -899,19 +910,19 @@ describe('koa-joi-router', () => { app.use(r.middleware()); test(app).get('/a?d=7-27-2016&n=34&b=true') - .end((err, res) => { - assert.equal('object', res.body.date.type); - assert.equal(true, res.body.date.instance); - assert.equal('number', res.body.number.type); - assert.equal('boolean', res.body.bool.type); - done(err); - }); + .end((err, res) => { + assert.equal('object', res.body.date.type); + assert.equal(true, res.body.date.instance); + assert.equal('number', res.body.number.type); + assert.equal('boolean', res.body.bool.type); + done(err); + }); }); }); describe('of params', () => { describe('when using regex captures', () => { - const r = router(); + const r = new KoaJoiRouter(); r.route({ method: 'get', @@ -932,22 +943,22 @@ describe('koa-joi-router', () => { it('with invalid first match', (done) => { test(app).get('/id/2-9') - .expect(400, done); + .expect(400, done); }); it('with invalid second match', (done) => { test(app).get('/id/7-1001') - .expect(400, done); + .expect(400, done); }); it('with valid matches', (done) => { test(app).get('/id/7-1000') - .expect(200, done); + .expect(200, done); }); }); describe('with', () => { - const r = router(); + const r = new KoaJoiRouter(); r.route({ method: 'get', @@ -968,35 +979,35 @@ describe('koa-joi-router', () => { it('invalid quantity and invalid sku', (done) => { test(app).get('/a/as/asdfgh') - .expect(400, done); + .expect(400, done); }); it('invalid quantity and valid sku', (done) => { test(app).get('/a/4/asdfgh') - .expect(400, done); + .expect(400, done); }); it('valid quantity and invalid sku', (done) => { test(app).get('/a/5/dfgh') - .expect(400, done); + .expect(400, done); }); it('valid quantity and valid sku', (done) => { test(app).get('/a/5/as9fgh') - .expect(200) - .expect('Content-Type', /json/) - .set('Accept', 'application/json') - .end((err, res) => { - if (err) return done(err); - assert.equal(5, res.body.quantity); - assert.equal('as9fgh', res.body.sku); - done(err); - }); + .expect(200) + .expect('Content-Type', /json/) + .set('Accept', 'application/json') + .end((err, res) => { + if (err) return done(err); + assert.equal(5, res.body.quantity); + assert.equal('as9fgh', res.body.sku); + done(err); + }); }); }); it('retains the casted values in the route', (done) => { - const r = router(); + const r = new KoaJoiRouter(); r.route({ method: 'get', @@ -1009,7 +1020,7 @@ describe('koa-joi-router', () => { field: Joi.any() }) }, - handler: async function(ctx) { + handler: async function (ctx) { const params = ctx.request.params.field === 'request' ? ctx.request.params : ctx.params; @@ -1034,27 +1045,27 @@ describe('koa-joi-router', () => { app.use(r.middleware()); test(app).get('/request/7-27-2016/34/true') - .end((err, res) => { - if (err) return done(err); - assert.equal('object', res.body.date.type); - assert.equal(true, res.body.date.instance); - assert.equal('number', res.body.number.type); - assert.equal('boolean', res.body.bool.type); - - test(app).get('/params/7-27-2016/34/true') .end((err, res) => { + if (err) return done(err); assert.equal('object', res.body.date.type); assert.equal(true, res.body.date.instance); assert.equal('number', res.body.number.type); assert.equal('boolean', res.body.bool.type); - done(err); + + test(app).get('/params/7-27-2016/34/true') + .end((err, res) => { + assert.equal('object', res.body.date.type); + assert.equal(true, res.body.date.instance); + assert.equal('number', res.body.number.type); + assert.equal('boolean', res.body.bool.type); + done(err); + }); }); - }); }); }); describe('of headers', () => { - const r = router(); + const r = new KoaJoiRouter(); r.route({ method: 'post', @@ -1101,7 +1112,7 @@ describe('koa-joi-router', () => { Object.keys(tests).forEach((name) => { describe('with ' + name, () => { it(tests[name] ? 'works' : 'fails', (done) => { - const r = router(); + const r = new KoaJoiRouter(); const method = tests[name] ? assert.doesNotThrow : @@ -1111,7 +1122,7 @@ describe('koa-joi-router', () => { r.route({ method: 'post', path: '/', - handler: () => {}, + handler: () => { }, validate: { body: Joi.object({ name: Joi.string() }), type: name @@ -1127,13 +1138,13 @@ describe('koa-joi-router', () => { describe('is not specified', () => { it('fails', (done) => { - const r = router(); + const r = new KoaJoiRouter(); assert.throws(() => { r.route({ method: 'post', path: '/', - handler: () => {}, + handler: () => { }, validate: { body: Joi.object({ name: Joi.string() }) } @@ -1146,7 +1157,7 @@ describe('koa-joi-router', () => { }); describe('with', () => { - const r = router(); + const r = new KoaJoiRouter(); r.route({ method: 'post', @@ -1172,52 +1183,52 @@ describe('koa-joi-router', () => { it('invalid number and valid string', (done) => { test(app).post('/a/b') - .send({ - quantity: 4, - sku: 'x' - }) - .expect(400, done); + .send({ + quantity: 4, + sku: 'x' + }) + .expect(400, done); }); it('valid number and invalid string', (done) => { test(app).post('/a/b') - .send({ - quantity: 6, - sku: { x: 'test' } - }) - .expect(400, done); + .send({ + quantity: 6, + sku: { x: 'test' } + }) + .expect(400, done); }); it('valid number and missing non-required string', (done) => { test(app).post('/a/b') - .send({ quantity: 6 }) - .expect(200, done); + .send({ quantity: 6 }) + .expect(200, done); }); it('valid values', (done) => { test(app).post('/a/b') - .send({ - quantity: 6, - sku: 'x' - }) - .expect(200, done); + .send({ + quantity: 6, + sku: 'x' + }) + .expect(200, done); }); it('valid values + unspecified values', (done) => { test(app).post('/a/b') - .send({ - quantity: 6, - sku: 'x', - a: 1 - }) - .expect(400, done); + .send({ + quantity: 6, + sku: 'x', + a: 1 + }) + .expect(400, done); }); }); describe('when invalid data is submitted', () => { describe('and validate.continueOnError is true', () => { it('runs the route and sets ctx.invalid', (done) => { - const r = router(); + const r = new KoaJoiRouter(); r.route({ method: 'post', @@ -1239,15 +1250,15 @@ describe('koa-joi-router', () => { app.use(r.middleware()); test(app) - .post('/') - .send({ name: 'Pebble' }) - .expect(200) - .expect('true', done); + .post('/') + .send({ name: 'Pebble' }) + .expect(200) + .expect('true', done); }); describe('and an error is thrown in route', () => { it('does not catch it', (done) => { - const r = router(); + const r = new KoaJoiRouter(); r.route({ method: 'post', @@ -1266,25 +1277,26 @@ describe('koa-joi-router', () => { } } }); - + const app = new Koa(); app.use(errorHandler); app.use(r.middleware()); - + test(app) - .post('/') - .send({ name: 'Pixel' }) - .expect(200) - .expect('"name" length must be at least 10 characters long', done); + .post('/') + .send({ name: 'Pixel' }) + .expect(200) + .expect('"name" length must be at least 10 characters long', done); }); }); }); }); + }); describe('of parts (uploads)', () => { it('works', (done) => { - const r = router(); + const r = new KoaJoiRouter(); r.route({ method: 'post', @@ -1307,8 +1319,8 @@ describe('koa-joi-router', () => { b.fill('a'); test(app).post('/') - .attach('file1', b) - .expect(200, done); + .attach('file1', b) + .expect(200, done); }); }); }); @@ -1316,7 +1328,7 @@ describe('koa-joi-router', () => { describe('of output', () => { describe('status code patterns', () => { it('allows single status codes', () => { - const r = router(); + const r = new KoaJoiRouter(); assert.doesNotThrow(() => { r.route({ method: 'get', @@ -1326,13 +1338,13 @@ describe('koa-joi-router', () => { '200': { body: Joi.any().equal('asdr') } } }, - handler: () => {} + handler: () => { } }); }); }); it('allows commas', () => { - const r = router(); + const r = new KoaJoiRouter(); assert.doesNotThrow(() => { r.route({ method: 'get', @@ -1342,13 +1354,13 @@ describe('koa-joi-router', () => { '201,202': { body: Joi.any().equal('band-reject') } } }, - handler: () => {} + handler: () => { } }); }); }); it('allows spaces between status codes', () => { - const r = router(); + const r = new KoaJoiRouter(); assert.doesNotThrow(() => { r.route({ method: 'post', @@ -1358,13 +1370,13 @@ describe('koa-joi-router', () => { '400, 401': { body: Joi.any().equal('low-pass') } } }, - handler: () => {} + handler: () => { } }); }); }); it('allows ranges', () => { - const r = router(); + const r = new KoaJoiRouter(); assert.doesNotThrow(() => { r.route({ method: 'post', @@ -1374,13 +1386,13 @@ describe('koa-joi-router', () => { '402-404': { body: Joi.any().equal('hi-pass') } } }, - handler: () => {} + handler: () => { } }); }); }); it('allows combinations of integers, commas and ranges', async () => { - const r = router(); + const r = new KoaJoiRouter(); assert.doesNotThrow(() => { r.route({ @@ -1391,7 +1403,7 @@ describe('koa-joi-router', () => { '500-502, 504 ,506-510,201': { body: Joi.any().equal('band-pass') } } }, - handler: function(ctx) { + handler: function (ctx) { ctx.status = parseInt(ctx.params.status, 10); if (ctx.params.status === '200') { @@ -1416,7 +1428,7 @@ describe('koa-joi-router', () => { }); it('allows the "*" to represent all status codes', async () => { - const r = router(); + const r = new KoaJoiRouter(); assert.doesNotThrow(() => { r.route({ @@ -1427,7 +1439,7 @@ describe('koa-joi-router', () => { '*': { body: Joi.any().equal('all') } } }, - handler: function(ctx) { + handler: function (ctx) { ctx.status = 201; ctx.body = 'all'; } @@ -1459,7 +1471,7 @@ describe('koa-joi-router', () => { tests.forEach((test) => { it(test.pattern, (done) => { - const r = router(); + const r = new KoaJoiRouter(); const output = {}; output[test.pattern] = { body: Joi.string() }; @@ -1468,7 +1480,7 @@ describe('koa-joi-router', () => { method: 'get', path: '/invalid', validate: { output: output }, - handler: () => {} + handler: () => { } }); }); @@ -1478,7 +1490,7 @@ describe('koa-joi-router', () => { }); it('throws on non-digit, comma, dash or space', () => { - const r = router(); + const r = new KoaJoiRouter(); assert.throws(() => { r.route({ method: 'get', @@ -1488,13 +1500,13 @@ describe('koa-joi-router', () => { '%': { body: Joi.string() } } }, - handler: () => {} + handler: () => { } }); }); }); it('throws if any status code patterns overlap', () => { - const r = router(); + const r = new KoaJoiRouter(); assert.throws(() => { r.route({ @@ -1594,7 +1606,7 @@ describe('koa-joi-router', () => { }); it('does not throw if status code patterns do not overlap', () => { - const r = router(); + const r = new KoaJoiRouter(); assert.doesNotThrow(() => { r.route({ method: 'get', @@ -1606,7 +1618,7 @@ describe('koa-joi-router', () => { '203-599': { body: Joi.any().equal('all') } } }, - handler: () => {} + handler: () => { } }); }); }); @@ -1614,7 +1626,7 @@ describe('koa-joi-router', () => { describe('fields', () => { it('throws when neither body nor headers is specified', () => { - const r = router(); + const r = new KoaJoiRouter(); assert.throws(() => { r.route({ method: 'get', @@ -1622,13 +1634,13 @@ describe('koa-joi-router', () => { validate: { output: { '200': {} } }, - handler: () => {} + handler: () => { } }); }); }); it('does not throw if headers is specified but not body', () => { - const r = router(); + const r = new KoaJoiRouter(); assert.doesNotThrow(() => { r.route({ method: 'get', @@ -1638,13 +1650,13 @@ describe('koa-joi-router', () => { '200': { headers: { x: Joi.any() } } } }, - handler: () => {} + handler: () => { } }); }); }); it('does not throw if body is specified but not headers', () => { - const r = router(); + const r = new KoaJoiRouter(); assert.doesNotThrow(() => { r.route({ method: 'get', @@ -1654,7 +1666,7 @@ describe('koa-joi-router', () => { '200': { body: { x: Joi.any() } } } }, - handler: () => {} + handler: () => { } }); }); }); @@ -1662,7 +1674,7 @@ describe('koa-joi-router', () => { describe('body,', () => { describe('when specified,', () => { - const r = router(); + const r = new KoaJoiRouter(); r.route({ method: 'post', @@ -1732,7 +1744,7 @@ describe('koa-joi-router', () => { }); describe('when not specified,', () => { - const r = router(); + const r = new KoaJoiRouter(); r.route({ method: 'post', @@ -1760,7 +1772,7 @@ describe('koa-joi-router', () => { }); describe('when specified', () => { - const r = router(); + const r = new KoaJoiRouter(); r.route({ method: 'post', @@ -1831,7 +1843,7 @@ describe('koa-joi-router', () => { }); describe('when not specified', () => { - const r = router(); + const r = new KoaJoiRouter(); r.route({ method: 'post', @@ -1853,7 +1865,7 @@ describe('koa-joi-router', () => { }); it('does not occur when no status code matches', async () => { - const r = router(); + const r = new KoaJoiRouter(); r.route({ method: 'post', @@ -1890,7 +1902,7 @@ describe('koa-joi-router', () => { }; } - const r = router(); + const r = new KoaJoiRouter(); r.route({ path: '/', method: ['post', 'put'], @@ -1918,7 +1930,7 @@ describe('koa-joi-router', () => { describe('methods', () => { function makeMethodRouter(method, path) { - const r = router(); + const r = new KoaJoiRouter(); r[method].apply(r, slice(arguments, 1)); assert.equal(1, r.routes.length); @@ -1955,7 +1967,7 @@ describe('koa-joi-router', () => { } it('exist', (done) => { - const r = router(); + const r = new KoaJoiRouter(); methods.forEach((method) => { assert.equal('function', typeof r[method], 'missing method: ' + method); }); @@ -2037,7 +2049,7 @@ describe('koa-joi-router', () => { describe('use()', () => { describe('applies middleware in the order it was added', () => { it('can apply middleware before routes', async () => { - const r = router(); + const r = new KoaJoiRouter(); let middlewareRanFirst = false; r.use(async (ctx, next) => { @@ -2053,12 +2065,12 @@ describe('koa-joi-router', () => { app.use(r.middleware()); await test(app).get('/test') - .expect('true') - .expect(200); + .expect('true') + .expect(200); }); it('can apply middleware after routes', async () => { - const r = router(); + const r = new KoaJoiRouter(); let middlewareRanFirst = false; r.get('/test', (ctx) => { @@ -2074,14 +2086,14 @@ describe('koa-joi-router', () => { app.use(r.middleware()); await test(app).get('/test') - .expect('false') - .expect(200); + .expect('false') + .expect(200); }); }); describe('accepts an optional path', () => { it('which applies middleware only to that path', async () => { - const r = router(); + const r = new KoaJoiRouter(); let middlewareRan = false; r.use('/nada', async (ctx, next) => { @@ -2100,12 +2112,12 @@ describe('koa-joi-router', () => { app.use(r.middleware()); await test(app).get('/test') - .expect('false') - .expect(200); + .expect('false') + .expect(200); await test(app).get('/nada') - .expect('true') - .expect(200); + .expect('true') + .expect(200); }); }); }); @@ -2115,7 +2127,7 @@ describe('koa-joi-router', () => { const app = new Koa(); app.context.msg = 'fail'; - const r = router(); + const r = new KoaJoiRouter(); r.use(async (ctx, next) => { ctx.msg = 'works'; @@ -2141,34 +2153,34 @@ describe('koa-joi-router', () => { app.use(r.middleware()); await test(app).get('/') - .expect(404); + .expect(404); await test(app).get('/user') - .expect('works') - .expect(200); + .expect('works') + .expect(200); await test(app).get('/user/') - .expect('works') - .expect(200); + .expect('works') + .expect(200); await test(app).get('/user/itworks') - .expect('itworks') - .expect(200); + .expect('itworks') + .expect(200); await test(app).get('/user/itworks/') - .expect('itworks') - .expect(200); + .expect('itworks') + .expect(200); await test(app).get('/user/testparam/dude') - .expect('itworksdude') - .expect(200); + .expect('itworksdude') + .expect(200); }); }); describe('param()', () => { it('defines middleware for named route params', async () => { const app = new Koa(); - const r = router(); + const r = new KoaJoiRouter(); const users = { '2': 'aaron' }; r.param('user', async (id, ctx, next) => { @@ -2190,11 +2202,11 @@ describe('koa-joi-router', () => { app.use(r.middleware()); await test(app).get('/user/1') - .expect(404); + .expect(404); await test(app).get('/user/2') - .expect('hello aaron') - .expect(200); + .expect('hello aaron') + .expect(200); }); });