├── .gitignore ├── .vscode ├── extensions.json └── settings.json ├── LICENSE.md ├── Makefile ├── README.md ├── package.json ├── src ├── application.cluster.ts ├── application.factory.ts ├── application.routes.ts ├── application.ts └── index.ts ├── tsconfig.json ├── tslint.json └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | coverage 3 | dist 4 | **/.DS_Store 5 | *.log 6 | /*.js 7 | /*.map 8 | /*.d.ts 9 | *cache 10 | *.bin 11 | *.html 12 | 13 | !/*.config.js 14 | !/*.conf.js 15 | !/benchmark.js 16 | -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": [ 3 | "eg2.tslint" 4 | ] 5 | } 6 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "editor.formatOnSave": true, 3 | "editor.tabSize": 4, 4 | "editor.rulers": [ 5 | 120 6 | ], 7 | "files.trimTrailingWhitespace": true, 8 | "files.insertFinalNewline": true, 9 | "files.exclude": { 10 | "**/.git": true, 11 | "**/.DS_Store": true, 12 | "node_modules": true, 13 | "test-lib": true, 14 | "coverage": true, 15 | "npm": true 16 | }, 17 | "eslint.enable": false, 18 | "typescript.format.enable": false, 19 | "typescript.reportStyleChecksAsWarnings": true, 20 | "tslint.enable": true, 21 | "tslint.autoFixOnSave": true, 22 | "tslint.alwaysShowStatus": true, 23 | "typescript.tsdk": "node_modules/typescript/lib" 24 | } 25 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2019 Jose Quintana 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | this software and associated documentation files (the "Software"), to deal in 7 | the Software without restriction, including without limitation the rights to 8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software is furnished to do so, 10 | 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, FITNESS 17 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 18 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 19 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | stress1: 2 | -echo "GET http://127.0.0.1:7300" \ 3 | | vegeta -cpus=12 attack \ 4 | -workers=10 -duration=60s -connections=10000 -rate=200 -http2=false \ 5 | | tee results.bin | vegeta report 6 | -cat results.bin | vegeta plot > plot.html 7 | .PHONY: stress 8 | 9 | stress2: 10 | -autocannon -c 500 -d 5 -p 10 http://127.0.0.1:7300 11 | .PHONY: stress 12 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Fastify Cluster Example 2 | 3 | > A simple example of how to running a [Fastify](https://www.fastify.io/) server in [multi-threaded](https://nodejs.org/api/cluster.html#cluster_cluster) mode. 4 | 5 | ## Usage 6 | 7 | ```sh 8 | ~> yarn 9 | ~> yarn start 10 | yarn run v1.22.4 11 | $ ts-node src/index.ts 12 | Total Number of Cores: 4 13 | Master 14784 is running 14 | Worker 14785 is listening 15 | Worker 14786 is listening 16 | Worker 14787 is listening 17 | Worker 14788 is listening 18 | Worker 14787 started 19 | Worker 14785 started 20 | 🚀 Server ready at http://[::]:7300 on worker 2 21 | Worker 14788 started 22 | 🚀 Server ready at http://[::]:7300 on worker 0 23 | 🚀 Server ready at http://[::]:7300 on worker 3 24 | Worker 14786 started 25 | 🚀 Server ready at http://[::]:7300 on worker 1 26 | ``` 27 | 28 | ## Testing 29 | 30 | TODO 31 | 32 | ## Benchmarks 33 | 34 | TODO 35 | 36 | ## License 37 | MIT license 38 | 39 | © 2019 [Jose Quintana](https://git.io/joseluisq) 40 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "fastify-cluster-example", 3 | "version": "0.0.0", 4 | "main": "src/index.ts", 5 | "license": "MIT", 6 | "private": true, 7 | "scripts": { 8 | "start": "ts-node src/index.ts" 9 | }, 10 | "dependencies": { 11 | "fastify": "^3.7.0" 12 | }, 13 | "devDependencies": { 14 | "@types/node": "^14.14.6", 15 | "ts-node": "^9.0.0", 16 | "tslint": "^6.1.3", 17 | "tslint-config-standard-plus": "^2.3.0", 18 | "typescript": "^4.0.5" 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/application.cluster.ts: -------------------------------------------------------------------------------- 1 | import * as cluster from "cluster" 2 | import * as os from "os" 3 | import { ApplicationFactory } from "./application.factory" 4 | 5 | const CPUS = os.cpus().length 6 | 7 | /** Cluster support to run an application server in multi-threaded mode */ 8 | export class ClusterApplication { 9 | constructor (private readonly applicationFactory: ApplicationFactory) { } 10 | 11 | /** Run an application in multi-threaded mode */ 12 | run () { 13 | if (cluster.isPrimary) { 14 | this.master() 15 | } else { 16 | this.worker() 17 | } 18 | } 19 | 20 | private master () { 21 | console.log("Total Number of Cores: %o", CPUS) 22 | console.log("Master %o is running", process.pid) 23 | 24 | // Fork workers 25 | for (let i = 0; i < CPUS; i++) { 26 | const fork = cluster.fork() 27 | // fork.on('message', (index: number) => { 28 | // console.log('Thread index: %s', index) 29 | // }) 30 | fork.send(i) 31 | } 32 | 33 | // process is clustered on a core and process id is assigned 34 | cluster.on("online", (worker) => { 35 | console.log("Worker %o is listening", worker.process.pid) 36 | }) 37 | 38 | cluster.on("exit", (worker) => { 39 | console.log("Worker %o died", worker.process.pid) 40 | }) 41 | } 42 | 43 | private worker () { 44 | const cb = (index: number) => { 45 | // Unregister immediately current listener for message 46 | process.off("message", cb) 47 | 48 | // Run application 49 | console.log("Worker %o started", process.pid) 50 | this.applicationFactory(index) 51 | } 52 | 53 | process.on("message", cb) 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /src/application.factory.ts: -------------------------------------------------------------------------------- 1 | import { Application } from "./application" 2 | import { setupRoutes } from "./application.routes" 3 | 4 | /** Define a factory function that will create an instance of `Application` */ 5 | export type ApplicationFactory = (worker: number) => Promise 6 | 7 | /** Create an new instance of `Appication` */ 8 | export async function applicationFactory (worker: number) { 9 | // Application instance 10 | const app = new Application({ port: 7300 }) 11 | 12 | // Router definitions 13 | setupRoutes(app.$server) 14 | 15 | const url = await app.listen() 16 | 17 | console.log("🚀 Server ready at %s on worker %o", url, worker) 18 | } 19 | -------------------------------------------------------------------------------- /src/application.routes.ts: -------------------------------------------------------------------------------- 1 | import * as fastify from "fastify" 2 | import { IncomingMessage, Server, ServerResponse } from "http" 3 | 4 | /** Route definitions */ 5 | export function setupRoutes (server: fastify.FastifyInstance ) { 6 | // Default home page route 7 | server.get("/", (request, reply) => { 8 | const { hostname, ip } = request 9 | reply.send({ hostname, ip }) 10 | }) 11 | } 12 | -------------------------------------------------------------------------------- /src/application.ts: -------------------------------------------------------------------------------- 1 | import { fastify, FastifyInstance, FastifyServerOptions } from "fastify" 2 | import { IncomingMessage, Server, ServerResponse } from "http" 3 | 4 | /** Application options which contains `Fastify` server and listen options */ 5 | export interface ApplicationOptions { 6 | port: number 7 | host?: string 8 | backlog?: number 9 | } 10 | 11 | /** Simple Application class wrapper around `Fastify` */ 12 | export class Application { 13 | /** Public Fastify instance */ 14 | readonly $server: FastifyInstance = fastify({}) 15 | 16 | constructor ( 17 | private readonly options: ApplicationOptions = { port: 7300 }, 18 | private readonly fastifyOptions: FastifyServerOptions = {} 19 | ) { 20 | this.$server = fastify(this.fastifyOptions) 21 | } 22 | 23 | /** Start the server */ 24 | async listen () { 25 | return this.$server.listen(this.options) 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import { ClusterApplication } from "./application.cluster" 2 | import { applicationFactory } from "./application.factory" 3 | 4 | const clusterApp = new ClusterApplication(applicationFactory) 5 | 6 | clusterApp.run() 7 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compileOnSave": false, 3 | "include": [ 4 | "src" 5 | ], 6 | "exclude": [ 7 | "node_modules", 8 | "dist" 9 | ], 10 | "compilerOptions": { 11 | "outDir": "./dist", 12 | "strict": true, 13 | "noUnusedLocals": true, 14 | "noUnusedParameters": true, 15 | "pretty": true, 16 | "sourceMap": true, 17 | "declaration": false, 18 | "moduleResolution": "node", 19 | "emitDecoratorMetadata": true, 20 | "experimentalDecorators": true, 21 | "allowSyntheticDefaultImports": true, 22 | "module": "commonjs", 23 | "target": "es6", 24 | "baseUrl": "./", 25 | "typeRoots": [ 26 | "node_modules/@types", 27 | "src/typings" 28 | ], 29 | "paths": { 30 | "~/*": [ 31 | "src/*" 32 | ] 33 | }, 34 | "lib": [ 35 | "es2015", 36 | "esnext.asynciterable" 37 | ] 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "tslint-config-standard-plus/tslint.legacy" 3 | } 4 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@babel/code-frame@^7.0.0": 6 | version "7.10.4" 7 | resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" 8 | integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== 9 | dependencies: 10 | "@babel/highlight" "^7.10.4" 11 | 12 | "@babel/helper-validator-identifier@^7.10.4": 13 | version "7.10.4" 14 | resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2" 15 | integrity sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw== 16 | 17 | "@babel/highlight@^7.10.4": 18 | version "7.10.4" 19 | resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.4.tgz#7d1bdfd65753538fabe6c38596cdb76d9ac60143" 20 | integrity sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA== 21 | dependencies: 22 | "@babel/helper-validator-identifier" "^7.10.4" 23 | chalk "^2.0.0" 24 | js-tokens "^4.0.0" 25 | 26 | "@types/node@^14.14.6": 27 | version "14.14.6" 28 | resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.6.tgz#146d3da57b3c636cc0d1769396ce1cfa8991147f" 29 | integrity sha512-6QlRuqsQ/Ox/aJEQWBEJG7A9+u7oSYl3mem/K8IzxXG/kAGbV1YPD9Bg9Zw3vyxC/YP+zONKwy8hGkSt1jxFMw== 30 | 31 | abstract-logging@^2.0.0: 32 | version "2.0.1" 33 | resolved "https://registry.yarnpkg.com/abstract-logging/-/abstract-logging-2.0.1.tgz#6b0c371df212db7129b57d2e7fcf282b8bf1c839" 34 | integrity sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA== 35 | 36 | ajv@^6.11.0, ajv@^6.12.2: 37 | version "6.12.6" 38 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" 39 | integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== 40 | dependencies: 41 | fast-deep-equal "^3.1.1" 42 | fast-json-stable-stringify "^2.0.0" 43 | json-schema-traverse "^0.4.1" 44 | uri-js "^4.2.2" 45 | 46 | ansi-styles@^3.2.1: 47 | version "3.2.1" 48 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 49 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 50 | dependencies: 51 | color-convert "^1.9.0" 52 | 53 | archy@^1.0.0: 54 | version "1.0.0" 55 | resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" 56 | integrity sha1-+cjBN1fMHde8N5rHeyxipcKGjEA= 57 | 58 | arg@^4.1.0: 59 | version "4.1.3" 60 | resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" 61 | integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== 62 | 63 | argparse@^1.0.7: 64 | version "1.0.10" 65 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" 66 | integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== 67 | dependencies: 68 | sprintf-js "~1.0.2" 69 | 70 | atomic-sleep@^1.0.0: 71 | version "1.0.0" 72 | resolved "https://registry.yarnpkg.com/atomic-sleep/-/atomic-sleep-1.0.0.tgz#eb85b77a601fc932cfe432c5acd364a9e2c9075b" 73 | integrity sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ== 74 | 75 | avvio@^7.1.2: 76 | version "7.2.0" 77 | resolved "https://registry.yarnpkg.com/avvio/-/avvio-7.2.0.tgz#b4bf4eaf4a0207a4e6a58a7859207250793cc81b" 78 | integrity sha512-KtC63UyZARidAoIV8wXutAZnDIbZcXBqLjTAhZOX+mdMZBQCh5il/15MvCvma1178nhTwvN2D0TOAdiKG1MpUA== 79 | dependencies: 80 | archy "^1.0.0" 81 | debug "^4.0.0" 82 | fastq "^1.6.1" 83 | queue-microtask "^1.1.2" 84 | 85 | balanced-match@^1.0.0: 86 | version "1.0.0" 87 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 88 | integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= 89 | 90 | brace-expansion@^1.1.7: 91 | version "1.1.11" 92 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 93 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 94 | dependencies: 95 | balanced-match "^1.0.0" 96 | concat-map "0.0.1" 97 | 98 | buffer-from@^1.0.0: 99 | version "1.1.1" 100 | resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" 101 | integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== 102 | 103 | builtin-modules@^1.1.1: 104 | version "1.1.1" 105 | resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" 106 | integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= 107 | 108 | chalk@^2.0.0, chalk@^2.3.0: 109 | version "2.4.2" 110 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" 111 | integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== 112 | dependencies: 113 | ansi-styles "^3.2.1" 114 | escape-string-regexp "^1.0.5" 115 | supports-color "^5.3.0" 116 | 117 | color-convert@^1.9.0: 118 | version "1.9.3" 119 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 120 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 121 | dependencies: 122 | color-name "1.1.3" 123 | 124 | color-name@1.1.3: 125 | version "1.1.3" 126 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 127 | integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= 128 | 129 | commander@^2.12.1: 130 | version "2.20.3" 131 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" 132 | integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== 133 | 134 | concat-map@0.0.1: 135 | version "0.0.1" 136 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 137 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 138 | 139 | cookie@^0.4.0: 140 | version "0.4.1" 141 | resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1" 142 | integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA== 143 | 144 | debug@^4.0.0: 145 | version "4.2.0" 146 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.2.0.tgz#7f150f93920e94c58f5574c2fd01a3110effe7f1" 147 | integrity sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg== 148 | dependencies: 149 | ms "2.1.2" 150 | 151 | deepmerge@^4.2.2: 152 | version "4.2.2" 153 | resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" 154 | integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== 155 | 156 | diff@^4.0.1: 157 | version "4.0.1" 158 | resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.1.tgz#0c667cb467ebbb5cea7f14f135cc2dba7780a8ff" 159 | integrity sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q== 160 | 161 | doctrine@0.7.2: 162 | version "0.7.2" 163 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-0.7.2.tgz#7cb860359ba3be90e040b26b729ce4bfa654c523" 164 | integrity sha1-fLhgNZujvpDgQLJrcpzkv6ZUxSM= 165 | dependencies: 166 | esutils "^1.1.6" 167 | isarray "0.0.1" 168 | 169 | escape-string-regexp@^1.0.5: 170 | version "1.0.5" 171 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 172 | integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= 173 | 174 | esprima@^4.0.0: 175 | version "4.0.1" 176 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" 177 | integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== 178 | 179 | esutils@^1.1.6: 180 | version "1.1.6" 181 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-1.1.6.tgz#c01ccaa9ae4b897c6d0c3e210ae52f3c7a844375" 182 | integrity sha1-wBzKqa5LiXxtDD4hCuUvPHqEQ3U= 183 | 184 | fast-decode-uri-component@^1.0.1: 185 | version "1.0.1" 186 | resolved "https://registry.yarnpkg.com/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz#46f8b6c22b30ff7a81357d4f59abfae938202543" 187 | integrity sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg== 188 | 189 | fast-deep-equal@^3.1.1: 190 | version "3.1.3" 191 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" 192 | integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== 193 | 194 | fast-json-stable-stringify@^2.0.0: 195 | version "2.1.0" 196 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" 197 | integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== 198 | 199 | fast-json-stringify@^2.2.1: 200 | version "2.2.9" 201 | resolved "https://registry.yarnpkg.com/fast-json-stringify/-/fast-json-stringify-2.2.9.tgz#6298eb0a78e540d74b7507afd55d1a456d584d96" 202 | integrity sha512-O8YmNoc7LnfSafVaTfa1yXVFT4UMsi/N7cYcNZw6w5D5tltyu6XGXvH45mvWfsrcFoSK+H0q0exGXsUqC18z/g== 203 | dependencies: 204 | ajv "^6.11.0" 205 | deepmerge "^4.2.2" 206 | string-similarity "^4.0.1" 207 | 208 | fast-redact@^3.0.0: 209 | version "3.0.0" 210 | resolved "https://registry.yarnpkg.com/fast-redact/-/fast-redact-3.0.0.tgz#ac2f9e36c9f4976f5db9fb18c6ffbaf308cf316d" 211 | integrity sha512-a/S/Hp6aoIjx7EmugtzLqXmcNsyFszqbt6qQ99BdG61QjBZF6shNis0BYR6TsZOQ1twYc0FN2Xdhwwbv6+KD0w== 212 | 213 | fast-safe-stringify@^2.0.7: 214 | version "2.0.7" 215 | resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz#124aa885899261f68aedb42a7c080de9da608743" 216 | integrity sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA== 217 | 218 | fastify-error@^0.2.0: 219 | version "0.2.0" 220 | resolved "https://registry.yarnpkg.com/fastify-error/-/fastify-error-0.2.0.tgz#9a1c28d4f42b6259e7a549671c8e5e2d85660634" 221 | integrity sha512-zabxsBatj59ROG0fhP36zNdc5Q1/eYeH9oSF9uvfrurZf8/JKfrJbMcIGrLpLWcf89rS6L91RHWm20A/X85hcA== 222 | 223 | fastify-warning@^0.2.0: 224 | version "0.2.0" 225 | resolved "https://registry.yarnpkg.com/fastify-warning/-/fastify-warning-0.2.0.tgz#e717776026a4493dc9a2befa44db6d17f618008f" 226 | integrity sha512-s1EQguBw/9qtc1p/WTY4eq9WMRIACkj+HTcOIK1in4MV5aFaQC9ZCIt0dJ7pr5bIf4lPpHvAtP2ywpTNgs7hqw== 227 | 228 | fastify@^3.7.0: 229 | version "3.7.0" 230 | resolved "https://registry.yarnpkg.com/fastify/-/fastify-3.7.0.tgz#b177cbb50efe4d38a3758427432f46eb873843b1" 231 | integrity sha512-xmiR1TOSNXXNHfEvBwhWlyj158q59vZkPLIKQ71f7qJG5QMPqCbeYUUFRaDKTaLFhRqmLLFprBpJsO5nbSMiPQ== 232 | dependencies: 233 | abstract-logging "^2.0.0" 234 | ajv "^6.12.2" 235 | avvio "^7.1.2" 236 | fast-json-stringify "^2.2.1" 237 | fastify-error "^0.2.0" 238 | fastify-warning "^0.2.0" 239 | find-my-way "^3.0.0" 240 | flatstr "^1.0.12" 241 | light-my-request "^4.2.0" 242 | pino "^6.2.1" 243 | proxy-addr "^2.0.5" 244 | readable-stream "^3.4.0" 245 | rfdc "^1.1.4" 246 | secure-json-parse "^2.0.0" 247 | semver "^7.3.2" 248 | tiny-lru "^7.0.0" 249 | 250 | fastq@^1.6.1: 251 | version "1.9.0" 252 | resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.9.0.tgz#e16a72f338eaca48e91b5c23593bcc2ef66b7947" 253 | integrity sha512-i7FVWL8HhVY+CTkwFxkN2mk3h+787ixS5S63eb78diVRc1MCssarHq3W5cj0av7YDSwmaV928RNag+U1etRQ7w== 254 | dependencies: 255 | reusify "^1.0.4" 256 | 257 | find-my-way@^3.0.0: 258 | version "3.0.4" 259 | resolved "https://registry.yarnpkg.com/find-my-way/-/find-my-way-3.0.4.tgz#a485973d1a3fdafd989ac9f12fd2d88e83cda268" 260 | integrity sha512-Trl/mNAVvTgCpo9ox6yixkwiZUvecKYUQZoAuMCBACsgGqv+FbWe+jE5sBA5+U8LIWrJk/cw8zPV53GPrjTnsw== 261 | dependencies: 262 | fast-decode-uri-component "^1.0.1" 263 | safe-regex2 "^2.0.0" 264 | semver-store "^0.3.0" 265 | 266 | flatstr@^1.0.12: 267 | version "1.0.12" 268 | resolved "https://registry.yarnpkg.com/flatstr/-/flatstr-1.0.12.tgz#c2ba6a08173edbb6c9640e3055b95e287ceb5931" 269 | integrity sha512-4zPxDyhCyiN2wIAtSLI6gc82/EjqZc1onI4Mz/l0pWrAlsSfYH/2ZIcU+e3oA2wDwbzIWNKwa23F8rh6+DRWkw== 270 | 271 | forwarded@~0.1.2: 272 | version "0.1.2" 273 | resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" 274 | integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= 275 | 276 | fs.realpath@^1.0.0: 277 | version "1.0.0" 278 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 279 | integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 280 | 281 | function-bind@^1.1.1: 282 | version "1.1.1" 283 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 284 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 285 | 286 | glob@^7.1.1: 287 | version "7.1.6" 288 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" 289 | integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== 290 | dependencies: 291 | fs.realpath "^1.0.0" 292 | inflight "^1.0.4" 293 | inherits "2" 294 | minimatch "^3.0.4" 295 | once "^1.3.0" 296 | path-is-absolute "^1.0.0" 297 | 298 | has-flag@^3.0.0: 299 | version "3.0.0" 300 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 301 | integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= 302 | 303 | has@^1.0.3: 304 | version "1.0.3" 305 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 306 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== 307 | dependencies: 308 | function-bind "^1.1.1" 309 | 310 | inflight@^1.0.4: 311 | version "1.0.6" 312 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 313 | integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= 314 | dependencies: 315 | once "^1.3.0" 316 | wrappy "1" 317 | 318 | inherits@2, inherits@^2.0.3: 319 | version "2.0.4" 320 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 321 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 322 | 323 | ipaddr.js@1.9.1: 324 | version "1.9.1" 325 | resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" 326 | integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== 327 | 328 | is-core-module@^2.0.0: 329 | version "2.0.0" 330 | resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.0.0.tgz#58531b70aed1db7c0e8d4eb1a0a2d1ddd64bd12d" 331 | integrity sha512-jq1AH6C8MuteOoBPwkxHafmByhL9j5q4OaPGdbuD+ZtQJVzH+i6E3BJDQcBA09k57i2Hh2yQbEG8yObZ0jdlWw== 332 | dependencies: 333 | has "^1.0.3" 334 | 335 | isarray@0.0.1: 336 | version "0.0.1" 337 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" 338 | integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= 339 | 340 | js-tokens@^4.0.0: 341 | version "4.0.0" 342 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" 343 | integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== 344 | 345 | js-yaml@^3.13.1: 346 | version "3.14.0" 347 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.0.tgz#a7a34170f26a21bb162424d8adacb4113a69e482" 348 | integrity sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A== 349 | dependencies: 350 | argparse "^1.0.7" 351 | esprima "^4.0.0" 352 | 353 | json-schema-traverse@^0.4.1: 354 | version "0.4.1" 355 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" 356 | integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== 357 | 358 | light-my-request@^4.2.0: 359 | version "4.2.1" 360 | resolved "https://registry.yarnpkg.com/light-my-request/-/light-my-request-4.2.1.tgz#c5a613af6a0cbb91eff06f83844ceac85ed03b10" 361 | integrity sha512-33FZvX/418IEy0sXldsLiJifbS/ruttcVveTbbZ8sQVR2VSFPA39hBu/iF/hVkt/1V0N7CdTQg4jiiVPdGgW8A== 362 | dependencies: 363 | ajv "^6.12.2" 364 | cookie "^0.4.0" 365 | fastify-warning "^0.2.0" 366 | readable-stream "^3.6.0" 367 | set-cookie-parser "^2.4.1" 368 | 369 | make-error@^1.1.1: 370 | version "1.3.6" 371 | resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" 372 | integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== 373 | 374 | memoize-decorator@^1.0.2: 375 | version "1.0.2" 376 | resolved "https://registry.yarnpkg.com/memoize-decorator/-/memoize-decorator-1.0.2.tgz#605a41715c4171db192a90098b00ab8d6e1102f5" 377 | integrity sha1-YFpBcVxBcdsZKpAJiwCrjW4RAvU= 378 | 379 | minimatch@^3.0.4: 380 | version "3.0.4" 381 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 382 | integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== 383 | dependencies: 384 | brace-expansion "^1.1.7" 385 | 386 | minimist@^1.2.5: 387 | version "1.2.5" 388 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" 389 | integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== 390 | 391 | mkdirp@^0.5.3: 392 | version "0.5.5" 393 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" 394 | integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== 395 | dependencies: 396 | minimist "^1.2.5" 397 | 398 | ms@2.1.2: 399 | version "2.1.2" 400 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 401 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 402 | 403 | once@^1.3.0: 404 | version "1.4.0" 405 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 406 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 407 | dependencies: 408 | wrappy "1" 409 | 410 | path-is-absolute@^1.0.0: 411 | version "1.0.1" 412 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 413 | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 414 | 415 | path-parse@^1.0.6: 416 | version "1.0.6" 417 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" 418 | integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== 419 | 420 | pino-std-serializers@^2.4.2: 421 | version "2.5.0" 422 | resolved "https://registry.yarnpkg.com/pino-std-serializers/-/pino-std-serializers-2.5.0.tgz#40ead781c65a0ce7ecd9c1c33f409d31fe712315" 423 | integrity sha512-wXqbqSrIhE58TdrxxlfLwU9eDhrzppQDvGhBEr1gYbzzM4KKo3Y63gSjiDXRKLVS2UOXdPNR2v+KnQgNrs+xUg== 424 | 425 | pino@^6.2.1: 426 | version "6.7.0" 427 | resolved "https://registry.yarnpkg.com/pino/-/pino-6.7.0.tgz#d5d96b7004fed78816b5694fda3eab02b5ca6d23" 428 | integrity sha512-vPXJ4P9rWCwzlTJt+f0Ni4THc3DWyt8iDDCO4edQ8narTu6hnpzdXu8FqeSJCGndl1W6lfbYQUQihUO54y66Lw== 429 | dependencies: 430 | fast-redact "^3.0.0" 431 | fast-safe-stringify "^2.0.7" 432 | flatstr "^1.0.12" 433 | pino-std-serializers "^2.4.2" 434 | quick-format-unescaped "^4.0.1" 435 | sonic-boom "^1.0.2" 436 | 437 | proxy-addr@^2.0.5: 438 | version "2.0.6" 439 | resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf" 440 | integrity sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw== 441 | dependencies: 442 | forwarded "~0.1.2" 443 | ipaddr.js "1.9.1" 444 | 445 | punycode@^2.1.0: 446 | version "2.1.1" 447 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" 448 | integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== 449 | 450 | queue-microtask@^1.1.2: 451 | version "1.2.0" 452 | resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.0.tgz#f27d002cbfac741072afa0e9af3a119b0e8724a3" 453 | integrity sha512-J95OVUiS4b8qqmpqhCodN8yPpHG2mpZUPQ8tDGyIY0VhM+kBHszOuvsMJVGNQ1OH2BnTFbqz45i+2jGpDw9H0w== 454 | 455 | quick-format-unescaped@^4.0.1: 456 | version "4.0.1" 457 | resolved "https://registry.yarnpkg.com/quick-format-unescaped/-/quick-format-unescaped-4.0.1.tgz#437a5ea1a0b61deb7605f8ab6a8fd3858dbeb701" 458 | integrity sha512-RyYpQ6Q5/drsJyOhrWHYMWTedvjTIat+FTwv0K4yoUxzvekw2aRHMQJLlnvt8UantkZg2++bEzD9EdxXqkWf4A== 459 | 460 | readable-stream@^3.4.0, readable-stream@^3.6.0: 461 | version "3.6.0" 462 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" 463 | integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== 464 | dependencies: 465 | inherits "^2.0.3" 466 | string_decoder "^1.1.1" 467 | util-deprecate "^1.0.1" 468 | 469 | resolve@^1.3.2: 470 | version "1.18.1" 471 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.18.1.tgz#018fcb2c5b207d2a6424aee361c5a266da8f4130" 472 | integrity sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA== 473 | dependencies: 474 | is-core-module "^2.0.0" 475 | path-parse "^1.0.6" 476 | 477 | ret@~0.2.0: 478 | version "0.2.2" 479 | resolved "https://registry.yarnpkg.com/ret/-/ret-0.2.2.tgz#b6861782a1f4762dce43402a71eb7a283f44573c" 480 | integrity sha512-M0b3YWQs7R3Z917WRQy1HHA7Ba7D8hvZg6UE5mLykJxQVE2ju0IXbGlaHPPlkY+WN7wFP+wUMXmBFA0aV6vYGQ== 481 | 482 | reusify@^1.0.4: 483 | version "1.0.4" 484 | resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" 485 | integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== 486 | 487 | rfdc@^1.1.4: 488 | version "1.1.4" 489 | resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.1.4.tgz#ba72cc1367a0ccd9cf81a870b3b58bd3ad07f8c2" 490 | integrity sha512-5C9HXdzK8EAqN7JDif30jqsBzavB7wLpaubisuQIGHWf2gUXSpzy6ArX/+Da8RjFpagWsCn+pIgxTMAmKw9Zug== 491 | 492 | safe-buffer@~5.2.0: 493 | version "5.2.1" 494 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 495 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 496 | 497 | safe-regex2@^2.0.0: 498 | version "2.0.0" 499 | resolved "https://registry.yarnpkg.com/safe-regex2/-/safe-regex2-2.0.0.tgz#b287524c397c7a2994470367e0185e1916b1f5b9" 500 | integrity sha512-PaUSFsUaNNuKwkBijoAPHAK6/eM6VirvyPWlZ7BAQy4D+hCvh4B6lIG+nPdhbFfIbP+gTGBcrdsOaUs0F+ZBOQ== 501 | dependencies: 502 | ret "~0.2.0" 503 | 504 | secure-json-parse@^2.0.0: 505 | version "2.1.0" 506 | resolved "https://registry.yarnpkg.com/secure-json-parse/-/secure-json-parse-2.1.0.tgz#ae76f5624256b5c497af887090a5d9e156c9fb20" 507 | integrity sha512-GckO+MS/wT4UogDyoI/H/S1L0MCcKS1XX/vp48wfmU7Nw4woBmb8mIpu4zPBQjKlRT88/bt9xdoV4111jPpNJA== 508 | 509 | semver-store@^0.3.0: 510 | version "0.3.0" 511 | resolved "https://registry.yarnpkg.com/semver-store/-/semver-store-0.3.0.tgz#ce602ff07df37080ec9f4fb40b29576547befbe9" 512 | integrity sha512-TcZvGMMy9vodEFSse30lWinkj+JgOBvPn8wRItpQRSayhc+4ssDs335uklkfvQQJgL/WvmHLVj4Ycv2s7QCQMg== 513 | 514 | semver@^5.3.0: 515 | version "5.7.1" 516 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" 517 | integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== 518 | 519 | semver@^7.3.2: 520 | version "7.3.2" 521 | resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" 522 | integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== 523 | 524 | set-cookie-parser@^2.4.1: 525 | version "2.4.6" 526 | resolved "https://registry.yarnpkg.com/set-cookie-parser/-/set-cookie-parser-2.4.6.tgz#43bdea028b9e6f176474ee5298e758b4a44799c3" 527 | integrity sha512-mNCnTUF0OYPwYzSHbdRdCfNNHqrne+HS5tS5xNb6yJbdP9wInV0q5xPLE0EyfV/Q3tImo3y/OXpD8Jn0Jtnjrg== 528 | 529 | sonic-boom@^1.0.2: 530 | version "1.3.0" 531 | resolved "https://registry.yarnpkg.com/sonic-boom/-/sonic-boom-1.3.0.tgz#5c77c846ce6c395dddf2eb8e8e65f9cc576f2e76" 532 | integrity sha512-4nX6OYvOYr6R76xfQKi6cZpTO3YSWe/vd+QdIfoH0lBy0MnPkeAbb2rRWgmgADkXUeCKPwO1FZAKlAVWAadELw== 533 | dependencies: 534 | atomic-sleep "^1.0.0" 535 | flatstr "^1.0.12" 536 | 537 | source-map-support@^0.5.17: 538 | version "0.5.19" 539 | resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" 540 | integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== 541 | dependencies: 542 | buffer-from "^1.0.0" 543 | source-map "^0.6.0" 544 | 545 | source-map@^0.6.0: 546 | version "0.6.1" 547 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" 548 | integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== 549 | 550 | sprintf-js@~1.0.2: 551 | version "1.0.3" 552 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 553 | integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= 554 | 555 | string-similarity@^4.0.1: 556 | version "4.0.2" 557 | resolved "https://registry.yarnpkg.com/string-similarity/-/string-similarity-4.0.2.tgz#1dc29518d0e92e50509499ce2974368f77bbb1b1" 558 | integrity sha512-eCsPPyoQBgY4TMpVD6DVfO7pLrimUONriaO4Xjp3WPUW0YnNLqdHgRj23xotLlqrL90eJhBeq3zdAJf2mQgfBQ== 559 | 560 | string_decoder@^1.1.1: 561 | version "1.3.0" 562 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" 563 | integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== 564 | dependencies: 565 | safe-buffer "~5.2.0" 566 | 567 | supports-color@^5.3.0: 568 | version "5.5.0" 569 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 570 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 571 | dependencies: 572 | has-flag "^3.0.0" 573 | 574 | tiny-lru@^7.0.0: 575 | version "7.0.6" 576 | resolved "https://registry.yarnpkg.com/tiny-lru/-/tiny-lru-7.0.6.tgz#b0c3cdede1e5882aa2d1ae21cb2ceccf2a331f24" 577 | integrity sha512-zNYO0Kvgn5rXzWpL0y3RS09sMK67eGaQj9805jlK9G6pSadfriTczzLHFXa/xcW4mIRfmlB9HyQ/+SgL0V1uow== 578 | 579 | ts-node@^9.0.0: 580 | version "9.0.0" 581 | resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-9.0.0.tgz#e7699d2a110cc8c0d3b831715e417688683460b3" 582 | integrity sha512-/TqB4SnererCDR/vb4S/QvSZvzQMJN8daAslg7MeaiHvD8rDZsSfXmNeNumyZZzMned72Xoq/isQljYSt8Ynfg== 583 | dependencies: 584 | arg "^4.1.0" 585 | diff "^4.0.1" 586 | make-error "^1.1.1" 587 | source-map-support "^0.5.17" 588 | yn "3.1.1" 589 | 590 | tslib@1.9.0: 591 | version "1.9.0" 592 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.0.tgz#e37a86fda8cbbaf23a057f473c9f4dc64e5fc2e8" 593 | integrity sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ== 594 | 595 | tslib@^1.13.0, tslib@^1.7.1, tslib@^1.8.1: 596 | version "1.14.1" 597 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" 598 | integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== 599 | 600 | tslint-clean-code@^0.2.10: 601 | version "0.2.10" 602 | resolved "https://registry.yarnpkg.com/tslint-clean-code/-/tslint-clean-code-0.2.10.tgz#eaba79fb92d52bebf5ee1177054f056b2233fafa" 603 | integrity sha512-MjfU3TVDB+oidhI/uAN/p0ncaqFnPq4L6nYtPvNp/MaFxM52jYtgx1qxf+uTIaQ7KZWZB/P9CpbL7/8WWSzQJg== 604 | dependencies: 605 | memoize-decorator "^1.0.2" 606 | tsutils "2.7.1" 607 | 608 | tslint-config-standard-plus@^2.3.0: 609 | version "2.3.0" 610 | resolved "https://registry.yarnpkg.com/tslint-config-standard-plus/-/tslint-config-standard-plus-2.3.0.tgz#3fea0dca20f75cb74f6b7c0c33f3626a58c73846" 611 | integrity sha512-xRSNbGbz8dg5IWb/nTDRBor0NzfaG2/Qv5sKKt5DPzVCwcHryFoiAMknF6RyZCsZO2Ejlc+U0zcDRJP9/B2y2A== 612 | dependencies: 613 | tslint-clean-code "^0.2.10" 614 | tslint-eslint-rules "^5.4.0" 615 | tslint-no-circular-imports "^0.7.0" 616 | 617 | tslint-eslint-rules@^5.4.0: 618 | version "5.4.0" 619 | resolved "https://registry.yarnpkg.com/tslint-eslint-rules/-/tslint-eslint-rules-5.4.0.tgz#e488cc9181bf193fe5cd7bfca213a7695f1737b5" 620 | integrity sha512-WlSXE+J2vY/VPgIcqQuijMQiel+UtmXS+4nvK4ZzlDiqBfXse8FAvkNnTcYhnQyOTW5KFM+uRRGXxYhFpuBc6w== 621 | dependencies: 622 | doctrine "0.7.2" 623 | tslib "1.9.0" 624 | tsutils "^3.0.0" 625 | 626 | tslint-no-circular-imports@^0.7.0: 627 | version "0.7.0" 628 | resolved "https://registry.yarnpkg.com/tslint-no-circular-imports/-/tslint-no-circular-imports-0.7.0.tgz#9df0a15654d66b172e0b7843eed073fa5ae99b5f" 629 | integrity sha512-k3wxpeMC4ef40UbpfBVHEHIzKfNZq5/SCtAO1YjGsaNTklo+K53/TWLrym+poA65RJFDiYgYNWvkeIIkJNA0Vw== 630 | 631 | tslint@^6.1.3: 632 | version "6.1.3" 633 | resolved "https://registry.yarnpkg.com/tslint/-/tslint-6.1.3.tgz#5c23b2eccc32487d5523bd3a470e9aa31789d904" 634 | integrity sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg== 635 | dependencies: 636 | "@babel/code-frame" "^7.0.0" 637 | builtin-modules "^1.1.1" 638 | chalk "^2.3.0" 639 | commander "^2.12.1" 640 | diff "^4.0.1" 641 | glob "^7.1.1" 642 | js-yaml "^3.13.1" 643 | minimatch "^3.0.4" 644 | mkdirp "^0.5.3" 645 | resolve "^1.3.2" 646 | semver "^5.3.0" 647 | tslib "^1.13.0" 648 | tsutils "^2.29.0" 649 | 650 | tsutils@2.7.1: 651 | version "2.7.1" 652 | resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.7.1.tgz#411a0e9466525a2b2869260a55620d7292155e24" 653 | integrity sha1-QRoOlGZSWisoaSYKVWINcpIVXiQ= 654 | dependencies: 655 | tslib "^1.7.1" 656 | 657 | tsutils@^2.29.0: 658 | version "2.29.0" 659 | resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.29.0.tgz#32b488501467acbedd4b85498673a0812aca0b99" 660 | integrity sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA== 661 | dependencies: 662 | tslib "^1.8.1" 663 | 664 | tsutils@^3.0.0: 665 | version "3.17.1" 666 | resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.17.1.tgz#ed719917f11ca0dee586272b2ac49e015a2dd759" 667 | integrity sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g== 668 | dependencies: 669 | tslib "^1.8.1" 670 | 671 | typescript@^4.0.5: 672 | version "4.0.5" 673 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.0.5.tgz#ae9dddfd1069f1cb5beb3ef3b2170dd7c1332389" 674 | integrity sha512-ywmr/VrTVCmNTJ6iV2LwIrfG1P+lv6luD8sUJs+2eI9NLGigaN+nUQc13iHqisq7bra9lnmUSYqbJvegraBOPQ== 675 | 676 | uri-js@^4.2.2: 677 | version "4.4.0" 678 | resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.0.tgz#aa714261de793e8a82347a7bcc9ce74e86f28602" 679 | integrity sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g== 680 | dependencies: 681 | punycode "^2.1.0" 682 | 683 | util-deprecate@^1.0.1: 684 | version "1.0.2" 685 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 686 | integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= 687 | 688 | wrappy@1: 689 | version "1.0.2" 690 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 691 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 692 | 693 | yn@3.1.1: 694 | version "3.1.1" 695 | resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" 696 | integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== 697 | --------------------------------------------------------------------------------