├── .gitignore ├── LICENSE ├── README.md ├── package.json ├── src ├── config.ts ├── index.ts ├── mail-job.interface.ts ├── task-worker.ts ├── test-server.ts ├── users.ts ├── webhook-worker.ts └── workers.ts ├── tsconfig.json ├── tslint.json └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | 9 | # Diagnostic reports (https://nodejs.org/api/report.html) 10 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 11 | 12 | # Runtime data 13 | pids 14 | *.pid 15 | *.seed 16 | *.pid.lock 17 | 18 | # Directory for instrumented libs generated by jscoverage/JSCover 19 | lib-cov 20 | 21 | # Coverage directory used by tools like istanbul 22 | coverage 23 | *.lcov 24 | 25 | # nyc test coverage 26 | .nyc_output 27 | 28 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 29 | .grunt 30 | 31 | # Bower dependency directory (https://bower.io/) 32 | bower_components 33 | 34 | # node-waf configuration 35 | .lock-wscript 36 | 37 | # Compiled binary addons (https://nodejs.org/api/addons.html) 38 | build/Release 39 | 40 | # Dependency directories 41 | node_modules/ 42 | jspm_packages/ 43 | 44 | # TypeScript v1 declaration files 45 | typings/ 46 | 47 | # TypeScript cache 48 | *.tsbuildinfo 49 | 50 | # Optional npm cache directory 51 | .npm 52 | 53 | # Optional eslint cache 54 | .eslintcache 55 | 56 | # Microbundle cache 57 | .rpt2_cache/ 58 | .rts2_cache_cjs/ 59 | .rts2_cache_es/ 60 | .rts2_cache_umd/ 61 | 62 | # Optional REPL history 63 | .node_repl_history 64 | 65 | # Output of 'npm pack' 66 | *.tgz 67 | 68 | # Yarn Integrity file 69 | .yarn-integrity 70 | 71 | # dotenv environment variables file 72 | .env 73 | .env.test 74 | 75 | # parcel-bundler cache (https://parceljs.org/) 76 | .cache 77 | 78 | # Next.js build output 79 | .next 80 | 81 | # Nuxt.js build / generate output 82 | .nuxt 83 | dist 84 | 85 | # Gatsby files 86 | .cache/ 87 | # Comment in the public line in if your project uses Gatsby and *not* Next.js 88 | # https://nextjs.org/blog/next-9-1#public-directory-support 89 | # public 90 | 91 | # vuepress build output 92 | .vuepress/dist 93 | 94 | # Serverless directories 95 | .serverless/ 96 | 97 | # FuseBox cache 98 | .fusebox/ 99 | 100 | # DynamoDB Local files 101 | .dynamodb/ 102 | 103 | # TernJS port file 104 | .tern-port 105 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Taskforce.sh Inc. 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # BullMQ Tutorial - Webhooks 2 | 3 | This repo includes the code for the Webhooks tutorial (). 4 | 5 | # Install 6 | 7 | Just clone this repo and when inside the repo install the dependencies: 8 | 9 | ``` 10 | yarn 11 | ``` 12 | 13 | In order to test this code you need to run 3 different services, a main server 14 | that accepts posting tasks, a client server that will be called by the webhook worker, 15 | and a service to start the workers. 16 | 17 | Main service: 18 | 19 | ``` 20 | yarn start 21 | ``` 22 | 23 | Client test server: 24 | 25 | ``` 26 | yarn start:test 27 | ``` 28 | 29 | Workers: 30 | 31 | ``` 32 | yarn start:workers 33 | ``` 34 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "bullmq-webhooks", 3 | "version": "1.0.0", 4 | "description": "BullMQ Tutorial - Implementing webhooks", 5 | "main": "index.js", 6 | "author": "Manuel Astudillo { 10 | const taskData = req.body; 11 | 12 | console.log(`Received task "${req.params.taskType}" to process...`); 13 | 14 | taskQueue 15 | .add(req.params.taskType, { userId: req.params.userId, taskData }) 16 | .then( 17 | (job) => { 18 | res.status(201).end(job.id); 19 | }, 20 | (err) => { 21 | res.status(500).end(err); 22 | } 23 | ); 24 | }); 25 | 26 | console.log(`Start listening to port ${config.port}`); 27 | app.listen(config.port); 28 | -------------------------------------------------------------------------------- /src/mail-job.interface.ts: -------------------------------------------------------------------------------- 1 | export interface MailJob { 2 | mailOpts: { 3 | from: string; 4 | to: string; 5 | subject: string; 6 | text?: string; 7 | html?: string; 8 | generateTextFromHTML?: boolean; 9 | }; 10 | htmlAttachments?: { 11 | name: string; 12 | html: string; 13 | }[]; 14 | } 15 | -------------------------------------------------------------------------------- /src/task-worker.ts: -------------------------------------------------------------------------------- 1 | import { Worker, Queue } from "bullmq"; 2 | import config from "./config"; 3 | 4 | const webhooksQueue = new Queue("webhooks", { connection: config.connection }); 5 | 6 | /** 7 | * This worker performs some task based on the job.name. 8 | * When the task is completed (in this case we just perform a console.log) 9 | * we add a new job to the webhooks queue, which will be used to notify 10 | * the user that the task has been completed 11 | */ 12 | 13 | export const taskWorker = new Worker<{ userId: string; task: any }>( 14 | config.taskQueueName, 15 | async (job) => { 16 | console.log(`Processing job ${job.id} of type ${job.name}`); 17 | 18 | const result = `Result data from task performed for ${job.name} with ID ${job.id}`; 19 | 20 | return webhooksQueue.add( 21 | job.name, 22 | { userId: job.data.userId, result }, 23 | { 24 | attempts: config.maxAttempts, 25 | backoff: { type: "exponential", delay: config.backoffDelay }, 26 | } 27 | ); 28 | }, 29 | { connection: config.connection } 30 | ); 31 | -------------------------------------------------------------------------------- /src/test-server.ts: -------------------------------------------------------------------------------- 1 | import express from "express"; 2 | import config from "./config"; 3 | 4 | const app = express(); 5 | 6 | app.post("/:id", express.json(), express.json(), (req, res) => { 7 | console.log("Received notification with", req.body); 8 | res.status(200).end(); 9 | }); 10 | 11 | console.log(`Test server start listening to port ${config.userPort}`); 12 | app.listen(config.userPort); 13 | -------------------------------------------------------------------------------- /src/users.ts: -------------------------------------------------------------------------------- 1 | const usersTable: { [index: string]: { webhook: string; email: string } } = { 2 | "1": { webhook: "http://localhost:8080/1", email: "karen@example.com" }, 3 | "2": { 4 | webhook: "http://localhost:8080/2", 5 | email: "thomas@example.com", 6 | }, 7 | "3": { webhook: "http://localhost:8080/3", email: "sofia@example.com" }, 8 | "4": { webhook: "http://localhost:8080/4", email: "peter@example.com" }, 9 | "5": { webhook: "http://localhost:8080/5", email: "clara@example.com" }, 10 | "6": { webhook: "http://localhost:8080/6", email: "john@example.com" }, 11 | }; 12 | 13 | export const getUserById = async (userId: string) => usersTable[userId]; 14 | -------------------------------------------------------------------------------- /src/webhook-worker.ts: -------------------------------------------------------------------------------- 1 | import { Worker, Queue } from "bullmq"; 2 | import got from "got"; 3 | import config from "./config"; 4 | import { MailJob } from "./mail-job.interface"; 5 | import { getUserById } from "./users"; 6 | 7 | const mailQueue = new Queue(config.mailQueueName, { 8 | connection: config.connection, 9 | }); 10 | 11 | /** 12 | * This worker dispatches the results of the tasks to the users' webhooks. 13 | * It will try for a number of configured attempts, but if fails it will 14 | * try to send an email to the user notifying about the failue. 15 | * 16 | */ 17 | export const webhooksWorker = new Worker<{ userId: string; result: string }>( 18 | config.webhooksQueueName, 19 | async (job) => { 20 | const { userId, result } = job.data; 21 | const user = await getUserById(userId); 22 | 23 | const maxWebhookAttempts = config.maxAttempts - config.maxAttemptsForEmail; 24 | 25 | if (job.attemptsMade < maxWebhookAttempts) { 26 | console.log( 27 | `Calling webhook for "${result}", attempt ${ 28 | job.attemptsMade + 1 29 | } of ${maxWebhookAttempts}` 30 | ); 31 | await got.post(user.webhook, { json: { result } }); 32 | } else { 33 | console.log( 34 | `Giving up, lets mail user about webhook not working for "${result}"` 35 | ); 36 | // Send an email to the user about failing webhooks. 37 | return mailQueue.add("webhook-failure", { 38 | mailOpts: { 39 | from: "manast@taskforce.sh", 40 | subject: "Your Webhook is failing", 41 | text: `We tried to send a notification to your webhook ${user.webhook} ${maxWebhookAttempts} times and it is failing.`, 42 | to: user.email, 43 | }, 44 | }); 45 | } 46 | }, 47 | { 48 | connection: config.connection, 49 | } 50 | ); 51 | -------------------------------------------------------------------------------- /src/workers.ts: -------------------------------------------------------------------------------- 1 | import { webhooksWorker } from "./webhook-worker"; 2 | import { taskWorker } from "./task-worker"; 3 | import { QueueScheduler } from "bullmq"; 4 | import config from "./config"; 5 | 6 | const taskQueueScheduler = new QueueScheduler(config.taskQueueName, { 7 | connection: config.connection, 8 | }); 9 | 10 | const webhookQueueScheduler = new QueueScheduler(config.webhooksQueueName, { 11 | connection: config.connection, 12 | }); 13 | 14 | console.log(`Started workers: ${webhooksWorker.name} and ${taskWorker.name}`); 15 | 16 | taskWorker.on("failed", (err) => 17 | console.log("Failed processing task job", err) 18 | ); 19 | webhookQueueScheduler.on("failed", (err) => 20 | console.log("Failed processing webhook job", err) 21 | ); 22 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "esModuleInterop": true, 5 | "target": "es6", 6 | "noImplicitAny": true, 7 | "moduleResolution": "node", 8 | "sourceMap": true, 9 | "outDir": "dist", 10 | "baseUrl": ".", 11 | "paths": { 12 | "*": ["node_modules/*", "src/types/*"] 13 | } 14 | }, 15 | "include": ["src/**/*"] 16 | } 17 | -------------------------------------------------------------------------------- /tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "rules": { 3 | "class-name": true, 4 | "comment-format": [ 5 | true, 6 | "check-space" 7 | ], 8 | "indent": [ 9 | true, 10 | "spaces" 11 | ], 12 | "one-line": [ 13 | true, 14 | "check-open-brace", 15 | "check-whitespace" 16 | ], 17 | "no-var-keyword": true, 18 | "quotemark": [ 19 | true, 20 | "double", 21 | "avoid-escape" 22 | ], 23 | "semicolon": [ 24 | true, 25 | "always", 26 | "ignore-bound-class-methods" 27 | ], 28 | "whitespace": [ 29 | true, 30 | "check-branch", 31 | "check-decl", 32 | "check-operator", 33 | "check-module", 34 | "check-separator", 35 | "check-type" 36 | ], 37 | "typedef-whitespace": [ 38 | true, 39 | { 40 | "call-signature": "nospace", 41 | "index-signature": "nospace", 42 | "parameter": "nospace", 43 | "property-declaration": "nospace", 44 | "variable-declaration": "nospace" 45 | }, 46 | { 47 | "call-signature": "onespace", 48 | "index-signature": "onespace", 49 | "parameter": "onespace", 50 | "property-declaration": "onespace", 51 | "variable-declaration": "onespace" 52 | } 53 | ], 54 | "no-internal-module": true, 55 | "no-trailing-whitespace": true, 56 | "no-null-keyword": true, 57 | "prefer-const": true, 58 | "jsdoc-format": true 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@sindresorhus/is@^4.0.0": 6 | version "4.0.0" 7 | resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.0.0.tgz#2ff674e9611b45b528896d820d3d7a812de2f0e4" 8 | integrity sha512-FyD2meJpDPjyNQejSjvnhpgI/azsQkA4lGbuu5BQZfjvJ9cbRZXzeWL2HceCekW4lixO9JPesIIQkSoLjeJHNQ== 9 | 10 | "@szmarczak/http-timer@^4.0.5": 11 | version "4.0.5" 12 | resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-4.0.5.tgz#bfbd50211e9dfa51ba07da58a14cdfd333205152" 13 | integrity sha512-PyRA9sm1Yayuj5OIoJ1hGt2YISX45w9WcFbh6ddT0Z/0yaFxOtGLInr4jUfU1EAFVs0Yfyfev4RNwBlUaHdlDQ== 14 | dependencies: 15 | defer-to-connect "^2.0.0" 16 | 17 | "@types/body-parser@*": 18 | version "1.19.0" 19 | resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.0.tgz#0685b3c47eb3006ffed117cdd55164b61f80538f" 20 | integrity sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ== 21 | dependencies: 22 | "@types/connect" "*" 23 | "@types/node" "*" 24 | 25 | "@types/cacheable-request@^6.0.1": 26 | version "6.0.1" 27 | resolved "https://registry.yarnpkg.com/@types/cacheable-request/-/cacheable-request-6.0.1.tgz#5d22f3dded1fd3a84c0bbeb5039a7419c2c91976" 28 | integrity sha512-ykFq2zmBGOCbpIXtoVbz4SKY5QriWPh3AjyU4G74RYbtt5yOc5OfaY75ftjg7mikMOla1CTGpX3lLbuJh8DTrQ== 29 | dependencies: 30 | "@types/http-cache-semantics" "*" 31 | "@types/keyv" "*" 32 | "@types/node" "*" 33 | "@types/responselike" "*" 34 | 35 | "@types/connect@*": 36 | version "3.4.34" 37 | resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.34.tgz#170a40223a6d666006d93ca128af2beb1d9b1901" 38 | integrity sha512-ePPA/JuI+X0vb+gSWlPKOY0NdNAie/rPUqX2GUPpbZwiKTkSPhjXWuee47E4MtE54QVzGCQMQkAL6JhV2E1+cQ== 39 | dependencies: 40 | "@types/node" "*" 41 | 42 | "@types/express-serve-static-core@^4.17.18": 43 | version "4.17.19" 44 | resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.19.tgz#00acfc1632e729acac4f1530e9e16f6dd1508a1d" 45 | integrity sha512-DJOSHzX7pCiSElWaGR8kCprwibCB/3yW6vcT8VG3P0SJjnv19gnWG/AZMfM60Xj/YJIp/YCaDHyvzsFVeniARA== 46 | dependencies: 47 | "@types/node" "*" 48 | "@types/qs" "*" 49 | "@types/range-parser" "*" 50 | 51 | "@types/express@^4.17.11": 52 | version "4.17.11" 53 | resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.11.tgz#debe3caa6f8e5fcda96b47bd54e2f40c4ee59545" 54 | integrity sha512-no+R6rW60JEc59977wIxreQVsIEOAYwgCqldrA/vkpCnbD7MqTefO97lmoBe4WE0F156bC4uLSP1XHDOySnChg== 55 | dependencies: 56 | "@types/body-parser" "*" 57 | "@types/express-serve-static-core" "^4.17.18" 58 | "@types/qs" "*" 59 | "@types/serve-static" "*" 60 | 61 | "@types/http-cache-semantics@*": 62 | version "4.0.0" 63 | resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.0.tgz#9140779736aa2655635ee756e2467d787cfe8a2a" 64 | integrity sha512-c3Xy026kOF7QOTn00hbIllV1dLR9hG9NkSrLQgCVs8NF6sBU+VGWjD3wLPhmh1TYAc7ugCFsvHYMN4VcBN1U1A== 65 | 66 | "@types/ioredis@^4.16.3": 67 | version "4.22.1" 68 | resolved "https://registry.yarnpkg.com/@types/ioredis/-/ioredis-4.22.1.tgz#e03b064189ab20c9edc95ccde6228d2bf81f538c" 69 | integrity sha512-GxXT828fkvBeThO68ZJg8cD2haqea5ANBJaxA+UZqLranNkEnQ8N7QLPtykwWbN/sRQz75O7kj+PNmCKF4CEKw== 70 | dependencies: 71 | "@types/node" "*" 72 | 73 | "@types/keyv@*": 74 | version "3.1.1" 75 | resolved "https://registry.yarnpkg.com/@types/keyv/-/keyv-3.1.1.tgz#e45a45324fca9dab716ab1230ee249c9fb52cfa7" 76 | integrity sha512-MPtoySlAZQ37VoLaPcTHCu1RWJ4llDkULYZIzOYxlhxBqYPB0RsRlmMU0R6tahtFe27mIdkHV+551ZWV4PLmVw== 77 | dependencies: 78 | "@types/node" "*" 79 | 80 | "@types/mime@^1": 81 | version "1.3.2" 82 | resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a" 83 | integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw== 84 | 85 | "@types/node@*", "@types/node@^14.14.31": 86 | version "14.14.36" 87 | resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.36.tgz#5637905dbb15c30a33a3c65b9ef7c20e3c85ebad" 88 | integrity sha512-kjivUwDJfIjngzbhooRnOLhGYz6oRFi+L+EpMjxroDYXwDw9lHrJJ43E+dJ6KAd3V3WxWAJ/qZE9XKYHhjPOFQ== 89 | 90 | "@types/nodemailer@^6.4.0": 91 | version "6.4.1" 92 | resolved "https://registry.yarnpkg.com/@types/nodemailer/-/nodemailer-6.4.1.tgz#31f96f4410632f781d3613bd1f4293649e423f75" 93 | integrity sha512-8081UY/0XTTDpuGqCnDc8IY+Q3DSg604wB3dBH0CaZlj4nZWHWuxtZ3NRZ9c9WUrz1Vfm6wioAUnqL3bsh49uQ== 94 | dependencies: 95 | "@types/node" "*" 96 | 97 | "@types/qs@*": 98 | version "6.9.6" 99 | resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.6.tgz#df9c3c8b31a247ec315e6996566be3171df4b3b1" 100 | integrity sha512-0/HnwIfW4ki2D8L8c9GVcG5I72s9jP5GSLVF0VIXDW00kmIpA6O33G7a8n59Tmh7Nz0WUC3rSb7PTY/sdW2JzA== 101 | 102 | "@types/range-parser@*": 103 | version "1.2.3" 104 | resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.3.tgz#7ee330ba7caafb98090bece86a5ee44115904c2c" 105 | integrity sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA== 106 | 107 | "@types/responselike@*", "@types/responselike@^1.0.0": 108 | version "1.0.0" 109 | resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.0.tgz#251f4fe7d154d2bad125abe1b429b23afd262e29" 110 | integrity sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA== 111 | dependencies: 112 | "@types/node" "*" 113 | 114 | "@types/serve-static@*": 115 | version "1.13.9" 116 | resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.9.tgz#aacf28a85a05ee29a11fb7c3ead935ac56f33e4e" 117 | integrity sha512-ZFqF6qa48XsPdjXV5Gsz0Zqmux2PerNd3a/ktL45mHpa19cuMi/cL8tcxdAx497yRh+QtYPuofjT9oWw9P7nkA== 118 | dependencies: 119 | "@types/mime" "^1" 120 | "@types/node" "*" 121 | 122 | accepts@~1.3.7: 123 | version "1.3.7" 124 | resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" 125 | integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== 126 | dependencies: 127 | mime-types "~2.1.24" 128 | negotiator "0.6.2" 129 | 130 | array-flatten@1.1.1: 131 | version "1.1.1" 132 | resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" 133 | integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= 134 | 135 | body-parser@1.19.0: 136 | version "1.19.0" 137 | resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" 138 | integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== 139 | dependencies: 140 | bytes "3.1.0" 141 | content-type "~1.0.4" 142 | debug "2.6.9" 143 | depd "~1.1.2" 144 | http-errors "1.7.2" 145 | iconv-lite "0.4.24" 146 | on-finished "~2.3.0" 147 | qs "6.7.0" 148 | raw-body "2.4.0" 149 | type-is "~1.6.17" 150 | 151 | bullmq@^1.14.7: 152 | version "1.15.1" 153 | resolved "https://registry.yarnpkg.com/bullmq/-/bullmq-1.15.1.tgz#7c809ce5732e56db3ba778980d3d93127ee680fd" 154 | integrity sha512-vj41rPysNw7Y2vfivZ7NzJALhUnab3W5U1sAtIu1IZyo0TCcqk9PIC/MQfeTl1U771DGfm1I1/uLwX1cNi2MzQ== 155 | dependencies: 156 | "@types/ioredis" "^4.16.3" 157 | cron-parser "^2.7.3" 158 | get-port "^5.0.0" 159 | ioredis "^4.17.3" 160 | lodash "^4.17.11" 161 | semver "^6.3.0" 162 | tslib "^1.10.0" 163 | uuid "^8.2.0" 164 | 165 | bytes@3.1.0: 166 | version "3.1.0" 167 | resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" 168 | integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== 169 | 170 | cacheable-lookup@^5.0.3: 171 | version "5.0.4" 172 | resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz#5a6b865b2c44357be3d5ebc2a467b032719a7005" 173 | integrity sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA== 174 | 175 | cacheable-request@^7.0.1: 176 | version "7.0.1" 177 | resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-7.0.1.tgz#062031c2856232782ed694a257fa35da93942a58" 178 | integrity sha512-lt0mJ6YAnsrBErpTMWeu5kl/tg9xMAWjavYTN6VQXM1A/teBITuNcccXsCxF0tDQQJf9DfAaX5O4e0zp0KlfZw== 179 | dependencies: 180 | clone-response "^1.0.2" 181 | get-stream "^5.1.0" 182 | http-cache-semantics "^4.0.0" 183 | keyv "^4.0.0" 184 | lowercase-keys "^2.0.0" 185 | normalize-url "^4.1.0" 186 | responselike "^2.0.0" 187 | 188 | call-bind@^1.0.0: 189 | version "1.0.2" 190 | resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" 191 | integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== 192 | dependencies: 193 | function-bind "^1.1.1" 194 | get-intrinsic "^1.0.2" 195 | 196 | clone-response@^1.0.2: 197 | version "1.0.2" 198 | resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" 199 | integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws= 200 | dependencies: 201 | mimic-response "^1.0.0" 202 | 203 | cluster-key-slot@^1.1.0: 204 | version "1.1.0" 205 | resolved "https://registry.yarnpkg.com/cluster-key-slot/-/cluster-key-slot-1.1.0.tgz#30474b2a981fb12172695833052bc0d01336d10d" 206 | integrity sha512-2Nii8p3RwAPiFwsnZvukotvow2rIHM+yQ6ZcBXGHdniadkYGZYiGmkHJIbZPIV9nfv7m/U1IPMVVcAhoWFeklw== 207 | 208 | content-disposition@0.5.3: 209 | version "0.5.3" 210 | resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" 211 | integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== 212 | dependencies: 213 | safe-buffer "5.1.2" 214 | 215 | content-type@~1.0.4: 216 | version "1.0.4" 217 | resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" 218 | integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== 219 | 220 | cookie-signature@1.0.6: 221 | version "1.0.6" 222 | resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" 223 | integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= 224 | 225 | cookie@0.4.0: 226 | version "0.4.0" 227 | resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" 228 | integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== 229 | 230 | cron-parser@^2.7.3: 231 | version "2.18.0" 232 | resolved "https://registry.yarnpkg.com/cron-parser/-/cron-parser-2.18.0.tgz#de1bb0ad528c815548371993f81a54e5a089edcf" 233 | integrity sha512-s4odpheTyydAbTBQepsqd2rNWGa2iV3cyo8g7zbI2QQYGLVsfbhmwukayS1XHppe02Oy1fg7mg6xoaraVJeEcg== 234 | dependencies: 235 | is-nan "^1.3.0" 236 | moment-timezone "^0.5.31" 237 | 238 | debug@2.6.9: 239 | version "2.6.9" 240 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 241 | integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== 242 | dependencies: 243 | ms "2.0.0" 244 | 245 | debug@^4.3.1: 246 | version "4.3.1" 247 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" 248 | integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== 249 | dependencies: 250 | ms "2.1.2" 251 | 252 | decompress-response@^6.0.0: 253 | version "6.0.0" 254 | resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" 255 | integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== 256 | dependencies: 257 | mimic-response "^3.1.0" 258 | 259 | defer-to-connect@^2.0.0: 260 | version "2.0.1" 261 | resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587" 262 | integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== 263 | 264 | define-properties@^1.1.3: 265 | version "1.1.3" 266 | resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" 267 | integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== 268 | dependencies: 269 | object-keys "^1.0.12" 270 | 271 | denque@^1.1.0: 272 | version "1.5.0" 273 | resolved "https://registry.yarnpkg.com/denque/-/denque-1.5.0.tgz#773de0686ff2d8ec2ff92914316a47b73b1c73de" 274 | integrity sha512-CYiCSgIF1p6EUByQPlGkKnP1M9g0ZV3qMIrqMqZqdwazygIA/YP2vrbcyl1h/WppKJTdl1F85cXIle+394iDAQ== 275 | 276 | depd@~1.1.2: 277 | version "1.1.2" 278 | resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" 279 | integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= 280 | 281 | destroy@~1.0.4: 282 | version "1.0.4" 283 | resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" 284 | integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= 285 | 286 | ee-first@1.1.1: 287 | version "1.1.1" 288 | resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" 289 | integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= 290 | 291 | encodeurl@~1.0.2: 292 | version "1.0.2" 293 | resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" 294 | integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= 295 | 296 | end-of-stream@^1.1.0: 297 | version "1.4.4" 298 | resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" 299 | integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== 300 | dependencies: 301 | once "^1.4.0" 302 | 303 | escape-html@~1.0.3: 304 | version "1.0.3" 305 | resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" 306 | integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= 307 | 308 | etag@~1.8.1: 309 | version "1.8.1" 310 | resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" 311 | integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= 312 | 313 | express@^4.17.1: 314 | version "4.17.1" 315 | resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" 316 | integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== 317 | dependencies: 318 | accepts "~1.3.7" 319 | array-flatten "1.1.1" 320 | body-parser "1.19.0" 321 | content-disposition "0.5.3" 322 | content-type "~1.0.4" 323 | cookie "0.4.0" 324 | cookie-signature "1.0.6" 325 | debug "2.6.9" 326 | depd "~1.1.2" 327 | encodeurl "~1.0.2" 328 | escape-html "~1.0.3" 329 | etag "~1.8.1" 330 | finalhandler "~1.1.2" 331 | fresh "0.5.2" 332 | merge-descriptors "1.0.1" 333 | methods "~1.1.2" 334 | on-finished "~2.3.0" 335 | parseurl "~1.3.3" 336 | path-to-regexp "0.1.7" 337 | proxy-addr "~2.0.5" 338 | qs "6.7.0" 339 | range-parser "~1.2.1" 340 | safe-buffer "5.1.2" 341 | send "0.17.1" 342 | serve-static "1.14.1" 343 | setprototypeof "1.1.1" 344 | statuses "~1.5.0" 345 | type-is "~1.6.18" 346 | utils-merge "1.0.1" 347 | vary "~1.1.2" 348 | 349 | finalhandler@~1.1.2: 350 | version "1.1.2" 351 | resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" 352 | integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== 353 | dependencies: 354 | debug "2.6.9" 355 | encodeurl "~1.0.2" 356 | escape-html "~1.0.3" 357 | on-finished "~2.3.0" 358 | parseurl "~1.3.3" 359 | statuses "~1.5.0" 360 | unpipe "~1.0.0" 361 | 362 | forwarded@~0.1.2: 363 | version "0.1.2" 364 | resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" 365 | integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= 366 | 367 | fresh@0.5.2: 368 | version "0.5.2" 369 | resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" 370 | integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= 371 | 372 | function-bind@^1.1.1: 373 | version "1.1.1" 374 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 375 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 376 | 377 | get-intrinsic@^1.0.2: 378 | version "1.1.1" 379 | resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" 380 | integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== 381 | dependencies: 382 | function-bind "^1.1.1" 383 | has "^1.0.3" 384 | has-symbols "^1.0.1" 385 | 386 | get-port@^5.0.0: 387 | version "5.1.1" 388 | resolved "https://registry.yarnpkg.com/get-port/-/get-port-5.1.1.tgz#0469ed07563479de6efb986baf053dcd7d4e3193" 389 | integrity sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ== 390 | 391 | get-stream@^5.1.0: 392 | version "5.2.0" 393 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" 394 | integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== 395 | dependencies: 396 | pump "^3.0.0" 397 | 398 | got@^11.8.2: 399 | version "11.8.2" 400 | resolved "https://registry.yarnpkg.com/got/-/got-11.8.2.tgz#7abb3959ea28c31f3576f1576c1effce23f33599" 401 | integrity sha512-D0QywKgIe30ODs+fm8wMZiAcZjypcCodPNuMz5H9Mny7RJ+IjJ10BdmGW7OM7fHXP+O7r6ZwapQ/YQmMSvB0UQ== 402 | dependencies: 403 | "@sindresorhus/is" "^4.0.0" 404 | "@szmarczak/http-timer" "^4.0.5" 405 | "@types/cacheable-request" "^6.0.1" 406 | "@types/responselike" "^1.0.0" 407 | cacheable-lookup "^5.0.3" 408 | cacheable-request "^7.0.1" 409 | decompress-response "^6.0.0" 410 | http2-wrapper "^1.0.0-beta.5.2" 411 | lowercase-keys "^2.0.0" 412 | p-cancelable "^2.0.0" 413 | responselike "^2.0.0" 414 | 415 | has-symbols@^1.0.1: 416 | version "1.0.2" 417 | resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" 418 | integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== 419 | 420 | has@^1.0.3: 421 | version "1.0.3" 422 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 423 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== 424 | dependencies: 425 | function-bind "^1.1.1" 426 | 427 | http-cache-semantics@^4.0.0: 428 | version "4.1.0" 429 | resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" 430 | integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== 431 | 432 | http-errors@1.7.2: 433 | version "1.7.2" 434 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" 435 | integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== 436 | dependencies: 437 | depd "~1.1.2" 438 | inherits "2.0.3" 439 | setprototypeof "1.1.1" 440 | statuses ">= 1.5.0 < 2" 441 | toidentifier "1.0.0" 442 | 443 | http-errors@~1.7.2: 444 | version "1.7.3" 445 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" 446 | integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== 447 | dependencies: 448 | depd "~1.1.2" 449 | inherits "2.0.4" 450 | setprototypeof "1.1.1" 451 | statuses ">= 1.5.0 < 2" 452 | toidentifier "1.0.0" 453 | 454 | http2-wrapper@^1.0.0-beta.5.2: 455 | version "1.0.3" 456 | resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-1.0.3.tgz#b8f55e0c1f25d4ebd08b3b0c2c079f9590800b3d" 457 | integrity sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg== 458 | dependencies: 459 | quick-lru "^5.1.1" 460 | resolve-alpn "^1.0.0" 461 | 462 | iconv-lite@0.4.24: 463 | version "0.4.24" 464 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 465 | integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== 466 | dependencies: 467 | safer-buffer ">= 2.1.2 < 3" 468 | 469 | inherits@2.0.3: 470 | version "2.0.3" 471 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 472 | integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= 473 | 474 | inherits@2.0.4: 475 | version "2.0.4" 476 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 477 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 478 | 479 | ioredis@^4.17.3: 480 | version "4.24.4" 481 | resolved "https://registry.yarnpkg.com/ioredis/-/ioredis-4.24.4.tgz#2f3cc03c5bfc75e13141459418bb1bd64ba1c7cf" 482 | integrity sha512-v28xxBENyTmReC6lVTL7EkAPjVF8cuGtDEjGDi1Z2n7htsC2WdiDceZrCIPeuPiLa6kDFWHb1Y8O0upZROsMgA== 483 | dependencies: 484 | cluster-key-slot "^1.1.0" 485 | debug "^4.3.1" 486 | denque "^1.1.0" 487 | lodash.defaults "^4.2.0" 488 | lodash.flatten "^4.4.0" 489 | p-map "^2.1.0" 490 | redis-commands "1.7.0" 491 | redis-errors "^1.2.0" 492 | redis-parser "^3.0.0" 493 | standard-as-callback "^2.1.0" 494 | 495 | ipaddr.js@1.9.1: 496 | version "1.9.1" 497 | resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" 498 | integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== 499 | 500 | is-nan@^1.3.0: 501 | version "1.3.2" 502 | resolved "https://registry.yarnpkg.com/is-nan/-/is-nan-1.3.2.tgz#043a54adea31748b55b6cd4e09aadafa69bd9e1d" 503 | integrity sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w== 504 | dependencies: 505 | call-bind "^1.0.0" 506 | define-properties "^1.1.3" 507 | 508 | json-buffer@3.0.1: 509 | version "3.0.1" 510 | resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" 511 | integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== 512 | 513 | keyv@^4.0.0: 514 | version "4.0.3" 515 | resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.0.3.tgz#4f3aa98de254803cafcd2896734108daa35e4254" 516 | integrity sha512-zdGa2TOpSZPq5mU6iowDARnMBZgtCqJ11dJROFi6tg6kTn4nuUdU09lFyLFSaHrWqpIJ+EBq4E8/Dc0Vx5vLdA== 517 | dependencies: 518 | json-buffer "3.0.1" 519 | 520 | lodash.defaults@^4.2.0: 521 | version "4.2.0" 522 | resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" 523 | integrity sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw= 524 | 525 | lodash.flatten@^4.4.0: 526 | version "4.4.0" 527 | resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" 528 | integrity sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8= 529 | 530 | lodash@^4.17.11: 531 | version "4.17.21" 532 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" 533 | integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== 534 | 535 | lowercase-keys@^2.0.0: 536 | version "2.0.0" 537 | resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" 538 | integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== 539 | 540 | media-typer@0.3.0: 541 | version "0.3.0" 542 | resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" 543 | integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= 544 | 545 | merge-descriptors@1.0.1: 546 | version "1.0.1" 547 | resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" 548 | integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= 549 | 550 | methods@~1.1.2: 551 | version "1.1.2" 552 | resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" 553 | integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= 554 | 555 | mime-db@1.46.0: 556 | version "1.46.0" 557 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.46.0.tgz#6267748a7f799594de3cbc8cde91def349661cee" 558 | integrity sha512-svXaP8UQRZ5K7or+ZmfNhg2xX3yKDMUzqadsSqi4NCH/KomcH75MAMYAGVlvXn4+b/xOPhS3I2uHKRUzvjY7BQ== 559 | 560 | mime-types@~2.1.24: 561 | version "2.1.29" 562 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.29.tgz#1d4ab77da64b91f5f72489df29236563754bb1b2" 563 | integrity sha512-Y/jMt/S5sR9OaqteJtslsFZKWOIIqMACsJSiHghlCAyhf7jfVYjKBmLiX8OgpWeW+fjJ2b+Az69aPFPkUOY6xQ== 564 | dependencies: 565 | mime-db "1.46.0" 566 | 567 | mime@1.6.0: 568 | version "1.6.0" 569 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" 570 | integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== 571 | 572 | mimic-response@^1.0.0: 573 | version "1.0.1" 574 | resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" 575 | integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== 576 | 577 | mimic-response@^3.1.0: 578 | version "3.1.0" 579 | resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" 580 | integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== 581 | 582 | moment-timezone@^0.5.31: 583 | version "0.5.33" 584 | resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.33.tgz#b252fd6bb57f341c9b59a5ab61a8e51a73bbd22c" 585 | integrity sha512-PTc2vcT8K9J5/9rDEPe5czSIKgLoGsH8UNpA4qZTVw0Vd/Uz19geE9abbIOQKaAQFcnQ3v5YEXrbSc5BpshH+w== 586 | dependencies: 587 | moment ">= 2.9.0" 588 | 589 | "moment@>= 2.9.0": 590 | version "2.29.1" 591 | resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.1.tgz#b2be769fa31940be9eeea6469c075e35006fa3d3" 592 | integrity sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ== 593 | 594 | ms@2.0.0: 595 | version "2.0.0" 596 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 597 | integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= 598 | 599 | ms@2.1.1: 600 | version "2.1.1" 601 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" 602 | integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== 603 | 604 | ms@2.1.2: 605 | version "2.1.2" 606 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 607 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 608 | 609 | negotiator@0.6.2: 610 | version "0.6.2" 611 | resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" 612 | integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== 613 | 614 | normalize-url@^4.1.0: 615 | version "4.5.0" 616 | resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.0.tgz#453354087e6ca96957bd8f5baf753f5982142129" 617 | integrity sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ== 618 | 619 | object-keys@^1.0.12: 620 | version "1.1.1" 621 | resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" 622 | integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== 623 | 624 | on-finished@~2.3.0: 625 | version "2.3.0" 626 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" 627 | integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= 628 | dependencies: 629 | ee-first "1.1.1" 630 | 631 | once@^1.3.1, once@^1.4.0: 632 | version "1.4.0" 633 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 634 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 635 | dependencies: 636 | wrappy "1" 637 | 638 | p-cancelable@^2.0.0: 639 | version "2.1.0" 640 | resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.1.0.tgz#4d51c3b91f483d02a0d300765321fca393d758dd" 641 | integrity sha512-HAZyB3ZodPo+BDpb4/Iu7Jv4P6cSazBz9ZM0ChhEXp70scx834aWCEjQRwgt41UzzejUAPdbqqONfRWTPYrPAQ== 642 | 643 | p-map@^2.1.0: 644 | version "2.1.0" 645 | resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" 646 | integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== 647 | 648 | parseurl@~1.3.3: 649 | version "1.3.3" 650 | resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" 651 | integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== 652 | 653 | path-to-regexp@0.1.7: 654 | version "0.1.7" 655 | resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" 656 | integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= 657 | 658 | proxy-addr@~2.0.5: 659 | version "2.0.6" 660 | resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf" 661 | integrity sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw== 662 | dependencies: 663 | forwarded "~0.1.2" 664 | ipaddr.js "1.9.1" 665 | 666 | pump@^3.0.0: 667 | version "3.0.0" 668 | resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" 669 | integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== 670 | dependencies: 671 | end-of-stream "^1.1.0" 672 | once "^1.3.1" 673 | 674 | qs@6.7.0: 675 | version "6.7.0" 676 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" 677 | integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== 678 | 679 | quick-lru@^5.1.1: 680 | version "5.1.1" 681 | resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" 682 | integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== 683 | 684 | range-parser@~1.2.1: 685 | version "1.2.1" 686 | resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" 687 | integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== 688 | 689 | raw-body@2.4.0: 690 | version "2.4.0" 691 | resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" 692 | integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== 693 | dependencies: 694 | bytes "3.1.0" 695 | http-errors "1.7.2" 696 | iconv-lite "0.4.24" 697 | unpipe "1.0.0" 698 | 699 | redis-commands@1.7.0: 700 | version "1.7.0" 701 | resolved "https://registry.yarnpkg.com/redis-commands/-/redis-commands-1.7.0.tgz#15a6fea2d58281e27b1cd1acfb4b293e278c3a89" 702 | integrity sha512-nJWqw3bTFy21hX/CPKHth6sfhZbdiHP6bTawSgQBlKOVRG7EZkfHbbHwQJnrE4vsQf0CMNE+3gJ4Fmm16vdVlQ== 703 | 704 | redis-errors@^1.0.0, redis-errors@^1.2.0: 705 | version "1.2.0" 706 | resolved "https://registry.yarnpkg.com/redis-errors/-/redis-errors-1.2.0.tgz#eb62d2adb15e4eaf4610c04afe1529384250abad" 707 | integrity sha1-62LSrbFeTq9GEMBK/hUpOEJQq60= 708 | 709 | redis-parser@^3.0.0: 710 | version "3.0.0" 711 | resolved "https://registry.yarnpkg.com/redis-parser/-/redis-parser-3.0.0.tgz#b66d828cdcafe6b4b8a428a7def4c6bcac31c8b4" 712 | integrity sha1-tm2CjNyv5rS4pCin3vTGvKwxyLQ= 713 | dependencies: 714 | redis-errors "^1.0.0" 715 | 716 | resolve-alpn@^1.0.0: 717 | version "1.0.0" 718 | resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.0.0.tgz#745ad60b3d6aff4b4a48e01b8c0bdc70959e0e8c" 719 | integrity sha512-rTuiIEqFmGxne4IovivKSDzld2lWW9QCjqv80SYjPgf+gS35eaCAjaP54CCwGAwBtnCsvNLYtqxe1Nw+i6JEmA== 720 | 721 | responselike@^2.0.0: 722 | version "2.0.0" 723 | resolved "https://registry.yarnpkg.com/responselike/-/responselike-2.0.0.tgz#26391bcc3174f750f9a79eacc40a12a5c42d7723" 724 | integrity sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw== 725 | dependencies: 726 | lowercase-keys "^2.0.0" 727 | 728 | safe-buffer@5.1.2: 729 | version "5.1.2" 730 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 731 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 732 | 733 | "safer-buffer@>= 2.1.2 < 3": 734 | version "2.1.2" 735 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 736 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 737 | 738 | semver@^6.3.0: 739 | version "6.3.0" 740 | resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" 741 | integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== 742 | 743 | send@0.17.1: 744 | version "0.17.1" 745 | resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" 746 | integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== 747 | dependencies: 748 | debug "2.6.9" 749 | depd "~1.1.2" 750 | destroy "~1.0.4" 751 | encodeurl "~1.0.2" 752 | escape-html "~1.0.3" 753 | etag "~1.8.1" 754 | fresh "0.5.2" 755 | http-errors "~1.7.2" 756 | mime "1.6.0" 757 | ms "2.1.1" 758 | on-finished "~2.3.0" 759 | range-parser "~1.2.1" 760 | statuses "~1.5.0" 761 | 762 | serve-static@1.14.1: 763 | version "1.14.1" 764 | resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" 765 | integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== 766 | dependencies: 767 | encodeurl "~1.0.2" 768 | escape-html "~1.0.3" 769 | parseurl "~1.3.3" 770 | send "0.17.1" 771 | 772 | setprototypeof@1.1.1: 773 | version "1.1.1" 774 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" 775 | integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== 776 | 777 | standard-as-callback@^2.1.0: 778 | version "2.1.0" 779 | resolved "https://registry.yarnpkg.com/standard-as-callback/-/standard-as-callback-2.1.0.tgz#8953fc05359868a77b5b9739a665c5977bb7df45" 780 | integrity sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A== 781 | 782 | "statuses@>= 1.5.0 < 2", statuses@~1.5.0: 783 | version "1.5.0" 784 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" 785 | integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= 786 | 787 | toidentifier@1.0.0: 788 | version "1.0.0" 789 | resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" 790 | integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== 791 | 792 | tslib@^1.10.0: 793 | version "1.14.1" 794 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" 795 | integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== 796 | 797 | type-is@~1.6.17, type-is@~1.6.18: 798 | version "1.6.18" 799 | resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" 800 | integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== 801 | dependencies: 802 | media-typer "0.3.0" 803 | mime-types "~2.1.24" 804 | 805 | typescript@^4.2.2: 806 | version "4.2.3" 807 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.2.3.tgz#39062d8019912d43726298f09493d598048c1ce3" 808 | integrity sha512-qOcYwxaByStAWrBf4x0fibwZvMRG+r4cQoTjbPtUlrWjBHbmCAww1i448U0GJ+3cNNEtebDteo/cHOR3xJ4wEw== 809 | 810 | unpipe@1.0.0, unpipe@~1.0.0: 811 | version "1.0.0" 812 | resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" 813 | integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= 814 | 815 | utils-merge@1.0.1: 816 | version "1.0.1" 817 | resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" 818 | integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= 819 | 820 | uuid@^8.2.0: 821 | version "8.3.2" 822 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" 823 | integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== 824 | 825 | vary@~1.1.2: 826 | version "1.1.2" 827 | resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" 828 | integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= 829 | 830 | wrappy@1: 831 | version "1.0.2" 832 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 833 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 834 | --------------------------------------------------------------------------------