diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 0ad25db..0000000 --- a/LICENSE +++ /dev/null @@ -1,661 +0,0 @@ - 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 -. diff --git a/README.md b/README.md deleted file mode 100644 index b93d500..0000000 --- a/README.md +++ /dev/null @@ -1,39 +0,0 @@ -# Woomy -![Status](https://top.gg/api/widget/status/435961704145485835.svg) -![Servers](https://top.gg/api/widget/servers/435961704145485835.svg) -![Discord](https://img.shields.io/discord/410990517841690625) -![Version](https://img.shields.io/github/package-json/v/mudkipscience/woomy-v2) -![License](https://img.shields.io/github/license/mudkipscience/woomy-v2) - -## A feature-rich and configurable Discord bot built with Discord.js for music, moderation, currency and more! - -# ARE YOU A DEVELOPER, OR MAKING A PULL REQUEST? **PLEASE ENABLE ESLINT!!!** - -**Links** -* [Official bot invite](https://discord.com/oauth2/authorize?client_id=435961704145485835&permissions=2134240503&scope=bot) -* [For updates and support join my Discord server!](https://discord.gg/HCF8mdv) - -## Using Woomy - -The easiest and recommended way to use Woomy is to invite the official version to your server, which is hosted 24/7 and gets the newest updates as soon as they come out. The invite can be found above, under links. You can also self-host, but no support will be provided to you if you decide to do this. - -## Contributors - -Thanks to the following people who have contributed to Woomy: - -* [@mudkipscience](https://github.com/mudkipscience/) - Creator and primary developer of Woomy -* [@FLGX](https://github.com/FLGX06/) - Developer -* [@TheCakeChicken](https://github.com/TheCakeChicken/) - Developer - -And a few other people as well. Check out the [Contributors](https://github.com/mudkipscience/woomy/graphs/contributors) tab! - -## Legal stuff - -### Using our code -If you wish to use our code in your project, please credit us! We don't mind you using Woomy's code (it is open source for a reason :P) as long as you dont blatantly copy it and/or refrain from crediting us. - -### License - -Copyright (C) 2018-2020 Emily J. / mudkipscience and contributors. - -Copyrights licensed under the GNU AGPLv3 License, unless otherwise specified. See the accompanying LICENSE file for details. diff --git a/application.yml b/application.yml deleted file mode 100644 index daec336..0000000 --- a/application.yml +++ /dev/null @@ -1,47 +0,0 @@ -server: # REST and WS server - port: 2333 - address: 127.0.0.1 -lavalink: - server: - password: "youshallnotpass" - sources: - youtube: true - bandcamp: true - soundcloud: true - twitch: true - vimeo: true - mixer: true - http: true - local: false - bufferDurationMs: 400 - youtubePlaylistLoadLimit: 6 # Number of pages at 100 each - youtubeSearchEnabled: true - soundcloudSearchEnabled: true - gc-warnings: true - #ratelimit: - #ipBlocks: ["1.0.0.0/8", "..."] # list of ip blocks - #excludedIps: ["...", "..."] # ips which should be explicit excluded from usage by lavalink - #strategy: "RotateOnBan" # RotateOnBan | LoadBalance | NanoSwitch | RotatingNanoSwitch - #searchTriggersFail: true # Whether a search 429 should trigger marking the ip as failing - #retryLimit: -1 # -1 = use default lavaplayer value | 0 = infinity | >0 = retry will happen this numbers times - -metrics: - prometheus: - enabled: false - endpoint: /metrics - -sentry: - dsn: "" -# tags: -# some_key: some_value -# another_key: another_value - -logging: - file: - max-history: 30 - max-size: 1GB - path: ./logs/ - - level: - root: INFO - lavalink: INFO \ No newline at end of file diff --git a/bot/base/Command.js b/bot/base/Command.js deleted file mode 100644 index cd4833b..0000000 --- a/bot/base/Command.js +++ /dev/null @@ -1,23 +0,0 @@ -class Command { - - constructor (client, { - name = null, - description = 'No description provided.', - category = 'Miscellaneous', - usage = 'No usage provided.', - parameters = '', - examples = '', - enabled = true, - guildOnly = false, - devOnly = false, - aliases = new Array(), - userPerms = new Array(), - botPerms = new Array (), - cooldown = 2000 - }) { - this.client = client; - this.conf = { enabled, guildOnly, devOnly, aliases, userPerms, botPerms, cooldown }; - this.help = { name, description, category, usage, parameters, examples }; - } -} -module.exports = Command; diff --git a/bot/commands/Configuration/blacklist.js b/bot/commands/Configuration/blacklist.js deleted file mode 100644 index 04b7cc4..0000000 --- a/bot/commands/Configuration/blacklist.js +++ /dev/null @@ -1,92 +0,0 @@ -const Command = require('../../base/Command.js'); - -class Blacklist extends Command { - constructor (client) { - super(client, { - description: 'Add and remove users from the blacklist, preventing them from using commands in this server.', - usage: '`blacklist [add | remove ]`', - examples: '`blacklist`\n`blacklist add @annoyinguser123`\n`blacklist remove @cooluser456`', - userPerms: ['ADMINISTRATOR'], - guildOnly: true - }); - } - - async run (message, [action, ...user], data) { // eslint-disable-line no-unused-vars - if (!action) { - return; - } else { - if (!user) return message.channel.send( - 'You didn\'t specify a user!' - ); - - let member = message.mentions.users.first(); - - if (!member && message.guild) { - member = this.client.functions.searchForMembers(message.guild, user); - if (member.length > 1) { - return message.channel.send( - 'Found multiple users, please be more specific or @mention the user instead.' - ); - } - - if (member.length < 1) { - return message.channel.send( - 'Specified user couldn\'t be found, check for typing errors.' - ); - } - } - - member = member[0]; - - const array = data.guild.blacklist; - - action = action.toLowerCase(); - - if (action === 'add') { - if (member.user.id === message.guild.owner.id) return message.channel.send( - 'You can\'t add the owner to the blocklist!' - ); - - if (member.roles.highest.position >= message.guild.member(message.author).roles.highest.position && message.author.id !== message.guild.ownerID) { - return message.channel.send( - 'You can\'t add people higher ranked than yourself to the blocklist!' - ); - } - - if (array.includes(member.user.id)) return message.channel.send( - 'This user has already been blacklisted.' - ); - - array.push(member.user.id); - - await this.client.db.updateGuild(message.guild.id, 'blacklist', array); - - return message.channel.send( - `Added \`${member.user.tag}\` to the blocklist.` - ); - } - - if (action === 'remove') { - if (member.roles.highest.position >= message.guild.member(message.author).roles.highest.position && message.author.id !== message.guild.ownerID) { - return message.channel.send( - 'You can\'t remove people higher ranked than yourself from the blocklist!' - ); - } - - if (!array.includes(member.user.id)) return message.channel.send( - 'This user isn\'t blacklisted.' - ); - - array.remove(member.user.id); - - await this.client.db.updateGuild(message.guild.id, 'blacklist', array); - - return message.channel.send( - `Removed \`${member.user.tag}\` from the blocklist.` - ); - } - } - } -} - -module.exports = Blacklist; diff --git a/bot/commands/Configuration/disable.js b/bot/commands/Configuration/disable.js deleted file mode 100644 index 39e6966..0000000 --- a/bot/commands/Configuration/disable.js +++ /dev/null @@ -1,90 +0,0 @@ -const Command = require('../../base/Command.js'); - -class Disable extends Command { - constructor (client) { - super(client, { - description: 'Disables a command/category so they can\'t be used in this server.', - usage: '`disable command [command]` - Disables the specified command.\n`disable category [category]` - Disables the specified category.', - examples: '`disable command cuddle`\n`disable category music`', - userPerms: ['ADMINISTRATOR'], - guildOnly: true - }); - } - - async run (message, args, data) { - const essentialCategories = [ - 'Configuration', - 'Developer' - ]; - - const essentialCommands = [ - 'help' - ]; - - if (!args[0]) { - - return; - } else { - if (!args[1]) return message.channel.send( - 'You didn\'t specify a command/category to disable!' - ); - - if (args[0] === 'command') { - const array = data.guild.disabledcommands; - const name = args[1].toLowerCase(); - let command; - - if (this.client.commands.has(name)) { - command = this.client.commands.get(name); - } else if (this.client.aliases.has(name)) { - command = this.client.commands.get(this.client.aliases.get(name)); - } - - if (!command) return message.channel.send( - `\`${args[0]}\` does not exist as a command or an alias.` - ); - - if (essentialCategories.includes(command.help.category) || essentialCommands.includes(command.help.name)) { - return message.channel.send('This command is essential, and cannot be disabled.'); - } - - if (array.includes(command.help.name)) return message.channel.send( - 'This command has already been disabled. Use `enable` to re-enable it.' - ); - - array.push(command.help.name); - - await this.client.db.updateGuild(message.guild.id, 'disabledcommands', array); - - return message.channel.send(`Disabled command \`${name}\``); - } - - if (args[0] === 'category') { - const array = data.guild.disabledcategories; - const name = args[1].toProperCase(); - - if (!this.client.categories.includes(name)) return message.channel.send( - 'I couldn\'t find this category. Are you sure you spelt it correctly?' - ); - - if (essentialCategories.includes(name)) return message.channel.send( - 'This category is essential, and cannot be disabled.' - ); - - if (array.includes(name)) return message.channel.send( - 'This command has already been disabled. Use `enable` to re-enable it.' - ); - - array.push(name); - - await this.client.db.updateGuild(message.guild.id, 'disabledcategories', array); - - return message.channel.send(`Disabled category \`${name}\``); - } - } - - return message.channel.send('didn\'t specify whether to disable a command or category'); - } -} - -module.exports = Disable; diff --git a/bot/commands/Configuration/enable.js b/bot/commands/Configuration/enable.js deleted file mode 100644 index 2beeb0d..0000000 --- a/bot/commands/Configuration/enable.js +++ /dev/null @@ -1,73 +0,0 @@ -const Command = require('../../base/Command.js'); - -class Enable extends Command { - constructor (client) { - super(client, { - description: 'Re-enables a previously disabled command/category.', - usage: '`enable command [command]` - Enables the specified command.\n`enable category [category]` - Enables the specified category.', - examples: '`enable command cuddle`\n`enable category music`', - userPerms: ['ADMINISTRATOR'], - guildOnly: true - }); - } - - async run (message, args, data) { - if (!args[0]) { - - return; - } else { - if (!args[1]) return message.channel.send( - 'You didn\'t specify a command/category to enable!' - ); - - if (args[0] === 'command') { - const array = data.guild.disabledcommands; - const name = args[1].toLowerCase(); - let command; - - if (this.client.commands.has(name)) { - command = this.client.commands.get(name); - } else if (this.client.aliases.has(name)) { - command = this.client.commands.get(this.client.aliases.get(name)); - } - - if (!command) return message.channel.send( - `\`${args[0]}\` does not exist as a command or an alias.` - ); - - if (!array.includes(command.help.name)) return message.channel.send( - 'This command isn\'t disabled.' - ); - - array.remove(command.help.name); - - await this.client.db.updateGuild(message.guild.id, 'disabledcommands', array); - - return message.channel.send(`Enabled command \`${name}\``); - } - - if (args[0] === 'category') { - const array = data.guild.disabledcategories; - const name = args[1].toProperCase(); - - if (!this.client.categories.includes(name)) return message.channel.send( - 'I couldn\'t find this category. Are you sure you spelt it correctly?' - ); - - if (!array.includes(name)) return message.channel.send( - 'This command isn\'t disabled.' - ); - - array.remove(name); - - await this.client.db.updateGuild(message.guild.id, 'disabledcategories', array); - - return message.channel.send(`Enabled category \`${name}\``); - } - } - - return message.channel.send('didn\'t specify whether to enable a command or category'); - } -} - -module.exports = Enable; diff --git a/bot/commands/Configuration/settings.js b/bot/commands/Configuration/settings.js deleted file mode 100644 index a78c131..0000000 --- a/bot/commands/Configuration/settings.js +++ /dev/null @@ -1,26 +0,0 @@ -const { MessageEmbed } = require('discord.js'); -const Command = require('../../base/Command.js'); - -class Settings extends Command { - constructor (client) { - super(client, { - description: 'View all of your server\'s settings.', - usage: 'settings', - guildOnly: true, - aliases: ['config'] - }); - } - - async run (message, args) { // eslint-disable-line no-unused-vars - const settings = await this.client.db.getGuild(message.guild.id); - - const embed = new MessageEmbed() - .setAuthor('Settings Panel', message.guild.iconURL({dynamic: true})) - .setDescription('All the settings for this server are listed below. To set a setting, use `set [setting] [what you want to set it to]') - .addFields( - { name: '**Prefix**', value: settings.prefix } - ); - } -} - -module.exports = Settings; diff --git a/bot/commands/Configuration/userprefix.js b/bot/commands/Configuration/userprefix.js deleted file mode 100644 index a7bac81..0000000 --- a/bot/commands/Configuration/userprefix.js +++ /dev/null @@ -1,25 +0,0 @@ -const Command = require('../../base/Command.js'); - -class Userprefix extends Command { - constructor (client) { - super(client, { - description: 'Change the prefix you use for Woomy. This will affect servers and commands in DM\'s.', - usage: '`userprefix` ', - examples: '`userprefix !!` - Sets your personal prefix to !!' - }); - } - - async run (message, args, data) { // eslint-disable-line no-unused-vars - if (!args[0]) { - return message.channel.send( - `Your prefix for Woomy is currently: \`${data.user.prefix}\`` - ); - } - - await this.client.db.updateUser(message.author.id, 'prefix', args[0]); - - message.channel.send(`Your personal prefix has been set to: \`${args[0]}\``); - } -} - -module.exports = Userprefix; diff --git a/bot/commands/Core/help.js b/bot/commands/Core/help.js deleted file mode 100644 index 3b6a3db..0000000 --- a/bot/commands/Core/help.js +++ /dev/null @@ -1,17 +0,0 @@ -const Command = require('../../base/Command.js'); - -class Help extends Command { - constructor (client) { - super(client, { - description: 'Lists what commands Woomy has, what they do, and how to use them.', - usage: '`help` - Lists all commands.\n`help ` - Shows detailed information on a specific command.', - aliases: ['cmds'], - }); - } - - async run (message, args, data) { // eslint-disable-line no-unused-vars - - } -} - -module.exports = Help; diff --git a/bot/commands/Core/ping.js b/bot/commands/Core/ping.js deleted file mode 100644 index 38bdeea..0000000 --- a/bot/commands/Core/ping.js +++ /dev/null @@ -1,24 +0,0 @@ -const Command = require('../../base/Command.js'); - -class Ping extends Command { - constructor (client) { - super(client, { - description: 'Latency and API response times.', - usage: 'ping', - aliases: ['pong'] - }); - } - - async run (message, args, data) { // eslint-disable-line no-unused-vars - try { - const msg = await message.channel.send('Pinging...'); - msg.edit( - `Pong! \`${msg.createdTimestamp - message.createdTimestamp}ms\` (💗 \`${Math.round(this.client.ws.ping)}ms\`)` - ); - } catch (err) { - this.client.logger.err(err); - } - } -} - -module.exports = Ping; diff --git a/bot/commands/Developer/eval.js b/bot/commands/Developer/eval.js deleted file mode 100644 index c3d1dbf..0000000 --- a/bot/commands/Developer/eval.js +++ /dev/null @@ -1,37 +0,0 @@ -const Command = require('../../base/Command.js'); -const Discord = require('discord.js'); - -class Eval extends Command { - constructor (client) { - super(client, { - description: 'Evaluates arbitrary Javascript.', - usage: 'eval ', - aliases: ['ev'], - permLevel: 'Bot Owner', - devOnly: true - }); - } - - async run (message, args, data) { // eslint-disable-line no-unused-vars - const code = args.join(' '); - try { - const evaled = eval(code); - const clean = await this.client.functions.clean(evaled); - const MAX_CHARS = 3 + 2 + clean.length + 3; - if (MAX_CHARS > 2000) { - message.channel.send({ files: [new Discord.MessageAttachment(Buffer.from(clean), 'output.txt')] }); - } - message.channel.send(`\`\`\`js\n${clean}\n\`\`\``); - } catch (err) { - const e = await this.client.functions.clean(err); - const MAX_CHARS = 1 + 5 + 1 + 3 + e.length + 3; - if (MAX_CHARS > 2000) { - return message.channel.send({ files: [new Discord.MessageAttachment(Buffer.from(e), 'error.txt')] }); - } - - message.channel.send(`\`ERROR\` \`\`\`xl\n${e}\n\`\`\``); - } - } -} - -module.exports = Eval; diff --git a/bot/commands/Developer/reload.js b/bot/commands/Developer/reload.js deleted file mode 100644 index b00c72e..0000000 --- a/bot/commands/Developer/reload.js +++ /dev/null @@ -1,38 +0,0 @@ -const Command = require('../../base/Command.js'); - -class Reload extends Command { - constructor (client) { - super(client, { - description: 'Latency and API response times.', - usage: '`reload [command]` - Reloads the specified command.', - examples: '`reload ping`', - devOnly: true - }); - } - - async run (message, args, data) { // eslint-disable-line no-unused-vars - if (!args[0]) return message.channel.send('You didnt tell me what command to reload!'); - - let command; - - if (this.client.commands.has(args[0])) { - command = this.client.commands.get(args[0]); - } else if (this.client.aliases.has(args[0])) { - command = this.client.commands.get(this.client.aliases.get(args[0])); - } - - if (!command) return message.channel.send( - `\`${args[0]}\` does not exist as a command or an alias.` - ); - - let res = await this.client.commandHandler.unload(command.help.name, command.help.category); - if (res) return message.channel.send('Error unloading: '+ res); - - res = await this.client.commandHandler.load(command.help.name, command.help.category); - if (res) return message.channel.send('Error loading: ' + res); - - return message.channel.send(`Reloaded \`${args[0]}\``); - } -} - -module.exports = Reload; diff --git a/bot/commands/Test/lastmessage.js b/bot/commands/Test/lastmessage.js deleted file mode 100644 index 4541423..0000000 --- a/bot/commands/Test/lastmessage.js +++ /dev/null @@ -1,17 +0,0 @@ -const Command = require('../../base/Command.js'); - -class Lastmessage extends Command { - constructor (client) { - super(client, { - description: 'Grab last message sent to a channel.', - usage: 'lastmessage', - }); - } - - async run (message, args, data) { // eslint-disable-line no-unused-vars - const lastMsg = await this.client.functions.getLastMessage(message.channel); - message.channel.send(lastMsg); - } -} - -module.exports = Lastmessage; diff --git a/bot/commands/Test/msearch.js b/bot/commands/Test/msearch.js deleted file mode 100644 index a13e2f0..0000000 --- a/bot/commands/Test/msearch.js +++ /dev/null @@ -1,36 +0,0 @@ -const Command = require('../../base/Command.js'); - -class Msearch extends Command { - constructor (client) { - super(client, { - description: 'Lists all members found that match the input', - usage: '`msearch` [query] - Finds users in this server that match the query.`', - aliases: ['membersearch'] - }); - } - - async run (message, args, data) { // eslint-disable-line no-unused-vars - if (!args[0]) return message.channel.send('No username provided.'); - - let mlist = ''; - let count = 0; - - this.client.functions.searchForMembers(message.guild, args[0]).forEach((member) => { - if (member) { - mlist += `\`${member.user.tag}\``; - count = count + 1; - } - mlist += '**, **'; - }); - - mlist = mlist.substring(0, mlist.length - 6); - - const mlist1 = `Found ${count} users:\n` + mlist; - - if (!mlist1) return message.channel.send('No users found!'); - - message.channel.send(mlist1); - } -} - -module.exports = Msearch; diff --git a/bot/commands/Test/retrieve.js b/bot/commands/Test/retrieve.js deleted file mode 100644 index 3f8f757..0000000 --- a/bot/commands/Test/retrieve.js +++ /dev/null @@ -1,32 +0,0 @@ -const Command = require('../../base/Command.js'); - -class Retrieve extends Command { - constructor (client) { - super(client, { - description: 'Retrieves a key\'s value from the Postgres DB.', - usage: 'retrieve [setting]', - guildOnly: true - }); - } - - async run (message, args, data) { // eslint-disable-line no-unused-vars - if (!args[0]) return message.channel.send('You didn\'t specify what database to access!'); - if (args[0].toLowerCase() !== 'guild' && args[0].toLowerCase() !== 'member' && args[0].toLowerCase() !== 'user') { - return message.channel.send('Invalid database. Valid databases: `guild`, `member`, `user`'); - } - - if (!args[1]) { - message.channel.send( - `\`\`\`js - ${JSON.stringify(data[args[0]])} - \`\`\`` - ); - } else { - const res = data[args[0]][args[1]]; - if (!res) return message.channel.send('Invalid key. Check for typing errors and try again.'); - message.channel.send('```' + res + '```'); - } - } -} - -module.exports = Retrieve; diff --git a/bot/commands/Utility/avatar.js b/bot/commands/Utility/avatar.js deleted file mode 100644 index f883c26..0000000 --- a/bot/commands/Utility/avatar.js +++ /dev/null @@ -1,55 +0,0 @@ -const Discord = require('discord.js'); -const Command = require('../../base/Command.js'); - -class Avatar extends Command { - constructor (client) { - super(client, { - description: 'View a full-sized image of a person\'s profile picture.', - usage: 'avatar ', - examples: '`avatar` - Gets your avatar.\n`avatar emily` - Gets the avatar of the user "emily"', - aliases: ['pfp'], - botPerms: ['EMBED_LINKS'] - }); - } - - async run (message, args, data) { // eslint-disable-line no-unused-vars - if (!args[0]) { - const embed = this.createEmbed(message.author); - return message.channel.send(embed); - } - - let user = message.mentions.users.first(); - - if (!user && message.guild) { - user = this.client.functions.searchForMembers(message.guild, args[0]); - if (user.length > 1) { - return message.channel.send( - 'Found multiple users, please be more specific or @mention the user instead.' - ); - } - - if (user.length < 1) { - return message.channel.send( - 'Specified user couldn\'t be found, check for typing errors.' - ); - } - } - - user = user[0].user; - - const embed = this.createEmbed(user); - return message.channel.send(embed); - } - - createEmbed (user) { - const URL = user.avatarURL({format: 'png', dynamic: true, size: 2048}); - const embed = new Discord.MessageEmbed() - .setTitle(user.tag) - .setDescription(`**[Avatar URL](${URL})**`) - .setImage(URL); - - return embed; - } -} - -module.exports = Avatar; diff --git a/bot/events/error.js b/bot/events/error.js deleted file mode 100644 index baca31c..0000000 --- a/bot/events/error.js +++ /dev/null @@ -1,9 +0,0 @@ -module.exports = class { - constructor (client) { - this.client = client; - } - - async run (error) { - this.client.logger.log(`An error event was sent by Discord.js: \n${JSON.stringify(error)}`, 'error'); - } -}; diff --git a/bot/events/message.js b/bot/events/message.js deleted file mode 100644 index e79be32..0000000 --- a/bot/events/message.js +++ /dev/null @@ -1,127 +0,0 @@ -// The MESSAGE event runs anytime a message is received -// Note that due to the binding of client to every event, every event -// goes `client, other, args` when this function is run. - -module.exports = class { - constructor (client) { - this.client = client; - } - - async run (message) { - if (message.author.bot) return; - - const prefixes = []; - const data = {}; - - data.user = await this.client.db.getUser(message.author.id); - if (!data.user) data.user = await this.client.db.createUser(message.author.id); - prefixes.push(data.user.prefix); - - if (message.guild) { - data.guild = await this.client.db.getGuild(message.guild.id); - if (!data.guild) await this.client.db.createGuild(message.guild.id); - prefixes.push(data.guild.prefix); - - data.member = await this.client.db.getMember(message.guild.id, message.author.id); - if (!data.member) data.member = await this.client.db.createMember(message.guild.id, message.author.id); - } - - // Blacklist - if (data.guild.blacklist.includes(message.author.id)) return; - - // Respond with prefixes when pinged - if (message.content === `<@${this.client.user.id}>` || message.content === `<@!${this.client.user.id}>`) { - return message.channel.send(`Hi! The server prefix is \`${data.guild.prefix}\`, and your personal prefix is \`${data.user.prefix}\`. You can also ping me ^-^`); - } - - // Allow pings to be used as prefixes - prefixes.push(`<@${this.client.user.id}> `, `<@!${this.client.user.id}> `); - - let prefix; - - for (const thisPrefix of prefixes) { - if (message.content.startsWith(thisPrefix)) prefix = thisPrefix; - } - - if (message.content.indexOf(prefix) !== 0) return; - - if (prefix === `<@${this.client.user.id}> ` || prefix === `<@!${this.client.user.id}> `) { - message.prefix = '@Woomy '; - } else { - message.prefix = prefix; - } - - const args = message.content.slice(prefix.length).trim().split(/ +/g); - const command = args.shift().toLowerCase(); - - // Cache uncached members - if (message.guild && !message.member) await message.guild.fetchMember(message.author); - - const cmd = this.client.commands.get(command) || this.client.commands.get(this.client.aliases.get(command)); - if (!cmd) return; - - if (message.guild) { - if (!message.channel.permissionsFor(this.client.user).has('SEND_MESSAGES')) { - try { - return message.author.send(`I don't have permission to speak in \`#${message.channel.name}\`, Please ask a moderator to give me the send messages permission!`); - } catch (err) {} //eslint-disable-line no-empty - } - - if (data.guild.disabledcommands.includes(cmd.help.name)) return message.channel.send( - 'This command has been disabled by a server administrator.' - ); - - if (data.guild.disabledcategories.includes(cmd.help.category)) return message.channel.send( - 'The category this command is apart of has been disabled by a server administrator.' - ); - } - - if (cmd && cmd.conf.enabled === false) { - return message.channel.send('This command has been disabled by my developers.'); - } - - if (cmd && cmd.conf.devOnly && this.client.functions.isDeveloper(message.author.id) !== true) { - return message.channel.send('devs only!'); - } - - if (cmd && !message.guild && cmd.conf.guildOnly === true) { - return message.channel.send('This command is unavailable via private message. Please run this command in a guild.'); - } - - // Permission handler - if (message.guild) { - const missingUserPerms = this.client.functions.checkPermissions(cmd, message, message.member); - if (missingUserPerms) return message.channel.send(` - You don't have sufficient permissions to run this command! Missing: ${missingUserPerms} - `); - - const missingBotPerms = this.client.functions.checkPermissions(cmd, message, message.guild.member(this.client.user)); - if (missingBotPerms) return message.channel.send(` - I can't run this command because I'm missing these permissions: ${missingBotPerms} - `); - } - - // Cooldown - if (this.client.cooldowns.get(cmd.help.name).has(message.author.id)) { - const init = this.client.cooldowns.get(command).get(message.author.id); - const curr = new Date(); - const diff = Math.round((curr - init) / 1000); - const time = cmd.conf.cooldown / 1000; - return message.reply(`this command is on cooldown! You'll be able to use it again in ${time - diff} seconds.`); - } else { - this.client.cooldowns.get(cmd.help.name).set(message.author.id, new Date()); - - setTimeout(() => { - this.client.cooldowns.get(cmd.help.name).delete(message.author.id); - }, this.client.commands.get(cmd.help.name).conf.cooldown); - } - - message.flags = []; - while (args[0] &&args[0][0] === '-') { - message.flags.push(args.shift().slice(1)); - } - - cmd.run(message, args, data); - this.client.logger.cmd(`Command ran: ${message.content}`); - } -}; diff --git a/bot/events/ready.js b/bot/events/ready.js deleted file mode 100644 index 8611520..0000000 --- a/bot/events/ready.js +++ /dev/null @@ -1,11 +0,0 @@ -module.exports = class { - constructor (client) { - this.client = client; - } - - async run () { - await this.client.functions.wait(1000); - this.client.user.setActivity(`BNA | v${this.client.version}`, { type: 'WATCHING' }); // lol - this.client.logger.ready(`Connected to Discord as ${this.client.user.tag}`); - } -}; diff --git a/bot/index.js b/bot/index.js deleted file mode 100644 index 0c8ce02..0000000 --- a/bot/index.js +++ /dev/null @@ -1,74 +0,0 @@ -// Copyright 2020 Emily J. / mudkipscience and contributors. Subject to the AGPLv3 license. - -const { Client, Collection } = require('discord.js'); -const { CommandHandler, EventHandler } = require('./util/handlers'); -const Functions = require('./util/functions'); -const Database = require('./util/database'); -const logger = require('./util/logger'); -const sentry = require('@sentry/node'); // eslint-disable-line no-unused-vars -const { readdirSync } = require('fs'); -const config = require('../config.json'); -const pkg = require('../package.json'); - -class WoomyClient extends Client { - constructor () { - super(); - - // Important information our bot needs to access - this.config = config; - this.path = __dirname; - this.version = pkg.version; - this.categories = readdirSync('./commands/'); - - // dev mode, disables some features if enabled - this.dev = false; - if (this.config.devmode === true) { - this.dev = true; - // sentry.init({ dsn: this.config.keys.sentry }); - } - - // Essential modules - this.logger = logger; - this.functions = new Functions(this); - this.db = new Database(this); - - // collections, to store commands, their aliases and their cooldown timers in - this.commands = new Collection(); - this.aliases = new Collection(); - this.cooldowns = new Collection(); - - // Handlers, to load commands and events - this.commandHandler = new CommandHandler(this); - this.eventHandler = new EventHandler(this); - } -} - -async function init () { - const client = new WoomyClient({ ws: {}}); - - client.logger.info(`Initializing Woomy v${client.version}`); - - require('./util/prototypes'); - - await client.commandHandler.loadAll(); - await client.eventHandler.loadAll(); - - if (client.dev === true) { - client.logger.warn('Development mode is enabled. Some features (such as Sentry) have been disabled.'); - client.login(client.config.devtoken); - } else { - client.login(client.config.token); - } -} - -init(); - -process.on('uncaughtException', (err) => { - const errorMsg = err.stack.replace(new RegExp(`${__dirname}/`, 'g'), './'); - console.error('Uncaught Exception: ', errorMsg); - process.exit(1); -}); - -process.on('unhandledRejection', err => { - console.error('Uncaught Promise Error: ', err); -}); \ No newline at end of file diff --git a/bot/shardLauncher.js b/bot/shardLauncher.js deleted file mode 100644 index 28fec94..0000000 --- a/bot/shardLauncher.js +++ /dev/null @@ -1,13 +0,0 @@ -const discord = require('discord.js'); -const config = require('../config.json'); - -const manager = new discord.ShardingManager('./index.js', { - totalShards: 'auto', - token: config.token -}); - -manager.on('shardCreate', (shard) => { - console.log('Shard ' + shard.id + ' launched'); -}); - -manager.spawn(); \ No newline at end of file diff --git a/bot/util/database.js b/bot/util/database.js deleted file mode 100644 index f3aaaa3..0000000 --- a/bot/util/database.js +++ /dev/null @@ -1,162 +0,0 @@ -/* eslint-disable no-unused-vars */ - -const { Pool } = require('pg'); -const format = require('pg-format'); -const { level } = require('winston'); -const { pgCredentials } = require('../../config.json'); - -class Database { - constructor (client) { - this.client = client; - this.pool = new Pool(pgCredentials); - - this.pool.on('error', err => { - this.client.logger.error('Postgres error: ' + err); - }); - } - - async getGuild (id) { - const res = await this.pool.query('SELECT * FROM guilds WHERE guild_id = $1;', [id]); - return res.rows[0]; - } - - async getMember (guild_id, user_id) { - const key = guild_id + ':' + user_id; - const res = await this.pool.query('SELECT * FROM members WHERE member_id = $1;', [key]); - return res.rows[0]; - } - - async getUser (id) { - const res = await this.pool.query('SELECT * FROM users WHERE user_id = $1;', [id]); - return res.rows[0]; - } - - async getGuildField (id, column) { - const sql = format('SELECT %I FROM guilds WHERE guild_id = $1;', column); - const query = { - text: sql, - values: [id], - rowMode: 'array' - }; - - const res = await this.pool.query(query); - - return res.rows[0][0]; - } - - async getMemberField (guild_id, user_id, column) { - const key = guild_id + ':' + user_id; - const sql = format('SELECT %I FROM members WHERE member_id = $1;', column); - const query = { - text: sql, - values: [key], - rowMode: 'array' - }; - - const res = await this.pool.query(query); - - return res.rows[0][0]; - } - - async getUserField (id, column) { - const sql = format('SELECT %I FROM users WHERE user_id = $1;', column); - const query = { - text: sql, - values: [id], - rowMode: 'array' - }; - - const res = await this.pool.query(query); - - return res.rows[0][0]; - } - - async updateGuild (id, column, newValue) { - const sql = format('UPDATE guilds SET %I = $1 WHERE guild_id = $2;', column); - await this.pool.query(sql, [newValue, id]); - return; - } - - async updateMember (guild_id, user_id, column, newValue) { - const key = guild_id + ':' + user_id; - const sql = format('UPDATE members SET %I = $1 WHERE member_id = $2;', column); - await this.pool.query(sql, [newValue, key]); - return; - } - - async updateUser (id, column, newValue) { - const sql = format('UPDATE users SET %I = $1 WHERE user_id = $2;', column); - await this.pool.query(sql, [newValue, id]); - return; - } - - async resetGuild (id, column) { - const regexp = /(?<=\')(.*?)(?=\')/; //eslint-disable-line no-useless-escape - const res = await this.client.db.pool.query( - 'SELECT column_default FROM information_schema.columns WHERE table_name=\'guilds\' AND column_name = $1;', [column]); - const def = res.rows[0].column_default.match(regexp)[0]; - - await this.updateGuild(id, column, def); - - return; - } - - async resetMember (guild_id, user_id, column) { - const key = guild_id + ':' + user_id; - const regexp = /(?<=\')(.*?)(?=\')/; //eslint-disable-line no-useless-escape - const res = await this.client.db.pool.query( - 'SELECT column_default FROM information_schema.columns WHERE table_name=\'members\' AND column_name = $1;', [column]); - const def = res.rows[0].column_default.match(regexp)[0]; - - await this.updateGuild(key, column, def); - - return; - } - - async resetUser (id, column) { - const regexp = /(?<=\')(.*?)(?=\')/; //eslint-disable-line no-useless-escape - const res = await this.client.db.pool.query( - 'SELECT column_default FROM information_schema.columns WHERE table_name=\'users\' AND column_name = $1;', [column]); - const def = res.rows[0].column_default.match(regexp)[0]; - - await this.updateGuild(id, column, def); - - return; - } - - async deleteGuild (id) { - await this.pool.query('DELETE FROM guilds WHERE guild_id = $1;', [id]); - await this.pool.query('DELETE FROM members WHERE member_id LIKE $1;', [`${id}%`]); - return; - } - - async deleteMember (guild_id, user_id) { - const key = guild_id + ':' + user_id; - await this.pool.query('DELETE FROM members WHERE member_id = $1;', [key]); - return; - } - - async deleteUser (id) { - await this.pool.query('DELETE FROM users WHERE user_id = $1;', [id]); - await this.pool.query('DELETE FROM members WHERE member_id LIKE $1;', [`${id}%`]); - return; - } - - async createGuild (id) { - const res = await this.pool.query('INSERT INTO guilds (guild_id) VALUES ($1) RETURNING *;', [id]); - return res; - } - - async createMember (guild_id, user_id) { - const key = guild_id + ':' + user_id; - const res = await this.pool.query('INSERT INTO members (member_id) VALUES ($1) RETURNING *;', [key]); - return res.rows[0]; - } - - async createUser (id) { - const res = await this.pool.query('INSERT INTO users (user_id) VALUES ($1) RETURNING *;', [id]); - return res.rows[0]; - } -} - -module.exports = Database; \ No newline at end of file diff --git a/bot/util/dbdoctor.js b/bot/util/dbdoctor.js deleted file mode 100644 index 78d88bc..0000000 --- a/bot/util/dbdoctor.js +++ /dev/null @@ -1,8 +0,0 @@ -/* - * - Will work on this soon. Triggered when a mismatch between DB and Discord occurs - * For instance, when a user deletes a role that the database has stored. - * - * - Will be implemented so if Woomy fails to find a role, user, etc. with the ID stored in - * the database, database doctor is triggered. Will attempt to resolve the discrepancy, or reset - * to default - */ \ No newline at end of file diff --git a/bot/util/functions.js b/bot/util/functions.js deleted file mode 100644 index d91ef08..0000000 --- a/bot/util/functions.js +++ /dev/null @@ -1,147 +0,0 @@ -const { MessageEmbed } = require('discord.js'); -const { inspect, promisify } = require('util'); - -class Functions { - constructor (client) { - this.client = client; - } - - userError (channel, cmd, error) { - const embed = new MessageEmbed() - .setColor('#EF5350') - .setTitle(`${cmd.help.name}:${cmd.help.category.toLowerCase()}`) - .setDescription(error) - .addField('**Usage**', cmd.help.usage) - .setFooter(`Run 'help ${cmd.help.name}' for more information.`); - - channel.send(embed); - } - - async getLastMessage (channel) { - const messages = await channel.messages.fetch({ limit: 2 }); - return messages.last().content; - } - - async awaitReply (message, question, limit = 60000) { - const filter = (m) => m.author.id === message.author.id; - await message.channel.send(question); - - try { - const collected = await message.channel.awaitMessages(filter, { - max: 1, - time: limit, - errors: ['time'] - }); - - return collected.first().content; - } catch (err) { - return false; - } - } - - searchForMembers (guild, query) { - query = query.toLowerCase(); - - const matches = []; - let match; - - try { - match = guild.members.cache.find(x => x.displayName.toLowerCase() == query); - if (!match) guild.members.cache.find(x => x.user.username.toLowerCase() == query); - } catch (err) {} //eslint-disable-line no-empty - - if (match) matches.push(match); - guild.members.cache.forEach(member => { - if ( - (member.displayName.toLowerCase().startsWith(query) || - member.user.tag.toLowerCase().startsWith(query)) && - member.id != (match && match.id) - ) { - matches.push(member); - } - }); - - return matches; - } - - findRole (input, message) { - let role; - role = message.guild.roles.cache.find(r => r.name.toLowerCase() === input.toLowerCase()); - if (!role) { - role = message.guild.roles.cache.get(input.toLowerCase()); - } - if (!role) return; - return role; - } - - checkPermissions (command, message, member) { - const missingPerms = []; - - if (member.user.bot) { - command.conf.botPerms.forEach(p => { - if (!message.channel.permissionsFor(member).has(p)) missingPerms.push(p); - }); - } else { - command.conf.userPerms.forEach(p => { - if (!message.channel.permissionsFor(member).has(p)) missingPerms.push(p); - }); - } - - if (missingPerms.length > 0) return missingPerms; - } - - - intBetween (min, max) { - return Math.round((Math.random() * (max - min) + min)); - } - - isDeveloper (id) { - if (this.client.config.ownerIDs.includes(id)) { - return true; - } else { - return false; - } - } - - shutdown () { - const exitQuotes = [ - 'Shutting down.', - 'I don\'t blame you.', - 'I don\'t hate you.', - 'Whyyyyy', - 'Goodnight.', - 'Goodbye' - ]; - - this.client.db.pool.end().then(() => { - this.client.logger.info('Connection to database closed.'); - }); - - this.client.destroy(); - - console.log(exitQuotes); - } - - async clean (text) { - if (text && text.constructor.name === 'Promise') { - text = await text; - } - - if (typeof text !== 'string') { - text = inspect(text, { depth: 1}); - } - - text = text - .replace(/`/g, '`' + String.fromCharCode(8203)) - .replace(/@/g, '@' + String.fromCharCode(8203)) - .replace(this.client.token, 'mfa.VkO_2G4Qv3T--NO--lWetW_tjND--TOKEN--QFTm6YGtzq9PH--4U--tG0'); - - return text; - } - - wait () { - promisify(setTimeout); - } -} - -module.exports = Functions; \ No newline at end of file diff --git a/bot/util/handlers.js b/bot/util/handlers.js deleted file mode 100644 index 5e9974d..0000000 --- a/bot/util/handlers.js +++ /dev/null @@ -1,126 +0,0 @@ -const fs = require('fs'); - -class CommandHandler { - constructor (client) { - this.client = client; - } - - load (name, category) { - try { - const path = this.client.path + '/commands/' + category + '/' + name + '.js'; - const props = new (require(path))(this.client); - - this.client.logger.debug(`Loading command ${category}/${name}`); - - props.help.name = name; - props.help.category = category; - - if (props.init) { - props.init(this.client); - } - - this.client.commands.set(props.help.name, props); - - this.client.cooldowns.set(props.help.name, new Map()); - - props.conf.aliases.forEach(alias => { - this.client.aliases.set(alias, props.help.name); - }); - - return; - } catch (err) { - return `Failed to load command ${name}: ${err.stack}`; - } - } - - loadAll () { - const commandDirectories = fs.readdirSync('./commands/'); - this.client.logger.debug(`Found ${commandDirectories.length} command directories.`); - commandDirectories.forEach((dir) => { - const commandFiles = fs.readdirSync('./commands/' + dir + '/'); - commandFiles.filter((cmd) => cmd.split('.').pop() === 'js').forEach((cmd) => { - cmd = cmd.substring(0, cmd.length - 3); - const resp = this.load(cmd, dir); - if (resp) { - this.client.logger.error(resp); - } - }); - }); - this.client.logger.info(`Loaded a total of ${this.client.commands.size} commands.`); - } - - unload (name, category) { - const path = this.client.path + '/commands/' + category + '/' + name + '.js'; - - let command; - - if (this.client.commands.has(name)) { - command = this.client.commands.get(name); - } else if (this.client.aliases.has(name)) { - command = this.client.commands.get(this.client.aliases.get(name)); - } - - if (!command) return `\`${name}\` does not exist as a command or an alias.`; - - this.client.logger.debug(`Unloading command ${category}/${name}`); - - for (const alias of command.conf.aliases) this.client.aliases.delete(alias); - this.client.commands.delete(command.help.name); - delete require.cache[require.resolve(path)]; - - return; - } - - unloadAll () { - const commandDirectories = fs.readdirSync('./commands/'); - this.client.logger.debug(`Found ${commandDirectories.length} command directories.`); - commandDirectories.forEach((dir) => { - const commandFiles = fs.readdirSync('./commands/' + dir + '/'); - commandFiles.filter((cmd) => cmd.split('.').pop() === 'js').forEach((cmd) => { - cmd = cmd.substring(0, cmd.length - 3); - const res = this.unload(cmd, dir); - if (res) this.client.logger.error('Command unload: ' + res); - }); - }); - } -} - -class EventHandler { - constructor (client) { - this.client = client; - } - - load (name) { - try { - this.client.logger.debug(`Loading event ${name}`); - - const path = this.client.path + '/events/' + name + '.js'; - const event = new (require(path))(this.client); - this.client.on(name, (...args) => event.run(...args)); - delete require.cache[require.resolve(path)]; - - return; - } catch (err) { - return `Failed to load event ${name}: ${err}`; - } - } - - loadAll () { - const eventFiles = fs.readdirSync(this.client.path + '/events'); - eventFiles.forEach(file => { - const name = file.split('.')[0]; - const resp = this.load(name); - - if (resp) { - this.client.logger.error(resp); - } - }); - } - - // TO-DO: EVENT UNLOADING/RELOADING -} - -module.exports = { - CommandHandler: CommandHandler, - EventHandler: EventHandler -}; \ No newline at end of file diff --git a/bot/util/logger.js b/bot/util/logger.js deleted file mode 100644 index f88c628..0000000 --- a/bot/util/logger.js +++ /dev/null @@ -1,53 +0,0 @@ -const { createLogger, format, transports, addColors } = require('winston'); - -const fmt = format.printf(({ level, message, timestamp }) => { - return '[' + timestamp + '] ' + level + ' ' + message; -}); - -const customLevels = { - levels: { - debug: 0, - cmd: 1, - info: 2, - ready: 3, - warn: 4, - error: 5 - }, - - colours: { - debug: 'black magentaBG', - cmd: 'black whiteBG', - info: 'black cyanBG', - ready: 'black greenBG', - warn: 'black yellowBG', - error: 'black redBG' - } -}; - -const logger = createLogger({ - levels: customLevels.levels, - level: 'error', - format: format.combine( - format.timestamp({ - format: 'YYYY-MM-DD hh:mm:ss' - }), - fmt - ), - - transports: [ - new transports.Console({ - level: 'error', - format: format.combine( - format.timestamp({ - format: 'YYYY-MM-DD hh:mm:ss' - }), - format.colorize(), - fmt - ) - }) - ] -}); - -addColors(customLevels.colours); - -module.exports = logger; \ No newline at end of file diff --git a/bot/util/prototypes.js b/bot/util/prototypes.js deleted file mode 100644 index 6d99b3c..0000000 --- a/bot/util/prototypes.js +++ /dev/null @@ -1,15 +0,0 @@ -// YEAH IM EXTENDING PROTOTYPES FUCK YOU - -String.prototype.toProperCase = function () { - return this.replace(/([^\W_]+[^\s-]*) */g, function (txt) {return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();}); -}; - -Array.prototype.random = function () { - return this[Math.floor(Math.random() * this.length)]; -}; - -Array.prototype.remove = function (element) { - const index = this.indexOf(element); - if (index !== -1) this.splice(index, 1); - return this; -}; \ No newline at end of file diff --git a/bot/util/schema.js b/bot/util/schema.js deleted file mode 100644 index 6117743..0000000 --- a/bot/util/schema.js +++ /dev/null @@ -1 +0,0 @@ -// postgres schemas so i can remember them \ No newline at end of file diff --git a/config.json.example b/config.json.example deleted file mode 100644 index bf0b57c..0000000 --- a/config.json.example +++ /dev/null @@ -1,57 +0,0 @@ -{ - "token": "", - "devtoken": "", - "ownerIDs": [], - "devmode": false, - "keys": { - "topgg": "", - "sentry": "" - }, - "pgCredentials": { - "user": "", - "host": "", - "database": "", - "password": "", - "port": - }, - "lavalinkNodes": [ - { - "name": "", - "host": "", - "port": , - "auth": "" - } - ], - "emoji": { - "success": "", - "error": "", - "denied": "", - "wait": "", - "warning": "" - }, - "defaultUserData": { - "blacklisted": false, - "prefix": "w!", - "experience": 0, - "seashells": 0, - "relationships": [], - "pronouns": null, - "colour": "#9d10e1" - }, - "defaultMemberData": { - "blacklisted": false, - "experience": 0 - }, - "defaultGuildData": { - "prefix": "w!", - "mutedRole": null, - "autorole": null, - "welcomeChannel": null, - "welcomeMessage": "Hey there [[user]], and welcome to [[server]]!", - "leaveChannel": null, - "leaveMessage": "[[user]] has left [[server]]... bye [[user]] 👋", - "chatlogsChannel": null, - "modlogsChannel": null, - "starboardChannel": null - } -} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 081b634..0000000 --- a/package-lock.json +++ /dev/null @@ -1,1446 +0,0 @@ -{ - "name": "woomy", - "version": "2.0.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", - "dev": true - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - } - } - }, - "@dabh/diagnostics": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.2.tgz", - "integrity": "sha512-+A1YivoVDNNVCdfozHSR8v/jyuuLTMXwjWuxPFlFlUapXoGc+Gj9mDlTDDfrwl7rXCl2tNZ0kE8sIBO6YOn96Q==", - "requires": { - "colorspace": "1.1.x", - "enabled": "2.0.x", - "kuler": "^2.0.0" - } - }, - "@discordjs/collection": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-0.1.6.tgz", - "integrity": "sha512-utRNxnd9kSS2qhyivo9lMlt5qgAUasH2gb7BEOn6p0efFh24gjGomHzWKMAPn2hEReOPQZCJaRKoURwRotKucQ==" - }, - "@discordjs/form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@discordjs/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-ZfFsbgEXW71Rw/6EtBdrP5VxBJy4dthyC0tpQKGKmYFImlmmrykO14Za+BiIVduwjte0jXEBlhSKf0MWbFp9Eg==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, - "@eslint/eslintrc": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.1.3.tgz", - "integrity": "sha512-4YVwPkANLeNtRjMekzux1ci8hIaH5eGKktGqR0d3LWsKNn5B2X/1Z6Trxy7jQXl9EBGE6Yj02O+t09FMeRllaA==", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.1.1", - "espree": "^7.3.0", - "globals": "^12.1.0", - "ignore": "^4.0.6", - "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", - "lodash": "^4.17.19", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" - } - }, - "@sentry/core": { - "version": "5.26.0", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-5.26.0.tgz", - "integrity": "sha512-Ubrw7K52orTVsaxpz8Su40FPXugKipoQC+zPrXcH+JIMB+o18kutF81Ae4WzuUqLfP7YB91eAlRrP608zw0EXA==", - "requires": { - "@sentry/hub": "5.26.0", - "@sentry/minimal": "5.26.0", - "@sentry/types": "5.26.0", - "@sentry/utils": "5.26.0", - "tslib": "^1.9.3" - } - }, - "@sentry/hub": { - "version": "5.26.0", - "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-5.26.0.tgz", - "integrity": "sha512-lAYeWvvhGYS6eQ5d0VEojw0juxGc3v4aAu8VLvMKWcZ1jXD13Bhc46u9Nvf4qAY6BAQsJDQcpEZLpzJu1bk1Qw==", - "requires": { - "@sentry/types": "5.26.0", - "@sentry/utils": "5.26.0", - "tslib": "^1.9.3" - } - }, - "@sentry/minimal": { - "version": "5.26.0", - "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-5.26.0.tgz", - "integrity": "sha512-mdFo3FYaI1W3KEd8EHATYx8mDOZIxeoUhcBLlH7Iej6rKvdM7p8GoECrmHPU1l6sCCPtBuz66QT5YeXc7WILsA==", - "requires": { - "@sentry/hub": "5.26.0", - "@sentry/types": "5.26.0", - "tslib": "^1.9.3" - } - }, - "@sentry/node": { - "version": "5.26.0", - "resolved": "https://registry.npmjs.org/@sentry/node/-/node-5.26.0.tgz", - "integrity": "sha512-BuN9c84f8MxGhYZl+JgVsORh3GiDmuyG9QjawVQ2fmJKVxQ+fcNvde/wq5z7jEca4Z8FrNLa+DHb4c8Fl8gz8g==", - "requires": { - "@sentry/core": "5.26.0", - "@sentry/hub": "5.26.0", - "@sentry/tracing": "5.26.0", - "@sentry/types": "5.26.0", - "@sentry/utils": "5.26.0", - "cookie": "^0.4.1", - "https-proxy-agent": "^5.0.0", - "lru_map": "^0.3.3", - "tslib": "^1.9.3" - } - }, - "@sentry/tracing": { - "version": "5.26.0", - "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-5.26.0.tgz", - "integrity": "sha512-N9qWGmKrFJYKFTZBe8zVT3Qiju0+9bbNJuyun69T+fqP3PCDh+aRlRiP+OKTJyeCZjNG5HIvIlU8wTVUDoYfjQ==", - "requires": { - "@sentry/hub": "5.26.0", - "@sentry/minimal": "5.26.0", - "@sentry/types": "5.26.0", - "@sentry/utils": "5.26.0", - "tslib": "^1.9.3" - } - }, - "@sentry/types": { - "version": "5.26.0", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-5.26.0.tgz", - "integrity": "sha512-ugpa1ePOhK55pjsyutAsa2tiJVQEyGYCaOXzaheg/3+EvhMdoW+owiZ8wupfvPhtZFIU3+FPOVz0d5k9K5d1rw==" - }, - "@sentry/utils": { - "version": "5.26.0", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-5.26.0.tgz", - "integrity": "sha512-F2gnHIAWbjiowcAgxz3VpKxY/NQ39NTujEd/NPnRTWlRynLFg3bAV+UvZFXljhYJeN3b/zRlScNDcpCWTrtZGw==", - "requires": { - "@sentry/types": "5.26.0", - "tslib": "^1.9.3" - } - }, - "abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "requires": { - "event-target-shim": "^5.0.0" - } - }, - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true - }, - "acorn-jsx": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", - "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", - "dev": true - }, - "agent-base": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.1.tgz", - "integrity": "sha512-01q25QQDwLSsyfhrKbn8yuur+JNw0H+0Y4JiGIKd3z9aYk/w/2kxD/Upc+t2ZBBSUNff50VjPsSW2YxM8QYKVg==", - "requires": { - "debug": "4" - } - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true - }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", - "dev": true - }, - "async": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", - "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==" - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "buffer-writer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", - "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==" - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "color": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/color/-/color-3.0.0.tgz", - "integrity": "sha512-jCpd5+s0s0t7p3pHQKpnJ0TpQKKdleP71LWcA0aqiljpiuAkOSUFN/dyH8ZwF0hRmFlrIuRhufds1QyEP9EB+w==", - "requires": { - "color-convert": "^1.9.1", - "color-string": "^1.5.2" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "color-string": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.4.tgz", - "integrity": "sha512-57yF5yt8Xa3czSEW1jfQDE79Idk0+AkN/4KWad6tbdxUmAs3MvjxlWSWD4deYytcRfoZ9nhKyFl1kj5tBvidbw==", - "requires": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==" - }, - "colorspace": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.2.tgz", - "integrity": "sha512-vt+OoIP2d76xLhjwbBaucYlNSpPsrJWPlBTtwCpQKIu6/CSMutyzX93O/Do0qzpH3YoHEes8YEFXyZ797rEhzQ==", - "requires": { - "color": "3.0.x", - "text-hex": "1.0.x" - } - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==" - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", - "requires": { - "ms": "2.1.2" - } - }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" - }, - "discord.js": { - "version": "12.3.1", - "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-12.3.1.tgz", - "integrity": "sha512-mSFyV/mbvzH12UXdS4zadmeUf8IMQOo/YdunubG1wWt1xjWvtaJz/s9CGsFD2B5pTw1W/LXxxUbrQjIZ/xlUdw==", - "requires": { - "@discordjs/collection": "^0.1.6", - "@discordjs/form-data": "^3.0.1", - "abort-controller": "^3.0.0", - "node-fetch": "^2.6.0", - "prism-media": "^1.2.2", - "setimmediate": "^1.0.5", - "tweetnacl": "^1.0.3", - "ws": "^7.3.1" - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "enabled": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", - "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==" - }, - "enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, - "requires": { - "ansi-colors": "^4.1.1" - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "eslint": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.11.0.tgz", - "integrity": "sha512-G9+qtYVCHaDi1ZuWzBsOWo2wSwd70TXnU6UHA3cTYHp7gCTXZcpggWFoUVAMRarg68qtPoNfFbzPh+VdOgmwmw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@eslint/eslintrc": "^0.1.3", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "enquirer": "^2.3.5", - "eslint-scope": "^5.1.1", - "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^2.0.0", - "espree": "^7.3.0", - "esquery": "^1.2.0", - "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", - "globals": "^12.1.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash": "^4.17.19", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.1.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", - "strip-json-comments": "^3.1.0", - "table": "^5.2.3", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - } - }, - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - } - } - }, - "eslint-visitor-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz", - "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==", - "dev": true - }, - "espree": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.0.tgz", - "integrity": "sha512-dksIWsvKCixn1yrEXO8UosNSxaDoSYpq9reEjZSbHLpT5hpaCAKTLBwq0RHtLrIr+c0ByiYzWT8KTMRzoRCNlw==", - "dev": true, - "requires": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.2.0", - "eslint-visitor-keys": "^1.3.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - } - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "esquery": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", - "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - }, - "dependencies": { - "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", - "dev": true - } - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", - "dev": true - } - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "fast-safe-stringify": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", - "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==" - }, - "fecha": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.0.tgz", - "integrity": "sha512-aN3pcx/DSmtyoovUudctc8+6Hl4T+hI9GBBHLjA76jdZl7+b1sgh5g4k+u/GL3dTy1/pnYzKp69FpJ0OicE3Wg==" - }, - "file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", - "dev": true, - "requires": { - "flat-cache": "^2.0.1" - } - }, - "flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", - "dev": true, - "requires": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" - } - }, - "flatted": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", - "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", - "dev": true - }, - "fn.name": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", - "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "globals": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", - "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", - "dev": true, - "requires": { - "type-fest": "^0.8.1" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", - "requires": { - "agent-base": "6", - "debug": "4" - } - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, - "import-fresh": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", - "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "js-yaml": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", - "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "kuler": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", - "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", - "dev": true - }, - "logform": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/logform/-/logform-2.2.0.tgz", - "integrity": "sha512-N0qPlqfypFx7UHNn4B3lzS/b0uLqt2hmuoa+PpuXNYgozdJYAyauF5Ky0BWVjrxDlMWiT3qN4zPq3vVAfZy7Yg==", - "requires": { - "colors": "^1.2.1", - "fast-safe-stringify": "^2.0.4", - "fecha": "^4.2.0", - "ms": "^2.1.1", - "triple-beam": "^1.3.0" - } - }, - "lru_map": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz", - "integrity": "sha1-tcg1G5Rky9dQM1p5ZQoOwOVhGN0=" - }, - "mime-db": { - "version": "1.44.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", - "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" - }, - "mime-types": { - "version": "2.1.27", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", - "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", - "requires": { - "mime-db": "1.44.0" - } - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "node-fetch": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", - "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "one-time": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", - "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", - "requires": { - "fn.name": "1.x.x" - } - }, - "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "requires": { - "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" - } - }, - "packet-reader": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz", - "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==" - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "pg": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/pg/-/pg-8.4.1.tgz", - "integrity": "sha512-NRsH0aGMXmX1z8Dd0iaPCxWUw4ffu+lIAmGm+sTCwuDDWkpEgRCAHZYDwqaNhC5hG5DRMOjSUFasMWhvcmLN1A==", - "requires": { - "buffer-writer": "2.0.0", - "packet-reader": "1.0.0", - "pg-connection-string": "^2.4.0", - "pg-pool": "^3.2.1", - "pg-protocol": "^1.3.0", - "pg-types": "^2.1.0", - "pgpass": "1.x" - } - }, - "pg-connection-string": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.4.0.tgz", - "integrity": "sha512-3iBXuv7XKvxeMrIgym7njT+HlZkwZqqGX4Bu9cci8xHZNT+Um1gWKqCsAzcC0d95rcKMU5WBg6YRUcHyV0HZKQ==" - }, - "pg-format": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/pg-format/-/pg-format-1.0.4.tgz", - "integrity": "sha1-J3NCNsKtP05QZJFaWTNOIAQKgo4=" - }, - "pg-int8": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", - "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==" - }, - "pg-pool": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.2.1.tgz", - "integrity": "sha512-BQDPWUeKenVrMMDN9opfns/kZo4lxmSWhIqo+cSAF7+lfi9ZclQbr9vfnlNaPr8wYF3UYjm5X0yPAhbcgqNOdA==" - }, - "pg-protocol": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.3.0.tgz", - "integrity": "sha512-64/bYByMrhWULUaCd+6/72c9PMWhiVFs3EVxl9Ct6a3v/U8+rKgqP2w+kKg/BIGgMJyB+Bk/eNivT32Al+Jghw==" - }, - "pg-types": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", - "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", - "requires": { - "pg-int8": "1.0.1", - "postgres-array": "~2.0.0", - "postgres-bytea": "~1.0.0", - "postgres-date": "~1.0.4", - "postgres-interval": "^1.1.0" - } - }, - "pgpass": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.2.tgz", - "integrity": "sha1-Knu0G2BltnkH6R2hsHwYR8h3swY=", - "requires": { - "split": "^1.0.0" - } - }, - "postgres-array": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", - "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==" - }, - "postgres-bytea": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", - "integrity": "sha1-AntTPAqokOJtFy1Hz5zOzFIazTU=" - }, - "postgres-date": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", - "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==" - }, - "postgres-interval": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", - "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", - "requires": { - "xtend": "^4.0.0" - } - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, - "prism-media": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/prism-media/-/prism-media-1.2.2.tgz", - "integrity": "sha512-I+nkWY212lJ500jLe4tN9tWO7nRiBAVdMv76P9kffZjYhw20raMlW1HSSvS+MLXC9MmbNZCazMrAr+5jEEgTuw==" - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "regexpp": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", - "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", - "dev": true - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - }, - "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", - "requires": { - "is-arrayish": "^0.3.1" - } - }, - "slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" - } - }, - "split": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", - "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", - "requires": { - "through": "2" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=" - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "requires": { - "safe-buffer": "~5.2.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "table": { - "version": "5.4.6", - "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", - "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", - "dev": true, - "requires": { - "ajv": "^6.10.2", - "lodash": "^4.17.14", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" - } - }, - "text-hex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", - "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" - }, - "triple-beam": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", - "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==" - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "tweetnacl": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", - "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - }, - "uri-js": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", - "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "v8-compile-cache": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz", - "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==", - "dev": true - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "winston": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.3.3.tgz", - "integrity": "sha512-oEXTISQnC8VlSAKf1KYSSd7J6IWuRPQqDdo8eoRNaYKLvwSb5+79Z3Yi1lrl6KDpU6/VWaxpakDAtb1oQ4n9aw==", - "requires": { - "@dabh/diagnostics": "^2.0.2", - "async": "^3.1.0", - "is-stream": "^2.0.0", - "logform": "^2.2.0", - "one-time": "^1.0.0", - "readable-stream": "^3.4.0", - "stack-trace": "0.0.x", - "triple-beam": "^1.3.0", - "winston-transport": "^4.4.0" - } - }, - "winston-transport": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.4.0.tgz", - "integrity": "sha512-Lc7/p3GtqtqPBYYtS6KCN3c77/2QCev51DvcJKbkFPQNoj1sinkGwLGFDxkXY9J6p9+EPnYs+D90uwbnaiURTw==", - "requires": { - "readable-stream": "^2.3.7", - "triple-beam": "^1.2.0" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "write": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", - "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", - "dev": true, - "requires": { - "mkdirp": "^0.5.1" - } - }, - "ws": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.1.tgz", - "integrity": "sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA==" - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" - } - } -} diff --git a/package.json b/package.json deleted file mode 100644 index 81095fb..0000000 --- a/package.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "name": "woomy", - "version": "2.0.0", - "description": "beta", - "main": "index.js", - "dependencies": { - "@sentry/node": "^5.26.0", - "discord.js": "^12.3.1", - "pg": "^8.4.1", - "pg-format": "^1.0.4", - "winston": "^3.3.3" - }, - "devDependencies": { - "eslint": "^7.11.0" - }, - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/mudkipscience/woomy-v2.git" - }, - "author": "Emily J. (mudkipscience)", - "license": "AGPL-3.0", - "bugs": { - "url": "https://github.com/mudkipscience/woomy-v2/issues" - }, - "homepage": "https://github.com/mudkipscience/woomy-v2#readme" -}