From dbe82b3e7c257c203624d27887f462cdf90ef1b1 Mon Sep 17 00:00:00 2001 From: Andras Date: Wed, 24 Mar 2021 22:11:14 +0100 Subject: [PATCH] initial production release :tada: --- .dockerignore | 3 + .env.template | 35 + .gitignore | 10 + .prettierrc | 14 + LICENSE | 661 ++ README.md | 97 + api/app.js | 27 + api/development/mongodb.js | 36 + api/libs/applications/build/container.js | 34 + api/libs/applications/cleanup/index.js | 41 + api/libs/applications/configuration.js | 62 + api/libs/applications/deploy/copyFiles.js | 53 + api/libs/applications/deploy/deploy.js | 97 + .../applications/github/cloneRepository.js | 44 + api/libs/applications/index.js | 44 + api/libs/common.js | 94 + api/libs/docker.js | 31 + api/libs/logging.js | 55 + api/models/Deployment.js | 16 + api/models/Logs/Application.js | 10 + api/models/Logs/Server.js | 13 + api/models/Settings.js | 11 + api/models/User.js | 12 + api/packs/helpers.js | 28 + api/packs/index.js | 4 + api/packs/nodejs/index.js | 32 + api/packs/static/index.js | 28 + api/plugins/authentication.js | 21 + api/routes/v1/application/check.js | 35 + api/routes/v1/application/deploy/index.js | 117 + api/routes/v1/application/deploy/logs.js | 62 + api/routes/v1/application/logs.js | 10 + api/routes/v1/application/remove.js | 35 + api/routes/v1/config.js | 103 + api/routes/v1/dashboard/index.js | 55 + api/routes/v1/databases/index.js | 173 + api/routes/v1/login/github.js | 121 + api/routes/v1/settings/index.js | 44 + api/routes/v1/undead.js | 5 + api/routes/v1/upgrade/index.js | 12 + api/routes/v1/verify.js | 16 + api/routes/v1/webhooks/deploy.js | 142 + api/schema.js | 49 + api/server.js | 90 + index.html | 19 + install.sh | 43 + install/Dockerfile | 5 + install/Dockerfile-base | 18 + install/coolify-template.yml | 97 + install/install.js | 52 + install/update.js | 21 + package.json | 63 + pnpm-lock.yaml | 6782 +++++++++++++++++ postcss.config.js | 7 + public/bye.html | 3 + public/favicon.png | Bin 0 -> 144391 bytes routify.config.js | 5 + src/App.svelte | 63 + .../Configuration/ActiveTab/BuildStep.svelte | 22 + .../Configuration/ActiveTab/General.svelte | 106 + .../Configuration/ActiveTab/Secrets.svelte | 72 + .../Application/Configuration/Branches.svelte | 24 + .../Configuration/Configuration.svelte | 133 + .../Application/Configuration/Login.svelte | 50 + .../Configuration/Repositories.svelte | 45 + .../Application/Configuration/Tabs.svelte | 97 + .../Configuration/Configuration.svelte | 90 + src/components/Databases/SVGs/CouchDb.svelte | 16 + src/components/Databases/SVGs/MongoDb.svelte | 32 + src/components/Databases/SVGs/Mysql.svelte | 16 + .../Databases/SVGs/Postgresql.svelte | 60 + src/components/Loading.svelte | 52 + src/index.css | 18 + src/index.js | 8 + src/pages/_fallback.svelte | 11 + src/pages/_layout.svelte | 258 + .../[name]/[branch]/configuration.svelte | 62 + .../[name]/[branch]/index.svelte | 4 + .../[name]/[branch]/logs/[deployId].svelte | 57 + .../[name]/[branch]/logs/index.svelte | 140 + .../[name]/[branch]/overview.svelte | 31 + .../[organization]/[name]/index.svelte | 4 + .../application/[organization]/index.svelte | 4 + src/pages/application/_layout.svelte | 215 + src/pages/application/index.svelte | 4 + src/pages/application/new.svelte | 13 + src/pages/dashboard/_layout.svelte | 32 + src/pages/dashboard/applications.svelte | 120 + src/pages/dashboard/databases.svelte | 147 + src/pages/dashboard/index.svelte | 4 + src/pages/database/[name]/index.svelte | 4 + src/pages/database/[name]/overview.svelte | 91 + src/pages/database/_layout.svelte | 71 + src/pages/database/index.svelte | 5 + src/pages/database/new.svelte | 13 + src/pages/index.svelte | 65 + src/pages/settings/index.svelte | 110 + src/store.js | 220 + svelte.config.js | 4 + tailwind.config.js | 54 + vite.config.js | 35 + 101 files changed, 12479 insertions(+) create mode 100644 .dockerignore create mode 100644 .env.template create mode 100644 .gitignore create mode 100644 .prettierrc create mode 100644 LICENSE create mode 100644 README.md create mode 100644 api/app.js create mode 100644 api/development/mongodb.js create mode 100644 api/libs/applications/build/container.js create mode 100644 api/libs/applications/cleanup/index.js create mode 100644 api/libs/applications/configuration.js create mode 100644 api/libs/applications/deploy/copyFiles.js create mode 100644 api/libs/applications/deploy/deploy.js create mode 100644 api/libs/applications/github/cloneRepository.js create mode 100644 api/libs/applications/index.js create mode 100644 api/libs/common.js create mode 100644 api/libs/docker.js create mode 100644 api/libs/logging.js create mode 100644 api/models/Deployment.js create mode 100644 api/models/Logs/Application.js create mode 100644 api/models/Logs/Server.js create mode 100644 api/models/Settings.js create mode 100644 api/models/User.js create mode 100644 api/packs/helpers.js create mode 100644 api/packs/index.js create mode 100644 api/packs/nodejs/index.js create mode 100644 api/packs/static/index.js create mode 100644 api/plugins/authentication.js create mode 100644 api/routes/v1/application/check.js create mode 100644 api/routes/v1/application/deploy/index.js create mode 100644 api/routes/v1/application/deploy/logs.js create mode 100644 api/routes/v1/application/logs.js create mode 100644 api/routes/v1/application/remove.js create mode 100644 api/routes/v1/config.js create mode 100644 api/routes/v1/dashboard/index.js create mode 100644 api/routes/v1/databases/index.js create mode 100644 api/routes/v1/login/github.js create mode 100644 api/routes/v1/settings/index.js create mode 100644 api/routes/v1/undead.js create mode 100644 api/routes/v1/upgrade/index.js create mode 100644 api/routes/v1/verify.js create mode 100644 api/routes/v1/webhooks/deploy.js create mode 100644 api/schema.js create mode 100644 api/server.js create mode 100644 index.html create mode 100644 install.sh create mode 100644 install/Dockerfile create mode 100644 install/Dockerfile-base create mode 100644 install/coolify-template.yml create mode 100644 install/install.js create mode 100644 install/update.js create mode 100644 package.json create mode 100644 pnpm-lock.yaml create mode 100644 postcss.config.js create mode 100644 public/bye.html create mode 100644 public/favicon.png create mode 100644 routify.config.js create mode 100644 src/App.svelte create mode 100644 src/components/Application/Configuration/ActiveTab/BuildStep.svelte create mode 100644 src/components/Application/Configuration/ActiveTab/General.svelte create mode 100644 src/components/Application/Configuration/ActiveTab/Secrets.svelte create mode 100644 src/components/Application/Configuration/Branches.svelte create mode 100644 src/components/Application/Configuration/Configuration.svelte create mode 100644 src/components/Application/Configuration/Login.svelte create mode 100644 src/components/Application/Configuration/Repositories.svelte create mode 100644 src/components/Application/Configuration/Tabs.svelte create mode 100644 src/components/Databases/Configuration/Configuration.svelte create mode 100644 src/components/Databases/SVGs/CouchDb.svelte create mode 100644 src/components/Databases/SVGs/MongoDb.svelte create mode 100644 src/components/Databases/SVGs/Mysql.svelte create mode 100644 src/components/Databases/SVGs/Postgresql.svelte create mode 100644 src/components/Loading.svelte create mode 100644 src/index.css create mode 100644 src/index.js create mode 100644 src/pages/_fallback.svelte create mode 100644 src/pages/_layout.svelte create mode 100644 src/pages/application/[organization]/[name]/[branch]/configuration.svelte create mode 100644 src/pages/application/[organization]/[name]/[branch]/index.svelte create mode 100644 src/pages/application/[organization]/[name]/[branch]/logs/[deployId].svelte create mode 100644 src/pages/application/[organization]/[name]/[branch]/logs/index.svelte create mode 100644 src/pages/application/[organization]/[name]/[branch]/overview.svelte create mode 100644 src/pages/application/[organization]/[name]/index.svelte create mode 100644 src/pages/application/[organization]/index.svelte create mode 100644 src/pages/application/_layout.svelte create mode 100644 src/pages/application/index.svelte create mode 100644 src/pages/application/new.svelte create mode 100644 src/pages/dashboard/_layout.svelte create mode 100644 src/pages/dashboard/applications.svelte create mode 100644 src/pages/dashboard/databases.svelte create mode 100644 src/pages/dashboard/index.svelte create mode 100644 src/pages/database/[name]/index.svelte create mode 100644 src/pages/database/[name]/overview.svelte create mode 100644 src/pages/database/_layout.svelte create mode 100644 src/pages/database/index.svelte create mode 100644 src/pages/database/new.svelte create mode 100644 src/pages/index.svelte create mode 100644 src/pages/settings/index.svelte create mode 100644 src/store.js create mode 100644 svelte.config.js create mode 100644 tailwind.config.js create mode 100644 vite.config.js diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 000000000..d61686b7e --- /dev/null +++ b/.dockerignore @@ -0,0 +1,3 @@ +node_modules +dist +.routify \ No newline at end of file diff --git a/.env.template b/.env.template new file mode 100644 index 000000000..589fe1380 --- /dev/null +++ b/.env.template @@ -0,0 +1,35 @@ +#################################### +# Domain where your Coolify instance will be available and reachable. +# It's the same as you set in Github OAuth App and Github App as . +DOMAIN= +## Let's Encrypt contact email required +EMAIL= + +# JWT Token Sign Key for logging you in to Coolify's frontend +JWT_SIGN_KEY= +# Encryption key for SECRETS - do NOT share it with others! +SECRETS_ENCRYPTION_KEY= + +# Docker Engine +DOCKER_ENGINE=/var/run/docker.sock +# Docker network to use internally between the proxy and your apps +DOCKER_NETWORK=coollabs + +# Mongodb +# Values in case if you are using our Mongodb installation - CHANGE user and password fields! +MONGODB_HOST=coollabs-mongodb +MONGODB_PORT=27017 +MONGODB_USER=supercooldbuser +MONGODB_PASSWORD=developmentPassword4db +MONGODB_DB=coolLabs-prod + +# Frontend only variables +VITE_GITHUB_APP_CLIENTID= +VITE_GITHUB_APP_NAME= + +# Github OAuth & App secrets and private key - you can get it from Github. +GITHUB_APP_CLIENT_SECRET= +GITHUP_APP_WEBHOOK_SECRET= + +# It should look like this. Newlines breaks with \n +GITHUB_APP_PRIVATE_KEY="-----BEGIN RSA PRIVATE KEY-----\nMIIEowIBAAKCAQEA7Y+Uwkd8FINSwFktWGdtwCaOAazTDYR8ucEzGyR9r+ooJZhF\nOc32qgDSps6Q5DsqPOzvfhiviqU+et9VF+bJhfdzwJ+Le86QZH1RgsDMoY049XvI\nKSwP........" diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..55edba0c2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +.vscode +.idea +node_modules +dist +dist-ssr +.routify +.env +yarn-error.log +api/development/console.log +.pnpm-debug.log \ No newline at end of file diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 000000000..b7bd072a5 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,14 @@ +{ + "arrowParens": "avoid", + "bracketSpacing": true, + "printWidth": 80, + "semi": true, + "singleQuote": false, + "tabWidth": 2, + "trailingComma": "all", + "svelteSortOrder" : "styles-scripts-markup", + "svelteStrictMode": true, + "svelteBracketNewLine": true, + "svelteAllowShorthand": true, + "plugins": ["prettier-plugin-svelte"] + } \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 000000000..29ebfa545 --- /dev/null +++ b/LICENSE @@ -0,0 +1,661 @@ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU AGPL, see +. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 000000000..d32cd5b4b --- /dev/null +++ b/README.md @@ -0,0 +1,97 @@ +# About + +https://andrasbacsai.com/farewell-netlify-and-heroku-after-3-days-of-coding + +# Features +- Deploy your Node.js and static sites just by pushing code to git. +- Hassle-free installation and upgrade process. +- One-click MongoDB, MySQL, PostgreSQL, CouchDB deployments! + +# Upcoming features +- Backups & monitoring. +- User analytics with privacy in mind. +- And much more (see [Roadmap](https://github.com/coollabsio/coolify/projects/1)). + + +# FAQ +Q: What does Buildpack means? + +A: It defines your application's final form. Static means that it will be hosted as a static site in the end. (see next question below 👇) + +--- + +Q: How can I build a static site, like Next.js, Sapper (prerendered), etc ? + +A: Use `static` builder and set your `Build command`. + +# Screenshots + +[Login](https://coollabs.io/coolify/login.jpg) + +[Applications](https://coollabs.io/coolify/applications.jpg) + +[Databases](https://coollabs.io/coolify/databases.jpg) + +[Configuration](https://coollabs.io/coolify/configuration.jpg) + +[Settings](https://coollabs.io/coolify/settings.jpg) + +[Logs](https://coollabs.io/coolify/logs.jpg) + +# Getting Started + +Automatically: `sh <(curl -fsSL https://get.coollabs.io/install.sh) coolify` + +Manually: +### Requirements before installation +- [Docker](https://docs.docker.com/engine/install/) version 20+ +- Docker in [swarm mode enabled](https://docs.docker.com/engine/reference/commandline/swarm_init/) (should be set manually before installation) +- A [MongoDB](https://docs.mongodb.com/manual/installation/) instance. + - We have a [simple installation](https://github.com/coollabsio/infrastructure/tree/main/mongo) if you need one +- A configured DNS entry (see `.env.template`) +- [Github App](https://docs.github.com/en/developers/apps/creating-a-github-app) + + - GitHub App name: could be anything weird + - Homepage URL: https://yourdomain + + Identifying and authorizing users: + - Callback URL: https://yourdomain/api/v1/login/github/app + - Request user authorization (OAuth) during installation -> Check! + + Webhook: + - Active -> Check! + - Webhook URL: https://yourdomain/api/v1/webhooks/deploy + - Webhook Secret: it should be super secret + + Repository permissions: + - Contents: Read-only + - Metadata: Read-only + + User permissions: + - Email: Read-only + + Subscribe to events: + - Push -> Check! + +### Installation +- Clone this repository: `git clone git@github.com:coollabsio/coolify.git` +- Set `.env` (see `.env.template`) +- Installation: `bash install.sh all` + +## Updating process +### Update everything (proxy+coolify) +- `bash install.sh all` + +### Update coolify only +- `bash install.sh coolify` + +### Update proxy only +- `bash install.sh proxy` + +# Contact +- Twitter: [@andrasbacsai](https://twitter.com/andrasbacsai) +- Telegram: [@andrasbacsai](https://t.me/andrasbacsai) +- Email: [andras@coollabs.io](mailto:andras@coollabs.io) + +# License +This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Please see the [LICENSE](/LICENSE) file in our repository for the full text. diff --git a/api/app.js b/api/app.js new file mode 100644 index 000000000..9e094ae88 --- /dev/null +++ b/api/app.js @@ -0,0 +1,27 @@ +module.exports = async function (fastify, opts) { + // Private routes + fastify.register(async function (server) { + if (process.env.NODE_ENV === 'production') server.register(require('./plugins/authentication')) + server.register(require('./routes/v1/upgrade'), { prefix: '/upgrade' }) + server.register(require('./routes/v1/settings'), { prefix: '/settings' }) + server.register(require('./routes/v1/dashboard'), { prefix: '/dashboard' }) + server.register(require('./routes/v1/config'), { prefix: '/config' }) + server.register(require('./routes/v1/application/remove'), { prefix: '/application/remove' }) + server.register(require('./routes/v1/application/logs'), { prefix: '/application/logs' }) + server.register(require('./routes/v1/application/check'), { prefix: '/application/check' }) + server.register(require('./routes/v1/application/deploy'), { prefix: '/application/deploy' }) + server.register(require('./routes/v1/application/deploy/logs'), { prefix: '/application/deploy/logs' }) + server.register(require('./routes/v1/databases'), { prefix: '/databases' }) + }) + // Public routes + fastify.register(require('./routes/v1/verify'), { prefix: '/verify' }) + fastify.register(require('./routes/v1/login/github'), { + prefix: '/login/github' + }) + fastify.register(require('./routes/v1/webhooks/deploy'), { + prefix: '/webhooks/deploy' + }) + fastify.register(require('./routes/v1/undead'), { + prefix: '/undead' + }) +} diff --git a/api/development/mongodb.js b/api/development/mongodb.js new file mode 100644 index 000000000..9441e48fc --- /dev/null +++ b/api/development/mongodb.js @@ -0,0 +1,36 @@ +const mongoose = require('mongoose') +const { MongoMemoryServer } = require('mongodb-memory-server-core') + +const mongoServer = new MongoMemoryServer({ + instance: { + port: 27017, + dbName: 'coolify', + storageEngine: 'wiredTiger' + }, + binary: { + version: '4.4.3' + + } +}) + +mongoose.Promise = Promise +mongoServer.getUri().then((mongoUri) => { + const mongooseOpts = { + useNewUrlParser: true, + useUnifiedTopology: true + } + + mongoose.connect(mongoUri, mongooseOpts) + + mongoose.connection.on('error', (e) => { + if (e.message.code === 'ETIMEDOUT') { + console.log(e) + mongoose.connect(mongoUri, mongooseOpts) + } + console.log(e) + }) + + mongoose.connection.once('open', () => { + console.log(`Started in-memory mongodb ${mongoUri}`) + }) +}) diff --git a/api/libs/applications/build/container.js b/api/libs/applications/build/container.js new file mode 100644 index 000000000..54b50f0bb --- /dev/null +++ b/api/libs/applications/build/container.js @@ -0,0 +1,34 @@ +const packs = require('../../../packs') +const { saveAppLog } = require('../../logging') +const Deployment = require('../../../models/Deployment') + +module.exports = async function (configuration) { + const { id, organization, name, branch } = configuration.repository + const { domain } = configuration.publish + const deployId = configuration.general.deployId + + const execute = packs[configuration.build.pack] + if (execute) { + try { + await Deployment.findOneAndUpdate( + { repoId: id, branch, deployId, organization, name, domain }, + { repoId: id, branch, deployId, organization, name, domain, progress: 'inprogress' }) + await saveAppLog('### Building application.', configuration) + + await execute(configuration) + + await saveAppLog('### Building done.', configuration) + } catch (error) { + await Deployment.findOneAndUpdate( + { repoId: id, branch, deployId, organization, name, domain }, + { repoId: id, branch, deployId, organization, name, domain, progress: 'failed' }) + if (error.stack) throw { error: error.stack, type: 'server' } + throw { error, type: 'app' } + } + } else { + await Deployment.findOneAndUpdate( + { repoId: id, branch, deployId, organization, name, domain }, + { repoId: id, branch, deployId, organization, name, domain, progress: 'failed' }) + throw { error: 'No buildpack found.', type: 'app' } + } +} diff --git a/api/libs/applications/cleanup/index.js b/api/libs/applications/cleanup/index.js new file mode 100644 index 000000000..f40c2fbd0 --- /dev/null +++ b/api/libs/applications/cleanup/index.js @@ -0,0 +1,41 @@ +const { docker } = require('../../docker') +const { execShellAsync, delay } = require('../../common') +const Deployment = require('../../../models/Deployment') + +async function purgeOldThings () { + try { + await docker.engine.pruneImages() + await docker.engine.pruneContainers() + } catch (error) { + throw { error, type: 'server' } + } +} + +async function cleanup (configuration) { + const { id } = configuration.repository + const deployId = configuration.general.deployId + try { + // Cleanup stucked deployments. + const deployments = await Deployment.find({ repoId: id, deployId: { $ne: deployId }, progress: { $in: ['queued', 'inprogress'] } }) + for (const deployment of deployments) { + await Deployment.findByIdAndUpdate(deployment._id, { $set: { progress: 'failed' } }) + } + } catch (error) { + throw { error, type: 'server' } + } +} + +async function deleteSameDeployments (configuration) { + try { + await (await docker.engine.listServices()).filter(r => r.Spec.Labels.managedBy === 'coolify' && r.Spec.Labels.type === 'application').map(async s => { + const running = JSON.parse(s.Spec.Labels.configuration) + if (running.repository.id === configuration.repository.id && running.repository.branch === configuration.repository.branch) { + await execShellAsync(`docker stack rm ${s.Spec.Labels['com.docker.stack.namespace']}`) + } + }) + } catch (error) { + throw { error, type: 'server' } + } +} + +module.exports = { cleanup, deleteSameDeployments, purgeOldThings } diff --git a/api/libs/applications/configuration.js b/api/libs/applications/configuration.js new file mode 100644 index 000000000..127a2ca36 --- /dev/null +++ b/api/libs/applications/configuration.js @@ -0,0 +1,62 @@ +const { uniqueNamesGenerator, adjectives, colors, animals } = require('unique-names-generator') +const cuid = require('cuid') +const { execShellAsync } = require('../common') +const crypto = require('crypto') + +function getUniq () { + return uniqueNamesGenerator({ dictionaries: [adjectives, animals, colors], length: 2 }) +} + +function setDefaultConfiguration (configuration) { + try { + const nickname = getUniq() + const deployId = cuid() + + const shaBase = JSON.stringify({ repository: configuration.repository }) + const sha256 = crypto.createHash('sha256').update(shaBase).digest('hex') + + configuration.build.container.name = sha256.slice(0, 15) + + configuration.general.nickname = nickname + configuration.general.deployId = deployId + configuration.general.workdir = `/tmp/${deployId}` + + if (!configuration.publish.path) configuration.publish.path = '/' + if (!configuration.publish.port) configuration.publish.port = configuration.build.pack === 'static' ? 80 : 3000 + + if (configuration.build.pack === 'static') { + if (!configuration.build.command.installation) configuration.build.command.installation = 'yarn install' + if (!configuration.build.directory) configuration.build.directory = '/' + } + + if (configuration.build.pack === 'nodejs') { + if (!configuration.build.command.installation) configuration.build.command.installation = 'yarn install' + if (!configuration.build.directory) configuration.build.directory = '/' + } + + return configuration + } catch (error) { + throw { error, type: 'server' } + } +} + +async function updateServiceLabels (configuration, services) { + // In case of any failure during deployment, still update the current configuration. + const found = services.find(s => { + const config = JSON.parse(s.Spec.Labels.configuration) + if (config.repository.id === configuration.repository.id && config.repository.branch === configuration.repository.branch) { + return config + } + return null + }) + if (found) { + const { ID } = found + try { + const Labels = { ...JSON.parse(found.Spec.Labels.configuration), ...configuration } + execShellAsync(`docker service update --label-add configuration='${JSON.stringify(Labels)}' --label-add com.docker.stack.image='${configuration.build.container.name}:${configuration.build.container.tag}' ${ID}`) + } catch (error) { + console.log(error) + } + } +} +module.exports = { setDefaultConfiguration, updateServiceLabels } diff --git a/api/libs/applications/deploy/copyFiles.js b/api/libs/applications/deploy/copyFiles.js new file mode 100644 index 000000000..b6e71eb32 --- /dev/null +++ b/api/libs/applications/deploy/copyFiles.js @@ -0,0 +1,53 @@ +const fs = require('fs').promises +module.exports = async function (configuration) { + try { + // TODO: Do it better. + await fs.writeFile(`${configuration.general.workdir}/.dockerignore`, 'node_modules') + await fs.writeFile( + `${configuration.general.workdir}/nginx.conf`, + `user nginx; + worker_processes auto; + + error_log /var/log/nginx/error.log warn; + pid /var/run/nginx.pid; + + events { + worker_connections 1024; + } + + http { + include /etc/nginx/mime.types; + + access_log off; + sendfile on; + #tcp_nopush on; + keepalive_timeout 65; + + server { + listen 80; + server_name localhost; + + location / { + root /usr/share/nginx/html; + index index.html; + try_files $uri $uri/index.html $uri/ /index.html =404; + } + + error_page 404 /50x.html; + + # redirect server error pages to the static page /50x.html + # + error_page 500 502 503 504 /50x.html; + location = /50x.html { + root /usr/share/nginx/html; + } + + } + + } + ` + ) + } catch (error) { + throw { error, type: 'server' } + } +} diff --git a/api/libs/applications/deploy/deploy.js b/api/libs/applications/deploy/deploy.js new file mode 100644 index 000000000..15ebd193f --- /dev/null +++ b/api/libs/applications/deploy/deploy.js @@ -0,0 +1,97 @@ +const yaml = require('js-yaml') +const { execShellAsync } = require('../../common') +const { docker } = require('../../docker') +const { saveAppLog } = require('../../logging') +const { deleteSameDeployments } = require('../cleanup') +const fs = require('fs').promises + +module.exports = async function (configuration, configChanged, imageChanged) { + try { + const generateEnvs = {} + for (const secret of configuration.publish.secrets) { + generateEnvs[secret.name] = secret.value + } + const containerName = configuration.build.container.name + const stack = { + version: '3.8', + services: { + [containerName]: { + image: `${configuration.build.container.name}:${configuration.build.container.tag}`, + networks: [`${docker.network}`], + environment: generateEnvs, + deploy: { + replicas: 1, + restart_policy: { + condition: 'on-failure', + delay: '5s', + max_attempts: 1, + window: '120s' + }, + update_config: { + parallelism: 1, + delay: '10s', + order: 'start-first' + }, + rollback_config: { + parallelism: 1, + delay: '10s', + order: 'start-first' + }, + labels: [ + 'managedBy=coolify', + 'type=application', + 'configuration=' + JSON.stringify(configuration), + 'traefik.enable=true', + 'traefik.http.services.' + + configuration.build.container.name + + `.loadbalancer.server.port=${configuration.publish.port}`, + 'traefik.http.routers.' + + configuration.build.container.name + + '.entrypoints=websecure', + 'traefik.http.routers.' + + configuration.build.container.name + + '.rule=Host(`' + + configuration.publish.domain + + '`) && PathPrefix(`' + + configuration.publish.path + + '`)', + 'traefik.http.routers.' + + configuration.build.container.name + + '.tls.certresolver=letsencrypt', + 'traefik.http.routers.' + + configuration.build.container.name + + '.middlewares=global-compress' + ] + } + } + }, + networks: { + [`${docker.network}`]: { + external: true + } + } + } + await saveAppLog('### Publishing.', configuration) + await fs.writeFile(`${configuration.general.workdir}/stack.yml`, yaml.dump(stack)) + if (configChanged) { + // console.log('configuration changed') + await execShellAsync( + `cat ${configuration.general.workdir}/stack.yml | docker stack deploy --prune -c - ${containerName}` + ) + } else if (imageChanged) { + // console.log('image changed') + await execShellAsync(`docker service update --image ${configuration.build.container.name}:${configuration.build.container.tag} ${configuration.build.container.name}_${configuration.build.container.name}`) + } else { + // console.log('new deployment or force deployment') + await deleteSameDeployments(configuration) + await execShellAsync( + `cat ${configuration.general.workdir}/stack.yml | docker stack deploy --prune -c - ${containerName}` + ) + } + + await saveAppLog('### Published done!', configuration) + } catch (error) { + await saveAppLog(`Error occured during deployment: ${error.message}`, configuration) + throw { error, type: 'server' } + } +} diff --git a/api/libs/applications/github/cloneRepository.js b/api/libs/applications/github/cloneRepository.js new file mode 100644 index 000000000..f710b4d35 --- /dev/null +++ b/api/libs/applications/github/cloneRepository.js @@ -0,0 +1,44 @@ +const jwt = require('jsonwebtoken') +const axios = require('axios') +const { execShellAsync, cleanupTmp } = require('../../common') + +module.exports = async function (configuration) { + const { workdir } = configuration.general + const { organization, name, branch } = configuration.repository + const github = configuration.github + + const githubPrivateKey = process.env.GITHUB_APP_PRIVATE_KEY.replace(/\\n/g, '\n').replace(/"/g, '') + + const payload = { + iat: Math.round(new Date().getTime() / 1000), + exp: Math.round(new Date().getTime() / 1000 + 60), + iss: parseInt(github.app.id) + } + + try { + const jwtToken = jwt.sign(payload, githubPrivateKey, { + algorithm: 'RS256' + }) + const accessToken = await axios({ + method: 'POST', + url: `https://api.github.com/app/installations/${github.installation.id}/access_tokens`, + data: {}, + headers: { + Authorization: 'Bearer ' + jwtToken, + Accept: 'application/vnd.github.machine-man-preview+json' + } + }) + await execShellAsync( + `mkdir -p ${workdir} && git clone -q -b ${branch} https://x-access-token:${accessToken.data.token}@github.com/${organization}/${name}.git ${workdir}/` + ) + configuration.build.container.tag = ( + await execShellAsync(`cd ${configuration.general.workdir}/ && git rev-parse HEAD`) + ) + .replace('\n', '') + .slice(0, 7) + } catch (error) { + cleanupTmp(workdir) + if (error.stack) console.log(error.stack) + throw { error, type: 'server' } + } +} diff --git a/api/libs/applications/index.js b/api/libs/applications/index.js new file mode 100644 index 000000000..24f7e07f1 --- /dev/null +++ b/api/libs/applications/index.js @@ -0,0 +1,44 @@ +const dayjs = require('dayjs') + +const { saveServerLog } = require('../logging') +const { cleanupTmp } = require('../common') + +const { saveAppLog } = require('../logging') +const copyFiles = require('./deploy/copyFiles') +const buildContainer = require('./build/container') +const deploy = require('./deploy/deploy') +const Deployment = require('../../models/Deployment') +const { cleanup, purgeOldThings } = require('./cleanup') +const { updateServiceLabels } = require('./configuration') + +async function queueAndBuild (configuration, services, configChanged, imageChanged) { + const { id, organization, name, branch } = configuration.repository + const { domain } = configuration.publish + const { deployId, nickname, workdir } = configuration.general + try { + await new Deployment({ + repoId: id, branch, deployId, domain, organization, name, nickname + }).save() + await saveAppLog(`${dayjs().format('YYYY-MM-DD HH:mm:ss.SSS')} Queued.`, configuration) + await copyFiles(configuration) + await buildContainer(configuration) + await deploy(configuration, configChanged, imageChanged) + await Deployment.findOneAndUpdate( + { repoId: id, branch, deployId, organization, name, domain }, + { repoId: id, branch, deployId, organization, name, domain, progress: 'done' }) + await updateServiceLabels(configuration, services) + cleanupTmp(workdir) + await purgeOldThings() + } catch (error) { + await cleanup(configuration) + cleanupTmp(workdir) + const { type } = error.error + if (type === 'app') { + await saveAppLog(error.error, configuration, true) + } else { + await saveServerLog({ event: error.error, configuration }) + } + } +} + +module.exports = { queueAndBuild } diff --git a/api/libs/common.js b/api/libs/common.js new file mode 100644 index 000000000..b26416ef6 --- /dev/null +++ b/api/libs/common.js @@ -0,0 +1,94 @@ +const crypto = require('crypto') +const shell = require('shelljs') +const jsonwebtoken = require('jsonwebtoken') +const { docker } = require('./docker') +const User = require('../models/User') +const algorithm = 'aes-256-cbc' +const key = process.env.SECRETS_ENCRYPTION_KEY + +function delay (t) { + return new Promise(function (resolve) { + setTimeout(function () { + resolve('OK') + }, t) + }) +} + +async function verifyUserId (authorization) { + const token = authorization.split(' ')[1] + const verify = jsonwebtoken.verify(token, process.env.JWT_SIGN_KEY) + const found = await User.findOne({ uid: verify.jti }) + if (found) { + return true + } else { + return false + } +} +function execShellAsync (cmd, opts = {}) { + try { + return new Promise(function (resolve, reject) { + shell.config.silent = true + shell.exec(cmd, opts, function (code, stdout, stderr) { + if (code !== 0) return reject(new Error(stderr)) + return resolve(stdout) + }) + }) + } catch (error) { + return new Error('Oops') + } +} +function cleanupTmp (dir) { + if (dir !== '/') shell.rm('-fr', dir) +} + +async function checkImageAvailable (name) { + let cacheAvailable = false + try { + await docker.engine.getImage(name).get() + cacheAvailable = true + } catch (e) { + // Cache image not found + } + return cacheAvailable +} + +function encryptData (text) { + const iv = crypto.randomBytes(16) + const cipher = crypto.createCipheriv(algorithm, Buffer.from(key), iv) + let encrypted = cipher.update(text) + encrypted = Buffer.concat([encrypted, cipher.final()]) + return { iv: iv.toString('hex'), encryptedData: encrypted.toString('hex') } +} + +function decryptData (text) { + const iv = Buffer.from(text.iv, 'hex') + const encryptedText = Buffer.from(text.encryptedData, 'hex') + const decipher = crypto.createDecipheriv(algorithm, Buffer.from(key), iv) + let decrypted = decipher.update(encryptedText) + decrypted = Buffer.concat([decrypted, decipher.final()]) + return decrypted.toString() +} + +function createToken (payload) { + const { uuid } = payload + return jsonwebtoken.sign({}, process.env.JWT_SIGN_KEY, { + expiresIn: 15778800, + algorithm: 'HS256', + audience: 'coolify', + issuer: 'coolify', + jwtid: uuid, + subject: `User:${uuid}`, + notBefore: -1000 + }) +} + +module.exports = { + delay, + createToken, + execShellAsync, + cleanupTmp, + checkImageAvailable, + encryptData, + decryptData, + verifyUserId +} diff --git a/api/libs/docker.js b/api/libs/docker.js new file mode 100644 index 000000000..eb22e5325 --- /dev/null +++ b/api/libs/docker.js @@ -0,0 +1,31 @@ +const Dockerode = require('dockerode') +const { saveAppLog } = require('./logging') + +const docker = { + engine: new Dockerode({ + socketPath: process.env.DOCKER_ENGINE + }), + network: process.env.DOCKER_NETWORK +} +async function streamEvents (stream, configuration) { + try { + await new Promise((resolve, reject) => { + docker.engine.modem.followProgress(stream, onFinished, onProgress) + function onFinished (err, res) { + if (err) reject(err) + resolve(res) + } + function onProgress (event) { + if (event.error) { + reject(event.error) + return + } + saveAppLog(event.stream, configuration) + } + }) + } catch (error) { + throw { error, type: 'app' } + } +} + +module.exports = { streamEvents, docker } diff --git a/api/libs/logging.js b/api/libs/logging.js new file mode 100644 index 000000000..6af682b99 --- /dev/null +++ b/api/libs/logging.js @@ -0,0 +1,55 @@ +const ApplicationLog = require('../models/Logs/Application') +const ServerLog = require('../models/Logs/Server') +const dayjs = require('dayjs') + +function generateTimestamp () { + return `${dayjs().format('YYYY-MM-DD HH:mm:ss.SSS')} ` +} + +async function saveAppLog (event, configuration, isError) { + try { + const deployId = configuration.general.deployId + const repoId = configuration.repository.id + const branch = configuration.repository.branch + if (isError) { + // console.log(event, config, isError) + let clearedEvent = null + + if (event.error) clearedEvent = '[ERROR] ' + generateTimestamp() + event.error.replace(/(\r\n|\n|\r)/gm, '') + else if (event) clearedEvent = '[ERROR] ' + generateTimestamp() + event.replace(/(\r\n|\n|\r)/gm, '') + + try { + await new ApplicationLog({ repoId, branch, deployId, event: clearedEvent }).save() + } catch (error) { + console.log(error) + } + } else { + if (event && event !== '\n') { + const clearedEvent = '[INFO] ' + generateTimestamp() + event.replace(/(\r\n|\n|\r)/gm, '') + try { + await new ApplicationLog({ repoId, branch, deployId, event: clearedEvent }).save() + } catch (error) { + console.log(error) + } + } + } + } catch (error) { + console.log(error) + return error + } +} + +async function saveServerLog ({ event, configuration, type }) { + if (configuration) { + const deployId = configuration.general.deployId + const repoId = configuration.repository.id + const branch = configuration.repository.branch + await new ApplicationLog({ repoId, branch, deployId, event: `[SERVER ERROR 😖]: ${event}` }).save() + } + await new ServerLog({ event, type }).save() +} + +module.exports = { + saveAppLog, + saveServerLog +} diff --git a/api/models/Deployment.js b/api/models/Deployment.js new file mode 100644 index 000000000..496b5c020 --- /dev/null +++ b/api/models/Deployment.js @@ -0,0 +1,16 @@ +const mongoose = require('mongoose') +const deploymentSchema = mongoose.Schema( + { + deployId: { type: String, required: true }, + nickname: { type: String, required: true }, + repoId: { type: Number, required: true }, + organization: { type: String, required: true }, + name: { type: String, required: true }, + branch: { type: String, required: true }, + domain: { type: String, required: true }, + progress: { type: String, require: true, default: 'queued' } + }, + { timestamps: true } +) + +module.exports = mongoose.model('deployment', deploymentSchema) diff --git a/api/models/Logs/Application.js b/api/models/Logs/Application.js new file mode 100644 index 000000000..eb797ca36 --- /dev/null +++ b/api/models/Logs/Application.js @@ -0,0 +1,10 @@ +const mongoose = require('mongoose') +const logSchema = mongoose.Schema( + { + deployId: { type: String, required: true }, + event: { type: String, required: true } + }, + { timestamps: { createdAt: 'createdAt', updatedAt: false } } +) + +module.exports = mongoose.model('logs-application', logSchema) diff --git a/api/models/Logs/Server.js b/api/models/Logs/Server.js new file mode 100644 index 000000000..3a1b5607e --- /dev/null +++ b/api/models/Logs/Server.js @@ -0,0 +1,13 @@ +const mongoose = require('mongoose') +const { version } = require('../../../package.json') +const logSchema = mongoose.Schema( + { + version: { type: String, required: true, default: version }, + type: { type: String, required: true, enum: ['API', 'UPGRADE-P-1', 'UPGRADE-P-2'], default: 'API' }, + event: { type: String, required: true }, + seen: { type: Boolean, required: true, default: false } + }, + { timestamps: { createdAt: 'createdAt', updatedAt: false } } +) + +module.exports = mongoose.model('logs-server', logSchema) diff --git a/api/models/Settings.js b/api/models/Settings.js new file mode 100644 index 000000000..14042b912 --- /dev/null +++ b/api/models/Settings.js @@ -0,0 +1,11 @@ +const mongoose = require('mongoose') + +const settingsSchema = mongoose.Schema( + { + applicationName: { type: String, required: true, default: 'coolify' }, + allowRegistration: { type: Boolean, required: true, default: false } + }, + { timestamps: true } +) + +module.exports = mongoose.model('settings', settingsSchema) diff --git a/api/models/User.js b/api/models/User.js new file mode 100644 index 000000000..84fbf8b00 --- /dev/null +++ b/api/models/User.js @@ -0,0 +1,12 @@ +const mongoose = require('mongoose') + +const userSchema = mongoose.Schema( + { + email: { type: String, required: true }, + avatar: { type: String }, + uid: { type: String, required: true } + }, + { timestamps: true } +) + +module.exports = mongoose.model('user', userSchema) diff --git a/api/packs/helpers.js b/api/packs/helpers.js new file mode 100644 index 000000000..37ed07078 --- /dev/null +++ b/api/packs/helpers.js @@ -0,0 +1,28 @@ +const fs = require('fs').promises +const { streamEvents, docker } = require('../libs/docker') + +async function buildImage (configuration) { + let dockerFile = ` + # build + FROM node:lts + WORKDIR /usr/src/app + COPY package*.json . + ` + if (configuration.build.command.installation) { + dockerFile += `RUN ${configuration.build.command.installation} + ` + } + dockerFile += `COPY . . + RUN ${configuration.build.command.build}` + + await fs.writeFile(`${configuration.general.workdir}/Dockerfile`, dockerFile) + const stream = await docker.engine.buildImage( + { src: ['.'], context: configuration.general.workdir }, + { t: `${configuration.build.container.name}:${configuration.build.container.tag}` } + ) + await streamEvents(stream, configuration) +} + +module.exports = { + buildImage +} diff --git a/api/packs/index.js b/api/packs/index.js new file mode 100644 index 000000000..919be5e62 --- /dev/null +++ b/api/packs/index.js @@ -0,0 +1,4 @@ +const static = require('./static') +const nodejs = require('./nodejs') + +module.exports = { static, nodejs } diff --git a/api/packs/nodejs/index.js b/api/packs/nodejs/index.js new file mode 100644 index 000000000..bdf699548 --- /dev/null +++ b/api/packs/nodejs/index.js @@ -0,0 +1,32 @@ +const fs = require('fs').promises +const { buildImage } = require('../helpers') +const { streamEvents, docker } = require('../../libs/docker') + +module.exports = async function (configuration) { + if (configuration.build.command.build) await buildImage(configuration) + + let dockerFile = `# production stage + FROM node:lts + WORKDIR /usr/src/app + ` + if (configuration.build.command.build) { + dockerFile += `COPY --from=${configuration.build.container.name}:${configuration.build.container.tag} /usr/src/app/${configuration.build.directory} /usr/src/app` + } else { + dockerFile += 'COPY . ./' + } + if (configuration.build.command.installation) { + dockerFile += ` + RUN ${configuration.build.command.installation} + ` + } + dockerFile += ` + EXPOSE ${configuration.publish.port} + CMD [ "yarn", "start" ]` + + await fs.writeFile(`${configuration.general.workdir}/Dockerfile`, dockerFile) + const stream = await docker.engine.buildImage( + { src: ['.'], context: configuration.general.workdir }, + { t: `${configuration.build.container.name}:${configuration.build.container.tag}` } + ) + await streamEvents(stream, configuration) +} diff --git a/api/packs/static/index.js b/api/packs/static/index.js new file mode 100644 index 000000000..5c7c7de00 --- /dev/null +++ b/api/packs/static/index.js @@ -0,0 +1,28 @@ +const fs = require('fs').promises +const { buildImage } = require('../helpers') +const { streamEvents, docker } = require('../../libs/docker') + +module.exports = async function (configuration) { + if (configuration.build.command.build) await buildImage(configuration) + + let dockerFile = `# production stage + FROM nginx:stable-alpine + COPY nginx.conf /etc/nginx/nginx.conf + ` + if (configuration.build.command.build) { + dockerFile += `COPY --from=${configuration.build.container.name}:${configuration.build.container.tag} /usr/src/app/${configuration.build.directory} /usr/share/nginx/html` + } else { + dockerFile += 'COPY . /usr/share/nginx/html' + } + + dockerFile += ` + EXPOSE 80 + CMD ["nginx", "-g", "daemon off;"]` + await fs.writeFile(`${configuration.general.workdir}/Dockerfile`, dockerFile) + + const stream = await docker.engine.buildImage( + { src: ['.'], context: configuration.general.workdir }, + { t: `${configuration.build.container.name}:${configuration.build.container.tag}` } + ) + await streamEvents(stream, configuration) +} diff --git a/api/plugins/authentication.js b/api/plugins/authentication.js new file mode 100644 index 000000000..4cbde6685 --- /dev/null +++ b/api/plugins/authentication.js @@ -0,0 +1,21 @@ +const fp = require('fastify-plugin') +const User = require('../models/User') +module.exports = fp(async function (fastify, options, next) { + fastify.register(require('fastify-jwt'), { + secret: fastify.config.JWT_SIGN_KEY + }) + fastify.addHook('onRequest', async (request, reply) => { + try { + const { jti } = await request.jwtVerify() + const found = await User.findOne({ uid: jti }) + if (found) { + return true + } else { + reply.code(401).send('Unauthorized') + } + } catch (err) { + reply.code(401).send('Unauthorized') + } + }) + next() +}) diff --git a/api/routes/v1/application/check.js b/api/routes/v1/application/check.js new file mode 100644 index 000000000..4cab18915 --- /dev/null +++ b/api/routes/v1/application/check.js @@ -0,0 +1,35 @@ + +const { verifyUserId } = require('../../../libs/common') +const { setDefaultConfiguration } = require('../../../libs/applications/configuration') +const { docker } = require('../../../libs/docker') + +module.exports = async function (fastify) { + fastify.post('/', async (request, reply) => { + if (!await verifyUserId(request.headers.authorization)) { + reply.code(500).send({ error: 'Invalid request' }) + return + } + const configuration = setDefaultConfiguration(request.body) + + const services = (await docker.engine.listServices()).filter(r => r.Spec.Labels.managedBy === 'coolify' && r.Spec.Labels.type === 'application') + let foundDomain = false + + for (const service of services) { + const running = JSON.parse(service.Spec.Labels.configuration) + if (running) { + if ( + running.publish.domain === configuration.publish.domain && + running.repository.id !== configuration.repository.id + ) { + foundDomain = true + } + } + } + if (fastify.config.DOMAIN === configuration.publish.domain) foundDomain = true + if (foundDomain) { + reply.code(500).send({ message: 'Domain already in use.' }) + return + } + return { message: 'OK' } + }) +} diff --git a/api/routes/v1/application/deploy/index.js b/api/routes/v1/application/deploy/index.js new file mode 100644 index 000000000..dbefa6b8f --- /dev/null +++ b/api/routes/v1/application/deploy/index.js @@ -0,0 +1,117 @@ + +const { verifyUserId, cleanupTmp, execShellAsync } = require('../../../../libs/common') +const Deployment = require('../../../../models/Deployment') +const { queueAndBuild } = require('../../../../libs/applications') +const { setDefaultConfiguration } = require('../../../../libs/applications/configuration') +const { docker } = require('../../../../libs/docker') +const cloneRepository = require('../../../../libs/applications/github/cloneRepository') + +module.exports = async function (fastify) { + // const postSchema = { + // body: { + // type: "object", + // properties: { + // ref: { type: "string" }, + // repository: { + // type: "object", + // properties: { + // id: { type: "number" }, + // full_name: { type: "string" }, + // }, + // required: ["id", "full_name"], + // }, + // installation: { + // type: "object", + // properties: { + // id: { type: "number" }, + // }, + // required: ["id"], + // }, + // }, + // required: ["ref", "repository", "installation"], + // }, + // }; + fastify.post('/', async (request, reply) => { + if (!await verifyUserId(request.headers.authorization)) { + reply.code(500).send({ error: 'Invalid request' }) + return + } + + const configuration = setDefaultConfiguration(request.body) + + const services = (await docker.engine.listServices()).filter(r => r.Spec.Labels.managedBy === 'coolify' && r.Spec.Labels.type === 'application') + + await cloneRepository(configuration) + + let foundService = false + let foundDomain = false + let configChanged = false + let imageChanged = false + + let forceUpdate = false + + for (const service of services) { + const running = JSON.parse(service.Spec.Labels.configuration) + if (running) { + if ( + running.publish.domain === configuration.publish.domain && + running.repository.id !== configuration.repository.id + ) { + foundDomain = true + } + if (running.repository.id === configuration.repository.id && running.repository.branch === configuration.repository.branch) { + const state = await execShellAsync(`docker stack ps ${running.build.container.name} --format '{{ json . }}'`) + const isError = state.split('\n').filter(n => n).map(s => JSON.parse(s)).filter(n => n.DesiredState !== 'Running') + if (isError.length > 0) forceUpdate = true + + foundService = true + const runningWithoutContainer = JSON.parse(JSON.stringify(running)) + delete runningWithoutContainer.build.container + + const configurationWithoutContainer = JSON.parse(JSON.stringify(configuration)) + delete configurationWithoutContainer.build.container + + // If only the configuration changed + if (JSON.stringify(runningWithoutContainer.build) !== JSON.stringify(configurationWithoutContainer.build) || JSON.stringify(runningWithoutContainer.publish) !== JSON.stringify(configurationWithoutContainer.publish)) configChanged = true + // If only the image changed + if (running.build.container.tag !== configuration.build.container.tag) imageChanged = true + // If build pack changed, forceUpdate the service + if (running.build.pack !== configuration.build.pack) forceUpdate = true + } + } + } + if (foundDomain) { + cleanupTmp(configuration.general.workdir) + reply.code(500).send({ message: 'Domain already in use.' }) + return + } + if (forceUpdate) { + imageChanged = false + configChanged = false + } else { + if (foundService && !imageChanged && !configChanged) { + cleanupTmp(configuration.general.workdir) + reply.code(500).send({ message: 'Nothing changed, no need to redeploy.' }) + return + } + } + + const alreadyQueued = await Deployment.find({ + repoId: configuration.repository.id, + branch: configuration.repository.branch, + organization: configuration.repository.organization, + name: configuration.repository.name, + domain: configuration.publish.domain, + progress: { $in: ['queued', 'inprogress'] } + }) + + if (alreadyQueued.length > 0) { + reply.code(200).send({ message: 'Already in the queue.' }) + return + } + + queueAndBuild(configuration, services, configChanged, imageChanged) + + reply.code(201).send({ message: 'Deployment queued.', nickname: configuration.general.nickname, name: configuration.build.container.name }) + }) +} diff --git a/api/routes/v1/application/deploy/logs.js b/api/routes/v1/application/deploy/logs.js new file mode 100644 index 000000000..322165f79 --- /dev/null +++ b/api/routes/v1/application/deploy/logs.js @@ -0,0 +1,62 @@ +const ApplicationLog = require('../../../../models/Logs/Application') +const Deployment = require('../../../../models/Deployment') +const dayjs = require('dayjs') +const utc = require('dayjs/plugin/utc') +const relativeTime = require('dayjs/plugin/relativeTime') +dayjs.extend(utc) +dayjs.extend(relativeTime) + +module.exports = async function (fastify) { + const getLogSchema = { + querystring: { + type: 'object', + properties: { + repoId: { type: 'string' }, + branch: { type: 'string' } + }, + required: ['repoId', 'branch'] + } + } + fastify.get('/', { schema: getLogSchema }, async (request, reply) => { + const { repoId, branch, page } = request.query + const onePage = 5 + const show = Number(page) * onePage || 5 + const deploy = await Deployment.find({ repoId, branch }) + .select('-_id -__v -repoId') + .sort({ createdAt: 'desc' }) + .limit(show) + + const finalLogs = deploy.map(d => { + const finalLogs = { ...d._doc } + + const updatedAt = dayjs(d.updatedAt).utc() + + finalLogs.took = updatedAt.diff(dayjs(d.createdAt)) / 1000 + finalLogs.since = updatedAt.fromNow() + + return finalLogs + }) + return finalLogs + }) + + fastify.get('/:deployId', async (request, reply) => { + const { deployId } = request.params + try { + const logs = await ApplicationLog.find({ deployId }) + .select('-_id -__v') + .sort({ createdAt: 'asc' }) + + const deploy = await Deployment.findOne({ deployId }) + .select('-_id -__v') + .sort({ createdAt: 'desc' }) + + const finalLogs = {} + finalLogs.progress = deploy.progress + finalLogs.events = logs.map(log => log.event) + finalLogs.human = dayjs(deploy.updatedAt).from(dayjs(deploy.updatedAt)) + return finalLogs + } catch (e) { + throw new Error('No logs found') + } + }) +} diff --git a/api/routes/v1/application/logs.js b/api/routes/v1/application/logs.js new file mode 100644 index 000000000..e8221abac --- /dev/null +++ b/api/routes/v1/application/logs.js @@ -0,0 +1,10 @@ +const { docker } = require('../../../libs/docker') + +module.exports = async function (fastify) { + fastify.get('/', async (request, reply) => { + const { name } = request.query + const service = await docker.engine.getService(`${name}_${name}`) + const logs = (await service.logs({ stdout: true, stderr: true, timestamps: true })).toString().split('\n').map(l => l.slice(8)).filter((a) => a) + return { logs } + }) +} diff --git a/api/routes/v1/application/remove.js b/api/routes/v1/application/remove.js new file mode 100644 index 000000000..0130825c3 --- /dev/null +++ b/api/routes/v1/application/remove.js @@ -0,0 +1,35 @@ +const { docker } = require('../../../libs/docker') +const { execShellAsync } = require('../../../libs/common') +const ApplicationLog = require('../../../models/Logs/Application') +const Deployment = require('../../../models/Deployment') + +module.exports = async function (fastify) { + fastify.post('/', async (request, reply) => { + const { organization, name, branch } = request.body + let found = false + try { + (await docker.engine.listServices()).filter(r => r.Spec.Labels.managedBy === 'coolify' && r.Spec.Labels.type === 'application').map(s => { + const running = JSON.parse(s.Spec.Labels.configuration) + if (running.repository.organization === organization && + running.repository.name === name && + running.repository.branch === branch) { + found = running + } + return null + }) + if (found) { + const deploys = await Deployment.find({ organization, branch, name }) + for (const deploy of deploys) { + await ApplicationLog.deleteMany({ deployId: deploy.deployId }) + await Deployment.deleteMany({ deployId: deploy.deployId }) + } + await execShellAsync(`docker stack rm ${found.build.container.name}`) + reply.code(200).send({ organization, name, branch }) + } else { + reply.code(500).send({ message: 'Nothing to do.' }) + } + } catch (error) { + reply.code(500).send({ message: 'Nothing to do.' }) + } + }) +} diff --git a/api/routes/v1/config.js b/api/routes/v1/config.js new file mode 100644 index 000000000..a8c66453c --- /dev/null +++ b/api/routes/v1/config.js @@ -0,0 +1,103 @@ +const { docker } = require('../../libs/docker') + +module.exports = async function (fastify) { + // const getConfig = { + // querystring: { + // type: 'object', + // properties: { + // repoId: { type: 'number' }, + // branch: { type: 'string' } + // }, + // required: ['repoId', 'branch'] + // } + // } + + // const saveConfig = { + // body: { + // type: 'object', + // properties: { + // build: { + // type: 'object', + // properties: { + // baseDir: { type: 'string' }, + // installCmd: { type: 'string' }, + // buildCmd: { type: 'string' } + // }, + // required: ['baseDir', 'installCmd', 'buildCmd'] + // }, + // publish: { + // type: 'object', + // properties: { + // publishDir: { type: 'string' }, + // domain: { type: 'string' }, + // pathPrefix: { type: 'string' }, + // port: { type: 'number' } + // }, + // required: ['publishDir', 'domain', 'pathPrefix', 'port'] + // }, + // previewDeploy: { type: 'boolean' }, + // branch: { type: 'string' }, + // repoId: { type: 'number' }, + // buildPack: { type: 'string' }, + // fullName: { type: 'string' }, + // installationId: { type: 'number' } + // }, + // required: ['build', 'publish', 'previewDeploy', 'branch', 'repoId', 'buildPack', 'fullName', 'installationId'] + // } + // } + + // fastify.get("/all", async (request, reply) => { + // return await Config.find().select("-_id -__v"); + // }); + + // fastify.get("/", { schema: getConfig }, async (request, reply) => { + // const { repoId, branch } = request.query; + // return await Config.findOne({ repoId, branch }).select("-_id -__v"); + // }); + + fastify.post('/', async (request, reply) => { + const { name, organization, branch } = request.body + const services = await docker.engine.listServices() + const applications = services.filter(r => r.Spec.Labels.managedBy === 'coolify' && r.Spec.Labels.type === 'application') + + const found = applications.find(r => { + const configuration = r.Spec.Labels.configuration ? JSON.parse(r.Spec.Labels.configuration) : null + if (branch) { + if (configuration.repository.name === name && configuration.repository.organization === organization && configuration.repository.branch === branch) { + return r + } + } else { + if (configuration.repository.name === name && configuration.repository.organization === organization) { + return r + } + } + return null + }) + if (found) { + return JSON.parse(found.Spec.Labels.configuration) + } else { + reply.code(500).send({ message: 'No configuration found.' }) + } + }) + + // fastify.delete("/", async (request, reply) => { + // const { repoId, branch } = request.body; + + // const deploys = await Deployment.find({ repoId, branch }) + // const found = deploys.filter(d => d.progress !== 'done' && d.progress !== 'failed') + // if (found.length > 0) { + // throw new Error('Deployment inprogress, cannot delete now.'); + // } + + // const config = await Config.findOneAndDelete({ repoId, branch }) + // for (const deploy of deploys) { + // await ApplicationLog.findOneAndRemove({ deployId: deploy.deployId }); + // } + // const secrets = await Secret.find({ repoId, branch }); + // for (const secret of secrets) { + // await Secret.findByIdAndRemove(secret._id); + // } + // await execShellAsync(`docker stack rm ${config.containerName}`); + // return { message: 'Deleted application and related configurations.' }; + // }); +} diff --git a/api/routes/v1/dashboard/index.js b/api/routes/v1/dashboard/index.js new file mode 100644 index 000000000..3c744c47e --- /dev/null +++ b/api/routes/v1/dashboard/index.js @@ -0,0 +1,55 @@ +const { docker } = require('../../../libs/docker') +const Deployment = require('../../../models/Deployment') +const ServerLog = require('../../../models/Logs/Server') + +module.exports = async function (fastify) { + fastify.get('/', async (request, reply) => { + const latestDeployments = await Deployment.aggregate([ + { + $sort: { createdAt: -1 } + }, + { + $group: + { + _id: { + repoId: '$repoId', + branch: '$branch' + }, + createdAt: { $last: '$createdAt' }, + progress: { $first: '$progress' } + } + } + ]) + + const serverLogs = await ServerLog.find() + const services = await docker.engine.listServices() + + let applications = services.filter(r => r.Spec.Labels.managedBy === 'coolify' && r.Spec.Labels.type === 'application' && r.Spec.Labels.configuration) + let databases = services.filter(r => r.Spec.Labels.managedBy === 'coolify' && r.Spec.Labels.type === 'database' && r.Spec.Labels.configuration) + applications = applications.map(r => { + if (JSON.parse(r.Spec.Labels.configuration)) { + const configuration = JSON.parse(r.Spec.Labels.configuration) + const status = latestDeployments.find(l => configuration.repository.id === l._id.repoId && configuration.repository.branch === l._id.branch) + if (status && status.progress) r.progress = status.progress + r.Spec.Labels.configuration = configuration + return r + } + return {} + }) + databases = databases.map(r => { + const configuration = r.Spec.Labels.configuration ? JSON.parse(r.Spec.Labels.configuration) : null + r.Spec.Labels.configuration = configuration + return r + }) + applications = [...new Map(applications.map(item => [item.Spec.Labels.configuration.publish.domain, item])).values()] + return { + serverLogs, + applications: { + deployed: applications + }, + databases: { + deployed: databases + } + } + }) +} diff --git a/api/routes/v1/databases/index.js b/api/routes/v1/databases/index.js new file mode 100644 index 000000000..17871aa03 --- /dev/null +++ b/api/routes/v1/databases/index.js @@ -0,0 +1,173 @@ +const yaml = require('js-yaml') +const fs = require('fs').promises +const cuid = require('cuid') +const { docker } = require('../../../libs/docker') +const { execShellAsync } = require('../../../libs/common') + +const { uniqueNamesGenerator, adjectives, colors, animals } = require('unique-names-generator') +const generator = require('generate-password') + +function getUniq () { + return uniqueNamesGenerator({ dictionaries: [adjectives, animals, colors], length: 2 }) +} +module.exports = async function (fastify) { + fastify.get('/:deployId', async (request, reply) => { + const { deployId } = request.params + try { + const database = (await docker.engine.listServices()).find(r => r.Spec.Labels.managedBy === 'coolify' && r.Spec.Labels.type === 'database' && JSON.parse(r.Spec.Labels.configuration).general.deployId === deployId) + if (database) { + const jsonEnvs = {} + for (const d of database.Spec.TaskTemplate.ContainerSpec.Env) { + const s = d.split('=') + jsonEnvs[s[0]] = s[1] + } + const payload = { + config: JSON.parse(database.Spec.Labels.configuration), + envs: jsonEnvs + } + reply.code(200).send(payload) + } else { + throw new Error() + } + } catch (error) { + throw new Error('No database found?') + } + }) + + const postSchema = { + body: { + type: 'object', + properties: { + type: { type: 'string', enum: ['mongodb', 'postgresql', 'mysql', 'couchdb'] } + }, + required: ['type'] + } + } + + fastify.post('/deploy', { schema: postSchema }, async (request, reply) => { + let { type, defaultDatabaseName } = request.body + const passwords = generator.generateMultiple(2, { + length: 24, + numbers: true, + strict: true + }) + const usernames = generator.generateMultiple(2, { + length: 10, + numbers: true, + strict: true + }) + // TODO: Query for existing db with the same name + const nickname = getUniq() + + if (!defaultDatabaseName) defaultDatabaseName = nickname + + reply.code(201).send({ message: 'Deploying.' }) + // TODO: Persistent volume, custom inputs + const deployId = cuid() + const configuration = { + general: { + workdir: `/tmp/${deployId}`, + deployId, + nickname, + type + }, + database: { + usernames, + passwords, + defaultDatabaseName + }, + deploy: { + name: nickname + } + } + let generateEnvs = {} + let image = null + let volume = null + if (type === 'mongodb') { + generateEnvs = { + MONGODB_ROOT_PASSWORD: passwords[0], + MONGODB_USERNAME: usernames[0], + MONGODB_PASSWORD: passwords[1], + MONGODB_DATABASE: defaultDatabaseName + } + image = 'bitnami/mongodb:4.4' + volume = `${configuration.general.deployId}-${type}-data:/bitnami/mongodb` + } else if (type === 'postgresql') { + generateEnvs = { + POSTGRESQL_PASSWORD: passwords[0], + POSTGRESQL_USERNAME: usernames[0], + POSTGRESQL_DATABASE: defaultDatabaseName + } + image = 'bitnami/postgresql:13.2.0' + volume = `${configuration.general.deployId}-${type}-data:/bitnami/postgresql` + } else if (type === 'couchdb') { + generateEnvs = { + COUCHDB_PASSWORD: passwords[0], + COUCHDB_USER: usernames[0] + } + image = 'bitnami/couchdb:3' + volume = `${configuration.general.deployId}-${type}-data:/bitnami/couchdb` + } else if (type === 'mysql') { + generateEnvs = { + MYSQL_ROOT_PASSWORD: passwords[0], + MYSQL_ROOT_USER: usernames[0], + MYSQL_USER: usernames[1], + MYSQL_PASSWORD: passwords[1], + MYSQL_DATABASE: defaultDatabaseName + } + image = 'bitnami/mysql:8.0' + volume = `${configuration.general.deployId}-${type}-data:/bitnami/mysql/data` + } + + const stack = { + version: '3.8', + services: { + [configuration.general.deployId]: { + image, + networks: [`${docker.network}`], + environment: generateEnvs, + volumes: [volume], + deploy: { + replicas: 1, + update_config: { + parallelism: 0, + delay: '10s', + order: 'start-first' + }, + rollback_config: { + parallelism: 0, + delay: '10s', + order: 'start-first' + }, + labels: [ + 'managedBy=coolify', + 'type=database', + 'configuration=' + JSON.stringify(configuration) + ] + } + } + }, + networks: { + [`${docker.network}`]: { + external: true + } + }, + volumes: { + [`${configuration.general.deployId}-${type}-data`]: { + external: true + } + } + } + await execShellAsync(`mkdir -p ${configuration.general.workdir}`) + await fs.writeFile(`${configuration.general.workdir}/stack.yml`, yaml.dump(stack)) + await execShellAsync( + `cat ${configuration.general.workdir}/stack.yml | docker stack deploy -c - ${configuration.general.deployId}` + ) + }) + + fastify.delete('/:dbName', async (request, reply) => { + const { dbName } = request.params + await execShellAsync(`docker stack rm ${dbName}`) + reply.code(200).send({}) + }) +} diff --git a/api/routes/v1/login/github.js b/api/routes/v1/login/github.js new file mode 100644 index 000000000..0d395a196 --- /dev/null +++ b/api/routes/v1/login/github.js @@ -0,0 +1,121 @@ +const axios = require('axios') +const User = require('../../../models/User') +const Settings = require('../../../models/Settings') +const cuid = require('cuid') +const mongoose = require('mongoose') +const jwt = require('jsonwebtoken') +module.exports = async function (fastify) { + const githubCodeSchema = { + schema: { + querystring: { + type: 'object', + properties: { + code: { type: 'string' } + }, + required: ['code'] + } + } + } + fastify.get('/app', { schema: githubCodeSchema }, async (request, reply) => { + const { code } = request.query + try { + const { data } = await axios({ + method: 'post', + url: `https://github.com/login/oauth/access_token?client_id=${fastify.config.VITE_GITHUB_APP_CLIENTID}&client_secret=${fastify.config.GITHUB_APP_CLIENT_SECRET}&code=${code}`, + headers: { + accept: 'application/json' + } + }) + + const token = data.access_token + const githubAxios = axios.create({ + baseURL: 'https://api.github.com' + }) + + githubAxios.defaults.headers.common.Accept = 'Application/json' + githubAxios.defaults.headers.common.Authorization = `token ${token}` + + try { + let uid = cuid() + const { avatar_url } = (await githubAxios.get('/user')).data // eslint-disable-line + const email = (await githubAxios.get('/user/emails')).data.filter( + (e) => e.primary + )[0].email + const settings = await Settings.findOne({ applicationName: 'coolify' }) + const registeredUsers = await User.find().countDocuments() + const foundUser = await User.findOne({ email }) + if (foundUser) { + await User.findOneAndUpdate( + { email }, + { avatar: avatar_url }, + { upsert: true, new: true } + ) + uid = foundUser.uid + } else { + if (registeredUsers === 0) { + const newUser = new User({ + _id: new mongoose.Types.ObjectId(), + email, + avatar: avatar_url, + uid + }) + try { + await newUser.save() + } catch (e) { + console.log(e) + reply.code(500).send({ success: false, error: e }) + return + } + } else { + if (!settings && registeredUsers > 0) { + reply.code(500).send('Registration disabled, enable it in settings.') + } else { + if (!settings.allowRegistration) { + reply.code(500).send('You are not allowed here!') + } else { + const newUser = new User({ + _id: new mongoose.Types.ObjectId(), + email, + avatar: avatar_url, + uid + }) + try { + await newUser.save() + } catch (e) { + console.log(e) + reply.code(500).send({ success: false, error: e }) + return + } + } + } + } + } + const jwtToken = jwt.sign({}, fastify.config.JWT_SIGN_KEY, { + expiresIn: 15778800, + algorithm: 'HS256', + audience: 'coolLabs', + issuer: 'coolLabs', + jwtid: uid, + subject: `User:${uid}`, + notBefore: -1000 + }) + reply + .code(200) + .redirect( + 302, + `/api/v1/login/github/success?jwtToken=${jwtToken}&ghToken=${token}` + ) + } catch (e) { + console.log(e) + reply.code(500).send({ success: false, error: e }) + return + } + } catch (error) { + console.log(error) + reply.code(500).send({ success: false, error: error.message }) + } + }) + fastify.get('/success', async (request, reply) => { + return reply.sendFile('bye.html') + }) +} diff --git a/api/routes/v1/settings/index.js b/api/routes/v1/settings/index.js new file mode 100644 index 000000000..8ce3a3544 --- /dev/null +++ b/api/routes/v1/settings/index.js @@ -0,0 +1,44 @@ +const Settings = require('../../../models/Settings') +module.exports = async function (fastify) { + const applicationName = 'coolify' + const postSchema = { + body: { + type: 'object', + properties: { + allowRegistration: { type: 'boolean' } + }, + required: ['allowRegistration'] + } + } + + fastify.get('/', async (request, reply) => { + try { + let settings = await Settings.findOne({ applicationName }).select('-_id -__v') + // TODO: Should do better + if (!settings) { + settings = { + applicationName, + allowRegistration: false + } + } + return { + settings + } + } catch (error) { + throw new Error(error) + } + }) + + fastify.post('/', { schema: postSchema }, async (request, reply) => { + try { + const settings = await Settings.findOneAndUpdate( + { applicationName }, + { applicationName, ...request.body }, + { upsert: true, new: true } + ).select('-_id -__v') + reply.code(201).send({ settings }) + } catch (error) { + throw new Error(error) + } + }) +} diff --git a/api/routes/v1/undead.js b/api/routes/v1/undead.js new file mode 100644 index 000000000..61b25391e --- /dev/null +++ b/api/routes/v1/undead.js @@ -0,0 +1,5 @@ +module.exports = async function (fastify) { + fastify.get('/', async (request, reply) => { + reply.code(200).send('NO') + }) +} diff --git a/api/routes/v1/upgrade/index.js b/api/routes/v1/upgrade/index.js new file mode 100644 index 000000000..7adfae051 --- /dev/null +++ b/api/routes/v1/upgrade/index.js @@ -0,0 +1,12 @@ +const { execShellAsync } = require('../../../libs/common') +const { saveServerLog } = require('../../../libs/logging') + +module.exports = async function (fastify) { + fastify.get('/', async (request, reply) => { + const upgradeP1 = await execShellAsync('bash ./install.sh upgrade-phase-1') + await saveServerLog({ event: upgradeP1, type: 'UPGRADE-P-1' }) + reply.code(200).send('I\'m trying, okay?') + const upgradeP2 = await execShellAsync('bash ./install.sh upgrade-phase-2') + await saveServerLog({ event: upgradeP2, type: 'UPGRADE-P-2' }) + }) +} diff --git a/api/routes/v1/verify.js b/api/routes/v1/verify.js new file mode 100644 index 000000000..82e9331c0 --- /dev/null +++ b/api/routes/v1/verify.js @@ -0,0 +1,16 @@ +const User = require('../../models/User') +const jwt = require('jsonwebtoken') + +module.exports = async function (fastify) { + fastify.get('/', async (request, reply) => { + const { authorization } = request.headers + if (!authorization) { + reply.code(401).send({}) + return + } + const token = authorization.split(' ')[1] + const verify = jwt.verify(token, fastify.config.JWT_SIGN_KEY) + const found = await User.findOne({ uid: verify.jti }) + found ? reply.code(200).send({}) : reply.code(401).send({}) + }) +} diff --git a/api/routes/v1/webhooks/deploy.js b/api/routes/v1/webhooks/deploy.js new file mode 100644 index 000000000..51df9d8cb --- /dev/null +++ b/api/routes/v1/webhooks/deploy.js @@ -0,0 +1,142 @@ +const crypto = require('crypto') +const { cleanupTmp, execShellAsync } = require('../../../libs/common') +const Deployment = require('../../../models/Deployment') +const { queueAndBuild } = require('../../../libs/applications') +const { setDefaultConfiguration } = require('../../../libs/applications/configuration') +const { docker } = require('../../../libs/docker') +const cloneRepository = require('../../../libs/applications/github/cloneRepository') + +module.exports = async function (fastify) { + // TODO: Add this to fastify plugin + const postSchema = { + body: { + type: 'object', + properties: { + ref: { type: 'string' }, + repository: { + type: 'object', + properties: { + id: { type: 'number' }, + full_name: { type: 'string' } + }, + required: ['id', 'full_name'] + }, + installation: { + type: 'object', + properties: { + id: { type: 'number' } + }, + required: ['id'] + } + }, + required: ['ref', 'repository', 'installation'] + } + } + fastify.post('/', { schema: postSchema }, async (request, reply) => { + const hmac = crypto.createHmac('sha256', fastify.config.GITHUP_APP_WEBHOOK_SECRET) + const digest = Buffer.from('sha256=' + hmac.update(JSON.stringify(request.body)).digest('hex'), 'utf8') + const checksum = Buffer.from(request.headers['x-hub-signature-256'], 'utf8') + if (checksum.length !== digest.length || !crypto.timingSafeEqual(digest, checksum)) { + reply.code(500).send({ error: 'Invalid request' }) + return + } + + if (request.headers['x-github-event'] !== 'push') { + reply.code(500).send({ error: 'Not a push event.' }) + return + } + + const services = (await docker.engine.listServices()).filter(r => r.Spec.Labels.managedBy === 'coolify' && r.Spec.Labels.type === 'application') + + let configuration = services.find(r => { + if (request.body.ref.startsWith('refs')) { + const branch = request.body.ref.split('/')[2] + if ( + JSON.parse(r.Spec.Labels.configuration).repository.id === request.body.repository.id && + JSON.parse(r.Spec.Labels.configuration).repository.branch === branch + ) { + return r + } + } + + return null + }) + + if (!configuration) { + reply.code(500).send({ error: 'No configuration found.' }) + return + } + + configuration = setDefaultConfiguration(JSON.parse(configuration.Spec.Labels.configuration)) + + await cloneRepository(configuration) + + let foundService = false + let foundDomain = false + let configChanged = false + let imageChanged = false + + let forceUpdate = false + + for (const service of services) { + const running = JSON.parse(service.Spec.Labels.configuration) + if (running) { + if ( + running.publish.domain === configuration.publish.domain && + running.repository.id !== configuration.repository.id && + running.repository.branch !== configuration.repository.branch + ) { + foundDomain = true + } + if (running.repository.id === configuration.repository.id && running.repository.branch === configuration.repository.branch) { + const state = await execShellAsync(`docker stack ps ${running.build.container.name} --format '{{ json . }}'`) + const isError = state.split('\n').filter(n => n).map(s => JSON.parse(s)).filter(n => n.DesiredState !== 'Running') + if (isError.length > 0) forceUpdate = true + foundService = true + + const runningWithoutContainer = JSON.parse(JSON.stringify(running)) + delete runningWithoutContainer.build.container + + const configurationWithoutContainer = JSON.parse(JSON.stringify(configuration)) + delete configurationWithoutContainer.build.container + + if (JSON.stringify(runningWithoutContainer.build) !== JSON.stringify(configurationWithoutContainer.build) || JSON.stringify(runningWithoutContainer.publish) !== JSON.stringify(configurationWithoutContainer.publish)) configChanged = true + if (running.build.container.tag !== configuration.build.container.tag) imageChanged = true + } + } + } + if (foundDomain) { + cleanupTmp(configuration.general.workdir) + reply.code(500).send({ message: 'Domain already used.' }) + return + } + if (forceUpdate) { + imageChanged = false + configChanged = false + } else { + if (foundService && !imageChanged && !configChanged) { + cleanupTmp(configuration.general.workdir) + reply.code(500).send({ message: 'Nothing changed, no need to redeploy.' }) + return + } + } + + const alreadyQueued = await Deployment.find({ + repoId: configuration.repository.id, + branch: configuration.repository.branch, + organization: configuration.repository.organization, + name: configuration.repository.name, + domain: configuration.publish.domain, + progress: { $in: ['queued', 'inprogress'] } + }) + + if (alreadyQueued.length > 0) { + reply.code(200).send({ message: 'Already in the queue.' }) + return + } + + queueAndBuild(configuration, services, configChanged, imageChanged) + + reply.code(201).send({ message: 'Deployment queued.' }) + }) +} diff --git a/api/schema.js b/api/schema.js new file mode 100644 index 000000000..fb672b560 --- /dev/null +++ b/api/schema.js @@ -0,0 +1,49 @@ +const schema = { + type: 'object', + required: [ + 'DOMAIN', + 'EMAIL', + 'VITE_GITHUB_APP_CLIENTID', + 'GITHUB_APP_CLIENT_SECRET', + 'GITHUB_APP_PRIVATE_KEY', + 'GITHUP_APP_WEBHOOK_SECRET', + 'JWT_SIGN_KEY', + 'SECRETS_ENCRYPTION_KEY' + ], + properties: { + DOMAIN: { + type: 'string' + }, + EMAIL: { + type: 'string' + }, + VITE_GITHUB_APP_CLIENTID: { + type: 'string' + }, + GITHUB_APP_CLIENT_SECRET: { + type: 'string' + }, + GITHUB_APP_PRIVATE_KEY: { + type: 'string' + }, + GITHUP_APP_WEBHOOK_SECRET: { + type: 'string' + }, + JWT_SIGN_KEY: { + type: 'string' + }, + DOCKER_ENGINE: { + type: 'string', + default: '/var/run/docker.sock' + }, + DOCKER_NETWORK: { + type: 'string', + default: 'coollabs' + }, + SECRETS_ENCRYPTION_KEY: { + type: 'string' + } + } +} + +module.exports = { schema } diff --git a/api/server.js b/api/server.js new file mode 100644 index 000000000..bf4c0ea93 --- /dev/null +++ b/api/server.js @@ -0,0 +1,90 @@ +require('dotenv').config() +const fs = require('fs') +const util = require('util') +const { saveServerLog } = require('./libs/logging') +const Deployment = require('./models/Deployment') +const fastify = require('fastify')({ + logger: { level: 'error' } +}) +const mongoose = require('mongoose') +const path = require('path') +const { schema } = require('./schema') + +fastify.register(require('fastify-env'), { + schema, + dotenv: true +}) + +if (process.env.NODE_ENV === 'production') { + fastify.register(require('fastify-static'), { + root: path.join(__dirname, '../dist/') + }) + + fastify.setNotFoundHandler(function (request, reply) { + reply.sendFile('index.html') + }) +} else { + fastify.register(require('fastify-static'), { + root: path.join(__dirname, '../public/') + }) +} + +fastify.register(require('./app'), { prefix: '/api/v1' }) +fastify.setErrorHandler(async (error, request, reply) => { + console.log(error) + if (error.statusCode) { + reply.status(error.statusCode).send({ message: error.message } || { message: 'Something is NOT okay. Are you okay?' }) + } else { + reply.status(500).send({ message: error.message } || { message: 'Something is NOT okay. Are you okay?' }) + } + await saveServerLog({ event: error }) +}) + +if (process.env.NODE_ENV === 'production') { + mongoose.connect( + `mongodb://${process.env.MONGODB_USER}:${process.env.MONGODB_PASSWORD}@${process.env.MONGODB_HOST}:${process.env.MONGODB_PORT}/${process.env.MONGODB_DB}?authSource=${process.env.MONGODB_DB}&readPreference=primary&ssl=false`, + { useNewUrlParser: true, useUnifiedTopology: true, useFindAndModify: false } + ) +} else { + mongoose.connect( + 'mongodb://localhost:27017/coolify?&readPreference=primary&ssl=false', + { useNewUrlParser: true, useUnifiedTopology: true, useFindAndModify: false } + ) +} + +mongoose.connection.on( + 'error', + console.error.bind(console, 'connection error:') +) +mongoose.connection.once('open', async function () { + if (process.env.NODE_ENV === 'production') { + fastify.listen(3000, '0.0.0.0') + console.log('Coolify API is up and running in production.') + } else { + const logFile = fs.createWriteStream('api/development/console.log', { flags: 'w' }) + const logStdout = process.stdout + + console.log = function (d) { + logFile.write(`[INFO]: ${util.format(d)}\n`) + logStdout.write(util.format(d) + '\n') + } + + console.error = function (d) { + logFile.write(`[ERROR]: ${util.format(d)}\n`) + logStdout.write(util.format(d) + '\n') + } + + console.warn = function (d) { + logFile.write(`[WARN]: ${util.format(d)}\n`) + logStdout.write(util.format(d) + '\n') + } + + fastify.listen(3001) + console.log('Coolify API is up and running in development.') + } + // On start cleanup inprogress/queued deployments. + const deployments = await Deployment.find({ progress: { $in: ['queued', 'inprogress'] } }) + for (const deployment of deployments) { + await Deployment.findByIdAndUpdate(deployment._id, { $set: { progress: 'failed' } }) + } +}) diff --git a/index.html b/index.html new file mode 100644 index 000000000..ee903fc5c --- /dev/null +++ b/index.html @@ -0,0 +1,19 @@ + + + + + + + + + coolify: Heroku & Netlify alternative + + + + + + + + + + \ No newline at end of file diff --git a/install.sh b/install.sh new file mode 100644 index 000000000..50cd4fa67 --- /dev/null +++ b/install.sh @@ -0,0 +1,43 @@ +#!/bin/bash +GIT_SSH_COMMAND="ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" git pull +echo "#### Building base image." +docker build -t coolify-base -f install/Dockerfile-base . +if [ $? -ne 0 ]; then + echo '#### Ooops something not okay!' + exit 1 +fi + +echo "#### Checking configuration." +docker run --rm -w /usr/src/app coolify-base node install/install.js --check +if [ $? -ne 0 ]; then + echo '#### Missing configuration.' + exit 1 +fi + +case "$1" in + "all") + echo "#### Rebuild everything." + docker run --rm -v /var/run/docker.sock:/var/run/docker.sock -v /data/coolify:/data/coolify -u root -w /usr/src/app coolify-base node install/install.js --type all + ;; + "coolify") + echo "#### Rebuild coolify." + docker run --rm -v /var/run/docker.sock:/var/run/docker.sock -v /data/coolify:/data/coolify -u root -w /usr/src/app coolify-base node install/install.js --type coolify + ;; + "proxy") + echo "#### Rebuild proxy." + docker run --rm -v /var/run/docker.sock:/var/run/docker.sock -v /data/coolify:/data/coolify -u root -w /usr/src/app coolify-base node install/install.js --type proxy + ;; + "upgrade-phase-1") + echo "#### Rebuild coolify from frontend request phase 1." + docker run --rm -v /var/run/docker.sock:/var/run/docker.sock -v /data/coolify:/data/coolify -u root -w /usr/src/app coolify-base node install/install.js --type upgrade + ;; + "upgrade-phase-2") + echo "#### Rebuild coolify from frontend request phase 2." + docker run --rm -v /var/run/docker.sock:/var/run/docker.sock -v /data/coolify:/data/coolify -u root -w /usr/src/app coolify-base node install/update.js --type upgrade + ;; + + *) + echo "Use 'all' to build & deploy proxy+coolify, 'coolify' to build & deploy only coolify, 'proxy' to build & deploy only proxy." + exit 1 + ;; +esac diff --git a/install/Dockerfile b/install/Dockerfile new file mode 100644 index 000000000..ed617ee73 --- /dev/null +++ b/install/Dockerfile @@ -0,0 +1,5 @@ +FROM coolify-base +WORKDIR /usr/src/app +RUN yarn build +CMD ["yarn", "start"] +EXPOSE 3000 \ No newline at end of file diff --git a/install/Dockerfile-base b/install/Dockerfile-base new file mode 100644 index 000000000..0d6759a2a --- /dev/null +++ b/install/Dockerfile-base @@ -0,0 +1,18 @@ +FROM ubuntu:20.04 as binaries +RUN apt update && apt install -y curl gnupg2 ca-certificates +RUN curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add - +RUN echo 'deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable' >> /etc/apt/sources.list +RUN curl -L https://github.com/a8m/envsubst/releases/download/v1.2.0/envsubst-`uname -s`-`uname -m` -o /usr/bin/envsubst +RUN chmod +x /usr/bin/envsubst +RUN apt update && apt install -y docker-ce-cli && apt clean all + +FROM node:14 as modules +COPY --from=binaries /usr/bin/docker /usr/bin/docker +COPY --from=binaries /usr/bin/envsubst /usr/bin/envsubst +WORKDIR /usr/src/app +COPY ./package*.json . +RUN yarn install + +FROM modules +WORKDIR /usr/src/app +COPY . . \ No newline at end of file diff --git a/install/coolify-template.yml b/install/coolify-template.yml new file mode 100644 index 000000000..37e578adc --- /dev/null +++ b/install/coolify-template.yml @@ -0,0 +1,97 @@ +version: '3.8' + +services: + proxy: + image: traefik:v2.3 + hostname: coollabs-proxy + ports: + - target: 80 + published: 80 + protocol: tcp + mode: host + - target: 443 + published: 443 + protocol: tcp + mode: host + command: + - --api.insecure=false + - --api.dashboard=false + - --api.debug=false + - --log.level=ERROR + - --providers.docker=true + - --providers.docker.swarmMode=true + - --providers.docker.exposedbydefault=false + - --providers.docker.network=${DOCKER_NETWORK} + - --entrypoints.web.address=:80 + - --entrypoints.websecure.address=:443 + - --certificatesresolvers.letsencrypt.acme.httpchallenge=true + - --certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web + - --certificatesresolvers.letsencrypt.acme.email=${EMAIL} + - --certificatesresolvers.letsencrypt.acme.storage=/data/coolify/acme.json + volumes: + - /var/run/docker.sock:/var/run/docker.sock + - /data/coolify:/data/coolify + networks: + - ${DOCKER_NETWORK} + deploy: + update_config: + parallelism: 1 + delay: 10s + order: start-first + replicas: 1 + placement: + constraints: + - node.role == manager + labels: + - "traefik.enable=true" + - "traefik.http.routers.api.entrypoints=websecure" + - "traefik.http.routers.api.service=api@internal" + - "traefik.http.routers.api.middlewares=auth" + - "traefik.http.services.traefik.loadbalancer.server.port=80" + - "traefik.http.services.traefik.loadbalancer.server.port=443" + + # Global redirect www to non-www + - "traefik.http.routers.www-catchall.rule=hostregexp(`{host:www.(.+)}`)" + - "traefik.http.routers.www-catchall.entrypoints=web" + - "traefik.http.routers.www-catchall.middlewares=redirect-www-to-nonwww" + - "traefik.http.middlewares.redirect-www-to-nonwww.redirectregex.regex=^http://(?:www\\.)?(.+)" + - "traefik.http.middlewares.redirect-www-to-nonwww.redirectregex.replacement=http://$$$${1}" + + # Global redirect http to https + - "traefik.http.routers.http-catchall.rule=hostregexp(`{host:.+}`)" + - "traefik.http.routers.http-catchall.entrypoints=web" + - "traefik.http.routers.http-catchall.middlewares=redirect-to-https" + + - "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https" + - "traefik.http.middlewares.global-compress.compress=true" + + coolify: + image: coolify + hostname: coollabs-coolify + env_file: + - .env + networks: + - ${DOCKER_NETWORK} + command: "yarn start" + volumes: + - /var/run/docker.sock:/var/run/docker.sock:ro + deploy: + update_config: + parallelism: 1 + delay: 10s + order: start-first + replicas: 1 + labels: + - "traefik.enable=true" + - "traefik.http.routers.coolify.entrypoints=websecure" + - "traefik.http.routers.coolify.tls.certresolver=letsencrypt" + - "traefik.http.routers.coolify.rule=Host(`${DOMAIN}`) && PathPrefix(`/`)" + - "traefik.http.services.coolify.loadbalancer.server.port=3000" + - "traefik.http.routers.coolify.middlewares=global-compress" + +networks: + ${DOCKER_NETWORK}: + driver: overlay + name: ${DOCKER_NETWORK} + external: true + diff --git a/install/install.js b/install/install.js new file mode 100644 index 000000000..2fd22201f --- /dev/null +++ b/install/install.js @@ -0,0 +1,52 @@ +require('dotenv').config() +const { program } = require('commander') +const fastify = require('fastify')() +const { schema } = require('../api/schema') +const shell = require('shelljs') +const user = shell.exec('whoami', { silent: true }).stdout.replace('\n', '') + +program.version('0.0.1') +program + .option('-d, --debug', 'Debug outputs.') + .option('-c, --check', 'Only checks configuration.') + .option('-t, --type ', 'Deploy type.') + +program.parse(process.argv) + +if (program.check) { + checkConfig().then(() => { + console.log('Config: OK') + }).catch((err) => { + console.log('Config: NOT OK') + console.error(err) + process.exit(1) + }) +} else { + if (user !== 'root') { + console.error(`Please run as root! Current user: ${user}`) + process.exit(1) + } + shell.exec(`docker network create ${process.env.DOCKER_NETWORK} --driver overlay`, { silent: !program.debug }) + shell.exec('docker build -t coolify -f install/Dockerfile .') + if (program.type === 'all') { + shell.exec('docker stack rm coollabs-coolify', { silent: !program.debug }) + } else if (program.type === 'coolify') { + shell.exec('docker service rm coollabs-coolify_coolify') + } else if (program.type === 'proxy') { + shell.exec('docker service rm coollabs-coolify_proxy') + } + if (program.type !== 'upgrade') shell.exec('set -a && source .env && set +a && envsubst < install/coolify-template.yml | docker stack deploy -c - coollabs-coolify', { silent: !program.debug, shell: '/bin/bash' }) +} + +function checkConfig () { + return new Promise((resolve, reject) => { + fastify.register(require('fastify-env'), { + schema, + dotenv: true + }) + .ready((err) => { + if (err) reject(err) + resolve() + }) + }) +} diff --git a/install/update.js b/install/update.js new file mode 100644 index 000000000..47beeb026 --- /dev/null +++ b/install/update.js @@ -0,0 +1,21 @@ +require('dotenv').config() +const { program } = require('commander') +const shell = require('shelljs') +const user = shell.exec('whoami', { silent: true }).stdout.replace('\n', '') + +program.version('0.0.1') +program + .option('-d, --debug', 'Debug outputs.') + .option('-c, --check', 'Only checks configuration.') + .option('-t, --type ', 'Deploy type.') + +program.parse(process.argv) + +if (user !== 'root') { + console.error(`Please run as root! Current user: ${user}`) + process.exit(1) +} +if (program.type === 'upgrade') { + shell.exec('docker service rm coollabs-coolify_coolify') + shell.exec('set -a && source .env && set +a && envsubst < install/coolify-template.yml | docker stack deploy -c - coollabs-coolify', { silent: !program.debug, shell: '/bin/bash' }) +} diff --git a/package.json b/package.json new file mode 100644 index 000000000..75397757e --- /dev/null +++ b/package.json @@ -0,0 +1,63 @@ +{ + "name": "coolify", + "description": "An open-source, hassle-free, self-hostable Heroku & Netlify alternative.", + "version": "1.0.0", + "license": "AGPL-3.0", + "scripts": { + "lint": "standard", + "start": "NODE_ENV=production node api/server", + "dev": "run-p dev:db dev:routify dev:svite dev:server", + "dev:db": "NODE_ENV=development node api/development/mongodb.js", + "dev:server": "nodemon -w api api/server", + "dev:routify": "routify run", + "dev:svite": "svite", + "build": "run-s build:routify build:svite", + "build:routify": "routify run -b", + "build:svite": "svite build" + }, + "dependencies": { + "@roxi/routify": "^2.7.3", + "@zerodevx/svelte-toast": "^0.1.4", + "axios": "^0.21.0", + "commander": "^6.2.1", + "cuid": "^2.1.8", + "dayjs": "^1.10.4", + "deepmerge": "^4.2.2", + "dockerode": "^3.2.1", + "dotenv": "^8.2.0", + "fastify": "^3.9.1", + "fastify-env": "^2.1.0", + "fastify-jwt": "^2.1.3", + "fastify-plugin": "^3.0.0", + "fastify-static": "^3.3.0", + "generate-password": "^1.6.0", + "js-yaml": "^4.0.0", + "jsonwebtoken": "^8.5.1", + "mongoose": "^5.11.4", + "shelljs": "^0.8.4", + "unique-names-generator": "^4.4.0" + }, + "devDependencies": { + "mongodb-memory-server-core": "^6.9.3", + "nodemon": "^2.0.6", + "npm-run-all": "^4.1.5", + "postcss": "^7.0.35", + "postcss-import": "^12.0.1", + "postcss-load-config": "^3.0.0", + "postcss-preset-env": "^6.7.0", + "prettier": "1.19", + "prettier-plugin-svelte": "^2.1.6", + "standard": "^16.0.3", + "svelte": "^3.29.7", + "svelte-hmr": "^0.12.2", + "svelte-preprocess": "^4.6.1", + "svite": "0.8.1", + "tailwindcss": "compat" + }, + "keywords": [ + "svelte", + "routify", + "fastify", + "tailwind" + ] +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 000000000..87ac153fc --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,6782 @@ +dependencies: + '@roxi/routify': 2.15.1 + '@zerodevx/svelte-toast': 0.1.4 + axios: 0.21.1 + commander: 6.2.1 + cuid: 2.1.8 + dayjs: 1.10.4 + deepmerge: 4.2.2 + dockerode: 3.2.1 + dotenv: 8.2.0 + fastify: 3.14.0 + fastify-env: 2.1.0 + fastify-jwt: 2.4.0 + fastify-plugin: 3.0.0 + fastify-static: 3.4.0 + generate-password: 1.6.0 + js-yaml: 4.0.0 + jsonwebtoken: 8.5.1 + mongoose: 5.12.2 + shelljs: 0.8.4 + unique-names-generator: 4.4.0 +devDependencies: + mongodb-memory-server-core: 6.9.6 + nodemon: 2.0.7 + npm-run-all: 4.1.5 + postcss: 7.0.35 + postcss-import: 12.0.1 + postcss-load-config: 3.0.1 + postcss-preset-env: 6.7.0 + prettier: 1.19.1 + prettier-plugin-svelte: 2.2.0_prettier@1.19.1+svelte@3.35.0 + standard: 16.0.3 + svelte: 3.35.0 + svelte-hmr: 0.12.9_svelte@3.35.0 + svelte-preprocess: 4.6.9_eb245e292303684892eec8315e825d7a + svite: 0.8.1_aead61d7c7f191e29d25eb4a1f5fb280 + tailwindcss: 2.0.1-compat +lockfileVersion: 5.2 +packages: + /@babel/code-frame/7.12.13: + dependencies: + '@babel/highlight': 7.13.10 + dev: true + resolution: + integrity: sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g== + /@babel/helper-validator-identifier/7.12.11: + dev: true + resolution: + integrity: sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw== + /@babel/highlight/7.13.10: + dependencies: + '@babel/helper-validator-identifier': 7.12.11 + chalk: 2.4.2 + js-tokens: 4.0.0 + dev: true + resolution: + integrity: sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg== + /@babel/parser/7.13.12: + dev: true + engines: + node: '>=6.0.0' + hasBin: true + resolution: + integrity: sha512-4T7Pb244rxH24yR116LAuJ+adxXXnHhZaLJjegJVKSdoNCe4x1eDBaud5YIcQFcqzsaD5BHvJw5BQ0AZapdCRw== + /@babel/types/7.13.12: + dependencies: + '@babel/helper-validator-identifier': 7.12.11 + lodash: 4.17.21 + to-fast-properties: 2.0.0 + dev: true + resolution: + integrity: sha512-K4nY2xFN4QMvQwkQ+zmBDp6ANMbVNw6BbxWmYA4qNjhR9W+Lj/8ky5MEY2Me5r+B2c6/v6F53oMndG+f9s3IiA== + /@csstools/convert-colors/1.4.0: + dev: true + engines: + node: '>=4.0.0' + resolution: + integrity: sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw== + /@eslint/eslintrc/0.2.2: + dependencies: + ajv: 6.12.6 + debug: 4.3.1 + espree: 7.3.1 + globals: 12.4.0 + ignore: 4.0.6 + import-fresh: 3.3.0 + js-yaml: 3.14.1 + lodash: 4.17.21 + minimatch: 3.0.4 + strip-json-comments: 3.1.1 + dev: true + engines: + node: ^10.12.0 || >=12.0.0 + resolution: + integrity: sha512-EfB5OHNYp1F4px/LI/FEnGylop7nOqkQ1LRzCM0KccA2U8tvV8w01KBv37LbO7nW4H+YhKyo2LcJhRwjjV17QQ== + /@fastify/forwarded/1.0.0: + dev: false + engines: + node: '>= 10' + resolution: + integrity: sha512-VoO+6WD0aRz8bwgJZ8pkkxjq7o/782cQ1j945HWg0obZMgIadYW3Pew0+an+k1QL7IPZHM3db5WF6OP6x4ymMA== + /@fastify/proxy-addr/3.0.0: + dependencies: + '@fastify/forwarded': 1.0.0 + ipaddr.js: 2.0.0 + dev: false + resolution: + integrity: sha512-ty7wnUd/GeSqKTC2Jozsl5xGbnxUnEFC0On2/zPv/8ixywipQmVZwuWvNGnBoitJ2wixwVqofwXNua8j6Y62lQ== + /@fullhuman/postcss-purgecss/3.1.3: + dependencies: + purgecss: 3.1.3 + dev: true + resolution: + integrity: sha512-kwOXw8fZ0Lt1QmeOOrd+o4Ibvp4UTEBFQbzvWldjlKv5n+G9sXfIPn1hh63IQIL8K8vbvv1oYMJiIUbuy9bGaA== + /@koa/cors/3.1.0: + dependencies: + vary: 1.1.2 + dev: true + engines: + node: '>= 8.0.0' + resolution: + integrity: sha512-7ulRC1da/rBa6kj6P4g2aJfnET3z8Uf3SWu60cjbtxTA5g8lxRdX/Bd2P92EagGwwAhANeNw8T8if99rJliR6Q== + /@nodelib/fs.scandir/2.1.4: + dependencies: + '@nodelib/fs.stat': 2.0.4 + run-parallel: 1.2.0 + dev: true + engines: + node: '>= 8' + resolution: + integrity: sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA== + /@nodelib/fs.stat/2.0.4: + dev: true + engines: + node: '>= 8' + resolution: + integrity: sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q== + /@nodelib/fs.walk/1.2.6: + dependencies: + '@nodelib/fs.scandir': 2.1.4 + fastq: 1.11.0 + dev: true + engines: + node: '>= 8' + resolution: + integrity: sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow== + /@rollup/plugin-commonjs/16.0.0_rollup@2.42.3: + dependencies: + '@rollup/pluginutils': 3.1.0_rollup@2.42.3 + commondir: 1.0.1 + estree-walker: 2.0.2 + glob: 7.1.6 + is-reference: 1.2.1 + magic-string: 0.25.7 + resolve: 1.20.0 + rollup: 2.42.3 + dev: true + engines: + node: '>= 8.0.0' + peerDependencies: + rollup: ^2.30.0 + resolution: + integrity: sha512-LuNyypCP3msCGVQJ7ki8PqYdpjfEkE/xtFa5DqlF+7IBD0JsfMZ87C58heSwIMint58sAUZbt3ITqOmdQv/dXw== + /@rollup/plugin-json/4.1.0_rollup@2.42.3: + dependencies: + '@rollup/pluginutils': 3.1.0_rollup@2.42.3 + rollup: 2.42.3 + dev: true + peerDependencies: + rollup: ^1.20.0 || ^2.0.0 + resolution: + integrity: sha512-yfLbTdNS6amI/2OpmbiBoW12vngr5NW2jCJVZSBEz+H5KfUJZ2M7sDjk0U6GOOdCWFVScShte29o9NezJ53TPw== + /@rollup/plugin-node-resolve/10.0.0_rollup@2.42.3: + dependencies: + '@rollup/pluginutils': 3.1.0_rollup@2.42.3 + '@types/resolve': 1.17.1 + builtin-modules: 3.2.0 + deepmerge: 4.2.2 + is-module: 1.0.0 + resolve: 1.20.0 + rollup: 2.42.3 + dev: true + engines: + node: '>= 10.0.0' + peerDependencies: + rollup: ^1.20.0||^2.0.0 + resolution: + integrity: sha512-sNijGta8fqzwA1VwUEtTvWCx2E7qC70NMsDh4ZG13byAXYigBNZMxALhKUSycBks5gupJdq0lFrKumFrRZ8H3A== + /@rollup/pluginutils/3.1.0: + dependencies: + '@types/estree': 0.0.39 + estree-walker: 1.0.1 + picomatch: 2.2.2 + dev: true + engines: + node: '>= 8.0.0' + peerDependencies: + rollup: ^1.20.0||^2.0.0 + resolution: + integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg== + /@rollup/pluginutils/3.1.0_rollup@2.42.3: + dependencies: + '@types/estree': 0.0.39 + estree-walker: 1.0.1 + picomatch: 2.2.2 + rollup: 2.42.3 + dev: true + engines: + node: '>= 8.0.0' + peerDependencies: + rollup: ^1.20.0||^2.0.0 + resolution: + integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg== + /@rollup/pluginutils/4.1.0: + dependencies: + estree-walker: 2.0.2 + picomatch: 2.2.2 + dev: true + engines: + node: '>= 8.0.0' + peerDependencies: + rollup: ^1.20.0||^2.0.0 + resolution: + integrity: sha512-TrBhfJkFxA+ER+ew2U2/fHbebhLT/l/2pRk0hfj9KusXUuRXd2v0R58AfaZK9VXDQ4TogOSEmICVrQAA3zFnHQ== + /@rollup/pluginutils/4.1.0_rollup@2.42.3: + dependencies: + estree-walker: 2.0.2 + picomatch: 2.2.2 + rollup: 2.42.3 + dev: true + engines: + node: '>= 8.0.0' + peerDependencies: + rollup: ^1.20.0||^2.0.0 + resolution: + integrity: sha512-TrBhfJkFxA+ER+ew2U2/fHbebhLT/l/2pRk0hfj9KusXUuRXd2v0R58AfaZK9VXDQ4TogOSEmICVrQAA3zFnHQ== + /@roxi/routify/2.15.1: + dependencies: + '@roxi/ssr': 0.2.1 + '@types/node': 12.20.6 + chalk: 4.1.0 + cheap-watch: 1.0.3 + commander: 7.2.0 + configent: 2.2.0 + esm: 3.2.25 + fs-extra: 9.1.0 + log-symbols: 3.0.0 + picomatch: 2.2.2 + rollup-pluginutils: 2.8.2 + dev: false + hasBin: true + resolution: + integrity: sha512-IRdoaPSfP09EwWtB+tpbHgH6ejYtowale24rgfpxRQhFNyTUK4jYXclvx3XkUD1NSupSgl1kDAsWSiRSG0WvkQ== + /@roxi/ssr/0.2.1: + dependencies: + bufferutil: 4.0.3 + jsdom: 16.5.1_c70f8fc5586dd378b8c866035dbe710b + node-fetch: 2.6.1 + utf-8-validate: 5.0.4 + dev: false + resolution: + integrity: sha512-C86xWJOmtCGZr/U4MURqePM0oDKFkTlLeEyT07R+7jSKvREKZ2manJAeAebYudJLYEGITEPGqObhRan32bUUbg== + /@sindresorhus/is/0.14.0: + dev: true + engines: + node: '>=6' + resolution: + integrity: sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== + /@szmarczak/http-timer/1.1.2: + dependencies: + defer-to-connect: 1.1.3 + dev: true + engines: + node: '>=6' + resolution: + integrity: sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== + /@types/accepts/1.3.5: + dependencies: + '@types/node': 14.14.35 + dev: true + resolution: + integrity: sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ== + /@types/body-parser/1.19.0: + dependencies: + '@types/connect': 3.4.34 + '@types/node': 14.14.35 + dev: true + resolution: + integrity: sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ== + /@types/bson/4.0.3: + dependencies: + '@types/node': 14.14.35 + dev: false + resolution: + integrity: sha512-mVRvYnTOZJz3ccpxhr3wgxVmSeiYinW+zlzQz3SXWaJmD1DuL05Jeq7nKw3SnbKmbleW5qrLG5vdyWe/A9sXhw== + /@types/connect/3.4.34: + dependencies: + '@types/node': 14.14.35 + dev: true + resolution: + integrity: sha512-ePPA/JuI+X0vb+gSWlPKOY0NdNAie/rPUqX2GUPpbZwiKTkSPhjXWuee47E4MtE54QVzGCQMQkAL6JhV2E1+cQ== + /@types/content-disposition/0.5.3: + dev: true + resolution: + integrity: sha512-P1bffQfhD3O4LW0ioENXUhZ9OIa0Zn+P7M+pWgkCKaT53wVLSq0mrKksCID/FGHpFhRSxRGhgrQmfhRuzwtKdg== + /@types/cookies/0.7.6: + dependencies: + '@types/connect': 3.4.34 + '@types/express': 4.17.11 + '@types/keygrip': 1.0.2 + '@types/node': 14.14.35 + dev: true + resolution: + integrity: sha512-FK4U5Qyn7/Sc5ih233OuHO0qAkOpEcD/eG6584yEiLKizTFRny86qHLe/rej3HFQrkBuUjF4whFliAdODbVN/w== + /@types/estree/0.0.39: + dev: true + resolution: + integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== + /@types/estree/0.0.46: + dev: true + resolution: + integrity: sha512-laIjwTQaD+5DukBZaygQ79K1Z0jb1bPEMRrkXSLjtCcZm+abyp5YbrqpSLzD42FwWW6gK/aS4NYpJ804nG2brg== + /@types/express-serve-static-core/4.17.19: + dependencies: + '@types/node': 14.14.35 + '@types/qs': 6.9.6 + '@types/range-parser': 1.2.3 + dev: true + resolution: + integrity: sha512-DJOSHzX7pCiSElWaGR8kCprwibCB/3yW6vcT8VG3P0SJjnv19gnWG/AZMfM60Xj/YJIp/YCaDHyvzsFVeniARA== + /@types/express/4.17.11: + dependencies: + '@types/body-parser': 1.19.0 + '@types/express-serve-static-core': 4.17.19 + '@types/qs': 6.9.6 + '@types/serve-static': 1.13.9 + dev: true + resolution: + integrity: sha512-no+R6rW60JEc59977wIxreQVsIEOAYwgCqldrA/vkpCnbD7MqTefO97lmoBe4WE0F156bC4uLSP1XHDOySnChg== + /@types/http-assert/1.5.1: + dev: true + resolution: + integrity: sha512-PGAK759pxyfXE78NbKxyfRcWYA/KwW17X290cNev/qAsn9eQIxkH4shoNBafH37wewhDG/0p1cHPbK6+SzZjWQ== + /@types/http-errors/1.8.0: + dev: true + resolution: + integrity: sha512-2aoSC4UUbHDj2uCsCxcG/vRMXey/m17bC7UwitVm5hn22nI8O8Y9iDpA76Orc+DWkQ4zZrOKEshCqR/jSuXAHA== + /@types/http-proxy/1.17.5: + dependencies: + '@types/node': 14.14.35 + dev: true + resolution: + integrity: sha512-GNkDE7bTv6Sf8JbV2GksknKOsk7OznNYHSdrtvPJXO0qJ9odZig6IZKUi5RFGi6d1bf6dgIAe4uXi3DBc7069Q== + /@types/json5/0.0.29: + dev: true + resolution: + integrity: sha1-7ihweulOEdK4J7y+UnC86n8+ce4= + /@types/jsonwebtoken/8.5.1: + dependencies: + '@types/node': 14.14.35 + dev: false + resolution: + integrity: sha512-rNAPdomlIUX0i0cg2+I+Q1wOUr531zHBQ+cV/28PJ39bSPKjahatZZ2LMuhiguETkCgLVzfruw/ZvNMNkKoSzw== + /@types/keygrip/1.0.2: + dev: true + resolution: + integrity: sha512-GJhpTepz2udxGexqos8wgaBx4I/zWIDPh/KOGEwAqtuGDkOUJu5eFvwmdBX4AmB8Odsr+9pHCQqiAqDL/yKMKw== + /@types/koa-compose/3.2.5: + dependencies: + '@types/koa': 2.13.1 + dev: true + resolution: + integrity: sha512-B8nG/OoE1ORZqCkBVsup/AKcvjdgoHnfi4pZMn5UwAPCbhk/96xyv284eBYW8JlQbQ7zDmnpFr68I/40mFoIBQ== + /@types/koa/2.13.1: + dependencies: + '@types/accepts': 1.3.5 + '@types/content-disposition': 0.5.3 + '@types/cookies': 0.7.6 + '@types/http-assert': 1.5.1 + '@types/http-errors': 1.8.0 + '@types/keygrip': 1.0.2 + '@types/koa-compose': 3.2.5 + '@types/node': 14.14.35 + dev: true + resolution: + integrity: sha512-Qbno7FWom9nNqu0yHZ6A0+RWt4mrYBhw3wpBAQ3+IuzGcLlfeYkzZrnMq5wsxulN2np8M4KKeUpTodsOsSad5Q== + /@types/lru-cache/5.1.0: + dev: true + resolution: + integrity: sha512-RaE0B+14ToE4l6UqdarKPnXwVDuigfFv+5j9Dze/Nqr23yyuqdNvzcZi3xB+3Agvi5R4EOgAksfv3lXX4vBt9w== + /@types/mime/1.3.2: + dev: true + resolution: + integrity: sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw== + /@types/mongodb/3.6.10: + dependencies: + '@types/bson': 4.0.3 + '@types/node': 14.14.35 + dev: false + resolution: + integrity: sha512-BkwAHFiZSSWdTIqbUVGmgvIsiXXjqAketeK7Izy7oSs6G3N8Bn993tK9eq6QEovQDx6OQ2FGP2KWDDxBzdlJ6Q== + /@types/node/12.20.6: + dev: false + resolution: + integrity: sha512-sRVq8d+ApGslmkE9e3i+D3gFGk7aZHAT+G4cIpIEdLJYPsWiSPwcAnJEjddLQQDqV3Ra2jOclX/Sv6YrvGYiWA== + /@types/node/14.14.35: + resolution: + integrity: sha512-Lt+wj8NVPx0zUmUwumiVXapmaLUcAk3yPuHCFVXras9k5VT9TdhJqKqGVUQCD60OTMCl0qxJ57OiTL0Mic3Iag== + /@types/parse-json/4.0.0: + dev: true + resolution: + integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== + /@types/pug/2.0.4: + dev: true + resolution: + integrity: sha1-h3L80EGOPNLMFxVV1zAHQVBR9LI= + /@types/qs/6.9.6: + dev: true + resolution: + integrity: sha512-0/HnwIfW4ki2D8L8c9GVcG5I72s9jP5GSLVF0VIXDW00kmIpA6O33G7a8n59Tmh7Nz0WUC3rSb7PTY/sdW2JzA== + /@types/range-parser/1.2.3: + dev: true + resolution: + integrity: sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA== + /@types/resolve/1.17.1: + dependencies: + '@types/node': 14.14.35 + dev: true + resolution: + integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw== + /@types/sass/1.16.0: + dependencies: + '@types/node': 14.14.35 + dev: true + resolution: + integrity: sha512-2XZovu4NwcqmtZtsBR5XYLw18T8cBCnU2USFHTnYLLHz9fkhnoEMoDsqShJIOFsFhn5aJHjweiUUdTrDGujegA== + /@types/serve-static/1.13.9: + dependencies: + '@types/mime': 1.3.2 + '@types/node': 14.14.35 + dev: true + resolution: + integrity: sha512-ZFqF6qa48XsPdjXV5Gsz0Zqmux2PerNd3a/ktL45mHpa19cuMi/cL8tcxdAx497yRh+QtYPuofjT9oWw9P7nkA== + /@types/tmp/0.2.0: + dev: true + resolution: + integrity: sha512-flgpHJjntpBAdJD43ShRosQvNC0ME97DCfGvZEDlAThQmnerRXrLbX6YgzRBQCZTthET9eAWFAMaYP0m0Y4HzQ== + /@vue/compiler-core/3.0.7: + dependencies: + '@babel/parser': 7.13.12 + '@babel/types': 7.13.12 + '@vue/shared': 3.0.7 + estree-walker: 2.0.2 + source-map: 0.6.1 + dev: true + resolution: + integrity: sha512-JFohgBXoyUc3mdeI2WxlhjQZ5fakfemJkZHX8Gu/nFbEg3+lKVUZmNKWmmnp9aOzJQZKoj77LjmFxiP+P+7lMQ== + /@vue/compiler-dom/3.0.7: + dependencies: + '@vue/compiler-core': 3.0.7 + '@vue/shared': 3.0.7 + dev: true + resolution: + integrity: sha512-VnIH9EbWQm/Tkcp+8dCaNVsVvhm/vxCrIKWRkXY9215hTqOqQOvejT8IMjd2kc++nIsYMsdQk6H9qqBvoLe/Cw== + /@vue/compiler-sfc/3.0.7_vue@3.0.7: + dependencies: + '@babel/parser': 7.13.12 + '@babel/types': 7.13.12 + '@vue/compiler-core': 3.0.7 + '@vue/compiler-dom': 3.0.7 + '@vue/compiler-ssr': 3.0.7 + '@vue/shared': 3.0.7 + consolidate: 0.16.0 + estree-walker: 2.0.2 + hash-sum: 2.0.0 + lru-cache: 5.1.1 + magic-string: 0.25.7 + merge-source-map: 1.1.0 + postcss: 8.2.8 + postcss-modules: 4.0.0_postcss@8.2.8 + postcss-selector-parser: 6.0.4 + source-map: 0.6.1 + vue: 3.0.7 + dev: true + peerDependencies: + vue: 3.0.7 + resolution: + integrity: sha512-37/QILpGE+J3V+bP9Slg9e6xGqfk+MmS2Yj8ChR4fS0/qWUU/YoYHE0GPIzjmBdH0JVOOmJqunxowIXmqNiHng== + /@vue/compiler-ssr/3.0.7: + dependencies: + '@vue/compiler-dom': 3.0.7 + '@vue/shared': 3.0.7 + dev: true + resolution: + integrity: sha512-nHRbHeSpfXwjypettjrA16TjgfDcPEwq3m/zHnGyLC1QqdLtklXmpSM43/CPwwTCRa/qdt0pldJf22MiCEuTSQ== + /@vue/reactivity/3.0.7: + dependencies: + '@vue/shared': 3.0.7 + dev: true + resolution: + integrity: sha512-FotWcNNaKhqpFZrdgsUOZ1enlJ5lhTt01CNTtLSyK7jYFgZBTuw8vKsEutZKDYZ1XKotOfoeO8N3pZQqmM6Etw== + /@vue/runtime-core/3.0.7: + dependencies: + '@vue/reactivity': 3.0.7 + '@vue/shared': 3.0.7 + dev: true + resolution: + integrity: sha512-DBAZAwVvdmMXuyd6/9qqj/kYr/GaLTmn1L2/QLxLwP+UfhIboiTSBc/tUUb8MRk7Bb98GzNeAWkkT6AfooS3dQ== + /@vue/runtime-dom/3.0.7: + dependencies: + '@vue/runtime-core': 3.0.7 + '@vue/shared': 3.0.7 + csstype: 2.6.16 + dev: true + resolution: + integrity: sha512-Oij4ruOtnpQpCj+/Q3JPzgpTJ1Q7+N67pA53A8KVITEtxfvKL46NN6dhAZ5NGqwX6RWZpYqWQNewITeF0pHr8g== + /@vue/shared/3.0.7: + dev: true + resolution: + integrity: sha512-dn5FyfSc4ky424jH4FntiHno7Ss5yLkqKNmM/NXwANRnlkmqu74pnGetexDFVG5phMk9/FhwovUZCWGxsotVKg== + /@zerodevx/svelte-toast/0.1.4: + dev: false + resolution: + integrity: sha512-UYtwgH0CISHE1UNpQi/1hvpFSWhjpvzSSDNPsCc5PTsCeW1g7PBEe+lnOMe1iSYiqtRx5R5gpDxMyj+9KH9Vjw== + /abab/2.0.5: + dev: false + resolution: + integrity: sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q== + /abbrev/1.1.1: + dev: true + resolution: + integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + /abstract-logging/2.0.1: + dev: false + resolution: + integrity: sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA== + /accepts/1.3.7: + dependencies: + mime-types: 2.1.29 + negotiator: 0.6.2 + dev: true + engines: + node: '>= 0.6' + resolution: + integrity: sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== + /acorn-globals/6.0.0: + dependencies: + acorn: 7.4.1 + acorn-walk: 7.2.0 + dev: false + resolution: + integrity: sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg== + /acorn-jsx/5.3.1_acorn@7.4.1: + dependencies: + acorn: 7.4.1 + dev: true + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + resolution: + integrity: sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng== + /acorn-node/1.8.2: + dependencies: + acorn: 7.4.1 + acorn-walk: 7.2.0 + xtend: 4.0.2 + dev: true + resolution: + integrity: sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A== + /acorn-walk/7.2.0: + engines: + node: '>=0.4.0' + resolution: + integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== + /acorn/7.4.1: + engines: + node: '>=0.4.0' + hasBin: true + resolution: + integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== + /acorn/8.1.0: + engines: + node: '>=0.4.0' + hasBin: true + resolution: + integrity: sha512-LWCF/Wn0nfHOmJ9rzQApGnxnvgfROzGilS8936rqN/lfcYkY9MYZzdMqN+2NJ4SlTc+m5HiSa+kNfDtI64dwUA== + /agent-base/6.0.2: + dependencies: + debug: 4.3.1 + dev: true + engines: + node: '>= 6.0.0' + resolution: + integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + /ajv/6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + resolution: + integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + /ansi-align/3.0.0: + dependencies: + string-width: 3.1.0 + dev: true + resolution: + integrity: sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw== + /ansi-colors/4.1.1: + dev: true + engines: + node: '>=6' + resolution: + integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== + /ansi-regex/4.1.0: + dev: true + engines: + node: '>=6' + resolution: + integrity: sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== + /ansi-regex/5.0.0: + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== + /ansi-styles/3.2.1: + dependencies: + color-convert: 1.9.3 + engines: + node: '>=4' + resolution: + integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + /ansi-styles/4.3.0: + dependencies: + color-convert: 2.0.1 + engines: + node: '>=8' + resolution: + integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + /any-promise/1.3.0: + dev: true + resolution: + integrity: sha1-q8av7tzqUugJzcA3au0845Y10X8= + /anymatch/3.1.1: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.2.2 + dev: true + engines: + node: '>= 8' + resolution: + integrity: sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== + /archy/1.0.0: + dev: false + resolution: + integrity: sha1-+cjBN1fMHde8N5rHeyxipcKGjEA= + /argparse/1.0.10: + dependencies: + sprintf-js: 1.0.3 + dev: true + resolution: + integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + /argparse/2.0.1: + dev: false + resolution: + integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + /array-flatten/1.1.1: + dev: true + optional: true + resolution: + integrity: sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= + /array-includes/3.1.3: + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.3 + es-abstract: 1.18.0 + get-intrinsic: 1.1.1 + is-string: 1.0.5 + dev: true + engines: + node: '>= 0.4' + resolution: + integrity: sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A== + /array-union/2.1.0: + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + /array.prototype.flat/1.2.4: + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.3 + es-abstract: 1.18.0 + dev: true + engines: + node: '>= 0.4' + resolution: + integrity: sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg== + /array.prototype.flatmap/1.2.4: + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.3 + es-abstract: 1.18.0 + function-bind: 1.1.1 + dev: true + engines: + node: '>= 0.4' + resolution: + integrity: sha512-r9Z0zYoxqHz60vvQbWEdXIEtCwHF0yxaWfno9qzXeNHvfyl3BZqygmGzb84dsubyaXLH4husF+NFgMSdpZhk2Q== + /asn1/0.2.4: + dependencies: + safer-buffer: 2.1.2 + dev: false + resolution: + integrity: sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== + /assert-plus/1.0.0: + dev: false + engines: + node: '>=0.8' + resolution: + integrity: sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= + /astral-regex/1.0.0: + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== + /async-limiter/1.0.1: + dev: true + optional: true + resolution: + integrity: sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== + /asynckit/0.4.0: + dev: false + resolution: + integrity: sha1-x57Zf380y48robyXkLzDZkdLS3k= + /at-least-node/1.0.0: + engines: + node: '>= 4.0.0' + resolution: + integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + /atomic-sleep/1.0.0: + dev: false + engines: + node: '>=8.0.0' + resolution: + integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ== + /autoprefixer/9.8.6: + dependencies: + browserslist: 4.16.3 + caniuse-lite: 1.0.30001204 + colorette: 1.2.2 + normalize-range: 0.1.2 + num2fraction: 1.2.2 + postcss: 7.0.35 + postcss-value-parser: 4.1.0 + dev: true + hasBin: true + resolution: + integrity: sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg== + /avvio/7.2.1: + dependencies: + archy: 1.0.0 + debug: 4.3.1 + fastq: 1.11.0 + queue-microtask: 1.2.3 + dev: false + resolution: + integrity: sha512-b+gox68dqD6c3S3t+bZBKN6rYbVWdwpN12sHQLFTiacDT2rcq7fm07Ww+IKt/AvAkyCIe1f5ArP1bC/vAlx97A== + /aws-sign2/0.7.0: + dev: false + resolution: + integrity: sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= + /aws4/1.11.0: + dev: false + resolution: + integrity: sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== + /axios/0.21.1: + dependencies: + follow-redirects: 1.13.3 + dev: false + resolution: + integrity: sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA== + /balanced-match/1.0.0: + resolution: + integrity: sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + /base64-js/1.5.1: + resolution: + integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + /bcrypt-pbkdf/1.0.2: + dependencies: + tweetnacl: 0.14.5 + dev: false + resolution: + integrity: sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= + /big.js/5.2.2: + dev: true + resolution: + integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + /binary-extensions/2.2.0: + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + /bl/2.2.1: + dependencies: + readable-stream: 2.3.7 + safe-buffer: 5.2.1 + resolution: + integrity: sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g== + /bl/4.1.0: + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.0 + resolution: + integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + /bluebird/3.5.1: + dev: false + resolution: + integrity: sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA== + /bluebird/3.7.2: + dev: true + resolution: + integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + /body-parser/1.19.0: + dependencies: + bytes: 3.1.0 + content-type: 1.0.4 + debug: 2.6.9 + depd: 1.1.2 + http-errors: 1.7.2 + iconv-lite: 0.4.24 + on-finished: 2.3.0 + qs: 6.7.0 + raw-body: 2.4.0 + type-is: 1.6.18 + dev: true + engines: + node: '>= 0.8' + optional: true + resolution: + integrity: sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== + /boxen/4.2.0: + dependencies: + ansi-align: 3.0.0 + camelcase: 5.3.1 + chalk: 3.0.0 + cli-boxes: 2.2.1 + string-width: 4.2.2 + term-size: 2.2.1 + type-fest: 0.8.1 + widest-line: 3.1.0 + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ== + /brace-expansion/1.1.11: + dependencies: + balanced-match: 1.0.0 + concat-map: 0.0.1 + resolution: + integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + /braces/3.0.2: + dependencies: + fill-range: 7.0.1 + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + /brotli-size/4.0.0: + dependencies: + duplexer: 0.1.1 + dev: true + engines: + node: '>= 10.16.0' + resolution: + integrity: sha512-uA9fOtlTRC0iqKfzff1W34DXUA3GyVqbUaeo3Rw3d4gd1eavKVCETXrn3NzO74W+UVkG3UHu8WxUi+XvKI/huA== + /browser-process-hrtime/1.0.0: + dev: false + resolution: + integrity: sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== + /browserslist/4.16.3: + dependencies: + caniuse-lite: 1.0.30001204 + colorette: 1.2.2 + electron-to-chromium: 1.3.698 + escalade: 3.1.1 + node-releases: 1.1.71 + dev: true + engines: + node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7 + hasBin: true + resolution: + integrity: sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw== + /bson/1.1.6: + engines: + node: '>=0.6.19' + resolution: + integrity: sha512-EvVNVeGo4tHxwi8L6bPj3y3itEvStdwvvlojVxxbyYfoaxJ6keLgrTuKdyfEAszFK+H3olzBuafE0yoh0D1gdg== + /buffer-crc32/0.2.13: + dev: true + resolution: + integrity: sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= + /buffer-equal-constant-time/1.0.1: + dev: false + resolution: + integrity: sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk= + /buffer-from/1.1.1: + dev: true + resolution: + integrity: sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== + /buffer/5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + resolution: + integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + /bufferutil/4.0.3: + dependencies: + node-gyp-build: 4.2.3 + dev: false + requiresBuild: true + resolution: + integrity: sha512-yEYTwGndELGvfXsImMBLop58eaGW+YdONi1fNjTINSY98tmMmFijBG6WXgdkfuLNt4imzQNtIE+eBp1PVpMCSw== + /builtin-modules/1.1.1: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= + /builtin-modules/3.2.0: + dev: true + engines: + node: '>=6' + resolution: + integrity: sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA== + /bytes/3.1.0: + dev: true + engines: + node: '>= 0.8' + resolution: + integrity: sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== + /cac/6.7.2: + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-w0bH1IF9rEjdi0a6lTtlXYT+vBZEJL9oytaXXRdsD68MH6+SrZGOGsu7s2saHQvYXqwo/wBdkW75tt8wFpj+mw== + /cache-content-type/1.0.1: + dependencies: + mime-types: 2.1.29 + ylru: 1.2.1 + dev: true + engines: + node: '>= 6.0.0' + resolution: + integrity: sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA== + /cacheable-request/6.1.0: + dependencies: + clone-response: 1.0.2 + get-stream: 5.2.0 + http-cache-semantics: 4.1.0 + keyv: 3.1.0 + lowercase-keys: 2.0.0 + normalize-url: 4.5.0 + responselike: 1.0.2 + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg== + /call-bind/1.0.2: + dependencies: + function-bind: 1.1.1 + get-intrinsic: 1.1.1 + dev: true + resolution: + integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + /callsites/3.1.0: + dev: true + engines: + node: '>=6' + resolution: + integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + /camelcase-css/2.0.1: + dev: true + engines: + node: '>= 6' + resolution: + integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== + /camelcase/5.3.1: + dev: true + engines: + node: '>=6' + resolution: + integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + /camelcase/6.2.0: + dev: true + engines: + node: '>=10' + resolution: + integrity: sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== + /caniuse-lite/1.0.30001204: + dev: true + resolution: + integrity: sha512-JUdjWpcxfJ9IPamy2f5JaRDCaqJOxDzOSKtbdx4rH9VivMd1vIzoPumsJa9LoMIi4Fx2BV2KZOxWhNkBjaYivQ== + /caseless/0.12.0: + dev: false + resolution: + integrity: sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= + /chalk/2.4.2: + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + engines: + node: '>=4' + resolution: + integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + /chalk/3.0.0: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== + /chalk/4.1.0: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + engines: + node: '>=10' + resolution: + integrity: sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== + /cheap-watch/1.0.3: + dev: false + engines: + node: '>=8' + resolution: + integrity: sha512-xC5CruMhLzjPwJ5ecUxGu1uGmwJQykUhqd2QrCrYbwvsFYdRyviu6jG9+pccwDXJR/OpmOTOJ9yLFunVgQu9wg== + /chokidar/3.5.1: + dependencies: + anymatch: 3.1.1 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.1 + normalize-path: 3.0.0 + readdirp: 3.5.0 + dev: true + engines: + node: '>= 8.10.0' + optionalDependencies: + fsevents: 2.3.2 + resolution: + integrity: sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw== + /chownr/1.1.4: + dev: false + resolution: + integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + /ci-info/2.0.0: + dev: true + resolution: + integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + /clean-css/4.2.3: + dependencies: + source-map: 0.6.1 + dev: true + engines: + node: '>= 4.0' + resolution: + integrity: sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA== + /cli-boxes/2.2.1: + dev: true + engines: + node: '>=6' + resolution: + integrity: sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== + /cli-cursor/3.1.0: + dependencies: + restore-cursor: 3.1.0 + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + /cli-spinners/2.6.0: + dev: true + engines: + node: '>=6' + resolution: + integrity: sha512-t+4/y50K/+4xcCRosKkA7W4gTr1MySvLV0q+PxmG7FJ5g+66ChKurYjxBCjHggHH3HA5Hh9cy+lcUGWDqVH+4Q== + /cliui/7.0.4: + dependencies: + string-width: 4.2.2 + strip-ansi: 6.0.0 + wrap-ansi: 7.0.0 + dev: true + optional: true + resolution: + integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + /clone-response/1.0.2: + dependencies: + mimic-response: 1.0.1 + dev: true + resolution: + integrity: sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws= + /clone/1.0.4: + dev: true + engines: + node: '>=0.8' + resolution: + integrity: sha1-2jCcwmPfFZlMaIypAheco8fNfH4= + /co/4.6.0: + dev: true + engines: + iojs: '>= 1.0.0' + node: '>= 0.12.0' + resolution: + integrity: sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= + /color-convert/1.9.3: + dependencies: + color-name: 1.1.3 + resolution: + integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + /color-convert/2.0.1: + dependencies: + color-name: 1.1.4 + engines: + node: '>=7.0.0' + resolution: + integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + /color-name/1.1.3: + resolution: + integrity: sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + /color-name/1.1.4: + resolution: + integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + /color-string/1.5.5: + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.2 + dev: true + resolution: + integrity: sha512-jgIoum0OfQfq9Whcfc2z/VhCNcmQjWbey6qBX0vqt7YICflUmBCh9E9CiQD5GSJ+Uehixm3NUwHVhqUAWRivZg== + /color/3.1.3: + dependencies: + color-convert: 1.9.3 + color-string: 1.5.5 + dev: true + resolution: + integrity: sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ== + /colorette/1.2.2: + dev: true + resolution: + integrity: sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w== + /combined-stream/1.0.8: + dependencies: + delayed-stream: 1.0.0 + dev: false + engines: + node: '>= 0.8' + resolution: + integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + /commander/2.20.3: + dev: true + resolution: + integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + /commander/6.2.1: + engines: + node: '>= 6' + resolution: + integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA== + /commander/7.2.0: + dev: false + engines: + node: '>= 10' + resolution: + integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + /commondir/1.0.1: + dev: true + resolution: + integrity: sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= + /concat-map/0.0.1: + resolution: + integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + /configent/2.2.0: + dependencies: + dotenv: 8.2.0 + dev: false + resolution: + integrity: sha512-yIN6zfOWk2nycNJ2JFNiWEai0oiqAhISIht8+pbEBP8bdcpwoQ74AhCZPbUv9aRVJwo7wh1MbCBDUV44UJa7Kw== + /configstore/5.0.1: + dependencies: + dot-prop: 5.3.0 + graceful-fs: 4.2.6 + make-dir: 3.1.0 + unique-string: 2.0.0 + write-file-atomic: 3.0.3 + xdg-basedir: 4.0.0 + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA== + /consolidate/0.16.0: + dependencies: + bluebird: 3.7.2 + dev: true + engines: + node: '>= 0.10.0' + resolution: + integrity: sha512-Nhl1wzCslqXYTJVDyJCu3ODohy9OfBMB5uD2BiBTzd7w+QY0lBzafkR8y8755yMYHAaMD4NuzbAw03/xzfw+eQ== + /contains-path/0.1.0: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo= + /content-disposition/0.5.3: + dependencies: + safe-buffer: 5.1.2 + dev: true + engines: + node: '>= 0.6' + resolution: + integrity: sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== + /content-type/1.0.4: + dev: true + engines: + node: '>= 0.6' + resolution: + integrity: sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + /convert-source-map/1.7.0: + dependencies: + safe-buffer: 5.1.2 + dev: true + optional: true + resolution: + integrity: sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== + /cookie-signature/1.0.6: + dev: true + optional: true + resolution: + integrity: sha1-4wOogrNCzD7oylE6eZmXNNqzriw= + /cookie/0.4.0: + dev: true + engines: + node: '>= 0.6' + optional: true + resolution: + integrity: sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== + /cookie/0.4.1: + dev: false + engines: + node: '>= 0.6' + resolution: + integrity: sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA== + /cookies/0.8.0: + dependencies: + depd: 2.0.0 + keygrip: 1.1.0 + dev: true + engines: + node: '>= 0.8' + resolution: + integrity: sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow== + /core-util-is/1.0.2: + resolution: + integrity: sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + /cosmiconfig/7.0.0: + dependencies: + '@types/parse-json': 4.0.0 + import-fresh: 3.3.0 + parse-json: 5.2.0 + path-type: 4.0.0 + yaml: 1.10.2 + dev: true + engines: + node: '>=10' + resolution: + integrity: sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA== + /cross-spawn/6.0.5: + dependencies: + nice-try: 1.0.5 + path-key: 2.0.1 + semver: 5.7.1 + shebang-command: 1.2.0 + which: 1.3.1 + dev: true + engines: + node: '>=4.8' + resolution: + integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + /cross-spawn/7.0.3: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: true + engines: + node: '>= 8' + resolution: + integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + /crypto-random-string/2.0.0: + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== + /css-blank-pseudo/0.1.4: + dependencies: + postcss: 7.0.35 + dev: true + engines: + node: '>=6.0.0' + hasBin: true + resolution: + integrity: sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w== + /css-has-pseudo/0.10.0: + dependencies: + postcss: 7.0.35 + postcss-selector-parser: 5.0.0 + dev: true + engines: + node: '>=6.0.0' + hasBin: true + resolution: + integrity: sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ== + /css-prefers-color-scheme/3.1.1: + dependencies: + postcss: 7.0.35 + dev: true + engines: + node: '>=6.0.0' + hasBin: true + resolution: + integrity: sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg== + /css-unit-converter/1.1.2: + dev: true + resolution: + integrity: sha512-IiJwMC8rdZE0+xiEZHeru6YoONC4rfPMqGm2W85jMIbkFvv5nFTwJVFHam2eFrN6txmoUYFAFXiv8ICVeTO0MA== + /cssdb/4.4.0: + dev: true + resolution: + integrity: sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ== + /cssesc/2.0.0: + dev: true + engines: + node: '>=4' + hasBin: true + resolution: + integrity: sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg== + /cssesc/3.0.0: + dev: true + engines: + node: '>=4' + hasBin: true + resolution: + integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + /cssom/0.3.8: + dev: false + resolution: + integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== + /cssom/0.4.4: + dev: false + resolution: + integrity: sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw== + /cssstyle/2.3.0: + dependencies: + cssom: 0.3.8 + dev: false + engines: + node: '>=8' + resolution: + integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== + /csstype/2.6.16: + dev: true + resolution: + integrity: sha512-61FBWoDHp/gRtsoDkq/B1nWrCUG/ok1E3tUrcNbZjsE9Cxd9yzUirjS3+nAATB8U4cTtaQmAHbNndoFz5L6C9Q== + /cuid/2.1.8: + dev: false + resolution: + integrity: sha512-xiEMER6E7TlTPnDxrM4eRiC6TRgjNX9xzEZ5U/Se2YJKr7Mq4pJn/2XEHjl3STcSh96GmkHPcBXLES8M29wyyg== + /dashdash/1.14.1: + dependencies: + assert-plus: 1.0.0 + dev: false + engines: + node: '>=0.10' + resolution: + integrity: sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= + /data-urls/2.0.0: + dependencies: + abab: 2.0.5 + whatwg-mimetype: 2.3.0 + whatwg-url: 8.4.0 + dev: false + engines: + node: '>=10' + resolution: + integrity: sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ== + /dayjs/1.10.4: + dev: false + resolution: + integrity: sha512-RI/Hh4kqRc1UKLOAf/T5zdMMX5DQIlDxwUe3wSyMMnEbGunnpENCdbUgM+dW7kXidZqCttBrmw7BhN4TMddkCw== + /debug/2.6.9: + dependencies: + ms: 2.0.0 + resolution: + integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + /debug/3.1.0: + dependencies: + ms: 2.0.0 + resolution: + integrity: sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== + /debug/3.2.7: + dependencies: + ms: 2.1.3 + dev: true + resolution: + integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + /debug/4.3.1: + dependencies: + ms: 2.1.2 + engines: + node: '>=6.0' + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + resolution: + integrity: sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== + /decimal.js/10.2.1: + dev: false + resolution: + integrity: sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw== + /decompress-response/3.3.0: + dependencies: + mimic-response: 1.0.1 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M= + /deep-equal/1.0.1: + dev: true + resolution: + integrity: sha1-9dJgKStmDghO/0zbyfCK0yR0SLU= + /deep-extend/0.6.0: + dev: true + engines: + node: '>=4.0.0' + resolution: + integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + /deep-is/0.1.3: + resolution: + integrity: sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= + /deepmerge/4.2.2: + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== + /defaults/1.0.3: + dependencies: + clone: 1.0.4 + dev: true + resolution: + integrity: sha1-xlYFHpgX2f8I7YgUd/P+QBnz730= + /defer-to-connect/1.1.3: + dev: true + resolution: + integrity: sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== + /define-properties/1.1.3: + dependencies: + object-keys: 1.1.1 + dev: true + engines: + node: '>= 0.4' + resolution: + integrity: sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + /defined/1.0.0: + dev: true + resolution: + integrity: sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= + /degit/2.8.0: + dev: true + engines: + node: '>=8.0.0' + hasBin: true + resolution: + integrity: sha512-nxQr1Ep4NSGDIqQ3HSMNgnPYaxPfPhHdrpgSNO2EczO86zN7NJJ1i/59GM25vgC45ANQUazZ/3Z+iyeZCmGwhg== + /delayed-stream/1.0.0: + dev: false + engines: + node: '>=0.4.0' + resolution: + integrity: sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + /delegates/1.0.0: + dev: true + resolution: + integrity: sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= + /denque/1.5.0: + engines: + node: '>=0.10' + resolution: + integrity: sha512-CYiCSgIF1p6EUByQPlGkKnP1M9g0ZV3qMIrqMqZqdwazygIA/YP2vrbcyl1h/WppKJTdl1F85cXIle+394iDAQ== + /depd/1.1.2: + engines: + node: '>= 0.6' + resolution: + integrity: sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + /depd/2.0.0: + dev: true + engines: + node: '>= 0.8' + resolution: + integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + /destroy/1.0.4: + resolution: + integrity: sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= + /detect-indent/6.0.0: + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-oSyFlqaTHCItVRGK5RmrmjB+CmaMOW7IaNA/kdxqhoa6d17j/5ce9O9eWXmV/KEdRwqpQA+Vqe8a8Bsybu4YnA== + /detective/5.2.0: + dependencies: + acorn-node: 1.8.2 + defined: 1.0.0 + minimist: 1.2.5 + dev: true + engines: + node: '>=0.8.0' + hasBin: true + resolution: + integrity: sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg== + /didyoumean/1.2.1: + dev: true + resolution: + integrity: sha1-6S7f2tplN9SE1zwBcv0eugxJdv8= + /dir-glob/3.0.1: + dependencies: + path-type: 4.0.0 + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + /docker-modem/2.1.4: + dependencies: + debug: 4.3.1 + readable-stream: 3.6.0 + split-ca: 1.0.1 + ssh2: 0.8.9 + dev: false + engines: + node: '>= 8.0' + resolution: + integrity: sha512-vDTzZjjO1sXMY7m0xKjGdFMMZL7vIUerkC3G4l6rnrpOET2M6AOufM8ajmQoOB+6RfSn6I/dlikCUq/Y91Q1sQ== + /dockerode/3.2.1: + dependencies: + docker-modem: 2.1.4 + tar-fs: 2.0.1 + dev: false + engines: + node: '>= 8.0' + resolution: + integrity: sha512-XsSVB5Wu5HWMg1aelV5hFSqFJaKS5x1aiV/+sT7YOzOq1IRl49I/UwV8Pe4x6t0iF9kiGkWu5jwfvbkcFVupBw== + /doctrine/1.5.0: + dependencies: + esutils: 2.0.3 + isarray: 1.0.0 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-N53Ocw9hZvds76TmcHoVmwLFpvo= + /doctrine/2.1.0: + dependencies: + esutils: 2.0.3 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + /doctrine/3.0.0: + dependencies: + esutils: 2.0.3 + dev: true + engines: + node: '>=6.0.0' + resolution: + integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + /domexception/2.0.1: + dependencies: + webidl-conversions: 5.0.0 + dev: false + engines: + node: '>=8' + resolution: + integrity: sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg== + /dot-prop/5.3.0: + dependencies: + is-obj: 2.0.0 + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== + /dotenv-expand/5.1.0: + resolution: + integrity: sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA== + /dotenv/8.2.0: + engines: + node: '>=8' + resolution: + integrity: sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw== + /duplexer/0.1.1: + dev: true + resolution: + integrity: sha1-rOb/gIwc5mtX0ev5eXessCM0z8E= + /duplexer3/0.1.4: + dev: true + resolution: + integrity: sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= + /ecc-jsbn/0.1.2: + dependencies: + jsbn: 0.1.1 + safer-buffer: 2.1.2 + dev: false + resolution: + integrity: sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= + /ecdsa-sig-formatter/1.0.11: + dependencies: + safe-buffer: 5.2.1 + dev: false + resolution: + integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== + /ee-first/1.1.1: + resolution: + integrity: sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= + /electron-to-chromium/1.3.698: + dev: true + resolution: + integrity: sha512-VEXDzYblnlT+g8Q3gedwzgKOso1evkeJzV8lih7lV8mL8eAnGVnKyC3KsFT6S+R5PQO4ffdr1PI16/ElibY/kQ== + /emoji-regex/7.0.3: + dev: true + resolution: + integrity: sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + /emoji-regex/8.0.0: + dev: true + resolution: + integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + /emojis-list/3.0.0: + dev: true + engines: + node: '>= 4' + resolution: + integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== + /encodeurl/1.0.2: + engines: + node: '>= 0.8' + resolution: + integrity: sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + /end-of-stream/1.4.4: + dependencies: + once: 1.4.0 + resolution: + integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + /enquirer/2.3.6: + dependencies: + ansi-colors: 4.1.1 + dev: true + engines: + node: '>=8.6' + resolution: + integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== + /env-schema/2.1.0: + dependencies: + ajv: 6.12.6 + dotenv: 8.2.0 + dotenv-expand: 5.1.0 + dev: false + resolution: + integrity: sha512-qvbmiB+31WJlDs4i9/R8jxEYfq3A0K20QzjGLR4cnlX3SD55ljVEULHXHU1iaPdWOkTSho/TajNzZp3jX3Shsw== + /error-ex/1.3.2: + dependencies: + is-arrayish: 0.2.1 + dev: true + resolution: + integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + /es-abstract/1.18.0: + dependencies: + call-bind: 1.0.2 + es-to-primitive: 1.2.1 + function-bind: 1.1.1 + get-intrinsic: 1.1.1 + has: 1.0.3 + has-symbols: 1.0.2 + is-callable: 1.2.3 + is-negative-zero: 2.0.1 + is-regex: 1.1.2 + is-string: 1.0.5 + object-inspect: 1.9.0 + object-keys: 1.1.1 + object.assign: 4.1.2 + string.prototype.trimend: 1.0.4 + string.prototype.trimstart: 1.0.4 + unbox-primitive: 1.0.0 + dev: true + engines: + node: '>= 0.4' + resolution: + integrity: sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw== + /es-module-lexer/0.3.26: + dev: true + resolution: + integrity: sha512-Va0Q/xqtrss45hWzP8CZJwzGSZJjDM5/MJRE3IXXnUCcVLElR9BRaE9F62BopysASyc4nM3uwhSW7FFB9nlWAA== + /es-to-primitive/1.2.1: + dependencies: + is-callable: 1.2.3 + is-date-object: 1.0.2 + is-symbol: 1.0.3 + dev: true + engines: + node: '>= 0.4' + resolution: + integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + /es6-promise/4.2.8: + dev: true + optional: true + resolution: + integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== + /esbuild/0.8.57: + dev: true + hasBin: true + requiresBuild: true + resolution: + integrity: sha512-j02SFrUwFTRUqiY0Kjplwjm1psuzO1d6AjaXKuOR9hrY0HuPsT6sV42B6myW34h1q4CRy+Y3g4RU/cGJeI/nNA== + /escalade/3.1.1: + dev: true + engines: + node: '>=6' + resolution: + integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + /escape-goat/2.1.1: + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q== + /escape-html/1.0.3: + resolution: + integrity: sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= + /escape-string-regexp/1.0.5: + engines: + node: '>=0.8.0' + resolution: + integrity: sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + /escodegen/2.0.0: + dependencies: + esprima: 4.0.1 + estraverse: 5.2.0 + esutils: 2.0.3 + optionator: 0.8.3 + dev: false + engines: + node: '>=6.0' + hasBin: true + optionalDependencies: + source-map: 0.6.1 + resolution: + integrity: sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== + /eslint-config-standard-jsx/10.0.0_d4901a613f352504e6e19464e186980c: + dependencies: + eslint: 7.13.0 + eslint-plugin-react: 7.21.5_eslint@7.13.0 + dev: true + peerDependencies: + eslint: ^7.12.1 + eslint-plugin-react: ^7.21.5 + resolution: + integrity: sha512-hLeA2f5e06W1xyr/93/QJulN/rLbUVUmqTlexv9PRKHFwEC9ffJcH2LvJhMoEqYQBEYafedgGZXH2W8NUpt5lA== + /eslint-config-standard/16.0.2_1ebed8346196ff7bde7431d183a61a72: + dependencies: + eslint: 7.13.0 + eslint-plugin-import: 2.22.1_eslint@7.13.0 + eslint-plugin-node: 11.1.0_eslint@7.13.0 + eslint-plugin-promise: 4.2.1 + dev: true + peerDependencies: + eslint: ^7.12.1 + eslint-plugin-import: ^2.22.1 + eslint-plugin-node: ^11.1.0 + eslint-plugin-promise: ^4.2.1 + resolution: + integrity: sha512-fx3f1rJDsl9bY7qzyX8SAtP8GBSk6MfXFaTfaGgk12aAYW4gJSyRm7dM790L6cbXv63fvjY4XeSzXnb4WM+SKw== + /eslint-import-resolver-node/0.3.4: + dependencies: + debug: 2.6.9 + resolve: 1.20.0 + dev: true + resolution: + integrity: sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA== + /eslint-module-utils/2.6.0: + dependencies: + debug: 2.6.9 + pkg-dir: 2.0.0 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA== + /eslint-plugin-es/3.0.1_eslint@7.13.0: + dependencies: + eslint: 7.13.0 + eslint-utils: 2.1.0 + regexpp: 3.1.0 + dev: true + engines: + node: '>=8.10.0' + peerDependencies: + eslint: '>=4.19.1' + resolution: + integrity: sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ== + /eslint-plugin-import/2.22.1_eslint@7.13.0: + dependencies: + array-includes: 3.1.3 + array.prototype.flat: 1.2.4 + contains-path: 0.1.0 + debug: 2.6.9 + doctrine: 1.5.0 + eslint: 7.13.0 + eslint-import-resolver-node: 0.3.4 + eslint-module-utils: 2.6.0 + has: 1.0.3 + minimatch: 3.0.4 + object.values: 1.1.3 + read-pkg-up: 2.0.0 + resolve: 1.20.0 + tsconfig-paths: 3.9.0 + dev: true + engines: + node: '>=4' + peerDependencies: + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 + resolution: + integrity: sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw== + /eslint-plugin-node/11.1.0_eslint@7.13.0: + dependencies: + eslint: 7.13.0 + eslint-plugin-es: 3.0.1_eslint@7.13.0 + eslint-utils: 2.1.0 + ignore: 5.1.8 + minimatch: 3.0.4 + resolve: 1.20.0 + semver: 6.3.0 + dev: true + engines: + node: '>=8.10.0' + peerDependencies: + eslint: '>=5.16.0' + resolution: + integrity: sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g== + /eslint-plugin-promise/4.2.1: + dev: true + engines: + node: '>=6' + resolution: + integrity: sha512-VoM09vT7bfA7D+upt+FjeBO5eHIJQBUWki1aPvB+vbNiHS3+oGIJGIeyBtKQTME6UPXXy3vV07OL1tHd3ANuDw== + /eslint-plugin-react/7.21.5_eslint@7.13.0: + dependencies: + array-includes: 3.1.3 + array.prototype.flatmap: 1.2.4 + doctrine: 2.1.0 + eslint: 7.13.0 + has: 1.0.3 + jsx-ast-utils: 3.2.0 + object.entries: 1.1.3 + object.fromentries: 2.0.4 + object.values: 1.1.3 + prop-types: 15.7.2 + resolve: 1.20.0 + string.prototype.matchall: 4.0.4 + dev: true + engines: + node: '>=4' + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 + resolution: + integrity: sha512-8MaEggC2et0wSF6bUeywF7qQ46ER81irOdWS4QWxnnlAEsnzeBevk1sWh7fhpCghPpXb+8Ks7hvaft6L/xsR6g== + /eslint-scope/5.1.1: + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + dev: true + engines: + node: '>=8.0.0' + resolution: + integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + /eslint-utils/2.1.0: + dependencies: + eslint-visitor-keys: 1.3.0 + dev: true + engines: + node: '>=6' + resolution: + integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== + /eslint-visitor-keys/1.3.0: + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== + /eslint-visitor-keys/2.0.0: + dev: true + engines: + node: '>=10' + resolution: + integrity: sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ== + /eslint/7.13.0: + dependencies: + '@babel/code-frame': 7.12.13 + '@eslint/eslintrc': 0.2.2 + ajv: 6.12.6 + chalk: 4.1.0 + cross-spawn: 7.0.3 + debug: 4.3.1 + doctrine: 3.0.0 + enquirer: 2.3.6 + eslint-scope: 5.1.1 + eslint-utils: 2.1.0 + eslint-visitor-keys: 2.0.0 + espree: 7.3.1 + esquery: 1.4.0 + esutils: 2.0.3 + file-entry-cache: 5.0.1 + functional-red-black-tree: 1.0.1 + glob-parent: 5.1.2 + globals: 12.4.0 + ignore: 4.0.6 + import-fresh: 3.3.0 + imurmurhash: 0.1.4 + is-glob: 4.0.1 + js-yaml: 3.14.1 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash: 4.17.21 + minimatch: 3.0.4 + natural-compare: 1.4.0 + optionator: 0.9.1 + progress: 2.0.3 + regexpp: 3.1.0 + semver: 7.3.5 + strip-ansi: 6.0.0 + strip-json-comments: 3.1.1 + table: 5.4.6 + text-table: 0.2.0 + v8-compile-cache: 2.3.0 + dev: true + engines: + node: ^10.12.0 || >=12.0.0 + hasBin: true + resolution: + integrity: sha512-uCORMuOO8tUzJmsdRtrvcGq5qposf7Rw0LwkTJkoDbOycVQtQjmnhZSuLQnozLE4TmAzlMVV45eCHmQ1OpDKUQ== + /esm/3.2.25: + dev: false + engines: + node: '>=6' + resolution: + integrity: sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA== + /espree/7.3.1: + dependencies: + acorn: 7.4.1 + acorn-jsx: 5.3.1_acorn@7.4.1 + eslint-visitor-keys: 1.3.0 + dev: true + engines: + node: ^10.12.0 || >=12.0.0 + resolution: + integrity: sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== + /esprima/4.0.1: + engines: + node: '>=4' + hasBin: true + resolution: + integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + /esquery/1.4.0: + dependencies: + estraverse: 5.2.0 + dev: true + engines: + node: '>=0.10' + resolution: + integrity: sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== + /esrecurse/4.3.0: + dependencies: + estraverse: 5.2.0 + dev: true + engines: + node: '>=4.0' + resolution: + integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + /estraverse/4.3.0: + dev: true + engines: + node: '>=4.0' + resolution: + integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + /estraverse/5.2.0: + engines: + node: '>=4.0' + resolution: + integrity: sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== + /estree-walker/0.6.1: + resolution: + integrity: sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w== + /estree-walker/1.0.1: + dev: true + resolution: + integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg== + /estree-walker/2.0.2: + dev: true + resolution: + integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== + /esutils/2.0.3: + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + /etag/1.8.1: + engines: + node: '>= 0.6' + resolution: + integrity: sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= + /eventemitter3/4.0.7: + dev: true + resolution: + integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + /execa/4.1.0: + dependencies: + cross-spawn: 7.0.3 + get-stream: 5.2.0 + human-signals: 1.1.1 + is-stream: 2.0.0 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.3 + strip-final-newline: 2.0.0 + dev: true + engines: + node: '>=10' + resolution: + integrity: sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== + /express-history-api-fallback/2.2.1: + dev: true + optional: true + resolution: + integrity: sha1-OirSf3vryQ/FM9EQ18bYMJe80Fc= + /express-http-proxy/1.6.2: + dependencies: + debug: 3.2.7 + es6-promise: 4.2.8 + raw-body: 2.4.1 + dev: true + engines: + node: '>=6.0.0' + optional: true + resolution: + integrity: sha512-soP7UXySFdLbeeMYL1foBkEoZj6HELq9BDAOCr1sLRpqjPaFruN5o6+bZeC+7U4USWIl4JMKEiIvTeKJ2WQdlQ== + /express-ws/4.0.0_express@4.17.1: + dependencies: + express: 4.17.1 + ws: 5.2.2 + dev: true + engines: + node: '>=4.5.0' + optional: true + peerDependencies: + express: ^4.0.0 || ^5.0.0-alpha.1 + resolution: + integrity: sha512-KEyUw8AwRET2iFjFsI1EJQrJ/fHeGiJtgpYgEWG3yDv4l/To/m3a2GaYfeGyB3lsWdvbesjF5XCMx+SVBgAAYw== + /express/4.17.1: + dependencies: + accepts: 1.3.7 + array-flatten: 1.1.1 + body-parser: 1.19.0 + content-disposition: 0.5.3 + content-type: 1.0.4 + cookie: 0.4.0 + cookie-signature: 1.0.6 + debug: 2.6.9 + depd: 1.1.2 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.1.2 + fresh: 0.5.2 + merge-descriptors: 1.0.1 + methods: 1.1.2 + on-finished: 2.3.0 + parseurl: 1.3.3 + path-to-regexp: 0.1.7 + proxy-addr: 2.0.6 + qs: 6.7.0 + range-parser: 1.2.1 + safe-buffer: 5.1.2 + send: 0.17.1 + serve-static: 1.14.1 + setprototypeof: 1.1.1 + statuses: 1.5.0 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + dev: true + engines: + node: '>= 0.10.0' + optional: true + resolution: + integrity: sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== + /extend/3.0.2: + dev: false + resolution: + integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + /extsprintf/1.3.0: + dev: false + engines: + '0': node >=0.6.0 + resolution: + integrity: sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= + /fast-decode-uri-component/1.0.1: + dev: false + resolution: + integrity: sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg== + /fast-deep-equal/3.1.3: + resolution: + integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + /fast-glob/3.2.5: + dependencies: + '@nodelib/fs.stat': 2.0.4 + '@nodelib/fs.walk': 1.2.6 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.2 + picomatch: 2.2.2 + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg== + /fast-json-stable-stringify/2.1.0: + resolution: + integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + /fast-json-stringify/2.5.2: + dependencies: + ajv: 6.12.6 + deepmerge: 4.2.2 + rfdc: 1.3.0 + string-similarity: 4.0.4 + dev: false + engines: + node: '>= 10.0.0' + resolution: + integrity: sha512-H0/Wq7jj/i96DycCySdh+Jl0MubqaScM51GJkdJmjzwyiNpxAgQ9deYqk2H8SNOfwPj21RtTXMkMV5GosUWKeQ== + /fast-levenshtein/2.0.6: + resolution: + integrity: sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + /fast-redact/3.0.0: + dev: false + engines: + node: '>=6' + resolution: + integrity: sha512-a/S/Hp6aoIjx7EmugtzLqXmcNsyFszqbt6qQ99BdG61QjBZF6shNis0BYR6TsZOQ1twYc0FN2Xdhwwbv6+KD0w== + /fast-safe-stringify/2.0.7: + dev: false + resolution: + integrity: sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA== + /fastfall/1.5.1: + dependencies: + reusify: 1.0.4 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-P+4DMxpJ0dObPN96XpzWb0dee5Q= + /fastify-env/2.1.0: + dependencies: + env-schema: 2.1.0 + fastify-plugin: 2.3.4 + dev: false + resolution: + integrity: sha512-yKQ9s+w7ve5FIPmZg1ll6jUHFFes7lOV1jQpD/VzYfWs+Iavm+pqe7nUuOJN9NRRp5VPJ0BCoPa0qVl+w/+3+A== + /fastify-error/0.3.0: + dev: false + resolution: + integrity: sha512-Jm2LMTB5rsJqlS1+cmgqqM9tTs0UrlgYR7TvDT3ZgXsUI5ib1NjQlqZHf+tDK5tVPdFGwyq02wAoJtyYIRSiFA== + /fastify-jwt/2.4.0: + dependencies: + '@types/jsonwebtoken': 8.5.1 + fastify-plugin: 3.0.0 + http-errors: 1.8.0 + jsonwebtoken: 8.5.1 + steed: 1.1.3 + dev: false + engines: + node: '>=10' + resolution: + integrity: sha512-RZ6TjDmMNajmMwh1xakR0iQcjP3NfrcFhwOc0leWp56G6+g7XX73TCzQxmxDNmLsclWDkgG8WTLUJETfaQWIQg== + /fastify-plugin/2.3.4: + dependencies: + semver: 7.3.5 + dev: false + resolution: + integrity: sha512-I+Oaj6p9oiRozbam30sh39BiuiqBda7yK2nmSPVwDCfIBlKnT8YB3MY+pRQc2Fcd07bf6KPGklHJaQ2Qu81TYQ== + /fastify-plugin/3.0.0: + dev: false + resolution: + integrity: sha512-ZdCvKEEd92DNLps5n0v231Bha8bkz1DjnPP/aEz37rz/q42Z5JVLmgnqR4DYuNn3NXAO3IDCPyRvgvxtJ4Ym4w== + /fastify-static/3.4.0: + dependencies: + fastify-plugin: 3.0.0 + glob: 7.1.6 + readable-stream: 3.6.0 + send: 0.17.1 + dev: false + resolution: + integrity: sha512-5y9xTNiPTj6/jDwzH6CqBIcI3/yZtocUiHoLud2NYPfHSOLlS6eW6DTheiU8b9WWlfmHfqOjwFFBdhiH1+nBhg== + /fastify-warning/0.2.0: + dev: false + resolution: + integrity: sha512-s1EQguBw/9qtc1p/WTY4eq9WMRIACkj+HTcOIK1in4MV5aFaQC9ZCIt0dJ7pr5bIf4lPpHvAtP2ywpTNgs7hqw== + /fastify/3.14.0: + dependencies: + '@fastify/proxy-addr': 3.0.0 + abstract-logging: 2.0.1 + ajv: 6.12.6 + avvio: 7.2.1 + fast-json-stringify: 2.5.2 + fastify-error: 0.3.0 + fastify-warning: 0.2.0 + find-my-way: 4.0.0 + flatstr: 1.0.12 + light-my-request: 4.4.1 + pino: 6.11.2 + readable-stream: 3.6.0 + rfdc: 1.3.0 + secure-json-parse: 2.3.2 + semver: 7.3.5 + tiny-lru: 7.0.6 + dev: false + engines: + node: '>=10.16.0' + resolution: + integrity: sha512-a6W2iVPJMOaULqCykJ5nFRtnoknqt9K3b6rqAQcGjT/O2Hy+vvo+9/+cL2907KN0iF/91Ke+XQluKrVNF6+Z7w== + /fastparallel/2.4.0: + dependencies: + reusify: 1.0.4 + xtend: 4.0.2 + dev: false + resolution: + integrity: sha512-sacwQ7wwKlQXsa7TN24UvMBLZNLmVcPhmxccC9riFqb3N+fSczJL8eWdnZodZ/KijGVgNBBfvF/NeXER08uXnQ== + /fastq/1.11.0: + dependencies: + reusify: 1.0.4 + resolution: + integrity: sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g== + /fastseries/1.7.2: + dependencies: + reusify: 1.0.4 + xtend: 4.0.2 + dev: false + resolution: + integrity: sha1-0izhO5Qz3/M4jZHb1ri9qbIaD0s= + /fd-slicer/1.1.0: + dependencies: + pend: 1.2.0 + dev: true + resolution: + integrity: sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4= + /file-entry-cache/5.0.1: + dependencies: + flat-cache: 2.0.1 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== + /fill-range/7.0.1: + dependencies: + to-regex-range: 5.0.1 + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + /finalhandler/1.1.2: + dependencies: + debug: 2.6.9 + encodeurl: 1.0.2 + escape-html: 1.0.3 + on-finished: 2.3.0 + parseurl: 1.3.3 + statuses: 1.5.0 + unpipe: 1.0.0 + dev: true + engines: + node: '>= 0.8' + optional: true + resolution: + integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== + /find-cache-dir/3.3.1: + dependencies: + commondir: 1.0.1 + make-dir: 3.1.0 + pkg-dir: 4.2.0 + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ== + /find-my-way/4.0.0: + dependencies: + fast-decode-uri-component: 1.0.1 + fast-deep-equal: 3.1.3 + safe-regex2: 2.0.0 + semver-store: 0.3.0 + dev: false + engines: + node: '>=10' + resolution: + integrity: sha512-IrICzn/Xm5r5A3RCB8rGLNe+dvzZl+SiUugTQOUMLJciP2qiSu2hw9JtVEYV3VruAYzSWjo/MLH9CFKtVdlWhQ== + /find-package-json/1.2.0: + dev: true + resolution: + integrity: sha512-+SOGcLGYDJHtyqHd87ysBhmaeQ95oWspDKnMXBrnQ9Eq4OkLNqejgoaD8xVWu6GPa0B6roa6KinCMEMcVeqONw== + /find-up/2.1.0: + dependencies: + locate-path: 2.0.0 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha1-RdG35QbHF93UgndaK3eSCjwMV6c= + /find-up/3.0.0: + dependencies: + locate-path: 3.0.0 + dev: true + engines: + node: '>=6' + resolution: + integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + /find-up/4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + /flat-cache/2.0.1: + dependencies: + flatted: 2.0.2 + rimraf: 2.6.3 + write: 1.0.3 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== + /flatstr/1.0.12: + dev: false + resolution: + integrity: sha512-4zPxDyhCyiN2wIAtSLI6gc82/EjqZc1onI4Mz/l0pWrAlsSfYH/2ZIcU+e3oA2wDwbzIWNKwa23F8rh6+DRWkw== + /flatted/2.0.2: + dev: true + resolution: + integrity: sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== + /flatten/1.0.3: + dev: true + resolution: + integrity: sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg== + /follow-redirects/1.13.3: + engines: + node: '>=4.0' + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + resolution: + integrity: sha512-DUgl6+HDzB0iEptNQEXLx/KhTmDb8tZUHSeLqpnjpknR70H0nC2t9N73BK6fN4hOvJ84pKlIQVQ4k5FFlBedKA== + /forever-agent/0.6.1: + dev: false + resolution: + integrity: sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= + /form-data/2.3.3: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.29 + dev: false + engines: + node: '>= 0.12' + resolution: + integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + /forwarded/0.1.2: + dev: true + engines: + node: '>= 0.6' + optional: true + resolution: + integrity: sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= + /fresh/0.5.2: + engines: + node: '>= 0.6' + resolution: + integrity: sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= + /fs-constants/1.0.0: + resolution: + integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== + /fs-extra/9.1.0: + dependencies: + at-least-node: 1.0.0 + graceful-fs: 4.2.6 + jsonfile: 6.1.0 + universalify: 2.0.0 + engines: + node: '>=10' + resolution: + integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== + /fs.realpath/1.0.0: + resolution: + integrity: sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + /fsevents/2.3.2: + dev: true + engines: + node: ^8.16.0 || ^10.6.0 || >=11.0.0 + optional: true + os: + - darwin + resolution: + integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + /function-bind/1.1.1: + resolution: + integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + /functional-red-black-tree/1.0.1: + dev: true + resolution: + integrity: sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= + /generate-password/1.6.0: + dev: false + resolution: + integrity: sha512-YUJTQkApkLT/fru0QdYWP0lVZdPKhF5kXCP24sgI4gR/vFMJFopCj5t1+9FAKIYcML/nxzx2PMkA1ymO1FC+tQ== + /generic-names/2.0.1: + dependencies: + loader-utils: 1.4.0 + dev: true + resolution: + integrity: sha512-kPCHWa1m9wGG/OwQpeweTwM/PYiQLrUIxXbt/P4Nic3LbGjCP0YwrALHW1uNLKZ0LIMg+RF+XRlj2ekT9ZlZAQ== + /get-caller-file/2.0.5: + dev: true + engines: + node: 6.* || 8.* || >= 10.* + optional: true + resolution: + integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + /get-intrinsic/1.1.1: + dependencies: + function-bind: 1.1.1 + has: 1.0.3 + has-symbols: 1.0.2 + dev: true + resolution: + integrity: sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== + /get-port/5.1.1: + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ== + /get-stdin/8.0.0: + dev: true + engines: + node: '>=10' + resolution: + integrity: sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg== + /get-stream/4.1.0: + dependencies: + pump: 3.0.0 + dev: true + engines: + node: '>=6' + resolution: + integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + /get-stream/5.2.0: + dependencies: + pump: 3.0.0 + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + /getpass/0.1.7: + dependencies: + assert-plus: 1.0.0 + dev: false + resolution: + integrity: sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= + /glob-parent/5.1.2: + dependencies: + is-glob: 4.0.1 + dev: true + engines: + node: '>= 6' + resolution: + integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + /glob/7.1.6: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.0.4 + once: 1.4.0 + path-is-absolute: 1.0.1 + resolution: + integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + /global-dirs/2.1.0: + dependencies: + ini: 1.3.7 + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ== + /globals/12.4.0: + dependencies: + type-fest: 0.8.1 + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg== + /globby/11.0.3: + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.2.5 + ignore: 5.1.8 + merge2: 1.4.1 + slash: 3.0.0 + dev: true + engines: + node: '>=10' + resolution: + integrity: sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg== + /got/9.6.0: + dependencies: + '@sindresorhus/is': 0.14.0 + '@szmarczak/http-timer': 1.1.2 + cacheable-request: 6.1.0 + decompress-response: 3.3.0 + duplexer3: 0.1.4 + get-stream: 4.1.0 + lowercase-keys: 1.0.1 + mimic-response: 1.0.1 + p-cancelable: 1.1.0 + to-readable-stream: 1.0.0 + url-parse-lax: 3.0.0 + dev: true + engines: + node: '>=8.6' + resolution: + integrity: sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== + /graceful-fs/4.2.6: + resolution: + integrity: sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== + /har-schema/2.0.0: + dev: false + engines: + node: '>=4' + resolution: + integrity: sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= + /har-validator/5.1.5: + dependencies: + ajv: 6.12.6 + har-schema: 2.0.0 + deprecated: this library is no longer supported + dev: false + engines: + node: '>=6' + resolution: + integrity: sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== + /has-bigints/1.0.1: + dev: true + resolution: + integrity: sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== + /has-flag/3.0.0: + engines: + node: '>=4' + resolution: + integrity: sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + /has-flag/4.0.0: + engines: + node: '>=8' + resolution: + integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + /has-symbols/1.0.2: + dev: true + engines: + node: '>= 0.4' + resolution: + integrity: sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== + /has-yarn/2.1.0: + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw== + /has/1.0.3: + dependencies: + function-bind: 1.1.1 + engines: + node: '>= 0.4.0' + resolution: + integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + /hash-sum/2.0.0: + dev: true + resolution: + integrity: sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg== + /hosted-git-info/2.8.8: + dev: true + resolution: + integrity: sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg== + /html-encoding-sniffer/2.0.1: + dependencies: + whatwg-encoding: 1.0.5 + dev: false + engines: + node: '>=10' + resolution: + integrity: sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ== + /html-tags/3.1.0: + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg== + /http-assert/1.4.1: + dependencies: + deep-equal: 1.0.1 + http-errors: 1.7.3 + dev: true + engines: + node: '>= 0.8' + resolution: + integrity: sha512-rdw7q6GTlibqVVbXr0CKelfV5iY8G2HqEUkhSk297BMbSpSL8crXC+9rjKoMcZZEsksX30le6f/4ul4E28gegw== + /http-cache-semantics/4.1.0: + dev: true + resolution: + integrity: sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== + /http-errors/1.4.0: + dependencies: + inherits: 2.0.1 + statuses: 1.5.0 + dev: true + engines: + node: '>= 0.6' + resolution: + integrity: sha1-bAJC3qaz33r9oVPHEImzHG6Cqr8= + /http-errors/1.6.3: + dependencies: + depd: 1.1.2 + inherits: 2.0.3 + setprototypeof: 1.1.0 + statuses: 1.5.0 + dev: true + engines: + node: '>= 0.6' + resolution: + integrity: sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= + /http-errors/1.7.2: + dependencies: + depd: 1.1.2 + inherits: 2.0.3 + setprototypeof: 1.1.1 + statuses: 1.5.0 + toidentifier: 1.0.0 + dev: true + engines: + node: '>= 0.6' + optional: true + resolution: + integrity: sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== + /http-errors/1.7.3: + dependencies: + depd: 1.1.2 + inherits: 2.0.4 + setprototypeof: 1.1.1 + statuses: 1.5.0 + toidentifier: 1.0.0 + engines: + node: '>= 0.6' + resolution: + integrity: sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== + /http-errors/1.8.0: + dependencies: + depd: 1.1.2 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 1.5.0 + toidentifier: 1.0.0 + engines: + node: '>= 0.6' + resolution: + integrity: sha512-4I8r0C5JDhT5VkvI47QktDW75rNlGVsUf/8hzjCC/wkWI/jdTRmBb9aI7erSG82r1bjKY3F6k28WnsVxB1C73A== + /http-proxy/1.18.1_debug@4.3.1: + dependencies: + eventemitter3: 4.0.7 + follow-redirects: 1.13.3 + requires-port: 1.0.0 + dev: true + engines: + node: '>=8.0.0' + peerDependencies: + debug: '*' + resolution: + integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== + /http-signature/1.2.0: + dependencies: + assert-plus: 1.0.0 + jsprim: 1.4.1 + sshpk: 1.16.1 + dev: false + engines: + node: '>=0.8' + npm: '>=1.3.7' + resolution: + integrity: sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= + /https-proxy-agent/5.0.0: + dependencies: + agent-base: 6.0.2 + debug: 4.3.1 + dev: true + engines: + node: '>= 6' + resolution: + integrity: sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== + /human-signals/1.1.1: + dev: true + engines: + node: '>=8.12.0' + resolution: + integrity: sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== + /iconv-lite/0.4.24: + dependencies: + safer-buffer: 2.1.2 + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + /icss-replace-symbols/1.1.0: + dev: true + resolution: + integrity: sha1-Bupvg2ead0njhs/h/oEq5dsiPe0= + /icss-utils/5.1.0_postcss@8.2.8: + dependencies: + postcss: 8.2.8 + dev: true + engines: + node: ^10 || ^12 || >= 14 + peerDependencies: + postcss: ^8.1.0 + resolution: + integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== + /ieee754/1.2.1: + resolution: + integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + /ignore-by-default/1.0.1: + dev: true + resolution: + integrity: sha1-SMptcvbGo68Aqa1K5odr44ieKwk= + /ignore/4.0.6: + dev: true + engines: + node: '>= 4' + resolution: + integrity: sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== + /ignore/5.1.8: + dev: true + engines: + node: '>= 4' + resolution: + integrity: sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== + /import-cwd/3.0.0: + dependencies: + import-from: 3.0.0 + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg== + /import-fresh/3.3.0: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + dev: true + engines: + node: '>=6' + resolution: + integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + /import-from/3.0.0: + dependencies: + resolve-from: 5.0.0 + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ== + /import-lazy/2.1.0: + dev: true + engines: + node: '>=4' + resolution: + integrity: sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= + /imurmurhash/0.1.4: + dev: true + engines: + node: '>=0.8.19' + resolution: + integrity: sha1-khi5srkoojixPcT7a21XbyMUU+o= + /indexes-of/1.0.1: + dev: true + resolution: + integrity: sha1-8w9xbI4r00bHtn0985FVZqfAVgc= + /inflight/1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + resolution: + integrity: sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + /inherits/2.0.1: + dev: true + resolution: + integrity: sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= + /inherits/2.0.3: + dev: true + resolution: + integrity: sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + /inherits/2.0.4: + resolution: + integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + /ini/1.3.7: + dev: true + resolution: + integrity: sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ== + /ini/1.3.8: + dev: true + resolution: + integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + /internal-slot/1.0.3: + dependencies: + get-intrinsic: 1.1.1 + has: 1.0.3 + side-channel: 1.0.4 + dev: true + engines: + node: '>= 0.4' + resolution: + integrity: sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== + /interpret/1.4.0: + dev: false + engines: + node: '>= 0.10' + resolution: + integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== + /ipaddr.js/1.9.1: + dev: true + engines: + node: '>= 0.10' + optional: true + resolution: + integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + /ipaddr.js/2.0.0: + dev: false + engines: + node: '>= 10' + resolution: + integrity: sha512-S54H9mIj0rbxRIyrDMEuuER86LdlgUg9FSeZ8duQb6CUG2iRrA36MYVQBSprTF/ZeAwvyQ5mDGuNvIPM0BIl3w== + /is-arrayish/0.2.1: + dev: true + resolution: + integrity: sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + /is-arrayish/0.3.2: + dev: true + resolution: + integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== + /is-bigint/1.0.1: + dev: true + resolution: + integrity: sha512-J0ELF4yHFxHy0cmSxZuheDOz2luOdVvqjwmEcj8H/L1JHeuEDSDbeRP+Dk9kFVk5RTFzbucJ2Kb9F7ixY2QaCg== + /is-binary-path/2.1.0: + dependencies: + binary-extensions: 2.2.0 + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + /is-boolean-object/1.1.0: + dependencies: + call-bind: 1.0.2 + dev: true + engines: + node: '>= 0.4' + resolution: + integrity: sha512-a7Uprx8UtD+HWdyYwnD1+ExtTgqQtD2k/1yJgtXP6wnMm8byhkoTZRl+95LLThpzNZJ5aEvi46cdH+ayMFRwmA== + /is-callable/1.2.3: + dev: true + engines: + node: '>= 0.4' + resolution: + integrity: sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ== + /is-ci/2.0.0: + dependencies: + ci-info: 2.0.0 + dev: true + hasBin: true + resolution: + integrity: sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== + /is-core-module/2.2.0: + dependencies: + has: 1.0.3 + resolution: + integrity: sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ== + /is-date-object/1.0.2: + dev: true + engines: + node: '>= 0.4' + resolution: + integrity: sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== + /is-docker/2.1.1: + dev: true + engines: + node: '>=8' + hasBin: true + resolution: + integrity: sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw== + /is-extglob/2.1.1: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + /is-fullwidth-code-point/2.0.0: + dev: true + engines: + node: '>=4' + resolution: + integrity: sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + /is-fullwidth-code-point/3.0.0: + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + /is-generator-function/1.0.8: + dev: true + engines: + node: '>= 0.4' + resolution: + integrity: sha512-2Omr/twNtufVZFr1GhxjOMFPAj2sjc/dKaIqBhvo4qciXfJmITGH6ZGd8eZYNHza8t1y0e01AuqRhJwfWp26WQ== + /is-glob/4.0.1: + dependencies: + is-extglob: 2.1.1 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + /is-installed-globally/0.3.2: + dependencies: + global-dirs: 2.1.0 + is-path-inside: 3.0.3 + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g== + /is-interactive/1.0.0: + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== + /is-module/1.0.0: + dev: true + resolution: + integrity: sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE= + /is-negative-zero/2.0.1: + dev: true + engines: + node: '>= 0.4' + resolution: + integrity: sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== + /is-npm/4.0.0: + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig== + /is-number-object/1.0.4: + dev: true + engines: + node: '>= 0.4' + resolution: + integrity: sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw== + /is-number/7.0.0: + dev: true + engines: + node: '>=0.12.0' + resolution: + integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + /is-obj/2.0.0: + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== + /is-path-inside/3.0.3: + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + /is-potential-custom-element-name/1.0.0: + dev: false + resolution: + integrity: sha1-DFLlS8yjkbssSUsh6GJtczbG45c= + /is-reference/1.2.1: + dependencies: + '@types/estree': 0.0.46 + dev: true + resolution: + integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ== + /is-regex/1.1.2: + dependencies: + call-bind: 1.0.2 + has-symbols: 1.0.2 + dev: true + engines: + node: '>= 0.4' + resolution: + integrity: sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg== + /is-stream/2.0.0: + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== + /is-string/1.0.5: + dev: true + engines: + node: '>= 0.4' + resolution: + integrity: sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ== + /is-symbol/1.0.3: + dependencies: + has-symbols: 1.0.2 + dev: true + engines: + node: '>= 0.4' + resolution: + integrity: sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== + /is-typedarray/1.0.0: + resolution: + integrity: sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + /is-unicode-supported/0.1.0: + dev: true + engines: + node: '>=10' + resolution: + integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + /is-wsl/2.2.0: + dependencies: + is-docker: 2.1.1 + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + /is-yarn-global/0.3.0: + dev: true + resolution: + integrity: sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw== + /isarray/0.0.1: + dev: true + resolution: + integrity: sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= + /isarray/1.0.0: + resolution: + integrity: sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + /isbuiltin/1.0.0: + dependencies: + builtin-modules: 1.1.1 + dev: true + resolution: + integrity: sha1-RFOykVaQy0fAy5ySVaCAd3gxXJY= + /isexe/2.0.0: + dev: true + resolution: + integrity: sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + /isstream/0.1.2: + dev: false + resolution: + integrity: sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= + /jest-worker/26.6.2: + dependencies: + '@types/node': 14.14.35 + merge-stream: 2.0.0 + supports-color: 7.2.0 + dev: true + engines: + node: '>= 10.13.0' + resolution: + integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ== + /js-tokens/4.0.0: + dev: true + resolution: + integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + /js-yaml/3.14.1: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + dev: true + hasBin: true + resolution: + integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + /js-yaml/4.0.0: + dependencies: + argparse: 2.0.1 + dev: false + hasBin: true + resolution: + integrity: sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q== + /jsbn/0.1.1: + dev: false + resolution: + integrity: sha1-peZUwuWi3rXyAdls77yoDA7y9RM= + /jsdom/16.5.1_c70f8fc5586dd378b8c866035dbe710b: + dependencies: + abab: 2.0.5 + acorn: 8.1.0 + acorn-globals: 6.0.0 + cssom: 0.4.4 + cssstyle: 2.3.0 + data-urls: 2.0.0 + decimal.js: 10.2.1 + domexception: 2.0.1 + escodegen: 2.0.0 + html-encoding-sniffer: 2.0.1 + is-potential-custom-element-name: 1.0.0 + nwsapi: 2.2.0 + parse5: 6.0.1 + request: 2.88.2 + request-promise-native: 1.0.9_request@2.88.2 + saxes: 5.0.1 + symbol-tree: 3.2.4 + tough-cookie: 4.0.0 + w3c-hr-time: 1.0.2 + w3c-xmlserializer: 2.0.0 + webidl-conversions: 6.1.0 + whatwg-encoding: 1.0.5 + whatwg-mimetype: 2.3.0 + whatwg-url: 8.4.0 + ws: 7.4.4_c70f8fc5586dd378b8c866035dbe710b + xml-name-validator: 3.0.0 + dev: false + engines: + node: '>=10' + peerDependencies: + bufferutil: '*' + canvas: ^2.5.0 + utf-8-validate: '*' + peerDependenciesMeta: + canvas: + optional: true + resolution: + integrity: sha512-pF73EOsJgwZekbDHEY5VO/yKXUkab/DuvrQB/ANVizbr6UAHJsDdHXuotZYwkJSGQl1JM+ivXaqY+XBDDL4TiA== + /json-buffer/3.0.0: + dev: true + resolution: + integrity: sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg= + /json-parse-better-errors/1.0.2: + dev: true + resolution: + integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + /json-parse-even-better-errors/2.3.1: + dev: true + resolution: + integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + /json-schema-traverse/0.4.1: + resolution: + integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + /json-schema/0.2.3: + dev: false + resolution: + integrity: sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= + /json-stable-stringify-without-jsonify/1.0.1: + dev: true + resolution: + integrity: sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + /json-stringify-safe/5.0.1: + dev: false + resolution: + integrity: sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= + /json5/1.0.1: + dependencies: + minimist: 1.2.5 + dev: true + hasBin: true + resolution: + integrity: sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + /jsonfile/6.1.0: + dependencies: + universalify: 2.0.0 + optionalDependencies: + graceful-fs: 4.2.6 + resolution: + integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + /jsonwebtoken/8.5.1: + dependencies: + jws: 3.2.2 + lodash.includes: 4.3.0 + lodash.isboolean: 3.0.3 + lodash.isinteger: 4.0.4 + lodash.isnumber: 3.0.3 + lodash.isplainobject: 4.0.6 + lodash.isstring: 4.0.1 + lodash.once: 4.1.1 + ms: 2.1.3 + semver: 5.7.1 + dev: false + engines: + node: '>=4' + npm: '>=1.4.28' + resolution: + integrity: sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w== + /jsprim/1.4.1: + dependencies: + assert-plus: 1.0.0 + extsprintf: 1.3.0 + json-schema: 0.2.3 + verror: 1.10.0 + dev: false + engines: + '0': node >=0.6.0 + resolution: + integrity: sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= + /jsx-ast-utils/3.2.0: + dependencies: + array-includes: 3.1.3 + object.assign: 4.1.2 + dev: true + engines: + node: '>=4.0' + resolution: + integrity: sha512-EIsmt3O3ljsU6sot/J4E1zDRxfBNrhjyf/OKjlydwgEimQuznlM4Wv7U+ueONJMyEn1WRE0K8dhi3dVAXYT24Q== + /jwa/1.4.1: + dependencies: + buffer-equal-constant-time: 1.0.1 + ecdsa-sig-formatter: 1.0.11 + safe-buffer: 5.2.1 + dev: false + resolution: + integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA== + /jws/3.2.2: + dependencies: + jwa: 1.4.1 + safe-buffer: 5.2.1 + dev: false + resolution: + integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA== + /kareem/2.3.2: + dev: false + resolution: + integrity: sha512-STHz9P7X2L4Kwn72fA4rGyqyXdmrMSdxqHx9IXon/FXluXieaFA6KJ2upcHAHxQPQ0LeM/OjLrhFxifHewOALQ== + /keygrip/1.1.0: + dependencies: + tsscmp: 1.0.6 + dev: true + engines: + node: '>= 0.6' + resolution: + integrity: sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ== + /keyv/3.1.0: + dependencies: + json-buffer: 3.0.0 + dev: true + resolution: + integrity: sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== + /klona/2.0.4: + dev: true + engines: + node: '>= 8' + resolution: + integrity: sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA== + /koa-compose/3.2.1: + dependencies: + any-promise: 1.3.0 + dev: true + resolution: + integrity: sha1-qFzLQLfZhtjlo0Wzoazo6rz1Tec= + /koa-compose/4.1.0: + dev: true + resolution: + integrity: sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw== + /koa-conditional-get/3.0.0: + dev: true + resolution: + integrity: sha512-VKyPS7SuNH26TjTV2IRz+oh0HV/jc2lYAo51PTQTkj0XFn8ebNZW9riczmrW7ZVBFSnls1Z88DPUYKnvVymruA== + /koa-convert/1.2.0: + dependencies: + co: 4.6.0 + koa-compose: 3.2.1 + dev: true + engines: + node: '>= 4' + resolution: + integrity: sha1-2kCHXfSd4FOQmNFwC1CCDOvNIdA= + /koa-etag/4.0.0: + dependencies: + etag: 1.8.1 + dev: true + resolution: + integrity: sha512-1cSdezCkBWlyuB9l6c/IFoe1ANCDdPBxkDkRiaIup40xpUub6U/wwRXoKBZw/O5BifX9OlqAjYnDyzM6+l+TAg== + /koa-proxies/0.11.0_debug@4.3.1+koa@2.13.1: + dependencies: + http-proxy: 1.18.1_debug@4.3.1 + koa: 2.13.1 + path-match: 1.2.4 + dev: true + peerDependencies: + debug: '*' + koa: '>=2' + resolution: + integrity: sha512-iXGRADBE0fM7g7AttNOlLZ/cCFKXeVMHbFJKIRb0dUCrSYXi02loyVSdBlKlBQ5ZfVKJLo9Q9FyqwVTp1poVVA== + /koa-send/5.0.1: + dependencies: + debug: 4.3.1 + http-errors: 1.8.0 + resolve-path: 1.4.0 + dev: true + engines: + node: '>= 8' + resolution: + integrity: sha512-tmcyQ/wXXuxpDxyNXv5yNNkdAMdFRqwtegBXUaowiQzUKqJehttS0x2j0eOZDQAyloAth5w6wwBImnFzkUz3pQ== + /koa-static/5.0.0: + dependencies: + debug: 3.2.7 + koa-send: 5.0.1 + dev: true + engines: + node: '>= 7.6.0' + resolution: + integrity: sha512-UqyYyH5YEXaJrf9S8E23GoJFQZXkBVJ9zYYMPGz919MSX1KuvAcycIuS0ci150HCoPf4XQVhQ84Qf8xRPWxFaQ== + /koa/2.13.1: + dependencies: + accepts: 1.3.7 + cache-content-type: 1.0.1 + content-disposition: 0.5.3 + content-type: 1.0.4 + cookies: 0.8.0 + debug: 3.1.0 + delegates: 1.0.0 + depd: 2.0.0 + destroy: 1.0.4 + encodeurl: 1.0.2 + escape-html: 1.0.3 + fresh: 0.5.2 + http-assert: 1.4.1 + http-errors: 1.8.0 + is-generator-function: 1.0.8 + koa-compose: 4.1.0 + koa-convert: 1.2.0 + on-finished: 2.3.0 + only: 0.0.2 + parseurl: 1.3.3 + statuses: 1.5.0 + type-is: 1.6.18 + vary: 1.1.2 + dev: true + engines: + node: ^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4 + resolution: + integrity: sha512-Lb2Dloc72auj5vK4X4qqL7B5jyDPQaZucc9sR/71byg7ryoD1NCaCm63CShk9ID9quQvDEi1bGR/iGjCG7As3w== + /latest-version/5.1.0: + dependencies: + package-json: 6.5.0 + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA== + /levn/0.3.0: + dependencies: + prelude-ls: 1.1.2 + type-check: 0.3.2 + dev: false + engines: + node: '>= 0.8.0' + resolution: + integrity: sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= + /levn/0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + engines: + node: '>= 0.8.0' + resolution: + integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + /light-my-request/4.4.1: + dependencies: + ajv: 6.12.6 + cookie: 0.4.1 + fastify-warning: 0.2.0 + readable-stream: 3.6.0 + set-cookie-parser: 2.4.8 + dev: false + resolution: + integrity: sha512-FDNRF2mYjthIRWE7O8d/X7AzDx4otQHl4/QXbu3Q/FRwBFcgb+ZoDaUd5HwN53uQXLAiw76osN+Va0NEaOW6rQ== + /lines-and-columns/1.1.6: + dev: true + resolution: + integrity: sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= + /load-json-file/2.0.0: + dependencies: + graceful-fs: 4.2.6 + parse-json: 2.2.0 + pify: 2.3.0 + strip-bom: 3.0.0 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg= + /load-json-file/4.0.0: + dependencies: + graceful-fs: 4.2.6 + parse-json: 4.0.0 + pify: 3.0.0 + strip-bom: 3.0.0 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha1-L19Fq5HjMhYjT9U62rZo607AmTs= + /load-json-file/5.3.0: + dependencies: + graceful-fs: 4.2.6 + parse-json: 4.0.0 + pify: 4.0.1 + strip-bom: 3.0.0 + type-fest: 0.3.1 + dev: true + engines: + node: '>=6' + resolution: + integrity: sha512-cJGP40Jc/VXUsp8/OrnyKyTZ1y6v/dphm3bioS+RrKXjK2BB6wHUd6JptZEFDGgGahMT+InnZO5i1Ei9mpC8Bw== + /loader-utils/1.4.0: + dependencies: + big.js: 5.2.2 + emojis-list: 3.0.0 + json5: 1.0.1 + dev: true + engines: + node: '>=4.0.0' + resolution: + integrity: sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== + /locate-path/2.0.0: + dependencies: + p-locate: 2.0.0 + path-exists: 3.0.0 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= + /locate-path/3.0.0: + dependencies: + p-locate: 3.0.0 + path-exists: 3.0.0 + dev: true + engines: + node: '>=6' + resolution: + integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + /locate-path/5.0.0: + dependencies: + p-locate: 4.1.0 + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + /lockfile/1.0.4: + dependencies: + signal-exit: 3.0.3 + dev: true + resolution: + integrity: sha512-cvbTwETRfsFh4nHsL1eGWapU1XFi5Ot9E85sWAwia7Y7EgB7vfqcZhTKZ+l7hCGxSPoushMv5GKhT5PdLv03WA== + /lodash._reinterpolate/3.0.0: + dev: true + resolution: + integrity: sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= + /lodash.camelcase/4.3.0: + dev: true + resolution: + integrity: sha1-soqmKIorn8ZRA1x3EfZathkDMaY= + /lodash.includes/4.3.0: + dev: false + resolution: + integrity: sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8= + /lodash.isboolean/3.0.3: + dev: false + resolution: + integrity: sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY= + /lodash.isinteger/4.0.4: + dev: false + resolution: + integrity: sha1-YZwK89A/iwTDH1iChAt3sRzWg0M= + /lodash.isnumber/3.0.3: + dev: false + resolution: + integrity: sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w= + /lodash.isplainobject/4.0.6: + dev: false + resolution: + integrity: sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs= + /lodash.isstring/4.0.1: + dev: false + resolution: + integrity: sha1-1SfftUVuynzJu5XV2ur4i6VKVFE= + /lodash.once/4.1.1: + dev: false + resolution: + integrity: sha1-DdOXEhPHxW34gJd9UEyI+0cal6w= + /lodash.sortby/4.7.0: + dev: false + resolution: + integrity: sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= + /lodash.template/4.5.0: + dependencies: + lodash._reinterpolate: 3.0.0 + lodash.templatesettings: 4.2.0 + dev: true + resolution: + integrity: sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A== + /lodash.templatesettings/4.2.0: + dependencies: + lodash._reinterpolate: 3.0.0 + dev: true + resolution: + integrity: sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ== + /lodash.toarray/4.4.0: + dev: true + resolution: + integrity: sha1-JMS/zWsvuji/0FlNsRedjptlZWE= + /lodash/4.17.21: + resolution: + integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + /log-symbols/3.0.0: + dependencies: + chalk: 2.4.2 + dev: false + engines: + node: '>=8' + resolution: + integrity: sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ== + /log-symbols/4.1.0: + dependencies: + chalk: 4.1.0 + is-unicode-supported: 0.1.0 + dev: true + engines: + node: '>=10' + resolution: + integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + /loose-envify/1.4.0: + dependencies: + js-tokens: 4.0.0 + dev: true + hasBin: true + resolution: + integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + /lowercase-keys/1.0.1: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== + /lowercase-keys/2.0.0: + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== + /lru-cache/5.1.1: + dependencies: + yallist: 3.1.1 + dev: true + resolution: + integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + /lru-cache/6.0.0: + dependencies: + yallist: 4.0.0 + engines: + node: '>=10' + resolution: + integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + /magic-string/0.25.7: + dependencies: + sourcemap-codec: 1.4.8 + dev: true + resolution: + integrity: sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA== + /make-dir/3.1.0: + dependencies: + semver: 6.3.0 + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + /md5-file/5.0.0: + dev: true + engines: + node: '>=10.13.0' + hasBin: true + resolution: + integrity: sha512-xbEFXCYVWrSx/gEKS1VPlg84h/4L20znVIulKw6kMfmBUAZNAnF00eczz9ICMl+/hjQGo5KSXRxbL/47X3rmMw== + /media-typer/0.3.0: + dev: true + engines: + node: '>= 0.6' + resolution: + integrity: sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= + /memory-pager/1.5.0: + optional: true + resolution: + integrity: sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg== + /memorystream/0.3.1: + dev: true + engines: + node: '>= 0.10.0' + resolution: + integrity: sha1-htcJCzDORV1j+64S3aUaR93K+bI= + /merge-descriptors/1.0.1: + dev: true + optional: true + resolution: + integrity: sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= + /merge-source-map/1.1.0: + dependencies: + source-map: 0.6.1 + dev: true + resolution: + integrity: sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw== + /merge-stream/2.0.0: + dev: true + resolution: + integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + /merge2/1.4.1: + dev: true + engines: + node: '>= 8' + resolution: + integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + /methods/1.1.2: + dev: true + engines: + node: '>= 0.6' + optional: true + resolution: + integrity: sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= + /micromatch/4.0.2: + dependencies: + braces: 3.0.2 + picomatch: 2.2.2 + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== + /mime-db/1.46.0: + engines: + node: '>= 0.6' + resolution: + integrity: sha512-svXaP8UQRZ5K7or+ZmfNhg2xX3yKDMUzqadsSqi4NCH/KomcH75MAMYAGVlvXn4+b/xOPhS3I2uHKRUzvjY7BQ== + /mime-types/2.1.29: + dependencies: + mime-db: 1.46.0 + engines: + node: '>= 0.6' + resolution: + integrity: sha512-Y/jMt/S5sR9OaqteJtslsFZKWOIIqMACsJSiHghlCAyhf7jfVYjKBmLiX8OgpWeW+fjJ2b+Az69aPFPkUOY6xQ== + /mime/1.6.0: + engines: + node: '>=4' + hasBin: true + resolution: + integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + /mimic-fn/2.1.0: + dev: true + engines: + node: '>=6' + resolution: + integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + /mimic-response/1.0.1: + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== + /min-indent/1.0.1: + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== + /minimatch/3.0.4: + dependencies: + brace-expansion: 1.1.11 + resolution: + integrity: sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + /minimist/1.2.5: + dev: true + resolution: + integrity: sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + /mkdirp-classic/0.5.3: + dev: false + resolution: + integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== + /mkdirp/0.5.5: + dependencies: + minimist: 1.2.5 + dev: true + hasBin: true + resolution: + integrity: sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== + /mkdirp/1.0.4: + dev: true + engines: + node: '>=10' + hasBin: true + resolution: + integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + /modern-normalize/1.0.0: + dev: true + engines: + node: '>=6' + resolution: + integrity: sha512-1lM+BMLGuDfsdwf3rsgBSrxJwAZHFIrQ8YR61xIqdHo0uNKI9M52wNpHSrliZATJp51On6JD0AfRxd4YGSU0lw== + /mongodb-memory-server-core/6.9.6: + dependencies: + '@types/tmp': 0.2.0 + camelcase: 6.2.0 + cross-spawn: 7.0.3 + debug: 4.3.1 + find-cache-dir: 3.3.1 + find-package-json: 1.2.0 + get-port: 5.1.1 + https-proxy-agent: 5.0.0 + lockfile: 1.0.4 + md5-file: 5.0.0 + mkdirp: 1.0.4 + semver: 7.3.5 + tar-stream: 2.2.0 + tmp: 0.2.1 + uuid: 8.3.2 + yauzl: 2.10.0 + dev: true + engines: + node: '>=10.15.0' + optionalDependencies: + mongodb: 3.6.5 + resolution: + integrity: sha512-ZcXHTI2TccH3L5N9JyAMGm8bbAsfLn8SUWOeYGHx/vDx7vu4qshyaNXTIxeHjpUQA29N+Z1LtTXA6vXjl1eg6w== + /mongodb/3.6.5: + dependencies: + bl: 2.2.1 + bson: 1.1.6 + denque: 1.5.0 + require_optional: 1.0.1 + safe-buffer: 5.2.1 + engines: + node: '>=4' + optionalDependencies: + saslprep: 1.0.3 + peerDependencies: + aws4: '*' + bson-ext: '*' + kerberos: '*' + mongodb-client-encryption: '*' + mongodb-extjson: '*' + snappy: '*' + peerDependenciesMeta: + aws4: + optional: true + bson-ext: + optional: true + kerberos: + optional: true + mongodb-client-encryption: + optional: true + mongodb-extjson: + optional: true + snappy: + optional: true + resolution: + integrity: sha512-mQlYKw1iGbvJJejcPuyTaytq0xxlYbIoVDm2FODR+OHxyEiMR021vc32bTvamgBjCswsD54XIRwhg3yBaWqJjg== + /mongoose-legacy-pluralize/1.0.2_mongoose@5.12.2: + dependencies: + mongoose: 5.12.2 + dev: false + peerDependencies: + mongoose: '*' + resolution: + integrity: sha512-Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NWKfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ== + /mongoose/5.12.2: + dependencies: + '@types/mongodb': 3.6.10 + bson: 1.1.6 + kareem: 2.3.2 + mongodb: 3.6.5 + mongoose-legacy-pluralize: 1.0.2_mongoose@5.12.2 + mpath: 0.8.3 + mquery: 3.2.4 + ms: 2.1.2 + regexp-clone: 1.0.0 + safe-buffer: 5.2.1 + sift: 7.0.1 + sliced: 1.0.1 + dev: false + engines: + node: '>=4.0.0' + resolution: + integrity: sha512-kT9t6Nvu9WPsfssn7Gzke446Il8UdMilY7Sa5vALtwoOoNOGtZEVjekZBFwsBFzTWtBA/x5gBmJoYFP+1LeDlg== + /mpath/0.8.3: + dev: false + engines: + node: '>=4.0.0' + resolution: + integrity: sha512-eb9rRvhDltXVNL6Fxd2zM9D4vKBxjVVQNLNijlj7uoXUy19zNDsIif5zR+pWmPCWNKwAtqyo4JveQm4nfD5+eA== + /mquery/3.2.4: + dependencies: + bluebird: 3.5.1 + debug: 3.1.0 + regexp-clone: 1.0.0 + safe-buffer: 5.1.2 + sliced: 1.0.1 + dev: false + engines: + node: '>=4.0.0' + resolution: + integrity: sha512-uOLpp7iRX0BV1Uu6YpsqJ5b42LwYnmu0WeF/f8qgD/On3g0XDaQM6pfn0m6UxO6SM8DioZ9Bk6xxbWIGHm2zHg== + /ms/2.0.0: + resolution: + integrity: sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + /ms/2.1.1: + resolution: + integrity: sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + /ms/2.1.2: + resolution: + integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + /ms/2.1.3: + resolution: + integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + /nanoid/3.1.22: + dev: true + engines: + node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 + hasBin: true + resolution: + integrity: sha512-/2ZUaJX2ANuLtTvqTlgqBQNJoQO398KyJgZloL0PZkC0dpysjncRUPsFe3DUPzz/y3h+u7C46np8RMuvF3jsSQ== + /natural-compare/1.4.0: + dev: true + resolution: + integrity: sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= + /negotiator/0.6.2: + dev: true + engines: + node: '>= 0.6' + resolution: + integrity: sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== + /nice-try/1.0.5: + dev: true + resolution: + integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + /node-emoji/1.10.0: + dependencies: + lodash.toarray: 4.4.0 + dev: true + resolution: + integrity: sha512-Yt3384If5H6BYGVHiHwTL+99OzJKHhgp82S8/dktEK73T26BazdgZ4JZh92xSVtGNJvz9UbXdNAc5hcrXV42vw== + /node-fetch/2.6.1: + dev: false + engines: + node: 4.x || >=6.0.0 + resolution: + integrity: sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== + /node-forge/0.10.0: + dev: true + engines: + node: '>= 6.0.0' + resolution: + integrity: sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA== + /node-gyp-build/4.2.3: + dev: false + hasBin: true + resolution: + integrity: sha512-MN6ZpzmfNCRM+3t57PTJHgHyw/h4OWnZ6mR8P5j/uZtqQr46RRuDE/P+g3n0YR/AiYXeWixZZzaip77gdICfRg== + /node-releases/1.1.71: + dev: true + resolution: + integrity: sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg== + /nodemon/2.0.7: + dependencies: + chokidar: 3.5.1 + debug: 3.2.7 + ignore-by-default: 1.0.1 + minimatch: 3.0.4 + pstree.remy: 1.1.8 + semver: 5.7.1 + supports-color: 5.5.0 + touch: 3.1.0 + undefsafe: 2.0.3 + update-notifier: 4.1.3 + dev: true + engines: + node: '>=8.10.0' + hasBin: true + requiresBuild: true + resolution: + integrity: sha512-XHzK69Awgnec9UzHr1kc8EomQh4sjTQ8oRf8TsGrSmHDx9/UmiGG9E/mM3BuTfNeFwdNBvrqQq/RHL0xIeyFOA== + /nollup/0.15.6: + dependencies: + '@rollup/pluginutils': 3.1.0 + acorn: 8.1.0 + chokidar: 3.5.1 + convert-source-map: 1.7.0 + express: 4.17.1 + express-history-api-fallback: 2.2.1 + express-http-proxy: 1.6.2 + express-ws: 4.0.0_express@4.17.1 + magic-string: 0.25.7 + mime-types: 2.1.29 + source-map: 0.5.7 + source-map-fast: /source-map/0.7.3 + dev: true + hasBin: true + optional: true + resolution: + integrity: sha512-FKmFzuI0HXSw9txnuwNwyNi5hgzjqvv+Pk++VdLW5Vo6MXunMcGDdFIpr8xsgrIjAixSwIQVBqrioX3tcj9e1g== + /nopt/1.0.10: + dependencies: + abbrev: 1.1.1 + dev: true + hasBin: true + resolution: + integrity: sha1-bd0hvSoxQXuScn3Vhfim83YI6+4= + /normalize-package-data/2.5.0: + dependencies: + hosted-git-info: 2.8.8 + resolve: 1.20.0 + semver: 5.7.1 + validate-npm-package-license: 3.0.4 + dev: true + resolution: + integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + /normalize-path/3.0.0: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + /normalize-range/0.1.2: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= + /normalize-url/4.5.0: + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ== + /npm-run-all/4.1.5: + dependencies: + ansi-styles: 3.2.1 + chalk: 2.4.2 + cross-spawn: 6.0.5 + memorystream: 0.3.1 + minimatch: 3.0.4 + pidtree: 0.3.1 + read-pkg: 3.0.0 + shell-quote: 1.7.2 + string.prototype.padend: 3.1.2 + dev: true + engines: + node: '>= 4' + hasBin: true + resolution: + integrity: sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ== + /npm-run-path/4.0.1: + dependencies: + path-key: 3.1.1 + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + /num2fraction/1.2.2: + dev: true + resolution: + integrity: sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4= + /nwsapi/2.2.0: + dev: false + resolution: + integrity: sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== + /oauth-sign/0.9.0: + dev: false + resolution: + integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + /object-assign/4.1.1: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + /object-hash/2.1.1: + dev: true + engines: + node: '>= 6' + resolution: + integrity: sha512-VOJmgmS+7wvXf8CjbQmimtCnEx3IAoLxI3fp2fbWehxrWBcAQFbk+vcwb6vzR0VZv/eNCJ/27j151ZTwqW/JeQ== + /object-inspect/1.9.0: + dev: true + resolution: + integrity: sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw== + /object-keys/1.1.1: + dev: true + engines: + node: '>= 0.4' + resolution: + integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + /object.assign/4.1.2: + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.3 + has-symbols: 1.0.2 + object-keys: 1.1.1 + dev: true + engines: + node: '>= 0.4' + resolution: + integrity: sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== + /object.entries/1.1.3: + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.3 + es-abstract: 1.18.0 + has: 1.0.3 + dev: true + engines: + node: '>= 0.4' + resolution: + integrity: sha512-ym7h7OZebNS96hn5IJeyUmaWhaSM4SVtAPPfNLQEI2MYWCO2egsITb9nab2+i/Pwibx+R0mtn+ltKJXRSeTMGg== + /object.fromentries/2.0.4: + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.3 + es-abstract: 1.18.0 + has: 1.0.3 + dev: true + engines: + node: '>= 0.4' + resolution: + integrity: sha512-EsFBshs5RUUpQEY1D4q/m59kMfz4YJvxuNCJcv/jWwOJr34EaVnG11ZrZa0UHB3wnzV1wx8m58T4hQL8IuNXlQ== + /object.values/1.1.3: + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.3 + es-abstract: 1.18.0 + has: 1.0.3 + dev: true + engines: + node: '>= 0.4' + resolution: + integrity: sha512-nkF6PfDB9alkOUxpf1HNm/QlkeW3SReqL5WXeBLpEJJnlPSvRaDQpW3gQTksTN3fgJX4hL42RzKyOin6ff3tyw== + /on-finished/2.3.0: + dependencies: + ee-first: 1.1.1 + engines: + node: '>= 0.8' + resolution: + integrity: sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= + /once/1.4.0: + dependencies: + wrappy: 1.0.2 + resolution: + integrity: sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + /onetime/5.1.2: + dependencies: + mimic-fn: 2.1.0 + dev: true + engines: + node: '>=6' + resolution: + integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + /only/0.0.2: + dev: true + resolution: + integrity: sha1-Kv3oTQPlC5qO3EROMGEKcCle37Q= + /open/7.4.2: + dependencies: + is-docker: 2.1.1 + is-wsl: 2.2.0 + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q== + /optionator/0.8.3: + dependencies: + deep-is: 0.1.3 + fast-levenshtein: 2.0.6 + levn: 0.3.0 + prelude-ls: 1.1.2 + type-check: 0.3.2 + word-wrap: 1.2.3 + dev: false + engines: + node: '>= 0.8.0' + resolution: + integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== + /optionator/0.9.1: + dependencies: + deep-is: 0.1.3 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.3 + dev: true + engines: + node: '>= 0.8.0' + resolution: + integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== + /ora/5.4.0: + dependencies: + bl: 4.1.0 + chalk: 4.1.0 + cli-cursor: 3.1.0 + cli-spinners: 2.6.0 + is-interactive: 1.0.0 + is-unicode-supported: 0.1.0 + log-symbols: 4.1.0 + strip-ansi: 6.0.0 + wcwidth: 1.0.1 + dev: true + engines: + node: '>=10' + resolution: + integrity: sha512-1StwyXQGoU6gdjYkyVcqOLnVlbKj+6yPNNOxJVgpt9t4eksKjiriiHuxktLYkgllwk+D6MbC4ihH84L1udRXPg== + /p-cancelable/1.1.0: + dev: true + engines: + node: '>=6' + resolution: + integrity: sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== + /p-limit/1.3.0: + dependencies: + p-try: 1.0.0 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== + /p-limit/2.3.0: + dependencies: + p-try: 2.2.0 + dev: true + engines: + node: '>=6' + resolution: + integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + /p-locate/2.0.0: + dependencies: + p-limit: 1.3.0 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= + /p-locate/3.0.0: + dependencies: + p-limit: 2.3.0 + dev: true + engines: + node: '>=6' + resolution: + integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + /p-locate/4.1.0: + dependencies: + p-limit: 2.3.0 + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + /p-map-series/2.1.0: + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-RpYIIK1zXSNEOdwxcfe7FdvGcs7+y5n8rifMhMNWvaxRNMPINJHF5GDeuVxWqnfrcHPSCnp7Oo5yNXHId9Av2Q== + /p-try/1.0.0: + dev: true + engines: + node: '>=4' + resolution: + integrity: sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= + /p-try/2.2.0: + dev: true + engines: + node: '>=6' + resolution: + integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + /package-json/6.5.0: + dependencies: + got: 9.6.0 + registry-auth-token: 4.2.1 + registry-url: 5.1.0 + semver: 6.3.0 + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ== + /parent-module/1.0.1: + dependencies: + callsites: 3.1.0 + dev: true + engines: + node: '>=6' + resolution: + integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + /parse-json/2.2.0: + dependencies: + error-ex: 1.3.2 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= + /parse-json/4.0.0: + dependencies: + error-ex: 1.3.2 + json-parse-better-errors: 1.0.2 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= + /parse-json/5.2.0: + dependencies: + '@babel/code-frame': 7.12.13 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.1.6 + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + /parse5/6.0.1: + dev: false + resolution: + integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== + /parseurl/1.3.3: + dev: true + engines: + node: '>= 0.8' + resolution: + integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + /path-exists/3.0.0: + dev: true + engines: + node: '>=4' + resolution: + integrity: sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + /path-exists/4.0.0: + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + /path-is-absolute/1.0.1: + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + /path-key/2.0.1: + dev: true + engines: + node: '>=4' + resolution: + integrity: sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + /path-key/3.1.1: + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + /path-match/1.2.4: + dependencies: + http-errors: 1.4.0 + path-to-regexp: 1.8.0 + dev: true + resolution: + integrity: sha1-pidH88fgwlFHYml/JEQ1hbCRAOo= + /path-parse/1.0.6: + resolution: + integrity: sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== + /path-to-regexp/0.1.7: + dev: true + optional: true + resolution: + integrity: sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= + /path-to-regexp/1.8.0: + dependencies: + isarray: 0.0.1 + dev: true + resolution: + integrity: sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== + /path-type/2.0.0: + dependencies: + pify: 2.3.0 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM= + /path-type/3.0.0: + dependencies: + pify: 3.0.0 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== + /path-type/4.0.0: + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + /pend/1.2.0: + dev: true + resolution: + integrity: sha1-elfrVQpng/kRUzH89GY9XI4AelA= + /performance-now/2.1.0: + dev: false + resolution: + integrity: sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= + /picomatch/2.2.2: + engines: + node: '>=8.6' + resolution: + integrity: sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== + /pidtree/0.3.1: + dev: true + engines: + node: '>=0.10' + hasBin: true + resolution: + integrity: sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA== + /pify/2.3.0: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-7RQaasBDqEnqWISY59yosVMw6Qw= + /pify/3.0.0: + dev: true + engines: + node: '>=4' + resolution: + integrity: sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= + /pify/4.0.1: + dev: true + engines: + node: '>=6' + resolution: + integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + /pino-std-serializers/3.2.0: + dev: false + resolution: + integrity: sha512-EqX4pwDPrt3MuOAAUBMU0Tk5kR/YcCM5fNPEzgCO2zJ5HfX0vbiH9HbJglnyeQsN96Kznae6MWD47pZB5avTrg== + /pino/6.11.2: + dependencies: + fast-redact: 3.0.0 + fast-safe-stringify: 2.0.7 + flatstr: 1.0.12 + pino-std-serializers: 3.2.0 + quick-format-unescaped: 4.0.1 + sonic-boom: 1.4.0 + dev: false + hasBin: true + resolution: + integrity: sha512-bmzxwbrIPxQUlAuMkF4PWVErUGERU4z37HazlhflKFg08crsNE3fACGN6gPwg5xtKOK47Ux5cZm8YCuLV4wWJg== + /pkg-conf/3.1.0: + dependencies: + find-up: 3.0.0 + load-json-file: 5.3.0 + dev: true + engines: + node: '>=6' + resolution: + integrity: sha512-m0OTbR/5VPNPqO1ph6Fqbj7Hv6QU7gR/tQW40ZqrL1rjgCU85W6C1bJn0BItuJqnR98PWzw7Z8hHeChD1WrgdQ== + /pkg-dir/2.0.0: + dependencies: + find-up: 2.1.0 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s= + /pkg-dir/4.2.0: + dependencies: + find-up: 4.1.0 + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + /postcss-attribute-case-insensitive/4.0.2: + dependencies: + postcss: 7.0.35 + postcss-selector-parser: 6.0.4 + dev: true + resolution: + integrity: sha512-clkFxk/9pcdb4Vkn0hAHq3YnxBQ2p0CGD1dy24jN+reBck+EWxMbxSUqN4Yj7t0w8csl87K6p0gxBe1utkJsYA== + /postcss-color-functional-notation/2.0.1: + dependencies: + postcss: 7.0.35 + postcss-values-parser: 2.0.1 + dev: true + engines: + node: '>=6.0.0' + resolution: + integrity: sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g== + /postcss-color-gray/5.0.0: + dependencies: + '@csstools/convert-colors': 1.4.0 + postcss: 7.0.35 + postcss-values-parser: 2.0.1 + dev: true + engines: + node: '>=6.0.0' + resolution: + integrity: sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw== + /postcss-color-hex-alpha/5.0.3: + dependencies: + postcss: 7.0.35 + postcss-values-parser: 2.0.1 + dev: true + engines: + node: '>=6.0.0' + resolution: + integrity: sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw== + /postcss-color-mod-function/3.0.3: + dependencies: + '@csstools/convert-colors': 1.4.0 + postcss: 7.0.35 + postcss-values-parser: 2.0.1 + dev: true + engines: + node: '>=6.0.0' + resolution: + integrity: sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ== + /postcss-color-rebeccapurple/4.0.1: + dependencies: + postcss: 7.0.35 + postcss-values-parser: 2.0.1 + dev: true + engines: + node: '>=6.0.0' + resolution: + integrity: sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g== + /postcss-custom-media/7.0.8: + dependencies: + postcss: 7.0.35 + dev: true + engines: + node: '>=6.0.0' + resolution: + integrity: sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg== + /postcss-custom-properties/8.0.11: + dependencies: + postcss: 7.0.35 + postcss-values-parser: 2.0.1 + dev: true + engines: + node: '>=6.0.0' + resolution: + integrity: sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA== + /postcss-custom-selectors/5.1.2: + dependencies: + postcss: 7.0.35 + postcss-selector-parser: 5.0.0 + dev: true + engines: + node: '>=6.0.0' + resolution: + integrity: sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w== + /postcss-dir-pseudo-class/5.0.0: + dependencies: + postcss: 7.0.35 + postcss-selector-parser: 5.0.0 + dev: true + engines: + node: '>=4.0.0' + resolution: + integrity: sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw== + /postcss-discard-comments/4.0.2: + dependencies: + postcss: 7.0.35 + dev: true + engines: + node: '>=6.9.0' + resolution: + integrity: sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg== + /postcss-double-position-gradients/1.0.0: + dependencies: + postcss: 7.0.35 + postcss-values-parser: 2.0.1 + dev: true + engines: + node: '>=6.0.0' + resolution: + integrity: sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA== + /postcss-env-function/2.0.2: + dependencies: + postcss: 7.0.35 + postcss-values-parser: 2.0.1 + dev: true + engines: + node: '>=6.0.0' + resolution: + integrity: sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw== + /postcss-focus-visible/4.0.0: + dependencies: + postcss: 7.0.35 + dev: true + engines: + node: '>=6.0.0' + resolution: + integrity: sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g== + /postcss-focus-within/3.0.0: + dependencies: + postcss: 7.0.35 + dev: true + engines: + node: '>=6.0.0' + resolution: + integrity: sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w== + /postcss-font-variant/4.0.1: + dependencies: + postcss: 7.0.35 + dev: true + resolution: + integrity: sha512-I3ADQSTNtLTTd8uxZhtSOrTCQ9G4qUVKPjHiDk0bV75QSxXjVWiJVJ2VLdspGUi9fbW9BcjKJoRvxAH1pckqmA== + /postcss-functions/3.0.0: + dependencies: + glob: 7.1.6 + object-assign: 4.1.1 + postcss: 6.0.23 + postcss-value-parser: 3.3.1 + dev: true + resolution: + integrity: sha1-DpTQFERwCkgd4g3k1V+yZAVkJQ4= + /postcss-gap-properties/2.0.0: + dependencies: + postcss: 7.0.35 + dev: true + engines: + node: '>=6.0.0' + resolution: + integrity: sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg== + /postcss-image-set-function/3.0.1: + dependencies: + postcss: 7.0.35 + postcss-values-parser: 2.0.1 + dev: true + engines: + node: '>=6.0.0' + resolution: + integrity: sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw== + /postcss-import/12.0.1: + dependencies: + postcss: 7.0.35 + postcss-value-parser: 3.3.1 + read-cache: 1.0.0 + resolve: 1.20.0 + dev: true + engines: + node: '>=6.0.0' + resolution: + integrity: sha512-3Gti33dmCjyKBgimqGxL3vcV8w9+bsHwO5UrBawp796+jdardbcFl4RP5w/76BwNL7aGzpKstIfF9I+kdE8pTw== + /postcss-initial/3.0.2: + dependencies: + lodash.template: 4.5.0 + postcss: 7.0.35 + dev: true + resolution: + integrity: sha512-ugA2wKonC0xeNHgirR4D3VWHs2JcU08WAi1KFLVcnb7IN89phID6Qtg2RIctWbnvp1TM2BOmDtX8GGLCKdR8YA== + /postcss-js/2.0.3: + dependencies: + camelcase-css: 2.0.1 + postcss: 7.0.35 + dev: true + resolution: + integrity: sha512-zS59pAk3deu6dVHyrGqmC3oDXBdNdajk4k1RyxeVXCrcEDBUBHoIhE4QTsmhxgzXxsaqFDAkUZfmMa5f/N/79w== + /postcss-lab-function/2.0.1: + dependencies: + '@csstools/convert-colors': 1.4.0 + postcss: 7.0.35 + postcss-values-parser: 2.0.1 + dev: true + engines: + node: '>=6.0.0' + resolution: + integrity: sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg== + /postcss-load-config/3.0.1: + dependencies: + cosmiconfig: 7.0.0 + import-cwd: 3.0.0 + dev: true + engines: + node: '>= 10' + resolution: + integrity: sha512-/pDHe30UYZUD11IeG8GWx9lNtu1ToyTsZHnyy45B4Mrwr/Kb6NgYl7k753+05CJNKnjbwh4975amoPJ+TEjHNQ== + /postcss-logical/3.0.0: + dependencies: + postcss: 7.0.35 + dev: true + engines: + node: '>=6.0.0' + resolution: + integrity: sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA== + /postcss-media-minmax/4.0.0: + dependencies: + postcss: 7.0.35 + dev: true + engines: + node: '>=6.0.0' + resolution: + integrity: sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw== + /postcss-modules-extract-imports/3.0.0_postcss@8.2.8: + dependencies: + postcss: 8.2.8 + dev: true + engines: + node: ^10 || ^12 || >= 14 + peerDependencies: + postcss: ^8.1.0 + resolution: + integrity: sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== + /postcss-modules-local-by-default/4.0.0_postcss@8.2.8: + dependencies: + icss-utils: 5.1.0_postcss@8.2.8 + postcss: 8.2.8 + postcss-selector-parser: 6.0.4 + postcss-value-parser: 4.1.0 + dev: true + engines: + node: ^10 || ^12 || >= 14 + peerDependencies: + postcss: ^8.1.0 + resolution: + integrity: sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ== + /postcss-modules-scope/3.0.0_postcss@8.2.8: + dependencies: + postcss: 8.2.8 + postcss-selector-parser: 6.0.4 + dev: true + engines: + node: ^10 || ^12 || >= 14 + peerDependencies: + postcss: ^8.1.0 + resolution: + integrity: sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg== + /postcss-modules-values/4.0.0_postcss@8.2.8: + dependencies: + icss-utils: 5.1.0_postcss@8.2.8 + postcss: 8.2.8 + dev: true + engines: + node: ^10 || ^12 || >= 14 + peerDependencies: + postcss: ^8.1.0 + resolution: + integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== + /postcss-modules/4.0.0_postcss@8.2.8: + dependencies: + generic-names: 2.0.1 + icss-replace-symbols: 1.1.0 + lodash.camelcase: 4.3.0 + postcss: 8.2.8 + postcss-modules-extract-imports: 3.0.0_postcss@8.2.8 + postcss-modules-local-by-default: 4.0.0_postcss@8.2.8 + postcss-modules-scope: 3.0.0_postcss@8.2.8 + postcss-modules-values: 4.0.0_postcss@8.2.8 + string-hash: 1.1.3 + dev: true + peerDependencies: + postcss: ^8.0.0 + resolution: + integrity: sha512-ghS/ovDzDqARm4Zj6L2ntadjyQMoyJmi0JkLlYtH2QFLrvNlxH5OAVRPWPeKilB0pY7SbuhO173KOWkPAxRJcw== + /postcss-nested/4.2.3: + dependencies: + postcss: 7.0.35 + postcss-selector-parser: 6.0.4 + dev: true + resolution: + integrity: sha512-rOv0W1HquRCamWy2kFl3QazJMMe1ku6rCFoAAH+9AcxdbpDeBr6k968MLWuLjvjMcGEip01ak09hKOEgpK9hvw== + /postcss-nesting/7.0.1: + dependencies: + postcss: 7.0.35 + dev: true + engines: + node: '>=6.0.0' + resolution: + integrity: sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg== + /postcss-overflow-shorthand/2.0.0: + dependencies: + postcss: 7.0.35 + dev: true + engines: + node: '>=6.0.0' + resolution: + integrity: sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g== + /postcss-page-break/2.0.0: + dependencies: + postcss: 7.0.35 + dev: true + resolution: + integrity: sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ== + /postcss-place/4.0.1: + dependencies: + postcss: 7.0.35 + postcss-values-parser: 2.0.1 + dev: true + engines: + node: '>=6.0.0' + resolution: + integrity: sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg== + /postcss-preset-env/6.7.0: + dependencies: + autoprefixer: 9.8.6 + browserslist: 4.16.3 + caniuse-lite: 1.0.30001204 + css-blank-pseudo: 0.1.4 + css-has-pseudo: 0.10.0 + css-prefers-color-scheme: 3.1.1 + cssdb: 4.4.0 + postcss: 7.0.35 + postcss-attribute-case-insensitive: 4.0.2 + postcss-color-functional-notation: 2.0.1 + postcss-color-gray: 5.0.0 + postcss-color-hex-alpha: 5.0.3 + postcss-color-mod-function: 3.0.3 + postcss-color-rebeccapurple: 4.0.1 + postcss-custom-media: 7.0.8 + postcss-custom-properties: 8.0.11 + postcss-custom-selectors: 5.1.2 + postcss-dir-pseudo-class: 5.0.0 + postcss-double-position-gradients: 1.0.0 + postcss-env-function: 2.0.2 + postcss-focus-visible: 4.0.0 + postcss-focus-within: 3.0.0 + postcss-font-variant: 4.0.1 + postcss-gap-properties: 2.0.0 + postcss-image-set-function: 3.0.1 + postcss-initial: 3.0.2 + postcss-lab-function: 2.0.1 + postcss-logical: 3.0.0 + postcss-media-minmax: 4.0.0 + postcss-nesting: 7.0.1 + postcss-overflow-shorthand: 2.0.0 + postcss-page-break: 2.0.0 + postcss-place: 4.0.1 + postcss-pseudo-class-any-link: 6.0.0 + postcss-replace-overflow-wrap: 3.0.0 + postcss-selector-matches: 4.0.0 + postcss-selector-not: 4.0.1 + dev: true + engines: + node: '>=6.0.0' + resolution: + integrity: sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg== + /postcss-pseudo-class-any-link/6.0.0: + dependencies: + postcss: 7.0.35 + postcss-selector-parser: 5.0.0 + dev: true + engines: + node: '>=6.0.0' + resolution: + integrity: sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew== + /postcss-replace-overflow-wrap/3.0.0: + dependencies: + postcss: 7.0.35 + dev: true + resolution: + integrity: sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw== + /postcss-selector-matches/4.0.0: + dependencies: + balanced-match: 1.0.0 + postcss: 7.0.35 + dev: true + resolution: + integrity: sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww== + /postcss-selector-not/4.0.1: + dependencies: + balanced-match: 1.0.0 + postcss: 7.0.35 + dev: true + resolution: + integrity: sha512-YolvBgInEK5/79C+bdFMyzqTg6pkYqDbzZIST/PDMqa/o3qtXenD05apBG2jLgT0/BQ77d4U2UK12jWpilqMAQ== + /postcss-selector-parser/5.0.0: + dependencies: + cssesc: 2.0.0 + indexes-of: 1.0.1 + uniq: 1.0.1 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ== + /postcss-selector-parser/6.0.4: + dependencies: + cssesc: 3.0.0 + indexes-of: 1.0.1 + uniq: 1.0.1 + util-deprecate: 1.0.2 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw== + /postcss-value-parser/3.3.1: + dev: true + resolution: + integrity: sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== + /postcss-value-parser/4.1.0: + dev: true + resolution: + integrity: sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ== + /postcss-values-parser/2.0.1: + dependencies: + flatten: 1.0.3 + indexes-of: 1.0.1 + uniq: 1.0.1 + dev: true + engines: + node: '>=6.14.4' + resolution: + integrity: sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg== + /postcss/6.0.23: + dependencies: + chalk: 2.4.2 + source-map: 0.6.1 + supports-color: 5.5.0 + dev: true + engines: + node: '>=4.0.0' + resolution: + integrity: sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag== + /postcss/7.0.35: + dependencies: + chalk: 2.4.2 + source-map: 0.6.1 + supports-color: 6.1.0 + dev: true + engines: + node: '>=6.0.0' + resolution: + integrity: sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg== + /postcss/8.2.8: + dependencies: + colorette: 1.2.2 + nanoid: 3.1.22 + source-map: 0.6.1 + dev: true + engines: + node: ^10 || ^12 || >=14 + resolution: + integrity: sha512-1F0Xb2T21xET7oQV9eKuctbM9S7BC0fetoHCc4H13z0PT6haiRLP4T0ZY4XWh7iLP0usgqykT6p9B2RtOf4FPw== + /prelude-ls/1.1.2: + dev: false + engines: + node: '>= 0.8.0' + resolution: + integrity: sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= + /prelude-ls/1.2.1: + dev: true + engines: + node: '>= 0.8.0' + resolution: + integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + /prepend-http/2.0.0: + dev: true + engines: + node: '>=4' + resolution: + integrity: sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= + /prettier-plugin-svelte/2.2.0_prettier@1.19.1+svelte@3.35.0: + dependencies: + prettier: 1.19.1 + svelte: 3.35.0 + dev: true + peerDependencies: + prettier: ^1.16.4 || ^2.0.0 + svelte: ^3.2.0 + resolution: + integrity: sha512-Xdmqgr71tAuMqqzNCK52/v94g/Yv7V7lz+nmbO9NEA+9ol15VV3uUHOfydMNOo3SWvFaVlBcp947ebEaMWqVfQ== + /prettier/1.19.1: + dev: true + engines: + node: '>=4' + hasBin: true + resolution: + integrity: sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew== + /pretty-hrtime/1.0.3: + dev: true + engines: + node: '>= 0.8' + resolution: + integrity: sha1-t+PqQkNaTJsnWdmeDyAesZWALuE= + /process-nextick-args/2.0.1: + resolution: + integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + /progress/2.0.3: + dev: true + engines: + node: '>=0.4.0' + resolution: + integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + /prop-types/15.7.2: + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + dev: true + resolution: + integrity: sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== + /proxy-addr/2.0.6: + dependencies: + forwarded: 0.1.2 + ipaddr.js: 1.9.1 + dev: true + engines: + node: '>= 0.10' + optional: true + resolution: + integrity: sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw== + /psl/1.8.0: + dev: false + resolution: + integrity: sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== + /pstree.remy/1.1.8: + dev: true + resolution: + integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w== + /pump/3.0.0: + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + resolution: + integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + /punycode/2.1.1: + engines: + node: '>=6' + resolution: + integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + /pupa/2.1.1: + dependencies: + escape-goat: 2.1.1 + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A== + /purgecss/3.1.3: + dependencies: + commander: 6.2.1 + glob: 7.1.6 + postcss: 8.2.8 + postcss-selector-parser: 6.0.4 + dev: true + hasBin: true + resolution: + integrity: sha512-hRSLN9mguJ2lzlIQtW4qmPS2kh6oMnA9RxdIYK8sz18QYqd6ePp4GNDl18oWHA1f2v2NEQIh51CO8s/E3YGckQ== + /qs/6.5.2: + dev: false + engines: + node: '>=0.6' + resolution: + integrity: sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== + /qs/6.7.0: + dev: true + engines: + node: '>=0.6' + optional: true + resolution: + integrity: sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== + /queue-microtask/1.2.3: + resolution: + integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + /quick-format-unescaped/4.0.1: + dev: false + resolution: + integrity: sha512-RyYpQ6Q5/drsJyOhrWHYMWTedvjTIat+FTwv0K4yoUxzvekw2aRHMQJLlnvt8UantkZg2++bEzD9EdxXqkWf4A== + /randombytes/2.1.0: + dependencies: + safe-buffer: 5.2.1 + dev: true + resolution: + integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + /range-parser/1.2.1: + engines: + node: '>= 0.6' + resolution: + integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + /raw-body/2.4.0: + dependencies: + bytes: 3.1.0 + http-errors: 1.7.2 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + dev: true + engines: + node: '>= 0.8' + optional: true + resolution: + integrity: sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== + /raw-body/2.4.1: + dependencies: + bytes: 3.1.0 + http-errors: 1.7.3 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + dev: true + engines: + node: '>= 0.8' + optional: true + resolution: + integrity: sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA== + /rc/1.2.8: + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.5 + strip-json-comments: 2.0.1 + dev: true + hasBin: true + resolution: + integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + /react-is/16.13.1: + dev: true + resolution: + integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + /read-cache/1.0.0: + dependencies: + pify: 2.3.0 + dev: true + resolution: + integrity: sha1-5mTvMRYRZsl1HNvo28+GtftY93Q= + /read-pkg-up/2.0.0: + dependencies: + find-up: 2.1.0 + read-pkg: 2.0.0 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4= + /read-pkg/2.0.0: + dependencies: + load-json-file: 2.0.0 + normalize-package-data: 2.5.0 + path-type: 2.0.0 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg= + /read-pkg/3.0.0: + dependencies: + load-json-file: 4.0.0 + normalize-package-data: 2.5.0 + path-type: 3.0.0 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= + /readable-stream/2.3.7: + dependencies: + core-util-is: 1.0.2 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + resolution: + integrity: sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + /readable-stream/3.6.0: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + engines: + node: '>= 6' + resolution: + integrity: sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + /readdirp/3.5.0: + dependencies: + picomatch: 2.2.2 + dev: true + engines: + node: '>=8.10.0' + resolution: + integrity: sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ== + /rechoir/0.6.2: + dependencies: + resolve: 1.20.0 + dev: false + engines: + node: '>= 0.10' + resolution: + integrity: sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q= + /reduce-css-calc/2.1.8: + dependencies: + css-unit-converter: 1.1.2 + postcss-value-parser: 3.3.1 + dev: true + resolution: + integrity: sha512-8liAVezDmUcH+tdzoEGrhfbGcP7nOV4NkGE3a74+qqvE7nt9i4sKLGBuZNOnpI4WiGksiNPklZxva80061QiPg== + /regexp-clone/1.0.0: + dev: false + resolution: + integrity: sha512-TuAasHQNamyyJ2hb97IuBEif4qBHGjPHBS64sZwytpLEqtBQ1gPJTnOaQ6qmpET16cK14kkjbazl6+p0RRv0yw== + /regexp.prototype.flags/1.3.1: + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.3 + dev: true + engines: + node: '>= 0.4' + resolution: + integrity: sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA== + /regexpp/3.1.0: + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== + /registry-auth-token/4.2.1: + dependencies: + rc: 1.2.8 + dev: true + engines: + node: '>=6.0.0' + resolution: + integrity: sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw== + /registry-url/5.1.0: + dependencies: + rc: 1.2.8 + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw== + /request-promise-core/1.1.4_request@2.88.2: + dependencies: + lodash: 4.17.21 + request: 2.88.2 + dev: false + engines: + node: '>=0.10.0' + peerDependencies: + request: ^2.34 + resolution: + integrity: sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw== + /request-promise-native/1.0.9_request@2.88.2: + dependencies: + request: 2.88.2 + request-promise-core: 1.1.4_request@2.88.2 + stealthy-require: 1.1.1 + tough-cookie: 2.5.0 + deprecated: request-promise-native has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142 + dev: false + engines: + node: '>=0.12.0' + peerDependencies: + request: ^2.34 + resolution: + integrity: sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g== + /request/2.88.2: + dependencies: + aws-sign2: 0.7.0 + aws4: 1.11.0 + caseless: 0.12.0 + combined-stream: 1.0.8 + extend: 3.0.2 + forever-agent: 0.6.1 + form-data: 2.3.3 + har-validator: 5.1.5 + http-signature: 1.2.0 + is-typedarray: 1.0.0 + isstream: 0.1.2 + json-stringify-safe: 5.0.1 + mime-types: 2.1.29 + oauth-sign: 0.9.0 + performance-now: 2.1.0 + qs: 6.5.2 + safe-buffer: 5.2.1 + tough-cookie: 2.5.0 + tunnel-agent: 0.6.0 + uuid: 3.4.0 + deprecated: request has been deprecated, see https://github.com/request/request/issues/3142 + dev: false + engines: + node: '>= 6' + resolution: + integrity: sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== + /require-directory/2.1.1: + dev: true + engines: + node: '>=0.10.0' + optional: true + resolution: + integrity: sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + /require-relative/0.8.7: + dev: true + resolution: + integrity: sha1-eZlTn8ngR6N5KPoZb44VY9q9Nt4= + /require_optional/1.0.1: + dependencies: + resolve-from: 2.0.0 + semver: 5.7.1 + resolution: + integrity: sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g== + /requires-port/1.0.0: + dev: true + resolution: + integrity: sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= + /resolve-from/2.0.0: + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-lICrIOlP+h2egKgEx+oUdhGWa1c= + /resolve-from/4.0.0: + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + /resolve-from/5.0.0: + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + /resolve-path/1.4.0: + dependencies: + http-errors: 1.6.3 + path-is-absolute: 1.0.1 + dev: true + engines: + node: '>= 0.8' + resolution: + integrity: sha1-xL2p9e+y/OZSR4c6s2u02DT+Fvc= + /resolve/1.20.0: + dependencies: + is-core-module: 2.2.0 + path-parse: 1.0.6 + resolution: + integrity: sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== + /responselike/1.0.2: + dependencies: + lowercase-keys: 1.0.1 + dev: true + resolution: + integrity: sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec= + /restore-cursor/3.1.0: + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.3 + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + /ret/0.2.2: + dev: false + engines: + node: '>=4' + resolution: + integrity: sha512-M0b3YWQs7R3Z917WRQy1HHA7Ba7D8hvZg6UE5mLykJxQVE2ju0IXbGlaHPPlkY+WN7wFP+wUMXmBFA0aV6vYGQ== + /reusify/1.0.4: + engines: + iojs: '>=1.0.0' + node: '>=0.10.0' + resolution: + integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + /rfdc/1.3.0: + dev: false + resolution: + integrity: sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== + /rimraf/2.6.3: + dependencies: + glob: 7.1.6 + dev: true + hasBin: true + resolution: + integrity: sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== + /rimraf/3.0.2: + dependencies: + glob: 7.1.6 + dev: true + hasBin: true + resolution: + integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + /rollup-plugin-dynamic-import-variables/1.1.0_rollup@2.42.3: + dependencies: + '@rollup/pluginutils': 3.1.0_rollup@2.42.3 + estree-walker: 2.0.2 + globby: 11.0.3 + magic-string: 0.25.7 + dev: true + peerDependencies: + rollup: '*' + resolution: + integrity: sha512-C1avEmnXC8cC4aAQ5dB63O9oQf7IrhEHc98bQw9Qd6H36FxtZooLCvVfcO4SNYrqaNrzH3ErucQt/zdFSLPHNw== + /rollup-plugin-hot-nollup/0.1.2: + dependencies: + '@rollup/pluginutils': 3.1.0 + dev: true + resolution: + integrity: sha512-QE4/CO7CFWSwZDmp/K+bMEOdP+i9aZiEw2u1sF+BiYE+0VQTu/FfzhJUxI0PDthBjzLZfEW31rwQJhVueuSL8w== + /rollup-plugin-svelte-hot/0.11.2_svelte@3.35.0: + dependencies: + require-relative: 0.8.7 + rollup-plugin-hot-nollup: 0.1.2 + rollup-pluginutils: 2.8.2 + sourcemap-codec: 1.4.8 + svelte: 3.35.0 + svelte-hmr: 0.11.6_svelte@3.35.0 + dev: true + optionalDependencies: + nollup: 0.15.6 + peerDependencies: + rollup: '>=1.19.2' + svelte: '>=3.19.0' + resolution: + integrity: sha512-3cQnFZlrQbknbEwtEwxC2TcT2HO3BYR4/9A/7Dfzm93sQ4lvyAYlCh4JS4FximrR1jWrI/mgaOtUKYDudGIkmg== + /rollup-plugin-terser/7.0.2_rollup@2.42.3: + dependencies: + '@babel/code-frame': 7.12.13 + jest-worker: 26.6.2 + rollup: 2.42.3 + serialize-javascript: 4.0.0 + terser: 5.6.1 + dev: true + peerDependencies: + rollup: ^2.0.0 + resolution: + integrity: sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ== + /rollup-plugin-visualizer/4.2.2: + dependencies: + nanoid: 3.1.22 + open: 7.4.2 + source-map: 0.7.3 + yargs: 16.2.0 + dev: true + engines: + node: '>=10' + hasBin: true + optional: true + peerDependencies: + rollup: '>=1.20.0' + resolution: + integrity: sha512-10/TsugsaQL5rdynl0lrklBngTtkRBESZdxUJy+3fN+xKqNdg5cr7JQU1OoPx4p5mhQ+nspa6EvX3qc8SsBvnA== + /rollup-plugin-vue/6.0.0_@vue+compiler-sfc@3.0.7: + dependencies: + '@vue/compiler-sfc': 3.0.7_vue@3.0.7 + debug: 4.3.1 + hash-sum: 2.0.0 + rollup-pluginutils: 2.8.2 + dev: true + peerDependencies: + '@vue/compiler-sfc': '*' + resolution: + integrity: sha512-oVvUd84d5u73M2HYM3XsMDLtZRIA/tw2U0dmHlXU2UWP5JARYHzh/U9vcxaN/x/9MrepY7VH3pHFeOhrWpxs/Q== + /rollup-plugin-web-worker-loader/1.6.1_rollup@2.42.3: + dependencies: + rollup: 2.42.3 + dev: true + peerDependencies: + rollup: ^1.9.2 || ^2.0.0 + resolution: + integrity: sha512-4QywQSz1NXFHKdyiou16mH3ijpcfLtLGOrAqvAqu1Gx+P8+zj+3gwC2BSL/VW1d+LW4nIHC8F7d7OXhs9UdR2A== + /rollup-pluginutils/2.8.2: + dependencies: + estree-walker: 0.6.1 + resolution: + integrity: sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ== + /rollup/2.42.3: + dev: true + engines: + node: '>=10.0.0' + hasBin: true + optionalDependencies: + fsevents: 2.3.2 + resolution: + integrity: sha512-JjaT9WaUS5vmjy6xUrnPOskjkQg2cN4WSACNCwbOvBz8VDmbiKVdmTFUoMPRqTud0tsex8Xy9/boLbDW9HKD1w== + /run-parallel/1.2.0: + dependencies: + queue-microtask: 1.2.3 + dev: true + resolution: + integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + /safe-buffer/5.1.2: + resolution: + integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + /safe-buffer/5.2.1: + resolution: + integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + /safe-regex2/2.0.0: + dependencies: + ret: 0.2.2 + dev: false + resolution: + integrity: sha512-PaUSFsUaNNuKwkBijoAPHAK6/eM6VirvyPWlZ7BAQy4D+hCvh4B6lIG+nPdhbFfIbP+gTGBcrdsOaUs0F+ZBOQ== + /safer-buffer/2.1.2: + resolution: + integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + /saslprep/1.0.3: + dependencies: + sparse-bitfield: 3.0.3 + engines: + node: '>=6' + optional: true + resolution: + integrity: sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag== + /saxes/5.0.1: + dependencies: + xmlchars: 2.2.0 + dev: false + engines: + node: '>=10' + resolution: + integrity: sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== + /secure-json-parse/2.3.2: + dev: false + resolution: + integrity: sha512-4oUSFU0w2d8/XQb7NO9dbMYyp/hxIwZPcZcGAlAAEziMRHs+NbUcx2Z5dda/z8o+avyQ8gpuYnTMlGh8SVwg9g== + /selfsigned/1.10.8: + dependencies: + node-forge: 0.10.0 + dev: true + resolution: + integrity: sha512-2P4PtieJeEwVgTU9QEcwIRDQ/mXJLX8/+I3ur+Pg16nS8oNbrGxEso9NyYWy8NAmXiNl4dlAp5MwoNeCWzON4w== + /semver-diff/3.1.1: + dependencies: + semver: 6.3.0 + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg== + /semver-store/0.3.0: + dev: false + resolution: + integrity: sha512-TcZvGMMy9vodEFSse30lWinkj+JgOBvPn8wRItpQRSayhc+4ssDs335uklkfvQQJgL/WvmHLVj4Ycv2s7QCQMg== + /semver/5.7.1: + hasBin: true + resolution: + integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + /semver/6.3.0: + dev: true + hasBin: true + resolution: + integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + /semver/7.3.5: + dependencies: + lru-cache: 6.0.0 + engines: + node: '>=10' + hasBin: true + resolution: + integrity: sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== + /send/0.17.1: + dependencies: + debug: 2.6.9 + depd: 1.1.2 + destroy: 1.0.4 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 1.7.3 + mime: 1.6.0 + ms: 2.1.1 + on-finished: 2.3.0 + range-parser: 1.2.1 + statuses: 1.5.0 + engines: + node: '>= 0.8.0' + resolution: + integrity: sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== + /serialize-javascript/4.0.0: + dependencies: + randombytes: 2.1.0 + dev: true + resolution: + integrity: sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw== + /serve-static/1.14.1: + dependencies: + encodeurl: 1.0.2 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.17.1 + dev: true + engines: + node: '>= 0.8.0' + optional: true + resolution: + integrity: sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== + /set-cookie-parser/2.4.8: + dev: false + resolution: + integrity: sha512-edRH8mBKEWNVIVMKejNnuJxleqYE/ZSdcT8/Nem9/mmosx12pctd80s2Oy00KNZzrogMZS5mauK2/ymL1bvlvg== + /setprototypeof/1.1.0: + dev: true + resolution: + integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== + /setprototypeof/1.1.1: + resolution: + integrity: sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== + /setprototypeof/1.2.0: + resolution: + integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + /shebang-command/1.2.0: + dependencies: + shebang-regex: 1.0.0 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + /shebang-command/2.0.0: + dependencies: + shebang-regex: 3.0.0 + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + /shebang-regex/1.0.0: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + /shebang-regex/3.0.0: + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + /shell-quote/1.7.2: + dev: true + resolution: + integrity: sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg== + /shelljs/0.8.4: + dependencies: + glob: 7.1.6 + interpret: 1.4.0 + rechoir: 0.6.2 + dev: false + engines: + node: '>=4' + hasBin: true + resolution: + integrity: sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ== + /side-channel/1.0.4: + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.1.1 + object-inspect: 1.9.0 + dev: true + resolution: + integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + /sift/7.0.1: + dev: false + resolution: + integrity: sha512-oqD7PMJ+uO6jV9EQCl0LrRw1OwsiPsiFQR5AR30heR+4Dl7jBBbDLnNvWiak20tzZlSE1H7RB30SX/1j/YYT7g== + /signal-exit/3.0.3: + dev: true + resolution: + integrity: sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== + /simple-swizzle/0.2.2: + dependencies: + is-arrayish: 0.3.2 + dev: true + resolution: + integrity: sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo= + /slash/3.0.0: + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + /slice-ansi/2.1.0: + dependencies: + ansi-styles: 3.2.1 + astral-regex: 1.0.0 + is-fullwidth-code-point: 2.0.0 + dev: true + engines: + node: '>=6' + resolution: + integrity: sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== + /sliced/1.0.1: + dev: false + resolution: + integrity: sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E= + /sonic-boom/1.4.0: + dependencies: + atomic-sleep: 1.0.0 + flatstr: 1.0.12 + dev: false + resolution: + integrity: sha512-1xUAszhQBOrjk7uisbStQZYkZxD3vkYlCUw5qzOblWQ1ILN5v0dVPAs+QPgszzoPmbdWx6jyT9XiLJ95JdlLiQ== + /source-map-support/0.5.19: + dependencies: + buffer-from: 1.1.1 + source-map: 0.6.1 + dev: true + resolution: + integrity: sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== + /source-map/0.5.7: + dev: true + engines: + node: '>=0.10.0' + optional: true + resolution: + integrity: sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + /source-map/0.6.1: + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + /source-map/0.7.3: + dev: true + engines: + node: '>= 8' + resolution: + integrity: sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== + /sourcemap-codec/1.4.8: + dev: true + resolution: + integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== + /sparse-bitfield/3.0.3: + dependencies: + memory-pager: 1.5.0 + optional: true + resolution: + integrity: sha1-/0rm5oZWBWuks+eSqzM004JzyhE= + /spdx-correct/3.1.1: + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.7 + dev: true + resolution: + integrity: sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== + /spdx-exceptions/2.3.0: + dev: true + resolution: + integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== + /spdx-expression-parse/3.0.1: + dependencies: + spdx-exceptions: 2.3.0 + spdx-license-ids: 3.0.7 + dev: true + resolution: + integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== + /spdx-license-ids/3.0.7: + dev: true + resolution: + integrity: sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ== + /split-ca/1.0.1: + dev: false + resolution: + integrity: sha1-bIOv82kvphJW4M0ZfgXp3hV2kaY= + /sprintf-js/1.0.3: + dev: true + resolution: + integrity: sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + /ssh2-streams/0.4.10: + dependencies: + asn1: 0.2.4 + bcrypt-pbkdf: 1.0.2 + streamsearch: 0.1.2 + dev: false + engines: + node: '>=5.2.0' + resolution: + integrity: sha512-8pnlMjvnIZJvmTzUIIA5nT4jr2ZWNNVHwyXfMGdRJbug9TpI3kd99ffglgfSWqujVv/0gxwMsDn9j9RVst8yhQ== + /ssh2/0.8.9: + dependencies: + ssh2-streams: 0.4.10 + dev: false + engines: + node: '>=5.2.0' + resolution: + integrity: sha512-GmoNPxWDMkVpMFa9LVVzQZHF6EW3WKmBwL+4/GeILf2hFmix5Isxm7Amamo8o7bHiU0tC+wXsGcUXOxp8ChPaw== + /sshpk/1.16.1: + dependencies: + asn1: 0.2.4 + assert-plus: 1.0.0 + bcrypt-pbkdf: 1.0.2 + dashdash: 1.14.1 + ecc-jsbn: 0.1.2 + getpass: 0.1.7 + jsbn: 0.1.1 + safer-buffer: 2.1.2 + tweetnacl: 0.14.5 + dev: false + engines: + node: '>=0.10.0' + hasBin: true + resolution: + integrity: sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== + /standard-engine/14.0.1: + dependencies: + get-stdin: 8.0.0 + minimist: 1.2.5 + pkg-conf: 3.1.0 + xdg-basedir: 4.0.0 + dev: true + engines: + node: '>=8.10' + resolution: + integrity: sha512-7FEzDwmHDOGva7r9ifOzD3BGdTbA7ujJ50afLVdW/tK14zQEptJjbFuUfn50irqdHDcTbNh0DTIoMPynMCXb0Q== + /standard/16.0.3: + dependencies: + eslint: 7.13.0 + eslint-config-standard: 16.0.2_1ebed8346196ff7bde7431d183a61a72 + eslint-config-standard-jsx: 10.0.0_d4901a613f352504e6e19464e186980c + eslint-plugin-import: 2.22.1_eslint@7.13.0 + eslint-plugin-node: 11.1.0_eslint@7.13.0 + eslint-plugin-promise: 4.2.1 + eslint-plugin-react: 7.21.5_eslint@7.13.0 + standard-engine: 14.0.1 + dev: true + engines: + node: ^10.12.0 || >=12.0.0 + hasBin: true + resolution: + integrity: sha512-70F7NH0hSkNXosXRltjSv6KpTAOkUkSfyu3ynyM5dtRUiLtR+yX9EGZ7RKwuGUqCJiX/cnkceVM6HTZ4JpaqDg== + /statuses/1.5.0: + engines: + node: '>= 0.6' + resolution: + integrity: sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + /stealthy-require/1.1.1: + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= + /steed/1.1.3: + dependencies: + fastfall: 1.5.1 + fastparallel: 2.4.0 + fastq: 1.11.0 + fastseries: 1.7.2 + reusify: 1.0.4 + dev: false + resolution: + integrity: sha1-8VJd1a2xLrIb90dJU3Zo1iW5q8U= + /streamsearch/0.1.2: + dev: false + engines: + node: '>=0.8.0' + resolution: + integrity: sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo= + /string-hash/1.1.3: + dev: true + resolution: + integrity: sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs= + /string-similarity/4.0.4: + dev: false + resolution: + integrity: sha512-/q/8Q4Bl4ZKAPjj8WerIBJWALKkaPRfrvhfF8k/B23i4nzrlRj2/go1m90In7nG/3XDSbOo0+pu6RvCTM9RGMQ== + /string-width/3.1.0: + dependencies: + emoji-regex: 7.0.3 + is-fullwidth-code-point: 2.0.0 + strip-ansi: 5.2.0 + dev: true + engines: + node: '>=6' + resolution: + integrity: sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== + /string-width/4.2.2: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.0 + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA== + /string.prototype.matchall/4.0.4: + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.3 + es-abstract: 1.18.0 + has-symbols: 1.0.2 + internal-slot: 1.0.3 + regexp.prototype.flags: 1.3.1 + side-channel: 1.0.4 + dev: true + resolution: + integrity: sha512-pknFIWVachNcyqRfaQSeu/FUfpvJTe4uskUSZ9Wc1RijsPuzbZ8TyYT8WCNnntCjUEqQ3vUHMAfVj2+wLAisPQ== + /string.prototype.padend/3.1.2: + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.3 + es-abstract: 1.18.0 + dev: true + engines: + node: '>= 0.4' + resolution: + integrity: sha512-/AQFLdYvePENU3W5rgurfWSMU6n+Ww8n/3cUt7E+vPBB/D7YDG8x+qjoFs4M/alR2bW7Qg6xMjVwWUOvuQ0XpQ== + /string.prototype.trimend/1.0.4: + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.3 + dev: true + resolution: + integrity: sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A== + /string.prototype.trimstart/1.0.4: + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.3 + dev: true + resolution: + integrity: sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw== + /string_decoder/1.1.1: + dependencies: + safe-buffer: 5.1.2 + resolution: + integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + /string_decoder/1.3.0: + dependencies: + safe-buffer: 5.2.1 + resolution: + integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + /strip-ansi/5.2.0: + dependencies: + ansi-regex: 4.1.0 + dev: true + engines: + node: '>=6' + resolution: + integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + /strip-ansi/6.0.0: + dependencies: + ansi-regex: 5.0.0 + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== + /strip-bom/3.0.0: + dev: true + engines: + node: '>=4' + resolution: + integrity: sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= + /strip-final-newline/2.0.0: + dev: true + engines: + node: '>=6' + resolution: + integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + /strip-indent/3.0.0: + dependencies: + min-indent: 1.0.1 + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== + /strip-json-comments/2.0.1: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-PFMZQukIwml8DsNEhYwobHygpgo= + /strip-json-comments/3.1.1: + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + /supports-color/5.5.0: + dependencies: + has-flag: 3.0.0 + engines: + node: '>=4' + resolution: + integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + /supports-color/6.1.0: + dependencies: + has-flag: 3.0.0 + dev: true + engines: + node: '>=6' + resolution: + integrity: sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== + /supports-color/7.2.0: + dependencies: + has-flag: 4.0.0 + engines: + node: '>=8' + resolution: + integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + /svelte-hmr/0.11.6_svelte@3.35.0: + dependencies: + svelte: 3.35.0 + dev: true + peerDependencies: + svelte: '>=3.19.0' + resolution: + integrity: sha512-XUYcp7W26q/fF8tABZfCYGklwL4TDH48gc1KOjuBQNlTiMW63l/+rRqmfVOE/qKG5vns0J2NPo3zFjdahkwoHA== + /svelte-hmr/0.12.9_svelte@3.35.0: + dependencies: + svelte: 3.35.0 + dev: true + peerDependencies: + svelte: '>=3.19.0' + resolution: + integrity: sha512-SGE7Odznj4dqZtUVIWcoPCvZ9gHImxVIIjrz+O3DDSi0j4OaSLim6MRF4UdhlBKeW3glSRc+tXNSKYvM5x+Dyw== + /svelte-preprocess/4.6.9_eb245e292303684892eec8315e825d7a: + dependencies: + '@types/pug': 2.0.4 + '@types/sass': 1.16.0 + detect-indent: 6.0.0 + postcss: 7.0.35 + postcss-load-config: 3.0.1 + strip-indent: 3.0.0 + svelte: 3.35.0 + dev: true + engines: + node: '>= 9.11.2' + peerDependencies: + '@babel/core': ^7.10.2 + coffeescript: ^2.5.1 + less: ^3.11.3 + node-sass: '*' + postcss: ^7 || ^8 + postcss-load-config: ^2.1.0 || ^3.0.0 + pug: ^3.0.0 + sass: ^1.26.8 + stylus: ^0.54.7 + sugarss: ^2.0.0 + svelte: ^3.23.0 + typescript: ^3.9.5 || ^4.0.0 + peerDependenciesMeta: + '@babel/core': + optional: true + coffeescript: + optional: true + less: + optional: true + node-sass: + optional: true + postcss: + optional: true + postcss-load-config: + optional: true + pug: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + typescript: + optional: true + requiresBuild: true + resolution: + integrity: sha512-SROWH0rB0DJ+0Ii264cprmNu/NJyZacs5wFD71ya93Cg/oA2lKHgQm4F6j0EWA4ktFMzeuJJm/eX6fka39hEHA== + /svelte/3.35.0: + dev: true + engines: + node: '>= 8' + resolution: + integrity: sha512-gknlZkR2sXheu/X+B7dDImwANVvK1R0QGQLd8CNIfxxGPeXBmePnxfzb6fWwTQRsYQG7lYkZXvpXJvxvpsoB7g== + /svite/0.8.1_aead61d7c7f191e29d25eb4a1f5fb280: + dependencies: + '@rollup/pluginutils': 4.1.0 + chalk: 4.1.0 + commander: 6.2.1 + debug: 4.3.1 + degit: 2.8.0 + execa: 4.1.0 + lru-cache: 6.0.0 + rollup-plugin-svelte-hot: 0.11.2_svelte@3.35.0 + svelte: 3.35.0 + svelte-hmr: 0.12.9_svelte@3.35.0 + vite: 1.0.0-rc.13 + deprecated: svite 0.8.x for vite1 is no longer supported. prerelease for vite2 is 0.9.x, check https://github.com/svitejs/svite/blob/main/packages/svite + dev: true + engines: + node: ^12||^14 + npm: ^6.14 + pnpm: ^5.5 + yarn: ^1.22 || ^2 + hasBin: true + optionalDependencies: + rollup-plugin-visualizer: 4.2.2 + svelte-preprocess: 4.6.9_eb245e292303684892eec8315e825d7a + peerDependencies: + postcss: '*' + postcss-load-config: '*' + svelte: ^3.29.7 + svelte-hmr: ^0.11.6 + resolution: + integrity: sha512-DZYF0Icw+omJC8903gfrIWEjfiLyekEDdl08sY+AGrTu0j9k3SHkWkySr+22+GyfRxeY5r/Ag6Ngh6rRULPhGA== + /symbol-tree/3.2.4: + dev: false + resolution: + integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== + /table/5.4.6: + dependencies: + ajv: 6.12.6 + lodash: 4.17.21 + slice-ansi: 2.1.0 + string-width: 3.1.0 + dev: true + engines: + node: '>=6.0.0' + resolution: + integrity: sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== + /tailwindcss/2.0.1-compat: + dependencies: + '@fullhuman/postcss-purgecss': 3.1.3 + autoprefixer: 9.8.6 + bytes: 3.1.0 + chalk: 4.1.0 + color: 3.1.3 + detective: 5.2.0 + didyoumean: 1.2.1 + fs-extra: 9.1.0 + html-tags: 3.1.0 + lodash: 4.17.21 + modern-normalize: 1.0.0 + node-emoji: 1.10.0 + object-hash: 2.1.1 + postcss: 7.0.35 + postcss-functions: 3.0.0 + postcss-js: 2.0.3 + postcss-nested: 4.2.3 + postcss-selector-parser: 6.0.4 + postcss-value-parser: 4.1.0 + pretty-hrtime: 1.0.3 + reduce-css-calc: 2.1.8 + resolve: 1.20.0 + dev: true + engines: + node: '>=12.13.0' + hasBin: true + resolution: + integrity: sha512-6lRJGPW7NlM7cemvGeuyrzb/Doj1hScnCMmAVNt8iTmMhIy4n6rUo84RC8m65+AAyOpSybS4b06lb4GI6Rw6Kw== + /tar-fs/2.0.1: + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.0 + tar-stream: 2.2.0 + dev: false + resolution: + integrity: sha512-6tzWDMeroL87uF/+lin46k+Q+46rAJ0SyPGz7OW7wTgblI273hsBqk2C1j0/xNadNLKDTUL9BukSjB7cwgmlPA== + /tar-stream/2.2.0: + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.4 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.0 + engines: + node: '>=6' + resolution: + integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== + /term-size/2.2.1: + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg== + /terser/5.6.1: + dependencies: + commander: 2.20.3 + source-map: 0.7.3 + source-map-support: 0.5.19 + dev: true + engines: + node: '>=10' + hasBin: true + resolution: + integrity: sha512-yv9YLFQQ+3ZqgWCUk+pvNJwgUTdlIxUk1WTN+RnaFJe2L7ipG2csPT0ra2XRm7Cs8cxN7QXmK1rFzEwYEQkzXw== + /text-table/0.2.0: + dev: true + resolution: + integrity: sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + /tiny-lru/7.0.6: + dev: false + engines: + node: '>=6' + resolution: + integrity: sha512-zNYO0Kvgn5rXzWpL0y3RS09sMK67eGaQj9805jlK9G6pSadfriTczzLHFXa/xcW4mIRfmlB9HyQ/+SgL0V1uow== + /tmp/0.2.1: + dependencies: + rimraf: 3.0.2 + dev: true + engines: + node: '>=8.17.0' + resolution: + integrity: sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== + /to-fast-properties/2.0.0: + dev: true + engines: + node: '>=4' + resolution: + integrity: sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + /to-readable-stream/1.0.0: + dev: true + engines: + node: '>=6' + resolution: + integrity: sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== + /to-regex-range/5.0.1: + dependencies: + is-number: 7.0.0 + dev: true + engines: + node: '>=8.0' + resolution: + integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + /toidentifier/1.0.0: + engines: + node: '>=0.6' + resolution: + integrity: sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== + /touch/3.1.0: + dependencies: + nopt: 1.0.10 + dev: true + hasBin: true + resolution: + integrity: sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA== + /tough-cookie/2.5.0: + dependencies: + psl: 1.8.0 + punycode: 2.1.1 + dev: false + engines: + node: '>=0.8' + resolution: + integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + /tough-cookie/4.0.0: + dependencies: + psl: 1.8.0 + punycode: 2.1.1 + universalify: 0.1.2 + dev: false + engines: + node: '>=6' + resolution: + integrity: sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg== + /tr46/2.0.2: + dependencies: + punycode: 2.1.1 + dev: false + engines: + node: '>=8' + resolution: + integrity: sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg== + /tsconfig-paths/3.9.0: + dependencies: + '@types/json5': 0.0.29 + json5: 1.0.1 + minimist: 1.2.5 + strip-bom: 3.0.0 + dev: true + resolution: + integrity: sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw== + /tsscmp/1.0.6: + dev: true + engines: + node: '>=0.6.x' + resolution: + integrity: sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA== + /tunnel-agent/0.6.0: + dependencies: + safe-buffer: 5.2.1 + dev: false + resolution: + integrity: sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= + /tweetnacl/0.14.5: + dev: false + resolution: + integrity: sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= + /type-check/0.3.2: + dependencies: + prelude-ls: 1.1.2 + dev: false + engines: + node: '>= 0.8.0' + resolution: + integrity: sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= + /type-check/0.4.0: + dependencies: + prelude-ls: 1.2.1 + dev: true + engines: + node: '>= 0.8.0' + resolution: + integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + /type-fest/0.3.1: + dev: true + engines: + node: '>=6' + resolution: + integrity: sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ== + /type-fest/0.8.1: + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== + /type-is/1.6.18: + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.29 + dev: true + engines: + node: '>= 0.6' + resolution: + integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + /typedarray-to-buffer/3.1.5: + dependencies: + is-typedarray: 1.0.0 + dev: true + resolution: + integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== + /unbox-primitive/1.0.0: + dependencies: + function-bind: 1.1.1 + has-bigints: 1.0.1 + has-symbols: 1.0.2 + which-boxed-primitive: 1.0.2 + dev: true + resolution: + integrity: sha512-P/51NX+JXyxK/aigg1/ZgyccdAxm5K1+n8+tvqSntjOivPt19gvm1VC49RWYetsiub8WViUchdxl/KWHHB0kzA== + /undefsafe/2.0.3: + dependencies: + debug: 2.6.9 + dev: true + resolution: + integrity: sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A== + /uniq/1.0.1: + dev: true + resolution: + integrity: sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= + /unique-names-generator/4.4.0: + dev: false + engines: + node: '>=6' + resolution: + integrity: sha512-0noP+m59TGwolNqnmXfiqMA5KiTudIk6D0VgzNkk2C1Jv3Lr+sY3T07nEWBg8Uq92/FjGca1klsRR6CXFriqFw== + /unique-string/2.0.0: + dependencies: + crypto-random-string: 2.0.0 + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== + /universalify/0.1.2: + dev: false + engines: + node: '>= 4.0.0' + resolution: + integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + /universalify/2.0.0: + engines: + node: '>= 10.0.0' + resolution: + integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + /unpipe/1.0.0: + dev: true + engines: + node: '>= 0.8' + optional: true + resolution: + integrity: sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + /update-notifier/4.1.3: + dependencies: + boxen: 4.2.0 + chalk: 3.0.0 + configstore: 5.0.1 + has-yarn: 2.1.0 + import-lazy: 2.1.0 + is-ci: 2.0.0 + is-installed-globally: 0.3.2 + is-npm: 4.0.0 + is-yarn-global: 0.3.0 + latest-version: 5.1.0 + pupa: 2.1.1 + semver-diff: 3.1.1 + xdg-basedir: 4.0.0 + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A== + /uri-js/4.4.1: + dependencies: + punycode: 2.1.1 + resolution: + integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + /url-parse-lax/3.0.0: + dependencies: + prepend-http: 2.0.0 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha1-FrXK/Afb42dsGxmZF3gj1lA6yww= + /utf-8-validate/5.0.4: + dependencies: + node-gyp-build: 4.2.3 + dev: false + requiresBuild: true + resolution: + integrity: sha512-MEF05cPSq3AwJ2C7B7sHAA6i53vONoZbMGX8My5auEVm6W+dJ2Jd/TZPyGJ5CH42V2XtbI5FD28HeHeqlPzZ3Q== + /util-deprecate/1.0.2: + resolution: + integrity: sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + /utils-merge/1.0.1: + dev: true + engines: + node: '>= 0.4.0' + optional: true + resolution: + integrity: sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= + /uuid/3.4.0: + dev: false + hasBin: true + resolution: + integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + /uuid/8.3.2: + dev: true + hasBin: true + resolution: + integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + /v8-compile-cache/2.3.0: + dev: true + resolution: + integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== + /validate-npm-package-license/3.0.4: + dependencies: + spdx-correct: 3.1.1 + spdx-expression-parse: 3.0.1 + dev: true + resolution: + integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + /vary/1.1.2: + dev: true + engines: + node: '>= 0.8' + resolution: + integrity: sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= + /verror/1.10.0: + dependencies: + assert-plus: 1.0.0 + core-util-is: 1.0.2 + extsprintf: 1.3.0 + dev: false + engines: + '0': node >=0.6.0 + resolution: + integrity: sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= + /vite/1.0.0-rc.13: + dependencies: + '@babel/parser': 7.13.12 + '@koa/cors': 3.1.0 + '@rollup/plugin-commonjs': 16.0.0_rollup@2.42.3 + '@rollup/plugin-json': 4.1.0_rollup@2.42.3 + '@rollup/plugin-node-resolve': 10.0.0_rollup@2.42.3 + '@rollup/pluginutils': 4.1.0_rollup@2.42.3 + '@types/http-proxy': 1.17.5 + '@types/koa': 2.13.1 + '@types/lru-cache': 5.1.0 + '@vue/compiler-dom': 3.0.7 + '@vue/compiler-sfc': 3.0.7_vue@3.0.7 + brotli-size: 4.0.0 + cac: 6.7.2 + chalk: 4.1.0 + chokidar: 3.5.1 + clean-css: 4.2.3 + debug: 4.3.1 + dotenv: 8.2.0 + dotenv-expand: 5.1.0 + es-module-lexer: 0.3.26 + esbuild: 0.8.57 + etag: 1.8.1 + execa: 4.1.0 + fs-extra: 9.1.0 + hash-sum: 2.0.0 + isbuiltin: 1.0.0 + klona: 2.0.4 + koa: 2.13.1 + koa-conditional-get: 3.0.0 + koa-etag: 4.0.0 + koa-proxies: 0.11.0_debug@4.3.1+koa@2.13.1 + koa-send: 5.0.1 + koa-static: 5.0.0 + lru-cache: 6.0.0 + magic-string: 0.25.7 + merge-source-map: 1.1.0 + mime-types: 2.1.29 + minimist: 1.2.5 + open: 7.4.2 + ora: 5.4.0 + p-map-series: 2.1.0 + postcss-discard-comments: 4.0.2 + postcss-import: 12.0.1 + postcss-load-config: 3.0.1 + resolve: 1.20.0 + rollup: 2.42.3 + rollup-plugin-dynamic-import-variables: 1.1.0_rollup@2.42.3 + rollup-plugin-terser: 7.0.2_rollup@2.42.3 + rollup-plugin-vue: 6.0.0_@vue+compiler-sfc@3.0.7 + rollup-plugin-web-worker-loader: 1.6.1_rollup@2.42.3 + selfsigned: 1.10.8 + slash: 3.0.0 + source-map: 0.7.3 + vue: 3.0.7 + ws: 7.4.4 + dev: true + engines: + node: '>=10.16.0' + hasBin: true + resolution: + integrity: sha512-hLfTbhNPDhwXMCAWR6s6C79G/O8Is0MbslglgoHSQsRby+KnqHgtHChCVBHFeV2oZBV/3xhHhnfm94BDPFe8Ww== + /vue/3.0.7: + dependencies: + '@vue/compiler-dom': 3.0.7 + '@vue/runtime-dom': 3.0.7 + '@vue/shared': 3.0.7 + dev: true + resolution: + integrity: sha512-8h4TikD+JabbMK9aRlBO4laG0AtNHRPHynxYgWZ9sq1YUPfzynd9Jeeb27XNyZytC7aCQRX9xe1+TQJuc181Tw== + /w3c-hr-time/1.0.2: + dependencies: + browser-process-hrtime: 1.0.0 + dev: false + resolution: + integrity: sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== + /w3c-xmlserializer/2.0.0: + dependencies: + xml-name-validator: 3.0.0 + dev: false + engines: + node: '>=10' + resolution: + integrity: sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA== + /wcwidth/1.0.1: + dependencies: + defaults: 1.0.3 + dev: true + resolution: + integrity: sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g= + /webidl-conversions/5.0.0: + dev: false + engines: + node: '>=8' + resolution: + integrity: sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA== + /webidl-conversions/6.1.0: + dev: false + engines: + node: '>=10.4' + resolution: + integrity: sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== + /whatwg-encoding/1.0.5: + dependencies: + iconv-lite: 0.4.24 + dev: false + resolution: + integrity: sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== + /whatwg-mimetype/2.3.0: + dev: false + resolution: + integrity: sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== + /whatwg-url/8.4.0: + dependencies: + lodash.sortby: 4.7.0 + tr46: 2.0.2 + webidl-conversions: 6.1.0 + dev: false + engines: + node: '>=10' + resolution: + integrity: sha512-vwTUFf6V4zhcPkWp/4CQPr1TW9Ml6SF4lVyaIMBdJw5i6qUUJ1QWM4Z6YYVkfka0OUIzVo/0aNtGVGk256IKWw== + /which-boxed-primitive/1.0.2: + dependencies: + is-bigint: 1.0.1 + is-boolean-object: 1.1.0 + is-number-object: 1.0.4 + is-string: 1.0.5 + is-symbol: 1.0.3 + dev: true + resolution: + integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + /which/1.3.1: + dependencies: + isexe: 2.0.0 + dev: true + hasBin: true + resolution: + integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + /which/2.0.2: + dependencies: + isexe: 2.0.0 + dev: true + engines: + node: '>= 8' + hasBin: true + resolution: + integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + /widest-line/3.1.0: + dependencies: + string-width: 4.2.2 + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== + /word-wrap/1.2.3: + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + /wrap-ansi/7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.2 + strip-ansi: 6.0.0 + dev: true + engines: + node: '>=10' + optional: true + resolution: + integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + /wrappy/1.0.2: + resolution: + integrity: sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + /write-file-atomic/3.0.3: + dependencies: + imurmurhash: 0.1.4 + is-typedarray: 1.0.0 + signal-exit: 3.0.3 + typedarray-to-buffer: 3.1.5 + dev: true + resolution: + integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== + /write/1.0.3: + dependencies: + mkdirp: 0.5.5 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== + /ws/5.2.2: + dependencies: + async-limiter: 1.0.1 + dev: true + optional: true + resolution: + integrity: sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA== + /ws/7.4.4: + dev: true + engines: + node: '>=8.3.0' + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + resolution: + integrity: sha512-Qm8k8ojNQIMx7S+Zp8u/uHOx7Qazv3Yv4q68MiWWWOJhiwG5W3x7iqmRtJo8xxrciZUY4vRxUTJCKuRnF28ZZw== + /ws/7.4.4_c70f8fc5586dd378b8c866035dbe710b: + dependencies: + bufferutil: 4.0.3 + utf-8-validate: 5.0.4 + dev: false + engines: + node: '>=8.3.0' + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + resolution: + integrity: sha512-Qm8k8ojNQIMx7S+Zp8u/uHOx7Qazv3Yv4q68MiWWWOJhiwG5W3x7iqmRtJo8xxrciZUY4vRxUTJCKuRnF28ZZw== + /xdg-basedir/4.0.0: + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== + /xml-name-validator/3.0.0: + dev: false + resolution: + integrity: sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== + /xmlchars/2.2.0: + dev: false + resolution: + integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== + /xtend/4.0.2: + engines: + node: '>=0.4' + resolution: + integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + /y18n/5.0.5: + dev: true + engines: + node: '>=10' + optional: true + resolution: + integrity: sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg== + /yallist/3.1.1: + dev: true + resolution: + integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + /yallist/4.0.0: + resolution: + integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + /yaml/1.10.2: + dev: true + engines: + node: '>= 6' + resolution: + integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== + /yargs-parser/20.2.7: + dev: true + engines: + node: '>=10' + optional: true + resolution: + integrity: sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw== + /yargs/16.2.0: + dependencies: + cliui: 7.0.4 + escalade: 3.1.1 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.2 + y18n: 5.0.5 + yargs-parser: 20.2.7 + dev: true + engines: + node: '>=10' + optional: true + resolution: + integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + /yauzl/2.10.0: + dependencies: + buffer-crc32: 0.2.13 + fd-slicer: 1.1.0 + dev: true + resolution: + integrity: sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk= + /ylru/1.2.1: + dev: true + engines: + node: '>= 4.0.0' + resolution: + integrity: sha512-faQrqNMzcPCHGVC2aaOINk13K+aaBDUPjGWl0teOXywElLjyVAB6Oe2jj62jHYtwsU49jXhScYbvPENK+6zAvQ== +specifiers: + '@roxi/routify': ^2.7.3 + '@zerodevx/svelte-toast': ^0.1.4 + axios: ^0.21.0 + commander: ^6.2.1 + cuid: ^2.1.8 + dayjs: ^1.10.4 + deepmerge: ^4.2.2 + dockerode: ^3.2.1 + dotenv: ^8.2.0 + fastify: ^3.9.1 + fastify-env: ^2.1.0 + fastify-jwt: ^2.1.3 + fastify-plugin: ^3.0.0 + fastify-static: ^3.3.0 + generate-password: ^1.6.0 + js-yaml: ^4.0.0 + jsonwebtoken: ^8.5.1 + mongodb-memory-server-core: ^6.9.3 + mongoose: ^5.11.4 + nodemon: ^2.0.6 + npm-run-all: ^4.1.5 + postcss: ^7.0.35 + postcss-import: ^12.0.1 + postcss-load-config: ^3.0.0 + postcss-preset-env: ^6.7.0 + prettier: '1.19' + prettier-plugin-svelte: ^2.1.6 + shelljs: ^0.8.4 + standard: ^16.0.3 + svelte: ^3.29.7 + svelte-hmr: ^0.12.2 + svelte-preprocess: ^4.6.1 + svite: 0.8.1 + tailwindcss: compat + unique-names-generator: ^4.4.0 diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 000000000..996b135cf --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,7 @@ +module.exports = { + plugins: [ + require('postcss-import'), + require('tailwindcss'), + require('postcss-preset-env')({ stage: 1 }) + ] +} diff --git a/public/bye.html b/public/bye.html new file mode 100644 index 000000000..6b279a377 --- /dev/null +++ b/public/bye.html @@ -0,0 +1,3 @@ + diff --git a/public/favicon.png b/public/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..2c4482801f8cb97fa73bf0c6912f612452dab62b GIT binary patch literal 144391 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 + import { SvelteToast } from "@zerodevx/svelte-toast"; + import { Router } from "@roxi/routify"; + import { routes } from "../.routify/routes"; + const options = { + duration: 2000, + dismissable: false + }; + + + + + + diff --git a/src/components/Application/Configuration/ActiveTab/BuildStep.svelte b/src/components/Application/Configuration/ActiveTab/BuildStep.svelte new file mode 100644 index 000000000..89cf43f35 --- /dev/null +++ b/src/components/Application/Configuration/ActiveTab/BuildStep.svelte @@ -0,0 +1,22 @@ + + +
+ + + + + + + + +
diff --git a/src/components/Application/Configuration/ActiveTab/General.svelte b/src/components/Application/Configuration/ActiveTab/General.svelte new file mode 100644 index 000000000..d48584fad --- /dev/null +++ b/src/components/Application/Configuration/ActiveTab/General.svelte @@ -0,0 +1,106 @@ + + +
+
+ + +
+
+ + + + + + + {#if $application.build.pack !== "static"} + + + {/if} + +
+
\ No newline at end of file diff --git a/src/components/Application/Configuration/ActiveTab/Secrets.svelte b/src/components/Application/Configuration/ActiveTab/Secrets.svelte new file mode 100644 index 000000000..825c25f25 --- /dev/null +++ b/src/components/Application/Configuration/ActiveTab/Secrets.svelte @@ -0,0 +1,72 @@ + + +
+
New Secret
+
+ + + +
+ {#if $application.publish.secrets.length > 0} + {#each $application.publish.secrets as s} +
+ + + +
+ {/each} + {/if} +
diff --git a/src/components/Application/Configuration/Branches.svelte b/src/components/Application/Configuration/Branches.svelte new file mode 100644 index 000000000..c111e215c --- /dev/null +++ b/src/components/Application/Configuration/Branches.svelte @@ -0,0 +1,24 @@ + + +{#if loading} +
+ + +
+{:else} +
+ + + +
+{/if} diff --git a/src/components/Application/Configuration/Configuration.svelte b/src/components/Application/Configuration/Configuration.svelte new file mode 100644 index 000000000..ebffc92e2 --- /dev/null +++ b/src/components/Application/Configuration/Configuration.svelte @@ -0,0 +1,133 @@ + + +
+ {#if !$session.githubAppToken} + + {:else} + {#await loadGithub()} + + {:then} +
+ + {#if $application.repository.organization !== "new"} + + {/if} + + {#if $application.repository.branch} + + {/if} +
+ {/await} + {/if} +
diff --git a/src/components/Application/Configuration/Login.svelte b/src/components/Application/Configuration/Login.svelte new file mode 100644 index 000000000..cb16981ea --- /dev/null +++ b/src/components/Application/Configuration/Login.svelte @@ -0,0 +1,50 @@ + + +
+
+ Choose your Git provider +
+ +
diff --git a/src/components/Application/Configuration/Repositories.svelte b/src/components/Application/Configuration/Repositories.svelte new file mode 100644 index 000000000..d61add1f5 --- /dev/null +++ b/src/components/Application/Configuration/Repositories.svelte @@ -0,0 +1,45 @@ + + +
+ {#if repositories.length !== 0} + +
+ + + + +
+ {:else} + + {/if} +
diff --git a/src/components/Application/Configuration/Tabs.svelte b/src/components/Application/Configuration/Tabs.svelte new file mode 100644 index 000000000..2cfa7bace --- /dev/null +++ b/src/components/Application/Configuration/Tabs.svelte @@ -0,0 +1,97 @@ + + +
+ +
+
+
+ {#if activeTab.general} + + {:else if activeTab.buildStep} + + {:else if activeTab.secrets} + + {/if} +
+
diff --git a/src/components/Databases/Configuration/Configuration.svelte b/src/components/Databases/Configuration/Configuration.svelte new file mode 100644 index 000000000..cb453de45 --- /dev/null +++ b/src/components/Databases/Configuration/Configuration.svelte @@ -0,0 +1,90 @@ + + +
+ {#if $isActive("/database/new")} +
+ + + + +
+ {#if type} +
+
+ + +
+ +
+ {/if} + {/if} +
diff --git a/src/components/Databases/SVGs/CouchDb.svelte b/src/components/Databases/SVGs/CouchDb.svelte new file mode 100644 index 000000000..393c1f3e6 --- /dev/null +++ b/src/components/Databases/SVGs/CouchDb.svelte @@ -0,0 +1,16 @@ + + + \ No newline at end of file diff --git a/src/components/Databases/SVGs/MongoDb.svelte b/src/components/Databases/SVGs/MongoDb.svelte new file mode 100644 index 000000000..bc2bf91d5 --- /dev/null +++ b/src/components/Databases/SVGs/MongoDb.svelte @@ -0,0 +1,32 @@ + +MongoDB_Leaf_FullColor_RGB + diff --git a/src/components/Databases/SVGs/Mysql.svelte b/src/components/Databases/SVGs/Mysql.svelte new file mode 100644 index 000000000..341222f68 --- /dev/null +++ b/src/components/Databases/SVGs/Mysql.svelte @@ -0,0 +1,16 @@ + + + \ No newline at end of file diff --git a/src/components/Databases/SVGs/Postgresql.svelte b/src/components/Databases/SVGs/Postgresql.svelte new file mode 100644 index 000000000..b2fe80c99 --- /dev/null +++ b/src/components/Databases/SVGs/Postgresql.svelte @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/components/Loading.svelte b/src/components/Loading.svelte new file mode 100644 index 000000000..1fda0878b --- /dev/null +++ b/src/components/Loading.svelte @@ -0,0 +1,52 @@ + + + + +{#if fullscreen} +
+ +
+{/if} diff --git a/src/index.css b/src/index.css new file mode 100644 index 000000000..ef0247c89 --- /dev/null +++ b/src/index.css @@ -0,0 +1,18 @@ +@import "tailwindcss/base.css"; +@import "tailwindcss/components.css"; +@import "tailwindcss/utilities.css"; + +html { + height: 100%; +} +body { + background-color: rgb(22, 22, 22); + min-height: 100vh; + overflow-x: hidden; +} + +:root { + --toastBackground: rgba(41, 37, 36, 0.8); + --toastProgressBackground: transparent; + --toastFont: 'Inter'; +} \ No newline at end of file diff --git a/src/index.js b/src/index.js new file mode 100644 index 000000000..3dce485c3 --- /dev/null +++ b/src/index.js @@ -0,0 +1,8 @@ +import App from './App.svelte' +import './index.css' + +const app = new App({ + target: document.body +}) + +export default app diff --git a/src/pages/_fallback.svelte b/src/pages/_fallback.svelte new file mode 100644 index 000000000..6d8ba0f64 --- /dev/null +++ b/src/pages/_fallback.svelte @@ -0,0 +1,11 @@ + + +
diff --git a/src/pages/_layout.svelte b/src/pages/_layout.svelte new file mode 100644 index 000000000..e67ce58bf --- /dev/null +++ b/src/pages/_layout.svelte @@ -0,0 +1,258 @@ + + + + +{#await verifyToken() then notUsed} + {#if $route.path !== "/index"} + + {/if} + {#if upgradeAvailable} +
+
+
+
+ {#if !upgradeDisabled} + + {:else if upgradeDone} + + {:else} + + {/if} + +
+
+ {/if} +
+ +
+{:catch test} + {$goto("/index")} +{/await} diff --git a/src/pages/application/[organization]/[name]/[branch]/configuration.svelte b/src/pages/application/[organization]/[name]/[branch]/configuration.svelte new file mode 100644 index 000000000..8d9051118 --- /dev/null +++ b/src/pages/application/[organization]/[name]/[branch]/configuration.svelte @@ -0,0 +1,62 @@ + + + + diff --git a/src/pages/application/[organization]/[name]/[branch]/index.svelte b/src/pages/application/[organization]/[name]/[branch]/index.svelte new file mode 100644 index 000000000..d17f7bec5 --- /dev/null +++ b/src/pages/application/[organization]/[name]/[branch]/index.svelte @@ -0,0 +1,4 @@ + diff --git a/src/pages/application/[organization]/[name]/[branch]/logs/[deployId].svelte b/src/pages/application/[organization]/[name]/[branch]/logs/[deployId].svelte new file mode 100644 index 000000000..f7ecc7fcd --- /dev/null +++ b/src/pages/application/[organization]/[name]/[branch]/logs/[deployId].svelte @@ -0,0 +1,57 @@ + + +
+
Deployment log
+
+{#await loadLogs()} + +{:then} +
+
+
+      {#if logs.length > 0}
+        {#each logs as log}
+          {log + '\n'}
+        {/each}
+      {:else}
+        It's starting soon.
+      {/if}
+    
+
+
+{/await} diff --git a/src/pages/application/[organization]/[name]/[branch]/logs/index.svelte b/src/pages/application/[organization]/[name]/[branch]/logs/index.svelte new file mode 100644 index 000000000..c398c3104 --- /dev/null +++ b/src/pages/application/[organization]/[name]/[branch]/logs/index.svelte @@ -0,0 +1,140 @@ + + + + +
+
Logs
+
+{#await loadDeploymentLogs()} + +{:then} +
+
+
+
Application logs
+ {#if logs.length === 0} +
Waiting for the logs...
+ {:else} +
+            {#each logs as log}
+              {log + '\n'}
+            {/each}
+          
+ {/if} +
+
+
+ Deployment logs +
+ {#if deployments.length > 0} + {#each deployments as deployment} +
+
+ {deployment.branch} +
+
+
+
+ {deployment.since} +
+ {#if deployment.progress === "done"} +
+ Deployed in {deployment.took}s +
+ {:else if deployment.progress === "failed"} +
Failed
+ {:else} +
Deploying...
+ {/if} +
+
+ {/each} + + {:else} +
+ No deployments found +
+ {/if} +
+
+
+{:catch} +
No logs found
+{/await} diff --git a/src/pages/application/[organization]/[name]/[branch]/overview.svelte b/src/pages/application/[organization]/[name]/[branch]/overview.svelte new file mode 100644 index 000000000..906d0e963 --- /dev/null +++ b/src/pages/application/[organization]/[name]/[branch]/overview.svelte @@ -0,0 +1,31 @@ + + +
+
+ Overview of + {$application.publish.domain} + + + +
+
+ + + diff --git a/src/pages/application/[organization]/[name]/index.svelte b/src/pages/application/[organization]/[name]/index.svelte new file mode 100644 index 000000000..69f34470d --- /dev/null +++ b/src/pages/application/[organization]/[name]/index.svelte @@ -0,0 +1,4 @@ + diff --git a/src/pages/application/[organization]/index.svelte b/src/pages/application/[organization]/index.svelte new file mode 100644 index 000000000..69f34470d --- /dev/null +++ b/src/pages/application/[organization]/index.svelte @@ -0,0 +1,4 @@ + diff --git a/src/pages/application/_layout.svelte b/src/pages/application/_layout.svelte new file mode 100644 index 000000000..b673afc51 --- /dev/null +++ b/src/pages/application/_layout.svelte @@ -0,0 +1,215 @@ + + +{#await loadConfiguration()} + +{:then} + + +
+ +
+{/await} diff --git a/src/pages/application/index.svelte b/src/pages/application/index.svelte new file mode 100644 index 000000000..69f34470d --- /dev/null +++ b/src/pages/application/index.svelte @@ -0,0 +1,4 @@ + diff --git a/src/pages/application/new.svelte b/src/pages/application/new.svelte new file mode 100644 index 000000000..4c3dc3619 --- /dev/null +++ b/src/pages/application/new.svelte @@ -0,0 +1,13 @@ + + +
+
+ New Application +
+
+ + diff --git a/src/pages/dashboard/_layout.svelte b/src/pages/dashboard/_layout.svelte new file mode 100644 index 000000000..dd1a2819a --- /dev/null +++ b/src/pages/dashboard/_layout.svelte @@ -0,0 +1,32 @@ + + +
+ +
diff --git a/src/pages/dashboard/applications.svelte b/src/pages/dashboard/applications.svelte new file mode 100644 index 000000000..c060529f8 --- /dev/null +++ b/src/pages/dashboard/applications.svelte @@ -0,0 +1,120 @@ + + +
+
Applications
+ +
+
+ {#if $deployments.applications?.deployed.length > 0} +
+
+ {#each $deployments.applications.deployed as application} +
+
+
+ {#if application.Spec.Labels.configuration.build.pack === "static"} + + {:else if application.Spec.Labels.configuration.build.pack === "nodejs"} + + {/if} +
+ {application.Spec.Labels.configuration.publish + .domain}{application.Spec.Labels.configuration.publish + .path !== "/" + ? application.Spec.Labels.configuration.publish.path + : ""} +
+
+
+
+ {/each} +
+
+ {:else} +
No applications found
+ {/if} +
diff --git a/src/pages/dashboard/databases.svelte b/src/pages/dashboard/databases.svelte new file mode 100644 index 000000000..814b04b50 --- /dev/null +++ b/src/pages/dashboard/databases.svelte @@ -0,0 +1,147 @@ + + + + +
+
Databases
+ +
+
+ {#if $deployments.databases?.deployed.length > 0} +
+
+ {#each $deployments.databases.deployed as database} +
+
+
+ {#if database.Spec.Labels.configuration.general.type == "mongodb"} + + {:else if database.Spec.Labels.configuration.general.type == "postgresql"} + + {:else if database.Spec.Labels.configuration.general.type == "mysql"} + + {:else if database.Spec.Labels.configuration.general.type == "couchdb"} + + {/if} +
+ {database.Spec.Labels.configuration.general.nickname} +
+
+
+
+ {/each} + {#if $dbInprogress} +
+
+ Working... +
+
+ {/if} +
+
+ {:else} + + {#if $dbInprogress} +
+
+
+
+ Working... +
+
+
+
+ {:else} +
No databases found
+ {/if} + {/if} +
diff --git a/src/pages/dashboard/index.svelte b/src/pages/dashboard/index.svelte new file mode 100644 index 000000000..69f34470d --- /dev/null +++ b/src/pages/dashboard/index.svelte @@ -0,0 +1,4 @@ + diff --git a/src/pages/database/[name]/index.svelte b/src/pages/database/[name]/index.svelte new file mode 100644 index 000000000..bf5c5bdf1 --- /dev/null +++ b/src/pages/database/[name]/index.svelte @@ -0,0 +1,4 @@ + diff --git a/src/pages/database/[name]/overview.svelte b/src/pages/database/[name]/overview.svelte new file mode 100644 index 000000000..4899a4872 --- /dev/null +++ b/src/pages/database/[name]/overview.svelte @@ -0,0 +1,91 @@ + + +{#await loadDatabaseConfig()} + +{:then} +
+
+
{$database.config.general.nickname}
+
+ {#if $database.config.general.type === "mongodb"} + + {:else if $database.config.general.type === "postgresql"} + + {:else if $database.config.general.type === "mysql"} + + {:else if $database.config.general.type === "couchdb"} + + {/if} +
+
+
+
+
+
+
Connection string
+ {#if $database.config.general.type === "mongodb"} + +
+ {/if} +
+{/await} diff --git a/src/pages/database/_layout.svelte b/src/pages/database/_layout.svelte new file mode 100644 index 000000000..532f18ccb --- /dev/null +++ b/src/pages/database/_layout.svelte @@ -0,0 +1,71 @@ + + +{#if !$isActive("/database/new")} + +{/if} +
+ +
diff --git a/src/pages/database/index.svelte b/src/pages/database/index.svelte new file mode 100644 index 000000000..dbc608a22 --- /dev/null +++ b/src/pages/database/index.svelte @@ -0,0 +1,5 @@ + + \ No newline at end of file diff --git a/src/pages/database/new.svelte b/src/pages/database/new.svelte new file mode 100644 index 000000000..0626f6533 --- /dev/null +++ b/src/pages/database/new.svelte @@ -0,0 +1,13 @@ + + +
+
+ Select a database +
+
+ + diff --git a/src/pages/index.svelte b/src/pages/index.svelte new file mode 100644 index 000000000..e126d6f67 --- /dev/null +++ b/src/pages/index.svelte @@ -0,0 +1,65 @@ + + +
+
+
+

+ Coolify +

+

+ An open-source, hassle-free, self-hostable
+ Heroku + & Netlify alternative +

+
+ {#if !$loggedIn} + + {:else} + + {/if} +
+
+
+
diff --git a/src/pages/settings/index.svelte b/src/pages/settings/index.svelte new file mode 100644 index 000000000..d2f717584 --- /dev/null +++ b/src/pages/settings/index.svelte @@ -0,0 +1,110 @@ + + +
+
+
Settings
+
+
+{#await loadSettings()} + +{:then} +
+
+
+
+
+
    +
  • +
    +

    + Registration allowed? +

    +

    + Allow further registrations to the application. It's turned + off after the first registration. +

    +
    + +
  • +
+
+
+
+
+
+{/await} diff --git a/src/store.js b/src/store.js new file mode 100644 index 000000000..f8824d4b1 --- /dev/null +++ b/src/store.js @@ -0,0 +1,220 @@ +import { writable, derived, readable } from 'svelte/store' + +const sessionStore = { + token: window.localStorage.getItem('token') || null, + githubAppToken: null +} + +function waitAtLeast (time, promise) { + const timeoutPromise = new Promise((resolve) => { + setTimeout(resolve, time) + }) + return Promise.all([promise, timeoutPromise]).then((values) => values[0]) +}; + +export const fetch = writable( + async ( + url, + { method, body, ...customConfig } = { body: null, method: null } + ) => { + let headers = { 'Content-type': 'application/json; charset=UTF-8' } + if (method === 'DELETE') { + delete headers['Content-type'] + } + const isGithub = url.match(/api.github.com/) + if (isGithub) { + headers = Object.assign(headers, { + Authorization: `token ${sessionStore.githubAppToken}` + }) + } else { + headers = Object.assign(headers, { + Authorization: `Bearer ${sessionStore.token}` + }) + } + const config = { + cache: 'no-cache', + method: method || (body ? 'POST' : 'GET'), + ...customConfig, + headers: { + ...headers, + ...customConfig.headers + } + } + if (body) { + config.body = JSON.stringify(body) + } + const response = await waitAtLeast(350, window.fetch(url, config)) + if (response.status >= 200 && response.status <= 299) { + if (response.headers.get('content-type').match(/application\/json/)) { + return await response.json() + } else if (response.headers.get('content-type').match(/text\/plain/)) { + return await response.text() + } else if (response.headers.get('content-type').match(/multipart\/form-data/)) { + return await response.formData() + } else { + return await response.blob() + } + } else { + /* eslint-disable */ + if (response.status === 401) { + return Promise.reject({ + code: response.status, + error: 'Unauthorized' + }) + } else if (response.status >= 500) { + const error = (await response.json()).message + return Promise.reject({ + code: response.status, + error: error || 'Oops, something is not okay. Are you okay?' + }) + } else { + return Promise.reject({ + code: response.status, + error: response.statusText + }) + } + /* eslint-enable */ + } + } +) +export const session = writable(sessionStore) +export const loggedIn = derived(session, ($session) => { + return $session.token +}) +export const savedBranch = writable() + +export const dateOptions = readable({ + year: 'numeric', + month: 'short', + day: '2-digit', + hour: 'numeric', + minute: 'numeric', + second: 'numeric', + hour12: false +}) + +export const deployments = writable({}) + +export const initConf = writable({}) +export const application = writable({ + github: { + installation: { + id: null + }, + app: { + id: null + } + }, + repository: { + id: null, + organization: 'new', + name: 'start', + branch: null + }, + general: { + deployId: null, + nickname: null, + workdir: null + }, + build: { + pack: 'static', + directory: null, + command: { + build: null, + installation: null + }, + container: { + name: null, + tag: null + } + }, + publish: { + directory: null, + domain: null, + path: '/', + port: null, + secrets: [] + } +}) + +export const initialApplication = { + github: { + installation: { + id: null + }, + app: { + id: null + } + }, + repository: { + id: null, + organization: 'new', + name: 'start', + branch: null + }, + general: { + deployId: null, + nickname: null, + workdir: null + }, + build: { + pack: 'static', + directory: null, + command: { + build: null, + installation: null + }, + container: { + name: null, + tag: null + } + }, + publish: { + directory: null, + domain: null, + path: '/', + port: null, + secrets: [] + } +} +export const initialDatabase = { + config: { + general: { + workdir: null, + deployId: null, + nickname: null, + type: null + }, + database: { + username: null, + passwords: [], + defaultDatabaseName: null + }, + deploy: { + name: null + } + }, + envs: {} +} + +export const database = writable({ + config: { + general: { + workdir: null, + deployId: null, + nickname: null, + type: null + }, + database: { + username: null, + passwords: [], + defaultDatabaseName: null + }, + deploy: { + name: null + } + }, + envs: {} +}) + +export const dbInprogress = writable(false) diff --git a/svelte.config.js b/svelte.config.js new file mode 100644 index 000000000..bdb4e3047 --- /dev/null +++ b/svelte.config.js @@ -0,0 +1,4 @@ +const { postcss } = require('svelte-preprocess') +module.exports = { + preprocess: [postcss()] +} diff --git a/tailwind.config.js b/tailwind.config.js new file mode 100644 index 000000000..87bb6f463 --- /dev/null +++ b/tailwind.config.js @@ -0,0 +1,54 @@ +const { tailwindExtractor } = require('tailwindcss/lib/lib/purgeUnusedStyles') + +const svelteClassColonExtractor = (content) => { + return content.match(/(?<=class:)([a-zA-Z0-9_-]+)/gm) || [] +} +const defaultTheme = require('tailwindcss/defaultTheme') +const colors = require('tailwindcss/colors') +module.exports = { + purge: { + enabled: process.env.NODE_ENV === 'production', + content: [ + './src/**/*.svelte', + './src/**/*.html', + './src/**/*.css', + './index.html' + ], + preserveHtmlElements: true, + options: { + safelist: [/svelte-/, 'border-green-500', 'border-yellow-300', 'border-red-500'], + defaultExtractor: (content) => { + // WARNING: tailwindExtractor is internal tailwind api + // if this breaks after a tailwind update, report to svite repo + return [ + ...tailwindExtractor(content), + ...svelteClassColonExtractor(content) + ] + }, + keyframes: false + } + }, + darkMode: false, + important: true, + theme: { + extend: { + fontFamily: { + sans: ['Montserrat', ...defaultTheme.fontFamily.sans] + }, + colors: { + ...colors, + coolblack: '#161616', + 'coolgray-100': '#181818', + 'coolgray-200': '#202020', + 'coolgray-300': '#242424' + } + } + }, + variants: { + extend: { + opacity: ['disabled'], + animation: ['hover', 'focus'] + } + }, + plugins: [] +} diff --git a/vite.config.js b/vite.config.js new file mode 100644 index 000000000..190b57a07 --- /dev/null +++ b/vite.config.js @@ -0,0 +1,35 @@ +module.exports = { + alias: { + '@store': '/src/store.js' + // '/@components/': path.resolve(__dirname, '/src/components'), + }, + optimizeDeps: { + exclude: [ + '@roxi/routify', + 'fastify-static', + 'fastify', + 'fastify-autoload', + 'fastify-jwt', + 'dotenv', + 'dotenv-extended', + 'commander', + 'axios', + 'fastify-env', + 'fastify-plugin', + 'mongoose', + 'js-yaml', + 'shelljs', + 'jsonwebtoken', + 'deepmerge', + 'dockerode', + 'dayjs', + '@zerodevx/svelte-toast', + 'mongodb-memory-server-core', + 'unique-names-generator', + 'generate-password' + ] + }, + proxy: { + '/api': 'http://127.0.0.1:3001/' + } +}