commit dbe82b3e7c257c203624d27887f462cdf90ef1b1 Author: Andras Date: Wed Mar 24 22:11:14 2021 +0100 initial production release :tada: 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 000000000..2c4482801 Binary files /dev/null and b/public/favicon.png differ diff --git a/routify.config.js b/routify.config.js new file mode 100644 index 000000000..7c4e2434d --- /dev/null +++ b/routify.config.js @@ -0,0 +1,5 @@ +module.exports = { + routifyDir: '.routify', + dynamicImports: true, + extensions: ['svelte'] +} diff --git a/src/App.svelte b/src/App.svelte new file mode 100644 index 000000000..f3d16a5b8 --- /dev/null +++ b/src/App.svelte @@ -0,0 +1,63 @@ + + + + + + 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 @@ + + +
+
+ 404 +
+
Ah you lost. Don't worry. I'm here for you!
+ Go back +
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/' + } +}