From 1d53f88d1ccd5dd2a6cdd1e2015fd2277043bfa3 Mon Sep 17 00:00:00 2001 From: Icebob <mereg.norbert@gmail.com> Date: Wed, 4 Dec 2024 21:04:29 +0100 Subject: [PATCH] eslint+prettier+reformat --- .editorconfig | 6 + .eslintrc.js | 68 - benchmarks/cluster/index.js | 31 +- benchmarks/cluster/worker.js | 8 +- benchmarks/remote/api/index.js | 31 +- benchmarks/remote/api/worker.js | 8 +- benchmarks/remote/worker/index.js | 25 +- benchmarks/remote/worker/worker.js | 5 +- benchmarks/simple/index.js | 8 +- eslint.config.js | 56 + examples/auth.service.js | 17 +- examples/authentication/index.js | 7 +- examples/authorization/index.js | 15 +- examples/auto-aliases/index.js | 21 +- examples/cors/index.js | 10 +- examples/dev/index.js | 8 +- examples/direct-calls/index.js | 14 +- examples/express/index.js | 30 +- examples/express/index2.js | 27 +- examples/file.service.js | 12 +- examples/file/index.js | 5 +- examples/formidable/index.js | 36 +- examples/full/index.js | 63 +- examples/index.js | 2 +- examples/math.service.js | 6 +- examples/metrics.service.js | 45 +- examples/middlewares/index.js | 16 +- examples/multi-auth/index.js | 7 +- examples/post.service.js | 20 +- examples/raw/index.js | 2 +- examples/rest/index.js | 26 +- examples/routing/index.js | 20 +- examples/simple/index.js | 4 +- examples/socket.io/index.js | 32 +- examples/spdy/index.js | 27 +- examples/sse/chat.service.js | 8 +- examples/sse/index.js | 28 +- examples/ssl/index.js | 13 +- examples/test.service.js | 19 +- examples/webpack-vue/index.js | 30 +- examples/webpack-vue/webpack.config.js | 20 +- examples/webpack/index.js | 25 +- examples/www/index.js | 41 +- package-lock.json | 5132 ++++++++++++++++++++---- package.json | 11 +- prettier.config.js | 25 + src/alias.js | 103 +- src/index.js | 441 +- src/memory-store.js | 3 +- src/utils.js | 49 +- test/integration/index.spec.js | 2009 ++++++---- test/services/math.service.js | 6 +- test/services/multiRoute.service.js | 100 +- test/services/posts.service.js | 20 +- test/services/test.service.js | 28 +- test/unit/errors.spec.js | 1 - test/unit/service/httpHandler.spec.js | 97 +- 57 files changed, 6519 insertions(+), 2408 deletions(-) delete mode 100644 .eslintrc.js create mode 100644 eslint.config.js create mode 100644 prettier.config.js diff --git a/.editorconfig b/.editorconfig index 1fa27f9a..d1ca5085 100644 --- a/.editorconfig +++ b/.editorconfig @@ -19,10 +19,16 @@ insert_final_newline = true [*.md] trim_trailing_whitespace = false +indent_style = space +indent_size = 4 [{package,bower}.json] indent_style = space indent_size = 2 +[*.yml] +indent_style = space +indent_size = 2 + [*.js] quote_type = "double" diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index 049f9f0b..00000000 --- a/.eslintrc.js +++ /dev/null @@ -1,68 +0,0 @@ -module.exports = { - "env": { - "node": true, - "commonjs": true, - "es6": true, - "jquery": false, - "jest": true, - "jasmine": true - }, - "extends": [ - "eslint:recommended", - "plugin:security/recommended" - ], - "parserOptions": { - "sourceType": "module", - "ecmaVersion": "2018" - }, - "plugins": [ - "promise", - "security" - ], - "rules": { - "indent": [ - "warn", - "tab", - { SwitchCase: 1 } - ], - "quotes": [ - "warn", - "double" - ], - "semi": [ - "error", - "always" - ], - "no-var": [ - "error" - ], - "no-console": [ - "error" - ], - "no-unused-vars": [ - "warn" - ], - "no-trailing-spaces": [ - "error" - ], - "no-alert": 0, - "no-shadow": 0, - "security/detect-object-injection": ["off"], - "security/detect-non-literal-require": ["off"], - "security/detect-non-literal-fs-filename": ["off"], - "no-process-exit": ["off"], - "node/no-unpublished-require": 0, - "space-before-function-paren": [ - "warn", - { - "anonymous": "never", - "named": "never", - "asyncArrow": "always" - } - ], - "object-curly-spacing": [ - "warn", - "always" - ] - } -}; diff --git a/benchmarks/cluster/index.js b/benchmarks/cluster/index.js index 19c7104d..71f1abef 100644 --- a/benchmarks/cluster/index.js +++ b/benchmarks/cluster/index.js @@ -1,25 +1,31 @@ -/* eslint-disable no-console */ - "use strict"; -const - os = require("os"), +const os = require("os"), cluster = require("cluster"), stopSignals = [ - "SIGHUP", "SIGINT", "SIGQUIT", "SIGILL", "SIGTRAP", "SIGABRT", - "SIGBUS", "SIGFPE", "SIGUSR1", "SIGSEGV", "SIGUSR2", "SIGTERM" + "SIGHUP", + "SIGINT", + "SIGQUIT", + "SIGILL", + "SIGTRAP", + "SIGABRT", + "SIGBUS", + "SIGFPE", + "SIGUSR1", + "SIGSEGV", + "SIGUSR2", + "SIGTERM" ], production = true; //process.env.NODE_ENV == "production"; let stopping = false; -cluster.on("disconnect", function(worker) { +cluster.on("disconnect", function (worker) { if (production) { if (!stopping) { cluster.fork(); } - } else - process.exit(1); + } else process.exit(1); }); if (cluster.isMaster) { @@ -30,11 +36,11 @@ if (cluster.isMaster) { } if (production) { - stopSignals.forEach(function(signal) { - process.on(signal, function() { + stopSignals.forEach(function (signal) { + process.on(signal, function () { console.log(`Got ${signal}, stopping workers...`); stopping = true; - cluster.disconnect(function() { + cluster.disconnect(function () { console.log("All workers stopped, exiting."); process.exit(0); }); @@ -48,7 +54,6 @@ if (cluster.isMaster) { worker.process.argv.push(hostname + "-worker-" + worker.id); require("./worker.js"); - } /** diff --git a/benchmarks/cluster/worker.js b/benchmarks/cluster/worker.js index d1076e12..9a7a111f 100644 --- a/benchmarks/cluster/worker.js +++ b/benchmarks/cluster/worker.js @@ -1,8 +1,7 @@ -/* eslint-disable no-console */ "use strict"; -const { ServiceBroker } = require("moleculer"); -const ApiService = require("../../index"); +const { ServiceBroker } = require("moleculer"); +const ApiService = require("../../index"); // Create broker const broker = new ServiceBroker({ @@ -24,5 +23,4 @@ broker.createService({ broker.createService(ApiService); // Start server -broker.start() - .then(() => console.log(`Worker '${broker.nodeID}' started.`)); +broker.start().then(() => console.log(`Worker '${broker.nodeID}' started.`)); diff --git a/benchmarks/remote/api/index.js b/benchmarks/remote/api/index.js index 64ad537b..450ee3df 100644 --- a/benchmarks/remote/api/index.js +++ b/benchmarks/remote/api/index.js @@ -1,25 +1,31 @@ -/* eslint-disable no-console */ - "use strict"; -const - os = require("os"), +const os = require("os"), cluster = require("cluster"), stopSignals = [ - "SIGHUP", "SIGINT", "SIGQUIT", "SIGILL", "SIGTRAP", "SIGABRT", - "SIGBUS", "SIGFPE", "SIGUSR1", "SIGSEGV", "SIGUSR2", "SIGTERM" + "SIGHUP", + "SIGINT", + "SIGQUIT", + "SIGILL", + "SIGTRAP", + "SIGABRT", + "SIGBUS", + "SIGFPE", + "SIGUSR1", + "SIGSEGV", + "SIGUSR2", + "SIGTERM" ], production = true; //process.env.NODE_ENV == "production"; let stopping = false; -cluster.on("disconnect", function(worker) { +cluster.on("disconnect", function (worker) { if (production) { if (!stopping) { cluster.fork(); } - } else - process.exit(1); + } else process.exit(1); }); if (cluster.isMaster) { @@ -30,11 +36,11 @@ if (cluster.isMaster) { } if (production) { - stopSignals.forEach(function(signal) { - process.on(signal, function() { + stopSignals.forEach(function (signal) { + process.on(signal, function () { console.log(`Got ${signal}, stopping workers...`); stopping = true; - cluster.disconnect(function() { + cluster.disconnect(function () { console.log("All workers stopped, exiting."); process.exit(0); }); @@ -48,7 +54,6 @@ if (cluster.isMaster) { worker.process.argv.push(hostname + "-api-" + worker.id); require("./worker.js"); - } /** diff --git a/benchmarks/remote/api/worker.js b/benchmarks/remote/api/worker.js index d1557360..d961e2ab 100644 --- a/benchmarks/remote/api/worker.js +++ b/benchmarks/remote/api/worker.js @@ -1,8 +1,7 @@ -/* eslint-disable no-console */ "use strict"; -let { ServiceBroker } = require("moleculer"); -let ApiService = require("../../../index"); +let { ServiceBroker } = require("moleculer"); +let ApiService = require("../../../index"); // Create broker let broker = new ServiceBroker({ @@ -17,5 +16,4 @@ let broker = new ServiceBroker({ broker.createService(ApiService); // Start server -broker.start() - .then(() => console.log(`Worker '${broker.nodeID}' started.`)); +broker.start().then(() => console.log(`Worker '${broker.nodeID}' started.`)); diff --git a/benchmarks/remote/worker/index.js b/benchmarks/remote/worker/index.js index f3d858d2..51dc37d7 100644 --- a/benchmarks/remote/worker/index.js +++ b/benchmarks/remote/worker/index.js @@ -1,25 +1,31 @@ -/* eslint-disable no-console */ - "use strict"; -const - os = require("os"), +const os = require("os"), cluster = require("cluster"), stopSignals = [ - "SIGHUP", "SIGINT", "SIGQUIT", "SIGILL", "SIGTRAP", "SIGABRT", - "SIGBUS", "SIGFPE", "SIGUSR1", "SIGSEGV", "SIGUSR2", "SIGTERM" + "SIGHUP", + "SIGINT", + "SIGQUIT", + "SIGILL", + "SIGTRAP", + "SIGABRT", + "SIGBUS", + "SIGFPE", + "SIGUSR1", + "SIGSEGV", + "SIGUSR2", + "SIGTERM" ], production = true; //process.env.NODE_ENV == "production"; let stopping = false; -cluster.on("disconnect", function(worker) { +cluster.on("disconnect", function (worker) { if (production) { if (!stopping) { cluster.fork(); } - } else - process.exit(1); + } else process.exit(1); }); if (cluster.isMaster) { @@ -48,5 +54,4 @@ if (cluster.isMaster) { worker.process.argv.push(hostname + "-worker-" + worker.id); require("./worker.js"); - } diff --git a/benchmarks/remote/worker/worker.js b/benchmarks/remote/worker/worker.js index 8766b01f..f80a12d0 100644 --- a/benchmarks/remote/worker/worker.js +++ b/benchmarks/remote/worker/worker.js @@ -1,6 +1,6 @@ "use strict"; -let { ServiceBroker } = require("moleculer"); +let { ServiceBroker } = require("moleculer"); // Create broker let broker = new ServiceBroker({ @@ -21,5 +21,4 @@ broker.createService({ }); // Start server -broker.start() - .then(() => console.log(`Worker '${broker.nodeID}' started.`)); +broker.start().then(() => console.log(`Worker '${broker.nodeID}' started.`)); diff --git a/benchmarks/simple/index.js b/benchmarks/simple/index.js index bafb5bb9..c916f317 100644 --- a/benchmarks/simple/index.js +++ b/benchmarks/simple/index.js @@ -1,8 +1,7 @@ -/* eslint-disable no-console */ "use strict"; -const { ServiceBroker } = require("moleculer"); -const ApiService = require("../../index"); +const { ServiceBroker } = require("moleculer"); +const ApiService = require("../../index"); // Create broker const broker = new ServiceBroker({ @@ -23,8 +22,7 @@ broker.createService({ broker.createService(ApiService); // Start server -broker.start() - .then(() => console.log("Test URL: http://localhost:3000/test/hello")); +broker.start().then(() => console.log("Test URL: http://localhost:3000/test/hello")); /** * Result on i7 4770K 32GB RAM Windows 10 x64 diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 00000000..4586288c --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,56 @@ +const js = require("@eslint/js"); +const globals = require("globals"); +const eslintPluginPrettierRecommended = require("eslint-plugin-prettier/recommended"); + +/** @type {import('eslint').Linter.FlatConfig[]} */ +module.exports = [ + js.configs.recommended, + eslintPluginPrettierRecommended, + { + files: ["**/*.js", "**/*.mjs"], + languageOptions: { + parserOptions: { + sourceType: "module", + ecmaVersion: 2023 + }, + globals: { + ...globals.node, + ...globals.es2020, + ...globals.commonjs, + ...globals.es6, + ...globals.jquery, + ...globals.jest, + ...globals.jasmine, + process: "readonly", + fetch: "readonly" + } + }, + // plugins: ["node", "security"], + rules: { + "no-var": ["error"], + "no-console": ["error"], + "no-unused-vars": ["warn"], + "no-trailing-spaces": ["error"], + "security/detect-object-injection": ["off"], + "security/detect-non-literal-require": ["off"], + "security/detect-non-literal-fs-filename": ["off"], + "no-process-exit": ["off"], + "node/no-unpublished-require": 0 + }, + ignores: ["benchmark/test.js", "test/typescript/hello-world/out/*.js"] + }, + { + files: ["test/**/*.js"], + rules: { + "no-console": ["off"], + "no-unused-vars": ["off"] + } + }, + { + files: ["benchmarks/**/*.js", "examples/**/*.js"], + rules: { + "no-console": ["off"], + "no-unused-vars": ["off"] + } + } +]; diff --git a/examples/auth.service.js b/examples/auth.service.js index 939e7019..a3d15fa8 100644 --- a/examples/auth.service.js +++ b/examples/auth.service.js @@ -6,10 +6,10 @@ "use strict"; -const jwt = require("jsonwebtoken"); -const _ = require("lodash"); -const { MoleculerError } = require("moleculer").Errors; -const { promisify } = require("util"); +const jwt = require("jsonwebtoken"); +const _ = require("lodash"); +const { MoleculerError } = require("moleculer").Errors; +const { promisify } = require("util"); const JWT_SECRET = "TOP SECRET!!!"; @@ -39,14 +39,15 @@ module.exports = { login: { rest: "/login", handler(ctx) { - let user = users.find(u => u.username == ctx.params.username && u.password == ctx.params.password); + let user = users.find( + u => u.username == ctx.params.username && u.password == ctx.params.password + ); if (user) { return this.generateToken(user).then(token => { return { token }; }); - } else - return Promise.reject(new MoleculerError("Invalid credentials", 400)); + } else return Promise.reject(new MoleculerError("Invalid credentials", 400)); } }, @@ -92,7 +93,7 @@ module.exports = { } }); } - }, + } }, created() { diff --git a/examples/authentication/index.js b/examples/authentication/index.js index 21daab6a..ba49aea7 100644 --- a/examples/authentication/index.js +++ b/examples/authentication/index.js @@ -13,9 +13,9 @@ * */ -let path = require("path"); -let { ServiceBroker } = require("moleculer"); -let ApiGatewayService = require("../../index"); +let path = require("path"); +let { ServiceBroker } = require("moleculer"); +let ApiGatewayService = require("../../index"); // Create broker let broker = new ServiceBroker({ @@ -30,7 +30,6 @@ broker.createService({ mixins: [ApiGatewayService], settings: { - routes: [ { // Enable authentication diff --git a/examples/authorization/index.js b/examples/authorization/index.js index e8ec80dd..2d11a39f 100644 --- a/examples/authorization/index.js +++ b/examples/authorization/index.js @@ -13,9 +13,9 @@ * */ -let path = require("path"); -let { ServiceBroker } = require("moleculer"); -let ApiGatewayService = require("../../index"); +let path = require("path"); +let { ServiceBroker } = require("moleculer"); +let ApiGatewayService = require("../../index"); const { UnAuthorizedError, ERR_NO_TOKEN, ERR_INVALID_TOKEN } = require("../../src/errors"); @@ -32,7 +32,6 @@ broker.createService({ mixins: [ApiGatewayService], settings: { - routes: [ { // Enable authorization @@ -59,12 +58,8 @@ broker.createService({ // Set the authorized user entity to `ctx.meta` ctx.meta.user = { id: 1, name: "John Doe" }; return Promise.resolve(ctx); - - } else - return Promise.reject(new UnAuthorizedError(ERR_INVALID_TOKEN)); - - } else - return Promise.reject(new UnAuthorizedError(ERR_NO_TOKEN)); + } else return Promise.reject(new UnAuthorizedError(ERR_INVALID_TOKEN)); + } else return Promise.reject(new UnAuthorizedError(ERR_NO_TOKEN)); } } }); diff --git a/examples/auto-aliases/index.js b/examples/auto-aliases/index.js index 7bc4ec9e..2c34ee56 100644 --- a/examples/auto-aliases/index.js +++ b/examples/auto-aliases/index.js @@ -13,9 +13,9 @@ * */ -let path = require("path"); -let { ServiceBroker } = require("moleculer"); -let ApiService = require("../../index"); +let path = require("path"); +let { ServiceBroker } = require("moleculer"); +let ApiService = require("../../index"); // Create broker let broker = new ServiceBroker({ @@ -36,17 +36,13 @@ broker.createService({ { path: "api", - whitelist: [ - "api.*", - "**posts.*", - "test.*" - ], + whitelist: ["api.*", "**posts.*", "test.*"], use: [ - function(req, res, next) { + function (req, res, next) { this.logger.info("Middleware ", this.name); next(); - }, + } ], aliases: { @@ -58,10 +54,7 @@ broker.createService({ { path: "/admin", - whitelist: [ - "auth.*", - "$node.*" - ], + whitelist: ["auth.*", "$node.*"], aliases: { "GET /services": "$node.services" diff --git a/examples/cors/index.js b/examples/cors/index.js index 35a13c3b..6cd7a2c7 100644 --- a/examples/cors/index.js +++ b/examples/cors/index.js @@ -5,7 +5,7 @@ */ const { ServiceBroker } = require("moleculer"); -const ApiService = require("../../index"); +const ApiService = require("../../index"); // Create broker const broker = new ServiceBroker(); @@ -32,23 +32,23 @@ broker.createService({ path: "/api1", aliases: { - "welcome": { + welcome: { method: "POST", fullPath: "/welcome", action: "greeter.welcome" } - }, + } }, { path: "/api2", aliases: { - "welcome": { + welcome: { method: "POST", fullPath: "/api2/welcome", action: "greeter.welcome" } - }, + } } ] } diff --git a/examples/dev/index.js b/examples/dev/index.js index c00b4f31..afa7f706 100644 --- a/examples/dev/index.js +++ b/examples/dev/index.js @@ -1,7 +1,7 @@ "use strict"; -const { ServiceBroker } = require("moleculer"); -const ApiService = require("../../index"); +const { ServiceBroker } = require("moleculer"); +const ApiService = require("../../index"); // Create broker const broker = new ServiceBroker(); @@ -17,14 +17,14 @@ broker.createService({ name: "no-auth-route", path: "/", aliases: { - hi: "greeter.hello", + hi: "greeter.hello" } }, { name: "only-auth-route", path: "/", aliases: { - "hello": "greeter.hello", + hello: "greeter.hello" }, authorization: true } diff --git a/examples/direct-calls/index.js b/examples/direct-calls/index.js index f3a0c2e8..33c18077 100644 --- a/examples/direct-calls/index.js +++ b/examples/direct-calls/index.js @@ -13,14 +13,14 @@ * GET http://localhost:3000/node-2/where */ -let path = require("path"); -let { ServiceBroker } = require("moleculer"); -let ApiService = require("../../index"); +let path = require("path"); +let { ServiceBroker } = require("moleculer"); +let ApiService = require("../../index"); // Create broker let broker = new ServiceBroker({ nodeID: "api", - transporter: "NATS", + transporter: "NATS" }); // Load API Gateway @@ -48,20 +48,20 @@ broker.createService({ callOptions: { nodeID: "node-2" } - }, + } ] } }); const node1 = new ServiceBroker({ nodeID: "node-1", - transporter: "NATS", + transporter: "NATS" }); node1.loadService(path.join(__dirname, "..", "test.service.js")); const node2 = new ServiceBroker({ nodeID: "node-2", - transporter: "NATS", + transporter: "NATS" }); node2.loadService(path.join(__dirname, "..", "test.service.js")); diff --git a/examples/express/index.js b/examples/express/index.js index d0dd24a3..895dd16e 100644 --- a/examples/express/index.js +++ b/examples/express/index.js @@ -12,10 +12,10 @@ * http://localhost:3333/api/hi?name=John */ -let path = require("path"); -let { ServiceBroker } = require("moleculer"); -let ApiGatewayService = require("../../index"); -let express = require("express"); +let path = require("path"); +let { ServiceBroker } = require("moleculer"); +let ApiGatewayService = require("../../index"); +let express = require("express"); // Create broker let broker = new ServiceBroker({ @@ -31,16 +31,15 @@ const svc = broker.createService({ settings: { server: false, - routes: [{ - whitelist: [ - "test.hello", - "test.greeter" - ], - aliases: { - "GET hi": "test.greeter" - }, - mappingPolicy: "all" - }] + routes: [ + { + whitelist: ["test.hello", "test.greeter"], + aliases: { + "GET hi": "test.greeter" + }, + mappingPolicy: "all" + } + ] } }); @@ -52,8 +51,7 @@ app.use("/api", svc.express()); // Listening app.listen(3333, err => { - if (err) - return console.error(err); + if (err) return console.error(err); console.log("Open http://localhost:3333/api/test/hello"); }); diff --git a/examples/express/index2.js b/examples/express/index2.js index 9e88f467..54bb86e2 100644 --- a/examples/express/index2.js +++ b/examples/express/index2.js @@ -12,10 +12,10 @@ * http://localhost:3333/api/hi?name=John */ -const path = require("path"); +const path = require("path"); const { ServiceBroker } = require("moleculer"); const ApiGatewayService = require("../../index"); -const express = require("express"); +const express = require("express"); // Create broker const broker = new ServiceBroker(); @@ -29,20 +29,18 @@ broker.createService({ settings: { server: false, - routes: [{ - whitelist: [ - "test.hello", - "test.greeter" - ], - aliases: { - "GET hi": "test.greeter" - }, - mappingPolicy: "all" - }] + routes: [ + { + whitelist: ["test.hello", "test.greeter"], + aliases: { + "GET hi": "test.greeter" + }, + mappingPolicy: "all" + } + ] }, started() { - // Create Express application const app = express(); @@ -51,8 +49,7 @@ broker.createService({ // Listening app.listen(3333, err => { - if (err) - return this.logger.error(err); + if (err) return this.logger.error(err); this.logger.info("Open http://localhost:3333/api/hi?name=John"); }); diff --git a/examples/file.service.js b/examples/file.service.js index df5090ee..57bc8e42 100644 --- a/examples/file.service.js +++ b/examples/file.service.js @@ -14,7 +14,9 @@ module.exports = { handler(ctx) { ctx.meta.$responseType = "image/png"; // Return as stream - return fs.createReadStream(path.join(__dirname, "full", "assets", "images", "logo.png")); + return fs.createReadStream( + path.join(__dirname, "full", "assets", "images", "logo.png") + ); } }, @@ -35,8 +37,7 @@ module.exports = { get: { handler(ctx) { const filePath = path.join(uploadDir, ctx.params.file); - if (!fs.existsSync(filePath)) - return new NotFoundError(); + if (!fs.existsSync(filePath)) return new NotFoundError(); ctx.meta.$responseType = mime.lookup(ctx.params.file); // Return as stream @@ -49,7 +50,10 @@ module.exports = { this.logger.info("Received upload params:", ctx.params); return new this.Promise((resolve, reject) => { //reject(new Error("Disk out of space")); - const filePath = path.join(uploadDir, ctx.params.$filename || this.randomName()); + const filePath = path.join( + uploadDir, + ctx.params.$filename || this.randomName() + ); const f = fs.createWriteStream(filePath); f.on("close", () => { // File written successfully diff --git a/examples/file/index.js b/examples/file/index.js index c5f6ce34..ec92aef9 100644 --- a/examples/file/index.js +++ b/examples/file/index.js @@ -113,12 +113,11 @@ broker.createService({ }, mappingPolicy: "restrict" - }, - + } ], assets: { - folder: "./examples/file/assets", + folder: "./examples/file/assets" } } }); diff --git a/examples/formidable/index.js b/examples/formidable/index.js index bb8c4c12..d44778c2 100644 --- a/examples/formidable/index.js +++ b/examples/formidable/index.js @@ -60,7 +60,7 @@ broker.createService({ // File upload from HTML form "POST /multi"(req, res) { return this.handleFileUpload(req, res); - }, + } }, callOptions: { @@ -70,12 +70,11 @@ broker.createService({ }, mappingPolicy: "restrict" - }, - + } ], assets: { - folder: "./examples/formidable/assets", + folder: "./examples/formidable/assets" } }, @@ -92,17 +91,26 @@ broker.createService({ const ctx = req.$ctx; const entries = Array.isArray(files.myfile) ? files.myfile : [files.myfile]; - const result = await Promise.all(entries.map(entry => { - return ctx.call("file.save", { - $filename: entry.name, - ...req.params, - ...fields, - }, { stream: fs.createReadStream(entry.path) }); - })); - - return this.sendResponse(req, res, Array.isArray(files.myfile) ? result : result[0]); + const result = await Promise.all( + entries.map(entry => { + return ctx.call( + "file.save", + { + $filename: entry.name, + ...req.params, + ...fields + }, + { stream: fs.createReadStream(entry.path) } + ); + }) + ); + + return this.sendResponse( + req, + res, + Array.isArray(files.myfile) ? result : result[0] + ); }); - } } }); diff --git a/examples/full/index.js b/examples/full/index.js index 23c141ad..2bbb3f8e 100644 --- a/examples/full/index.js +++ b/examples/full/index.js @@ -46,11 +46,16 @@ * */ -const fs = require("fs"); -const path = require("path"); -const { ServiceBroker } = require("moleculer"); -const { MoleculerError } = require("moleculer").Errors; -const { ForbiddenError, UnAuthorizedError, ERR_NO_TOKEN, ERR_INVALID_TOKEN } = require("../../src/errors"); +const fs = require("fs"); +const path = require("path"); +const { ServiceBroker } = require("moleculer"); +const { MoleculerError } = require("moleculer").Errors; +const { + ForbiddenError, + UnAuthorizedError, + ERR_NO_TOKEN, + ERR_INVALID_TOKEN +} = require("../../src/errors"); // ---- @@ -110,7 +115,6 @@ broker.createService({ path: "/api", routes: [ - /** * This route demonstrates a protected `/api/admin` path to access `users.*` & internal actions. * To access them, you need to login first & use the received token in header @@ -120,15 +124,12 @@ broker.createService({ path: "/admin", // Whitelist of actions (array of string mask or regex) - whitelist: [ - "users.*", - "$node.*" - ], + whitelist: ["users.*", "$node.*"], // Route CORS settings cors: { origin: ["https://localhost:3000", "https://localhost:4000"], - methods: ["GET", "OPTIONS", "POST"], + methods: ["GET", "OPTIONS", "POST"] }, authorization: true, @@ -138,8 +139,8 @@ broker.createService({ // Action aliases aliases: { "POST users": "users.create", - "health": "$node.health", - "custom"(req, res) { + health: "$node.health", + custom(req, res) { res.writeHead(201); res.end(); } @@ -167,7 +168,6 @@ broker.createService({ res.writeHead(err.code || 500); res.end("Route error: " + err.message); } - }, { @@ -210,7 +210,7 @@ broker.createService({ onAfterCall(ctx, route, req, res, data) { this.logger.info("async onAfterCall in upload route"); return new this.Promise(resolve => { - res.setHeader("X-Response-Type", typeof(data)); + res.setHeader("X-Response-Type", typeof data); resolve(data); }); }, @@ -226,18 +226,12 @@ broker.createService({ path: "/", // Middlewares - use: [ - ], + use: [], etag: true, // Whitelist of actions (array of string mask or regex) - whitelist: [ - "auth.*", - "file.*", - "test.*", - /^math\.\w+$/ - ], + whitelist: ["auth.*", "file.*", "test.*", /^math\.\w+$/], authorization: false, @@ -246,8 +240,8 @@ broker.createService({ // Action aliases aliases: { - "login": "auth.login", - "add": "math.add", + login: "auth.login", + add: "math.add", "add/:a/:b": "math.add", "GET sub": "math.sub", "POST divide": "math.div", @@ -261,7 +255,7 @@ broker.createService({ }, callOptions: { - timeout: 3000, + timeout: 3000 //fallbackResponse: "Fallback response via callOptions" }, @@ -277,10 +271,10 @@ broker.createService({ onAfterCall(ctx, route, req, res, data) { this.logger.info("async onAfterCall in public"); return new this.Promise(resolve => { - res.setHeader("X-Response-Type", typeof(data)); + res.setHeader("X-Response-Type", typeof data); resolve(data); }); - }, + } } ], @@ -300,8 +294,7 @@ broker.createService({ },*/ // Do not log client side errors (does not log an error respons when the error.code is 400<=X<500) - log4XXResponses: false, - + log4XXResponses: false }, events: { @@ -362,13 +355,11 @@ broker.createService({ return Promise.reject(new UnAuthorizedError(ERR_NO_TOKEN)); } // Verify JWT token - return ctx.call("auth.resolveToken", { token }) - .then(user => { - if (!user) - return Promise.reject(new UnAuthorizedError(ERR_INVALID_TOKEN)); + return ctx.call("auth.resolveToken", { token }).then(user => { + if (!user) return Promise.reject(new UnAuthorizedError(ERR_INVALID_TOKEN)); - ctx.meta.user = user; - }); + ctx.meta.user = user; + }); } } }); diff --git a/examples/index.js b/examples/index.js index 09910195..63adbca8 100644 --- a/examples/index.js +++ b/examples/index.js @@ -3,4 +3,4 @@ const moduleName = process.argv[2] || "simple"; process.argv.splice(2, 1); -require("./" + moduleName); \ No newline at end of file +require("./" + moduleName); diff --git a/examples/math.service.js b/examples/math.service.js index 9959d098..2620b29c 100644 --- a/examples/math.service.js +++ b/examples/math.service.js @@ -29,10 +29,8 @@ module.exports = { handler(ctx) { let a = Number(ctx.params.a); let b = Number(ctx.params.b); - if (b != 0 && !Number.isNaN(b)) - return a / b; - else - throw new MoleculerClientError("Divide by zero!", 422, null, ctx.params); + if (b != 0 && !Number.isNaN(b)) return a / b; + else throw new MoleculerClientError("Divide by zero!", 422, null, ctx.params); } } } diff --git a/examples/metrics.service.js b/examples/metrics.service.js index ae7eaaef..3c29ce8e 100644 --- a/examples/metrics.service.js +++ b/examples/metrics.service.js @@ -1,19 +1,17 @@ let _ = require("lodash"); -module.exports = function() { +module.exports = function () { return { name: "metrics", events: { - "metrics.trace.span.start"(payload) { this.requests[payload.id] = payload; payload.spans = []; if (payload.parent) { let parent = this.requests[payload.parent]; - if (parent) - parent.spans.push(payload.id); + if (parent) parent.spans.push(payload.id); } }, @@ -21,8 +19,7 @@ module.exports = function() { let item = this.requests[payload.id]; _.assign(item, payload); - if (!payload.parent) - this.printRequest(payload.id); + if (!payload.parent) this.printRequest(payload.id); } }, @@ -37,12 +34,19 @@ module.exports = function() { let gw = 35; let maxTitle = w - 2 - 2 - gw - 2 - 1; - this.logger.info(["┌", r("─", w-2), "┐"].join("")); + this.logger.info(["┌", r("─", w - 2), "┐"].join("")); - let printSpanTime = (span) => { + let printSpanTime = span => { let time = span.duration == null ? "?" : span.duration.toFixed(2); - let maxActionName = maxTitle - (span.level-1) * 2 - time.length - 3 - (span.fromCache ? 2 : 0) - (span.remoteCall ? 2 : 0) - (span.error ? 2 : 0); + let maxActionName = + maxTitle - + (span.level - 1) * 2 - + time.length - + 3 - + (span.fromCache ? 2 : 0) - + (span.remoteCall ? 2 : 0) - + (span.error ? 2 : 0); let actionName = span.action ? span.action.name : ""; if (actionName.length > maxActionName) actionName = _.truncate(span.action.name, { length: maxActionName }); @@ -63,27 +67,22 @@ module.exports = function() { return; } - let gstart = (span.startTime - main.startTime) / (main.endTime - main.startTime) * 100; - let gstop = (span.endTime - main.startTime) / (main.endTime - main.startTime) * 100; + let gstart = + ((span.startTime - main.startTime) / (main.endTime - main.startTime)) * 100; + let gstop = + ((span.endTime - main.startTime) / (main.endTime - main.startTime)) * 100; if (_.isNaN(gstart) && _.isNaN(gstop)) { gstart = 0; gstop = 100; } - if (gstop > 100) - gstop = 100; + if (gstop > 100) gstop = 100; - let p1 = Math.round(gw * gstart / 100); - let p2 = Math.round(gw * gstop / 100) - p1; + let p1 = Math.round((gw * gstart) / 100); + let p2 = Math.round((gw * gstop) / 100) - p1; let p3 = Math.max(gw - (p1 + p2), 0); - let gauge = [ - "[", - r(".", p1), - r("■", p2), - r(".", p3), - "]" - ].join(""); + let gauge = ["[", r(".", p1), r("■", p2), r(".", p3), "]"].join(""); this.logger.info("│ " + strAction + gauge + " │"); @@ -92,7 +91,7 @@ module.exports = function() { }; printSpanTime(main); - this.logger.info(["└", r("─", w-2), "┘"].join("")); + this.logger.info(["└", r("─", w - 2), "┘"].join("")); } }, diff --git a/examples/middlewares/index.js b/examples/middlewares/index.js index a2e48ab3..8ce49501 100644 --- a/examples/middlewares/index.js +++ b/examples/middlewares/index.js @@ -13,9 +13,9 @@ * */ -let path = require("path"); -let { ServiceBroker } = require("moleculer"); -let ApiService = require("../../index"); +let path = require("path"); +let { ServiceBroker } = require("moleculer"); +let ApiService = require("../../index"); // Create broker let broker = new ServiceBroker({ @@ -39,11 +39,13 @@ broker.createService({ whitelist: ["**"], use: [ (req, res, next) => next(new Error("Something went wrong")), - function(err, req, res, next) { - this.logger.warn("Error occured in middlewares! Terminating request and sending response"); + function (err, req, res, next) { + this.logger.warn( + "Error occured in middlewares! Terminating request and sending response" + ); res.end("Handled. No problem."); - }, - ], + } + ] } ] } diff --git a/examples/multi-auth/index.js b/examples/multi-auth/index.js index 7e3c2d61..f8579d1d 100644 --- a/examples/multi-auth/index.js +++ b/examples/multi-auth/index.js @@ -16,9 +16,9 @@ * */ -let path = require("path"); -let { ServiceBroker } = require("moleculer"); -let ApiGatewayService = require("../../index"); +let path = require("path"); +let { ServiceBroker } = require("moleculer"); +let ApiGatewayService = require("../../index"); const { UnAuthorizedError, ERR_NO_TOKEN, ERR_INVALID_TOKEN } = require("../../src/errors"); @@ -35,7 +35,6 @@ broker.createService({ mixins: [ApiGatewayService], settings: { - routes: [ { path: "/aaa", diff --git a/examples/post.service.js b/examples/post.service.js index 5b2626c9..ff0512f6 100644 --- a/examples/post.service.js +++ b/examples/post.service.js @@ -1,13 +1,13 @@ "use strict"; -const _ = require("lodash"); +const _ = require("lodash"); const { MoleculerError } = require("moleculer").Errors; -const fake = require("fakerator")(); +const fake = require("fakerator")(); function generateFakeData(count) { let rows = []; - for(let i = 0; i < count; i++) { + for (let i = 0; i < count; i++) { let item = fake.entity.post(); item.id = i + 1; item.author = fake.random.number(1, 10); @@ -36,7 +36,6 @@ module.exports = { } }, - get: { cache: { keys: ["id"] @@ -44,8 +43,7 @@ module.exports = { rest: "GET /:id", handler(ctx) { const post = this.findByID(ctx.params.id); - if (post) - return post; + if (post) return post; return Promise.reject(new MoleculerError("Post not found!", 404)); } @@ -74,12 +72,9 @@ module.exports = { handler(ctx) { const post = this.findByID(ctx.params.id); if (post) { - if (ctx.params.title) - post.title = ctx.params.title; - if (ctx.params.content) - post.content = ctx.params.content; - if (ctx.params.author) - post.author = ctx.params.author; + if (ctx.params.title) post.title = ctx.params.title; + if (ctx.params.content) post.content = ctx.params.content; + if (ctx.params.author) post.author = ctx.params.author; this.clearCache(); return post; @@ -95,7 +90,6 @@ module.exports = { this.clearCache(); } } - }, methods: { diff --git a/examples/raw/index.js b/examples/raw/index.js index 55017a57..6bb3ae7d 100644 --- a/examples/raw/index.js +++ b/examples/raw/index.js @@ -47,7 +47,7 @@ broker.createService({ aliases: { // File upload from HTML form - "POST /raw": "echo.params", + "POST /raw": "echo.params" } } ] diff --git a/examples/rest/index.js b/examples/rest/index.js index a29062ca..ccf7c4c1 100644 --- a/examples/rest/index.js +++ b/examples/rest/index.js @@ -32,9 +32,9 @@ * */ -let path = require("path"); -let { ServiceBroker } = require("moleculer"); -let ApiGatewayService = require("../../index"); +let path = require("path"); +let { ServiceBroker } = require("moleculer"); +let ApiGatewayService = require("../../index"); // Create broker let broker = new ServiceBroker({ @@ -51,22 +51,24 @@ broker.loadService(path.join(__dirname, "..", "post.service")); broker.createService({ mixins: [ApiGatewayService], settings: { - routes: [{ - // RESTful aliases - aliases: { - "REST posts": "posts" - /* + routes: [ + { + // RESTful aliases + aliases: { + "REST posts": "posts" + /* "GET posts": "posts.list", "GET posts/:id": "posts.get", "POST posts": "posts.create", "PUT posts/:id": "posts.update", "DELETE posts/:id": "posts.remove" */ - }, + }, - // Disable direct URLs (`/posts/list` or `/posts.list`) - mappingPolicy: "restrict" - }] + // Disable direct URLs (`/posts/list` or `/posts.list`) + mappingPolicy: "restrict" + } + ] } }); diff --git a/examples/routing/index.js b/examples/routing/index.js index 9c287b6f..a9f0df21 100644 --- a/examples/routing/index.js +++ b/examples/routing/index.js @@ -18,9 +18,9 @@ * GET http://localhost:3000/lang/en */ -const path = require("path"); -const { ServiceBroker } = require("moleculer"); -const ApiGatewayService = require("../../index"); +const path = require("path"); +const { ServiceBroker } = require("moleculer"); +const ApiGatewayService = require("../../index"); // Create broker const broker = new ServiceBroker(); @@ -41,24 +41,20 @@ broker.createService({ path: "/defined/", aliases: { "GET posts": "posts.list" - }, + } }, { path: "/unsecure", - whitelist: [ - "math.*" - ], + whitelist: ["math.*"] }, { path: "/generated", - whitelist: [ - "auth.*" - ], - autoAliases: true, + whitelist: ["auth.*"], + autoAliases: true }, { path: "/params", - autoAliases: true, + autoAliases: true }, { path: "/lang/:lng/", diff --git a/examples/simple/index.js b/examples/simple/index.js index da24973a..1b995b9f 100644 --- a/examples/simple/index.js +++ b/examples/simple/index.js @@ -21,9 +21,9 @@ * */ -const path = require("path"); +const path = require("path"); const { ServiceBroker } = require("moleculer"); -const ApiService = require("../../index"); +const ApiService = require("../../index"); // Create broker const broker = new ServiceBroker(); diff --git a/examples/socket.io/index.js b/examples/socket.io/index.js index 4fde1358..4918eab4 100644 --- a/examples/socket.io/index.js +++ b/examples/socket.io/index.js @@ -12,10 +12,10 @@ * */ -let path = require("path"); -let { ServiceBroker } = require("moleculer"); -let ApiGatewayService = require("../../index"); -let IO = require("socket.io"); +let path = require("path"); +let { ServiceBroker } = require("moleculer"); +let ApiGatewayService = require("../../index"); +let IO = require("socket.io"); // Create broker let broker = new ServiceBroker({ @@ -33,12 +33,14 @@ broker.createService({ mixins: [ApiGatewayService], settings: { assets: { - folder: path.join(__dirname, "assets"), + folder: path.join(__dirname, "assets") }, - routes: [{ - path: "/api" - }] + routes: [ + { + path: "/api" + } + ] }, events: { @@ -61,12 +63,17 @@ broker.createService({ this.logger.info("Client connected via websocket!"); client.on("call", ({ action, params, opts }, done) => { - this.logger.info("Received request from client! Action:", action, ", Params:", params); + this.logger.info( + "Received request from client! Action:", + action, + ", Params:", + params + ); - this.broker.call(action, params, opts) + this.broker + .call(action, params, opts) .then(res => { - if (done) - done(res); + if (done) done(res); }) .catch(err => this.logger.error(err)); }); @@ -74,7 +81,6 @@ broker.createService({ client.on("disconnect", () => { this.logger.info("Client disconnected"); }); - }); } }); diff --git a/examples/spdy/index.js b/examples/spdy/index.js index f70a138e..ff385b6e 100644 --- a/examples/spdy/index.js +++ b/examples/spdy/index.js @@ -12,11 +12,11 @@ * https://localhost:3000/hi?name=John */ -const path = require("path"); -const fs = require("fs"); -const { ServiceBroker } = require("moleculer"); -const ApiGatewayService = require("../../index"); -const spdy = require("spdy"); +const path = require("path"); +const fs = require("fs"); +const { ServiceBroker } = require("moleculer"); +const ApiGatewayService = require("../../index"); +const spdy = require("spdy"); // Create broker const broker = new ServiceBroker({ @@ -36,7 +36,7 @@ broker.createService({ // **optional** SPDY-specific options spdy: { - protocols: [ "h2", "spdy/3.1", "http/1.1" ], + protocols: ["h2", "spdy/3.1", "http/1.1"], plain: false, "x-forwarded-for": true, connection: { @@ -45,15 +45,14 @@ broker.createService({ } }, - routes: [{ - whitelist: [ - "test.hello", - "test.greeter" - ], - aliases: { - "GET hi": "test.greeter" + routes: [ + { + whitelist: ["test.hello", "test.greeter"], + aliases: { + "GET hi": "test.greeter" + } } - }] + ] }, methods: { diff --git a/examples/sse/chat.service.js b/examples/sse/chat.service.js index 4465a5af..9c3f140f 100644 --- a/examples/sse/chat.service.js +++ b/examples/sse/chat.service.js @@ -4,12 +4,12 @@ module.exports = { postMessage: { params: { message: "string", - user: "string", + user: "string" }, handler(context) { const { params } = context; context.emit("chat.sse.message", params); - }, - }, - }, + } + } + } }; diff --git a/examples/sse/index.js b/examples/sse/index.js index f3987182..8dbafbbc 100644 --- a/examples/sse/index.js +++ b/examples/sse/index.js @@ -13,14 +13,14 @@ const HOST = "0.0.0.0"; const SSE_HEADERS = { Connection: "keep-alive", "Content-Type": "text/event-stream", - "Cache-Control": "no-cache", + "Cache-Control": "no-cache" }; // Create broker const broker = new ServiceBroker({ logger: console, metrics: true, - validation: true, + validation: true }); broker.createService(ChatService); @@ -35,7 +35,7 @@ broker.createService({ ip: HOST, assets: { - folder: path.join(__dirname, "assets"), + folder: path.join(__dirname, "assets") }, routes: [ @@ -45,20 +45,17 @@ broker.createService({ "POST message": "chat.postMessage", "GET message"(request, response) { response.writeHead(200, SSE_HEADERS); - response.$service.addSSEListener( - response, - "chat.message" - ); - }, - }, - }, - ], + response.$service.addSSEListener(response, "chat.message"); + } + } + } + ] }, events: { "chat.sse*"(context) { this.handleSSE(context); - }, + } }, methods: { @@ -76,8 +73,7 @@ broker.createService({ }, addSSEListener(stream, event) { - if (!stream.write) - throw new MoleculerError("Only writable can listen to SSE."); + if (!stream.write) throw new MoleculerError("Only writable can listen to SSE."); const listeners = this.sseListeners.get(event) || new Set(); listeners.add(stream); this.sseListeners.set(event, listeners); @@ -92,7 +88,7 @@ broker.createService({ return `event: ${event}\ndata: ${JSON.stringify( data )}\nid: ${id}\nretry: ${this.sseRetry}\n\n`; - }, + } }, started() { @@ -108,7 +104,7 @@ broker.createService({ listeners.delete(listener); } } - }, + } }); // Start server diff --git a/examples/ssl/index.js b/examples/ssl/index.js index 6aae747a..0ca32e6a 100644 --- a/examples/ssl/index.js +++ b/examples/ssl/index.js @@ -19,10 +19,10 @@ * */ -let fs = require("fs"); -let path = require("path"); -let { ServiceBroker } = require("moleculer"); -let ApiService = require("../../index"); +let fs = require("fs"); +let path = require("path"); +let { ServiceBroker } = require("moleculer"); +let ApiService = require("../../index"); // Create broker let broker = new ServiceBroker({ @@ -49,10 +49,7 @@ broker.createService({ // Create a route with whitelist & body-parser { path: "/", - whitelist: [ - "math.*", - "file.image" - ], + whitelist: ["math.*", "file.image"], // Use JSON body-parser module bodyParsers: { diff --git a/examples/test.service.js b/examples/test.service.js index b2f392f0..e44a105b 100644 --- a/examples/test.service.js +++ b/examples/test.service.js @@ -92,7 +92,9 @@ module.exports = { slow(ctx) { let time = ctx.params.delay || 5000; - return this.Promise.resolve().delay(time).then(() => `Done after ${time / 1000} sec!`); + return this.Promise.resolve() + .delay(time) + .then(() => `Done after ${time / 1000} sec!`); }, wrong(ctx) { @@ -107,9 +109,12 @@ module.exports = { stream: { handler(ctx) { ctx.meta.$responseHeaders = { - "Content-Disposition": "attachment; filename=\"stream-lorem.txt\"" + "Content-Disposition": 'attachment; filename="stream-lorem.txt"' }; - const stream = fs.createReadStream(path.join(__dirname, "..", "test", "assets", "lorem.txt"), "utf8"); + const stream = fs.createReadStream( + path.join(__dirname, "..", "test", "assets", "lorem.txt"), + "utf8" + ); setTimeout(() => { stream.read(1024); }, 100); @@ -134,16 +139,16 @@ module.exports = { }, func2: { - rest : "GET /fixed/:param1/:param2", - visibility : "published", + rest: "GET /fixed/:param1/:param2", + visibility: "published", async handler(ctx) { return Promise.resolve("func2"); } }, func1: { - rest : "GET /:param1/:param2/:param3/:param4?", - visibility : "published", + rest: "GET /:param1/:param2/:param3/:param4?", + visibility: "published", async handler(ctx) { return Promise.resolve("func1"); } diff --git a/examples/webpack-vue/index.js b/examples/webpack-vue/index.js index b34d280b..62f8703e 100644 --- a/examples/webpack-vue/index.js +++ b/examples/webpack-vue/index.js @@ -20,17 +20,17 @@ * */ -let path = require("path"); -let { ServiceBroker } = require("moleculer"); -let ApiService = require("../../index"); +let path = require("path"); +let { ServiceBroker } = require("moleculer"); +let ApiService = require("../../index"); -const webpack = require("webpack"); -const devMiddleware = require("webpack-dev-middleware"); -const hotMiddleware = require("webpack-hot-middleware"); -const serveStatic = require("serve-static"); +const webpack = require("webpack"); +const devMiddleware = require("webpack-dev-middleware"); +const hotMiddleware = require("webpack-hot-middleware"); +const serveStatic = require("serve-static"); -const config = require("./webpack.config"); -const compiler = webpack(config); +const config = require("./webpack.config"); +const compiler = webpack(config); // Create broker let broker = new ServiceBroker({ @@ -46,16 +46,15 @@ broker.createService({ mixins: [ApiService], settings: { - routes: [ { path: "/api", // Action aliases aliases: { - "add": "math.add", + add: "math.add", "GET hello": "test.hello", - "GET health": "$node.health", + "GET health": "$node.health" }, // Use bodyparser modules @@ -63,7 +62,6 @@ broker.createService({ json: true, urlencoded: { extended: true } } - }, { path: "/", @@ -79,9 +77,9 @@ broker.createService({ log: broker.logger.info }), serveStatic(path.join(__dirname, "public")) - ], - }, - ], + ] + } + ] } }); diff --git a/examples/webpack-vue/webpack.config.js b/examples/webpack-vue/webpack.config.js index f9e195c0..bbc169bb 100644 --- a/examples/webpack-vue/webpack.config.js +++ b/examples/webpack-vue/webpack.config.js @@ -23,11 +23,7 @@ module.exports = { loader: "vue-loader", options: { loaders: { - "scss": [ - "vue-style-loader", - "css-loader", - "sass-loader" - ], + scss: ["vue-style-loader", "css-loader", "sass-loader"] } } }, @@ -40,23 +36,15 @@ module.exports = { }, { test: /\.scss$/, - use: [ - "vue-style-loader", - "css-loader", - "sass-loader" - ] + use: ["vue-style-loader", "css-loader", "sass-loader"] }, // this will apply to both plain `.css` files // AND `<style>` blocks in `.vue` files { test: /\.css$/, - use: [ - "vue-style-loader", - "css-loader" - ] + use: ["vue-style-loader", "css-loader"] } ] - }, plugins: [ @@ -69,7 +57,7 @@ module.exports = { extensions: [".vue", ".js", ".json"], mainFiles: ["index"], alias: { - "vue$": "vue/dist/vue.esm.js" + vue$: "vue/dist/vue.esm.js" } }, diff --git a/examples/webpack/index.js b/examples/webpack/index.js index 0e375d47..8b7f3ff1 100644 --- a/examples/webpack/index.js +++ b/examples/webpack/index.js @@ -7,17 +7,17 @@ * Open the http://localhost:3000/ address in your browser. */ -let path = require("path"); -let { ServiceBroker } = require("moleculer"); -let ApiService = require("../../index"); +let path = require("path"); +let { ServiceBroker } = require("moleculer"); +let ApiService = require("../../index"); -const webpack = require("webpack"); -const devMiddleware = require("webpack-dev-middleware"); -const compression = require("compression"); -const serveStatic = require("serve-static"); +const webpack = require("webpack"); +const devMiddleware = require("webpack-dev-middleware"); +const compression = require("compression"); +const serveStatic = require("serve-static"); -const config = require("./webpack.config"); -const compiler = webpack(config); +const config = require("./webpack.config"); +const compiler = webpack(config); // Create broker let broker = new ServiceBroker({ @@ -33,7 +33,6 @@ broker.createService({ mixins: [ApiService], settings: { - routes: [ { path: "/", @@ -49,9 +48,9 @@ broker.createService({ headers: { "Access-Control-Allow-Origin": "*" } }), serveStatic(path.join(__dirname, "public")) - ], - }, - ], + ] + } + ] } }); diff --git a/examples/www/index.js b/examples/www/index.js index d9c2e07a..64afe0db 100644 --- a/examples/www/index.js +++ b/examples/www/index.js @@ -27,9 +27,9 @@ * */ -let path = require("path"); -let { ServiceBroker } = require("moleculer"); -let ApiGatewayService = require("../../index"); +let path = require("path"); +let { ServiceBroker } = require("moleculer"); +let ApiGatewayService = require("../../index"); // Create broker let broker = new ServiceBroker({ @@ -46,7 +46,6 @@ broker.createService({ mixins: [ApiGatewayService], settings: { - // Folder to server assets (static files) assets: { // Root folder of assets @@ -60,28 +59,36 @@ broker.createService({ path: "/api", // Whitelist of actions (array of string mask or regex) - whitelist: [ - "file.*", - /^math\.\w+$/, - "$node.health" - ], + whitelist: ["file.*", /^math\.\w+$/, "$node.health"], // Action aliases aliases: { - "add": "math.add", + add: "math.add", "GET health": "$node.health", "POST divide": "math.div", - "other": [ - function(req, res, next) { this.logger.info("Middleware 1"); next(); }, - function(req, res, next) { this.logger.info("Middleware 2"); next(); }, + other: [ + function (req, res, next) { + this.logger.info("Middleware 1"); + next(); + }, + function (req, res, next) { + this.logger.info("Middleware 2"); + next(); + }, //"file.html" - function(req, res, next) { + function (req, res, next) { this.logger.info("Custom alias", req.$ctx.id); //res.end(); next(new Error("Wrong")); }, - function(req, res, next) { this.logger.info("Middleware 3"); res.end(); }, - function(err, req, res, next) { this.logger.info("Error Middleware 4"); res.end(err.message); }, + function (req, res, next) { + this.logger.info("Middleware 3"); + res.end(); + }, + function (err, req, res, next) { + this.logger.info("Error Middleware 4"); + res.end(err.message); + } ] }, @@ -90,12 +97,10 @@ broker.createService({ json: true, urlencoded: { extended: true } } - } ], logRequestParams: "info" - } }); diff --git a/package-lock.json b/package-lock.json index fad7d10d..37dd88e4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -28,10 +28,11 @@ "compression": "^1.7.4", "coveralls": "^3.1.1", "cross-env": "^7.0.3", - "eslint": "^8.0.1", + "eslint": "^9.1.1", + "eslint-config-prettier": "^9.1.0", "eslint-plugin-node": "^11.1.0", - "eslint-plugin-promise": "^6.1.1", - "eslint-plugin-security": "^1.4.0", + "eslint-plugin-prettier": "^5.1.3", + "eslint-plugin-security": "^3.0.0", "express": "^4.17.1", "fakerator": "^0.3.4", "formidable": "^1.2.6", @@ -44,6 +45,8 @@ "moleculer-repl": "^0.7.0", "nats": "^2.2.0", "nodemon": "^2.0.13", + "npm-check-updates": "^16.14.20", + "prettier": "^3.2.5", "socket.io": "^4.7.1", "spdy": "^4.0.2", "supertest": "^6.1.6", @@ -54,7 +57,7 @@ "node": ">= 18.x.x" }, "peerDependencies": { - "moleculer": "^0.13.0 || ^0.14.0 || ^0.15.0" + "moleculer": "^0.15.0" } }, "node_modules/@ampproject/remapping": { @@ -931,16 +934,88 @@ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", + "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.0.tgz", + "integrity": "sha512-zdHg2FPIFNKPdcHWtiNT+jEFCHYVplAXRDlQDyqy0zGx/q2parwh7brGJSiTxRk/TSMkbM//zt/f5CHgyTyaSQ==", + "dev": true, + "dependencies": { + "@eslint/object-schema": "^2.1.4", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.9.0.tgz", + "integrity": "sha512-7ATR9F0e4W85D/0w7cU0SNj7qkAexMG+bAHEZOjo9akvGuhHE2m7umzWzfnpa0XAg5Kxc1BWmtPMV67jJ+9VUg==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, "node_modules/@eslint/eslintrc": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz", - "integrity": "sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.2.0.tgz", + "integrity": "sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.4.0", - "globals": "^13.15.0", + "espree": "^10.0.1", + "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -948,7 +1023,7 @@ "strip-json-comments": "^3.1.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -972,6 +1047,36 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/@eslint/js": { + "version": "9.16.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.16.0.tgz", + "integrity": "sha512-tw2HxzQkrbeuvyj1tG2Yqq+0H9wGoI2IMk4EOsQeX+vmd75FtJAzf+gTA69WF+baUKRYQ3x2kbLE08js5OsTVg==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz", + "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.3.tgz", + "integrity": "sha512-2b/g5hRmpbb1o4GnTZax9N9m0FXzz9OV42ZzI4rDDMDuHUqigAiQCEWChBWCY4ztAGVRjoWT19v0yMmc5/L5kA==", + "dev": true, + "dependencies": { + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, "node_modules/@fastify/busboy": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-1.1.0.tgz", @@ -983,18 +1088,45 @@ "node": ">=10.17.0" } }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.7", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.7.tgz", - "integrity": "sha512-kBbPWzN8oVMLb0hOUYXhmxggL/1cJE6ydvjDIGi9EnAGUyA7cLVKQg+d/Dsm+KZwx2czGHrCmMVLiyg8s5JPKw==", + "node_modules/@gar/promisify": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", + "dev": true + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", + "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", "dev": true, "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.3.0" }, "engines": { - "node": ">=10.10.0" + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "dev": true, + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, "node_modules/@humanwhocodes/module-importer": { @@ -1010,11 +1142,18 @@ "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@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 + "node_modules/@humanwhocodes/retry": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.1.tgz", + "integrity": "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==", + "dev": true, + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } }, "node_modules/@isaacs/cliui": { "version": "8.0.2", @@ -1387,14 +1526,14 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dev": true, "dependencies": { - "@jridgewell/set-array": "^1.0.1", + "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" @@ -1410,22 +1549,22 @@ } }, "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", - "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", "dev": true, "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" } }, "node_modules/@jridgewell/sourcemap-codec": { @@ -1435,13 +1574,13 @@ "dev": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, "node_modules/@nodelib/fs.scandir": { @@ -1479,169 +1618,516 @@ "node": ">= 8" } }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "node_modules/@npmcli/fs": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.1.tgz", + "integrity": "sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==", "dev": true, - "optional": true, + "dependencies": { + "semver": "^7.3.5" + }, "engines": { - "node": ">=14" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/@sinonjs/commons": { - "version": "1.8.4", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.4.tgz", - "integrity": "sha512-RpmQdHVo8hCEHDVpO39zToS9jOhR6nw+/lQAzRNq9ErrGV9IeHM71XCn68svVl/euFeVW6BWX4p35gkhbOcSIQ==", - "deprecated": "Breaks compatibility with ES5, use v1.8.5", + "node_modules/@npmcli/fs/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, - "dependencies": { - "type-detect": "4.0.8" + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, - "node_modules/@sinonjs/fake-timers": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", - "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", + "node_modules/@npmcli/git": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-4.1.0.tgz", + "integrity": "sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ==", "dev": true, "dependencies": { - "@sinonjs/commons": "^1.7.0" + "@npmcli/promise-spawn": "^6.0.0", + "lru-cache": "^7.4.4", + "npm-pick-manifest": "^8.0.0", + "proc-log": "^3.0.0", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/@socket.io/component-emitter": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", - "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==", - "dev": true - }, - "node_modules/@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "node_modules/@npmcli/git/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true, "engines": { - "node": ">= 6" + "node": ">=12" } }, - "node_modules/@types/babel__core": { - "version": "7.1.19", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz", - "integrity": "sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==", + "node_modules/@npmcli/git/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, - "node_modules/@types/babel__generator": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", - "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", + "node_modules/@npmcli/git/node_modules/which": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", "dev": true, "dependencies": { - "@babel/types": "^7.0.0" + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/@types/babel__template": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", - "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "node_modules/@npmcli/installed-package-contents": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.1.0.tgz", + "integrity": "sha512-c8UuGLeZpm69BryRykLuKRyKFZYJsZSCT4aVY5ds4omyZqJ172ApzgfKJ5eV/r3HgLdUYgFVe54KSFVjKoe27w==", "dev": true, "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" + "npm-bundled": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "bin": { + "installed-package-contents": "bin/index.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/@types/babel__traverse": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.2.tgz", - "integrity": "sha512-FcFaxOr2V5KZCviw1TnutEMVUVsGt4D2hP1TAfXZAMKuHYW3xQhe3jTxNPWutgCJ3/X1c5yX8ZoGVEItxKbwBg==", + "node_modules/@npmcli/move-file": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", + "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", + "deprecated": "This functionality has been moved to @npmcli/fs", "dev": true, "dependencies": { - "@babel/types": "^7.3.0" + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@types/cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", - "dev": true - }, - "node_modules/@types/cors": { - "version": "2.8.13", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz", - "integrity": "sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==", + "node_modules/@npmcli/node-gyp": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz", + "integrity": "sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==", "dev": true, - "dependencies": { - "@types/node": "*" + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/@types/eslint": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.0.tgz", - "integrity": "sha512-gsF+c/0XOguWgaOgvFs+xnnRqt9GwgTvIks36WpE6ueeI4KCEHHd8K/CKHqhOqrJKsYH8m27kRzQEvWXAwXUTw==", + "node_modules/@npmcli/promise-spawn": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-6.0.2.tgz", + "integrity": "sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==", "dev": true, "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" + "which": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/@types/eslint-scope": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", - "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "node_modules/@npmcli/promise-spawn/node_modules/which": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", "dev": true, "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/@types/estree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", - "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", - "dev": true - }, - "node_modules/@types/graceful-fs": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", - "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", + "node_modules/@npmcli/run-script": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-6.0.2.tgz", + "integrity": "sha512-NCcr1uQo1k5U+SYlnIrbAh3cxy+OQT1VtqiAbxdymSlptbzBb62AjH2xXgjNCoP073hoa1CfCAcwoZ8k96C4nA==", "dev": true, "dependencies": { - "@types/node": "*" + "@npmcli/node-gyp": "^3.0.0", + "@npmcli/promise-spawn": "^6.0.0", + "node-gyp": "^9.0.0", + "read-package-json-fast": "^3.0.0", + "which": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", - "dev": true - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "node_modules/@npmcli/run-script/node_modules/which": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", "dev": true, "dependencies": { - "@types/istanbul-lib-coverage": "*" + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", - "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", "dev": true, - "dependencies": { - "@types/istanbul-lib-report": "*" + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@pkgr/core": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", + "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/@pnpm/config.env-replace": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", + "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", + "dev": true, + "engines": { + "node": ">=12.22.0" + } + }, + "node_modules/@pnpm/network.ca-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", + "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", + "dev": true, + "dependencies": { + "graceful-fs": "4.2.10" + }, + "engines": { + "node": ">=12.22.0" + } + }, + "node_modules/@pnpm/npm-conf": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.3.1.tgz", + "integrity": "sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==", + "dev": true, + "dependencies": { + "@pnpm/config.env-replace": "^1.1.0", + "@pnpm/network.ca-file": "^1.0.1", + "config-chain": "^1.1.11" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@sigstore/bundle": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-1.1.0.tgz", + "integrity": "sha512-PFutXEy0SmQxYI4texPw3dd2KewuNqv7OuK1ZFtY2fM754yhvG2KdgwIhRnoEE2uHdtdGNQ8s0lb94dW9sELog==", + "dev": true, + "dependencies": { + "@sigstore/protobuf-specs": "^0.2.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/protobuf-specs": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.2.1.tgz", + "integrity": "sha512-XTWVxnWJu+c1oCshMLwnKvz8ZQJJDVOlciMfgpJBQbThVjKTCG8dwyhgLngBD2KN0ap9F/gOV8rFDEx8uh7R2A==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/sign": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-1.0.0.tgz", + "integrity": "sha512-INxFVNQteLtcfGmcoldzV6Je0sbbfh9I16DM4yJPw3j5+TFP8X6uIiA18mvpEa9yyeycAKgPmOA3X9hVdVTPUA==", + "dev": true, + "dependencies": { + "@sigstore/bundle": "^1.1.0", + "@sigstore/protobuf-specs": "^0.2.0", + "make-fetch-happen": "^11.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/tuf": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-1.0.3.tgz", + "integrity": "sha512-2bRovzs0nJZFlCN3rXirE4gwxCn97JNjMmwpecqlbgV9WcxX7WRuIrgzx/X7Ib7MYRbyUTpBYE0s2x6AmZXnlg==", + "dev": true, + "dependencies": { + "@sigstore/protobuf-specs": "^0.2.0", + "tuf-js": "^1.1.7" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@sindresorhus/is": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz", + "integrity": "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@sinonjs/commons": { + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.4.tgz", + "integrity": "sha512-RpmQdHVo8hCEHDVpO39zToS9jOhR6nw+/lQAzRNq9ErrGV9IeHM71XCn68svVl/euFeVW6BWX4p35gkhbOcSIQ==", + "deprecated": "Breaks compatibility with ES5, use v1.8.5", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", + "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } + }, + "node_modules/@socket.io/component-emitter": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", + "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==", + "dev": true + }, + "node_modules/@szmarczak/http-timer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", + "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", + "dev": true, + "dependencies": { + "defer-to-connect": "^2.0.1" + }, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@tufjs/canonical-json": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-1.0.0.tgz", + "integrity": "sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@tufjs/models": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-1.0.4.tgz", + "integrity": "sha512-qaGV9ltJP0EO25YfFUPhxRVK0evXFIAGicsVXuRim4Ed9cjPxYhNnNJ49SFmbeLgtxpslIkX317IgpfcHPVj/A==", + "dev": true, + "dependencies": { + "@tufjs/canonical-json": "1.0.0", + "minimatch": "^9.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@tufjs/models/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@tufjs/models/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@types/babel__core": { + "version": "7.1.19", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz", + "integrity": "sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", + "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.2.tgz", + "integrity": "sha512-FcFaxOr2V5KZCviw1TnutEMVUVsGt4D2hP1TAfXZAMKuHYW3xQhe3jTxNPWutgCJ3/X1c5yX8ZoGVEItxKbwBg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.3.0" + } + }, + "node_modules/@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", + "dev": true + }, + "node_modules/@types/cors": { + "version": "2.8.17", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz", + "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/eslint": { + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.0.tgz", + "integrity": "sha512-gsF+c/0XOguWgaOgvFs+xnnRqt9GwgTvIks36WpE6ueeI4KCEHHd8K/CKHqhOqrJKsYH8m27kRzQEvWXAwXUTw==", + "dev": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "dev": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", + "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", + "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", + "dev": true + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "dev": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" } }, "node_modules/@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true }, "node_modules/@types/node": { @@ -1661,6 +2147,12 @@ "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.10.tgz", "integrity": "sha512-3Gnx08Ns1sEoCrWssEgTSJs/rsT2vhGP+Ja9cnnk9k4ALxinORlQneLXFeFKOTJMOeZUFD1s7w+w2AphTpvzZw==" }, + "node_modules/@types/semver-utils": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@types/semver-utils/-/semver-utils-1.1.3.tgz", + "integrity": "sha512-T+YwkslhsM+CeuhYUxyAjWm7mJ5am/K10UX40RuA6k6Lc7eGtq8iY2xOzy7Vq0GOqhl/xZl5l2FwURZMTPTUww==", + "dev": true + }, "node_modules/@types/stack-utils": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", @@ -1683,148 +2175,148 @@ "dev": true }, "node_modules/@webassemblyjs/ast": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", - "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", "dev": true, "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" } }, "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", "dev": true }, "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", "dev": true }, "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", - "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", "dev": true }, "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", "dev": true, "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", "dev": true }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", - "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" } }, "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", "dev": true, "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "node_modules/@webassemblyjs/leb128": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", "dev": true, "dependencies": { "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/utf8": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", "dev": true }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", - "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-opt": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6", - "@webassemblyjs/wast-printer": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" } }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", - "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", - "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" } }, "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", - "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", - "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/ast": "1.14.1", "@xtuc/long": "4.2.2" } }, @@ -1867,9 +2359,9 @@ } }, "node_modules/acorn": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", - "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -1900,15 +2392,6 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-import-assertions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", - "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", - "dev": true, - "peerDependencies": { - "acorn": "^8" - } - }, "node_modules/acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", @@ -1939,6 +2422,31 @@ "node": ">= 6.0.0" } }, + "node_modules/agentkeepalive": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", + "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", + "dev": true, + "dependencies": { + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -1964,6 +2472,15 @@ "ajv": "^6.9.1" } }, + "node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "dev": true, + "dependencies": { + "string-width": "^4.1.0" + } + }, "node_modules/ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", @@ -2028,6 +2545,26 @@ "node": ">= 8" } }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "dev": true + }, + "node_modules/are-we-there-yet": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", + "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", + "deprecated": "This package is no longer supported.", + "dev": true, + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, "node_modules/argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -2108,6 +2645,15 @@ "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", "dev": true }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", @@ -2334,20 +2880,20 @@ } }, "node_modules/body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", "dependencies": { "bytes": "3.1.2", - "content-type": "~1.0.4", + "content-type": "~1.0.5", "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.1", + "qs": "6.13.0", + "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" }, @@ -2369,6 +2915,131 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, + "node_modules/boxen": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.1.1.tgz", + "integrity": "sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==", + "dev": true, + "dependencies": { + "ansi-align": "^3.0.1", + "camelcase": "^7.0.1", + "chalk": "^5.2.0", + "cli-boxes": "^3.0.0", + "string-width": "^5.1.2", + "type-fest": "^2.13.0", + "widest-line": "^4.0.1", + "wrap-ansi": "^8.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boxen/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/boxen/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/boxen/node_modules/camelcase": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", + "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boxen/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/boxen/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/boxen/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boxen/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/boxen/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -2380,12 +3051,12 @@ } }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" @@ -2398,9 +3069,9 @@ "dev": true }, "node_modules/browserslist": { - "version": "4.21.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", - "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz", + "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==", "dev": true, "funding": [ { @@ -2410,13 +3081,17 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "caniuse-lite": "^1.0.30001400", - "electron-to-chromium": "^1.4.251", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.9" + "caniuse-lite": "^1.0.30001669", + "electron-to-chromium": "^1.5.41", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.1" }, "bin": { "browserslist": "cli.js" @@ -2478,13 +3153,122 @@ "node": ">= 0.8" } }, + "node_modules/cacache": { + "version": "17.1.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.4.tgz", + "integrity": "sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A==", + "dev": true, + "dependencies": { + "@npmcli/fs": "^3.1.0", + "fs-minipass": "^3.0.0", + "glob": "^10.2.2", + "lru-cache": "^7.7.1", + "minipass": "^7.0.3", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "p-map": "^4.0.0", + "ssri": "^10.0.0", + "tar": "^6.1.11", + "unique-filename": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/cacache/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/cacache/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/cacache/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/cacache/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/cacheable-lookup": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", + "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", + "dev": true, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/cacheable-request": { + "version": "10.2.14", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.14.tgz", + "integrity": "sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==", + "dev": true, + "dependencies": { + "@types/http-cache-semantics": "^4.0.2", + "get-stream": "^6.0.1", + "http-cache-semantics": "^4.1.1", + "keyv": "^4.5.3", + "mimic-response": "^4.0.0", + "normalize-url": "^8.0.0", + "responselike": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + } + }, "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -2509,9 +3293,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001430", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001430.tgz", - "integrity": "sha512-IB1BXTZKPDVPM7cnV4iaKaHxckvdr/3xtctB3f7Hmenx3qYBhGtTZ//7EllK66aKXW98Lx0+7Yr0kxBtIt3tzg==", + "version": "1.0.30001686", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001686.tgz", + "integrity": "sha512-Y7deg0Aergpa24M3qLC5xjNklnKnhsmSyR/V89dLZ1n0ucJIFNs7PgR2Yfa/Zf6W79SbBicgtGxZr2juHkEUIA==", "dev": true, "funding": [ { @@ -2521,6 +3305,10 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ] }, @@ -2606,6 +3394,15 @@ "node": ">= 6" } }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, "node_modules/chrome-trace-event": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", @@ -2627,6 +3424,27 @@ "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", "dev": true }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-boxes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", + "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/cli-color": { "version": "0.3.2", "resolved": "http://registry.npmjs.org/cli-color/-/cli-color-0.3.2.tgz", @@ -2663,6 +3481,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/cli-table3": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", + "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" + } + }, "node_modules/cliui": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", @@ -2726,6 +3559,15 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true, + "bin": { + "color-support": "bin.js" + } + }, "node_modules/colorette": { "version": "2.0.19", "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", @@ -2825,22 +3667,63 @@ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "node_modules/config-chain": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", "dev": true, "dependencies": { - "safe-buffer": "5.2.1" + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "node_modules/config-chain/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/configstore": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-6.0.0.tgz", + "integrity": "sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==", + "dev": true, + "dependencies": { + "dot-prop": "^6.0.1", + "graceful-fs": "^4.2.6", + "unique-string": "^3.0.0", + "write-file-atomic": "^3.0.3", + "xdg-basedir": "^5.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/yeoman/configstore?sponsor=1" + } + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "dev": true + }, + "node_modules/content-disposition": { + "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, + "dependencies": { + "safe-buffer": "5.2.1" }, "engines": { "node": ">= 0.6" } }, "node_modules/content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "engines": { "node": ">= 0.6" } @@ -2852,9 +3735,9 @@ "dev": true }, "node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", "dev": true, "engines": { "node": ">= 0.6" @@ -2929,9 +3812,9 @@ } }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, "dependencies": { "path-key": "^3.1.0", @@ -2942,6 +3825,33 @@ "node": ">= 8" } }, + "node_modules/crypto-random-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", + "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", + "dev": true, + "dependencies": { + "type-fest": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/crypto-random-string/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/cssom": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", @@ -3065,12 +3975,48 @@ "integrity": "sha512-ic1yEvwT6GuvaYwBLLY6/aFFgjZdySKTE8en/fkU3QICTmRtgtSlFn0u0BXN06InZwtfCelR7j8LRiDI/02iGA==", "dev": true }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/dedent": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", "dev": true }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -3098,6 +4044,31 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -3107,6 +4078,12 @@ "node": ">=0.4.0" } }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "dev": true + }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -3148,16 +4125,16 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, "dependencies": { - "esutils": "^2.0.2" + "path-type": "^4.0.0" }, "engines": { - "node": ">=6.0.0" + "node": ">=8" } }, "node_modules/domexception": { @@ -3182,6 +4159,21 @@ "node": ">=8" } }, + "node_modules/dot-prop": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", + "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", + "dev": true, + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", @@ -3213,9 +4205,9 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "node_modules/electron-to-chromium": { - "version": "1.4.284", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", - "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", + "version": "1.5.68", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.68.tgz", + "integrity": "sha512-FgMdJlma0OzUYlbrtZ4AeXjKxKPk6KT8WOP8BjcqxWtlg8qyJQjRzPJzUtUn5GBg1oQ26hFs7HOOHJMYiJRnvQ==", "dev": true }, "node_modules/emittery": { @@ -3237,17 +4229,40 @@ "dev": true }, "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "engines": { "node": ">= 0.8" } }, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dev": true, + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/engine.io": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.1.tgz", - "integrity": "sha512-mGqhI+D7YxS9KJMppR6Iuo37Ed3abhU8NdfgSvJSDUafQutrN+sPTncJYTyM9+tkhSmWodKtVYGPPHyXJEwEQA==", + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.2.tgz", + "integrity": "sha512-gmNvsYi9C8iErnZdVcJnvCpSKbWTt1E8+JZo8b+daLninywUWi5NQ5STSHZ9rFjFO7imNcvb8Pc5pe/wMR5xEw==", "dev": true, "dependencies": { "@types/cookie": "^0.4.1", @@ -3255,38 +4270,38 @@ "@types/node": ">=10.0.0", "accepts": "~1.3.4", "base64id": "2.0.0", - "cookie": "~0.4.1", + "cookie": "~0.7.2", "cors": "~2.8.5", "debug": "~4.3.1", - "engine.io-parser": "~5.1.0", - "ws": "~8.11.0" + "engine.io-parser": "~5.2.1", + "ws": "~8.17.1" }, "engines": { - "node": ">=10.0.0" + "node": ">=10.2.0" } }, "node_modules/engine.io-parser": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.1.0.tgz", - "integrity": "sha512-enySgNiK5tyZFynt3z7iqBR+Bto9EVVVvDFuTT0ioHCGbzirZVGDGiQjZzEp8hWl6hd5FSVytJGuScX1C1C35w==", + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", + "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", "dev": true, "engines": { "node": ">=10.0.0" } }, "node_modules/engine.io/node_modules/cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", "dev": true, "engines": { "node": ">= 0.6" } }, "node_modules/enhanced-resolve": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", - "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", "dev": true, "dependencies": { "graceful-fs": "^4.2.4", @@ -3296,6 +4311,21 @@ "node": ">=10.13.0" } }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true + }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -3305,6 +4335,25 @@ "is-arrayish": "^0.2.1" } }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-module-lexer": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz", @@ -3312,14 +4361,15 @@ "dev": true }, "node_modules/es5-ext": { - "version": "0.10.62", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", - "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", + "version": "0.10.64", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz", + "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==", "dev": true, "hasInstallScript": true, "dependencies": { "es6-iterator": "^2.0.3", "es6-symbol": "^3.1.3", + "esniff": "^2.0.1", "next-tick": "^1.1.0" }, "engines": { @@ -3416,14 +4466,26 @@ } }, "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, "engines": { "node": ">=6" } }, + "node_modules/escape-goat": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-4.0.0.tgz", + "integrity": "sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -3515,59 +4577,74 @@ } }, "node_modules/eslint": { - "version": "8.26.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.26.0.tgz", - "integrity": "sha512-kzJkpaw1Bfwheq4VXUezFriD1GxszX6dUekM7Z3aC2o4hju+tsR/XyTC3RcoSD7jmy9VkPU3+N6YjVU2e96Oyg==", - "dev": true, - "dependencies": { - "@eslint/eslintrc": "^1.3.3", - "@humanwhocodes/config-array": "^0.11.6", + "version": "9.16.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.16.0.tgz", + "integrity": "sha512-whp8mSQI4C8VXd+fLgSM0lh3UlmcFtVwUQjyKCFfsp+2ItAIYhlq/hqGahGqHE6cv9unM41VlqKk2VtKYR2TaA==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.19.0", + "@eslint/core": "^0.9.0", + "@eslint/eslintrc": "^3.2.0", + "@eslint/js": "9.16.0", + "@eslint/plugin-kit": "^0.2.3", + "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", + "@humanwhocodes/retry": "^0.4.1", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", + "cross-spawn": "^7.0.5", "debug": "^4.3.2", - "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.4.0", - "esquery": "^1.4.0", + "eslint-scope": "^8.2.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0", + "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", + "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", - "globals": "^13.15.0", - "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", - "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", - "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "regexpp": "^3.2.0", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0" + "optionator": "^0.9.3" }, "bin": { "eslint": "bin/eslint.js" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-config-prettier": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", + "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" } }, "node_modules/eslint-plugin-es": { @@ -3609,25 +4686,49 @@ "eslint": ">=5.16.0" } }, - "node_modules/eslint-plugin-promise": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz", - "integrity": "sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==", + "node_modules/eslint-plugin-prettier": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.1.tgz", + "integrity": "sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==", "dev": true, + "dependencies": { + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.9.1" + }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-plugin-prettier" }, "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "eslint-config-prettier": "*", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } } }, "node_modules/eslint-plugin-security": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-security/-/eslint-plugin-security-1.5.0.tgz", - "integrity": "sha512-hAFVwLZ/UeXrlyVD2TDarv/x00CoFVpaY0IUZhKjPjiFxqkuQVixsK4f2rxngeQOqSxi6OUjzJM/jMwKEVjJ8g==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-security/-/eslint-plugin-security-3.0.1.tgz", + "integrity": "sha512-XjVGBhtDZJfyuhIxnQ/WMm385RbX3DBu7H1J7HNNhmB2tnGxMeqVSnYv79oAj992ayvIBZghsymwkYFS6cGH4Q==", "dev": true, "dependencies": { "safe-regex": "^2.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-scope": { @@ -3677,58 +4778,31 @@ } }, "node_modules/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==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", "dev": true, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/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 - }, "node_modules/eslint/node_modules/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==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz", + "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==", "dev": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/eslint/node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" - } - }, - "node_modules/eslint/node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "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, - "engines": { - "node": ">=10" + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint/node_modules/find-up": { @@ -3747,18 +4821,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/eslint/node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -3789,29 +4851,63 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/espree": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz", - "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==", + "node_modules/esniff": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz", + "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==", "dev": true, "dependencies": { - "acorn": "^8.8.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" + "d": "^1.0.1", + "es5-ext": "^0.10.62", + "event-emitter": "^0.3.5", + "type": "^2.7.2" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=0.10" } }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "node_modules/esniff/node_modules/d": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.2.tgz", + "integrity": "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==", "dev": true, - "bin": { + "dependencies": { + "es5-ext": "^0.10.64", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/esniff/node_modules/type": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.3.tgz", + "integrity": "sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==", + "dev": true + }, + "node_modules/espree": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", + "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", + "dev": true, + "dependencies": { + "acorn": "^8.14.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" }, @@ -3820,9 +4916,9 @@ } }, "node_modules/esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dev": true, "dependencies": { "estraverse": "^5.1.0" @@ -3951,38 +5047,44 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, + "node_modules/exponential-backoff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", + "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", + "dev": true + }, "node_modules/express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.1.tgz", + "integrity": "sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==", "dev": true, "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.1", + "body-parser": "1.20.3", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.5.0", + "cookie": "0.7.1", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.2.0", + "finalhandler": "1.3.1", "fresh": "0.5.2", "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", + "merge-descriptors": "1.0.3", "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", + "path-to-regexp": "0.1.10", "proxy-addr": "~2.0.7", - "qs": "6.11.0", + "qs": "6.13.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", + "send": "0.19.0", + "serve-static": "1.16.2", "setprototypeof": "1.2.0", "statuses": "2.0.1", "type-is": "~1.6.18", @@ -4009,9 +5111,9 @@ "dev": true }, "node_modules/express/node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", + "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==", "dev": true }, "node_modules/ext": { @@ -4056,6 +5158,40 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/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, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -4068,6 +5204,12 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, + "node_modules/fast-memoize": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/fast-memoize/-/fast-memoize-2.5.2.tgz", + "integrity": "sha512-Ue0LwpDYErFbmNnZSF0UH6eImUwDmogUO1jyE+JbN2gsQz/jICm1Ve7t9QT0rNSsfJt+Hs4/S3GnsDVjL4HVrw==", + "dev": true + }, "node_modules/fast-safe-stringify": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", @@ -4081,9 +5223,9 @@ "dev": true }, "node_modules/fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", "dev": true, "dependencies": { "reusify": "^1.0.4" @@ -4099,21 +5241,21 @@ } }, "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dev": true, "dependencies": { - "flat-cache": "^3.0.4" + "flat-cache": "^4.0.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=16.0.0" } }, "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "dependencies": { "to-regex-range": "^5.0.1" @@ -4123,13 +5265,13 @@ } }, "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", "dev": true, "dependencies": { "debug": "2.6.9", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "on-finished": "2.4.1", "parseurl": "~1.3.3", @@ -4169,22 +5311,22 @@ } }, "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, "dependencies": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" + "flatted": "^3.2.9", + "keyv": "^4.5.4" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=16" } }, "node_modules/flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", + "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", "dev": true }, "node_modules/foreground-child": { @@ -4238,6 +5380,15 @@ "node": ">= 6" } }, + "node_modules/form-data-encoder": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", + "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", + "dev": true, + "engines": { + "node": ">= 14.17" + } + }, "node_modules/formidable": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.6.tgz", @@ -4257,6 +5408,15 @@ "node": ">= 0.6" } }, + "node_modules/fp-and-or": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/fp-and-or/-/fp-and-or-0.1.4.tgz", + "integrity": "sha512-+yRYRhpnFPWXSly/6V4Lw9IfOV26uu30kynGJ03PW+MnjOEQe45RZ141QcS0aJehYBYA50GfCDnsRbFJdhssRw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, "node_modules/fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", @@ -4265,6 +5425,18 @@ "node": ">= 0.6" } }, + "node_modules/fs-minipass": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", + "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", + "dev": true, + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/fs-monkey": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", @@ -4292,9 +5464,32 @@ } }, "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gauge": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "deprecated": "This package is no longer supported.", + "dev": true, + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } }, "node_modules/gensync": { "version": "1.0.0-beta.2", @@ -4315,13 +5510,18 @@ } }, "node_modules/get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4336,6 +5536,18 @@ "node": ">=8.0.0" } }, + "node_modules/get-stdin": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", + "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/get-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", @@ -4395,33 +5607,104 @@ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", "dev": true }, + "node_modules/global-dirs": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", + "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", + "dev": true, + "dependencies": { + "ini": "2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/global-dirs/node_modules/ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, "node_modules/globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, "dependencies": { - "type-fest": "^0.20.2" + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/got": { + "version": "12.6.1", + "resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz", + "integrity": "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==", + "dev": true, + "dependencies": { + "@sindresorhus/is": "^5.2.0", + "@szmarczak/http-timer": "^5.0.1", + "cacheable-lookup": "^7.0.0", + "cacheable-request": "^10.2.8", + "decompress-response": "^6.0.0", + "form-data-encoder": "^2.1.2", + "get-stream": "^6.0.1", + "http2-wrapper": "^2.1.10", + "lowercase-keys": "^3.0.0", + "p-cancelable": "^3.0.0", + "responselike": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, "node_modules/graceful-fs": { "version": "4.2.10", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", "dev": true }, - "node_modules/grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true - }, "node_modules/handle-thing": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", @@ -4455,6 +5738,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, "dependencies": { "function-bind": "^1.1.1" }, @@ -4471,10 +5755,35 @@ "node": ">=8" } }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.1.0.tgz", + "integrity": "sha512-QLdzI9IIO1Jg7f9GT1gXpPpXArAn6cS31R1eEZqz08Gc+uQ8/XiqHWt17Fiw+2p6oTTIq5GXEpQkAlA88YRl/Q==", + "dependencies": { + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "engines": { "node": ">= 0.4" }, @@ -4482,6 +5791,35 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "dev": true + }, + "node_modules/has-yarn": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-3.0.0.tgz", + "integrity": "sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/hexoid": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", @@ -4491,6 +5829,27 @@ "node": ">=8" } }, + "node_modules/hosted-git-info": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.2.1.tgz", + "integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==", + "dev": true, + "dependencies": { + "lru-cache": "^7.5.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, "node_modules/hpack.js": { "version": "2.1.6", "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", @@ -4551,6 +5910,12 @@ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "dev": true + }, "node_modules/http-deceiver": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", @@ -4601,6 +5966,19 @@ "npm": ">=1.3.7" } }, + "node_modules/http2-wrapper": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", + "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==", + "dev": true, + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.2.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, "node_modules/https-proxy-agent": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", @@ -4623,6 +6001,15 @@ "node": ">=10.17.0" } }, + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "dev": true, + "dependencies": { + "ms": "^2.0.0" + } + }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -4669,6 +6056,42 @@ "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=", "dev": true }, + "node_modules/ignore-walk": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.5.tgz", + "integrity": "sha512-VuuG0wCnjhnylG1ABXT3dAuIpTNDs/G8jlpmwXY03fXoXy/8ZK8/T+hMzt8L4WnrLCJgdybqgPagnF/f97cg3A==", + "dev": true, + "dependencies": { + "minimatch": "^9.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/ignore-walk/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/ignore-walk/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", @@ -4694,9 +6117,18 @@ "node": ">=4" } }, - "node_modules/import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "node_modules/import-lazy": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", + "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", "dev": true, "dependencies": { @@ -4722,6 +6154,21 @@ "node": ">=0.8.19" } }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true + }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -4737,6 +6184,40 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, + "node_modules/ini": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.3.tgz", + "integrity": "sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/ip-address": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "dev": true, + "dependencies": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/ip-address/node_modules/jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", + "dev": true + }, + "node_modules/ip-address/node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "dev": true + }, "node_modules/ipaddr.js": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", @@ -4764,6 +6245,18 @@ "node": ">=8" } }, + "node_modules/is-ci": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", + "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", + "dev": true, + "dependencies": { + "ci-info": "^3.2.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, "node_modules/is-core-module": { "version": "2.11.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", @@ -4815,6 +6308,22 @@ "node": ">=0.10.0" } }, + "node_modules/is-installed-globally": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "dev": true, + "dependencies": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-interactive": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", @@ -4824,6 +6333,24 @@ "node": ">=8" } }, + "node_modules/is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", + "dev": true + }, + "node_modules/is-npm": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-6.0.0.tgz", + "integrity": "sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -4833,6 +6360,15 @@ "node": ">=0.12.0" } }, + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", @@ -4878,6 +6414,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-yarn-global": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.4.1.tgz", + "integrity": "sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==", + "dev": true, + "engines": { + "node": ">=12" + } + }, "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -5625,10 +7170,10 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/js-sdsl": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.5.tgz", - "integrity": "sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q==", + "node_modules/jju": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", + "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==", "dev": true }, "node_modules/js-tokens": { @@ -5767,9 +7312,9 @@ } }, "node_modules/jsdom/node_modules/ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, "engines": { "node": ">=8.3.0" @@ -5799,12 +7344,27 @@ "node": ">=4" } }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true }, + "node_modules/json-parse-helpfulerror": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/json-parse-helpfulerror/-/json-parse-helpfulerror-1.0.3.tgz", + "integrity": "sha512-XgP0FGR77+QhUxjXkwOMkC94k3WtqEBfcnjWqhRd82qTat4SWKRE+9kUnynz/shm3I4ea2+qISvTIeGTNU7kJg==", + "dev": true, + "dependencies": { + "jju": "^1.1.0" + } + }, "node_modules/json-schema": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", @@ -5841,6 +7401,21 @@ "node": ">=6" } }, + "node_modules/jsonlines": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsonlines/-/jsonlines-0.1.1.tgz", + "integrity": "sha512-ekDrAGso79Cvf+dtm+mL8OBI2bmAOt3gssYs833De/C9NmIpWDWyUO4zPgB5x2/OhY366dkhgfPMYfwZF7yOZA==", + "dev": true + }, + "node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "dev": true, + "engines": [ + "node >= 0.2.0" + ] + }, "node_modules/jsonwebtoken": { "version": "8.5.1", "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", @@ -5864,9 +7439,9 @@ } }, "node_modules/jsonwebtoken/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "bin": { "semver": "bin/semver" @@ -5908,6 +7483,15 @@ "safe-buffer": "^5.0.1" } }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, "node_modules/kleur": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", @@ -5916,6 +7500,21 @@ "node": ">=6" } }, + "node_modules/latest-version": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-7.0.0.tgz", + "integrity": "sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==", + "dev": true, + "dependencies": { + "package-json": "^8.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/lcov-parse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-1.0.0.tgz", @@ -6058,6 +7657,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lowercase-keys": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", + "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -6094,6 +7705,73 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/make-fetch-happen": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", + "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", + "dev": true, + "dependencies": { + "agentkeepalive": "^4.2.1", + "cacache": "^17.0.0", + "http-cache-semantics": "^4.1.1", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^5.0.0", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^10.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/make-fetch-happen/node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/make-fetch-happen/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/make-fetch-happen/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/makeerror": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", @@ -6145,10 +7823,13 @@ "dev": true }, "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", - "dev": true + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/merge-stream": { "version": "2.0.0", @@ -6156,6 +7837,15 @@ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, "node_modules/methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", @@ -6166,12 +7856,12 @@ } }, "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "dependencies": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { @@ -6217,6 +7907,18 @@ "node": ">=6" } }, + "node_modules/mimic-response": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", + "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", @@ -6253,77 +7955,237 @@ "node": ">=16 || 14 >=14.17" } }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "node_modules/minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", "dev": true, - "bin": { - "mkdirp": "bin/cmd.js" + "dependencies": { + "minipass": "^3.0.0" }, "engines": { - "node": ">=10" + "node": ">= 8" } }, - "node_modules/moleculer": { - "version": "0.15.0-beta1", - "resolved": "https://registry.npmjs.org/moleculer/-/moleculer-0.15.0-beta1.tgz", - "integrity": "sha512-b9nMMifxr0O5jaM+OicxODb8dKAKjy47NdXPvTnQIqA6iFuSdHxM5KsHWFdCR4Gd0UOnDMvgk4QS40DRNrlVKg==", + "node_modules/minipass-collect/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, "dependencies": { - "args": "^5.0.3", - "eventemitter2": "^6.4.9", - "fastest-validator": "^1.18.0", - "glob": "^10.3.12", - "ipaddr.js": "^2.2.0", - "kleur": "^4.1.5", - "lodash": "^4.17.21", - "lru-cache": "^10.2.1", - "recursive-watch": "^1.1.4" + "yallist": "^4.0.0" }, - "bin": { - "moleculer-runner": "bin/moleculer-runner.js", - "moleculer-runner-esm": "bin/moleculer-runner.mjs" + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-fetch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.5.tgz", + "integrity": "sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==", + "dev": true, + "dependencies": { + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" }, "engines": { - "node": ">= 18.x.x" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" }, - "funding": { - "url": "https://github.com/moleculerjs/moleculer?sponsor=1" + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" }, - "peerDependencies": { - "amqplib": "^0.10.0", - "bunyan": "^1.0.0", - "cbor-x": "^1.2.0", - "dd-trace": "^4.20.0", - "debug": "^4.0.0", - "etcd3": "^1.0.0", - "ioredis": "^5.0.0", - "jaeger-client": "^3.0.0", - "kafkajs": "^2.2.4", - "log4js": "^6.0.0", - "mqtt": "^5.0.0", - "msgpack5": "^6.0.0", - "nats": "^2.0.0", - "notepack.io": "^2.0.0", - "pino": "^7.0.0", - "redlock": "^4.0.0", - "rhea-promise": "^2.0.0", - "winston": "^3.0.0" + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-flush/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" }, - "peerDependenciesMeta": { - "amqplib": { - "optional": true - }, - "bunyan": { - "optional": true - }, - "cbor-x": { - "optional": true - }, - "dd-trace": { - "optional": true - }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-json-stream": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.2.tgz", + "integrity": "sha512-myxeeTm57lYs8pH2nxPzmEEg8DGIgW+9mv6D4JZD2pa81I/OBjeU7PtICXV6c9eRGTA5JMDsuIPUZRCyBMYNhg==", + "dev": true, + "dependencies": { + "jsonparse": "^1.3.1", + "minipass": "^3.0.0" + } + }, + "node_modules/minipass-json-stream/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/moleculer": { + "version": "0.15.0-beta1", + "resolved": "https://registry.npmjs.org/moleculer/-/moleculer-0.15.0-beta1.tgz", + "integrity": "sha512-b9nMMifxr0O5jaM+OicxODb8dKAKjy47NdXPvTnQIqA6iFuSdHxM5KsHWFdCR4Gd0UOnDMvgk4QS40DRNrlVKg==", + "dev": true, + "dependencies": { + "args": "^5.0.3", + "eventemitter2": "^6.4.9", + "fastest-validator": "^1.18.0", + "glob": "^10.3.12", + "ipaddr.js": "^2.2.0", + "kleur": "^4.1.5", + "lodash": "^4.17.21", + "lru-cache": "^10.2.1", + "recursive-watch": "^1.1.4" + }, + "bin": { + "moleculer-runner": "bin/moleculer-runner.js", + "moleculer-runner-esm": "bin/moleculer-runner.mjs" + }, + "engines": { + "node": ">= 18.x.x" + }, + "funding": { + "url": "https://github.com/moleculerjs/moleculer?sponsor=1" + }, + "peerDependencies": { + "amqplib": "^0.10.0", + "bunyan": "^1.0.0", + "cbor-x": "^1.2.0", + "dd-trace": "^4.20.0", + "debug": "^4.0.0", + "etcd3": "^1.0.0", + "ioredis": "^5.0.0", + "jaeger-client": "^3.0.0", + "kafkajs": "^2.2.4", + "log4js": "^6.0.0", + "mqtt": "^5.0.0", + "msgpack5": "^6.0.0", + "nats": "^2.0.0", + "notepack.io": "^2.0.0", + "pino": "^7.0.0", + "redlock": "^4.0.0", + "rhea-promise": "^2.0.0", + "winston": "^3.0.0" + }, + "peerDependenciesMeta": { + "amqplib": { + "optional": true + }, + "bunyan": { + "optional": true + }, + "cbor-x": { + "optional": true + }, + "dd-trace": { + "optional": true + }, "debug": { "optional": true }, @@ -6430,168 +8292,901 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mri": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.1.4.tgz", + "integrity": "sha512-6y7IjGPm8AzlvoUrwAaw1tLnUBudaS3752vcd8JtrpGGQn+rXIe63LFVHm/YMwtqAuh+LJPCFdlLYPWM1nYn6w==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/nats": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/nats/-/nats-2.9.0.tgz", + "integrity": "sha512-UBZg0ydCVs4vTp7sFWkmXWmV4oebt6vVRpFUgp+HUMhzjWyvcrBHq0t6hogIHnT5BYilIo0/koDH5FWzhBtSOQ==", + "dev": true, + "dependencies": { + "nkeys.js": "1.0.3", + "web-streams-polyfill": "^3.2.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node_modules/next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", + "dev": true + }, + "node_modules/nkeys.js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/nkeys.js/-/nkeys.js-1.0.3.tgz", + "integrity": "sha512-p5Bpb/acPaQmCrbe4gNmMBY/naZJV8Q7m2B9UkXT8BQRC6wjX8zqD2ya8eZu9mpSXQffodV46HCP9OckmxcwYA==", + "dev": true, + "dependencies": { + "tweetnacl": "1.0.3" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/nkeys.js/node_modules/tweetnacl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", + "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==", + "dev": true + }, + "node_modules/node-gyp": { + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.1.tgz", + "integrity": "sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ==", + "dev": true, + "dependencies": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^10.0.3", + "nopt": "^6.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^12.13 || ^14.13 || >=16" + } + }, + "node_modules/node-gyp/node_modules/@npmcli/fs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", + "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", + "dev": true, + "dependencies": { + "@gar/promisify": "^1.1.3", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/node-gyp/node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/node-gyp/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/node-gyp/node_modules/cacache": { + "version": "16.1.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", + "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", + "dev": true, + "dependencies": { + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", + "infer-owner": "^1.0.4", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11", + "unique-filename": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/node-gyp/node_modules/cacache/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/node-gyp/node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/node-gyp/node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/node-gyp/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/node-gyp/node_modules/make-fetch-happen": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", + "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", + "dev": true, + "dependencies": { + "agentkeepalive": "^4.2.1", + "cacache": "^16.1.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^2.0.3", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^9.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/node-gyp/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-gyp/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/node-gyp/node_modules/minipass-fetch": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", + "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", + "dev": true, + "dependencies": { + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/node-gyp/node_modules/nopt": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", + "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", + "dev": true, + "dependencies": { + "abbrev": "^1.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/node-gyp/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-gyp/node_modules/ssri": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", + "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", + "dev": true, + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/node-gyp/node_modules/unique-filename": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", + "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", + "dev": true, + "dependencies": { + "unique-slug": "^3.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/node-gyp/node_modules/unique-slug": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", + "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", + "dev": true + }, + "node_modules/nodemon": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.20.tgz", + "integrity": "sha512-Km2mWHKKY5GzRg6i1j5OxOHQtuvVsgskLfigG25yTtbyfRGn/GNvIbRyOf1PSCKJ2aT/58TiuUsuOU5UToVViw==", + "dev": true, + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^3.2.7", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^5.7.1", + "simple-update-notifier": "^1.0.7", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=8.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/nodemon/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/nodemon/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/normalize-package-data": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-5.0.0.tgz", + "integrity": "sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==", + "dev": true, + "dependencies": { + "hosted-git-info": "^6.0.0", + "is-core-module": "^2.8.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/normalize-package-data/node_modules/hosted-git-info": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.3.tgz", + "integrity": "sha512-HVJyzUrLIL1c0QmviVh5E8VGyUS7xCFPS6yydaVd1UegW+ibV/CohqTH9MkOLDp5o+rb82DMo77PTuc9F/8GKw==", + "dev": true, + "dependencies": { + "lru-cache": "^7.5.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/normalize-package-data/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.1.tgz", + "integrity": "sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-bundled": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.1.tgz", + "integrity": "sha512-+AvaheE/ww1JEwRHOrn4WHNzOxGtVp+adrg2AeZS/7KuxGUYFuBta98wYpfHBbJp6Tg6j1NKSEVHNcfZzJHQwQ==", + "dev": true, + "dependencies": { + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-check-updates": { + "version": "16.14.20", + "resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-16.14.20.tgz", + "integrity": "sha512-sYbIhun4DrjO7NFOTdvs11nCar0etEhZTsEjL47eM0TuiGMhmYughRCxG2SpGRmGAQ7AkwN7bw2lWzoE7q6yOQ==", + "dev": true, + "dependencies": { + "@types/semver-utils": "^1.1.1", + "chalk": "^5.3.0", + "cli-table3": "^0.6.3", + "commander": "^10.0.1", + "fast-memoize": "^2.5.2", + "find-up": "5.0.0", + "fp-and-or": "^0.1.4", + "get-stdin": "^8.0.0", + "globby": "^11.0.4", + "hosted-git-info": "^5.1.0", + "ini": "^4.1.1", + "js-yaml": "^4.1.0", + "json-parse-helpfulerror": "^1.0.3", + "jsonlines": "^0.1.1", + "lodash": "^4.17.21", + "make-fetch-happen": "^11.1.1", + "minimatch": "^9.0.3", + "p-map": "^4.0.0", + "pacote": "15.2.0", + "parse-github-url": "^1.0.2", + "progress": "^2.0.3", + "prompts-ncu": "^3.0.0", + "rc-config-loader": "^4.1.3", + "remote-git-tags": "^3.0.0", + "rimraf": "^5.0.5", + "semver": "^7.5.4", + "semver-utils": "^1.1.4", + "source-map-support": "^0.5.21", + "spawn-please": "^2.0.2", + "strip-ansi": "^7.1.0", + "strip-json-comments": "^5.0.1", + "untildify": "^4.0.0", + "update-notifier": "^6.0.2" + }, + "bin": { + "ncu": "build/src/bin/cli.js", + "npm-check-updates": "build/src/bin/cli.js" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/npm-check-updates/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/npm-check-updates/node_modules/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 + }, + "node_modules/npm-check-updates/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/npm-check-updates/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/npm-check-updates/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/npm-check-updates/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-check-updates/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm-check-updates/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/npm-check-updates/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-check-updates/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm-check-updates/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-check-updates/node_modules/rimraf": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz", + "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==", + "dev": true, + "dependencies": { + "glob": "^10.3.7" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm-check-updates/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm-check-updates/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/npm-check-updates/node_modules/strip-json-comments": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-5.0.1.tgz", + "integrity": "sha512-0fk9zBqO67Nq5M/m45qHCJxylV/DhBlIOVExqgOMiCCrzrhU6tCibRXNqE3jwJLftzE9SNuZtYbpzcO+i9FiKw==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-install-checks": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.3.0.tgz", + "integrity": "sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==", + "dev": true, + "dependencies": { + "semver": "^7.1.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-install-checks/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=10" } }, - "node_modules/mri": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.1.4.tgz", - "integrity": "sha512-6y7IjGPm8AzlvoUrwAaw1tLnUBudaS3752vcd8JtrpGGQn+rXIe63LFVHm/YMwtqAuh+LJPCFdlLYPWM1nYn6w==", + "node_modules/npm-normalize-package-bin": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", + "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", "dev": true, "engines": { - "node": ">=4" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/nats": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/nats/-/nats-2.9.0.tgz", - "integrity": "sha512-UBZg0ydCVs4vTp7sFWkmXWmV4oebt6vVRpFUgp+HUMhzjWyvcrBHq0t6hogIHnT5BYilIo0/koDH5FWzhBtSOQ==", + "node_modules/npm-package-arg": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-10.1.0.tgz", + "integrity": "sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==", "dev": true, "dependencies": { - "nkeys.js": "1.0.3", - "web-streams-polyfill": "^3.2.1" + "hosted-git-info": "^6.0.0", + "proc-log": "^3.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" }, "engines": { - "node": ">= 14.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "node_modules/npm-package-arg/node_modules/hosted-git-info": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.3.tgz", + "integrity": "sha512-HVJyzUrLIL1c0QmviVh5E8VGyUS7xCFPS6yydaVd1UegW+ibV/CohqTH9MkOLDp5o+rb82DMo77PTuc9F/8GKw==", "dev": true, + "dependencies": { + "lru-cache": "^7.5.1" + }, "engines": { - "node": ">= 0.6" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "node_modules/next-tick": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", - "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", - "dev": true + "node_modules/npm-package-arg/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } }, - "node_modules/nkeys.js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/nkeys.js/-/nkeys.js-1.0.3.tgz", - "integrity": "sha512-p5Bpb/acPaQmCrbe4gNmMBY/naZJV8Q7m2B9UkXT8BQRC6wjX8zqD2ya8eZu9mpSXQffodV46HCP9OckmxcwYA==", + "node_modules/npm-package-arg/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, - "dependencies": { - "tweetnacl": "1.0.3" + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": ">=10.0.0" + "node": ">=10" } }, - "node_modules/nkeys.js/node_modules/tweetnacl": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", - "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==", - "dev": true - }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", - "dev": true - }, - "node_modules/node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", - "dev": true - }, - "node_modules/nodemon": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.20.tgz", - "integrity": "sha512-Km2mWHKKY5GzRg6i1j5OxOHQtuvVsgskLfigG25yTtbyfRGn/GNvIbRyOf1PSCKJ2aT/58TiuUsuOU5UToVViw==", + "node_modules/npm-packlist": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-7.0.4.tgz", + "integrity": "sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q==", "dev": true, "dependencies": { - "chokidar": "^3.5.2", - "debug": "^3.2.7", - "ignore-by-default": "^1.0.1", - "minimatch": "^3.1.2", - "pstree.remy": "^1.1.8", - "semver": "^5.7.1", - "simple-update-notifier": "^1.0.7", - "supports-color": "^5.5.0", - "touch": "^3.1.0", - "undefsafe": "^2.0.5" - }, - "bin": { - "nodemon": "bin/nodemon.js" + "ignore-walk": "^6.0.0" }, "engines": { - "node": ">=8.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/nodemon" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/nodemon/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "node_modules/npm-pick-manifest": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-8.0.2.tgz", + "integrity": "sha512-1dKY+86/AIiq1tkKVD3l0WI+Gd3vkknVGAggsFeBkTvbhMQ1OND/LKkYv4JtXPKUJ8bOTCyLiqEg2P6QNdK+Gg==", "dev": true, "dependencies": { - "ms": "^2.1.1" + "npm-install-checks": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0", + "npm-package-arg": "^10.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/nodemon/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "node_modules/npm-pick-manifest/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, "bin": { - "semver": "bin/semver" + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, - "node_modules/nopt": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", - "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", + "node_modules/npm-registry-fetch": { + "version": "14.0.5", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-14.0.5.tgz", + "integrity": "sha512-kIDMIo4aBm6xg7jOttupWZamsZRkAqMqwqqbVXnUqstY5+tapvv6bkH/qMR76jdgV+YljEUCyWx3hRYMrJiAgA==", "dev": true, "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" + "make-fetch-happen": "^11.0.0", + "minipass": "^5.0.0", + "minipass-fetch": "^3.0.0", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.1.2", + "npm-package-arg": "^10.0.0", + "proc-log": "^3.0.0" }, "engines": { - "node": "*" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "node_modules/npm-registry-fetch/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/npm-run-path": { @@ -6606,6 +9201,22 @@ "node": ">=8" } }, + "node_modules/npmlog": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "deprecated": "This package is no longer supported.", + "dev": true, + "dependencies": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, "node_modules/nwsapi": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.2.tgz", @@ -6631,9 +9242,12 @@ } }, "node_modules/object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", + "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -6689,9 +9303,9 @@ } }, "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, "dependencies": { "deep-is": "^0.1.3", @@ -6699,7 +9313,7 @@ "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", - "word-wrap": "^1.2.3" + "word-wrap": "^1.2.5" }, "engines": { "node": ">= 0.8.0" @@ -6728,6 +9342,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/p-cancelable": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", + "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", + "dev": true, + "engines": { + "node": ">=12.20" + } + }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -6770,6 +9393,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", @@ -6779,12 +9417,83 @@ "node": ">=6" } }, + "node_modules/package-json": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-8.1.1.tgz", + "integrity": "sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==", + "dev": true, + "dependencies": { + "got": "^12.1.0", + "registry-auth-token": "^5.0.1", + "registry-url": "^6.0.0", + "semver": "^7.3.7" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/package-json-from-dist": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", "dev": true }, + "node_modules/package-json/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/pacote": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-15.2.0.tgz", + "integrity": "sha512-rJVZeIwHTUta23sIZgEIM62WYwbmGbThdbnkt81ravBplQv+HjyroqnLRNH2+sLJHcGZmLRmhPwACqhfTcOmnA==", + "dev": true, + "dependencies": { + "@npmcli/git": "^4.0.0", + "@npmcli/installed-package-contents": "^2.0.1", + "@npmcli/promise-spawn": "^6.0.1", + "@npmcli/run-script": "^6.0.0", + "cacache": "^17.0.0", + "fs-minipass": "^3.0.0", + "minipass": "^5.0.0", + "npm-package-arg": "^10.0.0", + "npm-packlist": "^7.0.0", + "npm-pick-manifest": "^8.0.0", + "npm-registry-fetch": "^14.0.0", + "proc-log": "^3.0.0", + "promise-retry": "^2.0.1", + "read-package-json": "^6.0.0", + "read-package-json-fast": "^3.0.0", + "sigstore": "^1.3.0", + "ssri": "^10.0.0", + "tar": "^6.1.11" + }, + "bin": { + "pacote": "lib/bin.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/pacote/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -6797,6 +9506,18 @@ "node": ">=6" } }, + "node_modules/parse-github-url": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/parse-github-url/-/parse-github-url-1.0.3.tgz", + "integrity": "sha512-tfalY5/4SqGaV/GIGzWyHnFjlpTPTNpENR9Ea2lLldSJ8EWXMsvacWucqY3m3I4YPtas15IxTLQVQ5NSYXPrww==", + "dev": true, + "bin": { + "parse-github-url": "cli.js" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", @@ -6889,6 +9610,15 @@ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.2.0.tgz", "integrity": "sha512-jczvQbCUS7XmS7o+y1aEO9OBVFeZBQ1MDSEqmO7xSoPgOPoowY/SxLpZ6Vh97/8qHZOteiCKb7gkG9gA2ZUxJA==" }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", @@ -6896,9 +9626,9 @@ "dev": true }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "dev": true }, "node_modules/picomatch": { @@ -6943,6 +9673,33 @@ "node": ">= 0.8.0" } }, + "node_modules/prettier": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.4.2.tgz", + "integrity": "sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/pretty-bytes": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", @@ -6969,24 +9726,61 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/proc-log": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", + "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/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 + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", + "dev": true + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", "dev": true, + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/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 - }, "node_modules/prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", @@ -7000,6 +9794,19 @@ "node": ">= 6" } }, + "node_modules/prompts-ncu": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/prompts-ncu/-/prompts-ncu-3.0.1.tgz", + "integrity": "sha512-2OjeOtQciLYeNPIXCLDxw2CdwlpnTcxKLtc/5iDJ6usMiOzj77FcLjGwx2qQ3+VerLsilzCnGntDeYBp06OZsQ==", + "dev": true, + "dependencies": { + "kleur": "^4.0.1", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/prompts/node_modules/kleur": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", @@ -7009,6 +9816,12 @@ "node": ">=6" } }, + "node_modules/proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", + "dev": true + }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -7052,12 +9865,27 @@ "node": ">=6" } }, + "node_modules/pupa": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-3.1.0.tgz", + "integrity": "sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==", + "dev": true, + "dependencies": { + "escape-goat": "^4.0.0" + }, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", "dependencies": { - "side-channel": "^1.0.4" + "side-channel": "^1.0.6" }, "engines": { "node": ">=0.6" @@ -7092,6 +9920,18 @@ } ] }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -7110,9 +9950,9 @@ } }, "node_modules/raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", @@ -7123,12 +9963,163 @@ "node": ">= 0.8" } }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc-config-loader": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/rc-config-loader/-/rc-config-loader-4.1.3.tgz", + "integrity": "sha512-kD7FqML7l800i6pS6pvLyIE2ncbk9Du8Q0gp/4hMPhJU6ZxApkoLcGD8ZeqgiAlfwZ6BlETq6qqe+12DUL207w==", + "dev": true, + "dependencies": { + "debug": "^4.3.4", + "js-yaml": "^4.1.0", + "json5": "^2.2.2", + "require-from-string": "^2.0.2" + } + }, + "node_modules/rc-config-loader/node_modules/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 + }, + "node_modules/rc-config-loader/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/rc/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/react-is": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", "dev": true }, + "node_modules/read-package-json": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-6.0.4.tgz", + "integrity": "sha512-AEtWXYfopBj2z5N5PbkAOeNHRPUg5q+Nen7QLxV8M2zJq1ym6/lCz3fYNTCXe19puu2d06jfHhrP7v/S2PtMMw==", + "deprecated": "This package is no longer supported. Please use @npmcli/package-json instead.", + "dev": true, + "dependencies": { + "glob": "^10.2.2", + "json-parse-even-better-errors": "^3.0.0", + "normalize-package-data": "^5.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/read-package-json-fast": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz", + "integrity": "sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==", + "dev": true, + "dependencies": { + "json-parse-even-better-errors": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/read-package-json-fast/node_modules/json-parse-even-better-errors": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz", + "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/read-package-json/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/read-package-json/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/read-package-json/node_modules/json-parse-even-better-errors": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz", + "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/read-package-json/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/readable-stream": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", @@ -7188,6 +10179,42 @@ "url": "https://github.com/sponsors/mysticatea" } }, + "node_modules/registry-auth-token": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.3.tgz", + "integrity": "sha512-1bpc9IyC+e+CNFRaWyn77tk4xGG4PPUyfakSmA6F6cvUDjrm58dfyJ3II+9yb10EDkHoy1LaPSmHaWLOH3m6HA==", + "dev": true, + "dependencies": { + "@pnpm/npm-conf": "^2.1.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/registry-url": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-6.0.1.tgz", + "integrity": "sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==", + "dev": true, + "dependencies": { + "rc": "1.2.8" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/remote-git-tags": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/remote-git-tags/-/remote-git-tags-3.0.0.tgz", + "integrity": "sha512-C9hAO4eoEsX+OXA4rla66pXZQ+TLQ8T9dttgQj18yuKlPMTVkIkdYXvlMC55IuUsIkV6DpmQYi10JKFLaU+l7w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/request": { "version": "2.88.2", "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", @@ -7284,6 +10311,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "dev": true + }, "node_modules/resolve-cwd": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", @@ -7314,6 +10347,21 @@ "node": ">=10" } }, + "node_modules/responselike": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", + "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", + "dev": true, + "dependencies": { + "lowercase-keys": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/restore-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", @@ -7327,6 +10375,15 @@ "node": ">=8" } }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -7446,18 +10503,51 @@ "dev": true }, "node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/semver-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz", + "integrity": "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==", + "dev": true, + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semver-diff/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, "bin": { "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, + "node_modules/semver-utils": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/semver-utils/-/semver-utils-1.1.4.tgz", + "integrity": "sha512-EjnoLE5OGmDAVV/8YDoN5KiajNadjzIp9BAHOhYeQHt7j0UWxjmgsx4YD48wp4Ue1Qogq38F1GNUJNqF1kKKxA==", + "dev": true + }, "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", "dependencies": { "debug": "2.6.9", "depd": "2.0.0", @@ -7490,29 +10580,59 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/serialize-javascript": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", - "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "dev": true, "dependencies": { "randombytes": "^2.1.0" } }, "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", "dependencies": { - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.18.0" + "send": "0.19.0" }, "engines": { "node": ">= 0.8.0" } }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -7540,13 +10660,17 @@ } }, "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -7558,10 +10682,29 @@ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, + "node_modules/sigstore": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-1.9.0.tgz", + "integrity": "sha512-0Zjz0oe37d08VeOtBIuB6cRriqXse2e8w+7yIy2XSXjshRKxbc2KkhXjL229jXSxEm7UbcjS76wcJDGQddVI9A==", + "dev": true, + "dependencies": { + "@sigstore/bundle": "^1.1.0", + "@sigstore/protobuf-specs": "^0.2.0", + "@sigstore/sign": "^1.0.0", + "@sigstore/tuf": "^1.0.3", + "make-fetch-happen": "^11.0.1" + }, + "bin": { + "sigstore": "bin/sigstore.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/simple-update-notifier": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.0.7.tgz", - "integrity": "sha512-BBKgR84BJQJm6WjWFMHgLVuo61FBDSj1z/xSFUIozqO6wO7ii0JxCqlIud7Enr/+LhlbNI0whErq96P2qHNWew==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz", + "integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==", "dev": true, "dependencies": { "semver": "~7.0.0" @@ -7611,31 +10754,42 @@ "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true, + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, "node_modules/socket.io": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.1.tgz", - "integrity": "sha512-W+utHys2w//dhFjy7iQQu9sGd3eokCjGbl2r59tyLqNiJJBdIebn3GAKEXBr3osqHTObJi2die/25bCx2zsaaw==", + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.8.1.tgz", + "integrity": "sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg==", "dev": true, "dependencies": { "accepts": "~1.3.4", "base64id": "~2.0.0", "cors": "~2.8.5", "debug": "~4.3.2", - "engine.io": "~6.5.0", + "engine.io": "~6.6.0", "socket.io-adapter": "~2.5.2", "socket.io-parser": "~4.2.4" }, "engines": { - "node": ">=10.0.0" + "node": ">=10.2.0" } }, "node_modules/socket.io-adapter": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.2.tgz", - "integrity": "sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==", + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz", + "integrity": "sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==", "dev": true, "dependencies": { - "ws": "~8.11.0" + "debug": "~4.3.4", + "ws": "~8.17.1" } }, "node_modules/socket.io-parser": { @@ -7651,6 +10805,34 @@ "node": ">=10.0.0" } }, + "node_modules/socks": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", + "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", + "dev": true, + "dependencies": { + "ip-address": "^9.0.5", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", + "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", + "dev": true, + "dependencies": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + }, + "engines": { + "node": ">= 10" + } + }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -7670,6 +10852,50 @@ "source-map": "^0.6.0" } }, + "node_modules/spawn-please": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/spawn-please/-/spawn-please-2.0.2.tgz", + "integrity": "sha512-KM8coezO6ISQ89c1BzyWNtcn2V2kAVtwIXd3cN/V5a0xPYc1F/vydrRc01wsKFEQ/p+V1a4sw4z2yMITIXrgGw==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.20", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz", + "integrity": "sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==", + "dev": true + }, "node_modules/spdy": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", @@ -7731,6 +10957,18 @@ "node": ">=0.10.0" } }, + "node_modules/ssri": { + "version": "10.0.6", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.6.tgz", + "integrity": "sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==", + "dev": true, + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/stack-utils": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz", @@ -8025,6 +11263,22 @@ "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", "dev": true }, + "node_modules/synckit": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.2.tgz", + "integrity": "sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==", + "dev": true, + "dependencies": { + "@pkgr/core": "^0.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, "node_modules/table": { "version": "6.8.1", "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", @@ -8072,6 +11326,56 @@ "node": ">=6" } }, + "node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "dev": true, + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/terminal-link": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", @@ -8089,9 +11393,9 @@ } }, "node_modules/terser": { - "version": "5.19.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.0.tgz", - "integrity": "sha512-JpcpGOQLOXm2jsomozdMDpd5f8ZHh1rR48OFgWUH3QsyZcfPgv2qDCYbcDEAYNd4OZRj2bWYKpwdll/udZCk/Q==", + "version": "5.36.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.36.0.tgz", + "integrity": "sha512-IYV9eNMuFAV4THUspIRXkLakHnV6XO7FEdtKjf/mDyrnqUg9LnlOn6/RwRvM9SZjR4GUq8Nk8zj67FzVARr74w==", "dev": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", @@ -8107,16 +11411,16 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.9", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", - "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", "dev": true, "dependencies": { - "@jridgewell/trace-mapping": "^0.3.17", + "@jridgewell/trace-mapping": "^0.3.20", "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", "serialize-javascript": "^6.0.1", - "terser": "^5.16.8" + "terser": "^5.26.0" }, "engines": { "node": ">= 10.13.0" @@ -8140,18 +11444,6 @@ } } }, - "node_modules/terser/node_modules/acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/terser/node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -8177,12 +11469,6 @@ "resolved": "https://registry.npmjs.org/text-decoding/-/text-decoding-1.0.0.tgz", "integrity": "sha512-/0TJD42KDnVwKmDK6jj3xP7E2MG7SHAOG4tyTgyUCRPdHwvkquYNLEQltmdMa3owq3TkddCVcTsoctJI8VQNKA==" }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, "node_modules/throat": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz", @@ -8268,12 +11554,32 @@ "node": ">=0.8" } }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true + }, "node_modules/ttl": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/ttl/-/ttl-1.3.1.tgz", "integrity": "sha512-+bGy9iDAqg3WSfc2ZrprToSPJhZjqy7vUv9wupQzsiv+BVPVx1T2a6G4T0290SpQj+56Toaw9BiLO5j5Bd7QzA==", "dev": true }, + "node_modules/tuf-js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-1.1.7.tgz", + "integrity": "sha512-i3P9Kgw3ytjELUfpuKVDNBJvk4u5bXL6gskv572mcevPbSKCV3zt3djhmlEQ65yERjIbOSncy7U4cQJaB1CBCg==", + "dev": true, + "dependencies": { + "@tufjs/models": "1.0.4", + "debug": "^4.3.4", + "make-fetch-happen": "^11.1.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -8320,12 +11626,12 @@ } }, "node_modules/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==", + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", "dev": true, "engines": { - "node": ">=10" + "node": ">=12.20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -8358,6 +11664,45 @@ "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", "dev": true }, + "node_modules/unique-filename": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", + "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", + "dev": true, + "dependencies": { + "unique-slug": "^4.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/unique-slug": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", + "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/unique-string": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", + "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", + "dev": true, + "dependencies": { + "crypto-random-string": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/universalify": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", @@ -8370,15 +11715,24 @@ "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "engines": { "node": ">= 0.8" } }, + "node_modules/untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", "dev": true, "funding": [ { @@ -8388,19 +11742,75 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.2.0", + "picocolors": "^1.1.0" }, "bin": { - "browserslist-lint": "cli.js" + "update-browserslist-db": "cli.js" }, "peerDependencies": { "browserslist": ">= 4.21.0" } }, + "node_modules/update-notifier": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-6.0.2.tgz", + "integrity": "sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==", + "dev": true, + "dependencies": { + "boxen": "^7.0.0", + "chalk": "^5.0.1", + "configstore": "^6.0.0", + "has-yarn": "^3.0.0", + "import-lazy": "^4.0.0", + "is-ci": "^3.0.1", + "is-installed-globally": "^0.4.0", + "is-npm": "^6.0.0", + "is-yarn-global": "^0.4.0", + "latest-version": "^7.0.0", + "pupa": "^3.1.0", + "semver": "^7.3.7", + "semver-diff": "^4.0.0", + "xdg-basedir": "^5.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/yeoman/update-notifier?sponsor=1" + } + }, + "node_modules/update-notifier/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/update-notifier/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -8468,6 +11878,25 @@ "node": ">= 8" } }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/validate-npm-package-name": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", + "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -8538,9 +11967,9 @@ } }, "node_modules/watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", + "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", "dev": true, "dependencies": { "glob-to-regexp": "^0.4.1", @@ -8578,34 +12007,33 @@ } }, "node_modules/webpack": { - "version": "5.88.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.1.tgz", - "integrity": "sha512-FROX3TxQnC/ox4N+3xQoWZzvGXSuscxR32rbzjpXgEzWudJFEJBpdlkkob2ylrv5yzzufD1zph1OoFsLtm6stQ==", - "dev": true, - "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.0", - "@webassemblyjs/ast": "^1.11.5", - "@webassemblyjs/wasm-edit": "^1.11.5", - "@webassemblyjs/wasm-parser": "^1.11.5", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.9.0", - "browserslist": "^4.14.5", + "version": "5.97.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.97.0.tgz", + "integrity": "sha512-CWT8v7ShSfj7tGs4TLRtaOLmOCPWhoKEvp+eA7FVx8Xrjb3XfT0aXdxDItnRZmE8sHcH+a8ayDrJCOjXKxVFfQ==", + "dev": true, + "dependencies": { + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.6", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.14.0", + "browserslist": "^4.24.0", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.15.0", + "enhanced-resolve": "^5.17.1", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", + "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", "schema-utils": "^3.2.0", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.7", - "watchpack": "^2.4.0", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.1", "webpack-sources": "^3.2.3" }, "bin": { @@ -8625,9 +12053,9 @@ } }, "node_modules/webpack-dev-middleware": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", - "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz", + "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==", "dev": true, "dependencies": { "colorette": "^2.0.10", @@ -8726,6 +12154,12 @@ "node": ">=10.13.0" } }, + "node_modules/webpack/node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, "node_modules/whatwg-encoding": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", @@ -8756,6 +12190,80 @@ "node": ">= 8" } }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dev": true, + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/widest-line": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", + "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", + "dev": true, + "dependencies": { + "string-width": "^5.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/widest-line/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/widest-line/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/widest-line/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/widest-line/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/word-wrap": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", @@ -8819,16 +12327,16 @@ } }, "node_modules/ws": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", - "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", "dev": true, "engines": { "node": ">=10.0.0" }, "peerDependencies": { "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" + "utf-8-validate": ">=5.0.2" }, "peerDependenciesMeta": { "bufferutil": { @@ -8839,6 +12347,18 @@ } } }, + "node_modules/xdg-basedir": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz", + "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/xml-name-validator": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", diff --git a/package.json b/package.json index 680e292f..7c900ae7 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ "test": "jest --coverage --forceExit", "lint": "eslint --ext=.js src", "lint:fix": "eslint --ext=.js --fix src", - "deps": "npm-check -u", + "deps": "ncu -i --format group", "postdeps": "npm test", "coverall": "cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js", "release": "npm publish --access public && git push --tags", @@ -37,10 +37,11 @@ "compression": "^1.7.4", "coveralls": "^3.1.1", "cross-env": "^7.0.3", - "eslint": "^8.0.1", + "eslint": "^9.1.1", + "eslint-config-prettier": "^9.1.0", "eslint-plugin-node": "^11.1.0", - "eslint-plugin-promise": "^6.1.1", - "eslint-plugin-security": "^1.4.0", + "eslint-plugin-prettier": "^5.1.3", + "eslint-plugin-security": "^3.0.0", "express": "^4.17.1", "fakerator": "^0.3.4", "formidable": "^1.2.6", @@ -53,6 +54,8 @@ "moleculer-repl": "^0.7.0", "nats": "^2.2.0", "nodemon": "^2.0.13", + "npm-check-updates": "^16.14.20", + "prettier": "^3.2.5", "socket.io": "^4.7.1", "spdy": "^4.0.2", "supertest": "^6.1.6", diff --git a/prettier.config.js b/prettier.config.js new file mode 100644 index 00000000..c1acd807 --- /dev/null +++ b/prettier.config.js @@ -0,0 +1,25 @@ +module.exports = { + useTabs: true, + printWidth: 100, + trailingComma: "none", + tabWidth: 4, + singleQuote: false, + semi: true, + bracketSpacing: true, + arrowParens: "avoid", + overrides: [ + { + files: "*.md", + options: { + useTabs: false + } + }, + { + files: "*.json", + options: { + tabWidth: 2, + useTabs: false + } + } + ] +}; diff --git a/src/alias.js b/src/alias.js index e54549ec..afba7d2a 100644 --- a/src/alias.js +++ b/src/alias.js @@ -1,22 +1,21 @@ /* * moleculer - * Copyright (c) 2021 MoleculerJS (https://github.com/moleculerjs/moleculer) + * Copyright (c) 2024 MoleculerJS (https://github.com/moleculerjs/moleculer) * MIT Licensed */ "use strict"; -const pathToRegexp = require("path-to-regexp"); -const Busboy = require("@fastify/busboy"); -const kleur = require("kleur"); -const _ = require("lodash"); +const pathToRegexp = require("path-to-regexp"); +const Busboy = require("@fastify/busboy"); +const kleur = require("kleur"); +const _ = require("lodash"); const { PayloadTooLarge } = require("./errors"); const { MoleculerClientError } = require("moleculer").Errors; const { removeTrailingSlashes, addSlashes, decodeParam, compose } = require("./utils"); class Alias { - /** * Constructor of Alias * @@ -60,12 +59,12 @@ class Alias { this.handler = action; this.action = null; } else if (Array.isArray(action)) { - const mws = _.compact(action.map(mw => { - if (_.isString(mw)) - this.action = mw; - else if(_.isFunction(mw)) - return mw; - })); + const mws = _.compact( + action.map(mw => { + if (_.isString(mw)) this.action = mw; + else if (_.isFunction(mw)) return mw; + }) + ); this.handler = compose.call(service, ...mws); } else if (action != null) { Object.assign(this, _.cloneDeep(action)); @@ -75,7 +74,7 @@ class Alias { this.path = removeTrailingSlashes(this.path); - this.fullPath = this.fullPath || (addSlashes(this.route.path) + this.path); + this.fullPath = this.fullPath || addSlashes(this.route.path) + this.path; if (this.fullPath !== "/" && this.fullPath.endsWith("/")) { this.fullPath = this.fullPath.slice(0, -1); } @@ -107,8 +106,7 @@ class Alias { params[key.name] = decodeParam(param); - if (key.repeat) - params[key.name] = params[key.name].split(key.delimiter); + if (key.repeat) params[key.name] = params[key.name].split(key.delimiter); } return params; @@ -134,7 +132,13 @@ class Alias { * */ toString() { - return kleur.magenta(_.padStart(this.method, 6)) + " " + kleur.cyan(this.fullPath) + kleur.grey(" => ") + (this.handler != null && this.type !== "multipart" ? "<Function>" : this.action); + return ( + kleur.magenta(_.padStart(this.method, 6)) + + " " + + kleur.cyan(this.fullPath) + + kleur.grey(" => ") + + (this.handler != null && this.type !== "multipart" ? "<Function>" : this.action) + ); } /** @@ -150,7 +154,11 @@ class Alias { let numOfFiles = 0; let hasField = false; - const busboyOptions = _.defaultsDeep({ headers: req.headers }, this.busboyConfig, this.route.opts.busboyConfig); + const busboyOptions = _.defaultsDeep( + { headers: req.headers }, + this.busboyConfig, + this.route.opts.busboyConfig + ); const busboy = new Busboy(busboyOptions); busboy.on("file", (fieldname, file, filename, encoding, mimetype) => { file.on("limit", () => { @@ -161,11 +169,28 @@ class Alias { file.destroy(new PayloadTooLarge({ fieldname, filename, encoding, mimetype })); }); numOfFiles++; - promises.push(ctx.call(this.action, _.defaultsDeep({ $fieldname: fieldname, $filename: filename, $encoding: encoding, $mimetype: mimetype }, multipartParams, req.$params), _.defaultsDeep({ stream: file }, this.route.opts.callOptions)).catch(err => { - file.resume(); // Drain file stream to continue processing form - busboy.emit("error", err); - return err; - })); + promises.push( + ctx + .call( + this.action, + _.defaultsDeep( + { + $fieldname: fieldname, + $filename: filename, + $encoding: encoding, + $mimetype: mimetype + }, + multipartParams, + req.$params + ), + _.defaultsDeep({ stream: file }, this.route.opts.callOptions) + ) + .catch(err => { + file.resume(); // Drain file stream to continue processing form + busboy.emit("error", err); + return err; + }) + ); }); busboy.on("field", (field, value) => { hasField = true; @@ -175,16 +200,29 @@ class Alias { busboy.on("finish", async () => { /* istanbul ignore next */ if (!busboyOptions.empty && numOfFiles == 0) - return this.service.sendError(req, res, new MoleculerClientError("File missing in the request")); + return this.service.sendError( + req, + res, + new MoleculerClientError("File missing in the request") + ); // Call the action if no files but multipart fields if (numOfFiles == 0 && hasField) { - promises.push(ctx.call(this.action, _.defaultsDeep({}, multipartParams, req.$params), _.defaultsDeep({}, this.route.opts.callOptions))); + promises.push( + ctx.call( + this.action, + _.defaultsDeep({}, multipartParams, req.$params), + _.defaultsDeep({}, this.route.opts.callOptions) + ) + ); } try { let data = await this.service.Promise.all(promises); - const fileLimit = busboyOptions.limits && busboyOptions.limits.files != null ? busboyOptions.limits.files : null; + const fileLimit = + busboyOptions.limits && busboyOptions.limits.files != null + ? busboyOptions.limits.files + : null; if (numOfFiles == 1 && fileLimit == 1) { // Remove the array wrapping data = data[0]; @@ -193,8 +231,7 @@ class Alias { data = await this.route.onAfterCall.call(this, ctx, this.route, req, res, data); this.service.sendResponse(req, res, data, {}); - - } catch(err) { + } catch (err) { /* istanbul ignore next */ this.service.sendError(req, res, err); } @@ -209,15 +246,21 @@ class Alias { // Add limit event handlers if (_.isFunction(busboyOptions.onPartsLimit)) { - busboy.on("partsLimit", () => busboyOptions.onPartsLimit.call(this.service, busboy, this, this.service)); + busboy.on("partsLimit", () => + busboyOptions.onPartsLimit.call(this.service, busboy, this, this.service) + ); } if (_.isFunction(busboyOptions.onFilesLimit)) { - busboy.on("filesLimit", () => busboyOptions.onFilesLimit.call(this.service, busboy, this, this.service)); + busboy.on("filesLimit", () => + busboyOptions.onFilesLimit.call(this.service, busboy, this, this.service) + ); } if (_.isFunction(busboyOptions.onFieldsLimit)) { - busboy.on("fieldsLimit", () => busboyOptions.onFieldsLimit.call(this.service, busboy, this, this.service)); + busboy.on("fieldsLimit", () => + busboyOptions.onFieldsLimit.call(this.service, busboy, this, this.service) + ); } req.pipe(busboy); diff --git a/src/index.js b/src/index.js index c27776a4..cf0f4ab4 100644 --- a/src/index.js +++ b/src/index.js @@ -1,6 +1,6 @@ /* * moleculer - * Copyright (c) 2021 MoleculerJS (https://github.com/moleculerjs/moleculer) + * Copyright (c) 2024 MoleculerJS (https://github.com/moleculerjs/moleculer) * MIT Licensed */ @@ -22,19 +22,32 @@ const isReadableStream = require("isstream").isReadable; const { pipeline } = require("stream"); const { MoleculerError, MoleculerServerError, ServiceNotFoundError } = require("moleculer").Errors; -const { ServiceUnavailableError, NotFoundError, ForbiddenError, RateLimitExceeded, ERR_ORIGIN_NOT_ALLOWED } = require("./errors"); +const { + ServiceUnavailableError, + NotFoundError, + ForbiddenError, + RateLimitExceeded, + ERR_ORIGIN_NOT_ALLOWED +} = require("./errors"); const Alias = require("./alias"); const MemoryStore = require("./memory-store"); -const { removeTrailingSlashes, addSlashes, normalizePath, composeThen, generateETag, isFresh } = require("./utils"); +const { + removeTrailingSlashes, + addSlashes, + normalizePath, + composeThen, + generateETag, + isFresh +} = require("./utils"); const MAPPING_POLICY_ALL = "all"; const MAPPING_POLICY_RESTRICT = "restrict"; function getServiceFullname(svc) { if (svc.version != null && svc.settings.$noVersionPrefix !== true) - return (typeof (svc.version) == "number" ? "v" + svc.version : svc.version) + "." + svc.name; + return (typeof svc.version == "number" ? "v" + svc.version : svc.version) + "." + svc.name; return svc.name; } @@ -47,13 +60,11 @@ const SLASH_REGEX = new RegExp(/\./g); * @service */ module.exports = { - // Default service name name: "api", // Default settings settings: { - // Exposed port port: process.env.PORT || 3000, @@ -117,7 +128,6 @@ module.exports = { }, actions: { - /** * REST request handler */ @@ -125,10 +135,7 @@ module.exports = { visibility: "private", tracing: { tags: { - params: [ - "req.url", - "req.method" - ] + params: ["req.url", "req.method"] }, spanName: ctx => `${ctx.params.req.method} ${ctx.params.req.url}` }, @@ -141,28 +148,23 @@ module.exports = { req.$ctx = ctx; res.$ctx = ctx; - if (ctx.requestID) - res.setHeader("X-Request-ID", ctx.requestID); + if (ctx.requestID) res.setHeader("X-Request-ID", ctx.requestID); - if (!req.originalUrl) - req.originalUrl = req.url; + if (!req.originalUrl) req.originalUrl = req.url; // Split URL & query params let parsed = this.parseQueryString(req); let url = parsed.url; // Trim trailing slash - if (url.length > 1 && url.endsWith("/")) - url = url.slice(0, -1); + if (url.length > 1 && url.endsWith("/")) url = url.slice(0, -1); req.parsedUrl = url; - if (!req.query) - req.query = parsed.query; + if (!req.query) req.query = parsed.query; // Skip if no routes - if (!this.routes || this.routes.length == 0) - return null; + if (!this.routes || this.routes.length == 0) return null; let method = req.method; if (method == "OPTIONS") { @@ -176,8 +178,7 @@ module.exports = { // Update URLs for middlewares req.baseUrl = route.path; req.url = req.originalUrl.substring(route.path.length); - if (req.url.length == 0 || req.url[0] !== "/") - req.url = "/" + req.url; + if (req.url.length == 0 || req.url[0] !== "/") req.url = "/" + req.url; return this.routeHandler(ctx, route, req, res, found); } @@ -190,8 +191,7 @@ module.exports = { // Update URLs for middlewares req.baseUrl = route.path; req.url = req.originalUrl.substring(route.path.length); - if (req.url.length == 0 || req.url[0] !== "/") - req.url = "/" + req.url; + if (req.url.length == 0 || req.url[0] !== "/") req.url = "/" + req.url; return this.routeHandler(ctx, route, req, res); } @@ -274,12 +274,11 @@ module.exports = { }, visibility: "public", handler(ctx) { - if (ctx.params.name != null) - return this.removeRouteByName(ctx.params.name); + if (ctx.params.name != null) return this.removeRouteByName(ctx.params.name); return this.removeRoute(ctx.params.path); } - }, + } }, methods: { @@ -291,21 +290,31 @@ module.exports = { if (this.server) return; if (this.settings.https && this.settings.https.key && this.settings.https.cert) { - this.server = this.settings.http2 ? http2.createSecureServer(this.settings.https, this.httpHandler) : https.createServer(this.settings.https, this.httpHandler); + this.server = this.settings.http2 + ? http2.createSecureServer(this.settings.https, this.httpHandler) + : https.createServer(this.settings.https, this.httpHandler); this.isHTTPS = true; } else { - this.server = this.settings.http2 ? http2.createServer(this.httpHandler) : http.createServer(this.httpHandler); + this.server = this.settings.http2 + ? http2.createServer(this.httpHandler) + : http.createServer(this.httpHandler); this.isHTTPS = false; } // HTTP server timeout if (this.settings.httpServerTimeout) { - this.logger.debug("Override default http(s) server timeout:", this.settings.httpServerTimeout); + this.logger.debug( + "Override default http(s) server timeout:", + this.settings.httpServerTimeout + ); this.server.setTimeout(this.settings.httpServerTimeout); } this.server.requestTimeout = this.settings.requestTimeout; - this.logger.debug("Setting http(s) server request timeout to:", this.settings.requestTimeout); + this.logger.debug( + "Setting http(s) server request timeout to:", + this.settings.requestTimeout + ); }, /** @@ -318,7 +327,16 @@ module.exports = { errorHandler(req, res, err) { // don't log client side errors unless it's configured if (this.settings.log4XXResponses || (err && !_.inRange(err.code, 400, 500))) { - this.logger.error(" Request error!", err.name, ":", err.message, "\n", err.stack, "\nData:", err.data); + this.logger.error( + " Request error!", + err.name, + ":", + err.message, + "\n", + err.stack, + "\nData:", + err.data + ); } this.sendError(req, res, err); }, @@ -366,8 +384,7 @@ module.exports = { res.locals = res.locals || {}; let requestID = req.headers["x-request-id"]; - if (req.headers["x-correlation-id"]) - requestID = req.headers["x-correlation-id"]; + if (req.headers["x-correlation-id"]) requestID = req.headers["x-correlation-id"]; let options = { requestID }; if (this.settings.rootCallOptions) { @@ -384,7 +401,7 @@ module.exports = { // Not routed. const shouldBreak = this.corsHandler(this.settings, req, res); // check cors settings first - if(shouldBreak) { + if (shouldBreak) { return; } @@ -424,14 +441,14 @@ module.exports = { return new this.Promise(async (resolve, reject) => { res.once("finish", () => resolve(true)); res.once("close", () => resolve(true)); - res.once("error", (err) => reject(err)); + res.once("error", err => reject(err)); try { await composeThen.call(this, req, res, ...route.middlewares); let params = {}; const shouldBreak = this.corsHandler(route, req, res); - if(shouldBreak) { + if (shouldBreak) { return resolve(true); } @@ -442,12 +459,11 @@ module.exports = { const body = _.isObject(req.body) ? req.body : {}; Object.assign(params, body, req.query); } - req.$params = params; // eslint-disable-line require-atomic-updates + req.$params = params; // Resolve action name let urlPath = req.parsedUrl.slice(route.path.length); - if (urlPath.startsWith("/")) - urlPath = urlPath.slice(1); + if (urlPath.startsWith("/")) urlPath = urlPath.slice(1); // Resolve internal services urlPath = urlPath.replace(this._isscRe, "$"); @@ -464,18 +480,16 @@ module.exports = { Object.assign(params, foundAlias.params); } - req.$alias = alias; // eslint-disable-line require-atomic-updates + req.$alias = alias; // Alias handler return resolve(await this.aliasHandler(req, res, alias)); - } else if (route.mappingPolicy == MAPPING_POLICY_RESTRICT) { // Blocking direct access return resolve(null); } - if (!action) - return resolve(null); + if (!action) return resolve(null); // Not found alias, call services by action name action = action.replace(/\//g, "."); @@ -486,7 +500,6 @@ module.exports = { // Alias handler const result = await this.aliasHandler(req, res, { action, _notDefined: true }); resolve(result); - } catch (err) { reject(err); } @@ -527,7 +540,7 @@ module.exports = { const key = opts.key(req); if (key) { - const remaining = opts.limit - await store.inc(key); + const remaining = opts.limit - (await store.inc(key)); if (opts.headers) { res.setHeader("X-Rate-Limit-Limit", opts.limit); res.setHeader("X-Rate-Limit-Remaining", Math.max(0, remaining)); @@ -541,7 +554,11 @@ module.exports = { // Resolve endpoint by action name if (alias.action) { - const endpoint = this.broker.findNextActionEndpoint(alias.action, route.callOptions, ctx); + const endpoint = this.broker.findNextActionEndpoint( + alias.action, + route.callOptions, + ctx + ); if (endpoint instanceof Error) { if (!alias._notDefined && endpoint instanceof ServiceNotFoundError) { throw new ServiceUnavailableError(); @@ -550,7 +567,10 @@ module.exports = { throw endpoint; } - if (endpoint.action.visibility != null && endpoint.action.visibility != "published") { + if ( + endpoint.action.visibility != null && + endpoint.action.visibility != "published" + ) { // Action can't be published throw new ServiceNotFoundError({ action: alias.action }); } @@ -584,25 +604,45 @@ module.exports = { // Call the action or alias if (_.isFunction(alias.handler)) { // Call custom alias handler - if (route.logging && (this.settings.logRequest && this.settings.logRequest in this.logger)) - this.logger[this.settings.logRequest](` Call custom function in '${alias.toString()}' alias`); + if ( + route.logging && + this.settings.logRequest && + this.settings.logRequest in this.logger + ) + this.logger[this.settings.logRequest]( + ` Call custom function in '${alias.toString()}' alias` + ); await new this.Promise((resolve, reject) => { alias.handler.call(this, req, res, err => { - if (err) - reject(err); - else - resolve(); + if (err) reject(err); + else resolve(); }); }); if (alias.action) - return this.callAction(route, alias.action, req, res, req.$params, alias.type == "stream"); + return this.callAction( + route, + alias.action, + req, + res, + req.$params, + alias.type == "stream" + ); else - throw new MoleculerServerError("No alias handler", 500, "NO_ALIAS_HANDLER", { path: req.originalUrl, alias: _.pick(alias, ["method", "path"]) }); - + throw new MoleculerServerError("No alias handler", 500, "NO_ALIAS_HANDLER", { + path: req.originalUrl, + alias: _.pick(alias, ["method", "path"]) + }); } else if (alias.action) { - return this.callAction(route, alias.action, req, res, req.$params, alias.type == "stream"); + return this.callAction( + route, + alias.action, + req, + res, + req.$params, + alias.type == "stream" + ); } }, @@ -625,7 +665,10 @@ module.exports = { if (route.logging) { if (this.settings.logRequest && this.settings.logRequest in this.logger) this.logger[this.settings.logRequest](` Call '${actionName}' action`); - if (this.settings.logRequestParams && this.settings.logRequestParams in this.logger) + if ( + this.settings.logRequestParams && + this.settings.logRequestParams in this.logger + ) this.logger[this.settings.logRequestParams](" Params:", params); } @@ -653,15 +696,12 @@ module.exports = { // Send back the response this.sendResponse(req, res, data, req.$endpoint.action); - if (route.logging) - this.logResponse(req, res, data); + if (route.logging) this.logResponse(req, res, data); return true; - } catch (err) { /* istanbul ignore next */ - if (!err) - return; // Cancelling promise chain, no error + if (!err) return; // Cancelling promise chain, no error throw err; } @@ -697,8 +737,7 @@ module.exports = { } /* istanbul ignore next */ - if (!res.statusCode) - res.statusCode = 200; + if (!res.statusCode) res.statusCode = 200; // Status code & message if (ctx.meta.$statusCode) { @@ -709,11 +748,16 @@ module.exports = { } // Redirect - if (res.statusCode==201 || (res.statusCode >= 300 && res.statusCode < 400 && res.statusCode !== 304)) { + if ( + res.statusCode == 201 || + (res.statusCode >= 300 && res.statusCode < 400 && res.statusCode !== 304) + ) { const location = ctx.meta.$location; /* istanbul ignore next */ if (!location) { - this.logger.warn(`The 'ctx.meta.$location' is missing for status code '${res.statusCode}'!`); + this.logger.warn( + `The 'ctx.meta.$location' is missing for status code '${res.statusCode}'!` + ); } else { res.setHeader("Location", location); } @@ -755,8 +799,7 @@ module.exports = { } }); } - if (data == null) - return res.end(); + if (data == null) return res.end(); let chunk; // Buffer @@ -789,10 +832,8 @@ module.exports = { chunk = this.encodeResponse(req, res, data); } else { res.setHeader("Content-Type", responseType); - if (_.isString(data)) - chunk = data; - else - chunk = data.toString(); + if (_.isString(data)) chunk = data; + else chunk = data.toString(); } } @@ -802,8 +843,7 @@ module.exports = { } // Freshness - if (isFresh(req, res)) - res.statusCode = 304; + if (isFresh(req, res)) res.statusCode = 304; if (res.statusCode === 204 || res.statusCode === 304) { res.removeHeader("Content-Type"); @@ -818,10 +858,15 @@ module.exports = { res.end(); } else { // respond - if (isReadableStream(data)) { //Stream response + if (isReadableStream(data)) { + //Stream response pipeline(data, res, err => { if (err) { - this.logger.warn("Stream got an error.", { err, url: req.url, actionName: action.name }); + this.logger.warn("Stream got an error.", { + err, + url: req.url, + actionName: action.name + }); } }); } else { @@ -846,8 +891,7 @@ module.exports = { * @param {HttpResponse} res */ send404(req, res) { - if (req.$next) - return req.$next(); + if (req.$next) return req.$next(); this.sendError(req, res, new NotFoundError()); }, @@ -871,8 +915,7 @@ module.exports = { // --- Default error handler // In middleware mode call the next(err) - if (req.$next) - return req.$next(err); + if (req.$next) return req.$next(err); /* istanbul ignore next */ if (res.headersSent) { @@ -936,7 +979,7 @@ module.exports = { * @param {HttpResponse} res @returns {Object} */ - reformatError(err/*, req, res*/) { + reformatError(err /*, req, res*/) { return _.pick(err, ["name", "message", "code", "type", "data"]); }, @@ -949,7 +992,7 @@ module.exports = { */ sendRedirect(res, url, code = 302) { res.writeHead(code, { - "Location": url, + Location: url, "Content-Length": "0" }); res.end(); @@ -968,7 +1011,10 @@ module.exports = { let query = {}; const questionIdx = req.url.indexOf("?", 1); if (questionIdx !== -1) { - query = queryString.parse(req.url.substring(questionIdx + 1), this.settings.qsOptions); + query = queryString.parse( + req.url.substring(questionIdx + 1), + this.settings.qsOptions + ); url = req.url.substring(0, questionIdx); } return { query, url }; @@ -993,14 +1039,10 @@ module.exports = { * @returns */ coloringStatusCode(code) { - if (code >= 500) - return kleur.red().bold(code); - if (code >= 400 && code < 500) - return kleur.red().bold(code); - if (code >= 300 && code < 400) - return kleur.cyan().bold(code); - if (code >= 200 && code < 300) - return kleur.green().bold(code); + if (code >= 500) return kleur.red().bold(code); + if (code >= 400 && code < 500) return kleur.red().bold(code); + if (code >= 300 && code < 400) return kleur.cyan().bold(code); + if (code >= 200 && code < 300) return kleur.green().bold(code); /* istanbul ignore next */ return code; @@ -1020,14 +1062,14 @@ module.exports = { if (req.$startTime) { const diff = process.hrtime(req.$startTime); const duration = (diff[0] + diff[1] / 1e9) * 1000; - if (duration > 1000) - time = kleur.red(`[+${Number(duration / 1000).toFixed(3)} s]`); - else - time = kleur.grey(`[+${Number(duration).toFixed(3)} ms]`); + if (duration > 1000) time = kleur.red(`[+${Number(duration / 1000).toFixed(3)} s]`); + else time = kleur.grey(`[+${Number(duration).toFixed(3)} ms]`); } if (this.settings.logResponse && this.settings.logResponse in this.logger) - this.logger[this.settings.logResponse](`<= ${this.coloringStatusCode(res.statusCode)} ${req.method} ${kleur.bold(req.originalUrl)} ${time}`); + this.logger[this.settings.logResponse]( + `<= ${this.coloringStatusCode(res.statusCode)} ${req.method} ${kleur.bold(req.originalUrl)} ${time}` + ); /* istanbul ignore next */ if (this.settings.logResponseData && this.settings.logResponseData in this.logger) { @@ -1044,8 +1086,7 @@ module.exports = { */ checkOrigin(origin, settings) { if (_.isString(settings)) { - if (settings.indexOf(origin) !== -1) - return true; + if (settings.indexOf(origin) !== -1) return true; if (settings.indexOf("*") !== -1) { // Based on: https://github.com/hapijs/hapi @@ -1077,14 +1118,12 @@ module.exports = { * @param {Boolean} isPreFlight */ writeCorsHeaders(route, req, res, isPreFlight) { - /* istanbul ignore next */ if (!route.cors) return; const origin = req.headers["origin"]; // It's not presented, when it's a local request (origin and target same) - if (!origin) - return; + if (!origin) return; // Access-Control-Allow-Origin if (!route.cors.origin || route.cors.origin === "*") { @@ -1105,7 +1144,10 @@ module.exports = { if (_.isString(route.cors.exposedHeaders)) { res.setHeader("Access-Control-Expose-Headers", route.cors.exposedHeaders); } else if (Array.isArray(route.cors.exposedHeaders)) { - res.setHeader("Access-Control-Expose-Headers", route.cors.exposedHeaders.join(", ")); + res.setHeader( + "Access-Control-Expose-Headers", + route.cors.exposedHeaders.join(", ") + ); } if (isPreFlight) { @@ -1113,7 +1155,10 @@ module.exports = { if (_.isString(route.cors.allowedHeaders)) { res.setHeader("Access-Control-Allow-Headers", route.cors.allowedHeaders); } else if (Array.isArray(route.cors.allowedHeaders)) { - res.setHeader("Access-Control-Allow-Headers", route.cors.allowedHeaders.join(", ")); + res.setHeader( + "Access-Control-Allow-Headers", + route.cors.allowedHeaders.join(", ") + ); } else { // AllowedHeaders doesn't specified, so we send back from req headers const allowedHeaders = req.headers["access-control-request-headers"]; @@ -1146,12 +1191,12 @@ module.exports = { */ checkWhitelist(route, action) { // Rewrite to for iterator (faster) - return route.whitelist.find(mask => { - if (_.isString(mask)) - return match(action, mask); - else if (_.isRegExp(mask)) - return mask.test(action); - }) != null; + return ( + route.whitelist.find(mask => { + if (_.isString(mask)) return match(action, mask); + else if (_.isRegExp(mask)) return mask.test(action); + }) != null + ); }, /** @@ -1187,14 +1232,11 @@ module.exports = { this.routes[idx] = route; } else { // Add new route - if (toBottom) - this.routes.push(route); - else - this.routes.unshift(route); + if (toBottom) this.routes.push(route); + else this.routes.unshift(route); // Reordering routes - if (this.settings.optimizeOrder) - this.optimizeRouteOrder(); + if (this.settings.optimizeOrder) this.optimizeRouteOrder(); } return route; @@ -1254,7 +1296,10 @@ module.exports = { return c; }); - this.logger.debug("Optimized path order: ", this.routes.map(r => r.path)); + this.logger.debug( + "Optimized path order: ", + this.routes.map(r => r.path) + ); }, /** @@ -1275,20 +1320,22 @@ module.exports = { if (_.isString(opts.authorization)) fn = this[opts.authorization]; if (!_.isFunction(fn)) { - this.logger.warn("Define 'authorize' method in the service to enable authorization."); + this.logger.warn( + "Define 'authorize' method in the service to enable authorization." + ); route.authorization = null; - } else - route.authorization = fn; + } else route.authorization = fn; } if (opts.authentication) { let fn = this.authenticate; if (_.isString(opts.authentication)) fn = this[opts.authentication]; if (!_.isFunction(fn)) { - this.logger.warn("Define 'authenticate' method in the service to enable authentication."); + this.logger.warn( + "Define 'authenticate' method in the service to enable authentication." + ); route.authentication = null; - } else - route.authentication = fn; + } else route.authentication = fn; } // Call options @@ -1318,11 +1365,14 @@ module.exports = { // Middlewares let mw = []; - if (this.settings.use && Array.isArray(this.settings.use) && this.settings.use.length > 0) + if ( + this.settings.use && + Array.isArray(this.settings.use) && + this.settings.use.length > 0 + ) mw.push(...this.settings.use); - if (opts.use && Array.isArray(opts.use) && opts.use.length > 0) - mw.push(...opts.use); + if (opts.use && Array.isArray(opts.use) && opts.use.length > 0) mw.push(...opts.use); if (mw.length > 0) { route.middlewares.push(...mw); @@ -1332,10 +1382,15 @@ module.exports = { // CORS if (this.settings.cors || opts.cors) { // Merge cors settings - route.cors = Object.assign({}, { - origin: "*", - methods: ["GET", "HEAD", "PUT", "PATCH", "POST", "DELETE"] - }, this.settings.cors, opts.cors); + route.cors = Object.assign( + {}, + { + origin: "*", + methods: ["GET", "HEAD", "PUT", "PATCH", "POST", "DELETE"] + }, + this.settings.cors, + opts.cors + ); } else { route.cors = null; } @@ -1343,25 +1398,29 @@ module.exports = { // Rate limiter (Inspired by https://github.com/dotcypress/micro-ratelimit/) const rateLimit = opts.rateLimit || this.settings.rateLimit; if (rateLimit) { - let opts = Object.assign({}, { - window: 60 * 1000, - limit: 30, - headers: false, - key: (req) => { - return req.headers["x-forwarded-for"] || - req.connection.remoteAddress || - req.socket.remoteAddress || - req.connection.socket.remoteAddress; - } - }, rateLimit); + let opts = Object.assign( + {}, + { + window: 60 * 1000, + limit: 30, + headers: false, + key: req => { + return ( + req.headers["x-forwarded-for"] || + req.connection.remoteAddress || + req.socket.remoteAddress || + req.connection.socket.remoteAddress + ); + } + }, + rateLimit + ); route.rateLimit = opts; if (opts.StoreFactory) route.rateLimit.store = new opts.StoreFactory(opts.window, opts, this.broker); - else - route.rateLimit.store = new MemoryStore(opts.window, opts, this.broker); - + else route.rateLimit.store = new MemoryStore(opts.window, opts, this.broker); } // Handle whitelist @@ -1369,19 +1428,17 @@ module.exports = { route.hasWhitelist = Array.isArray(route.whitelist); // `onBeforeCall` handler - if (opts.onBeforeCall) - route.onBeforeCall = opts.onBeforeCall; + if (opts.onBeforeCall) route.onBeforeCall = opts.onBeforeCall; // `onAfterCall` handler - if (opts.onAfterCall) - route.onAfterCall = opts.onAfterCall; + if (opts.onAfterCall) route.onAfterCall = opts.onAfterCall; // `onError` handler - if (opts.onError) - route.onError = opts.onError; + if (opts.onError) route.onError = opts.onError; // Create URL prefix - const globalPath = this.settings.path && this.settings.path != "/" ? this.settings.path : ""; + const globalPath = + this.settings.path && this.settings.path != "/" ? this.settings.path : ""; route.path = addSlashes(globalPath) + (opts.path || ""); route.path = normalizePath(route.path); @@ -1397,7 +1454,8 @@ module.exports = { route.mappingPolicy = opts.mappingPolicy; if (!route.mappingPolicy) { const hasAliases = _.isObject(opts.aliases) && Object.keys(opts.aliases).length > 0; - route.mappingPolicy = hasAliases || opts.autoAliases ? MAPPING_POLICY_RESTRICT : MAPPING_POLICY_ALL; + route.mappingPolicy = + hasAliases || opts.autoAliases ? MAPPING_POLICY_RESTRICT : MAPPING_POLICY_ALL; } this.logRouteRegistration(""); @@ -1455,7 +1513,9 @@ module.exports = { generateRESTAliases(route, path, action) { const p = path.split(/\s+/); const pathName = p[1]; - const pathNameWithoutEndingSlash = pathName.endsWith("/") ? pathName.slice(0, -1) : pathName; + const pathNameWithoutEndingSlash = pathName.endsWith("/") + ? pathName.slice(0, -1) + : pathName; const aliases = { list: `GET ${pathName}`, get: `GET ${pathNameWithoutEndingSlash}/:id`, @@ -1494,9 +1554,12 @@ module.exports = { const processedServices = new Set(); - const services = this.broker.registry.getServiceList({ withActions: true, grouping: true }); + const services = this.broker.registry.getServiceList({ + withActions: true, + grouping: true + }); services.forEach(service => { - if(!service.settings) return; + if (!service.settings) return; const serviceName = service.fullName || getServiceFullname(service); let basePaths = []; @@ -1512,15 +1575,19 @@ module.exports = { if (processedServices.has(serviceName)) return; for (let basePath of basePaths) { - basePath = addSlashes(_.isString(basePath) ? basePath : serviceName.replace(SLASH_REGEX, "/")); + basePath = addSlashes( + _.isString(basePath) ? basePath : serviceName.replace(SLASH_REGEX, "/") + ); _.forIn(service.actions, action => { if (action.rest) { // Check visibility - if (action.visibility != null && action.visibility != "published") return; + if (action.visibility != null && action.visibility != "published") + return; // Check whitelist - if (route.hasWhitelist && !this.checkWhitelist(route, action.name)) return; + if (route.hasWhitelist && !this.checkWhitelist(route, action.name)) + return; let restRoutes = []; if (!_.isArray(action.rest)) { @@ -1535,7 +1602,11 @@ module.exports = { if (_.isString(restRoute)) { alias = this.parseActionRestString(restRoute, basePath); } else if (_.isObject(restRoute)) { - alias = this.parseActionRestObject(restRoute, action.rawName, basePath); + alias = this.parseActionRestObject( + restRoute, + action.rawName, + basePath + ); } if (alias) { @@ -1582,7 +1653,9 @@ module.exports = { // Handle route: { method: "POST", path: "/other", basePath: "newBasePath" } return Object.assign({}, restRoute, { method: restRoute.method || "*", - path: (restRoute.basePath ? restRoute.basePath : basePath) + (restRoute.path ? restRoute.path : rawName) + path: + (restRoute.basePath ? restRoute.basePath : basePath) + + (restRoute.path ? restRoute.path : rawName) }); }, @@ -1618,7 +1691,6 @@ module.exports = { return alias; }, - /** * Set log level and log registration route related activities * @@ -1630,8 +1702,7 @@ module.exports = { this.settings.logRouteRegistration in this.logger ) this.logger[this.settings.logRouteRegistration](message); - }, - + } }, events: { @@ -1645,7 +1716,6 @@ module.exports = { */ created() { if (this.settings.server !== false) { - if (_.isObject(this.settings.server)) { // Use an existing server instance this.server = this.settings.server; @@ -1663,7 +1733,10 @@ module.exports = { } // Special char for internal services - const specChar = this.settings.internalServiceSpecialChar != null ? this.settings.internalServiceSpecialChar : "~"; + const specChar = + this.settings.internalServiceSpecialChar != null + ? this.settings.internalServiceSpecialChar + : "~"; // eslint-disable-next-line security/detect-non-literal-regexp this._isscRe = new RegExp(specChar); @@ -1678,9 +1751,11 @@ module.exports = { // Add default route if (Array.isArray(this.settings.routes) && this.settings.routes.length == 0) { - this.settings.routes = [{ - path: "/" - }]; + this.settings.routes = [ + { + path: "/" + } + ]; } // Process routes @@ -1689,32 +1764,37 @@ module.exports = { this.settings.routes.forEach(route => this.addRoute(route)); // Regenerate all auto aliases routes - const debounceTime = this.settings.debounceTime > 0 ? parseInt(this.settings.debounceTime) : 500; + const debounceTime = + this.settings.debounceTime > 0 ? parseInt(this.settings.debounceTime) : 500; this.regenerateAllAutoAliases = _.debounce(() => { /* istanbul ignore next */ - this.routes.forEach(route => route.opts.autoAliases && this.regenerateAutoAliases(route)); + this.routes.forEach( + route => route.opts.autoAliases && this.regenerateAutoAliases(route) + ); this.broker.broadcast("$api.aliases.regenerated"); }, debounceTime); }, - /** * Service started lifecycle event handler */ started() { - if (this.settings.server === false) - return this.Promise.resolve(); + if (this.settings.server === false) return this.Promise.resolve(); /* istanbul ignore next */ return new this.Promise((resolve, reject) => { this.server.listen(this.settings.port, this.settings.ip, err => { - if (err) - return reject(err); + if (err) return reject(err); const addr = this.server.address(); - const listenAddr = addr.address == "0.0.0.0" && os.platform() == "win32" ? "localhost" : addr.address; - this.logger.info(`API Gateway listening on ${this.isHTTPS ? "https" : "http"}://${listenAddr}:${addr.port}`); + const listenAddr = + addr.address == "0.0.0.0" && os.platform() == "win32" + ? "localhost" + : addr.address; + this.logger.info( + `API Gateway listening on ${this.isHTTPS ? "https" : "http"}://${listenAddr}:${addr.port}` + ); resolve(); }); }); @@ -1728,8 +1808,7 @@ module.exports = { /* istanbul ignore next */ return new this.Promise((resolve, reject) => { this.server.close(err => { - if (err) - return reject(err); + if (err) return reject(err); this.logger.info("API Gateway stopped!"); resolve(); diff --git a/src/memory-store.js b/src/memory-store.js index 4cfd0d32..b5d0be1b 100644 --- a/src/memory-store.js +++ b/src/memory-store.js @@ -1,6 +1,6 @@ /* * moleculer - * Copyright (c) 2021 MoleculerJS (https://github.com/moleculerjs/moleculer) + * Copyright (c) 2024 MoleculerJS (https://github.com/moleculerjs/moleculer) * MIT Licensed */ @@ -14,7 +14,6 @@ * @class MemoryStore */ class MemoryStore { - /** * Creates an instance of MemoryStore. * diff --git a/src/utils.js b/src/utils.js index a8cbe50c..868a755f 100644 --- a/src/utils.js +++ b/src/utils.js @@ -1,14 +1,14 @@ /* * moleculer - * Copyright (c) 2021 MoleculerJS (https://github.com/moleculerjs/moleculer) + * Copyright (c) 2024 MoleculerJS (https://github.com/moleculerjs/moleculer) * MIT Licensed */ "use strict"; -const _ = require("lodash"); -const fresh = require("fresh"); -const etag = require("etag"); +const _ = require("lodash"); +const fresh = require("fresh"); +const etag = require("etag"); const { BadRequestError, ERR_UNABLE_DECODE_PARAM } = require("./errors"); const { MoleculerError } = require("moleculer").Errors; @@ -20,7 +20,7 @@ const { MoleculerError } = require("moleculer").Errors; function decodeParam(param) { try { return decodeURIComponent(param); - } catch (_) { + } catch { /* istanbul ignore next */ throw new BadRequestError(ERR_UNABLE_DECODE_PARAM, { param }); } @@ -28,10 +28,8 @@ function decodeParam(param) { // Remove slashes "/" from the left & right sides and remove double "//" slashes function removeTrailingSlashes(s) { - if (s.startsWith("/")) - s = s.slice(1); - if (s.endsWith("/")) - s = s.slice(0, -1); + if (s.startsWith("/")) s = s.slice(1); + if (s.endsWith("/")) s = s.slice(0, -1); return s; //.replace(/\/\//g, "/"); } @@ -55,8 +53,7 @@ function compose(...mws) { return (req, res, done) => { const next = (i, err) => { if (i >= mws.length) { - if (_.isFunction(done)) - return done.call(self, err); + if (_.isFunction(done)) return done.call(self, err); /* istanbul ignore next */ return; @@ -64,15 +61,11 @@ function compose(...mws) { if (err) { // Call only error middlewares (err, req, res, next) - if (mws[i].length == 4) - mws[i].call(self, err, req, res, err => next(i + 1, err)); - else - next(i + 1, err); + if (mws[i].length == 4) mws[i].call(self, err, req, res, err => next(i + 1, err)); + else next(i + 1, err); } else { - if (mws[i].length < 4) - mws[i].call(self, req, res, err => next(i + 1, err)); - else - next(i + 1); + if (mws[i].length < 4) mws[i].call(self, req, res, err => next(i + 1, err)); + else next(i + 1); } }; @@ -90,12 +83,13 @@ function composeThen(req, res, ...mws) { compose.call(this, ...mws)(req, res, err => { if (err) { /* istanbul ignore next */ - if (err instanceof MoleculerError) - return reject(err); + if (err instanceof MoleculerError) return reject(err); /* istanbul ignore next */ if (err instanceof Error) - return reject(new MoleculerError(err.message, err.code || err.status, err.type)); // TODO err.stack + return reject( + new MoleculerError(err.message, err.code || err.status, err.type) + ); // TODO err.stack /* istanbul ignore next */ return reject(new MoleculerError(err)); @@ -115,14 +109,11 @@ function composeThen(req, res, ...mws) { * @returns {String} */ function generateETag(body, opt) { - if (_.isFunction(opt)) - return opt.call(this, body); + if (_.isFunction(opt)) return opt.call(this, body); - let buf = !Buffer.isBuffer(body) - ? Buffer.from(body) - : body; + let buf = !Buffer.isBuffer(body) ? Buffer.from(body) : body; - return etag(buf, (opt === true || opt === "weak") ? { weak: true } : null); + return etag(buf, opt === true || opt === "weak" ? { weak: true } : null); } /** @@ -136,7 +127,7 @@ function generateETag(body, opt) { function isFresh(req, res) { if ((res.statusCode >= 200 && res.statusCode < 300) || 304 === res.statusCode) { return fresh(req.headers, { - "etag": res.getHeader("ETag"), + etag: res.getHeader("ETag"), "last-modified": res.getHeader("Last-Modified") }); } diff --git a/test/integration/index.spec.js b/test/integration/index.spec.js index a8bb8e3e..80829cc3 100644 --- a/test/integration/index.spec.js +++ b/test/integration/index.spec.js @@ -27,7 +27,9 @@ setTimeout(() => { }, 10 * 1000).unref();*/ function setup(settings, brokerSettings = {}) { - const broker = new ServiceBroker(Object.assign({}, { nodeID: undefined, logger: false }, brokerSettings)); + const broker = new ServiceBroker( + Object.assign({}, { nodeID: undefined, logger: false }, brokerSettings) + ); broker.loadService("./test/services/test.service"); const service = broker.createService({ @@ -58,10 +60,10 @@ describe("Test default settings", () => { expect(res.statusCode).toBe(404); expect(res.headers["content-type"]).toBe("application/json; charset=utf-8"); expect(res.body).toEqual({ - "code": 404, - "message": "Not found", - "name": "NotFoundError", - "type": "NOT_FOUND" + code: 404, + message: "Not found", + name: "NotFoundError", + type: "NOT_FOUND" }); }); }); @@ -73,11 +75,11 @@ describe("Test default settings", () => { expect(res.statusCode).toBe(404); expect(res.headers["content-type"]).toBe("application/json; charset=utf-8"); expect(res.body).toEqual({ - "code": 404, - "message": "Service 'other.action' is not found.", - "name": "ServiceNotFoundError", - "type": "SERVICE_NOT_FOUND", - "data": { + code: 404, + message: "Service 'other.action' is not found.", + name: "ServiceNotFoundError", + type: "SERVICE_NOT_FOUND", + data: { action: "other.action" } }); @@ -164,12 +166,16 @@ describe("Test responses", () => { let server; beforeAll(() => { - - [broker, service, server] = setup({ - routes: [{ - camelCaseNames: true - }] - }, { metrics: true }); + [broker, service, server] = setup( + { + routes: [ + { + camelCaseNames: true + } + ] + }, + { metrics: true } + ); return broker.start(); }); @@ -335,8 +341,12 @@ describe("Test responses", () => { .then(res => { expect(res.statusCode).toBe(200); expect(res.headers["content-type"]).toBe("application/octet-stream"); - expect(res.headers["content-disposition"]).toBe("attachment; filename=\"stream-lorem.txt\""); - expect(Buffer.from(res.body).toString("utf8")).toEqual("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis in faucibus sapien, vitae aliquet nisi. Vivamus quis finibus tortor."); + expect(res.headers["content-disposition"]).toBe( + 'attachment; filename="stream-lorem.txt"' + ); + expect(Buffer.from(res.body).toString("utf8")).toEqual( + "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis in faucibus sapien, vitae aliquet nisi. Vivamus quis finibus tortor." + ); }); }); @@ -390,9 +400,9 @@ describe("Test responses", () => { expect(res.headers["content-type"]).toBe("application/json; charset=utf-8"); expect(res.headers["x-request-id"]).toBeDefined(); expect(res.body).toEqual({ - "code": 500, - "message": "I'm dangerous", - "name": "MoleculerServerError" + code: 500, + message: "I'm dangerous", + name: "MoleculerServerError" }); }); }); @@ -406,7 +416,9 @@ describe("Test responses", () => { expect(res.headers["x-invalid-header"]).toBe(encodeURI("\r\nBOOM")); expect(res.headers["x-request-id"]).toBeDefined(); expect(res.headers["x-custom-header"]).toBe("Custom content"); - expect(res.text).toBe("{\"name\":\"MoleculerServerError\",\"message\":\"It is a wrong action! I always throw error!\",\"code\":500}"); + expect(res.text).toBe( + '{"name":"MoleculerServerError","message":"It is a wrong action! I always throw error!","code":500}' + ); }); }); @@ -416,7 +428,7 @@ describe("Test responses", () => { .then(res => { expect(res.headers["x-valid-header"]).toBe("valid header"); expect(res.headers["x-invalid-header"]).toBe(encodeURI("\r\nBOOM")); - expect(res.text).toBe("{\"x-invalid-header\":\"\\r\\nBOOM\"}"); + expect(res.text).toBe('{"x-invalid-header":"\\r\\nBOOM"}'); }); }); }); @@ -442,10 +454,10 @@ describe("Test with `path` prefix", () => { expect(res.statusCode).toBe(404); expect(res.headers["content-type"]).toBe("application/json; charset=utf-8"); expect(res.body).toEqual({ - "code": 404, - "message": "Not found", - "name": "NotFoundError", - "type": "NOT_FOUND" + code: 404, + message: "Not found", + name: "NotFoundError", + type: "NOT_FOUND" }); }); }); @@ -457,10 +469,10 @@ describe("Test with `path` prefix", () => { expect(res.statusCode).toBe(404); expect(res.headers["content-type"]).toBe("application/json; charset=utf-8"); expect(res.body).toEqual({ - "code": 404, - "message": "Not found", - "name": "NotFoundError", - "type": "NOT_FOUND" + code: 404, + message: "Not found", + name: "NotFoundError", + type: "NOT_FOUND" }); }); }); @@ -474,7 +486,6 @@ describe("Test with `path` prefix", () => { expect(res.body).toBe("Hello Moleculer"); }); }); - }); describe("Test with `/` path prefix", () => { @@ -498,10 +509,10 @@ describe("Test with `/` path prefix", () => { expect(res.statusCode).toBe(404); expect(res.headers["content-type"]).toBe("application/json; charset=utf-8"); expect(res.body).toEqual({ - "code": 404, - "message": "Not found", - "name": "NotFoundError", - "type": "NOT_FOUND" + code: 404, + message: "Not found", + name: "NotFoundError", + type: "NOT_FOUND" }); }); }); @@ -515,7 +526,6 @@ describe("Test with `/` path prefix", () => { expect(res.body).toBe("Hello Moleculer"); }); }); - }); describe("Test only assets", () => { @@ -540,7 +550,9 @@ describe("Test only assets", () => { .then(res => { expect(res.statusCode).toBe(200); expect(res.headers["content-type"]).toBe("text/html; charset=UTF-8"); - expect(res.text).toBe(fs.readFileSync(path.join(__dirname, "..", "assets", "index.html"), "utf8")); + expect(res.text).toBe( + fs.readFileSync(path.join(__dirname, "..", "assets", "index.html"), "utf8") + ); }); }); @@ -550,7 +562,9 @@ describe("Test only assets", () => { .then(res => { expect(res.statusCode).toBe(200); expect(res.headers["content-type"]).toBe("text/plain; charset=UTF-8"); - expect(res.text).toBe("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis in faucibus sapien, vitae aliquet nisi. Vivamus quis finibus tortor."); + expect(res.text).toBe( + "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis in faucibus sapien, vitae aliquet nisi. Vivamus quis finibus tortor." + ); }); }); @@ -561,15 +575,13 @@ describe("Test only assets", () => { expect(res.statusCode).toBe(404); expect(res.headers["content-type"]).toBe("application/json; charset=utf-8"); expect(res.body).toEqual({ - "code": 404, - "message": "Not found", - "name": "NotFoundError", - "type": "NOT_FOUND" + code: 404, + message: "Not found", + name: "NotFoundError", + type: "NOT_FOUND" }); }); - }); - }); describe("Test assets with cors", () => { @@ -632,9 +644,11 @@ describe("Test assets & API route", () => { assets: { folder: path.join(__dirname, "..", "assets") }, - routes: [{ - path: "/api" - }] + routes: [ + { + path: "/api" + } + ] }); return broker.start(); }); @@ -646,7 +660,9 @@ describe("Test assets & API route", () => { .then(res => { expect(res.statusCode).toBe(200); expect(res.headers["content-type"]).toBe("text/html; charset=UTF-8"); - expect(res.text).toBe(fs.readFileSync(path.join(__dirname, "..", "assets", "index.html"), "utf8")); + expect(res.text).toBe( + fs.readFileSync(path.join(__dirname, "..", "assets", "index.html"), "utf8") + ); }); }); @@ -656,7 +672,9 @@ describe("Test assets & API route", () => { .then(res => { expect(res.statusCode).toBe(200); expect(res.headers["content-type"]).toBe("text/plain; charset=UTF-8"); - expect(res.text).toBe("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis in faucibus sapien, vitae aliquet nisi. Vivamus quis finibus tortor."); + expect(res.text).toBe( + "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis in faucibus sapien, vitae aliquet nisi. Vivamus quis finibus tortor." + ); }); }); @@ -679,7 +697,6 @@ describe("Test assets & API route", () => { expect(res.body).toEqual(Buffer.from("Hello file content\n")); }); }); - }); describe("Test whitelist", () => { @@ -689,14 +706,12 @@ describe("Test whitelist", () => { beforeAll(() => { [broker, service, server] = setup({ - routes: [{ - path: "/api", - whitelist: [ - "test.hello", - "math.*", - /^test\.json/ - ] - }] + routes: [ + { + path: "/api", + whitelist: ["test.hello", "math.*", /^test\.json/] + } + ] }); broker.loadService("./test/services/math.service"); @@ -732,7 +747,7 @@ describe("Test whitelist", () => { expect(res.headers["content-type"]).toBe("application/json; charset=utf-8"); expect(res.body).toEqual([ { id: 1, name: "John" }, - { id: 2, name: "Jane" }, + { id: 2, name: "Jane" } ]); }); }); @@ -815,7 +830,7 @@ describe("Test aliases", () => { { path: "/api", aliases: { - "add": "math.add", + add: "math.add", "GET hello": "test.hello", "POST /hello": "test.greeter", "GET greeter/:name": "test.greeter", @@ -826,16 +841,25 @@ describe("Test aliases", () => { "GET custom": customAlias, "GET /middleware": customMiddlewares, "GET /wrong-middleware": [customMiddlewares[0], customMiddlewares[1]], - "GET /error-middleware": [customMiddlewares[0], customMiddlewares[1], throwMiddleware], - "GET /error-handled-middleware": [customMiddlewares[0], customMiddlewares[1], throwMiddleware, errorHandlerMiddleware], + "GET /error-middleware": [ + customMiddlewares[0], + customMiddlewares[1], + throwMiddleware + ], + "GET /error-handled-middleware": [ + customMiddlewares[0], + customMiddlewares[1], + throwMiddleware, + errorHandlerMiddleware + ], "GET reqres": { action: "test.reqres", passReqResToParams: true - }, + } } }, { - path: "/unsecure", + path: "/unsecure" } ] }); @@ -846,7 +870,6 @@ describe("Test aliases", () => { afterAll(() => broker.stop()); - it("GET /unsecure/math.add", () => { return request(server) .get("/unsecure/math.add") @@ -866,10 +889,10 @@ describe("Test aliases", () => { expect(res.statusCode).toBe(404); expect(res.headers["content-type"]).toBe("application/json; charset=utf-8"); expect(res.body).toEqual({ - "name": "NotFoundError", - "message": "Not found", - "code": 404, - "type": "NOT_FOUND", + name: "NotFoundError", + message: "Not found", + code: 404, + type: "NOT_FOUND" }); }); }); @@ -963,10 +986,10 @@ describe("Test aliases", () => { expect(res.statusCode).toBe(404); expect(res.headers["content-type"]).toBe("application/json; charset=utf-8"); expect(res.body).toEqual({ - "name": "NotFoundError", - "message": "Not found", - "code": 404, - "type": "NOT_FOUND" + name: "NotFoundError", + message: "Not found", + code: 404, + type: "NOT_FOUND" }); }); }); @@ -1003,7 +1026,7 @@ describe("Test aliases", () => { expect(res.statusCode).toBe(200); expect(res.headers["content-type"]).toBe("application/json; charset=utf-8"); expect(res.body.params).toEqual({ - a: ["1", "2"], + a: ["1", "2"] }); }); }); @@ -1061,7 +1084,11 @@ describe("Test aliases", () => { expect(res.statusCode).toBe(200); expect(res.text).toBe("Custom Alias by Ben"); expect(customAlias).toHaveBeenCalledTimes(1); - expect(customAlias).toHaveBeenCalledWith(expect.any(http.IncomingMessage), expect.any(http.ServerResponse), expect.any(Function)); + expect(customAlias).toHaveBeenCalledWith( + expect.any(http.IncomingMessage), + expect.any(http.ServerResponse), + expect.any(Function) + ); }); }); @@ -1074,13 +1101,23 @@ describe("Test aliases", () => { expect(res.body).toBe("Hello Ben"); expect(customMiddlewares[0]).toHaveBeenCalledTimes(1); - expect(customMiddlewares[0]).toHaveBeenCalledWith(expect.any(http.IncomingMessage), expect.any(http.ServerResponse), expect.any(Function)); + expect(customMiddlewares[0]).toHaveBeenCalledWith( + expect.any(http.IncomingMessage), + expect.any(http.ServerResponse), + expect.any(Function) + ); expect(customMiddlewares[1]).toHaveBeenCalledTimes(1); - expect(customMiddlewares[1]).toHaveBeenCalledWith(expect.any(http.IncomingMessage), expect.any(http.ServerResponse), expect.any(Function)); + expect(customMiddlewares[1]).toHaveBeenCalledWith( + expect.any(http.IncomingMessage), + expect.any(http.ServerResponse), + expect.any(Function) + ); expect(customMiddlewares[0].mock.calls[0][0].url).toBe("/middleware?name=Ben"); - expect(customMiddlewares[0].mock.calls[0][0].originalUrl).toBe("/api/middleware?name=Ben"); + expect(customMiddlewares[0].mock.calls[0][0].originalUrl).toBe( + "/api/middleware?name=Ben" + ); expect(customMiddlewares[0].mock.calls[0][0].baseUrl).toBe("/api"); }); }); @@ -1094,28 +1131,35 @@ describe("Test aliases", () => { .then(res => { expect(res.statusCode).toBe(500); expect(res.body).toEqual({ - "name": "MoleculerServerError", - "message": "No alias handler", - "code": 500, - "type": "NO_ALIAS_HANDLER", - "data": { - "path": "/api/wrong-middleware", - "alias": { - "method": "GET", - "path": "wrong-middleware" + name: "MoleculerServerError", + message: "No alias handler", + code: 500, + type: "NO_ALIAS_HANDLER", + data: { + path: "/api/wrong-middleware", + alias: { + method: "GET", + path: "wrong-middleware" } } }); expect(customMiddlewares[0]).toHaveBeenCalledTimes(1); - expect(customMiddlewares[0]).toHaveBeenCalledWith(expect.any(http.IncomingMessage), expect.any(http.ServerResponse), expect.any(Function)); + expect(customMiddlewares[0]).toHaveBeenCalledWith( + expect.any(http.IncomingMessage), + expect.any(http.ServerResponse), + expect.any(Function) + ); expect(customMiddlewares[1]).toHaveBeenCalledTimes(1); - expect(customMiddlewares[1]).toHaveBeenCalledWith(expect.any(http.IncomingMessage), expect.any(http.ServerResponse), expect.any(Function)); + expect(customMiddlewares[1]).toHaveBeenCalledWith( + expect.any(http.IncomingMessage), + expect.any(http.ServerResponse), + expect.any(Function) + ); }); }); - it("GET /api/error-middleware", () => { customMiddlewares[0].mockClear(); customMiddlewares[1].mockClear(); @@ -1126,19 +1170,31 @@ describe("Test aliases", () => { .then(res => { expect(res.statusCode).toBe(500); expect(res.body).toEqual({ - "name": "MoleculerError", - "message": "Some error", - "code": 500 + name: "MoleculerError", + message: "Some error", + code: 500 }); expect(customMiddlewares[0]).toHaveBeenCalledTimes(1); - expect(customMiddlewares[0]).toHaveBeenCalledWith(expect.any(http.IncomingMessage), expect.any(http.ServerResponse), expect.any(Function)); + expect(customMiddlewares[0]).toHaveBeenCalledWith( + expect.any(http.IncomingMessage), + expect.any(http.ServerResponse), + expect.any(Function) + ); expect(customMiddlewares[1]).toHaveBeenCalledTimes(1); - expect(customMiddlewares[1]).toHaveBeenCalledWith(expect.any(http.IncomingMessage), expect.any(http.ServerResponse), expect.any(Function)); + expect(customMiddlewares[1]).toHaveBeenCalledWith( + expect.any(http.IncomingMessage), + expect.any(http.ServerResponse), + expect.any(Function) + ); expect(throwMiddleware).toHaveBeenCalledTimes(1); - expect(throwMiddleware).toHaveBeenCalledWith(expect.any(http.IncomingMessage), expect.any(http.ServerResponse), expect.any(Function)); + expect(throwMiddleware).toHaveBeenCalledWith( + expect.any(http.IncomingMessage), + expect.any(http.ServerResponse), + expect.any(Function) + ); }); }); @@ -1155,16 +1211,33 @@ describe("Test aliases", () => { expect(res.text).toEqual("Error is handled"); expect(customMiddlewares[0]).toHaveBeenCalledTimes(1); - expect(customMiddlewares[0]).toHaveBeenCalledWith(expect.any(http.IncomingMessage), expect.any(http.ServerResponse), expect.any(Function)); + expect(customMiddlewares[0]).toHaveBeenCalledWith( + expect.any(http.IncomingMessage), + expect.any(http.ServerResponse), + expect.any(Function) + ); expect(customMiddlewares[1]).toHaveBeenCalledTimes(1); - expect(customMiddlewares[1]).toHaveBeenCalledWith(expect.any(http.IncomingMessage), expect.any(http.ServerResponse), expect.any(Function)); + expect(customMiddlewares[1]).toHaveBeenCalledWith( + expect.any(http.IncomingMessage), + expect.any(http.ServerResponse), + expect.any(Function) + ); expect(throwMiddleware).toHaveBeenCalledTimes(1); - expect(throwMiddleware).toHaveBeenCalledWith(expect.any(http.IncomingMessage), expect.any(http.ServerResponse), expect.any(Function)); + expect(throwMiddleware).toHaveBeenCalledWith( + expect.any(http.IncomingMessage), + expect.any(http.ServerResponse), + expect.any(Function) + ); expect(errorHandlerMiddleware).toHaveBeenCalledTimes(1); - expect(errorHandlerMiddleware).toHaveBeenCalledWith(expect.any(MoleculerError), expect.any(http.IncomingMessage), expect.any(http.ServerResponse), expect.any(Function)); + expect(errorHandlerMiddleware).toHaveBeenCalledWith( + expect.any(MoleculerError), + expect.any(http.IncomingMessage), + expect.any(http.ServerResponse), + expect.any(Function) + ); }); }); @@ -1189,17 +1262,19 @@ describe("Test un-merged params", () => { beforeAll(() => { [broker, service, server] = setup({ - routes: [{ - path: "/api", - mergeParams: false, - aliases: { - "GET echo": "test.echo", - "POST /echo": "test.echo", - "param-test/:name": "test.echo", - "opt-test/:name?": "test.echo", - "repeat-test/:args*": "test.echo", + routes: [ + { + path: "/api", + mergeParams: false, + aliases: { + "GET echo": "test.echo", + "POST /echo": "test.echo", + "param-test/:name": "test.echo", + "opt-test/:name?": "test.echo", + "repeat-test/:args*": "test.echo" + } } - }] + ] }); return broker.start(); }); @@ -1369,12 +1444,14 @@ describe("Test REST shorthand aliases", () => { beforeAll(() => { [broker, service, server] = setup({ - routes: [{ - path: "/api", - aliases: { - "REST posts": "posts" + routes: [ + { + path: "/api", + aliases: { + "REST posts": "posts" + } } - }] + ] }); broker.loadService("./test/services/posts.service"); @@ -1392,7 +1469,6 @@ describe("Test REST shorthand aliases", () => { }); }); - it("GET /api/posts/2", () => { return request(server) .get("/api/posts/2") @@ -1471,7 +1547,6 @@ describe("Test REST shorthand aliases", () => { expect(res.statusCode).toBe(404); }); }); - }); describe("Test REST shorthand aliases and only filter", () => { @@ -1481,15 +1556,17 @@ describe("Test REST shorthand aliases and only filter", () => { beforeAll(() => { [broker, service, server] = setup({ - routes: [{ - path: "/api", - aliases: { - "REST posts": { - action: "posts", - only: ["list", "get"] + routes: [ + { + path: "/api", + aliases: { + "REST posts": { + action: "posts", + only: ["list", "get"] + } } } - }] + ] }); broker.loadService("./test/services/posts.service"); @@ -1562,15 +1639,17 @@ describe("Test REST shorthand aliases and except filter", () => { beforeAll(() => { [broker, service, server] = setup({ - routes: [{ - path: "/api", - aliases: { - "REST posts": { - action: "posts", - except: ["list", "get", "update", "remove"] + routes: [ + { + path: "/api", + aliases: { + "REST posts": { + action: "posts", + except: ["list", "get", "update", "remove"] + } } } - }] + ] }); broker.loadService("./test/services/posts.service"); @@ -1645,16 +1724,18 @@ describe("Test REST shorthand aliases and only, except filter", () => { beforeAll(() => { [broker, service, server] = setup({ - routes: [{ - path: "/api", - aliases: { - "REST posts": { - action: "posts", - only: ["list", "get"], - except: ["list"] + routes: [ + { + path: "/api", + aliases: { + "REST posts": { + action: "posts", + only: ["list", "get"], + except: ["list"] + } } } - }] + ] }); broker.loadService("./test/services/posts.service"); @@ -1725,21 +1806,21 @@ describe("Test alias & whitelist", () => { beforeAll(() => { [broker, service, server] = setup({ - routes: [{ - path: "/api", - whitelist: [ - "math.*" - ], - aliases: { - "add": "math.add", - "hello": "test.hello", - "mw-hello": [ - (req, res, next) => next(), - (req, res, next) => next(), - "test.hello", - ] + routes: [ + { + path: "/api", + whitelist: ["math.*"], + aliases: { + add: "math.add", + hello: "test.hello", + "mw-hello": [ + (req, res, next) => next(), + (req, res, next) => next(), + "test.hello" + ] + } } - }] + ] }); broker.loadService("./test/services/math.service"); @@ -1793,7 +1874,6 @@ describe("Test alias & whitelist", () => { }); }); }); - }); describe("Test body-parsers", () => { @@ -1801,8 +1881,7 @@ describe("Test body-parsers", () => { let service; let server; - beforeAll(() => { - }); + beforeAll(() => {}); describe("JSON parser should be set to default", () => { it("When its value is null / undefined", () => { @@ -1813,27 +1892,35 @@ describe("Test body-parsers", () => { expect(Array.isArray(service.routes) && service.routes.length === 1).toBeTruthy(); const middlewares = service.routes[0].middlewares; expect(Array.isArray(middlewares) && middlewares.length === 1).toBeTruthy(); - expect(typeof middlewares[0] === "function" && middlewares[0].name === "jsonParser").toBeTruthy(); + expect( + typeof middlewares[0] === "function" && middlewares[0].name === "jsonParser" + ).toBeTruthy(); }); it("When its value is true", () => { [broker, service, server] = setup({ - routes: [{ - "bodyParsers": true - }] + routes: [ + { + bodyParsers: true + } + ] }); expect(Array.isArray(service.routes) && service.routes.length === 1).toBeTruthy(); const middlewares = service.routes[0].middlewares; expect(Array.isArray(middlewares) && middlewares.length === 1).toBeTruthy(); - expect(typeof middlewares[0] === "function" && middlewares[0].name === "jsonParser").toBeTruthy(); + expect( + typeof middlewares[0] === "function" && middlewares[0].name === "jsonParser" + ).toBeTruthy(); }); it("But not truly", () => { [broker, service, server] = setup({ - routes: [{ - "bodyParsers": 1 - }] + routes: [ + { + bodyParsers: 1 + } + ] }); expect(Array.isArray(service.routes) && service.routes.length === 1).toBeTruthy(); @@ -1844,120 +1931,169 @@ describe("Test body-parsers", () => { it("POST /api/test.gretter without bodyParsers", () => { [broker, service, server] = setup({ - routes: [{ - bodyParsers: false - }] + routes: [ + { + bodyParsers: false + } + ] }); - return broker.start() - .then(() => request(server) - .post("/test.greeter") - .send({ name: "John" })) + return broker + .start() + .then(() => request(server).post("/test.greeter").send({ name: "John" })) .then(res => { expect(res.statusCode).toBe(422); expect(res.headers["content-type"]).toBe("application/json; charset=utf-8"); expect(res.body).toEqual({ - "code": 422, - "data": [{ - "field": "name", - "message": "The 'name' field is required.", - "type": "required", - "action": "test.greeter", - "nodeID": broker.nodeID - }], - "message": "Parameters validation error!", - "name": "ValidationError", - "type": "VALIDATION_ERROR" + code: 422, + data: [ + { + field: "name", + message: "The 'name' field is required.", + type: "required", + action: "test.greeter", + nodeID: broker.nodeID + } + ], + message: "Parameters validation error!", + name: "ValidationError", + type: "VALIDATION_ERROR" }); - }).then(() => broker.stop()).catch(err => broker.stop().then(() => { throw err; })); + }) + .then(() => broker.stop()) + .catch(err => + broker.stop().then(() => { + throw err; + }) + ); }); it("POST /api/test.gretter with JSON parser", () => { [broker, service, server] = setup({ - routes: [{ - bodyParsers: { - json: true + routes: [ + { + bodyParsers: { + json: true + } } - }] + ] }); - return broker.start() - .then(() => request(server) - .post("/test.greeter") - .send({ name: "John" })) + return broker + .start() + .then(() => request(server).post("/test.greeter").send({ name: "John" })) .then(res => { expect(res.statusCode).toBe(200); expect(res.headers["content-type"]).toBe("application/json; charset=utf-8"); expect(res.body).toBe("Hello John"); - }).then(() => broker.stop()).catch(err => broker.stop().then(() => { throw err; })); + }) + .then(() => broker.stop()) + .catch(err => + broker.stop().then(() => { + throw err; + }) + ); }); it("POST /api/test.gretter with JSON parser & invalid JSON", () => { [broker, service, server] = setup({ - routes: [{ - bodyParsers: { - json: true + routes: [ + { + bodyParsers: { + json: true + } } - }] + ] }); - return broker.start() - .then(() => request(server) - .post("/test.greeter") - .set("Content-Type", "application/json; charset=utf-8") - .send("invalid")) + return broker + .start() + .then(() => + request(server) + .post("/test.greeter") + .set("Content-Type", "application/json; charset=utf-8") + .send("invalid") + ) .then(res => { expect(res.statusCode).toBe(400); expect(res.headers["content-type"]).toBe("application/json; charset=utf-8"); expect(res.body).toEqual({ - "code": 400, - "type": "entity.parse.failed", - "message": process.version.startsWith("v2")? "Unexpected token 'i', \"#\" is not valid JSON": "Unexpected token i in JSON at position 0", - "name": "MoleculerError" + code: 400, + type: "entity.parse.failed", + message: process.version.startsWith("v2") + ? "Unexpected token 'i', \"#\" is not valid JSON" + : "Unexpected token i in JSON at position 0", + name: "MoleculerError" }); - }).then(() => broker.stop()).catch(err => broker.stop().then(() => { throw err; })); + }) + .then(() => broker.stop()) + .catch(err => + broker.stop().then(() => { + throw err; + }) + ); }); - it("POST /api/test.gretter with JSON parser & urlEncoded body", () => { [broker, service, server] = setup({ - routes: [{ - bodyParsers: { - json: true + routes: [ + { + bodyParsers: { + json: true + } } - }] + ] }); - return broker.start() - .then(() => request(server) - .post("/test.greeter") - .set("Content-Type", "application/x-www-form-urlencoded") - .send({ name: "Bill" })) + return broker + .start() + .then(() => + request(server) + .post("/test.greeter") + .set("Content-Type", "application/x-www-form-urlencoded") + .send({ name: "Bill" }) + ) .then(res => { expect(res.statusCode).toBe(422); }) - .then(() => broker.stop()).catch(err => broker.stop().then(() => { throw err; })); + .then(() => broker.stop()) + .catch(err => + broker.stop().then(() => { + throw err; + }) + ); }); it("POST /api/test.gretter with urlencoder parser", () => { [broker, service, server] = setup({ - routes: [{ - bodyParsers: { - urlencoded: { extended: true } + routes: [ + { + bodyParsers: { + urlencoded: { extended: true } + } } - }] + ] }); - return broker.start() - .then(() => request(server) - .post("/test.greeter") - .set("Content-Type", "application/x-www-form-urlencoded") - .send({ name: "Adam" })) + return broker + .start() + .then(() => + request(server) + .post("/test.greeter") + .set("Content-Type", "application/x-www-form-urlencoded") + .send({ name: "Adam" }) + ) .then(res => { expect(res.statusCode).toBe(200); expect(res.headers["content-type"]).toBe("application/json; charset=utf-8"); expect(res.body).toBe("Hello Adam"); - }).then(() => broker.stop()).catch(err => broker.stop().then(() => { throw err; })); + }) + .then(() => broker.stop()) + .catch(err => + broker.stop().then(() => { + throw err; + }) + ); }); }); @@ -1971,21 +2107,17 @@ describe("Test multiple routes", () => { routes: [ { path: "/api1", - whitelist: [ - "math.*" - ], + whitelist: ["math.*"], aliases: { - "main": "math.add" + main: "math.add" }, mappingPolicy: "all" }, { path: "/api2", - whitelist: [ - "test.*" - ], + whitelist: ["test.*"], aliases: { - "main": "test.greeter" + main: "test.greeter" }, mappingPolicy: "all" } @@ -2070,11 +2202,9 @@ describe("Test mappingPolicy route option", () => { routes: [ { path: "/api", - whitelist: [ - "math.*" - ], + whitelist: ["math.*"], aliases: { - "add": "math.add" + add: "math.add" }, mappingPolicy: "all" } @@ -2126,11 +2256,9 @@ describe("Test mappingPolicy route option", () => { routes: [ { path: "/api", - whitelist: [ - "math.*" - ], + whitelist: ["math.*"], aliases: { - "add": "math.add" + add: "math.add" }, mappingPolicy: "restrict" } @@ -2201,7 +2329,6 @@ describe("Test mappingPolicy route option", () => { expect(res.statusCode).toBe(404); }); }); - }); }); @@ -2210,20 +2337,25 @@ describe("Test CORS", () => { let service; let server; - beforeAll(() => { - }); + beforeAll(() => {}); it("no errors if missing origin header", () => { [broker, service, server] = setup({ cors: {} }); - return broker.start() - .then(() => request(server) - .get("/test/hello")) + return broker + .start() + .then(() => request(server).get("/test/hello")) .then(res => { expect(res.statusCode).toBe(200); expect(res.body).toEqual("Hello Moleculer"); - }).then(() => broker.stop()).catch(err => broker.stop().then(() => { throw err; })); + }) + .then(() => broker.stop()) + .catch(err => + broker.stop().then(() => { + throw err; + }) + ); }); it("errors on mismatching origin header", () => { @@ -2232,19 +2364,24 @@ describe("Test CORS", () => { origin: "a" } }); - return broker.start() - .then(() => request(server) - .get("/test/hello") - .set("Origin", "http://localhost:3000")) + return broker + .start() + .then(() => request(server).get("/test/hello").set("Origin", "http://localhost:3000")) .then(res => { expect(res.statusCode).toBe(403); expect(res.body).toEqual({ - "message": "Forbidden", - "code": 403, - "type": "ORIGIN_NOT_ALLOWED", - "name": "ForbiddenError" + message: "Forbidden", + code: 403, + type: "ORIGIN_NOT_ALLOWED", + name: "ForbiddenError" }); - }).then(() => broker.stop()).catch(err => broker.stop().then(() => { throw err; })); + }) + .then(() => broker.stop()) + .catch(err => + broker.stop().then(() => { + throw err; + }) + ); }); it("with default settings", () => { @@ -2252,10 +2389,9 @@ describe("Test CORS", () => { cors: {} }); - return broker.start() - .then(() => request(server) - .get("/test/hello") - .set("Origin", "http://localhost:3000")) + return broker + .start() + .then(() => request(server).get("/test/hello").set("Origin", "http://localhost:3000")) .then(res => { expect(res.statusCode).toBe(200); expect(res.headers["content-type"]).toBe("application/json; charset=utf-8"); @@ -2263,7 +2399,12 @@ describe("Test CORS", () => { expect(res.body).toBe("Hello Moleculer"); }) - .then(() => broker.stop()).catch(err => broker.stop().then(() => { throw err; })); + .then(() => broker.stop()) + .catch(err => + broker.stop().then(() => { + throw err; + }) + ); }); it("with custom global settings (string)", () => { @@ -2275,10 +2416,9 @@ describe("Test CORS", () => { } }); - return broker.start() - .then(() => request(server) - .get("/test/hello") - .set("Origin", "http://localhost:3000")) + return broker + .start() + .then(() => request(server).get("/test/hello").set("Origin", "http://localhost:3000")) .then(res => { expect(res.statusCode).toBe(200); expect(res.headers["content-type"]).toBe("application/json; charset=utf-8"); @@ -2288,13 +2428,18 @@ describe("Test CORS", () => { expect(res.body).toBe("Hello Moleculer"); }) - .then(() => broker.stop()).catch(err => broker.stop().then(() => { throw err; })); + .then(() => broker.stop()) + .catch(err => + broker.stop().then(() => { + throw err; + }) + ); }); it("with custom global settings (function)", () => { [broker, service, server] = setup({ cors: { - origin: (origin) => { + origin: origin => { return origin === "http://localhost:3000"; }, exposedHeaders: "X-Response-Time", @@ -2302,10 +2447,9 @@ describe("Test CORS", () => { } }); - return broker.start() - .then(() => request(server) - .get("/test/hello") - .set("Origin", "http://localhost:3000")) + return broker + .start() + .then(() => request(server).get("/test/hello").set("Origin", "http://localhost:3000")) .then(res => { expect(res.statusCode).toBe(200); expect(res.headers["content-type"]).toBe("application/json; charset=utf-8"); @@ -2315,13 +2459,16 @@ describe("Test CORS", () => { expect(res.body).toBe("Hello Moleculer"); }) - .then(() => request(server) - .get("/test/hello") - .set("Origin", "http://badhost:3000")) + .then(() => request(server).get("/test/hello").set("Origin", "http://badhost:3000")) .then(res => { expect(res.statusCode).toBe(403); }) - .then(() => broker.stop()).catch(err => broker.stop().then(() => { throw err; })); + .then(() => broker.stop()) + .catch(err => + broker.stop().then(() => { + throw err; + }) + ); }); it("with custom global settings (array)", () => { @@ -2333,20 +2480,26 @@ describe("Test CORS", () => { } }); - return broker.start() - .then(() => request(server) - .get("/test/hello") - .set("Origin", "https://localhost:4000")) + return broker + .start() + .then(() => request(server).get("/test/hello").set("Origin", "https://localhost:4000")) .then(res => { expect(res.statusCode).toBe(200); expect(res.headers["content-type"]).toBe("application/json; charset=utf-8"); expect(res.headers["access-control-allow-origin"]).toBe("https://localhost:4000"); expect(res.headers["access-control-allow-credentials"]).toBe("true"); - expect(res.headers["access-control-expose-headers"]).toBe("X-Custom-Header, X-Response-Time"); + expect(res.headers["access-control-expose-headers"]).toBe( + "X-Custom-Header, X-Response-Time" + ); expect(res.body).toBe("Hello Moleculer"); }) - .then(() => broker.stop()).catch(err => broker.stop().then(() => { throw err; })); + .then(() => broker.stop()) + .catch(err => + broker.stop().then(() => { + throw err; + }) + ); }); it("with custom route settings", () => { @@ -2356,19 +2509,20 @@ describe("Test CORS", () => { exposedHeaders: ["X-Custom-Header", "X-Response-Time"], credentials: true }, - routes: [{ - cors: { - origin: "http://test-server", - credentials: false, - exposedHeaders: ["X-Response-Time"] + routes: [ + { + cors: { + origin: "http://test-server", + credentials: false, + exposedHeaders: ["X-Response-Time"] + } } - }] + ] }); - return broker.start() - .then(() => request(server) - .get("/test/hello") - .set("Origin", "http://test-server")) + return broker + .start() + .then(() => request(server).get("/test/hello").set("Origin", "http://test-server")) .then(res => { expect(res.statusCode).toBe(200); expect(res.headers["content-type"]).toBe("application/json; charset=utf-8"); @@ -2377,20 +2531,24 @@ describe("Test CORS", () => { expect(res.body).toBe("Hello Moleculer"); }) - .then(() => broker.stop()).catch(err => broker.stop().then(() => { throw err; })); + .then(() => broker.stop()) + .catch(err => + broker.stop().then(() => { + throw err; + }) + ); }); it("returns matching CORS origin wildcard with single origin", () => { [broker, service, server] = setup({ cors: { - origin: "http://localhost:*", + origin: "http://localhost:*" } }); - return broker.start() - .then(() => request(server) - .get("/test/hello") - .set("Origin", "http://localhost:4000")) + return broker + .start() + .then(() => request(server).get("/test/hello").set("Origin", "http://localhost:4000")) .then(res => { expect(res.statusCode).toBe(200); expect(res.headers["content-type"]).toBe("application/json; charset=utf-8"); @@ -2399,20 +2557,24 @@ describe("Test CORS", () => { expect(res.body).toBe("Hello Moleculer"); }) - .then(() => broker.stop()).catch(err => broker.stop().then(() => { throw err; })); + .then(() => broker.stop()) + .catch(err => + broker.stop().then(() => { + throw err; + }) + ); }); it("returns matching CORS origin wildcard", () => { [broker, service, server] = setup({ cors: { - origin: ["http://test.example.com", "http://www.example.com", "http://*.a.com"], + origin: ["http://test.example.com", "http://www.example.com", "http://*.a.com"] } }); - return broker.start() - .then(() => request(server) - .get("/test/hello") - .set("Origin", "http://www.a.com")) + return broker + .start() + .then(() => request(server).get("/test/hello").set("Origin", "http://www.a.com")) .then(res => { expect(res.statusCode).toBe(200); expect(res.headers["content-type"]).toBe("application/json; charset=utf-8"); @@ -2421,20 +2583,24 @@ describe("Test CORS", () => { expect(res.body).toBe("Hello Moleculer"); }) - .then(() => broker.stop()).catch(err => broker.stop().then(() => { throw err; })); + .then(() => broker.stop()) + .catch(err => + broker.stop().then(() => { + throw err; + }) + ); }); it("returns matching CORS origin wildcard when more than one wildcard", () => { [broker, service, server] = setup({ cors: { - origin: ["http://test.example.com", "http://*.b.com", "http://*.a.com"], + origin: ["http://test.example.com", "http://*.b.com", "http://*.a.com"] } }); - return broker.start() - .then(() => request(server) - .get("/test/hello") - .set("Origin", "http://www.a.com")) + return broker + .start() + .then(() => request(server).get("/test/hello").set("Origin", "http://www.a.com")) .then(res => { expect(res.statusCode).toBe(200); expect(res.headers["content-type"]).toBe("application/json; charset=utf-8"); @@ -2443,7 +2609,12 @@ describe("Test CORS", () => { expect(res.body).toBe("Hello Moleculer"); }) - .then(() => broker.stop()).catch(err => broker.stop().then(() => { throw err; })); + .then(() => broker.stop()) + .catch(err => + broker.stop().then(() => { + throw err; + }) + ); }); it("preflight request with custom route settings", () => { @@ -2452,35 +2623,47 @@ describe("Test CORS", () => { origin: ["http://localhost:3000"], exposedHeaders: ["X-Custom-Header", "X-Response-Time"] }, - routes: [{ - cors: { - origin: "http://test-server", - credentials: true, - allowedHeaders: "X-Rate-Limiting", - methods: ["GET", "POST", "DELETE"], - maxAge: 3600 + routes: [ + { + cors: { + origin: "http://test-server", + credentials: true, + allowedHeaders: "X-Rate-Limiting", + methods: ["GET", "POST", "DELETE"], + maxAge: 3600 + } } - }] + ] }); - return broker.start() - .then(() => request(server) - .options("/test/hello") - .set("Origin", "http://test-server") - .set("Access-Control-Request-Method", "GET")) + return broker + .start() + .then(() => + request(server) + .options("/test/hello") + .set("Origin", "http://test-server") + .set("Access-Control-Request-Method", "GET") + ) .then(res => { expect(res.statusCode).toBe(204); expect(res.headers["access-control-allow-origin"]).toBe("http://test-server"); expect(res.headers["access-control-allow-headers"]).toBe("X-Rate-Limiting"); expect(res.headers["access-control-allow-methods"]).toBe("GET, POST, DELETE"); expect(res.headers["access-control-allow-credentials"]).toBe("true"); - expect(res.headers["access-control-expose-headers"]).toBe("X-Custom-Header, X-Response-Time"); + expect(res.headers["access-control-expose-headers"]).toBe( + "X-Custom-Header, X-Response-Time" + ); expect(res.headers["access-control-max-age"]).toBe("3600"); expect(res.headers["vary"]).toBe("Origin"); expect(res.text).toBe(""); }) - .then(() => broker.stop()).catch(err => broker.stop().then(() => { throw err; })); + .then(() => broker.stop()) + .catch(err => + broker.stop().then(() => { + throw err; + }) + ); }); it("preflight request with default settings", () => { @@ -2490,19 +2673,29 @@ describe("Test CORS", () => { } }); - return broker.start() - .then(() => request(server) - .options("/test/hello") - .set("Origin", "http://localhost:3000") - .set("Access-Control-Request-Method", "GET")) + return broker + .start() + .then(() => + request(server) + .options("/test/hello") + .set("Origin", "http://localhost:3000") + .set("Access-Control-Request-Method", "GET") + ) .then(res => { expect(res.statusCode).toBe(204); expect(res.headers["access-control-allow-origin"]).toBe("*"); - expect(res.headers["access-control-allow-headers"]).toBe("X-Custom-Header, X-Response-Time"); + expect(res.headers["access-control-allow-headers"]).toBe( + "X-Custom-Header, X-Response-Time" + ); expect(res.text).toBe(""); }) - .then(() => broker.stop()).catch(err => broker.stop().then(() => { throw err; })); + .then(() => broker.stop()) + .catch(err => + broker.stop().then(() => { + throw err; + }) + ); }); it("preflight request with 'Access-Control-Request-Headers'", () => { @@ -2510,33 +2703,45 @@ describe("Test CORS", () => { cors: { origin: "http://localhost:3000", exposedHeaders: ["X-Custom-Header", "X-Response-Time"], - methods: "GET", + methods: "GET" }, - routes: [{ - aliases: { - "GET hello": "test.hello" - }, - mappingPolicy: "restrict" - }] + routes: [ + { + aliases: { + "GET hello": "test.hello" + }, + mappingPolicy: "restrict" + } + ] }); - return broker.start() - .then(() => request(server) - .options("/hello") - .set("Origin", "http://localhost:3000") - .set("Access-Control-Request-Method", "GET") - .set("Access-Control-Request-Headers", "X-Rate-Limiting")) + return broker + .start() + .then(() => + request(server) + .options("/hello") + .set("Origin", "http://localhost:3000") + .set("Access-Control-Request-Method", "GET") + .set("Access-Control-Request-Headers", "X-Rate-Limiting") + ) .then(res => { expect(res.statusCode).toBe(204); expect(res.headers["access-control-allow-origin"]).toBe("http://localhost:3000"); expect(res.headers["access-control-allow-headers"]).toBe("X-Rate-Limiting"); expect(res.headers["access-control-allow-methods"]).toBe("GET"); - expect(res.headers["access-control-expose-headers"]).toBe("X-Custom-Header, X-Response-Time"); + expect(res.headers["access-control-expose-headers"]).toBe( + "X-Custom-Header, X-Response-Time" + ); expect(res.headers["vary"]).toBe("Access-Control-Request-Headers"); expect(res.text).toBe(""); }) - .then(() => broker.stop()).catch(err => broker.stop().then(() => { throw err; })); + .then(() => broker.stop()) + .catch(err => + broker.stop().then(() => { + throw err; + }) + ); }); }); @@ -2652,12 +2857,15 @@ describe("Test Rate Limiter", () => { }); expect(factory).toHaveBeenCalledTimes(1); - expect(factory).toHaveBeenCalledWith(10000, service.routes[0].rateLimit, expect.any(ServiceBroker)); + expect(factory).toHaveBeenCalledWith( + 10000, + service.routes[0].rateLimit, + expect.any(ServiceBroker) + ); }); }); describe("Test onBeforeCall & onAfterCall", () => { - it("should call handlers", () => { const broker = new ServiceBroker({ logger: true, logLevel: "error" }); broker.loadService("./test/services/test.service"); @@ -2685,14 +2893,16 @@ describe("Test onBeforeCall & onAfterCall", () => { const service = broker.createService({ mixins: [ApiGateway], settings: { - routes: [{ - aliases: { - "hello": "test.hello", - "custom": (req, res) => res.end("Hello Custom") - }, - onBeforeCall: beforeCall, - onAfterCall: afterCall, - }] + routes: [ + { + aliases: { + hello: "test.hello", + custom: (req, res) => res.end("Hello Custom") + }, + onBeforeCall: beforeCall, + onAfterCall: afterCall + } + ] } }); const server = service.server; @@ -2700,16 +2910,22 @@ describe("Test onBeforeCall & onAfterCall", () => { expect(service.routes[0].onBeforeCall).toBeDefined(); expect(service.routes[0].onAfterCall).toBeDefined(); - return broker.start() - .then(() => request(server) - .get("/hello")) + return broker + .start() + .then(() => request(server).get("/hello")) .then(res => { expect(res.statusCode).toBe(200); expect(res.headers["content-type"]).toBe("application/json; charset=utf-8"); expect(res.headers["x-custom-header"]).toBe("working"); expect(res.body).toBe("Hello Moleculer"); expect(beforeCall).toHaveBeenCalledTimes(1); - expect(beforeCall).toHaveBeenCalledWith(expect.any(Context), expect.any(Object), expect.any(http.IncomingMessage), expect.any(http.ServerResponse), expect.any(Object)); + expect(beforeCall).toHaveBeenCalledWith( + expect.any(Context), + expect.any(Object), + expect.any(http.IncomingMessage), + expect.any(http.ServerResponse), + expect.any(Object) + ); const ctx = beforeCall.mock.calls[0][0]; const req = beforeCall.mock.calls[0][2]; @@ -2729,21 +2945,31 @@ describe("Test onBeforeCall & onAfterCall", () => { expect(response.$service).toBeDefined(); expect(response.$route).toBeDefined(); - expect(afterCall).toHaveBeenCalledTimes(1); - expect(afterCall).toHaveBeenCalledWith(expect.any(Context), expect.any(Object), expect.any(http.IncomingMessage), expect.any(http.ServerResponse), "Hello Moleculer"); + expect(afterCall).toHaveBeenCalledWith( + expect.any(Context), + expect.any(Object), + expect.any(http.IncomingMessage), + expect.any(http.ServerResponse), + "Hello Moleculer" + ); expect(afterCall.mock.calls[0][0].meta.custom).toBe("John"); beforeCall.mockClear(); afterCall.mockClear(); }) - .then(() => request(server) - .get("/custom")) + .then(() => request(server).get("/custom")) .then(res => { expect(res.statusCode).toBe(200); expect(res.text).toBe("Hello Custom"); expect(beforeCall).toHaveBeenCalledTimes(1); - expect(beforeCall).toHaveBeenCalledWith(expect.any(Context), expect.any(Object), expect.any(http.IncomingMessage), expect.any(http.ServerResponse), expect.any(Object)); + expect(beforeCall).toHaveBeenCalledWith( + expect.any(Context), + expect.any(Object), + expect.any(http.IncomingMessage), + expect.any(http.ServerResponse), + expect.any(Object) + ); const ctx = beforeCall.mock.calls[0][0]; const req = beforeCall.mock.calls[0][2]; @@ -2762,7 +2988,13 @@ describe("Test onBeforeCall & onAfterCall", () => { expect(response.$route).toBeDefined(); expect(afterCall).toHaveBeenCalledTimes(0); - }).then(() => broker.stop()).catch(err => broker.stop().then(() => { throw err; })); + }) + .then(() => broker.stop()) + .catch(err => + broker.stop().then(() => { + throw err; + }) + ); }); it("should modify response in 'onAfterCall'", () => { @@ -2780,16 +3012,18 @@ describe("Test onBeforeCall & onAfterCall", () => { const service = broker.createService({ mixins: [ApiGateway], settings: { - routes: [{ - onAfterCall: afterCall, - }] + routes: [ + { + onAfterCall: afterCall + } + ] } }); const server = service.server; - return broker.start() - .then(() => request(server) - .get("/test/json")) + return broker + .start() + .then(() => request(server).get("/test/json")) .then(res => { expect(res.statusCode).toBe(200); expect(res.headers["content-type"]).toBe("application/json; charset=utf-8"); @@ -2802,12 +3036,17 @@ describe("Test onBeforeCall & onAfterCall", () => { } }); expect(afterCall).toHaveBeenCalledTimes(1); - }).then(() => broker.stop()).catch(err => broker.stop().then(() => { throw err; })); + }) + .then(() => broker.stop()) + .catch(err => + broker.stop().then(() => { + throw err; + }) + ); }); }); describe("Test encodeResponse", () => { - it("should call encodeResponse in sendResponse", () => { const broker = new ServiceBroker({ logger: true, logLevel: "error" }); broker.loadService("./test/services/test.service"); @@ -2819,30 +3058,41 @@ describe("Test encodeResponse", () => { const service = broker.createService({ mixins: [ApiGateway], settings: { - routes: [{ - aliases: { - "hello": "test.hello", - }, - }] + routes: [ + { + aliases: { + hello: "test.hello" + } + } + ] }, methods: { - encodeResponse: encodeResponse, + encodeResponse: encodeResponse } }); const server = service.server; - return broker.start() - .then(() => request(server) - .get("/hello") - .set("Accept", "some/encoding")) + return broker + .start() + .then(() => request(server).get("/hello").set("Accept", "some/encoding")) .then(res => { expect(res.statusCode).toBe(200); expect(res.body).toBe("some/encoding"); expect(encodeResponse).toHaveBeenCalledTimes(1); - expect(encodeResponse).toHaveBeenCalledWith(expect.any(http.IncomingMessage), expect.any(http.ServerResponse), expect.any(String)); + expect(encodeResponse).toHaveBeenCalledWith( + expect.any(http.IncomingMessage), + expect.any(http.ServerResponse), + expect.any(String) + ); encodeResponse.mockClear(); - }).then(() => broker.stop()).catch(err => broker.stop().then(() => { throw err; })); + }) + .then(() => broker.stop()) + .catch(err => + broker.stop().then(() => { + throw err; + }) + ); }); it("should overwrite the content type header", () => { @@ -2857,30 +3107,42 @@ describe("Test encodeResponse", () => { const service = broker.createService({ mixins: [ApiGateway], settings: { - routes: [{ - aliases: { - "hello": "test.hello", - }, - }] + routes: [ + { + aliases: { + hello: "test.hello" + } + } + ] }, methods: { - encodeResponse: encodeResponse, + encodeResponse: encodeResponse } }); const server = service.server; - return broker.start() - .then(() => request(server) - .get("/hello")) + return broker + .start() + .then(() => request(server).get("/hello")) .then(res => { expect(res.statusCode).toBe(200); expect(res.text).toBe("Hello Moleculer"); expect(res.header["content-type"]).toBe("text/html"); expect(encodeResponse).toHaveBeenCalledTimes(1); - expect(encodeResponse).toHaveBeenCalledWith(expect.any(http.IncomingMessage), expect.any(http.ServerResponse), expect.any(String)); + expect(encodeResponse).toHaveBeenCalledWith( + expect.any(http.IncomingMessage), + expect.any(http.ServerResponse), + expect.any(String) + ); encodeResponse.mockClear(); - }).then(() => broker.stop()).catch(err => broker.stop().then(() => { throw err; })); + }) + .then(() => broker.stop()) + .catch(err => + broker.stop().then(() => { + throw err; + }) + ); }); it("should call encodeResponse in sendError", () => { @@ -2894,35 +3156,45 @@ describe("Test encodeResponse", () => { const service = broker.createService({ mixins: [ApiGateway], settings: { - routes: [{ - aliases: { - "error": "test.error", - }, - }] + routes: [ + { + aliases: { + error: "test.error" + } + } + ] }, methods: { - encodeResponse: encodeResponse, + encodeResponse: encodeResponse } }); const server = service.server; - return broker.start() - .then(() => request(server) - .get("/error") - .set("Accept", "some/encoding")) + return broker + .start() + .then(() => request(server).get("/error").set("Accept", "some/encoding")) .then(res => { expect(res.statusCode).toBe(500); expect(res.body).toBe("some/encoding"); expect(encodeResponse).toHaveBeenCalledTimes(1); - expect(encodeResponse).toHaveBeenCalledWith(expect.any(http.IncomingMessage), expect.any(http.ServerResponse), expect.any(Object)); + expect(encodeResponse).toHaveBeenCalledWith( + expect.any(http.IncomingMessage), + expect.any(http.ServerResponse), + expect.any(Object) + ); encodeResponse.mockClear(); - }).then(() => broker.stop()).catch(err => broker.stop().then(() => { throw err; })); + }) + .then(() => broker.stop()) + .catch(err => + broker.stop().then(() => { + throw err; + }) + ); }); }); describe("Test route middlewares", () => { - it("should call global & route middlewares", () => { const broker = new ServiceBroker({ logger: false }); broker.loadService("./test/services/test.service"); @@ -2942,17 +3214,19 @@ describe("Test route middlewares", () => { mixins: [ApiGateway], settings: { use: [mwg], - routes: [{ - path: "/", - use: [mw1, mw2] - }] + routes: [ + { + path: "/", + use: [mw1, mw2] + } + ] } }); const server = service.server; - return broker.start() - .then(() => request(server) - .get("/test/hello/")) + return broker + .start() + .then(() => request(server).get("/test/hello/")) .then(res => { expect(res.statusCode).toBe(200); expect(res.headers["content-type"]).toBe("application/json; charset=utf-8"); @@ -2960,14 +3234,32 @@ describe("Test route middlewares", () => { expect(res.body).toBe("Hello Moleculer"); expect(mwg).toHaveBeenCalledTimes(1); - expect(mwg).toHaveBeenCalledWith(expect.any(http.IncomingMessage), expect.any(http.ServerResponse), expect.any(Function)); + expect(mwg).toHaveBeenCalledWith( + expect.any(http.IncomingMessage), + expect.any(http.ServerResponse), + expect.any(Function) + ); expect(mw1).toHaveBeenCalledTimes(1); - expect(mw1).toHaveBeenCalledWith(expect.any(http.IncomingMessage), expect.any(http.ServerResponse), expect.any(Function)); + expect(mw1).toHaveBeenCalledWith( + expect.any(http.IncomingMessage), + expect.any(http.ServerResponse), + expect.any(Function) + ); expect(mw2).toHaveBeenCalledTimes(1); - expect(mw2).toHaveBeenCalledWith(expect.any(http.IncomingMessage), expect.any(http.ServerResponse), expect.any(Function)); - }).then(() => broker.stop()).catch(err => broker.stop().then(() => { throw err; })); + expect(mw2).toHaveBeenCalledWith( + expect.any(http.IncomingMessage), + expect.any(http.ServerResponse), + expect.any(Function) + ); + }) + .then(() => broker.stop()) + .catch(err => + broker.stop().then(() => { + throw err; + }) + ); }); it("should return with error if middlewares call next with error", () => { @@ -2985,17 +3277,19 @@ describe("Test route middlewares", () => { const service = broker.createService({ mixins: [ApiGateway], settings: { - routes: [{ - path: "/", - use: [mw1, mw2] - }] + routes: [ + { + path: "/", + use: [mw1, mw2] + } + ] } }); const server = service.server; - return broker.start() - .then(() => request(server) - .get("/test/hello")) + return broker + .start() + .then(() => request(server).get("/test/hello")) .then(res => { expect(res.statusCode).toBe(500); expect(res.headers["content-type"]).toBe("application/json; charset=utf-8"); @@ -3006,21 +3300,31 @@ describe("Test route middlewares", () => { name: "MoleculerError" }); expect(mw1).toHaveBeenCalledTimes(1); - expect(mw1).toHaveBeenCalledWith(expect.any(http.IncomingMessage), expect.any(http.ServerResponse), expect.any(Function)); + expect(mw1).toHaveBeenCalledWith( + expect.any(http.IncomingMessage), + expect.any(http.ServerResponse), + expect.any(Function) + ); expect(mw2).toHaveBeenCalledTimes(0); - }).then(() => broker.stop()).catch(err => broker.stop().then(() => { throw err; })); + }) + .then(() => broker.stop()) + .catch(err => + broker.stop().then(() => { + throw err; + }) + ); }); - }); describe("Test authentication", () => { - it("don't enabled authentication if missing 'authenticate' method", () => { let service = setup({ - routes: [{ - authentication: true - }] + routes: [ + { + authentication: true + } + ] })[1]; expect(service.routes[0].authentication).toBeNull(); @@ -3039,9 +3343,11 @@ describe("Test authentication", () => { const service = broker.createService({ mixins: [ApiGateway], settings: { - routes: [{ - authentication: true - }] + routes: [ + { + authentication: true + } + ] }, methods: { authenticate @@ -3051,17 +3357,29 @@ describe("Test authentication", () => { expect(typeof service.routes[0].authentication).toBe("function"); - return broker.start() - .then(() => request(server) - .get("/test/whoami")) + return broker + .start() + .then(() => request(server).get("/test/whoami")) .then(res => { expect(res.statusCode).toBe(200); expect(res.headers["content-type"]).toBe("application/json; charset=utf-8"); expect(res.body).toBe(`Hello ${user.username}`); expect(authenticate).toHaveBeenCalledTimes(1); - expect(authenticate).toHaveBeenCalledWith(expect.any(Context), expect.any(Object), expect.any(http.IncomingMessage), expect.any(http.ServerResponse), expect.any(Object)); - }).then(() => broker.stop()).catch(err => broker.stop().then(() => { throw err; })); + expect(authenticate).toHaveBeenCalledWith( + expect.any(Context), + expect.any(Object), + expect.any(http.IncomingMessage), + expect.any(http.ServerResponse), + expect.any(Object) + ); + }) + .then(() => broker.stop()) + .catch(err => + broker.stop().then(() => { + throw err; + }) + ); }); it("anonymous user", () => { @@ -3072,9 +3390,11 @@ describe("Test authentication", () => { const service = broker.createService({ mixins: [ApiGateway], settings: { - routes: [{ - authentication: true - }] + routes: [ + { + authentication: true + } + ] }, methods: { authenticate @@ -3084,30 +3404,46 @@ describe("Test authentication", () => { expect(typeof service.routes[0].authentication).toBe("function"); - return broker.start() - .then(() => request(server) - .get("/test/whoami")) + return broker + .start() + .then(() => request(server).get("/test/whoami")) .then(res => { expect(res.statusCode).toBe(200); expect(res.headers["content-type"]).toBe("application/json; charset=utf-8"); expect(res.body).toBe("Who are you?"); expect(authenticate).toHaveBeenCalledTimes(1); - expect(authenticate).toHaveBeenCalledWith(expect.any(Context), expect.any(Object), expect.any(http.IncomingMessage), expect.any(http.ServerResponse), expect.any(Object)); - }).then(() => broker.stop()).catch(err => broker.stop().then(() => { throw err; })); + expect(authenticate).toHaveBeenCalledWith( + expect.any(Context), + expect.any(Object), + expect.any(http.IncomingMessage), + expect.any(http.ServerResponse), + expect.any(Object) + ); + }) + .then(() => broker.stop()) + .catch(err => + broker.stop().then(() => { + throw err; + }) + ); }); it("authentication failed", () => { const broker = new ServiceBroker({ logger: false }); broker.loadService("./test/services/test.service"); - const authenticate = jest.fn(() => Promise.reject(new MoleculerError("Not available", 400))); + const authenticate = jest.fn(() => + Promise.reject(new MoleculerError("Not available", 400)) + ); const service = broker.createService({ mixins: [ApiGateway], settings: { - routes: [{ - authentication: true - }] + routes: [ + { + authentication: true + } + ] }, methods: { authenticate @@ -3117,9 +3453,9 @@ describe("Test authentication", () => { expect(typeof service.routes[0].authentication).toBe("function"); - return broker.start() - .then(() => request(server) - .get("/test/whoami")) + return broker + .start() + .then(() => request(server).get("/test/whoami")) .then(res => { expect(res.statusCode).toBe(400); expect(res.headers["content-type"]).toBe("application/json; charset=utf-8"); @@ -3130,19 +3466,31 @@ describe("Test authentication", () => { name: "MoleculerError" }); expect(authenticate).toHaveBeenCalledTimes(1); - expect(authenticate).toHaveBeenCalledWith(expect.any(Context), expect.any(Object), expect.any(http.IncomingMessage), expect.any(http.ServerResponse), expect.any(Object)); - }).then(() => broker.stop()).catch(err => broker.stop().then(() => { throw err; })); + expect(authenticate).toHaveBeenCalledWith( + expect.any(Context), + expect.any(Object), + expect.any(http.IncomingMessage), + expect.any(http.ServerResponse), + expect.any(Object) + ); + }) + .then(() => broker.stop()) + .catch(err => + broker.stop().then(() => { + throw err; + }) + ); }); - }); describe("Test authorization", () => { - it("don't enabled authorization if missing 'authorize' method", () => { let service = setup({ - routes: [{ - authorization: true - }] + routes: [ + { + authorization: true + } + ] })[1]; expect(service.routes[0].authorization).toBeNull(); @@ -3156,9 +3504,11 @@ describe("Test authorization", () => { const service = broker.createService({ mixins: [ApiGateway], settings: { - routes: [{ - authorization: true - }] + routes: [ + { + authorization: true + } + ] }, methods: { authorize @@ -3168,17 +3518,29 @@ describe("Test authorization", () => { expect(typeof service.routes[0].authorization).toBe("function"); - return broker.start() - .then(() => request(server) - .get("/test/hello")) + return broker + .start() + .then(() => request(server).get("/test/hello")) .then(res => { expect(res.statusCode).toBe(200); expect(res.headers["content-type"]).toBe("application/json; charset=utf-8"); expect(res.body).toBe("Hello Moleculer"); expect(authorize).toHaveBeenCalledTimes(1); - expect(authorize).toHaveBeenCalledWith(expect.any(Context), expect.any(Object), expect.any(http.IncomingMessage), expect.any(http.ServerResponse), expect.any(Object)); - }).then(() => broker.stop()).catch(err => broker.stop().then(() => { throw err; })); + expect(authorize).toHaveBeenCalledWith( + expect.any(Context), + expect.any(Object), + expect.any(http.IncomingMessage), + expect.any(http.ServerResponse), + expect.any(Object) + ); + }) + .then(() => broker.stop()) + .catch(err => + broker.stop().then(() => { + throw err; + }) + ); }); it("should give back error", () => { @@ -3189,9 +3551,11 @@ describe("Test authorization", () => { const service = broker.createService({ mixins: [ApiGateway], settings: { - routes: [{ - authorization: true - }] + routes: [ + { + authorization: true + } + ] }, methods: { authorize @@ -3201,23 +3565,34 @@ describe("Test authorization", () => { expect(typeof service.routes[0].authorization).toBe("function"); - return broker.start() - .then(() => request(server) - .get("/test/hello")) + return broker + .start() + .then(() => request(server).get("/test/hello")) .then(res => { expect(res.statusCode).toBe(401); expect(res.headers["content-type"]).toBe("application/json; charset=utf-8"); expect(res.body).toEqual({ - "message": "Unauthorized", - "code": 401, - "type": "NO_TOKEN", - "name": "UnAuthorizedError" + message: "Unauthorized", + code: 401, + type: "NO_TOKEN", + name: "UnAuthorizedError" }); expect(authorize).toHaveBeenCalledTimes(1); - expect(authorize).toHaveBeenCalledWith(expect.any(Context), expect.any(Object), expect.any(http.IncomingMessage), expect.any(http.ServerResponse), expect.any(Object)); - }).then(() => broker.stop()).catch(err => broker.stop().then(() => { throw err; })); + expect(authorize).toHaveBeenCalledWith( + expect.any(Context), + expect.any(Object), + expect.any(http.IncomingMessage), + expect.any(http.ServerResponse), + expect.any(Object) + ); + }) + .then(() => broker.stop()) + .catch(err => + broker.stop().then(() => { + throw err; + }) + ); }); - }); describe("Test authentication", () => { @@ -3252,7 +3627,7 @@ describe("Test authentication", () => { path: "C", authentication: "cAuthn", authorization: "cAuthz" - }, + } ] }, methods: { @@ -3261,7 +3636,7 @@ describe("Test authentication", () => { cAuthn, cAuthz, authenticate, - authorize, + authorize } }); server = service.server; @@ -3334,26 +3709,26 @@ describe("Test authentication", () => { expect(cAuthz).toHaveBeenCalledTimes(1); }); }); - }); describe("Test onError handlers", () => { - it("should return with JSON error object", () => { const broker = new ServiceBroker({ logger: false }); const service = broker.createService({ mixins: [ApiGateway], settings: { - routes: [{ - path: "/api" - }] + routes: [ + { + path: "/api" + } + ] } }); const server = service.server; - return broker.start() - .then(() => request(server) - .get("/api/test/hello")) + return broker + .start() + .then(() => request(server).get("/api/test/hello")) .then(res => { expect(res.statusCode).toBe(404); expect(res.headers["content-type"]).toBe("application/json; charset=utf-8"); @@ -3366,7 +3741,13 @@ describe("Test onError handlers", () => { name: "ServiceNotFoundError", type: "SERVICE_NOT_FOUND" }); - }).then(() => broker.stop()).catch(err => broker.stop().then(() => { throw err; })); + }) + .then(() => broker.stop()) + .catch(err => + broker.stop().then(() => { + throw err; + }) + ); }); it("should return with global error handler response", () => { @@ -3374,9 +3755,11 @@ describe("Test onError handlers", () => { const service = broker.createService({ mixins: [ApiGateway], settings: { - routes: [{ - path: "/api", - }], + routes: [ + { + path: "/api" + } + ], onError(req, res, err) { res.setHeader("Content-Type", "text/plain"); res.writeHead(501); @@ -3386,15 +3769,21 @@ describe("Test onError handlers", () => { }); const server = service.server; - return broker.start() - .then(() => request(server) - .get("/api/test/hello")) + return broker + .start() + .then(() => request(server).get("/api/test/hello")) .then(res => { expect(res.statusCode).toBe(501); expect(res.headers["content-type"]).toBe("text/plain"); expect(res.text).toBe("Global error: Service 'test.hello' is not found."); - }).then(() => broker.stop()).catch(err => broker.stop().then(() => { throw err; })); + }) + .then(() => broker.stop()) + .catch(err => + broker.stop().then(() => { + throw err; + }) + ); }); it("should return with route error handler response", () => { @@ -3402,14 +3791,16 @@ describe("Test onError handlers", () => { const service = broker.createService({ mixins: [ApiGateway], settings: { - routes: [{ - path: "/api", - onError(req, res, err) { - res.setHeader("Content-Type", "text/plain"); - res.writeHead(500); - res.end("Route error: " + err.message); + routes: [ + { + path: "/api", + onError(req, res, err) { + res.setHeader("Content-Type", "text/plain"); + res.writeHead(500); + res.end("Route error: " + err.message); + } } - }], + ], onError(req, res, err) { res.setHeader("Content-Type", "text/plain"); @@ -3420,20 +3811,25 @@ describe("Test onError handlers", () => { }); const server = service.server; - return broker.start() - .then(() => request(server) - .get("/api/test/hello")) + return broker + .start() + .then(() => request(server).get("/api/test/hello")) .then(res => { expect(res.statusCode).toBe(500); expect(res.headers["content-type"]).toBe("text/plain"); expect(res.text).toBe("Route error: Service 'test.hello' is not found."); - }).then(() => broker.stop()).catch(err => broker.stop().then(() => { throw err; })); + }) + .then(() => broker.stop()) + .catch(err => + broker.stop().then(() => { + throw err; + }) + ); }); }); describe("Test lifecycle events", () => { - it("`created` with only HTTP", () => { const broker = new ServiceBroker({ logger: false }); @@ -3448,9 +3844,13 @@ describe("Test lifecycle events", () => { mixins: [ApiGateway], settings: { https: { - key: fs.readFileSync(path.join(__dirname, "..", "..", "examples", "ssl", "key.pem")), - cert: fs.readFileSync(path.join(__dirname, "..", "..", "examples", "ssl", "cert.pem")) - }, + key: fs.readFileSync( + path.join(__dirname, "..", "..", "examples", "ssl", "key.pem") + ), + cert: fs.readFileSync( + path.join(__dirname, "..", "..", "examples", "ssl", "cert.pem") + ) + } } }); expect(service.isHTTPS).toBe(true); @@ -3466,7 +3866,11 @@ describe("Test lifecycle events", () => { service.schema.started.call(service); expect(server.listen).toHaveBeenCalledTimes(1); - expect(server.listen).toHaveBeenCalledWith(service.settings.port, service.settings.ip, expect.any(Function)); + expect(server.listen).toHaveBeenCalledWith( + service.settings.port, + service.settings.ip, + expect.any(Function) + ); }); it("`stopped`", () => { @@ -3493,7 +3897,6 @@ describe("Test route.path and aliases", () => { let nextHandler = jest.fn((req, res) => res.sendStatus(200)); beforeAll(() => { - broker = new ServiceBroker({ logger: false }); service = broker.createService({ @@ -3501,21 +3904,24 @@ describe("Test route.path and aliases", () => { settings: { path: "/api", autoAliases: true, - routes: [{ - path: "/te", - aliases: { - "GET test"(req, res) { - res.end("/api/te/test"); + routes: [ + { + path: "/te", + aliases: { + "GET test"(req, res) { + res.end("/api/te/test"); + } } - } - }, { - path: "", - aliases: { - "GET test"(req, res) { - res.end("/api/test"); + }, + { + path: "", + aliases: { + "GET test"(req, res) { + res.end("/api/test"); + } } } - }] + ] } }); broker.loadService("./test/services/test.service"); @@ -3546,10 +3952,8 @@ describe("Test route.path and aliases", () => { expect(nextHandler).toHaveBeenCalledTimes(0); }); }); - }); - describe("Test middleware mode", () => { let broker; let app; @@ -3557,7 +3961,6 @@ describe("Test middleware mode", () => { let nextHandler = jest.fn((req, res) => res.sendStatus(200)); beforeAll(() => { - broker = new ServiceBroker({ logger: false }); broker.loadService("./test/services/test.service"); @@ -3607,21 +4010,24 @@ describe("Test middleware mode", () => { }); describe("Test file uploading", () => { - const broker = new ServiceBroker({ logger: false }); broker.createService({ name: "file", actions: { save(ctx) { - return new this.Promise((resolve) => { + return new this.Promise(resolve => { if (ctx.stream && ctx.stream.pipe) { const hash = crypto.createHash("sha256"); hash.on("readable", () => { const data = hash.read(); if (data) - resolve({ hash: data.toString("base64"), params: ctx.params, meta: ctx.meta }); + resolve({ + hash: data.toString("base64"), + params: ctx.params, + meta: ctx.meta + }); }); ctx.stream.pipe(hash); @@ -3638,56 +4044,58 @@ describe("Test file uploading", () => { const service = broker.createService({ mixins: [ApiGateway], settings: { - routes: [{ - path: "/upload", + routes: [ + { + path: "/upload", - bodyParsers: { - json: false - }, + bodyParsers: { + json: false + }, - aliases: { - // File upload from HTML form - "POST /": "multipart:file.save", - - // File upload from AJAX or cURL - "PUT /": "stream:file.save", - - // File upload from AJAX or cURL - "PUT /:id": "stream:file.save", - - // File upload from HTML form and overwrite busboy config - "POST /multi": { - type: "multipart", - // Action level busboy config - busboyConfig: { - empty: true, - limits: { - files: 3 - } + aliases: { + // File upload from HTML form + "POST /": "multipart:file.save", + + // File upload from AJAX or cURL + "PUT /": "stream:file.save", + + // File upload from AJAX or cURL + "PUT /:id": "stream:file.save", + + // File upload from HTML form and overwrite busboy config + "POST /multi": { + type: "multipart", + // Action level busboy config + busboyConfig: { + empty: true, + limits: { + files: 3 + } + }, + action: "file.save" }, - action: "file.save" - }, - "POST /form/:id": { - type: "multipart", - // Action level busboy config - busboyConfig: { - empty: true, - limits: { - files: 0 - } + "POST /form/:id": { + type: "multipart", + // Action level busboy config + busboyConfig: { + empty: true, + limits: { + files: 0 + } + }, + action: "file.save" + } + }, + // https://github.com/mscdex/busboy#busboy-methods + busboyConfig: { + limits: { + files: 1 }, - action: "file.save" + onFilesLimit: onFilesLimitFn } - }, - // https://github.com/mscdex/busboy#busboy-methods - busboyConfig: { - limits: { - files: 1 - }, - onFilesLimit: onFilesLimitFn - }, - }] + } + ] } }); const server = service.server; @@ -3695,23 +4103,25 @@ describe("Test file uploading", () => { const origHashes = {}; const getHash = filename => { - return new Promise((resolve) => { + return new Promise(resolve => { const hash = crypto.createHash("sha256"); hash.on("readable", () => { const data = hash.read(); - if (data) - resolve(data.toString("base64")); + if (data) resolve(data.toString("base64")); }); fs.createReadStream(assetsDir + filename).pipe(hash); }); }; beforeAll(() => { - return broker.start() - .then(() => Promise.all([ - getHash("logo.png").then(hash => origHashes["logo.png"] = hash), - getHash("lorem.txt").then(hash => origHashes["lorem.txt"] = hash), - ])); + return broker + .start() + .then(() => + Promise.all([ + getHash("logo.png").then(hash => (origHashes["logo.png"] = hash)), + getHash("lorem.txt").then(hash => (origHashes["lorem.txt"] = hash)) + ]) + ); }); afterAll(() => broker.stop()); @@ -3722,12 +4132,16 @@ describe("Test file uploading", () => { .then(res => { expect(res.statusCode).toBe(200); expect(res.headers["content-type"]).toBe("application/json; charset=utf-8"); - expect(res.body).toEqual({ hash: origHashes["logo.png"], params: { - $encoding: "7bit", - $fieldname: "myFile", - $filename: "logo.png", - $mimetype: "image/png" - }, meta: {} }); + expect(res.body).toEqual({ + hash: origHashes["logo.png"], + params: { + $encoding: "7bit", + $fieldname: "myFile", + $filename: "logo.png", + $mimetype: "image/png" + }, + meta: {} + }); expect(onFilesLimitFn).toHaveBeenCalledTimes(0); }); @@ -3741,13 +4155,17 @@ describe("Test file uploading", () => { .then(res => { expect(res.statusCode).toBe(200); expect(res.headers["content-type"]).toBe("application/json; charset=utf-8"); - expect(res.body).toEqual({ hash: origHashes["logo.png"], params: { - name: "moleculer", - $encoding: "7bit", - $fieldname: "myFile", - $filename: "logo.png", - $mimetype: "image/png" - }, meta: {} }); + expect(res.body).toEqual({ + hash: origHashes["logo.png"], + params: { + name: "moleculer", + $encoding: "7bit", + $fieldname: "myFile", + $filename: "logo.png", + $mimetype: "image/png" + }, + meta: {} + }); expect(onFilesLimitFn).toHaveBeenCalledTimes(0); }); @@ -3761,10 +4179,12 @@ describe("Test file uploading", () => { .then(res => { expect(res.statusCode).toBe(200); expect(res.headers["content-type"]).toBe("application/json; charset=utf-8"); - expect(res.body).toEqual([{ - meta: {}, - params: { id: "f1234", name: "moleculer", more: "services" } - }]); + expect(res.body).toEqual([ + { + meta: {}, + params: { id: "f1234", name: "moleculer", more: "services" } + } + ]); }); }); @@ -3776,14 +4196,22 @@ describe("Test file uploading", () => { .then(res => { expect(res.statusCode).toBe(200); expect(res.headers["content-type"]).toBe("application/json; charset=utf-8"); - expect(res.body).toEqual({ hash: origHashes["logo.png"], params: { - $encoding: "7bit", - $fieldname: "myFile", - $filename: "logo.png", - $mimetype: "image/png" - } , meta: {} }); + expect(res.body).toEqual({ + hash: origHashes["logo.png"], + params: { + $encoding: "7bit", + $fieldname: "myFile", + $filename: "logo.png", + $mimetype: "image/png" + }, + meta: {} + }); expect(onFilesLimitFn).toHaveBeenCalledTimes(1); - expect(onFilesLimitFn).toHaveBeenCalledWith(expect.any(Busboy), expect.any(Alias), service); + expect(onFilesLimitFn).toHaveBeenCalledWith( + expect.any(Busboy), + expect.any(Alias), + service + ); }); }); @@ -3796,18 +4224,26 @@ describe("Test file uploading", () => { expect(res.statusCode).toBe(200); expect(res.headers["content-type"]).toBe("application/json; charset=utf-8"); expect(res.body).toEqual([ - { hash: origHashes["logo.png"], params: { - $encoding: "7bit", - $fieldname: "myFile", - $filename: "logo.png", - $mimetype: "image/png" - }, meta: {} }, - { hash: origHashes["lorem.txt"], params: { - $encoding: "7bit", - $fieldname: "myText", - $filename: "lorem.txt", - $mimetype: "text/plain" - }, meta: {} } + { + hash: origHashes["logo.png"], + params: { + $encoding: "7bit", + $fieldname: "myFile", + $filename: "logo.png", + $mimetype: "image/png" + }, + meta: {} + }, + { + hash: origHashes["lorem.txt"], + params: { + $encoding: "7bit", + $fieldname: "myText", + $filename: "lorem.txt", + $mimetype: "text/plain" + }, + meta: {} + } ]); }); }); @@ -3823,7 +4259,6 @@ describe("Test file uploading", () => { expect(res.headers["content-type"]).toBe("application/json; charset=utf-8"); expect(res.body).toEqual({ hash: origHashes["logo.png"], params: {}, meta: {} }); }); - }); it("should upload file as stream with url params", () => { @@ -3835,10 +4270,13 @@ describe("Test file uploading", () => { .then(res => { expect(res.statusCode).toBe(200); expect(res.headers["content-type"]).toBe("application/json; charset=utf-8"); - expect(res.body).toEqual({ hash: origHashes["logo.png"], params: { id: "f1234" }, meta: {} }); + expect(res.body).toEqual({ + hash: origHashes["logo.png"], + params: { id: "f1234" }, + meta: {} + }); }); }); - }); describe("Test dynamic routing", () => { @@ -3862,10 +4300,10 @@ describe("Test dynamic routing", () => { expect(res.statusCode).toBe(404); expect(res.headers["content-type"]).toBe("application/json; charset=utf-8"); expect(res.body).toEqual({ - "code": 404, - "message": "Not found", - "name": "NotFoundError", - "type": "NOT_FOUND" + code: 404, + message: "Not found", + name: "NotFoundError", + type: "NOT_FOUND" }); }); }); @@ -3874,7 +4312,7 @@ describe("Test dynamic routing", () => { service.addRoute({ path: "/my", aliases: { - "hello": "test.hello" + hello: "test.hello" } }); @@ -3891,7 +4329,7 @@ describe("Test dynamic routing", () => { service.addRoute({ path: "/other", aliases: { - "hello": "test.hello" + hello: "test.hello" } }); @@ -3913,10 +4351,10 @@ describe("Test dynamic routing", () => { expect(res.statusCode).toBe(404); expect(res.headers["content-type"]).toBe("application/json; charset=utf-8"); expect(res.body).toEqual({ - "code": 404, - "message": "Not found", - "name": "NotFoundError", - "type": "NOT_FOUND" + code: 404, + message: "Not found", + name: "NotFoundError", + type: "NOT_FOUND" }); }); }); @@ -3935,7 +4373,7 @@ describe("Test dynamic routing", () => { service.addRoute({ path: "/my", aliases: { - "helloagain": "test.hello" + helloagain: "test.hello" } }); @@ -3955,10 +4393,10 @@ describe("Test dynamic routing", () => { expect(res.statusCode).toBe(404); expect(res.headers["content-type"]).toBe("application/json; charset=utf-8"); expect(res.body).toEqual({ - "code": 404, - "message": "Not found", - "name": "NotFoundError", - "type": "NOT_FOUND" + code: 404, + message: "Not found", + name: "NotFoundError", + type: "NOT_FOUND" }); }); }); @@ -3985,10 +4423,10 @@ describe("Test dynamic routing with name", () => { expect(res.statusCode).toBe(404); expect(res.headers["content-type"]).toBe("application/json; charset=utf-8"); expect(res.body).toEqual({ - "code": 404, - "message": "Not found", - "name": "NotFoundError", - "type": "NOT_FOUND" + code: 404, + message: "Not found", + name: "NotFoundError", + type: "NOT_FOUND" }); }); }); @@ -3998,7 +4436,7 @@ describe("Test dynamic routing with name", () => { name: "first", path: "/my", aliases: { - "hello": "test.hello" + hello: "test.hello" } }); @@ -4016,7 +4454,7 @@ describe("Test dynamic routing with name", () => { name: "second", path: "/other", aliases: { - "hello": "test.hello" + hello: "test.hello" } }); @@ -4038,10 +4476,10 @@ describe("Test dynamic routing with name", () => { expect(res.statusCode).toBe(404); expect(res.headers["content-type"]).toBe("application/json; charset=utf-8"); expect(res.body).toEqual({ - "code": 404, - "message": "Not found", - "name": "NotFoundError", - "type": "NOT_FOUND" + code: 404, + message: "Not found", + name: "NotFoundError", + type: "NOT_FOUND" }); }); }); @@ -4061,7 +4499,7 @@ describe("Test dynamic routing with name", () => { name: "first", path: "/my", aliases: { - "helloagain": "test.hello" + helloagain: "test.hello" } }); @@ -4081,16 +4519,15 @@ describe("Test dynamic routing with name", () => { expect(res.statusCode).toBe(404); expect(res.headers["content-type"]).toBe("application/json; charset=utf-8"); expect(res.body).toEqual({ - "code": 404, - "message": "Not found", - "name": "NotFoundError", - "type": "NOT_FOUND" + code: 404, + message: "Not found", + name: "NotFoundError", + type: "NOT_FOUND" }); }); }); }); - describe("Test dynamic routing with actions", () => { let broker; let service; @@ -4112,10 +4549,10 @@ describe("Test dynamic routing with actions", () => { expect(res.statusCode).toBe(404); expect(res.headers["content-type"]).toBe("application/json; charset=utf-8"); expect(res.body).toEqual({ - "code": 404, - "message": "Not found", - "name": "NotFoundError", - "type": "NOT_FOUND" + code: 404, + message: "Not found", + name: "NotFoundError", + type: "NOT_FOUND" }); }); }); @@ -4125,7 +4562,7 @@ describe("Test dynamic routing with actions", () => { route: { path: "/my", aliases: { - "hello": "test.hello" + hello: "test.hello" } } }); @@ -4144,7 +4581,7 @@ describe("Test dynamic routing with actions", () => { route: { path: "/other", aliases: { - "hello": "test.hello" + hello: "test.hello" } } }); @@ -4167,10 +4604,10 @@ describe("Test dynamic routing with actions", () => { expect(res.statusCode).toBe(404); expect(res.headers["content-type"]).toBe("application/json; charset=utf-8"); expect(res.body).toEqual({ - "code": 404, - "message": "Not found", - "name": "NotFoundError", - "type": "NOT_FOUND" + code: 404, + message: "Not found", + name: "NotFoundError", + type: "NOT_FOUND" }); }); }); @@ -4194,15 +4631,16 @@ describe("Test route path optimization", () => { beforeAll(() => { [broker, service, server] = setup({ routes: [ - { path: "/", aliases: { "b": "test.hello" } }, - { path: "/a", aliases: { "c": "test.hello" } }, + { path: "/", aliases: { b: "test.hello" } }, + { path: "/a", aliases: { c: "test.hello" } }, { - path: "/a/b", aliases: { - "c": "test.hello", + path: "/a/b", + aliases: { + c: "test.hello", "d/:id": "test.params", - "d/e": "test.params", + "d/e": "test.params" } - }, + } ] }); return broker.start(); @@ -4267,30 +4705,34 @@ describe("Test auto aliasing", () => { let server; function regenerate() { - service.routes.forEach(route => route.opts.autoAliases && service.regenerateAutoAliases(route)); + service.routes.forEach( + route => route.opts.autoAliases && service.regenerateAutoAliases(route) + ); } beforeAll(() => { - [broker, service, server] = setup({ - routes: [ - { - path: "api", - whitelist: [ - "posts.*", - "test.hello", - "test.full*", - "test.base*", - "test.update*" - ], + [broker, service, server] = setup( + { + routes: [ + { + path: "api", + whitelist: [ + "posts.*", + "test.hello", + "test.full*", + "test.base*", + "test.update*" + ], - autoAliases: true, + autoAliases: true, - aliases: { - "GET /postList": "posts.list" + aliases: { + "GET /postList": "posts.list" + } } - } - ] - }/*, { logger: true }*/); + ] + } /*, { logger: true }*/ + ); broker.loadService("./test/services/posts.service"); broker.loadService("./test/services/test.service"); @@ -4378,8 +4820,7 @@ describe("Test auto aliasing", () => { it("unload `posts` service & regenerate aliases", () => { const postService = broker.getLocalService("posts"); - return broker.destroyService(postService) - .then(() => regenerate()); + return broker.destroyService(postService).then(() => regenerate()); }); it("should call 'GET /api/posts'", () => { @@ -4389,10 +4830,10 @@ describe("Test auto aliasing", () => { expect(res.statusCode).toBe(404); expect(res.headers["content-type"]).toBe("application/json; charset=utf-8"); expect(res.body).toEqual({ - "name": "NotFoundError", - "message": "Not found", - "code": 404, - "type": "NOT_FOUND" + name: "NotFoundError", + message: "Not found", + code: 404, + type: "NOT_FOUND" }); }); }); @@ -4414,18 +4855,17 @@ describe("Test auto aliasing", () => { expect(res.statusCode).toBe(404); expect(res.headers["content-type"]).toBe("application/json; charset=utf-8"); expect(res.body).toEqual({ - "code": 404, - "message": "Not found", - "name": "NotFoundError", - "type": "NOT_FOUND" + code: 404, + message: "Not found", + name: "NotFoundError", + type: "NOT_FOUND" }); }); }); it("reload `posts` service & regenerate aliases", () => { broker.loadService("./test/services/posts.service"); - return broker.Promise.delay(100) - .then(() => regenerate()); + return broker.Promise.delay(100).then(() => regenerate()); }); it("should call 'GET /api/posts'", () => { @@ -4452,7 +4892,7 @@ describe("Test auto aliasing", () => { return Promise.all([ request(server).put("/api/update").query({ name: "John" }), request(server).patch("/api/update").query({ name: "John" }) - ]).then((results) => { + ]).then(results => { results.forEach(result => { expect(result.statusCode).toBe(200); expect(result.headers["content-type"]).toBe("application/json; charset=utf-8"); @@ -4463,7 +4903,6 @@ describe("Test auto aliasing", () => { }); describe("Test ETag cache control", () => { - describe("with enabled default ETag", () => { let broker; let service; @@ -4472,10 +4911,12 @@ describe("Test ETag cache control", () => { beforeAll(() => { [broker, service, server] = setup({ etag: false, - routes: [{ - path: "/", - etag: true - }] + routes: [ + { + path: "/", + etag: true + } + ] }); broker.loadService("./test/services/test.service"); return broker.start(); @@ -4488,7 +4929,7 @@ describe("Test ETag cache control", () => { .query({ name: "tiaod" }) .then(res => { expect(res.statusCode).toBe(200); - expect(res.headers["etag"]).toBe("W/\"d-q+AO2Lbr8LT+rw9AWUCOel9HJU4\""); + expect(res.headers["etag"]).toBe('W/"d-q+AO2Lbr8LT+rw9AWUCOel9HJU4"'); }); }); @@ -4496,10 +4937,10 @@ describe("Test ETag cache control", () => { return request(server) .get("/test/greeter") .query({ name: "tiaod" }) - .set("If-None-Match", "\"d-q+AO2Lbr8LT+rw9AWUCOel9HJU4\"") + .set("If-None-Match", '"d-q+AO2Lbr8LT+rw9AWUCOel9HJU4"') .then(res => { expect(res.statusCode).toBe(304); - expect(res.headers["etag"]).toBe("W/\"d-q+AO2Lbr8LT+rw9AWUCOel9HJU4\""); + expect(res.headers["etag"]).toBe('W/"d-q+AO2Lbr8LT+rw9AWUCOel9HJU4"'); }); }); @@ -4554,7 +4995,7 @@ describe("Test ETag cache control", () => { return request(server) .head("/test/greeter") .query({ name: "tiaod" }) - .set("If-None-Match", "W/\"d-q+AO2Lbr8LT+rw9AWUCOel9HJU4\"") + .set("If-None-Match", 'W/"d-q+AO2Lbr8LT+rw9AWUCOel9HJU4"') .then(res => { expect(res.headers["content-type"]).toBe(undefined); expect(res.headers["content-length"]).toBe(undefined); @@ -4571,9 +5012,11 @@ describe("Test ETag cache control", () => { beforeAll(() => { [broker, service, server] = setup({ etag: "weak", - routes: [{ - path: "/", - }] + routes: [ + { + path: "/" + } + ] }); broker.loadService("./test/services/test.service"); return broker.start(); @@ -4586,7 +5029,7 @@ describe("Test ETag cache control", () => { .query({ name: "tiaod" }) .then(res => { expect(res.statusCode).toBe(200); - expect(res.headers["etag"]).toBe("W/\"d-q+AO2Lbr8LT+rw9AWUCOel9HJU4\""); + expect(res.headers["etag"]).toBe('W/"d-q+AO2Lbr8LT+rw9AWUCOel9HJU4"'); }); }); }); @@ -4599,9 +5042,11 @@ describe("Test ETag cache control", () => { beforeAll(() => { [broker, service, server] = setup({ etag: "strong", - routes: [{ - path: "/", - }] + routes: [ + { + path: "/" + } + ] }); broker.loadService("./test/services/test.service"); return broker.start(); @@ -4614,7 +5059,7 @@ describe("Test ETag cache control", () => { .query({ name: "tiaod" }) .then(res => { expect(res.statusCode).toBe(200); - expect(res.headers["etag"]).toBe("\"d-q+AO2Lbr8LT+rw9AWUCOel9HJU4\""); + expect(res.headers["etag"]).toBe('"d-q+AO2Lbr8LT+rw9AWUCOel9HJU4"'); }); }); }); @@ -4629,10 +5074,12 @@ describe("Test ETag cache control", () => { beforeAll(() => { [broker, service, server] = setup({ etag: true, - routes: [{ - path: "/", - etag: custETag - }] + routes: [ + { + path: "/", + etag: custETag + } + ] }); broker.loadService("./test/services/test.service"); return broker.start(); @@ -4649,7 +5096,7 @@ describe("Test ETag cache control", () => { expect(res.headers["etag"]).toBe("123abc"); expect(custETag).toHaveBeenCalledTimes(1); - expect(custETag).toHaveBeenCalledWith("\"Hello tiaod\""); + expect(custETag).toHaveBeenCalledWith('"Hello tiaod"'); }); }); }); @@ -4692,13 +5139,13 @@ describe("Test new alias handling", () => { aliases: { "GET users": "users.create1", "GET people": "people.list" // 503 - }, + } }, { path: "/user", aliases: { - "GET users": "users.create2", - }, + "GET users": "users.create2" + } }, { path: "/lang/:lng/", @@ -4708,7 +5155,7 @@ describe("Test new alias handling", () => { } } } - ], + ] }); broker.createService({ @@ -4764,13 +5211,12 @@ describe("Test new alias handling", () => { expect(res.statusCode).toBe(503); expect(res.headers["content-type"]).toBe("application/json; charset=utf-8"); expect(res.body).toEqual({ - "name": "ServiceUnavailableError", - "message": "Service unavailable", - "code": 503 + name: "ServiceUnavailableError", + message: "Service unavailable", + code: 503 }); }); }); - }); describe("Test internal service special char", () => { @@ -4781,7 +5227,7 @@ describe("Test internal service special char", () => { beforeAll(() => { [broker, service, server] = setup({ path: "/api", - internalServiceSpecialChar: "@", + internalServiceSpecialChar: "@" }); return broker.start(); @@ -4829,8 +5275,8 @@ describe("Test httpServerTimeout setting", () => { .then(res => { expect(res.statusCode).toBe(200); expect(res.body).toEqual({ - "status": 200, - "msg": "apitimeout response" + status: 200, + msg: "apitimeout response" }); }); }); @@ -4847,7 +5293,6 @@ describe("Test httpServerTimeout setting", () => { expect(err.message).toBe("socket hang up"); }); }); - }); describe("Test listAliases action", () => { @@ -4872,7 +5317,7 @@ describe("Test listAliases action", () => { path: "/admin", aliases: { - "basePath": "test.basePath" + basePath: "test.basePath" } } ] @@ -4911,7 +5356,7 @@ describe("Test listAliases action", () => { methods: "GET", path: "greeter", routePath: "/api" - }, + } ]); }); }); @@ -4928,8 +5373,16 @@ describe("Test listAliases action", () => { action: { name: "api.listAliases", params: { - grouping: { convert: true, optional: true, type: "boolean" }, - withActionSchema: { convert: true, optional: true, type: "boolean" } + grouping: { + convert: true, + optional: true, + type: "boolean" + }, + withActionSchema: { + convert: true, + optional: true, + type: "boolean" + } }, rawName: "listAliases", rest: "GET /list-aliases" @@ -4988,15 +5441,19 @@ describe("Test multi REST interfaces in service settings", () => { let server; function regenerate() { - service.routes.forEach(route => route.opts.autoAliases && service.regenerateAutoAliases(route)); + service.routes.forEach( + route => route.opts.autoAliases && service.regenerateAutoAliases(route) + ); } beforeAll(() => { [broker, service, server] = setup({ - routes: [{ - path: "/", - autoAliases: true - }] + routes: [ + { + path: "/", + autoAliases: true + } + ] }); broker.loadService("./test/services/multiRoute.service"); return broker.start().then(() => regenerate()); @@ -5007,7 +5464,7 @@ describe("Test multi REST interfaces in service settings", () => { return Promise.all([ request(server).get("/route/hello"), request(server).get("/route/multi/hello") - ]).then((results) => { + ]).then(results => { results.forEach(result => { expect(result.statusCode).toBe(200); expect(result.headers["content-type"]).toBe("application/json; charset=utf-8"); @@ -5020,7 +5477,7 @@ describe("Test multi REST interfaces in service settings", () => { return Promise.all([ request(server).get("/route/greet").query({ name: "John" }), request(server).get("/route/multi/greet").query({ name: "John" }) - ]).then((results) => { + ]).then(results => { results.forEach(result => { expect(result.statusCode).toBe(200); expect(result.headers["content-type"]).toBe("application/json; charset=utf-8"); @@ -5055,7 +5512,7 @@ describe("Test multi REST interfaces in service settings", () => { request(server).put("/route/multi/update").query({ name: "John" }), request(server).patch("/route/update").query({ name: "John" }), request(server).patch("/route/multi/update").query({ name: "John" }) - ]).then((results) => { + ]).then(results => { results.forEach(result => { expect(result.statusCode).toBe(200); expect(result.headers["content-type"]).toBe("application/json; charset=utf-8"); @@ -5065,7 +5522,6 @@ describe("Test multi REST interfaces in service settings", () => { }); }); - describe("Test pathToRegexpOptions", () => { let broker; let server; @@ -5080,7 +5536,7 @@ describe("Test pathToRegexpOptions", () => { aliases: { "GET users": "users.create1", "GET Users": "users.create2" - }, + } }, { path: "/t2", @@ -5091,8 +5547,8 @@ describe("Test pathToRegexpOptions", () => { pathToRegexpOptions: { sensitive: true } - }, - ], + } + ] }); broker.createService({ @@ -5151,8 +5607,6 @@ describe("Test pathToRegexpOptions", () => { expect(res.body).toEqual("OK2"); }); }); - - }); describe("Test named routes with same path", () => { @@ -5184,10 +5638,10 @@ describe("Test named routes with same path", () => { expect(res.statusCode).toBe(404); expect(res.headers["content-type"]).toBe("application/json; charset=utf-8"); expect(res.body).toEqual({ - "code": 404, - "message": "Not found", - "name": "NotFoundError", - "type": "NOT_FOUND" + code: 404, + message: "Not found", + name: "NotFoundError", + type: "NOT_FOUND" }); }); }); @@ -5199,10 +5653,10 @@ describe("Test named routes with same path", () => { expect(res.statusCode).toBe(404); expect(res.headers["content-type"]).toBe("application/json; charset=utf-8"); expect(res.body).toEqual({ - "code": 404, - "message": "Not found", - "name": "NotFoundError", - "type": "NOT_FOUND" + code: 404, + message: "Not found", + name: "NotFoundError", + type: "NOT_FOUND" }); }); }); @@ -5212,7 +5666,7 @@ describe("Test named routes with same path", () => { name: "no-auth", path: "/my", aliases: { - "hello": "test.hello" + hello: "test.hello" }, onBeforeCall: hook1 }); @@ -5221,7 +5675,7 @@ describe("Test named routes with same path", () => { name: "with-auth", path: "/my", aliases: { - "hi": "test.hello" + hi: "test.hello" }, onBeforeCall: hook2 }); @@ -5258,7 +5712,7 @@ describe("Test named routes with same path", () => { name: "with-auth", path: "/other", aliases: { - "hello": "test.hello" + hello: "test.hello" } }); @@ -5273,7 +5727,6 @@ describe("Test named routes with same path", () => { expect(hook2).toHaveBeenCalledTimes(0); }); }); - }); describe("Test no qs options forwarding", () => { @@ -5304,7 +5757,7 @@ describe("Test qs options forwarding", () => { [broker, , server] = setup({ qsOptions: { comma: true - }, + } }); return broker.start(); }); diff --git a/test/services/math.service.js b/test/services/math.service.js index 9135bc31..621ba376 100644 --- a/test/services/math.service.js +++ b/test/services/math.service.js @@ -29,10 +29,8 @@ module.exports = { handler(ctx) { let a = Number(ctx.params.a); let b = Number(ctx.params.b); - if (b != 0 && !Number.isNaN(b)) - return a / b; - else - throw new MoleculerError("Divide by zero!", 422, ctx.params); + if (b != 0 && !Number.isNaN(b)) return a / b; + else throw new MoleculerError("Divide by zero!", 422, ctx.params); } } } diff --git a/test/services/multiRoute.service.js b/test/services/multiRoute.service.js index dfc6ee73..7143a013 100644 --- a/test/services/multiRoute.service.js +++ b/test/services/multiRoute.service.js @@ -8,59 +8,59 @@ const _ = require("lodash"); const { MoleculerServerError } = require("moleculer").Errors; module.exports = { - name: "multiRoute", + name: "multiRoute", - settings: { - rest: ["/route", "/route/multi"] - }, + settings: { + rest: ["/route", "/route/multi"] + }, - actions: { - hello: { - rest: "GET /hello", - handler(ctx) { - return "Hello Moleculer"; - } - }, + actions: { + hello: { + rest: "GET /hello", + handler(ctx) { + return "Hello Moleculer"; + } + }, - greet: { - rest: "/greet", - params: { - name: "string" - }, - handler(ctx) { - return `Hello ${ctx.params.name}`; - } - }, + greet: { + rest: "/greet", + params: { + name: "string" + }, + handler(ctx) { + return `Hello ${ctx.params.name}`; + } + }, - fullPath: { - rest: { - method: "GET", - fullPath: "/fullPath", - }, - handler(ctx) { - return "Full path"; - } - }, + fullPath: { + rest: { + method: "GET", + fullPath: "/fullPath" + }, + handler(ctx) { + return "Full path"; + } + }, - basePath: { - rest: { - method: "GET", - path: "/base-path", - basePath: "custom-base-path" - }, - handler(ctx) { - return "Hello Custom Moleculer Root Path"; - } - }, + basePath: { + rest: { + method: "GET", + path: "/base-path", + basePath: "custom-base-path" + }, + handler(ctx) { + return "Hello Custom Moleculer Root Path"; + } + }, - update: { - rest: ["PUT /update", "PATCH /update"], - params: { - name: "string" - }, - handler(ctx) { - return `Hello ${ctx.params.name}`; - } - }, - } -} \ No newline at end of file + update: { + rest: ["PUT /update", "PATCH /update"], + params: { + name: "string" + }, + handler(ctx) { + return `Hello ${ctx.params.name}`; + } + } + } +}; diff --git a/test/services/posts.service.js b/test/services/posts.service.js index d1a569f4..34bf90d5 100644 --- a/test/services/posts.service.js +++ b/test/services/posts.service.js @@ -1,13 +1,13 @@ "use strict"; -const _ = require("lodash"); +const _ = require("lodash"); const { MoleculerError } = require("moleculer").Errors; -const fake = require("fakerator")(); +const fake = require("fakerator")(); function generateFakeData(count) { let rows = []; - for(let i = 0; i < count; i++) { + for (let i = 0; i < count; i++) { let item = fake.entity.post(); item.id = i + 1; item.author = fake.random.number(1, 10); @@ -31,7 +31,6 @@ module.exports = { } }, - get: { cache: { keys: ["id"] @@ -39,8 +38,7 @@ module.exports = { rest: "GET /:id", handler(ctx) { const post = this.findByID(ctx.params.id); - if (post) - return post; + if (post) return post; return Promise.reject(new MoleculerError("Post not found!", 404)); } @@ -62,12 +60,9 @@ module.exports = { handler(ctx) { const post = this.findByID(ctx.params.id); if (post) { - if (ctx.params.title) - post.title = ctx.params.title; - if (ctx.params.content) - post.content = ctx.params.content; - if (ctx.params.author) - post.author = ctx.params.author; + if (ctx.params.title) post.title = ctx.params.title; + if (ctx.params.content) post.content = ctx.params.content; + if (ctx.params.author) post.author = ctx.params.author; this.clearCache(); return post; @@ -90,7 +85,6 @@ module.exports = { this.clearCache(); } } - }, methods: { diff --git a/test/services/test.service.js b/test/services/test.service.js index 7fd5398c..fbea8d40 100644 --- a/test/services/test.service.js +++ b/test/services/test.service.js @@ -35,7 +35,7 @@ module.exports = { fullPath: { rest: { method: "GET", - fullPath: "/fullPath", + fullPath: "/fullPath" }, handler(ctx) { return "Full path"; @@ -173,15 +173,15 @@ module.exports = { jsonArray(ctx) { return [ { id: 1, name: "John" }, - { id: 2, name: "Jane" }, + { id: 2, name: "Jane" } ]; }, function(ctx) { - return () => { }; + return () => {}; }, - nothing(ctx) { }, + nothing(ctx) {}, null(ctx) { return null; @@ -202,7 +202,7 @@ module.exports = { bufferJson: { handler(ctx) { ctx.meta.$responseType = "application/json"; - return Buffer.from("{ \"a\": 5 }"); + return Buffer.from('{ "a": 5 }'); } }, @@ -237,9 +237,12 @@ module.exports = { stream: { handler(ctx) { ctx.meta.$responseHeaders = { - "Content-Disposition": "attachment; filename=\"stream-lorem.txt\"" + "Content-Disposition": 'attachment; filename="stream-lorem.txt"' }; - const stream = fs.createReadStream(path.join(__dirname, "..", "assets", "lorem.txt"), "utf8"); + const stream = fs.createReadStream( + path.join(__dirname, "..", "assets", "lorem.txt"), + "utf8" + ); setTimeout(() => { stream.read(1024); }, 100); @@ -250,9 +253,12 @@ module.exports = { streamWithError(ctx) { ctx.meta.$responseHeaders = { - "Content-Disposition": "attachment; filename=\"stream-lorem.txt\"" + "Content-Disposition": 'attachment; filename="stream-lorem.txt"' }; - const stream = fs.createReadStream(path.join(__dirname, "..", "assets", "lorem.txt"), "utf8"); + const stream = fs.createReadStream( + path.join(__dirname, "..", "assets", "lorem.txt"), + "utf8" + ); setTimeout(() => { stream.emit("error", new MoleculerServerError("Something happened!")); }, 100); @@ -269,7 +275,7 @@ module.exports = { etag(ctx) { ctx.meta.$responseHeaders = { - "ETag": "my custom etag" + ETag: "my custom etag" }; return {}; }, @@ -320,6 +326,6 @@ module.exports = { handler(ctx) { return ctx.params.names; } - }, + } } }; diff --git a/test/unit/errors.spec.js b/test/unit/errors.spec.js index 03d8daaa..035a64b3 100644 --- a/test/unit/errors.spec.js +++ b/test/unit/errors.spec.js @@ -4,7 +4,6 @@ let errors = require("../../src/errors"); let { MoleculerClientError } = require("moleculer").Errors; describe("Test Errors", () => { - it("test InvalidRequestBodyError", () => { let err = new errors.InvalidRequestBodyError({ a: 5 }, "Problem"); expect(err).toBeDefined(); diff --git a/test/unit/service/httpHandler.spec.js b/test/unit/service/httpHandler.spec.js index 0bb6be23..ee0d840f 100644 --- a/test/unit/service/httpHandler.spec.js +++ b/test/unit/service/httpHandler.spec.js @@ -2,25 +2,27 @@ const HttpHandler = () => require("../../../src/index").methods.httpHandler; -const MockLogger = () => Object.assign({ - info: jest.fn(), - error: jest.fn(), - warning: jest.fn(), - debug: jest.fn(), - trace: jest.fn(), -}); -const MockContext = ({ action = jest.fn(), serve, settings } = {}) => Object.assign({ - actions: { - rest: action, - }, - settings: { ...require("../../../src/index").settings, ...settings }, - errorHandler: require("../../../src/index").methods.errorHandler, - logger: MockLogger(), - sendError: jest.fn(), - send404: jest.fn(), - corsHandler: jest.fn(() => false), - serve, -}); +const MockLogger = () => + Object.assign({ + info: jest.fn(), + error: jest.fn(), + warning: jest.fn(), + debug: jest.fn(), + trace: jest.fn() + }); +const MockContext = ({ action = jest.fn(), serve, settings } = {}) => + Object.assign({ + actions: { + rest: action + }, + settings: { ...require("../../../src/index").settings, ...settings }, + errorHandler: require("../../../src/index").methods.errorHandler, + logger: MockLogger(), + sendError: jest.fn(), + send404: jest.fn(), + corsHandler: jest.fn(() => false), + serve + }); const MockRequest = ({ headers = {} } = {}) => Object.assign(jest.fn(), { headers }); @@ -30,7 +32,7 @@ const makeFakeError = (message, code) => { return error; }; -const setup = (headers) =>{ +const setup = headers => { const handler = HttpHandler(); const req = MockRequest(headers); const res = jest.fn(); @@ -89,18 +91,23 @@ describe("WebGateway", () => { expect(res.locals).toEqual({}); }); - it("maintains the requestId of a \"x-request-id\" header if present", async () => { - const { handler, req, res, next } = setup({ headers: { "x-request-id": "foobar" } }); + it('maintains the requestId of a "x-request-id" header if present', async () => { + const { handler, req, res, next } = setup({ + headers: { "x-request-id": "foobar" } + }); const context = MockContext({ action: jest.fn().mockResolvedValueOnce() }); await handler.bind(context)(req, res, next); - expect(context.actions.rest.mock.calls[0]).toEqual([{ req, res }, { requestID: "foobar" }]); + expect(context.actions.rest.mock.calls[0]).toEqual([ + { req, res }, + { requestID: "foobar" } + ]); }); - it("maintains the requestId of a \"x-correlation-id\" header if present", async () => { + it('maintains the requestId of a "x-correlation-id" header if present', async () => { const { handler, req, res, next } = setup({ headers: { "x-request-id": "foobar", @@ -113,7 +120,10 @@ describe("WebGateway", () => { await handler.bind(context)(req, res, next); - expect(context.actions.rest.mock.calls[0]).toEqual([{ req, res }, { requestID: "barfoo" }]); + expect(context.actions.rest.mock.calls[0]).toEqual([ + { req, res }, + { requestID: "barfoo" } + ]); }); it("resolves if the rest.action did resolve with an object result", async () => { @@ -130,7 +140,7 @@ describe("WebGateway", () => { it("sends a 404 response if the request could not be routed and serving static assets is not configured", async () => { const { handler, req, res, next } = setup(); const context = MockContext({ - action: jest.fn().mockResolvedValueOnce(null), + action: jest.fn().mockResolvedValueOnce(null) }); await handler.bind(context)(req, res, next); @@ -142,7 +152,7 @@ describe("WebGateway", () => { const { handler, req, res, next } = setup(); let context = MockContext({ action: jest.fn().mockResolvedValueOnce(null), - serve: jest.fn(), + serve: jest.fn() }); await handler.bind(context)(req, res, next); @@ -156,7 +166,7 @@ describe("WebGateway", () => { const { handler, req, res, next } = setup(); let context = MockContext({ action: jest.fn().mockResolvedValueOnce(null), - serve: jest.fn(), + serve: jest.fn() }); const error = new Error("Something went wrong while serving a static asset"); @@ -169,7 +179,10 @@ describe("WebGateway", () => { it("logs and responds with an error if the rest action rejects", async () => { const { handler, req, res, next } = setup(); - const error = makeFakeError("Something went wrong while invoking the rest action", 503); + const error = makeFakeError( + "Something went wrong while invoking the rest action", + 503 + ); const context = MockContext({ action: jest.fn().mockRejectedValueOnce(error) }); @@ -177,12 +190,24 @@ describe("WebGateway", () => { await handler.bind(context)(req, res, next); expect(context.sendError.mock.calls[0]).toEqual([req, res, error]); - expect(context.logger.error.mock.calls[0]).toEqual([" Request error!", error.name, ":", error.message, "\n", error.stack, "\nData:", error.data]); + expect(context.logger.error.mock.calls[0]).toEqual([ + " Request error!", + error.name, + ":", + error.message, + "\n", + error.stack, + "\nData:", + error.data + ]); }); it("responds with an error but does not log the error if the rest action rejects, the error code is 400 and settings.log4XXResponses is false", async () => { const { handler, req, res, next } = setup(); - const error = makeFakeError("Something went wrong while invoking the rest action", 400); + const error = makeFakeError( + "Something went wrong while invoking the rest action", + 400 + ); const context = MockContext({ action: jest.fn().mockRejectedValueOnce(error), settings: { @@ -198,7 +223,10 @@ describe("WebGateway", () => { it("logs and responds with an error if the rest action rejects, the error code is 399 and settings.log4XXResponses is false", async () => { const { handler, req, res, next } = setup(); - const error = makeFakeError("Something went wrong while invoking the rest action", 399); + const error = makeFakeError( + "Something went wrong while invoking the rest action", + 399 + ); const context = MockContext({ action: jest.fn().mockRejectedValueOnce(error), settings: { @@ -214,7 +242,10 @@ describe("WebGateway", () => { it("logs and responds with an error if the rest action rejects, the error code is 500 and settings.log4XXResponses is false", async () => { const { handler, req, res, next } = setup(); - const error = makeFakeError("Something went wrong while invoking the rest action", 500); + const error = makeFakeError( + "Something went wrong while invoking the rest action", + 500 + ); const context = MockContext({ action: jest.fn().mockRejectedValueOnce(error), settings: {